[PATCH v12 3/6] CPM/QE: use genalloc to manage CPM/QE muram
Zhao Qiang
qiang.zhao at freescale.com
Fri Oct 23 18:06:23 AEDT 2015
On Fri, 2015-10-23 at 11:00 AM, Wood Scott-B07421 <scottwood at freescale.com> wrote:
> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Friday, October 23, 2015 11:00 AM
> To: Zhao Qiang-B45475 <qiang.zhao at freescale.com>
> Cc: linux-kernel at vger.kernel.org; linuxppc-dev at lists.ozlabs.org;
> lauraa at codeaurora.org; Xie Xiaobo-R63061 <X.Xie at freescale.com>;
> benh at kernel.crashing.org; Li Yang-Leo-R58472 <LeoLi at freescale.com>;
> paulus at samba.org
> Subject: Re: [PATCH v12 3/6] CPM/QE: use genalloc to manage CPM/QE muram
>
> On Wed, 2015-10-14 at 15:16 +0800, Zhao Qiang wrote:
> > Use genalloc to manage CPM/QE muram instead of rheap.
> >
> > Signed-off-by: Zhao Qiang <qiang.zhao at freescale.com<mailto:qiang.zhao at freescale.com>>
> > ---
> > Changes for v9:
> > - splitted from patch 3/5, modify cpm muram management functions.
> > Changes for v10:
> > - modify cpm muram first, then move to qe_common
> > - modify commit.
> > Changes for v11:
> > - factor out the common alloc code
> > - modify min_alloc_order to zero for cpm_muram_alloc_fixed.
> > Changes for v12:
> > - Nil
> >
> > arch/powerpc/include/asm/cpm.h | 1 +
> > arch/powerpc/platforms/Kconfig | 2 +-
> > arch/powerpc/sysdev/cpm_common.c | 129
> > +++++++++++++++++++++++++++---------
> > ---
> > 3 files changed, 93 insertions(+), 39 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/cpm.h
> > b/arch/powerpc/include/asm/cpm.h index 4398a6c..0e1ac3f 100644
> > --- a/arch/powerpc/include/asm/cpm.h
> > +++ b/arch/powerpc/include/asm/cpm.h
> > @@ -161,6 +161,7 @@ int cpm_muram_init(void); unsigned long
> > cpm_muram_alloc(unsigned long size, unsigned long align); int
> > cpm_muram_free(unsigned long offset); unsigned long
> > cpm_muram_alloc_fixed(unsigned long offset, unsigned long size);
> > +unsigned long cpm_muram_alloc_common(unsigned long size, void *data);
> > void __iomem *cpm_muram_addr(unsigned long offset); unsigned long
> > cpm_muram_offset(void __iomem *addr); dma_addr_t
> cpm_muram_dma(void
> > __iomem *addr); diff --git a/arch/powerpc/platforms/Kconfig
> > b/arch/powerpc/platforms/Kconfig index b7f9c40..01626be7 100644
> > --- a/arch/powerpc/platforms/Kconfig
> > +++ b/arch/powerpc/platforms/Kconfig
> > @@ -275,7 +275,7 @@ config TAU_AVERAGE config QUICC_ENGINE
> > bool "Freescale QUICC Engine (QE) Support"
> > depends on FSL_SOC && PPC32
> > - select PPC_LIB_RHEAP
> > + select GENERIC_ALLOCATOR
> > select CRC32
> > help
> > The QUICC Engine (QE) is a new generation of communications
> > diff --git a/arch/powerpc/sysdev/cpm_common.c
> > b/arch/powerpc/sysdev/cpm_common.c
> > index 4f78695..ff47072 100644
> > --- a/arch/powerpc/sysdev/cpm_common.c
> > +++ b/arch/powerpc/sysdev/cpm_common.c
> > @@ -17,6 +17,7 @@
> > * published by the Free Software Foundation.
> > */
> >
> > +#include <linux/genalloc.h>
> > #include <linux/init.h>
> > #include <linux/of_device.h>
> > #include <linux/spinlock.h>
> > @@ -27,7 +28,6 @@
> >
> > #include <asm/udbg.h>
> > #include <asm/io.h>
> > -#include <asm/rheap.h>
> > #include <asm/cpm.h>
> >
> > #include <mm/mmu_decl.h>
> > @@ -65,14 +65,22 @@ void __init udbg_init_cpm(void) } #endif
> >
> > +static struct gen_pool *muram_pool;
> > static spinlock_t cpm_muram_lock;
> > -static rh_block_t cpm_boot_muram_rh_block[16]; -static rh_info_t
> > cpm_muram_info; static u8 __iomem *muram_vbase; static phys_addr_t
> > muram_pbase;
> >
> > -/* Max address size we deal with */
> > +struct muram_block {
> > + struct list_head head;
> > + unsigned long start;
> > + int size;
> > +};
> > +
> > +static LIST_HEAD(muram_block_list);
> > +
> > +/* max address size we deal with */
> > #define OF_MAX_ADDR_CELLS 4
> > +#define GENPOOL_OFFSET (4096 * 8)
> >
> > int cpm_muram_init(void)
> > {
> > @@ -87,50 +95,52 @@ int cpm_muram_init(void)
> > return 0;
> >
> > spin_lock_init(&cpm_muram_lock);
> > - /* initialize the info header */
> > - rh_init(&cpm_muram_info, 1,
> > - sizeof(cpm_boot_muram_rh_block) /
> > - sizeof(cpm_boot_muram_rh_block[0]),
> > - cpm_boot_muram_rh_block);
> > -
> > np = of_find_compatible_node(NULL, NULL, "fsl,cpm-muram-data");
> > if (!np) {
> > /* try legacy bindings */
> > np = of_find_node_by_name(NULL, "data-only");
> > if (!np) {
> > - printk(KERN_ERR "Cannot find CPM muram data node");
> > + pr_err("Cannot find CPM muram data node");
> > ret = -ENODEV;
> > - goto out;
> > + goto out_muram;
> > }
> > }
> >
> > + muram_pool = gen_pool_create(0, -1);
> > muram_pbase = of_translate_address(np, zero);
> > if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
> > - printk(KERN_ERR "Cannot translate zero through CPM muram node");
> > + pr_err("Cannot translate zero through CPM muram node");
> > ret = -ENODEV;
> > - goto out;
> > + goto out_pool;
> > }
> >
> > while (of_address_to_resource(np, i++, &r) == 0) {
> > if (r.end > max)
> > max = r.end;
> > + ret = gen_pool_add(muram_pool, r.start - muram_pbase +
> > + GENPOOL_OFFSET, resource_size(&r), -1);
> > + if (ret) {
> > + pr_err("QE: couldn't add muram to pool!\n");
> > + goto out_pool;
> > + }
> >
>
> Whitespace
>
> > - rh_attach_region(&cpm_muram_info, r.start - muram_pbase,
> > - resource_size(&r));
> > }
> >
> > muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
> > if (!muram_vbase) {
> > - printk(KERN_ERR "Cannot map CPM muram");
> > + pr_err("Cannot map QE muram");
> > ret = -ENOMEM;
> > + goto out_pool;
> > }
> > -
> > -out:
> > + goto out_muram;
> > +out_pool:
> > + gen_pool_destroy(muram_pool);
> > +out_muram:
> > of_node_put(np);
> > return ret;
> > }
> >
> > -/**
> > +/*
> > * cpm_muram_alloc - allocate the requested size worth of multi-user ram
> > * @size: number of bytes to allocate
> > * @align: requested alignment, in bytes @@ -141,59 +151,102 @@ out:
> > */
> > unsigned long cpm_muram_alloc(unsigned long size, unsigned long
> > align) {
> > - unsigned long start;
> > unsigned long flags;
> > -
> > + unsigned long start;
> > + static struct genpool_data_align muram_pool_data;
> > spin_lock_irqsave(&cpm_muram_lock, flags);
> > - cpm_muram_info.alignment = align;
> > - start = rh_alloc(&cpm_muram_info, size, "commproc");
> > - memset(cpm_muram_addr(start), 0, size);
> > + muram_pool_data.align = align;
> > + gen_pool_set_algo(muram_pool, gen_pool_first_fit_align,
> > + &muram_pool_data);
> > + start = cpm_muram_alloc_common(size, &muram_pool_data);
> > spin_unlock_irqrestore(&cpm_muram_lock, flags);
> > -
> > return start;
> > }
> > EXPORT_SYMBOL(cpm_muram_alloc);
>
> Why is muram_pool_data static? Why is it being passed to
> gen_pool_set_algo()?
Cpm_muram use both align algo and fixed algo, so we need to set corresponding algo and
Algo data.
>The whole reason we're adding gen_pool_alloc_data()
> is to avoid that. Do we need gen_pool_alloc_algo() too?
We add gen_pool_alloc_data() to pass data to algo, because align algo and fixed algo,
Because align and fixed algos need specific data.
>
> Also, please maintain a blank line between variable declarations and code.
>
> > + return (unsigned long) -ENOMEM;
>
> No space after casts.
>
> -Scott
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20151023/64f1b939/attachment-0001.html>
More information about the Linuxppc-dev
mailing list