mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
Merge branch 'irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (76 commits) x86, apic: Fix dummy apic read operation together with broken MP handling x86, apic: Restore irqs on fail paths x86: Print real IOAPIC version for x86-64 x86: enable_update_mptable should be a macro sparseirq: Allow early irq_desc allocation x86, io-apic: Don't mark pin_programmed early x86, irq: don't call mp_config_acpi_gsi() if update_mptable is not enabled x86, irq: update_mptable needs pci_routeirq x86: don't call read_apic_id if !cpu_has_apic x86, apic: introduce io_apic_irq_attr x86/pci: add 4 more return parameters to IO_APIC_get_PCI_irq_vector(), fix x86: read apic ID in the !acpi_lapic case x86: apic: Fixmap apic address even if apic disabled x86: display extended apic registers with print_local_APIC and cpu_debug code x86: read apic ID in the !acpi_lapic case x86: clean up and fix setup_clear/force_cpu_cap handling x86: apic: Check rev 3 fadt correctly for physical_apic bit x86/pci: update pirq_enable_irq() to setup io apic routing x86/acpi: move setup io apic routing out of CONFIG_ACPI scope x86/pci: add 4 more return parameters to IO_APIC_get_PCI_irq_vector() ...
This commit is contained in:
commit
f0d5e12bd4
80 changed files with 1262 additions and 1325 deletions
|
|
@ -153,45 +153,47 @@ int ibmphp_init_devno(struct slot **cur_slot)
|
|||
return -1;
|
||||
}
|
||||
for (loop = 0; loop < len; loop++) {
|
||||
if ((*cur_slot)->number == rtable->slots[loop].slot) {
|
||||
if ((*cur_slot)->bus == rtable->slots[loop].bus) {
|
||||
if ((*cur_slot)->number == rtable->slots[loop].slot &&
|
||||
(*cur_slot)->bus == rtable->slots[loop].bus) {
|
||||
struct io_apic_irq_attr irq_attr;
|
||||
|
||||
(*cur_slot)->device = PCI_SLOT(rtable->slots[loop].devfn);
|
||||
for (i = 0; i < 4; i++)
|
||||
(*cur_slot)->irq[i] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot)->bus,
|
||||
(int) (*cur_slot)->device, i);
|
||||
(int) (*cur_slot)->device, i,
|
||||
&irq_attr);
|
||||
|
||||
debug("(*cur_slot)->irq[0] = %x\n",
|
||||
(*cur_slot)->irq[0]);
|
||||
debug("(*cur_slot)->irq[1] = %x\n",
|
||||
(*cur_slot)->irq[1]);
|
||||
debug("(*cur_slot)->irq[2] = %x\n",
|
||||
(*cur_slot)->irq[2]);
|
||||
debug("(*cur_slot)->irq[3] = %x\n",
|
||||
(*cur_slot)->irq[3]);
|
||||
debug("(*cur_slot)->irq[0] = %x\n",
|
||||
(*cur_slot)->irq[0]);
|
||||
debug("(*cur_slot)->irq[1] = %x\n",
|
||||
(*cur_slot)->irq[1]);
|
||||
debug("(*cur_slot)->irq[2] = %x\n",
|
||||
(*cur_slot)->irq[2]);
|
||||
debug("(*cur_slot)->irq[3] = %x\n",
|
||||
(*cur_slot)->irq[3]);
|
||||
|
||||
debug("rtable->exlusive_irqs = %x\n",
|
||||
debug("rtable->exlusive_irqs = %x\n",
|
||||
rtable->exclusive_irqs);
|
||||
debug("rtable->slots[loop].irq[0].bitmap = %x\n",
|
||||
debug("rtable->slots[loop].irq[0].bitmap = %x\n",
|
||||
rtable->slots[loop].irq[0].bitmap);
|
||||
debug("rtable->slots[loop].irq[1].bitmap = %x\n",
|
||||
debug("rtable->slots[loop].irq[1].bitmap = %x\n",
|
||||
rtable->slots[loop].irq[1].bitmap);
|
||||
debug("rtable->slots[loop].irq[2].bitmap = %x\n",
|
||||
debug("rtable->slots[loop].irq[2].bitmap = %x\n",
|
||||
rtable->slots[loop].irq[2].bitmap);
|
||||
debug("rtable->slots[loop].irq[3].bitmap = %x\n",
|
||||
debug("rtable->slots[loop].irq[3].bitmap = %x\n",
|
||||
rtable->slots[loop].irq[3].bitmap);
|
||||
|
||||
debug("rtable->slots[loop].irq[0].link = %x\n",
|
||||
debug("rtable->slots[loop].irq[0].link = %x\n",
|
||||
rtable->slots[loop].irq[0].link);
|
||||
debug("rtable->slots[loop].irq[1].link = %x\n",
|
||||
debug("rtable->slots[loop].irq[1].link = %x\n",
|
||||
rtable->slots[loop].irq[1].link);
|
||||
debug("rtable->slots[loop].irq[2].link = %x\n",
|
||||
debug("rtable->slots[loop].irq[2].link = %x\n",
|
||||
rtable->slots[loop].irq[2].link);
|
||||
debug("rtable->slots[loop].irq[3].link = %x\n",
|
||||
debug("rtable->slots[loop].irq[3].link = %x\n",
|
||||
rtable->slots[loop].irq[3].link);
|
||||
debug("end of init_devno\n");
|
||||
kfree(rtable);
|
||||
return 0;
|
||||
}
|
||||
debug("end of init_devno\n");
|
||||
kfree(rtable);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update)
|
|||
int max_irq;
|
||||
int pos;
|
||||
int irq;
|
||||
int node;
|
||||
|
||||
pos = pci_find_ht_capability(dev, HT_CAPTYPE_IRQ);
|
||||
if (!pos)
|
||||
|
|
@ -125,7 +126,8 @@ int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update)
|
|||
cfg->msg.address_lo = 0xffffffff;
|
||||
cfg->msg.address_hi = 0xffffffff;
|
||||
|
||||
irq = create_irq();
|
||||
node = dev_to_node(&dev->dev);
|
||||
irq = create_irq_nr(0, node);
|
||||
|
||||
if (irq <= 0) {
|
||||
kfree(cfg);
|
||||
|
|
|
|||
|
|
@ -1972,15 +1972,6 @@ static int __init init_dmars(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_INTR_REMAP
|
||||
if (!intr_remapping_enabled) {
|
||||
ret = enable_intr_remapping(0);
|
||||
if (ret)
|
||||
printk(KERN_ERR
|
||||
"IOMMU: enable interrupt remapping failed\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* For each rmrr
|
||||
* for each dev attached to rmrr
|
||||
|
|
|
|||
|
|
@ -15,6 +15,14 @@ static struct ioapic_scope ir_ioapic[MAX_IO_APICS];
|
|||
static int ir_ioapic_num;
|
||||
int intr_remapping_enabled;
|
||||
|
||||
static int disable_intremap;
|
||||
static __init int setup_nointremap(char *str)
|
||||
{
|
||||
disable_intremap = 1;
|
||||
return 0;
|
||||
}
|
||||
early_param("nointremap", setup_nointremap);
|
||||
|
||||
struct irq_2_iommu {
|
||||
struct intel_iommu *iommu;
|
||||
u16 irte_index;
|
||||
|
|
@ -23,15 +31,12 @@ struct irq_2_iommu {
|
|||
};
|
||||
|
||||
#ifdef CONFIG_GENERIC_HARDIRQS
|
||||
static struct irq_2_iommu *get_one_free_irq_2_iommu(int cpu)
|
||||
static struct irq_2_iommu *get_one_free_irq_2_iommu(int node)
|
||||
{
|
||||
struct irq_2_iommu *iommu;
|
||||
int node;
|
||||
|
||||
node = cpu_to_node(cpu);
|
||||
|
||||
iommu = kzalloc_node(sizeof(*iommu), GFP_ATOMIC, node);
|
||||
printk(KERN_DEBUG "alloc irq_2_iommu on cpu %d node %d\n", cpu, node);
|
||||
printk(KERN_DEBUG "alloc irq_2_iommu on node %d\n", node);
|
||||
|
||||
return iommu;
|
||||
}
|
||||
|
|
@ -48,7 +53,7 @@ static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
|
|||
return desc->irq_2_iommu;
|
||||
}
|
||||
|
||||
static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu)
|
||||
static struct irq_2_iommu *irq_2_iommu_alloc_node(unsigned int irq, int node)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
struct irq_2_iommu *irq_iommu;
|
||||
|
|
@ -56,7 +61,7 @@ static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu)
|
|||
/*
|
||||
* alloc irq desc if not allocated already.
|
||||
*/
|
||||
desc = irq_to_desc_alloc_cpu(irq, cpu);
|
||||
desc = irq_to_desc_alloc_node(irq, node);
|
||||
if (!desc) {
|
||||
printk(KERN_INFO "can not get irq_desc for %d\n", irq);
|
||||
return NULL;
|
||||
|
|
@ -65,14 +70,14 @@ static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu)
|
|||
irq_iommu = desc->irq_2_iommu;
|
||||
|
||||
if (!irq_iommu)
|
||||
desc->irq_2_iommu = get_one_free_irq_2_iommu(cpu);
|
||||
desc->irq_2_iommu = get_one_free_irq_2_iommu(node);
|
||||
|
||||
return desc->irq_2_iommu;
|
||||
}
|
||||
|
||||
static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
|
||||
{
|
||||
return irq_2_iommu_alloc_cpu(irq, boot_cpu_id);
|
||||
return irq_2_iommu_alloc_node(irq, cpu_to_node(boot_cpu_id));
|
||||
}
|
||||
|
||||
#else /* !CONFIG_SPARSE_IRQ */
|
||||
|
|
@ -423,20 +428,6 @@ static void iommu_set_intr_remapping(struct intel_iommu *iommu, int mode)
|
|||
readl, (sts & DMA_GSTS_IRTPS), sts);
|
||||
spin_unlock_irqrestore(&iommu->register_lock, flags);
|
||||
|
||||
if (mode == 0) {
|
||||
spin_lock_irqsave(&iommu->register_lock, flags);
|
||||
|
||||
/* enable comaptiblity format interrupt pass through */
|
||||
cmd = iommu->gcmd | DMA_GCMD_CFI;
|
||||
iommu->gcmd |= DMA_GCMD_CFI;
|
||||
writel(cmd, iommu->reg + DMAR_GCMD_REG);
|
||||
|
||||
IOMMU_WAIT_OP(iommu, DMAR_GSTS_REG,
|
||||
readl, (sts & DMA_GSTS_CFIS), sts);
|
||||
|
||||
spin_unlock_irqrestore(&iommu->register_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* global invalidation of interrupt entry cache before enabling
|
||||
* interrupt-remapping.
|
||||
|
|
@ -516,6 +507,23 @@ end:
|
|||
spin_unlock_irqrestore(&iommu->register_lock, flags);
|
||||
}
|
||||
|
||||
int __init intr_remapping_supported(void)
|
||||
{
|
||||
struct dmar_drhd_unit *drhd;
|
||||
|
||||
if (disable_intremap)
|
||||
return 0;
|
||||
|
||||
for_each_drhd_unit(drhd) {
|
||||
struct intel_iommu *iommu = drhd->iommu;
|
||||
|
||||
if (!ecap_ir_support(iommu->ecap))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int __init enable_intr_remapping(int eim)
|
||||
{
|
||||
struct dmar_drhd_unit *drhd;
|
||||
|
|
|
|||
Loading…
Reference in a new issue