diff --git a/gen/render_voodoo2_csv.py b/gen/render_voodoo2_csv.py index 63c759f..2ff9b57 100644 --- a/gen/render_voodoo2_csv.py +++ b/gen/render_voodoo2_csv.py @@ -2,6 +2,7 @@ import csv import sys from dataclasses import dataclass from generate import renderer +import re @dataclass class RegisterBitDef: @@ -81,15 +82,19 @@ def bit_mask(d): high, low = d.bits return (1 << ((high - low) + 1)) - 1 +def is_function_bit(d): + infer_by_name = re.match("^.*_[0-9]$", d.bit_name) and "gpio_" not in d.bit_name.lower() + return bit_mask(d) != 1 or infer_by_name + def format_value(d): if d.enum_name is not None: assert d.enum_value is not None assert d.enum_value <= bit_mask(d) return f"({d.enum_value} << {d.bits[1]})" - elif bit_mask(d) == 1: - return f"(1 << {d.bits[1]})" - else: + elif is_function_bit(d): return f"(((n) & {hex(bit_mask(d))}) << {d.bits[1]})" + else: + return f"(1 << {d.bits[1]})" def format_macro(d): macro = f"{d.name.upper()}" @@ -98,7 +103,7 @@ def format_macro(d): macro += f"__{d.bit_name.upper()}" if d.enum_name is not None: macro += f"__{d.enum_name.upper()}" - elif bit_mask(d) != 1: + elif is_function_bit(d): macro += "(n)" return macro diff --git a/gen/voodoo2_bits.ods b/gen/voodoo2_bits.ods index 91f7abe..718490b 100644 Binary files a/gen/voodoo2_bits.ods and b/gen/voodoo2_bits.ods differ diff --git a/main.c b/main.c index 7b7f510..a587230 100644 --- a/main.c +++ b/main.c @@ -271,7 +271,7 @@ int main() | FBIINIT1__DRIVE_VIDEO_TIMING_BLANK_OUTPUTS | FBIINIT1__DRIVE_VIDEO_TIMING_HSYNC_VSYNC_OUTPUTS | FBIINIT1__DRIVE_VIDEO_TIMING_DCLK_OUTPUT - | FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT(0) + | FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT_0(0) | FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_2X_SEL | FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_5(x_tiles_5) ; diff --git a/voodoo2_bits.h b/voodoo2_bits.h index 22bf74c..1609c4e 100644 --- a/voodoo2_bits.h +++ b/voodoo2_bits.h @@ -230,12 +230,12 @@ #define VSYNC__V_SYNC_ON(n) (((n) & 0x1fff) << 0) #define VSYNC__V_SYNC_OFF(n) (((n) & 0x1fff) << 16) -#define VIDEODIMENSIONS__X_WIDTH(n) (((n) & 0x7ff) << 0) -#define VIDEODIMENSIONS__Y_HEIGHT(n) (((n) & 0x7ff) << 16) - #define BACKPORCH__H_BACK_PORCH(n) (((n) & 0x1ff) << 0) #define BACKPORCH__V_BACK_PORCH(n) (((n) & 0x1ff) << 16) +#define VIDEODIMENSIONS__X_WIDTH(n) (((n) & 0x7ff) << 0) +#define VIDEODIMENSIONS__Y_HEIGHT(n) (((n) & 0x7ff) << 16) + #define MAXRGBDELTA__BLUE(n) (((n) & 0xff) << 0) #define MAXRGBDELTA__GREEN(n) (((n) & 0xff) << 8) #define MAXRGBDELTA__RED(n) (((n) & 0xff) << 16) @@ -275,7 +275,7 @@ #define FBIINIT1__DRIVE_VIDEO_TIMING_BLANK_OUTPUTS (1 << 14) #define FBIINIT1__DRIVE_VIDEO_TIMING_HSYNC_VSYNC_OUTPUTS (1 << 15) #define FBIINIT1__DRIVE_VIDEO_TIMING_DCLK_OUTPUT (1 << 16) -#define FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT(n) (((n) & 1) << 17) +#define FBIINIT1__VIDEO_TIMING_VCLK_INPUT_SELECT_0(n) (((n) & 0x1) << 17) #define FBIINIT1__VID_CLK_2X_DELAY_SELECT__NO_DELAY (0 << 18) #define FBIINIT1__VID_CLK_2X_DELAY_SELECT__4NS (1 << 18) #define FBIINIT1__VID_CLK_2X_DELAY_SELECT__6NS (2 << 18) @@ -285,7 +285,7 @@ #define FBIINIT1__VIDEO_TIMING_VCLK_SOURCE_SELECT__VID_CLK_2X_SEL (2 << 20) #define FBIINIT1__ENABLE_24_BITS_PER_PIXEL_VIDEO_OUTPUT (1 << 22) #define FBIINIT1__ENABLE_SCAN_LINE_INTERLEAVING (1 << 23) -#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_5(n) (((n) & 1) << 24) +#define FBIINIT1__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_5(n) (((n) & 0x1) << 24) #define FBIINIT1__ENABLE_VIDEO_EDGE_DETECTION_FILTERING (1 << 25) #define FBIINIT1__INVERT_VID_CLK_2X (1 << 26) #define FBIINIT1__VID_CLK_2X_SEL_DELAY_SELECT__NO_DELAY (0 << 27) @@ -335,15 +335,15 @@ #define FBIINIT5__DISABLE_PCI_STOP_FUNCTIONALITY (1 << 0) #define FBIINIT5__PCI_SLAVE_DEVICE_IS_66MHZ_CAPABLE (1 << 1) #define FBIINIT5__DAC_DATA_OUTPUT_WIDTH (1 << 2) -#define FBIINIT5__DAC_DATA_OUTPUT_VALUE_GPIO_0 (1 << 3) -#define FBIINIT5__DAC_DATA_CONTROL_4 (1 << 4) +#define FBIINIT5__DAC_DATA_17_GPIO_0 (1 << 3) +#define FBIINIT5__DAC_DATA_18_GPIO_1 (1 << 4) #define FBIINIT5__GENERIC_POWER_ON_STRAPPING_PINS(n) (((n) & 0xf) << 5) #define FBIINIT5__COLOR_AUX_BUFFER_MEMORY_ALLOCATION__2_COLOR_BUFFERS_1_AUX_BUFFER (0 << 9) #define FBIINIT5__COLOR_AUX_BUFFER_MEMORY_ALLOCATION__3_COLOR_BUFFERS_0_AUX_BUFFERS (1 << 9) #define FBIINIT5__COLOR_AUX_BUFFER_MEMORY_ALLOCATION__3_COLOR_BUFFERS_1_AUX_BUFFER (2 << 9) #define FBIINIT5__DRIVE_VID_CLK_SLAVE_OUTPUT (1 << 11) #define FBIINIT5__DRIVE_DAC_DATA_OUTPUT (1 << 12) -#define FBIINIT5__VIDEO_TIMING_VCLK_INPUT_SELECT (1 << 13) +#define FBIINIT5__VIDEO_TIMING_VCLK_INPUT_SELECT_1(n) (((n) & 0x1) << 13) #define FBIINIT5__MULTI_CVG_CONFIGURATION_DETECT (1 << 14) #define FBIINIT5__SYNCHRONIZE_READS_FROM_HRETRACE_AND_VRETRACE (1 << 15) #define FBIINIT5__HORIZONTAL_BORDER_COLOR_ENABLE_RIGHT_EDGE (1 << 16) @@ -371,7 +371,7 @@ #define FBIINIT6__DAC_WR_OUTPUT_VALUE(n) (((n) & 0x3) << 19) #define FBIINIT6__PCI_FIFO_EMPTY_ENTRIES_LOW_WATER_MARK(n) (((n) & 0x7f) << 21) #define FBIINIT6__VGA_PASS_N_OUTPUT_VALUE(n) (((n) & 0x3) << 28) -#define FBIINIT6__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_0(n) (((n) & 1) << 30) +#define FBIINIT6__NUMBER_OF_32X32_VIDEO_TILES_IN_HORIZONTAL_DIMENSION_0(n) (((n) & 0x1) << 30) #define FBIINIT7__CMDFIFO_ENABLE (1 << 8) #define FBIINIT7__CMDFIFO_OFFSCREEN_MEMORY_STORE (1 << 9)