3
3
* Controller-level driver, kernel property detection, initialization
4
4
*
5
5
* Copyright 2008-2012 Freescale Semiconductor, Inc.
6
- * Copyright 2018-2019 NXP
6
+ * Copyright 2018-2019, 2023 NXP
7
7
*/
8
8
9
9
#include <linux/device.h>
@@ -397,7 +397,7 @@ static void kick_trng(struct platform_device *pdev, int ent_delay)
397
397
RTMCTL_SAMP_MODE_RAW_ES_SC );
398
398
}
399
399
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 )
401
401
{
402
402
static const struct {
403
403
u16 ip_id ;
@@ -423,12 +423,12 @@ static int caam_get_era_from_hw(struct caam_ctrl __iomem *ctrl)
423
423
u16 ip_id ;
424
424
int i ;
425
425
426
- ccbvid = rd_reg32 (& ctrl -> perfmon . ccb_id );
426
+ ccbvid = rd_reg32 (& perfmon -> ccb_id );
427
427
era = (ccbvid & CCBVID_ERA_MASK ) >> CCBVID_ERA_SHIFT ;
428
428
if (era ) /* This is '0' prior to CAAM ERA-6 */
429
429
return era ;
430
430
431
- id_ms = rd_reg32 (& ctrl -> perfmon . caam_id_ms );
431
+ id_ms = rd_reg32 (& perfmon -> caam_id_ms );
432
432
ip_id = (id_ms & SECVID_MS_IPID_MASK ) >> SECVID_MS_IPID_SHIFT ;
433
433
maj_rev = (id_ms & SECVID_MS_MAJ_REV_MASK ) >> SECVID_MS_MAJ_REV_SHIFT ;
434
434
@@ -446,9 +446,9 @@ static int caam_get_era_from_hw(struct caam_ctrl __iomem *ctrl)
446
446
* In case this property is not passed an attempt to retrieve the CAAM
447
447
* era via register reads will be made.
448
448
*
449
- * @ctrl: controller region
449
+ * @perfmon: Performance Monitor Registers
450
450
*/
451
- static int caam_get_era (struct caam_ctrl __iomem * ctrl )
451
+ static int caam_get_era (struct caam_perfmon __iomem * perfmon )
452
452
{
453
453
struct device_node * caam_node ;
454
454
int ret ;
@@ -461,7 +461,7 @@ static int caam_get_era(struct caam_ctrl __iomem *ctrl)
461
461
if (!ret )
462
462
return prop ;
463
463
else
464
- return caam_get_era_from_hw (ctrl );
464
+ return caam_get_era_from_hw (perfmon );
465
465
}
466
466
467
467
/*
@@ -628,6 +628,7 @@ static int caam_probe(struct platform_device *pdev)
628
628
struct device_node * nprop , * np ;
629
629
struct caam_ctrl __iomem * ctrl ;
630
630
struct caam_drv_private * ctrlpriv ;
631
+ struct caam_perfmon __iomem * perfmon ;
631
632
struct dentry * dfs_root ;
632
633
u32 scfgr , comp_params ;
633
634
u8 rng_vid ;
@@ -667,9 +668,36 @@ static int caam_probe(struct platform_device *pdev)
667
668
return ret ;
668
669
}
669
670
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 ) &
671
699
(CSTA_PLEND | CSTA_ALT_PLEND ));
672
- comp_params = rd_reg32 (& ctrl -> perfmon . comp_parms_ms );
700
+ comp_params = rd_reg32 (& perfmon -> comp_parms_ms );
673
701
if (comp_params & CTPR_MS_PS && rd_reg32 (& ctrl -> mcr ) & MCFGR_LONG_PTR )
674
702
caam_ptr_sz = sizeof (u64 );
675
703
else
@@ -780,7 +808,7 @@ static int caam_probe(struct platform_device *pdev)
780
808
return ret ;
781
809
}
782
810
783
- ctrlpriv -> era = caam_get_era (ctrl );
811
+ ctrlpriv -> era = caam_get_era (perfmon );
784
812
ctrlpriv -> domain = iommu_get_domain_for_dev (dev );
785
813
786
814
dfs_root = debugfs_create_dir (dev_name (dev ), NULL );
@@ -791,7 +819,7 @@ static int caam_probe(struct platform_device *pdev)
791
819
return ret ;
792
820
}
793
821
794
- caam_debugfs_init (ctrlpriv , dfs_root );
822
+ caam_debugfs_init (ctrlpriv , perfmon , dfs_root );
795
823
796
824
/* Check to see if (DPAA 1.x) QI present. If so, enable */
797
825
if (ctrlpriv -> qi_present && !caam_dpaa2 ) {
@@ -810,26 +838,13 @@ static int caam_probe(struct platform_device *pdev)
810
838
#endif
811
839
}
812
840
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
-
826
841
/* If no QI and no rings specified, quit and go home */
827
842
if ((!ctrlpriv -> qi_present ) && (!ctrlpriv -> total_jobrs )) {
828
843
dev_err (dev , "no queues configured, terminating\n" );
829
844
return - ENOMEM ;
830
845
}
831
846
832
- comp_params = rd_reg32 (& ctrl -> perfmon . comp_parms_ls );
847
+ comp_params = rd_reg32 (& perfmon -> comp_parms_ls );
833
848
ctrlpriv -> blob_present = !!(comp_params & CTPR_LS_BLOB );
834
849
835
850
/*
@@ -838,15 +853,21 @@ static int caam_probe(struct platform_device *pdev)
838
853
* check both here.
839
854
*/
840
855
if (ctrlpriv -> era < 10 ) {
841
- rng_vid = (rd_reg32 (& ctrl -> perfmon . cha_id_ls ) &
856
+ rng_vid = (rd_reg32 (& perfmon -> cha_id_ls ) &
842
857
CHA_ID_LS_RNG_MASK ) >> CHA_ID_LS_RNG_SHIFT ;
843
858
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 );
845
860
} 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 ) >>
847
868
CHA_VER_VID_SHIFT ;
848
869
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 );
850
871
}
851
872
852
873
/*
@@ -927,8 +948,8 @@ static int caam_probe(struct platform_device *pdev)
927
948
928
949
/* NOTE: RTIC detection ought to go here, around Si time */
929
950
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 );
932
953
933
954
/* Report "alive" for developer to see */
934
955
dev_info (dev , "device ID = 0x%016llx (Era %d)\n" , caam_id ,
0 commit comments