lkml.org 
[lkml]   [2008]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 7/13 v7] PCI: add a new function to map BAR offset
    Add a function to map resource number to corresponding register so
    people can get the offset and type of device specific BARs.

    Signed-off-by: Yu Zhao <yu.zhao@intel.com>

    ---
    drivers/pci/pci.c | 22 ++++++++++++++++++++++
    drivers/pci/pci.h | 2 ++
    drivers/pci/setup-res.c | 13 +++++--------
    3 files changed, 29 insertions(+), 8 deletions(-)

    diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
    index 9d3f793..9382b5f 100644
    --- a/drivers/pci/pci.c
    +++ b/drivers/pci/pci.c
    @@ -2007,6 +2007,28 @@ int pci_select_bars(struct pci_dev *dev, unsigned long flags)
    return bars;
    }

    +/**
    + * pci_resource_bar - get position of the BAR associated with a resource
    + * @dev: the PCI device
    + * @resno: the resource number
    + * @type: the BAR type to be filled in
    + *
    + * Returns BAR position in config space, or 0 if the BAR is invalid.
    + */
    +int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type)
    +{
    + if (resno < PCI_ROM_RESOURCE) {
    + *type = pci_bar_unknown;
    + return PCI_BASE_ADDRESS_0 + 4 * resno;
    + } else if (resno == PCI_ROM_RESOURCE) {
    + *type = pci_bar_mem32;
    + return dev->rom_base_reg;
    + }
    +
    + dev_err(&dev->dev, "BAR: invalid resource #%d\n", resno);
    + return 0;
    +}
    +
    static void __devinit pci_no_domains(void)
    {
    #ifdef CONFIG_PCI_DOMAINS
    diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
    index fd0d087..3de70d7 100644
    --- a/drivers/pci/pci.h
    +++ b/drivers/pci/pci.h
    @@ -168,6 +168,8 @@ enum pci_bar_type {

    extern int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
    struct resource *res, unsigned int reg);
    +extern int pci_resource_bar(struct pci_dev *dev, int resno,
    + enum pci_bar_type *type);
    extern void pci_enable_ari(struct pci_dev *dev);
    /**
    * pci_ari_enabled - query ARI forwarding status
    diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
    index b7ca679..854d43e 100644
    --- a/drivers/pci/setup-res.c
    +++ b/drivers/pci/setup-res.c
    @@ -31,6 +31,7 @@ void pci_update_resource(struct pci_dev *dev, int resno)
    struct pci_bus_region region;
    u32 new, check, mask;
    int reg;
    + enum pci_bar_type type;
    struct resource *res = dev->resource + resno;

    /*
    @@ -62,17 +63,13 @@ void pci_update_resource(struct pci_dev *dev, int resno)
    else
    mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;

    - if (resno < 6) {
    - reg = PCI_BASE_ADDRESS_0 + 4 * resno;
    - } else if (resno == PCI_ROM_RESOURCE) {
    + reg = pci_resource_bar(dev, resno, &type);
    + if (!reg)
    + return;
    + if (type != pci_bar_unknown) {
    if (!(res->flags & IORESOURCE_ROM_ENABLE))
    return;
    new |= PCI_ROM_ADDRESS_ENABLE;
    - reg = dev->rom_base_reg;
    - } else {
    - /* Hmm, non-standard resource. */
    -
    - return; /* kill uninitialised var warning */
    }

    pci_write_config_dword(dev, reg, new);
    --
    1.5.6.4


    \
     
     \ /
      Last update: 2008-11-21 20:41    [W:0.031 / U:39.700 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site