1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
/*
* Definitions for Sun3 custom MMU.
*/
#include <asm/movs.h>
#ifndef __SUN3_MMU_H__
#define __SUN3_MMU_H__
#define FC_CONTROL 3
/* MMU characteristics. */
#define SUN3_SEGMAPS_PER_CONTEXT 2048
#define SUN3_PMEGS_NUM 256
#define SUN3_CONTEXTS_NUM 8
#define SUN3_PMEG_SIZE_BITS 17
#define SUN3_PMEG_SIZE (1 << SUN3_PMEG_SIZE_BITS)
#define SUN3_PMEG_MASK (SUN3_PMEG_SIZE - 1)
#define SUN3_PTE_SIZE_BITS 13
#define SUN3_PTE_SIZE (1 << SUN3_PTE_SIZE_BITS)
#define SUN3_PTE_MASK (SUN3_PTE_SIZE - 1)
#define SUN3_CONTROL_MASK (0x0FFFFFFC)
#define SUN3_INVALID_PMEG 255
#define SUN3_INVALID_CONTEXT 255
#define AC_IDPROM 0x00000000 /* 34 ID PROM, R/O, byte, 32 bytes */
#define AC_PAGEMAP 0x10000000 /* 3 Pagemap R/W, long */
#define AC_SEGMAP 0x20000000 /* 3 Segment map, byte */
#define AC_CONTEXT 0x30000000 /* 34c current mmu-context */
#define AC_SENABLE 0x40000000 /* 34c system dvma/cache/reset enable reg*/
#define AC_UDVMA_ENB 0x50000000 /* 34 Not used on Sun boards, byte */
#define AC_BUS_ERROR 0x60000000 /* 34 Cleared on read, byte. */
#define AC_SYNC_ERR 0x60000000 /* c fault type */
#define AC_SYNC_VA 0x60000004 /* c fault virtual address */
#define AC_ASYNC_ERR 0x60000008 /* c asynchronous fault type */
#define AC_ASYNC_VA 0x6000000c /* c async fault virtual address */
#define AC_LEDS 0x70000000 /* 34 Zero turns on LEDs, byte */
#define AC_CACHETAGS 0x80000000 /* 34c direct access to the VAC tags */
#define AC_CACHEDDATA 0x90000000 /* 3 c direct access to the VAC data */
#define AC_UDVMA_MAP 0xD0000000 /* 4 Not used on Sun boards, byte */
#define AC_VME_VECTOR 0xE0000000 /* 4 For non-Autovector VME, byte */
#define AC_BOOT_SCC 0xF0000000 /* 34 bypass to access Zilog 8530. byte.*/
#define SUN3_PAGE_CHG_MASK (SUN3_PAGE_PGNUM_MASK \
| SUN3_PAGE_ACCESSED | SUN3_PAGE_MODIFIED)
/* Bus access type within PTE. */
#define SUN3_PAGE_TYPE_MASK (0x0c000000)
#define SUN3_PAGE_TYPE_MEMORY (0x00000000)
#define SUN3_PAGE_TYPE_IO (0x04000000)
#define SUN3_PAGE_TYPE_VME16 (0x08000000)
#define SUN3_PAGE_TYPE_VME32 (0x0c000000)
/* Mask for page number within PTE. */
#define SUN3_PAGE_PGNUM_MASK (0x0007FFFF)
/* Bits within bus-error register. */
#define SUN3_BUSERR_WATCHDOG (0x01)
#define SUN3_BUSERR_unused (0x02)
#define SUN3_BUSERR_FPAENERR (0x04)
#define SUN3_BUSERR_FPABERR (0x08)
#define SUN3_BUSERR_VMEBERR (0x10)
#define SUN3_BUSERR_TIMEOUT (0x20)
#define SUN3_BUSERR_PROTERR (0x40)
#define SUN3_BUSERR_INVALID (0x80)
#ifndef __ASSEMBLY__
/* Read bus error status register (implicitly clearing it). */
extern __inline__ unsigned char sun3_get_buserr (void)
{
unsigned char sfc, c;
GET_SFC (sfc);
SET_SFC (FC_CONTROL);
GET_CONTROL_BYTE (AC_BUS_ERROR, c);
SET_SFC (sfc);
return c;
}
/* Read segmap from hardware MMU. */
extern __inline__ unsigned long sun3_get_segmap (unsigned long addr)
{
register unsigned long entry;
unsigned char c, sfc;
GET_SFC (sfc);
SET_SFC (FC_CONTROL);
GET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), c);
SET_SFC (sfc);
entry = c;
return entry;
}
/* Write segmap to hardware MMU. */
extern __inline__ void sun3_put_segmap (unsigned long addr, unsigned long entry)
{
unsigned char sfc;
GET_DFC (sfc);
SET_DFC (FC_CONTROL);
SET_CONTROL_BYTE (AC_SEGMAP | (addr & SUN3_CONTROL_MASK), entry);
SET_DFC (sfc);
return;
}
/* Read PTE from hardware MMU. */
extern __inline__ unsigned long sun3_get_pte (unsigned long addr)
{
register unsigned long entry;
unsigned char sfc;
GET_SFC (sfc);
SET_SFC (FC_CONTROL);
GET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry);
SET_SFC (sfc);
return entry;
}
/* Write PTE to hardware MMU. */
extern __inline__ void sun3_put_pte (unsigned long addr, unsigned long entry)
{
unsigned char sfc;
GET_DFC (sfc);
SET_DFC (FC_CONTROL);
SET_CONTROL_WORD (AC_PAGEMAP | (addr & SUN3_CONTROL_MASK), entry);
SET_DFC (sfc);
return;
}
/* get current context */
extern __inline__ unsigned char sun3_get_context(void)
{
unsigned char sfc, c;
GET_SFC(sfc);
SET_SFC(FC_CONTROL);
GET_CONTROL_BYTE(AC_CONTEXT, c);
SET_SFC(sfc);
return c;
}
/* set alternate context */
extern __inline__ void sun3_put_context(unsigned char c)
{
unsigned char dfc;
GET_DFC(dfc);
SET_DFC(FC_CONTROL);
SET_CONTROL_BYTE(AC_CONTEXT, c);
SET_DFC(dfc);
return;
}
#endif /* !__ASSEMBLY__ */
#endif /* !__SUN3_MMU_H__ */
|