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)))
16extern int smi_indent;
17
18
19struct 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*/
45struct 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
75struct 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
99struct 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
130struct 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
156struct 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
177static 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
187