Skip to content

Commit a8d4636

Browse files
wildea01ctmarinas
authored andcommitted
arm64: cacheinfo: Remove CCSIDR-based cache information probing
The CCSIDR_EL1.{NumSets,Associativity,LineSize} fields are only for use in conjunction with set/way cache maintenance and are not guaranteed to represent the actual microarchitectural features of a design. The architecture explicitly states: | You cannot make any inference about the actual sizes of caches based | on these parameters. Furthermore, CCSIDR_EL1.{WT,WB,RA,WA} have been removed retrospectively from ARMv8 and are now considered to be UNKNOWN. Since the kernel doesn't make use of set/way cache maintenance and it is not possible for userspace to execute these instructions, we have no need for the CCSIDR information in the kernel. This patch removes the accessors, along with the related portions of the cacheinfo support, which should instead be reintroduced when firmware has a mechanism to provide us with reliable information. Acked-by: Mark Rutland <[email protected]> Acked-by: Sudeep Holla <[email protected]> Signed-off-by: Will Deacon <[email protected]> Signed-off-by: Catalin Marinas <[email protected]>
1 parent 3689c75 commit a8d4636

File tree

2 files changed

+0
-62
lines changed

2 files changed

+0
-62
lines changed

arch/arm64/include/asm/cachetype.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,30 +39,6 @@
3939

4040
extern unsigned long __icache_flags;
4141

42-
/*
43-
* NumSets, bits[27:13] - (Number of sets in cache) - 1
44-
* Associativity, bits[12:3] - (Associativity of cache) - 1
45-
* LineSize, bits[2:0] - (Log2(Number of words in cache line)) - 2
46-
*/
47-
#define CCSIDR_EL1_WRITE_THROUGH BIT(31)
48-
#define CCSIDR_EL1_WRITE_BACK BIT(30)
49-
#define CCSIDR_EL1_READ_ALLOCATE BIT(29)
50-
#define CCSIDR_EL1_WRITE_ALLOCATE BIT(28)
51-
#define CCSIDR_EL1_LINESIZE_MASK 0x7
52-
#define CCSIDR_EL1_LINESIZE(x) ((x) & CCSIDR_EL1_LINESIZE_MASK)
53-
#define CCSIDR_EL1_ASSOCIATIVITY_SHIFT 3
54-
#define CCSIDR_EL1_ASSOCIATIVITY_MASK 0x3ff
55-
#define CCSIDR_EL1_ASSOCIATIVITY(x) \
56-
(((x) >> CCSIDR_EL1_ASSOCIATIVITY_SHIFT) & CCSIDR_EL1_ASSOCIATIVITY_MASK)
57-
#define CCSIDR_EL1_NUMSETS_SHIFT 13
58-
#define CCSIDR_EL1_NUMSETS_MASK 0x7fff
59-
#define CCSIDR_EL1_NUMSETS(x) \
60-
(((x) >> CCSIDR_EL1_NUMSETS_SHIFT) & CCSIDR_EL1_NUMSETS_MASK)
61-
62-
#define CACHE_LINESIZE(x) (16 << CCSIDR_EL1_LINESIZE(x))
63-
#define CACHE_NUMSETS(x) (CCSIDR_EL1_NUMSETS(x) + 1)
64-
#define CACHE_ASSOCIATIVITY(x) (CCSIDR_EL1_ASSOCIATIVITY(x) + 1)
65-
6642
/*
6743
* Whilst the D-side always behaves as PIPT on AArch64, aliasing is
6844
* permitted in the I-cache.

arch/arm64/kernel/cacheinfo.c

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,9 @@
1717
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1818
*/
1919

20-
#include <linux/bitops.h>
2120
#include <linux/cacheinfo.h>
22-
#include <linux/cpu.h>
23-
#include <linux/compiler.h>
2421
#include <linux/of.h>
2522

26-
#include <asm/cachetype.h>
27-
#include <asm/processor.h>
28-
2923
#define MAX_CACHE_LEVEL 7 /* Max 7 level supported */
3024
/* Ctypen, bits[3(n - 1) + 2 : 3(n - 1)], for n = 1 to 7 */
3125
#define CLIDR_CTYPE_SHIFT(level) (3 * (level - 1))
@@ -43,43 +37,11 @@ static inline enum cache_type get_cache_type(int level)
4337
return CLIDR_CTYPE(clidr, level);
4438
}
4539

46-
/*
47-
* Cache Size Selection Register(CSSELR) selects which Cache Size ID
48-
* Register(CCSIDR) is accessible by specifying the required cache
49-
* level and the cache type. We need to ensure that no one else changes
50-
* CSSELR by calling this in non-preemtible context
51-
*/
52-
u64 __attribute_const__ cache_get_ccsidr(u64 csselr)
53-
{
54-
u64 ccsidr;
55-
56-
WARN_ON(preemptible());
57-
58-
write_sysreg(csselr, csselr_el1);
59-
isb();
60-
ccsidr = read_sysreg(ccsidr_el1);
61-
62-
return ccsidr;
63-
}
64-
6540
static void ci_leaf_init(struct cacheinfo *this_leaf,
6641
enum cache_type type, unsigned int level)
6742
{
68-
bool is_icache = type & CACHE_TYPE_INST;
69-
u64 tmp = cache_get_ccsidr((level - 1) << 1 | is_icache);
70-
7143
this_leaf->level = level;
7244
this_leaf->type = type;
73-
this_leaf->coherency_line_size = CACHE_LINESIZE(tmp);
74-
this_leaf->number_of_sets = CACHE_NUMSETS(tmp);
75-
this_leaf->ways_of_associativity = CACHE_ASSOCIATIVITY(tmp);
76-
this_leaf->size = this_leaf->number_of_sets *
77-
this_leaf->coherency_line_size * this_leaf->ways_of_associativity;
78-
this_leaf->attributes =
79-
((tmp & CCSIDR_EL1_WRITE_THROUGH) ? CACHE_WRITE_THROUGH : 0) |
80-
((tmp & CCSIDR_EL1_WRITE_BACK) ? CACHE_WRITE_BACK : 0) |
81-
((tmp & CCSIDR_EL1_READ_ALLOCATE) ? CACHE_READ_ALLOCATE : 0) |
82-
((tmp & CCSIDR_EL1_WRITE_ALLOCATE) ? CACHE_WRITE_ALLOCATE : 0);
8345
}
8446

8547
static int __init_cache_level(unsigned int cpu)

0 commit comments

Comments
 (0)