aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/powernv/pci-ioda.c
diff options
context:
space:
mode:
authorGavin Shan <shangw@linux.vnet.ibm.com>2012-08-19 23:49:15 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-09-17 02:35:13 -0400
commit7ebdf956df7961ae6b57b0328e03d33f95f1346f (patch)
tree6805625c08e697e3d1c2369ae3f9e0ee60a17904 /arch/powerpc/platforms/powernv/pci-ioda.c
parentfb446ad075cfa5212b26c4f77751faefe574ad8b (diff)
powerpc/powernv: PE list based on creation order
The resource (I/O and MMIO) will be assigned on basis of PE from top to bottom so that we can implement the trick here: the resource that has been assigned to parent PE could be taken by child PE if necessary. The current implementation already has PE list per PHB basis, but the list doesn't meet our requirment: tracing PE based on their cration time from top to bottom. So the patch does rename for the DMA based PE list and introduces the list to trace the PEs sequentially based on their creation time. Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com> Reviewed-by: Ram Pai <linuxram@us.ibm.com> Reviewed-by: Richard Yang <weiyang@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms/powernv/pci-ioda.c')
-rw-r--r--arch/powerpc/platforms/powernv/pci-ioda.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index 0ddc2e5235d6..7999da1e0b11 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -656,13 +656,13 @@ static void __devinit pnv_ioda_link_pe_by_weight(struct pnv_phb *phb,
656{ 656{
657 struct pnv_ioda_pe *lpe; 657 struct pnv_ioda_pe *lpe;
658 658
659 list_for_each_entry(lpe, &phb->ioda.pe_list, link) { 659 list_for_each_entry(lpe, &phb->ioda.pe_dma_list, dma_link) {
660 if (lpe->dma_weight < pe->dma_weight) { 660 if (lpe->dma_weight < pe->dma_weight) {
661 list_add_tail(&pe->link, &lpe->link); 661 list_add_tail(&pe->dma_link, &lpe->dma_link);
662 return; 662 return;
663 } 663 }
664 } 664 }
665 list_add_tail(&pe->link, &phb->ioda.pe_list); 665 list_add_tail(&pe->dma_link, &phb->ioda.pe_dma_list);
666} 666}
667 667
668static unsigned int pnv_ioda_dma_weight(struct pci_dev *dev) 668static unsigned int pnv_ioda_dma_weight(struct pci_dev *dev)
@@ -828,6 +828,9 @@ static void __devinit pnv_ioda_setup_bus_PE(struct pci_bus *bus, int all)
828 /* Associate it with all child devices */ 828 /* Associate it with all child devices */
829 pnv_ioda_setup_same_PE(bus, pe); 829 pnv_ioda_setup_same_PE(bus, pe);
830 830
831 /* Put PE to the list */
832 list_add_tail(&pe->list, &phb->ioda.pe_list);
833
831 /* Account for one DMA PE if at least one DMA capable device exist 834 /* Account for one DMA PE if at least one DMA capable device exist
832 * below the bridge 835 * below the bridge
833 */ 836 */
@@ -1011,7 +1014,7 @@ static void __devinit pnv_ioda_setup_dma(struct pnv_phb *phb)
1011 remaining = phb->ioda.tce32_count; 1014 remaining = phb->ioda.tce32_count;
1012 tw = phb->ioda.dma_weight; 1015 tw = phb->ioda.dma_weight;
1013 base = 0; 1016 base = 0;
1014 list_for_each_entry(pe, &phb->ioda.pe_list, link) { 1017 list_for_each_entry(pe, &phb->ioda.pe_dma_list, dma_link) {
1015 if (!pe->dma_weight) 1018 if (!pe->dma_weight)
1016 continue; 1019 continue;
1017 if (!remaining) { 1020 if (!remaining) {
@@ -1305,6 +1308,7 @@ void __init pnv_pci_init_ioda1_phb(struct device_node *np)
1305 phb->ioda.pe_array = aux + pemap_off; 1308 phb->ioda.pe_array = aux + pemap_off;
1306 set_bit(0, phb->ioda.pe_alloc); 1309 set_bit(0, phb->ioda.pe_alloc);
1307 1310
1311 INIT_LIST_HEAD(&phb->ioda.pe_dma_list);
1308 INIT_LIST_HEAD(&phb->ioda.pe_list); 1312 INIT_LIST_HEAD(&phb->ioda.pe_list);
1309 1313
1310 /* Calculate how many 32-bit TCE segments we have */ 1314 /* Calculate how many 32-bit TCE segments we have */