18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) Intel Corp. 2007. 48c2ecf20Sopenharmony_ci * All Rights Reserved. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to 78c2ecf20Sopenharmony_ci * develop this driver. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * This file is part of the Vermilion Range fb driver. 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * Authors: 128c2ecf20Sopenharmony_ci * Thomas Hellström <thomas-at-tungstengraphics-dot-com> 138c2ecf20Sopenharmony_ci */ 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#ifndef _VERMILION_H_ 168c2ecf20Sopenharmony_ci#define _VERMILION_H_ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <linux/kernel.h> 198c2ecf20Sopenharmony_ci#include <linux/pci.h> 208c2ecf20Sopenharmony_ci#include <linux/atomic.h> 218c2ecf20Sopenharmony_ci#include <linux/mutex.h> 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define VML_DEVICE_GPU 0x5002 248c2ecf20Sopenharmony_ci#define VML_DEVICE_VDC 0x5009 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define VML_VRAM_AREAS 3 278c2ecf20Sopenharmony_ci#define VML_MAX_XRES 1024 288c2ecf20Sopenharmony_ci#define VML_MAX_YRES 768 298c2ecf20Sopenharmony_ci#define VML_MAX_XRES_VIRTUAL 1040 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci/* 328c2ecf20Sopenharmony_ci * Display controller registers: 338c2ecf20Sopenharmony_ci */ 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* Display controller 10-bit color representation */ 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#define VML_R_MASK 0x3FF00000 388c2ecf20Sopenharmony_ci#define VML_R_SHIFT 20 398c2ecf20Sopenharmony_ci#define VML_G_MASK 0x000FFC00 408c2ecf20Sopenharmony_ci#define VML_G_SHIFT 10 418c2ecf20Sopenharmony_ci#define VML_B_MASK 0x000003FF 428c2ecf20Sopenharmony_ci#define VML_B_SHIFT 0 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci/* Graphics plane control */ 458c2ecf20Sopenharmony_ci#define VML_DSPCCNTR 0x00072180 468c2ecf20Sopenharmony_ci#define VML_GFX_ENABLE 0x80000000 478c2ecf20Sopenharmony_ci#define VML_GFX_GAMMABYPASS 0x40000000 488c2ecf20Sopenharmony_ci#define VML_GFX_ARGB1555 0x0C000000 498c2ecf20Sopenharmony_ci#define VML_GFX_RGB0888 0x18000000 508c2ecf20Sopenharmony_ci#define VML_GFX_ARGB8888 0x1C000000 518c2ecf20Sopenharmony_ci#define VML_GFX_ALPHACONST 0x02000000 528c2ecf20Sopenharmony_ci#define VML_GFX_ALPHAMULT 0x01000000 538c2ecf20Sopenharmony_ci#define VML_GFX_CONST_ALPHA 0x000000FF 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* Graphics plane start address. Pixel aligned. */ 568c2ecf20Sopenharmony_ci#define VML_DSPCADDR 0x00072184 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci/* Graphics plane stride register. */ 598c2ecf20Sopenharmony_ci#define VML_DSPCSTRIDE 0x00072188 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/* Graphics plane position register. */ 628c2ecf20Sopenharmony_ci#define VML_DSPCPOS 0x0007218C 638c2ecf20Sopenharmony_ci#define VML_POS_YMASK 0x0FFF0000 648c2ecf20Sopenharmony_ci#define VML_POS_YSHIFT 16 658c2ecf20Sopenharmony_ci#define VML_POS_XMASK 0x00000FFF 668c2ecf20Sopenharmony_ci#define VML_POS_XSHIFT 0 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci/* Graphics plane height and width */ 698c2ecf20Sopenharmony_ci#define VML_DSPCSIZE 0x00072190 708c2ecf20Sopenharmony_ci#define VML_SIZE_HMASK 0x0FFF0000 718c2ecf20Sopenharmony_ci#define VML_SIZE_HSHIFT 16 728c2ecf20Sopenharmony_ci#define VML_SISE_WMASK 0x00000FFF 738c2ecf20Sopenharmony_ci#define VML_SIZE_WSHIFT 0 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci/* Graphics plane gamma correction lookup table registers (129 * 32 bits) */ 768c2ecf20Sopenharmony_ci#define VML_DSPCGAMLUT 0x00072200 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci/* Pixel video output configuration register */ 798c2ecf20Sopenharmony_ci#define VML_PVOCONFIG 0x00061140 808c2ecf20Sopenharmony_ci#define VML_CONFIG_BASE 0x80000000 818c2ecf20Sopenharmony_ci#define VML_CONFIG_PIXEL_SWAP 0x04000000 828c2ecf20Sopenharmony_ci#define VML_CONFIG_DE_INV 0x01000000 838c2ecf20Sopenharmony_ci#define VML_CONFIG_HREF_INV 0x00400000 848c2ecf20Sopenharmony_ci#define VML_CONFIG_VREF_INV 0x00100000 858c2ecf20Sopenharmony_ci#define VML_CONFIG_CLK_INV 0x00040000 868c2ecf20Sopenharmony_ci#define VML_CONFIG_CLK_DIV2 0x00010000 878c2ecf20Sopenharmony_ci#define VML_CONFIG_ESTRB_INV 0x00008000 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci/* Pipe A Horizontal total register */ 908c2ecf20Sopenharmony_ci#define VML_HTOTAL_A 0x00060000 918c2ecf20Sopenharmony_ci#define VML_HTOTAL_MASK 0x1FFF0000 928c2ecf20Sopenharmony_ci#define VML_HTOTAL_SHIFT 16 938c2ecf20Sopenharmony_ci#define VML_HTOTAL_VAL 8192 948c2ecf20Sopenharmony_ci#define VML_HACTIVE_MASK 0x000007FF 958c2ecf20Sopenharmony_ci#define VML_HACTIVE_SHIFT 0 968c2ecf20Sopenharmony_ci#define VML_HACTIVE_VAL 4096 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci/* Pipe A Horizontal Blank register */ 998c2ecf20Sopenharmony_ci#define VML_HBLANK_A 0x00060004 1008c2ecf20Sopenharmony_ci#define VML_HBLANK_END_MASK 0x1FFF0000 1018c2ecf20Sopenharmony_ci#define VML_HBLANK_END_SHIFT 16 1028c2ecf20Sopenharmony_ci#define VML_HBLANK_END_VAL 8192 1038c2ecf20Sopenharmony_ci#define VML_HBLANK_START_MASK 0x00001FFF 1048c2ecf20Sopenharmony_ci#define VML_HBLANK_START_SHIFT 0 1058c2ecf20Sopenharmony_ci#define VML_HBLANK_START_VAL 8192 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/* Pipe A Horizontal Sync register */ 1088c2ecf20Sopenharmony_ci#define VML_HSYNC_A 0x00060008 1098c2ecf20Sopenharmony_ci#define VML_HSYNC_END_MASK 0x1FFF0000 1108c2ecf20Sopenharmony_ci#define VML_HSYNC_END_SHIFT 16 1118c2ecf20Sopenharmony_ci#define VML_HSYNC_END_VAL 8192 1128c2ecf20Sopenharmony_ci#define VML_HSYNC_START_MASK 0x00001FFF 1138c2ecf20Sopenharmony_ci#define VML_HSYNC_START_SHIFT 0 1148c2ecf20Sopenharmony_ci#define VML_HSYNC_START_VAL 8192 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci/* Pipe A Vertical total register */ 1178c2ecf20Sopenharmony_ci#define VML_VTOTAL_A 0x0006000C 1188c2ecf20Sopenharmony_ci#define VML_VTOTAL_MASK 0x1FFF0000 1198c2ecf20Sopenharmony_ci#define VML_VTOTAL_SHIFT 16 1208c2ecf20Sopenharmony_ci#define VML_VTOTAL_VAL 8192 1218c2ecf20Sopenharmony_ci#define VML_VACTIVE_MASK 0x000007FF 1228c2ecf20Sopenharmony_ci#define VML_VACTIVE_SHIFT 0 1238c2ecf20Sopenharmony_ci#define VML_VACTIVE_VAL 4096 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci/* Pipe A Vertical Blank register */ 1268c2ecf20Sopenharmony_ci#define VML_VBLANK_A 0x00060010 1278c2ecf20Sopenharmony_ci#define VML_VBLANK_END_MASK 0x1FFF0000 1288c2ecf20Sopenharmony_ci#define VML_VBLANK_END_SHIFT 16 1298c2ecf20Sopenharmony_ci#define VML_VBLANK_END_VAL 8192 1308c2ecf20Sopenharmony_ci#define VML_VBLANK_START_MASK 0x00001FFF 1318c2ecf20Sopenharmony_ci#define VML_VBLANK_START_SHIFT 0 1328c2ecf20Sopenharmony_ci#define VML_VBLANK_START_VAL 8192 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci/* Pipe A Vertical Sync register */ 1358c2ecf20Sopenharmony_ci#define VML_VSYNC_A 0x00060014 1368c2ecf20Sopenharmony_ci#define VML_VSYNC_END_MASK 0x1FFF0000 1378c2ecf20Sopenharmony_ci#define VML_VSYNC_END_SHIFT 16 1388c2ecf20Sopenharmony_ci#define VML_VSYNC_END_VAL 8192 1398c2ecf20Sopenharmony_ci#define VML_VSYNC_START_MASK 0x00001FFF 1408c2ecf20Sopenharmony_ci#define VML_VSYNC_START_SHIFT 0 1418c2ecf20Sopenharmony_ci#define VML_VSYNC_START_VAL 8192 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci/* Pipe A Source Image size (minus one - equal to active size) 1448c2ecf20Sopenharmony_ci * Programmable while pipe is enabled. 1458c2ecf20Sopenharmony_ci */ 1468c2ecf20Sopenharmony_ci#define VML_PIPEASRC 0x0006001C 1478c2ecf20Sopenharmony_ci#define VML_PIPEASRC_HMASK 0x0FFF0000 1488c2ecf20Sopenharmony_ci#define VML_PIPEASRC_HSHIFT 16 1498c2ecf20Sopenharmony_ci#define VML_PIPEASRC_VMASK 0x00000FFF 1508c2ecf20Sopenharmony_ci#define VML_PIPEASRC_VSHIFT 0 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci/* Pipe A Border Color Pattern register (10 bit color) */ 1538c2ecf20Sopenharmony_ci#define VML_BCLRPAT_A 0x00060020 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci/* Pipe A Canvas Color register (10 bit color) */ 1568c2ecf20Sopenharmony_ci#define VML_CANVSCLR_A 0x00060024 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci/* Pipe A Configuration register */ 1598c2ecf20Sopenharmony_ci#define VML_PIPEACONF 0x00070008 1608c2ecf20Sopenharmony_ci#define VML_PIPE_BASE 0x00000000 1618c2ecf20Sopenharmony_ci#define VML_PIPE_ENABLE 0x80000000 1628c2ecf20Sopenharmony_ci#define VML_PIPE_FORCE_BORDER 0x02000000 1638c2ecf20Sopenharmony_ci#define VML_PIPE_PLANES_OFF 0x00080000 1648c2ecf20Sopenharmony_ci#define VML_PIPE_ARGB_OUTPUT_MODE 0x00040000 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci/* Pipe A FIFO setting */ 1678c2ecf20Sopenharmony_ci#define VML_DSPARB 0x00070030 1688c2ecf20Sopenharmony_ci#define VML_FIFO_DEFAULT 0x00001D9C 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci/* MDVO rcomp status & pads control register */ 1718c2ecf20Sopenharmony_ci#define VML_RCOMPSTAT 0x00070048 1728c2ecf20Sopenharmony_ci#define VML_MDVO_VDC_I_RCOMP 0x80000000 1738c2ecf20Sopenharmony_ci#define VML_MDVO_POWERSAVE_OFF 0x00000008 1748c2ecf20Sopenharmony_ci#define VML_MDVO_PAD_ENABLE 0x00000004 1758c2ecf20Sopenharmony_ci#define VML_MDVO_PULLDOWN_ENABLE 0x00000001 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistruct vml_par { 1788c2ecf20Sopenharmony_ci struct pci_dev *vdc; 1798c2ecf20Sopenharmony_ci u64 vdc_mem_base; 1808c2ecf20Sopenharmony_ci u64 vdc_mem_size; 1818c2ecf20Sopenharmony_ci char __iomem *vdc_mem; 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci struct pci_dev *gpu; 1848c2ecf20Sopenharmony_ci u64 gpu_mem_base; 1858c2ecf20Sopenharmony_ci u64 gpu_mem_size; 1868c2ecf20Sopenharmony_ci char __iomem *gpu_mem; 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci atomic_t refcount; 1898c2ecf20Sopenharmony_ci}; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_cistruct vram_area { 1928c2ecf20Sopenharmony_ci unsigned long logical; 1938c2ecf20Sopenharmony_ci unsigned long phys; 1948c2ecf20Sopenharmony_ci unsigned long size; 1958c2ecf20Sopenharmony_ci unsigned order; 1968c2ecf20Sopenharmony_ci}; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_cistruct vml_info { 1998c2ecf20Sopenharmony_ci struct fb_info info; 2008c2ecf20Sopenharmony_ci struct vml_par *par; 2018c2ecf20Sopenharmony_ci struct list_head head; 2028c2ecf20Sopenharmony_ci struct vram_area vram[VML_VRAM_AREAS]; 2038c2ecf20Sopenharmony_ci u64 vram_start; 2048c2ecf20Sopenharmony_ci u64 vram_contig_size; 2058c2ecf20Sopenharmony_ci u32 num_areas; 2068c2ecf20Sopenharmony_ci void __iomem *vram_logical; 2078c2ecf20Sopenharmony_ci u32 pseudo_palette[16]; 2088c2ecf20Sopenharmony_ci u32 stride; 2098c2ecf20Sopenharmony_ci u32 bytes_per_pixel; 2108c2ecf20Sopenharmony_ci atomic_t vmas; 2118c2ecf20Sopenharmony_ci int cur_blank_mode; 2128c2ecf20Sopenharmony_ci int pipe_disabled; 2138c2ecf20Sopenharmony_ci}; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci/* 2168c2ecf20Sopenharmony_ci * Subsystem 2178c2ecf20Sopenharmony_ci */ 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_cistruct vml_sys { 2208c2ecf20Sopenharmony_ci char *name; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci /* 2238c2ecf20Sopenharmony_ci * Save / Restore; 2248c2ecf20Sopenharmony_ci */ 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci int (*save) (struct vml_sys * sys); 2278c2ecf20Sopenharmony_ci int (*restore) (struct vml_sys * sys); 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci /* 2308c2ecf20Sopenharmony_ci * PLL programming; 2318c2ecf20Sopenharmony_ci */ 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci int (*set_clock) (struct vml_sys * sys, int clock); 2348c2ecf20Sopenharmony_ci int (*nearest_clock) (const struct vml_sys * sys, int clock); 2358c2ecf20Sopenharmony_ci}; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ciextern int vmlfb_register_subsys(struct vml_sys *sys); 2388c2ecf20Sopenharmony_ciextern void vmlfb_unregister_subsys(struct vml_sys *sys); 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci#define VML_READ32(_par, _offset) \ 2418c2ecf20Sopenharmony_ci (ioread32((_par)->vdc_mem + (_offset))) 2428c2ecf20Sopenharmony_ci#define VML_WRITE32(_par, _offset, _value) \ 2438c2ecf20Sopenharmony_ci iowrite32(_value, (_par)->vdc_mem + (_offset)) 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci#endif 246