|
@@ -1112,8 +1112,7 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
|
|
|
* 0x80, because int 0x80 is hm, kind of importantish. ;)
|
|
|
*/
|
|
|
static int current_vector = FIRST_EXTERNAL_VECTOR + VECTOR_OFFSET_START;
|
|
|
- static int current_offset = VECTOR_OFFSET_START % 8;
|
|
|
- unsigned int old_vector;
|
|
|
+ static int current_offset = VECTOR_OFFSET_START % 16;
|
|
|
int cpu, err;
|
|
|
cpumask_var_t tmp_mask;
|
|
|
|
|
@@ -1123,35 +1122,45 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
|
|
|
if (!alloc_cpumask_var(&tmp_mask, GFP_ATOMIC))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- old_vector = cfg->vector;
|
|
|
- if (old_vector) {
|
|
|
- cpumask_and(tmp_mask, mask, cpu_online_mask);
|
|
|
- cpumask_and(tmp_mask, cfg->domain, tmp_mask);
|
|
|
- if (!cpumask_empty(tmp_mask)) {
|
|
|
- free_cpumask_var(tmp_mask);
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/* Only try and allocate irqs on cpus that are present */
|
|
|
err = -ENOSPC;
|
|
|
- for_each_cpu_and(cpu, mask, cpu_online_mask) {
|
|
|
- int new_cpu;
|
|
|
- int vector, offset;
|
|
|
+ cpumask_clear(cfg->old_domain);
|
|
|
+ cpu = cpumask_first_and(mask, cpu_online_mask);
|
|
|
+ while (cpu < nr_cpu_ids) {
|
|
|
+ int new_cpu, vector, offset;
|
|
|
|
|
|
- apic->vector_allocation_domain(cpu, tmp_mask);
|
|
|
+ apic->vector_allocation_domain(cpu, tmp_mask, mask);
|
|
|
+
|
|
|
+ if (cpumask_subset(tmp_mask, cfg->domain)) {
|
|
|
+ err = 0;
|
|
|
+ if (cpumask_equal(tmp_mask, cfg->domain))
|
|
|
+ break;
|
|
|
+ /*
|
|
|
+ * New cpumask using the vector is a proper subset of
|
|
|
+ * the current in use mask. So cleanup the vector
|
|
|
+ * allocation for the members that are not used anymore.
|
|
|
+ */
|
|
|
+ cpumask_andnot(cfg->old_domain, cfg->domain, tmp_mask);
|
|
|
+ cfg->move_in_progress = 1;
|
|
|
+ cpumask_and(cfg->domain, cfg->domain, tmp_mask);
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
vector = current_vector;
|
|
|
offset = current_offset;
|
|
|
next:
|
|
|
- vector += 8;
|
|
|
+ vector += 16;
|
|
|
if (vector >= first_system_vector) {
|
|
|
- /* If out of vectors on large boxen, must share them. */
|
|
|
- offset = (offset + 1) % 8;
|
|
|
+ offset = (offset + 1) % 16;
|
|
|
vector = FIRST_EXTERNAL_VECTOR + offset;
|
|
|
}
|
|
|
- if (unlikely(current_vector == vector))
|
|
|
+
|
|
|
+ if (unlikely(current_vector == vector)) {
|
|
|
+ cpumask_or(cfg->old_domain, cfg->old_domain, tmp_mask);
|
|
|
+ cpumask_andnot(tmp_mask, mask, cfg->old_domain);
|
|
|
+ cpu = cpumask_first_and(tmp_mask, cpu_online_mask);
|
|
|
continue;
|
|
|
+ }
|
|
|
|
|
|
if (test_bit(vector, used_vectors))
|
|
|
goto next;
|
|
@@ -1162,7 +1171,7 @@ next:
|
|
|
/* Found one! */
|
|
|
current_vector = vector;
|
|
|
current_offset = offset;
|
|
|
- if (old_vector) {
|
|
|
+ if (cfg->vector) {
|
|
|
cfg->move_in_progress = 1;
|
|
|
cpumask_copy(cfg->old_domain, cfg->domain);
|
|
|
}
|
|
@@ -1346,18 +1355,18 @@ static void setup_ioapic_irq(unsigned int irq, struct irq_cfg *cfg,
|
|
|
|
|
|
if (!IO_APIC_IRQ(irq))
|
|
|
return;
|
|
|
- /*
|
|
|
- * For legacy irqs, cfg->domain starts with cpu 0 for legacy
|
|
|
- * controllers like 8259. Now that IO-APIC can handle this irq, update
|
|
|
- * the cfg->domain.
|
|
|
- */
|
|
|
- if (irq < legacy_pic->nr_legacy_irqs && cpumask_test_cpu(0, cfg->domain))
|
|
|
- apic->vector_allocation_domain(0, cfg->domain);
|
|
|
|
|
|
if (assign_irq_vector(irq, cfg, apic->target_cpus()))
|
|
|
return;
|
|
|
|
|
|
- dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
|
|
|
+ if (apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus(),
|
|
|
+ &dest)) {
|
|
|
+ pr_warn("Failed to obtain apicid for ioapic %d, pin %d\n",
|
|
|
+ mpc_ioapic_id(attr->ioapic), attr->ioapic_pin);
|
|
|
+ __clear_irq_vector(irq, cfg);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
apic_printk(APIC_VERBOSE,KERN_DEBUG
|
|
|
"IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> "
|
|
@@ -1366,7 +1375,7 @@ static void setup_ioapic_irq(unsigned int irq, struct irq_cfg *cfg,
|
|
|
cfg->vector, irq, attr->trigger, attr->polarity, dest);
|
|
|
|
|
|
if (setup_ioapic_entry(irq, &entry, dest, cfg->vector, attr)) {
|
|
|
- pr_warn("Failed to setup ioapic entry for ioapic %d, pin %d\n",
|
|
|
+ pr_warn("Failed to setup ioapic entry for ioapic %d, pin %d\n",
|
|
|
mpc_ioapic_id(attr->ioapic), attr->ioapic_pin);
|
|
|
__clear_irq_vector(irq, cfg);
|
|
|
|
|
@@ -1469,9 +1478,10 @@ void setup_IO_APIC_irq_extra(u32 gsi)
|
|
|
* Set up the timer pin, possibly with the 8259A-master behind.
|
|
|
*/
|
|
|
static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx,
|
|
|
- unsigned int pin, int vector)
|
|
|
+ unsigned int pin, int vector)
|
|
|
{
|
|
|
struct IO_APIC_route_entry entry;
|
|
|
+ unsigned int dest;
|
|
|
|
|
|
if (irq_remapping_enabled)
|
|
|
return;
|
|
@@ -1482,9 +1492,13 @@ static void __init setup_timer_IRQ0_pin(unsigned int ioapic_idx,
|
|
|
* We use logical delivery to get the timer IRQ
|
|
|
* to the first CPU.
|
|
|
*/
|
|
|
+ if (unlikely(apic->cpu_mask_to_apicid_and(apic->target_cpus(),
|
|
|
+ apic->target_cpus(), &dest)))
|
|
|
+ dest = BAD_APICID;
|
|
|
+
|
|
|
entry.dest_mode = apic->irq_dest_mode;
|
|
|
entry.mask = 0; /* don't mask IRQ for edge */
|
|
|
- entry.dest = apic->cpu_mask_to_apicid(apic->target_cpus());
|
|
|
+ entry.dest = dest;
|
|
|
entry.delivery_mode = apic->irq_delivery_mode;
|
|
|
entry.polarity = 0;
|
|
|
entry.trigger = 0;
|
|
@@ -2209,71 +2223,6 @@ void send_cleanup_vector(struct irq_cfg *cfg)
|
|
|
cfg->move_in_progress = 0;
|
|
|
}
|
|
|
|
|
|
-static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
|
|
|
-{
|
|
|
- int apic, pin;
|
|
|
- struct irq_pin_list *entry;
|
|
|
- u8 vector = cfg->vector;
|
|
|
-
|
|
|
- for_each_irq_pin(entry, cfg->irq_2_pin) {
|
|
|
- unsigned int reg;
|
|
|
-
|
|
|
- apic = entry->apic;
|
|
|
- pin = entry->pin;
|
|
|
- /*
|
|
|
- * With interrupt-remapping, destination information comes
|
|
|
- * from interrupt-remapping table entry.
|
|
|
- */
|
|
|
- if (!irq_remapped(cfg))
|
|
|
- io_apic_write(apic, 0x11 + pin*2, dest);
|
|
|
- reg = io_apic_read(apic, 0x10 + pin*2);
|
|
|
- reg &= ~IO_APIC_REDIR_VECTOR_MASK;
|
|
|
- reg |= vector;
|
|
|
- io_apic_modify(apic, 0x10 + pin*2, reg);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * Either sets data->affinity to a valid value, and returns
|
|
|
- * ->cpu_mask_to_apicid of that in dest_id, or returns -1 and
|
|
|
- * leaves data->affinity untouched.
|
|
|
- */
|
|
|
-int __ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
|
|
- unsigned int *dest_id)
|
|
|
-{
|
|
|
- struct irq_cfg *cfg = data->chip_data;
|
|
|
-
|
|
|
- if (!cpumask_intersects(mask, cpu_online_mask))
|
|
|
- return -1;
|
|
|
-
|
|
|
- if (assign_irq_vector(data->irq, data->chip_data, mask))
|
|
|
- return -1;
|
|
|
-
|
|
|
- cpumask_copy(data->affinity, mask);
|
|
|
-
|
|
|
- *dest_id = apic->cpu_mask_to_apicid_and(mask, cfg->domain);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int
|
|
|
-ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
|
|
- bool force)
|
|
|
-{
|
|
|
- unsigned int dest, irq = data->irq;
|
|
|
- unsigned long flags;
|
|
|
- int ret;
|
|
|
-
|
|
|
- raw_spin_lock_irqsave(&ioapic_lock, flags);
|
|
|
- ret = __ioapic_set_affinity(data, mask, &dest);
|
|
|
- if (!ret) {
|
|
|
- /* Only the high 8 bits are valid. */
|
|
|
- dest = SET_APIC_LOGICAL_ID(dest);
|
|
|
- __target_IO_APIC_irq(irq, dest, data->chip_data);
|
|
|
- }
|
|
|
- raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
asmlinkage void smp_irq_move_cleanup_interrupt(void)
|
|
|
{
|
|
|
unsigned vector, me;
|
|
@@ -2361,6 +2310,87 @@ void irq_force_complete_move(int irq)
|
|
|
static inline void irq_complete_move(struct irq_cfg *cfg) { }
|
|
|
#endif
|
|
|
|
|
|
+static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
|
|
|
+{
|
|
|
+ int apic, pin;
|
|
|
+ struct irq_pin_list *entry;
|
|
|
+ u8 vector = cfg->vector;
|
|
|
+
|
|
|
+ for_each_irq_pin(entry, cfg->irq_2_pin) {
|
|
|
+ unsigned int reg;
|
|
|
+
|
|
|
+ apic = entry->apic;
|
|
|
+ pin = entry->pin;
|
|
|
+ /*
|
|
|
+ * With interrupt-remapping, destination information comes
|
|
|
+ * from interrupt-remapping table entry.
|
|
|
+ */
|
|
|
+ if (!irq_remapped(cfg))
|
|
|
+ io_apic_write(apic, 0x11 + pin*2, dest);
|
|
|
+ reg = io_apic_read(apic, 0x10 + pin*2);
|
|
|
+ reg &= ~IO_APIC_REDIR_VECTOR_MASK;
|
|
|
+ reg |= vector;
|
|
|
+ io_apic_modify(apic, 0x10 + pin*2, reg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Either sets data->affinity to a valid value, and returns
|
|
|
+ * ->cpu_mask_to_apicid of that in dest_id, or returns -1 and
|
|
|
+ * leaves data->affinity untouched.
|
|
|
+ */
|
|
|
+int __ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
|
|
+ unsigned int *dest_id)
|
|
|
+{
|
|
|
+ struct irq_cfg *cfg = data->chip_data;
|
|
|
+ unsigned int irq = data->irq;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ if (!config_enabled(CONFIG_SMP))
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (!cpumask_intersects(mask, cpu_online_mask))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ err = assign_irq_vector(irq, cfg, mask);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ err = apic->cpu_mask_to_apicid_and(mask, cfg->domain, dest_id);
|
|
|
+ if (err) {
|
|
|
+ if (assign_irq_vector(irq, cfg, data->affinity))
|
|
|
+ pr_err("Failed to recover vector for irq %d\n", irq);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ cpumask_copy(data->affinity, mask);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
|
|
+ bool force)
|
|
|
+{
|
|
|
+ unsigned int dest, irq = data->irq;
|
|
|
+ unsigned long flags;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!config_enabled(CONFIG_SMP))
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ raw_spin_lock_irqsave(&ioapic_lock, flags);
|
|
|
+ ret = __ioapic_set_affinity(data, mask, &dest);
|
|
|
+ if (!ret) {
|
|
|
+ /* Only the high 8 bits are valid. */
|
|
|
+ dest = SET_APIC_LOGICAL_ID(dest);
|
|
|
+ __target_IO_APIC_irq(irq, dest, data->chip_data);
|
|
|
+ ret = IRQ_SET_MASK_OK_NOCOPY;
|
|
|
+ }
|
|
|
+ raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static void ack_apic_edge(struct irq_data *data)
|
|
|
{
|
|
|
irq_complete_move(data->chip_data);
|
|
@@ -2540,9 +2570,7 @@ static void irq_remap_modify_chip_defaults(struct irq_chip *chip)
|
|
|
chip->irq_ack = ir_ack_apic_edge;
|
|
|
chip->irq_eoi = ir_ack_apic_level;
|
|
|
|
|
|
-#ifdef CONFIG_SMP
|
|
|
chip->irq_set_affinity = set_remapped_irq_affinity;
|
|
|
-#endif
|
|
|
}
|
|
|
#endif /* CONFIG_IRQ_REMAP */
|
|
|
|
|
@@ -2553,9 +2581,7 @@ static struct irq_chip ioapic_chip __read_mostly = {
|
|
|
.irq_unmask = unmask_ioapic_irq,
|
|
|
.irq_ack = ack_apic_edge,
|
|
|
.irq_eoi = ack_apic_level,
|
|
|
-#ifdef CONFIG_SMP
|
|
|
.irq_set_affinity = ioapic_set_affinity,
|
|
|
-#endif
|
|
|
.irq_retrigger = ioapic_retrigger_irq,
|
|
|
};
|
|
|
|
|
@@ -3037,7 +3063,10 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
- dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus());
|
|
|
+ err = apic->cpu_mask_to_apicid_and(cfg->domain,
|
|
|
+ apic->target_cpus(), &dest);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
if (irq_remapped(cfg)) {
|
|
|
compose_remapped_msi_msg(pdev, irq, dest, msg, hpet_id);
|
|
@@ -3071,7 +3100,6 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_SMP
|
|
|
static int
|
|
|
msi_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force)
|
|
|
{
|
|
@@ -3091,9 +3119,8 @@ msi_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force)
|
|
|
|
|
|
__write_msi_msg(data->msi_desc, &msg);
|
|
|
|
|
|
- return 0;
|
|
|
+ return IRQ_SET_MASK_OK_NOCOPY;
|
|
|
}
|
|
|
-#endif /* CONFIG_SMP */
|
|
|
|
|
|
/*
|
|
|
* IRQ Chip for MSI PCI/PCI-X/PCI-Express Devices,
|
|
@@ -3104,9 +3131,7 @@ static struct irq_chip msi_chip = {
|
|
|
.irq_unmask = unmask_msi_irq,
|
|
|
.irq_mask = mask_msi_irq,
|
|
|
.irq_ack = ack_apic_edge,
|
|
|
-#ifdef CONFIG_SMP
|
|
|
.irq_set_affinity = msi_set_affinity,
|
|
|
-#endif
|
|
|
.irq_retrigger = ioapic_retrigger_irq,
|
|
|
};
|
|
|
|
|
@@ -3191,7 +3216,6 @@ void native_teardown_msi_irq(unsigned int irq)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_DMAR_TABLE
|
|
|
-#ifdef CONFIG_SMP
|
|
|
static int
|
|
|
dmar_msi_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
|
|
bool force)
|
|
@@ -3213,19 +3237,15 @@ dmar_msi_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
|
|
|
|
|
dmar_msi_write(irq, &msg);
|
|
|
|
|
|
- return 0;
|
|
|
+ return IRQ_SET_MASK_OK_NOCOPY;
|
|
|
}
|
|
|
|
|
|
-#endif /* CONFIG_SMP */
|
|
|
-
|
|
|
static struct irq_chip dmar_msi_type = {
|
|
|
.name = "DMAR_MSI",
|
|
|
.irq_unmask = dmar_msi_unmask,
|
|
|
.irq_mask = dmar_msi_mask,
|
|
|
.irq_ack = ack_apic_edge,
|
|
|
-#ifdef CONFIG_SMP
|
|
|
.irq_set_affinity = dmar_msi_set_affinity,
|
|
|
-#endif
|
|
|
.irq_retrigger = ioapic_retrigger_irq,
|
|
|
};
|
|
|
|
|
@@ -3246,7 +3266,6 @@ int arch_setup_dmar_msi(unsigned int irq)
|
|
|
|
|
|
#ifdef CONFIG_HPET_TIMER
|
|
|
|
|
|
-#ifdef CONFIG_SMP
|
|
|
static int hpet_msi_set_affinity(struct irq_data *data,
|
|
|
const struct cpumask *mask, bool force)
|
|
|
{
|
|
@@ -3266,19 +3285,15 @@ static int hpet_msi_set_affinity(struct irq_data *data,
|
|
|
|
|
|
hpet_msi_write(data->handler_data, &msg);
|
|
|
|
|
|
- return 0;
|
|
|
+ return IRQ_SET_MASK_OK_NOCOPY;
|
|
|
}
|
|
|
|
|
|
-#endif /* CONFIG_SMP */
|
|
|
-
|
|
|
static struct irq_chip hpet_msi_type = {
|
|
|
.name = "HPET_MSI",
|
|
|
.irq_unmask = hpet_msi_unmask,
|
|
|
.irq_mask = hpet_msi_mask,
|
|
|
.irq_ack = ack_apic_edge,
|
|
|
-#ifdef CONFIG_SMP
|
|
|
.irq_set_affinity = hpet_msi_set_affinity,
|
|
|
-#endif
|
|
|
.irq_retrigger = ioapic_retrigger_irq,
|
|
|
};
|
|
|
|
|
@@ -3313,8 +3328,6 @@ int arch_setup_hpet_msi(unsigned int irq, unsigned int id)
|
|
|
*/
|
|
|
#ifdef CONFIG_HT_IRQ
|
|
|
|
|
|
-#ifdef CONFIG_SMP
|
|
|
-
|
|
|
static void target_ht_irq(unsigned int irq, unsigned int dest, u8 vector)
|
|
|
{
|
|
|
struct ht_irq_msg msg;
|
|
@@ -3339,25 +3352,23 @@ ht_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force)
|
|
|
return -1;
|
|
|
|
|
|
target_ht_irq(data->irq, dest, cfg->vector);
|
|
|
- return 0;
|
|
|
+ return IRQ_SET_MASK_OK_NOCOPY;
|
|
|
}
|
|
|
|
|
|
-#endif
|
|
|
-
|
|
|
static struct irq_chip ht_irq_chip = {
|
|
|
.name = "PCI-HT",
|
|
|
.irq_mask = mask_ht_irq,
|
|
|
.irq_unmask = unmask_ht_irq,
|
|
|
.irq_ack = ack_apic_edge,
|
|
|
-#ifdef CONFIG_SMP
|
|
|
.irq_set_affinity = ht_set_affinity,
|
|
|
-#endif
|
|
|
.irq_retrigger = ioapic_retrigger_irq,
|
|
|
};
|
|
|
|
|
|
int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
|
|
|
{
|
|
|
struct irq_cfg *cfg;
|
|
|
+ struct ht_irq_msg msg;
|
|
|
+ unsigned dest;
|
|
|
int err;
|
|
|
|
|
|
if (disable_apic)
|
|
@@ -3365,36 +3376,37 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
|
|
|
|
|
|
cfg = irq_cfg(irq);
|
|
|
err = assign_irq_vector(irq, cfg, apic->target_cpus());
|
|
|
- if (!err) {
|
|
|
- struct ht_irq_msg msg;
|
|
|
- unsigned dest;
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ err = apic->cpu_mask_to_apicid_and(cfg->domain,
|
|
|
+ apic->target_cpus(), &dest);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
- dest = apic->cpu_mask_to_apicid_and(cfg->domain,
|
|
|
- apic->target_cpus());
|
|
|
+ msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest);
|
|
|
|
|
|
- msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest);
|
|
|
+ msg.address_lo =
|
|
|
+ HT_IRQ_LOW_BASE |
|
|
|
+ HT_IRQ_LOW_DEST_ID(dest) |
|
|
|
+ HT_IRQ_LOW_VECTOR(cfg->vector) |
|
|
|
+ ((apic->irq_dest_mode == 0) ?
|
|
|
+ HT_IRQ_LOW_DM_PHYSICAL :
|
|
|
+ HT_IRQ_LOW_DM_LOGICAL) |
|
|
|
+ HT_IRQ_LOW_RQEOI_EDGE |
|
|
|
+ ((apic->irq_delivery_mode != dest_LowestPrio) ?
|
|
|
+ HT_IRQ_LOW_MT_FIXED :
|
|
|
+ HT_IRQ_LOW_MT_ARBITRATED) |
|
|
|
+ HT_IRQ_LOW_IRQ_MASKED;
|
|
|
|
|
|
- msg.address_lo =
|
|
|
- HT_IRQ_LOW_BASE |
|
|
|
- HT_IRQ_LOW_DEST_ID(dest) |
|
|
|
- HT_IRQ_LOW_VECTOR(cfg->vector) |
|
|
|
- ((apic->irq_dest_mode == 0) ?
|
|
|
- HT_IRQ_LOW_DM_PHYSICAL :
|
|
|
- HT_IRQ_LOW_DM_LOGICAL) |
|
|
|
- HT_IRQ_LOW_RQEOI_EDGE |
|
|
|
- ((apic->irq_delivery_mode != dest_LowestPrio) ?
|
|
|
- HT_IRQ_LOW_MT_FIXED :
|
|
|
- HT_IRQ_LOW_MT_ARBITRATED) |
|
|
|
- HT_IRQ_LOW_IRQ_MASKED;
|
|
|
+ write_ht_irq_msg(irq, &msg);
|
|
|
|
|
|
- write_ht_irq_msg(irq, &msg);
|
|
|
+ irq_set_chip_and_handler_name(irq, &ht_irq_chip,
|
|
|
+ handle_edge_irq, "edge");
|
|
|
|
|
|
- irq_set_chip_and_handler_name(irq, &ht_irq_chip,
|
|
|
- handle_edge_irq, "edge");
|
|
|
+ dev_printk(KERN_DEBUG, &dev->dev, "irq %d for HT\n", irq);
|
|
|
|
|
|
- dev_printk(KERN_DEBUG, &dev->dev, "irq %d for HT\n", irq);
|
|
|
- }
|
|
|
- return err;
|
|
|
+ return 0;
|
|
|
}
|
|
|
#endif /* CONFIG_HT_IRQ */
|
|
|
|