soc: fsl patches

Christian Zigotzky chzigotzky at xenosoft.de
Fri Nov 29 06:29:27 AEDT 2019


Hello Rasmus,

I have seen a lot of fsl soc patches from you.

Could you please post what you have modified? Did you test your patches on FSL SoC machines?

Thanks,
Christian

Sent from my iPhone

> On 28. Nov 2019, at 16:00, linuxppc-dev-request at lists.ozlabs.org wrote:
> 
> Send Linuxppc-dev mailing list submissions to
>    linuxppc-dev at lists.ozlabs.org
> 
> To subscribe or unsubscribe via the World Wide Web, visit
>    https://lists.ozlabs.org/listinfo/linuxppc-dev
> or, via email, send a message with subject or body 'help' to
>    linuxppc-dev-request at lists.ozlabs.org
> 
> You can reach the person managing the list at
>    linuxppc-dev-owner at lists.ozlabs.org
> 
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of Linuxppc-dev digest..."
> 
> 
> Today's Topics:
> 
>   1. [PATCH v6 36/49] soc: fsl: qe: make cpm_muram_free() return
>      void (Rasmus Villemoes)
>   2. [PATCH v6 37/49] soc: fsl: qe: make cpm_muram_free() ignore a
>      negative offset (Rasmus Villemoes)
>   3. [PATCH v6 38/49] soc: fsl: qe: drop broken lazy call of
>      cpm_muram_init() (Rasmus Villemoes)
>   4. [PATCH v6 39/49] soc: fsl: qe: refactor
>      cpm_muram_alloc_common to prevent BUG on error path (Rasmus Villemoes)
>   5. [PATCH v6 40/49] soc: fsl: qe: avoid IS_ERR_VALUE in
>      ucc_slow.c (Rasmus Villemoes)
> 
> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: Thu, 28 Nov 2019 15:55:41 +0100
> From: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> To: Qiang Zhao <qiang.zhao at nxp.com>, Li Yang <leoyang.li at nxp.com>,
>    Christophe Leroy <christophe.leroy at c-s.fr>
> Cc: linuxppc-dev at lists.ozlabs.org,
>    linux-arm-kernel at lists.infradead.org, linux-kernel at vger.kernel.org,
>    Scott Wood <oss at buserror.net>, Timur Tabi <timur at kernel.org>, Rasmus
>    Villemoes <linux at rasmusvillemoes.dk>
> Send Linuxppc-dev mailing list submissions to
>    linuxppc-dev at lists.ozlabs.org
> 
> To subscribe or unsubscribe via the World Wide Web, visit
>    https://lists.ozlabs.org/listinfo/linuxppc-dev
> or, via email, send a message with subject or body 'help' to
>    linuxppc-dev-request at lists.ozlabs.org
> 
> You can reach the person managing the list at
>    linuxppc-dev-owner at lists.ozlabs.org
> 
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of Linuxppc-dev digest..."
> 
> 
> Today's Topics:
> 
>   1. [PATCH v6 36/49] soc: fsl: qe: make cpm_muram_free() return
>      void (Rasmus Villemoes)
>   2. [PATCH v6 37/49] soc: fsl: qe: make cpm_muram_free() ignore a
>      negative offset (Rasmus Villemoes)
>   3. [PATCH v6 38/49] soc: fsl: qe: drop broken lazy call of
>      cpm_muram_init() (Rasmus Villemoes)
>   4. [PATCH v6 39/49] soc: fsl: qe: refactor
>      cpm_muram_alloc_common to prevent BUG on error path (Rasmus Villemoes)
>   5. [PATCH v6 40/49] soc: fsl: qe: avoid IS_ERR_VALUE in
>      ucc_slow.c (Rasmus Villemoes)
> 
> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: Thu, 28 Nov 2019 15:55:41 +0100
> From: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> To: Qiang Zhao <qiang.zhao at nxp.com>, Li Yang <leoyang.li at nxp.com>,
>    Christophe Leroy <christophe.leroy at c-s.fr>
> Cc: linuxppc-dev at lists.ozlabs.org,
>    linux-arm-kernel at lists.infradead.org, linux-kernel at vger.kernel.org,
>    Scott Wood <oss at buserror.net>, Timur Tabi <timur at kernel.org>, Rasmus
>    Villemoes <linux at rasmusvillemoes.dk>
> Subject: [PATCH v6 36/49] soc: fsl: qe: make cpm_muram_free() return
>    void
> Message-ID: <20191128145554.1297-37-linux at rasmusvillemoes.dk>
> 
> Nobody uses the return value from cpm_muram_free, and functions that
> free resources usually return void. One could imagine a use for a "how
> much have I allocated" a la ksize(), but knowing how much one had
> access to after the fact is useless.
> 
> Reviewed-by: Timur Tabi <timur at kernel.org>
> Signed-off-by: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> ---
> drivers/soc/fsl/qe/qe_common.c | 3 +--
> include/soc/fsl/qe/qe.h        | 5 ++---
> 2 files changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/soc/fsl/qe/qe_common.c b/drivers/soc/fsl/qe/qe_common.c
> index 84c90105e588..962835488f66 100644
> --- a/drivers/soc/fsl/qe/qe_common.c
> +++ b/drivers/soc/fsl/qe/qe_common.c
> @@ -170,7 +170,7 @@ EXPORT_SYMBOL(cpm_muram_alloc);
>  * cpm_muram_free - free a chunk of multi-user ram
>  * @offset: The beginning of the chunk as returned by cpm_muram_alloc().
>  */
> -int cpm_muram_free(s32 offset)
> +void cpm_muram_free(s32 offset)
> {
>    unsigned long flags;
>    int size;
> @@ -188,7 +188,6 @@ int cpm_muram_free(s32 offset)
>    }
>    gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size);
>    spin_unlock_irqrestore(&cpm_muram_lock, flags);
> -    return size;
> }
> EXPORT_SYMBOL(cpm_muram_free);
> 
> diff --git a/include/soc/fsl/qe/qe.h b/include/soc/fsl/qe/qe.h
> index f589ae3f1216..e282ac01ec08 100644
> --- a/include/soc/fsl/qe/qe.h
> +++ b/include/soc/fsl/qe/qe.h
> @@ -99,7 +99,7 @@ int cpm_muram_init(void);
> 
> #if defined(CONFIG_CPM) || defined(CONFIG_QUICC_ENGINE)
> s32 cpm_muram_alloc(unsigned long size, unsigned long align);
> -int cpm_muram_free(s32 offset);
> +void cpm_muram_free(s32 offset);
> s32 cpm_muram_alloc_fixed(unsigned long offset, unsigned long size);
> void __iomem *cpm_muram_addr(unsigned long offset);
> unsigned long cpm_muram_offset(void __iomem *addr);
> @@ -111,9 +111,8 @@ static inline s32 cpm_muram_alloc(unsigned long size,
>    return -ENOSYS;
> }
> 
> -static inline int cpm_muram_free(s32 offset)
> +static inline void cpm_muram_free(s32 offset)
> {
> -    return -ENOSYS;
> }
> 
> static inline s32 cpm_muram_alloc_fixed(unsigned long offset,
> -- 
> 2.23.0
> 
> 
> 
> ------------------------------
> 
> Message: 2
> Date: Thu, 28 Nov 2019 15:55:42 +0100
> From: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> To: Qiang Zhao <qiang.zhao at nxp.com>, Li Yang <leoyang.li at nxp.com>,
>    Christophe Leroy <christophe.leroy at c-s.fr>
> Cc: linuxppc-dev at lists.ozlabs.org,
>    linux-arm-kernel at lists.infradead.org, linux-kernel at vger.kernel.org,
>    Scott Wood <oss at buserror.net>, Timur Tabi <timur at kernel.org>, Rasmus
>    Villemoes <linux at rasmusvillemoes.dk>
> Subject: [PATCH v6 37/49] soc: fsl: qe: make cpm_muram_free() ignore a
>    negative offset
> Message-ID: <20191128145554.1297-38-linux at rasmusvillemoes.dk>
> 
> This allows one to simplify callers since they can store a negative
> value as a sentinel to indicate "this was never allocated" (or store
> the -ENOMEM from an allocation failure) and then call cpm_muram_free()
> unconditionally.
> 
> Reviewed-by: Timur Tabi <timur at kernel.org>
> Signed-off-by: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> ---
> drivers/soc/fsl/qe/qe_common.c | 3 +++
> 1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/soc/fsl/qe/qe_common.c b/drivers/soc/fsl/qe/qe_common.c
> index 962835488f66..48c77bb92846 100644
> --- a/drivers/soc/fsl/qe/qe_common.c
> +++ b/drivers/soc/fsl/qe/qe_common.c
> @@ -176,6 +176,9 @@ void cpm_muram_free(s32 offset)
>    int size;
>    struct muram_block *tmp;
> 
> +    if (offset < 0)
> +        return;
> +
>    size = 0;
>    spin_lock_irqsave(&cpm_muram_lock, flags);
>    list_for_each_entry(tmp, &muram_block_list, head) {
> -- 
> 2.23.0
> 
> 
> 
> ------------------------------
> 
> Message: 3
> Date: Thu, 28 Nov 2019 15:55:43 +0100
> From: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> To: Qiang Zhao <qiang.zhao at nxp.com>, Li Yang <leoyang.li at nxp.com>,
>    Christophe Leroy <christophe.leroy at c-s.fr>
> Cc: linuxppc-dev at lists.ozlabs.org,
>    linux-arm-kernel at lists.infradead.org, linux-kernel at vger.kernel.org,
>    Scott Wood <oss at buserror.net>, Timur Tabi <timur at kernel.org>, Rasmus
>    Villemoes <linux at rasmusvillemoes.dk>
> Subject: [PATCH v6 38/49] soc: fsl: qe: drop broken lazy call of
>    cpm_muram_init()
> Message-ID: <20191128145554.1297-39-linux at rasmusvillemoes.dk>
> 
> cpm_muram_alloc_common() tries to support a kind of lazy
> initialization - if the muram_pool has not been created yet, it calls
> cpm_muram_init(). Now, cpm_muram_alloc_common() is always called under
> 
>    spin_lock_irqsave(&cpm_muram_lock, flags);
> 
> and cpm_muram_init() does gen_pool_create() (which implies a
> GFP_KERNEL allocation) and ioremap(), not to mention the fun that
> ensues from cpm_muram_init() doing
> 
>    spin_lock_init(&cpm_muram_lock);
> 
> In other words, this has never worked, so nobody can have been relying
> on it.
> 
> cpm_muram_init() is called from a subsys_initcall (either from
> cpm_init() in arch/powerpc/sysdev/cpm_common.c or, via qe_reset(),
> from qe_init() in drivers/soc/fsl/qe/qe.c).
> 
> Reviewed-by: Timur Tabi <timur at kernel.org>
> Signed-off-by: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> ---
> drivers/soc/fsl/qe/qe_common.c | 3 ---
> 1 file changed, 3 deletions(-)
> 
> diff --git a/drivers/soc/fsl/qe/qe_common.c b/drivers/soc/fsl/qe/qe_common.c
> index 48c77bb92846..dcb267567d76 100644
> --- a/drivers/soc/fsl/qe/qe_common.c
> +++ b/drivers/soc/fsl/qe/qe_common.c
> @@ -119,9 +119,6 @@ static s32 cpm_muram_alloc_common(unsigned long size,
>    struct muram_block *entry;
>    s32 start;
> 
> -    if (!muram_pool && cpm_muram_init())
> -        goto out2;
> -
>    start = gen_pool_alloc_algo(muram_pool, size, algo, data);
>    if (!start)
>        goto out2;
> -- 
> 2.23.0
> 
> 
> 
> ------------------------------
> 
> Message: 4
> Date: Thu, 28 Nov 2019 15:55:44 +0100
> From: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> To: Qiang Zhao <qiang.zhao at nxp.com>, Li Yang <leoyang.li at nxp.com>,
>    Christophe Leroy <christophe.leroy at c-s.fr>
> Cc: linuxppc-dev at lists.ozlabs.org,
>    linux-arm-kernel at lists.infradead.org, linux-kernel at vger.kernel.org,
>    Scott Wood <oss at buserror.net>, Timur Tabi <timur at kernel.org>, Rasmus
>    Villemoes <linux at rasmusvillemoes.dk>
> Subject: [PATCH v6 39/49] soc: fsl: qe: refactor
>    cpm_muram_alloc_common to prevent BUG on error path
> Message-ID: <20191128145554.1297-40-linux at rasmusvillemoes.dk>
> 
> If the kmalloc() fails, we try to undo the gen_pool allocation we've
> just done. Unfortunately, start has already been modified to subtract
> the GENPOOL_OFFSET bias, so we're freeing something that very likely
> doesn't exist in the gen_pool, meaning we hit the
> 
> kernel BUG at lib/genalloc.c:399!
> Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM
> ...
> [<803fd0e8>] (gen_pool_free) from [<80426bc8>] (cpm_muram_alloc_common+0xb0/0xc8)
> [<80426bc8>] (cpm_muram_alloc_common) from [<80426c28>] (cpm_muram_alloc+0x48/0x80)
> [<80426c28>] (cpm_muram_alloc) from [<80428214>] (ucc_slow_init+0x110/0x4f0)
> [<80428214>] (ucc_slow_init) from [<8044a718>] (qe_uart_request_port+0x3c/0x1d8)
> 
> (this was tested by just injecting a random failure by adding
> "|| (get_random_int()&7) == 0" to the "if (!entry)" condition).
> 
> Refactor the code so we do the kmalloc() first, meaning that's the
> thing that needs undoing in case gen_pool_alloc_algo() then
> fails. This allows a later cleanup to move the locking from the
> callers into the _common function, keeping the kmalloc() out of the
> critical region and then, hopefully (if all the muram_alloc callers
> allow) change it to a GFP_KERNEL allocation.
> 
> Reviewed-by: Timur Tabi <timur at kernel.org>
> Signed-off-by: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> ---
> drivers/soc/fsl/qe/qe_common.c | 16 +++++++---------
> 1 file changed, 7 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/soc/fsl/qe/qe_common.c b/drivers/soc/fsl/qe/qe_common.c
> index dcb267567d76..a81a1a79f1ca 100644
> --- a/drivers/soc/fsl/qe/qe_common.c
> +++ b/drivers/soc/fsl/qe/qe_common.c
> @@ -119,23 +119,21 @@ static s32 cpm_muram_alloc_common(unsigned long size,
>    struct muram_block *entry;
>    s32 start;
> 
> +    entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
> +    if (!entry)
> +        return -ENOMEM;
>    start = gen_pool_alloc_algo(muram_pool, size, algo, data);
> -    if (!start)
> -        goto out2;
> +    if (!start) {
> +        kfree(entry);
> +        return -ENOMEM;
> +    }
>    start = start - GENPOOL_OFFSET;
>    memset_io(cpm_muram_addr(start), 0, size);
> -    entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
> -    if (!entry)
> -        goto out1;
>    entry->start = start;
>    entry->size = size;
>    list_add(&entry->head, &muram_block_list);
> 
>    return start;
> -out1:
> -    gen_pool_free(muram_pool, start, size);
> -out2:
> -    return -ENOMEM;
> }
> 
> /*
> -- 
> 2.23.0
> 
> 
> 
> ------------------------------
> 
> Message: 5
> Date: Thu, 28 Nov 2019 15:55:45 +0100
> From: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> To: Qiang Zhao <qiang.zhao at nxp.com>, Li Yang <leoyang.li at nxp.com>,
>    Christophe Leroy <christophe.leroy at c-s.fr>
> Cc: linuxppc-dev at lists.ozlabs.org,
>    linux-arm-kernel at lists.infradead.org, linux-kernel at vger.kernel.org,
>    Scott Wood <oss at buserror.net>, Timur Tabi <timur at kernel.org>, Rasmus
>    Villemoes <linux at rasmusvillemoes.dk>
> Subject: [PATCH v6 40/49] soc: fsl: qe: avoid IS_ERR_VALUE in
>    ucc_slow.c
> Message-ID: <20191128145554.1297-41-linux at rasmusvillemoes.dk>
> 
> When trying to build this for a 64-bit platform, one gets warnings
> from using IS_ERR_VALUE on something which is not sizeof(long).
> 
> Instead, change the various *_offset fields to store a signed integer,
> and simply check for a negative return from qe_muram_alloc(). Since
> qe_muram_free() now accepts and ignores a negative argument, we only
> need to make sure these fields are initialized with -1, and we can
> just unconditionally call qe_muram_free() in ucc_slow_free().
> 
> Note that the error case for us_pram_offset failed to set that field
> to 0 (which, as noted earlier, is anyway a bogus sentinel value).
> 
> Reviewed-by: Timur Tabi <timur at kernel.org>
> Signed-off-by: Rasmus Villemoes <linux at rasmusvillemoes.dk>
> ---
> drivers/soc/fsl/qe/ucc_slow.c | 22 +++++++++-------------
> include/soc/fsl/qe/ucc_slow.h |  6 +++---
> 2 files changed, 12 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/soc/fsl/qe/ucc_slow.c b/drivers/soc/fsl/qe/ucc_slow.c
> index 9b55fd0f50c6..274d34449846 100644
> --- a/drivers/soc/fsl/qe/ucc_slow.c
> +++ b/drivers/soc/fsl/qe/ucc_slow.c
> @@ -154,6 +154,9 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
>            __func__);
>        return -ENOMEM;
>    }
> +    uccs->rx_base_offset = -1;
> +    uccs->tx_base_offset = -1;
> +    uccs->us_pram_offset = -1;
> 
>    /* Fill slow UCC structure */
>    uccs->us_info = us_info;
> @@ -179,7 +182,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
>    /* Get PRAM base */
>    uccs->us_pram_offset =
>        qe_muram_alloc(UCC_SLOW_PRAM_SIZE, ALIGNMENT_OF_UCC_SLOW_PRAM);
> -    if (IS_ERR_VALUE(uccs->us_pram_offset)) {
> +    if (uccs->us_pram_offset < 0) {
>        printk(KERN_ERR "%s: cannot allocate MURAM for PRAM", __func__);
>        ucc_slow_free(uccs);
>        return -ENOMEM;
> @@ -206,10 +209,9 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
>    uccs->rx_base_offset =
>        qe_muram_alloc(us_info->rx_bd_ring_len * sizeof(struct qe_bd),
>                QE_ALIGNMENT_OF_BD);
> -    if (IS_ERR_VALUE(uccs->rx_base_offset)) {
> +    if (uccs->rx_base_offset < 0) {
>        printk(KERN_ERR "%s: cannot allocate %u RX BDs\n", __func__,
>            us_info->rx_bd_ring_len);
> -        uccs->rx_base_offset = 0;
>        ucc_slow_free(uccs);
>        return -ENOMEM;
>    }
> @@ -217,9 +219,8 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
>    uccs->tx_base_offset =
>        qe_muram_alloc(us_info->tx_bd_ring_len * sizeof(struct qe_bd),
>            QE_ALIGNMENT_OF_BD);
> -    if (IS_ERR_VALUE(uccs->tx_base_offset)) {
> +    if (uccs->tx_base_offset < 0) {
>        printk(KERN_ERR "%s: cannot allocate TX BDs", __func__);
> -        uccs->tx_base_offset = 0;
>        ucc_slow_free(uccs);
>        return -ENOMEM;
>    }
> @@ -352,14 +353,9 @@ void ucc_slow_free(struct ucc_slow_private * uccs)
>    if (!uccs)
>        return;
> 
> -    if (uccs->rx_base_offset)
> -        qe_muram_free(uccs->rx_base_offset);
> -
> -    if (uccs->tx_base_offset)
> -        qe_muram_free(uccs->tx_base_offset);
> -
> -    if (uccs->us_pram)
> -        qe_muram_free(uccs->us_pram_offset);
> +    qe_muram_free(uccs->rx_base_offset);
> +    qe_muram_free(uccs->tx_base_offset);
> +    qe_muram_free(uccs->us_pram_offset);
> 
>    if (uccs->us_regs)
>        iounmap(uccs->us_regs);
> diff --git a/include/soc/fsl/qe/ucc_slow.h b/include/soc/fsl/qe/ucc_slow.h
> index 8696fdea2ae9..d187a6be83bc 100644
> --- a/include/soc/fsl/qe/ucc_slow.h
> +++ b/include/soc/fsl/qe/ucc_slow.h
> @@ -185,7 +185,7 @@ struct ucc_slow_private {
>    struct ucc_slow_info *us_info;
>    struct ucc_slow __iomem *us_regs; /* Ptr to memory map of UCC regs */
>    struct ucc_slow_pram *us_pram;    /* a pointer to the parameter RAM */
> -    u32 us_pram_offset;
> +    s32 us_pram_offset;
>    int enabled_tx;        /* Whether channel is enabled for Tx (ENT) */
>    int enabled_rx;        /* Whether channel is enabled for Rx (ENR) */
>    int stopped_tx;        /* Whether channel has been stopped for Tx
> @@ -194,8 +194,8 @@ struct ucc_slow_private {
>    struct list_head confQ;    /* frames passed to chip waiting for tx */
>    u32 first_tx_bd_mask;    /* mask is used in Tx routine to save status
>                   and length for first BD in a frame */
> -    u32 tx_base_offset;    /* first BD in Tx BD table offset (In MURAM) */
> -    u32 rx_base_offset;    /* first BD in Rx BD table offset (In MURAM) */
> +    s32 tx_base_offset;    /* first BD in Tx BD table offset (In MURAM) */
> +    s32 rx_base_offset;    /* first BD in Rx BD table offset (In MURAM) */
>    struct qe_bd *confBd;    /* next BD for confirm after Tx */
>    struct qe_bd *tx_bd;    /* next BD for new Tx request */
>    struct qe_bd *rx_bd;    /* next BD to collect after Rx */
> -- 
> 2.23.0
> 
> 
> 
> ------------------------------
> 
> Subject: Digest Footer
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
> 
> 
> ------------------------------
> 
> End of Linuxppc-dev Digest, Vol 183, Issue 481
> **********************************************



More information about the Linuxppc-dev mailing list