[U-Boot] [PATCH v4 10/10] ARM: HYP/non-sec/PSCI: emit DT nodes
Marc Zyngier
marc.zyngier at arm.com
Wed May 7 08:38:44 CEST 2014
On Fri, May 02 2014 at 9:13:08 pm BST, Jon Loeliger <loeliger at gmail.com> wrote:
> On Sat, Apr 26, 2014 at 7:17 AM, Marc Zyngier <marc.zyngier at arm.com> wrote:
>
>> diff --git a/arch/arm/cpu/armv7/virt-dt.c b/arch/arm/cpu/armv7/virt-dt.c
>> new file mode 100644
>> index 0000000..0b0d6a7
>> --- /dev/null
>> +++ b/arch/arm/cpu/armv7/virt-dt.c
>
>> +
>> +static int fdt_psci(void *fdt)
>> +{
>> +#ifdef CONFIG_ARMV7_PSCI
>> + int nodeoff;
>> + int tmp;
>> +
>> + nodeoff = fdt_path_offset(fdt, "/cpus");
>> + if (nodeoff < 0) {
>> + printf("couldn't find /cpus\n");
>> + return nodeoff;
>> + }
>> +
>> + /* add 'enable-method = "psci"' to each cpu node */
>> + for (tmp = fdt_first_subnode(fdt, nodeoff);
>> + tmp >= 0;
>> + tmp = fdt_next_subnode(fdt, tmp)) {
>> + const struct fdt_property *prop;
>> + int len;
>> +
>> + prop = fdt_get_property(fdt, tmp, "device_type", &len);
>> + if (!prop)
>> + continue;
>> + if (len < 4)
>> + continue;
>> + if (strcmp(prop->data, "cpu"))
>> + continue;
>> +
>> + fdt_setprop_string(fdt, tmp, "enable-method", "psci");
>> + }
>> +
>> + nodeoff = fdt_path_offset(fdt, "/psci");
>> + if (nodeoff < 0) {
>> + nodeoff = fdt_path_offset(fdt, "/");
>> + if (nodeoff < 0)
>> + return nodeoff;
>> +
>> + nodeoff = fdt_add_subnode(fdt, nodeoff, "psci");
>> + if (nodeoff < 0)
>> + return nodeoff;
>> + }
>> +
>> + tmp = fdt_setprop_string(fdt, nodeoff, "compatible", "arm,psci");
>> + if (tmp)
>> + return tmp;
>> + tmp = fdt_setprop_string(fdt, nodeoff, "method", "smc");
>> + if (tmp)
>> + return tmp;
>> + tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_suspend",
>> ARM_PSCI_FN_CPU_SUSPEND);
>> + if (tmp)
>> + return tmp;
>> + tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_off", ARM_PSCI_FN_CPU_OFF);
>> + if (tmp)
>> + return tmp;
>> + tmp = fdt_setprop_u32(fdt, nodeoff, "cpu_on", ARM_PSCI_FN_CPU_ON);
>> + if (tmp)
>> + return tmp;
>> + tmp = fdt_setprop_u32(fdt, nodeoff, "migrate", ARM_PSCI_FN_MIGRATE);
>> + if (tmp)
>> + return tmp;
>> +#endif
>> + return 0;
>> +}
>>
Hi Jon,
> So, I wonder if it would be better to be a bit more selective or
> cautious about adding these nodes and properties. Specifically, if
> they are already present in the device tree itself, perhaps they
> should be honored and left alone?
Well, we have exactly two possibilities:
- PSCI is provided by the platform's firmware, and we'd better not touch
the DT at all.
- PSCI is provided U-Boot, and we *own* the PSCI related nodes.
I don't think there is an alternative to that, because either U-Boot
or the firmware will install its own secure vectors. The DT manipulation
code just reflect this situation.
> I understand that U-Boot gets to define what it implements, and that if
> the secure monitor code doesn't actually implement something, or for
> that matter *does* implement it, it makes sense for U-Boot to be able
> to state those facts in a device tree. However, the DTS may also be
> stating what it has implemented or willing to honor on the Linux side
> as well. So, yeah, there has to be agreement here.
>
> But who gets to make the final adjustment to the device tree? U-boot
> with this code, or the DTS author who may have hand coded specific
> wishes and loaded a specific device tree?
We could have an environment variable named
"i_know_this_looks_silly_but_nevertheless_please_pretty_please_leave_my_cpu_nodes_alone"?
M.
--
Without deviation from the norm, progress is not possible.
More information about the U-Boot
mailing list