[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 09/11] xen/arm: Setup MMIO range trap handlers for hardware domain
On 10.09.21 16:33, Julien Grall wrote: > > > On 10/09/2021 14:27, Oleksandr Andrushchenko wrote: >> Hi, >> >> On 10.09.21 16:20, Julien Grall wrote: >>> >>> >>> On 10/09/2021 14:15, Oleksandr Andrushchenko wrote: >>>> Hi, Julien! >>> >>> Hi, >>> >>>> On 10.09.21 16:04, Julien Grall wrote: >>>>> >>>>> >>>>> On 10/09/2021 12:43, Oleksandr Andrushchenko wrote: >>>>>> Hi, Julien! >>>>> >>>>> Hi Oleksandr, >>>>> >>>>>> On 09.09.21 20:43, Julien Grall wrote: >>>>>>> Hi Oleksandr, >>>>>>> >>>>>>> On 03/09/2021 09:33, Oleksandr Andrushchenko wrote: >>>>>>>> From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx> >>>>>>>> >>>>>>>> In order vPCI to work it needs all access to PCI configuration space >>>>>>>> (ECAM) to be synchronized among all entities, e.g. hardware domain and >>>>>>>> guests. >>>>>>> >>>>>>> I am not entirely sure what you mean by "synchronized" here. Are you >>>>>>> refer to the content of the configuration space? >>>>>> >>>>>> We maintain hwdom's and guest's view of the registers we are interested >>>>>> in >>>>>> >>>>>> So, to have hwdom's view we also need to trap its access to the >>>>>> configuration space. >>>>>> >>>>>> Probably "synchronized" is not the right wording here. >>>>> I would simply say that we want to expose an emulated hostbridge to the >>>>> dom0 so we need to unmap the configuration space. >>>> Sounds good >>>>> >>>>>> >>>>>>> >>>>>>>> For that implement PCI host bridge specific callbacks to >>>>>>>> properly setup those ranges depending on particular host bridge >>>>>>>> implementation. >>>>>>>> >>>>>>>> Signed-off-by: Oleksandr Andrushchenko >>>>>>>> <oleksandr_andrushchenko@xxxxxxxx> >>>>>>>> --- >>>>>>>> xen/arch/arm/pci/ecam.c | 11 +++++++++++ >>>>>>>> xen/arch/arm/pci/pci-host-common.c | 16 ++++++++++++++++ >>>>>>>> xen/arch/arm/vpci.c | 13 +++++++++++++ >>>>>>>> xen/include/asm-arm/pci.h | 8 ++++++++ >>>>>>>> 4 files changed, 48 insertions(+) >>>>>>>> >>>>>>>> diff --git a/xen/arch/arm/pci/ecam.c b/xen/arch/arm/pci/ecam.c >>>>>>>> index 91c691b41fdf..92ecb2e0762b 100644 >>>>>>>> --- a/xen/arch/arm/pci/ecam.c >>>>>>>> +++ b/xen/arch/arm/pci/ecam.c >>>>>>>> @@ -42,6 +42,16 @@ void __iomem *pci_ecam_map_bus(struct >>>>>>>> pci_host_bridge *bridge, >>>>>>>> return base + (PCI_DEVFN(sbdf_t.dev, sbdf_t.fn) << >>>>>>>> devfn_shift) + where; >>>>>>>> } >>>>>>>> +static int pci_ecam_register_mmio_handler(struct domain *d, >>>>>>>> + struct pci_host_bridge >>>>>>>> *bridge, >>>>>>>> + const struct >>>>>>>> mmio_handler_ops *ops) >>>>>>>> +{ >>>>>>>> + struct pci_config_window *cfg = bridge->sysdata; >>>>>>>> + >>>>>>>> + register_mmio_handler(d, ops, cfg->phys_addr, cfg->size, NULL); >>>>>>> >>>>>>> We have a fixed array for handling the MMIO handlers. >>>>>> >>>>>> Didn't know that: >>>>>> >>>>>> xen/include/asm-arm/mmio.h:27:#define MAX_IO_HANDLER 16 >>>>>> >>>>>>> So you need to make sure we have enough space in it to store one >>>>>>> handler per handler. >>>>>>> >>>>>>> This is quite similar to the problem we had with the re-distribuor on >>>>>>> GICv3. Have a look there to see how we dealt with it. >>>>>> >>>>>> Could you please point me to that solution? I can only see >>>>>> >>>>>> /* Register mmio handle for the Distributor */ >>>>>> register_mmio_handler(d, &vgic_distr_mmio_handler, >>>>>> d->arch.vgic.dbase, >>>>>> SZ_64K, NULL); >>>>>> >>>>>> /* >>>>>> * Register mmio handler per contiguous region occupied by the >>>>>> * redistributors. The handler will take care to choose which >>>>>> * redistributor is targeted. >>>>>> */ >>>>>> for ( i = 0; i < d->arch.vgic.nr_regions; i++ ) >>>>>> { >>>>>> struct vgic_rdist_region *region = >>>>>> &d->arch.vgic.rdist_regions[i]; >>>>>> >>>>>> register_mmio_handler(d, &vgic_rdistr_mmio_handler, >>>>>> region->base, region->size, region); >>>>>> } >>>>>> which IMO doesn't care about the number of MMIOs we can handle >>>>> >>>>> Please see vgic_v3_init(). We update mmio_count that is then used as a >>>>> the second argument for domain_io_init(). >>>> >>>> Ah, so >>>> >>>> 1) This needs to be done before the array for the handlers is allocated >>>> >>>> 2) How do I know at the time of 1) how many bridges we have? >>> >>> By counting the number of bridge you want to expose to dom0? I am not >>> entirely sure what else you expect me to say. >> >> Ok, so I'll go over the device tree and find out all the bridges, e.g. >> devices with DEVICE_PCI type. >> >> Then I'll also need to exclude those being passed through (xen,passthrough) >> and the rest are the bridges for Domain-0? > > What you want to know if how many times register_mmio_handler() will be > called from domain_vpci_init(). > > You introduced a function pci_host_iterate_bridges() that will walk over the > bridges and then call the callback vpci_setup_mmio_handler(). So you could > introduce a new callback that will return 1 if > bridge->ops->register_mmio_handler is not NULL or 0. Ok, clear. Something like: if ( (rc = domain_vgic_register(d, &count)) != 0 ) goto fail; *find out how many bridges and update count* if ( (rc = domain_io_init(d, count + MAX_IO_HANDLER)) != 0 ) goto fail; > > Cheers, > Thank you, Oleksandr
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |