[2/2] crypto: ccree - fix debugfs register access while suspended
diff mbox series

Message ID 20200124132957.15769-3-geert+renesas@glider.be
State Superseded
Delegated to: Herbert Xu
Headers show
Series
  • Fix debugfs register access while suspended
Related show

Commit Message

Geert Uytterhoeven Jan. 24, 2020, 1:29 p.m. UTC
Reading the debugfs files under /sys/kernel/debug/ccree/ can be done by
the user at any time.  On R-Car SoCs, the CCREE device is power-managed
using a moduile clock, and if this clock is not running, bogus register
values may be read.

Fix this by filling in the debugfs_regset32.dev field, so debugfs will
make sure the device is resumed while its registers are being read.

This fixes the bogus values (0x00000260) in the register dumps on R-Car
H3 ES1.0:

    -e6601000.crypto/regs:HOST_IRR = 0x00000260
    -e6601000.crypto/regs:HOST_POWER_DOWN_EN = 0x00000260
    +e6601000.crypto/regs:HOST_IRR = 0x00000038
    +e6601000.crypto/regs:HOST_POWER_DOWN_EN = 0x00000038
     e6601000.crypto/regs:AXIM_MON_ERR = 0x00000000
     e6601000.crypto/regs:DSCRPTR_QUEUE_CONTENT = 0x000002aa
    -e6601000.crypto/regs:HOST_IMR = 0x00000260
    +e6601000.crypto/regs:HOST_IMR = 0x017ffeff
     e6601000.crypto/regs:AXIM_CFG = 0x001f0007
     e6601000.crypto/regs:AXIM_CACHE_PARAMS = 0x00000000
    -e6601000.crypto/regs:GPR_HOST = 0x00000260
    +e6601000.crypto/regs:GPR_HOST = 0x017ffeff
     e6601000.crypto/regs:AXIM_MON_COMP = 0x00000000
    -e6601000.crypto/version:SIGNATURE = 0x00000260
    -e6601000.crypto/version:VERSION = 0x00000260
    +e6601000.crypto/version:SIGNATURE = 0xdcc63000
    +e6601000.crypto/version:VERSION = 0xaf400001

Note that this behavior is system-dependent, and the issue does not show
up on all R-Car Gen3 SoCs and boards.  Even when the device is
suspended, the module clock may be left enabled, if configured by the
firmware for Secure Mode, or when controlled by the Real-Time Core.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
 drivers/crypto/ccree/cc_debugfs.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Gilad Ben-Yossef Jan. 26, 2020, 1:32 p.m. UTC | #1
On Fri, Jan 24, 2020 at 3:30 PM Geert Uytterhoeven
<geert+renesas@glider.be> wrote:
>
> Reading the debugfs files under /sys/kernel/debug/ccree/ can be done by
> the user at any time.  On R-Car SoCs, the CCREE device is power-managed
> using a moduile clock, and if this clock is not running, bogus register
> values may be read.
>
> Fix this by filling in the debugfs_regset32.dev field, so debugfs will
> make sure the device is resumed while its registers are being read.
>
> This fixes the bogus values (0x00000260) in the register dumps on R-Car
> H3 ES1.0:
>
>     -e6601000.crypto/regs:HOST_IRR = 0x00000260
>     -e6601000.crypto/regs:HOST_POWER_DOWN_EN = 0x00000260
>     +e6601000.crypto/regs:HOST_IRR = 0x00000038
>     +e6601000.crypto/regs:HOST_POWER_DOWN_EN = 0x00000038
>      e6601000.crypto/regs:AXIM_MON_ERR = 0x00000000
>      e6601000.crypto/regs:DSCRPTR_QUEUE_CONTENT = 0x000002aa
>     -e6601000.crypto/regs:HOST_IMR = 0x00000260
>     +e6601000.crypto/regs:HOST_IMR = 0x017ffeff
>      e6601000.crypto/regs:AXIM_CFG = 0x001f0007
>      e6601000.crypto/regs:AXIM_CACHE_PARAMS = 0x00000000
>     -e6601000.crypto/regs:GPR_HOST = 0x00000260
>     +e6601000.crypto/regs:GPR_HOST = 0x017ffeff
>      e6601000.crypto/regs:AXIM_MON_COMP = 0x00000000
>     -e6601000.crypto/version:SIGNATURE = 0x00000260
>     -e6601000.crypto/version:VERSION = 0x00000260
>     +e6601000.crypto/version:SIGNATURE = 0xdcc63000
>     +e6601000.crypto/version:VERSION = 0xaf400001
>
> Note that this behavior is system-dependent, and the issue does not show
> up on all R-Car Gen3 SoCs and boards.  Even when the device is
> suspended, the module clock may be left enabled, if configured by the
> firmware for Secure Mode, or when controlled by the Real-Time Core.
>
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
> ---
>  drivers/crypto/ccree/cc_debugfs.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/crypto/ccree/cc_debugfs.c b/drivers/crypto/ccree/cc_debugfs.c
> index 5669997386988055..35f3a2137502bd96 100644
> --- a/drivers/crypto/ccree/cc_debugfs.c
> +++ b/drivers/crypto/ccree/cc_debugfs.c
> @@ -81,6 +81,7 @@ int cc_debugfs_init(struct cc_drvdata *drvdata)
>         regset->regs = debug_regs;
>         regset->nregs = ARRAY_SIZE(debug_regs);
>         regset->base = drvdata->cc_base;
> +       regset->dev = dev;
>
>         ctx->dir = debugfs_create_dir(drvdata->plat_dev->name, cc_debugfs_dir);
>
> @@ -102,6 +103,7 @@ int cc_debugfs_init(struct cc_drvdata *drvdata)
>                 verset->nregs = ARRAY_SIZE(pid_cid_regs);
>         }
>         verset->base = drvdata->cc_base;
> +       verset->dev = dev;
>
>         debugfs_create_regset32("version", 0400, ctx->dir, verset);
>
> --
> 2.17.1
>


