On Sun,  4 Oct 2015 23:43:17 +0300
Vlad Zolotarov <vl...@cloudius-systems.com> wrote:

> +static int setup_maps(struct pci_dev *pdev, struct uio_info *info)
> +{
> +     int i, m = 0, p = 0, err;
> +     static const char * const bar_names[] = {
> +             "BAR0", "BAR1", "BAR2", "BAR3", "BAR4", "BAR5",
> +     };
> +
> +     for (i = 0; i < ARRAY_SIZE(bar_names); i++) {
> +             unsigned long start = pci_resource_start(pdev, i);
> +             unsigned long flags = pci_resource_flags(pdev, i);
> +             unsigned long len = pci_resource_len(pdev, i);
> +
> +             if (start == 0 || len == 0)
> +                     continue;
> +
> +             if (flags & IORESOURCE_MEM) {
> +                     void __iomem *addr;
> +
> +                     if (m >= MAX_UIO_MAPS)
> +                             continue;
> +
> +                     addr = ioremap(start, len);
> +                     if (addr == NULL) {
> +                             err = -EINVAL;
> +                             goto fail;
> +                     }
> +
> +                     info->mem[m].name = bar_names[i];
> +                     info->mem[m].addr = start;
> +                     info->mem[m].internal_addr = addr;
> +                     info->mem[m].size = len;
> +                     info->mem[m].memtype = UIO_MEM_PHYS;
> +                     ++m;
> +             } else if (flags & IORESOURCE_IO) {
> +                     if (p >= MAX_UIO_PORT_REGIONS)
> +                             continue;
> +
> +                     info->port[p].name = bar_names[i];
> +                     info->port[p].start = start;
> +                     info->port[p].size = len;
> +                     info->port[p].porttype = UIO_PORT_X86;
> +                     ++p;
> +             }
> +     }
> +
> +     return 0;
> +fail:
> +     for (i = 0; i < m; i++) {
> +             iounmap(info->mem[i].internal_addr);
> +             info->mem[i].internal_addr = NULL;
> +     }
> +
> +     return err;
> +

I wonder do we really have to setup all the BAR's in uio_pci_generic?
The DPDK code works with uio_pci_generic already, and it didn't setup the BAR's.
One possible issue is that without that maybe kernel would not know about the
region used for MSI-X vectors table.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to