| /* |
| * (C) Copyright 2000-2004 |
| * Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
| * |
| * (C) Copyright 2002 |
| * Torsten Demke, FORCE Computers GmbH. torsten.demke@fci.com |
| * |
| * See file CREDITS for list of people who contributed to this |
| * project. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation; either version 2 of |
| * the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| * MA 02111-1307 USA |
| */ |
| |
| #include <common.h> |
| #include <mpc824x.h> |
| #include <asm/processor.h> |
| #include <asm/io.h> |
| #include <pci.h> |
| #include <ide.h> |
| #include "piix_pci.h" |
| #include "eXalion.h" |
| |
| int checkboard (void) |
| { |
| ulong busfreq = get_bus_freq (0); |
| char buf[32]; |
| |
| printf ("Board: eXalion MPC824x - CHRP (MAP B)\n"); |
| printf ("Built: %s at %s\n", __DATE__, __TIME__); |
| printf ("Local Bus: %s MHz\n", strmhz (buf, busfreq)); |
| |
| return 0; |
| } |
| |
| int checkflash (void) |
| { |
| printf ("checkflash\n"); |
| flash_init (); |
| return (0); |
| } |
| |
| phys_size_t initdram (int board_type) |
| { |
| int i, cnt; |
| volatile uchar *base = CFG_SDRAM_BASE; |
| volatile ulong *addr; |
| ulong save[32]; |
| ulong val, ret = 0; |
| |
| for (i = 0, cnt = (CFG_MAX_RAM_SIZE / sizeof (long)) >> 1; cnt > 0; |
| cnt >>= 1) { |
| addr = (volatile ulong *) base + cnt; |
| save[i++] = *addr; |
| *addr = ~cnt; |
| } |
| |
| addr = (volatile ulong *) base; |
| save[i] = *addr; |
| *addr = 0; |
| |
| if (*addr != 0) { |
| *addr = save[i]; |
| goto Done; |
| } |
| |
| for (cnt = 1; cnt <= CFG_MAX_RAM_SIZE / sizeof (long); cnt <<= 1) { |
| addr = (volatile ulong *) base + cnt; |
| val = *addr; |
| *addr = save[--i]; |
| if (val != ~cnt) { |
| ulong new_bank0_end = cnt * sizeof (long) - 1; |
| ulong mear1 = mpc824x_mpc107_getreg (MEAR1); |
| ulong emear1 = mpc824x_mpc107_getreg (EMEAR1); |
| |
| mear1 = (mear1 & 0xFFFFFF00) | |
| ((new_bank0_end & MICR_ADDR_MASK) >> |
| MICR_ADDR_SHIFT); |
| emear1 = (emear1 & 0xFFFFFF00) | |
| ((new_bank0_end & MICR_ADDR_MASK) >> |
| MICR_EADDR_SHIFT); |
| mpc824x_mpc107_setreg (MEAR1, mear1); |
| mpc824x_mpc107_setreg (EMEAR1, emear1); |
| |
| ret = cnt * sizeof (long); |
| goto Done; |
| } |
| } |
| |
| ret = CFG_MAX_RAM_SIZE; |
| Done: |
| return ret; |
| } |
| |
| int misc_init_r (void) |
| { |
| pci_dev_t bdf; |
| u32 val32; |
| u8 val8; |
| |
| puts ("ISA: "); |
| bdf = pci_find_device (PIIX4_VENDOR_ID, PIIX4_ISA_DEV_ID, 0); |
| if (bdf == -1) { |
| puts ("Unable to find PIIX4 ISA bridge !\n"); |
| hang (); |
| } |
| |
| /* set device for normal ISA instead EIO */ |
| pci_read_config_dword (bdf, PCI_CFG_PIIX4_GENCFG, &val32); |
| val32 |= 0x00000001; |
| pci_write_config_dword (bdf, PCI_CFG_PIIX4_GENCFG, val32); |
| printf ("PIIX4 ISA bridge (%d,%d,%d)\n", PCI_BUS (bdf), |
| PCI_DEV (bdf), PCI_FUNC (bdf)); |
| |
| puts ("ISA: "); |
| bdf = pci_find_device (PIIX4_VENDOR_ID, PIIX4_IDE_DEV_ID, 0); |
| if (bdf == -1) { |
| puts ("Unable to find PIIX4 IDE controller !\n"); |
| hang (); |
| } |
| |
| /* Init BMIBA register */ |
| /* pci_read_config_dword(bdf, PCI_CFG_PIIX4_BMIBA, &val32); */ |
| /* val32 |= 0x1000; */ |
| /* pci_write_config_dword(bdf, PCI_CFG_PIIX4_BMIBA, val32); */ |
| |
| /* Enable BUS master and IO access */ |
| val32 = PCI_COMMAND_MASTER | PCI_COMMAND_IO; |
| pci_write_config_dword (bdf, PCI_COMMAND, val32); |
| |
| /* Set latency */ |
| pci_read_config_byte (bdf, PCI_LATENCY_TIMER, &val8); |
| val8 = 0x40; |
| pci_write_config_byte (bdf, PCI_LATENCY_TIMER, val8); |
| |
| /* Enable Primary ATA/IDE */ |
| pci_read_config_dword (bdf, PCI_CFG_PIIX4_IDETIM, &val32); |
| /* val32 = 0xa307a307; */ |
| val32 = 0x00008000; |
| pci_write_config_dword (bdf, PCI_CFG_PIIX4_IDETIM, val32); |
| |
| |
| printf ("PIIX4 IDE controller (%d,%d,%d)\n", PCI_BUS (bdf), |
| PCI_DEV (bdf), PCI_FUNC (bdf)); |
| |
| /* Try to get FAT working... */ |
| /* fat_register_read(ide_read); */ |
| |
| |
| return (0); |
| } |
| |
| /* |
| * Show/Init PCI devices on the specified bus number. |
| */ |
| |
| void pci_eXalion_fixup_irq (struct pci_controller *hose, pci_dev_t dev) |
| { |
| unsigned char line; |
| |
| switch (PCI_DEV (dev)) { |
| case 16: |
| line = PCI_INT_A; |
| break; |
| case 17: |
| line = PCI_INT_B; |
| break; |
| case 18: |
| line = PCI_INT_C; |
| break; |
| case 19: |
| line = PCI_INT_D; |
| break; |
| #if defined (CONFIG_MPC8245) |
| case 20: |
| line = PCI_INT_A; |
| break; |
| case 21: |
| line = PCI_INT_B; |
| break; |
| case 22: |
| line = PCI_INT_NA; |
| break; |
| #endif |
| default: |
| line = PCI_INT_A; |
| break; |
| } |
| pci_hose_write_config_byte (hose, dev, PCI_INTERRUPT_LINE, line); |
| } |
| |
| |
| /* |
| * Initialize PCI Devices, report devices found. |
| */ |
| #ifndef CONFIG_PCI_PNP |
| #if defined (CONFIG_MPC8240) |
| static struct pci_config_table pci_eXalion_config_table[] = { |
| { |
| /* Intel 82559ER ethernet controller */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 18, 0x00, |
| pci_cfgfunc_config_device, {PCI_ENET0_IOADDR, |
| PCI_ENET0_MEMADDR, |
| PCI_COMMAND_MEMORY | |
| PCI_COMMAND_MASTER}}, |
| { |
| /* Intel 82371AB PIIX4 PCI to ISA bridge */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 20, 0x00, |
| pci_cfgfunc_config_device, {0, |
| 0, |
| PCI_COMMAND_IO | PCI_COMMAND_MASTER}}, |
| { |
| /* Intel 82371AB PIIX4 IDE controller */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 20, 0x01, |
| pci_cfgfunc_config_device, {0, |
| 0, |
| PCI_COMMAND_IO | PCI_COMMAND_MASTER}}, |
| {} |
| }; |
| #elif defined (CONFIG_MPC8245) |
| static struct pci_config_table pci_eXalion_config_table[] = { |
| { |
| /* Intel 82559ER ethernet controller */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 17, 0x00, |
| pci_cfgfunc_config_device, {PCI_ENET0_IOADDR, |
| PCI_ENET0_MEMADDR, |
| PCI_COMMAND_MEMORY | |
| PCI_COMMAND_MASTER}}, |
| { |
| /* Intel 82559ER ethernet controller */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 18, 0x00, |
| pci_cfgfunc_config_device, {PCI_ENET1_IOADDR, |
| PCI_ENET1_MEMADDR, |
| PCI_COMMAND_MEMORY | |
| PCI_COMMAND_MASTER}}, |
| { |
| /* Broadcom BCM5690 Gigabit switch */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 20, 0x00, |
| pci_cfgfunc_config_device, {PCI_ENET2_IOADDR, |
| PCI_ENET2_MEMADDR, |
| PCI_COMMAND_MEMORY | |
| PCI_COMMAND_MASTER}}, |
| { |
| /* Broadcom BCM5690 Gigabit switch */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 21, 0x00, |
| pci_cfgfunc_config_device, {PCI_ENET3_IOADDR, |
| PCI_ENET3_MEMADDR, |
| PCI_COMMAND_MEMORY | |
| PCI_COMMAND_MASTER}}, |
| { |
| /* Intel 82371AB PIIX4 PCI to ISA bridge */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 22, 0x00, |
| pci_cfgfunc_config_device, {0, |
| 0, |
| PCI_COMMAND_IO | PCI_COMMAND_MASTER}}, |
| { |
| /* Intel 82371AB PIIX4 IDE controller */ |
| PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0x00, 22, 0x01, |
| pci_cfgfunc_config_device, {0, |
| 0, |
| PCI_COMMAND_IO | PCI_COMMAND_MASTER}}, |
| {} |
| }; |
| #else |
| #error Specific type of MPC824x must be defined (i.e. CONFIG_MPC8240) |
| #endif |
| |
| #endif /* #ifndef CONFIG_PCI_PNP */ |
| |
| struct pci_controller hose = { |
| #ifndef CONFIG_PCI_PNP |
| config_table:pci_eXalion_config_table, |
| fixup_irq:pci_eXalion_fixup_irq, |
| #endif |
| }; |
| |
| void pci_init_board (void) |
| { |
| pci_mpc824x_init (&hose); |
| } |