blob: ba5c94b4b3dd77d1c2741990aca550ef1331a032 [file] [log] [blame]
Xuhui Lin43623c22025-04-15 23:51:16 +02001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2024 Rockchip Electronics Co., Ltd
4 */
5
6#include <asm/armv8/mmu.h>
7#include <asm/arch-rockchip/bootrom.h>
8#include <asm/arch-rockchip/hardware.h>
9
10#define SYS_GRF_BASE 0x2600A000
11#define SYS_GRF_SOC_CON2 0x0008
12#define SYS_GRF_SOC_CON7 0x001c
13#define SYS_GRF_SOC_CON11 0x002c
14#define SYS_GRF_SOC_CON12 0x0030
15
16#define GPIO0_IOC_BASE 0x26040000
17#define GPIO0B_PULL_L 0x0024
18#define GPIO0B_IE_L 0x002C
19
20#define SYS_SGRF_BASE 0x26004000
21#define SYS_SGRF_SOC_CON14 0x0058
22#define SYS_SGRF_SOC_CON15 0x005C
23#define SYS_SGRF_SOC_CON20 0x0070
24
25#define FW_SYS_SGRF_BASE 0x26005000
26#define SGRF_DOMAIN_CON1 0x4
27#define SGRF_DOMAIN_CON2 0x8
28#define SGRF_DOMAIN_CON3 0xc
29#define SGRF_DOMAIN_CON4 0x10
30#define SGRF_DOMAIN_CON5 0x14
31
32const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = {
33 [BROM_BOOTSOURCE_EMMC] = "/soc/mmc@2a330000",
34 [BROM_BOOTSOURCE_SD] = "/soc/mmc@2a310000",
35};
36
37static struct mm_region rk3576_mem_map[] = {
38 {
39 /* I/O area */
40 .virt = 0x20000000UL,
41 .phys = 0x20000000UL,
42 .size = 0xb080000UL,
43 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
44 PTE_BLOCK_NON_SHARE |
45 PTE_BLOCK_PXN | PTE_BLOCK_UXN
46 }, {
47 /* PMU_SRAM, CBUF, SYSTEM_SRAM */
48 .virt = 0x3fe70000UL,
49 .phys = 0x3fe70000UL,
50 .size = 0x190000UL,
51 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
52 PTE_BLOCK_NON_SHARE |
53 PTE_BLOCK_PXN | PTE_BLOCK_UXN
54 }, {
55 /* MSCH_DDR_PORT */
56 .virt = 0x40000000UL,
57 .phys = 0x40000000UL,
58 .size = 0x400000000UL,
59 .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
60 PTE_BLOCK_INNER_SHARE
61 }, {
62 /* PCIe 0+1 */
63 .virt = 0x900000000UL,
64 .phys = 0x900000000UL,
65 .size = 0x100800000UL,
66 .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
67 PTE_BLOCK_NON_SHARE |
68 PTE_BLOCK_PXN | PTE_BLOCK_UXN
69 }, {
70 /* List terminator */
71 0,
72 }
73};
74
75struct mm_region *mem_map = rk3576_mem_map;
76
77void board_debug_uart_init(void)
78{
79}
80
81#define HP_TIMER_BASE CONFIG_ROCKCHIP_STIMER_BASE
82#define HP_CTRL_REG 0x04
83#define TIMER_EN BIT(0)
84#define HP_LOAD_COUNT0_REG 0x14
85#define HP_LOAD_COUNT1_REG 0x18
86
87void rockchip_stimer_init(void)
88{
89 u32 reg;
90
91 if (!IS_ENABLED(CONFIG_XPL_BUILD))
92 return;
93
94 reg = readl(HP_TIMER_BASE + HP_CTRL_REG);
95 if (reg & TIMER_EN)
96 return;
97
98 asm volatile("msr cntfrq_el0, %0" : : "r" (CONFIG_COUNTER_FREQUENCY));
99 writel(0xffffffff, HP_TIMER_BASE + HP_LOAD_COUNT0_REG);
100 writel(0xffffffff, HP_TIMER_BASE + HP_LOAD_COUNT1_REG);
101 writel((TIMER_EN << 16) | TIMER_EN, HP_TIMER_BASE + HP_CTRL_REG);
102}
103
104int arch_cpu_init(void)
105{
106 u32 val;
107
108 if (!IS_ENABLED(CONFIG_SPL_BUILD))
109 return 0;
110
111 /* Set the emmc to access ddr memory */
112 val = readl(FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON2);
113 writel(val | 0x7, FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON2);
114
115 /* Set the sdmmc0 to access ddr memory */
116 val = readl(FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON5);
117 writel(val | 0x700, FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON5);
118
119 /* Set the UFS to access ddr memory */
120 val = readl(FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON3);
121 writel(val | 0x70000, FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON3);
122
123 /* Set the fspi0 and fspi1 to access ddr memory */
124 val = readl(FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON4);
125 writel(val | 0x7700, FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON4);
126
127 /* Set the decom to access ddr memory */
128 val = readl(FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON1);
129 writel(val | 0x700, FW_SYS_SGRF_BASE + SGRF_DOMAIN_CON1);
130
131 /*
132 * Set the GPIO0B0~B3 pull up and input enable.
133 * Keep consistent with other IO.
134 */
135 writel(0x00ff00ff, GPIO0_IOC_BASE + GPIO0B_PULL_L);
136 writel(0x000f000f, GPIO0_IOC_BASE + GPIO0B_IE_L);
137
138 /*
139 * Set SYS_GRF_SOC_CON2[12](input of pwm2_ch0) as 0,
140 * keep consistent with other pwm.
141 */
142 writel(0x10000000, SYS_GRF_BASE + SYS_GRF_SOC_CON2);
143
144 /* Enable noc slave response timeout */
145 writel(0x80008000, SYS_GRF_BASE + SYS_GRF_SOC_CON11);
146 writel(0xffffffe0, SYS_GRF_BASE + SYS_GRF_SOC_CON12);
147
148 /*
149 * Enable cci channels for below module AXI R/W
150 * Module: GMAC0/1, MMU0/1(PCIe, SATA, USB3)
151 */
152 writel(0xffffff00, SYS_SGRF_BASE + SYS_SGRF_SOC_CON20);
153
154 return 0;
155}