2 * debugfs ops for the L1 cache
4 * Copyright (C) 2006 Paul Mundt
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
10 #include <linux/init.h>
11 #include <linux/module.h>
12 #include <linux/debugfs.h>
13 #include <linux/seq_file.h>
14 #include <asm/processor.h>
15 #include <linux/uaccess.h>
16 #include <asm/cache.h>
25 static int cache_seq_show(struct seq_file
*file
, void *iter
)
27 unsigned int cache_type
= (unsigned int)file
->private;
28 struct cache_info
*cache
;
29 unsigned int waysize
, way
;
31 unsigned long addrstart
= 0;
34 * Go uncached immediately so we don't skew the results any
35 * more than we already are..
39 ccr
= __raw_readl(SH_CCR
);
40 if ((ccr
& CCR_CACHE_ENABLE
) == 0) {
43 seq_printf(file
, "disabled\n");
47 if (cache_type
== CACHE_TYPE_DCACHE
) {
48 addrstart
= CACHE_OC_ADDRESS_ARRAY
;
49 cache
= ¤t_cpu_data
.dcache
;
51 addrstart
= CACHE_IC_ADDRESS_ARRAY
;
52 cache
= ¤t_cpu_data
.icache
;
55 waysize
= cache
->sets
;
58 * If the OC is already in RAM mode, we only have
59 * half of the entries to consider..
61 if ((ccr
& CCR_CACHE_ORA
) && cache_type
== CACHE_TYPE_DCACHE
)
64 waysize
<<= cache
->entry_shift
;
66 for (way
= 0; way
< cache
->ways
; way
++) {
70 seq_printf(file
, "-----------------------------------------\n");
71 seq_printf(file
, "Way %d\n", way
);
72 seq_printf(file
, "-----------------------------------------\n");
74 for (addr
= addrstart
, line
= 0;
75 addr
< addrstart
+ waysize
;
76 addr
+= cache
->linesz
, line
++) {
77 unsigned long data
= __raw_readl(addr
);
79 /* Check the V bit, ignore invalid cachelines */
83 /* U: Dirty, cache tag is 10 bits up */
84 seq_printf(file
, "%3d: %c 0x%lx\n",
85 line
, data
& 2 ? 'U' : ' ',
89 addrstart
+= cache
->way_incr
;
97 static int cache_debugfs_open(struct inode
*inode
, struct file
*file
)
99 return single_open(file
, cache_seq_show
, inode
->i_private
);
102 static const struct file_operations cache_debugfs_fops
= {
103 .owner
= THIS_MODULE
,
104 .open
= cache_debugfs_open
,
107 .release
= single_release
,
110 static int __init
cache_debugfs_init(void)
112 struct dentry
*dcache_dentry
, *icache_dentry
;
114 dcache_dentry
= debugfs_create_file("dcache", S_IRUSR
, arch_debugfs_dir
,
115 (unsigned int *)CACHE_TYPE_DCACHE
,
116 &cache_debugfs_fops
);
120 icache_dentry
= debugfs_create_file("icache", S_IRUSR
, arch_debugfs_dir
,
121 (unsigned int *)CACHE_TYPE_ICACHE
,
122 &cache_debugfs_fops
);
123 if (!icache_dentry
) {
124 debugfs_remove(dcache_dentry
);
130 module_init(cache_debugfs_init
);
132 MODULE_LICENSE("GPL v2");