[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH-4.16 v2] xen/arm: fix SBDF calculation for vPCI MMIO handlers
On Tue, 2 Nov 2021, Oleksandr Andrushchenko wrote: > From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx> > > While in vPCI MMIO trap handlers for the guest PCI host bridge it is not > enough for SBDF translation to simply call VPCI_ECAM_BDF(info->gpa) as > the base address may not be aligned in the way that the translation > always work. If not adjusted with respect to the base address it may not be > able to properly convert SBDF. > Fix this by adjusting the gpa with respect to the host bridge base address > in a way as it is done for x86. > > Please note, that this change is not strictly required given the current > value of GUEST_VPCI_ECAM_BASE which has bits 0 to 27 clear, but could cause > issues if such value is changed, or when handlers for dom0 ECAM > regions are added as those will be mapped over existing hardware > regions that could use non-aligned base addresses. > > Fixes: d59168dc05a5 ("xen/arm: Enable the existing x86 virtual PCI support > for ARM") > > Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx> Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> Also, Ian already gave his release-ack. > --- > Since v1: > - updated commit message (Roger) > > This patch aims for 4.16 release. > Benefits: > Fix potential bug and clear the way for further PCI passthrough > development. > Risks: > None as the change doesn't change the behaviour of the current code, > but brings clarity into SBDF calculation. > --- > xen/arch/arm/vpci.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/arm/vpci.c b/xen/arch/arm/vpci.c > index 8f40a0dec6d2..23f45386f4b3 100644 > --- a/xen/arch/arm/vpci.c > +++ b/xen/arch/arm/vpci.c > @@ -24,7 +24,7 @@ static int vpci_mmio_read(struct vcpu *v, mmio_info_t *info, > unsigned long data; > > /* We ignore segment part and always handle segment 0 */ > - sbdf.sbdf = VPCI_ECAM_BDF(info->gpa); > + sbdf.sbdf = VPCI_ECAM_BDF(info->gpa - GUEST_VPCI_ECAM_BASE); > > if ( vpci_ecam_read(sbdf, ECAM_REG_OFFSET(info->gpa), > 1U << info->dabt.size, &data) ) > @@ -44,7 +44,7 @@ static int vpci_mmio_write(struct vcpu *v, mmio_info_t > *info, > pci_sbdf_t sbdf; > > /* We ignore segment part and always handle segment 0 */ > - sbdf.sbdf = VPCI_ECAM_BDF(info->gpa); > + sbdf.sbdf = VPCI_ECAM_BDF(info->gpa - GUEST_VPCI_ECAM_BASE); > > return vpci_ecam_write(sbdf, ECAM_REG_OFFSET(info->gpa), > 1U << info->dabt.size, r); > -- > 2.25.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |