From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wup6z-00077f-UH for qemu-devel@nongnu.org; Wed, 11 Jun 2014 16:27:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wup6t-0000Yq-QB for qemu-devel@nongnu.org; Wed, 11 Jun 2014 16:27:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45012) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wup6t-0000Ye-Ic for qemu-devel@nongnu.org; Wed, 11 Jun 2014 16:27:03 -0400 Message-ID: <1402518411.14174.173.camel@ul30vt.home> From: Alex Williamson Date: Wed, 11 Jun 2014 14:26:51 -0600 In-Reply-To: <1402365785-31620-4-git-send-email-gwshan@linux.vnet.ibm.com> References: <1402365785-31620-1-git-send-email-gwshan@linux.vnet.ibm.com> <1402365785-31620-4-git-send-email-gwshan@linux.vnet.ibm.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v10 3/3] sPAPR: Implement sPAPRPHBClass::eeh_handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gavin Shan Cc: aik@ozlabs.ru, qiudayu@linux.vnet.ibm.com, qemu-devel@nongnu.org, agraf@suse.de On Tue, 2014-06-10 at 12:03 +1000, Gavin Shan wrote: > The patch implements sPAPRPHBClass::eeh_handler so that the > EEH RTAS requests can be routed to VFIO for further handling. > > Signed-off-by: Gavin Shan > --- > hw/ppc/spapr_pci_vfio.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 56 insertions(+) > > diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c > index 592d6a4..9750cf0 100644 > --- a/hw/ppc/spapr_pci_vfio.c > +++ b/hw/ppc/spapr_pci_vfio.c > @@ -85,6 +85,61 @@ static void spapr_phb_vfio_finish_realize(sPAPRPHBState *sphb, Error **errp) > spapr_tce_get_iommu(tcet)); > } > > +static int spapr_phb_vfio_eeh_handler(sPAPRPHBState *sphb, int req, int opt) > +{ > + sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); > + struct vfio_eeh_pe_op op = { .argsz = sizeof(op), .flags = 0 }; FWIW, flags = 0 isn't actually necessary. I'm sure someone here can quote the C spec, but it's my understanding that if any field of a structure is initialized, the remaining fields are zero initialized. vfio.c has a mix of initializations depending on whether using an explicit value for flags adds to the code clarity. > + int cmd; > + > + switch (req) { > + case RTAS_EEH_REQ_SET_OPTION: > + switch (opt) { > + case RTAS_EEH_DISABLE: > + cmd = VFIO_EEH_PE_DISABLE; > + break; > + case RTAS_EEH_ENABLE: > + cmd = VFIO_EEH_PE_ENABLE; > + break; > + case RTAS_EEH_THAW_IO: > + cmd = VFIO_EEH_PE_UNFREEZE_IO; > + break; > + case RTAS_EEH_THAW_DMA: > + cmd = VFIO_EEH_PE_UNFREEZE_DMA; > + break; > + default: > + return -EINVAL; > + } > + break; > + case RTAS_EEH_REQ_GET_STATE: > + cmd = VFIO_EEH_PE_GET_STATE; > + break; > + case RTAS_EEH_REQ_RESET: > + switch (opt) { > + case RTAS_SLOT_RESET_DEACTIVATE: > + cmd = VFIO_EEH_PE_RESET_DEACTIVATE; > + break; > + case RTAS_SLOT_RESET_HOT: > + cmd = VFIO_EEH_PE_RESET_HOT; > + break; > + case RTAS_SLOT_RESET_FUNDAMENTAL: > + cmd = VFIO_EEH_PE_RESET_FUNDAMENTAL; > + break; > + default: > + return -EINVAL; > + } > + break; > + case RTAS_EEH_REQ_CONFIGURE: > + cmd = VFIO_EEH_PE_CONFIGURE; > + break; > + default: > + return -EINVAL; > + } > + > + op.op = cmd; > + return vfio_container_ioctl(&svphb->phb.iommu_as, svphb->iommugroupid, > + VFIO_EEH_PE_OP, &op); > +} > + > static void spapr_phb_vfio_reset(DeviceState *qdev) > { > /* Do nothing */ > @@ -98,6 +153,7 @@ static void spapr_phb_vfio_class_init(ObjectClass *klass, void *data) > dc->props = spapr_phb_vfio_properties; > dc->reset = spapr_phb_vfio_reset; > spc->finish_realize = spapr_phb_vfio_finish_realize; > + spc->eeh_handler = spapr_phb_vfio_eeh_handler; > } > > static const TypeInfo spapr_phb_vfio_info = {