linux/drivers/staging/sm750fb/sm750.h
<<
>>
Prefs
   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
  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 *);
  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
  78struct 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
 115struct 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
 130struct 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
 150struct 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
 172struct 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
 182static 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
 190int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
 191int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
 192void hw_sm750_initAccel(struct sm750_dev *sm750_dev);
 193int hw_sm750_deWait(void);
 194int hw_sm750le_deWait(void);
 195
 196int hw_sm750_output_setMode(struct lynxfb_output *output,
 197                            struct fb_var_screeninfo *var,
 198                            struct fb_fix_screeninfo *fix);
 199
 200int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
 201                            struct fb_var_screeninfo *var);
 202
 203int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,
 204                          struct fb_var_screeninfo *var,
 205                          struct fb_fix_screeninfo *fix);
 206
 207int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index,
 208                       ushort red, ushort green, ushort blue);
 209
 210int hw_sm750_setBLANK(struct lynxfb_output *output, int blank);
 211int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank);
 212int 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