221 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef LYNXDRV_H_3#define LYNXDRV_H_4 5#define FB_ACCEL_SMI 0xab6 7#define MHZ(x) ((x) * 1000000)8 9#define DEFAULT_SM750_CHIP_CLOCK 29010#define DEFAULT_SM750LE_CHIP_CLOCK 33311#ifndef SM750LE_REVISION_ID12#define SM750LE_REVISION_ID ((unsigned char)0xfe)13#endif14 15enum 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 */22enum 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 29enum sm750_channel {30 sm750_primary = 0,31 /* enum value equal to the register filed data */32 sm750_secondary = 1,33};34 35enum sm750_path {36 sm750_panel = 1,37 sm750_crt = 2,38 sm750_pnc = 3, /* panel and crt */39};40 41struct 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 51struct 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 *accel);59 60 int (*de_wait)(void);/* see if hardware ready to work */61 62 int (*de_fillrect)(struct lynx_accel *accel,63 u32 base, u32 pitch, u32 bpp,64 u32 x, u32 y, u32 width, u32 height,65 u32 color, u32 rop);66 67 int (*de_copyarea)(struct lynx_accel *accel,68 u32 s_base, u32 s_pitch,69 u32 sx, u32 sy,70 u32 d_base, u32 d_pitch,71 u32 bpp, u32 dx, u32 dy,72 u32 width, u32 height,73 u32 rop2);74 75 int (*de_imageblit)(struct lynx_accel *accel, const char *p_srcbuf,76 u32 src_delta, u32 start_bit, u32 d_base, u32 d_pitch,77 u32 byte_per_pixel, u32 dx, u32 dy, u32 width,78 u32 height, u32 f_color, u32 b_color, u32 rop2);79 80};81 82struct sm750_dev {83 /* common members */84 u16 devid;85 u8 revid;86 struct pci_dev *pdev;87 struct fb_info *fbinfo[2];88 struct lynx_accel accel;89 int accel_off;90 int fb_count;91 int mtrr_off;92 struct{93 int vram;94 } mtrr;95 /* all smi graphic adaptor got below attributes */96 unsigned long vidmem_start;97 unsigned long vidreg_start;98 __u32 vidmem_size;99 __u32 vidreg_size;100 void __iomem *pvReg;101 unsigned char __iomem *pvMem;102 /* locks*/103 spinlock_t slock;104 105 struct init_status initParm;106 enum sm750_pnltype pnltype;107 enum sm750_dataflow dataflow;108 int nocrt;109 110 /*111 * 0: no hardware cursor112 * 1: primary crtc hw cursor enabled,113 * 2: secondary crtc hw cursor enabled114 * 3: both ctrc hw cursor enabled115 */116 int hwCursor;117};118 119struct lynx_cursor {120 /* cursor width ,height and size */121 int w;122 int h;123 int size;124 /* hardware limitation */125 int max_w;126 int max_h;127 /* base virtual address and offset of cursor image */128 char __iomem *vstart;129 int offset;130 /* mmio addr of hw cursor */131 volatile char __iomem *mmio;132};133 134struct lynxfb_crtc {135 unsigned char __iomem *v_cursor; /* virtual address of cursor */136 unsigned char __iomem *v_screen; /* virtual address of on_screen */137 int o_cursor; /* cursor address offset in vidmem */138 int o_screen; /* onscreen address offset in vidmem */139 int channel;/* which channel this crtc stands for*/140 resource_size_t vidmem_size;/* this view's video memory max size */141 142 /* below attributes belong to info->fix, their value depends on specific adaptor*/143 u16 line_pad;/* padding information:0,1,2,4,8,16,... */144 u16 xpanstep;145 u16 ypanstep;146 u16 ywrapstep;147 148 void *priv;149 150 /* cursor information */151 struct lynx_cursor cursor;152};153 154struct lynxfb_output {155 int dpms;156 int paths;157 /*158 * which paths(s) this output stands for,for sm750:159 * paths=1:means output for panel paths160 * paths=2:means output for crt paths161 * paths=3:means output for both panel and crt paths162 */163 164 int *channel;165 /*166 * which channel these outputs linked with,for sm750:167 * *channel=0 means primary channel168 * *channel=1 means secondary channel169 * output->channel ==> &crtc->channel170 */171 void *priv;172 173 int (*proc_setBLANK)(struct lynxfb_output *output, int blank);174};175 176struct lynxfb_par {177 /* either 0 or 1 for dual head adaptor,0 is the older one registered */178 int index;179 unsigned int pseudo_palette[256];180 struct lynxfb_crtc crtc;181 struct lynxfb_output output;182 struct fb_info *info;183 struct sm750_dev *dev;184};185 186static inline unsigned long ps_to_hz(unsigned int psvalue)187{188 unsigned long long numerator = 1000 * 1000 * 1000 * 1000ULL;189 /* 10^12 / picosecond period gives frequency in Hz */190 do_div(numerator, psvalue);191 return (unsigned long)numerator;192}193 194int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);195int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev);196void hw_sm750_initAccel(struct sm750_dev *sm750_dev);197int hw_sm750_deWait(void);198int hw_sm750le_deWait(void);199 200int hw_sm750_output_setMode(struct lynxfb_output *output,201 struct fb_var_screeninfo *var,202 struct fb_fix_screeninfo *fix);203 204int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,205 struct fb_var_screeninfo *var);206 207int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,208 struct fb_var_screeninfo *var,209 struct fb_fix_screeninfo *fix);210 211int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index,212 ushort red, ushort green, ushort blue);213 214int hw_sm750_setBLANK(struct lynxfb_output *output, int blank);215int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank);216int hw_sm750_pan_display(struct lynxfb_crtc *crtc,217 const struct fb_var_screeninfo *var,218 const struct fb_info *info);219 220#endif221