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
30
write32
(&
rk3288_grf
->
iomux_pwm1
,
IOMUX_PWM1
);
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
{
67
timestamp_add_now
(
TS_ROMSTAGE_START
);
68
69
console_init
();
70
exception_init
();
71
configure_l2ctlr
();
72
tsadc_init
();
73
74
/* Need to power cycle SD card to ensure it is properly reset. */
75
sdmmc_power_off
();
76
77
/* vdd_log 1200mv is enough for ddr run 666Mhz */
78
regulate_vdd_log
(1200);
79
80
timestamp_add_now
(
TS_INITRAM_START
);
81
82
sdram_init
(
get_sdram_config
());
83
84
timestamp_add_now
(
TS_INITRAM_END
);
85
86
/* Now that DRAM is up, add mappings for it and DMA coherency buffer. */
87
mmu_config_range
((
uintptr_t
)
_dram
/
MiB
,
88
sdram_size_mb
(),
DCACHE_WRITEBACK
);
89
mmu_config_range
((
uintptr_t
)_dma_coherent/
MiB
,
90
REGION_SIZE
(
dma_coherent
)/
MiB
,
DCACHE_OFF
);
91
92
cbmem_initialize_empty
();
93
94
run_ramstage
();
95
}
main
void main(void)
Definition:
romstage.c:13
mmu_config_range
void mmu_config_range(u32 start_mb, u32 size_mb, enum dcache_policy policy)
Definition:
mmu.c:221
write32
static void write32(void *addr, uint32_t val)
Definition:
mmio.h:40
write_l2ctlr
static void write_l2ctlr(uint32_t val)
Definition:
cache.h:230
DCACHE_WRITEBACK
@ DCACHE_WRITEBACK
Definition:
cache.h:364
DCACHE_OFF
@ DCACHE_OFF
Definition:
cache.h:363
read_l2ctlr
static uint32_t read_l2ctlr(void)
Definition:
cache.h:222
exception_init
void exception_init(void)
Definition:
exception.c:120
armv7.h
assert.h
assert
#define assert(statement)
Definition:
assert.h:74
get_sdram_config
const struct sdram_info * get_sdram_config(void)
Definition:
sdram_configs.c:85
MiB
#define MiB
Definition:
helpers.h:76
sdram_init
void sdram_init(void)
Definition:
sdram.c:16
sdram_size_mb
size_t sdram_size_mb(void)
Definition:
sdram.c:24
cbmem.h
cbmem_initialize_empty
void cbmem_initialize_empty(void)
Definition:
imd_cbmem.c:45
dma_coherent
int dma_coherent(void *ptr)
console.h
mmio.h
_dram
u8 _dram[]
REGION_SIZE
#define REGION_SIZE(name)
Definition:
symbols.h:10
console_init
void console_init(void)
Definition:
init.c:49
timestamp_add_now
void timestamp_add_now(enum timestamp_id id)
Definition:
timestamp.c:141
sdmmc_power_off
static void sdmmc_power_off(void)
Definition:
romstage.c:59
regulate_vdd_log
static void regulate_vdd_log(unsigned int mv)
Definition:
romstage.c:23
configure_l2ctlr
static void configure_l2ctlr(void)
Definition:
romstage.c:40
board.h
program_loading.h
run_ramstage
void run_ramstage(void)
Definition:
prog_loaders.c:85
rk3288_grf
static struct rk3288_grf_regs *const rk3288_grf
Definition:
grf.h:181
IOMUX_PWM1
#define IOMUX_PWM1
Definition:
grf.h:205
tsadc_init
void tsadc_init(void)
Definition:
tsadc.c:66
rk808.h
rk808_configure_ldo
void rk808_configure_ldo(int ldo, int millivolts)
Definition:
rk808.c:66
pwm.h
pwm_init
void pwm_init(u32 id, u32 period_ns, u32 duty_ns)
Definition:
pwm.c:49
uint32_t
unsigned int uint32_t
Definition:
stdint.h:14
u32
uint32_t u32
Definition:
stdint.h:51
uintptr_t
unsigned long uintptr_t
Definition:
stdint.h:21
rk3288_grf_regs::iomux_pwm1
u32 iomux_pwm1
Definition:
grf.h:73
timestamp.h
TS_INITRAM_END
@ TS_INITRAM_END
Definition:
timestamp_serialized.h:25
TS_INITRAM_START
@ TS_INITRAM_START
Definition:
timestamp_serialized.h:24
TS_ROMSTAGE_START
@ TS_ROMSTAGE_START
Definition:
timestamp_serialized.h:23
src
mainboard
google
veyron
romstage.c
Generated by
1.9.1