diff options
Diffstat (limited to 'board/esd/pci405/pci405.c')
-rw-r--r-- | board/esd/pci405/pci405.c | 73 |
1 files changed, 35 insertions, 38 deletions
diff --git a/board/esd/pci405/pci405.c b/board/esd/pci405/pci405.c index ed86c02..a4f6974 100644 --- a/board/esd/pci405/pci405.c +++ b/board/esd/pci405/pci405.c @@ -29,25 +29,15 @@ #include <pci.h> #include <405gp_pci.h> +#include "pci405.h" + + /* ------------------------------------------------------------------------- */ #if 0 #define FPGA_DEBUG #endif -#define PCI_RECONFIG_MAGIC 0x07081967 - - -struct pci_config_regs { - unsigned short command; - unsigned char latency_timer; - unsigned char int_line; - unsigned long bar1; - unsigned long bar2; - unsigned long magic; -}; - - /* fpga configuration data - generated by bin2cc */ const unsigned char fpgadata[] = { @@ -114,6 +104,8 @@ int misc_init_r (void) int index; int i; struct pci_config_regs *pci_regs; + unsigned int *ptr; + unsigned int *magic; /* * On PCI-405 the environment is saved in eeprom! @@ -171,32 +163,33 @@ int misc_init_r (void) putc ('\n'); /* - * Rewrite pci config regs (only after soft-reset with magic set) + * Reset FPGA via FPGA_DATA pin */ - pci_regs = (struct pci_config_regs *)0x10; - if (pci_regs->magic == PCI_RECONFIG_MAGIC) { - puts("PCI: Found magic, rewriting config regs...\n"); - pci_write_config_word(PCIDEVID_405GP, PCI_COMMAND, - pci_regs->command); - pci_write_config_byte(PCIDEVID_405GP, PCI_LATENCY_TIMER, - pci_regs->latency_timer); - pci_write_config_byte(PCIDEVID_405GP, PCI_INTERRUPT_LINE, - pci_regs->int_line); - pci_write_config_dword(PCIDEVID_405GP, PCI_BASE_ADDRESS_1, - pci_regs->bar1); - pci_write_config_dword(PCIDEVID_405GP, PCI_BASE_ADDRESS_2, - pci_regs->bar2); + SET_FPGA(FPGA_PRG | FPGA_CLK); + udelay(1000); /* wait 1ms */ + SET_FPGA(FPGA_PRG | FPGA_CLK | FPGA_DATA); + udelay(1000); /* wait 1ms */ + + /* + * Check if magic for pci reconfig is written + */ + magic = (unsigned int *)0x00000004; + if (*magic == PCI_RECONFIG_MAGIC) { + /* + * Rewrite pci config regs (only after soft-reset with magic set) + */ + ptr = (unsigned int *)PCI_REGS_ADDR; + if (crc32(0, (char *)PCI_REGS_ADDR+4, PCI_REGS_LEN-4) == *ptr) { + puts("Restoring PCI Configurations Regs!\n"); + ptr = (unsigned int *)PCI_REGS_ADDR + 1; + for (i=0; i<0x40; i+=4) { + pci_write_config_dword(PCIDEVID_405GP, i, *ptr++); + } + } + mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */ + + *magic = 0; /* clear pci reconfig magic again */ } - pci_regs->magic = 0; /* clear magic again */ - -#if 0 /* test-only */ - pci_read_config_word(PCIDEVID_405GP, PCI_COMMAND, &(pci_regs->command)); - pci_read_config_byte(PCIDEVID_405GP, PCI_LATENCY_TIMER, &(pci_regs->latency_timer)); - pci_read_config_byte(PCIDEVID_405GP, PCI_INTERRUPT_LINE, &(pci_regs->int_line)); - pci_read_config_dword(PCIDEVID_405GP, PCI_BASE_ADDRESS_1, &(pci_regs->bar1)); - pci_read_config_dword(PCIDEVID_405GP, PCI_BASE_ADDRESS_2, &(pci_regs->bar2)); - pci_regs->magic = PCI_RECONFIG_MAGIC; /* set magic */ -#endif free(dst); return (0); @@ -215,7 +208,7 @@ int checkboard (void) puts ("Board: "); if (i == -1) { - puts ("### No HW ID - assuming CPCI405"); + puts ("### No HW ID - assuming PCI405"); } else { puts (str); } @@ -238,7 +231,11 @@ long int initdram (int board_type) printf("strap=%x\n", mfdcr(strap)); /* test-only */ #endif +#if 0 /* test-only: all PCI405 version must report 16mb */ return (4*1024*1024 << ((val & 0x000e0000) >> 17)); +#else + return (16*1024*1024); +#endif } /* ------------------------------------------------------------------------- */ |