diff options
Diffstat (limited to 'lib_i386/pci.c')
| -rw-r--r-- | lib_i386/pci.c | 69 | 
1 files changed, 34 insertions, 35 deletions
| diff --git a/lib_i386/pci.c b/lib_i386/pci.c index acd1d25fa..a7f16aa53 100644 --- a/lib_i386/pci.c +++ b/lib_i386/pci.c @@ -21,24 +21,24 @@   * MA 02111-1307 USA   */ -#include <common.h>  -#include <pci.h>  -#include <asm/io.h>  -#include <asm/pci.h>  +#include <common.h> +#include <pci.h> +#include <asm/io.h> +#include <asm/pci.h>  #ifdef CONFIG_PCI  #undef PCI_ROM_SCAN_VERBOSE -int pci_shadow_rom(pci_dev_t dev, unsigned char *dest)  +int pci_shadow_rom(pci_dev_t dev, unsigned char *dest)  {  	struct pci_controller *hose;  	int res = -1;  	int i; -	 +  	u32 rom_addr;  	u32 addr_reg;  	u32 size; -	 +  	u16 vendor;  	u16 device;  	u32 class_code; @@ -47,18 +47,18 @@ int pci_shadow_rom(pci_dev_t dev, unsigned char *dest)  #if 0  	printf("pci_shadow_rom() asked to shadow device %x to %x\n",  	       dev, (u32)dest); -#endif	 +#endif  	pci_read_config_word(dev, PCI_VENDOR_ID, &vendor);  	pci_read_config_word(dev, PCI_DEVICE_ID, &device);  	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_code); -	 +   	class_code &= 0xffffff00;  	class_code >>= 8; -#if 0	 +#if 0  	printf("PCI Header Vendor %04x device %04x class %06x\n",  	       vendor, device, class_code); -#endif	 +#endif  	/* Enable the rom addess decoder */  	pci_write_config_dword(dev, PCI_ROM_ADDRESS, PCI_ROM_ADDRESS_MASK);  	pci_read_config_dword(dev, PCI_ROM_ADDRESS, &addr_reg); @@ -68,40 +68,39 @@ int pci_shadow_rom(pci_dev_t dev, unsigned char *dest)  		printf("pci_chadow_rom: device do not seem to have a rom\n");  		return -1;  	} -	 -	size = (~(addr_reg&PCI_ROM_ADDRESS_MASK))+1;   -	 -#if 0	 + +	size = (~(addr_reg&PCI_ROM_ADDRESS_MASK))+1; + +#if 0  	printf("ROM is %d bytes\n", size); -#endif	 +#endif  	rom_addr = pci_get_rom_window(hose, size); -#if 0	 +#if 0  	printf("ROM mapped at %x \n", rom_addr); -#endif	 -	pci_write_config_dword(dev, PCI_ROM_ADDRESS,  +#endif +	pci_write_config_dword(dev, PCI_ROM_ADDRESS,  			       pci_phys_to_mem(dev, rom_addr)  			       |PCI_ROM_ADDRESS_ENABLE); -	  	for (i=rom_addr;i<rom_addr+size; i+=512) { -		 -		 + +  		if (readw(i) == 0xaa55) {  			u32 pci_data;  #ifdef PCI_ROM_SCAN_VERBOSE  			printf("ROM signature found\n"); -#endif			 +#endif  			pci_data = readw(0x18+i);  			pci_data += i; -			 +  			if (0==memcmp((void*)pci_data, "PCIR", 4)) { -#ifdef PCI_ROM_SCAN_VERBOSE				 +#ifdef PCI_ROM_SCAN_VERBOSE  				printf("Fount PCI rom image at offset %d\n", i-rom_addr);  				printf("Vendor %04x device %04x class %06x\n",  				       readw(pci_data+4), readw(pci_data+6),  				       readl(pci_data+0x0d)&0xffffff); -				printf("%s\n",  +				printf("%s\n",  				       (readw(pci_data+0x15) &0x80)?  				       "Last image":"More images follow");  				switch 	(readb(pci_data+0x14)) { @@ -116,38 +115,38 @@ int pci_shadow_rom(pci_dev_t dev, unsigned char *dest)  					break;  				}  				printf("Image size %d\n", readw(pci_data+0x10) * 512); -#endif				 +#endif  				/* FixMe: I think we should compare the class code  				 * bytes as well but I have no reference on the  				 * exact order of these bytes in the PCI ROM header */ -				if (readw(pci_data+4) == vendor &&  +				if (readw(pci_data+4) == vendor &&  				    readw(pci_data+6) == device &&  				    /* (readl(pci_data+0x0d)&0xffffff) == class_code && */  				    readb(pci_data+0x14) == 0 /* x86 code image */ ) { -#ifdef PCI_ROM_SCAN_VERBOSE					 +#ifdef PCI_ROM_SCAN_VERBOSE  					printf("Suitable ROM image found, copying\n"); -#endif					 +#endif  					memmove(dest, (void*)rom_addr, readw(pci_data+0x10) * 512);  					res = 0;  					break; -					 +  				}  				if (readw(pci_data+0x15) &0x80) {  					break;  				}  			}  		} -		 +  	} -	 +  #ifdef PCI_ROM_SCAN_VERBOSE  	if (res) {  		printf("No suitable image found\n");  	} -#endif	 +#endif  	/* disable PAR register and PCI device ROM address devocer */  	pci_remove_rom_window(hose, rom_addr); -	  	 +  	pci_write_config_dword(dev, PCI_ROM_ADDRESS, 0);  	return res; |