162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) Intel Corp. 2007.
462306a36Sopenharmony_ci * All Rights Reserved.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
762306a36Sopenharmony_ci * develop this driver.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * This file is part of the Vermilion Range fb driver.
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * Authors:
1262306a36Sopenharmony_ci *   Thomas Hellström <thomas-at-tungstengraphics-dot-com>
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifndef _VERMILION_H_
1662306a36Sopenharmony_ci#define _VERMILION_H_
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <linux/kernel.h>
1962306a36Sopenharmony_ci#include <linux/pci.h>
2062306a36Sopenharmony_ci#include <linux/atomic.h>
2162306a36Sopenharmony_ci#include <linux/mutex.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define VML_DEVICE_GPU 0x5002
2462306a36Sopenharmony_ci#define VML_DEVICE_VDC 0x5009
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define VML_VRAM_AREAS 3
2762306a36Sopenharmony_ci#define VML_MAX_XRES 1024
2862306a36Sopenharmony_ci#define VML_MAX_YRES 768
2962306a36Sopenharmony_ci#define VML_MAX_XRES_VIRTUAL 1040
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/*
3262306a36Sopenharmony_ci * Display controller registers:
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* Display controller 10-bit color representation */
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define VML_R_MASK                   0x3FF00000
3862306a36Sopenharmony_ci#define VML_R_SHIFT                  20
3962306a36Sopenharmony_ci#define VML_G_MASK                   0x000FFC00
4062306a36Sopenharmony_ci#define VML_G_SHIFT                  10
4162306a36Sopenharmony_ci#define VML_B_MASK                   0x000003FF
4262306a36Sopenharmony_ci#define VML_B_SHIFT                  0
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* Graphics plane control */
4562306a36Sopenharmony_ci#define VML_DSPCCNTR                 0x00072180
4662306a36Sopenharmony_ci#define VML_GFX_ENABLE               0x80000000
4762306a36Sopenharmony_ci#define VML_GFX_GAMMABYPASS          0x40000000
4862306a36Sopenharmony_ci#define VML_GFX_ARGB1555             0x0C000000
4962306a36Sopenharmony_ci#define VML_GFX_RGB0888              0x18000000
5062306a36Sopenharmony_ci#define VML_GFX_ARGB8888             0x1C000000
5162306a36Sopenharmony_ci#define VML_GFX_ALPHACONST           0x02000000
5262306a36Sopenharmony_ci#define VML_GFX_ALPHAMULT            0x01000000
5362306a36Sopenharmony_ci#define VML_GFX_CONST_ALPHA          0x000000FF
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/* Graphics plane start address. Pixel aligned. */
5662306a36Sopenharmony_ci#define VML_DSPCADDR                 0x00072184
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* Graphics plane stride register. */
5962306a36Sopenharmony_ci#define VML_DSPCSTRIDE               0x00072188
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/* Graphics plane position register. */
6262306a36Sopenharmony_ci#define VML_DSPCPOS                  0x0007218C
6362306a36Sopenharmony_ci#define VML_POS_YMASK                0x0FFF0000
6462306a36Sopenharmony_ci#define VML_POS_YSHIFT               16
6562306a36Sopenharmony_ci#define VML_POS_XMASK                0x00000FFF
6662306a36Sopenharmony_ci#define VML_POS_XSHIFT               0
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/* Graphics plane height and width */
6962306a36Sopenharmony_ci#define VML_DSPCSIZE                 0x00072190
7062306a36Sopenharmony_ci#define VML_SIZE_HMASK               0x0FFF0000
7162306a36Sopenharmony_ci#define VML_SIZE_HSHIFT              16
7262306a36Sopenharmony_ci#define VML_SISE_WMASK               0x00000FFF
7362306a36Sopenharmony_ci#define VML_SIZE_WSHIFT              0
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci/* Graphics plane gamma correction lookup table registers (129 * 32 bits) */
7662306a36Sopenharmony_ci#define VML_DSPCGAMLUT               0x00072200
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci/* Pixel video output configuration register */
7962306a36Sopenharmony_ci#define VML_PVOCONFIG                0x00061140
8062306a36Sopenharmony_ci#define VML_CONFIG_BASE              0x80000000
8162306a36Sopenharmony_ci#define VML_CONFIG_PIXEL_SWAP        0x04000000
8262306a36Sopenharmony_ci#define VML_CONFIG_DE_INV            0x01000000
8362306a36Sopenharmony_ci#define VML_CONFIG_HREF_INV          0x00400000
8462306a36Sopenharmony_ci#define VML_CONFIG_VREF_INV          0x00100000
8562306a36Sopenharmony_ci#define VML_CONFIG_CLK_INV           0x00040000
8662306a36Sopenharmony_ci#define VML_CONFIG_CLK_DIV2          0x00010000
8762306a36Sopenharmony_ci#define VML_CONFIG_ESTRB_INV         0x00008000
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci/* Pipe A Horizontal total register */
9062306a36Sopenharmony_ci#define VML_HTOTAL_A                 0x00060000
9162306a36Sopenharmony_ci#define VML_HTOTAL_MASK              0x1FFF0000
9262306a36Sopenharmony_ci#define VML_HTOTAL_SHIFT             16
9362306a36Sopenharmony_ci#define VML_HTOTAL_VAL               8192
9462306a36Sopenharmony_ci#define VML_HACTIVE_MASK             0x000007FF
9562306a36Sopenharmony_ci#define VML_HACTIVE_SHIFT            0
9662306a36Sopenharmony_ci#define VML_HACTIVE_VAL              4096
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/* Pipe A Horizontal Blank register */
9962306a36Sopenharmony_ci#define VML_HBLANK_A                 0x00060004
10062306a36Sopenharmony_ci#define VML_HBLANK_END_MASK          0x1FFF0000
10162306a36Sopenharmony_ci#define VML_HBLANK_END_SHIFT         16
10262306a36Sopenharmony_ci#define VML_HBLANK_END_VAL           8192
10362306a36Sopenharmony_ci#define VML_HBLANK_START_MASK        0x00001FFF
10462306a36Sopenharmony_ci#define VML_HBLANK_START_SHIFT       0
10562306a36Sopenharmony_ci#define VML_HBLANK_START_VAL         8192
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci/* Pipe A Horizontal Sync register */
10862306a36Sopenharmony_ci#define VML_HSYNC_A                  0x00060008
10962306a36Sopenharmony_ci#define VML_HSYNC_END_MASK           0x1FFF0000
11062306a36Sopenharmony_ci#define VML_HSYNC_END_SHIFT          16
11162306a36Sopenharmony_ci#define VML_HSYNC_END_VAL            8192
11262306a36Sopenharmony_ci#define VML_HSYNC_START_MASK         0x00001FFF
11362306a36Sopenharmony_ci#define VML_HSYNC_START_SHIFT        0
11462306a36Sopenharmony_ci#define VML_HSYNC_START_VAL          8192
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci/* Pipe A Vertical total register */
11762306a36Sopenharmony_ci#define VML_VTOTAL_A                 0x0006000C
11862306a36Sopenharmony_ci#define VML_VTOTAL_MASK              0x1FFF0000
11962306a36Sopenharmony_ci#define VML_VTOTAL_SHIFT             16
12062306a36Sopenharmony_ci#define VML_VTOTAL_VAL               8192
12162306a36Sopenharmony_ci#define VML_VACTIVE_MASK             0x000007FF
12262306a36Sopenharmony_ci#define VML_VACTIVE_SHIFT            0
12362306a36Sopenharmony_ci#define VML_VACTIVE_VAL              4096
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/* Pipe A Vertical Blank register */
12662306a36Sopenharmony_ci#define VML_VBLANK_A                 0x00060010
12762306a36Sopenharmony_ci#define VML_VBLANK_END_MASK          0x1FFF0000
12862306a36Sopenharmony_ci#define VML_VBLANK_END_SHIFT         16
12962306a36Sopenharmony_ci#define VML_VBLANK_END_VAL           8192
13062306a36Sopenharmony_ci#define VML_VBLANK_START_MASK        0x00001FFF
13162306a36Sopenharmony_ci#define VML_VBLANK_START_SHIFT       0
13262306a36Sopenharmony_ci#define VML_VBLANK_START_VAL         8192
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci/* Pipe A Vertical Sync register */
13562306a36Sopenharmony_ci#define VML_VSYNC_A                  0x00060014
13662306a36Sopenharmony_ci#define VML_VSYNC_END_MASK           0x1FFF0000
13762306a36Sopenharmony_ci#define VML_VSYNC_END_SHIFT          16
13862306a36Sopenharmony_ci#define VML_VSYNC_END_VAL            8192
13962306a36Sopenharmony_ci#define VML_VSYNC_START_MASK         0x00001FFF
14062306a36Sopenharmony_ci#define VML_VSYNC_START_SHIFT        0
14162306a36Sopenharmony_ci#define VML_VSYNC_START_VAL          8192
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/* Pipe A Source Image size (minus one - equal to active size)
14462306a36Sopenharmony_ci * Programmable while pipe is enabled.
14562306a36Sopenharmony_ci */
14662306a36Sopenharmony_ci#define VML_PIPEASRC                 0x0006001C
14762306a36Sopenharmony_ci#define VML_PIPEASRC_HMASK           0x0FFF0000
14862306a36Sopenharmony_ci#define VML_PIPEASRC_HSHIFT          16
14962306a36Sopenharmony_ci#define VML_PIPEASRC_VMASK           0x00000FFF
15062306a36Sopenharmony_ci#define VML_PIPEASRC_VSHIFT          0
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/* Pipe A Border Color Pattern register (10 bit color) */
15362306a36Sopenharmony_ci#define VML_BCLRPAT_A                0x00060020
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci/* Pipe A Canvas Color register  (10 bit color) */
15662306a36Sopenharmony_ci#define VML_CANVSCLR_A               0x00060024
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* Pipe A Configuration register */
15962306a36Sopenharmony_ci#define VML_PIPEACONF                0x00070008
16062306a36Sopenharmony_ci#define VML_PIPE_BASE                0x00000000
16162306a36Sopenharmony_ci#define VML_PIPE_ENABLE              0x80000000
16262306a36Sopenharmony_ci#define VML_PIPE_FORCE_BORDER        0x02000000
16362306a36Sopenharmony_ci#define VML_PIPE_PLANES_OFF          0x00080000
16462306a36Sopenharmony_ci#define VML_PIPE_ARGB_OUTPUT_MODE    0x00040000
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci/* Pipe A FIFO setting */
16762306a36Sopenharmony_ci#define VML_DSPARB                   0x00070030
16862306a36Sopenharmony_ci#define VML_FIFO_DEFAULT             0x00001D9C
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci/* MDVO rcomp status & pads control register */
17162306a36Sopenharmony_ci#define VML_RCOMPSTAT                0x00070048
17262306a36Sopenharmony_ci#define VML_MDVO_VDC_I_RCOMP         0x80000000
17362306a36Sopenharmony_ci#define VML_MDVO_POWERSAVE_OFF       0x00000008
17462306a36Sopenharmony_ci#define VML_MDVO_PAD_ENABLE          0x00000004
17562306a36Sopenharmony_ci#define VML_MDVO_PULLDOWN_ENABLE     0x00000001
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_cistruct vml_par {
17862306a36Sopenharmony_ci	struct pci_dev *vdc;
17962306a36Sopenharmony_ci	u64 vdc_mem_base;
18062306a36Sopenharmony_ci	u64 vdc_mem_size;
18162306a36Sopenharmony_ci	char __iomem *vdc_mem;
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	struct pci_dev *gpu;
18462306a36Sopenharmony_ci	u64 gpu_mem_base;
18562306a36Sopenharmony_ci	u64 gpu_mem_size;
18662306a36Sopenharmony_ci	char __iomem *gpu_mem;
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci	atomic_t refcount;
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_cistruct vram_area {
19262306a36Sopenharmony_ci	unsigned long logical;
19362306a36Sopenharmony_ci	unsigned long phys;
19462306a36Sopenharmony_ci	unsigned long size;
19562306a36Sopenharmony_ci	unsigned order;
19662306a36Sopenharmony_ci};
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistruct vml_info {
19962306a36Sopenharmony_ci	struct fb_info info;
20062306a36Sopenharmony_ci	struct vml_par *par;
20162306a36Sopenharmony_ci	struct list_head head;
20262306a36Sopenharmony_ci	struct vram_area vram[VML_VRAM_AREAS];
20362306a36Sopenharmony_ci	u64 vram_start;
20462306a36Sopenharmony_ci	u64 vram_contig_size;
20562306a36Sopenharmony_ci	u32 num_areas;
20662306a36Sopenharmony_ci	void __iomem *vram_logical;
20762306a36Sopenharmony_ci	u32 pseudo_palette[16];
20862306a36Sopenharmony_ci	u32 stride;
20962306a36Sopenharmony_ci	u32 bytes_per_pixel;
21062306a36Sopenharmony_ci	atomic_t vmas;
21162306a36Sopenharmony_ci	int cur_blank_mode;
21262306a36Sopenharmony_ci	int pipe_disabled;
21362306a36Sopenharmony_ci};
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci/*
21662306a36Sopenharmony_ci * Subsystem
21762306a36Sopenharmony_ci */
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cistruct vml_sys {
22062306a36Sopenharmony_ci	char *name;
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	/*
22362306a36Sopenharmony_ci	 * Save / Restore;
22462306a36Sopenharmony_ci	 */
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	int (*save) (struct vml_sys * sys);
22762306a36Sopenharmony_ci	int (*restore) (struct vml_sys * sys);
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	/*
23062306a36Sopenharmony_ci	 * PLL programming;
23162306a36Sopenharmony_ci	 */
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	int (*set_clock) (struct vml_sys * sys, int clock);
23462306a36Sopenharmony_ci	int (*nearest_clock) (const struct vml_sys * sys, int clock);
23562306a36Sopenharmony_ci};
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ciextern int vmlfb_register_subsys(struct vml_sys *sys);
23862306a36Sopenharmony_ciextern void vmlfb_unregister_subsys(struct vml_sys *sys);
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci#define VML_READ32(_par, _offset) \
24162306a36Sopenharmony_ci	(ioread32((_par)->vdc_mem + (_offset)))
24262306a36Sopenharmony_ci#define VML_WRITE32(_par, _offset, _value)				\
24362306a36Sopenharmony_ci	iowrite32(_value, (_par)->vdc_mem + (_offset))
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci#endif
246