diff options
author | Gavin Shan <shangw@linux.vnet.ibm.com> | 2012-08-19 23:49:15 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2012-09-17 02:35:13 -0400 |
commit | 7ebdf956df7961ae6b57b0328e03d33f95f1346f (patch) | |
tree | 6805625c08e697e3d1c2369ae3f9e0ee60a17904 /arch/powerpc/platforms/powernv/pci-ioda.c | |
parent | fb446ad075cfa5212b26c4f77751faefe574ad8b (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.c | 12 |
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 | ||
668 | static unsigned int pnv_ioda_dma_weight(struct pci_dev *dev) | 668 | static 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 */ |