diff options
author | Biwen Li <biwen.li@nxp.com> | 2019-05-06 12:13:14 +0800 |
---|---|---|
committer | Petr Štetiar <ynezz@true.cz> | 2019-06-06 15:40:09 +0200 |
commit | 5159d71983e649a89568e46d9ff02731beedd571 (patch) | |
tree | 2c669f4d9651c1fe26955778e5fee119543a85ce /target/linux/layerscape/patches-4.14/711-dpaa-bqman-support-layerscape.patch | |
parent | 639d127b831a2af29a03ab07b262abf46ada3b4e (diff) | |
download | upstream-5159d71983e649a89568e46d9ff02731beedd571.tar.gz upstream-5159d71983e649a89568e46d9ff02731beedd571.tar.bz2 upstream-5159d71983e649a89568e46d9ff02731beedd571.zip |
layerscape: update patches-4.14 to LSDK 19.03
All patches of LSDK 19.03 were ported to Openwrt kernel.
We still used an all-in-one patch for each IP/feature for
OpenWrt.
Below are the changes this patch introduced.
- Updated original IP/feature patches to LSDK 19.03.
- Added new IP/feature patches for eTSEC/PTP/TMU.
- Squashed scattered patches into IP/feature patches.
- Updated config-4.14 correspondingly.
- Refreshed all patches.
More info about LSDK and the kernel:
- https://lsdk.github.io/components.html
- https://source.codeaurora.org/external/qoriq/qoriq-components/linux
Signed-off-by: Biwen Li <biwen.li@nxp.com>
Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Diffstat (limited to 'target/linux/layerscape/patches-4.14/711-dpaa-bqman-support-layerscape.patch')
-rw-r--r-- | target/linux/layerscape/patches-4.14/711-dpaa-bqman-support-layerscape.patch | 417 |
1 files changed, 395 insertions, 22 deletions
diff --git a/target/linux/layerscape/patches-4.14/711-dpaa-bqman-support-layerscape.patch b/target/linux/layerscape/patches-4.14/711-dpaa-bqman-support-layerscape.patch index 7946d3cbc1..715cfe0875 100644 --- a/target/linux/layerscape/patches-4.14/711-dpaa-bqman-support-layerscape.patch +++ b/target/linux/layerscape/patches-4.14/711-dpaa-bqman-support-layerscape.patch @@ -1,28 +1,32 @@ -From 48dbe4b3a31795b8efdfff82f69eccd086052eed Mon Sep 17 00:00:00 2001 +From 371e99a257cb714f9a6027d6571cb1a43855d926 Mon Sep 17 00:00:00 2001 From: Biwen Li <biwen.li@nxp.com> -Date: Fri, 16 Nov 2018 10:27:30 +0800 -Subject: [PATCH 16/39] dpaa-bqman: support layerscape +Date: Wed, 17 Apr 2019 18:58:24 +0800 +Subject: [PATCH] dpaa-bqman: support layerscape + This is an integrated patch of dpaa-bqman for layerscape +Signed-off-by: Biwen Li <biwen.li@nxp.com> Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> +Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com> Signed-off-by: Roy Pledge <roy.pledge@nxp.com> Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com> Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com> -Signed-off-by: Biwen Li <biwen.li@nxp.com> --- drivers/soc/fsl/qbman/Kconfig | 2 +- - drivers/soc/fsl/qbman/bman.c | 24 ++++- - drivers/soc/fsl/qbman/bman_ccsr.c | 35 ++++++- - drivers/soc/fsl/qbman/bman_portal.c | 12 ++- + drivers/soc/fsl/qbman/bman.c | 24 +++- + drivers/soc/fsl/qbman/bman_ccsr.c | 57 +++++++++- + drivers/soc/fsl/qbman/bman_portal.c | 44 ++++++-- drivers/soc/fsl/qbman/bman_priv.h | 3 + drivers/soc/fsl/qbman/dpaa_sys.h | 8 +- - drivers/soc/fsl/qbman/qman.c | 46 ++++++++- - drivers/soc/fsl/qbman/qman_ccsr.c | 140 ++++++++++++++++++++++------ - drivers/soc/fsl/qbman/qman_portal.c | 12 ++- + drivers/soc/fsl/qbman/qman.c | 46 +++++++- + drivers/soc/fsl/qbman/qman_ccsr.c | 168 +++++++++++++++++++++++----- + drivers/soc/fsl/qbman/qman_portal.c | 60 ++++++++-- drivers/soc/fsl/qbman/qman_priv.h | 5 +- drivers/soc/fsl/qbman/qman_test.h | 2 - - 11 files changed, 236 insertions(+), 53 deletions(-) + include/soc/fsl/bman.h | 16 +++ + include/soc/fsl/qman.h | 17 +++ + 13 files changed, 390 insertions(+), 62 deletions(-) --- a/drivers/soc/fsl/qbman/Kconfig +++ b/drivers/soc/fsl/qbman/Kconfig @@ -83,20 +87,49 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> return 0; --- a/drivers/soc/fsl/qbman/bman_ccsr.c +++ b/drivers/soc/fsl/qbman/bman_ccsr.c -@@ -170,10 +170,11 @@ static int fsl_bman_probe(struct platfor +@@ -29,6 +29,7 @@ + */ + + #include "bman_priv.h" ++#include <linux/iommu.h> + + u16 bman_ip_rev; + EXPORT_SYMBOL(bman_ip_rev); +@@ -120,6 +121,7 @@ static void bm_set_memory(u64 ba, u32 si + */ + static dma_addr_t fbpr_a; + static size_t fbpr_sz; ++static int __bman_probed; + + static int bman_fbpr(struct reserved_mem *rmem) + { +@@ -166,14 +168,24 @@ static irqreturn_t bman_isr(int irq, voi + return IRQ_HANDLED; + } + ++int bman_is_probed(void) ++{ ++ return __bman_probed; ++} ++EXPORT_SYMBOL_GPL(bman_is_probed); ++ + static int fsl_bman_probe(struct platform_device *pdev) { int ret, err_irq; struct device *dev = &pdev->dev; - struct device_node *node = dev->of_node; + struct device_node *mem_node, *node = dev->of_node; ++ struct iommu_domain *domain; struct resource *res; u16 id, bm_pool_cnt; u8 major, minor; + u64 size; ++ ++ __bman_probed = -1; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { -@@ -201,6 +202,38 @@ static int fsl_bman_probe(struct platfor +@@ -201,6 +213,47 @@ static int fsl_bman_probe(struct platfor return -ENODEV; } @@ -132,12 +165,97 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> + + dev_dbg(dev, "Allocated FBPR 0x%llx 0x%zx\n", fbpr_a, fbpr_sz); + ++ /* Create an 1-to-1 iommu mapping for FBPR area */ ++ domain = iommu_get_domain_for_dev(dev); ++ if (domain) { ++ ret = iommu_map(domain, fbpr_a, fbpr_a, PAGE_ALIGN(fbpr_sz), ++ IOMMU_READ | IOMMU_WRITE | IOMMU_CACHE); ++ if (ret) ++ dev_warn(dev, "failed to iommu_map() %d\n", ret); ++ } ++ bm_set_memory(fbpr_a, fbpr_sz); err_irq = platform_get_irq(pdev, 0); +@@ -240,6 +293,8 @@ static int fsl_bman_probe(struct platfor + return ret; + } + ++ __bman_probed = 1; ++ + return 0; + }; + --- a/drivers/soc/fsl/qbman/bman_portal.c +++ b/drivers/soc/fsl/qbman/bman_portal.c -@@ -123,7 +123,14 @@ static int bman_portal_probe(struct plat +@@ -32,6 +32,7 @@ + + static struct bman_portal *affine_bportals[NR_CPUS]; + static struct cpumask portal_cpus; ++static int __bman_portals_probed; + /* protect bman global registers and global data shared among portals */ + static DEFINE_SPINLOCK(bman_lock); + +@@ -85,6 +86,12 @@ static int bman_online_cpu(unsigned int + return 0; + } + ++int bman_portals_probed(void) ++{ ++ return __bman_portals_probed; ++} ++EXPORT_SYMBOL_GPL(bman_portals_probed); ++ + static int bman_portal_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; +@@ -92,11 +99,21 @@ static int bman_portal_probe(struct plat + struct bm_portal_config *pcfg; + struct resource *addr_phys[2]; + void __iomem *va; +- int irq, cpu; ++ int irq, cpu, err; ++ ++ err = bman_is_probed(); ++ if (!err) ++ return -EPROBE_DEFER; ++ if (err < 0) { ++ dev_err(&pdev->dev, "failing probe due to bman probe error\n"); ++ return -ENODEV; ++ } + + pcfg = devm_kmalloc(dev, sizeof(*pcfg), GFP_KERNEL); +- if (!pcfg) ++ if (!pcfg) { ++ __bman_portals_probed = -1; + return -ENOMEM; ++ } + + pcfg->dev = dev; + +@@ -104,14 +121,14 @@ static int bman_portal_probe(struct plat + DPAA_PORTAL_CE); + if (!addr_phys[0]) { + dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node); +- return -ENXIO; ++ goto err_ioremap1; + } + + addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM, + DPAA_PORTAL_CI); + if (!addr_phys[1]) { + dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node); +- return -ENXIO; ++ goto err_ioremap1; + } + + pcfg->cpu = -1; +@@ -119,11 +136,18 @@ static int bman_portal_probe(struct plat + irq = platform_get_irq(pdev, 0); + if (irq <= 0) { + dev_err(dev, "Can't get %pOF IRQ'\n", node); +- return -ENXIO; ++ goto err_ioremap1; } pcfg->irq = irq; @@ -153,7 +271,7 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> if (!va) { dev_err(dev, "ioremap::CE failed\n"); goto err_ioremap1; -@@ -131,8 +138,7 @@ static int bman_portal_probe(struct plat +@@ -131,8 +155,7 @@ static int bman_portal_probe(struct plat pcfg->addr_virt[DPAA_PORTAL_CE] = va; @@ -163,6 +281,25 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> if (!va) { dev_err(dev, "ioremap::CI failed\n"); goto err_ioremap2; +@@ -149,6 +172,9 @@ static int bman_portal_probe(struct plat + } + + cpumask_set_cpu(cpu, &portal_cpus); ++ if (!__bman_portals_probed && ++ cpumask_weight(&portal_cpus) == num_online_cpus()) ++ __bman_portals_probed = 1; + spin_unlock(&bman_lock); + pcfg->cpu = cpu; + +@@ -168,6 +194,8 @@ err_portal_init: + err_ioremap2: + iounmap(pcfg->addr_virt[DPAA_PORTAL_CE]); + err_ioremap1: ++ __bman_portals_probed = -1; ++ + return -ENXIO; + } + --- a/drivers/soc/fsl/qbman/bman_priv.h +++ b/drivers/soc/fsl/qbman/bman_priv.h @@ -33,6 +33,9 @@ @@ -290,7 +427,23 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> /* --- a/drivers/soc/fsl/qbman/qman_ccsr.c +++ b/drivers/soc/fsl/qbman/qman_ccsr.c -@@ -401,21 +401,42 @@ static int qm_init_pfdr(struct device *d +@@ -29,6 +29,7 @@ + */ + + #include "qman_priv.h" ++#include <linux/iommu.h> + + u16 qman_ip_rev; + EXPORT_SYMBOL(qman_ip_rev); +@@ -273,6 +274,7 @@ static const struct qman_error_info_mdat + static u32 __iomem *qm_ccsr_start; + /* A SDQCR mask comprising all the available/visible pool channels */ + static u32 qm_pools_sdqcr; ++static int __qman_probed; + + static inline u32 qm_ccsr_in(u32 offset) + { +@@ -401,21 +403,42 @@ static int qm_init_pfdr(struct device *d } /* @@ -338,7 +491,7 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> return 0; } RESERVEDMEM_OF_DECLARE(qman_fqd, "fsl,qman-fqd", qman_fqd); -@@ -431,32 +452,13 @@ static int qman_pfdr(struct reserved_mem +@@ -431,32 +454,13 @@ static int qman_pfdr(struct reserved_mem } RESERVEDMEM_OF_DECLARE(qman_pfdr, "fsl,qman-pfdr", qman_pfdr); @@ -373,21 +526,49 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> static void log_edata_bits(struct device *dev, u32 bit_count) { u32 i, j, mask = 0xffffffff; -@@ -687,11 +689,12 @@ static int qman_resource_init(struct dev +@@ -595,6 +599,7 @@ static int qman_init_ccsr(struct device + #define LIO_CFG_LIODN_MASK 0x0fff0000 + void qman_liodn_fixup(u16 channel) + { ++#ifdef CONFIG_PPC + static int done; + static u32 liodn_offset; + u32 before, after; +@@ -614,6 +619,7 @@ void qman_liodn_fixup(u16 channel) + qm_ccsr_out(REG_REV3_QCSP_LIO_CFG(idx), after); + else + qm_ccsr_out(REG_QCSP_LIO_CFG(idx), after); ++#endif + } + + #define IO_CFG_SDEST_MASK 0x00ff0000 +@@ -684,14 +690,24 @@ static int qman_resource_init(struct dev + return 0; + } + ++int qman_is_probed(void) ++{ ++ return __qman_probed; ++} ++EXPORT_SYMBOL_GPL(qman_is_probed); ++ static int fsl_qman_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct device_node *node = dev->of_node; + struct device_node *mem_node, *node = dev->of_node; ++ struct iommu_domain *domain; struct resource *res; int ret, err_irq; u16 id; u8 major, minor; + u64 size; ++ ++ __qman_probed = -1; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { -@@ -717,6 +720,8 @@ static int fsl_qman_probe(struct platfor +@@ -717,6 +733,8 @@ static int fsl_qman_probe(struct platfor qman_ip_rev = QMAN_REV30; else if (major == 3 && minor == 1) qman_ip_rev = QMAN_REV31; @@ -396,7 +577,7 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> else { dev_err(dev, "Unknown QMan version\n"); return -ENODEV; -@@ -727,10 +732,83 @@ static int fsl_qman_probe(struct platfor +@@ -727,10 +745,96 @@ static int fsl_qman_probe(struct platfor qm_channel_caam = QMAN_CHANNEL_CAAM_REV3; } @@ -481,12 +662,116 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> + } + } + dev_info(dev, "Allocated PFDR 0x%llx 0x%zx\n", pfdr_a, pfdr_sz); ++ ++ /* Create an 1-to-1 iommu mapping for fqd and pfdr areas */ ++ domain = iommu_get_domain_for_dev(dev); ++ if (domain) { ++ ret = iommu_map(domain, fqd_a, fqd_a, PAGE_ALIGN(fqd_sz), ++ IOMMU_READ | IOMMU_WRITE | IOMMU_CACHE); ++ if (ret) ++ dev_warn(dev, "iommu_map(fqd) failed %d\n", ret); ++ ret = iommu_map(domain, pfdr_a, pfdr_a, PAGE_ALIGN(pfdr_sz), ++ IOMMU_READ | IOMMU_WRITE | IOMMU_CACHE); ++ if (ret) ++ dev_warn(dev, "iommu_map(pfdr) failed %d\n", ret); ++ } ret = qman_init_ccsr(dev); if (ret) { +@@ -793,6 +897,8 @@ static int fsl_qman_probe(struct platfor + if (ret) + return ret; + ++ __qman_probed = 1; ++ + return 0; + } + --- a/drivers/soc/fsl/qbman/qman_portal.c +++ b/drivers/soc/fsl/qbman/qman_portal.c -@@ -262,7 +262,14 @@ static int qman_portal_probe(struct plat +@@ -29,6 +29,7 @@ + */ + + #include "qman_priv.h" ++#include <linux/iommu.h> + + struct qman_portal *qman_dma_portal; + EXPORT_SYMBOL(qman_dma_portal); +@@ -38,6 +39,7 @@ EXPORT_SYMBOL(qman_dma_portal); + #define CONFIG_FSL_DPA_PIRQ_FAST 1 + + static struct cpumask portal_cpus; ++static int __qman_portals_probed; + /* protect qman global registers and global data shared among portals */ + static DEFINE_SPINLOCK(qman_lock); + +@@ -218,19 +220,36 @@ static int qman_online_cpu(unsigned int + return 0; + } + ++int qman_portals_probed(void) ++{ ++ return __qman_portals_probed; ++} ++EXPORT_SYMBOL_GPL(qman_portals_probed); ++ + static int qman_portal_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; + struct device_node *node = dev->of_node; ++ struct iommu_domain *domain; + struct qm_portal_config *pcfg; + struct resource *addr_phys[2]; + void __iomem *va; + int irq, cpu, err; + u32 val; + ++ err = qman_is_probed(); ++ if (!err) ++ return -EPROBE_DEFER; ++ if (err < 0) { ++ dev_err(&pdev->dev, "failing probe due to qman probe error\n"); ++ return -ENODEV; ++ } ++ + pcfg = devm_kmalloc(dev, sizeof(*pcfg), GFP_KERNEL); +- if (!pcfg) ++ if (!pcfg) { ++ __qman_portals_probed = -1; + return -ENOMEM; ++ } + + pcfg->dev = dev; + +@@ -238,19 +257,20 @@ static int qman_portal_probe(struct plat + DPAA_PORTAL_CE); + if (!addr_phys[0]) { + dev_err(dev, "Can't get %pOF property 'reg::CE'\n", node); +- return -ENXIO; ++ goto err_ioremap1; + } + + addr_phys[1] = platform_get_resource(pdev, IORESOURCE_MEM, + DPAA_PORTAL_CI); + if (!addr_phys[1]) { + dev_err(dev, "Can't get %pOF property 'reg::CI'\n", node); +- return -ENXIO; ++ goto err_ioremap1; + } + + err = of_property_read_u32(node, "cell-index", &val); + if (err) { + dev_err(dev, "Can't get %pOF property 'cell-index'\n", node); ++ __qman_portals_probed = -1; + return err; + } + pcfg->channel = val; +@@ -258,11 +278,18 @@ static int qman_portal_probe(struct plat + irq = platform_get_irq(pdev, 0); + if (irq <= 0) { + dev_err(dev, "Can't get %pOF IRQ\n", node); +- return -ENXIO; ++ goto err_ioremap1; } pcfg->irq = irq; @@ -502,7 +787,7 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> if (!va) { dev_err(dev, "ioremap::CE failed\n"); goto err_ioremap1; -@@ -270,8 +277,7 @@ static int qman_portal_probe(struct plat +@@ -270,8 +297,7 @@ static int qman_portal_probe(struct plat pcfg->addr_virt[DPAA_PORTAL_CE] = va; @@ -512,6 +797,47 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> if (!va) { dev_err(dev, "ioremap::CI failed\n"); goto err_ioremap2; +@@ -279,6 +305,21 @@ static int qman_portal_probe(struct plat + + pcfg->addr_virt[DPAA_PORTAL_CI] = va; + ++ /* Create an 1-to-1 iommu mapping for cena portal area */ ++ domain = iommu_get_domain_for_dev(dev); ++ if (domain) { ++ /* ++ * Note: not mapping this as cacheable triggers the infamous ++ * QMan CIDE error. ++ */ ++ err = iommu_map(domain, ++ addr_phys[0]->start, addr_phys[0]->start, ++ PAGE_ALIGN(resource_size(addr_phys[0])), ++ IOMMU_READ | IOMMU_WRITE | IOMMU_CACHE); ++ if (err) ++ dev_warn(dev, "failed to iommu_map() %d\n", err); ++ } ++ + pcfg->pools = qm_get_pools_sdqcr(); + + spin_lock(&qman_lock); +@@ -290,6 +331,9 @@ static int qman_portal_probe(struct plat + } + + cpumask_set_cpu(cpu, &portal_cpus); ++ if (!__qman_portals_probed && ++ cpumask_weight(&portal_cpus) == num_online_cpus()) ++ __qman_portals_probed = 1; + spin_unlock(&qman_lock); + pcfg->cpu = cpu; + +@@ -314,6 +358,8 @@ err_portal_init: + err_ioremap2: + iounmap(pcfg->addr_virt[DPAA_PORTAL_CE]); + err_ioremap1: ++ __qman_portals_probed = -1; ++ + return -ENXIO; + } + --- a/drivers/soc/fsl/qbman/qman_priv.h +++ b/drivers/soc/fsl/qbman/qman_priv.h @@ -28,13 +28,13 @@ @@ -548,3 +874,50 @@ Signed-off-by: Biwen Li <biwen.li@nxp.com> - int qman_test_stash(void); int qman_test_api(void); +--- a/include/soc/fsl/bman.h ++++ b/include/soc/fsl/bman.h +@@ -126,4 +126,20 @@ int bman_release(struct bman_pool *pool, + */ + int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num); + ++/** ++ * bman_is_probed - Check if bman is probed ++ * ++ * Returns 1 if the bman driver successfully probed, -1 if the bman driver ++ * failed to probe or 0 if the bman driver did not probed yet. ++ */ ++int bman_is_probed(void); ++/** ++ * bman_portals_probed - Check if all cpu bound bman portals are probed ++ * ++ * Returns 1 if all the required cpu bound bman portals successfully probed, ++ * -1 if probe errors appeared or 0 if the bman portals did not yet finished ++ * probing. ++ */ ++int bman_portals_probed(void); ++ + #endif /* __FSL_BMAN_H */ +--- a/include/soc/fsl/qman.h ++++ b/include/soc/fsl/qman.h +@@ -1186,4 +1186,21 @@ int qman_alloc_cgrid_range(u32 *result, + */ + int qman_release_cgrid(u32 id); + ++/** ++ * qman_is_probed - Check if qman is probed ++ * ++ * Returns 1 if the qman driver successfully probed, -1 if the qman driver ++ * failed to probe or 0 if the qman driver did not probed yet. ++ */ ++int qman_is_probed(void); ++ ++/** ++ * qman_portals_probed - Check if all cpu bound qman portals are probed ++ * ++ * Returns 1 if all the required cpu bound qman portals successfully probed, ++ * -1 if probe errors appeared or 0 if the qman portals did not yet finished ++ * probing. ++ */ ++int qman_portals_probed(void); ++ + #endif /* __FSL_QMAN_H */ |