1340e3fbdSmrg 2340e3fbdSmrg/* 3340e3fbdSmrg * 4340e3fbdSmrg * Copyright 1995-1997 The XFree86 Project, Inc. 5340e3fbdSmrg * 6340e3fbdSmrg */ 7340e3fbdSmrg 8340e3fbdSmrg#ifndef _NEWMMIO_H_ 9340e3fbdSmrg#define _NEWMMIO_H_ 10340e3fbdSmrg 11340e3fbdSmrg#include <X11/Xmd.h> 12340e3fbdSmrg 13340e3fbdSmrg 14340e3fbdSmrg#define int16 CARD16 15340e3fbdSmrg#define int32 CARD32 16340e3fbdSmrg 17340e3fbdSmrg#define S3_NEWMMIO_VGABASE (S3_NEWMMIO_REGBASE + 0x8000) 18340e3fbdSmrg 19340e3fbdSmrgtypedef struct { int16 vendor_ID; int16 device_ID; } pci_id; 20340e3fbdSmrgtypedef struct { int16 cmd; int16 devsel; } cmd_devsel; 21340e3fbdSmrg 22340e3fbdSmrgtypedef struct { 23340e3fbdSmrg pci_id pci_ident; 24340e3fbdSmrg cmd_devsel cmd_device_sel; 25340e3fbdSmrg int32 class_code; 26340e3fbdSmrg int32 dummy5; 27340e3fbdSmrg int32 base0; 28340e3fbdSmrg char dummy1[0x20-sizeof(int32)]; 29340e3fbdSmrg int32 bios_base; 30340e3fbdSmrg char dummy2[0x3c - 0x32]; 31340e3fbdSmrg} pci_conf_regs; 32340e3fbdSmrg 33340e3fbdSmrg 34340e3fbdSmrgtypedef struct { int16 filler; int16 adv_f_cntl; } adv_f_cntl; 35340e3fbdSmrg 36340e3fbdSmrgtypedef struct { 37340e3fbdSmrg int32 cur_point; 38340e3fbdSmrg char dummy1[4]; 39340e3fbdSmrg int32 dest_stp; 40340e3fbdSmrg char dummy2[4]; 41340e3fbdSmrg int32 err_term; 42340e3fbdSmrg char dummy3[4]; 43340e3fbdSmrg int32 command; 44340e3fbdSmrg int32 short_stroke; 45340e3fbdSmrg int32 bkgd_color; 46340e3fbdSmrg int32 frgd_color; 47340e3fbdSmrg int32 wrt_mask; 48340e3fbdSmrg int32 rd_mask; 49340e3fbdSmrg int32 color_cmp; 50340e3fbdSmrg int32 col_mix; 51340e3fbdSmrg int32 sciss_topleft; 52340e3fbdSmrg int32 sciss_botright; 53340e3fbdSmrg int32 pix_mult; 54340e3fbdSmrg int32 mult_misc; 55340e3fbdSmrg int32 axis_pcnt; 56340e3fbdSmrg} packed_enhanced_regs; 57340e3fbdSmrg 58340e3fbdSmrgtypedef struct { 59340e3fbdSmrg int32 prim_stream_cntl; 60340e3fbdSmrg int32 col_chroma_key_cntl; 61340e3fbdSmrg char dummy1[0x8190 - 0x8184-sizeof(int32)]; 62340e3fbdSmrg int32 second_stream_cntl; 63340e3fbdSmrg int32 chroma_key_upper_bound; 64340e3fbdSmrg int32 second_stream_stretch; 65340e3fbdSmrg char dummy2[0x81a0 - 0x8198-sizeof(int32)]; 66340e3fbdSmrg int32 blend_cntl; 67340e3fbdSmrg char dummy3[0x81c0 - 0x81a0-sizeof(int32)]; 68340e3fbdSmrg int32 prim_fbaddr0; 69340e3fbdSmrg int32 prim_fbaddr1; 70340e3fbdSmrg int32 prim_stream_stride; 71340e3fbdSmrg int32 double_buffer; 72340e3fbdSmrg int32 second_fbaddr0; 73340e3fbdSmrg int32 second_fbaddr1; 74340e3fbdSmrg int32 second_stream_stride; 75340e3fbdSmrg int32 opaq_overlay_cntl; 76340e3fbdSmrg int32 k1; 77340e3fbdSmrg int32 k2; 78340e3fbdSmrg int32 dda_vert; 79340e3fbdSmrg int32 streams_fifo; 80340e3fbdSmrg int32 prim_start_coord; 81340e3fbdSmrg int32 prim_window_size; 82340e3fbdSmrg int32 second_start_coord; 83340e3fbdSmrg int32 second_window_size; 84340e3fbdSmrg} streams_proc_regs; 85340e3fbdSmrg 86340e3fbdSmrgtypedef struct { char atr_cntl_ind; char attr_cntl_dat; char misc_out; 87340e3fbdSmrg char viseo_enable; } v3c0; 88340e3fbdSmrgtypedef struct { char seq_index; char seq_data; char dac_mask; 89340e3fbdSmrg char dac_rd_index; } v3c4; 90340e3fbdSmrgtypedef struct { char dac_wr_index; char dac_data; char feature_cntl; 91340e3fbdSmrg char filler; } v3c8; 92340e3fbdSmrgtypedef struct v3cc { char misc_out; char filler; char graph_cntl_index; 93340e3fbdSmrg char graph_cntl_data; } v3cc; 94340e3fbdSmrgtypedef struct { 95340e3fbdSmrg v3c0 v3c0_regs; 96340e3fbdSmrg v3c4 v3c4_regs; 97340e3fbdSmrg v3c8 v3c8_regs; 98340e3fbdSmrg v3cc v3cc_regs; 99340e3fbdSmrg} vga_3c_regs; 100340e3fbdSmrg 101340e3fbdSmrgtypedef struct { char crt_index; char crt_data; int16 filler; } v3d4; 102340e3fbdSmrgtypedef struct { int16 filler1; char feature_cntl; char filler2;} v3d8; 103340e3fbdSmrg 104340e3fbdSmrgtypedef struct { 105340e3fbdSmrg int32 filler; 106340e3fbdSmrg v3d4 v3d4_regs; 107340e3fbdSmrg v3d8 v3d8_regs; 108340e3fbdSmrg} vga_3bd_regs ; 109340e3fbdSmrg 110340e3fbdSmrgtypedef struct { 111340e3fbdSmrg int32 subsystem_csr; 112340e3fbdSmrg int32 dummy; 113340e3fbdSmrg adv_f_cntl adv_func_cntl; 114340e3fbdSmrg} subsys_regs; 115340e3fbdSmrg 116340e3fbdSmrg 117340e3fbdSmrgtypedef struct { 118340e3fbdSmrg int32 cur_x; 119340e3fbdSmrg char filler1[0x8ae8 - 0x86e8 - sizeof(int32)]; 120340e3fbdSmrg int32 dy_axstep; 121340e3fbdSmrg char filler2[0x8ee8 - 0x8ae8 - sizeof(int32)]; 122340e3fbdSmrg int32 dx_diastep; 123340e3fbdSmrg char filler3[0x92e8 - 0x8ee8 - sizeof(int32)]; 124340e3fbdSmrg int32 line_err; 125340e3fbdSmrg char filler33[0x96e8 - 0x92e8 - sizeof(int32)]; 126340e3fbdSmrg int32 mj_ax_pcnt; 127340e3fbdSmrg char filler4[0x9ae8 - 0x96e8 - sizeof(int32)]; 128340e3fbdSmrg int32 gp_stat; 129340e3fbdSmrg char filler5[0x9ee8 - 0x9ae8 - sizeof(int32)]; 130340e3fbdSmrg int32 stroke_vectrans; 131340e3fbdSmrg char filler6[0xa2e8 - 0x9ee8 - sizeof(int32)]; 132340e3fbdSmrg int32 back_color; 133340e3fbdSmrg char filler7[0xa6e8 - 0xa2e8 - sizeof(int32)]; 134340e3fbdSmrg int32 fore_col; 135340e3fbdSmrg char filler8[0xaae8 - 0xa6e8 - sizeof(int32)]; 136340e3fbdSmrg int32 bitplane_wmask; 137340e3fbdSmrg char filler88[0xaee8 - 0xaae8 - sizeof(int32)]; 138340e3fbdSmrg int32 bitplane_rmask; 139340e3fbdSmrg char filler9[0xb2e8 - 0xaee8 - sizeof(int32)]; 140340e3fbdSmrg int32 color_compare; 141340e3fbdSmrg char filler10[0xb6e8 - 0xb2e8 - sizeof(int32)]; 142340e3fbdSmrg int32 back_mix; 143340e3fbdSmrg char filler101[0xbae8 - 0xb6e8 - sizeof(int32)]; 144340e3fbdSmrg int32 fore_mix; 145340e3fbdSmrg char filler11[0xbee8 - 0xbae8 - sizeof(int32)]; 146340e3fbdSmrg int32 r_reg_data; 147340e3fbdSmrg char filler12[0xe2e8 - 0xbee8 - sizeof(int32)]; 148340e3fbdSmrg int32 pixel_data_transfer; 149340e3fbdSmrg} enhanced_regs; 150340e3fbdSmrg 151340e3fbdSmrgtypedef struct { 152340e3fbdSmrg int32 lpb_mode; 153340e3fbdSmrg int32 lpb_fifostat; 154340e3fbdSmrg int32 lpb_intflags; 155340e3fbdSmrg int32 lpb_fb0addr; 156340e3fbdSmrg int32 lpb_fb1addr; 157340e3fbdSmrg int32 lpb_direct_addr; 158340e3fbdSmrg int32 lpb_direct_data; 159340e3fbdSmrg int32 lpb_gpio; 160340e3fbdSmrg int32 lpb_serial_port; 161340e3fbdSmrg int32 lpb_input_winsize; 162340e3fbdSmrg int32 lpb_data_offsets; 163340e3fbdSmrg int32 lpb_hor_decimctl; 164340e3fbdSmrg int32 lpb_vert_decimctl; 165340e3fbdSmrg int32 lpb_line_stride; 166340e3fbdSmrg int32 lpb_output_fifo; 167340e3fbdSmrg} lpbus_regs; 168340e3fbdSmrg 169340e3fbdSmrgtypedef struct { 170340e3fbdSmrg int32 img[0x8000/4]; 171340e3fbdSmrg union { pci_conf_regs regs; 172340e3fbdSmrg char dummy[0x100]; 173340e3fbdSmrg } pci_regs; 174340e3fbdSmrg union { packed_enhanced_regs regs; 175340e3fbdSmrg char dummy[0x80]; 176340e3fbdSmrg } pk_enh_regs; 177340e3fbdSmrg union { streams_proc_regs regs; 178340e3fbdSmrg char dummy[0x82e8-0x8180]; 179340e3fbdSmrg } streams_regs; 180340e3fbdSmrg union { int32 cur_y; 181340e3fbdSmrg char dummy[0x83b0 - 0x82e8]; 182340e3fbdSmrg } cur_y; 183340e3fbdSmrg union { vga_3bd_regs regs; 184340e3fbdSmrg char dummy[0x83c0 - 0x83b0]; 185340e3fbdSmrg } v3b_regs; 186340e3fbdSmrg union { vga_3c_regs regs; 187340e3fbdSmrg char dummy[0x83d0 - 0x83c0]; 188340e3fbdSmrg } v3c_regs; 189340e3fbdSmrg union { vga_3bd_regs regs; 190340e3fbdSmrg char dummy[0x8504 - 0x83d0]; 191340e3fbdSmrg } v3d_regs; 192340e3fbdSmrg union { subsys_regs regs; 193340e3fbdSmrg char dummy[0x86e8 - 0x8504]; 194340e3fbdSmrg } subs_regs; 195340e3fbdSmrg union { enhanced_regs regs; 196340e3fbdSmrg char dummy[0xff00 - 0x86e8]; 197340e3fbdSmrg } enh_regs; 198340e3fbdSmrg union { lpbus_regs regs; 199340e3fbdSmrg char dummy[0xff5c - 0xff00]; 200340e3fbdSmrg } lbp_regs; 201340e3fbdSmrg} mm_trio_regs ; 202340e3fbdSmrg 203340e3fbdSmrg#define mmtr volatile mm_trio_regs * 204340e3fbdSmrg 205340e3fbdSmrg#define s3MmioMem (pS3->MMIOBase) 206340e3fbdSmrg 207340e3fbdSmrg#define IMG_TRANS (((mmtr)s3MmioMem)->img) 208340e3fbdSmrg 209340e3fbdSmrg#define SET_WRT_MASK(msk) ((mmtr)s3MmioMem)->pk_enh_regs.regs.wrt_mask = (msk) 210340e3fbdSmrg#define SET_RD_MASK(msk) ((mmtr)s3MmioMem)->pk_enh_regs.regs.rd_mask = (msk) 211340e3fbdSmrg#define SET_FRGD_COLOR(col) ((mmtr)s3MmioMem)->pk_enh_regs.regs.frgd_color = (col) 212340e3fbdSmrg#define SET_BKGD_COLOR(col) ((mmtr)s3MmioMem)->pk_enh_regs.regs.bkgd_color = (col) 213340e3fbdSmrg#define SET_COLOR_CMP(col) ((mmtr)s3MmioMem)->pk_enh_regs.regs.color_cmp = (col) 214340e3fbdSmrg#define SET_FRGD_MIX(fmix) ((mmtr)s3MmioMem)->enh_regs.regs.fore_mix = (fmix) 215340e3fbdSmrg#define SET_BKGD_MIX(bmix) ((mmtr)s3MmioMem)->enh_regs.regs.back_mix = (bmix) 216340e3fbdSmrg#define SET_PIX_CNTL(val) ((mmtr)s3MmioMem)->pk_enh_regs.regs.pix_mult = (val) | (MULT_MISC2 << 16) 217340e3fbdSmrg#define SET_MIN_AXIS_PCNT(min) ((mmtr)s3MmioMem)->enh_regs.regs.r_reg_data = (min) & 0xffff 218340e3fbdSmrg#define SET_MAJ_AXIS_PCNT(maj) ((mmtr)s3MmioMem)->enh_regs.regs.mj_ax_pcnt = (maj) 219340e3fbdSmrg#define SET_CURPT(c_x, c_y) ((mmtr)s3MmioMem)->pk_enh_regs.regs.cur_point = ((c_y)&0xffff) | ((c_x) << 16) 220340e3fbdSmrg#define SET_CUR_X(c_x) ((mmtr)s3MmioMem)->enh_regs.regs.cur_x = (c_x) 221340e3fbdSmrg#define SET_CUR_Y(c_y) ((mmtr)s3MmioMem)->cur_y.cur_y = (c_y) 222340e3fbdSmrg#define SET_DESTSTP(x,y) ((mmtr)s3MmioMem)->pk_enh_regs.regs.dest_stp = ((y)&0xffff) | ((x) << 16) 223340e3fbdSmrg#define SET_AXIS_PCNT(maj, min) ((mmtr)s3MmioMem)->pk_enh_regs.regs.axis_pcnt = ((min)&0xffff) | ((maj) << 16) 224340e3fbdSmrg#define SET_CMD(c_d) { mem_barrier(); ((mmtr)s3MmioMem)->pk_enh_regs.regs.command = (c_d); } 225340e3fbdSmrg#define SET_ERR_TERM(e) ((mmtr)s3MmioMem)->pk_enh_regs.regs.err_term = (e) 226340e3fbdSmrg#define SET_SCISSORS(x1,y1,x2,y2) {\ 227340e3fbdSmrg ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_topleft = ((y1)&0xffff) | ((x1) << 16);\ 228340e3fbdSmrg ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_botright = ((y2)&0xffff) | ((x2) << 16);\ 229340e3fbdSmrg } 230340e3fbdSmrg#define SET_SCISSORS_RB(x,y) ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_botright = ((y)&0xffff) | ((x) << 16) 231340e3fbdSmrg#define SET_SCISSORS_L(l) ((mmtr)s3MmioMem)->pk_enh_regs.regs.sciss_topleft = ((l) << 16); 232340e3fbdSmrg#define SET_MULT_MISC(val) ((mmtr)s3MmioMem)->pk_enh_regs.regs.mult_misc = (val) 233340e3fbdSmrg 234340e3fbdSmrg 235340e3fbdSmrg/* 236340e3fbdSmrg * reads from GP_STAT 237340e3fbdSmrg */ 238340e3fbdSmrg#if !defined(__alpha__) 239340e3fbdSmrg#define INB_GP_STAT() ((((mmtr)s3MmioMem)->enh_regs.regs.gp_stat) & 0xff) 240340e3fbdSmrg#define INW_GP_STAT() ((((mmtr)s3MmioMem)->enh_regs.regs.gp_stat)) 241340e3fbdSmrg#else 242340e3fbdSmrg#define INB_GP_STAT() inb(GP_STAT) 243340e3fbdSmrg#define INW_GP_STAT() inw(GP_STAT) 244340e3fbdSmrg#endif 245340e3fbdSmrg 246340e3fbdSmrg#define SET_PIX_TRANS_L(val) ((mmtr)s3MmioMem)->img[0] = (val) 247340e3fbdSmrg#define SET_MIX(b,f) ((mmtr)s3MmioMem)->pk_enh_regs.regs.col_mix = ((b) << 16) | (f) 248340e3fbdSmrg 249340e3fbdSmrg 250340e3fbdSmrg#define WaitQueue(v) \ 251bd35f0dbSahoka if(!(pS3->PCIRetry)) { \ 252340e3fbdSmrg mem_barrier(); \ 253bd35f0dbSahoka while(INB_GP_STAT() & (0x0100 >> (v))); \ 254bd35f0dbSahoka } 255340e3fbdSmrg 256340e3fbdSmrg#define CMD_REG_WIDTH 0x200 /* select 32bit command register */ 257340e3fbdSmrg 258340e3fbdSmrg#define WaitQueue16_32(n16,n32) \ 259340e3fbdSmrg if((pS3->s3Bpp) <= 2) { WaitQueue(n16); } \ 260340e3fbdSmrg else { WaitQueue(n32); } 261340e3fbdSmrg 262340e3fbdSmrg#endif /* _NEWMMIO_H_ */ 263