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/