cregit-Linux how code gets into the kernel

Release 4.10 arch/x86/pci/mmconfig_64.c

Directory: arch/x86/pci
/*
 * mmconfig.c - Low-level direct PCI config space access via MMCONFIG
 *
 * This is an 64bit optimized version that always keeps the full mmconfig
 * space mapped. This allows lockless config space operation.
 */

#include <linux/pci.h>
#include <linux/init.h>
#include <linux/acpi.h>
#include <linux/bitmap.h>
#include <linux/rcupdate.h>
#include <asm/e820.h>
#include <asm/pci_x86.h>


#define PREFIX "PCI: "


static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) { struct pci_mmcfg_region *cfg = pci_mmconfig_lookup(seg, bus); if (cfg && cfg->virt) return cfg->virt + (PCI_MMCFG_BUS_OFFSET(bus) | (devfn << 12)); return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
bjorn helgaasbjorn helgaas2439.34%550.00%
greg kroah-hartmangreg kroah-hartman2236.07%110.00%
andi kleenandi kleen1321.31%220.00%
hirofumi ogawahirofumi ogawa11.64%110.00%
al viroal viro11.64%110.00%
Total61100.00%10100.00%


static int pci_mmcfg_read(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 *value) { char __iomem *addr; /* Why do we have this when nobody checks it. How about a BUG()!? -AK */ if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095))) { err: *value = -1; return -EINVAL; } rcu_read_lock(); addr = pci_dev_base(seg, bus, devfn); if (!addr) { rcu_read_unlock(); goto err; } switch (len) { case 1: *value = mmio_config_readb(addr + reg); break; case 2: *value = mmio_config_readw(addr + reg); break; case 4: *value = mmio_config_readl(addr + reg); break; } rcu_read_unlock(); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen11374.34%337.50%
ivan kokshayskyivan kokshaysky2113.82%112.50%
jiang liujiang liu117.24%112.50%
dean gaudetdean gaudet31.97%112.50%
bjorn helgaasbjorn helgaas31.97%112.50%
al viroal viro10.66%112.50%
Total152100.00%8100.00%


static int pci_mmcfg_write(unsigned int seg, unsigned int bus, unsigned int devfn, int reg, int len, u32 value) { char __iomem *addr; /* Why do we have this when nobody checks it. How about a BUG()!? -AK */ if (unlikely((bus > 255) || (devfn > 255) || (reg > 4095))) return -EINVAL; rcu_read_lock(); addr = pci_dev_base(seg, bus, devfn); if (!addr) { rcu_read_unlock(); return -EINVAL; } switch (len) { case 1: mmio_config_writeb(addr + reg, value); break; case 2: mmio_config_writew(addr + reg, value); break; case 4: mmio_config_writel(addr + reg, value); break; } rcu_read_unlock(); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen9568.35%228.57%
ivan kokshayskyivan kokshaysky2014.39%114.29%
jiang liujiang liu117.91%114.29%
dean gaudetdean gaudet96.47%114.29%
bjorn helgaasbjorn helgaas32.16%114.29%
al viroal viro10.72%114.29%
Total139100.00%7100.00%

const struct pci_raw_ops pci_mmcfg = { .read = pci_mmcfg_read, .write = pci_mmcfg_write, };
static void __iomem *mcfg_ioremap(struct pci_mmcfg_region *cfg) { void __iomem *addr; u64 start, size; int num_buses; start = cfg->address + PCI_MMCFG_BUS_OFFSET(cfg->start_bus); num_buses = cfg->end_bus - cfg->start_bus + 1; size = PCI_MMCFG_BUS_OFFSET(num_buses); addr = ioremap_nocache(start, size); if (addr) addr -= PCI_MMCFG_BUS_OFFSET(cfg->start_bus); return addr; }

Contributors

PersonTokensPropCommitsCommitProp
hirofumi ogawahirofumi ogawa3845.78%120.00%
bjorn helgaasbjorn helgaas2428.92%360.00%
yinghai luyinghai lu2125.30%120.00%
Total83100.00%5100.00%


int __init pci_mmcfg_arch_init(void) { struct pci_mmcfg_region *cfg; list_for_each_entry(cfg, &pci_mmcfg_list, list) if (pci_mmcfg_arch_map(cfg)) { pci_mmcfg_arch_free(); return 0; } raw_pci_ext_ops = &pci_mmcfg; return 1; }

Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen1534.09%225.00%
bjorn helgaasbjorn helgaas1431.82%225.00%
olivier galibertolivier galibert818.18%112.50%
jiang liujiang liu36.82%112.50%
yinghai luyinghai lu36.82%112.50%
matthew wilcoxmatthew wilcox12.27%112.50%
Total44100.00%8100.00%


void __init pci_mmcfg_arch_free(void) { struct pci_mmcfg_region *cfg; list_for_each_entry(cfg, &pci_mmcfg_list, list) pci_mmcfg_arch_unmap(cfg); }

Contributors

PersonTokensPropCommitsCommitProp
bjorn helgaasbjorn helgaas1350.00%250.00%
yinghai luyinghai lu726.92%125.00%
jiang liujiang liu623.08%125.00%
Total26100.00%4100.00%


int pci_mmcfg_arch_map(struct pci_mmcfg_region *cfg) { cfg->virt = mcfg_ioremap(cfg); if (!cfg->virt) { pr_err(PREFIX "can't map MMCONFIG at %pR\n", &cfg->res); return -ENOMEM; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jiang liujiang liu46100.00%2100.00%
Total46100.00%2100.00%


void pci_mmcfg_arch_unmap(struct pci_mmcfg_region *cfg) { if (cfg && cfg->virt) { iounmap(cfg->virt + PCI_MMCFG_BUS_OFFSET(cfg->start_bus)); cfg->virt = NULL; } }

Contributors

PersonTokensPropCommitsCommitProp
yinghai luyinghai lu1845.00%233.33%
bjorn helgaasbjorn helgaas1230.00%350.00%
jiang liujiang liu1025.00%116.67%
Total40100.00%6100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
andi kleenandi kleen26341.48%413.33%
bjorn helgaasbjorn helgaas9715.30%826.67%
jiang liujiang liu9014.20%310.00%
yinghai luyinghai lu497.73%26.67%
ivan kokshayskyivan kokshaysky416.47%13.33%
hirofumi ogawahirofumi ogawa396.15%26.67%
greg kroah-hartmangreg kroah-hartman253.94%26.67%
dean gaudetdean gaudet121.89%13.33%
olivier galibertolivier galibert81.26%13.33%
al viroal viro30.47%13.33%
arjan van de venarjan van de ven30.47%13.33%
matthew wilcoxmatthew wilcox10.16%13.33%
alexey starikovskiyalexey starikovskiy10.16%13.33%
jaswinder singh rajputjaswinder singh rajput10.16%13.33%
jan beulichjan beulich10.16%13.33%
Total634100.00%30100.00%
Directory: arch/x86/pci
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.