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