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 ,
0 commit comments