123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- PowerPC 440
- Last Update: September 11, 2002
- =======================================================================
- OVERVIEW
- ============
- Support for the ppc440 is contained in the cpu/ppc44x directory
- and enabled via the CONFIG_440 flag. It is largely based on the
- 405gp code. A sample board support implementation is contained
- in the board/ebony directory.
- All testing was performed using the AMCC Ebony board using both
- Rev B and Rev C silicon. However, since the Rev B. silicon has
- extensive errata, support for Rev B. is minimal (it boots, and
- features such as i2c, pci, tftpboot, etc. seem to work ok).
- The expectation is that all new board designs will be using
- Rev C or later parts
- The ppc440 port does a fair job of keeping "board-specific" code
- out of the "cpu-specific" source. The goal of course was to
- provide mechanisms for each board to customize without having
- to clutter the cpu-specific source with a lot of ifdefs. Most
- of these mechanisms are described in the following sections.
- MEMORY MANAGEMENT
- =================
- The ppc440 doesn't run in "real mode". The MMU must be active
- at all times. Additionally, the 440 implements a 36-bit physical
- memory space that gets mapped into the PowerPC 32-bit virtual
- address space. So things like memory-mapped peripherals, etc must
- all be mapped in. Once this is done, the 32-bit virtual address
- space is then viewed as though it were physical memory.
- However, this means that memory, peripherals, etc can be configured
- to appear (mostly) anywhere in the virtual address space. Each board
- must define its own mappings using the tlbtab (see board/ebony/init.S).
- The actual TLB setup is performed by the cpu-specific code.
- Although each board is free to define its own mappings, there are
- several definitions to be aware of. These definitions may be used in
- the cpu-specific code (vs. board-specific code), so you should
- at least review these before deciding to make any changes ... it
- will probably save you some headaches ;-)
- CONFIG_SYS_SDRAM_BASE - The virtual address where SDRAM is mapped (always 0)
- CONFIG_SYS_FLASH_BASE - The virtual address where FLASH is mapped.
- CONFIG_SYS_PCI_MEMBASE - The virtual address where PCI-bus memory is mapped.
- This mapping provides access to PCI-bus memory.
- CONFIG_SYS_PERIPHERAL_BASE - The virtual address where the 440 memory-mapped
- peripherals are mapped. (e.g.
- CONFIG_SYS_ISRAM_BASE - The virtual address where the 440 internal SRAM is
- mapped. The internal SRAM is equivalent to 405gp OCM and is used
- for the initial stack.
- CONFIG_SYS_PCI_BASE - The virtual address where the 440 PCI-x bridge config
- registers are mapped.
- CONFIG_SYS_PCI_TARGBASE - The PCI address that is mapped to the virtual address
- defined by CONFIG_SYS_PCI_MEMBASE.
- UART / SERIAL
- =================
- The UART port works fine when an external serial clock is provided
- (like the one on the Ebony board) and when using internal clocking.
- This is controlled with the CONFIG_SYS_EXT_SERIAL_CLOCK flag. When using
- internal clocking, the "ideal baud rate" settings in the 440GP
- user manual are automatically calculated.
- I2C
- =================
- The i2c utilities have been tested on both Rev B. and Rev C. and
- look good. The 'i2c probe' command implementation has been updated to
- allow for 'skipped' addresses. Some i2c slaves are write only and
- cause problems when a probe (read) is performed (for example the
- CDCV850 clock controller at address 0x69 on the ebony board).
- To prevent probing certain addresses you can define the
- CONFIG_SYS_I2C_NOPROBES macro in your board-specific header file. When
- defined, all specified addresses are skipped during a probe.
- The addresses that are skipped will be displayed in the output
- of the 'i2c probe' command.
- For example, to prevent probing address 0x69, define the macro as
- follows:
- Similarly, to prevent probing addresses 0x69 and 0x70, define the
- macro a:
- DDR SDRAM CONTROLLER
- ====================
- SDRAM controller intialization using Serial Presence Detect (SPD) is
- now supported (thanks Jun). It is enabled by defining CONFIG_SPD_EEPROM.
- The i2c eeprom addresses are controlled by the SPD_EEPROM_ADDRESS macro.
- NOTE: The SPD_EEPROM_ADDRESS macro is defined differently than for other
- processors. Traditionally, it defined a single address. For the 440 it
- defines an array of addresses to support multiple banks. Address order
- is significant: the addresses are used in order to program the BankN
- registers. For example, two banks with i2c addresses of 0x53 (bank 0)
- and 0x52 (bank 1) would be defined as follows:
- PCI-X BRIDGE
- ====================
- PCI is an area that requires lots of flexibility since every board has
- its own set of constraints and configuration. This section describes the
- 440 implementation.
- CPC0_STRP1[PISE]
- is aborted and an indication is printed. This is NOT considered an
- error
- gives you a chance to edit the i2c bootstrap eeproms using the i2c
- utilities once you get to the U-Boot command prompt. NOTE: the default
- 440 bootstrap options (not using i2c eeprom) negates this bit.
- The cpu-specific code sets up a default pci_controller structure
- that maps in a single PCI I/O space and PCI memory space. The I/O
- space begins at PCI I/O address 0 and the PCI memory space is
- 256 MB starting at PCI address CONFIG_SYS_PCI_TARGBASE. After the
- pci_controller structure is initialized, the cpu-specific code will
- call the routine pci_pre_init(). This routine is implemented by
- board-specific code & is where the board can over-ride/extend the
- default pci_controller structure settings and exspecially provide
- a routine to map the PCI interrupts and do other pre-initialization
- tasks. If pci_pre_init() returns a value of zero, PCI initialization
- is aborted; otherwise the controller structure is registered and
- initialization continues.
- The default 440GP PCI target configuration is minimal
- the strapping registers are set as necessary. Since the strapping bits
- provide very limited flexibility, you may want to customize the boards
- target configuration. If CONFIG_SYS_PCI_TARGET_INIT is defined, the cpu-specific
- code will call the routine pci_target_init() which you must implement
- in your board-specific code.
- Target initialization is completed by the cpu-specific code by
- initializing the subsystem id and subsystem vendor id, and then ensuring
- that the 'enable host configuration' bit in the PCIX0_BRDGOPT2 is set.
- The default PCI master initialization maps in 256 MB of pci memory
- starting at PCI address CONFIG_SYS_PCI_MEMBASE. To customize this, define
- PCI_MASTER_INIT. This will call the routine pci_master_init() in your
- board-specific code rather than performing the default master
- initialization.
- The decision to perform PCI host configuration must often be determined
- at run time. The ppc440 port differs from most other implementations in
- that it requires the board to determine its host configuration at run
- time rather than by using compile-time flags. This shouldn't create a
- large impact on the board-specific code since the board only needs to
- implement a single routine that returns a zero or non-zero value:
- is_pci_host().
- Justification for this becomes clear when considering systems running
- in a cPCI environment:
- 1. Arbiter strapping: Many cPCI boards provide an external arbiter (often
- part of the PCI-to-PCI bridge). Even though the arbiter is external (the
- arbiter strapping is negated), the CPU may still be required to perform
- local PCI bus configuration.
- 2. Host only: PPMC boards must sample the MONARCH
- Depending on the configuration of the carrier boar, the PPMC board must
- determine if it should configure the PCI bus at run-time. And in most
- cases, access to the MONARCH
- board-specific FPGA registers, etc).
- In any event, the is_pci_host() routine gives each board the opportunity
- to decide at run-time. If your board is always configured a certain way,
- then just hardcode a return of 1 or 0 as appropriate.
- Regards,
- <smcnutt@artesyncp.com>
|