mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-13 14:53:06 +00:00
bf7fa7d561
The ARM TrustedFirmware code for the Renesas RZ/G2L SoC family passes a devicetree blob to the bootloader as an argument in the same was previous R-Car Gen3/Gen4 SoCs. This blob contains a compatible string which can be used to identify the particular SoC we are running on. We do this as reading the DEVID & PRR registers from u-boot is not sufficient to differentiate between the R9A07G044L (RZ/G2L) and R9A07G044C (RZ/G2LC) SoCs. An additional read from offset 0x11861178 is needed but this address is in the OTP region which can only be read from the secure world (i.e. TrustedFirmware). So we have to rely on TrustedFirmware to determine the SoC and pass this information to u-boot via an fdt blob. Signed-off-by: Paul Barker <paul.barker.ct@bp.renesas.com> Reviewed-by: Biju Das <biju.das.jz@bp.renesas.com> Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Reviewed-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
63 lines
1.2 KiB
C
63 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 2021,2023 Renesas Electronics Corporation
|
|
*
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <asm/io.h>
|
|
#include <linux/libfdt.h>
|
|
|
|
#define SYSC_LSI_DEVID 0x11020A04
|
|
|
|
/* If the firmware passed a device tree, use it for soc identification. */
|
|
extern u64 rcar_atf_boot_args[];
|
|
|
|
/* CPU information table */
|
|
struct tfa_info {
|
|
const char *soc_name;
|
|
const char *cpu_name;
|
|
u32 cpu_type;
|
|
};
|
|
|
|
static const struct tfa_info tfa_info[] = {
|
|
{ "renesas,r9a07g044l2", "R9A07G044L", RMOBILE_CPU_TYPE_R9A07G044L },
|
|
};
|
|
|
|
static const struct tfa_info invalid_tfa_info = { NULL, "(invalid)", 0 };
|
|
|
|
static const struct tfa_info *get_tfa_info(void)
|
|
{
|
|
void *atf_fdt_blob = (void *)(rcar_atf_boot_args[1]);
|
|
|
|
if (fdt_magic(atf_fdt_blob) == FDT_MAGIC) {
|
|
unsigned int i;
|
|
for (i = 0; i < ARRAY_SIZE(tfa_info); i++) {
|
|
if (!fdt_node_check_compatible(atf_fdt_blob, 0,
|
|
tfa_info[i].soc_name))
|
|
return &tfa_info[i];
|
|
}
|
|
}
|
|
|
|
return &invalid_tfa_info;
|
|
}
|
|
|
|
const u8 *rzg_get_cpu_name(void)
|
|
{
|
|
return get_tfa_info()->cpu_name;
|
|
}
|
|
|
|
u32 rmobile_get_cpu_type(void)
|
|
{
|
|
return get_tfa_info()->cpu_type;
|
|
}
|
|
|
|
u32 rmobile_get_cpu_rev_integer(void)
|
|
{
|
|
return (readl(SYSC_LSI_DEVID) >> 28) + 1;
|
|
}
|
|
|
|
u32 rmobile_get_cpu_rev_fraction(void)
|
|
{
|
|
return 0;
|
|
}
|