[U-Boot] [PATCH v2 0/7] LS1046A SMMU enabling patches

This patch series adds the required devices setup and device tree fixups for SMMU enablement on LS1046A chips. The approach taken tries to mimic the implementation of PAMU LIODN setup on booke powerpc.
First 4 patches contain some fixes and add some missing bits & pieces. Last 3 patches add the actual infrastructure for ICID setup, qman portal and fman ICID configuration.
Changes in v2: - drop CONFIG_SYS_ prefix from newly introduced defines in patch [1/7]
Laurentiu Tudor (7): armv8: fsl-layerscape: add missing register blocks base address defines armv8: ls1046a: advertise QMan v3 in configuration misc: fsl_portals: setup QMAN_BAR{E} also on ARM platforms armv8: fsl-layerscape: add missing debug stream ID armv8: ls1046a: initial icid setup support armv8: ls1046a: add icid setup for qman portals armv8: ls1046a: setup fman ports ICIDs and device tree
arch/arm/cpu/armv8/fsl-layerscape/Makefile | 1 + arch/arm/cpu/armv8/fsl-layerscape/icid.c | 193 ++++++++++++++++++ .../arm/cpu/armv8/fsl-layerscape/ls1046_ids.c | 75 +++++++ arch/arm/cpu/armv8/fsl-layerscape/soc.c | 3 + .../include/asm/arch-fsl-layerscape/config.h | 1 + .../asm/arch-fsl-layerscape/fsl_icid.h | 90 ++++++++ .../asm/arch-fsl-layerscape/fsl_portals.h | 23 +++ .../asm/arch-fsl-layerscape/immap_lsch2.h | 4 + .../asm/arch-fsl-layerscape/stream_id_lsch2.h | 1 + board/freescale/ls1046aqds/ls1046aqds.c | 2 + board/freescale/ls1046ardb/ls1046ardb.c | 3 + drivers/misc/fsl_portals.c | 50 ++++- 12 files changed, 437 insertions(+), 9 deletions(-) create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/icid.c create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c create mode 100644 arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h create mode 100644 arch/arm/include/asm/arch-fsl-layerscape/fsl_portals.h

Add defines for the edma and qdma register block base addresses.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h index 5b4767e0fe..644a16dd30 100644 --- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h +++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h @@ -88,8 +88,12 @@
#define LPUART_BASE (CONFIG_SYS_IMMR + 0x01950000)
+#define EDMA_BASE_ADDR (CONFIG_SYS_IMMR + 0x01c00000) + #define AHCI_BASE_ADDR (CONFIG_SYS_IMMR + 0x02200000)
+#define QDMA_BASE_ADDR (CONFIG_SYS_IMMR + 0x07380000) + #define CONFIG_SYS_PCIE1_PHYS_ADDR 0x4000000000ULL #define CONFIG_SYS_PCIE2_PHYS_ADDR 0x4800000000ULL #define CONFIG_SYS_PCIE3_PHYS_ADDR 0x5000000000ULL

The QMan IP block in this SoC is version 3.2 so advertise this in the SoC configuration header.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- arch/arm/include/asm/arch-fsl-layerscape/config.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/config.h b/arch/arm/include/asm/arch-fsl-layerscape/config.h index 23faffd9fc..8a05148136 100644 --- a/arch/arm/include/asm/arch-fsl-layerscape/config.h +++ b/arch/arm/include/asm/arch-fsl-layerscape/config.h @@ -257,6 +257,7 @@
#elif defined(CONFIG_ARCH_LS1046A) #define CONFIG_SYS_FMAN_V3 +#define CONFIG_SYS_FSL_QMAN_V3 #define CONFIG_SYS_NUM_FMAN 1 #define CONFIG_SYS_NUM_FM1_DTSEC 8 #define CONFIG_SYS_NUM_FM1_10GEC 2

QMAN_BAR{E} register setup was disabled on ARM platforms, however the register does need to be set. Add code that sets it up on ARMs.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- drivers/misc/fsl_portals.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/misc/fsl_portals.c b/drivers/misc/fsl_portals.c index 7c22b8d209..5b1233740b 100644 --- a/drivers/misc/fsl_portals.c +++ b/drivers/misc/fsl_portals.c @@ -24,14 +24,19 @@ void setup_qbman_portals(void) CONFIG_SYS_BMAN_SWP_ISDR_REG; void __iomem *qpaddr = (void *)CONFIG_SYS_QMAN_CINH_BASE + CONFIG_SYS_QMAN_SWP_ISDR_REG; -#ifdef CONFIG_PPC struct ccsr_qman *qman = (void *)CONFIG_SYS_FSL_QMAN_ADDR;
/* Set the Qman initiator BAR to match the LAW (for DQRR stashing) */ +#ifdef CONFIG_PPC32 #ifdef CONFIG_PHYS_64BIT out_be32(&qman->qcsp_bare, (u32)(CONFIG_SYS_QMAN_MEM_PHYS >> 32)); #endif out_be32(&qman->qcsp_bar, (u32)CONFIG_SYS_QMAN_MEM_PHYS); +#else +#ifdef CONFIG_PHYS_64BIT + out_be32(&qman->qcsp_bare, (u32)(CONFIG_SYS_QMAN_MEM_BASE >> 32)); +#endif + out_be32(&qman->qcsp_bar, (u32)CONFIG_SYS_QMAN_MEM_BASE); #endif #ifdef CONFIG_FSL_CORENET int i;

-----Original Message----- From: upstream-release-bounces@linux.freescale.net [mailto:upstream- release-bounces@linux.freescale.net] On Behalf Of Laurentiu Tudor Sent: Tuesday, July 3, 2018 5:42 PM To: York Sun york.sun@nxp.com; Prabhakar Kushwaha prabhakar.kushwaha@nxp.com; u-boot@lists.denx.de Cc: Laurentiu Tudor laurentiu.tudor@nxp.com Subject: [upstream-release] [PATCH v2 3/7] misc: fsl_portals: setup QMAN_BAR{E} also on ARM platforms
QMAN_BAR{E} register setup was disabled on ARM platforms, however the register does need to be set. Add code that sets it up on ARMs.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com
drivers/misc/fsl_portals.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/misc/fsl_portals.c b/drivers/misc/fsl_portals.c index 7c22b8d209..5b1233740b 100644 --- a/drivers/misc/fsl_portals.c +++ b/drivers/misc/fsl_portals.c @@ -24,14 +24,19 @@ void setup_qbman_portals(void) CONFIG_SYS_BMAN_SWP_ISDR_REG; void __iomem *qpaddr = (void *)CONFIG_SYS_QMAN_CINH_BASE + CONFIG_SYS_QMAN_SWP_ISDR_REG; -#ifdef CONFIG_PPC struct ccsr_qman *qman = (void *)CONFIG_SYS_FSL_QMAN_ADDR;
/* Set the Qman initiator BAR to match the LAW (for DQRR stashing) */ +#ifdef CONFIG_PPC32 #ifdef CONFIG_PHYS_64BIT out_be32(&qman->qcsp_bare, (u32)(CONFIG_SYS_QMAN_MEM_PHYS >> 32)); #endif out_be32(&qman->qcsp_bar, (u32)CONFIG_SYS_QMAN_MEM_PHYS); +#else +#ifdef CONFIG_PHYS_64BIT
- out_be32(&qman->qcsp_bare,
(u32)(CONFIG_SYS_QMAN_MEM_BASE >> 32)); +#endif
- out_be32(&qman->qcsp_bar,
(u32)CONFIG_SYS_QMAN_MEM_BASE); #endif
Can we have same hash define name for PPC and non-PPC? We do not need then if-else
Thanks -Bharat
#ifdef CONFIG_FSL_CORENET int i; -- 2.17.1
upstream-release mailing list upstream-release@linux.freescale.net https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flinu x.freescale.net%2Fmailman%2Flistinfo%2Fupstream- release&data=02%7C01%7Cbharat.bhushan%40nxp.com%7Ca0e936ecc69f40 6be68208d5e0de4f7b%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7 C636662167788206253&sdata=WGcw1oH3ktggbybsoMllewQU5Uvbyv8OWa9 nBJipK70%3D&reserved=0

