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