[PATCH v4 1/5] ARM: Add interface for registering and calling firmware-specific operations
Barry Song
21cnbao at gmail.com
Wed Dec 26 03:00:27 EST 2012
2012/11/22, Tomasz Figa <t.figa at samsung.com>:
> Some boards are running with secure firmware running in TrustZone secure
> world, which changes the way some things have to be initialized.
>
> This patch adds an interface for platforms to specify available firmware
> operations and call them.
>
> A wrapper macro, call_firmware_op(), checks if the operation is provided
> and calls it if so, otherwise returns -ENOSYS to allow fallback to
> legacy operation..
>
> By default no operations are provided.
>
> Example of use:
>
> In code using firmware ops:
>
> __raw_writel(virt_to_phys(exynos4_secondary_startup),
> CPU1_BOOT_REG);
>
> /* Call Exynos specific smc call */
> if (call_firmware_op(cpu_boot, cpu) == -ENOSYS)
> cpu_boot_legacy(...); /* Try legacy way */
>
> gic_raise_softirq(cpumask_of(cpu), 1);
>
> In board-/platform-specific code:
>
> static int platformX_do_idle(void)
> {
> /* tell platformX firmware to enter idle */
> return 0;
> }
>
> static int platformX_cpu_boot(int i)
> {
> /* tell platformX firmware to boot CPU i */
> return 0;
> }
>
> static const struct firmware_ops platformX_firmware_ops = {
> .do_idle = exynos_do_idle,
> .cpu_boot = exynos_cpu_boot,
> /* other operations not available on platformX */
> };
i am thinking the firmware_ops should be namespaced, some hardware has
firmware, firmware_ops should not be using a global namespace here.
>
> static void __init board_init_early(void)
> {
> register_firmware_ops(&platformX_firmware_ops);
> }
>
-barry
More information about the linux-arm-kernel
mailing list