162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2008 Andres Salomon <dilinger@debian.org> 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Geode GX2 header information 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#ifndef _GXFB_H_ 862306a36Sopenharmony_ci#define _GXFB_H_ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/io.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define GP_REG_COUNT (0x50 / 4) 1362306a36Sopenharmony_ci#define DC_REG_COUNT (0x90 / 4) 1462306a36Sopenharmony_ci#define VP_REG_COUNT (0x138 / 8) 1562306a36Sopenharmony_ci#define FP_REG_COUNT (0x68 / 8) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define DC_PAL_COUNT 0x104 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistruct gxfb_par { 2062306a36Sopenharmony_ci int enable_crt; 2162306a36Sopenharmony_ci void __iomem *dc_regs; 2262306a36Sopenharmony_ci void __iomem *vid_regs; 2362306a36Sopenharmony_ci void __iomem *gp_regs; 2462306a36Sopenharmony_ci int powered_down; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci /* register state, for power management functionality */ 2762306a36Sopenharmony_ci struct { 2862306a36Sopenharmony_ci uint64_t padsel; 2962306a36Sopenharmony_ci uint64_t dotpll; 3062306a36Sopenharmony_ci } msr; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci uint32_t gp[GP_REG_COUNT]; 3362306a36Sopenharmony_ci uint32_t dc[DC_REG_COUNT]; 3462306a36Sopenharmony_ci uint64_t vp[VP_REG_COUNT]; 3562306a36Sopenharmony_ci uint64_t fp[FP_REG_COUNT]; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci uint32_t pal[DC_PAL_COUNT]; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciunsigned int gx_frame_buffer_size(void); 4162306a36Sopenharmony_ciint gx_line_delta(int xres, int bpp); 4262306a36Sopenharmony_civoid gx_set_mode(struct fb_info *info); 4362306a36Sopenharmony_civoid gx_set_hw_palette_reg(struct fb_info *info, unsigned regno, 4462306a36Sopenharmony_ci unsigned red, unsigned green, unsigned blue); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_civoid gx_set_dclk_frequency(struct fb_info *info); 4762306a36Sopenharmony_civoid gx_configure_display(struct fb_info *info); 4862306a36Sopenharmony_ciint gx_blank_display(struct fb_info *info, int blank_mode); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciint gx_powerdown(struct fb_info *info); 5162306a36Sopenharmony_ciint gx_powerup(struct fb_info *info); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* Graphics Processor registers (table 6-23 from the data book) */ 5462306a36Sopenharmony_cienum gp_registers { 5562306a36Sopenharmony_ci GP_DST_OFFSET = 0, 5662306a36Sopenharmony_ci GP_SRC_OFFSET, 5762306a36Sopenharmony_ci GP_STRIDE, 5862306a36Sopenharmony_ci GP_WID_HEIGHT, 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci GP_SRC_COLOR_FG, 6162306a36Sopenharmony_ci GP_SRC_COLOR_BG, 6262306a36Sopenharmony_ci GP_PAT_COLOR_0, 6362306a36Sopenharmony_ci GP_PAT_COLOR_1, 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci GP_PAT_COLOR_2, 6662306a36Sopenharmony_ci GP_PAT_COLOR_3, 6762306a36Sopenharmony_ci GP_PAT_COLOR_4, 6862306a36Sopenharmony_ci GP_PAT_COLOR_5, 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci GP_PAT_DATA_0, 7162306a36Sopenharmony_ci GP_PAT_DATA_1, 7262306a36Sopenharmony_ci GP_RASTER_MODE, 7362306a36Sopenharmony_ci GP_VECTOR_MODE, 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci GP_BLT_MODE, 7662306a36Sopenharmony_ci GP_BLT_STATUS, 7762306a36Sopenharmony_ci GP_HST_SRC, 7862306a36Sopenharmony_ci GP_BASE_OFFSET, /* 0x4c */ 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define GP_BLT_STATUS_BLT_PENDING (1 << 2) 8262306a36Sopenharmony_ci#define GP_BLT_STATUS_BLT_BUSY (1 << 0) 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* Display Controller registers (table 6-38 from the data book) */ 8662306a36Sopenharmony_cienum dc_registers { 8762306a36Sopenharmony_ci DC_UNLOCK = 0, 8862306a36Sopenharmony_ci DC_GENERAL_CFG, 8962306a36Sopenharmony_ci DC_DISPLAY_CFG, 9062306a36Sopenharmony_ci DC_RSVD_0, 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci DC_FB_ST_OFFSET, 9362306a36Sopenharmony_ci DC_CB_ST_OFFSET, 9462306a36Sopenharmony_ci DC_CURS_ST_OFFSET, 9562306a36Sopenharmony_ci DC_ICON_ST_OFFSET, 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci DC_VID_Y_ST_OFFSET, 9862306a36Sopenharmony_ci DC_VID_U_ST_OFFSET, 9962306a36Sopenharmony_ci DC_VID_V_ST_OFFSET, 10062306a36Sopenharmony_ci DC_RSVD_1, 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci DC_LINE_SIZE, 10362306a36Sopenharmony_ci DC_GFX_PITCH, 10462306a36Sopenharmony_ci DC_VID_YUV_PITCH, 10562306a36Sopenharmony_ci DC_RSVD_2, 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci DC_H_ACTIVE_TIMING, 10862306a36Sopenharmony_ci DC_H_BLANK_TIMING, 10962306a36Sopenharmony_ci DC_H_SYNC_TIMING, 11062306a36Sopenharmony_ci DC_RSVD_3, 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci DC_V_ACTIVE_TIMING, 11362306a36Sopenharmony_ci DC_V_BLANK_TIMING, 11462306a36Sopenharmony_ci DC_V_SYNC_TIMING, 11562306a36Sopenharmony_ci DC_RSVD_4, 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci DC_CURSOR_X, 11862306a36Sopenharmony_ci DC_CURSOR_Y, 11962306a36Sopenharmony_ci DC_ICON_X, 12062306a36Sopenharmony_ci DC_LINE_CNT, 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci DC_PAL_ADDRESS, 12362306a36Sopenharmony_ci DC_PAL_DATA, 12462306a36Sopenharmony_ci DC_DFIFO_DIAG, 12562306a36Sopenharmony_ci DC_CFIFO_DIAG, 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci DC_VID_DS_DELTA, 12862306a36Sopenharmony_ci DC_GLIU0_MEM_OFFSET, 12962306a36Sopenharmony_ci DC_RSVD_5, 13062306a36Sopenharmony_ci DC_DV_ACC, /* 0x8c */ 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define DC_UNLOCK_LOCK 0x00000000 13462306a36Sopenharmony_ci#define DC_UNLOCK_UNLOCK 0x00004758 /* magic value */ 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#define DC_GENERAL_CFG_YUVM (1 << 20) 13762306a36Sopenharmony_ci#define DC_GENERAL_CFG_VDSE (1 << 19) 13862306a36Sopenharmony_ci#define DC_GENERAL_CFG_DFHPEL_SHIFT 12 13962306a36Sopenharmony_ci#define DC_GENERAL_CFG_DFHPSL_SHIFT 8 14062306a36Sopenharmony_ci#define DC_GENERAL_CFG_DECE (1 << 6) 14162306a36Sopenharmony_ci#define DC_GENERAL_CFG_CMPE (1 << 5) 14262306a36Sopenharmony_ci#define DC_GENERAL_CFG_VIDE (1 << 3) 14362306a36Sopenharmony_ci#define DC_GENERAL_CFG_ICNE (1 << 2) 14462306a36Sopenharmony_ci#define DC_GENERAL_CFG_CURE (1 << 1) 14562306a36Sopenharmony_ci#define DC_GENERAL_CFG_DFLE (1 << 0) 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#define DC_DISPLAY_CFG_A20M (1 << 31) 14862306a36Sopenharmony_ci#define DC_DISPLAY_CFG_A18M (1 << 30) 14962306a36Sopenharmony_ci#define DC_DISPLAY_CFG_PALB (1 << 25) 15062306a36Sopenharmony_ci#define DC_DISPLAY_CFG_DISP_MODE_24BPP (1 << 9) 15162306a36Sopenharmony_ci#define DC_DISPLAY_CFG_DISP_MODE_16BPP (1 << 8) 15262306a36Sopenharmony_ci#define DC_DISPLAY_CFG_DISP_MODE_8BPP (0) 15362306a36Sopenharmony_ci#define DC_DISPLAY_CFG_VDEN (1 << 4) 15462306a36Sopenharmony_ci#define DC_DISPLAY_CFG_GDEN (1 << 3) 15562306a36Sopenharmony_ci#define DC_DISPLAY_CFG_TGEN (1 << 0) 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci/* 15962306a36Sopenharmony_ci * Video Processor registers (table 6-54). 16062306a36Sopenharmony_ci * There is space for 64 bit values, but we never use more than the 16162306a36Sopenharmony_ci * lower 32 bits. The actual register save/restore code only bothers 16262306a36Sopenharmony_ci * to restore those 32 bits. 16362306a36Sopenharmony_ci */ 16462306a36Sopenharmony_cienum vp_registers { 16562306a36Sopenharmony_ci VP_VCFG = 0, 16662306a36Sopenharmony_ci VP_DCFG, 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci VP_VX, 16962306a36Sopenharmony_ci VP_VY, 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci VP_VS, 17262306a36Sopenharmony_ci VP_VCK, 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci VP_VCM, 17562306a36Sopenharmony_ci VP_GAR, 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci VP_GDR, 17862306a36Sopenharmony_ci VP_RSVD_0, 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci VP_MISC, 18162306a36Sopenharmony_ci VP_CCS, 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci VP_RSVD_1, 18462306a36Sopenharmony_ci VP_RSVD_2, 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci VP_RSVD_3, 18762306a36Sopenharmony_ci VP_VDC, 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci VP_VCO, 19062306a36Sopenharmony_ci VP_CRC, 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci VP_CRC32, 19362306a36Sopenharmony_ci VP_VDE, 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci VP_CCK, 19662306a36Sopenharmony_ci VP_CCM, 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci VP_CC1, 19962306a36Sopenharmony_ci VP_CC2, 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci VP_A1X, 20262306a36Sopenharmony_ci VP_A1Y, 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci VP_A1C, 20562306a36Sopenharmony_ci VP_A1T, 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci VP_A2X, 20862306a36Sopenharmony_ci VP_A2Y, 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci VP_A2C, 21162306a36Sopenharmony_ci VP_A2T, 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci VP_A3X, 21462306a36Sopenharmony_ci VP_A3Y, 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci VP_A3C, 21762306a36Sopenharmony_ci VP_A3T, 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci VP_VRR, 22062306a36Sopenharmony_ci VP_AWT, 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci VP_VTM, /* 0x130 */ 22362306a36Sopenharmony_ci}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci#define VP_VCFG_VID_EN (1 << 0) 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#define VP_DCFG_DAC_VREF (1 << 26) 22862306a36Sopenharmony_ci#define VP_DCFG_GV_GAM (1 << 21) 22962306a36Sopenharmony_ci#define VP_DCFG_VG_CK (1 << 20) 23062306a36Sopenharmony_ci#define VP_DCFG_CRT_SYNC_SKW_DEFAULT (1 << 16) 23162306a36Sopenharmony_ci#define VP_DCFG_CRT_SYNC_SKW ((1 << 14) | (1 << 15) | (1 << 16)) 23262306a36Sopenharmony_ci#define VP_DCFG_CRT_VSYNC_POL (1 << 9) 23362306a36Sopenharmony_ci#define VP_DCFG_CRT_HSYNC_POL (1 << 8) 23462306a36Sopenharmony_ci#define VP_DCFG_FP_DATA_EN (1 << 7) /* undocumented */ 23562306a36Sopenharmony_ci#define VP_DCFG_FP_PWR_EN (1 << 6) /* undocumented */ 23662306a36Sopenharmony_ci#define VP_DCFG_DAC_BL_EN (1 << 3) 23762306a36Sopenharmony_ci#define VP_DCFG_VSYNC_EN (1 << 2) 23862306a36Sopenharmony_ci#define VP_DCFG_HSYNC_EN (1 << 1) 23962306a36Sopenharmony_ci#define VP_DCFG_CRT_EN (1 << 0) 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci#define VP_MISC_GAM_EN (1 << 0) 24262306a36Sopenharmony_ci#define VP_MISC_DACPWRDN (1 << 10) 24362306a36Sopenharmony_ci#define VP_MISC_APWRDN (1 << 11) 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci/* 24762306a36Sopenharmony_ci * Flat Panel registers (table 6-55). 24862306a36Sopenharmony_ci * Also 64 bit registers; see above note about 32-bit handling. 24962306a36Sopenharmony_ci */ 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci/* we're actually in the VP register space, starting at address 0x400 */ 25262306a36Sopenharmony_ci#define VP_FP_START 0x400 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cienum fp_registers { 25562306a36Sopenharmony_ci FP_PT1 = 0, 25662306a36Sopenharmony_ci FP_PT2, 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci FP_PM, 25962306a36Sopenharmony_ci FP_DFC, 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci FP_BLFSR, 26262306a36Sopenharmony_ci FP_RLFSR, 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci FP_FMI, 26562306a36Sopenharmony_ci FP_FMD, 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci FP_RSVD_0, 26862306a36Sopenharmony_ci FP_DCA, 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci FP_DMD, 27162306a36Sopenharmony_ci FP_CRC, 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci FP_FBB, /* 0x460 */ 27462306a36Sopenharmony_ci}; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci#define FP_PT1_VSIZE_SHIFT 16 /* undocumented? */ 27762306a36Sopenharmony_ci#define FP_PT1_VSIZE_MASK 0x7FF0000 /* undocumented? */ 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci#define FP_PT2_HSP (1 << 22) 28062306a36Sopenharmony_ci#define FP_PT2_VSP (1 << 23) 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci#define FP_PM_P (1 << 24) /* panel power on */ 28362306a36Sopenharmony_ci#define FP_PM_PANEL_PWR_UP (1 << 3) /* r/o */ 28462306a36Sopenharmony_ci#define FP_PM_PANEL_PWR_DOWN (1 << 2) /* r/o */ 28562306a36Sopenharmony_ci#define FP_PM_PANEL_OFF (1 << 1) /* r/o */ 28662306a36Sopenharmony_ci#define FP_PM_PANEL_ON (1 << 0) /* r/o */ 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci#define FP_DFC_NFI ((1 << 4) | (1 << 5) | (1 << 6)) 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/* register access functions */ 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cistatic inline uint32_t read_gp(struct gxfb_par *par, int reg) 29462306a36Sopenharmony_ci{ 29562306a36Sopenharmony_ci return readl(par->gp_regs + 4*reg); 29662306a36Sopenharmony_ci} 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic inline void write_gp(struct gxfb_par *par, int reg, uint32_t val) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci writel(val, par->gp_regs + 4*reg); 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistatic inline uint32_t read_dc(struct gxfb_par *par, int reg) 30462306a36Sopenharmony_ci{ 30562306a36Sopenharmony_ci return readl(par->dc_regs + 4*reg); 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic inline void write_dc(struct gxfb_par *par, int reg, uint32_t val) 30962306a36Sopenharmony_ci{ 31062306a36Sopenharmony_ci writel(val, par->dc_regs + 4*reg); 31162306a36Sopenharmony_ci} 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_cistatic inline uint32_t read_vp(struct gxfb_par *par, int reg) 31462306a36Sopenharmony_ci{ 31562306a36Sopenharmony_ci return readl(par->vid_regs + 8*reg); 31662306a36Sopenharmony_ci} 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic inline void write_vp(struct gxfb_par *par, int reg, uint32_t val) 31962306a36Sopenharmony_ci{ 32062306a36Sopenharmony_ci writel(val, par->vid_regs + 8*reg); 32162306a36Sopenharmony_ci} 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic inline uint32_t read_fp(struct gxfb_par *par, int reg) 32462306a36Sopenharmony_ci{ 32562306a36Sopenharmony_ci return readl(par->vid_regs + 8*reg + VP_FP_START); 32662306a36Sopenharmony_ci} 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic inline void write_fp(struct gxfb_par *par, int reg, uint32_t val) 32962306a36Sopenharmony_ci{ 33062306a36Sopenharmony_ci writel(val, par->vid_regs + 8*reg + VP_FP_START); 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci/* MSRs are defined in linux/cs5535.h; their bitfields are here */ 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci#define MSR_GLCP_SYS_RSTPLL_DOTPOSTDIV3 (1 << 3) 33762306a36Sopenharmony_ci#define MSR_GLCP_SYS_RSTPLL_DOTPREMULT2 (1 << 2) 33862306a36Sopenharmony_ci#define MSR_GLCP_SYS_RSTPLL_DOTPREDIV2 (1 << 1) 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci#define MSR_GLCP_DOTPLL_LOCK (1 << 25) /* r/o */ 34162306a36Sopenharmony_ci#define MSR_GLCP_DOTPLL_BYPASS (1 << 15) 34262306a36Sopenharmony_ci#define MSR_GLCP_DOTPLL_DOTRESET (1 << 0) 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci#define MSR_GX_MSR_PADSEL_MASK 0x3FFFFFFF /* undocumented? */ 34562306a36Sopenharmony_ci#define MSR_GX_MSR_PADSEL_TFT 0x1FFFFFFF /* undocumented? */ 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci#define MSR_GX_GLD_MSR_CONFIG_FP (1 << 3) 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci#endif 350