forked from Minki/linux
Merge branch 'pci/resource'
- Protect pci_reassign_bridge_resources() against concurrent addition/removal (Benjamin Herrenschmidt) - Fix bridge dma_ranges resource list cleanup (Rob Herring) - Add PCI_STD_NUM_BARS for the number of standard BARs (Denis Efremov) - Add "pci=hpmmiosize" and "pci=hpmmioprefsize" parameters to control the MMIO and prefetchable MMIO window sizes of hotplug bridges independently (Nicholas Johnson) - Fix MMIO/MMIO_PREF window assignment that assigned more space than desired (Nicholas Johnson) - Only enforce bus numbers from bridge EA if the bridge has EA devices downstream (Subbaraya Sundeep) * pci/resource: PCI: Do not use bus number zero from EA capability PCI: Avoid double hpmemsize MMIO window assignment PCI: Add "pci=hpmmiosize" and "pci=hpmmioprefsize" parameters PCI: Add PCI_STD_NUM_BARS for the number of standard BARs PCI: Fix missing bridge dma_ranges resource list cleanup PCI: Protect pci_reassign_bridge_resources() against concurrent addition/removal
This commit is contained in:
commit
774800cb09
@ -3492,8 +3492,15 @@
|
||||
hpiosize=nn[KMG] The fixed amount of bus space which is
|
||||
reserved for hotplug bridge's IO window.
|
||||
Default size is 256 bytes.
|
||||
hpmmiosize=nn[KMG] The fixed amount of bus space which is
|
||||
reserved for hotplug bridge's MMIO window.
|
||||
Default size is 2 megabytes.
|
||||
hpmmioprefsize=nn[KMG] The fixed amount of bus space which is
|
||||
reserved for hotplug bridge's MMIO_PREF window.
|
||||
Default size is 2 megabytes.
|
||||
hpmemsize=nn[KMG] The fixed amount of bus space which is
|
||||
reserved for hotplug bridge's memory window.
|
||||
reserved for hotplug bridge's MMIO and
|
||||
MMIO_PREF window.
|
||||
Default size is 2 megabytes.
|
||||
hpbussize=nn The minimum amount of additional bus numbers
|
||||
reserved for buses below a hotplug bridge.
|
||||
|
@ -71,10 +71,10 @@ static int pci_mmap_resource(struct kobject *kobj,
|
||||
struct pci_bus_region bar;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++)
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++)
|
||||
if (res == &pdev->resource[i])
|
||||
break;
|
||||
if (i >= PCI_ROM_RESOURCE)
|
||||
if (i >= PCI_STD_NUM_BARS)
|
||||
return -ENODEV;
|
||||
|
||||
if (res->flags & IORESOURCE_MEM && iomem_is_exclusive(res->start))
|
||||
@ -115,7 +115,7 @@ void pci_remove_resource_files(struct pci_dev *pdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
struct bin_attribute *res_attr;
|
||||
|
||||
res_attr = pdev->res_attr[i];
|
||||
@ -232,7 +232,7 @@ int pci_create_resource_files(struct pci_dev *pdev)
|
||||
int retval;
|
||||
|
||||
/* Expose the PCI resources from this device as files */
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
|
||||
/* skip empty resources */
|
||||
if (!pci_resource_len(pdev, i))
|
||||
|
@ -2,9 +2,6 @@
|
||||
#ifndef __ASM_S390_PCI_H
|
||||
#define __ASM_S390_PCI_H
|
||||
|
||||
/* must be set before including pci_clp.h */
|
||||
#define PCI_BAR_COUNT 6
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/iommu.h>
|
||||
@ -138,7 +135,7 @@ struct zpci_dev {
|
||||
|
||||
char res_name[16];
|
||||
bool mio_capable;
|
||||
struct zpci_bar_struct bars[PCI_BAR_COUNT];
|
||||
struct zpci_bar_struct bars[PCI_STD_NUM_BARS];
|
||||
|
||||
u64 start_dma; /* Start of available DMA addresses */
|
||||
u64 end_dma; /* End of available DMA addresses */
|
||||
|
@ -77,7 +77,7 @@ struct mio_info {
|
||||
struct {
|
||||
u64 wb;
|
||||
u64 wt;
|
||||
} addr[PCI_BAR_COUNT];
|
||||
} addr[PCI_STD_NUM_BARS];
|
||||
u32 reserved[6];
|
||||
} __packed;
|
||||
|
||||
@ -98,9 +98,9 @@ struct clp_rsp_query_pci {
|
||||
u16 util_str_avail : 1; /* utility string available? */
|
||||
u16 pfgid : 8; /* pci function group id */
|
||||
u32 fid; /* pci function id */
|
||||
u8 bar_size[PCI_BAR_COUNT];
|
||||
u8 bar_size[PCI_STD_NUM_BARS];
|
||||
u16 pchid;
|
||||
__le32 bar[PCI_BAR_COUNT];
|
||||
__le32 bar[PCI_STD_NUM_BARS];
|
||||
u8 pfip[CLP_PFIP_NR_SEGMENTS]; /* pci function internal path */
|
||||
u32 : 16;
|
||||
u8 fmb_len;
|
||||
|
@ -43,7 +43,7 @@ static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
|
||||
static DEFINE_SPINLOCK(zpci_domain_lock);
|
||||
|
||||
#define ZPCI_IOMAP_ENTRIES \
|
||||
min(((unsigned long) ZPCI_NR_DEVICES * PCI_BAR_COUNT / 2), \
|
||||
min(((unsigned long) ZPCI_NR_DEVICES * PCI_STD_NUM_BARS / 2), \
|
||||
ZPCI_IOMAP_MAX_ENTRIES)
|
||||
|
||||
static DEFINE_SPINLOCK(zpci_iomap_lock);
|
||||
@ -294,7 +294,7 @@ static void __iomem *pci_iomap_range_mio(struct pci_dev *pdev, int bar,
|
||||
void __iomem *pci_iomap_range(struct pci_dev *pdev, int bar,
|
||||
unsigned long offset, unsigned long max)
|
||||
{
|
||||
if (!pci_resource_len(pdev, bar) || bar >= PCI_BAR_COUNT)
|
||||
if (bar >= PCI_STD_NUM_BARS || !pci_resource_len(pdev, bar))
|
||||
return NULL;
|
||||
|
||||
if (static_branch_likely(&have_mio))
|
||||
@ -324,7 +324,7 @@ static void __iomem *pci_iomap_wc_range_mio(struct pci_dev *pdev, int bar,
|
||||
void __iomem *pci_iomap_wc_range(struct pci_dev *pdev, int bar,
|
||||
unsigned long offset, unsigned long max)
|
||||
{
|
||||
if (!pci_resource_len(pdev, bar) || bar >= PCI_BAR_COUNT)
|
||||
if (bar >= PCI_STD_NUM_BARS || !pci_resource_len(pdev, bar))
|
||||
return NULL;
|
||||
|
||||
if (static_branch_likely(&have_mio))
|
||||
@ -416,7 +416,7 @@ static void zpci_map_resources(struct pci_dev *pdev)
|
||||
resource_size_t len;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_BAR_COUNT; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
len = pci_resource_len(pdev, i);
|
||||
if (!len)
|
||||
continue;
|
||||
@ -451,7 +451,7 @@ static void zpci_unmap_resources(struct pci_dev *pdev)
|
||||
if (zpci_use_mio(zdev))
|
||||
return;
|
||||
|
||||
for (i = 0; i < PCI_BAR_COUNT; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
len = pci_resource_len(pdev, i);
|
||||
if (!len)
|
||||
continue;
|
||||
@ -514,7 +514,7 @@ static int zpci_setup_bus_resources(struct zpci_dev *zdev,
|
||||
snprintf(zdev->res_name, sizeof(zdev->res_name),
|
||||
"PCI Bus %04x:%02x", zdev->domain, ZPCI_BUS_NR);
|
||||
|
||||
for (i = 0; i < PCI_BAR_COUNT; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (!zdev->bars[i].size)
|
||||
continue;
|
||||
entry = zpci_alloc_iomap(zdev);
|
||||
@ -551,7 +551,7 @@ static void zpci_cleanup_bus_resources(struct zpci_dev *zdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_BAR_COUNT; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (!zdev->bars[i].size || !zdev->bars[i].res)
|
||||
continue;
|
||||
|
||||
@ -573,7 +573,7 @@ int pcibios_add_device(struct pci_dev *pdev)
|
||||
pdev->dev.dma_ops = &s390_pci_dma_ops;
|
||||
zpci_map_resources(pdev);
|
||||
|
||||
for (i = 0; i < PCI_BAR_COUNT; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
res = &pdev->resource[i];
|
||||
if (res->parent || !res->flags)
|
||||
continue;
|
||||
|
@ -145,7 +145,7 @@ static int clp_store_query_pci_fn(struct zpci_dev *zdev,
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_BAR_COUNT; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
zdev->bars[i].val = le32_to_cpu(response->bar[i]);
|
||||
zdev->bars[i].size = response->bar_size[i];
|
||||
}
|
||||
@ -164,8 +164,8 @@ static int clp_store_query_pci_fn(struct zpci_dev *zdev,
|
||||
sizeof(zdev->util_str));
|
||||
}
|
||||
zdev->mio_capable = response->mio_addr_avail;
|
||||
for (i = 0; i < PCI_BAR_COUNT; i++) {
|
||||
if (!(response->mio.valid & (1 << (PCI_BAR_COUNT - i - 1))))
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (!(response->mio.valid & (1 << (PCI_STD_NUM_BARS - i - 1))))
|
||||
continue;
|
||||
|
||||
zdev->bars[i].mio_wb = (void __iomem *) response->mio.addr[i].wb;
|
||||
|
@ -135,7 +135,7 @@ static void pcibios_fixup_device_resources(struct pci_dev *dev)
|
||||
* resource so the kernel doesn't attempt to assign
|
||||
* it later on in pci_assign_unassigned_resources
|
||||
*/
|
||||
for (bar = 0; bar <= PCI_STD_RESOURCE_END; bar++) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
bar_r = &dev->resource[bar];
|
||||
if (bar_r->start == 0 && bar_r->end != 0) {
|
||||
bar_r->flags = 0;
|
||||
|
@ -382,7 +382,7 @@ static void pci_fixed_bar_fixup(struct pci_dev *dev)
|
||||
PCI_DEVFN(2, 2) == dev->devfn)
|
||||
return;
|
||||
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
pci_read_config_dword(dev, offset + 8 + (i * 4), &size);
|
||||
dev->resource[i].end = dev->resource[i].start + size - 1;
|
||||
dev->resource[i].flags |= IORESOURCE_PCI_FIXED;
|
||||
|
@ -422,7 +422,7 @@ static int atp867x_ata_pci_sff_init_host(struct ata_host *host)
|
||||
#ifdef ATP867X_DEBUG
|
||||
atp867x_check_res(pdev);
|
||||
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++)
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++)
|
||||
printk(KERN_DEBUG "ATP867X: iomap[%d]=0x%llx\n", i,
|
||||
(unsigned long long)(host->iomap[i]));
|
||||
#endif
|
||||
|
@ -2325,7 +2325,7 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
// Make sure this is a SATA controller by counting the number of bars
|
||||
// (NVIDIA SATA controllers will always have six bars). Otherwise,
|
||||
// it's an IDE controller and we ignore it.
|
||||
for (bar = 0; bar < 6; bar++)
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
|
||||
if (pci_resource_start(pdev, bar) == 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -848,7 +848,7 @@ static int jmb38x_ms_count_slots(struct pci_dev *pdev)
|
||||
{
|
||||
int cnt, rc = 0;
|
||||
|
||||
for (cnt = 0; cnt < PCI_ROM_RESOURCE; ++cnt) {
|
||||
for (cnt = 0; cnt < PCI_STD_NUM_BARS; ++cnt) {
|
||||
if (!(IORESOURCE_MEM & pci_resource_flags(pdev, cnt)))
|
||||
break;
|
||||
|
||||
|
@ -94,7 +94,7 @@ enum pci_barno {
|
||||
struct pci_endpoint_test {
|
||||
struct pci_dev *pdev;
|
||||
void __iomem *base;
|
||||
void __iomem *bar[6];
|
||||
void __iomem *bar[PCI_STD_NUM_BARS];
|
||||
struct completion irq_raised;
|
||||
int last_irq;
|
||||
int num_irqs;
|
||||
@ -687,7 +687,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
|
||||
if (!pci_endpoint_test_request_irq(test))
|
||||
goto err_disable_irq;
|
||||
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM) {
|
||||
base = pci_ioremap_bar(pdev, bar);
|
||||
if (!base) {
|
||||
@ -740,7 +740,7 @@ err_ida_remove:
|
||||
ida_simple_remove(&pci_endpoint_test_ida, id);
|
||||
|
||||
err_iounmap:
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
if (test->bar[bar])
|
||||
pci_iounmap(pdev, test->bar[bar]);
|
||||
}
|
||||
@ -771,7 +771,7 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
|
||||
misc_deregister(&test->miscdev);
|
||||
kfree(misc_device->name);
|
||||
ida_simple_remove(&pci_endpoint_test_ida, id);
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
if (test->bar[bar])
|
||||
pci_iounmap(pdev, test->bar[bar]);
|
||||
}
|
||||
|
@ -45,7 +45,6 @@
|
||||
|
||||
#define BAR_0 0
|
||||
#define BAR_1 1
|
||||
#define BAR_5 5
|
||||
|
||||
#define INTEL_E1000_ETHERNET_DEVICE(device_id) {\
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
|
||||
|
@ -977,7 +977,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
goto err_ioremap;
|
||||
|
||||
if (adapter->need_ioport) {
|
||||
for (i = BAR_1; i <= BAR_5; i++) {
|
||||
for (i = BAR_1; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_len(pdev, i) == 0)
|
||||
continue;
|
||||
if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
|
||||
|
@ -42,7 +42,6 @@
|
||||
|
||||
#define BAR_0 0
|
||||
#define BAR_1 1
|
||||
#define BAR_5 5
|
||||
|
||||
struct ixgb_adapter;
|
||||
#include "ixgb_hw.h"
|
||||
|
@ -412,7 +412,7 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
goto err_ioremap;
|
||||
}
|
||||
|
||||
for (i = BAR_1; i <= BAR_5; i++) {
|
||||
for (i = BAR_1; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_len(pdev, i) == 0)
|
||||
continue;
|
||||
if (pci_resource_flags(pdev, i) & IORESOURCE_IO) {
|
||||
|
@ -489,7 +489,7 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
|
||||
}
|
||||
|
||||
/* Get the base address of device */
|
||||
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_len(pdev, i) == 0)
|
||||
continue;
|
||||
ret = pcim_iomap_regions(pdev, BIT(i), pci_name(pdev));
|
||||
@ -532,7 +532,7 @@ static void stmmac_pci_remove(struct pci_dev *pdev)
|
||||
if (priv->plat->stmmac_clk)
|
||||
clk_unregister_fixed_rate(priv->plat->stmmac_clk);
|
||||
|
||||
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_len(pdev, i) == 0)
|
||||
continue;
|
||||
pcim_iounmap_regions(pdev, BIT(i));
|
||||
|
@ -34,7 +34,7 @@ static int xlgmac_probe(struct pci_dev *pcidev, const struct pci_device_id *id)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_len(pcidev, i) == 0)
|
||||
continue;
|
||||
ret = pcim_iomap_regions(pcidev, BIT(i), XLGMAC_DRV_NAME);
|
||||
|
@ -353,7 +353,7 @@ static void dra7xx_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci);
|
||||
enum pci_barno bar;
|
||||
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++)
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
|
||||
dw_pcie_ep_reset_bar(pci, bar);
|
||||
|
||||
dra7xx_pcie_enable_wrapper_interrupts(dra7xx);
|
||||
|
@ -58,7 +58,7 @@ static void ls_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
enum pci_barno bar;
|
||||
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++)
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
|
||||
dw_pcie_ep_reset_bar(pci, bar);
|
||||
}
|
||||
|
||||
|
@ -422,7 +422,7 @@ static void artpec6_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
artpec6_pcie_wait_for_phy(artpec6_pcie);
|
||||
artpec6_pcie_set_nfts(artpec6_pcie);
|
||||
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++)
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
|
||||
dw_pcie_ep_reset_bar(pci, bar);
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,7 @@ static void dw_plat_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
enum pci_barno bar;
|
||||
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++)
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
|
||||
dw_pcie_ep_reset_bar(pci, bar);
|
||||
}
|
||||
|
||||
|
@ -214,7 +214,7 @@ struct dw_pcie_ep {
|
||||
phys_addr_t phys_base;
|
||||
size_t addr_size;
|
||||
size_t page_size;
|
||||
u8 bar_to_atu[6];
|
||||
u8 bar_to_atu[PCI_STD_NUM_BARS];
|
||||
phys_addr_t *outbound_addr;
|
||||
unsigned long *ib_window_map;
|
||||
unsigned long *ob_window_map;
|
||||
|
@ -307,7 +307,7 @@ struct pci_bus_relations {
|
||||
struct pci_q_res_req_response {
|
||||
struct vmpacket_descriptor hdr;
|
||||
s32 status; /* negative values are failures */
|
||||
u32 probed_bar[6];
|
||||
u32 probed_bar[PCI_STD_NUM_BARS];
|
||||
} __packed;
|
||||
|
||||
struct pci_set_power {
|
||||
@ -539,7 +539,7 @@ struct hv_pci_dev {
|
||||
* What would be observed if one wrote 0xFFFFFFFF to a BAR and then
|
||||
* read it back, for each of the BAR offsets within config space.
|
||||
*/
|
||||
u32 probed_bar[6];
|
||||
u32 probed_bar[PCI_STD_NUM_BARS];
|
||||
};
|
||||
|
||||
struct hv_pci_compl {
|
||||
@ -1610,7 +1610,7 @@ static void survey_child_resources(struct hv_pcibus_device *hbus)
|
||||
* so it's sufficient to just add them up without tracking alignment.
|
||||
*/
|
||||
list_for_each_entry(hpdev, &hbus->children, list_entry) {
|
||||
for (i = 0; i < 6; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (hpdev->probed_bar[i] & PCI_BASE_ADDRESS_SPACE_IO)
|
||||
dev_err(&hbus->hdev->device,
|
||||
"There's an I/O BAR in this list!\n");
|
||||
@ -1684,7 +1684,7 @@ static void prepopulate_bars(struct hv_pcibus_device *hbus)
|
||||
/* Pick addresses for the BARs. */
|
||||
do {
|
||||
list_for_each_entry(hpdev, &hbus->children, list_entry) {
|
||||
for (i = 0; i < 6; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
bar_val = hpdev->probed_bar[i];
|
||||
if (bar_val == 0)
|
||||
continue;
|
||||
@ -1841,7 +1841,7 @@ static void q_resource_requirements(void *context, struct pci_response *resp,
|
||||
"query resource requirements failed: %x\n",
|
||||
resp->status);
|
||||
} else {
|
||||
for (i = 0; i < 6; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
completion->hpdev->probed_bar[i] =
|
||||
q_res_req->probed_bar[i];
|
||||
}
|
||||
|
@ -44,7 +44,7 @@
|
||||
static struct workqueue_struct *kpcitest_workqueue;
|
||||
|
||||
struct pci_epf_test {
|
||||
void *reg[6];
|
||||
void *reg[PCI_STD_NUM_BARS];
|
||||
struct pci_epf *epf;
|
||||
enum pci_barno test_reg_bar;
|
||||
struct delayed_work cmd_handler;
|
||||
@ -377,7 +377,7 @@ static void pci_epf_test_unbind(struct pci_epf *epf)
|
||||
|
||||
cancel_delayed_work(&epf_test->cmd_handler);
|
||||
pci_epc_stop(epc);
|
||||
for (bar = BAR_0; bar <= BAR_5; bar++) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
epf_bar = &epf->bar[bar];
|
||||
|
||||
if (epf_test->reg[bar]) {
|
||||
@ -400,7 +400,7 @@ static int pci_epf_test_set_bar(struct pci_epf *epf)
|
||||
|
||||
epc_features = epf_test->epc_features;
|
||||
|
||||
for (bar = BAR_0; bar <= BAR_5; bar += add) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar += add) {
|
||||
epf_bar = &epf->bar[bar];
|
||||
/*
|
||||
* pci_epc_set_bar() sets PCI_BASE_ADDRESS_MEM_TYPE_64
|
||||
@ -450,7 +450,7 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf)
|
||||
}
|
||||
epf_test->reg[test_reg_bar] = base;
|
||||
|
||||
for (bar = BAR_0; bar <= BAR_5; bar += add) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar += add) {
|
||||
epf_bar = &epf->bar[bar];
|
||||
add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1;
|
||||
|
||||
@ -478,7 +478,7 @@ static void pci_epf_configure_bar(struct pci_epf *epf,
|
||||
bool bar_fixed_64bit;
|
||||
int i;
|
||||
|
||||
for (i = BAR_0; i <= BAR_5; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
epf_bar = &epf->bar[i];
|
||||
bar_fixed_64bit = !!(epc_features->bar_fixed_64bit & (1 << i));
|
||||
if (bar_fixed_64bit)
|
||||
|
@ -1122,7 +1122,7 @@ static void pci_remove_resource_files(struct pci_dev *pdev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
struct bin_attribute *res_attr;
|
||||
|
||||
res_attr = pdev->res_attr[i];
|
||||
@ -1193,7 +1193,7 @@ static int pci_create_resource_files(struct pci_dev *pdev)
|
||||
int retval;
|
||||
|
||||
/* Expose the PCI resources from this device as files */
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
|
||||
/* skip empty resources */
|
||||
if (!pci_resource_len(pdev, i))
|
||||
|
@ -86,10 +86,17 @@ unsigned long pci_cardbus_io_size = DEFAULT_CARDBUS_IO_SIZE;
|
||||
unsigned long pci_cardbus_mem_size = DEFAULT_CARDBUS_MEM_SIZE;
|
||||
|
||||
#define DEFAULT_HOTPLUG_IO_SIZE (256)
|
||||
#define DEFAULT_HOTPLUG_MEM_SIZE (2*1024*1024)
|
||||
/* pci=hpmemsize=nnM,hpiosize=nn can override this */
|
||||
#define DEFAULT_HOTPLUG_MMIO_SIZE (2*1024*1024)
|
||||
#define DEFAULT_HOTPLUG_MMIO_PREF_SIZE (2*1024*1024)
|
||||
/* hpiosize=nn can override this */
|
||||
unsigned long pci_hotplug_io_size = DEFAULT_HOTPLUG_IO_SIZE;
|
||||
unsigned long pci_hotplug_mem_size = DEFAULT_HOTPLUG_MEM_SIZE;
|
||||
/*
|
||||
* pci=hpmmiosize=nnM overrides non-prefetchable MMIO size,
|
||||
* pci=hpmmioprefsize=nnM overrides prefetchable MMIO size;
|
||||
* pci=hpmemsize=nnM overrides both
|
||||
*/
|
||||
unsigned long pci_hotplug_mmio_size = DEFAULT_HOTPLUG_MMIO_SIZE;
|
||||
unsigned long pci_hotplug_mmio_pref_size = DEFAULT_HOTPLUG_MMIO_PREF_SIZE;
|
||||
|
||||
#define DEFAULT_HOTPLUG_BUS_SIZE 1
|
||||
unsigned long pci_hotplug_bus_size = DEFAULT_HOTPLUG_BUS_SIZE;
|
||||
@ -675,7 +682,7 @@ struct resource *pci_find_resource(struct pci_dev *dev, struct resource *res)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
struct resource *r = &dev->resource[i];
|
||||
|
||||
if (r->start && resource_contains(r, res))
|
||||
@ -3788,7 +3795,7 @@ void pci_release_selected_regions(struct pci_dev *pdev, int bars)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++)
|
||||
if (bars & (1 << i))
|
||||
pci_release_region(pdev, i);
|
||||
}
|
||||
@ -3799,7 +3806,7 @@ static int __pci_request_selected_regions(struct pci_dev *pdev, int bars,
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++)
|
||||
if (bars & (1 << i))
|
||||
if (__pci_request_region(pdev, i, res_name, excl))
|
||||
goto err_out;
|
||||
@ -3847,7 +3854,7 @@ EXPORT_SYMBOL(pci_request_selected_regions_exclusive);
|
||||
|
||||
void pci_release_regions(struct pci_dev *pdev)
|
||||
{
|
||||
pci_release_selected_regions(pdev, (1 << 6) - 1);
|
||||
pci_release_selected_regions(pdev, (1 << PCI_STD_NUM_BARS) - 1);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_release_regions);
|
||||
|
||||
@ -3866,7 +3873,8 @@ EXPORT_SYMBOL(pci_release_regions);
|
||||
*/
|
||||
int pci_request_regions(struct pci_dev *pdev, const char *res_name)
|
||||
{
|
||||
return pci_request_selected_regions(pdev, ((1 << 6) - 1), res_name);
|
||||
return pci_request_selected_regions(pdev,
|
||||
((1 << PCI_STD_NUM_BARS) - 1), res_name);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_request_regions);
|
||||
|
||||
@ -3888,7 +3896,7 @@ EXPORT_SYMBOL(pci_request_regions);
|
||||
int pci_request_regions_exclusive(struct pci_dev *pdev, const char *res_name)
|
||||
{
|
||||
return pci_request_selected_regions_exclusive(pdev,
|
||||
((1 << 6) - 1), res_name);
|
||||
((1 << PCI_STD_NUM_BARS) - 1), res_name);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_request_regions_exclusive);
|
||||
|
||||
@ -6401,8 +6409,13 @@ static int __init pci_setup(char *str)
|
||||
pcie_ecrc_get_policy(str + 5);
|
||||
} else if (!strncmp(str, "hpiosize=", 9)) {
|
||||
pci_hotplug_io_size = memparse(str + 9, &str);
|
||||
} else if (!strncmp(str, "hpmmiosize=", 11)) {
|
||||
pci_hotplug_mmio_size = memparse(str + 11, &str);
|
||||
} else if (!strncmp(str, "hpmmioprefsize=", 15)) {
|
||||
pci_hotplug_mmio_pref_size = memparse(str + 15, &str);
|
||||
} else if (!strncmp(str, "hpmemsize=", 10)) {
|
||||
pci_hotplug_mem_size = memparse(str + 10, &str);
|
||||
pci_hotplug_mmio_size = memparse(str + 10, &str);
|
||||
pci_hotplug_mmio_pref_size = pci_hotplug_mmio_size;
|
||||
} else if (!strncmp(str, "hpbussize=", 10)) {
|
||||
pci_hotplug_bus_size =
|
||||
simple_strtoul(str + 10, &str, 0);
|
||||
|
@ -220,7 +220,8 @@ extern const struct device_type pci_dev_type;
|
||||
extern const struct attribute_group *pci_bus_groups[];
|
||||
|
||||
extern unsigned long pci_hotplug_io_size;
|
||||
extern unsigned long pci_hotplug_mem_size;
|
||||
extern unsigned long pci_hotplug_mmio_size;
|
||||
extern unsigned long pci_hotplug_mmio_pref_size;
|
||||
extern unsigned long pci_hotplug_bus_size;
|
||||
|
||||
/**
|
||||
|
@ -573,6 +573,7 @@ static void devm_pci_release_host_bridge_dev(struct device *dev)
|
||||
bridge->release_fn(bridge);
|
||||
|
||||
pci_free_resource_list(&bridge->windows);
|
||||
pci_free_resource_list(&bridge->dma_ranges);
|
||||
}
|
||||
|
||||
static void pci_release_host_bridge_dev(struct device *dev)
|
||||
@ -1093,14 +1094,15 @@ static unsigned int pci_scan_child_bus_extend(struct pci_bus *bus,
|
||||
* @sec: updated with secondary bus number from EA
|
||||
* @sub: updated with subordinate bus number from EA
|
||||
*
|
||||
* If @dev is a bridge with EA capability, update @sec and @sub with
|
||||
* fixed bus numbers from the capability and return true. Otherwise,
|
||||
* return false.
|
||||
* If @dev is a bridge with EA capability that specifies valid secondary
|
||||
* and subordinate bus numbers, return true with the bus numbers in @sec
|
||||
* and @sub. Otherwise return false.
|
||||
*/
|
||||
static bool pci_ea_fixed_busnrs(struct pci_dev *dev, u8 *sec, u8 *sub)
|
||||
{
|
||||
int ea, offset;
|
||||
u32 dw;
|
||||
u8 ea_sec, ea_sub;
|
||||
|
||||
if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE)
|
||||
return false;
|
||||
@ -1112,8 +1114,13 @@ static bool pci_ea_fixed_busnrs(struct pci_dev *dev, u8 *sec, u8 *sub)
|
||||
|
||||
offset = ea + PCI_EA_FIRST_ENT;
|
||||
pci_read_config_dword(dev, offset, &dw);
|
||||
*sec = dw & PCI_EA_SEC_BUS_MASK;
|
||||
*sub = (dw & PCI_EA_SUB_BUS_MASK) >> PCI_EA_SUB_BUS_SHIFT;
|
||||
ea_sec = dw & PCI_EA_SEC_BUS_MASK;
|
||||
ea_sub = (dw & PCI_EA_SUB_BUS_MASK) >> PCI_EA_SUB_BUS_SHIFT;
|
||||
if (ea_sec == 0 || ea_sub < ea_sec)
|
||||
return false;
|
||||
|
||||
*sec = ea_sec;
|
||||
*sub = ea_sub;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -258,13 +258,13 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
}
|
||||
|
||||
/* Make sure the caller is mapping a real resource for this device */
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (dev->resource[i].flags & res_bit &&
|
||||
pci_mmap_fits(dev, i, vma, PCI_MMAP_PROCFS))
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= PCI_ROM_RESOURCE)
|
||||
if (i >= PCI_STD_NUM_BARS)
|
||||
return -ENODEV;
|
||||
|
||||
if (fpriv->mmap_state == pci_mmap_mem &&
|
||||
|
@ -474,7 +474,7 @@ static void quirk_extend_bar_to_page(struct pci_dev *dev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
struct resource *r = &dev->resource[i];
|
||||
|
||||
if (r->flags & IORESOURCE_MEM && resource_size(r) < PAGE_SIZE) {
|
||||
@ -1809,7 +1809,7 @@ static void quirk_alder_ioapic(struct pci_dev *pdev)
|
||||
* The next five BARs all seem to be rubbish, so just clean
|
||||
* them out.
|
||||
*/
|
||||
for (i = 1; i < 6; i++)
|
||||
for (i = 1; i < PCI_STD_NUM_BARS; i++)
|
||||
memset(&pdev->resource[i], 0, sizeof(pdev->resource[i]));
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EESSC, quirk_alder_ioapic);
|
||||
|
@ -752,24 +752,32 @@ static void pci_bridge_check_ranges(struct pci_bus *bus)
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper function for sizing routines: find first available bus resource
|
||||
* of a given type. Note: we intentionally skip the bus resources which
|
||||
* have already been assigned (that is, have non-NULL parent resource).
|
||||
* Helper function for sizing routines. Assigned resources have non-NULL
|
||||
* parent resource.
|
||||
*
|
||||
* Return first unassigned resource of the correct type. If there is none,
|
||||
* return first assigned resource of the correct type. If none of the
|
||||
* above, return NULL.
|
||||
*
|
||||
* Returning an assigned resource of the correct type allows the caller to
|
||||
* distinguish between already assigned and no resource of the correct type.
|
||||
*/
|
||||
static struct resource *find_free_bus_resource(struct pci_bus *bus,
|
||||
unsigned long type_mask,
|
||||
unsigned long type)
|
||||
static struct resource *find_bus_resource_of_type(struct pci_bus *bus,
|
||||
unsigned long type_mask,
|
||||
unsigned long type)
|
||||
{
|
||||
struct resource *r, *r_assigned = NULL;
|
||||
int i;
|
||||
struct resource *r;
|
||||
|
||||
pci_bus_for_each_resource(bus, r, i) {
|
||||
if (r == &ioport_resource || r == &iomem_resource)
|
||||
continue;
|
||||
if (r && (r->flags & type_mask) == type && !r->parent)
|
||||
return r;
|
||||
if (r && (r->flags & type_mask) == type && !r_assigned)
|
||||
r_assigned = r;
|
||||
}
|
||||
return NULL;
|
||||
return r_assigned;
|
||||
}
|
||||
|
||||
static resource_size_t calculate_iosize(resource_size_t size,
|
||||
@ -866,8 +874,8 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,
|
||||
struct list_head *realloc_head)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
struct resource *b_res = find_free_bus_resource(bus, IORESOURCE_IO,
|
||||
IORESOURCE_IO);
|
||||
struct resource *b_res = find_bus_resource_of_type(bus, IORESOURCE_IO,
|
||||
IORESOURCE_IO);
|
||||
resource_size_t size = 0, size0 = 0, size1 = 0;
|
||||
resource_size_t children_add_size = 0;
|
||||
resource_size_t min_align, align;
|
||||
@ -875,6 +883,10 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size,
|
||||
if (!b_res)
|
||||
return;
|
||||
|
||||
/* If resource is already assigned, nothing more to do */
|
||||
if (b_res->parent)
|
||||
return;
|
||||
|
||||
min_align = window_alignment(bus, IORESOURCE_IO);
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
int i;
|
||||
@ -978,7 +990,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
|
||||
resource_size_t min_align, align, size, size0, size1;
|
||||
resource_size_t aligns[18]; /* Alignments from 1MB to 128GB */
|
||||
int order, max_order;
|
||||
struct resource *b_res = find_free_bus_resource(bus,
|
||||
struct resource *b_res = find_bus_resource_of_type(bus,
|
||||
mask | IORESOURCE_PREFETCH, type);
|
||||
resource_size_t children_add_size = 0;
|
||||
resource_size_t children_add_align = 0;
|
||||
@ -987,6 +999,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
|
||||
if (!b_res)
|
||||
return -ENOSPC;
|
||||
|
||||
/* If resource is already assigned, nothing more to do */
|
||||
if (b_res->parent)
|
||||
return 0;
|
||||
|
||||
memset(aligns, 0, sizeof(aligns));
|
||||
max_order = 0;
|
||||
size = 0;
|
||||
@ -1178,7 +1194,8 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
unsigned long mask, prefmask, type2 = 0, type3 = 0;
|
||||
resource_size_t additional_mem_size = 0, additional_io_size = 0;
|
||||
resource_size_t additional_io_size = 0, additional_mmio_size = 0,
|
||||
additional_mmio_pref_size = 0;
|
||||
struct resource *b_res;
|
||||
int ret;
|
||||
|
||||
@ -1212,7 +1229,8 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head)
|
||||
pci_bridge_check_ranges(bus);
|
||||
if (bus->self->is_hotplug_bridge) {
|
||||
additional_io_size = pci_hotplug_io_size;
|
||||
additional_mem_size = pci_hotplug_mem_size;
|
||||
additional_mmio_size = pci_hotplug_mmio_size;
|
||||
additional_mmio_pref_size = pci_hotplug_mmio_pref_size;
|
||||
}
|
||||
/* Fall through */
|
||||
default:
|
||||
@ -1230,9 +1248,9 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head)
|
||||
if (b_res[2].flags & IORESOURCE_MEM_64) {
|
||||
prefmask |= IORESOURCE_MEM_64;
|
||||
ret = pbus_size_mem(bus, prefmask, prefmask,
|
||||
prefmask, prefmask,
|
||||
realloc_head ? 0 : additional_mem_size,
|
||||
additional_mem_size, realloc_head);
|
||||
prefmask, prefmask,
|
||||
realloc_head ? 0 : additional_mmio_pref_size,
|
||||
additional_mmio_pref_size, realloc_head);
|
||||
|
||||
/*
|
||||
* If successful, all non-prefetchable resources
|
||||
@ -1254,9 +1272,9 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head)
|
||||
if (!type2) {
|
||||
prefmask &= ~IORESOURCE_MEM_64;
|
||||
ret = pbus_size_mem(bus, prefmask, prefmask,
|
||||
prefmask, prefmask,
|
||||
realloc_head ? 0 : additional_mem_size,
|
||||
additional_mem_size, realloc_head);
|
||||
prefmask, prefmask,
|
||||
realloc_head ? 0 : additional_mmio_pref_size,
|
||||
additional_mmio_pref_size, realloc_head);
|
||||
|
||||
/*
|
||||
* If successful, only non-prefetchable resources
|
||||
@ -1265,7 +1283,7 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head)
|
||||
if (ret == 0)
|
||||
mask = prefmask;
|
||||
else
|
||||
additional_mem_size += additional_mem_size;
|
||||
additional_mmio_size += additional_mmio_pref_size;
|
||||
|
||||
type2 = type3 = IORESOURCE_MEM;
|
||||
}
|
||||
@ -1285,8 +1303,8 @@ void __pci_bus_size_bridges(struct pci_bus *bus, struct list_head *realloc_head)
|
||||
* prefetchable resource in a 64-bit prefetchable window.
|
||||
*/
|
||||
pbus_size_mem(bus, mask, IORESOURCE_MEM, type2, type3,
|
||||
realloc_head ? 0 : additional_mem_size,
|
||||
additional_mem_size, realloc_head);
|
||||
realloc_head ? 0 : additional_mmio_size,
|
||||
additional_mmio_size, realloc_head);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -2066,6 +2084,8 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
down_read(&pci_bus_sem);
|
||||
|
||||
/* Walk to the root hub, releasing bridge BARs when possible */
|
||||
next = bridge;
|
||||
do {
|
||||
@ -2100,8 +2120,10 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
|
||||
next = bridge->bus ? bridge->bus->self : NULL;
|
||||
} while (next);
|
||||
|
||||
if (list_empty(&saved))
|
||||
if (list_empty(&saved)) {
|
||||
up_read(&pci_bus_sem);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
__pci_bus_size_bridges(bridge->subordinate, &added);
|
||||
__pci_bridge_assign_resources(bridge, &added, &failed);
|
||||
@ -2122,6 +2144,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type)
|
||||
}
|
||||
|
||||
free_list(&saved);
|
||||
up_read(&pci_bus_sem);
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
@ -2150,6 +2173,7 @@ cleanup:
|
||||
pci_setup_bridge(bridge->subordinate);
|
||||
}
|
||||
free_list(&saved);
|
||||
up_read(&pci_bus_sem);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -2755,7 +2755,7 @@ static int tsi721_probe(struct pci_dev *pdev,
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
tsi_debug(INIT, &pdev->dev, "res%d %pR",
|
||||
i, &pdev->resource[i]);
|
||||
}
|
||||
|
@ -1186,7 +1186,7 @@ static void pm8001_hw_chip_rst(struct pm8001_hba_info *pm8001_ha)
|
||||
void pm8001_chip_iounmap(struct pm8001_hba_info *pm8001_ha)
|
||||
{
|
||||
s8 bar, logical = 0;
|
||||
for (bar = 0; bar < 6; bar++) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
/*
|
||||
** logical BARs for SPC:
|
||||
** bar 0 and 1 - logical BAR0
|
||||
|
@ -401,7 +401,7 @@ static int pm8001_ioremap(struct pm8001_hba_info *pm8001_ha)
|
||||
|
||||
pdev = pm8001_ha->pdev;
|
||||
/* map pci mem (PMC pci base 0-3)*/
|
||||
for (bar = 0; bar < 6; bar++) {
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
/*
|
||||
** logical BARs for SPC:
|
||||
** bar 0 and 1 - logical BAR0
|
||||
|
@ -13,9 +13,6 @@
|
||||
/* The maximum devices per each type. */
|
||||
#define GASKET_DEV_MAX 256
|
||||
|
||||
/* The number of supported (and possible) PCI BARs. */
|
||||
#define GASKET_NUM_BARS 6
|
||||
|
||||
/* The number of supported Gasket page tables per device. */
|
||||
#define GASKET_MAX_NUM_PAGE_TABLES 1
|
||||
|
||||
|
@ -371,7 +371,7 @@ static int gasket_setup_pci(struct pci_dev *pci_dev,
|
||||
{
|
||||
int i, mapped_bars, ret;
|
||||
|
||||
for (i = 0; i < GASKET_NUM_BARS; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
ret = gasket_map_pci_bar(gasket_dev, i);
|
||||
if (ret) {
|
||||
mapped_bars = i;
|
||||
@ -393,7 +393,7 @@ static void gasket_cleanup_pci(struct gasket_dev *gasket_dev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < GASKET_NUM_BARS; i++)
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++)
|
||||
gasket_unmap_pci_bar(gasket_dev, i);
|
||||
}
|
||||
|
||||
@ -493,7 +493,7 @@ static ssize_t gasket_sysfs_data_show(struct device *device,
|
||||
(enum gasket_sysfs_attribute_type)gasket_attr->data.attr_type;
|
||||
switch (sysfs_type) {
|
||||
case ATTR_BAR_OFFSETS:
|
||||
for (i = 0; i < GASKET_NUM_BARS; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
bar_desc = &driver_desc->bar_descriptions[i];
|
||||
if (bar_desc->size == 0)
|
||||
continue;
|
||||
@ -505,7 +505,7 @@ static ssize_t gasket_sysfs_data_show(struct device *device,
|
||||
}
|
||||
break;
|
||||
case ATTR_BAR_SIZES:
|
||||
for (i = 0; i < GASKET_NUM_BARS; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
bar_desc = &driver_desc->bar_descriptions[i];
|
||||
if (bar_desc->size == 0)
|
||||
continue;
|
||||
@ -556,7 +556,7 @@ static ssize_t gasket_sysfs_data_show(struct device *device,
|
||||
ret = snprintf(buf, PAGE_SIZE, "%d\n", gasket_dev->reset_count);
|
||||
break;
|
||||
case ATTR_USER_MEM_RANGES:
|
||||
for (i = 0; i < GASKET_NUM_BARS; ++i) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; ++i) {
|
||||
current_written =
|
||||
gasket_write_mappable_regions(buf, driver_desc,
|
||||
i);
|
||||
@ -736,7 +736,7 @@ static int gasket_get_bar_index(const struct gasket_dev *gasket_dev,
|
||||
const struct gasket_driver_desc *driver_desc;
|
||||
|
||||
driver_desc = gasket_dev->internal_desc->driver_desc;
|
||||
for (i = 0; i < GASKET_NUM_BARS; ++i) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; ++i) {
|
||||
struct gasket_bar_desc bar_desc =
|
||||
driver_desc->bar_descriptions[i];
|
||||
|
||||
|
@ -268,7 +268,7 @@ struct gasket_dev {
|
||||
char kobj_name[GASKET_NAME_MAX];
|
||||
|
||||
/* Virtual address of mapped BAR memory range. */
|
||||
struct gasket_bar_data bar_data[GASKET_NUM_BARS];
|
||||
struct gasket_bar_data bar_data[PCI_STD_NUM_BARS];
|
||||
|
||||
/* Coherent buffer. */
|
||||
struct gasket_coherent_buffer coherent_buffer;
|
||||
@ -369,7 +369,7 @@ struct gasket_driver_desc {
|
||||
/* Set of 6 bar descriptions that describe all PCIe bars.
|
||||
* Note that BUS/AXI devices (i.e. non PCI devices) use those.
|
||||
*/
|
||||
struct gasket_bar_desc bar_descriptions[GASKET_NUM_BARS];
|
||||
struct gasket_bar_desc bar_descriptions[PCI_STD_NUM_BARS];
|
||||
|
||||
/*
|
||||
* Coherent buffer description.
|
||||
|
@ -48,8 +48,6 @@ struct f815xxa_data {
|
||||
int idx;
|
||||
};
|
||||
|
||||
#define PCI_NUM_BAR_RESOURCES 6
|
||||
|
||||
struct serial_private {
|
||||
struct pci_dev *dev;
|
||||
unsigned int nr;
|
||||
@ -89,7 +87,7 @@ setup_port(struct serial_private *priv, struct uart_8250_port *port,
|
||||
{
|
||||
struct pci_dev *dev = priv->dev;
|
||||
|
||||
if (bar >= PCI_NUM_BAR_RESOURCES)
|
||||
if (bar >= PCI_STD_NUM_BARS)
|
||||
return -EINVAL;
|
||||
|
||||
if (pci_resource_flags(dev, bar) & IORESOURCE_MEM) {
|
||||
@ -4060,7 +4058,7 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
||||
return -ENODEV;
|
||||
|
||||
num_iomem = num_port = 0;
|
||||
for (i = 0; i < PCI_NUM_BAR_RESOURCES; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_flags(dev, i) & IORESOURCE_IO) {
|
||||
num_port++;
|
||||
if (first_port == -1)
|
||||
@ -4088,7 +4086,7 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
||||
*/
|
||||
first_port = -1;
|
||||
num_port = 0;
|
||||
for (i = 0; i < PCI_NUM_BAR_RESOURCES; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_flags(dev, i) & IORESOURCE_IO &&
|
||||
pci_resource_len(dev, i) == 8 &&
|
||||
(first_port == -1 || (first_port + num_port) == i)) {
|
||||
|
@ -234,7 +234,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
/* UHCI */
|
||||
int region;
|
||||
|
||||
for (region = 0; region < PCI_ROM_RESOURCE; region++) {
|
||||
for (region = 0; region < PCI_STD_NUM_BARS; region++) {
|
||||
if (!(pci_resource_flags(dev, region) &
|
||||
IORESOURCE_IO))
|
||||
continue;
|
||||
|
@ -728,7 +728,7 @@ static void quirk_usb_handoff_uhci(struct pci_dev *pdev)
|
||||
if (!pio_enabled(pdev))
|
||||
return;
|
||||
|
||||
for (i = 0; i < PCI_ROM_RESOURCE; i++)
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++)
|
||||
if ((pci_resource_flags(pdev, i) & IORESOURCE_IO)) {
|
||||
base = pci_resource_start(pdev, i);
|
||||
break;
|
||||
|
@ -110,13 +110,15 @@ static inline bool vfio_pci_is_vga(struct pci_dev *pdev)
|
||||
static void vfio_pci_probe_mmaps(struct vfio_pci_device *vdev)
|
||||
{
|
||||
struct resource *res;
|
||||
int bar;
|
||||
int i;
|
||||
struct vfio_pci_dummy_resource *dummy_res;
|
||||
|
||||
INIT_LIST_HEAD(&vdev->dummy_resources_list);
|
||||
|
||||
for (bar = PCI_STD_RESOURCES; bar <= PCI_STD_RESOURCE_END; bar++) {
|
||||
res = vdev->pdev->resource + bar;
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
int bar = i + PCI_STD_RESOURCES;
|
||||
|
||||
res = &vdev->pdev->resource[bar];
|
||||
|
||||
if (!IS_ENABLED(CONFIG_VFIO_PCI_MMAP))
|
||||
goto no_mmap;
|
||||
@ -399,7 +401,8 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev)
|
||||
|
||||
vfio_config_free(vdev);
|
||||
|
||||
for (bar = PCI_STD_RESOURCES; bar <= PCI_STD_RESOURCE_END; bar++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
bar = i + PCI_STD_RESOURCES;
|
||||
if (!vdev->barmap[bar])
|
||||
continue;
|
||||
pci_iounmap(pdev, vdev->barmap[bar]);
|
||||
|
@ -450,30 +450,32 @@ static void vfio_bar_fixup(struct vfio_pci_device *vdev)
|
||||
{
|
||||
struct pci_dev *pdev = vdev->pdev;
|
||||
int i;
|
||||
__le32 *bar;
|
||||
__le32 *vbar;
|
||||
u64 mask;
|
||||
|
||||
bar = (__le32 *)&vdev->vconfig[PCI_BASE_ADDRESS_0];
|
||||
vbar = (__le32 *)&vdev->vconfig[PCI_BASE_ADDRESS_0];
|
||||
|
||||
for (i = PCI_STD_RESOURCES; i <= PCI_STD_RESOURCE_END; i++, bar++) {
|
||||
if (!pci_resource_start(pdev, i)) {
|
||||
*bar = 0; /* Unmapped by host = unimplemented to user */
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++, vbar++) {
|
||||
int bar = i + PCI_STD_RESOURCES;
|
||||
|
||||
if (!pci_resource_start(pdev, bar)) {
|
||||
*vbar = 0; /* Unmapped by host = unimplemented to user */
|
||||
continue;
|
||||
}
|
||||
|
||||
mask = ~(pci_resource_len(pdev, i) - 1);
|
||||
mask = ~(pci_resource_len(pdev, bar) - 1);
|
||||
|
||||
*bar &= cpu_to_le32((u32)mask);
|
||||
*bar |= vfio_generate_bar_flags(pdev, i);
|
||||
*vbar &= cpu_to_le32((u32)mask);
|
||||
*vbar |= vfio_generate_bar_flags(pdev, bar);
|
||||
|
||||
if (*bar & cpu_to_le32(PCI_BASE_ADDRESS_MEM_TYPE_64)) {
|
||||
bar++;
|
||||
*bar &= cpu_to_le32((u32)(mask >> 32));
|
||||
if (*vbar & cpu_to_le32(PCI_BASE_ADDRESS_MEM_TYPE_64)) {
|
||||
vbar++;
|
||||
*vbar &= cpu_to_le32((u32)(mask >> 32));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
bar = (__le32 *)&vdev->vconfig[PCI_ROM_ADDRESS];
|
||||
vbar = (__le32 *)&vdev->vconfig[PCI_ROM_ADDRESS];
|
||||
|
||||
/*
|
||||
* NB. REGION_INFO will have reported zero size if we weren't able
|
||||
@ -483,14 +485,14 @@ static void vfio_bar_fixup(struct vfio_pci_device *vdev)
|
||||
if (pci_resource_start(pdev, PCI_ROM_RESOURCE)) {
|
||||
mask = ~(pci_resource_len(pdev, PCI_ROM_RESOURCE) - 1);
|
||||
mask |= PCI_ROM_ADDRESS_ENABLE;
|
||||
*bar &= cpu_to_le32((u32)mask);
|
||||
*vbar &= cpu_to_le32((u32)mask);
|
||||
} else if (pdev->resource[PCI_ROM_RESOURCE].flags &
|
||||
IORESOURCE_ROM_SHADOW) {
|
||||
mask = ~(0x20000 - 1);
|
||||
mask |= PCI_ROM_ADDRESS_ENABLE;
|
||||
*bar &= cpu_to_le32((u32)mask);
|
||||
*vbar &= cpu_to_le32((u32)mask);
|
||||
} else
|
||||
*bar = 0;
|
||||
*vbar = 0;
|
||||
|
||||
vdev->bardirty = false;
|
||||
}
|
||||
|
@ -86,8 +86,8 @@ struct vfio_pci_reflck {
|
||||
|
||||
struct vfio_pci_device {
|
||||
struct pci_dev *pdev;
|
||||
void __iomem *barmap[PCI_STD_RESOURCE_END + 1];
|
||||
bool bar_mmap_supported[PCI_STD_RESOURCE_END + 1];
|
||||
void __iomem *barmap[PCI_STD_NUM_BARS];
|
||||
bool bar_mmap_supported[PCI_STD_NUM_BARS];
|
||||
u8 *pci_config_map;
|
||||
u8 *vconfig;
|
||||
struct perm_bits *msi_perm;
|
||||
|
@ -1774,7 +1774,7 @@ int remove_conflicting_pci_framebuffers(struct pci_dev *pdev, int res_id, const
|
||||
int err, idx, bar;
|
||||
bool res_id_found = false;
|
||||
|
||||
for (idx = 0, bar = 0; bar < PCI_ROM_RESOURCE; bar++) {
|
||||
for (idx = 0, bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM))
|
||||
continue;
|
||||
idx++;
|
||||
@ -1784,7 +1784,7 @@ int remove_conflicting_pci_framebuffers(struct pci_dev *pdev, int res_id, const
|
||||
if (!ap)
|
||||
return -ENOMEM;
|
||||
|
||||
for (idx = 0, bar = 0; bar < PCI_ROM_RESOURCE; bar++) {
|
||||
for (idx = 0, bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
|
||||
if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM))
|
||||
continue;
|
||||
ap->ranges[idx].base = pci_resource_start(pdev, bar);
|
||||
|
@ -653,7 +653,7 @@ static void efifb_fixup_resources(struct pci_dev *dev)
|
||||
if (!base)
|
||||
return;
|
||||
|
||||
for (i = 0; i <= PCI_STD_RESOURCE_END; i++) {
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
struct resource *res = &dev->resource[i];
|
||||
|
||||
if (!(res->flags & IORESOURCE_MEM))
|
||||
|
@ -117,7 +117,7 @@ struct pci_epc_features {
|
||||
unsigned int msix_capable : 1;
|
||||
u8 reserved_bar;
|
||||
u8 bar_fixed_64bit;
|
||||
u64 bar_fixed_size[BAR_5 + 1];
|
||||
u64 bar_fixed_size[PCI_STD_NUM_BARS];
|
||||
size_t align;
|
||||
};
|
||||
|
||||
|
@ -82,7 +82,7 @@ enum pci_mmap_state {
|
||||
enum {
|
||||
/* #0-5: standard PCI resources */
|
||||
PCI_STD_RESOURCES,
|
||||
PCI_STD_RESOURCE_END = 5,
|
||||
PCI_STD_RESOURCE_END = PCI_STD_RESOURCES + PCI_STD_NUM_BARS - 1,
|
||||
|
||||
/* #6: expansion ROM resource */
|
||||
PCI_ROM_RESOURCE,
|
||||
|
@ -34,6 +34,7 @@
|
||||
* of which the first 64 bytes are standardized as follows:
|
||||
*/
|
||||
#define PCI_STD_HEADER_SIZEOF 64
|
||||
#define PCI_STD_NUM_BARS 6 /* Number of standard BARs */
|
||||
#define PCI_VENDOR_ID 0x00 /* 16 bits */
|
||||
#define PCI_DEVICE_ID 0x02 /* 16 bits */
|
||||
#define PCI_COMMAND 0x04 /* 16 bits */
|
||||
|
@ -262,7 +262,7 @@ EXPORT_SYMBOL(devm_ioport_unmap);
|
||||
/*
|
||||
* PCI iomap devres
|
||||
*/
|
||||
#define PCIM_IOMAP_MAX PCI_ROM_RESOURCE
|
||||
#define PCIM_IOMAP_MAX PCI_STD_NUM_BARS
|
||||
|
||||
struct pcim_iomap_devres {
|
||||
void __iomem *table[PCIM_IOMAP_MAX];
|
||||
|
Loading…
Reference in New Issue
Block a user