diff options
Diffstat (limited to 'Documentation/frv/features.txt')
-rw-r--r-- | Documentation/frv/features.txt | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/Documentation/frv/features.txt b/Documentation/frv/features.txt new file mode 100644 index 000000000000..fa20c0e72833 --- /dev/null +++ b/Documentation/frv/features.txt | |||
@@ -0,0 +1,310 @@ | |||
1 | =========================== | ||
2 | FUJITSU FR-V LINUX FEATURES | ||
3 | =========================== | ||
4 | |||
5 | This kernel port has a number of features of which the user should be aware: | ||
6 | |||
7 | (*) Linux and uClinux | ||
8 | |||
9 | The FR-V architecture port supports both normal MMU linux and uClinux out | ||
10 | of the same sources. | ||
11 | |||
12 | |||
13 | (*) CPU support | ||
14 | |||
15 | Support for the FR401, FR403, FR405, FR451 and FR555 CPUs should work with | ||
16 | the same uClinux kernel configuration. | ||
17 | |||
18 | In normal (MMU) Linux mode, only the FR451 CPU will work as that is the | ||
19 | only one with a suitably featured CPU. | ||
20 | |||
21 | The kernel is written and compiled with the assumption that only the | ||
22 | bottom 32 GR registers and no FR registers will be used by the kernel | ||
23 | itself, however all extra userspace registers will be saved on context | ||
24 | switch. Note that since most CPUs can't support lazy switching, no attempt | ||
25 | is made to do lazy register saving where that would be possible (FR555 | ||
26 | only currently). | ||
27 | |||
28 | |||
29 | (*) Board support | ||
30 | |||
31 | The board on which the kernel will run can be configured on the "Processor | ||
32 | type and features" configuration tab. | ||
33 | |||
34 | Set the System to "MB93093-PDK" to boot from the MB93093 (FR403) PDK. | ||
35 | |||
36 | Set the System to "MB93091-VDK" to boot from the CB11, CB30, CB41, CB60, | ||
37 | CB70 or CB451 VDK boards. Set the Motherboard setting to "MB93090-MB00" to | ||
38 | boot with the standard ATA90590B VDK motherboard, and set it to "None" to | ||
39 | boot without any motherboard. | ||
40 | |||
41 | |||
42 | (*) Binary Formats | ||
43 | |||
44 | The only userspace binary format supported is FDPIC ELF. Normal ELF, FLAT | ||
45 | and AOUT binaries are not supported for this architecture. | ||
46 | |||
47 | FDPIC ELF supports shared library and program interpreter facilities. | ||
48 | |||
49 | |||
50 | (*) Scheduler Speed | ||
51 | |||
52 | The kernel scheduler runs at 100Hz irrespective of the clock speed on this | ||
53 | architecture. This value is set in asm/param.h (see the HZ macro defined | ||
54 | there). | ||
55 | |||
56 | |||
57 | (*) Normal (MMU) Linux Memory Layout. | ||
58 | |||
59 | See mmu-layout.txt in this directory for a description of the normal linux | ||
60 | memory layout | ||
61 | |||
62 | See include/asm-frv/mem-layout.h for constants pertaining to the memory | ||
63 | layout. | ||
64 | |||
65 | See include/asm-frv/mb-regs.h for the constants pertaining to the I/O bus | ||
66 | controller configuration. | ||
67 | |||
68 | |||
69 | (*) uClinux Memory Layout | ||
70 | |||
71 | The memory layout used by the uClinux kernel is as follows: | ||
72 | |||
73 | 0x00000000 - 0x00000FFF Null pointer catch page | ||
74 | 0x20000000 - 0x200FFFFF CS2# [PDK] FPGA | ||
75 | 0xC0000000 - 0xCFFFFFFF SDRAM | ||
76 | 0xC0000000 Base of Linux kernel image | ||
77 | 0xE0000000 - 0xEFFFFFFF CS2# [VDK] SLBUS/PCI window | ||
78 | 0xF0000000 - 0xF0FFFFFF CS5# MB93493 CSC area (DAV daughter board) | ||
79 | 0xF1000000 - 0xF1FFFFFF CS7# [CB70/CB451] CPU-card PCMCIA port space | ||
80 | 0xFC000000 - 0xFC0FFFFF CS1# [VDK] MB86943 config space | ||
81 | 0xFC100000 - 0xFC1FFFFF CS6# [CB70/CB451] CPU-card DM9000 NIC space | ||
82 | 0xFC100000 - 0xFC1FFFFF CS6# [PDK] AX88796 NIC space | ||
83 | 0xFC200000 - 0xFC2FFFFF CS3# MB93493 CSR area (DAV daughter board) | ||
84 | 0xFD000000 - 0xFDFFFFFF CS4# [CB70/CB451] CPU-card extra flash space | ||
85 | 0xFE000000 - 0xFEFFFFFF Internal CPU peripherals | ||
86 | 0xFF000000 - 0xFF1FFFFF CS0# Flash 1 | ||
87 | 0xFF200000 - 0xFF3FFFFF CS0# Flash 2 | ||
88 | 0xFFC00000 - 0xFFC0001F CS0# [VDK] FPGA | ||
89 | |||
90 | The kernel reads the size of the SDRAM from the memory bus controller | ||
91 | registers by default. | ||
92 | |||
93 | The kernel initialisation code (1) adjusts the SDRAM base addresses to | ||
94 | move the SDRAM to desired address, (2) moves the kernel image down to the | ||
95 | bottom of SDRAM, (3) adjusts the bus controller registers to move I/O | ||
96 | windows, and (4) rearranges the protection registers to protect all of | ||
97 | this. | ||
98 | |||
99 | The reasons for doing this are: (1) the page at address 0 should be | ||
100 | inaccessible so that NULL pointer errors can be caught; and (2) the bottom | ||
101 | three quarters are left unoccupied so that an FR-V CPU with an MMU can use | ||
102 | it for virtual userspace mappings. | ||
103 | |||
104 | See include/asm-frv/mem-layout.h for constants pertaining to the memory | ||
105 | layout. | ||
106 | |||
107 | See include/asm-frv/mb-regs.h for the constants pertaining to the I/O bus | ||
108 | controller configuration. | ||
109 | |||
110 | |||
111 | (*) uClinux Memory Protection | ||
112 | |||
113 | A DAMPR register is used to cover the entire region used for I/O | ||
114 | (0xE0000000 - 0xFFFFFFFF). This permits the kernel to make uncached | ||
115 | accesses to this region. Userspace is not permitted to access it. | ||
116 | |||
117 | The DAMPR/IAMPR protection registers not in use for any other purpose are | ||
118 | tiled over the top of the SDRAM such that: | ||
119 | |||
120 | (1) The core kernel image is covered by as small a tile as possible | ||
121 | granting only the kernel access to the underlying data, whilst | ||
122 | making sure no SDRAM is actually made unavailable by this approach. | ||
123 | |||
124 | (2) All other tiles are arranged to permit userspace access to the rest | ||
125 | of the SDRAM. | ||
126 | |||
127 | Barring point (1), there is nothing to protect kernel data against | ||
128 | userspace damage - but this is uClinux. | ||
129 | |||
130 | |||
131 | (*) Exceptions and Fixups | ||
132 | |||
133 | Since the FR40x and FR55x CPUs that do not have full MMUs generate | ||
134 | imprecise data error exceptions, there are currently no automatic fixup | ||
135 | services available in uClinux. This includes misaligned memory access | ||
136 | fixups. | ||
137 | |||
138 | Userspace EFAULT errors can be trapped by issuing a MEMBAR instruction and | ||
139 | forcing the fault to happen there. | ||
140 | |||
141 | On the FR451, however, data exceptions are mostly precise, and so | ||
142 | exception fixup handling is implemented as normal. | ||
143 | |||
144 | |||
145 | (*) Userspace Breakpoints | ||
146 | |||
147 | The ptrace() system call supports the following userspace debugging | ||
148 | features: | ||
149 | |||
150 | (1) Hardware assisted single step. | ||
151 | |||
152 | (2) Breakpoint via the FR-V "BREAK" instruction. | ||
153 | |||
154 | (3) Breakpoint via the FR-V "TIRA GR0, #1" instruction. | ||
155 | |||
156 | (4) Syscall entry/exit trap. | ||
157 | |||
158 | Each of the above generates a SIGTRAP. | ||
159 | |||
160 | |||
161 | (*) On-Chip Serial Ports | ||
162 | |||
163 | The FR-V on-chip serial ports are made available as ttyS0 and ttyS1. Note | ||
164 | that if the GDB stub is compiled in, ttyS1 will not actually be available | ||
165 | as it will be being used for the GDB stub. | ||
166 | |||
167 | These ports can be made by: | ||
168 | |||
169 | mknod /dev/ttyS0 c 4 64 | ||
170 | mknod /dev/ttyS1 c 4 65 | ||
171 | |||
172 | |||
173 | (*) Maskable Interrupts | ||
174 | |||
175 | Level 15 (Non-maskable) interrupts are dealt with by the GDB stub if | ||
176 | present, and cause a panic if not. If the GDB stub is present, ttyS1's | ||
177 | interrupts are rated at level 15. | ||
178 | |||
179 | All other interrupts are distributed over the set of available priorities | ||
180 | so that no IRQs are shared where possible. The arch interrupt handling | ||
181 | routines attempt to disentangle the various sources available through the | ||
182 | CPU's own multiplexor, and those on off-CPU peripherals. | ||
183 | |||
184 | |||
185 | (*) Accessing PCI Devices | ||
186 | |||
187 | Where PCI is available, care must be taken when dealing with drivers that | ||
188 | access PCI devices. PCI devices present their data in little-endian form, | ||
189 | but the CPU sees it in big-endian form. The macros in asm/io.h try to get | ||
190 | this right, but may not under all circumstances... | ||
191 | |||
192 | |||
193 | (*) Ax88796 Ethernet Driver | ||
194 | |||
195 | The MB93093 PDK board has an Ax88796 ethernet chipset (an NE2000 clone). A | ||
196 | driver has been written to deal specifically with this. The driver | ||
197 | provides MII services for the card. | ||
198 | |||
199 | The driver can be configured by running make xconfig, and going to: | ||
200 | |||
201 | (*) Network device support | ||
202 | - turn on "Network device support" | ||
203 | (*) Ethernet (10 or 100Mbit) | ||
204 | - turn on "Ethernet (10 or 100Mbit)" | ||
205 | - turn on "AX88796 NE2000 compatible chipset" | ||
206 | |||
207 | The driver can be found in: | ||
208 | |||
209 | drivers/net/ax88796.c | ||
210 | include/asm/ax88796.h | ||
211 | |||
212 | |||
213 | (*) WorkRAM Driver | ||
214 | |||
215 | This driver provides a character device that permits access to the WorkRAM | ||
216 | that can be found on the FR451 CPU. Each page is accessible through a | ||
217 | separate minor number, thereby permitting each page to have its own | ||
218 | filesystem permissions set on the device file. | ||
219 | |||
220 | The device files should be: | ||
221 | |||
222 | mknod /dev/frv/workram0 c 240 0 | ||
223 | mknod /dev/frv/workram1 c 240 1 | ||
224 | mknod /dev/frv/workram2 c 240 2 | ||
225 | ... | ||
226 | |||
227 | The driver will not permit the opening of any device file that does not | ||
228 | correspond to at least a partial page of WorkRAM. So the first device file | ||
229 | is the only one available on the FR451. If any other CPU is detected, none | ||
230 | of the devices will be openable. | ||
231 | |||
232 | The devices can be accessed with read, write and llseek, and can also be | ||
233 | mmapped. If they're mmapped, they will only map at the appropriate | ||
234 | 0x7e8nnnnn address on linux and at the 0xfe8nnnnn address on uClinux. If | ||
235 | MAP_FIXED is not specified, the appropriate address will be chosen anyway. | ||
236 | |||
237 | The mappings must be MAP_SHARED not MAP_PRIVATE, and must not be | ||
238 | PROT_EXEC. They must also start at file offset 0, and must not be longer | ||
239 | than one page in size. | ||
240 | |||
241 | This driver can be configured by running make xconfig, and going to: | ||
242 | |||
243 | (*) Character devices | ||
244 | - turn on "Fujitsu FR-V CPU WorkRAM support" | ||
245 | |||
246 | |||
247 | (*) Dynamic data cache write mode changing | ||
248 | |||
249 | It is possible to view and to change the data cache's write mode through | ||
250 | the /proc/sys/frv/cache-mode file while the kernel is running. There are | ||
251 | two modes available: | ||
252 | |||
253 | NAME MEANING | ||
254 | ===== ========================================== | ||
255 | wthru Data cache is in Write-Through mode | ||
256 | wback Data cache is in Write-Back/Copy-Back mode | ||
257 | |||
258 | To read the cache mode: | ||
259 | |||
260 | # cat /proc/sys/frv/cache-mode | ||
261 | wthru | ||
262 | |||
263 | To change the cache mode: | ||
264 | |||
265 | # echo wback >/proc/sys/frv/cache-mode | ||
266 | # cat /proc/sys/frv/cache-mode | ||
267 | wback | ||
268 | |||
269 | |||
270 | (*) MMU Context IDs and Pinning | ||
271 | |||
272 | On MMU Linux the CPU supports the concept of a context ID in its MMU to | ||
273 | make it more efficient (TLB entries are labelled with a context ID to link | ||
274 | them to specific tasks). | ||
275 | |||
276 | Normally once a context ID is allocated, it will remain affixed to a task | ||
277 | or CLONE_VM'd group of tasks for as long as it exists. However, since the | ||
278 | kernel is capable of supporting more tasks than there are possible ID | ||
279 | numbers, the kernel will pass context IDs from one task to another if | ||
280 | there are insufficient available. | ||
281 | |||
282 | The context ID currently in use by a task can be viewed in /proc: | ||
283 | |||
284 | # grep CXNR /proc/1/status | ||
285 | CXNR: 1 | ||
286 | |||
287 | Note that kernel threads do not have a userspace context, and so will not | ||
288 | show a CXNR entry in that file. | ||
289 | |||
290 | Under some circumstances, however, it is desirable to pin a context ID on | ||
291 | a process such that the kernel won't pass it on. This can be done by | ||
292 | writing the process ID of the target process to a special file: | ||
293 | |||
294 | # echo 17 >/proc/sys/frv/pin-cxnr | ||
295 | |||
296 | Reading from the file will then show the context ID pinned. | ||
297 | |||
298 | # cat /proc/sys/frv/pin-cxnr | ||
299 | 4 | ||
300 | |||
301 | The context ID will remain pinned as long as any process is using that | ||
302 | context, i.e.: when the all the subscribing processes have exited or | ||
303 | exec'd; or when an unpinning request happens: | ||
304 | |||
305 | # echo 0 >/proc/sys/frv/pin-cxnr | ||
306 | |||
307 | When there isn't a pinned context, the file shows -1: | ||
308 | |||
309 | # cat /proc/sys/frv/pin-cxnr | ||
310 | -1 | ||