blob: ff31c5c9cc6f6145fe274a2abb148e8d901c1308 [file] [log] [blame]
Sudip Mukherjee81dee672015-03-03 16:21:06 +05301#ifndef LYNXDRV_H_
2#define LYNXDRV_H_
3
Sudip Mukherjee81dee672015-03-03 16:21:06 +05304#define FB_ACCEL_SMI 0xab
Sudip Mukherjee81dee672015-03-03 16:21:06 +05305
Sudip Mukherjee81dee672015-03-03 16:21:06 +05306#define MHZ(x) ((x) * 1000000)
Sudip Mukherjee81dee672015-03-03 16:21:06 +05307
Mike Rapoport05407e12015-10-26 09:05:54 +02008#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
14enum 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 */
21enum 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
28enum sm750_channel {
29 sm750_primary = 0,
30 /* enum value equal to the register filed data */
31 sm750_secondary = 1,
32};
33
34enum sm750_path {
35 sm750_panel = 1,
36 sm750_crt = 2,
37 sm750_pnc = 3, /* panel and crt */
38};
39
40struct 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
Juston Li5d14c132015-07-14 21:14:38 -070050struct lynx_accel {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053051 /* base virtual address of DPR registers */
Yash Shahcc6c16d2015-08-14 06:06:13 +000052 volatile unsigned char __iomem *dprBase;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053053 /* base virtual address of de data port */
Yash Shahcc6c16d2015-08-14 06:06:13 +000054 volatile unsigned char __iomem *dpPortBase;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053055
Matej Vasekfbb8c962016-01-25 16:02:33 +010056 /* function pointers */
Greg Kroah-Hartmanbf2fbc22015-03-10 21:29:38 +010057 void (*de_init)(struct lynx_accel *);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053058
59 int (*de_wait)(void);/* see if hardware ready to work */
60
Isaac Assegaie8b976d2015-06-02 03:14:22 -070061 int (*de_fillrect)(struct lynx_accel *, u32, u32, u32, u32,
62 u32, u32, u32, u32, u32);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053063
Isaac Assegaie8b976d2015-06-02 03:14:22 -070064 int (*de_copyarea)(struct lynx_accel *, u32, u32, u32, u32,
65 u32, u32, u32, u32,
66 u32, u32, u32, u32);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053067
Isaac Assegaie8b976d2015-06-02 03:14:22 -070068 int (*de_imageblit)(struct lynx_accel *, const char *, u32, u32, u32, u32,
69 u32, u32, u32, u32,
70 u32, u32, u32, u32);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053071
72};
73
Mike Rapoporte359b6a2015-10-26 09:06:06 +020074struct sm750_dev {
Sudip Mukherjee81dee672015-03-03 16:21:06 +053075 /* common members */
76 u16 devid;
77 u8 revid;
Greg Donaldeb0f4272015-06-18 15:06:56 -050078 struct pci_dev *pdev;
79 struct fb_info *fbinfo[2];
Sudip Mukherjee81dee672015-03-03 16:21:06 +053080 struct lynx_accel accel;
81 int accel_off;
Mike Rapoporta3f92cc2016-01-17 19:59:52 +020082 int fb_count;
Mike Rapoporte359b6a2015-10-26 09:06:06 +020083 int mtrr_off;
84 struct{
85 int vram;
86 } mtrr;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053087 /* all smi graphic adaptor got below attributes */
Sudip Mukherjeee9363512015-03-10 14:15:35 +053088 unsigned long vidmem_start;
89 unsigned long vidreg_start;
90 __u32 vidmem_size;
91 __u32 vidreg_size;
Greg Donaldeb0f4272015-06-18 15:06:56 -050092 void __iomem *pvReg;
93 unsigned char __iomem *pvMem;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053094 /* locks*/
95 spinlock_t slock;
Mike Rapoport1757d102015-10-26 09:05:57 +020096
97 struct init_status initParm;
98 enum sm750_pnltype pnltype;
99 enum sm750_dataflow dataflow;
100 int nocrt;
Mike Rapoport05407e12015-10-26 09:05:54 +0200101
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
Juston Li5d14c132015-07-14 21:14:38 -0700111struct lynx_cursor {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530112 /* 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 */
Greg Donaldeb0f4272015-06-18 15:06:56 -0500120 char __iomem *vstart;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530121 int offset;
122 /* mmio addr of hw cursor */
Yash Shahcc6c16d2015-08-14 06:06:13 +0000123 volatile char __iomem *mmio;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530124};
125
Juston Li5d14c132015-07-14 21:14:38 -0700126struct lynxfb_crtc {
Greg Donaldeb0f4272015-06-18 15:06:56 -0500127 unsigned char __iomem *vCursor; /* virtual address of cursor */
128 unsigned char __iomem *vScreen; /* virtual address of on_screen */
Juston Li5ee35ea2015-06-12 03:17:22 -0700129 int oCursor; /* cursor address offset in vidmem */
130 int oScreen; /* onscreen address offset in vidmem */
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530131 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
Greg Donaldeb0f4272015-06-18 15:06:56 -0500140 void *priv;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530141
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530142 /* cursor information */
143 struct lynx_cursor cursor;
144};
145
Juston Li5d14c132015-07-14 21:14:38 -0700146struct lynxfb_output {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530147 int dpms;
148 int paths;
Juston Li78376532015-07-14 21:14:30 -0700149 /* which paths(s) this output stands for,for sm750:
Elizabeth Ferdman35e4d8c2016-09-28 14:33:51 -0700150 * 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 */
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530154
Greg Donaldeb0f4272015-06-18 15:06:56 -0500155 int *channel;
Juston Li78376532015-07-14 21:14:30 -0700156 /* which channel these outputs linked with,for sm750:
Elizabeth Ferdman35e4d8c2016-09-28 14:33:51 -0700157 * *channel=0 means primary channel
158 * *channel=1 means secondary channel
159 * output->channel ==> &crtc->channel
160 */
Greg Donaldeb0f4272015-06-18 15:06:56 -0500161 void *priv;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530162
Juston Lif7d8b692015-07-14 21:14:39 -0700163 int (*proc_setBLANK)(struct lynxfb_output*, int);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530164};
165
Juston Li5d14c132015-07-14 21:14:38 -0700166struct lynxfb_par {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530167 /* 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;
Greg Donaldeb0f4272015-06-18 15:06:56 -0500172 struct fb_info *info;
Mike Rapoportf11fa2a2015-10-26 09:05:59 +0200173 struct sm750_dev *dev;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530174};
175
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530176static inline unsigned long ps_to_hz(unsigned int psvalue)
177{
Juston Li0d5e63c2015-07-14 21:14:41 -0700178 unsigned long long numerator = 1000*1000*1000*1000ULL;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530179 /* 10^12 / picosecond period gives frequency in Hz */
180 do_div(numerator, psvalue);
181 return (unsigned long)numerator;
182}
183
Mike Rapoport700591a2015-10-26 09:06:01 +0200184int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
185int hw_sm750_inithw(struct sm750_dev*, struct pci_dev *);
186void hw_sm750_initAccel(struct sm750_dev *);
Mike Rapoport05407e12015-10-26 09:05:54 +0200187int hw_sm750_deWait(void);
188int hw_sm750le_deWait(void);
189
Mike Rapoport05407e12015-10-26 09:05:54 +0200190int hw_sm750_output_setMode(struct lynxfb_output*, struct fb_var_screeninfo*,
191 struct fb_fix_screeninfo*);
192int hw_sm750_crtc_checkMode(struct lynxfb_crtc*, struct fb_var_screeninfo*);
193int hw_sm750_crtc_setMode(struct lynxfb_crtc*, struct fb_var_screeninfo*,
194 struct fb_fix_screeninfo*);
195int hw_sm750_setColReg(struct lynxfb_crtc*, ushort, ushort, ushort, ushort);
196int hw_sm750_setBLANK(struct lynxfb_output*, int);
197int hw_sm750le_setBLANK(struct lynxfb_output*, int);
198int hw_sm750_pan_display(struct lynxfb_crtc *crtc,
199 const struct fb_var_screeninfo *var,
200 const struct fb_info *info);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530201
202#endif