• Benjamin Herrenschmidt's avatar
    powerpc: Fix PCI ROM access · ad892a63
    Benjamin Herrenschmidt authored
    A couple of issues crept in since about 2.6.27 related to accessing PCI
    device ROMs on various powerpc machines.
    
    First, historically, we don't allocate the ROM resource in the resource
    tree. I'm not entirely certain of why, I susepct they often contained
    garbage on x86 but it's hard to tell. This causes the current generic
    code to always call pci_assign_resource() when trying to access the said
    ROM from sysfs, which will try to re-assign some new address regardless
    of what the ROM BAR was already set to at boot time. This can be a
    problem on hypervisor platforms like pSeries where we aren't supposed
    to move PCI devices around (and in fact probably can't).
    
    Second, our code that generates the PCI tree from the OF device-tree
    (instead of doing config space probing) which we mostly use on pseries
    at the moment, didn't set the (new) flag IORESOURCE_SIZEALIGN on any
    resource. That means that any attempt at re-assigning such a resource
    with pci_assign_resource() would fail due to resource_alignment()
    returning 0.
    
    This fixes this by doing these two things:
    
     - The code that calculates resource flags based on the OF device-node
    is improved to set IORESOURCE_SIZEALIGN on any valid BAR, and while at
    it also set IORESOURCE_READONLY for ROMs since we were lacking that too
    
     - We now allocate ROM resources as part of the resource tree. However
    to limit the chances of nasty conflicts due to busted firmwares, we
    only do it on the second pass of our two-passes allocation scheme,
    so that all valid and enabled BARs get precedence.
    
    This brings pSeries back the ability to access PCI ROMs via sysfs (and
    thus initialize various video cards from X etc...).
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    ad892a63
pci-common.c 46.1 KB