Hi Bharat,
Thanks for the review! Comments inline.
On 03.07.2018 16:38, Bharat Bhushan wrote:
-----Original Message----- From: upstream-release-bounces@linux.freescale.net [mailto:upstream- release-bounces@linux.freescale.net] On Behalf Of Laurentiu Tudor Sent: Tuesday, July 3, 2018 5:42 PM To: York Sun york.sun@nxp.com; Prabhakar Kushwaha prabhakar.kushwaha@nxp.com; u-boot@lists.denx.de Cc: Laurentiu Tudor laurentiu.tudor@nxp.com Subject: [upstream-release] [PATCH v2 3/7] misc: fsl_portals: setup QMAN_BAR{E} also on ARM platforms
QMAN_BAR{E} register setup was disabled on ARM platforms, however the register does need to be set. Add code that sets it up on ARMs.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com
drivers/misc/fsl_portals.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/misc/fsl_portals.c b/drivers/misc/fsl_portals.c index 7c22b8d209..5b1233740b 100644 --- a/drivers/misc/fsl_portals.c +++ b/drivers/misc/fsl_portals.c @@ -24,14 +24,19 @@ void setup_qbman_portals(void) CONFIG_SYS_BMAN_SWP_ISDR_REG; void __iomem *qpaddr = (void *)CONFIG_SYS_QMAN_CINH_BASE + CONFIG_SYS_QMAN_SWP_ISDR_REG; -#ifdef CONFIG_PPC struct ccsr_qman *qman = (void *)CONFIG_SYS_FSL_QMAN_ADDR;
/* Set the Qman initiator BAR to match the LAW (for DQRR stashing) */ +#ifdef CONFIG_PPC32 #ifdef CONFIG_PHYS_64BIT out_be32(&qman->qcsp_bare, (u32)(CONFIG_SYS_QMAN_MEM_PHYS >> 32)); #endif out_be32(&qman->qcsp_bar, (u32)CONFIG_SYS_QMAN_MEM_PHYS); +#else +#ifdef CONFIG_PHYS_64BIT
- out_be32(&qman->qcsp_bare,
(u32)(CONFIG_SYS_QMAN_MEM_BASE >> 32)); +#endif
- out_be32(&qman->qcsp_bar,
(u32)CONFIG_SYS_QMAN_MEM_BASE); #endif
Can we have same hash define name for PPC and non-PPC? We do not need then if-else
Hmm, good point. I could use CONFIG_SYS_QMAN_MEM_PHYS which is also defined on ls104x [1] but seems to be incorrectly set ... maybe copypaste error from powerpc? Another thing i noticed is that it's not actually used at all on ARMs. I could rewrite the patch to fix the define and simplify the code above, if there aren't any objections.
[1] #define CONFIG_SYS_QMAN_MEM_PHYS (0xf00000000ull + CONFIG_SYS_QMAN_MEM_BASE)
--- Best Regards, Laurentiu
#ifdef CONFIG_FSL_CORENET int i; -- 2.17.1
upstream-release mailing list upstream-release@linux.freescale.net https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flinu x.freescale.net%2Fmailman%2Flistinfo%2Fupstream- release&data=02%7C01%7Cbharat.bhushan%40nxp.com%7Ca0e936ecc69f40 6be68208d5e0de4f7b%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7 C636662167788206253&sdata=WGcw1oH3ktggbybsoMllewQU5Uvbyv8OWa9 nBJipK70%3D&reserved=0

Add a define with a value for the missing debug stream ID.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- arch/arm/include/asm/arch-fsl-layerscape/stream_id_lsch2.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/stream_id_lsch2.h b/arch/arm/include/asm/arch-fsl-layerscape/stream_id_lsch2.h index 61c6e533c6..1b02d484d9 100644 --- a/arch/arm/include/asm/arch-fsl-layerscape/stream_id_lsch2.h +++ b/arch/arm/include/asm/arch-fsl-layerscape/stream_id_lsch2.h @@ -50,6 +50,7 @@ #define FSL_QDMA_STREAM_ID 7 #define FSL_EDMA_STREAM_ID 8 #define FSL_ETR_STREAM_ID 9 +#define FSL_DEBUG_STREAM_ID 10
/* PCI - programmed in PEXn_LUT */ #define FSL_PEX_STREAM_ID_START 11