Acked-by: Gilad Ben-Yossef <gilad@benyossef.com>

Thanks,
Gilad
Rafael J. Wysocki Jan. 31, 2020, 10:11 a.m. UTC | #2
On Fri, Jan 24, 2020 at 2:30 PM Geert Uytterhoeven
<geert+renesas@glider.be> wrote:
>
> Reading the debugfs files under /sys/kernel/debug/ccree/ can be done by
> the user at any time.  On R-Car SoCs, the CCREE device is power-managed
> using a moduile clock, and if this clock is not running, bogus register
> values may be read.
>
> Fix this by filling in the debugfs_regset32.dev field, so debugfs will
> make sure the device is resumed while its registers are being read.
>
> This fixes the bogus values (0x00000260) in the register dumps on R-Car
> H3 ES1.0:
>
>     -e6601000.crypto/regs:HOST_IRR = 0x00000260
>     -e6601000.crypto/regs:HOST_POWER_DOWN_EN = 0x00000260
>     +e6601000.crypto/regs:HOST_IRR = 0x00000038
>     +e6601000.crypto/regs:HOST_POWER_DOWN_EN = 0x00000038
>      e6601000.crypto/regs:AXIM_MON_ERR = 0x00000000
>      e6601000.crypto/regs:DSCRPTR_QUEUE_CONTENT = 0x000002aa
>     -e6601000.crypto/regs:HOST_IMR = 0x00000260
>     +e6601000.crypto/regs:HOST_IMR = 0x017ffeff
>      e6601000.crypto/regs:AXIM_CFG = 0x001f0007
>      e6601000.crypto/regs:AXIM_CACHE_PARAMS = 0x00000000
>     -e6601000.crypto/regs:GPR_HOST = 0x00000260
>     +e6601000.crypto/regs:GPR_HOST = 0x017ffeff
>      e6601000.crypto/regs:AXIM_MON_COMP = 0x00000000
>     -e6601000.crypto/version:SIGNATURE = 0x00000260
>     -e6601000.crypto/version:VERSION = 0x00000260
>     +e6601000.crypto/version:SIGNATURE = 0xdcc63000
>     +e6601000.crypto/version:VERSION = 0xaf400001
>
> Note that this behavior is system-dependent, and the issue does not show
> up on all R-Car Gen3 SoCs and boards.  Even when the device is
> suspended, the module clock may be left enabled, if configured by the
> firmware for Secure Mode, or when controlled by the Real-Time Core.
>
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>

LGTM:

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

> ---
>  drivers/crypto/ccree/cc_debugfs.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/crypto/ccree/cc_debugfs.c b/drivers/crypto/ccree/cc_debugfs.c
> index 5669997386988055..35f3a2137502bd96 100644
> --- a/drivers/crypto/ccree/cc_debugfs.c
> +++ b/drivers/crypto/ccree/cc_debugfs.c
> @@ -81,6 +81,7 @@ int cc_debugfs_init(struct cc_drvdata *drvdata)
>         regset->regs = debug_regs;
>         regset->nregs = ARRAY_SIZE(debug_regs);
>         regset->base = drvdata->cc_base;
> +       regset->dev = dev;
>
>         ctx->dir = debugfs_create_dir(drvdata->plat_dev->name, cc_debugfs_dir);
>
> @@ -102,6 +103,7 @@ int cc_debugfs_init(struct cc_drvdata *drvdata)
>                 verset->nregs = ARRAY_SIZE(pid_cid_regs);
>         }
>         verset->base = drvdata->cc_base;
> +       verset->dev = dev;
>
>         debugfs_create_regset32("version", 0400, ctx->dir, verset);
>
> --
> 2.17.1
>

Patch
diff mbox series

diff --git a/drivers/crypto/ccree/cc_debugfs.c b/drivers/crypto/ccree/cc_debugfs.c
index 5669997386988055..35f3a2137502bd96 100644
--- a/drivers/crypto/ccree/cc_debugfs.c
+++ b/drivers/crypto/ccree/cc_debugfs.c
@@ -81,6 +81,7 @@  int cc_debugfs_init(struct cc_drvdata *drvdata)
 	regset->regs = debug_regs;
 	regset->nregs = ARRAY_SIZE(debug_regs);
 	regset->base = drvdata->cc_base;
+	regset->dev = dev;
 
 	ctx->dir = debugfs_create_dir(drvdata->plat_dev->name, cc_debugfs_dir);
 
@@ -102,6 +103,7 @@  int cc_debugfs_init(struct cc_drvdata *drvdata)
 		verset->nregs = ARRAY_SIZE(pid_cid_regs);
 	}
 	verset->base = drvdata->cc_base;
+	verset->dev = dev;
 
 	debugfs_create_regset32("version", 0400, ctx->dir, verset);