Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / staging / sm750fb / sm750.h
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)))
16 extern int smi_indent;
17
18
19 struct 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 */
45 struct 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
75 struct 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
99 struct 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
130 struct 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
156 struct 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
177 static 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