lkml.org 
[lkml]   [2005]   [Aug]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: Ignore disabled ROM resources at setup
    From
    Date
    Here's a new patch based on Linus latest one with better error checking.
    Please push if you are fine with it.

    This patch fixes a problem with pci_map_rom() which doesn't properly
    update the ROM BAR value with the address thas allocated for it by the
    PCI code. This problem, among other, breaks boot on Mac laptops.

    Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>


    Index: linux-work/drivers/pci/rom.c
    ===================================================================
    --- linux-work.orig/drivers/pci/rom.c 2005-08-01 22:03:44.000000000 +1000
    +++ linux-work/drivers/pci/rom.c 2005-08-31 14:09:02.000000000 +1000
    @@ -21,13 +21,21 @@
    * between the ROM and other resources, so enabling it may disable access
    * to MMIO registers or other card memory.
    */
    -static void pci_enable_rom(struct pci_dev *pdev)
    +static int pci_enable_rom(struct pci_dev *pdev)
    {
    + struct resource *res = pdev->resource + PCI_ROM_RESOURCE;
    + struct pci_bus_region region;
    u32 rom_addr;

    + if (!res->flags)
    + return -1;
    +
    + pcibios_resource_to_bus(pdev, &region, res);
    pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr);
    - rom_addr |= PCI_ROM_ADDRESS_ENABLE;
    + rom_addr &= ~PCI_ROM_ADDRESS_MASK;
    + rom_addr |= region.start | PCI_ROM_ADDRESS_ENABLE;
    pci_write_config_dword(pdev, pdev->rom_base_reg, rom_addr);
    + return 0;
    }

    /**
    @@ -71,19 +79,21 @@
    } else {
    if (res->flags & IORESOURCE_ROM_COPY) {
    *size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
    - return (void __iomem *)pci_resource_start(pdev, PCI_ROM_RESOURCE);
    + return (void __iomem *)pci_resource_start(pdev,
    + PCI_ROM_RESOURCE);
    } else {
    /* assign the ROM an address if it doesn't have one */
    - if (res->parent == NULL)
    - pci_assign_resource(pdev, PCI_ROM_RESOURCE);
    -
    + if (res->parent == NULL &&
    + pci_assign_resource(pdev,PCI_ROM_RESOURCE))
    + return NULL;
    start = pci_resource_start(pdev, PCI_ROM_RESOURCE);
    *size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
    if (*size == 0)
    return NULL;

    /* Enable ROM space decodes */
    - pci_enable_rom(pdev);
    + if (pci_enable_rom(pdev))
    + return NULL;
    }
    }


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-08-31 06:27    [W:0.027 / U:0.856 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site