Add infrastructure for ICID setup and device tree fixup on ARM platforms. This include basic ICID setup for several devices.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- arch/arm/cpu/armv8/fsl-layerscape/Makefile | 1 + arch/arm/cpu/armv8/fsl-layerscape/icid.c | 111 ++++++++++++++++++ .../arm/cpu/armv8/fsl-layerscape/ls1046_ids.c | 29 +++++ arch/arm/cpu/armv8/fsl-layerscape/soc.c | 3 + .../asm/arch-fsl-layerscape/fsl_icid.h | 80 +++++++++++++ board/freescale/ls1046aqds/ls1046aqds.c | 2 + board/freescale/ls1046ardb/ls1046ardb.c | 3 + 7 files changed, 229 insertions(+) create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/icid.c create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c create mode 100644 arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Makefile b/arch/arm/cpu/armv8/fsl-layerscape/Makefile index 1e9e4680fe..5d6f68aad6 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/Makefile +++ b/arch/arm/cpu/armv8/fsl-layerscape/Makefile @@ -37,6 +37,7 @@ endif
ifneq ($(CONFIG_ARCH_LS1046A),) obj-$(CONFIG_SYS_HAS_SERDES) += ls1046a_serdes.o +obj-y += icid.o ls1046_ids.o endif
ifneq ($(CONFIG_ARCH_LS1088A),) diff --git a/arch/arm/cpu/armv8/fsl-layerscape/icid.c b/arch/arm/cpu/armv8/fsl-layerscape/icid.c new file mode 100644 index 0000000000..8694bd6fa1 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/icid.c @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2018 NXP + */ + +#include <common.h> +#include <linux/libfdt.h> +#include <fdt_support.h> + +#include <asm/io.h> +#include <asm/processor.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> + +static void set_icid(struct icid_id_table *tbl, int size) +{ + int i; + + for (i = 0; i < size; i++) + out_be32((u32 *)(tbl[i].reg_addr), tbl[i].reg); +} + +void set_icids(void) +{ + /* setup general icid offsets */ + set_icid(icid_tbl, icid_tbl_sz); +} + +int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids) +{ + int i, ret; + u32 prop[8]; + + for (i = 0; i < num_ids; i++) { + prop[i * 2] = cpu_to_fdt32(smmu_ph); + prop[i * 2 + 1] = cpu_to_fdt32(ids[i]); + } + ret = fdt_setprop(blob, off, "iommus", + prop, sizeof(u32) * num_ids * 2); + if (ret > 0) { + printf("WARNING unable to set iommus: %s\n", fdt_strerror(off)); + return off; + } + ret = fdt_setprop_empty(blob, off, "dma-coherent"); + if (ret > 0) { + printf("WARNING unable to set dma-coherent: %s\n", + fdt_strerror(off)); + return off; + } + + return 0; +} + +int fdt_fixup_icid_tbl(void *blob, int smmu_ph, + struct icid_id_table *tbl, int size) +{ + int i, err, off; + + for (i = 0; i < size; i++) { + if (!tbl[i].compat) + continue; + + off = fdt_node_offset_by_compat_reg(blob, + tbl[i].compat, + tbl[i].compat_addr); + if (off > 0) { + err = fdt_set_iommu_prop(blob, off, smmu_ph, + &tbl[i].id, 1); + if (err) + return err; + } else { + printf("WARNING could not find node %s: %s.\n", + tbl[i].compat, fdt_strerror(off)); + } + } + + return 0; +} + +int fdt_get_smmu_phandle(void *blob) +{ + int noff, smmu_ph; + + noff = fdt_node_offset_by_compatible(blob, -1, "arm,mmu-500"); + if (noff < 0) { + printf("WARNING failed to get smmu node: %s\n", + fdt_strerror(noff)); + return noff; + } + + smmu_ph = fdt_get_phandle(blob, noff); + if (!smmu_ph) { + smmu_ph = fdt_create_phandle(blob, noff); + if (!smmu_ph) { + printf("WARNING failed to get smmu phandle\n"); + return -1; + } + } + + return smmu_ph; +} + +void fdt_fixup_icid(void *blob) +{ + int smmu_ph; + + smmu_ph = fdt_get_smmu_phandle(blob); + if (smmu_ph < 0) + return; + + fdt_fixup_icid_tbl(blob, smmu_ph, icid_tbl, icid_tbl_sz); +} diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c new file mode 100644 index 0000000000..d9e03fcb89 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2018 NXP + */ + +#include <common.h> +#include <asm/arch-fsl-layerscape/immap_lsch2.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> + +struct icid_id_table icid_tbl[] = { +#ifdef CONFIG_SYS_DPAA_QBMAN + SET_QMAN_ICID(FSL_DPAA1_STREAM_ID_START), + SET_BMAN_ICID(FSL_DPAA1_STREAM_ID_START + 1), +#endif + + SET_SDHC_ICID(FSL_SDHC_STREAM_ID), + + SET_USB_ICID(1, "snps,dwc3", FSL_USB1_STREAM_ID), + SET_USB_ICID(2, "snps,dwc3", FSL_USB2_STREAM_ID), + SET_USB_ICID(3, "snps,dwc3", FSL_USB3_STREAM_ID), + + SET_SATA_ICID(FSL_SATA_STREAM_ID), + SET_QDMA_ICID(FSL_QDMA_STREAM_ID), + SET_EDMA_ICID(FSL_EDMA_STREAM_ID), + SET_ETR_ICID(FSL_ETR_STREAM_ID), + SET_DEBUG_ICID(FSL_DEBUG_STREAM_ID), +}; + +int icid_tbl_sz = ARRAY_SIZE(icid_tbl); diff --git a/arch/arm/cpu/armv8/fsl-layerscape/soc.c b/arch/arm/cpu/armv8/fsl-layerscape/soc.c index bfd663942a..5c5df5b7ef 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/soc.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/soc.c @@ -13,6 +13,7 @@ #include <asm/io.h> #include <asm/global_data.h> #include <asm/arch-fsl-layerscape/config.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> #ifdef CONFIG_LAYERSCAPE_NS_ACCESS #include <fsl_csu.h> #endif @@ -674,6 +675,8 @@ void fsl_lsch2_early_init_f(void) erratum_a009798(); erratum_a008997(); erratum_a009007(); + + set_icids(); } #endif
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h new file mode 100644 index 0000000000..cf0f3d1121 --- /dev/null +++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright 2018 NXP + */ + +#ifndef _FSL_ICID_H_ +#define _FSL_ICID_H_ + +#include <asm/types.h> +#include <fsl_qbman.h> + +struct icid_id_table { + const char *compat; + u32 id; + u32 reg; + phys_addr_t compat_addr; + phys_addr_t reg_addr; +}; + +u32 get_ppid_icid(int ppid_tbl_idx, int ppid); +int fdt_get_smmu_phandle(void *blob); +int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids); +void set_icids(void); +void fdt_fixup_icid(void *blob); + +#define SET_ICID_ENTRY(name, idA, regA, addr, compataddr) \ + { .compat = name, \ + .id = idA, \ + .reg = regA, \ + .compat_addr = compataddr, \ + .reg_addr = addr, \ + } + +#define SET_SCFG_ICID(compat, icid, name, compataddr) \ + SET_ICID_ENTRY(compat, icid, (((icid) << 24) | (1 << 23)), \ + offsetof(struct ccsr_scfg, name) + CONFIG_SYS_FSL_SCFG_ADDR, \ + compataddr) + +#define SET_USB_ICID(usb_num, compat, icid) \ + SET_SCFG_ICID(compat, icid, usb##usb_num##_icid,\ + CONFIG_SYS_XHCI_USB##usb_num##_ADDR) + +#define SET_SATA_ICID(icid) \ + SET_SCFG_ICID("fsl,ls1046a-ahci", icid, sata_icid,\ + AHCI_BASE_ADDR) + +#define SET_SDHC_ICID(icid) \ + SET_SCFG_ICID("fsl,esdhc", icid, sdhc_icid,\ + CONFIG_SYS_FSL_ESDHC_ADDR) + +#define SET_QDMA_ICID(icid) \ + SET_SCFG_ICID("fsl,ls1046a-qdma", icid, dma_icid,\ + QDMA_BASE_ADDR) + +#define SET_EDMA_ICID(icid) \ + SET_SCFG_ICID("fsl,vf610-edma", icid, edma_icid,\ + EDMA_BASE_ADDR) + +#define SET_ETR_ICID(icid) \ + SET_SCFG_ICID(NULL, icid, etr_icid, 0) + +#define SET_DEBUG_ICID(icid) \ + SET_SCFG_ICID(NULL, icid, debug_icid, 0) + +#define SET_QMAN_ICID(icid) \ + SET_ICID_ENTRY("fsl,qman", icid, icid, \ + offsetof(struct ccsr_qman, liodnr) + \ + CONFIG_SYS_FSL_QMAN_ADDR, \ + CONFIG_SYS_FSL_QMAN_ADDR) + +#define SET_BMAN_ICID(icid) \ + SET_ICID_ENTRY("fsl,bman", icid, icid, \ + offsetof(struct ccsr_bman, liodnr) + \ + CONFIG_SYS_FSL_BMAN_ADDR, \ + CONFIG_SYS_FSL_BMAN_ADDR) + +extern struct icid_id_table icid_tbl[]; +extern int icid_tbl_sz; + +#endif diff --git a/board/freescale/ls1046aqds/ls1046aqds.c b/board/freescale/ls1046aqds/ls1046aqds.c index b765f07f85..072f8c37a5 100644 --- a/board/freescale/ls1046aqds/ls1046aqds.c +++ b/board/freescale/ls1046aqds/ls1046aqds.c @@ -309,6 +309,8 @@ int ft_board_setup(void *blob, bd_t *bd) fdt_fixup_board_enet(blob); #endif
+ fdt_fixup_icid(blob); + reg = QIXIS_READ(brdcfg[0]); reg = (reg & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
diff --git a/board/freescale/ls1046ardb/ls1046ardb.c b/board/freescale/ls1046ardb/ls1046ardb.c index feb5c2448a..0a73fe859d 100644 --- a/board/freescale/ls1046ardb/ls1046ardb.c +++ b/board/freescale/ls1046ardb/ls1046ardb.c @@ -11,6 +11,7 @@ #include <asm/arch/fsl_serdes.h> #include <asm/arch/ppa.h> #include <asm/arch/soc.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> #include <hwconfig.h> #include <ahci.h> #include <mmc.h> @@ -174,6 +175,8 @@ int ft_board_setup(void *blob, bd_t *bd) fdt_fixup_fman_ethernet(blob); #endif
+ fdt_fixup_icid(blob); + return 0; } #endif

