lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 352/917] crypto: caam - disable pkc for non-E SoCs
    Date
    From: Michael Walle <michael@walle.cc>

    [ Upstream commit f20311cc9c58052e0b215013046cbf390937910c ]

    On newer CAAM versions, not all accelerators are disabled if the SoC is
    a non-E variant. While the driver checks most of the modules for
    availability, there is one - PKHA - which sticks out. On non-E variants
    it is still reported as available, that is the number of instances is
    non-zero, but it has limited functionality. In particular it doesn't
    support encryption and decryption, but just signing and verifying. This
    is indicated by a bit in the PKHA_MISC field. Take this bit into account
    if we are checking for availability.

    This will the following error:
    [ 8.167817] caam_jr 8020000.jr: 20000b0f: CCB: desc idx 11: : Invalid CHA selected.

    Tested on an NXP LS1028A (non-E) SoC.

    Fixes: d239b10d4ceb ("crypto: caam - add register map changes cf. Era 10")
    Signed-off-by: Michael Walle <michael@walle.cc>
    Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/crypto/caam/caampkc.c | 19 +++++++++++++++----
    drivers/crypto/caam/regs.h | 3 +++
    2 files changed, 18 insertions(+), 4 deletions(-)

    diff --git a/drivers/crypto/caam/caampkc.c b/drivers/crypto/caam/caampkc.c
    index e313233ec6de7..bf6275ffc4aad 100644
    --- a/drivers/crypto/caam/caampkc.c
    +++ b/drivers/crypto/caam/caampkc.c
    @@ -1153,16 +1153,27 @@ static struct caam_akcipher_alg caam_rsa = {
    int caam_pkc_init(struct device *ctrldev)
    {
    struct caam_drv_private *priv = dev_get_drvdata(ctrldev);
    - u32 pk_inst;
    + u32 pk_inst, pkha;
    int err;
    init_done = false;

    /* Determine public key hardware accelerator presence. */
    - if (priv->era < 10)
    + if (priv->era < 10) {
    pk_inst = (rd_reg32(&priv->ctrl->perfmon.cha_num_ls) &
    CHA_ID_LS_PK_MASK) >> CHA_ID_LS_PK_SHIFT;
    - else
    - pk_inst = rd_reg32(&priv->ctrl->vreg.pkha) & CHA_VER_NUM_MASK;
    + } else {
    + pkha = rd_reg32(&priv->ctrl->vreg.pkha);
    + pk_inst = pkha & CHA_VER_NUM_MASK;
    +
    + /*
    + * Newer CAAMs support partially disabled functionality. If this is the
    + * case, the number is non-zero, but this bit is set to indicate that
    + * no encryption or decryption is supported. Only signing and verifying
    + * is supported.
    + */
    + if (pkha & CHA_VER_MISC_PKHA_NO_CRYPT)
    + pk_inst = 0;
    + }

    /* Do not register algorithms if PKHA is not present. */
    if (!pk_inst)
    diff --git a/drivers/crypto/caam/regs.h b/drivers/crypto/caam/regs.h
    index af61f3a2c0d46..3738625c02509 100644
    --- a/drivers/crypto/caam/regs.h
    +++ b/drivers/crypto/caam/regs.h
    @@ -322,6 +322,9 @@ struct version_regs {
    /* CHA Miscellaneous Information - AESA_MISC specific */
    #define CHA_VER_MISC_AES_GCM BIT(1 + CHA_VER_MISC_SHIFT)

    +/* CHA Miscellaneous Information - PKHA_MISC specific */
    +#define CHA_VER_MISC_PKHA_NO_CRYPT BIT(7 + CHA_VER_MISC_SHIFT)
    +
    /*
    * caam_perfmon - Performance Monitor/Secure Memory Status/
    * CAAM Global Status/Component Version IDs
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 00:40    [W:2.556 / U:3.628 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site