mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-29 05:18:51 +09:00
![Amit Singh Tomar](/assets/img/avatar_default.png)
Calculate the SDRAM size from DDR capacity register registers instead of using hard-coded value. This is quite useful to get correct size on differnt boards based on Actions OWL family of SoCs (S700 and S900). There is no documentation available that talks about DDR registers, and this is very much taken from vendor source. This commit lets Linux boot on Cubieboard7-lite(based on S700). Signed-off-by: Amit Singh Tomar <amittomer25@gmail.com> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
80 lines
1.5 KiB
C
80 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Actions Semi Owl SoCs platform support.
|
|
*
|
|
* Copyright (C) 2018 Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
|
*/
|
|
|
|
#include <cpu_func.h>
|
|
#include <init.h>
|
|
#include <asm/cache.h>
|
|
#include <linux/arm-smccc.h>
|
|
#include <linux/psci.h>
|
|
#include <common.h>
|
|
#include <asm/io.h>
|
|
#include <asm/mach-types.h>
|
|
#include <asm/psci.h>
|
|
|
|
#define DMM_INTERLEAVE_PER_CH_CFG 0xe0290028
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
unsigned int owl_get_ddrcap(void)
|
|
{
|
|
unsigned int val, cap;
|
|
|
|
/* ddr capacity register initialized by ddr driver
|
|
* in early bootloader
|
|
*/
|
|
#if defined(CONFIG_MACH_S700)
|
|
val = (readl(DMM_INTERLEAVE_PER_CH_CFG) >> 8) & 0x7;
|
|
cap = (val + 1) * 256;
|
|
#elif defined(CONFIG_MACH_S900)
|
|
val = (readl(DMM_INTERLEAVE_PER_CH_CFG) >> 8) & 0xf;
|
|
cap = 64 * (1 << val);
|
|
#endif
|
|
|
|
return cap;
|
|
}
|
|
|
|
/*
|
|
* dram_init - sets uboots idea of sdram size
|
|
*/
|
|
int dram_init(void)
|
|
{
|
|
gd->ram_size = owl_get_ddrcap() * 1024 * 1024;
|
|
return 0;
|
|
}
|
|
|
|
/* This is called after dram_init() so use get_ram_size result */
|
|
int dram_init_banksize(void)
|
|
{
|
|
gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
|
|
gd->bd->bi_dram[0].size = gd->ram_size;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void show_psci_version(void)
|
|
{
|
|
struct arm_smccc_res res;
|
|
|
|
arm_smccc_smc(ARM_PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &res);
|
|
|
|
printf("PSCI: v%ld.%ld\n",
|
|
PSCI_VERSION_MAJOR(res.a0),
|
|
PSCI_VERSION_MINOR(res.a0));
|
|
}
|
|
|
|
int board_init(void)
|
|
{
|
|
show_psci_version();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void reset_cpu(ulong addr)
|
|
{
|
|
psci_system_reset();
|
|
}
|