|
[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 |