/* * On 64-bit systems, we do a single ioremap for the whole config space * since we have enough virtual address range available. On 32-bit, we * ioremap the config space for each bus individually.
*/ staticconstbool per_bus_mapping = !IS_ENABLED(CONFIG_64BIT);
/* * Create a PCI config space window * - reserve mem region * - alloc struct pci_config_window with space for all mappings * - ioremap the config space
*/ struct pci_config_window *pci_ecam_create(struct device *dev, struct resource *cfgres, struct resource *busr, conststruct pci_ecam_ops *ops)
{ unsignedint bus_shift = ops->bus_shift; struct pci_config_window *cfg; unsignedint bus_range, bus_range_max, bsz; struct resource *conflict; int err;
if (busr->start > busr->end) return ERR_PTR(-EINVAL);
cfg = kzalloc(sizeof(*cfg), GFP_KERNEL); if (!cfg) return ERR_PTR(-ENOMEM);
/* ECAM-compliant platforms need not supply ops->bus_shift */ if (!bus_shift)
bus_shift = PCIE_ECAM_BUS_SHIFT;
void pci_ecam_free(struct pci_config_window *cfg)
{ int i;
if (per_bus_mapping) { if (cfg->winp) { for (i = 0; i < resource_size(&cfg->busr); i++) if (cfg->winp[i])
iounmap(cfg->winp[i]);
kfree(cfg->winp);
}
} else { if (cfg->win)
iounmap(cfg->win);
} if (cfg->res.parent)
release_resource(&cfg->res);
kfree(cfg);
}
EXPORT_SYMBOL_GPL(pci_ecam_free);
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.12Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.