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