Merge tag 'efi-2020-07-rc4' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[oweals/u-boot.git] / drivers / misc / fsl_portals.c
index 7c22b8d20999fff3bbfbb6cebd52fbd5dad420b6..632430e42099518232f720c25b59e1c7ba0f75dd 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <log.h>
 #include <linux/libfdt.h>
 #include <fdt_support.h>
 
@@ -13,6 +14,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>
 
@@ -24,7 +28,6 @@ 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) */
@@ -32,7 +35,6 @@ void setup_qbman_portals(void)
        out_be32(&qman->qcsp_bare, (u32)(CONFIG_SYS_QMAN_MEM_PHYS >> 32));
 #endif
        out_be32(&qman->qcsp_bar, (u32)CONFIG_SYS_QMAN_MEM_PHYS);
-#endif
 #ifdef CONFIG_FSL_CORENET
        int i;
 
@@ -47,6 +49,22 @@ void setup_qbman_portals(void)
                /* set frame liodn */
                out_be32(&qman->qcsp[i].qcsp_io_cfg, (sdest << 16) | fliodn);
        }
+#else
+#if defined(CONFIG_ARCH_LS1043A) || defined(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 */
@@ -180,6 +198,10 @@ void fdt_fixup_qportals(void *blob)
        char compat[64];
        int compat_len;
 
+#if defined(CONFIG_ARCH_LS1043A) || defined(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;
@@ -190,7 +212,8 @@ 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_LS1043A) || \
+defined(CONFIG_ARCH_LS1046A)
 #ifdef CONFIG_FSL_CORENET
                u32 liodns[2];
 #endif
@@ -200,12 +223,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_LS1043A || CONFIG_ARCH_LS1046A */
                err = fdt_setprop(blob, off, "compatible", compat, compat_len);
                if (err < 0)
                        goto err;
@@ -253,6 +276,18 @@ void fdt_fixup_qportals(void *blob)
                if (err < 0)
                        goto err;
 #endif
+#else
+#if defined(CONFIG_ARCH_LS1043A) || defined(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: