Message ID | 20230720003205.1828537-11-volodymyr_babchuk@epam.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | PCI devices passthrough on Arm, part 3 | expand |
On Thu, Jul 20, 2023 at 12:32:33AM +0000, Volodymyr Babchuk wrote: > From: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> > > Reset the command register when assigning a PCI device to a guest: > according to the PCI spec the PCI_COMMAND register is typically all 0's > after reset, but this might not be true for the guest as it needs > to respect host's settings. > For that reason, do not write 0 to the PCI_COMMAND register directly, > but go through the corresponding emulation layer (cmd_write), which > will take care about the actual bits written. > > Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> > --- > Since v6: > - use cmd_write directly without introducing emulate_cmd_reg > - update commit message with more description on all 0's in PCI_COMMAND > Since v5: > - updated commit message > Since v1: > - do not write 0 to the command register, but respect host settings. > --- > xen/drivers/vpci/header.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c > index ae05d242a5..44a9940fb9 100644 > --- a/xen/drivers/vpci/header.c > +++ b/xen/drivers/vpci/header.c > @@ -749,6 +749,10 @@ static int cf_check init_bars(struct pci_dev *pdev) > */ > ASSERT(header->guest_cmd == 0); > > + /* Reset the command register for guests. */ > + if ( !is_hwdom ) > + cmd_write(pdev, PCI_COMMAND, 0, header); So the assert just above is no longer needed? (and could be removed from the previous patch). As requested on the previous patch, should some message be logged if the command register is not as expected (0 in this case?) Thanks, Roger.
diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index ae05d242a5..44a9940fb9 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -749,6 +749,10 @@ static int cf_check init_bars(struct pci_dev *pdev) */ ASSERT(header->guest_cmd == 0); + /* Reset the command register for guests. */ + if ( !is_hwdom ) + cmd_write(pdev, PCI_COMMAND, 0, header); + /* Setup a handler for the command register. */ rc = vpci_add_register(pdev->vpci, cmd_read, cmd_write, PCI_COMMAND, 2, header);