Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: ccree - add CID and PID support

The new HW uses a new standard product and component ID registers
replacing the old ad-hoc version and signature gister schemes.
Update the driver to support the new HW ID registers.

Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Gilad Ben-Yossef and committed by
Herbert Xu
dcf6285d 6f17e00f

+140 -17
+37 -7
drivers/crypto/ccree/cc_debugfs.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 - /* Copyright (C) 2012-2018 ARM Limited or its affiliates. */ 2 + /* Copyright (C) 2012-2019 ARM Limited or its affiliates. */ 3 3 4 4 #include <linux/kernel.h> 5 5 #include <linux/debugfs.h> ··· 25 25 */ 26 26 static struct dentry *cc_debugfs_dir; 27 27 28 - static struct debugfs_reg32 debug_regs[] = { 28 + static struct debugfs_reg32 ver_sig_regs[] = { 29 29 { .name = "SIGNATURE" }, /* Must be 0th */ 30 30 { .name = "VERSION" }, /* Must be 1st */ 31 + }; 32 + 33 + static struct debugfs_reg32 pid_cid_regs[] = { 34 + CC_DEBUG_REG(PERIPHERAL_ID_0), 35 + CC_DEBUG_REG(PERIPHERAL_ID_1), 36 + CC_DEBUG_REG(PERIPHERAL_ID_2), 37 + CC_DEBUG_REG(PERIPHERAL_ID_3), 38 + CC_DEBUG_REG(PERIPHERAL_ID_4), 39 + CC_DEBUG_REG(COMPONENT_ID_0), 40 + CC_DEBUG_REG(COMPONENT_ID_1), 41 + CC_DEBUG_REG(COMPONENT_ID_2), 42 + CC_DEBUG_REG(COMPONENT_ID_3), 43 + }; 44 + 45 + static struct debugfs_reg32 debug_regs[] = { 31 46 CC_DEBUG_REG(HOST_IRR), 32 47 CC_DEBUG_REG(HOST_POWER_DOWN_EN), 33 48 CC_DEBUG_REG(AXIM_MON_ERR), ··· 68 53 { 69 54 struct device *dev = drvdata_to_dev(drvdata); 70 55 struct cc_debugfs_ctx *ctx; 71 - struct debugfs_regset32 *regset; 72 - 73 - debug_regs[0].offset = drvdata->sig_offset; 74 - debug_regs[1].offset = drvdata->ver_offset; 56 + struct debugfs_regset32 *regset, *verset; 75 57 76 58 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); 77 59 if (!ctx) ··· 87 75 debugfs_create_regset32("regs", 0400, ctx->dir, regset); 88 76 debugfs_create_bool("coherent", 0400, ctx->dir, &drvdata->coherent); 89 77 90 - drvdata->debugfs = ctx; 78 + verset = devm_kzalloc(dev, sizeof(*verset), GFP_KERNEL); 79 + /* Failing here is not important enough to fail the module load */ 80 + if (!regset) 81 + goto out; 91 82 83 + if (drvdata->hw_rev <= CC_HW_REV_712) { 84 + ver_sig_regs[0].offset = drvdata->sig_offset; 85 + ver_sig_regs[1].offset = drvdata->ver_offset; 86 + verset->regs = ver_sig_regs; 87 + verset->nregs = ARRAY_SIZE(ver_sig_regs); 88 + } else { 89 + verset->regs = pid_cid_regs; 90 + verset->nregs = ARRAY_SIZE(pid_cid_regs); 91 + } 92 + verset->base = drvdata->cc_base; 93 + 94 + debugfs_create_regset32("version", 0400, ctx->dir, verset); 95 + 96 + out: 97 + drvdata->debugfs = ctx; 92 98 return 0; 93 99 } 94 100
+59 -9
drivers/crypto/ccree/cc_driver.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 - /* Copyright (C) 2012-2018 ARM Limited or its affiliates. */ 2 + /* Copyright (C) 2012-2019 ARM Limited or its affiliates. */ 3 3 4 4 #include <linux/kernel.h> 5 5 #include <linux/module.h> ··· 30 30 bool cc_dump_desc; 31 31 module_param_named(dump_desc, cc_dump_desc, bool, 0600); 32 32 MODULE_PARM_DESC(cc_dump_desc, "Dump descriptors to kernel log as debugging aid"); 33 - 34 33 bool cc_dump_bytes; 35 34 module_param_named(dump_bytes, cc_dump_bytes, bool, 0600); 36 35 MODULE_PARM_DESC(cc_dump_bytes, "Dump buffers to kernel log as debugging aid"); ··· 42 43 char *name; 43 44 enum cc_hw_rev rev; 44 45 u32 sig; 46 + u32 cidr_0123; 47 + u32 pidr_0124; 45 48 int std_bodies; 49 + }; 50 + 51 + #define CC_NUM_IDRS 4 52 + 53 + /* Note: PIDR3 holds CMOD/Rev so ignored for HW identification purposes */ 54 + static const u32 pidr_0124_offsets[CC_NUM_IDRS] = { 55 + CC_REG(PERIPHERAL_ID_0), CC_REG(PERIPHERAL_ID_1), 56 + CC_REG(PERIPHERAL_ID_2), CC_REG(PERIPHERAL_ID_4) 57 + }; 58 + 59 + static const u32 cidr_0123_offsets[CC_NUM_IDRS] = { 60 + CC_REG(COMPONENT_ID_0), CC_REG(COMPONENT_ID_1), 61 + CC_REG(COMPONENT_ID_2), CC_REG(COMPONENT_ID_3) 46 62 }; 47 63 48 64 /* Hardware revisions defs. */ 49 65 50 66 /* The 703 is a OSCCA only variant of the 713 */ 51 67 static const struct cc_hw_data cc703_hw = { 52 - .name = "703", .rev = CC_HW_REV_713, .std_bodies = CC_STD_OSCCA 68 + .name = "703", .rev = CC_HW_REV_713, .cidr_0123 = 0xB105F00DU, 69 + .pidr_0124 = 0x040BB0D0U, .std_bodies = CC_STD_OSCCA 53 70 }; 54 71 55 72 static const struct cc_hw_data cc713_hw = { 56 - .name = "713", .rev = CC_HW_REV_713, .std_bodies = CC_STD_ALL 73 + .name = "713", .rev = CC_HW_REV_713, .cidr_0123 = 0xB105F00DU, 74 + .pidr_0124 = 0x040BB0D0U, .std_bodies = CC_STD_ALL 57 75 }; 58 76 59 77 static const struct cc_hw_data cc712_hw = { ··· 97 81 {} 98 82 }; 99 83 MODULE_DEVICE_TABLE(of, arm_ccree_dev_of_match); 84 + 85 + static u32 cc_read_idr(struct cc_drvdata *drvdata, const u32 *idr_offsets) 86 + { 87 + int i; 88 + union { 89 + u8 regs[CC_NUM_IDRS]; 90 + u32 val; 91 + } idr; 92 + 93 + for (i = 0; i < CC_NUM_IDRS; ++i) 94 + idr.regs[i] = cc_ioread(drvdata, idr_offsets[i]); 95 + 96 + return le32_to_cpu(idr.val); 97 + } 100 98 101 99 void __dump_byte_array(const char *name, const u8 *buf, size_t len) 102 100 { ··· 235 205 struct cc_drvdata *new_drvdata; 236 206 struct device *dev = &plat_dev->dev; 237 207 struct device_node *np = dev->of_node; 238 - u32 val; 208 + u32 val, hw_rev_pidr, sig_cidr; 239 209 u64 dma_mask; 240 210 const struct cc_hw_data *hw_rev; 241 211 const struct of_device_id *dev_id; ··· 358 328 rc = -EINVAL; 359 329 goto post_clk_err; 360 330 } 361 - dev_dbg(dev, "CC SIGNATURE=0x%08X\n", val); 331 + sig_cidr = val; 332 + hw_rev_pidr = cc_ioread(new_drvdata, new_drvdata->ver_offset); 362 333 } else { 334 + /* Verify correct mapping */ 335 + val = cc_read_idr(new_drvdata, pidr_0124_offsets); 336 + if (val != hw_rev->pidr_0124) { 337 + dev_err(dev, "Invalid CC PIDR: PIDR0124=0x%08X != expected=0x%08X\n", 338 + val, hw_rev->pidr_0124); 339 + rc = -EINVAL; 340 + goto post_clk_err; 341 + } 342 + hw_rev_pidr = val; 343 + 344 + val = cc_read_idr(new_drvdata, cidr_0123_offsets); 345 + if (val != hw_rev->cidr_0123) { 346 + dev_err(dev, "Invalid CC CIDR: CIDR0123=0x%08X != expected=0x%08X\n", 347 + val, hw_rev->cidr_0123); 348 + rc = -EINVAL; 349 + goto post_clk_err; 350 + } 351 + sig_cidr = val; 352 + 353 + /* Check security disable state */ 363 354 val = cc_ioread(new_drvdata, CC_REG(SECURITY_DISABLED)); 364 355 val &= CC_SECURITY_DISABLED_MASK; 365 356 new_drvdata->sec_disabled |= !!val; ··· 396 345 dev_info(dev, "Security Disabled mode is in effect. Security functions disabled.\n"); 397 346 398 347 /* Display HW versions */ 399 - dev_info(dev, "ARM CryptoCell %s Driver: HW version 0x%08X, Driver version %s\n", 400 - hw_rev->name, cc_ioread(new_drvdata, new_drvdata->ver_offset), 401 - DRV_MODULE_VERSION); 348 + dev_info(dev, "ARM CryptoCell %s Driver: HW version 0x%08X/0x%8X, Driver version %s\n", 349 + hw_rev->name, hw_rev_pidr, sig_cidr, DRV_MODULE_VERSION); 402 350 403 351 rc = init_cc_regs(new_drvdata, true); 404 352 if (rc) {
+44 -1
drivers/crypto/ccree/cc_host_regs.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 - /* Copyright (C) 2012-2018 ARM Limited or its affiliates. */ 2 + /* Copyright (C) 2012-2019 ARM Limited or its affiliates. */ 3 3 4 4 #ifndef __CC_HOST_H__ 5 5 #define __CC_HOST_H__ ··· 203 203 #define CC_HOST_POWER_DOWN_EN_REG_OFFSET 0xA78UL 204 204 #define CC_HOST_POWER_DOWN_EN_VALUE_BIT_SHIFT 0x0UL 205 205 #define CC_HOST_POWER_DOWN_EN_VALUE_BIT_SIZE 0x1UL 206 + // -------------------------------------- 207 + // BLOCK: ID_REGISTERS 208 + // -------------------------------------- 209 + #define CC_PERIPHERAL_ID_4_REG_OFFSET 0x0FD0UL 210 + #define CC_PERIPHERAL_ID_4_VALUE_BIT_SHIFT 0x0UL 211 + #define CC_PERIPHERAL_ID_4_VALUE_BIT_SIZE 0x4UL 212 + #define CC_PIDRESERVED0_REG_OFFSET 0x0FD4UL 213 + #define CC_PIDRESERVED1_REG_OFFSET 0x0FD8UL 214 + #define CC_PIDRESERVED2_REG_OFFSET 0x0FDCUL 215 + #define CC_PERIPHERAL_ID_0_REG_OFFSET 0x0FE0UL 216 + #define CC_PERIPHERAL_ID_0_VALUE_BIT_SHIFT 0x0UL 217 + #define CC_PERIPHERAL_ID_0_VALUE_BIT_SIZE 0x8UL 218 + #define CC_PERIPHERAL_ID_1_REG_OFFSET 0x0FE4UL 219 + #define CC_PERIPHERAL_ID_1_PART_1_BIT_SHIFT 0x0UL 220 + #define CC_PERIPHERAL_ID_1_PART_1_BIT_SIZE 0x4UL 221 + #define CC_PERIPHERAL_ID_1_DES_0_JEP106_BIT_SHIFT 0x4UL 222 + #define CC_PERIPHERAL_ID_1_DES_0_JEP106_BIT_SIZE 0x4UL 223 + #define CC_PERIPHERAL_ID_2_REG_OFFSET 0x0FE8UL 224 + #define CC_PERIPHERAL_ID_2_DES_1_JEP106_BIT_SHIFT 0x0UL 225 + #define CC_PERIPHERAL_ID_2_DES_1_JEP106_BIT_SIZE 0x3UL 226 + #define CC_PERIPHERAL_ID_2_JEDEC_BIT_SHIFT 0x3UL 227 + #define CC_PERIPHERAL_ID_2_JEDEC_BIT_SIZE 0x1UL 228 + #define CC_PERIPHERAL_ID_2_REVISION_BIT_SHIFT 0x4UL 229 + #define CC_PERIPHERAL_ID_2_REVISION_BIT_SIZE 0x4UL 230 + #define CC_PERIPHERAL_ID_3_REG_OFFSET 0x0FECUL 231 + #define CC_PERIPHERAL_ID_3_CMOD_BIT_SHIFT 0x0UL 232 + #define CC_PERIPHERAL_ID_3_CMOD_BIT_SIZE 0x4UL 233 + #define CC_PERIPHERAL_ID_3_REVAND_BIT_SHIFT 0x4UL 234 + #define CC_PERIPHERAL_ID_3_REVAND_BIT_SIZE 0x4UL 235 + #define CC_COMPONENT_ID_0_REG_OFFSET 0x0FF0UL 236 + #define CC_COMPONENT_ID_0_VALUE_BIT_SHIFT 0x0UL 237 + #define CC_COMPONENT_ID_0_VALUE_BIT_SIZE 0x8UL 238 + #define CC_COMPONENT_ID_1_REG_OFFSET 0x0FF4UL 239 + #define CC_COMPONENT_ID_1_PRMBL_1_BIT_SHIFT 0x0UL 240 + #define CC_COMPONENT_ID_1_PRMBL_1_BIT_SIZE 0x4UL 241 + #define CC_COMPONENT_ID_1_CLASS_BIT_SHIFT 0x4UL 242 + #define CC_COMPONENT_ID_1_CLASS_BIT_SIZE 0x4UL 243 + #define CC_COMPONENT_ID_2_REG_OFFSET 0x0FF8UL 244 + #define CC_COMPONENT_ID_2_VALUE_BIT_SHIFT 0x0UL 245 + #define CC_COMPONENT_ID_2_VALUE_BIT_SIZE 0x8UL 246 + #define CC_COMPONENT_ID_3_REG_OFFSET 0x0FFCUL 247 + #define CC_COMPONENT_ID_3_VALUE_BIT_SHIFT 0x0UL 248 + #define CC_COMPONENT_ID_3_VALUE_BIT_SIZE 0x8UL 206 249 // -------------------------------------- 207 250 // BLOCK: HOST_SRAM 208 251 // --------------------------------------