[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 4/6] xen/vpci: header: status register handler
On 28.08.2023 19:56, Stewart Hildebrand wrote: > --- a/xen/drivers/vpci/header.c > +++ b/xen/drivers/vpci/header.c > @@ -413,6 +413,18 @@ static void cf_check cmd_write( > pci_conf_write16(pdev->sbdf, reg, cmd); > } > > +static uint32_t cf_check status_read(const struct pci_dev *pdev, > + unsigned int reg, void *data) > +{ > + struct vpci_header *header = data; > + uint32_t status = pci_conf_read16(pdev->sbdf, reg); > + > + if ( header->mask_cap_list ) > + status &= ~PCI_STATUS_CAP_LIST; > + > + return status; > +} Imo we also cannot validly pass through any of the reserved bits. Doing so is an option only once we know what purpose they might gain. (In this context I notice our set of PCI_STATUS_* constants isn't quite up-to-date.) > @@ -544,6 +556,11 @@ static int cf_check init_bars(struct pci_dev *pdev) > if ( rc ) > return rc; > > + rc = vpci_add_rw1c_register(pdev->vpci, status_read, vpci_hw_write16, > + PCI_STATUS, 2, header, 0xF900); Rather than a literal number, imo this wants to be an OR of the respective PCI_STATUS_* constants (which, if you like, could of course be consolidated into a new PCI_STATUS_RW1C_MASK, to help readability). > @@ -167,6 +174,7 @@ int vpci_add_register(struct vpci *vpci, vpci_read_t > *read_handler, > r->size = size; > r->offset = offset; > r->private = data; > + r->rw1c_mask = rw1c_mask; To avoid surprises with ... > @@ -424,6 +443,7 @@ static void vpci_write_helper(const struct pci_dev *pdev, > uint32_t val; > > val = r->read(pdev, r->offset, r->private); > + val &= ~r->rw1c_mask; > data = merge_result(val, data, size, offset); ... the user of this field, should you either assert that no bits beyond the field size are set, or simply mask to the respective number of bits? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |