From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34343) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YpYdI-0004hb-IQ for qemu-devel@nongnu.org; Tue, 05 May 2015 04:55:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YpYdE-00084t-AL for qemu-devel@nongnu.org; Tue, 05 May 2015 04:55:16 -0400 Received: from e23smtp04.au.ibm.com ([202.81.31.146]:39371) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YpYdD-00084I-GE for qemu-devel@nongnu.org; Tue, 05 May 2015 04:55:12 -0400 Received: from /spool/local by e23smtp04.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 5 May 2015 18:55:08 +1000 From: Nikunj A Dadhania Date: Tue, 5 May 2015 14:23:55 +0530 Message-Id: <1430816036-26408-6-git-send-email-nikunj@linux.vnet.ibm.com> In-Reply-To: <1430816036-26408-1-git-send-email-nikunj@linux.vnet.ibm.com> References: <1430816036-26408-1-git-send-email-nikunj@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH v3 5/6] spapr_pci: fix boot-time device tree fields for pci hotplug List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, david@gibson.dropbear.id.au Cc: aik@ozlabs.ru, qemu-ppc@nongnu.org, agraf@suse.de, nikunj@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com From: Michael Roth We need to set the proper drc_index values in ibm,my-drc-index fields in order to allow a PCI device that was present at boot-time to be unplugged. Previously SLOF handles this, but with QEMU handling the DT we need to do it there as well. This patch slightly changes how SLOF handled it in the past, which was to allows add an ibm,my-drc-index value based on PCI slot/devices topology. Now we only add it when the slot supports hotplug and has a DR connector, which is more inline with PAPR. Signed-off-by: Michael Roth Signed-off-by: Nikunj A Dadhania --- hw/ppc/spapr_pci.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 103284a..cbd5661 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -951,7 +951,9 @@ static int spapr_populate_pci_child_dt(PCIDevice *dev, void *fdt, int offset, _FDT(fdt_setprop(fdt, offset, "ibm,loc-code", drc_name, strlen(drc_name))); } - _FDT(fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index)); + if (drc_index) { + _FDT(fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index)); + } _FDT(fdt_setprop_cell(fdt, offset, "#address-cells", RESOURCE_CELLS_ADDRESS)); @@ -1483,6 +1485,20 @@ PCIHostState *spapr_create_phb(sPAPREnvironment *spapr, int index) return PCI_HOST_BRIDGE(dev); } +static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb, + PCIDevice *pdev) +{ + sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev); + sPAPRDRConnectorClass *drck; + + if (!drc) { + return 0; + } + + drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc); + return drck->get_index(drc); +} + typedef struct sPAPRFDT { void *fdt; int node_off; @@ -1499,6 +1515,7 @@ static void spapr_populate_pci_devices_dt(PCIBus *bus, PCIDevice *pdev, int func = PCI_FUNC(pdev->devfn); char nodename[512]; sPAPRFDT s_fdt; + uint32_t drc_index = spapr_phb_get_pci_drc_index(p->sphb, pdev); if (func) { sprintf(nodename, "pci@%d,%d", slot, func); @@ -1506,7 +1523,7 @@ static void spapr_populate_pci_devices_dt(PCIBus *bus, PCIDevice *pdev, sprintf(nodename, "pci@%d", slot); } offset = fdt_add_subnode(p->fdt, p->node_off, nodename); - ret = spapr_populate_pci_child_dt(pdev, p->fdt, offset, p->index, 0, NULL); + ret = spapr_populate_pci_child_dt(pdev, p->fdt, offset, p->index, drc_index, NULL); g_assert(!ret); if ((pci_default_read_config(pdev, PCI_HEADER_TYPE, 1) != -- 1.8.3.1