Re: Question regarding pci_request_region()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Oct 21, 2014 at 8:37 AM, Johannes Thumshirn
<johannes.thumshirn@xxxxxx> wrote:
> Hi,
>
> I've some questions regarding pci_request_region(). Is there a similar function
> that allows me to request the memory from a PCIe device, but not a whole BAR?

You can always do something like this:

  start = pci_resource_start(dev, 0);
  request_mem_region(start, 0x200, KBUILD_MODNAME);
  ioremap(start, 0x200);

> in drivers/mcb/mcb-pci.c I do a pci_request_region() for BAR 0. But I only need
> the first 0x200 bytes. pci_request_region() locks the memory and thus probing of
> mcb attached sub devices fails, as they can't do a request_mem on their part of
> the PCI memory space until the mcb parser is done and releases BAR0.

The default assumption is that the driver bound to a PCI device is the
only user of the BARs.  For example, if there is no driver bound to a
device, the PCI core assumes that it can reassign the BARs.

You can carve up a BAR among sub-devices, but you should make sure
that some driver remains bound to the PCI device as long as any
sub-driver is active.  The top-level driver doesn't need to keep any
BARs mapped itself, but it should remain bound to the device.

It looks like mcb_pci_probe() disables the device before it returns.
That doesn't seem like a good idea if you have sub-devices that are
accessed via the device's BARs.  At a minimum, pci_disable_device()
turns off bus mastering, and it may also disable IRQs

> Generally this is no problem when you build all drivers as modules, but once I
> do build in drivers, probing fails. Before rewriting all mcb based drivers to
> use deferred probing I wanted to ask if there is a more clean way to do this.

Deferred probing sounds like a workaround for a deeper problem.  It
seems like you basically have a PCI device that is effectively a
bridge to a MEN Chameleon Bus.  That means than when you enumerate
such a device, the probe routine (mcb_pci_probe(), I think) should in
turn enumerate any MCB devices "behind" it, i.e., the sub-devices.

There should not be any ordering dependency between mcb_pci_probe()
and the module_init functions of the drivers.  It is perfectly legal
for a driver to register before there are any devices for it to bind
to.  If a driver like men_z135_uart.c initializes first, it should
register itself as an MCB driver, but its probe function won't be
called because there's no matching device yet.  When mcb_pci_probe()
runs later to claim the MCB "bridge", it should enumerate the MCB
devices and add them.  When the devices are added, we should check for
any already-registered drivers that match them and call their probe
functions at that time.

Bjorn
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux