Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 138791
b: refs/heads/master
c: 05c3dc2
h: refs/heads/master
i:
  138789: c8254db
  138787: d3a5f10
  138783: d3e0bee
v: v3
  • Loading branch information
Suresh Siddha authored and H. Peter Anvin committed Mar 17, 2009
1 parent d15522c commit cf656d7
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 29b61be65a33c95564fa82e7e8d60d97adb68ea8
refs/heads/master: 05c3dc2c4b60387769cbe73174347de4cf85f0c9
3 changes: 2 additions & 1 deletion trunk/arch/x86/include/asm/io_apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,8 @@ extern int (*ioapic_renumber_irq)(int ioapic, int irq);
extern void ioapic_init_mappings(void);

#ifdef CONFIG_X86_64
extern int save_mask_IO_APIC_setup(void);
extern int save_IO_APIC_setup(void);
extern void mask_IO_APIC_setup(void);
extern void restore_IO_APIC_setup(void);
extern void reinit_intr_remapped_IO_APIC(int);
#endif
Expand Down
11 changes: 6 additions & 5 deletions trunk/arch/x86/kernel/apic/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1334,15 +1334,16 @@ void __init enable_IR_x2apic(void)
return;
}

local_irq_save(flags);
mask_8259A();

ret = save_mask_IO_APIC_setup();
ret = save_IO_APIC_setup();
if (ret) {
pr_info("Saving IO-APIC state failed: %d\n", ret);
goto end;
}

local_irq_save(flags);
mask_IO_APIC_setup();
mask_8259A();

ret = enable_intr_remapping(1);

if (ret && x2apic_preenabled) {
Expand All @@ -1367,10 +1368,10 @@ void __init enable_IR_x2apic(void)
else
reinit_intr_remapped_IO_APIC(x2apic_preenabled);

end:
unmask_8259A();
local_irq_restore(flags);

end:
if (!ret) {
if (!x2apic_preenabled)
pr_info("Enabled x2apic and interrupt-remapping\n");
Expand Down
34 changes: 23 additions & 11 deletions trunk/arch/x86/kernel/apic/io_apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -853,9 +853,9 @@ __setup("pirq=", ioapic_pirq_setup);
static struct IO_APIC_route_entry *early_ioapic_entries[MAX_IO_APICS];

/*
* Saves and masks all the unmasked IO-APIC RTE's
* Saves all the IO-APIC RTE's
*/
int save_mask_IO_APIC_setup(void)
int save_IO_APIC_setup(void)
{
union IO_APIC_reg_01 reg_01;
unsigned long flags;
Expand All @@ -880,16 +880,9 @@ int save_mask_IO_APIC_setup(void)
}

for (apic = 0; apic < nr_ioapics; apic++)
for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
struct IO_APIC_route_entry entry;

entry = early_ioapic_entries[apic][pin] =
for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
early_ioapic_entries[apic][pin] =
ioapic_read_entry(apic, pin);
if (!entry.mask) {
entry.mask = 1;
ioapic_write_entry(apic, pin, entry);
}
}

return 0;

Expand All @@ -902,6 +895,25 @@ int save_mask_IO_APIC_setup(void)
return -ENOMEM;
}

void mask_IO_APIC_setup(void)
{
int apic, pin;

for (apic = 0; apic < nr_ioapics; apic++) {
if (!early_ioapic_entries[apic])
break;
for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
struct IO_APIC_route_entry entry;

entry = early_ioapic_entries[apic][pin];
if (!entry.mask) {
entry.mask = 1;
ioapic_write_entry(apic, pin, entry);
}
}
}
}

void restore_IO_APIC_setup(void)
{
int apic, pin;
Expand Down

0 comments on commit cf656d7

Please sign in to comment.