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
15 enum 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 */
22 enum 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
29 enum sm750_channel {
30 sm750_primary = 0,
31 /* enum value equal to the register filed data */
32 sm750_secondary = 1,
33 };
34
35 enum sm750_path {
36 sm750_panel = 1,
37 sm750_crt = 2,
38 sm750_pnc = 3, /* panel and crt */
39 };
40
41 struct 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
51 struct 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
78 struct 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
115 struct 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
130 struct 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
150 struct 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
172 struct 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
ps_to_hz(unsigned int psvalue)182 static 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
190 int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
191 int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
192 void hw_sm750_initAccel(struct sm750_dev *sm750_dev);
193 int hw_sm750_deWait(void);
194 int hw_sm750le_deWait(void);
195
196 int hw_sm750_output_setMode(struct lynxfb_output *output,
197 struct fb_var_screeninfo *var,
198 struct fb_fix_screeninfo *fix);
199
200 int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
201 struct fb_var_screeninfo *var);
202
203 int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,
204 struct fb_var_screeninfo *var,
205 struct fb_fix_screeninfo *fix);
206
207 int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index,
208 ushort red, ushort green, ushort blue);
209
210 int hw_sm750_setBLANK(struct lynxfb_output *output, int blank);
211 int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank);
212 int 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