1
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,
17 sm750_dualTFT = 2,
18 sm750_doubleTFT = 1,
19};
20
21
22enum sm750_dataflow {
23 sm750_simul_pri,
24 sm750_simul_sec,
25 sm750_dual_normal,
26 sm750_dual_swap,
27};
28
29enum sm750_channel {
30 sm750_primary = 0,
31
32 sm750_secondary = 1,
33};
34
35enum sm750_path {
36 sm750_panel = 1,
37 sm750_crt = 2,
38 sm750_pnc = 3,
39};
40
41struct init_status {
42 ushort powerMode;
43
44 ushort chip_clk;
45 ushort mem_clk;
46 ushort master_clk;
47 ushort setAllEngOff;
48 ushort resetMemory;
49};
50
51struct lynx_accel {
52
53 volatile unsigned char __iomem *dprBase;
54
55 volatile unsigned char __iomem *dpPortBase;
56
57
58 void (*de_init)(struct lynx_accel *accel);
59
60 int (*de_wait)(void);
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
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
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
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
112
113
114
115
116 int hwCursor;
117};
118
119struct lynx_cursor {
120
121 int w;
122 int h;
123 int size;
124
125 int max_w;
126 int max_h;
127
128 char __iomem *vstart;
129 int offset;
130
131 volatile char __iomem *mmio;
132};
133
134struct lynxfb_crtc {
135 unsigned char __iomem *v_cursor;
136 unsigned char __iomem *v_screen;
137 int o_cursor;
138 int o_screen;
139 int channel;
140 resource_size_t vidmem_size;
141
142
143 u16 line_pad;
144 u16 xpanstep;
145 u16 ypanstep;
146 u16 ywrapstep;
147
148 void *priv;
149
150
151 struct lynx_cursor cursor;
152};
153
154struct lynxfb_output {
155 int dpms;
156 int paths;
157
158
159
160
161
162
163
164 int *channel;
165
166
167
168
169
170
171 void *priv;
172
173 int (*proc_setBLANK)(struct lynxfb_output *output, int blank);
174};
175
176struct lynxfb_par {
177
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
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#endif
221