Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm-cci: Get rid of secure transactions for PMU driver

Avoid secure transactions while probing the CCI PMU. The
existing code makes use of the Peripheral ID2 (PID2) register
to determine the revision of the CCI400, which requires a
secure transaction. This puts a limitation on the usage of the
driver on systems running non-secure Linux(e.g, ARM64).

Updated the device-tree binding for cci pmu node to add the explicit
revision number for the compatible field.

The supported strings are :
arm,cci-400-pmu,r0
arm,cci-400-pmu,r1
arm,cci-400-pmu - DEPRECATED. See NOTE below

NOTE: If the revision is not mentioned, we need to probe the cci revision,
which could be fatal on a platform running non-secure. We need a reliable way
to know if we can poke the CCI registers at runtime on ARM32. We depend on
'mcpm_is_available()' when it is available. mcpm_is_available() returns true
only when there is a registered driver for mcpm. Otherwise, we assume that we
don't have secure access, and skips probing the revision number(ARM64 case).

The MCPM should figure out if it is safe to access the CCI. Unfortunately
there isn't a reliable way to indicate the same via dtb. This patch doesn't
address/change the current situation. It only deals with the CCI-PMU, leaving
the assumptions about the secure access as it has been, prior to this patch.

Cc: devicetree@vger.kernel.org
Cc: Punit Agrawal <punit.agrawal@arm.com>
Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>

authored by

Suzuki K. Poulose and committed by
Will Deacon
772742a6 fc17c839

+92 -3
+5 -2
Documentation/devicetree/bindings/arm/cci.txt
··· 94 94 - compatible 95 95 Usage: required 96 96 Value type: <string> 97 - Definition: must be "arm,cci-400-pmu" 98 - 97 + Definition: Must contain one of: 98 + "arm,cci-400-pmu,r0" 99 + "arm,cci-400-pmu,r1" 100 + "arm,cci-400-pmu" - DEPRECATED, permitted only where OS has 101 + secure acces to CCI registers 99 102 - reg: 100 103 Usage: required 101 104 Value type: Integer cells. A register entry, expressed
+42
arch/arm/include/asm/arm-cci.h
··· 1 + /* 2 + * arch/arm/include/asm/arm-cci.h 3 + * 4 + * Copyright (C) 2015 ARM Ltd. 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License version 2 as 8 + * published by the Free Software Foundation. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + #ifndef __ASM_ARM_CCI_H 20 + #define __ASM_ARM_CCI_H 21 + 22 + #ifdef CONFIG_MCPM 23 + #include <asm/mcpm.h> 24 + 25 + /* 26 + * We don't have a reliable way of detecting whether, 27 + * if we have access to secure-only registers, unless 28 + * mcpm is registered. 29 + */ 30 + static inline bool platform_has_secure_cci_access(void) 31 + { 32 + return mcpm_is_available(); 33 + } 34 + 35 + #else 36 + static inline bool platform_has_secure_cci_access(void) 37 + { 38 + return false; 39 + } 40 + #endif 41 + 42 + #endif
+27
arch/arm64/include/asm/arm-cci.h
··· 1 + /* 2 + * arch/arm64/include/asm/arm-cci.h 3 + * 4 + * Copyright (C) 2015 ARM Ltd. 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License version 2 as 8 + * published by the Free Software Foundation. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + #ifndef __ASM_ARM_CCI_H 20 + #define __ASM_ARM_CCI_H 21 + 22 + static inline bool platform_has_secure_cci_access(void) 23 + { 24 + return false; 25 + } 26 + 27 + #endif
+16 -1
drivers/bus/arm-cci.c
··· 217 217 218 218 static const struct cci_pmu_model *probe_cci_model(struct platform_device *pdev) 219 219 { 220 - return &cci_pmu_models[probe_cci_revision()]; 220 + if (platform_has_secure_cci_access()) 221 + return &cci_pmu_models[probe_cci_revision()]; 222 + return NULL; 221 223 } 222 224 223 225 static int pmu_is_valid_counter(struct cci_pmu *cci_pmu, int idx) ··· 884 882 static const struct of_device_id arm_cci_pmu_matches[] = { 885 883 { 886 884 .compatible = "arm,cci-400-pmu", 885 + .data = NULL, 886 + }, 887 + { 888 + .compatible = "arm,cci-400-pmu,r0", 889 + .data = &cci_pmu_models[CCI_REV_R0], 890 + }, 891 + { 892 + .compatible = "arm,cci-400-pmu,r1", 893 + .data = &cci_pmu_models[CCI_REV_R1], 887 894 }, 888 895 {}, 889 896 }; ··· 903 892 pdev->dev.of_node); 904 893 if (!match) 905 894 return NULL; 895 + if (match->data) 896 + return match->data; 906 897 898 + dev_warn(&pdev->dev, "DEPRECATED compatible property," 899 + "requires secure access to CCI registers"); 907 900 return probe_cci_model(pdev); 908 901 } 909 902
+2
include/linux/arm-cci.h
··· 24 24 #include <linux/errno.h> 25 25 #include <linux/types.h> 26 26 27 + #include <asm/arm-cci.h> 28 + 27 29 struct device_node; 28 30 29 31 #ifdef CONFIG_ARM_CCI