Merge remote branch 'origin/x86/apic' into x86/mrst
Conflicts: arch/x86/kernel/apic/io_apic.c
This commit is contained in:
@@ -73,8 +73,8 @@
|
||||
*/
|
||||
int sis_apic_bug = -1;
|
||||
|
||||
static DEFINE_SPINLOCK(ioapic_lock);
|
||||
static DEFINE_SPINLOCK(vector_lock);
|
||||
static DEFINE_RAW_SPINLOCK(ioapic_lock);
|
||||
static DEFINE_RAW_SPINLOCK(vector_lock);
|
||||
|
||||
/*
|
||||
* # of IRQ routing registers
|
||||
@@ -167,8 +167,14 @@ int __init arch_early_irq_init(void)
|
||||
desc->chip_data = &cfg[i];
|
||||
zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node);
|
||||
zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node);
|
||||
if (i < legacy_pic->nr_legacy_irqs)
|
||||
cpumask_setall(cfg[i].domain);
|
||||
/*
|
||||
* For legacy IRQ's, start with assigning irq0 to irq15 to
|
||||
* IRQ0_VECTOR to IRQ15_VECTOR on cpu 0.
|
||||
*/
|
||||
if (i < legacy_pic->nr_legacy_irqs) {
|
||||
cfg[i].vector = IRQ0_VECTOR + i;
|
||||
cpumask_set_cpu(0, cfg[i].domain);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -388,7 +394,7 @@ static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
|
||||
struct irq_pin_list *entry;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
for_each_irq_pin(entry, cfg->irq_2_pin) {
|
||||
unsigned int reg;
|
||||
int pin;
|
||||
@@ -397,11 +403,11 @@ static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
|
||||
reg = io_apic_read(entry->apic, 0x10 + pin*2);
|
||||
/* Is the remote IRR bit set? */
|
||||
if (reg & IO_APIC_REDIR_REMOTE_IRR) {
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -415,10 +421,10 @@ static struct IO_APIC_route_entry ioapic_read_entry(int apic, int pin)
|
||||
{
|
||||
union entry_union eu;
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
eu.w1 = io_apic_read(apic, 0x10 + 2 * pin);
|
||||
eu.w2 = io_apic_read(apic, 0x11 + 2 * pin);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
return eu.entry;
|
||||
}
|
||||
|
||||
@@ -441,9 +447,9 @@ __ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
|
||||
void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
__ioapic_write_entry(apic, pin, e);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -456,10 +462,10 @@ static void ioapic_mask_entry(int apic, int pin)
|
||||
unsigned long flags;
|
||||
union entry_union eu = { .entry.mask = 1 };
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
io_apic_write(apic, 0x10 + 2*pin, eu.w1);
|
||||
io_apic_write(apic, 0x11 + 2*pin, eu.w2);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -586,9 +592,9 @@ static void mask_IO_APIC_irq_desc(struct irq_desc *desc)
|
||||
|
||||
BUG_ON(!cfg);
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
__mask_IO_APIC_irq(cfg);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
static void unmask_IO_APIC_irq_desc(struct irq_desc *desc)
|
||||
@@ -596,9 +602,9 @@ static void unmask_IO_APIC_irq_desc(struct irq_desc *desc)
|
||||
struct irq_cfg *cfg = desc->chip_data;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
__unmask_IO_APIC_irq(cfg);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
static void mask_IO_APIC_irq(unsigned int irq)
|
||||
@@ -1122,12 +1128,12 @@ void lock_vector_lock(void)
|
||||
/* Used to the online set of cpus does not change
|
||||
* during assign_irq_vector.
|
||||
*/
|
||||
spin_lock(&vector_lock);
|
||||
raw_spin_lock(&vector_lock);
|
||||
}
|
||||
|
||||
void unlock_vector_lock(void)
|
||||
{
|
||||
spin_unlock(&vector_lock);
|
||||
raw_spin_unlock(&vector_lock);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1144,7 +1150,8 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
|
||||
* Also, we've got to be careful not to trash gate
|
||||
* 0x80, because int 0x80 is hm, kind of importantish. ;)
|
||||
*/
|
||||
static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
|
||||
static int current_vector = FIRST_EXTERNAL_VECTOR + VECTOR_OFFSET_START;
|
||||
static int current_offset = VECTOR_OFFSET_START % 8;
|
||||
unsigned int old_vector;
|
||||
int cpu, err;
|
||||
cpumask_var_t tmp_mask;
|
||||
@@ -1180,7 +1187,7 @@ next:
|
||||
if (vector >= first_system_vector) {
|
||||
/* If out of vectors on large boxen, must share them. */
|
||||
offset = (offset + 1) % 8;
|
||||
vector = FIRST_DEVICE_VECTOR + offset;
|
||||
vector = FIRST_EXTERNAL_VECTOR + offset;
|
||||
}
|
||||
if (unlikely(current_vector == vector))
|
||||
continue;
|
||||
@@ -1214,9 +1221,9 @@ int assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)
|
||||
int err;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&vector_lock, flags);
|
||||
raw_spin_lock_irqsave(&vector_lock, flags);
|
||||
err = __assign_irq_vector(irq, cfg, mask);
|
||||
spin_unlock_irqrestore(&vector_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&vector_lock, flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1250,11 +1257,16 @@ static void __clear_irq_vector(int irq, struct irq_cfg *cfg)
|
||||
void __setup_vector_irq(int cpu)
|
||||
{
|
||||
/* Initialize vector_irq on a new cpu */
|
||||
/* This function must be called with vector_lock held */
|
||||
int irq, vector;
|
||||
struct irq_cfg *cfg;
|
||||
struct irq_desc *desc;
|
||||
|
||||
/*
|
||||
* vector_lock will make sure that we don't run into irq vector
|
||||
* assignments that might be happening on another cpu in parallel,
|
||||
* while we setup our initial vector to irq mappings.
|
||||
*/
|
||||
raw_spin_lock(&vector_lock);
|
||||
/* Mark the inuse vectors */
|
||||
for_each_irq_desc(irq, desc) {
|
||||
cfg = desc->chip_data;
|
||||
@@ -1273,6 +1285,7 @@ void __setup_vector_irq(int cpu)
|
||||
if (!cpumask_test_cpu(cpu, cfg->domain))
|
||||
per_cpu(vector_irq, cpu)[vector] = -1;
|
||||
}
|
||||
raw_spin_unlock(&vector_lock);
|
||||
}
|
||||
|
||||
static struct irq_chip ioapic_chip;
|
||||
@@ -1422,6 +1435,14 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq
|
||||
|
||||
cfg = desc->chip_data;
|
||||
|
||||
/*
|
||||
* 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 < 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;
|
||||
|
||||
@@ -1520,6 +1541,56 @@ static void __init setup_IO_APIC_irqs(void)
|
||||
" (apicid-pin) not connected\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* for the gsit that is not in first ioapic
|
||||
* but could not use acpi_register_gsi()
|
||||
* like some special sci in IBM x3330
|
||||
*/
|
||||
void setup_IO_APIC_irq_extra(u32 gsi)
|
||||
{
|
||||
int apic_id = 0, pin, idx, irq;
|
||||
int node = cpu_to_node(boot_cpu_id);
|
||||
struct irq_desc *desc;
|
||||
struct irq_cfg *cfg;
|
||||
|
||||
/*
|
||||
* Convert 'gsi' to 'ioapic.pin'.
|
||||
*/
|
||||
apic_id = mp_find_ioapic(gsi);
|
||||
if (apic_id < 0)
|
||||
return;
|
||||
|
||||
pin = mp_find_ioapic_pin(apic_id, gsi);
|
||||
idx = find_irq_entry(apic_id, pin, mp_INT);
|
||||
if (idx == -1)
|
||||
return;
|
||||
|
||||
irq = pin_2_irq(idx, apic_id, pin);
|
||||
#ifdef CONFIG_SPARSE_IRQ
|
||||
desc = irq_to_desc(irq);
|
||||
if (desc)
|
||||
return;
|
||||
#endif
|
||||
desc = irq_to_desc_alloc_node(irq, node);
|
||||
if (!desc) {
|
||||
printk(KERN_INFO "can not get irq_desc for %d\n", irq);
|
||||
return;
|
||||
}
|
||||
|
||||
cfg = desc->chip_data;
|
||||
add_pin_to_irq_node(cfg, node, apic_id, pin);
|
||||
|
||||
if (test_bit(pin, mp_ioapic_routing[apic_id].pin_programmed)) {
|
||||
pr_debug("Pin %d-%d already programmed\n",
|
||||
mp_ioapics[apic_id].apicid, pin);
|
||||
return;
|
||||
}
|
||||
set_bit(pin, mp_ioapic_routing[apic_id].pin_programmed);
|
||||
|
||||
setup_IO_APIC_irq(apic_id, pin, irq, desc,
|
||||
irq_trigger(idx), irq_polarity(idx));
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up the timer pin, possibly with the 8259A-master behind.
|
||||
*/
|
||||
@@ -1583,14 +1654,14 @@ __apicdebuginit(void) print_IO_APIC(void)
|
||||
|
||||
for (apic = 0; apic < nr_ioapics; apic++) {
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_00.raw = io_apic_read(apic, 0);
|
||||
reg_01.raw = io_apic_read(apic, 1);
|
||||
if (reg_01.bits.version >= 0x10)
|
||||
reg_02.raw = io_apic_read(apic, 2);
|
||||
if (reg_01.bits.version >= 0x20)
|
||||
reg_03.raw = io_apic_read(apic, 3);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
printk("\n");
|
||||
printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].apicid);
|
||||
@@ -1812,7 +1883,7 @@ __apicdebuginit(void) print_PIC(void)
|
||||
|
||||
printk(KERN_DEBUG "\nprinting PIC contents\n");
|
||||
|
||||
spin_lock_irqsave(&i8259A_lock, flags);
|
||||
raw_spin_lock_irqsave(&i8259A_lock, flags);
|
||||
|
||||
v = inb(0xa1) << 8 | inb(0x21);
|
||||
printk(KERN_DEBUG "... PIC IMR: %04x\n", v);
|
||||
@@ -1826,7 +1897,7 @@ __apicdebuginit(void) print_PIC(void)
|
||||
outb(0x0a,0xa0);
|
||||
outb(0x0a,0x20);
|
||||
|
||||
spin_unlock_irqrestore(&i8259A_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&i8259A_lock, flags);
|
||||
|
||||
printk(KERN_DEBUG "... PIC ISR: %04x\n", v);
|
||||
|
||||
@@ -1885,9 +1956,9 @@ void __init enable_IO_APIC(void)
|
||||
* The number of IO-APIC IRQ registers (== #pins):
|
||||
*/
|
||||
for (apic = 0; apic < nr_ioapics; apic++) {
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_01.raw = io_apic_read(apic, 1);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
nr_ioapic_registers[apic] = reg_01.bits.entries+1;
|
||||
}
|
||||
|
||||
@@ -2027,9 +2098,9 @@ void __init setup_ioapic_ids_from_mpc(void)
|
||||
for (apic_id = 0; apic_id < nr_ioapics; apic_id++) {
|
||||
|
||||
/* Read the register 0 value */
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_00.raw = io_apic_read(apic_id, 0);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
old_id = mp_ioapics[apic_id].apicid;
|
||||
|
||||
@@ -2088,16 +2159,16 @@ void __init setup_ioapic_ids_from_mpc(void)
|
||||
mp_ioapics[apic_id].apicid);
|
||||
|
||||
reg_00.bits.ID = mp_ioapics[apic_id].apicid;
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
io_apic_write(apic_id, 0, reg_00.raw);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
/*
|
||||
* Sanity check
|
||||
*/
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_00.raw = io_apic_read(apic_id, 0);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
if (reg_00.bits.ID != mp_ioapics[apic_id].apicid)
|
||||
printk("could not set ID!\n");
|
||||
else
|
||||
@@ -2180,7 +2251,7 @@ static unsigned int startup_ioapic_irq(unsigned int irq)
|
||||
unsigned long flags;
|
||||
struct irq_cfg *cfg;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
if (irq < legacy_pic->nr_legacy_irqs) {
|
||||
legacy_pic->chip->mask(irq);
|
||||
if (legacy_pic->irq_pending(irq))
|
||||
@@ -2188,7 +2259,7 @@ static unsigned int startup_ioapic_irq(unsigned int irq)
|
||||
}
|
||||
cfg = irq_cfg(irq);
|
||||
__unmask_IO_APIC_irq(cfg);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
return was_pending;
|
||||
}
|
||||
@@ -2199,9 +2270,9 @@ static int ioapic_retrigger_irq(unsigned int irq)
|
||||
struct irq_cfg *cfg = irq_cfg(irq);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&vector_lock, flags);
|
||||
raw_spin_lock_irqsave(&vector_lock, flags);
|
||||
apic->send_IPI_mask(cpumask_of(cpumask_first(cfg->domain)), cfg->vector);
|
||||
spin_unlock_irqrestore(&vector_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&vector_lock, flags);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -2294,14 +2365,14 @@ set_ioapic_affinity_irq_desc(struct irq_desc *desc, const struct cpumask *mask)
|
||||
irq = desc->irq;
|
||||
cfg = desc->chip_data;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
ret = set_desc_affinity(desc, mask, &dest);
|
||||
if (!ret) {
|
||||
/* Only the high 8 bits are valid. */
|
||||
dest = SET_APIC_LOGICAL_ID(dest);
|
||||
__target_IO_APIC_irq(irq, dest, cfg);
|
||||
}
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -2536,9 +2607,9 @@ static void eoi_ioapic_irq(struct irq_desc *desc)
|
||||
irq = desc->irq;
|
||||
cfg = desc->chip_data;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
__eoi_ioapic_irq(irq, cfg);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
static void ack_apic_level(unsigned int irq)
|
||||
@@ -3120,13 +3191,13 @@ static int ioapic_resume(struct sys_device *dev)
|
||||
data = container_of(dev, struct sysfs_ioapic_data, dev);
|
||||
entry = data->entry;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_00.raw = io_apic_read(dev->id, 0);
|
||||
if (reg_00.bits.ID != mp_ioapics[dev->id].apicid) {
|
||||
reg_00.bits.ID = mp_ioapics[dev->id].apicid;
|
||||
io_apic_write(dev->id, 0, reg_00.raw);
|
||||
}
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
for (i = 0; i < nr_ioapic_registers[dev->id]; i++)
|
||||
ioapic_write_entry(dev->id, i, entry[i]);
|
||||
|
||||
@@ -3189,7 +3260,7 @@ unsigned int create_irq_nr(unsigned int irq_want, int node)
|
||||
if (irq_want < nr_irqs_gsi)
|
||||
irq_want = nr_irqs_gsi;
|
||||
|
||||
spin_lock_irqsave(&vector_lock, flags);
|
||||
raw_spin_lock_irqsave(&vector_lock, flags);
|
||||
for (new = irq_want; new < nr_irqs; new++) {
|
||||
desc_new = irq_to_desc_alloc_node(new, node);
|
||||
if (!desc_new) {
|
||||
@@ -3208,14 +3279,11 @@ unsigned int create_irq_nr(unsigned int irq_want, int node)
|
||||
irq = new;
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&vector_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&vector_lock, flags);
|
||||
|
||||
if (irq > 0)
|
||||
dynamic_irq_init_keep_chip_data(irq);
|
||||
|
||||
if (irq > 0) {
|
||||
dynamic_irq_init(irq);
|
||||
/* restore it, in case dynamic_irq_init clear it */
|
||||
if (desc_new)
|
||||
desc_new->chip_data = cfg_new;
|
||||
}
|
||||
return irq;
|
||||
}
|
||||
|
||||
@@ -3237,20 +3305,13 @@ int create_irq(void)
|
||||
void destroy_irq(unsigned int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct irq_cfg *cfg;
|
||||
struct irq_desc *desc;
|
||||
|
||||
/* store it, in case dynamic_irq_cleanup clear it */
|
||||
desc = irq_to_desc(irq);
|
||||
cfg = desc->chip_data;
|
||||
dynamic_irq_cleanup(irq);
|
||||
/* connect back irq_cfg */
|
||||
desc->chip_data = cfg;
|
||||
dynamic_irq_cleanup_keep_chip_data(irq);
|
||||
|
||||
free_irte(irq);
|
||||
spin_lock_irqsave(&vector_lock, flags);
|
||||
__clear_irq_vector(irq, cfg);
|
||||
spin_unlock_irqrestore(&vector_lock, flags);
|
||||
raw_spin_lock_irqsave(&vector_lock, flags);
|
||||
__clear_irq_vector(irq, get_irq_chip_data(irq));
|
||||
raw_spin_unlock_irqrestore(&vector_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3787,9 +3848,9 @@ int __init io_apic_get_redir_entries (int ioapic)
|
||||
union IO_APIC_reg_01 reg_01;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_01.raw = io_apic_read(ioapic, 1);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
return reg_01.bits.entries;
|
||||
}
|
||||
@@ -3816,28 +3877,6 @@ void __init probe_nr_irqs_gsi(void)
|
||||
printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARSE_IRQ
|
||||
int __init arch_probe_nr_irqs(void)
|
||||
{
|
||||
int nr;
|
||||
|
||||
if (nr_irqs > (NR_VECTORS * nr_cpu_ids))
|
||||
nr_irqs = NR_VECTORS * nr_cpu_ids;
|
||||
|
||||
nr = nr_irqs_gsi + 8 * nr_cpu_ids;
|
||||
#if defined(CONFIG_PCI_MSI) || defined(CONFIG_HT_IRQ)
|
||||
/*
|
||||
* for MSI and HT dyn irq
|
||||
*/
|
||||
nr += nr_irqs_gsi * 16;
|
||||
#endif
|
||||
if (nr < nr_irqs)
|
||||
nr_irqs = nr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __io_apic_set_pci_routing(struct device *dev, int irq,
|
||||
struct io_apic_irq_attr *irq_attr)
|
||||
{
|
||||
@@ -3951,9 +3990,9 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id)
|
||||
if (physids_empty(apic_id_map))
|
||||
apic->ioapic_phys_id_map(&phys_cpu_present_map, &apic_id_map);
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_00.raw = io_apic_read(ioapic, 0);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
if (apic_id >= get_physical_broadcast()) {
|
||||
printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
|
||||
@@ -3987,10 +4026,10 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id)
|
||||
if (reg_00.bits.ID != apic_id) {
|
||||
reg_00.bits.ID = apic_id;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
io_apic_write(ioapic, 0, reg_00.raw);
|
||||
reg_00.raw = io_apic_read(ioapic, 0);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
/* Sanity check */
|
||||
if (reg_00.bits.ID != apic_id) {
|
||||
@@ -4011,9 +4050,9 @@ int __init io_apic_get_version(int ioapic)
|
||||
union IO_APIC_reg_01 reg_01;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
raw_spin_lock_irqsave(&ioapic_lock, flags);
|
||||
reg_01.raw = io_apic_read(ioapic, 1);
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
|
||||
return reg_01.bits.version;
|
||||
}
|
||||
|
Reference in New Issue
Block a user