1 2 /* 3 * 4 * Copyright 1995-1997 The XFree86 Project, Inc. 5 * 6 */ 7 8 #ifndef _NEWMMIO_H_ 9 #define _NEWMMIO_H_ 10 11 #include <X11/Xmd.h> 12 13 14 #define int16 CARD16 15 #define int32 CARD32 16 17 #define S3_NEWMMIO_VGABASE (S3_NEWMMIO_REGBASE + 0x8000) 18 19 typedef struct { int16 vendor_ID; int16 device_ID; } pci_id; 20 typedef struct { int16 cmd; int16 devsel; } cmd_devsel; 21 22 typedef struct { 23 pci_id pci_ident; 24 cmd_devsel cmd_device_sel; 25 int32 class_code; 26 int32 dummy5; 27 int32 base0; 28 char dummy1[0x20-sizeof(int32)]; 29 int32 bios_base; 30 char dummy2[0x3c - 0x32]; 31 } pci_conf_regs; 32 33 34 typedef struct { int16 filler; int16 adv_f_cntl; } adv_f_cntl; 35 36 typedef struct { 37 int32 cur_point; 38 char dummy1[4]; 39 int32 dest_stp; 40 char dummy2[4]; 41 int32 err_term; 42 char dummy3[4]; 43 int32 command; 44 int32 short_stroke; 45 int32 bkgd_color; 46 int32 frgd_color; 47 int32 wrt_mask; 48 int32 rd_mask; 49 int32 color_cmp; 50 int32 col_mix; 51 int32 sciss_topleft; 52 int32 sciss_botright; 53 int32 pix_mult; 54 int32 mult_misc; 55 int32 axis_pcnt; 56 } packed_enhanced_regs; 57 58 typedef struct { 59 int32 prim_stream_cntl; 60 int32 col_chroma_key_cntl; 61 char dummy1[0x8190 - 0x8184-sizeof(int32)]; 62 int32 second_stream_cntl; 63 int32 chroma_key_upper_bound; 64 int32 second_stream_stretch; 65 char dummy2[0x81a0 - 0x8198-sizeof(int32)]; 66 int32 blend_cntl; 67 char dummy3[0x81c0 - 0x81a0-sizeof(int32)]; 68 int32 prim_fbaddr0; 69 int32 prim_fbaddr1; 70 int32 prim_stream_stride; 71 int32 double_buffer; 72 int32 second_fbaddr0; 73 int32 second_fbaddr1; 74 int32 second_stream_stride; 75 int32 opaq_overlay_cntl; 76 int32 k1; 77 int32 k2; 78 int32 dda_vert; 79 int32 streams_fifo; 80 int32 prim_start_coord; 81 int32 prim_window_size; 82 int32 second_start_coord; 83 int32 second_window_size; 84 } streams_proc_regs; 85 86 typedef struct { char atr_cntl_ind; char attr_cntl_dat; char misc_out; 87 char viseo_enable; } v3c0; 88 typedef struct { char seq_index; char seq_data; char dac_mask; 89 char dac_rd_index; } v3c4; 90 typedef struct { char dac_wr_index; char dac_data; char feature_cntl; 91 char filler; } v3c8; 92 typedef struct v3cc { char misc_out; char filler; char graph_cntl_index; 93 char graph_cntl_data; } v3cc; 94 typedef struct { 95 v3c0 v3c0_regs; 96 v3c4 v3c4_regs; 97 v3c8 v3c8_regs; 98 v3cc v3cc_regs; 99 } vga_3c_regs; 100 101 typedef struct { char crt_index; char crt_data; int16 filler; } v3d4; 102 typedef struct { int16 filler1; char feature_cntl; char filler2;} v3d8; 103 104 typedef struct { 105 int32 filler; 106 v3d4 v3d4_regs; 107 v3d8 v3d8_regs; 108 } vga_3bd_regs ; 109 110 typedef struct { 111 int32 subsystem_csr; 112 int32 dummy; 113 adv_f_cntl adv_func_cntl; 114 } subsys_regs; 115 116 117 typedef struct { 118 int32 cur_x; 119 char filler1[0x8ae8 - 0x86e8 - sizeof(int32)]; 120 int32 dy_axstep; 121 char filler2[0x8ee8 - 0x8ae8 - sizeof(int32)]; 122 int32 dx_diastep; 123 char filler3[0x92e8 - 0x8ee8 - sizeof(int32)]; 124 int32 line_err; 125 char filler33[0x96e8 - 0x92e8 - sizeof(int32)]; 126 int32 mj_ax_pcnt; 127 char filler4[0x9ae8 - 0x96e8 - sizeof(int32)]; 128 int32 gp_stat; 129 char filler5[0x9ee8 - 0x9ae8 - sizeof(int32)]; 130 int32 stroke_vectrans; 131 char filler6[0xa2e8 - 0x9ee8 - sizeof(int32)]; 132 int32 back_color; 133 char filler7[0xa6e8 - 0xa2e8 - sizeof(int32)]; 134 int32 fore_col; 135 char filler8[0xaae8 - 0xa6e8 - sizeof(int32)]; 136 int32 bitplane_wmask; 137 char filler88[0xaee8 - 0xaae8 - sizeof(int32)]; 138 int32 bitplane_rmask; 139 char filler9[0xb2e8 - 0xaee8 - sizeof(int32)]; 140 int32 color_compare; 141 char filler10[0xb6e8 - 0xb2e8 - sizeof(int32)]; 142 int32 back_mix; 143 char filler101[0xbae8 - 0xb6e8 - sizeof(int32)]; 144 int32 fore_mix; 145 char filler11[0xbee8 - 0xbae8 - sizeof(int32)]; 146 int32 r_reg_data; 147 char filler12[0xe2e8 - 0xbee8 - sizeof(int32)]; 148 int32 pixel_data_transfer; 149 } enhanced_regs; 150 151 typedef struct { 152 int32 lpb_mode; 153 int32 lpb_fifostat; 154 int32 lpb_intflags; 155 int32 lpb_fb0addr; 156 int32 lpb_fb1addr; 157 int32 lpb_direct_addr; 158 int32 lpb_direct_data; 159 int32 lpb_gpio; 160 int32 lpb_serial_port; 161 int32 lpb_input_winsize; 162 int32 lpb_data_offsets; 163 int32 lpb_hor_decimctl; 164 int32 lpb_vert_decimctl; 165 int32 lpb_line_stride; 166 int32 lpb_output_fifo; 167 } lpbus_regs; 168 169 typedef struct { 170 int32 img[0x8000/4]; 171 union { pci_conf_regs regs; 172 char dummy[0x100]; 173 } pci_regs; 174 union { packed_enhanced_regs regs; 175 char dummy[0x80]; 176 } pk_enh_regs; 177 union { streams_proc_regs regs; 178 char dummy[0x82e8-0x8180]; 179 } streams_regs; 180 union { int32 cur_y; 181 char dummy[0x83b0 - 0x82e8]; 182 } cur_y; 183 union { vga_3bd_regs regs; 184 char dummy[0x83c0 - 0x83b0]; 185 } v3b_regs; 186 union { vga_3c_regs regs; 187 char dummy[0x83d0 - 0x83c0]; 188 } v3c_regs; 189 union { vga_3bd_regs regs; 190 char dummy[0x8504 - 0x83d0]; 191 } v3d_regs; 192 union { subsys_regs regs; 193 char dummy[0x86e8 - 0x8504]; 194 } subs_regs; 195 union { enhanced_regs regs; 196 char dummy[0xff00 - 0x86e8]; 197 } enh_regs; 198 union { lpbus_regs regs; 199 char dummy[0xff5c - 0xff00]; 200 } lbp_regs; 201 } mm_trio_regs ; 202 203 #define mmtr volatile mm_trio_regs * 204 205 #define s3MmioMem (pS3->MMIOBase) 206 207 #define IMG_TRANS (((mmtr)s3MmioMem)->img) 208 209 #define SET_WRT_MASK(msk) ((mmtr)s3MmioMem)->pk_enh_regs.regs.wrt_mask = (msk) 210 #define SET_RD_MASK(msk) ((mmtr)s3MmioMem)->pk_enh_regs.regs.rd_mask = (msk) 211 #define SET_FRGD_COLOR(col) ((mmtr)s3MmioMem)->pk_enh_regs.regs.frgd_color = (col) 212 #define SET_BKGD_COLOR(col) ((mmtr)s3MmioMem)->pk_enh_regs.regs.bkgd_color = (col) 213 #define SET_COLOR_CMP(col) ((mmtr)s3MmioMem)->pk_enh_regs.regs.color_cmp = (col) 214 #define SET_FRGD_MIX(fmix) ((mmtr)s3MmioMem)->enh_regs.regs.fore_mix = (fmix) 215 #define SET_BKGD_MIX(bmix) ((mmtr)s3MmioMem)->enh_regs.regs.back_mix = (bmix) 216 #define SET_PIX_CNTL(val) ((mmtr)s3MmioMem)->pk_enh_regs.regs.pix_mult = (val) | (MULT_MISC2 << 16) 217 #define SET_MIN_AXIS_PCNT(min) ((mmtr)s3MmioMem)->enh_regs.regs.r_reg_data = (min) & 0xffff 218 #define SET_MAJ_AXIS_PCNT(maj) ((mmtr)s3MmioMem)->enh_regs.regs.mj_ax_pcnt = (maj) 219 #define SET_CURPT(c_x, c_y) ((mmtr)s3MmioMem)->pk_enh_regs.regs.cur_point = ((c_y)&0xffff) | ((c_x) << 16) 220 #define SET_CUR_X(c_x) ((mmtr)s3MmioMem)->enh_regs.regs.cur_x = (c_x) 221 #define SET_CUR_Y(c_y) ((mmtr)s3MmioMem)->cur_y.cur_y = (c_y) 222 #define SET_DESTSTP(x,y) ((mmtr)s3MmioMem)->pk_enh_regs.regs.dest_stp = ((y)&0xffff) | ((x) << 16) 223 #define SET_AXIS_PCNT(maj, min) ((mmtr)s3MmioMem)->pk_enh_regs.regs.axis_pcnt = ((min)&0xffff) | ((maj) << 16) 224 #define SET_CMD(c_d) { mem_barrier(); ((mmtr)s3MmioMem)->pk_enh_regs.regs.command = (c_d); } 225 #define SET_ERR_TERM(e) ((mmtr)s3MmioMem)->pk_enh_regs.regs.err_term = (e) 226 #define SET_SCISSORS(x1,y1,x2,y2) {\ 227 ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_topleft = ((y1)&0xffff) | ((x1) << 16);\ 228 ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_botright = ((y2)&0xffff) | ((x2) << 16);\ 229 } 230 #define SET_SCISSORS_RB(x,y) ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_botright = ((y)&0xffff) | ((x) << 16) 231 #define SET_SCISSORS_L(l) ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_topleft = ((l) << 16); 232 #define SET_MULT_MISC(val) ((mmtr)s3MmioMem)->pk_enh_regs.regs.mult_misc = (val) 233 234 235 /* 236 * reads from GP_STAT 237 */ 238 #if !defined(__alpha__) 239 #define INB_GP_STAT() ((((mmtr)s3MmioMem)->enh_regs.regs.gp_stat) & 0xff) 240 #define INW_GP_STAT() ((((mmtr)s3MmioMem)->enh_regs.regs.gp_stat)) 241 #else 242 #define INB_GP_STAT() inb(GP_STAT) 243 #define INW_GP_STAT() inw(GP_STAT) 244 #endif 245 246 #define SET_PIX_TRANS_L(val) ((mmtr)s3MmioMem)->img[0] = (val) 247 #define SET_MIX(b,f) ((mmtr)s3MmioMem)->pk_enh_regs.regs.col_mix = ((b) << 16) | (f) 248 249 250 #define WaitQueue(v) \ 251 if(!(pS3->PCIRetry)) { \ 252 mem_barrier(); \ 253 while(INB_GP_STAT() & (0x0100 >> (v))); \ 254 } 255 256 #define CMD_REG_WIDTH 0x200 /* select 32bit command register */ 257 258 #define WaitQueue16_32(n16,n32) \ 259 if((pS3->s3Bpp) <= 2) { WaitQueue(n16); } \ 260 else { WaitQueue(n32); } 261 262 #endif /* _NEWMMIO_H_ */ 263