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