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