10181937fSRuchika Gupta /* 20181937fSRuchika Gupta * Copyright 2014 Freescale Semiconductor, Inc. 30181937fSRuchika Gupta * 40181937fSRuchika Gupta * SPDX-License-Identifier: GPL-2.0+ 50181937fSRuchika Gupta */ 60181937fSRuchika Gupta 70181937fSRuchika Gupta #include <common.h> 80181937fSRuchika Gupta #include <libfdt.h> 90181937fSRuchika Gupta #include <fdt_support.h> 100181937fSRuchika Gupta #if CONFIG_SYS_FSL_SEC_COMPAT == 2 || CONFIG_SYS_FSL_SEC_COMPAT >= 4 110181937fSRuchika Gupta #include <fsl_sec.h> 120181937fSRuchika Gupta #endif 130181937fSRuchika Gupta 140181937fSRuchika Gupta /* 150181937fSRuchika Gupta * update crypto node properties to a specified revision of the SEC 160181937fSRuchika Gupta * called with sec_rev == 0 if not on an E processor 170181937fSRuchika Gupta */ 180181937fSRuchika Gupta #if CONFIG_SYS_FSL_SEC_COMPAT == 2 /* SEC 2.x/3.x */ 190181937fSRuchika Gupta void fdt_fixup_crypto_node(void *blob, int sec_rev) 200181937fSRuchika Gupta { 210181937fSRuchika Gupta static const struct sec_rev_prop { 220181937fSRuchika Gupta u32 sec_rev; 230181937fSRuchika Gupta u32 num_channels; 240181937fSRuchika Gupta u32 channel_fifo_len; 250181937fSRuchika Gupta u32 exec_units_mask; 260181937fSRuchika Gupta u32 descriptor_types_mask; 270181937fSRuchika Gupta } sec_rev_prop_list[] = { 280181937fSRuchika Gupta { 0x0200, 4, 24, 0x07e, 0x01010ebf }, /* SEC 2.0 */ 290181937fSRuchika Gupta { 0x0201, 4, 24, 0x0fe, 0x012b0ebf }, /* SEC 2.1 */ 300181937fSRuchika Gupta { 0x0202, 1, 24, 0x04c, 0x0122003f }, /* SEC 2.2 */ 310181937fSRuchika Gupta { 0x0204, 4, 24, 0x07e, 0x012b0ebf }, /* SEC 2.4 */ 320181937fSRuchika Gupta { 0x0300, 4, 24, 0x9fe, 0x03ab0ebf }, /* SEC 3.0 */ 330181937fSRuchika Gupta { 0x0301, 4, 24, 0xbfe, 0x03ab0ebf }, /* SEC 3.1 */ 340181937fSRuchika Gupta { 0x0303, 4, 24, 0x97c, 0x03a30abf }, /* SEC 3.3 */ 350181937fSRuchika Gupta }; 360181937fSRuchika Gupta static char compat_strlist[ARRAY_SIZE(sec_rev_prop_list) * 370181937fSRuchika Gupta sizeof("fsl,secX.Y")]; 380181937fSRuchika Gupta int crypto_node, sec_idx, err; 390181937fSRuchika Gupta char *p; 400181937fSRuchika Gupta u32 val; 410181937fSRuchika Gupta 420181937fSRuchika Gupta /* locate crypto node based on lowest common compatible */ 430181937fSRuchika Gupta crypto_node = fdt_node_offset_by_compatible(blob, -1, "fsl,sec2.0"); 440181937fSRuchika Gupta if (crypto_node == -FDT_ERR_NOTFOUND) 450181937fSRuchika Gupta return; 460181937fSRuchika Gupta 470181937fSRuchika Gupta /* delete it if not on an E-processor */ 480181937fSRuchika Gupta if (crypto_node > 0 && !sec_rev) { 490181937fSRuchika Gupta fdt_del_node(blob, crypto_node); 500181937fSRuchika Gupta return; 510181937fSRuchika Gupta } 520181937fSRuchika Gupta 530181937fSRuchika Gupta /* else we got called for possible uprev */ 540181937fSRuchika Gupta for (sec_idx = 0; sec_idx < ARRAY_SIZE(sec_rev_prop_list); sec_idx++) 550181937fSRuchika Gupta if (sec_rev_prop_list[sec_idx].sec_rev == sec_rev) 560181937fSRuchika Gupta break; 570181937fSRuchika Gupta 580181937fSRuchika Gupta if (sec_idx == ARRAY_SIZE(sec_rev_prop_list)) { 590181937fSRuchika Gupta puts("warning: unknown SEC revision number\n"); 600181937fSRuchika Gupta return; 610181937fSRuchika Gupta } 620181937fSRuchika Gupta 63*14d5547cShoria.geanta@freescale.com err = fdt_setprop_u32(blob, crypto_node, "fsl,num-channels", 64*14d5547cShoria.geanta@freescale.com sec_rev_prop_list[sec_idx].num_channels); 650181937fSRuchika Gupta if (err < 0) 660181937fSRuchika Gupta printf("WARNING: could not set crypto property: %s\n", 670181937fSRuchika Gupta fdt_strerror(err)); 680181937fSRuchika Gupta 69*14d5547cShoria.geanta@freescale.com err = fdt_setprop_u32(blob, crypto_node, "fsl,descriptor-types-mask", 70*14d5547cShoria.geanta@freescale.com sec_rev_prop_list[sec_idx].descriptor_types_mask); 710181937fSRuchika Gupta if (err < 0) 720181937fSRuchika Gupta printf("WARNING: could not set crypto property: %s\n", 730181937fSRuchika Gupta fdt_strerror(err)); 740181937fSRuchika Gupta 75*14d5547cShoria.geanta@freescale.com err = fdt_setprop_u32(blob, crypto_node, "fsl,exec-units-mask", 76*14d5547cShoria.geanta@freescale.com sec_rev_prop_list[sec_idx].exec_units_mask); 770181937fSRuchika Gupta if (err < 0) 780181937fSRuchika Gupta printf("WARNING: could not set crypto property: %s\n", 790181937fSRuchika Gupta fdt_strerror(err)); 800181937fSRuchika Gupta 81*14d5547cShoria.geanta@freescale.com err = fdt_setprop_u32(blob, crypto_node, "fsl,channel-fifo-len", 82*14d5547cShoria.geanta@freescale.com sec_rev_prop_list[sec_idx].channel_fifo_len); 830181937fSRuchika Gupta if (err < 0) 840181937fSRuchika Gupta printf("WARNING: could not set crypto property: %s\n", 850181937fSRuchika Gupta fdt_strerror(err)); 860181937fSRuchika Gupta 870181937fSRuchika Gupta val = 0; 880181937fSRuchika Gupta while (sec_idx >= 0) { 890181937fSRuchika Gupta p = compat_strlist + val; 900181937fSRuchika Gupta val += sprintf(p, "fsl,sec%d.%d", 910181937fSRuchika Gupta (sec_rev_prop_list[sec_idx].sec_rev & 0xff00) >> 8, 920181937fSRuchika Gupta sec_rev_prop_list[sec_idx].sec_rev & 0x00ff) + 1; 930181937fSRuchika Gupta sec_idx--; 940181937fSRuchika Gupta } 950181937fSRuchika Gupta err = fdt_setprop(blob, crypto_node, "compatible", &compat_strlist, 960181937fSRuchika Gupta val); 970181937fSRuchika Gupta if (err < 0) 980181937fSRuchika Gupta printf("WARNING: could not set crypto property: %s\n", 990181937fSRuchika Gupta fdt_strerror(err)); 1000181937fSRuchika Gupta } 1010181937fSRuchika Gupta #elif CONFIG_SYS_FSL_SEC_COMPAT >= 4 /* SEC4 */ 1020181937fSRuchika Gupta static u8 caam_get_era(void) 1030181937fSRuchika Gupta { 1040181937fSRuchika Gupta static const struct { 1050181937fSRuchika Gupta u16 ip_id; 1060181937fSRuchika Gupta u8 maj_rev; 1070181937fSRuchika Gupta u8 era; 1080181937fSRuchika Gupta } caam_eras[] = { 1090181937fSRuchika Gupta {0x0A10, 1, 1}, 1100181937fSRuchika Gupta {0x0A10, 2, 2}, 1110181937fSRuchika Gupta {0x0A12, 1, 3}, 1120181937fSRuchika Gupta {0x0A14, 1, 3}, 1130181937fSRuchika Gupta {0x0A14, 2, 4}, 1140181937fSRuchika Gupta {0x0A16, 1, 4}, 1150181937fSRuchika Gupta {0x0A10, 3, 4}, 1160181937fSRuchika Gupta {0x0A11, 1, 4}, 1170181937fSRuchika Gupta {0x0A18, 1, 4}, 1180181937fSRuchika Gupta {0x0A11, 2, 5}, 1190181937fSRuchika Gupta {0x0A12, 2, 5}, 1200181937fSRuchika Gupta {0x0A13, 1, 5}, 1210181937fSRuchika Gupta {0x0A1C, 1, 5} 1220181937fSRuchika Gupta }; 1230181937fSRuchika Gupta 1240181937fSRuchika Gupta ccsr_sec_t __iomem *sec = (void __iomem *)CONFIG_SYS_FSL_SEC_ADDR; 1250181937fSRuchika Gupta u32 secvid_ms = sec_in32(&sec->secvid_ms); 1260181937fSRuchika Gupta u32 ccbvid = sec_in32(&sec->ccbvid); 1270181937fSRuchika Gupta u16 ip_id = (secvid_ms & SEC_SECVID_MS_IPID_MASK) >> 1280181937fSRuchika Gupta SEC_SECVID_MS_IPID_SHIFT; 1290181937fSRuchika Gupta u8 maj_rev = (secvid_ms & SEC_SECVID_MS_MAJ_REV_MASK) >> 1300181937fSRuchika Gupta SEC_SECVID_MS_MAJ_REV_SHIFT; 1310181937fSRuchika Gupta u8 era = (ccbvid & SEC_CCBVID_ERA_MASK) >> SEC_CCBVID_ERA_SHIFT; 1320181937fSRuchika Gupta 1330181937fSRuchika Gupta int i; 1340181937fSRuchika Gupta 1350181937fSRuchika Gupta if (era) /* This is '0' prior to CAAM ERA-6 */ 1360181937fSRuchika Gupta return era; 1370181937fSRuchika Gupta 1380181937fSRuchika Gupta for (i = 0; i < ARRAY_SIZE(caam_eras); i++) 1390181937fSRuchika Gupta if (caam_eras[i].ip_id == ip_id && 1400181937fSRuchika Gupta caam_eras[i].maj_rev == maj_rev) 1410181937fSRuchika Gupta return caam_eras[i].era; 1420181937fSRuchika Gupta 1430181937fSRuchika Gupta return 0; 1440181937fSRuchika Gupta } 1450181937fSRuchika Gupta 1460181937fSRuchika Gupta static void fdt_fixup_crypto_era(void *blob, u32 era) 1470181937fSRuchika Gupta { 1480181937fSRuchika Gupta int err; 1490181937fSRuchika Gupta int crypto_node; 1500181937fSRuchika Gupta 1510181937fSRuchika Gupta crypto_node = fdt_path_offset(blob, "crypto"); 1520181937fSRuchika Gupta if (crypto_node < 0) { 1530181937fSRuchika Gupta printf("WARNING: Missing crypto node\n"); 1540181937fSRuchika Gupta return; 1550181937fSRuchika Gupta } 1560181937fSRuchika Gupta 157e5d08b4dShoria.geanta@freescale.com err = fdt_setprop_u32(blob, crypto_node, "fsl,sec-era", era); 1580181937fSRuchika Gupta if (err < 0) { 1590181937fSRuchika Gupta printf("ERROR: could not set fsl,sec-era property: %s\n", 1600181937fSRuchika Gupta fdt_strerror(err)); 1610181937fSRuchika Gupta } 1620181937fSRuchika Gupta } 1630181937fSRuchika Gupta 1640181937fSRuchika Gupta void fdt_fixup_crypto_node(void *blob, int sec_rev) 1650181937fSRuchika Gupta { 1660181937fSRuchika Gupta u8 era; 1670181937fSRuchika Gupta 1680181937fSRuchika Gupta if (!sec_rev) { 1690181937fSRuchika Gupta fdt_del_node_and_alias(blob, "crypto"); 1700181937fSRuchika Gupta return; 1710181937fSRuchika Gupta } 1720181937fSRuchika Gupta 1730181937fSRuchika Gupta /* Add SEC ERA information in compatible */ 1740181937fSRuchika Gupta era = caam_get_era(); 1750181937fSRuchika Gupta if (era) { 1760181937fSRuchika Gupta fdt_fixup_crypto_era(blob, era); 1770181937fSRuchika Gupta } else { 1780181937fSRuchika Gupta printf("WARNING: Unable to get ERA for CAAM rev: %d\n", 1790181937fSRuchika Gupta sec_rev); 1800181937fSRuchika Gupta } 1810181937fSRuchika Gupta } 1820181937fSRuchika Gupta #endif 183