xref: /OK3568_Linux_fs/kernel/drivers/video/fbdev/vermilion/vermilion.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) Intel Corp. 2007.
4*4882a593Smuzhiyun  * All Rights Reserved.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
7*4882a593Smuzhiyun  * develop this driver.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This file is part of the Vermilion Range fb driver.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Authors:
12*4882a593Smuzhiyun  *   Thomas Hellström <thomas-at-tungstengraphics-dot-com>
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #ifndef _VERMILION_H_
16*4882a593Smuzhiyun #define _VERMILION_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <linux/kernel.h>
19*4882a593Smuzhiyun #include <linux/pci.h>
20*4882a593Smuzhiyun #include <linux/atomic.h>
21*4882a593Smuzhiyun #include <linux/mutex.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define VML_DEVICE_GPU 0x5002
24*4882a593Smuzhiyun #define VML_DEVICE_VDC 0x5009
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define VML_VRAM_AREAS 3
27*4882a593Smuzhiyun #define VML_MAX_XRES 1024
28*4882a593Smuzhiyun #define VML_MAX_YRES 768
29*4882a593Smuzhiyun #define VML_MAX_XRES_VIRTUAL 1040
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /*
32*4882a593Smuzhiyun  * Display controller registers:
33*4882a593Smuzhiyun  */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /* Display controller 10-bit color representation */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define VML_R_MASK                   0x3FF00000
38*4882a593Smuzhiyun #define VML_R_SHIFT                  20
39*4882a593Smuzhiyun #define VML_G_MASK                   0x000FFC00
40*4882a593Smuzhiyun #define VML_G_SHIFT                  10
41*4882a593Smuzhiyun #define VML_B_MASK                   0x000003FF
42*4882a593Smuzhiyun #define VML_B_SHIFT                  0
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* Graphics plane control */
45*4882a593Smuzhiyun #define VML_DSPCCNTR                 0x00072180
46*4882a593Smuzhiyun #define VML_GFX_ENABLE               0x80000000
47*4882a593Smuzhiyun #define VML_GFX_GAMMABYPASS          0x40000000
48*4882a593Smuzhiyun #define VML_GFX_ARGB1555             0x0C000000
49*4882a593Smuzhiyun #define VML_GFX_RGB0888              0x18000000
50*4882a593Smuzhiyun #define VML_GFX_ARGB8888             0x1C000000
51*4882a593Smuzhiyun #define VML_GFX_ALPHACONST           0x02000000
52*4882a593Smuzhiyun #define VML_GFX_ALPHAMULT            0x01000000
53*4882a593Smuzhiyun #define VML_GFX_CONST_ALPHA          0x000000FF
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /* Graphics plane start address. Pixel aligned. */
56*4882a593Smuzhiyun #define VML_DSPCADDR                 0x00072184
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* Graphics plane stride register. */
59*4882a593Smuzhiyun #define VML_DSPCSTRIDE               0x00072188
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* Graphics plane position register. */
62*4882a593Smuzhiyun #define VML_DSPCPOS                  0x0007218C
63*4882a593Smuzhiyun #define VML_POS_YMASK                0x0FFF0000
64*4882a593Smuzhiyun #define VML_POS_YSHIFT               16
65*4882a593Smuzhiyun #define VML_POS_XMASK                0x00000FFF
66*4882a593Smuzhiyun #define VML_POS_XSHIFT               0
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* Graphics plane height and width */
69*4882a593Smuzhiyun #define VML_DSPCSIZE                 0x00072190
70*4882a593Smuzhiyun #define VML_SIZE_HMASK               0x0FFF0000
71*4882a593Smuzhiyun #define VML_SIZE_HSHIFT              16
72*4882a593Smuzhiyun #define VML_SISE_WMASK               0x00000FFF
73*4882a593Smuzhiyun #define VML_SIZE_WSHIFT              0
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* Graphics plane gamma correction lookup table registers (129 * 32 bits) */
76*4882a593Smuzhiyun #define VML_DSPCGAMLUT               0x00072200
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /* Pixel video output configuration register */
79*4882a593Smuzhiyun #define VML_PVOCONFIG                0x00061140
80*4882a593Smuzhiyun #define VML_CONFIG_BASE              0x80000000
81*4882a593Smuzhiyun #define VML_CONFIG_PIXEL_SWAP        0x04000000
82*4882a593Smuzhiyun #define VML_CONFIG_DE_INV            0x01000000
83*4882a593Smuzhiyun #define VML_CONFIG_HREF_INV          0x00400000
84*4882a593Smuzhiyun #define VML_CONFIG_VREF_INV          0x00100000
85*4882a593Smuzhiyun #define VML_CONFIG_CLK_INV           0x00040000
86*4882a593Smuzhiyun #define VML_CONFIG_CLK_DIV2          0x00010000
87*4882a593Smuzhiyun #define VML_CONFIG_ESTRB_INV         0x00008000
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* Pipe A Horizontal total register */
90*4882a593Smuzhiyun #define VML_HTOTAL_A                 0x00060000
91*4882a593Smuzhiyun #define VML_HTOTAL_MASK              0x1FFF0000
92*4882a593Smuzhiyun #define VML_HTOTAL_SHIFT             16
93*4882a593Smuzhiyun #define VML_HTOTAL_VAL               8192
94*4882a593Smuzhiyun #define VML_HACTIVE_MASK             0x000007FF
95*4882a593Smuzhiyun #define VML_HACTIVE_SHIFT            0
96*4882a593Smuzhiyun #define VML_HACTIVE_VAL              4096
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* Pipe A Horizontal Blank register */
99*4882a593Smuzhiyun #define VML_HBLANK_A                 0x00060004
100*4882a593Smuzhiyun #define VML_HBLANK_END_MASK          0x1FFF0000
101*4882a593Smuzhiyun #define VML_HBLANK_END_SHIFT         16
102*4882a593Smuzhiyun #define VML_HBLANK_END_VAL           8192
103*4882a593Smuzhiyun #define VML_HBLANK_START_MASK        0x00001FFF
104*4882a593Smuzhiyun #define VML_HBLANK_START_SHIFT       0
105*4882a593Smuzhiyun #define VML_HBLANK_START_VAL         8192
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /* Pipe A Horizontal Sync register */
108*4882a593Smuzhiyun #define VML_HSYNC_A                  0x00060008
109*4882a593Smuzhiyun #define VML_HSYNC_END_MASK           0x1FFF0000
110*4882a593Smuzhiyun #define VML_HSYNC_END_SHIFT          16
111*4882a593Smuzhiyun #define VML_HSYNC_END_VAL            8192
112*4882a593Smuzhiyun #define VML_HSYNC_START_MASK         0x00001FFF
113*4882a593Smuzhiyun #define VML_HSYNC_START_SHIFT        0
114*4882a593Smuzhiyun #define VML_HSYNC_START_VAL          8192
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* Pipe A Vertical total register */
117*4882a593Smuzhiyun #define VML_VTOTAL_A                 0x0006000C
118*4882a593Smuzhiyun #define VML_VTOTAL_MASK              0x1FFF0000
119*4882a593Smuzhiyun #define VML_VTOTAL_SHIFT             16
120*4882a593Smuzhiyun #define VML_VTOTAL_VAL               8192
121*4882a593Smuzhiyun #define VML_VACTIVE_MASK             0x000007FF
122*4882a593Smuzhiyun #define VML_VACTIVE_SHIFT            0
123*4882a593Smuzhiyun #define VML_VACTIVE_VAL              4096
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /* Pipe A Vertical Blank register */
126*4882a593Smuzhiyun #define VML_VBLANK_A                 0x00060010
127*4882a593Smuzhiyun #define VML_VBLANK_END_MASK          0x1FFF0000
128*4882a593Smuzhiyun #define VML_VBLANK_END_SHIFT         16
129*4882a593Smuzhiyun #define VML_VBLANK_END_VAL           8192
130*4882a593Smuzhiyun #define VML_VBLANK_START_MASK        0x00001FFF
131*4882a593Smuzhiyun #define VML_VBLANK_START_SHIFT       0
132*4882a593Smuzhiyun #define VML_VBLANK_START_VAL         8192
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /* Pipe A Vertical Sync register */
135*4882a593Smuzhiyun #define VML_VSYNC_A                  0x00060014
136*4882a593Smuzhiyun #define VML_VSYNC_END_MASK           0x1FFF0000
137*4882a593Smuzhiyun #define VML_VSYNC_END_SHIFT          16
138*4882a593Smuzhiyun #define VML_VSYNC_END_VAL            8192
139*4882a593Smuzhiyun #define VML_VSYNC_START_MASK         0x00001FFF
140*4882a593Smuzhiyun #define VML_VSYNC_START_SHIFT        0
141*4882a593Smuzhiyun #define VML_VSYNC_START_VAL          8192
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* Pipe A Source Image size (minus one - equal to active size)
144*4882a593Smuzhiyun  * Programmable while pipe is enabled.
145*4882a593Smuzhiyun  */
146*4882a593Smuzhiyun #define VML_PIPEASRC                 0x0006001C
147*4882a593Smuzhiyun #define VML_PIPEASRC_HMASK           0x0FFF0000
148*4882a593Smuzhiyun #define VML_PIPEASRC_HSHIFT          16
149*4882a593Smuzhiyun #define VML_PIPEASRC_VMASK           0x00000FFF
150*4882a593Smuzhiyun #define VML_PIPEASRC_VSHIFT          0
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /* Pipe A Border Color Pattern register (10 bit color) */
153*4882a593Smuzhiyun #define VML_BCLRPAT_A                0x00060020
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /* Pipe A Canvas Color register  (10 bit color) */
156*4882a593Smuzhiyun #define VML_CANVSCLR_A               0x00060024
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun /* Pipe A Configuration register */
159*4882a593Smuzhiyun #define VML_PIPEACONF                0x00070008
160*4882a593Smuzhiyun #define VML_PIPE_BASE                0x00000000
161*4882a593Smuzhiyun #define VML_PIPE_ENABLE              0x80000000
162*4882a593Smuzhiyun #define VML_PIPE_FORCE_BORDER        0x02000000
163*4882a593Smuzhiyun #define VML_PIPE_PLANES_OFF          0x00080000
164*4882a593Smuzhiyun #define VML_PIPE_ARGB_OUTPUT_MODE    0x00040000
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* Pipe A FIFO setting */
167*4882a593Smuzhiyun #define VML_DSPARB                   0x00070030
168*4882a593Smuzhiyun #define VML_FIFO_DEFAULT             0x00001D9C
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /* MDVO rcomp status & pads control register */
171*4882a593Smuzhiyun #define VML_RCOMPSTAT                0x00070048
172*4882a593Smuzhiyun #define VML_MDVO_VDC_I_RCOMP         0x80000000
173*4882a593Smuzhiyun #define VML_MDVO_POWERSAVE_OFF       0x00000008
174*4882a593Smuzhiyun #define VML_MDVO_PAD_ENABLE          0x00000004
175*4882a593Smuzhiyun #define VML_MDVO_PULLDOWN_ENABLE     0x00000001
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun struct vml_par {
178*4882a593Smuzhiyun 	struct pci_dev *vdc;
179*4882a593Smuzhiyun 	u64 vdc_mem_base;
180*4882a593Smuzhiyun 	u64 vdc_mem_size;
181*4882a593Smuzhiyun 	char __iomem *vdc_mem;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	struct pci_dev *gpu;
184*4882a593Smuzhiyun 	u64 gpu_mem_base;
185*4882a593Smuzhiyun 	u64 gpu_mem_size;
186*4882a593Smuzhiyun 	char __iomem *gpu_mem;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	atomic_t refcount;
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun struct vram_area {
192*4882a593Smuzhiyun 	unsigned long logical;
193*4882a593Smuzhiyun 	unsigned long phys;
194*4882a593Smuzhiyun 	unsigned long size;
195*4882a593Smuzhiyun 	unsigned order;
196*4882a593Smuzhiyun };
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun struct vml_info {
199*4882a593Smuzhiyun 	struct fb_info info;
200*4882a593Smuzhiyun 	struct vml_par *par;
201*4882a593Smuzhiyun 	struct list_head head;
202*4882a593Smuzhiyun 	struct vram_area vram[VML_VRAM_AREAS];
203*4882a593Smuzhiyun 	u64 vram_start;
204*4882a593Smuzhiyun 	u64 vram_contig_size;
205*4882a593Smuzhiyun 	u32 num_areas;
206*4882a593Smuzhiyun 	void __iomem *vram_logical;
207*4882a593Smuzhiyun 	u32 pseudo_palette[16];
208*4882a593Smuzhiyun 	u32 stride;
209*4882a593Smuzhiyun 	u32 bytes_per_pixel;
210*4882a593Smuzhiyun 	atomic_t vmas;
211*4882a593Smuzhiyun 	int cur_blank_mode;
212*4882a593Smuzhiyun 	int pipe_disabled;
213*4882a593Smuzhiyun };
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /*
216*4882a593Smuzhiyun  * Subsystem
217*4882a593Smuzhiyun  */
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun struct vml_sys {
220*4882a593Smuzhiyun 	char *name;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	/*
223*4882a593Smuzhiyun 	 * Save / Restore;
224*4882a593Smuzhiyun 	 */
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	int (*save) (struct vml_sys * sys);
227*4882a593Smuzhiyun 	int (*restore) (struct vml_sys * sys);
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	/*
230*4882a593Smuzhiyun 	 * PLL programming;
231*4882a593Smuzhiyun 	 */
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	int (*set_clock) (struct vml_sys * sys, int clock);
234*4882a593Smuzhiyun 	int (*nearest_clock) (const struct vml_sys * sys, int clock);
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun extern int vmlfb_register_subsys(struct vml_sys *sys);
238*4882a593Smuzhiyun extern void vmlfb_unregister_subsys(struct vml_sys *sys);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun #define VML_READ32(_par, _offset) \
241*4882a593Smuzhiyun 	(ioread32((_par)->vdc_mem + (_offset)))
242*4882a593Smuzhiyun #define VML_WRITE32(_par, _offset, _value)				\
243*4882a593Smuzhiyun 	iowrite32(_value, (_par)->vdc_mem + (_offset))
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun #endif
246