|  | =========================== | 
|  | 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 |