|
@@ -297,10 +297,86 @@ void fdt_fixup_crypto_node(void *blob, int sec_rev)
|
|
fdt_strerror(err));
|
|
fdt_strerror(err));
|
|
}
|
|
}
|
|
#elif CONFIG_SYS_FSL_SEC_COMPAT >= 4 /* SEC4 */
|
|
#elif CONFIG_SYS_FSL_SEC_COMPAT >= 4 /* SEC4 */
|
|
|
|
+static u8 caam_get_era(void)
|
|
|
|
+{
|
|
|
|
+ static const struct {
|
|
|
|
+ u16 ip_id;
|
|
|
|
+ u8 maj_rev;
|
|
|
|
+ u8 era;
|
|
|
|
+ } caam_eras[] = {
|
|
|
|
+ {0x0A10, 1, 1},
|
|
|
|
+ {0x0A10, 2, 2},
|
|
|
|
+ {0x0A12, 1, 3},
|
|
|
|
+ {0x0A14, 1, 3},
|
|
|
|
+ {0x0A14, 2, 4},
|
|
|
|
+ {0x0A16, 1, 4},
|
|
|
|
+ {0x0A10, 3, 4},
|
|
|
|
+ {0x0A11, 1, 4},
|
|
|
|
+ {0x0A18, 1, 4},
|
|
|
|
+ {0x0A11, 2, 5},
|
|
|
|
+ {0x0A12, 2, 5},
|
|
|
|
+ {0x0A13, 1, 5},
|
|
|
|
+ {0x0A1C, 1, 5}
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ ccsr_sec_t __iomem *sec = (void __iomem *)CONFIG_SYS_FSL_SEC_ADDR;
|
|
|
|
+ u32 secvid_ms = in_be32(&sec->secvid_ms);
|
|
|
|
+ u32 ccbvid = in_be32(&sec->ccbvid);
|
|
|
|
+ u16 ip_id = (secvid_ms & SEC_SECVID_MS_IPID_MASK) >>
|
|
|
|
+ SEC_SECVID_MS_IPID_SHIFT;
|
|
|
|
+ u8 maj_rev = (secvid_ms & SEC_SECVID_MS_MAJ_REV_MASK) >>
|
|
|
|
+ SEC_SECVID_MS_MAJ_REV_SHIFT;
|
|
|
|
+ u8 era = (ccbvid & SEC_CCBVID_ERA_MASK) >> SEC_CCBVID_ERA_SHIFT;
|
|
|
|
+
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ if (era) /* This is '0' prior to CAAM ERA-6 */
|
|
|
|
+ return era;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(caam_eras); i++)
|
|
|
|
+ if (caam_eras[i].ip_id == ip_id &&
|
|
|
|
+ caam_eras[i].maj_rev == maj_rev)
|
|
|
|
+ return caam_eras[i].era;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void fdt_fixup_crypto_era(void *blob, u32 era)
|
|
|
|
+{
|
|
|
|
+ int err;
|
|
|
|
+ int crypto_node;
|
|
|
|
+
|
|
|
|
+ crypto_node = fdt_path_offset(blob, "crypto");
|
|
|
|
+ if (crypto_node < 0) {
|
|
|
|
+ printf("WARNING: Missing crypto node\n");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = fdt_setprop(blob, crypto_node, "fsl,sec-era", &era,
|
|
|
|
+ sizeof(era));
|
|
|
|
+ if (err < 0) {
|
|
|
|
+ printf("ERROR: could not set fsl,sec-era property: %s\n",
|
|
|
|
+ fdt_strerror(err));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void fdt_fixup_crypto_node(void *blob, int sec_rev)
|
|
void fdt_fixup_crypto_node(void *blob, int sec_rev)
|
|
{
|
|
{
|
|
- if (!sec_rev)
|
|
|
|
|
|
+ u8 era;
|
|
|
|
+
|
|
|
|
+ if (!sec_rev) {
|
|
fdt_del_node_and_alias(blob, "crypto");
|
|
fdt_del_node_and_alias(blob, "crypto");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Add SEC ERA information in compatible */
|
|
|
|
+ era = caam_get_era();
|
|
|
|
+ if (era) {
|
|
|
|
+ fdt_fixup_crypto_era(blob, era);
|
|
|
|
+ } else {
|
|
|
|
+ printf("WARNING: Unable to get ERA for CAAM rev: %d\n",
|
|
|
|
+ sec_rev);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|