@@ -153,18 +153,6 @@ static void etm4_cs_unlock(struct etmv4_drvdata *drvdata,
153
153
CS_UNLOCK (csa -> base );
154
154
}
155
155
156
- static bool etm4_arch_supported (u8 arch )
157
- {
158
- /* Mask out the minor version number */
159
- switch (arch & 0xf0 ) {
160
- case ETM_ARCH_V4 :
161
- break ;
162
- default :
163
- return false;
164
- }
165
- return true;
166
- }
167
-
168
156
static int etm4_cpu_id (struct coresight_device * csdev )
169
157
{
170
158
struct etmv4_drvdata * drvdata = dev_get_drvdata (csdev -> dev .parent );
@@ -784,6 +772,26 @@ static const struct coresight_ops etm4_cs_ops = {
784
772
static bool etm4_init_iomem_access (struct etmv4_drvdata * drvdata ,
785
773
struct csdev_access * csa )
786
774
{
775
+ u32 devarch = readl_relaxed (drvdata -> base + TRCDEVARCH );
776
+ u32 idr1 = readl_relaxed (drvdata -> base + TRCIDR1 );
777
+
778
+ /*
779
+ * All ETMs must implement TRCDEVARCH to indicate that
780
+ * the component is an ETMv4. To support any broken
781
+ * implementations we fall back to TRCIDR1 check, which
782
+ * is not really reliable.
783
+ */
784
+ if ((devarch & ETM_DEVARCH_ID_MASK ) == ETM_DEVARCH_ETMv4x_ARCH ) {
785
+ drvdata -> arch = etm_devarch_to_arch (devarch );
786
+ } else {
787
+ pr_warn ("CPU%d: ETM4x incompatible TRCDEVARCH: %x, falling back to TRCIDR1\n" ,
788
+ smp_processor_id (), devarch );
789
+
790
+ if (ETM_TRCIDR1_ARCH_MAJOR (idr1 ) != ETM_TRCIDR1_ARCH_ETMv4 )
791
+ return false;
792
+ drvdata -> arch = etm_trcidr_to_arch (idr1 );
793
+ }
794
+
787
795
* csa = CSDEV_ACCESS_IOMEM (drvdata -> base );
788
796
return true;
789
797
}
@@ -800,7 +808,6 @@ static bool etm4_init_csdev_access(struct etmv4_drvdata *drvdata,
800
808
static void etm4_init_arch_data (void * info )
801
809
{
802
810
u32 etmidr0 ;
803
- u32 etmidr1 ;
804
811
u32 etmidr2 ;
805
812
u32 etmidr3 ;
806
813
u32 etmidr4 ;
@@ -865,14 +872,6 @@ static void etm4_init_arch_data(void *info)
865
872
/* TSSIZE, bits[28:24] Global timestamp size field */
866
873
drvdata -> ts_size = BMVAL (etmidr0 , 24 , 28 );
867
874
868
- /* base architecture of trace unit */
869
- etmidr1 = etm4x_relaxed_read32 (csa , TRCIDR1 );
870
- /*
871
- * TRCARCHMIN, bits[7:4] architecture the minor version number
872
- * TRCARCHMAJ, bits[11:8] architecture major versin number
873
- */
874
- drvdata -> arch = BMVAL (etmidr1 , 4 , 11 );
875
-
876
875
/* maximum size of resources */
877
876
etmidr2 = etm4x_relaxed_read32 (csa , TRCIDR2 );
878
877
/* CIDSIZE, bits[9:5] Indicates the Context ID size */
@@ -1712,7 +1711,7 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
1712
1711
etm4_init_arch_data , & init_arg , 1 ))
1713
1712
dev_err (dev , "ETM arch init failed\n" );
1714
1713
1715
- if (etm4_arch_supported ( drvdata -> arch ) == false )
1714
+ if (! drvdata -> arch )
1716
1715
return - EINVAL ;
1717
1716
1718
1717
etm4_init_trace_id (drvdata );
@@ -1744,7 +1743,8 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
1744
1743
1745
1744
pm_runtime_put (& adev -> dev );
1746
1745
dev_info (& drvdata -> csdev -> dev , "CPU%d: ETM v%d.%d initialized\n" ,
1747
- drvdata -> cpu , drvdata -> arch >> 4 , drvdata -> arch & 0xf );
1746
+ drvdata -> cpu , ETM_ARCH_MAJOR_VERSION (drvdata -> arch ),
1747
+ ETM_ARCH_MINOR_VERSION (drvdata -> arch ));
1748
1748
1749
1749
if (boot_enable ) {
1750
1750
coresight_enable (drvdata -> csdev );
0 commit comments