|
@@ -151,13 +151,14 @@ void pci_register_hose(struct pci_controller* hose)
|
|
*phose = hose;
|
|
*phose = hose;
|
|
}
|
|
}
|
|
|
|
|
|
-struct pci_controller *pci_bus_to_hose (int bus)
|
|
|
|
|
|
+struct pci_controller *pci_bus_to_hose(int bus)
|
|
{
|
|
{
|
|
struct pci_controller *hose;
|
|
struct pci_controller *hose;
|
|
|
|
|
|
- for (hose = hose_head; hose; hose = hose->next)
|
|
|
|
|
|
+ for (hose = hose_head; hose; hose = hose->next) {
|
|
if (bus >= hose->first_busno && bus <= hose->last_busno)
|
|
if (bus >= hose->first_busno && bus <= hose->last_busno)
|
|
return hose;
|
|
return hose;
|
|
|
|
+ }
|
|
|
|
|
|
printf("pci_bus_to_hose() failed\n");
|
|
printf("pci_bus_to_hose() failed\n");
|
|
return NULL;
|
|
return NULL;
|
|
@@ -196,21 +197,20 @@ pci_dev_t pci_find_devices(struct pci_device_id *ids, int index)
|
|
pci_dev_t bdf;
|
|
pci_dev_t bdf;
|
|
int i, bus, found_multi = 0;
|
|
int i, bus, found_multi = 0;
|
|
|
|
|
|
- for (hose = hose_head; hose; hose = hose->next)
|
|
|
|
- {
|
|
|
|
|
|
+ for (hose = hose_head; hose; hose = hose->next) {
|
|
#ifdef CONFIG_SYS_SCSI_SCAN_BUS_REVERSE
|
|
#ifdef CONFIG_SYS_SCSI_SCAN_BUS_REVERSE
|
|
for (bus = hose->last_busno; bus >= hose->first_busno; bus--)
|
|
for (bus = hose->last_busno; bus >= hose->first_busno; bus--)
|
|
#else
|
|
#else
|
|
for (bus = hose->first_busno; bus <= hose->last_busno; bus++)
|
|
for (bus = hose->first_busno; bus <= hose->last_busno; bus++)
|
|
#endif
|
|
#endif
|
|
- for (bdf = PCI_BDF(bus,0,0);
|
|
|
|
|
|
+ for (bdf = PCI_BDF(bus, 0, 0);
|
|
#if defined(CONFIG_ELPPC) || defined(CONFIG_PPMC7XX)
|
|
#if defined(CONFIG_ELPPC) || defined(CONFIG_PPMC7XX)
|
|
- bdf < PCI_BDF(bus,PCI_MAX_PCI_DEVICES-1,PCI_MAX_PCI_FUNCTIONS-1);
|
|
|
|
|
|
+ bdf < PCI_BDF(bus, PCI_MAX_PCI_DEVICES - 1,
|
|
|
|
+ PCI_MAX_PCI_FUNCTIONS - 1);
|
|
#else
|
|
#else
|
|
- bdf < PCI_BDF(bus+1,0,0);
|
|
|
|
|
|
+ bdf < PCI_BDF(bus + 1, 0, 0);
|
|
#endif
|
|
#endif
|
|
- bdf += PCI_BDF(0,0,1))
|
|
|
|
- {
|
|
|
|
|
|
+ bdf += PCI_BDF(0, 0, 1)) {
|
|
if (!PCI_FUNC(bdf)) {
|
|
if (!PCI_FUNC(bdf)) {
|
|
pci_read_config_byte(bdf,
|
|
pci_read_config_byte(bdf,
|
|
PCI_HEADER_TYPE,
|
|
PCI_HEADER_TYPE,
|
|
@@ -229,19 +229,19 @@ pci_dev_t pci_find_devices(struct pci_device_id *ids, int index)
|
|
PCI_DEVICE_ID,
|
|
PCI_DEVICE_ID,
|
|
&device);
|
|
&device);
|
|
|
|
|
|
- for (i=0; ids[i].vendor != 0; i++)
|
|
|
|
|
|
+ for (i = 0; ids[i].vendor != 0; i++) {
|
|
if (vendor == ids[i].vendor &&
|
|
if (vendor == ids[i].vendor &&
|
|
- device == ids[i].device)
|
|
|
|
- {
|
|
|
|
|
|
+ device == ids[i].device) {
|
|
if (index <= 0)
|
|
if (index <= 0)
|
|
return bdf;
|
|
return bdf;
|
|
|
|
|
|
index--;
|
|
index--;
|
|
}
|
|
}
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- return (-1);
|
|
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
|
|
|
|
pci_dev_t pci_find_device(unsigned int vendor, unsigned int device, int index)
|
|
pci_dev_t pci_find_device(unsigned int vendor, unsigned int device, int index)
|
|
@@ -258,7 +258,7 @@ pci_dev_t pci_find_device(unsigned int vendor, unsigned int device, int index)
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
|
|
|
|
-int __pci_hose_phys_to_bus (struct pci_controller *hose,
|
|
|
|
|
|
+int __pci_hose_phys_to_bus(struct pci_controller *hose,
|
|
phys_addr_t phys_addr,
|
|
phys_addr_t phys_addr,
|
|
unsigned long flags,
|
|
unsigned long flags,
|
|
unsigned long skip_mask,
|
|
unsigned long skip_mask,
|
|
@@ -297,12 +297,14 @@ pci_addr_t pci_hose_phys_to_bus (struct pci_controller *hose,
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (!hose) {
|
|
if (!hose) {
|
|
- puts ("pci_hose_phys_to_bus: invalid hose\n");
|
|
|
|
|
|
+ puts("pci_hose_phys_to_bus: invalid hose\n");
|
|
return bus_addr;
|
|
return bus_addr;
|
|
}
|
|
}
|
|
|
|
|
|
- /* if PCI_REGION_MEM is set we do a two pass search with preference
|
|
|
|
- * on matches that don't have PCI_REGION_SYS_MEMORY set */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * if PCI_REGION_MEM is set we do a two pass search with preference
|
|
|
|
+ * on matches that don't have PCI_REGION_SYS_MEMORY set
|
|
|
|
+ */
|
|
if ((flags & PCI_REGION_MEM) == PCI_REGION_MEM) {
|
|
if ((flags & PCI_REGION_MEM) == PCI_REGION_MEM) {
|
|
ret = __pci_hose_phys_to_bus(hose, phys_addr,
|
|
ret = __pci_hose_phys_to_bus(hose, phys_addr,
|
|
flags, PCI_REGION_SYS_MEMORY, &bus_addr);
|
|
flags, PCI_REGION_SYS_MEMORY, &bus_addr);
|
|
@@ -313,12 +315,12 @@ pci_addr_t pci_hose_phys_to_bus (struct pci_controller *hose,
|
|
ret = __pci_hose_phys_to_bus(hose, phys_addr, flags, 0, &bus_addr);
|
|
ret = __pci_hose_phys_to_bus(hose, phys_addr, flags, 0, &bus_addr);
|
|
|
|
|
|
if (ret)
|
|
if (ret)
|
|
- puts ("pci_hose_phys_to_bus: invalid physical address\n");
|
|
|
|
|
|
+ puts("pci_hose_phys_to_bus: invalid physical address\n");
|
|
|
|
|
|
return bus_addr;
|
|
return bus_addr;
|
|
}
|
|
}
|
|
|
|
|
|
-int __pci_hose_bus_to_phys (struct pci_controller *hose,
|
|
|
|
|
|
+int __pci_hose_bus_to_phys(struct pci_controller *hose,
|
|
pci_addr_t bus_addr,
|
|
pci_addr_t bus_addr,
|
|
unsigned long flags,
|
|
unsigned long flags,
|
|
unsigned long skip_mask,
|
|
unsigned long skip_mask,
|
|
@@ -354,12 +356,14 @@ phys_addr_t pci_hose_bus_to_phys(struct pci_controller* hose,
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (!hose) {
|
|
if (!hose) {
|
|
- puts ("pci_hose_bus_to_phys: invalid hose\n");
|
|
|
|
|
|
+ puts("pci_hose_bus_to_phys: invalid hose\n");
|
|
return phys_addr;
|
|
return phys_addr;
|
|
}
|
|
}
|
|
|
|
|
|
- /* if PCI_REGION_MEM is set we do a two pass search with preference
|
|
|
|
- * on matches that don't have PCI_REGION_SYS_MEMORY set */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * if PCI_REGION_MEM is set we do a two pass search with preference
|
|
|
|
+ * on matches that don't have PCI_REGION_SYS_MEMORY set
|
|
|
|
+ */
|
|
if ((flags & PCI_REGION_MEM) == PCI_REGION_MEM) {
|
|
if ((flags & PCI_REGION_MEM) == PCI_REGION_MEM) {
|
|
ret = __pci_hose_bus_to_phys(hose, bus_addr,
|
|
ret = __pci_hose_bus_to_phys(hose, bus_addr,
|
|
flags, PCI_REGION_SYS_MEMORY, &phys_addr);
|
|
flags, PCI_REGION_SYS_MEMORY, &phys_addr);
|
|
@@ -370,7 +374,7 @@ phys_addr_t pci_hose_bus_to_phys(struct pci_controller* hose,
|
|
ret = __pci_hose_bus_to_phys(hose, bus_addr, flags, 0, &phys_addr);
|
|
ret = __pci_hose_bus_to_phys(hose, bus_addr, flags, 0, &phys_addr);
|
|
|
|
|
|
if (ret)
|
|
if (ret)
|
|
- puts ("pci_hose_bus_to_phys: invalid physical address\n");
|
|
|
|
|
|
+ puts("pci_hose_bus_to_phys: invalid physical address\n");
|
|
|
|
|
|
return phys_addr;
|
|
return phys_addr;
|
|
}
|
|
}
|
|
@@ -392,14 +396,14 @@ int pci_hose_config_device(struct pci_controller *hose,
|
|
unsigned char pin;
|
|
unsigned char pin;
|
|
int bar, found_mem64;
|
|
int bar, found_mem64;
|
|
|
|
|
|
- debug ("PCI Config: I/O=0x%lx, Memory=0x%llx, Command=0x%lx\n",
|
|
|
|
- io, (u64)mem, command);
|
|
|
|
|
|
+ debug("PCI Config: I/O=0x%lx, Memory=0x%llx, Command=0x%lx\n", io,
|
|
|
|
+ (u64)mem, command);
|
|
|
|
|
|
- pci_hose_write_config_dword (hose, dev, PCI_COMMAND, 0);
|
|
|
|
|
|
+ pci_hose_write_config_dword(hose, dev, PCI_COMMAND, 0);
|
|
|
|
|
|
for (bar = PCI_BASE_ADDRESS_0; bar <= PCI_BASE_ADDRESS_5; bar += 4) {
|
|
for (bar = PCI_BASE_ADDRESS_0; bar <= PCI_BASE_ADDRESS_5; bar += 4) {
|
|
- pci_hose_write_config_dword (hose, dev, bar, 0xffffffff);
|
|
|
|
- pci_hose_read_config_dword (hose, dev, bar, &bar_response);
|
|
|
|
|
|
+ pci_hose_write_config_dword(hose, dev, bar, 0xffffffff);
|
|
|
|
+ pci_hose_read_config_dword(hose, dev, bar, &bar_response);
|
|
|
|
|
|
if (!bar_response)
|
|
if (!bar_response)
|
|
continue;
|
|
continue;
|
|
@@ -419,8 +423,10 @@ int pci_hose_config_device(struct pci_controller *hose,
|
|
PCI_BASE_ADDRESS_MEM_TYPE_64) {
|
|
PCI_BASE_ADDRESS_MEM_TYPE_64) {
|
|
u32 bar_response_upper;
|
|
u32 bar_response_upper;
|
|
u64 bar64;
|
|
u64 bar64;
|
|
- pci_hose_write_config_dword(hose, dev, bar+4, 0xffffffff);
|
|
|
|
- pci_hose_read_config_dword(hose, dev, bar+4, &bar_response_upper);
|
|
|
|
|
|
+ pci_hose_write_config_dword(hose, dev, bar + 4,
|
|
|
|
+ 0xffffffff);
|
|
|
|
+ pci_hose_read_config_dword(hose, dev, bar + 4,
|
|
|
|
+ &bar_response_upper);
|
|
|
|
|
|
bar64 = ((u64)bar_response_upper << 32) | bar_response;
|
|
bar64 = ((u64)bar_response_upper << 32) | bar_response;
|
|
|
|
|
|
@@ -443,27 +449,28 @@ int pci_hose_config_device(struct pci_controller *hose,
|
|
if (found_mem64) {
|
|
if (found_mem64) {
|
|
bar += 4;
|
|
bar += 4;
|
|
#ifdef CONFIG_SYS_PCI_64BIT
|
|
#ifdef CONFIG_SYS_PCI_64BIT
|
|
- pci_hose_write_config_dword(hose, dev, bar, (u32)(bar_value>>32));
|
|
|
|
|
|
+ pci_hose_write_config_dword(hose, dev, bar,
|
|
|
|
+ (u32)(bar_value >> 32));
|
|
#else
|
|
#else
|
|
- pci_hose_write_config_dword (hose, dev, bar, 0x00000000);
|
|
|
|
|
|
+ pci_hose_write_config_dword(hose, dev, bar, 0x00000000);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* Configure Cache Line Size Register */
|
|
/* Configure Cache Line Size Register */
|
|
- pci_hose_write_config_byte (hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
|
|
|
|
|
|
+ pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
|
|
|
|
|
|
/* Configure Latency Timer */
|
|
/* Configure Latency Timer */
|
|
- pci_hose_write_config_byte (hose, dev, PCI_LATENCY_TIMER, 0x80);
|
|
|
|
|
|
+ pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80);
|
|
|
|
|
|
/* Disable interrupt line, if device says it wants to use interrupts */
|
|
/* Disable interrupt line, if device says it wants to use interrupts */
|
|
- pci_hose_read_config_byte (hose, dev, PCI_INTERRUPT_PIN, &pin);
|
|
|
|
|
|
+ pci_hose_read_config_byte(hose, dev, PCI_INTERRUPT_PIN, &pin);
|
|
if (pin != 0) {
|
|
if (pin != 0) {
|
|
- pci_hose_write_config_byte (hose, dev, PCI_INTERRUPT_LINE, 0xff);
|
|
|
|
|
|
+ pci_hose_write_config_byte(hose, dev, PCI_INTERRUPT_LINE, 0xff);
|
|
}
|
|
}
|
|
|
|
|
|
- pci_hose_read_config_dword (hose, dev, PCI_COMMAND, &old_command);
|
|
|
|
- pci_hose_write_config_dword (hose, dev, PCI_COMMAND,
|
|
|
|
|
|
+ pci_hose_read_config_dword(hose, dev, PCI_COMMAND, &old_command);
|
|
|
|
+ pci_hose_write_config_dword(hose, dev, PCI_COMMAND,
|
|
(old_command & 0xffff0000) | command);
|
|
(old_command & 0xffff0000) | command);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -501,7 +508,8 @@ void pci_cfgfunc_config_device(struct pci_controller *hose,
|
|
pci_dev_t dev,
|
|
pci_dev_t dev,
|
|
struct pci_config_table *entry)
|
|
struct pci_config_table *entry)
|
|
{
|
|
{
|
|
- pci_hose_config_device(hose, dev, entry->priv[0], entry->priv[1], entry->priv[2]);
|
|
|
|
|
|
+ pci_hose_config_device(hose, dev, entry->priv[0], entry->priv[1],
|
|
|
|
+ entry->priv[2]);
|
|
}
|
|
}
|
|
|
|
|
|
void pci_cfgfunc_do_nothing(struct pci_controller *hose,
|
|
void pci_cfgfunc_do_nothing(struct pci_controller *hose,
|
|
@@ -510,10 +518,7 @@ void pci_cfgfunc_do_nothing(struct pci_controller *hose,
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
- *
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-/* HJF: Changed this to return int. I think this is required
|
|
|
|
|
|
+ * HJF: Changed this to return int. I think this is required
|
|
* to get the correct result when scanning bridges
|
|
* to get the correct result when scanning bridges
|
|
*/
|
|
*/
|
|
extern int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev);
|
|
extern int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev);
|
|
@@ -619,7 +624,7 @@ int pci_print_dev(struct pci_controller *hose, pci_dev_t dev)
|
|
|
|
|
|
int pci_hose_scan_bus(struct pci_controller *hose, int bus)
|
|
int pci_hose_scan_bus(struct pci_controller *hose, int bus)
|
|
{
|
|
{
|
|
- unsigned int sub_bus, found_multi=0;
|
|
|
|
|
|
+ unsigned int sub_bus, found_multi = 0;
|
|
unsigned short vendor, device, class;
|
|
unsigned short vendor, device, class;
|
|
unsigned char header_type;
|
|
unsigned char header_type;
|
|
struct pci_config_table *cfg;
|
|
struct pci_config_table *cfg;
|
|
@@ -631,8 +636,9 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus)
|
|
sub_bus = bus;
|
|
sub_bus = bus;
|
|
|
|
|
|
for (dev = PCI_BDF(bus,0,0);
|
|
for (dev = PCI_BDF(bus,0,0);
|
|
- dev < PCI_BDF(bus,PCI_MAX_PCI_DEVICES-1,PCI_MAX_PCI_FUNCTIONS-1);
|
|
|
|
- dev += PCI_BDF(0,0,1)) {
|
|
|
|
|
|
+ dev < PCI_BDF(bus, PCI_MAX_PCI_DEVICES - 1,
|
|
|
|
+ PCI_MAX_PCI_FUNCTIONS - 1);
|
|
|
|
+ dev += PCI_BDF(0, 0, 1)) {
|
|
|
|
|
|
if (pci_skip_dev(hose, dev))
|
|
if (pci_skip_dev(hose, dev))
|
|
continue;
|
|
continue;
|
|
@@ -650,8 +656,8 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus)
|
|
if (!PCI_FUNC(dev))
|
|
if (!PCI_FUNC(dev))
|
|
found_multi = header_type & 0x80;
|
|
found_multi = header_type & 0x80;
|
|
|
|
|
|
- debug ("PCI Scan: Found Bus %d, Device %d, Function %d\n",
|
|
|
|
- PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev) );
|
|
|
|
|
|
+ debug("PCI Scan: Found Bus %d, Device %d, Function %d\n",
|
|
|
|
+ PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
|
|
|
|
|
|
pci_hose_read_config_word(hose, dev, PCI_DEVICE_ID, &device);
|
|
pci_hose_read_config_word(hose, dev, PCI_DEVICE_ID, &device);
|
|
pci_hose_read_config_word(hose, dev, PCI_CLASS_DEVICE, &class);
|
|
pci_hose_read_config_word(hose, dev, PCI_CLASS_DEVICE, &class);
|
|
@@ -712,10 +718,11 @@ int pci_hose_scan(struct pci_controller *hose)
|
|
}
|
|
}
|
|
#endif /* CONFIG_PCI_BOOTDELAY */
|
|
#endif /* CONFIG_PCI_BOOTDELAY */
|
|
|
|
|
|
- /* Start scan at current_busno.
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Start scan at current_busno.
|
|
* PCIe will start scan at first_busno+1.
|
|
* PCIe will start scan at first_busno+1.
|
|
*/
|
|
*/
|
|
- /* For legacy support, ensure current>=first */
|
|
|
|
|
|
+ /* For legacy support, ensure current >= first */
|
|
if (hose->first_busno > hose->current_busno)
|
|
if (hose->first_busno > hose->current_busno)
|
|
hose->current_busno = hose->first_busno;
|
|
hose->current_busno = hose->first_busno;
|
|
#ifdef CONFIG_PCI_PNP
|
|
#ifdef CONFIG_PCI_PNP
|