xref: /openbmc/linux/drivers/staging/sm750fb/sm750.h (revision d4fd6347)
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 *, u32, u32, u32, u32,
63 						u32, u32, u32, u32, u32);
64 
65 	int (*de_copyarea)(struct lynx_accel *, u32, u32, u32, u32,
66 						u32, u32, u32, u32,
67 						u32, u32, u32, u32);
68 
69 	int (*de_imageblit)(struct lynx_accel *, const char *, u32, u32, u32, u32,
70 							       u32, u32, u32, u32,
71 							       u32, u32, u32, u32);
72 
73 };
74 
75 struct sm750_dev {
76 	/* common members */
77 	u16 devid;
78 	u8 revid;
79 	struct pci_dev *pdev;
80 	struct fb_info *fbinfo[2];
81 	struct lynx_accel accel;
82 	int accel_off;
83 	int fb_count;
84 	int mtrr_off;
85 	struct{
86 		int vram;
87 	} mtrr;
88 	/* all smi graphic adaptor got below attributes */
89 	unsigned long vidmem_start;
90 	unsigned long vidreg_start;
91 	__u32 vidmem_size;
92 	__u32 vidreg_size;
93 	void __iomem *pvReg;
94 	unsigned char __iomem *pvMem;
95 	/* locks*/
96 	spinlock_t slock;
97 
98 	struct init_status initParm;
99 	enum sm750_pnltype pnltype;
100 	enum sm750_dataflow dataflow;
101 	int nocrt;
102 
103 	/*
104 	 * 0: no hardware cursor
105 	 * 1: primary crtc hw cursor enabled,
106 	 * 2: secondary crtc hw cursor enabled
107 	 * 3: both ctrc hw cursor enabled
108 	 */
109 	int hwCursor;
110 };
111 
112 struct lynx_cursor {
113 	/* cursor width ,height and size */
114 	int w;
115 	int h;
116 	int size;
117 	/* hardware limitation */
118 	int maxW;
119 	int maxH;
120 	/* base virtual address and offset  of cursor image */
121 	char __iomem *vstart;
122 	int offset;
123 	/* mmio addr of hw cursor */
124 	volatile char __iomem *mmio;
125 };
126 
127 struct lynxfb_crtc {
128 	unsigned char __iomem *vCursor; /* virtual address of cursor */
129 	unsigned char __iomem *vScreen; /* virtual address of on_screen */
130 	int oCursor; /* cursor address offset in vidmem */
131 	int oScreen; /* onscreen address offset in vidmem */
132 	int channel;/* which channel this crtc stands for*/
133 	resource_size_t vidmem_size;/* this view's video memory max size */
134 
135 	/* below attributes belong to info->fix, their value depends on specific adaptor*/
136 	u16 line_pad;/* padding information:0,1,2,4,8,16,... */
137 	u16 xpanstep;
138 	u16 ypanstep;
139 	u16 ywrapstep;
140 
141 	void *priv;
142 
143 	/* cursor information */
144 	struct lynx_cursor cursor;
145 };
146 
147 struct lynxfb_output {
148 	int dpms;
149 	int paths;
150 	/*
151 	 * which paths(s) this output stands for,for sm750:
152 	 * paths=1:means output for panel paths
153 	 * paths=2:means output for crt paths
154 	 * paths=3:means output for both panel and crt paths
155 	 */
156 
157 	int *channel;
158 	/*
159 	 * which channel these outputs linked with,for sm750:
160 	 * *channel=0 means primary channel
161 	 * *channel=1 means secondary channel
162 	 * output->channel ==> &crtc->channel
163 	 */
164 	void *priv;
165 
166 	int (*proc_setBLANK)(struct lynxfb_output*, int);
167 };
168 
169 struct lynxfb_par {
170 	/* either 0 or 1 for dual head adaptor,0 is the older one registered */
171 	int index;
172 	unsigned int pseudo_palette[256];
173 	struct lynxfb_crtc crtc;
174 	struct lynxfb_output output;
175 	struct fb_info *info;
176 	struct sm750_dev *dev;
177 };
178 
179 static inline unsigned long ps_to_hz(unsigned int psvalue)
180 {
181 	unsigned long long numerator = 1000 * 1000 * 1000 * 1000ULL;
182 	/* 10^12 / picosecond period gives frequency in Hz */
183 	do_div(numerator, psvalue);
184 	return (unsigned long)numerator;
185 }
186 
187 int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
188 int hw_sm750_inithw(struct sm750_dev *sm750_dev, struct pci_dev *pdev);
189 void hw_sm750_initAccel(struct sm750_dev *sm750_dev);
190 int hw_sm750_deWait(void);
191 int hw_sm750le_deWait(void);
192 
193 int hw_sm750_output_setMode(struct lynxfb_output *output,
194 			    struct fb_var_screeninfo *var,
195 			    struct fb_fix_screeninfo *fix);
196 
197 int hw_sm750_crtc_checkMode(struct lynxfb_crtc *crtc,
198 			    struct fb_var_screeninfo *var);
199 
200 int hw_sm750_crtc_setMode(struct lynxfb_crtc *crtc,
201 			  struct fb_var_screeninfo *var,
202 			  struct fb_fix_screeninfo *fix);
203 
204 int hw_sm750_setColReg(struct lynxfb_crtc *crtc, ushort index,
205 		       ushort red, ushort green, ushort blue);
206 
207 int hw_sm750_setBLANK(struct lynxfb_output *output, int blank);
208 int hw_sm750le_setBLANK(struct lynxfb_output *output, int blank);
209 int hw_sm750_pan_display(struct lynxfb_crtc *crtc,
210 			 const struct fb_var_screeninfo *var,
211 			 const struct fb_info *info);
212 
213 #endif
214