[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 11/12/20 12:00 PM, Roger Pau Monné wrote: > 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. ok > >> + >> + /* Run only once. */ >> + if (!once) > Missing spaces. ok > >> + 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: Yes, seems to be simpler, thank you > > 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. Yes, size needs to be updated as well, even for RFC > > Thanks, Roger. Thank you, Oleksandr
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |