1 #ifndef LYNXDRV_H_ 2 #define LYNXDRV_H_ 3 4 #define FB_ACCEL_SMI 0xab 5 6 #define MHZ(x) ((x) * 1000000) 7 8 #define DEFAULT_SM750_CHIP_CLOCK 290 9 #define DEFAULT_SM750LE_CHIP_CLOCK 333 10 #ifndef SM750LE_REVISION_ID 11 #define SM750LE_REVISION_ID ((unsigned char)0xfe) 12 #endif 13 14 enum sm750_pnltype { 15 sm750_24TFT = 0, /* 24bit tft */ 16 sm750_dualTFT = 2, /* dual 18 bit tft */ 17 sm750_doubleTFT = 1, /* 36 bit double pixel tft */ 18 }; 19 20 /* vga channel is not concerned */ 21 enum sm750_dataflow { 22 sm750_simul_pri, /* primary => all head */ 23 sm750_simul_sec, /* secondary => all head */ 24 sm750_dual_normal, /* primary => panel head and secondary => crt */ 25 sm750_dual_swap, /* primary => crt head and secondary => panel */ 26 }; 27 28 enum sm750_channel { 29 sm750_primary = 0, 30 /* enum value equal to the register filed data */ 31 sm750_secondary = 1, 32 }; 33 34 enum sm750_path { 35 sm750_panel = 1, 36 sm750_crt = 2, 37 sm750_pnc = 3, /* panel and crt */ 38 }; 39 40 struct init_status { 41 ushort powerMode; 42 /* below three clocks are in unit of MHZ*/ 43 ushort chip_clk; 44 ushort mem_clk; 45 ushort master_clk; 46 ushort setAllEngOff; 47 ushort resetMemory; 48 }; 49 50 struct lynx_accel { 51 /* base virtual address of DPR registers */ 52 volatile unsigned char __iomem *dprBase; 53 /* base virtual address of de data port */ 54 volatile unsigned char __iomem *dpPortBase; 55 56 /* function pointers */ 57 void (*de_init)(struct lynx_accel *); 58 59 int (*de_wait)(void);/* see if hardware ready to work */ 60 61 int (*de_fillrect)(struct lynx_accel *, u32, u32, u32, u32, 62 u32, u32, u32, u32, u32); 63 64 int (*de_copyarea)(struct lynx_accel *, u32, u32, u32, u32, 65 u32, u32, u32, u32, 66 u32, u32, u32, u32); 67 68 int (*de_imageblit)(struct lynx_accel *, const char *, u32, u32, u32, u32, 69 u32, u32, u32, u32, 70 u32, u32, u32, u32); 71 72 }; 73 74 struct sm750_dev { 75 /* common members */ 76 u16 devid; 77 u8 revid; 78 struct pci_dev *pdev; 79 struct fb_info *fbinfo[2]; 80 struct lynx_accel accel; 81 int accel_off; 82 int fb_count; 83 int mtrr_off; 84 struct{ 85 int vram; 86 } mtrr; 87 /* all smi graphic adaptor got below attributes */ 88 unsigned long vidmem_start; 89 unsigned long vidreg_start; 90 __u32 vidmem_size; 91 __u32 vidreg_size; 92 void __iomem *pvReg; 93 unsigned char __iomem *pvMem; 94 /* locks*/ 95 spinlock_t slock; 96 97 struct init_status initParm; 98 enum sm750_pnltype pnltype; 99 enum sm750_dataflow dataflow; 100 int nocrt; 101 102 /* 103 * 0: no hardware cursor 104 * 1: primary crtc hw cursor enabled, 105 * 2: secondary crtc hw cursor enabled 106 * 3: both ctrc hw cursor enabled 107 */ 108 int hwCursor; 109 }; 110 111 struct lynx_cursor { 112 /* cursor width ,height and size */ 113 int w; 114 int h; 115 int size; 116 /* hardware limitation */ 117 int maxW; 118 int maxH; 119 /* base virtual address and offset of cursor image */ 120 char __iomem *vstart; 121 int offset; 122 /* mmio addr of hw cursor */ 123 volatile char __iomem *mmio; 124 }; 125 126 struct lynxfb_crtc { 127 unsigned char __iomem *vCursor; /* virtual address of cursor */ 128 unsigned char __iomem *vScreen; /* virtual address of on_screen */ 129 int oCursor; /* cursor address offset in vidmem */ 130 int oScreen; /* onscreen address offset in vidmem */ 131 int channel;/* which channel this crtc stands for*/ 132 resource_size_t vidmem_size;/* this view's video memory max size */ 133 134 /* below attributes belong to info->fix, their value depends on specific adaptor*/ 135 u16 line_pad;/* padding information:0,1,2,4,8,16,... */ 136 u16 xpanstep; 137 u16 ypanstep; 138 u16 ywrapstep; 139 140 void *priv; 141 142 /* cursor information */ 143 struct lynx_cursor cursor; 144 }; 145 146 struct lynxfb_output { 147 int dpms; 148 int paths; 149 /* which paths(s) this output stands for,for sm750: 150 paths=1:means output for panel paths 151 paths=2:means output for crt paths 152 paths=3:means output for both panel and crt paths 153 */ 154 155 int *channel; 156 /* which channel these outputs linked with,for sm750: 157 *channel=0 means primary channel 158 *channel=1 means secondary channel 159 output->channel ==> &crtc->channel 160 */ 161 void *priv; 162 163 int (*proc_setBLANK)(struct lynxfb_output*, int); 164 }; 165 166 struct lynxfb_par { 167 /* either 0 or 1 for dual head adaptor,0 is the older one registered */ 168 int index; 169 unsigned int pseudo_palette[256]; 170 struct lynxfb_crtc crtc; 171 struct lynxfb_output output; 172 struct fb_info *info; 173 struct sm750_dev *dev; 174 }; 175 176 static inline unsigned long ps_to_hz(unsigned int psvalue) 177 { 178 unsigned long long numerator = 1000*1000*1000*1000ULL; 179 /* 10^12 / picosecond period gives frequency in Hz */ 180 do_div(numerator, psvalue); 181 return (unsigned long)numerator; 182 } 183 184 int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev); 185 int hw_sm750_inithw(struct sm750_dev*, struct pci_dev *); 186 void hw_sm750_initAccel(struct sm750_dev *); 187 int hw_sm750_deWait(void); 188 int hw_sm750le_deWait(void); 189 190 int hw_sm750_output_setMode(struct lynxfb_output*, struct fb_var_screeninfo*, 191 struct fb_fix_screeninfo*); 192 int hw_sm750_crtc_checkMode(struct lynxfb_crtc*, struct fb_var_screeninfo*); 193 int hw_sm750_crtc_setMode(struct lynxfb_crtc*, struct fb_var_screeninfo*, 194 struct fb_fix_screeninfo*); 195 int hw_sm750_setColReg(struct lynxfb_crtc*, ushort, ushort, ushort, ushort); 196 int hw_sm750_setBLANK(struct lynxfb_output*, int); 197 int hw_sm750le_setBLANK(struct lynxfb_output*, int); 198 int hw_sm750_pan_display(struct lynxfb_crtc *crtc, 199 const struct fb_var_screeninfo *var, 200 const struct fb_info *info); 201 202 #endif 203