From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fabio Estevam Subject: Re: [PATCH v18 6/7] crypto: caam: cleanup CONFIG_64BIT ifdefs when using io{read|write}64 Date: Tue, 3 Jul 2018 20:52:37 -0300 Message-ID: References: <20180622194752.11221-1-logang@deltatee.com> <20180622194752.11221-7-logang@deltatee.com> <13ea3f97-4a33-3a24-1b7e-b819be73d867@deltatee.com> <6e5224b9-343f-990c-19bd-fe37c6fbdc9b@deltatee.com> <7ddda181-6337-32cc-7a0d-43fc6a7ba78b@deltatee.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Logan Gunthorpe Cc: Andy Shevchenko , Andrew Morton , linux-kernel , Linux-Arch , linux-ntb@googlegroups.com, "open list:HARDWARE RANDOM NUMBER GENERATOR CORE" , Arnd Bergmann , Greg Kroah-Hartman , =?UTF-8?Q?Horia_Geant=C4=83?= , Dan Douglass , Herbert Xu , "David S. Miller" List-Id: linux-arch.vger.kernel.org On Tue, Jul 3, 2018 at 8:20 PM, Logan Gunthorpe wrote: > Oh. So some IO in some other place must have changed to trigger the BUG... Yes, there are two 64-bit write operations inside caam_jr_init(). If I use the old 64-bit write function then things works fine: --- a/drivers/crypto/caam/jr.c +++ b/drivers/crypto/caam/jr.c @@ -384,6 +384,17 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, } EXPORT_SYMBOL(caam_jr_enqueue); +static inline void wr_reg64old(void __iomem *reg, u64 data) +{ + if (!caam_imx && caam_little_end) { + wr_reg32((u32 __iomem *)(reg) + 1, data >> 32); + wr_reg32((u32 __iomem *)(reg), data); + } else { + wr_reg32((u32 __iomem *)(reg), data >> 32); + wr_reg32((u32 __iomem *)(reg) + 1, data); + } +} + /* * Init JobR independent of platform property detection */ @@ -434,8 +445,8 @@ static int caam_jr_init(struct device *dev) jrp->head = 0; jrp->tail = 0; - wr_reg64(&jrp->rregs->inpring_base, inpbusaddr); - wr_reg64(&jrp->rregs->outring_base, outbusaddr); + wr_reg64old(&jrp->rregs->inpring_base, inpbusaddr); + wr_reg64old(&jrp->rregs->outring_base, outbusaddr); wr_reg32(&jrp->rregs->inpring_size, JOBR_DEPTH); wr_reg32(&jrp->rregs->outring_size, JOBR_DEPTH); From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi0-f66.google.com ([209.85.218.66]:45283 "EHLO mail-oi0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752606AbeGCXwj (ORCPT ); Tue, 3 Jul 2018 19:52:39 -0400 MIME-Version: 1.0 In-Reply-To: References: <20180622194752.11221-1-logang@deltatee.com> <20180622194752.11221-7-logang@deltatee.com> <13ea3f97-4a33-3a24-1b7e-b819be73d867@deltatee.com> <6e5224b9-343f-990c-19bd-fe37c6fbdc9b@deltatee.com> <7ddda181-6337-32cc-7a0d-43fc6a7ba78b@deltatee.com> From: Fabio Estevam Date: Tue, 3 Jul 2018 20:52:37 -0300 Message-ID: Subject: Re: [PATCH v18 6/7] crypto: caam: cleanup CONFIG_64BIT ifdefs when using io{read|write}64 Content-Type: text/plain; charset="UTF-8" Sender: linux-arch-owner@vger.kernel.org List-ID: To: Logan Gunthorpe Cc: Andy Shevchenko , Andrew Morton , linux-kernel , Linux-Arch , linux-ntb@googlegroups.com, "open list:HARDWARE RANDOM NUMBER GENERATOR CORE" , Arnd Bergmann , Greg Kroah-Hartman , =?UTF-8?Q?Horia_Geant=C4=83?= , Dan Douglass , Herbert Xu , "David S. Miller" Message-ID: <20180703235237.hU9TH7x9A0EnFSuwXKt3ChnAsKl6sYB2TLuqjHEyzvk@z> On Tue, Jul 3, 2018 at 8:20 PM, Logan Gunthorpe wrote: > Oh. So some IO in some other place must have changed to trigger the BUG... Yes, there are two 64-bit write operations inside caam_jr_init(). If I use the old 64-bit write function then things works fine: --- a/drivers/crypto/caam/jr.c +++ b/drivers/crypto/caam/jr.c @@ -384,6 +384,17 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, } EXPORT_SYMBOL(caam_jr_enqueue); +static inline void wr_reg64old(void __iomem *reg, u64 data) +{ + if (!caam_imx && caam_little_end) { + wr_reg32((u32 __iomem *)(reg) + 1, data >> 32); + wr_reg32((u32 __iomem *)(reg), data); + } else { + wr_reg32((u32 __iomem *)(reg), data >> 32); + wr_reg32((u32 __iomem *)(reg) + 1, data); + } +} + /* * Init JobR independent of platform property detection */ @@ -434,8 +445,8 @@ static int caam_jr_init(struct device *dev) jrp->head = 0; jrp->tail = 0; - wr_reg64(&jrp->rregs->inpring_base, inpbusaddr); - wr_reg64(&jrp->rregs->outring_base, outbusaddr); + wr_reg64old(&jrp->rregs->inpring_base, inpbusaddr); + wr_reg64old(&jrp->rregs->outring_base, outbusaddr); wr_reg32(&jrp->rregs->inpring_size, JOBR_DEPTH); wr_reg32(&jrp->rregs->outring_size, JOBR_DEPTH);