From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: Re: [PATCH 5/5] pci-assign: Use PCI-2.3-based shared legacy interrupts Date: Wed, 15 Dec 2010 00:23:29 +0100 Message-ID: <4D07FC71.40001@web.de> References: <3c2a95e127d06df4833c3093dd104b088c98de92.1292282738.git.jan.kiszka@web.de> <1292285760.2857.143.camel@x201> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig48085E9235F51EE1D2427E72" Cc: Avi Kivity , Marcelo Tosatti , kvm@vger.kernel.org, "Michael S. Tsirkin" , Jan Kiszka To: Alex Williamson Return-path: Received: from fmmailgate01.web.de ([217.72.192.221]:59425 "EHLO fmmailgate01.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752413Ab0LNXXg (ORCPT ); Tue, 14 Dec 2010 18:23:36 -0500 In-Reply-To: <1292285760.2857.143.camel@x201> Sender: kvm-owner@vger.kernel.org List-ID: This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig48085E9235F51EE1D2427E72 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Am 14.12.2010 01:16, Alex Williamson wrote: > On Tue, 2010-12-14 at 00:25 +0100, Jan Kiszka wrote: >> From: Jan Kiszka >> >> Enable the new KVM feature that allows legacy interrupt sharing for >> PCI-2.3-compliant devices. This requires to synchronize any guest >> change of the INTx mask bit to the kernel. >> >> Signed-off-by: Jan Kiszka >> --- >> hw/device-assignment.c | 38 +++++++++++++++++++++++++++++++++----- >> qemu-kvm.c | 8 ++++++++ >> qemu-kvm.h | 3 +++ >> 3 files changed, 44 insertions(+), 5 deletions(-) >> >> diff --git a/hw/device-assignment.c b/hw/device-assignment.c >> index 26d3bd7..cf75c52 100644 >> --- a/hw/device-assignment.c >> +++ b/hw/device-assignment.c >> @@ -423,12 +423,21 @@ static uint8_t pci_find_cap_offset(PCIDevice *d,= uint8_t cap, uint8_t start) >> return 0; >> } >> =20 >> +static uint32_t calc_assigned_dev_id(uint16_t seg, uint8_t bus, uint8= _t devfn) >> +{ >> + return (uint32_t)seg << 16 | (uint32_t)bus << 8 | (uint32_t)devfn= ; >> +} >> + >> static void assigned_dev_pci_write_config(PCIDevice *d, uint32_t addr= ess, >> uint32_t val, int len) >> { >> int fd; >> ssize_t ret; >> AssignedDevice *pci_dev =3D container_of(d, AssignedDevice, dev);= >> + struct kvm_assigned_pci_dev assigned_dev_data; >> +#ifdef KVM_CAP_PCI_2_3 >> + bool intx_masked, update_intx_mask; >> +#endif /* KVM_CAP_PCI_2_3 */ >> =20 >> DEBUG("(%x.%x): address=3D%04x val=3D0x%08x len=3D%d\n", >> ((d->devfn >> 3) & 0x1F), (d->devfn & 0x7), >> @@ -439,6 +448,26 @@ static void assigned_dev_pci_write_config(PCIDevi= ce *d, uint32_t address, >> } >> =20 >> if (ranges_overlap(address, len, PCI_COMMAND, 2)) { >> +#ifdef KVM_CAP_PCI_2_3 >> + update_intx_mask =3D false; >> + if (address =3D=3D PCI_COMMAND+1) { >> + intx_masked =3D val & (PCI_COMMAND_INTX_DISABLE >> 8); >> + update_intx_mask =3D true; >> + } else if (len >=3D 2) { >> + intx_masked =3D val & PCI_COMMAND_INTX_DISABLE; >> + update_intx_mask =3D true; >> + } >=20 > I wonder if this might be a little cleaner as something like this. >=20 > if (ranges_overlap(address, len, PCI_COMMAND + 1, 1) { > update_intx_mask =3D true; > intx_masked =3D (len =3D=3D 1 ? val << 8 : val) & PCI_COMMAND_I= NTX_DISABLE; > } That should even obsolete update_intx_mask - will look into this, and also the merge bits thing. Thanks! Jan --------------enig48085E9235F51EE1D2427E72 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.15 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org/ iEYEARECAAYFAk0H/HEACgkQitSsb3rl5xRM9QCgoazQTcEXtIHM22Bs5ECLrYDK 5LsAoI0RV3MV+9qQShyVHInYjj1z5Qkn =WPUF -----END PGP SIGNATURE----- --------------enig48085E9235F51EE1D2427E72--