Mercurial > flash_v2
diff packages/hal/mips/vrc4373/current/src/platform.S @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | |
| children | 77cec8369160 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/hal/mips/vrc4373/current/src/platform.S @@ -0,0 +1,734 @@ +##============================================================================= +## +## platform.S +## +## MIPS VRC4372 platform code +## +##============================================================================= +#####COPYRIGHTBEGIN#### +# +# ------------------------------------------- +# The contents of this file are subject to the Red Hat eCos Public License +# Version 1.1 (the "License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.redhat.com/ +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +# License for the specific language governing rights and limitations under +# the License. +# +# The Original Code is eCos - Embedded Configurable Operating System, +# released September 30, 1998. +# +# The Initial Developer of the Original Code is Red Hat. +# Portions created by Red Hat are +# Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +# All Rights Reserved. +# ------------------------------------------- +# +#####COPYRIGHTEND#### +##============================================================================= +#######DESCRIPTIONBEGIN#### +## +## Author(s): nickg +## Contributors: nickg +## Date: 1999-04-20 +## Purpose: MIPS vrc4372 platform code +## Description: Platform specific code for VRC4372 board. +## +## +## +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include <pkgconf/system.h> +#include <pkgconf/hal.h> + +#ifdef CYGPKG_KERNEL +# include <pkgconf/kernel.h> +#endif + +#include <cyg/hal/arch.inc> + +##----------------------------------------------------------------------------- +## ISR springboard. +## This routine decodes the interrupt from the VRC4372 interrupt controller +## and vectors to it. + + # On entry: + # a0 = MIPS status register interrupt number (1,2 or 3) + # a1 = ISR data value (= interrupt status reg address) + # a2 = saved reg dump ptr + # s0 = saved reg dump ptr + # s1 = vector table offset + # s2 = interrupt number + # a3,v0,v1 etc available for use + + .text + +hal_isr_springboard: + + lw v0,0(a1) # v0 = stat reg value + + # The following code implements an ls bit index algorithm similar + # to that in hal_lsbit_index() in hal_misc.c. + negu v1,v0 # v1 = -v0 + and v1,v1,v0 # v1 &= v0 [isolate ls bit] + sll v0,v1,16 # v0 = v1<<16 + subu v1,v0,v1 # v1 = v0 - v1 + sll a0,v1,6 # a0 = v1<<6 + addu v1,v1,a0 # v1 += a0 + sll a1,v1,4 # a1 = v1<<4 + addu v1,v1,a1 # v1 += a1 + la v0,hal_isr_springboard_table # v0 = table address + srl v1,v1,26 # v1 = v1>>26 + addu v1,v1,v0 # v1 = table entry address + lb a0,0(v1) # a0 = intc isr number + + addi s2,a0,6 # s2 = eCos isr number + sll s1,s2,2 # s1 = isr table index + + la v1,hal_interrupt_handlers + add v1,v1,s1 # v1 = isr handler address + lw v1,0(v1) # v1 = isr handler + + la a1,hal_interrupt_data + add a1,a1,s1 # a1 = address of data ptr + lw a1,0(a1) # a1 = data pointer + + move a0,s2 # pass interrupt number + + jr v1 # jump to handler, return is to + # default vsr already in ra + nop + +hal_isr_springboard_table: + .byte -1, 0, 1, 12, 2, 6, 0, 13 + .byte 3, 0, 7, 0, 0, 0, 0, 14 + .byte 10, 4, 0, 0, 8, 0, 0, 25 + .byte 0, 0, 0, 0, 0, 21, 27, 15 + .byte 31, 11, 5, 0, 0, 0, 0, 0 + .byte 9, 0, 0, 24, 0, 0, 20, 26 + .byte 30, 0, 0, 0, 0, 23, 0, 19 + .byte 29, 0, 22, 18, 28, 17, 16, 0 + +##----------------------------------------------------------------------------- +## Data Load/Store Bus error VSR +## +## If the VRC4373 tries to access a PCI config space register that does +## not have a real device behind it, it provokes a bus error. +## This is a special bus error VSR that detects when we get a bus error +## from a PCI configuration space access and fixes it up to allow the +## program to continue. +## This VSR works in conjunction with hal_pci_config_read(). +## Essentially, if we get a bus error it checks the EPC value and if it +## is at the instruction that accesses the PCI bus, in hal_pci_config_read(), +## it skips it and fixes the registers to allow the program to continue. +## None of this would be necessary if the VRC4373 behaved sensibly and +## returned 0xFFFFFFFF for reads from empty device slots like it should. + + .text + + .globl hal_bus_error_vsr +hal_bus_error_vsr: + # We come here with everything still in registers and: + # K0 = vector number (==7*4) + # K1 = address of this routine + + # Check for special address + + la k1,hal_pci_config_read_load + mfc0 k0,epc + bne k0,k1,1f + nop + + # We have a match, skip the offending instruction + # and put 0xFFFFFFFF into V0. + # First we must clear the EXL bit so that we can + # write to EPC. + mfc0 k1,status # Get status reg + la v0,0xFFFFFFFD # mask for EXL + and k1,v0,k1 # clear EXL + mtc0 k1,status # return to CP0 + nop # let it work + nop + nop + addi k0,k0,4 # skip offending instruction + mtc0 k0,epc # return to EPC + nop # let it work + nop + nop + la v0,0xFFFFFFFF # Put 0xFFFFFFFF into v0 + sync # let everything settle + eret # and return + nop + + # If this is not the special location, we need to continue + # with the usual bus error handling. Since we no longer have + # the original VSR table entry, we use the one just before it + # (for instruction fetch bus error). At present this points + # to the same error handler. +1: + la k1,hal_vsr_table # Get VSR table + lw k1,24(k1) # Pick another vector to follow + la k0,28 # but pretend we are still Bus Error + jr k1 # go there + nop + + +##----------------------------------------------------------------------------- +## PCI config space access function +## +## This is the only function that should be used to read data from the PCI +## configuration space data register. It works with the bus error VSR +## above to work around any bus errors provoked by the VRC4373. + +FUNC_START(hal_pci_config_read) + +hal_pci_config_read_load: + lw v0,0(a0) # Read the value. If this bus-errors the + # handler will skip this instruction and + # put 0xFFFFFFFF into v0. + jr ra # And return + nop + +FUNC_END(hal_pci_config_read) + + +##----------------------------------------------------------------------------- +## Breakpoint springboard + +## The following value has been determined by looking at the code that +## PMON puts in the interrupt vector. Clearly it will be different for +## different versions of PMON. A better approach might be to copy the original +## code out and execute that here. However, there is no guarantee that it is +## position independent. + +#define CYGHWR_MIPS_PMON_EXEPTION_ENTRY 0xa0000dd4 + + .text + + .globl hal_breakpoint_springboard +hal_breakpoint_springboard: + + # We enter here with all of the CPU state still + # in its registers except: + # K0 = vector index + # K1 = address of this function + + la k0,CYGHWR_MIPS_PMON_EXEPTION_ENTRY + jr k0 + nop + +##----------------------------------------------------------------------------- +## ISR tables. + + .extern hal_default_isr + + .data + + .globl hal_interrupt_handlers +hal_interrupt_handlers: + .long hal_default_isr + .long hal_isr_springboard + .long hal_isr_springboard + .long hal_isr_springboard + .long hal_default_isr + .long hal_default_isr + + .rept 32 + .long hal_default_isr + .endr + + .globl hal_interrupt_data +hal_interrupt_data: + + .long 0 + .long CYGHWR_HAL_MIPS_VRC4373_INTC_STAT0 + .long CYGHWR_HAL_MIPS_VRC4373_INTC_STAT1 + .long CYGHWR_HAL_MIPS_VRC4373_INTC_STAT2 + .long 0 + .long 0 + + .rept 32 + .long 0 + .endr + + .globl hal_interrupt_objects +hal_interrupt_objects: + .rept 38 + .long 0 + .endr + + .globl cyg_hal_interrupt_level +cyg_hal_interrupt_level: + .rept 38 + .byte 0 + .endr + +##----------------------------------------------------------------------------- +## MMU setup. +## Much of this code is taken from the PMON sources, hence it does not fully +## conform to our normal coding conventions. + +#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM) + +## DEFINITIONS FOR THE TLB SUPPORT + +#define IO_PHYSICAL_BASE 0x80000000 +#define IO_VIRTUAL_BASE 0xc0000000 +#define NTLBENTRIES 32 +#define K0BASE 0x80000000 +#define TLBLO_G 0x00000001 +#define TLBLO_V 0x00000002 +#define TLBLO_D 0x00000004 +#define TLBPGMASK_MASK 0x01ffe000 +#define TLBINX_INXMASK 0x0000003f +#define CFG_C_UNCACHED 2 +#define TLBLO_CSHIFT 3 +#define TLBLO_PFNSHIFT 6 +#define TLBLO_PFNMASK 0x3fffffc0 +#define TLBHI_VPN2MASK 0xffffe000 +#define TLBHI_VPN2SHIFT 13 +#define TLBHI_VPNMASK 0xfffff000 +#define TLBHI_VPNSHIFT 12 + + +#define TLBLO_UNCACHED (CFG_C_UNCACHED<<TLBLO_CSHIFT) +#define PAGE_SIZE 0x01000000 +#define PADDR_INC 0x02000000 +#define NUMB_PG 8 + + .text + + .set noreorder + + .extern hal_mmu_setup_return + +FUNC_START(hal_mmu_setup) + + mtc0 zero,tlbhi + nop + li a0,0 +2: + bal resettlb + nop + addi a0,a0,1 + bne a0,NTLBENTRIES,2b + nop + + +#define tlblo_even s0 +#define tlblo_odd s1 +#define vaddr s2 +#define paddr0 s3 +#define paddr1 s4 +#define pmask s5 +#define tmp s6 +#define ix k1 + + + li ix,0 + li vaddr,IO_VIRTUAL_BASE + li paddr0,IO_PHYSICAL_BASE +loop: + + li a0,((PAGE_SIZE - 1) << 1) + li a1,TLBPGMASK_MASK + and pmask, a0,a1 + + li tlblo_even, TLBLO_V | TLBLO_D | TLBLO_G + li tlblo_odd, TLBLO_V | TLBLO_D | TLBLO_G + + li tmp,PAGE_SIZE + add paddr1,paddr0,tmp + li tmp,TLBHI_VPN2MASK + and a1,vaddr,tmp + + li tmp,TLBLO_PFNSHIFT + srl a2,paddr0,tmp + li tmp,TLBLO_PFNMASK + and a2,a2,tmp + or a2,a2,TLBLO_UNCACHED + or a2,a2,tlblo_even + + li tmp,TLBLO_PFNSHIFT + srl a3,paddr1,tmp + li tmp,TLBLO_PFNMASK + and a3,a3,tmp + or a3,a3,TLBLO_UNCACHED + or a3,a3,tlblo_odd + + + move a0,pmask + or a0,a0,ix + + bal map_tlb4000 + nop + + addi ix,ix,1 + + li tmp,PADDR_INC + add vaddr,vaddr,tmp + add paddr0,paddr0,tmp + + li tmp,NUMB_PG + bne ix,tmp,loop + nop + + # Go back via a jump, not a return + lar k0,hal_mmu_setup_return + jr k0 + nop + +FUNC_END(hal_mmu_setup) + + +## Invalidate the TLB entry specified by index +## +## resettlb(index) +## a0 = index +## +## Uses : t0, t2, v0, a0 + +FUNC_START(resettlb) + + li t2,K0BASE & TLBHI_VPN2MASK + mfc0 t0,tlbhi # save current TLBHI + mfc0 v0,status # save SR and disable interrupts + mtc0 zero,status # clear interrupts + mtc0 t2,tlbhi # invalidate entry + mtc0 zero,tlblo0 + mtc0 zero,tlblo1 + mtc0 a0,index + nop; nop; nop; nop; nop; nop; nop; nop + tlbwi + nop; nop; nop; nop; nop; nop; nop; nop + mtc0 t0,tlbhi + mtc0 v0,status + j ra + nop + +FUNC_END(resettlb) + +## Setup R4000 TLB entry +## +## map_tlb4000(mask_index, tlbhi, pte_even, pte_odd) +## a0 = TLB entry index and page mask +## a1 = virtual page number and PID +## a2 = pte -- contents of even pte +## a3 = pte -- contents of odd pte +## +## +## +## Uses : t0, t1, t2, v0, a0, a1, a2, a3 + +FUNC_START(map_tlb4000) + and t2,a0,TLBPGMASK_MASK + and a0,TLBINX_INXMASK + mfc0 t1,tlbhi # save current TLBPID + mfc0 v0,status # save SR and disable interrupts + mtc0 zero,status # clear interrupts + mtc0 t2,pagemask # set + mtc0 a1,tlbhi # set VPN and TLBPID + mtc0 a2,tlblo0 # set PPN and access bits + mtc0 a3,tlblo1 # set PPN and access bits + mtc0 a0,index # set INDEX to wired entry + nop; nop; nop; nop; nop; nop; nop; nop + tlbwi # drop it in + nop; nop; nop; nop; nop; nop; nop; nop + mtc0 t1,tlbhi # restore TLBPID + mtc0 v0,status # restore SR + j ra + nop +FUNC_END(map_tlb4000) + +#endif + +##----------------------------------------------------------------------------- +## MEMC initialization. +## This also initializes the PCI bus and ISA bus bridge, so at the end of this +## we should have full access to all the memory and devices we need. +## This code is table driven, which is somewhat more compact that coding it all. +## Table entries consist of an address and a value to store in that address. +## A zero address terminates the table. Two special address values modify the +## behaviour: +## DELAY_LOOP loops for the number of iterations in the value field. +## WRITE16 treats the next 2 words as an address and value to be written +## with a 16 bit write cycle. + +#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM) + +#define DELAY_LOOP 1 +#define WRITE16 2 + + +FUNC_START(hal_memc_setup) + + lar t0,hal_memc_setup_table + la t1,0xbfc00000 + la t2,DELAY_LOOP + la t3,WRITE16 +1: + lw a0,0(t0) # next table entry + lw a1,4(t0) # value to write + addiu t0,8 # go to next entry + beq a0,t2,2f # Check for delay + nop + beq a0,t3,3f # Check for 16 bit write + nop + beqz a0,9f # zero terminates loop + nop + sw a1,0(a0) # write it + lw zero,0(t1) # uncached read to flush write buffer + b 1b + nop +2: + lw zero,0(t1) # uncached read to flush write buffer + bnez a1,2b # count down by value in a1 + addiu a1,-1 # decrement in delay slot + b 1b # go back to loop + nop +3: + lw a3,0(t0) # get next word + addiu t0,4 # skip it + sh a3,0(a1) # store halfword + lw zero,0(t1) # uncached read to flush write buffer + b 1b + nop +9: + jr ra + nop + +FUNC_END(hal_memc_setup) + +##----------------------------------------------------------------------------- +## Definitions for the VRC4373, also known as the Nile I, +## and maybe the Nile III as well. + +#define N1_BASE 0xAF000000 +#define N2_BASE 0xBC000000 + +#define BMCTRL (N1_BASE + 0x00) +#define S1CTRL (N1_BASE + 0x04) +#define S2CTRL (N1_BASE + 0x08) +#define S3CTRL (N1_BASE + 0x0C) +#define S4CTRL (N1_BASE + 0x10) +#define PCIMSTRADDR1 (N1_BASE + 0x14) +#define PCIMSTRADDR2 (N1_BASE + 0x18) +#define PCISLAVADDR1 (N1_BASE + 0x1C) +#define PCISLAVADDR2 (N1_BASE + 0x20) +#define PCIMSTRIO (N1_BASE + 0x24) +#define PCICNFGDATA (N1_BASE + 0x28) +#define PCICNFGADDR (N1_BASE + 0x2C) +#define PCIMBOX1 (N1_BASE + 0x30) +#define PCIMBOX2 (N1_BASE + 0x34) +#define DMACTRL1 (N1_BASE + 0x38) +#define DMALCLADDR1 (N1_BASE + 0x3C) +#define DMAPCIADDR1 (N1_BASE + 0x40) +#define DMACTRL2 (N1_BASE + 0x44) +#define DMALCLADDR2 (N1_BASE + 0x48) +#define DMAPCIADDR2 (N1_BASE + 0x4C) +#define BUSERRSTAT (N1_BASE + 0x50) +#define INTCNTRL (N1_BASE + 0x54) +#define REFRESHRATE (N1_BASE + 0x58) +#define BOOTROMWPRTCT (N1_BASE + 0x5C) +#define PCI_EXCL_ACC (N1_BASE + 0x60) +#define PCI_ENABLE_REG (N1_BASE + 0x74) +#define N3_POM_INIT (N1_BASE + 0x78) +/* +#define N1RESERVED1 (N1_BASE + 0x60) +*/ +#define N1PCIHEADER (N1_BASE + 0x100) +#define N1PCICMD (N1PCIHEADER + 0x04) +#define MBOXPCIADDR (N1PCIHEADER + 0x10) + +#define N1CLSIZE (N1PCIHEADER + 0x0c) /* Cache Line Size */ +#define N1MLTIM (N1PCIHEADER + 0x0d) +#define N1MBADD (N1PCIHEADER + 0x10) +#define N1RSVD2 (N1PCIHEADER + 0x40) /* Word boundary */ +#define N1RTYTIM (N1PCIHEADER + 0x41) + +##----------------------------------------------------------------------------- +## Definitions for the VRC4372, also known as the Nile II. + +#define PCI_N2_DEV 0x00010000 /* PCI Device # - Nile 2 */ + +#define N2CLSIZE ( 0x0c) /* Cache Line Size */ +#define N2IOADD ( 0x14) +#define N2DSCTIM ( 0x40) + +#define IOCON (N2_BASE + 0x0000) + + /* GPIO Bus Controller Registers */ +#define GPDIR (IOCON + 0x0100) +#define GPOUT (IOCON + 0x0104) +#define GPIN (IOCON + 0x0108) + + /* Interrupt Controller Registers */ +#define INTPOL (IOCON + 0x200) +#define INTTRIG (IOCON + 0x204) +#define INTPINS (IOCON + 0x208) +#define INTMASK0 (IOCON + 0x20C) +#define INTSTAT0 (IOCON + 0x210) +#define INTMASK1 (IOCON + 0x214) +#define INTSTAT1 (IOCON + 0x218) +#define INTMASK2 (IOCON + 0x21C) +#define INTSTAT2 (IOCON + 0x220) + + /* IO Bus Controller Registers */ +#if defined(CYGPKG_HAL_MIPS_MSBFIRST) +// The 16 bit registers are swapped pairwise in each word. +#define IOPROF_00 (IOCON + 0x0402) +#define IOPROF_01 (IOCON + 0x0400) +#define IOPROF_02 (IOCON + 0x0406) +#define IOPROF_03 (IOCON + 0x0404) +#define IOPROF_04 (IOCON + 0x040A) +#define IOPROF_05 (IOCON + 0x0408) +#define IOPROF_06 (IOCON + 0x040E) +#define IOPROF_07 (IOCON + 0x040C) +#define IOPROF_08 (IOCON + 0x0412) +#define IOPROF_09 (IOCON + 0x0410) +#define IOPROF_0A (IOCON + 0x0416) +#define IOPROF_0B (IOCON + 0x0414) +#define IOPROF_0C (IOCON + 0x041a) +#define IOPROF_10 (IOCON + 0x0422) +#define IOPROF_11 (IOCON + 0x0420) +#define IOPROF_12 (IOCON + 0x0426) +#define IOPROF_13 (IOCON + 0x0424) +#elif defined(CYGPKG_HAL_MIPS_LSBFIRST) +#define IOPROF_00 (IOCON + 0x0400) +#define IOPROF_01 (IOCON + 0x0402) +#define IOPROF_02 (IOCON + 0x0404) +#define IOPROF_03 (IOCON + 0x0406) +#define IOPROF_04 (IOCON + 0x0408) +#define IOPROF_05 (IOCON + 0x040A) +#define IOPROF_06 (IOCON + 0x040C) +#define IOPROF_07 (IOCON + 0x040E) +#define IOPROF_08 (IOCON + 0x0410) +#define IOPROF_09 (IOCON + 0x0412) +#define IOPROF_0A (IOCON + 0x0414) +#define IOPROF_0B (IOCON + 0x0416) +#define IOPROF_0C (IOCON + 0x0418) +#define IOPROF_10 (IOCON + 0x0420) +#define IOPROF_11 (IOCON + 0x0422) +#define IOPROF_12 (IOCON + 0x0424) +#define IOPROF_13 (IOCON + 0x0426) +#else +#error MIPS endianness not define by configuration +#endif +#define IOTOUT (IOCON + 0x0430) +#define IOPOL (IOCON + 0x0434) + +##----------------------------------------------------------------------------- +## PCI definitions + +#define PCI_IOSPACE_BASE 0x0c /* PCI I/O Space Adr */ + +#define PCIADR_REGNO 0x000000fc /* Register # mask */ + +#define PCI_CONFIG( dev, func, reg ) ( dev | ( reg & PCIADR_REGNO) ) + +#define PCI_COMMAND_STATUS_REG 0x04 +#define PCI_MAP_REG_START 0x10 +#define PCI_INTERRUPT_REG 0x3c + +##----------------------------------------------------------------------------- +## The initialization table + +hal_memc_setup_table: + + .long DELAY_LOOP, 0x00010000 # Wait for HW to settle + + # Set up SDRAM and SIMM1 + .long BMCTRL, 0x0000803b # Base memory setup + .long S1CTRL, 0x0402013f # SIMM1 + + # Set up power-on memory state + .long N3_POM_INIT, 0x00000002 # Power-on memory init + .long DELAY_LOOP, 0x00000100 # wait a bit + .long N3_POM_INIT, 0x00000004 # Power-on memory init + .long DELAY_LOOP, 0x00000100 # wait a bit + .long N3_POM_INIT, 0x00000001 # Power-on memory init + .long DELAY_LOOP, 0x00000100 # wait a bit + .long REFRESHRATE, 0x00000300 # DRAM refresh rate + + .long BOOTROMWPRTCT, 0xffffff3e # Write protect boot ROM + + # Set up PCI master address window + .long PCIMSTRADDR1, 0x1c0fd01c + .long PCIMSTRADDR2, 0x80081080 + + # Set up PCI slave address window + .long PCISLAVADDR1, 0x00081000 + .long PCISLAVADDR2, 0x10081080 + + # Map PCI IO space Phys == Local + .long PCIMSTRIO, (0x000fd000 | ( PCI_IOSPACE_BASE << 24) | PCI_IOSPACE_BASE) + + # VRC4373 Bridge config space + + .long N1PCICMD, 0x00000006 # Memory space enable, bus master + .long N1CLSIZE, 0x00003000 # Master latency time + .long N1MBADD, 0x20000000 # Mailbox base address + .long N1RSVD2, 0x0000f000 # Retry value + + .long PCI_EXCL_ACC, 0x00000020 # PCI exclusive access register + .long PCI_ENABLE_REG, 0x00000005 # PCI config done, enable arbitration + + # Set up 4372. This is configured entirely through its PCI + # configuration space. Hence the following all consist of + # writing an address to the PCICNFGADDR register followed + # by a write of the data to the PCICNFGDATA register. + + .long PCICNFGADDR, PCI_CONFIG( PCI_N2_DEV, 0, PCI_COMMAND_STATUS_REG) + .long PCICNFGDATA, 0x00000146 + + .long PCICNFGADDR, PCI_CONFIG( PCI_N2_DEV, 0, N2CLSIZE) + .long PCICNFGDATA, 0x00003000 + + .long PCICNFGADDR, PCI_CONFIG( PCI_N2_DEV, 0, PCI_MAP_REG_START) + .long PCICNFGDATA, 0x1c000000 + + .long PCICNFGADDR, PCI_CONFIG( PCI_N2_DEV, 0, N2IOADD) + .long PCICNFGDATA, 0x80000000 + + .long PCICNFGADDR, PCI_CONFIG( PCI_N2_DEV, 0, PCI_INTERRUPT_REG) + .long PCICNFGDATA, 0x00000000 + + .long PCICNFGADDR, PCI_CONFIG( PCI_N2_DEV, 0, N2DSCTIM) + .long PCICNFGDATA, 0x0070f000 + + # Set up IO bus controller chip select profile registers to + # allow access to the devices. + + .long WRITE16, IOPROF_00, 0x04d1 # RTC - DS1386 + .long WRITE16, IOPROF_01, 0x007f # DUART - Z8530 + .long WRITE16, IOPROF_02, 0x007f # Timer - Z8536 + .long WRITE16, IOPROF_03, 0x00d9 # Parallel = 8255 + .long WRITE16, IOPROF_06, 0x007f # 7 segment display + .long WRITE16, IOPROF_07, 0x007f # 7 segment display + + # Configure the rest of the 4372 + + .long IOTOUT, 0x200003c0 # IO timout control + .long IOPOL, 0x00000000 # IO bus pin polarity + .long GPDIR, 0x000007c0 # GPIO pins 6-10 output + .long INTPOL, 0x00003fff # Interrupt polarity + .long INTTRIG, 0x00003fff # Interrupt trigger + .long INTSTAT0, 0x00000000 # Zero all int status regs + .long INTSTAT1, 0x00000000 + .long INTSTAT2, 0x00000000 + + .long DELAY_LOOP, 0x00010000 # Wait for HW to settle + + .long 0, 0 + +#endif + +##----------------------------------------------------------------------------- +## end of platform.S +
