[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 09/10] vpci/rcar: Implement vPCI.update_bar_header callback
On Mon, Nov 09, 2020 at 02:50:30PM +0200, Oleksandr Andrushchenko wrote: > From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx> > > Update hardware domain's BAR header as R-Car Gen3 is a non-ECAM host > controller, so vPCI MMIO handlers do not work for it in hwdom. > > Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx> > --- > xen/arch/arm/pci/pci-host-rcar-gen3.c | 69 +++++++++++++++++++++++++++ > 1 file changed, 69 insertions(+) > > diff --git a/xen/arch/arm/pci/pci-host-rcar-gen3.c > b/xen/arch/arm/pci/pci-host-rcar-gen3.c > index ec14bb29a38b..353ac2bfd6e6 100644 > --- a/xen/arch/arm/pci/pci-host-rcar-gen3.c > +++ b/xen/arch/arm/pci/pci-host-rcar-gen3.c > @@ -23,6 +23,7 @@ > #include <xen/pci.h> > #include <asm/pci.h> > #include <xen/vmap.h> > +#include <xen/vpci.h> > > /* Error values that may be returned by PCI functions */ > #define PCIBIOS_SUCCESSFUL 0x00 > @@ -307,12 +308,80 @@ int pci_rcar_gen3_config_write(struct pci_host_bridge > *bridge, uint32_t _sbdf, > return ret; > } > > +static void pci_rcar_gen3_hwbar_init(const struct pci_dev *pdev, > + struct vpci_header *header) > + > +{ > + static bool once = true; > + struct vpci_bar *bars = header->bars; > + unsigned int num_bars; > + int i; unsigned. > + > + /* Run only once. */ > + if (!once) Missing spaces. > + return; > + once = false; > + > + printk("\n\n ------------------------ %s -------------------\n", > __func__); > + switch ( pci_conf_read8(pdev->sbdf, PCI_HEADER_TYPE) & 0x7f ) > + { > + case PCI_HEADER_TYPE_NORMAL: > + num_bars = PCI_HEADER_NORMAL_NR_BARS; > + break; > + > + case PCI_HEADER_TYPE_BRIDGE: > + num_bars = PCI_HEADER_BRIDGE_NR_BARS; > + break; > + > + default: > + return; > + } > + > + for ( i = 0; i < num_bars; i++ ) > + { > + uint8_t reg = PCI_BASE_ADDRESS_0 + i * 4; > + > + if ( bars[i].type == VPCI_BAR_MEM64_HI ) > + { > + /* > + * Skip hi part of the 64-bit register: it is read > + * together with the lower part. > + */ > + continue; > + } > + > + if ( bars[i].type == VPCI_BAR_IO ) > + { > + /* Skip IO. */ > + continue; > + } > + > + if ( bars[i].type == VPCI_BAR_MEM64_LO ) > + { > + /* Read both hi and lo parts of the 64-bit BAR. */ > + bars[i].addr = > + (uint64_t)pci_conf_read32(pdev->sbdf, reg + 4) << 32 | > + pci_conf_read32(pdev->sbdf, reg); > + } > + else if ( bars[i].type == VPCI_BAR_MEM32 ) > + { > + bars[i].addr = pci_conf_read32(pdev->sbdf, reg); > + } > + else > + { > + /* Expansion ROM? */ > + continue; > + } Wouldn't this be much simpler as: bars[i].addr = 0; switch ( bars[i].type ) { case VPCI_BAR_MEM64_HI: bars[i].addr = (uint64_t)pci_conf_read32(pdev->sbdf, reg + 4) << 32; /+ fallthrough. */ case VPCI_BAR_MEM64_LO: bars[i].addr |= pci_conf_read32(pdev->sbdf, reg); break; default: break; } I also wonder why you only care about the address but not the size of the BAR. Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |