Skip to content

Commit ae1dd17

Browse files
horiagherbertx
authored andcommitted
crypto: caam - reduce page 0 regs access to minimum
Use job ring register map, in place of controller register map to access page 0 registers, as access to the controller register map is not permitted. Signed-off-by: Horia GeantA <[email protected]> Signed-off-by: Gaurav Jain <[email protected]> Signed-off-by: Meenakshi Aggarwal <[email protected]> Reviewed-by: Varun Sethi <[email protected]> Reviewed-by: Gaurav Jain <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 6699e14 commit ae1dd17

File tree

7 files changed

+84
-58
lines changed

7 files changed

+84
-58
lines changed

drivers/crypto/caam/caamalg.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* caam - Freescale FSL CAAM support for crypto API
44
*
55
* Copyright 2008-2011 Freescale Semiconductor, Inc.
6-
* Copyright 2016-2019 NXP
6+
* Copyright 2016-2019, 2023 NXP
77
*
88
* Based on talitos crypto API driver.
99
*
@@ -3542,37 +3542,38 @@ int caam_algapi_init(struct device *ctrldev)
35423542
* First, detect presence and attributes of DES, AES, and MD blocks.
35433543
*/
35443544
if (priv->era < 10) {
3545+
struct caam_perfmon __iomem *perfmon = &priv->jr[0]->perfmon;
35453546
u32 cha_vid, cha_inst, aes_rn;
35463547

3547-
cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls);
3548+
cha_vid = rd_reg32(&perfmon->cha_id_ls);
35483549
aes_vid = cha_vid & CHA_ID_LS_AES_MASK;
35493550
md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
35503551

3551-
cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls);
3552+
cha_inst = rd_reg32(&perfmon->cha_num_ls);
35523553
des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >>
35533554
CHA_ID_LS_DES_SHIFT;
35543555
aes_inst = cha_inst & CHA_ID_LS_AES_MASK;
35553556
md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
35563557
ccha_inst = 0;
35573558
ptha_inst = 0;
35583559

3559-
aes_rn = rd_reg32(&priv->ctrl->perfmon.cha_rev_ls) &
3560-
CHA_ID_LS_AES_MASK;
3560+
aes_rn = rd_reg32(&perfmon->cha_rev_ls) & CHA_ID_LS_AES_MASK;
35613561
gcm_support = !(aes_vid == CHA_VER_VID_AES_LP && aes_rn < 8);
35623562
} else {
3563+
struct version_regs __iomem *vreg = &priv->jr[0]->vreg;
35633564
u32 aesa, mdha;
35643565

3565-
aesa = rd_reg32(&priv->ctrl->vreg.aesa);
3566-
mdha = rd_reg32(&priv->ctrl->vreg.mdha);
3566+
aesa = rd_reg32(&vreg->aesa);
3567+
mdha = rd_reg32(&vreg->mdha);
35673568

35683569
aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
35693570
md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
35703571

3571-
des_inst = rd_reg32(&priv->ctrl->vreg.desa) & CHA_VER_NUM_MASK;
3572+
des_inst = rd_reg32(&vreg->desa) & CHA_VER_NUM_MASK;
35723573
aes_inst = aesa & CHA_VER_NUM_MASK;
35733574
md_inst = mdha & CHA_VER_NUM_MASK;
3574-
ccha_inst = rd_reg32(&priv->ctrl->vreg.ccha) & CHA_VER_NUM_MASK;
3575-
ptha_inst = rd_reg32(&priv->ctrl->vreg.ptha) & CHA_VER_NUM_MASK;
3575+
ccha_inst = rd_reg32(&vreg->ccha) & CHA_VER_NUM_MASK;
3576+
ptha_inst = rd_reg32(&vreg->ptha) & CHA_VER_NUM_MASK;
35763577

35773578
gcm_support = aesa & CHA_VER_MISC_AES_GCM;
35783579
}

