Message ID | 20240212135108.549755-5-avromanov@salutedevices.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Support more Amlogic SoC families in crypto driver | expand |
On 12/02/2024 14:50, Alexey Romanov wrote: > Add MMIO access helpers: meson_dma_start() and meson_dma_ready(). > > Signed-off-by: Alexey Romanov <avromanov@salutedevices.com> > --- > drivers/crypto/amlogic/amlogic-gxl-cipher.c | 2 +- > drivers/crypto/amlogic/amlogic-gxl-core.c | 24 ++++++++++++++++----- > drivers/crypto/amlogic/amlogic-gxl.h | 2 ++ > 3 files changed, 22 insertions(+), 6 deletions(-) > > diff --git a/drivers/crypto/amlogic/amlogic-gxl-cipher.c b/drivers/crypto/amlogic/amlogic-gxl-cipher.c > index 7eff3ae7356f..1fe916b0a138 100644 > --- a/drivers/crypto/amlogic/amlogic-gxl-cipher.c > +++ b/drivers/crypto/amlogic/amlogic-gxl-cipher.c > @@ -225,7 +225,7 @@ static int meson_cipher(struct skcipher_request *areq) > > reinit_completion(&mc->chanlist[flow].complete); > mc->chanlist[flow].status = 0; > - writel(mc->chanlist[flow].t_phy | 2, mc->base + ((mc->pdata->descs_reg + flow) << 2)); > + meson_dma_start(mc, flow); > wait_for_completion_interruptible_timeout(&mc->chanlist[flow].complete, > msecs_to_jiffies(500)); > if (mc->chanlist[flow].status == 0) { > diff --git a/drivers/crypto/amlogic/amlogic-gxl-core.c b/drivers/crypto/amlogic/amlogic-gxl-core.c > index 54113c524ec5..372c30f72072 100644 > --- a/drivers/crypto/amlogic/amlogic-gxl-core.c > +++ b/drivers/crypto/amlogic/amlogic-gxl-core.c > @@ -23,18 +23,32 @@ > > #include "amlogic-gxl.h" > > +void meson_dma_start(struct meson_dev *mc, int flow) > +{ > + u32 offset = (mc->pdata->descs_reg + flow) << 2; > + > + writel(mc->chanlist[flow].t_phy | 2, mc->base + offset); > +} > + > +static bool meson_dma_ready(struct meson_dev *mc, int flow) > +{ > + u32 offset = (mc->pdata->status_reg + flow) << 2; > + u32 data = readl(mc->base + offset); > + > + if (data) > + writel_relaxed(0xF, mc->base + offset); > + > + return data; > +} > + > static irqreturn_t meson_irq_handler(int irq, void *data) > { > struct meson_dev *mc = (struct meson_dev *)data; > int flow; > - u32 p; > > for (flow = 0; flow < mc->flow_cnt; flow++) { > if (mc->chanlist[flow].irq == irq) { > - p = readl(mc->base + ((mc->pdata->status_reg + flow) << 2)); > - if (p) { > - writel_relaxed(0xF, mc->base + > - ((mc->pdata->status_reg + flow) << 2)); > + if (meson_dma_ready(mc, flow)) { > mc->chanlist[flow].status = 1; > complete(&mc->chanlist[flow].complete); > return IRQ_HANDLED; > diff --git a/drivers/crypto/amlogic/amlogic-gxl.h b/drivers/crypto/amlogic/amlogic-gxl.h > index a36b9bac63a0..59fc6a67e0a9 100644 > --- a/drivers/crypto/amlogic/amlogic-gxl.h > +++ b/drivers/crypto/amlogic/amlogic-gxl.h > @@ -163,6 +163,8 @@ struct meson_alg_template { > #endif > }; > > +void meson_dma_start(struct meson_dev *mc, int flow); > + > int meson_enqueue(struct crypto_async_request *areq, u32 type); > > int meson_aes_setkey(struct crypto_skcipher *tfm, const u8 *key, Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
diff --git a/drivers/crypto/amlogic/amlogic-gxl-cipher.c b/drivers/crypto/amlogic/amlogic-gxl-cipher.c index 7eff3ae7356f..1fe916b0a138 100644 --- a/drivers/crypto/amlogic/amlogic-gxl-cipher.c +++ b/drivers/crypto/amlogic/amlogic-gxl-cipher.c @@ -225,7 +225,7 @@ static int meson_cipher(struct skcipher_request *areq) reinit_completion(&mc->chanlist[flow].complete); mc->chanlist[flow].status = 0; - writel(mc->chanlist[flow].t_phy | 2, mc->base + ((mc->pdata->descs_reg + flow) << 2)); + meson_dma_start(mc, flow); wait_for_completion_interruptible_timeout(&mc->chanlist[flow].complete, msecs_to_jiffies(500)); if (mc->chanlist[flow].status == 0) { diff --git a/drivers/crypto/amlogic/amlogic-gxl-core.c b/drivers/crypto/amlogic/amlogic-gxl-core.c index 54113c524ec5..372c30f72072 100644 --- a/drivers/crypto/amlogic/amlogic-gxl-core.c +++ b/drivers/crypto/amlogic/amlogic-gxl-core.c @@ -23,18 +23,32 @@ #include "amlogic-gxl.h" +void meson_dma_start(struct meson_dev *mc, int flow) +{ + u32 offset = (mc->pdata->descs_reg + flow) << 2; + + writel(mc->chanlist[flow].t_phy | 2, mc->base + offset); +} + +static bool meson_dma_ready(struct meson_dev *mc, int flow) +{ + u32 offset = (mc->pdata->status_reg + flow) << 2; + u32 data = readl(mc->base + offset); + + if (data) + writel_relaxed(0xF, mc->base + offset); + + return data; +} + static irqreturn_t meson_irq_handler(int irq, void *data) { struct meson_dev *mc = (struct meson_dev *)data; int flow; - u32 p; for (flow = 0; flow < mc->flow_cnt; flow++) { if (mc->chanlist[flow].irq == irq) { - p = readl(mc->base + ((mc->pdata->status_reg + flow) << 2)); - if (p) { - writel_relaxed(0xF, mc->base + - ((mc->pdata->status_reg + flow) << 2)); + if (meson_dma_ready(mc, flow)) { mc->chanlist[flow].status = 1; complete(&mc->chanlist[flow].complete); return IRQ_HANDLED; diff --git a/drivers/crypto/amlogic/amlogic-gxl.h b/drivers/crypto/amlogic/amlogic-gxl.h index a36b9bac63a0..59fc6a67e0a9 100644 --- a/drivers/crypto/amlogic/amlogic-gxl.h +++ b/drivers/crypto/amlogic/amlogic-gxl.h @@ -163,6 +163,8 @@ struct meson_alg_template { #endif }; +void meson_dma_start(struct meson_dev *mc, int flow); + int meson_enqueue(struct crypto_async_request *areq, u32 type); int meson_aes_setkey(struct crypto_skcipher *tfm, const u8 *key,
Add MMIO access helpers: meson_dma_start() and meson_dma_ready(). Signed-off-by: Alexey Romanov <avromanov@salutedevices.com> --- drivers/crypto/amlogic/amlogic-gxl-cipher.c | 2 +- drivers/crypto/amlogic/amlogic-gxl-core.c | 24 ++++++++++++++++----- drivers/crypto/amlogic/amlogic-gxl.h | 2 ++ 3 files changed, 22 insertions(+), 6 deletions(-)