2021-09-24 21:47:19

by Florian Fainelli

[permalink] [raw]
Subject: [PATCH 01/11] arch: Export cpu_logical_map to modules

In order to allow drivers/irqchip/irq-bcm7038-l1.c to be built as a
module and usable in GKI, export cpu_logical_map or __cpu_logical_map
towards the modules.

Signed-off-by: Florian Fainelli <[email protected]>
---
arch/arm/kernel/setup.c | 1 +
arch/arm64/kernel/setup.c | 1 +
arch/sh/kernel/smp.c | 1 +
3 files changed, 3 insertions(+)

diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 284a80c0b6e1..abd5c999bdb2 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -585,6 +585,7 @@ void notrace cpu_init(void)
}

u32 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
+EXPORT_SYMBOL(__cpu_logical_map);

void __init smp_setup_processor_id(void)
{
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index be5f85b0a24d..d8f796ae13c4 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -290,6 +290,7 @@ u64 cpu_logical_map(unsigned int cpu)
{
return __cpu_logical_map[cpu];
}
+EXPORT_SYMBOL(cpu_logical_map);

void __init __no_sanitize_address setup_arch(char **cmdline_p)
{
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c
index 65924d9ec245..8f16cfaad238 100644
--- a/arch/sh/kernel/smp.c
+++ b/arch/sh/kernel/smp.c
@@ -30,6 +30,7 @@

int __cpu_number_map[NR_CPUS]; /* Map physical to logical */
int __cpu_logical_map[NR_CPUS]; /* Map logical to physical */
+EXPORT_SYMBOL(__cpu_logical_map);

struct plat_smp_ops *mp_ops = NULL;

--
2.25.1


2021-09-27 19:35:07

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 01/11] arch: Export cpu_logical_map to modules

On Fri, Sep 24, 2021 at 12:06 PM Florian Fainelli <[email protected]> wrote:
>
> In order to allow drivers/irqchip/irq-bcm7038-l1.c to be built as a
> module and usable in GKI, export cpu_logical_map or __cpu_logical_map
> towards the modules.

This is the usage:

#ifdef CONFIG_SMP
cpu = intc->cpus[cpu_logical_map(smp_processor_id())];
#else
cpu = intc->cpus[0];
#endif

This is totally broken! cpu_logical_map() takes the logical cpu
number, 0-N, and returns the MPIDR which you then use as an array
index.

Rob

2021-09-27 19:45:42

by Florian Fainelli

[permalink] [raw]
Subject: Re: [PATCH 01/11] arch: Export cpu_logical_map to modules

On 9/27/21 12:32 PM, Rob Herring wrote:
> On Fri, Sep 24, 2021 at 12:06 PM Florian Fainelli <[email protected]> wrote:
>>
>> In order to allow drivers/irqchip/irq-bcm7038-l1.c to be built as a
>> module and usable in GKI, export cpu_logical_map or __cpu_logical_map
>> towards the modules.
>
> This is the usage:
>
> #ifdef CONFIG_SMP
> cpu = intc->cpus[cpu_logical_map(smp_processor_id())];
> #else
> cpu = intc->cpus[0];
> #endif
>
> This is totally broken! cpu_logical_map() takes the logical cpu
> number, 0-N, and returns the MPIDR which you then use as an array
> index.

There is no MPIDR on MIPS, which is where this code is being primarily
used as-is. On ARM/ARM64 the driver is used as a second level interrupt
controller with only a single "bank" of registers as opposed to one
per-CPU, meaning that we would always use intc->cpus[0] because you
cannot change the interrupt affinity of a second level interrupt
controller AFAICT. Maybe the above deserves to be made CONFIG_SMP &&
CONFIG_MIPS somehow.
--
Florian