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