From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47147) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yn3Qa-0000NM-Jg for qemu-devel@nongnu.org; Tue, 28 Apr 2015 07:11:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yn3QX-0005qM-T6 for qemu-devel@nongnu.org; Tue, 28 Apr 2015 07:11:48 -0400 Received: from e23smtp08.au.ibm.com ([202.81.31.141]:53100) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yn3QX-0005pU-16 for qemu-devel@nongnu.org; Tue, 28 Apr 2015 07:11:45 -0400 Received: from /spool/local by e23smtp08.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 28 Apr 2015 21:11:41 +1000 From: Nikunj A Dadhania In-Reply-To: <20150428074821.GF24753@voom.redhat.com> References: <1429698934-28915-1-git-send-email-nikunj@linux.vnet.ibm.com> <1429698934-28915-3-git-send-email-nikunj@linux.vnet.ibm.com> <20150428074821.GF24753@voom.redhat.com> Date: Tue, 28 Apr 2015 16:40:37 +0530 Message-ID: <87oam8cxua.fsf@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [RFC PATCH 2/2] spapr: populate ibm,loc-code List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson Cc: aik@ozlabs.ru, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, agraf@suse.de David Gibson writes: > On Wed, Apr 22, 2015 at 04:05:34PM +0530, Nikunj A Dadhania wrote: >> Each hardware instance has a platform unique location code. The OF >> device tree that describes a part of a hardware entity must include >> the =E2=80=9Cibm,loc-code=E2=80=9D property with a value that represents= the location >> code for that hardware entity. >>=20 >> Populate ibm,loc-code. >> 1) PCI passthru devices need to identify with its own ibm,loc-code >> available on the host. >> 2) Emulated devices encode as following: >> qemu_::. >>=20 >> Signed-off-by: Nikunj A Dadhania > > This is going to conflict with Alexey's patches which merge the plan > and vfio PAPR PHB types, so we'll need to work out which will go in first. Sure, let me know, I can rebase if needed. > >> --- >> hw/ppc/spapr_pci.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++= ------- >> 1 file changed, 75 insertions(+), 10 deletions(-) >>=20 >> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c >> index abf71f7..c69e732 100644 >> --- a/hw/ppc/spapr_pci.c >> +++ b/hw/ppc/spapr_pci.c >> @@ -744,6 +744,70 @@ static AddressSpace *spapr_pci_dma_iommu(PCIBus *bu= s, void *opaque, int devfn) >> return &phb->iommu_as; >> } >>=20=20 >> +static bool spapr_phb_vfio_get_devspec_value(PCIDevice *pdev, char **va= lue) >> +{ >> + char *host; >> + char path[PATH_MAX]; >> + >> + host =3D object_property_get_str(OBJECT(pdev), "host", NULL); >> + if (!host) { >> + return false; >> + } >> + >> + snprintf(path, sizeof(path), "/sys/bus/pci/devices/%s/devspec", hos= t); >> + g_free(host); >> + >> + return g_file_get_contents(path, value, NULL, NULL); >> +} >> + >> +static char *spapr_phb_vfio_get_loc_code(sPAPRPHBState *sphb, PCIDevic= e *pdev) >> +{ >> + char path[PATH_MAX], *buf =3D NULL; >> + >> + /* We have a vfio host bridge lets get the path. */ >> + if (!spapr_phb_vfio_get_devspec_value(pdev, &buf)) { >> + return NULL; >> + } >> + >> + snprintf(path, sizeof(path), "/proc/device-tree%s/ibm,loc-code", bu= f); >> + g_free(buf); >> + >> + if (g_file_get_contents(path, &buf, NULL, NULL)) { >> + return buf; >> + } else { >> + return NULL; >> + } >> +} >> + >> +static char *spapr_phb_get_loc_code(sPAPRPHBState *sphb, PCIDevice *pd= ev) >> +{ >> + char *path =3D g_malloc(PATH_MAX); >> + >> + if (!path) { >> + return NULL; >> + } >> + >> + /* >> + * For non-vfio devices and failures make up the location code out >> + * of the name, slot and function. >> + * >> + * qemu_::. >> + */ >> + snprintf(path, PATH_MAX, "qemu_%s:%02d:%02d.%1d", pdev->name, >> + sphb->index, PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); >> + return path; >> +} >> + >> + >> +static char *spapr_ibm_get_loc_code(sPAPRPHBState *sphb, PCIDevice *pde= v) >> +{ >> + if (object_dynamic_cast(OBJECT(pdev), "vfio-pci") !=3D NULL) { >> + return spapr_phb_vfio_get_loc_code(sphb, pdev); >> + } else { >> + return spapr_phb_get_loc_code(sphb, pdev); >> + } >> +} >> + >> /* Macros to operate with address in OF binding to PCI */ >> #define b_x(x, p, l) (((x) & ((1<<(l))-1)) << (p)) >> #define b_n(x) b_x((x), 31, 1) /* 0 if relocatable */ >> @@ -873,12 +937,12 @@ static void populate_resource_props(PCIDevice *d, = ResourceProps *rp) >> } >>=20=20 >> static int spapr_populate_pci_child_dt(PCIDevice *dev, void *fdt, int o= ffset, >> - int phb_index, int drc_index, >> - const char *drc_name) >> + sPAPRPHBState *phb, int drc_inde= x) >> { >> ResourceProps rp; >> bool is_bridge =3D false; >> int pci_status; >> + char *buf =3D NULL; >>=20=20 >> if (pci_default_read_config(dev, PCI_HEADER_TYPE, 1) =3D=3D >> PCI_HEADER_TYPE_BRIDGE) { >> @@ -940,8 +1004,10 @@ static int spapr_populate_pci_child_dt(PCIDevice *= dev, void *fdt, int offset, >> * processed by OF beforehand >> */ >> _FDT(fdt_setprop_string(fdt, offset, "name", "pci")); >> - if (drc_name) { >> - _FDT(fdt_setprop(fdt, offset, "ibm,loc-code", drc_name, strlen(= drc_name))); >> + buf =3D spapr_ibm_get_loc_code(phb, dev); >> + if (buf) { >> + _FDT(fdt_setprop_string(fdt, offset, "ibm,loc-code", buf)); >> + g_free(buf); >> } >> _FDT(fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index)); >>=20=20 >> @@ -978,8 +1044,7 @@ static void *spapr_create_pci_child_dt(sPAPRPHBStat= e *phb, PCIDevice *dev, >> sprintf(nodename, "pci@%d", slot); >> } >> offset =3D fdt_add_subnode(fdt, 0, nodename); >> - ret =3D spapr_populate_pci_child_dt(dev, fdt, offset, phb->index, d= rc_index, >> - drc_name); >> + ret =3D spapr_populate_pci_child_dt(dev, fdt, offset, phb, drc_inde= x); >> g_assert(!ret); >>=20=20 >> *dt_offset =3D offset; >> @@ -1476,7 +1541,7 @@ PCIHostState *spapr_create_phb(sPAPREnvironment *s= papr, int index) >> typedef struct sPAPRFDT { >> void *fdt; >> int node_off; >> - uint32_t index; >> + sPAPRPHBState *sphb; >> } sPAPRFDT; >>=20=20 >> static int spapr_phb_children_dt(Object *child, void *opaque) >> @@ -1511,7 +1576,7 @@ static void spapr_populate_pci_devices_dt(PCIBus *= bus, PCIDevice *pdev, void *op >> sprintf(nodename, "pci@%d", slot); >> } >> offset =3D fdt_add_subnode(p->fdt, p->node_off, nodename); >> - ret =3D spapr_populate_pci_child_dt(pdev, p->fdt, offset, p->index,= 0, NULL); >> + ret =3D spapr_populate_pci_child_dt(pdev, p->fdt, offset, p->sphb, = 0); >> g_assert(!ret); >>=20=20 >> if ((pci_default_read_config(pdev, PCI_HEADER_TYPE, 1) =3D=3D >> @@ -1520,7 +1585,7 @@ static void spapr_populate_pci_devices_dt(PCIBus *= bus, PCIDevice *pdev, void *op >> if(sec_bus) { >> pci_for_each_device(sec_bus, pci_bus_num(sec_bus), >> spapr_populate_pci_devices_dt, >> - &((sPAPRFDT){ .fdt =3D p->fdt, .node_of= f =3D offset , .index =3D p->index })); >> + &((sPAPRFDT){ .fdt =3D p->fdt, .node_of= f =3D offset , .sphb =3D p->sphb })); >> } >> } >> return; >> @@ -1654,7 +1719,7 @@ int spapr_populate_pci_dt(sPAPRPHBState *phb, >> _FDT(fdt_setprop_cell(fdt, bus_off, "qemu,phb-enumerated", 0x1)); >> pci_for_each_device(bus, pci_bus_num(bus), >> spapr_populate_pci_devices_dt, >> - &((sPAPRFDT){ .fdt =3D fdt, .node_off =3D bus_o= ff, .index =3D phb->index })); >> + &((sPAPRFDT){ .fdt =3D fdt, .node_off =3D bus_o= ff, .sphb =3D phb })); >>=20=20 >> ret =3D spapr_drc_populate_dt(fdt, bus_off, OBJECT(phb), >> SPAPR_DR_CONNECTOR_TYPE_PCI); > > --=20 > David Gibson | I'll have my music baroque, and my code > david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ > | _way_ _around_! > http://www.ozlabs.org/~dgibson