[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH] xen/arm: arm32: Enable smpboot on Arm32 based systems
On 03/05/2023 18:43, Julien Grall wrote: Hi Ayan, Hi Julien, On 03/05/2023 17:49, Ayan Kumar Halder wrote:On 03/05/2023 08:40, Julien Grall wrote:Hi,Hi Julien,Title: Did you mean "Enable spin table"?Yes, that would be more concrete.On 02/05/2023 11:58, Ayan Kumar Halder wrote:On some of the Arm32 based systems (eg Cortex-R52), smpboot is supported.Same here.YesIn these systems PSCI may not always be supported. In case of Cortex-R52, there is no EL3 or secure mode. Thus, PSCI is not supported as it requires EL3.Thus, we use 'spin-table' mechanism to boot the secondary cpus. The primary cpu provides the startup address of the secondary cores. This address isprovided using the 'cpu-release-addr' property.To support smpboot, we have copied the code from xen/arch/arm/arm64/smpboot.cI would rather prefer if we don't duplicate the code but instead move the logic in common code.Ackwith the following changes :- 1. 'enable-method' is an optional property. Refer to the comment inhttps://www.kernel.org/doc/Documentation/devicetree/bindings/arm/cpus.yaml" # On ARM 32-bit systems this property is optional"Looking at this list, "spin-table" doesn't seem to be supportedfor 32-bit systems.However, looking at https://developer.arm.com/documentation/den0013/d/Multi-core-processors/Booting-SMP-systems/SMP-boot-in-Linux , it seems "spin-table" is a valid boot mechanism for Armv7 cpus.I am not able to find the associated code in Linux 32-bit. Do you have any pointer? Unfortunately, no.I see that in linux, "spin-table" support is added in arch/arm64/kernel/smp_spin_table.c. So, there seems to be no Arm32 support for this. Can you point me to the discussion/patch where this would be added?Actually, this is the first discussion I am having with regards to adding a "spin-table" support on Arm32.I was asking for the discussion on the Device-Tree/Linux ML or code.I don't really want to do a "spin-table" support if this is not even supported in Linux. I see your point. But that brings me to my next question, how do I parse cpu node specific properties for Arm32 cpus. In https://www.kernel.org/doc/Documentation/devicetree/bindings/arm/cpus.yaml , I see some of the properties valid for Arm32 cpus. For example:- secondary-boot-reg rockchip,pmu Also, it says "additionalProperties: true" which means I can add platform specific properties under the cpu node. Please correct me if mistaken. My cpu nodes will look like this :- cpu@1 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x00 0x01>; enable-method = "spin-table"; amd-cpu-release-addr = <0xEB58C010>; /* might also use "secondary-boot-reg" */ amd-cpu-reset-addr = <0xEB58C000>; amd-cpu-reset-delay = <0xF00000>; amd-cpu-re phandle = <0x03>; }; cpu@2 { device_type = "cpu"; compatible = "arm,armv8"; reg = <0x00 0x02>; enable-method = "spin-table"; amd-cpu-release-addr = <0xEB59C010>; /* might also use "secondary-boot-reg" */ amd-cpu-reset-addr = <0xEB59C000>; amd-cpu-reset-delay = <0xF00000>; amd-cpu-re phandle = <0x03>; };If the reasoning makes sense, then does the following proposed change looks sane ? diff --git a/xen/arch/arm/arm32/smpboot.c b/xen/arch/arm/arm32/smpboot.c index e7368665d5..0b281edb9d 100644 --- a/xen/arch/arm/arm32/smpboot.c +++ b/xen/arch/arm/arm32/smpboot.c @@ -10,10 +10,7 @@ int __init arch_smp_init(void) int __init arch_cpu_init(int cpu, struct dt_device_node *dn) { - /* Not needed on ARM32, as there is no relevant information in - * the CPU device tree node for ARMv7 CPUs. - */ - return 0; + return platform_cpu_init(cpu, dn); } int arch_cpu_up(int cpu)diff --git a/xen/arch/arm/include/asm/platform.h b/xen/arch/arm/include/asm/platform.h index d03b261ce8..5cd7af4d0e 100644 --- a/xen/arch/arm/include/asm/platform.h +++ b/xen/arch/arm/include/asm/platform.h @@ -18,6 +18,7 @@ struct platform_desc { /* SMP */ int (*smp_init)(void); int (*cpu_up)(int cpu); + int (*cpu_init)(int cpu, struct dt_device_node *dn); #endif /* Specific mapping for dom0 */ int (*specific_mapping)(struct domain *d); diff --git a/xen/arch/arm/platform.c b/xen/arch/arm/platform.c index a820665020..ed54b68c20 100644 --- a/xen/arch/arm/platform.c +++ b/xen/arch/arm/platform.c @@ -95,6 +95,14 @@ int __init platform_specific_mapping(struct domain *d) } #ifdef CONFIG_ARM_32 +int __init platform_cpu_init(int cpu, struct dt_device_node *dn) +{ + if ( platform && platform->cpu_init )+ return platform_cpu_init(cpu, dn); /* parse platform specific cpu properties */ + + return 0; +} + int platform_cpu_up(int cpu) { if ( psci_ver ) Let me know your thoughts, please. Kind regards, Ayan Cheers,
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |