Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
sh
mm
tlb-debugfs.c
Go to the documentation of this file.
1
/*
2
* arch/sh/mm/tlb-debugfs.c
3
*
4
* debugfs ops for SH-4 ITLB/UTLBs.
5
*
6
* Copyright (C) 2010 Matt Fleming
7
*
8
* This file is subject to the terms and conditions of the GNU General Public
9
* License. See the file "COPYING" in the main directory of this archive
10
* for more details.
11
*/
12
#include <
linux/init.h
>
13
#include <linux/module.h>
14
#include <
linux/debugfs.h
>
15
#include <
linux/seq_file.h
>
16
#include <asm/processor.h>
17
#include <asm/mmu_context.h>
18
#include <asm/tlbflush.h>
19
20
enum
tlb_type
{
21
TLB_TYPE_ITLB
,
22
TLB_TYPE_UTLB
,
23
};
24
25
static
struct
{
26
int
bits
;
27
const
char
*
size
;
28
} tlb_sizes[] = {
29
{ 0x0,
" 1KB"
},
30
{ 0x1,
" 4KB"
},
31
{ 0x2,
" 8KB"
},
32
{ 0x4,
" 64KB"
},
33
{ 0x5,
"256KB"
},
34
{ 0x7,
" 1MB"
},
35
{ 0x8,
" 4MB"
},
36
{ 0xc,
" 64MB"
},
37
};
38
39
static
int
tlb_seq_show(
struct
seq_file
*
file
,
void
*iter)
40
{
41
unsigned
int
tlb_type
= (
unsigned
int
)file->
private
;
42
unsigned
long
addr1
,
addr2
,
data1
,
data2
;
43
unsigned
long
flags
;
44
unsigned
long
mmucr;
45
unsigned
int
nentries,
entry
;
46
unsigned
int
urb
;
47
48
mmucr =
__raw_readl
(
MMUCR
);
49
if
((mmucr & 0x1) == 0) {
50
seq_printf
(file,
"address translation disabled\n"
);
51
return
0;
52
}
53
54
if
(tlb_type ==
TLB_TYPE_ITLB
) {
55
addr1 =
MMU_ITLB_ADDRESS_ARRAY
;
56
addr2
=
MMU_ITLB_ADDRESS_ARRAY2
;
57
data1
=
MMU_ITLB_DATA_ARRAY
;
58
data2
=
MMU_ITLB_DATA_ARRAY2
;
59
nentries = 4;
60
}
else
{
61
addr1 =
MMU_UTLB_ADDRESS_ARRAY
;
62
addr2
=
MMU_UTLB_ADDRESS_ARRAY2
;
63
data1
=
MMU_UTLB_DATA_ARRAY
;
64
data2
=
MMU_UTLB_DATA_ARRAY2
;
65
nentries = 64;
66
}
67
68
local_irq_save
(
flags
);
69
jump_to_uncached
();
70
71
urb
= (mmucr &
MMUCR_URB
) >>
MMUCR_URB_SHIFT
;
72
73
/* Make the "entry >= urb" test fail. */
74
if
(
urb
== 0)
75
urb
=
MMUCR_URB_NENTRIES
+ 1;
76
77
if
(tlb_type ==
TLB_TYPE_ITLB
) {
78
addr1 =
MMU_ITLB_ADDRESS_ARRAY
;
79
addr2
=
MMU_ITLB_ADDRESS_ARRAY2
;
80
data1
=
MMU_ITLB_DATA_ARRAY
;
81
data2
=
MMU_ITLB_DATA_ARRAY2
;
82
nentries = 4;
83
}
else
{
84
addr1 =
MMU_UTLB_ADDRESS_ARRAY
;
85
addr2
=
MMU_UTLB_ADDRESS_ARRAY2
;
86
data1
=
MMU_UTLB_DATA_ARRAY
;
87
data2
=
MMU_UTLB_DATA_ARRAY2
;
88
nentries = 64;
89
}
90
91
seq_printf
(file,
"entry: vpn ppn asid size valid wired\n"
);
92
93
for
(
entry
= 0;
entry
< nentries;
entry
++) {
94
unsigned
long
vpn, ppn,
asid
,
size
;
95
unsigned
long
valid
;
96
unsigned
long
val
;
97
const
char
*sz =
" ?"
;
98
int
i
;
99
100
val =
__raw_readl
(addr1 | (
entry
<<
MMU_TLB_ENTRY_SHIFT
));
101
ctrl_barrier
();
102
vpn = val & 0xfffffc00;
103
valid = val & 0x100;
104
105
val =
__raw_readl
(
addr2
| (
entry
<<
MMU_TLB_ENTRY_SHIFT
));
106
ctrl_barrier
();
107
asid = val &
MMU_CONTEXT_ASID_MASK
;
108
109
val =
__raw_readl
(
data1
| (
entry
<<
MMU_TLB_ENTRY_SHIFT
));
110
ctrl_barrier
();
111
ppn = (val & 0x0ffffc00) << 4;
112
113
val =
__raw_readl
(
data2
| (
entry
<<
MMU_TLB_ENTRY_SHIFT
));
114
ctrl_barrier
();
115
size = (val & 0xf0) >> 4;
116
117
for
(i = 0; i <
ARRAY_SIZE
(tlb_sizes); i++) {
118
if
(tlb_sizes[i].
bits
== size)
119
break
;
120
}
121
122
if
(i !=
ARRAY_SIZE
(tlb_sizes))
123
sz = tlb_sizes[i].size;
124
125
seq_printf
(file,
"%2d: 0x%08lx 0x%08lx %5lu %s %s %s\n"
,
126
entry
, vpn, ppn, asid,
127
sz, valid ?
"V"
:
"-"
,
128
(
urb
<=
entry
) ?
"W"
:
"-"
);
129
}
130
131
back_to_cached
();
132
local_irq_restore
(
flags
);
133
134
return
0;
135
}
136
137
static
int
tlb_debugfs_open(
struct
inode
*
inode
,
struct
file *file)
138
{
139
return
single_open
(file, tlb_seq_show, inode->
i_private
);
140
}
141
142
static
const
struct
file_operations
tlb_debugfs_fops = {
143
.owner =
THIS_MODULE
,
144
.open = tlb_debugfs_open,
145
.read =
seq_read
,
146
.llseek =
seq_lseek
,
147
.release =
single_release
,
148
};
149
150
static
int
__init
tlb_debugfs_init(
void
)
151
{
152
struct
dentry
*
itlb
, *utlb;
153
154
itlb =
debugfs_create_file
(
"itlb"
,
S_IRUSR
,
arch_debugfs_dir
,
155
(
unsigned
int
*)
TLB_TYPE_ITLB
,
156
&tlb_debugfs_fops);
157
if
(
unlikely
(!itlb))
158
return
-
ENOMEM
;
159
160
utlb =
debugfs_create_file
(
"utlb"
,
S_IRUSR
,
arch_debugfs_dir
,
161
(
unsigned
int
*)
TLB_TYPE_UTLB
,
162
&tlb_debugfs_fops);
163
if
(
unlikely
(!utlb)) {
164
debugfs_remove
(itlb);
165
return
-
ENOMEM
;
166
}
167
168
return
0;
169
}
170
module_init
(tlb_debugfs_init);
171
172
MODULE_LICENSE
(
"GPL v2"
);
Generated on Thu Jan 10 2013 13:18:02 for Linux Kernel by
1.8.2