Subject: Re: [PATCH v8 11/45] powerpc/powernv: Track M64 segment consumption

From: Gavin Shan <[email-masked]>
Date: Wed, 20 Apr 2016 10:05:45 +1000

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 <[email-masked]>
>
>
>Reviewed-by: Alexey Kardashevskiy <[email-masked]>
>
>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
>