drivers/crypto/caam/caamhash.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* caam - Freescale FSL CAAM support for ahash functions of crypto API
44
*
55
* Copyright 2011 Freescale Semiconductor, Inc.
6-
* Copyright 2018-2019 NXP
6+
* Copyright 2018-2019, 2023 NXP
77
*
88
* Based on caamalg.c crypto API driver.
99
*
@@ -1956,12 +1956,14 @@ int caam_algapi_hash_init(struct device *ctrldev)
19561956
* presence and attributes of MD block.
19571957
*/
19581958
if (priv->era < 10) {
1959-
md_vid = (rd_reg32(&priv->ctrl->perfmon.cha_id_ls) &
1959+
struct caam_perfmon __iomem *perfmon = &priv->jr[0]->perfmon;
1960+
1961+
md_vid = (rd_reg32(&perfmon->cha_id_ls) &
19601962
CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
1961-
md_inst = (rd_reg32(&priv->ctrl->perfmon.cha_num_ls) &
1963+
md_inst = (rd_reg32(&perfmon->cha_num_ls) &
19621964
CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT;
19631965
} else {
1964-
u32 mdha = rd_reg32(&priv->ctrl->vreg.mdha);
1966+
u32 mdha = rd_reg32(&priv->jr[0]->vreg.mdha);
19651967

19661968
md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT;
19671969
md_inst = mdha & CHA_VER_NUM_MASK;

drivers/crypto/caam/caampkc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* caam - Freescale FSL CAAM support for Public Key Cryptography
44
*
55
* Copyright 2016 Freescale Semiconductor, Inc.
6-
* Copyright 2018-2019 NXP
6+
* Copyright 2018-2019, 2023 NXP
77
*
88
* There is no Shared Descriptor for PKC so that the Job Descriptor must carry
99
* all the desired key parameters, input and output pointers.
@@ -1168,10 +1168,10 @@ int caam_pkc_init(struct device *ctrldev)
11681168

11691169
/* Determine public key hardware accelerator presence. */
11701170
if (priv->era < 10) {
1171-
pk_inst = (rd_reg32(&priv->ctrl->perfmon.cha_num_ls) &
1171+
pk_inst = (rd_reg32(&priv->jr[0]->perfmon.cha_num_ls) &
11721172
CHA_ID_LS_PK_MASK) >> CHA_ID_LS_PK_SHIFT;
11731173
} else {
1174-
pkha = rd_reg32(&priv->ctrl->vreg.pkha);
1174+
pkha = rd_reg32(&priv->jr[0]->vreg.pkha);
11751175
pk_inst = pkha & CHA_VER_NUM_MASK;
11761176

11771177
/*

drivers/crypto/caam/caamrng.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* caam - Freescale FSL CAAM support for hw_random
44
*
55
* Copyright 2011 Freescale Semiconductor, Inc.
6-
* Copyright 2018-2019 NXP
6+
* Copyright 2018-2019, 2023 NXP
77
*
88
* Based on caamalg.c crypto API driver.
99
*
@@ -227,10 +227,10 @@ int caam_rng_init(struct device *ctrldev)
227227

228228
/* Check for an instantiated RNG before registration */
229229
if (priv->era < 10)
230-
rng_inst = (rd_reg32(&priv->ctrl->perfmon.cha_num_ls) &
230+
rng_inst = (rd_reg32(&priv->jr[0]->perfmon.cha_num_ls) &
231231
CHA_ID_LS_RNG_MASK) >> CHA_ID_LS_RNG_SHIFT;
232232
else
233-
rng_inst = rd_reg32(&priv->ctrl->vreg.rng) & CHA_VER_NUM_MASK;
233+
rng_inst = rd_reg32(&priv->jr[0]->vreg.rng) & CHA_VER_NUM_MASK;
234234

235235
if (!rng_inst)
236236
return 0;

drivers/crypto/caam/ctrl.c

Lines changed: 52 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Controller-level driver, kernel property detection, initialization
44
*
55
* Copyright 2008-2012 Freescale Semiconductor, Inc.
6-
* Copyright 2018-2019 NXP
6+
* Copyright 2018-2019, 2023 NXP
77
*/
88

99
#include <linux/device.h>
@@ -397,7 +397,7 @@ static void kick_trng(struct platform_device *pdev, int ent_delay)
397397
RTMCTL_SAMP_MODE_RAW_ES_SC);
398398
}
399399

400-
static int caam_get_era_from_hw(struct caam_ctrl __iomem *ctrl)
400+
static int caam_get_era_from_hw(struct caam_perfmon __iomem *perfmon)
401401
{
402402
static const struct {
403403
u16 ip_id;
@@ -423,12 +423,12 @@ static int caam_get_era_from_hw(struct caam_ctrl __iomem *ctrl)
423423
u16 ip_id;
424424
int i;
425425

426-
ccbvid = rd_reg32(&ctrl->perfmon.ccb_id);
426+
ccbvid = rd_reg32(&perfmon->ccb_id);
427427
era = (ccbvid & CCBVID_ERA_MASK) >> CCBVID_ERA_SHIFT;
428428
if (era) /* This is '0' prior to CAAM ERA-6 */
429429
return era;
430430

431-
id_ms = rd_reg32(&ctrl->perfmon.caam_id_ms);
431+
id_ms = rd_reg32(&perfmon->caam_id_ms);
432432
ip_id = (id_ms & SECVID_MS_IPID_MASK) >> SECVID_MS_IPID_SHIFT;
433433
maj_rev = (id_ms & SECVID_MS_MAJ_REV_MASK) >> SECVID_MS_MAJ_REV_SHIFT;
434434

@@ -446,9 +446,9 @@ static int caam_get_era_from_hw(struct caam_ctrl __iomem *ctrl)
446446
* In case this property is not passed an attempt to retrieve the CAAM
447447
* era via register reads will be made.
448448
*
449-
* @ctrl: controller region
449+
* @perfmon: Performance Monitor Registers
450450
*/
451-
static int caam_get_era(struct caam_ctrl __iomem *ctrl)
451+
static int caam_get_era(struct caam_perfmon __iomem *perfmon)
452452
{
453453
struct device_node *caam_node;
454454
int ret;
@@ -461,7 +461,7 @@ static int caam_get_era(struct caam_ctrl __iomem *ctrl)
461461
if (!ret)
462462
return prop;
463463
else
464-
return caam_get_era_from_hw(ctrl);
464+
return caam_get_era_from_hw(perfmon);
465465
}
466466

467467
/*
@@ -628,6 +628,7 @@ static int caam_probe(struct platform_device *pdev)
628628
struct device_node *nprop, *np;
629629
struct caam_ctrl __iomem *ctrl;
630630
struct caam_drv_private *ctrlpriv;
631+
struct caam_perfmon __iomem *perfmon;
631632
struct dentry *dfs_root;
632633
u32 scfgr, comp_params;
633634
u8 rng_vid;
@@ -667,9 +668,36 @@ static int caam_probe(struct platform_device *pdev)
667668
return ret;
668669
}
669670

670-
caam_little_end = !(bool)(rd_reg32(&ctrl->perfmon.status) &
671+
ring = 0;
672+
for_each_available_child_of_node(nprop, np)
673+
if (of_device_is_compatible(np, "fsl,sec-v4.0-job-ring") ||
674+
of_device_is_compatible(np, "fsl,sec4.0-job-ring")) {
675+
u32 reg;
676+
677+
if (of_property_read_u32_index(np, "reg", 0, &reg)) {
678+
dev_err(dev, "%s read reg property error\n",
679+
np->full_name);
680+
continue;
681+
}
682+
683+
ctrlpriv->jr[ring] = (struct caam_job_ring __iomem __force *)
684+
((__force uint8_t *)ctrl + reg);
685+
686+
ctrlpriv->total_jobrs++;
687+
ring++;
688+
}
689+
690+
/*
691+
* Wherever possible, instead of accessing registers from the global page,
692+
* use the alias registers in the first (cf. DT nodes order)
693+
* job ring's page.
694+
*/
695+
perfmon = ring ? (struct caam_perfmon __iomem *)&ctrlpriv->jr[0]->perfmon :
696+
(struct caam_perfmon __iomem *)&ctrl->perfmon;
697+
698+
caam_little_end = !(bool)(rd_reg32(&perfmon->status) &
671699
(CSTA_PLEND | CSTA_ALT_PLEND));
672-
comp_params = rd_reg32(&ctrl->perfmon.comp_parms_ms);
700+
comp_params = rd_reg32(&perfmon->comp_parms_ms);
673701
if (comp_params & CTPR_MS_PS && rd_reg32(&ctrl->mcr) & MCFGR_LONG_PTR)
674702
caam_ptr_sz = sizeof(u64);
675703
else
@@ -780,7 +808,7 @@ static int caam_probe(struct platform_device *pdev)
780808
return ret;
781809
}
782810

783-
ctrlpriv->era = caam_get_era(ctrl);
811+
ctrlpriv->era = caam_get_era(perfmon);
784812
ctrlpriv->domain = iommu_get_domain_for_dev(dev);
785813

786814
dfs_root = debugfs_create_dir(dev_name(dev), NULL);
@@ -791,7 +819,7 @@ static int caam_probe(struct platform_device *pdev)
791819
return ret;
792820
}
793821

794-
caam_debugfs_init(ctrlpriv, dfs_root);
822+
caam_debugfs_init(ctrlpriv, perfmon, dfs_root);
795823

796824
/* Check to see if (DPAA 1.x) QI present. If so, enable */
797825
if (ctrlpriv->qi_present && !caam_dpaa2) {
@@ -810,26 +838,13 @@ static int caam_probe(struct platform_device *pdev)
810838
#endif
811839
}
812840

813-
ring = 0;
814-
for_each_available_child_of_node(nprop, np)
815-
if (of_device_is_compatible(np, "fsl,sec-v4.0-job-ring") ||
816-
of_device_is_compatible(np, "fsl,sec4.0-job-ring")) {
817-
ctrlpriv->jr[ring] = (struct caam_job_ring __iomem __force *)
818-
((__force uint8_t *)ctrl +
819-
(ring + JR_BLOCK_NUMBER) *
820-
BLOCK_OFFSET
821-
);
822-
ctrlpriv->total_jobrs++;
823-
ring++;
824-
}
825-
826841
/* If no QI and no rings specified, quit and go home */
827842
if ((!ctrlpriv->qi_present) && (!ctrlpriv->total_jobrs)) {
828843
dev_err(dev, "no queues configured, terminating\n");
829844
return -ENOMEM;
830845
}
831846

832-
comp_params = rd_reg32(&ctrl->perfmon.comp_parms_ls);
847+
comp_params = rd_reg32(&perfmon->comp_parms_ls);
833848
ctrlpriv->blob_present = !!(comp_params & CTPR_LS_BLOB);
834849

835850
/*
@@ -838,15 +853,21 @@ static int caam_probe(struct platform_device *pdev)
838853
* check both here.
839854
*/
840855
if (ctrlpriv->era < 10) {
841-
rng_vid = (rd_reg32(&ctrl->perfmon.cha_id_ls) &
856+
rng_vid = (rd_reg32(&perfmon->cha_id_ls) &
842857
CHA_ID_LS_RNG_MASK) >> CHA_ID_LS_RNG_SHIFT;
843858
ctrlpriv->blob_present = ctrlpriv->blob_present &&
844-
(rd_reg32(&ctrl->perfmon.cha_num_ls) & CHA_ID_LS_AES_MASK);
859+
(rd_reg32(&perfmon->cha_num_ls) & CHA_ID_LS_AES_MASK);
845860
} else {
846-
rng_vid = (rd_reg32(&ctrl->vreg.rng) & CHA_VER_VID_MASK) >>
861+
struct version_regs __iomem *vreg;
862+
863+
vreg = ctrlpriv->total_jobrs ?
864+
(struct version_regs __iomem *)&ctrlpriv->jr[0]->vreg :
865+
(struct version_regs __iomem *)&ctrl->vreg;
866+
867+
rng_vid = (rd_reg32(&vreg->rng) & CHA_VER_VID_MASK) >>
847868
CHA_VER_VID_SHIFT;
848869
ctrlpriv->blob_present = ctrlpriv->blob_present &&
849-
(rd_reg32(&ctrl->vreg.aesa) & CHA_VER_MISC_AES_NUM_MASK);
870+
(rd_reg32(&vreg->aesa) & CHA_VER_MISC_AES_NUM_MASK);
850871
}
851872

852873
/*
@@ -927,8 +948,8 @@ static int caam_probe(struct platform_device *pdev)
927948

928949
/* NOTE: RTIC detection ought to go here, around Si time */
929950

930-
caam_id = (u64)rd_reg32(&ctrl->perfmon.caam_id_ms) << 32 |
931-
(u64)rd_reg32(&ctrl->perfmon.caam_id_ls);
951+
caam_id = (u64)rd_reg32(&perfmon->caam_id_ms) << 32 |
952+
(u64)rd_reg32(&perfmon->caam_id_ls);
932953

933954
/* Report "alive" for developer to see */
934955
dev_info(dev, "device ID = 0x%016llx (Era %d)\n", caam_id,

drivers/crypto/caam/debugfs.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2-
/* Copyright 2019 NXP */
2+
/* Copyright 2019, 2023 NXP */
33

44
#include <linux/debugfs.h>
55
#include "compat.h"
@@ -42,16 +42,15 @@ void caam_debugfs_qi_init(struct caam_drv_private *ctrlpriv)
4242
}
4343
#endif
4444

45-
void caam_debugfs_init(struct caam_drv_private *ctrlpriv, struct dentry *root)
45+
void caam_debugfs_init(struct caam_drv_private *ctrlpriv,
46+
struct caam_perfmon __force *perfmon,
47+
struct dentry *root)
4648
{
47-
struct caam_perfmon *perfmon;
48-
4949
/*
5050
* FIXME: needs better naming distinction, as some amalgamation of
5151
* "caam" and nprop->full_name. The OF name isn't distinctive,
5252
* but does separate instances
5353
*/
54-
perfmon = (struct caam_perfmon __force *)&ctrlpriv->ctrl->perfmon;
5554

5655
ctrlpriv->ctl = debugfs_create_dir("ctl", root);
5756

drivers/crypto/caam/debugfs.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2-
/* Copyright 2019 NXP */
2+
/* Copyright 2019, 2023 NXP */
33

44
#ifndef CAAM_DEBUGFS_H
55
#define CAAM_DEBUGFS_H
66

77
struct dentry;
88
struct caam_drv_private;
9+
struct caam_perfmon;
910

1011
#ifdef CONFIG_DEBUG_FS
11-
void caam_debugfs_init(struct caam_drv_private *ctrlpriv, struct dentry *root);
12+
void caam_debugfs_init(struct caam_drv_private *ctrlpriv,
13+
struct caam_perfmon __force *perfmon, struct dentry *root);
1214
#else
1315
static inline void caam_debugfs_init(struct caam_drv_private *ctrlpriv,
16+
struct caam_perfmon __force *perfmon,
1417
struct dentry *root)
1518
{}
1619
#endif

0 commit comments

Comments
 (0)