
Hi Marek,
Thanks for the feedback.
Subject: Re: [PATCH 1/2] arm: rmobile: Add RZ/G2M SoC
On 9/21/20 12:30 PM, Biju Das wrote:
[...]
I don't think you need to modify anything then, the DT passed from TFA would contain the correct compatible string in / node, and that gets merged into the U-Boot control DT early on in fdtdec_board_setup()
in:
board/renesas/rcar-common/common.c so all you would have to do is use of_machine_is_compatible("renesas,r8a7-something-");
Would that work ?
Yes, I have added the below function to get cpu name from small array
tfa_cpu_table. Will send V3 with this changes.
+static const u8* get_cpu_name(void) +{ +u32 cpu_type = rmobile_get_cpu_type();
+return is_tfa_soc_match(cpu_type) ? +tfa_cpuinfo[tfa_cpuinfo_idx(cpu_type)].cpu_name : +rmobile_cpuinfo[rmobile_cpuinfo_idx(cpu_type)].cpu_name; +}
+static int tfa_cpuinfo_idx(u32 cpu_type) { int i = 0;
+for (; i < ARRAY_SIZE(tfa_cpuinfo); i++) if (tfa_cpuinfo[i].cpu_type +== cpu_type) break;
+return i; +}
+static bool is_tfa_soc_match(u32 cpu_type) { int idx = +tfa_cpuinfo_idx(cpu_type);
+if (idx != ARRAY_SIZE(tfa_cpuinfo) &&
- of_machine_is_compatible(tfa_cpuinfo[idx].compatible))
+return true;
+return false; +}
There might be even better way. Look at rmobile_get_cpu_type() , that is a weak function. So if you can implement one for RZG2 , then that function can return CPU_TYPE_RZG2_something ; and rmobile_get_cpu_type() for RZG2 can be implemented using the match on /compatible string .
Take a look at how arch/arm/mach-rmobile/cpu_info-rcar.c implements it using PRR, you might need cpu_info-rzg.c I think.
As mentioned in the commit message PRR values of both R-Car M3-W and RZ/G2M are identical. So there is no need for separate cpu_info-rzg.c. I believe it is duplication of code.
We are matching PRR first (device binding) and then use TFA SoC compatible string to differentiate from R-Car family. Please see the diff below[3].
Also, I hope there should already be some function to which you provide a compatible string and a table of supported compatible strings (of match table), from which it will return the .data field of the matching entry in that table. And that .data field can already be the CPU_TYPE_RZG_something , so you don't have to implement the table look up again.
What do you think ?
Device binding is important use case, run time you need to match PRR, that is same for both RCar-M3W and RZ/G2E. In RZ/G2 case, we miss device binding if just go with TFA compatible Approach. So we need both.
What do you think?
[3] +static const struct { +char *compatible; +u16 cpu_type; +u8 cpu_name[10]; +} tfa_cpuinfo[] = { +{ "renesas,r8a774a1", RMOBILE_CPU_TYPE_R8A774A1, "R8A774A1" }, +{ }, +}; + +static int tfa_cpuinfo_idx(u32 cpu_type) +{ +int i = 0; + +for (; i < ARRAY_SIZE(tfa_cpuinfo); i++) +if (tfa_cpuinfo[i].cpu_type == cpu_type) +break; + +return i; +} + +#if CONFIG_IS_ENABLED(OF_CONTROL) +static bool is_tfa_soc_match(u32 cpu_type) +{ +int idx = tfa_cpuinfo_idx(cpu_type); + +if (idx != ARRAY_SIZE(tfa_cpuinfo) && + of_machine_is_compatible(tfa_cpuinfo[idx].compatible)) +return true; + +return false; +} +#else +static bool __is_tfa_soc_match(u32 cpu_type) +{ +return false; +} +bool is_tfa_soc_match(u32 cpu_type) +__attribute__((weak, alias("__is_tfa_soc_match"))); +#endif + /* CPU infomation table */ static const struct { u16 cpu_type; @@ -74,10 +115,9 @@ static const struct { { 0x0, "CPU" }, };
-static int rmobile_cpuinfo_idx(void) +static int rmobile_cpuinfo_idx(u32 cpu_type) { int i = 0; -u32 cpu_type = rmobile_get_cpu_type();
for (; i < ARRAY_SIZE(rmobile_cpuinfo); i++) if (rmobile_cpuinfo[i].cpu_type == cpu_type) @@ -86,14 +126,24 @@ static int rmobile_cpuinfo_idx(void) return i; }
+static const u8 *get_cpu_name(void) +{ +u32 cpu_type = rmobile_get_cpu_type(); + +return is_tfa_soc_match(cpu_type) ? +tfa_cpuinfo[tfa_cpuinfo_idx(cpu_type)].cpu_name : +rmobile_cpuinfo[rmobile_cpuinfo_idx(cpu_type)].cpu_name; +} + #ifdef CONFIG_ARCH_MISC_INIT int arch_misc_init(void) { -int i, idx = rmobile_cpuinfo_idx(); +const u8 *cpu_name = get_cpu_name(); char cpu[10] = { 0 }; +int i;
for (i = 0; i < sizeof(cpu); i++) -cpu[i] = tolower(rmobile_cpuinfo[idx].cpu_name[i]); +cpu[i] = tolower(cpu_name[i]);
env_set("platform", cpu);
@@ -103,10 +153,8 @@ int arch_misc_init(void)
int print_cpuinfo(void) { -int i = rmobile_cpuinfo_idx(); - printf("CPU: Renesas Electronics %s rev %d.%d\n", -rmobile_cpuinfo[i].cpu_name, rmobile_get_cpu_rev_integer(), +get_cpu_name(), rmobile_get_cpu_rev_integer(), rmobile_get_cpu_rev_fraction());
Cheers, Biju
Renesas Electronics Europe GmbH, Geschaeftsfuehrer/President: Carsten Jauch, Sitz der Gesellschaft/Registered office: Duesseldorf, Arcadiastrasse 10, 40472 Duesseldorf, Germany, Handelsregister/Commercial Register: Duesseldorf, HRB 3708 USt-IDNr./Tax identification no.: DE 119353406 WEEE-Reg.-Nr./WEEE reg. no.: DE 14978647