From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Zhai, Edwin" Subject: Re: [PATCH] [IOEMU] Fix wrong INTx for pass-through device Date: Tue, 29 Dec 2009 08:22:35 +0800 Message-ID: <4B394BCB.30607@intel.com> References: <4B38589B.8060307@intel.com> <8686c3cd0912280633u27839f56k74abcd73fb041e4@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <8686c3cd0912280633u27839f56k74abcd73fb041e4@mail.gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Tom Rotenberg Cc: Simon Horman , Ian Jackson , Xen Developers List-Id: xen-devel@lists.xenproject.org Your patch can also fix this issue, as using physical pin info for both guest and xen. Only potential issue is that guest will see a single function device is not linked to INTA, say assign 00:1a.7 to guest as 00:4.0. It should work, but seems doesn't comply with PCI spec. We have 2 options here: 1. always use INTA 2. Use INTA for virtual function 0, and physical value for others. Options 2 is more friendly to multiple-function device assignment, and is current used. Tom Rotenberg wrote: > Hi, > > I ran into similar problems last week, and i tried the following fix, > which looks like it kind-of fixed it, does this do the same fix as > your patch? > > Here is the patch i used: > > --- a/tools/ioemu/hw/pass-through.c Sun Dec 27 11:56:08 2009 +0200 > +++ b/tools/ioemu/hw/pass-through.c Sun Dec 27 11:56:08 2009 +0200 > @@ -4209,8 +4209,14 @@ > */ > uint8_t pci_intx(struct pt_dev *ptdev) > { > +#if 0 /* FIX */ > if (!PCI_FUNC(ptdev->dev.devfn)) > return 0; > +#endif /* FIX */ > + > return pci_read_intx(ptdev); > } > > Tom > > On Mon, Dec 28, 2009 at 9:04 AM, Zhai, Edwin wrote: > >> Simon, >> For the pass-through device's INTx emulation, we follow the policy: if >> virtual function 0, use INTA#, otherwise use hardware value. However, this >> policy only apply when bind_pt_pci_irq to xen, and always use physical value >> when exporting to guest. This discrepancy cause different INTx, thus >> different GSI in xen and guest, so that interrupts never got injected to >> guest. E.g. when assigning a USB controller with non-zero function(00:1d.2) >> to guest as 00:4.0, xen will see INTA#, while guest see INTC#. >> >> This simple patch can fix it. Could you pls. review it? >> >> Thanks, >> >> -- >> best rgds, >> edwin >> >> >> Signed-Off-By: Zhai Edwin >> >> diff --git a/hw/pass-through.c b/hw/pass-through.c >> index e7bd386..a08c0bf 100644 >> --- a/hw/pass-through.c >> +++ b/hw/pass-through.c >> @@ -2710,7 +2710,8 @@ static uint32_t pt_status_reg_init(struct pt_dev >> *ptdev, >> static uint32_t pt_irqpin_reg_init(struct pt_dev *ptdev, >> struct pt_reg_info_tbl *reg, uint32_t real_offset) >> { >> - return ptdev->dev.config[real_offset]; >> + /* Translate xen INTx value to hw */ >> + return pci_intx(ptdev) + 1; >> } >> >> /* initialize BAR */ >> >> _______________________________________________ >> Xen-devel mailing list >> Xen-devel@lists.xensource.com >> http://lists.xensource.com/xen-devel >> >> >> > > -- best rgds, edwin