[PATCH v3] ARM: Make a compile firmware conditionally
Kyungmin Park
kmpark at infradead.org
Fri Jul 20 09:28:39 EDT 2012
On Fri, Jul 20, 2012 at 6:42 PM, Dave Martin <dave.martin at linaro.org> wrote:
> On Fri, Jul 20, 2012 at 05:24:19PM +0900, Kyungmin Park wrote:
>> From: Kyungmin Park <kyungmin.park at samsung.com>
>>
>> Some boards can use the firmware at trustzone but others can't use this.
>
> Note that this isn't just about TrustZone. For example, firmware could
> be implemented in a hypervisor.
Okay, I will update the description.
>
>> However we need to build it simultaneously. To address this issue,
>> introduce arm firmware support and use it at each board files.
>>
>> e.g., In boot_secondary at mach-exynos/platsmp.c
>>
>> __raw_writel(virt_to_phys(exynos4_secondary_startup),
>> CPU1_BOOT_REG);
>>
>> if (IS_ENABLED(CONFIG_ARM_FIRMWARE)) {
>> /* Call Exynos specific smc call */
>> firmware_ops.cpu_boot(cpu);
>> }
>>
>> gic_raise_softirq(cpumask_of(cpu), 1);
>>
>> if (pen_release == -1)
>>
>> Now smp_ops is not yet merged, now just call the firmware_init at init_early
>> at board file
>>
>> e.g., exynos4412 based board
>>
>> static void __init board_init_early(void)
>> {
>> exynos_firmware_init();
>> }
>>
>> TODO
>> 1. DT support.
>> 2. call firmware init by smp_ops.
>>
>> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
>> ---
>> diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig
>> index 283fa1d..5b097ca 100644
>> --- a/arch/arm/common/Kconfig
>> +++ b/arch/arm/common/Kconfig
>> @@ -21,6 +21,9 @@ config ARM_VIC_NR
>> The maximum number of VICs available in the system, for
>> power management.
>>
>> +config ARM_FIRMWARE
>> + bool
>> +
>> config ICST
>> bool
>>
>> diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile
>> index e8a4e58..4af6568 100644
>> --- a/arch/arm/common/Makefile
>> +++ b/arch/arm/common/Makefile
>> @@ -4,6 +4,7 @@
>>
>> obj-$(CONFIG_ARM_GIC) += gic.o
>> obj-$(CONFIG_ARM_VIC) += vic.o
>> +obj-$(CONFIG_ARM_FIRMWARE) += firmware.o
>> obj-$(CONFIG_ICST) += icst.o
>> obj-$(CONFIG_SA1111) += sa1111.o
>> obj-$(CONFIG_PCI_HOST_VIA82C505) += via82c505.o
>> diff --git a/arch/arm/common/firmware.c b/arch/arm/common/firmware.c
>> new file mode 100644
>> index 0000000..ffb6822
>> --- /dev/null
>> +++ b/arch/arm/common/firmware.c
>> @@ -0,0 +1,23 @@
>> +/*
>> + * Copyright (C) 2012 Samsung Electronics.
>> + * Kyungmin Park <kyungmin.park at samsung.com>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 as
>> + * published by the Free Software Foundation.
>> + */
>> +
>> +#include <linux/kernel.h>
>> +#include <linux/suspend.h>
>> +
>> +#include <asm/firmware.h>
>> +
>> +static void cpu_boot(int cpu)
>> +{
>> + /* Do nothing */
>> +}
>> +
>> +struct firmware_ops firmware_ops = {
>> + .do_idle = cpu_do_idle,
>> + .cpu_boot = cpu_boot,
>> +};
>> diff --git a/arch/arm/include/asm/firmware.h b/arch/arm/include/asm/firmware.h
>> new file mode 100644
>> index 0000000..c8c28bf
>> --- /dev/null
>> +++ b/arch/arm/include/asm/firmware.h
>> @@ -0,0 +1,20 @@
>> +/*
>> + * Copyright (C) 2012 Samsung Electronics.
>> + * Kyungmin Park <kyungmin.park at samsung.com>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 as
>> + * published by the Free Software Foundation.
>> + */
>> +
>> +#ifndef __ASM_ARM_FIRMWARE_H
>> +#define __ASM_ARM_FIRMWARE_H
>> +
>> +struct firmware_ops {
>> + int (*do_idle)(void);
>> + void (*cpu_boot)(int cpu);
>> +};
>> +
>> +extern struct firmware_ops firmware_ops;
>> +
>> +#endif
>
> Do you plan to have a registration interface for this?
>
> I imagine that struct firmware_ops will get extended over time, so
> it might contain many different function pointers. Each board will
> probably only provide a subset of these, by sparsely populating its
> own struct firmware_ops (similarly to other existing registration
> interfaces).
Not yet, since I only used the real use case at exynos SoC. If you use
other SoC or use case, please add or extend it more.
>
> It may make sense to have a way to define default fallback actions for
> ops not defined by a particular board. If CONFIG_ARM_FIRMWARE=n, we
> could use the fallbacks for everything.
Yes, I also tested it but interesting things. If it uses the
IS_ENABLED(CONFIG_ARM_FIRMWARE) with firmware_ops, I can't see error
nor warning. Anyway I'll add fackback operation.
Thank you,
Kyungmin Park
More information about the linux-arm-kernel
mailing list