From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55868) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YbKvV-0006Xf-A1 for qemu-devel@nongnu.org; Thu, 26 Mar 2015 23:27:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YbKvR-0002wW-V6 for qemu-devel@nongnu.org; Thu, 26 Mar 2015 23:27:17 -0400 Date: Fri, 27 Mar 2015 14:28:00 +1100 From: David Gibson Message-ID: <20150327032800.GA2900@voom.fritz.box> References: <1427352132-1762-1-git-send-email-nikunj@linux.vnet.ibm.com> <1427352132-1762-2-git-send-email-nikunj@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="CE+1k2dSO48ffgeK" Content-Disposition: inline In-Reply-To: <1427352132-1762-2-git-send-email-nikunj@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH 2/2] spapr: populate ibm,loc-code List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Nikunj A Dadhania Cc: aik@ozlabs.ru, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, agraf@suse.de --CE+1k2dSO48ffgeK Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Mar 26, 2015 at 12:12:12PM +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 > Introduce an hcall to populate ibm,loc-cde. > 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 > --- > hw/ppc/spapr_hcall.c | 10 +++++++++ > hw/ppc/spapr_pci.c | 49 +++++++++++++++++++++++++++++++++++++= ++++++ > hw/vfio/pci.c | 18 ++++++++++++++++ > include/hw/ppc/spapr.h | 8 ++++++- > include/hw/vfio/vfio-common.h | 1 + > 5 files changed, 85 insertions(+), 1 deletion(-) >=20 > diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c > index 4f76f1c..a577395 100644 > --- a/hw/ppc/spapr_hcall.c > +++ b/hw/ppc/spapr_hcall.c > @@ -928,6 +928,15 @@ static target_ulong h_client_architecture_support(Po= werPCCPU *cpu_, > return H_SUCCESS; > } > =20 > +static target_ulong h_get_loc_code(PowerPCCPU *cpu, sPAPREnvironment *sp= apr, > + target_ulong opcode, target_ulong *args) > +{ > + if (!spapr_h_get_loc_code(spapr, args[0], args[1], args[2], args[3])= ) { > + return H_PARAMETER; > + } > + return H_SUCCESS; > +} There's no point to this wrapper. The hypercalls are defined by PAPR, so making an "spapr" version of the hypercall function is redundant. > + > static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1]; > static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - KVMPPC_H= CALL_BASE + 1]; > =20 > @@ -1010,6 +1019,7 @@ static void hypercall_register_types(void) > =20 > /* ibm,client-architecture-support support */ > spapr_register_hypercall(KVMPPC_H_CAS, h_client_architecture_support= ); > + spapr_register_hypercall(KVMPPC_H_GET_LOC_CODE, h_get_loc_code); > } > =20 > type_init(hypercall_register_types) > diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c > index 05f4fac..65cdb91 100644 > --- a/hw/ppc/spapr_pci.c > +++ b/hw/ppc/spapr_pci.c > @@ -35,6 +35,7 @@ > #include "qemu/error-report.h" > =20 > #include "hw/pci/pci_bus.h" > +#include "hw/vfio/vfio-common.h" > =20 > /* Copied from the kernel arch/powerpc/platforms/pseries/msi.c */ > #define RTAS_QUERY_FN 0 > @@ -248,6 +249,54 @@ static void spapr_msi_setmsg(PCIDevice *pdev, hwaddr= addr, bool msix, > } > } > =20 > +bool spapr_h_get_loc_code(sPAPREnvironment *spapr, target_ulong config_a= ddr, target_ulong buid, > + target_ulong loc_code, target_ulong size) bool as a success/failure indication isn't a normal interface. Just get rid of the wrapper and return H_ERROR codes directly. > +{ > + sPAPRPHBState *sphb =3D NULL; > + PCIDevice *pdev =3D NULL; > + char *buf, path[PATH_MAX]; > + struct stat st; > + > + sphb =3D find_phb(spapr, buid); > + if (sphb) { > + pdev =3D find_dev(spapr, buid, config_addr); > + } > + > + if (!sphb || !pdev) { > + error_report("spapr_h_get_loc_code: Device not found"); > + return false; > + } > + > + /* For a VFIO device, get the location in the device tree */ > + if (pdev->is_vfio && vfio_get_devspec(pdev, &buf)) { > + snprintf(path, sizeof(path), "/proc/device-tree%s/ibm,loc-code",= buf); > + g_free(buf); > + if (stat(path, &st) < 0) { > + goto fail; This isn't really an acceptable use of goto. And the label is badly named, because it doesn't fail, just fall back to an alternate method. > + } > + > + /* A valid file, now read the loc-code */ > + if (g_file_get_contents(path, &buf, NULL, NULL)) { > + cpu_physical_memory_write(loc_code, buf, strlen(buf)); > + g_free(buf); > + goto out; This could just be a return. > + } > + } > + > +fail: > + /* > + * For non-vfio devices and failure cases, make up the location > + * code out of the name, slot and function. > + * > + * qemu_:. > + */ > + snprintf(path, sizeof(path), "qemu_%s:%02d.%1d", pdev->name, > + PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn)); > + cpu_physical_memory_write(loc_code, path, size); > + out: > + return true; > +} > + > static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPREnvironment *spapr, > uint32_t token, uint32_t nargs, > target_ulong args, uint32_t nret, > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index 95d666e..dd97258 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -3319,6 +3319,24 @@ static void vfio_unregister_req_notifier(VFIOPCIDe= vice *vdev) > vdev->req_enabled =3D false; > } > =20 > +bool vfio_get_devspec(PCIDevice *pdev, char **value) > +{ > + VFIOPCIDevice *vdev =3D DO_UPCAST(VFIOPCIDevice, pdev, pdev); > + char path[PATH_MAX]; > + struct stat st; > + > + snprintf(path, sizeof(path), > + "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/devspec", > + vdev->host.domain, vdev->host.bus, vdev->host.slot, > + vdev->host.function); > + > + if (stat(path, &st) < 0) { > + return false; > + } > + > + return g_file_get_contents(path, value, NULL, NULL); > +} > + > static int vfio_initfn(PCIDevice *pdev) > { > VFIOPCIDevice *vdev =3D DO_UPCAST(VFIOPCIDevice, pdev, pdev); > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h > index af71e8b..d3fad67 100644 > --- a/include/hw/ppc/spapr.h > +++ b/include/hw/ppc/spapr.h > @@ -310,7 +310,10 @@ typedef struct sPAPREnvironment { > #define KVMPPC_H_LOGICAL_MEMOP (KVMPPC_HCALL_BASE + 0x1) > /* Client Architecture support */ > #define KVMPPC_H_CAS (KVMPPC_HCALL_BASE + 0x2) > -#define KVMPPC_HCALL_MAX KVMPPC_H_CAS > +#define KVMPPC_H_RTAS_UPDATE (KVMPPC_HCALL_BASE + 0x3) > +#define KVMPPC_H_REPORT_MC_ERR (KVMPPC_HCALL_BASE + 0x4) > +#define KVMPPC_H_GET_LOC_CODE (KVMPPC_HCALL_BASE + 0x5) Come to that, I don't even understand why you're defining a new hcall. Why not just put the loc-code in the initial device tree with the other information. > +#define KVMPPC_HCALL_MAX KVMPPC_H_GET_LOC_CODE > =20 > extern sPAPREnvironment *spapr; > =20 > @@ -522,6 +525,9 @@ int spapr_tcet_dma_dt(void *fdt, int node_off, const = char *propname, > sPAPRTCETable *tcet); > void spapr_pci_switch_vga(bool big_endian); > =20 > +bool spapr_h_get_loc_code(sPAPREnvironment *spapr, target_ulong config_a= ddr, target_ulong build, > + target_ulong loc_code, target_ulong size); > + > #define TYPE_SPAPR_RTC "spapr-rtc" > =20 > void spapr_rtc_read(DeviceState *dev, struct tm *tm, uint32_t *ns); > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index 0d1fb80..6dffa8c 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -140,6 +140,7 @@ VFIOGroup *vfio_get_group(int groupid, AddressSpace *= as); > void vfio_put_group(VFIOGroup *group); > int vfio_get_device(VFIOGroup *group, const char *name, > VFIODevice *vbasedev); > +bool vfio_get_devspec(PCIDevice *pdev, char **value); > =20 > extern const MemoryRegionOps vfio_region_ops; > extern QLIST_HEAD(vfio_group_head, VFIOGroup) vfio_group_list; --=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 --CE+1k2dSO48ffgeK Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJVFM5AAAoJEGw4ysog2bOSZOYP/RFpEPrKV31fMeNlnwxm7Scl jENbQxv8Dbb8OhSkERPsG56gPe0WyqKLYf2RI1uYru+0JZGcPEEibUlf9A1ko7ku BL0F9RTg2ViWpec+mQQxn/rbVZMzCCQcxy6a3a5SWLWrApuETsij1JIPe3NywCz1 vpM1CmRWOgg00uvgRCAvUrY6jXmHgGJh2+ChEHbhMdByoreDsC1Wdbpjm96gMa0O fZVIoXDhv2itXPBZfUiWqa73L/is27q2M/JQ/pY9NJQvTBr+lmGt2/TFeZwmsZ/F Q24qIQZofDnPvRuY8ygNou8uiLXnNPwKwK2eV+QRkd3oUzjUsj8pJZu+n7b3bRSp QiouoB5pPY+H/BUbKnWGedcXWWiSvHrG2Y/fTd8Pbe89hO9cPGlvqhexlcq0SPzz LUb55g5BKijVVyLjh51zDXGN+7+XpOzOPPr3e/yIWE9iqH8NSbtd3w6vrNiigk/j m9WBa77K6O5hB7F0foxmMHyczJrvLf3aTz0TPrvwpiykFdOZ3MH/fDemV+wobfx8 6JG7ZaFmfiUTPwQofL6aFa0WxxroVU8Xo4ACa1SDiNrwZX43pUHIWJW4HwLRhaHu xm2utdj+FheskZsIkP8ehAiAkgJiElFa0jCOBoLrXAoJpR3i8okgh5wx6I99P0Q0 K3bq5vhX+CXv23PydxN0 =fyUu -----END PGP SIGNATURE----- --CE+1k2dSO48ffgeK--