diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-03-20 17:18:15 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-03-21 02:55:53 -0400 |
commit | 498dd8b35ae798c3a6c6c9da029db1806dc2cf93 (patch) | |
tree | a8ab6d73ee56a12320cf4d2ce5c737e1def029b3 /drivers/gpu/drm/radeon | |
parent | dfcf5f36529d69eb35f4fdedfa6f244c5249698c (diff) |
drm/radeon/kms: add VM CS checker for SI
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r-- | drivers/gpu/drm/radeon/si.c | 309 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/sid.h | 31 |
2 files changed, 340 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index ad91c5fbb61b..30b379e3f3f5 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -1882,6 +1882,315 @@ void si_pcie_gart_fini(struct radeon_device *rdev) | |||
1882 | radeon_gart_fini(rdev); | 1882 | radeon_gart_fini(rdev); |
1883 | } | 1883 | } |
1884 | 1884 | ||
1885 | /* vm parser */ | ||
1886 | static bool si_vm_reg_valid(u32 reg) | ||
1887 | { | ||
1888 | /* context regs are fine */ | ||
1889 | if (reg >= 0x28000) | ||
1890 | return true; | ||
1891 | |||
1892 | /* check config regs */ | ||
1893 | switch (reg) { | ||
1894 | case GRBM_GFX_INDEX: | ||
1895 | case VGT_VTX_VECT_EJECT_REG: | ||
1896 | case VGT_CACHE_INVALIDATION: | ||
1897 | case VGT_ESGS_RING_SIZE: | ||
1898 | case VGT_GSVS_RING_SIZE: | ||
1899 | case VGT_GS_VERTEX_REUSE: | ||
1900 | case VGT_PRIMITIVE_TYPE: | ||
1901 | case VGT_INDEX_TYPE: | ||
1902 | case VGT_NUM_INDICES: | ||
1903 | case VGT_NUM_INSTANCES: | ||
1904 | case VGT_TF_RING_SIZE: | ||
1905 | case VGT_HS_OFFCHIP_PARAM: | ||
1906 | case VGT_TF_MEMORY_BASE: | ||
1907 | case PA_CL_ENHANCE: | ||
1908 | case PA_SU_LINE_STIPPLE_VALUE: | ||
1909 | case PA_SC_LINE_STIPPLE_STATE: | ||
1910 | case PA_SC_ENHANCE: | ||
1911 | case SQC_CACHES: | ||
1912 | case SPI_STATIC_THREAD_MGMT_1: | ||
1913 | case SPI_STATIC_THREAD_MGMT_2: | ||
1914 | case SPI_STATIC_THREAD_MGMT_3: | ||
1915 | case SPI_PS_MAX_WAVE_ID: | ||
1916 | case SPI_CONFIG_CNTL: | ||
1917 | case SPI_CONFIG_CNTL_1: | ||
1918 | case TA_CNTL_AUX: | ||
1919 | return true; | ||
1920 | default: | ||
1921 | DRM_ERROR("Invalid register 0x%x in CS\n", reg); | ||
1922 | return false; | ||
1923 | } | ||
1924 | } | ||
1925 | |||
1926 | static int si_vm_packet3_ce_check(struct radeon_device *rdev, | ||
1927 | u32 *ib, struct radeon_cs_packet *pkt) | ||
1928 | { | ||
1929 | switch (pkt->opcode) { | ||
1930 | case PACKET3_NOP: | ||
1931 | case PACKET3_SET_BASE: | ||
1932 | case PACKET3_SET_CE_DE_COUNTERS: | ||
1933 | case PACKET3_LOAD_CONST_RAM: | ||
1934 | case PACKET3_WRITE_CONST_RAM: | ||
1935 | case PACKET3_WRITE_CONST_RAM_OFFSET: | ||
1936 | case PACKET3_DUMP_CONST_RAM: | ||
1937 | case PACKET3_INCREMENT_CE_COUNTER: | ||
1938 | case PACKET3_WAIT_ON_DE_COUNTER: | ||
1939 | case PACKET3_CE_WRITE: | ||
1940 | break; | ||
1941 | default: | ||
1942 | DRM_ERROR("Invalid CE packet3: 0x%x\n", pkt->opcode); | ||
1943 | return -EINVAL; | ||
1944 | } | ||
1945 | return 0; | ||
1946 | } | ||
1947 | |||
1948 | static int si_vm_packet3_gfx_check(struct radeon_device *rdev, | ||
1949 | u32 *ib, struct radeon_cs_packet *pkt) | ||
1950 | { | ||
1951 | u32 idx = pkt->idx + 1; | ||
1952 | u32 idx_value = ib[idx]; | ||
1953 | u32 start_reg, end_reg, reg, i; | ||
1954 | |||
1955 | switch (pkt->opcode) { | ||
1956 | case PACKET3_NOP: | ||
1957 | case PACKET3_SET_BASE: | ||
1958 | case PACKET3_CLEAR_STATE: | ||
1959 | case PACKET3_INDEX_BUFFER_SIZE: | ||
1960 | case PACKET3_DISPATCH_DIRECT: | ||
1961 | case PACKET3_DISPATCH_INDIRECT: | ||
1962 | case PACKET3_ALLOC_GDS: | ||
1963 | case PACKET3_WRITE_GDS_RAM: | ||
1964 | case PACKET3_ATOMIC_GDS: | ||
1965 | case PACKET3_ATOMIC: | ||
1966 | case PACKET3_OCCLUSION_QUERY: | ||
1967 | case PACKET3_SET_PREDICATION: | ||
1968 | case PACKET3_COND_EXEC: | ||
1969 | case PACKET3_PRED_EXEC: | ||
1970 | case PACKET3_DRAW_INDIRECT: | ||
1971 | case PACKET3_DRAW_INDEX_INDIRECT: | ||
1972 | case PACKET3_INDEX_BASE: | ||
1973 | case PACKET3_DRAW_INDEX_2: | ||
1974 | case PACKET3_CONTEXT_CONTROL: | ||
1975 | case PACKET3_INDEX_TYPE: | ||
1976 | case PACKET3_DRAW_INDIRECT_MULTI: | ||
1977 | case PACKET3_DRAW_INDEX_AUTO: | ||
1978 | case PACKET3_DRAW_INDEX_IMMD: | ||
1979 | case PACKET3_NUM_INSTANCES: | ||
1980 | case PACKET3_DRAW_INDEX_MULTI_AUTO: | ||
1981 | case PACKET3_STRMOUT_BUFFER_UPDATE: | ||
1982 | case PACKET3_DRAW_INDEX_OFFSET_2: | ||
1983 | case PACKET3_DRAW_INDEX_MULTI_ELEMENT: | ||
1984 | case PACKET3_DRAW_INDEX_INDIRECT_MULTI: | ||
1985 | case PACKET3_MPEG_INDEX: | ||
1986 | case PACKET3_WAIT_REG_MEM: | ||
1987 | case PACKET3_MEM_WRITE: | ||
1988 | case PACKET3_PFP_SYNC_ME: | ||
1989 | case PACKET3_SURFACE_SYNC: | ||
1990 | case PACKET3_EVENT_WRITE: | ||
1991 | case PACKET3_EVENT_WRITE_EOP: | ||
1992 | case PACKET3_EVENT_WRITE_EOS: | ||
1993 | case PACKET3_SET_CONTEXT_REG: | ||
1994 | case PACKET3_SET_CONTEXT_REG_INDIRECT: | ||
1995 | case PACKET3_SET_SH_REG: | ||
1996 | case PACKET3_SET_SH_REG_OFFSET: | ||
1997 | case PACKET3_INCREMENT_DE_COUNTER: | ||
1998 | case PACKET3_WAIT_ON_CE_COUNTER: | ||
1999 | case PACKET3_WAIT_ON_AVAIL_BUFFER: | ||
2000 | case PACKET3_ME_WRITE: | ||
2001 | break; | ||
2002 | case PACKET3_COPY_DATA: | ||
2003 | if ((idx_value & 0xf00) == 0) { | ||
2004 | reg = ib[idx + 3] * 4; | ||
2005 | if (!si_vm_reg_valid(reg)) | ||
2006 | return -EINVAL; | ||
2007 | } | ||
2008 | break; | ||
2009 | case PACKET3_WRITE_DATA: | ||
2010 | if ((idx_value & 0xf00) == 0) { | ||
2011 | start_reg = ib[idx + 1] * 4; | ||
2012 | if (idx_value & 0x10000) { | ||
2013 | if (!si_vm_reg_valid(start_reg)) | ||
2014 | return -EINVAL; | ||
2015 | } else { | ||
2016 | for (i = 0; i < (pkt->count - 2); i++) { | ||
2017 | reg = start_reg + (4 * i); | ||
2018 | if (!si_vm_reg_valid(reg)) | ||
2019 | return -EINVAL; | ||
2020 | } | ||
2021 | } | ||
2022 | } | ||
2023 | break; | ||
2024 | case PACKET3_COND_WRITE: | ||
2025 | if (idx_value & 0x100) { | ||
2026 | reg = ib[idx + 5] * 4; | ||
2027 | if (!si_vm_reg_valid(reg)) | ||
2028 | return -EINVAL; | ||
2029 | } | ||
2030 | break; | ||
2031 | case PACKET3_COPY_DW: | ||
2032 | if (idx_value & 0x2) { | ||
2033 | reg = ib[idx + 3] * 4; | ||
2034 | if (!si_vm_reg_valid(reg)) | ||
2035 | return -EINVAL; | ||
2036 | } | ||
2037 | break; | ||
2038 | case PACKET3_SET_CONFIG_REG: | ||
2039 | start_reg = (idx_value << 2) + PACKET3_SET_CONFIG_REG_START; | ||
2040 | end_reg = 4 * pkt->count + start_reg - 4; | ||
2041 | if ((start_reg < PACKET3_SET_CONFIG_REG_START) || | ||
2042 | (start_reg >= PACKET3_SET_CONFIG_REG_END) || | ||
2043 | (end_reg >= PACKET3_SET_CONFIG_REG_END)) { | ||
2044 | DRM_ERROR("bad PACKET3_SET_CONFIG_REG\n"); | ||
2045 | return -EINVAL; | ||
2046 | } | ||
2047 | for (i = 0; i < pkt->count; i++) { | ||
2048 | reg = start_reg + (4 * i); | ||
2049 | if (!si_vm_reg_valid(reg)) | ||
2050 | return -EINVAL; | ||
2051 | } | ||
2052 | break; | ||
2053 | default: | ||
2054 | DRM_ERROR("Invalid GFX packet3: 0x%x\n", pkt->opcode); | ||
2055 | return -EINVAL; | ||
2056 | } | ||
2057 | return 0; | ||
2058 | } | ||
2059 | |||
2060 | static int si_vm_packet3_compute_check(struct radeon_device *rdev, | ||
2061 | u32 *ib, struct radeon_cs_packet *pkt) | ||
2062 | { | ||
2063 | u32 idx = pkt->idx + 1; | ||
2064 | u32 idx_value = ib[idx]; | ||
2065 | u32 start_reg, reg, i; | ||
2066 | |||
2067 | switch (pkt->opcode) { | ||
2068 | case PACKET3_NOP: | ||
2069 | case PACKET3_SET_BASE: | ||
2070 | case PACKET3_CLEAR_STATE: | ||
2071 | case PACKET3_DISPATCH_DIRECT: | ||
2072 | case PACKET3_DISPATCH_INDIRECT: | ||
2073 | case PACKET3_ALLOC_GDS: | ||
2074 | case PACKET3_WRITE_GDS_RAM: | ||
2075 | case PACKET3_ATOMIC_GDS: | ||
2076 | case PACKET3_ATOMIC: | ||
2077 | case PACKET3_OCCLUSION_QUERY: | ||
2078 | case PACKET3_SET_PREDICATION: | ||
2079 | case PACKET3_COND_EXEC: | ||
2080 | case PACKET3_PRED_EXEC: | ||
2081 | case PACKET3_CONTEXT_CONTROL: | ||
2082 | case PACKET3_STRMOUT_BUFFER_UPDATE: | ||
2083 | case PACKET3_WAIT_REG_MEM: | ||
2084 | case PACKET3_MEM_WRITE: | ||
2085 | case PACKET3_PFP_SYNC_ME: | ||
2086 | case PACKET3_SURFACE_SYNC: | ||
2087 | case PACKET3_EVENT_WRITE: | ||
2088 | case PACKET3_EVENT_WRITE_EOP: | ||
2089 | case PACKET3_EVENT_WRITE_EOS: | ||
2090 | case PACKET3_SET_CONTEXT_REG: | ||
2091 | case PACKET3_SET_CONTEXT_REG_INDIRECT: | ||
2092 | case PACKET3_SET_SH_REG: | ||
2093 | case PACKET3_SET_SH_REG_OFFSET: | ||
2094 | case PACKET3_INCREMENT_DE_COUNTER: | ||
2095 | case PACKET3_WAIT_ON_CE_COUNTER: | ||
2096 | case PACKET3_WAIT_ON_AVAIL_BUFFER: | ||
2097 | case PACKET3_ME_WRITE: | ||
2098 | break; | ||
2099 | case PACKET3_COPY_DATA: | ||
2100 | if ((idx_value & 0xf00) == 0) { | ||
2101 | reg = ib[idx + 3] * 4; | ||
2102 | if (!si_vm_reg_valid(reg)) | ||
2103 | return -EINVAL; | ||
2104 | } | ||
2105 | break; | ||
2106 | case PACKET3_WRITE_DATA: | ||
2107 | if ((idx_value & 0xf00) == 0) { | ||
2108 | start_reg = ib[idx + 1] * 4; | ||
2109 | if (idx_value & 0x10000) { | ||
2110 | if (!si_vm_reg_valid(start_reg)) | ||
2111 | return -EINVAL; | ||
2112 | } else { | ||
2113 | for (i = 0; i < (pkt->count - 2); i++) { | ||
2114 | reg = start_reg + (4 * i); | ||
2115 | if (!si_vm_reg_valid(reg)) | ||
2116 | return -EINVAL; | ||
2117 | } | ||
2118 | } | ||
2119 | } | ||
2120 | break; | ||
2121 | case PACKET3_COND_WRITE: | ||
2122 | if (idx_value & 0x100) { | ||
2123 | reg = ib[idx + 5] * 4; | ||
2124 | if (!si_vm_reg_valid(reg)) | ||
2125 | return -EINVAL; | ||
2126 | } | ||
2127 | break; | ||
2128 | case PACKET3_COPY_DW: | ||
2129 | if (idx_value & 0x2) { | ||
2130 | reg = ib[idx + 3] * 4; | ||
2131 | if (!si_vm_reg_valid(reg)) | ||
2132 | return -EINVAL; | ||
2133 | } | ||
2134 | break; | ||
2135 | default: | ||
2136 | DRM_ERROR("Invalid Compute packet3: 0x%x\n", pkt->opcode); | ||
2137 | return -EINVAL; | ||
2138 | } | ||
2139 | return 0; | ||
2140 | } | ||
2141 | |||
2142 | int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib) | ||
2143 | { | ||
2144 | int ret = 0; | ||
2145 | u32 idx = 0; | ||
2146 | struct radeon_cs_packet pkt; | ||
2147 | |||
2148 | do { | ||
2149 | pkt.idx = idx; | ||
2150 | pkt.type = CP_PACKET_GET_TYPE(ib->ptr[idx]); | ||
2151 | pkt.count = CP_PACKET_GET_COUNT(ib->ptr[idx]); | ||
2152 | pkt.one_reg_wr = 0; | ||
2153 | switch (pkt.type) { | ||
2154 | case PACKET_TYPE0: | ||
2155 | dev_err(rdev->dev, "Packet0 not allowed!\n"); | ||
2156 | ret = -EINVAL; | ||
2157 | break; | ||
2158 | case PACKET_TYPE2: | ||
2159 | idx += 1; | ||
2160 | break; | ||
2161 | case PACKET_TYPE3: | ||
2162 | pkt.opcode = CP_PACKET3_GET_OPCODE(ib->ptr[idx]); | ||
2163 | if (ib->is_const_ib) | ||
2164 | ret = si_vm_packet3_ce_check(rdev, ib->ptr, &pkt); | ||
2165 | else { | ||
2166 | switch (ib->fence->ring) { | ||
2167 | case RADEON_RING_TYPE_GFX_INDEX: | ||
2168 | ret = si_vm_packet3_gfx_check(rdev, ib->ptr, &pkt); | ||
2169 | break; | ||
2170 | case CAYMAN_RING_TYPE_CP1_INDEX: | ||
2171 | case CAYMAN_RING_TYPE_CP2_INDEX: | ||
2172 | ret = si_vm_packet3_compute_check(rdev, ib->ptr, &pkt); | ||
2173 | break; | ||
2174 | default: | ||
2175 | dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->fence->ring); | ||
2176 | ret = -EINVAL; | ||
2177 | break; | ||
2178 | } | ||
2179 | } | ||
2180 | idx += pkt.count + 2; | ||
2181 | break; | ||
2182 | default: | ||
2183 | dev_err(rdev->dev, "Unknown packet type %d !\n", pkt.type); | ||
2184 | ret = -EINVAL; | ||
2185 | break; | ||
2186 | } | ||
2187 | if (ret) | ||
2188 | break; | ||
2189 | } while (idx < ib->length_dw); | ||
2190 | |||
2191 | return ret; | ||
2192 | } | ||
2193 | |||
1885 | /* | 2194 | /* |
1886 | * vm | 2195 | * vm |
1887 | */ | 2196 | */ |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index 4d9cdc813d81..ed1b1e5f5dd5 100644 --- a/drivers/gpu/drm/radeon/sid.h +++ b/drivers/gpu/drm/radeon/sid.h | |||
@@ -255,6 +255,8 @@ | |||
255 | #define SOFT_RESET_VGT (1 << 14) | 255 | #define SOFT_RESET_VGT (1 << 14) |
256 | #define SOFT_RESET_IA (1 << 15) | 256 | #define SOFT_RESET_IA (1 << 15) |
257 | 257 | ||
258 | #define GRBM_GFX_INDEX 0x802C | ||
259 | |||
258 | #define CP_ME_CNTL 0x86D8 | 260 | #define CP_ME_CNTL 0x86D8 |
259 | #define CP_CE_HALT (1 << 24) | 261 | #define CP_CE_HALT (1 << 24) |
260 | #define CP_PFP_HALT (1 << 26) | 262 | #define CP_PFP_HALT (1 << 26) |
@@ -271,6 +273,8 @@ | |||
271 | 273 | ||
272 | #define CP_PERFMON_CNTL 0x87FC | 274 | #define CP_PERFMON_CNTL 0x87FC |
273 | 275 | ||
276 | #define VGT_VTX_VECT_EJECT_REG 0x88B0 | ||
277 | |||
274 | #define VGT_CACHE_INVALIDATION 0x88C4 | 278 | #define VGT_CACHE_INVALIDATION 0x88C4 |
275 | #define CACHE_INVALIDATION(x) ((x) << 0) | 279 | #define CACHE_INVALIDATION(x) ((x) << 0) |
276 | #define VC_ONLY 0 | 280 | #define VC_ONLY 0 |
@@ -281,11 +285,23 @@ | |||
281 | #define ES_AUTO 1 | 285 | #define ES_AUTO 1 |
282 | #define GS_AUTO 2 | 286 | #define GS_AUTO 2 |
283 | #define ES_AND_GS_AUTO 3 | 287 | #define ES_AND_GS_AUTO 3 |
288 | #define VGT_ESGS_RING_SIZE 0x88C8 | ||
289 | #define VGT_GSVS_RING_SIZE 0x88CC | ||
284 | 290 | ||
285 | #define VGT_GS_VERTEX_REUSE 0x88D4 | 291 | #define VGT_GS_VERTEX_REUSE 0x88D4 |
286 | 292 | ||
293 | #define VGT_PRIMITIVE_TYPE 0x8958 | ||
294 | #define VGT_INDEX_TYPE 0x895C | ||
295 | |||
296 | #define VGT_NUM_INDICES 0x8970 | ||
287 | #define VGT_NUM_INSTANCES 0x8974 | 297 | #define VGT_NUM_INSTANCES 0x8974 |
288 | 298 | ||
299 | #define VGT_TF_RING_SIZE 0x8988 | ||
300 | |||
301 | #define VGT_HS_OFFCHIP_PARAM 0x89B0 | ||
302 | |||
303 | #define VGT_TF_MEMORY_BASE 0x89B8 | ||
304 | |||
289 | #define CC_GC_SHADER_ARRAY_CONFIG 0x89bc | 305 | #define CC_GC_SHADER_ARRAY_CONFIG 0x89bc |
290 | #define GC_USER_SHADER_ARRAY_CONFIG 0x89c0 | 306 | #define GC_USER_SHADER_ARRAY_CONFIG 0x89c0 |
291 | 307 | ||
@@ -293,6 +309,8 @@ | |||
293 | #define CLIP_VTX_REORDER_ENA (1 << 0) | 309 | #define CLIP_VTX_REORDER_ENA (1 << 0) |
294 | #define NUM_CLIP_SEQ(x) ((x) << 1) | 310 | #define NUM_CLIP_SEQ(x) ((x) << 1) |
295 | 311 | ||
312 | #define PA_SU_LINE_STIPPLE_VALUE 0x8A60 | ||
313 | |||
296 | #define PA_SC_LINE_STIPPLE_STATE 0x8B10 | 314 | #define PA_SC_LINE_STIPPLE_STATE 0x8B10 |
297 | 315 | ||
298 | #define PA_SC_FORCE_EOV_MAX_CNTS 0x8B24 | 316 | #define PA_SC_FORCE_EOV_MAX_CNTS 0x8B24 |
@@ -305,10 +323,21 @@ | |||
305 | #define SC_HIZ_TILE_FIFO_SIZE(x) ((x) << 15) | 323 | #define SC_HIZ_TILE_FIFO_SIZE(x) ((x) << 15) |
306 | #define SC_EARLYZ_TILE_FIFO_SIZE(x) ((x) << 23) | 324 | #define SC_EARLYZ_TILE_FIFO_SIZE(x) ((x) << 23) |
307 | 325 | ||
326 | #define PA_SC_ENHANCE 0x8BF0 | ||
327 | |||
308 | #define SQ_CONFIG 0x8C00 | 328 | #define SQ_CONFIG 0x8C00 |
309 | 329 | ||
330 | #define SQC_CACHES 0x8C08 | ||
331 | |||
310 | #define SX_DEBUG_1 0x9060 | 332 | #define SX_DEBUG_1 0x9060 |
311 | 333 | ||
334 | #define SPI_STATIC_THREAD_MGMT_1 0x90E0 | ||
335 | #define SPI_STATIC_THREAD_MGMT_2 0x90E4 | ||
336 | #define SPI_STATIC_THREAD_MGMT_3 0x90E8 | ||
337 | #define SPI_PS_MAX_WAVE_ID 0x90EC | ||
338 | |||
339 | #define SPI_CONFIG_CNTL 0x9100 | ||
340 | |||
312 | #define SPI_CONFIG_CNTL_1 0x913C | 341 | #define SPI_CONFIG_CNTL_1 0x913C |
313 | #define VTX_DONE_DELAY(x) ((x) << 0) | 342 | #define VTX_DONE_DELAY(x) ((x) << 0) |
314 | #define INTERP_ONE_PRIM_PER_ROW (1 << 4) | 343 | #define INTERP_ONE_PRIM_PER_ROW (1 << 4) |
@@ -318,6 +347,8 @@ | |||
318 | #define TCC_DISABLE_MASK 0xFFFF0000 | 347 | #define TCC_DISABLE_MASK 0xFFFF0000 |
319 | #define TCC_DISABLE_SHIFT 16 | 348 | #define TCC_DISABLE_SHIFT 16 |
320 | 349 | ||
350 | #define TA_CNTL_AUX 0x9508 | ||
351 | |||
321 | #define CC_RB_BACKEND_DISABLE 0x98F4 | 352 | #define CC_RB_BACKEND_DISABLE 0x98F4 |
322 | #define BACKEND_DISABLE(x) ((x) << 16) | 353 | #define BACKEND_DISABLE(x) ((x) << 16) |
323 | #define GB_ADDR_CONFIG 0x98F8 | 354 | #define GB_ADDR_CONFIG 0x98F8 |