/*------------------------------------------------------------------------------+ * * This souce code has been made available to you by EuroDesign * (www.eurodsn.de). It's based on the original IBM source code, so * this follows: * * This source code has been made available to you by IBM on an AS-IS * basis. Anyone receiving this source is licensed under IBM * copyrights to use it in any way he or she deems fit, including * copying it, modifying it, compiling it, and redistributing it either * with or without modifications. No license under IBM patents or * patent applications is to be implied by the copyright license. * * Any user of this software should understand that IBM cannot provide * technical support for this software and will not be responsible for * any consequences resulting from the use of this software. * * Any person who transfers this source code or any derivative work * must include the IBM copyright notice, this paragraph, and the * preceding two paragraphs in the transferred software. * * COPYRIGHT I B M CORPORATION 1995 * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M *------------------------------------------------------------------------------- */ #include <config.h> #include <ppc4xx.h> #define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */ #include <ppc_asm.tmpl> #include <ppc_defs.h> #include <asm/cache.h> #include <asm/mmu.h> /** * ext_bus_cntlr_init - Initializes the External Bus Controller for the external peripherals * * IMPORTANT: For pass1 this code must run from cache since you can not * reliably change a peripheral banks timing register (pbxap) while running * code from that bank. For ex., since we are running from ROM on bank 0, we * can NOT execute the code that modifies bank 0 timings from ROM, so * we run it from cache. * * Bank 0 - Boot-Flash * Bank 1 - NAND-Flash * Bank 2 - ISA bus * Bank 3 - Second Flash * Bank 4 - USB controller */ .globl ext_bus_cntlr_init ext_bus_cntlr_init: /* * We need the current boot up configuration to set correct * timings into internal flash and external flash */ mfdcr r24,strap /* xxxx xxxx xxxx xxx? ?xxx xxxx xxxx xxxx 0 0 -> 8 bit external ROM 0 1 -> 16 bit internal ROM */ addi r4,0,2 srw r24,r24,r4 /* shift right r24 two positions */ andi. r24,r24,0x06000 /* * All calculations are based on 33MHz EBC clock. * * First, create a "very slow" timing (~250ns) with burst mode enabled * This is need for the external flash access */ lis r25,0x0800 ori r25,r25,0x0280 /* 0000 1000 0xxx 0000 0000 0010 100x xxxx = 0x03800280 /* * Second, create a fast timing: * 90ns first cycle - 3 clock access * and 90ns burst cycle, plus 1 clock after the last access * This is used for the internal access */ lis r26,0x8900 ori r26,r26,0x0280 /* 1000 1001 0xxx 0000 0000 0010 100x xxxx /* * We can't change settings on CS# if we currently use them. * -> load a few instructions into cache and run this code from cache */ mflr r4 /* save link register */ bl ..getAddr ..getAddr: mflr r3 /* get address of ..getAddr */ mtlr r4 /* restore link register */ addi r4,0,14 /* set ctr to 10; used to prefetch */ mtctr r4 /* 10 cache lines to fit this function in cache (gives us 8x10=80 instructions) */ ..ebcloop: icbt r0,r3 /* prefetch cache line for addr in r3 */ addi r3,r3,32 /* move to next cache line */ bdnz ..ebcloop /* continue for 10 cache lines */ /* * Delay to ensure all accesses to ROM are complete before changing * bank 0 timings. 200usec should be enough. * 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles */ lis r3,0x0 ori r3,r3,0xA000 /* ensure 200usec have passed since reset */ mtctr r3 ..spinlp: bdnz ..spinlp /* spin loop */ /*----------------------------------------------------------------------- * Memory Bank 0 (BOOT-ROM) initialization * 0xFFEF00000....0xFFFFFFF * We only have to change the timing. Mapping is ok by boot-strapping *----------------------------------------------------------------------- */ li r4,pb0ap /* PB0AP=Peripheral Bank 0 Access Parameters */ mtdcr ebccfga,r4 mr r4,r26 /* assume internal fast flash is boot flash */ cmpwi r24,0x2000 /* assumption true? ... */ beq 1f /* ...yes! */ mr r4,r25 /* ...no, use the slow variant */ mr r25,r26 /* use this for the other flash */ 1: mtdcr ebccfgd,r4 /* change timing now */ li r4,pb0cr /* PB0CR=Peripheral Bank 0 Control Register */ mtdcr ebccfga,r4 mfdcr r4,ebccfgd lis r3,0x0001 ori r3,r3,0x8000 /* allow reads and writes */ or r4,r4,r3 mtdcr ebccfgd,r4 /*----------------------------------------------------------------------- * Memory Bank 3 (Second-Flash) initialization * 0xF0000000...0xF01FFFFF -> 2MB *----------------------------------------------------------------------- */ li r4,pb3ap /* Peripheral Bank 1 Access Parameter */ mtdcr ebccfga,r4 mtdcr ebccfgd,r2 /* change timing */ li r4,pb3cr /* Peripheral Bank 1 Configuration Registers */ mtdcr ebccfga,r4 lis r4,0xF003 ori r4,r4,0x8000 /* * Consider boot configuration */ xori r24,r24,0x2000 /* invert current bus width */ or r4,r4,r24 mtdcr ebccfgd,r4 /*----------------------------------------------------------------------- * Memory Bank 1 (NAND-Flash) initialization * 0x77D00000...0x77DFFFFF -> 1MB * - the write/read pulse to the NAND can be as short as 25ns, bus the cycle time is always 50ns * - the setup time is 0ns * - the hold time is 15ns * -> * - TWT = 0 * - CSN = 0 * - OEN = 0 * - WBN = 0 * - WBF = 0 * - TH = 1 * ----> 2 clocks per cycle = 60ns cycle (30ns active, 30ns hold) *----------------------------------------------------------------------- */ li r4,pb1ap /* Peripheral Bank 1 Access Parameter */ mtdcr ebccfga,r4 lis r4,0x0000 ori r4,r4,0x0200 mtdcr ebccfgd,r4 li r4,pb1cr /* Peripheral Bank 1 Configuration Registers */ mtdcr ebccfga,r4 lis r4,0x77D1 ori r4,r4,0x8000 mtdcr ebccfgd,r4 /* USB init (without acceleration) */ #ifndef CONFIG_ISP1161_PRESENT li r4,pb4ap /* PB4AP=Peripheral Bank 4 Access Parameters */ mtdcr ebccfga,r4 lis r4,0x0180 ori r4,r4,0x5940 mtdcr ebccfgd,r4 #endif /*----------------------------------------------------------------------- * Memory Bank 2 (ISA Access) initialization (plus memory bank 6 and 7) * 0x78000000...0x7BFFFFFF -> 64 MB * Wir arbeiten bei 33 MHz -> 30ns *----------------------------------------------------------------------- A7 (ppc notation) or A24 (standard notation) decides about the type of access: A7/A24=0 -> memory cycle A7/ /A24=1 -> I/O cycle */ li r4,pb2ap /* PB2AP=Peripheral Bank 2 Access Parameters */ mtdcr ebccfga,r4 /* We emulate an ISA access 1. Address active 2. wait 0 EBC clocks -> CSN=0 3. set CS# 4. wait 0 EBC clock -> OEN/WBN=0 5. set OE#/WE# 6. wait 4 clocks (ca. 90ns) and for Ready signal 7. hold for 4 clocks -> TH=4 */ #if 1 /* faster access to isa-bus */ lis r4,0x0180 ori r4,r4,0x5940 #else lis r4,0x0100 ori r4,r4,0x0340 #endif mtdcr ebccfgd,r4 #ifdef IDE_USES_ISA_EMULATION li r25,pb5ap /* PB5AP=Peripheral Bank 5 Access Parameters */ mtdcr ebccfga,r25 mtdcr ebccfgd,r4 #endif li r25,pb6ap /* PB6AP=Peripheral Bank 6 Access Parameters */ mtdcr ebccfga,r25 mtdcr ebccfgd,r4 li r25,pb7ap /* PB7AP=Peripheral Bank 7 Access Parameters */ mtdcr ebccfga,r25 mtdcr ebccfgd,r4 li r25,pb2cr /* PB2CR=Peripheral Bank 2 Configuration Register */ mtdcr ebccfga,r25 lis r4,0x780B ori r4,r4,0xA000 mtdcr ebccfgd,r4 /* * the other areas are only 1MiB in size */ lis r4,0x7401 ori r4,r4,0xA000 li r25,pb6cr /* PB6CR=Peripheral Bank 6 Configuration Register */ mtdcr ebccfga,r25 lis r4,0x7401 ori r4,r4,0xA000 mtdcr ebccfgd,r4 li r25,pb7cr /* PB7CR=Peripheral Bank 7 Configuration Register */ mtdcr ebccfga,r25 lis r4,0x7411 ori r4,r4,0xA000 mtdcr ebccfgd,r4 #ifndef CONFIG_ISP1161_PRESENT li r25,pb4cr /* PB4CR=Peripheral Bank 4 Configuration Register */ mtdcr ebccfga,r25 lis r4,0x7421 ori r4,r4,0xA000 mtdcr ebccfgd,r4 #endif #ifdef IDE_USES_ISA_EMULATION li r25,pb5cr /* PB5CR=Peripheral Bank 5 Configuration Register */ mtdcr ebccfga,r25 lis r4,0x0000 ori r4,r4,0x0000 mtdcr ebccfgd,r4 #endif /*----------------------------------------------------------------------- * Memory bank 4: USB controller Philips ISP6111 * 0x77C00000 ... 0x77CFFFFF * * The chip is connected to: * - CPU CS#4 * - CPU IRQ#2 * - CPU DMA 3 * * Timing: * - command to first data: 300ns. Software must ensure this timing! * - Write pulse: 26ns * - Read pulse: 33ns * - read cycle time: 150ns * - write cycle time: 140ns * * Note: All calculations are based on 33MHz EBC clock. One '#' or '_' is 30ns * * |- 300ns --| * |---- 420ns ---|---- 420ns ---| cycle * CS ############:###____#######:###____####### * OE ############:####___#######:####___####### * WE ############:####__########:####__######## * * ----> 2 clocks RD/WR pulses: 60ns * ----> CSN: 3 clock, 90ns * ----> OEN: 1 clocks (read cycle) * ----> WBN: 1 clocks (write cycle) * ----> WBE: 2 clocks * ----> TH: 7 clock, 210ns * ----> TWT: 7 clocks *----------------------------------------------------------------------- */ #ifdef CONFIG_ISP1161_PRESENT li r4,pb4ap /* PB4AP=Peripheral Bank 4 Access Parameters */ mtdcr ebccfga,r4 lis r4,0x030D ori r4,r4,0x5E80 mtdcr ebccfgd,r4 li r4,pb4cr /* PB2CR=Peripheral Bank 4 Configuration Register */ mtdcr ebccfga,r4 lis r4,0x77C1 ori r4,r4,0xA000 mtdcr ebccfgd,r4 #endif #ifndef IDE_USES_ISA_EMULATION /*----------------------------------------------------------------------- * Memory Bank 5 used for IDE access * * Timings for IDE Interface * * SETUP / LENGTH / HOLD - cycles valid for 33.3 MHz clk -> 30ns cycle time * 70 165 30 PIO-Mode 0, [ns] * 3 6 1 [Cycles] ----> AP=0x040C0200 * 50 125 20 PIO-Mode 1, [ns] * 2 5 1 [Cycles] ----> AP=0x03080200 * 30 100 15 PIO-Mode 2, [ns] * 1 4 1 [Cycles] ----> AP=0x02040200 * 30 80 10 PIO-Mode 3, [ns] * 1 3 1 [Cycles] ----> AP=0x01840200 * 25 70 10 PIO-Mode 4, [ns] * 1 3 1 [Cycles] ----> AP=0x01840200 * *----------------------------------------------------------------------- */ li r4,pb5ap mtdcr ebccfga,r4 lis r4,0x040C ori r4,r4,0x0200 mtdcr ebccfgd,r4 li r4,pb5cr /* PB2CR=Peripheral Bank 2 Configuration Register */ mtdcr ebccfga,r4 lis r4,0x7A01 ori r4,r4,0xA000 mtdcr ebccfgd,r4 #endif /* * External Peripheral Control Register */ li r4,epcr mtdcr ebccfga,r4 lis r4,0xB84E ori r4,r4,0xF000 mtdcr ebccfgd,r4 /* * drive POST code */ lis r4,0x7900 ori r4,r4,0x0080 li r3,0x0001 stb r3,0(r4) /* 01 -> external bus controller is initialized */ nop /* pass2 DCR errata #8 */ blr