[PATCH v8 11/45] powerpc/powernv: Track M64 segment consumption
Gavin Shan
gwshan at linux.vnet.ibm.com
Wed Apr 20 10:05:45 AEST 2016
On Wed, Apr 13, 2016 at 05:09:45PM +1000, Alexey Kardashevskiy wrote:
>On 02/17/2016 02:43 PM, Gavin Shan wrote:
>>When unplugging PCI devices, their parent PEs might be offline.
>>The consumed M64 resource by the PEs should be released at that
>>time. As we track M32 segment consumption, this introduces an
>>array to the PHB to track the mapping between M64 segment and
>>PE number.
>>
>>Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
>
>
>Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>
>
>but it would not hurt to mention in the commit log why M64 segment is not
>tracked/setup by the existing (at this point, at least)
>pnv_ioda_setup_one_res().
>
Right, I'll add something for it to the commit log in next revision, thanks!
>
>>---
>> arch/powerpc/platforms/powernv/pci-ioda.c | 10 ++++++++--
>> arch/powerpc/platforms/powernv/pci.h | 1 +
>> 2 files changed, 9 insertions(+), 2 deletions(-)
>>
>>diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
>>index 7330a73..fc0374a 100644
>>--- a/arch/powerpc/platforms/powernv/pci-ioda.c
>>+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
>>@@ -305,6 +305,7 @@ static int pnv_ioda2_pick_m64_pe(struct pci_bus *bus, bool all)
>> phb->ioda.total_pe_num) {
>> pe = &phb->ioda.pe_array[i];
>>
>>+ phb->ioda.m64_segmap[pe->pe_number] = pe->pe_number;
>> if (!master_pe) {
>> pe->flags |= PNV_IODA_PE_MASTER;
>> INIT_LIST_HEAD(&pe->slaves);
>>@@ -3245,7 +3246,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
>> {
>> struct pci_controller *hose;
>> struct pnv_phb *phb;
>>- unsigned long size, m32map_off, pemap_off, iomap_off = 0;
>>+ unsigned long size, m64map_off, m32map_off, pemap_off, iomap_off = 0;
>> const __be64 *prop64;
>> const __be32 *prop32;
>> int i, len;
>>@@ -3332,6 +3333,8 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
>>
>> /* Allocate aux data & arrays. We don't have IO ports on PHB3 */
>> size = _ALIGN_UP(phb->ioda.total_pe_num / 8, sizeof(unsigned long));
>>+ m64map_off = size;
>>+ size += phb->ioda.total_pe_num * sizeof(phb->ioda.m64_segmap[0]);
>> m32map_off = size;
>> size += phb->ioda.total_pe_num * sizeof(phb->ioda.m32_segmap[0]);
>> if (phb->type == PNV_PHB_IODA1) {
>>@@ -3342,9 +3345,12 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
>> size += phb->ioda.total_pe_num * sizeof(struct pnv_ioda_pe);
>> aux = memblock_virt_alloc(size, 0);
>> phb->ioda.pe_alloc = aux;
>>+ phb->ioda.m64_segmap = aux + m64map_off;
>> phb->ioda.m32_segmap = aux + m32map_off;
>>- for (i = 0; i < phb->ioda.total_pe_num; i++)
>>+ for (i = 0; i < phb->ioda.total_pe_num; i++) {
>>+ phb->ioda.m64_segmap[i] = IODA_INVALID_PE;
>> phb->ioda.m32_segmap[i] = IODA_INVALID_PE;
>>+ }
>> if (phb->type == PNV_PHB_IODA1) {
>> phb->ioda.io_segmap = aux + iomap_off;
>> for (i = 0; i < phb->ioda.total_pe_num; i++)
>>diff --git a/arch/powerpc/platforms/powernv/pci.h b/arch/powerpc/platforms/powernv/pci.h
>>index 36c4965..866a5ea 100644
>>--- a/arch/powerpc/platforms/powernv/pci.h
>>+++ b/arch/powerpc/platforms/powernv/pci.h
>>@@ -146,6 +146,7 @@ struct pnv_phb {
>> struct pnv_ioda_pe *pe_array;
>>
>> /* M32 & IO segment maps */
>>+ int *m64_segmap;
>> int *m32_segmap;
>> int *io_segmap;
>>
>>
>
>
>--
>Alexey
>
More information about the Linuxppc-dev
mailing list