Commit c4143b74 authored by Andre Przywara's avatar Andre Przywara
Browse files

allwinner: Detect and output current SoC



So far we already support booting on two different SoCs, and we will
shortly add a third, so add some code to determine the current SoC type.
This can be later used to runtime detect certain properties.

Also print the SoC name to the console, to give valuable debug information.
Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
parent ae903c56
...@@ -64,6 +64,22 @@ void bl31_plat_arch_setup(void) ...@@ -64,6 +64,22 @@ void bl31_plat_arch_setup(void)
void bl31_platform_setup(void) void bl31_platform_setup(void)
{ {
const char *soc_name;
uint16_t soc_id = sunxi_read_soc_id();
switch (soc_id) {
case 0x1689:
soc_name = "A64/H64/R18";
break;
case 0x1718:
soc_name = "H5";
break;
default:
soc_name = "unknown";
break;
}
NOTICE("BL31: Detected Allwinner %s SoC (%04x)\n", soc_name, soc_id);
generic_delay_timer_init(); generic_delay_timer_init();
/* Configure the interrupt controller */ /* Configure the interrupt controller */
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
#include <mmio.h>
#include <platform.h> #include <platform.h>
#include <platform_def.h> #include <platform_def.h>
#include <sunxi_def.h> #include <sunxi_def.h>
...@@ -54,3 +55,19 @@ void sunxi_configure_mmu_el3(int flags) ...@@ -54,3 +55,19 @@ void sunxi_configure_mmu_el3(int flags)
enable_mmu_el3(0); enable_mmu_el3(0);
} }
#define SRAM_VER_REG (SUNXI_SYSCON_BASE + 0x24)
uint16_t sunxi_read_soc_id(void)
{
uint32_t reg = mmio_read_32(SRAM_VER_REG);
/* Set bit 15 to prepare for the SOCID read. */
mmio_write_32(SRAM_VER_REG, reg | BIT(15));
reg = mmio_read_32(SRAM_VER_REG);
/* deactivate the SOCID access again */
mmio_write_32(SRAM_VER_REG, reg & ~BIT(15));
return reg >> 16;
}
...@@ -12,6 +12,7 @@ void sunxi_cpu_off(unsigned int cluster, unsigned int core); ...@@ -12,6 +12,7 @@ void sunxi_cpu_off(unsigned int cluster, unsigned int core);
void sunxi_cpu_on(unsigned int cluster, unsigned int core); void sunxi_cpu_on(unsigned int cluster, unsigned int core);
void sunxi_disable_secondary_cpus(unsigned int primary_cpu); void sunxi_disable_secondary_cpus(unsigned int primary_cpu);
uint16_t sunxi_read_soc_id(void);
void sunxi_security_setup(void); void sunxi_security_setup(void);
#endif /* __SUNXI_PRIVATE_H__ */ #endif /* __SUNXI_PRIVATE_H__ */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment