soc/fsl/qbman: Use shared-dma-pool for QMan private memory allocations
Use the shared-memory-pool mechanism for frame queue descriptor and packed frame descriptor record area allocations. Signed-off-by: Roy Pledge <roy.pledge@nxp.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Li Yang <leoyang.li@nxp.com>
This commit is contained in:
parent
5ae783c6a1
commit
07f86917a4
@ -401,21 +401,42 @@ static int qm_init_pfdr(struct device *dev, u32 pfdr_start, u32 num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ideally we would use the DMA API to turn rmem->base into a DMA address
|
* QMan needs two global memory areas initialized at boot time:
|
||||||
* (especially if iommu translations ever get involved). Unfortunately, the
|
* 1) FQD: Frame Queue Descriptors used to manage frame queues
|
||||||
* DMA API currently does not allow mapping anything that is not backed with
|
* 2) PFDR: Packed Frame Queue Descriptor Records used to store frames
|
||||||
* a struct page.
|
* Both areas are reserved using the device tree reserved memory framework
|
||||||
|
* and the addresses and sizes are initialized when the QMan device is probed
|
||||||
*/
|
*/
|
||||||
static dma_addr_t fqd_a, pfdr_a;
|
static dma_addr_t fqd_a, pfdr_a;
|
||||||
static size_t fqd_sz, pfdr_sz;
|
static size_t fqd_sz, pfdr_sz;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC
|
||||||
|
/*
|
||||||
|
* Support for PPC Device Tree backward compatibility when compatible
|
||||||
|
* string is set to fsl-qman-fqd and fsl-qman-pfdr
|
||||||
|
*/
|
||||||
|
static int zero_priv_mem(phys_addr_t addr, size_t sz)
|
||||||
|
{
|
||||||
|
/* map as cacheable, non-guarded */
|
||||||
|
void __iomem *tmpp = ioremap_prot(addr, sz, 0);
|
||||||
|
|
||||||
|
if (!tmpp)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
memset_io(tmpp, 0, sz);
|
||||||
|
flush_dcache_range((unsigned long)tmpp,
|
||||||
|
(unsigned long)tmpp + sz);
|
||||||
|
iounmap(tmpp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int qman_fqd(struct reserved_mem *rmem)
|
static int qman_fqd(struct reserved_mem *rmem)
|
||||||
{
|
{
|
||||||
fqd_a = rmem->base;
|
fqd_a = rmem->base;
|
||||||
fqd_sz = rmem->size;
|
fqd_sz = rmem->size;
|
||||||
|
|
||||||
WARN_ON(!(fqd_a && fqd_sz));
|
WARN_ON(!(fqd_a && fqd_sz));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
RESERVEDMEM_OF_DECLARE(qman_fqd, "fsl,qman-fqd", qman_fqd);
|
RESERVEDMEM_OF_DECLARE(qman_fqd, "fsl,qman-fqd", qman_fqd);
|
||||||
@ -431,32 +452,13 @@ static int qman_pfdr(struct reserved_mem *rmem)
|
|||||||
}
|
}
|
||||||
RESERVEDMEM_OF_DECLARE(qman_pfdr, "fsl,qman-pfdr", qman_pfdr);
|
RESERVEDMEM_OF_DECLARE(qman_pfdr, "fsl,qman-pfdr", qman_pfdr);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static unsigned int qm_get_fqid_maxcnt(void)
|
static unsigned int qm_get_fqid_maxcnt(void)
|
||||||
{
|
{
|
||||||
return fqd_sz / 64;
|
return fqd_sz / 64;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Flush this memory range from data cache so that QMAN originated
|
|
||||||
* transactions for this memory region could be marked non-coherent.
|
|
||||||
*/
|
|
||||||
static int zero_priv_mem(struct device *dev, struct device_node *node,
|
|
||||||
phys_addr_t addr, size_t sz)
|
|
||||||
{
|
|
||||||
/* map as cacheable, non-guarded */
|
|
||||||
void __iomem *tmpp = ioremap_prot(addr, sz, 0);
|
|
||||||
|
|
||||||
if (!tmpp)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
memset_io(tmpp, 0, sz);
|
|
||||||
flush_dcache_range((unsigned long)tmpp,
|
|
||||||
(unsigned long)tmpp + sz);
|
|
||||||
iounmap(tmpp);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void log_edata_bits(struct device *dev, u32 bit_count)
|
static void log_edata_bits(struct device *dev, u32 bit_count)
|
||||||
{
|
{
|
||||||
u32 i, j, mask = 0xffffffff;
|
u32 i, j, mask = 0xffffffff;
|
||||||
@ -727,10 +729,41 @@ static int fsl_qman_probe(struct platform_device *pdev)
|
|||||||
qm_channel_caam = QMAN_CHANNEL_CAAM_REV3;
|
qm_channel_caam = QMAN_CHANNEL_CAAM_REV3;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = zero_priv_mem(dev, node, fqd_a, fqd_sz);
|
if (fqd_a) {
|
||||||
WARN_ON(ret);
|
#ifdef CONFIG_PPC
|
||||||
if (ret)
|
/*
|
||||||
return -ENODEV;
|
* For PPC backward DT compatibility
|
||||||
|
* FQD memory MUST be zero'd by software
|
||||||
|
*/
|
||||||
|
zero_priv_mem(fqd_a, fqd_sz);
|
||||||
|
#else
|
||||||
|
WARN(1, "Unexpected architecture using non shared-dma-mem reservations");
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Order of memory regions is assumed as FQD followed by PFDR
|
||||||
|
* in order to ensure allocations from the correct regions the
|
||||||
|
* driver initializes then allocates each piece in order
|
||||||
|
*/
|
||||||
|
ret = qbman_init_private_mem(dev, 0, &fqd_a, &fqd_sz);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "qbman_init_private_mem() for FQD failed 0x%x\n",
|
||||||
|
ret);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dev_dbg(dev, "Allocated FQD 0x%llx 0x%zx\n", fqd_a, fqd_sz);
|
||||||
|
|
||||||
|
if (!pfdr_a) {
|
||||||
|
/* Setup PFDR memory */
|
||||||
|
ret = qbman_init_private_mem(dev, 1, &pfdr_a, &pfdr_sz);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "qbman_init_private_mem() for PFDR failed 0x%x\n",
|
||||||
|
ret);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dev_dbg(dev, "Allocated PFDR 0x%llx 0x%zx\n", pfdr_a, pfdr_sz);
|
||||||
|
|
||||||
ret = qman_init_ccsr(dev);
|
ret = qman_init_ccsr(dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -28,8 +28,6 @@
|
|||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
||||||
|
|
||||||
#include "dpaa_sys.h"
|
#include "dpaa_sys.h"
|
||||||
|
|
||||||
#include <soc/fsl/qman.h>
|
#include <soc/fsl/qman.h>
|
||||||
|
@ -30,7 +30,5 @@
|
|||||||
|
|
||||||
#include "qman_priv.h"
|
#include "qman_priv.h"
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
||||||
|
|
||||||
int qman_test_stash(void);
|
int qman_test_stash(void);
|
||||||
int qman_test_api(void);
|
int qman_test_api(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user