Skip to contentSkip to conversation

ARM: Make a compile firmware conditionally

PATCH New Kyungmin Park 3 participants 3 messages Aug 24, 2012 – Aug 27, 2012 Arm (32-bit)

lore
Share & tools
lore
#0 lore raw

PATCH v5 1/2 ARM: Make a compile firmware conditionally

From: Kyungmin Park <[email protected]>

Some boards can use the firmware at trustzone but others can't use this. 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 */
                do_firmware_op(cpu_boot, cpu);
        }

        gic_raise_softirq(cpumask_of(cpu), 1);

        if (pen_release == -1)

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.

---
Changelog v4
use call_firmware_op commented by Tomasz Figa. remove useless core_initcall

arch/arm/common/Kconfig +3 -0
index 283fa1d..5b097ca 100644
@@ -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
 
arch/arm/common/Makefile +1 -0
index e8a4e58..4af6568 100644
@@ -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
arch/arm/common/firmware.c new file +25 -0
new file mode 100644
index 0000000..e375e9f
@@ -0,0 +1,25 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics.
+ *  Kyungmin Park <[email protected]>
+ *
+ * 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 */
+}
+
+static struct firmware_ops default_firmware_ops = {
+	.do_idle		= cpu_do_idle,
+	.cpu_boot		= cpu_boot,
+};
+
+struct firmware_ops *firmware_ops = &default_firmware_ops;
arch/arm/include/asm/firmware.h new file +27 -0
new file mode 100644
index 0000000..99c97ff
@@ -0,0 +1,27 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics.
+ *  Kyungmin Park <[email protected]>
+ *
+ * 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;
+
+#ifdef CONFIG_ARM_FIRMWARE
+#define call_firmware_op(op, ...)					\
+	((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : 0)
+#else
+#define call_firmware_op(op, ...)		do { } while (0)
+#endif
+
+#endif
#1 lore raw

PATCH v5 1/2 ARM: Make a compile firmware conditionally

Hello,

Quoted 8 lines · On Friday 24 of August 2012 17:33:51 Kyungmin Park wrote:

From: Kyungmin Park <[email protected]>

Some boards can use the firmware at trustzone but others can't use this. 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

Quoted 7 lines
        __raw_writel(virt_to_phys(exynos4_secondary_startup),
                CPU1_BOOT_REG);

        if (IS_ENABLED(CONFIG_ARM_FIRMWARE)) {
                /* Call Exynos specific smc call */
                do_firmware_op(cpu_boot, cpu);
        }

There is no need for if (IS_ENABLED(CONFIG_ARM_FIRMWARE)) now when we have conditional call_firmware_op macro.

Also I guess there is a typo: s/do_firmware_op/call_firmware_op/ .

--
Best regards,
Tomasz Figa

Quoted 116 lines
        gic_raise_softirq(cpumask_of(cpu), 1);

        if (pen_release == -1)

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.

---
Changelog v4
use call_firmware_op commented by Tomasz Figa. remove useless core_initcall

arch/arm/common/Kconfig +3 -0
index 283fa1d..5b097ca 100644
@@ -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
 
arch/arm/common/Makefile +1 -0
index e8a4e58..4af6568 100644
@@ -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
arch/arm/common/firmware.c new file +25 -0
new file mode 100644
index 0000000..e375e9f
@@ -0,0 +1,25 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics.
+ *  Kyungmin Park <[email protected]>
+ *
+ * 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 */
+}
+
+static struct firmware_ops default_firmware_ops = {
+	.do_idle		= cpu_do_idle,
+	.cpu_boot		= cpu_boot,
+};
+
+struct firmware_ops *firmware_ops = &default_firmware_ops;
(quoted diff) +0 -0

b/arch/arm/include/asm/firmware.h new file mode 100644 index 0000000..99c97ff

arch/arm/include/asm/firmware.h new file +27 -0
@@ -0,0 +1,27 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics.
+ *  Kyungmin Park <[email protected]>
+ *
+ * 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;
+
+#ifdef CONFIG_ARM_FIRMWARE
+#define call_firmware_op(op, ...)					\
+	((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : 0)
+#else
+#define call_firmware_op(op, ...)		do { } while (0)
+#endif
+
+#endif

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#2 lore raw

PATCH v5 1/2 ARM: Make a compile firmware conditionally

In reply to Kyungmin Park

Hi,

arch/arm/common/Kconfig config ARM_VIC_NR · line 26

Quoted 11 lines · Kyungmin Park
arch/arm/common/Kconfig +3 -0
index 283fa1d..5b097ca 100644
@@ -21,6 +21,9 @@ config ARM_VIC_NR
 	  The maximum number of VICs available in the system, for
 	  power management.
 
+config ARM_FIRMWARE
+	bool
+

I don't think you need a config option for this now, it only adds 12 bytes of data to the kernel and it makes the below simpler.

Quoted 21 lines
arch/arm/include/asm/firmware.h new file +15 -0
new file mode 100644
index 0000000..99c97ff
@@ -0,0 +1,27 @@
+/*
+ *  Copyright (C) 2012 Samsung Electronics.
+ *  Kyungmin Park <[email protected]>
+ *
+ * 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);

arch/arm/include/asm/firmware.h line 25

Quoted 10 lines
arch/arm/include/asm/firmware.h new file +10 -0
+};
+
+extern struct firmware_ops *firmware_ops;
+
+#ifdef CONFIG_ARM_FIRMWARE
+#define call_firmware_op(op, ...)					\
+	((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : 0)
+#else
+#define call_firmware_op(op, ...)		do { } while (0)
+#endif

If you always include the firmware.c file, then you don't need the ifdef above either, since the default version fills in dummy versions.

-Olof