cregit-Linux how code gets into the kernel

Release 4.10 drivers/iommu/irq_remapping.c

Directory: drivers/iommu
#include <linux/seq_file.h>
#include <linux/cpumask.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/msi.h>
#include <linux/irq.h>
#include <linux/pci.h>
#include <linux/irqdomain.h>

#include <asm/hw_irq.h>
#include <asm/irq_remapping.h>
#include <asm/processor.h>
#include <asm/x86_init.h>
#include <asm/apic.h>
#include <asm/hpet.h>

#include "irq_remapping.h"


int irq_remapping_enabled;

int irq_remap_broken;

int disable_sourceid_checking;

int no_x2apic_optout;


int disable_irq_post = 0;


static int disable_irq_remap;

static struct irq_remap_ops *remap_ops;


static void irq_remapping_disable_io_apic(void) { /* * With interrupt-remapping, for now we will use virtual wire A * mode, as virtual wire B is little complex (need to configure * both IOAPIC RTE as well as interrupt-remapping table entry). * As this gets called during crash dump, keep this simple for * now. */ if (boot_cpu_has(X86_FEATURE_APIC) || apic_from_smp_config()) disconnect_bsp_APIC(0); }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel1041.67%133.33%
jiang liujiang liu1041.67%133.33%
borislav petkovborislav petkov416.67%133.33%
Total24100.00%3100.00%


static void __init irq_remapping_modify_x86_ops(void) { x86_io_apic_ops.disable = irq_remapping_disable_io_apic; }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel15100.00%1100.00%
Total15100.00%1100.00%


static __init int setup_nointremap(char *str) { disable_irq_remap = 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel1794.44%150.00%
suresh siddhasuresh siddha15.56%150.00%
Total18100.00%2100.00%

early_param("nointremap", setup_nointremap);
static __init int setup_irqremap(char *str) { if (!str) return -EINVAL; while (*str) { if (!strncmp(str, "on", 2)) { disable_irq_remap = 0; disable_irq_post = 0; } else if (!strncmp(str, "off", 3)) { disable_irq_remap = 1; disable_irq_post = 1; } else if (!strncmp(str, "nosid", 5)) disable_sourceid_checking = 1; else if (!strncmp(str, "no_x2apic_optout", 16)) no_x2apic_optout = 1; else if (!strncmp(str, "nopost", 6)) disable_irq_post = 1; str += strcspn(str, ","); while (*str == ',') str++; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel11377.93%133.33%
feng wufeng wu2920.00%133.33%
suresh siddhasuresh siddha32.07%133.33%
Total145100.00%3100.00%

early_param("intremap", setup_irqremap);
void set_irq_remapping_broken(void) { irq_remap_broken = 1; }

Contributors

PersonTokensPropCommitsCommitProp
neil hormanneil horman11100.00%1100.00%
Total11100.00%1100.00%


bool irq_remapping_cap(enum irq_remap_cap cap) { if (!remap_ops || disable_irq_post) return false; return (remap_ops->capability & (1 << cap)); }

Contributors

PersonTokensPropCommitsCommitProp
feng wufeng wu3196.88%150.00%
joerg roedeljoerg roedel13.12%150.00%
Total32100.00%2100.00%

EXPORT_SYMBOL_GPL(irq_remapping_cap);
int __init irq_remapping_prepare(void) { if (disable_irq_remap) return -ENOSYS; if (intel_irq_remap_ops.prepare() == 0) remap_ops = &intel_irq_remap_ops; else if (IS_ENABLED(CONFIG_AMD_IOMMU) && amd_iommu_irq_ops.prepare() == 0) remap_ops = &amd_iommu_irq_ops; else return -ENOSYS; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jiang liujiang liu2339.66%240.00%
joerg roedeljoerg roedel1831.03%120.00%
thomas gleixnerthomas gleixner1525.86%120.00%
suresh siddhasuresh siddha23.45%120.00%
Total58100.00%5100.00%


int __init irq_remapping_enable(void) { int ret; if (!remap_ops->enable) return -ENODEV; ret = remap_ops->enable(); if (irq_remapping_enabled) irq_remapping_modify_x86_ops(); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel3692.31%266.67%
suresh siddhasuresh siddha37.69%133.33%
Total39100.00%3100.00%


void irq_remapping_disable(void) { if (irq_remapping_enabled && remap_ops->disable) remap_ops->disable(); }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel1680.00%250.00%
suresh siddhasuresh siddha315.00%125.00%
jiang liujiang liu15.00%125.00%
Total20100.00%4100.00%


int irq_remapping_reenable(int mode) { if (irq_remapping_enabled && remap_ops->reenable) return remap_ops->reenable(mode); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel2074.07%250.00%
jiang liujiang liu414.81%125.00%
suresh siddhasuresh siddha311.11%125.00%
Total27100.00%4100.00%


int __init irq_remap_enable_fault_handling(void) { if (!irq_remapping_enabled) return 0; if (!remap_ops->enable_faulting) return -ENODEV; return remap_ops->enable_faulting(); }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel3296.97%266.67%
suresh siddhasuresh siddha13.03%133.33%
Total33100.00%3100.00%


void panic_if_irq_remap(const char *msg) { if (irq_remapping_enabled) panic(msg); }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel19100.00%1100.00%
Total19100.00%1100.00%


void ir_ack_apic_edge(struct irq_data *data) { ack_APIC_irq(); }

Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel13100.00%1100.00%
Total13100.00%1100.00%

/** * irq_remapping_get_ir_irq_domain - Get the irqdomain associated with the IOMMU * device serving request @info * @info: interrupt allocation information, used to identify the IOMMU device * * It's used to get parent irqdomain for HPET and IOAPIC irqdomains. * Returns pointer to IRQ domain, or NULL on failure. */
struct irq_domain * irq_remapping_get_ir_irq_domain(struct irq_alloc_info *info) { if (!remap_ops || !remap_ops->get_ir_irq_domain) return NULL; return remap_ops->get_ir_irq_domain(info); }

Contributors

PersonTokensPropCommitsCommitProp
jiang liujiang liu33100.00%1100.00%
Total33100.00%1100.00%

/** * irq_remapping_get_irq_domain - Get the irqdomain serving the request @info * @info: interrupt allocation information, used to identify the IOMMU device * * There will be one PCI MSI/MSIX irqdomain associated with each interrupt * remapping device, so this interface is used to retrieve the PCI MSI/MSIX * irqdomain serving request @info. * Returns pointer to IRQ domain, or NULL on failure. */
struct irq_domain * irq_remapping_get_irq_domain(struct irq_alloc_info *info) { if (!remap_ops || !remap_ops->get_irq_domain) return NULL; return remap_ops->get_irq_domain(info); }

Contributors

PersonTokensPropCommitsCommitProp
jiang liujiang liu33100.00%1100.00%
Total33100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
joerg roedeljoerg roedel37861.36%936.00%
jiang liujiang liu11318.34%728.00%
feng wufeng wu7011.36%312.00%
suresh siddhasuresh siddha193.08%28.00%
thomas gleixnerthomas gleixner152.44%14.00%
neil hormanneil horman142.27%14.00%
borislav petkovborislav petkov40.65%14.00%
wang yijingwang yijing30.49%14.00%
Total616100.00%25100.00%
Directory: drivers/iommu
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.