[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 6/9] xen/vpci: trap access to the list of PCI capabilities
>>> On 27.04.17 at 16:35, <roger.pau@xxxxxxxxxx> wrote: > +static int vpci_index_capabilities(struct pci_dev *pdev) > +{ > + uint8_t seg = pdev->seg, bus = pdev->bus; > + uint8_t slot = PCI_SLOT(pdev->devfn), func = PCI_FUNC(pdev->devfn); > + uint8_t pos = PCI_CAPABILITY_LIST; > + uint16_t status; > + unsigned int max_cap = 48; > + struct vpci_capability *cap; > + int rc; > + > + INIT_LIST_HEAD(&pdev->vpci->cap_list); > + > + /* Check if device has capabilities. */ > + status = pci_conf_read16(seg, bus, slot, func, PCI_STATUS); > + if ( !(status & PCI_STATUS_CAP_LIST) ) > + return 0; > + > + /* Add the root capability pointer. */ > + cap = xzalloc(struct vpci_capability); > + if ( !cap ) > + return -ENOMEM; > + > + cap->offset = pos; > + list_add_tail(&cap->next, &pdev->vpci->cap_list); > + rc = xen_vpci_add_register(pdev, vpci_cap_read, vpci_cap_write, pos, > + 1, cap); > + if ( rc ) > + return rc; > + > + /* > + * Iterate over the list of capabilities present in the device, and > + * add a handler for each register pointer to the next item > + * (PCI_CAP_LIST_NEXT). > + */ > + while ( max_cap-- ) > + { > + pos = pci_conf_read8(seg, bus, slot, func, pos); > + if ( pos < 0x40 ) > + break; > + > + cap = xzalloc(struct vpci_capability); > + if ( !cap ) > + return -ENOMEM; > + > + cap->offset = pos; > + list_add_tail(&cap->next, &pdev->vpci->cap_list); > + pos += PCI_CAP_LIST_NEXT; > + rc = xen_vpci_add_register(pdev, vpci_cap_read, vpci_cap_write, pos, > + 1, cap); > + if ( rc ) > + return rc; > + } > + > + return 0; > +} Btw., instead of duplicating some of what pci_find_cap_offset() and pci_find_next_cap() do, perhaps worth making those two functions capable of dealing with a wildcard ID (0xff) as input. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |