1ab47cfaaSmrg 2aa9e3350Smrg#ifndef SAVAGE_REGS_H 3aa9e3350Smrg#define SAVAGE_REGS_H 4ab47cfaaSmrg 5ab47cfaaSmrg/* Copied and renamed from radeon_reg.h for AGP/PCI detection. */ 6ab47cfaaSmrg#define SAVAGE_STATUS_PCI_CONFIG 0x06 7ab47cfaaSmrg# define SAVAGE_CAP_LIST 0x100000 8ab47cfaaSmrg#define SAVAGE_CAPABILITIES_PTR_PCI_CONFIG 0x34 /* offset in PCI config*/ 9ab47cfaaSmrg# define SAVAGE_CAP_PTR_MASK 0xfc /* mask off reserved bits of CAP_PTR */ 10ab47cfaaSmrg# define SAVAGE_CAP_ID_NULL 0x00 /* End of capability list */ 11ab47cfaaSmrg# define SAVAGE_CAP_ID_AGP 0x02 /* AGP capability ID */ 12ab47cfaaSmrg 13ab47cfaaSmrg#define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX)) 14ab47cfaaSmrg 15ab47cfaaSmrg#define S3_SAVAGE4_SERIES(chip) ((chip==S3_SAVAGE4) \ 16ab47cfaaSmrg || (chip==S3_PROSAVAGE) \ 17ab47cfaaSmrg || (chip==S3_TWISTER) \ 18ab47cfaaSmrg || (chip==S3_PROSAVAGEDDR)) 19ab47cfaaSmrg 20ab47cfaaSmrg#define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE)) 21ab47cfaaSmrg 22ab47cfaaSmrg#define S3_SAVAGE_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000)) 23ab47cfaaSmrg 24ab47cfaaSmrg#define S3_MOBILE_TWISTER_SERIES(chip) ((chip==S3_TWISTER) \ 25ab47cfaaSmrg ||(chip==S3_PROSAVAGEDDR)) 26ab47cfaaSmrg 27ab47cfaaSmrg/* Chip tags. These are used to group the adapters into 28ab47cfaaSmrg * related families. 29ab47cfaaSmrg */ 30ab47cfaaSmrg 31ab47cfaaSmrgenum S3CHIPTAGS { 32ab47cfaaSmrg S3_UNKNOWN = 0, 33ab47cfaaSmrg S3_SAVAGE3D, 34ab47cfaaSmrg S3_SAVAGE_MX, 35ab47cfaaSmrg S3_SAVAGE4, 36ab47cfaaSmrg S3_PROSAVAGE, 37ab47cfaaSmrg S3_TWISTER, 38ab47cfaaSmrg S3_PROSAVAGEDDR, 39ab47cfaaSmrg S3_SUPERSAVAGE, 40ab47cfaaSmrg S3_SAVAGE2000, 41ab47cfaaSmrg S3_LAST 42ab47cfaaSmrg}; 43ab47cfaaSmrg 44ab47cfaaSmrg#define BIOS_BSIZE 1024 45ab47cfaaSmrg#define BIOS_BASE 0xc0000 46ab47cfaaSmrg 47ab47cfaaSmrg#define SAVAGE_NEWMMIO_REGBASE_S3 0x1000000 /* 16MB */ 48ab47cfaaSmrg#define SAVAGE_NEWMMIO_REGBASE_S4 0x0000000 49ab47cfaaSmrg#define SAVAGE_NEWMMIO_REGSIZE 0x0080000 /* 512kb */ 50ab47cfaaSmrg#define SAVAGE_NEWMMIO_VGABASE 0x8000 51ab47cfaaSmrg 52ab47cfaaSmrg#define BASE_FREQ 14.31818 53ab47cfaaSmrg 54ab47cfaaSmrg#define FIFO_CONTROL_REG 0x8200 55ab47cfaaSmrg#define MIU_CONTROL_REG 0x8204 56ab47cfaaSmrg#define STREAMS_TIMEOUT_REG 0x8208 57ab47cfaaSmrg#define MISC_TIMEOUT_REG 0x820c 58ab47cfaaSmrg 59ab47cfaaSmrg#define ADVANCED_FUNC_CTRL 0x850C 60ab47cfaaSmrg 61ab47cfaaSmrg/* 62ab47cfaaSmrg * CR/SR registers MMIO offset 63ab47cfaaSmrg * MISC Output Register(W:0x3c2,R:0x3cc) controls CR is 0X83Cx or 0X83Bx 64ab47cfaaSmrg * but do we need to set MISC Output Register ??? 65ab47cfaaSmrg * (Note that CRT_ADDRESS_REG and CRT_DATA_REG are assumed to be COLOR)??? 66ab47cfaaSmrg */ 67ab47cfaaSmrg#define MMIO_BASE_OF_VGA3C0 0X83C0 68ab47cfaaSmrg#define MMIO_BASE_OF_VGA3D0 0X83D0 69ab47cfaaSmrg 70ab47cfaaSmrg#define ATTR_ADDRESS_REG \ 71ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C0 - 0x03C0)) 72ab47cfaaSmrg#define ATTR_DATA_WRITE_REG \ 73ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C0 - 0x03C0)) 74ab47cfaaSmrg#define ATTR_DATA_READ_REG \ 75ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C1 - 0x03C0)) 76ab47cfaaSmrg#define VIDEO_SUBSYSTEM_ENABLE \ 77ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C3 - 0x03C0)) 78ab47cfaaSmrg#define SEQ_ADDRESS_REG \ 79ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C4 - 0x03C0)) 80ab47cfaaSmrg#define SEQ_DATA_REG \ 81ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C5 - 0x03C0)) 82ab47cfaaSmrg#define DAC_PIXEL_MASK_REG \ 83ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C6 - 0x03C0)) 84ab47cfaaSmrg#define DAC_PEL_MASK \ 85ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C6 - 0x03C0)) 86ab47cfaaSmrg#define DAC_STATUS_REG \ 87ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C7 - 0x03C0)) 88ab47cfaaSmrg#define DAC_ADDRESS_READ_REG \ 89ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C7 - 0x03C0)) 90ab47cfaaSmrg#define DAC_ADDRESS_WRITE_REG \ 91ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C8 - 0x03C0)) 92ab47cfaaSmrg#define DAC_DATA_REG \ 93ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C9 - 0x03C0)) 94ab47cfaaSmrg#define DAC_DATA_REG_PORT \ 95ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C9 - 0x03C0)) 96ab47cfaaSmrg#define MISC_OUTPUT_REG_WRITE \ 97ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03C2 - 0x03C0)) 98ab47cfaaSmrg#define MISC_OUTPUT_REG_READ \ 99ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03CC - 0x03C0)) 100ab47cfaaSmrg#define GR_ADDRESS_REG \ 101ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03CE - 0x03C0)) 102ab47cfaaSmrg#define GR_DATA_REG \ 103ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x03CF - 0x03C0)) 104ab47cfaaSmrg#define WAKEUP_REG \ 105ab47cfaaSmrg (MMIO_BASE_OF_VGA3C0 + (0x0510 - 0x03C0)) 106ab47cfaaSmrg 107ab47cfaaSmrg#define CRT_ADDRESS_REG \ 108ab47cfaaSmrg (MMIO_BASE_OF_VGA3D0 + (0x03D4 - 0x03D0)) 109ab47cfaaSmrg#define CRT_DATA_REG \ 110ab47cfaaSmrg (MMIO_BASE_OF_VGA3D0 + (0x03D5 - 0x03D0)) 111ab47cfaaSmrg#define SYSTEM_CONTROL_REG \ 112ab47cfaaSmrg (MMIO_BASE_OF_VGA3D0 + (0x03DA - 0x03D0)) 113ab47cfaaSmrg 114ab47cfaaSmrg/* GX-3 Configuration/Status Registers */ 115ab47cfaaSmrg#define S3_SHADOW_STATUS 0x48C0C 116ab47cfaaSmrg#define S3_BUFFER_THRESHOLD 0x48C10 117ab47cfaaSmrg#define S3_OVERFLOW_BUFFER 0x48C14 118ab47cfaaSmrg#define S3_OVERFLOW_BUFFER_PTR 0x48C18 119ab47cfaaSmrg 120ab47cfaaSmrg#define ENABLE_BCI 0x08 /* MM48C18_3 */ 121ab47cfaaSmrg#define ENABLE_COMMAND_OVERFLOW_BUF 0x04 /* MM48C18_2 */ 122ab47cfaaSmrg#define ENABLE_COMMAND_BUF_STATUS_UPDATE 0x02 /* MM48C18_1 */ 123ab47cfaaSmrg#define ENABLE_SHADOW_STATUS_UPDATE 0x01 /* MM48C0C_0 */ 124ab47cfaaSmrg 125ab47cfaaSmrg 126ab47cfaaSmrg#define MEMORY_CTRL0_REG 0xCA 127ab47cfaaSmrg#define MEMORY_CTRL1_REG 0xCB 128ab47cfaaSmrg#define MEMORY_CTRL2_REG 0xCC 129ab47cfaaSmrg 130ab47cfaaSmrg#define MEMORY_CONFIG_REG 0x31 131ab47cfaaSmrg 132ab47cfaaSmrg/* bitmap descriptor register */ 133ab47cfaaSmrg#define S3_GLB_BD_LOW 0X8168 134ab47cfaaSmrg#define S3_GLB_BD_HIGH 0X816C 135ab47cfaaSmrg#define S3_PRI_BD_LOW 0X8170 136ab47cfaaSmrg#define S3_PRI_BD_HIGH 0X8174 137ab47cfaaSmrg#define S3_SEC_BD_LOW 0X8178 138ab47cfaaSmrg#define S3_SEC_BD_HIGH 0X817c 139ab47cfaaSmrg 140ab47cfaaSmrg/* duoview */ 141ab47cfaaSmrg 142ab47cfaaSmrg#define SELECT_IGA1 0x4026 143ab47cfaaSmrg#define SELECT_IGA2_READS_WRITES 0x4f26 144ab47cfaaSmrg 145ab47cfaaSmrg#define SelectIGA1() \ 146ab47cfaaSmrgdo { \ 147ab47cfaaSmrg OUTREG16(SEQ_ADDRESS_REG,SELECT_IGA1); \ 148ab47cfaaSmrg} while (0) 149ab47cfaaSmrg 150ab47cfaaSmrg#define SelectIGA2() \ 151ab47cfaaSmrgdo { \ 152ab47cfaaSmrg OUTREG16(SEQ_ADDRESS_REG,SELECT_IGA2_READS_WRITES); \ 153ab47cfaaSmrg} while (0) 154ab47cfaaSmrg 155ab47cfaaSmrg#define MEM_PS1 0x10 /*CRCA_4 :Primary stream 1*/ 156ab47cfaaSmrg#define MEM_PS2 0x20 /*CRCA_5 :Primary stream 2*/ 157ab47cfaaSmrg#define MEM_SS1 0x40 /*CRCA_6 :Secondary stream 1*/ 158ab47cfaaSmrg#define MEM_SS2 0x80 /*CRCA_7 :Secondary stream 2*/ 159ab47cfaaSmrg 160ab47cfaaSmrg#define SUBSYS_STAT_REG 0x8504 161ab47cfaaSmrg 162ab47cfaaSmrg#define SRC_BASE 0xa4d4 163ab47cfaaSmrg#define DEST_BASE 0xa4d8 164ab47cfaaSmrg#define CLIP_L_R 0xa4dc 165ab47cfaaSmrg#define CLIP_T_B 0xa4e0 166ab47cfaaSmrg#define DEST_SRC_STR 0xa4e4 167ab47cfaaSmrg#define MONO_PAT_0 0xa4e8 168ab47cfaaSmrg#define MONO_PAT_1 0xa4ec 169ab47cfaaSmrg 170ab47cfaaSmrg#define TILED_SURFACE_REGISTER_0 0x48c40 171ab47cfaaSmrg#define TILED_SURFACE_REGISTER_1 0x48c44 172ab47cfaaSmrg#define TILED_SURFACE_REGISTER_2 0x48c48 173ab47cfaaSmrg#define TILED_SURFACE_REGISTER_3 0x48c4c 174ab47cfaaSmrg#define TILED_SURFACE_REGISTER_4 0x48c50 175ab47cfaaSmrg 176ab47cfaaSmrg#define TILED_SURF_BPP4 0x00000000 /* bits 31-30=00 for 4 bits/pixel */ 177ab47cfaaSmrg#define TILED_SURF_BPP8 0x40000000 /* bits 31-30=01 for 8 bits/pixel */ 178ab47cfaaSmrg#define TILED_SURF_BPP16 0x80000000 /* bits 31-30=10 for 16 bits/pixel */ 179ab47cfaaSmrg#define TILED_SURF_BPP32 0xC0000000 /* bits 31-30=11 for 32 bits/pixel */ 180ab47cfaaSmrg 181ab47cfaaSmrg#define TILED_SURF_BPP16_2000 0x00000000 /* bit 31=0 for 16 bits/pixel */ 182ab47cfaaSmrg#define TILED_SURF_BPP32_2000 0x80000000 /* bit 31=1 for 32 bits/pixel */ 183ab47cfaaSmrg 184ab47cfaaSmrg/* 185ab47cfaaSmrg * CR88_4 =1 : disable block write 186ab47cfaaSmrg * the "2D" is partly to set this apart from "BLOCK_WRITE_DISABLE" 187ab47cfaaSmrg * constant used for bitmap descriptor 188ab47cfaaSmrg */ 189ab47cfaaSmrg#define DISABLE_BLOCK_WRITE_2D 0x10 190ab47cfaaSmrg#define BLOCK_WRITE_DISABLE 0x0 191ab47cfaaSmrg 192ab47cfaaSmrg/* CR31[0] set = Enable 8MB display memory through 64K window at A0000H. */ 193ab47cfaaSmrg#define ENABLE_CPUA_BASE_A0000 0x01 194ab47cfaaSmrg 195ab47cfaaSmrg/* Constants for CR69. */ 196ab47cfaaSmrg 197ab47cfaaSmrg#define CRT_ACTIVE 0x01 198ab47cfaaSmrg#define LCD_ACTIVE 0x02 199ab47cfaaSmrg#define TV_ACTIVE 0x04 200ab47cfaaSmrg#define CRT_ATTACHED 0x10 201ab47cfaaSmrg#define LCD_ATTACHED 0x20 202ab47cfaaSmrg#define TV_ATTACHED 0x40 203ab47cfaaSmrg 204ab47cfaaSmrg 205ab47cfaaSmrg/* 206ab47cfaaSmrg * reads from SUBSYS_STAT 207ab47cfaaSmrg */ 208ab47cfaaSmrg#define STATUS_WORD0 (INREG(0x48C00)) 209ab47cfaaSmrg#define ALT_STATUS_WORD0 (INREG(0x48C60)) 210ab47cfaaSmrg#define MAXLOOP 0xffffff 211ab47cfaaSmrg#define IN_SUBSYS_STAT() (INREG(SUBSYS_STAT_REG)) 212ab47cfaaSmrg 213ab47cfaaSmrg#define MAXFIFO 0x7f00 214ab47cfaaSmrg 215ab47cfaaSmrg#define inStatus1() (VGAHWPTR(pScrn))->readST01( VGAHWPTR(pScrn) ) 216ab47cfaaSmrg 217ab47cfaaSmrg 218ab47cfaaSmrg/* 219ab47cfaaSmrg * unprotect CRTC[0-7] 220ab47cfaaSmrg * CR11_7 = 0: Writing to all CRT Controller registers enabled 221ab47cfaaSmrg * = 1: Writing to all bits of CR0~CR7 except CR7_4 disabled 222ab47cfaaSmrg */ 223ab47cfaaSmrg#define UnProtectCRTC() \ 224ab47cfaaSmrgdo { \ 225ab47cfaaSmrg unsigned char byte; \ 226ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG,0x11); \ 227ab47cfaaSmrg byte = INREG8(CRT_DATA_REG) & 0X7F; \ 228ab47cfaaSmrg OUTREG16(CRT_ADDRESS_REG,byte << 8 | 0x11); \ 229ab47cfaaSmrg} while (0) 230ab47cfaaSmrg 231ab47cfaaSmrg/* 232ab47cfaaSmrg * unlock extended regs 233ab47cfaaSmrg * CR38:unlock CR20~CR3F 234ab47cfaaSmrg * CR39:unlock CR40~CRFF 235ab47cfaaSmrg * SR08:unlock SR09~SRFF 236ab47cfaaSmrg */ 237ab47cfaaSmrg#define UnLockExtRegs() \ 238ab47cfaaSmrgdo { \ 239ab47cfaaSmrg OUTREG16(CRT_ADDRESS_REG,0X4838); \ 240ab47cfaaSmrg OUTREG16(CRT_ADDRESS_REG,0XA039); \ 241ab47cfaaSmrg OUTREG16(SEQ_ADDRESS_REG,0X0608); \ 242ab47cfaaSmrg} while (0) 243ab47cfaaSmrg 244ab47cfaaSmrg#define VerticalRetraceWait() \ 245ab47cfaaSmrgdo { \ 246ab47cfaaSmrg INREG8(CRT_ADDRESS_REG); \ 247ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG, 0x17); \ 248ab47cfaaSmrg if (INREG8(CRT_DATA_REG) & 0x80) { \ 249ab47cfaaSmrg int i = 0x10000; \ 250ab47cfaaSmrg while ((INREG8(SYSTEM_CONTROL_REG) & 0x08) == 0x08 && i--) ; \ 251ab47cfaaSmrg i = 0x10000; \ 252ab47cfaaSmrg while ((INREG8(SYSTEM_CONTROL_REG) & 0x08) == 0x00 && i--) ; \ 253ab47cfaaSmrg } \ 254ab47cfaaSmrg} while (0) 255ab47cfaaSmrg 256ab47cfaaSmrg/* 257ab47cfaaSmrg * Jiayo Hsu, Mar 21, 2002 2582b2b4fcbSmrg * modify this to scalable schema, because different chips have different regs, 259ab47cfaaSmrg * besides add in patch code for Paramount(SuperSavage) from 2K 260ab47cfaaSmrg */ 261ab47cfaaSmrg#define InI2CREG(a,reg) \ 262ab47cfaaSmrgdo { \ 263ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG, reg); \ 264ab47cfaaSmrg if (psav->Chipset == S3_SUPERSAVAGE) \ 265ab47cfaaSmrg OUTREG8(CRT_DATA_REG, INREG8(CRT_DATA_REG)); \ 266ab47cfaaSmrg a = INREG8(CRT_DATA_REG); \ 267ab47cfaaSmrg} while (0) 268ab47cfaaSmrg 269ab47cfaaSmrg#define OutI2CREG(a,reg) \ 270ab47cfaaSmrgdo { \ 271ab47cfaaSmrg OUTREG8(CRT_ADDRESS_REG, reg); \ 272ab47cfaaSmrg if (psav->Chipset == S3_SUPERSAVAGE) \ 273ab47cfaaSmrg OUTREG8(CRT_DATA_REG, a); \ 274ab47cfaaSmrg OUTREG8(CRT_DATA_REG, a); \ 275ab47cfaaSmrg} while (0) 276ab47cfaaSmrg 277ab47cfaaSmrg#define HZEXP_COMP_1 0x54 278ab47cfaaSmrg#define HZEXP_BORDER 0x58 279ab47cfaaSmrg#define HZEXP_FACTOR_IGA1 0x59 280ab47cfaaSmrg 281ab47cfaaSmrg#define VTEXP_COMP_1 0x56 282ab47cfaaSmrg#define VTEXP_BORDER 0x5a 283ab47cfaaSmrg#define VTEXP_FACTOR_IGA1 0x5b 284ab47cfaaSmrg 285ab47cfaaSmrg#define EC1_CENTER_ON 0x10 286ab47cfaaSmrg#define EC1_EXPAND_ON 0x0c 287ab47cfaaSmrg 288aa9e3350Smrg#endif /* SAVAGE_REGS_H */ 289