armv8: ls1046a: add icid setup for qman portals
authorLaurentiu Tudor <laurentiu.tudor@nxp.com>
Thu, 9 Aug 2018 12:19:47 +0000 (15:19 +0300)
committerYork Sun <york.sun@nxp.com>
Fri, 10 Aug 2018 17:35:36 +0000 (10:35 -0700)
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>
Reviewed-by: York Sun <york.sun@nxp.com>
arch/arm/cpu/armv8/fsl-layerscape/ls1046_ids.c
arch/arm/include/asm/arch-fsl-layerscape/fsl_portals.h [new file with mode: 0644]
drivers/misc/fsl_portals.c

index 1c528ab751e1b81adbf9cf2306d109db27f515cd..80e1ceadc0bd9f7b1baa9c7ddf00fa48169cb28c 100644 (file)
@@ -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 (file)
index 0000000..1577e93
--- /dev/null
@@ -0,0 +1,24 @@
+/* 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(streamid, dest) \
+       { .dicid = (streamid), .ficid = (streamid), .icid = (streamid), \
+       .sdest = (dest) }
+
+extern struct qportal_info qp_info[];
+void fdt_portal(void *blob, const char *compat, const char *container,
+               u64 addr, u32 size);
+
+#endif
index 22faf16751eb202ea806bc1d3f30dda4366fa5d9..d3137680ade57d3bfe5e41b142372147fd906d50 100644 (file)
@@ -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>
 
@@ -45,6 +48,22 @@ void setup_qbman_portals(void)
                /* set frame liodn */
                out_be32(&qman->qcsp[i].qcsp_io_cfg, (sdest << 16) | fliodn);
        }
+#else
+#ifdef CONFIG_ARCH_LS1046A
+       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 */
@@ -178,6 +197,10 @@ void fdt_fixup_qportals(void *blob)
        char compat[64];
        int compat_len;
 
+#ifdef CONFIG_ARCH_LS1046A
+       int smmu_ph = fdt_get_smmu_phandle(blob);
+#endif
+
        maj = (rev_1 >> 8) & 0xff;
        min = rev_1 & 0xff;
        ip_cfg = rev_2 & 0xff;
@@ -188,7 +211,7 @@ 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
+#if defined(CONFIG_PPC) || defined(CONFIG_ARCH_LS1046A)
 #ifdef CONFIG_FSL_CORENET
                u32 liodns[2];
 #endif
@@ -198,12 +221,12 @@ void fdt_fixup_qportals(void *blob)
                if (!ci)
                        goto err;
 
-               i = *ci;
-#ifdef CONFIG_SYS_DPAA_FMAN
+               i = fdt32_to_cpu(*ci);
+#if defined(CONFIG_SYS_DPAA_FMAN) && defined(CONFIG_PPC)
                int j;
 #endif
 
-#endif /* CONFIG_PPC */
+#endif /* CONFIG_PPC || CONFIG_ARCH_LS1046A */
                err = fdt_setprop(blob, off, "compatible", compat, compat_len);
                if (err < 0)
                        goto err;
@@ -251,6 +274,18 @@ void fdt_fixup_qportals(void *blob)
                if (err < 0)
                        goto err;
 #endif
+#else
+#ifdef CONFIG_ARCH_LS1046A
+               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
 #endif /* CONFIG_PPC */
 
 err: