xref: /openbmc/u-boot/arch/arm/mach-aspeed/ast2400/board_common.c (revision 43e9f5a67df026ac596a04e3326e66898d8fbee5)
1fd0bc623Sryan_chen // SPDX-License-Identifier: GPL-2.0+
2fd0bc623Sryan_chen #include <common.h>
3fd0bc623Sryan_chen #include <dm.h>
4fd0bc623Sryan_chen #include <ram.h>
5fd0bc623Sryan_chen #include <timer.h>
6fd0bc623Sryan_chen #include <asm/io.h>
7*43e9f5a6SZev Weiss #include <asm/arch/platform.h>
8*43e9f5a6SZev Weiss #include <asm/arch/scu_ast2400.h>
9fd0bc623Sryan_chen #include <asm/arch/timer.h>
10fd0bc623Sryan_chen #include <linux/err.h>
11fd0bc623Sryan_chen #include <dm/uclass.h>
12fd0bc623Sryan_chen 
13fd0bc623Sryan_chen DECLARE_GLOBAL_DATA_PTR;
14fd0bc623Sryan_chen 
15*43e9f5a6SZev Weiss #define AST_LPC_HICR5 0x080
16*43e9f5a6SZev Weiss # define LPC_HICR5_ENFWH BIT(10)
17*43e9f5a6SZev Weiss #define AST_LPC_HICRB 0x100
18*43e9f5a6SZev Weiss # define LPC_HICRB_SIO_ILPC2AHB_DIS BIT(6)
19*43e9f5a6SZev Weiss 
20*43e9f5a6SZev Weiss #define AST_SDMC_PROTECT 0x00
21*43e9f5a6SZev Weiss # define SDRAM_UNLOCK_KEY 0xfc600309
22*43e9f5a6SZev Weiss #define AST_SDMC_GFX_PROT 0x08
23*43e9f5a6SZev Weiss # define SDMC_GFX_PROT_VGA_CURSOR BIT(0)
24*43e9f5a6SZev Weiss # define SDMC_GFX_PROT_VGA_CG_READ BIT(1)
25*43e9f5a6SZev Weiss # define SDMC_GFX_PROT_VGA_ASCII_READ BIT(2)
26*43e9f5a6SZev Weiss # define SDMC_GFX_PROT_VGA_CRT BIT(3)
27*43e9f5a6SZev Weiss # define SDMC_GFX_PROT_PCIE BIT(16)
28*43e9f5a6SZev Weiss # define SDMC_GFX_PROT_XDMA BIT(17)
29*43e9f5a6SZev Weiss 
isolate_bmc(void)30*43e9f5a6SZev Weiss static void isolate_bmc(void)
31*43e9f5a6SZev Weiss {
32*43e9f5a6SZev Weiss 	bool sdmc_unlocked;
33*43e9f5a6SZev Weiss 	u32 val;
34*43e9f5a6SZev Weiss 
35*43e9f5a6SZev Weiss 	/* iLPC2AHB */
36*43e9f5a6SZev Weiss #if !defined(CONFIG_ASPEED_ENABLE_SUPERIO)
37*43e9f5a6SZev Weiss 	val = readl(ASPEED_HW_STRAP1);
38*43e9f5a6SZev Weiss 	val |= SCU_HWSTRAP_LPC_SIO_DEC_DIS;
39*43e9f5a6SZev Weiss 	writel(val, ASPEED_HW_STRAP1);
40*43e9f5a6SZev Weiss #endif
41*43e9f5a6SZev Weiss 
42*43e9f5a6SZev Weiss 	val = readl(ASPEED_LPC_CTRL + AST_LPC_HICRB);
43*43e9f5a6SZev Weiss 	val |= LPC_HICRB_SIO_ILPC2AHB_DIS;
44*43e9f5a6SZev Weiss 	writel(val, ASPEED_LPC_CTRL + AST_LPC_HICRB);
45*43e9f5a6SZev Weiss 
46*43e9f5a6SZev Weiss 	/* P2A, PCIe BMC */
47*43e9f5a6SZev Weiss 	val = readl(ASPEED_PCIE_CONFIG_SET);
48*43e9f5a6SZev Weiss 	val &= ~(SCU_PCIE_CONFIG_SET_BMC_DMA
49*43e9f5a6SZev Weiss 	         | SCU_PCIE_CONFIG_SET_BMC_MMIO
50*43e9f5a6SZev Weiss 	         | SCU_PCIE_CONFIG_SET_BMC_EN
51*43e9f5a6SZev Weiss 	         | SCU_PCIE_CONFIG_SET_VGA_MMIO);
52*43e9f5a6SZev Weiss 	writel(val, ASPEED_PCIE_CONFIG_SET);
53*43e9f5a6SZev Weiss 
54*43e9f5a6SZev Weiss 	/* X-DMA */
55*43e9f5a6SZev Weiss 	sdmc_unlocked = readl(ASPEED_SDRAM_CTRL + AST_SDMC_PROTECT);
56*43e9f5a6SZev Weiss 	if (!sdmc_unlocked)
57*43e9f5a6SZev Weiss 		writel(SDRAM_UNLOCK_KEY, ASPEED_SDRAM_CTRL + AST_SDMC_PROTECT);
58*43e9f5a6SZev Weiss 
59*43e9f5a6SZev Weiss 	val = readl(ASPEED_SDRAM_CTRL + AST_SDMC_GFX_PROT);
60*43e9f5a6SZev Weiss 	val |= (SDMC_GFX_PROT_VGA_CURSOR
61*43e9f5a6SZev Weiss 	        | SDMC_GFX_PROT_VGA_CG_READ
62*43e9f5a6SZev Weiss 	        | SDMC_GFX_PROT_VGA_ASCII_READ
63*43e9f5a6SZev Weiss 	        | SDMC_GFX_PROT_VGA_CRT
64*43e9f5a6SZev Weiss 	        | SDMC_GFX_PROT_PCIE
65*43e9f5a6SZev Weiss 	        | SDMC_GFX_PROT_XDMA);
66*43e9f5a6SZev Weiss 	writel(val, ASPEED_SDRAM_CTRL + AST_SDMC_GFX_PROT);
67*43e9f5a6SZev Weiss 
68*43e9f5a6SZev Weiss 	if (!sdmc_unlocked)
69*43e9f5a6SZev Weiss 		writel(~SDRAM_UNLOCK_KEY, ASPEED_SDRAM_CTRL + AST_SDMC_PROTECT);
70*43e9f5a6SZev Weiss 
71*43e9f5a6SZev Weiss 	/* LPC2AHB */
72*43e9f5a6SZev Weiss 	val = readl(ASPEED_LPC_CTRL + AST_LPC_HICR5);
73*43e9f5a6SZev Weiss 	val &= ~LPC_HICR5_ENFWH;
74*43e9f5a6SZev Weiss 	writel(val, ASPEED_LPC_CTRL + AST_LPC_HICR5);
75*43e9f5a6SZev Weiss }
76*43e9f5a6SZev Weiss 
board_init(void)77fd0bc623Sryan_chen __weak int board_init(void)
78fd0bc623Sryan_chen {
79*43e9f5a6SZev Weiss 	isolate_bmc();
80*43e9f5a6SZev Weiss 
81fd0bc623Sryan_chen 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
82fd0bc623Sryan_chen 
83fd0bc623Sryan_chen 	return 0;
84fd0bc623Sryan_chen }
85fd0bc623Sryan_chen 
86fd0bc623Sryan_chen #define SDMC_CONFIG_VRAM_GET(x)         ((x >> 2) & 0x3)
87fd0bc623Sryan_chen #define SDMC_CONFIG_MEM_GET(x)          (x & 0x3)
88fd0bc623Sryan_chen 
89fd0bc623Sryan_chen static const u32 ast2400_dram_table[] = {
90fd0bc623Sryan_chen 	0x04000000,     //64MB
91fd0bc623Sryan_chen 	0x08000000,     //128MB
92fd0bc623Sryan_chen 	0x10000000, 	//256MB
93fd0bc623Sryan_chen 	0x20000000,     //512MB
94fd0bc623Sryan_chen };
95fd0bc623Sryan_chen 
96fd0bc623Sryan_chen u32
ast_sdmc_get_mem_size(void)97fd0bc623Sryan_chen ast_sdmc_get_mem_size(void)
98fd0bc623Sryan_chen {
99fd0bc623Sryan_chen 	u32 size = 0;
100fd0bc623Sryan_chen 	u32 size_conf = SDMC_CONFIG_MEM_GET(readl(0x1e6e0004));
101fd0bc623Sryan_chen 
102fd0bc623Sryan_chen 	size = ast2400_dram_table[size_conf];
103fd0bc623Sryan_chen 
104fd0bc623Sryan_chen 	return size;
105fd0bc623Sryan_chen }
106fd0bc623Sryan_chen 
107fd0bc623Sryan_chen 
108fd0bc623Sryan_chen static const u32 aspeed_vram_table[] = {
109fd0bc623Sryan_chen 	0x00800000,     //8MB
110fd0bc623Sryan_chen 	0x01000000,     //16MB
111fd0bc623Sryan_chen 	0x02000000,     //32MB
112fd0bc623Sryan_chen 	0x04000000,     //64MB
113fd0bc623Sryan_chen };
114fd0bc623Sryan_chen 
115fd0bc623Sryan_chen u32
ast_sdmc_get_vram_size(void)116fd0bc623Sryan_chen ast_sdmc_get_vram_size(void)
117fd0bc623Sryan_chen {
118fd0bc623Sryan_chen 	u32 size_conf = SDMC_CONFIG_VRAM_GET(readl(0x1e6e0004));
119fd0bc623Sryan_chen 	return aspeed_vram_table[size_conf];
120fd0bc623Sryan_chen }
121fd0bc623Sryan_chen 
dram_init(void)122fd0bc623Sryan_chen __weak int dram_init(void)
123fd0bc623Sryan_chen {
124fd0bc623Sryan_chen #if 0
125fd0bc623Sryan_chen 	struct udevice *dev;
126fd0bc623Sryan_chen 	struct ram_info ram;
127fd0bc623Sryan_chen 	int ret;
128fd0bc623Sryan_chen 
129fd0bc623Sryan_chen 	ret = uclass_get_device(UCLASS_RAM, 0, &dev);
130fd0bc623Sryan_chen 	if (ret) {
131fd0bc623Sryan_chen 		debug("DRAM FAIL1\r\n");
132fd0bc623Sryan_chen 		return ret;
133fd0bc623Sryan_chen 	}
134fd0bc623Sryan_chen 
135fd0bc623Sryan_chen 	ret = ram_get_info(dev, &ram);
136fd0bc623Sryan_chen 	if (ret) {
137fd0bc623Sryan_chen 		debug("DRAM FAIL2\r\n");
138fd0bc623Sryan_chen 		return ret;
139fd0bc623Sryan_chen 	}
140fd0bc623Sryan_chen 
141fd0bc623Sryan_chen 	gd->ram_size = ram.size;
142fd0bc623Sryan_chen #else
143fd0bc623Sryan_chen 	u32 vga = ast_sdmc_get_vram_size();
144fd0bc623Sryan_chen 	u32 dram = ast_sdmc_get_mem_size();
145fd0bc623Sryan_chen 	gd->ram_size = (dram - vga);
146fd0bc623Sryan_chen #endif
147fd0bc623Sryan_chen 	return 0;
148fd0bc623Sryan_chen }
149