coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
romstage.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <arch/cache.h>
4 #include <arch/exception.h>
5 #include <armv7.h>
6 #include <assert.h>
7 #include <cbmem.h>
8 #include <console/console.h>
9 #include <device/mmio.h>
10 #include <program_loading.h>
11 #include <soc/sdram.h>
12 #include <soc/clock.h>
13 #include <soc/pwm.h>
14 #include <soc/grf.h>
15 #include <soc/rk808.h>
16 #include <soc/tsadc.h>
17 #include <symbols.h>
18 #include <timestamp.h>
19 #include <types.h>
20 
21 #include "board.h"
22 
23 static void regulate_vdd_log(unsigned int mv)
24 {
25  unsigned int duty_ns;
26  const u32 period_ns = 2000; /* pwm period: 2000ns */
27  const u32 max_regulator_mv = 1350; /* 1.35V */
28  const u32 min_regulator_mv = 870; /* 0.87V */
29 
31 
32  assert((mv >= min_regulator_mv) && (mv <= max_regulator_mv));
33 
34  duty_ns = (max_regulator_mv - mv) * period_ns /
35  (max_regulator_mv - min_regulator_mv);
36 
37  pwm_init(1, period_ns, duty_ns);
38 }
39 
40 static void configure_l2ctlr(void)
41 {
42  uint32_t l2ctlr;
43 
44  l2ctlr = read_l2ctlr();
45  l2ctlr &= 0xfffc0000; /* clear bit0~bit17 */
46 
47  /*
48  * Data RAM write latency: 2 cycles
49  * Data RAM read latency: 2 cycles
50  * Data RAM setup latency: 1 cycle
51  * Tag RAM write latency: 1 cycle
52  * Tag RAM read latency: 1 cycle
53  * Tag RAM setup latency: 1 cycle
54  */
55  l2ctlr |= (1 << 3 | 1 << 0);
56  write_l2ctlr(l2ctlr);
57 }
58 
59 static void sdmmc_power_off(void)
60 {
61  rk808_configure_ldo(4, 0); /* VCCIO_SD */
62  rk808_configure_ldo(5, 0); /* VCC33_SD */
63 }
64 
65 void main(void)
66 {
68 
69  console_init();
72  tsadc_init();
73 
74  /* Need to power cycle SD card to ensure it is properly reset. */
76 
77  /* vdd_log 1200mv is enough for ddr run 666Mhz */
78  regulate_vdd_log(1200);
79 
81 
83 
85 
86  /* Now that DRAM is up, add mappings for it and DMA coherency buffer. */
89  mmu_config_range((uintptr_t)_dma_coherent/MiB,
91 
93 
94  run_ramstage();
95 }
void main(void)
Definition: romstage.c:13
void mmu_config_range(u32 start_mb, u32 size_mb, enum dcache_policy policy)
Definition: mmu.c:221
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static void write_l2ctlr(uint32_t val)
Definition: cache.h:230
@ DCACHE_WRITEBACK
Definition: cache.h:364
@ DCACHE_OFF
Definition: cache.h:363
static uint32_t read_l2ctlr(void)
Definition: cache.h:222
void exception_init(void)
Definition: exception.c:120
#define assert(statement)
Definition: assert.h:74
const struct sdram_info * get_sdram_config(void)
Definition: sdram_configs.c:85
#define MiB
Definition: helpers.h:76
void sdram_init(void)
Definition: sdram.c:16
size_t sdram_size_mb(void)
Definition: sdram.c:24
void cbmem_initialize_empty(void)
Definition: imd_cbmem.c:45
int dma_coherent(void *ptr)
u8 _dram[]
#define REGION_SIZE(name)
Definition: symbols.h:10
void console_init(void)
Definition: init.c:49
void timestamp_add_now(enum timestamp_id id)
Definition: timestamp.c:141
static void sdmmc_power_off(void)
Definition: romstage.c:59
static void regulate_vdd_log(unsigned int mv)
Definition: romstage.c:23
static void configure_l2ctlr(void)
Definition: romstage.c:40
void run_ramstage(void)
Definition: prog_loaders.c:85
static struct rk3288_grf_regs *const rk3288_grf
Definition: grf.h:181
#define IOMUX_PWM1
Definition: grf.h:205
void tsadc_init(void)
Definition: tsadc.c:66
void rk808_configure_ldo(int ldo, int millivolts)
Definition: rk808.c:66
void pwm_init(u32 id, u32 period_ns, u32 duty_ns)
Definition: pwm.c:49
unsigned int uint32_t
Definition: stdint.h:14
uint32_t u32
Definition: stdint.h:51
unsigned long uintptr_t
Definition: stdint.h:21
u32 iomux_pwm1
Definition: grf.h:73
@ TS_INITRAM_END
@ TS_INITRAM_START
@ TS_ROMSTAGE_START