These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / staging / sm750fb / sm750.h
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 fointers */
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 dual;
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