Skip to content
Snippets Groups Projects
Select Git revision
  • 3c6e567509ed4e60593b1683a1e557c34e503be6
  • openEuler-1.0-LTS default protected
  • openEuler-22.09
  • OLK-5.10
  • openEuler-22.03-LTS
  • openEuler-22.03-LTS-Ascend
  • master
  • openEuler-22.03-LTS-LoongArch-NW
  • openEuler-22.09-HCK
  • openEuler-20.03-LTS-SP3
  • openEuler-21.09
  • openEuler-21.03
  • openEuler-20.09
  • 4.19.90-2210.5.0
  • 5.10.0-123.0.0
  • 5.10.0-60.63.0
  • 5.10.0-60.62.0
  • 4.19.90-2210.4.0
  • 5.10.0-121.0.0
  • 5.10.0-60.61.0
  • 4.19.90-2210.3.0
  • 5.10.0-60.60.0
  • 5.10.0-120.0.0
  • 5.10.0-60.59.0
  • 5.10.0-119.0.0
  • 4.19.90-2210.2.0
  • 4.19.90-2210.1.0
  • 5.10.0-118.0.0
  • 5.10.0-106.19.0
  • 5.10.0-60.58.0
  • 4.19.90-2209.6.0
  • 5.10.0-106.18.0
  • 5.10.0-106.17.0
33 results

intel_irq_remapping.c

Blame
  • intel_irq_remapping.c 31.21 KiB
    #include <linux/interrupt.h>
    #include <linux/dmar.h>
    #include <linux/spinlock.h>
    #include <linux/slab.h>
    #include <linux/jiffies.h>
    #include <linux/hpet.h>
    #include <linux/pci.h>
    #include <linux/irq.h>
    #include <linux/intel-iommu.h>
    #include <linux/acpi.h>
    #include <linux/irqdomain.h>
    #include <asm/io_apic.h>
    #include <asm/smp.h>
    #include <asm/cpu.h>
    #include <asm/irq_remapping.h>
    #include <asm/pci-direct.h>
    #include <asm/msidef.h>
    
    #include "irq_remapping.h"
    
    struct ioapic_scope {
    	struct intel_iommu *iommu;
    	unsigned int id;
    	unsigned int bus;	/* PCI bus number */
    	unsigned int devfn;	/* PCI devfn number */
    };
    
    struct hpet_scope {
    	struct intel_iommu *iommu;
    	u8 id;
    	unsigned int bus;
    	unsigned int devfn;
    };
    
    struct intel_ir_data {
    	struct irq_2_iommu			irq_2_iommu;
    	struct irte				irte_entry;
    	union {
    		struct msi_msg			msi_entry;
    	};
    };
    
    #define IR_X2APIC_MODE(mode) (mode ? (1 << 11) : 0)
    #define IRTE_DEST(dest) ((eim_mode) ? dest : dest << 8)
    
    static int __read_mostly eim_mode;
    static struct ioapic_scope ir_ioapic[MAX_IO_APICS];
    static struct hpet_scope ir_hpet[MAX_HPET_TBS];
    
    /*
     * Lock ordering:
     * ->dmar_global_lock
     *	->irq_2_ir_lock
     *		->qi->q_lock
     *	->iommu->register_lock
     * Note:
     * intel_irq_remap_ops.{supported,prepare,enable,disable,reenable} are called
     * in single-threaded environment with interrupt disabled, so no need to tabke
     * the dmar_global_lock.
     */
    static DEFINE_RAW_SPINLOCK(irq_2_ir_lock);
    static struct irq_domain_ops intel_ir_domain_ops;
    
    static int __init parse_ioapics_under_ir(void);
    
    static int alloc_irte(struct intel_iommu *iommu, int irq,
    		      struct irq_2_iommu *irq_iommu, u16 count)
    {
    	struct ir_table *table = iommu->ir_table;
    	struct irq_cfg *cfg = irq_cfg(irq);