1#ifndef LYNXDRV_H_ 2#define LYNXDRV_H_ 3 4 5 6#define FB_ACCEL_SMI 0xab 7/* please use revision id to distinguish sm750le and sm750*/ 8#define SPC_SM750 0 9 10//#define SPC_SM750LE 8 11 12#define MB(x) ((x)<<20) 13#define MHZ(x) ((x) * 1000000) 14/* align should be 2,4,8,16 */ 15#define PADDING(align,data) (((data)+(align)-1)&(~((align) -1))) 16extern int smi_indent; 17 18 19struct lynx_accel{ 20 /* base virtual address of DPR registers */ 21 volatile unsigned char __iomem * dprBase; 22 /* base virtual address of de data port */ 23 volatile unsigned char __iomem * dpPortBase; 24 25 /* function fointers */ 26 void (*de_init)(struct lynx_accel *); 27 28 int (*de_wait)(void);/* see if hardware ready to work */ 29 30 int (*de_fillrect)(struct lynx_accel *,u32,u32,u32, 31 u32,u32,u32,u32,u32,u32); 32 33 int (*de_copyarea)(struct lynx_accel *,u32,u32,u32,u32, 34 u32,u32,u32,u32, 35 u32,u32,u32,u32); 36 37 int (*de_imageblit)(struct lynx_accel *,const char *,u32,u32,u32, 38 u32,u32,u32,u32,u32,u32,u32,u32,u32); 39 40}; 41 42/* lynx_share stands for a presentation of two frame buffer 43 that use one smi adaptor , it is similar to a basic class of C++ 44*/ 45struct lynx_share{ 46 /* common members */ 47 u16 devid; 48 u8 revid; 49 struct pci_dev * pdev; 50 struct fb_info * fbinfo[2]; 51 struct lynx_accel accel; 52 int accel_off; 53 int dual; 54#ifdef CONFIG_MTRR 55 int mtrr_off; 56 struct{ 57 int vram; 58 int vram_added; 59 }mtrr; 60#endif 61 /* all smi graphic adaptor got below attributes */ 62 unsigned long vidmem_start; 63 unsigned long vidreg_start; 64 __u32 vidmem_size; 65 __u32 vidreg_size; 66 void __iomem * pvReg; 67 unsigned char __iomem * pvMem; 68 /* locks*/ 69 spinlock_t slock; 70 /* function pointers */ 71 void (*suspend)(struct lynx_share*); 72 void (*resume)(struct lynx_share*); 73}; 74 75struct lynx_cursor{ 76 /* cursor width ,height and size */ 77 int w; 78 int h; 79 int size; 80 /* hardware limitation */ 81 int maxW; 82 int maxH; 83 /* base virtual address and offset of cursor image */ 84 char __iomem * vstart; 85 int offset; 86 /* mmio addr of hw cursor */ 87 volatile char __iomem * mmio; 88 /* the lynx_share of this adaptor */ 89 struct lynx_share * share; 90 /* proc_routines */ 91 void (*enable)(struct lynx_cursor *); 92 void (*disable)(struct lynx_cursor *); 93 void (*setSize)(struct lynx_cursor *,int,int); 94 void (*setPos)(struct lynx_cursor *,int,int); 95 void (*setColor)(struct lynx_cursor *,u32,u32); 96 void (*setData)(struct lynx_cursor *,u16,const u8*,const u8*); 97}; 98 99struct lynxfb_crtc{ 100 unsigned char __iomem * vCursor;//virtual address of cursor 101 unsigned char __iomem * vScreen;//virtual address of on_screen 102 int oCursor;//cursor address offset in vidmem 103 int oScreen;//onscreen address offset in vidmem 104 int channel;/* which channel this crtc stands for*/ 105 resource_size_t vidmem_size;/* this view's video memory max size */ 106 107 /* below attributes belong to info->fix, their value depends on specific adaptor*/ 108 u16 line_pad;/* padding information:0,1,2,4,8,16,... */ 109 u16 xpanstep; 110 u16 ypanstep; 111 u16 ywrapstep; 112 113 void * priv; 114 115 int(*proc_setMode)(struct lynxfb_crtc*, 116 struct fb_var_screeninfo*, 117 struct fb_fix_screeninfo*); 118 119 int(*proc_checkMode)(struct lynxfb_crtc*,struct fb_var_screeninfo*); 120 int(*proc_setColReg)(struct lynxfb_crtc*,ushort,ushort,ushort,ushort); 121 void (*clear)(struct lynxfb_crtc*); 122 /* pan display */ 123 int (*proc_panDisplay)(struct lynxfb_crtc *, 124 const struct fb_var_screeninfo *, 125 const struct fb_info *); 126 /* cursor information */ 127 struct lynx_cursor cursor; 128}; 129 130struct lynxfb_output{ 131 int dpms; 132 int paths; 133 /* which paths(s) this output stands for,for sm750: 134 paths=1:means output for panel paths 135 paths=2:means output for crt paths 136 paths=3:means output for both panel and crt paths 137 */ 138 139 int * channel; 140 /* which channel these outputs linked with,for sm750: 141 *channel=0 means primary channel 142 *channel=1 means secondary channel 143 output->channel ==> &crtc->channel 144 */ 145 void * priv; 146 147 int(*proc_setMode)(struct lynxfb_output*, 148 struct fb_var_screeninfo*, 149 struct fb_fix_screeninfo*); 150 151 int(*proc_checkMode)(struct lynxfb_output*,struct fb_var_screeninfo*); 152 int(*proc_setBLANK)(struct lynxfb_output*,int); 153 void (*clear)(struct lynxfb_output*); 154}; 155 156struct lynxfb_par{ 157 /* either 0 or 1 for dual head adaptor,0 is the older one registered */ 158 int index; 159 unsigned int pseudo_palette[256]; 160 struct lynxfb_crtc crtc; 161 struct lynxfb_output output; 162 struct fb_info * info; 163 struct lynx_share * share; 164}; 165 166#ifndef offsetof 167#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 168#endif 169 170 171#define PS_TO_HZ(ps) \ 172 ({ \ 173 unsigned long long hz = 1000*1000*1000*1000ULL; \ 174 do_div(hz,ps); \ 175 (unsigned long)hz;}) 176 177static inline unsigned long ps_to_hz(unsigned int psvalue) 178{ 179 unsigned long long numerator=1000*1000*1000*1000ULL; 180 /* 10^12 / picosecond period gives frequency in Hz */ 181 do_div(numerator, psvalue); 182 return (unsigned long)numerator; 183} 184 185 186#endif 187