[U-Boot] [PATCH v6 2/2] armv8/fsl-layerscape: fdt: fixup LS1043A rev1 MSI node
york sun
york.sun at nxp.com
Mon Nov 14 22:36:19 CET 2016
On 10/31/2016 08:35 PM, Wenbin song wrote:
> There are two types of msi node in kernel device tree, one is for
> LS1043A rev1.1 silicon, the other is for rev1.0.
This doesn't explain the difference between the two versions. I don't
see comments below either.
>
> According to revision number, fixup the msi node.
>
> Signed-off-by: Wenbin Song <wenbin.song at nxp.com>
> Signed-off-by: Mingkai Hu <mingkai.hu at nxp.com>
> ---
> Change in v6:
> None
> Change in v5:
> Fixup the msi node used on rev1.0 when running on rev1.1.
> ---
> arch/arm/cpu/armv8/fsl-layerscape/Kconfig | 3 +
> arch/arm/cpu/armv8/fsl-layerscape/fdt.c | 115 ++++++++++++++++++++++++++++++
> 2 files changed, 118 insertions(+)
>
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> index f415868..34ac867 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/Kconfig
> @@ -139,4 +139,7 @@ config HAS_FEATURE_GIC4K_ALIGN
> bool
> default y if ARCH_LS1043A
>
> +config HAS_FEATURE_ENHANCED_MSI
> + bool
> + default y if ARCH_LS1043A
> endmenu
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
> index 9936be1..e87ba19 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/fdt.c
> @@ -194,6 +194,118 @@ static void fdt_fixup_gic(void *blob)
> }
> #endif
>
> +#ifdef CONFIG_HAS_FEATURE_ENHANCED_MSI
> +static int _fdt_fixup_msi_subnode(void *blob, int offset, const char *name,
> + int irq_0, int irq_1, int rev)
> +{
> + int err, sub_offset, len;
> + u32 tmp[4][3];
> +
> + sub_offset = fdt_subnode_offset(blob, offset, name);
> + if (offset < 0) {
> + printf("WARNING: fdt_subnode_offset can't find %s: %s\n",
> + name, fdt_strerror(sub_offset));
> + return 0;
> + }
> +
> + tmp[0][0] = cpu_to_fdt32(0x0);
> + tmp[0][1] = cpu_to_fdt32(irq_0);
> + tmp[0][2] = cpu_to_fdt32(0x4);
> +
> + if (rev > REV1_0) {
> + tmp[1][0] = cpu_to_fdt32(0x0);
> + tmp[1][1] = cpu_to_fdt32(irq_1);
> + tmp[1][2] = cpu_to_fdt32(0x4);
> + tmp[2][0] = cpu_to_fdt32(0x0);
> + tmp[2][1] = cpu_to_fdt32(irq_1 + 1);
> + tmp[2][2] = cpu_to_fdt32(0x4);
> + tmp[3][0] = cpu_to_fdt32(0x0);
> + tmp[3][1] = cpu_to_fdt32(irq_1 + 2);
> + tmp[3][2] = cpu_to_fdt32(0x4);
> + len = sizeof(tmp);
Looks like you are adding three more interrupts. Some comments here
would be nice.
> + } else {
> + len = sizeof(tmp[0]);
> + }
> +
> + err = fdt_setprop(blob, sub_offset, "interrupts", tmp, len);
> + if (err < 0) {
> + printf("WARNING: fdt_setprop can't set %s from node %s: %s\n",
> + "interrupts", name, fdt_strerror(err));
> + return 0;
> + }
> +
> + return 1;
> +}
> +
> +static int _fdt_fixup_pci_msi(void *blob, const char *name, int rev)
> +{
> + int offset, len, err;
> + void *p;
> + int val;
> + u32 tmp[4][8];
> +
> + offset = fdt_path_offset(blob, name);
> + if (offset < 0) {
> + printf("WARNING: fdt_path_offset can't find path %s: %s\n",
> + name, fdt_strerror(offset));
> + return 0;
> + }
> +
> + p = (char *)fdt_getprop(blob, offset, "interrupt-map", &len);
> + if (!p || len != sizeof(tmp)) {
Is the length check always accurate here?
> + printf("WARNING: fdt_getprop can't get %s from node %s\n",
> + "interrupt-map", name);
> + return 0;
> + }
> +
> + memcpy((char *)tmp, p, len);
> +
> + val = fdt32_to_cpu(tmp[0][6]);
> + if (rev > REV1_0) {
> + tmp[1][6] = cpu_to_fdt32(val + 1);
> + tmp[2][6] = cpu_to_fdt32(val + 2);
> + tmp[3][6] = cpu_to_fdt32(val + 3);
> + } else {
> + tmp[1][6] = cpu_to_fdt32(val);
> + tmp[2][6] = cpu_to_fdt32(val);
> + tmp[3][6] = cpu_to_fdt32(val);
> + }
> +
> + err = fdt_setprop(blob, offset, "interrupt-map", tmp, sizeof(tmp));
> + if (err < 0) {
> + printf("WARNING: fdt_setprop can't set %s from node %s: %s.\n",
> + "interrupt-map", name, fdt_strerror(err));
> + return 0;
> + }
> + return 1;
> +}
> +
> +/* Fixup msi to v1_0*/
> +
This comment is not accurate. You are fixing msi for both 1.0 and 1.1.
York
More information about the U-Boot
mailing list