-----Original Message----- From: upstream-release-bounces@linux.freescale.net [mailto:upstream- release-bounces@linux.freescale.net] On Behalf Of Laurentiu Tudor Sent: Tuesday, July 3, 2018 5:42 PM To: York Sun york.sun@nxp.com; Prabhakar Kushwaha prabhakar.kushwaha@nxp.com; u-boot@lists.denx.de Cc: Laurentiu Tudor laurentiu.tudor@nxp.com Subject: [upstream-release] [PATCH v2 5/7] armv8: ls1046a: initial icid setup support
Add infrastructure for ICID setup and device tree fixup on ARM platforms. This include basic ICID setup for several devices.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com
arch/arm/cpu/armv8/fsl-layerscape/Makefile | 1 + arch/arm/cpu/armv8/fsl-layerscape/icid.c | 111 ++++++++++++++++++ .../arm/cpu/armv8/fsl-layerscape/ls1046_ids.c | 29 +++++ arch/arm/cpu/armv8/fsl-layerscape/soc.c | 3 + .../asm/arch-fsl-layerscape/fsl_icid.h | 80 +++++++++++++ board/freescale/ls1046aqds/ls1046aqds.c | 2 + board/freescale/ls1046ardb/ls1046ardb.c | 3 + 7 files changed, 229 insertions(+) create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/icid.c create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c create mode 100644 arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Makefile b/arch/arm/cpu/armv8/fsl-layerscape/Makefile index 1e9e4680fe..5d6f68aad6 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/Makefile +++ b/arch/arm/cpu/armv8/fsl-layerscape/Makefile @@ -37,6 +37,7 @@ endif
ifneq ($(CONFIG_ARCH_LS1046A),) obj-$(CONFIG_SYS_HAS_SERDES) += ls1046a_serdes.o +obj-y += icid.o ls1046_ids.o endif
ifneq ($(CONFIG_ARCH_LS1088A),) diff --git a/arch/arm/cpu/armv8/fsl-layerscape/icid.c b/arch/arm/cpu/armv8/fsl-layerscape/icid.c new file mode 100644 index 0000000000..8694bd6fa1 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/icid.c @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright 2018 NXP
- */
+#include <common.h> +#include <linux/libfdt.h> +#include <fdt_support.h>
+#include <asm/io.h> +#include <asm/processor.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h>
+static void set_icid(struct icid_id_table *tbl, int size) +{
- int i;
- for (i = 0; i < size; i++)
out_be32((u32 *)(tbl[i].reg_addr), tbl[i].reg);
+}
+void set_icids(void) +{
- /* setup general icid offsets */
- set_icid(icid_tbl, icid_tbl_sz);
Icid_tbl[] is currently defined for ls1046 but this code is generic and later can be used for ls1043 later. We can let caller provide table pointer and size.
+}
+int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids) +{
- int i, ret;
- u32 prop[8];
- for (i = 0; i < num_ids; i++) {
prop[i * 2] = cpu_to_fdt32(smmu_ph);
prop[i * 2 + 1] = cpu_to_fdt32(ids[i]);
- }
- ret = fdt_setprop(blob, off, "iommus",
prop, sizeof(u32) * num_ids * 2);
- if (ret > 0) {
printf("WARNING unable to set iommus: %s\n",
fdt_strerror(off));
return off;
- }
- ret = fdt_setprop_empty(blob, off, "dma-coherent");
- if (ret > 0) {
printf("WARNING unable to set dma-coherent: %s\n",
fdt_strerror(off));
return off;
- }
- return 0;
+}
+int fdt_fixup_icid_tbl(void *blob, int smmu_ph,
struct icid_id_table *tbl, int size)
What we set in device tree is stream-id, while stream-id is = [PL: BMT : ICID]; I think we should use stream-id to the point when we are patching device-tree and value set in h/w. We can say PL = BMT = 0 for now and leave space for setting this in future for any specific device for any platform?
+{
- int i, err, off;
- for (i = 0; i < size; i++) {
if (!tbl[i].compat)
continue;
off = fdt_node_offset_by_compat_reg(blob,
tbl[i].compat,
tbl[i].compat_addr);
if (off > 0) {
err = fdt_set_iommu_prop(blob, off, smmu_ph,
&tbl[i].id, 1);
if (err)
return err;
} else {
printf("WARNING could not find node %s: %s.\n",
tbl[i].compat, fdt_strerror(off));
}
- }
- return 0;
+}
+int fdt_get_smmu_phandle(void *blob) +{
- int noff, smmu_ph;
- noff = fdt_node_offset_by_compatible(blob, -1, "arm,mmu-500");
- if (noff < 0) {
printf("WARNING failed to get smmu node: %s\n",
fdt_strerror(noff));
return noff;
- }
- smmu_ph = fdt_get_phandle(blob, noff);
- if (!smmu_ph) {
smmu_ph = fdt_create_phandle(blob, noff);
if (!smmu_ph) {
printf("WARNING failed to get smmu phandle\n");
return -1;
}
- }
- return smmu_ph;
+}
+void fdt_fixup_icid(void *blob) +{
- int smmu_ph;
- smmu_ph = fdt_get_smmu_phandle(blob);
- if (smmu_ph < 0)
return;
- fdt_fixup_icid_tbl(blob, smmu_ph, icid_tbl, icid_tbl_sz);
+} diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c new file mode 100644 index 0000000000..d9e03fcb89 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright 2018 NXP
- */
+#include <common.h> +#include <asm/arch-fsl-layerscape/immap_lsch2.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h>
+struct icid_id_table icid_tbl[] = { +#ifdef CONFIG_SYS_DPAA_QBMAN
- SET_QMAN_ICID(FSL_DPAA1_STREAM_ID_START),
- SET_BMAN_ICID(FSL_DPAA1_STREAM_ID_START + 1),
+#endif
- SET_SDHC_ICID(FSL_SDHC_STREAM_ID),
- SET_USB_ICID(1, "snps,dwc3", FSL_USB1_STREAM_ID),
- SET_USB_ICID(2, "snps,dwc3", FSL_USB2_STREAM_ID),
- SET_USB_ICID(3, "snps,dwc3", FSL_USB3_STREAM_ID),
Last parameter is STREAM_ID ?
- SET_SATA_ICID(FSL_SATA_STREAM_ID),
- SET_QDMA_ICID(FSL_QDMA_STREAM_ID),
- SET_EDMA_ICID(FSL_EDMA_STREAM_ID),
- SET_ETR_ICID(FSL_ETR_STREAM_ID),
- SET_DEBUG_ICID(FSL_DEBUG_STREAM_ID),
+};
+int icid_tbl_sz = ARRAY_SIZE(icid_tbl); diff --git a/arch/arm/cpu/armv8/fsl-layerscape/soc.c b/arch/arm/cpu/armv8/fsl-layerscape/soc.c index bfd663942a..5c5df5b7ef 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/soc.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/soc.c @@ -13,6 +13,7 @@ #include <asm/io.h> #include <asm/global_data.h> #include <asm/arch-fsl-layerscape/config.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> #ifdef CONFIG_LAYERSCAPE_NS_ACCESS #include <fsl_csu.h> #endif @@ -674,6 +675,8 @@ void fsl_lsch2_early_init_f(void) erratum_a009798(); erratum_a008997(); erratum_a009007();
- set_icids();
} #endif
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h new file mode 100644 index 0000000000..cf0f3d1121 --- /dev/null +++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/*
- Copyright 2018 NXP
- */
+#ifndef _FSL_ICID_H_ +#define _FSL_ICID_H_
+#include <asm/types.h> +#include <fsl_qbman.h>
+struct icid_id_table {
- const char *compat;
- u32 id;
- u32 reg;
- phys_addr_t compat_addr;
- phys_addr_t reg_addr;
+};
+u32 get_ppid_icid(int ppid_tbl_idx, int ppid); +int fdt_get_smmu_phandle(void *blob); +int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids); +void set_icids(void); +void fdt_fixup_icid(void *blob);
+#define SET_ICID_ENTRY(name, idA, regA, addr, compataddr) \
- { .compat = name, \
.id = idA, \
.reg = regA, \
.compat_addr = compataddr, \
.reg_addr = addr, \
- }
+#define SET_SCFG_ICID(compat, icid, name, compataddr) \
- SET_ICID_ENTRY(compat, icid, (((icid) << 24) | (1 << 23)), \
offsetof(struct ccsr_scfg, name) +
CONFIG_SYS_FSL_SCFG_ADDR, \
compataddr)
+#define SET_USB_ICID(usb_num, compat, icid) \
And this and below say "icid" as last parameter.
- SET_SCFG_ICID(compat, icid, usb##usb_num##_icid,\
CONFIG_SYS_XHCI_USB##usb_num##_ADDR)
+#define SET_SATA_ICID(icid) \
- SET_SCFG_ICID("fsl,ls1046a-ahci", icid, sata_icid,\
AHCI_BASE_ADDR)
+#define SET_SDHC_ICID(icid) \
- SET_SCFG_ICID("fsl,esdhc", icid, sdhc_icid,\
CONFIG_SYS_FSL_ESDHC_ADDR)
+#define SET_QDMA_ICID(icid) \
- SET_SCFG_ICID("fsl,ls1046a-qdma", icid, dma_icid,\
This is generic code and we should be passing "fsl,ls1046a-qdma"
QDMA_BASE_ADDR)
+#define SET_EDMA_ICID(icid) \
- SET_SCFG_ICID("fsl,vf610-edma", icid, edma_icid,\
EDMA_BASE_ADDR)
+#define SET_ETR_ICID(icid) \
- SET_SCFG_ICID(NULL, icid, etr_icid, 0)
+#define SET_DEBUG_ICID(icid) \
- SET_SCFG_ICID(NULL, icid, debug_icid, 0)
+#define SET_QMAN_ICID(icid) \
- SET_ICID_ENTRY("fsl,qman", icid, icid, \
offsetof(struct ccsr_qman, liodnr) + \
CONFIG_SYS_FSL_QMAN_ADDR, \
CONFIG_SYS_FSL_QMAN_ADDR)
+#define SET_BMAN_ICID(icid) \
- SET_ICID_ENTRY("fsl,bman", icid, icid, \
offsetof(struct ccsr_bman, liodnr) + \
CONFIG_SYS_FSL_BMAN_ADDR, \
CONFIG_SYS_FSL_BMAN_ADDR)
+extern struct icid_id_table icid_tbl[]; +extern int icid_tbl_sz;
+#endif diff --git a/board/freescale/ls1046aqds/ls1046aqds.c b/board/freescale/ls1046aqds/ls1046aqds.c index b765f07f85..072f8c37a5 100644 --- a/board/freescale/ls1046aqds/ls1046aqds.c +++ b/board/freescale/ls1046aqds/ls1046aqds.c @@ -309,6 +309,8 @@ int ft_board_setup(void *blob, bd_t *bd) fdt_fixup_board_enet(blob); #endif
- fdt_fixup_icid(blob);
- reg = QIXIS_READ(brdcfg[0]); reg = (reg & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
diff --git a/board/freescale/ls1046ardb/ls1046ardb.c b/board/freescale/ls1046ardb/ls1046ardb.c index feb5c2448a..0a73fe859d 100644 --- a/board/freescale/ls1046ardb/ls1046ardb.c +++ b/board/freescale/ls1046ardb/ls1046ardb.c @@ -11,6 +11,7 @@ #include <asm/arch/fsl_serdes.h> #include <asm/arch/ppa.h> #include <asm/arch/soc.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> #include <hwconfig.h> #include <ahci.h> #include <mmc.h> @@ -174,6 +175,8 @@ int ft_board_setup(void *blob, bd_t *bd) fdt_fixup_fman_ethernet(blob); #endif
- fdt_fixup_icid(blob);
- return 0;
}
#endif
2.17.1
upstream-release mailing list upstream-release@linux.freescale.net https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Flinu x.freescale.net%2Fmailman%2Flistinfo%2Fupstream- release&data=02%7C01%7Cbharat.bhushan%40nxp.com%7C99390ae37 a434ff9e50208d5e0de5280%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C 0%7C636662167830150346&sdata=696TPrzzqOGvXiPyYNk3CsbA%2FQKO vcp0Pk3%2BY5V1BCY%3D&reserved=0

Hi Bharat,
Thanks for the review! Comments inline.
On 03.07.2018 17:09, Bharat Bhushan wrote:
-----Original Message----- From: upstream-release-bounces@linux.freescale.net [mailto:upstream- release-bounces@linux.freescale.net] On Behalf Of Laurentiu Tudor Sent: Tuesday, July 3, 2018 5:42 PM To: York Sun york.sun@nxp.com; Prabhakar Kushwaha prabhakar.kushwaha@nxp.com; u-boot@lists.denx.de Cc: Laurentiu Tudor laurentiu.tudor@nxp.com Subject: [upstream-release] [PATCH v2 5/7] armv8: ls1046a: initial icid setup support
Add infrastructure for ICID setup and device tree fixup on ARM platforms. This include basic ICID setup for several devices.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com
arch/arm/cpu/armv8/fsl-layerscape/Makefile | 1 + arch/arm/cpu/armv8/fsl-layerscape/icid.c | 111 ++++++++++++++++++ .../arm/cpu/armv8/fsl-layerscape/ls1046_ids.c | 29 +++++ arch/arm/cpu/armv8/fsl-layerscape/soc.c | 3 + .../asm/arch-fsl-layerscape/fsl_icid.h | 80 +++++++++++++ board/freescale/ls1046aqds/ls1046aqds.c | 2 + board/freescale/ls1046ardb/ls1046ardb.c | 3 + 7 files changed, 229 insertions(+) create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/icid.c create mode 100644 arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c create mode 100644 arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Makefile b/arch/arm/cpu/armv8/fsl-layerscape/Makefile index 1e9e4680fe..5d6f68aad6 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/Makefile +++ b/arch/arm/cpu/armv8/fsl-layerscape/Makefile @@ -37,6 +37,7 @@ endif
ifneq ($(CONFIG_ARCH_LS1046A),) obj-$(CONFIG_SYS_HAS_SERDES) += ls1046a_serdes.o +obj-y += icid.o ls1046_ids.o endif
ifneq ($(CONFIG_ARCH_LS1088A),) diff --git a/arch/arm/cpu/armv8/fsl-layerscape/icid.c b/arch/arm/cpu/armv8/fsl-layerscape/icid.c new file mode 100644 index 0000000000..8694bd6fa1 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/icid.c @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright 2018 NXP
- */
+#include <common.h> +#include <linux/libfdt.h> +#include <fdt_support.h>
+#include <asm/io.h> +#include <asm/processor.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h>
+static void set_icid(struct icid_id_table *tbl, int size) +{
- int i;
- for (i = 0; i < size; i++)
out_be32((u32 *)(tbl[i].reg_addr), tbl[i].reg);
+}
+void set_icids(void) +{
- /* setup general icid offsets */
- set_icid(icid_tbl, icid_tbl_sz);
Icid_tbl[] is currently defined for ls1046 but this code is generic and later can be used for ls1043 later. We can let caller provide table pointer and size.
Right, but "icid_tbl" is defined in the SoC specific ls1046_ids.c file. I think that if we add the corresponding ls1043_ids.c this code can be reused as is.
+}
+int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids) +{
- int i, ret;
- u32 prop[8];
- for (i = 0; i < num_ids; i++) {
prop[i * 2] = cpu_to_fdt32(smmu_ph);
prop[i * 2 + 1] = cpu_to_fdt32(ids[i]);
- }
- ret = fdt_setprop(blob, off, "iommus",
prop, sizeof(u32) * num_ids * 2);
- if (ret > 0) {
printf("WARNING unable to set iommus: %s\n",
fdt_strerror(off));
return off;
- }
- ret = fdt_setprop_empty(blob, off, "dma-coherent");
- if (ret > 0) {
printf("WARNING unable to set dma-coherent: %s\n",
fdt_strerror(off));
return off;
- }
- return 0;
+}
+int fdt_fixup_icid_tbl(void *blob, int smmu_ph,
struct icid_id_table *tbl, int size)
What we set in device tree is stream-id, while stream-id is = [PL: BMT : ICID];
Also TBU_ID. As far as i know, PL, BMT bits are not implemented on this platform.
I think we should use stream-id to the point when we are patching device-tree and value set in h/w.
Not sure i understand this statement? Are you commenting that i should have used a different naming scheme, that is stream_id instead of icid?
We can say PL = BMT = 0 for now and leave space for setting this in future for any specific device for any platform?
I think so. As i mentioned, PL, BMT bits are not implemented on these chips.
+{
- int i, err, off;
- for (i = 0; i < size; i++) {
if (!tbl[i].compat)
continue;
off = fdt_node_offset_by_compat_reg(blob,
tbl[i].compat,
tbl[i].compat_addr);
if (off > 0) {
err = fdt_set_iommu_prop(blob, off, smmu_ph,
&tbl[i].id, 1);
if (err)
return err;
} else {
printf("WARNING could not find node %s: %s.\n",
tbl[i].compat, fdt_strerror(off));
}
- }
- return 0;
+}
+int fdt_get_smmu_phandle(void *blob) +{
- int noff, smmu_ph;
- noff = fdt_node_offset_by_compatible(blob, -1, "arm,mmu-500");
- if (noff < 0) {
printf("WARNING failed to get smmu node: %s\n",
fdt_strerror(noff));
return noff;
- }
- smmu_ph = fdt_get_phandle(blob, noff);
- if (!smmu_ph) {
smmu_ph = fdt_create_phandle(blob, noff);
if (!smmu_ph) {
printf("WARNING failed to get smmu phandle\n");
return -1;
}
- }
- return smmu_ph;
+}
+void fdt_fixup_icid(void *blob) +{
- int smmu_ph;
- smmu_ph = fdt_get_smmu_phandle(blob);
- if (smmu_ph < 0)
return;
- fdt_fixup_icid_tbl(blob, smmu_ph, icid_tbl, icid_tbl_sz);
+} diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c new file mode 100644 index 0000000000..d9e03fcb89 --- /dev/null +++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright 2018 NXP
- */
+#include <common.h> +#include <asm/arch-fsl-layerscape/immap_lsch2.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h>
+struct icid_id_table icid_tbl[] = { +#ifdef CONFIG_SYS_DPAA_QBMAN
- SET_QMAN_ICID(FSL_DPAA1_STREAM_ID_START),
- SET_BMAN_ICID(FSL_DPAA1_STREAM_ID_START + 1),
+#endif
- SET_SDHC_ICID(FSL_SDHC_STREAM_ID),
- SET_USB_ICID(1, "snps,dwc3", FSL_USB1_STREAM_ID),
- SET_USB_ICID(2, "snps,dwc3", FSL_USB2_STREAM_ID),
- SET_USB_ICID(3, "snps,dwc3", FSL_USB3_STREAM_ID),
Last parameter is STREAM_ID ?
- SET_SATA_ICID(FSL_SATA_STREAM_ID),
- SET_QDMA_ICID(FSL_QDMA_STREAM_ID),
- SET_EDMA_ICID(FSL_EDMA_STREAM_ID),
- SET_ETR_ICID(FSL_ETR_STREAM_ID),
- SET_DEBUG_ICID(FSL_DEBUG_STREAM_ID),
+};
+int icid_tbl_sz = ARRAY_SIZE(icid_tbl); diff --git a/arch/arm/cpu/armv8/fsl-layerscape/soc.c b/arch/arm/cpu/armv8/fsl-layerscape/soc.c index bfd663942a..5c5df5b7ef 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/soc.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/soc.c @@ -13,6 +13,7 @@ #include <asm/io.h> #include <asm/global_data.h> #include <asm/arch-fsl-layerscape/config.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> #ifdef CONFIG_LAYERSCAPE_NS_ACCESS #include <fsl_csu.h> #endif @@ -674,6 +675,8 @@ void fsl_lsch2_early_init_f(void) erratum_a009798(); erratum_a008997(); erratum_a009007();
- set_icids(); } #endif
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h new file mode 100644 index 0000000000..cf0f3d1121 --- /dev/null +++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h @@ -0,0 +1,80 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/*
- Copyright 2018 NXP
- */
+#ifndef _FSL_ICID_H_ +#define _FSL_ICID_H_
+#include <asm/types.h> +#include <fsl_qbman.h>
+struct icid_id_table {
- const char *compat;
- u32 id;
- u32 reg;
- phys_addr_t compat_addr;
- phys_addr_t reg_addr;
+};
+u32 get_ppid_icid(int ppid_tbl_idx, int ppid); +int fdt_get_smmu_phandle(void *blob); +int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids); +void set_icids(void); +void fdt_fixup_icid(void *blob);
+#define SET_ICID_ENTRY(name, idA, regA, addr, compataddr) \
- { .compat = name, \
.id = idA, \
.reg = regA, \
.compat_addr = compataddr, \
.reg_addr = addr, \
- }
+#define SET_SCFG_ICID(compat, icid, name, compataddr) \
- SET_ICID_ENTRY(compat, icid, (((icid) << 24) | (1 << 23)), \
offsetof(struct ccsr_scfg, name) +
CONFIG_SYS_FSL_SCFG_ADDR, \
compataddr)
+#define SET_USB_ICID(usb_num, compat, icid) \
And this and below say "icid" as last parameter.
Right. I went with the icid nomenclature as it was shorter. The
- SET_SCFG_ICID(compat, icid, usb##usb_num##_icid,\
CONFIG_SYS_XHCI_USB##usb_num##_ADDR)
+#define SET_SATA_ICID(icid) \
- SET_SCFG_ICID("fsl,ls1046a-ahci", icid, sata_icid,\
AHCI_BASE_ADDR)
+#define SET_SDHC_ICID(icid) \
- SET_SCFG_ICID("fsl,esdhc", icid, sdhc_icid,\
CONFIG_SYS_FSL_ESDHC_ADDR)
+#define SET_QDMA_ICID(icid) \
- SET_SCFG_ICID("fsl,ls1046a-qdma", icid, dma_icid,\
This is generic code and we should be passing "fsl,ls1046a-qdma"
Very good point. I'll update here and other places. IIRC, The *_STREAM_ID was already there in the headers so I just re-used it.
--- Best Regards, Laurentiu

Add support for ICID setting of qman portals and the required device tree fixups. Also fix an endiness issue in portal setup code.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- .../arm/cpu/armv8/fsl-layerscape/ls1046_ids.c | 16 +++++++ .../asm/arch-fsl-layerscape/fsl_portals.h | 23 ++++++++++ drivers/misc/fsl_portals.c | 43 +++++++++++++++---- 3 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 arch/arm/include/asm/arch-fsl-layerscape/fsl_portals.h
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c index d9e03fcb89..62bad3ab9c 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c @@ -6,6 +6,22 @@ #include <common.h> #include <asm/arch-fsl-layerscape/immap_lsch2.h> #include <asm/arch-fsl-layerscape/fsl_icid.h> +#include <asm/arch-fsl-layerscape/fsl_portals.h> + +#ifdef CONFIG_SYS_DPAA_QBMAN +struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = { + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), + SET_QP_INFO(FSL_DPAA1_STREAM_ID_END, 0), +}; +#endif
struct icid_id_table icid_tbl[] = { #ifdef CONFIG_SYS_DPAA_QBMAN diff --git a/arch/arm/include/asm/arch-fsl-layerscape/fsl_portals.h b/arch/arm/include/asm/arch-fsl-layerscape/fsl_portals.h new file mode 100644 index 0000000000..bd8d3fb49a --- /dev/null +++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_portals.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright 2018 NXP + */ + +#ifndef _FSL_PORTALS_H_ +#define _FSL_PORTALS_H_ + +struct qportal_info { + u16 dicid; /* DQRR ICID */ + u16 ficid; /* frame data ICID */ + u16 icid; + u8 sdest; +}; + +#define SET_QP_INFO(_icid, dest) \ + { .dicid = _icid, .ficid = _icid, .icid = _icid, .sdest = dest } + +extern struct qportal_info qp_info[]; +void fdt_portal(void *blob, const char *compat, const char *container, + u64 addr, u32 size); + +#endif diff --git a/drivers/misc/fsl_portals.c b/drivers/misc/fsl_portals.c index 5b1233740b..da174fc7e2 100644 --- a/drivers/misc/fsl_portals.c +++ b/drivers/misc/fsl_portals.c @@ -13,6 +13,9 @@ #ifdef CONFIG_PPC #include <asm/fsl_portals.h> #include <asm/fsl_liodn.h> +#else +#include <asm/arch-fsl-layerscape/fsl_portals.h> +#include <asm/arch-fsl-layerscape/fsl_icid.h> #endif #include <fsl_qbman.h>
@@ -52,6 +55,22 @@ void setup_qbman_portals(void) /* set frame liodn */ out_be32(&qman->qcsp[i].qcsp_io_cfg, (sdest << 16) | fliodn); } +#else +#ifdef CONFIG_ARM + int i; + + for (i = 0; i < CONFIG_SYS_QMAN_NUM_PORTALS; i++) { + u8 sdest = qp_info[i].sdest; + u16 ficid = qp_info[i].ficid; + u16 dicid = qp_info[i].dicid; + u16 icid = qp_info[i].icid; + + out_be32(&qman->qcsp[i].qcsp_lio_cfg, (icid << 16) | + dicid); + /* set frame icid */ + out_be32(&qman->qcsp[i].qcsp_io_cfg, (sdest << 16) | ficid); + } +#endif #endif
/* Change default state of BMan ISDR portals to all 1s */ @@ -185,6 +204,10 @@ void fdt_fixup_qportals(void *blob) char compat[64]; int compat_len;
+#ifndef CONFIG_PPC + int smmu_ph = fdt_get_smmu_phandle(blob); +#endif + maj = (rev_1 >> 8) & 0xff; min = rev_1 & 0xff; ip_cfg = rev_2 & 0xff; @@ -195,7 +218,6 @@ void fdt_fixup_qportals(void *blob)
off = fdt_node_offset_by_compatible(blob, -1, "fsl,qman-portal"); while (off != -FDT_ERR_NOTFOUND) { -#ifdef CONFIG_PPC #ifdef CONFIG_FSL_CORENET u32 liodns[2]; #endif @@ -205,12 +227,7 @@ void fdt_fixup_qportals(void *blob) if (!ci) goto err;
- i = *ci; -#ifdef CONFIG_SYS_DPAA_FMAN - int j; -#endif - -#endif /* CONFIG_PPC */ + i = fdt32_to_cpu(*ci); err = fdt_setprop(blob, off, "compatible", compat, compat_len); if (err < 0) goto err; @@ -242,7 +259,7 @@ void fdt_fixup_qportals(void *blob) #endif
#ifdef CONFIG_SYS_DPAA_FMAN - for (j = 0; j < CONFIG_SYS_NUM_FMAN; j++) { + for (int j = 0; j < CONFIG_SYS_NUM_FMAN; j++) { char name[] = "fman@0";
name[sizeof(name) - 2] = '0' + j; @@ -258,6 +275,16 @@ void fdt_fixup_qportals(void *blob) if (err < 0) goto err; #endif +#else + if (smmu_ph >= 0) { + u32 icids[3]; + + icids[0] = qp_info[i].icid; + icids[1] = qp_info[i].dicid; + icids[2] = qp_info[i].ficid; + + fdt_set_iommu_prop(blob, off, smmu_ph, icids, 3); + } #endif /* CONFIG_PPC */
err:

Add support for ICID setting of fman ports and the required device tree fixups.
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- arch/arm/cpu/armv8/fsl-layerscape/icid.c | 82 +++++++++++++++++++ .../arm/cpu/armv8/fsl-layerscape/ls1046_ids.c | 30 +++++++ .../asm/arch-fsl-layerscape/fsl_icid.h | 10 +++ 3 files changed, 122 insertions(+)
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/icid.c b/arch/arm/cpu/armv8/fsl-layerscape/icid.c index 8694bd6fa1..9502f83ac8 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/icid.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/icid.c @@ -10,6 +10,7 @@ #include <asm/io.h> #include <asm/processor.h> #include <asm/arch-fsl-layerscape/fsl_icid.h> +#include <fsl_fman.h>
static void set_icid(struct icid_id_table *tbl, int size) { @@ -19,10 +20,27 @@ static void set_icid(struct icid_id_table *tbl, int size) out_be32((u32 *)(tbl[i].reg_addr), tbl[i].reg); }
+#ifdef CONFIG_SYS_FMAN_V3 +void set_fman_icids(struct fman_icid_id_table *tbl, int size) +{ + int i; + ccsr_fman_t *fm = (void *)CONFIG_SYS_FSL_FM1_ADDR; + + for (i = 0; i < size; i++) { + out_be32(&fm->fm_bmi_common.fmbm_ppid[tbl[i].port_id - 1], + tbl[i].icid); + } +} +#endif + void set_icids(void) { /* setup general icid offsets */ set_icid(icid_tbl, icid_tbl_sz); + +#ifdef CONFIG_SYS_FMAN_V3 + set_fman_icids(fman_icid_tbl, fman_icid_tbl_sz); +#endif }
int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids) @@ -76,6 +94,66 @@ int fdt_fixup_icid_tbl(void *blob, int smmu_ph, return 0; }
+#ifdef CONFIG_SYS_FMAN_V3 +int get_fman_port_icid(int port_id, struct fman_icid_id_table *tbl, + const int size) +{ + int i; + + for (i = 0; i < size; i++) { + if (tbl[i].port_id == port_id) + return tbl[i].icid; + } + + return -1; +} + +void fdt_fixup_fman_port_icid_by_compat(void *blob, int smmu_ph, + const char *compat) +{ + int noff, len, icid; + const u32 *prop; + + noff = fdt_node_offset_by_compatible(blob, -1, compat); + while (noff > 0) { + prop = fdt_getprop(blob, noff, "cell-index", &len); + if (!prop) { + printf("WARNING missing cell-index for fman port\n"); + continue; + } + if (len != 4) { + printf("WARNING bad cell-index size for fman port\n"); + continue; + } + + icid = get_fman_port_icid(fdt32_to_cpu(*prop), + fman_icid_tbl, fman_icid_tbl_sz); + if (icid < 0) { + printf("WARNING unknown ICID for fman port %d\n", + *prop); + continue; + } + + fdt_set_iommu_prop(blob, noff, smmu_ph, (u32 *)&icid, 1); + + noff = fdt_node_offset_by_compatible(blob, noff, compat); + } +} + +void fdt_fixup_fman_icids(void *blob, int smmu_ph) +{ + static const char * const compats[] = { + "fsl,fman-v3-port-oh", + "fsl,fman-v3-port-rx", + "fsl,fman-v3-port-tx", + }; + int i; + + for (i = 0; i < ARRAY_SIZE(compats); i++) + fdt_fixup_fman_port_icid_by_compat(blob, smmu_ph, compats[i]); +} +#endif + int fdt_get_smmu_phandle(void *blob) { int noff, smmu_ph; @@ -108,4 +186,8 @@ void fdt_fixup_icid(void *blob) return;
fdt_fixup_icid_tbl(blob, smmu_ph, icid_tbl, icid_tbl_sz); + +#ifdef CONFIG_SYS_FMAN_V3 + fdt_fixup_fman_icids(blob, smmu_ph); +#endif } diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c index 62bad3ab9c..1592029a60 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c @@ -43,3 +43,33 @@ struct icid_id_table icid_tbl[] = { };
int icid_tbl_sz = ARRAY_SIZE(icid_tbl); + +#ifdef CONFIG_SYS_DPAA_FMAN +struct fman_icid_id_table fman_icid_tbl[] = { + /* port id, icid */ + SET_FMAN_ICID_ENTRY(0x02, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x03, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x04, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x05, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x06, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x07, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x08, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x09, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x0a, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x0b, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x0c, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x0d, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x28, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x29, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x2a, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x2b, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x2c, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x2d, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x10, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x11, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x30, FSL_DPAA1_STREAM_ID_END), + SET_FMAN_ICID_ENTRY(0x31, FSL_DPAA1_STREAM_ID_END), +}; + +int fman_icid_tbl_sz = ARRAY_SIZE(fman_icid_tbl); +#endif diff --git a/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h index cf0f3d1121..dd75a335a6 100644 --- a/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h +++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_icid.h @@ -17,6 +17,11 @@ struct icid_id_table { phys_addr_t reg_addr; };
+struct fman_icid_id_table { + u32 port_id; + u32 icid; +}; + u32 get_ppid_icid(int ppid_tbl_idx, int ppid); int fdt_get_smmu_phandle(void *blob); int fdt_set_iommu_prop(void *blob, int off, int smmu_ph, u32 *ids, int num_ids); @@ -74,7 +79,12 @@ void fdt_fixup_icid(void *blob); CONFIG_SYS_FSL_BMAN_ADDR, \ CONFIG_SYS_FSL_BMAN_ADDR)
+#define SET_FMAN_ICID_ENTRY(_port_id, _icid) \ + { .port_id = (_port_id), .icid = (_icid) } + extern struct icid_id_table icid_tbl[]; +extern struct fman_icid_id_table fman_icid_tbl[]; extern int icid_tbl_sz; +extern int fman_icid_tbl_sz;
#endif
participants (2)
-
Bharat Bhushan
-
Laurentiu Tudor