diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-18 12:15:57 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-18 12:15:57 -0400 |
| commit | 98f01720cbe3e2eb719682777049b6514e9db556 (patch) | |
| tree | af2fc4642dd0bfd195b0f60f1f267e8b02aa0009 | |
| parent | 41d59102e146a4423a490b8eca68a5860af4fe1c (diff) | |
| parent | 4f47b4c9f0b711bf84adb8c27774ae80d346b628 (diff) | |
Merge branch 'x86-irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86, acpi/irq: Define gsi_end when X86_IO_APIC is undefined
x86, irq: Kill io_apic_renumber_irq
x86, acpi/irq: Handle isa irqs that are not identity mapped to gsi's.
x86, ioapic: Simplify probe_nr_irqs_gsi.
x86, ioapic: Optimize pin_2_irq
x86, ioapic: Move nr_ioapic_registers calculation to mp_register_ioapic.
x86, ioapic: In mpparse use mp_register_ioapic
x86, ioapic: Teach mp_register_ioapic to compute a global gsi_end
x86, ioapic: Fix the types of gsi values
x86, ioapic: Fix io_apic_redir_entries to return the number of entries.
x86, ioapic: Only export mp_find_ioapic and mp_find_ioapic_pin in io_apic.h
x86, acpi/irq: Generalize mp_config_acpi_legacy_irqs
x86, acpi/irq: Fix acpi_sci_ioapic_setup so it has both bus_irq and gsi
x86, acpi/irq: pci device dev->irq is an isa irq not a gsi
x86, acpi/irq: Teach acpi_get_override_irq to take a gsi not an isa_irq
x86, acpi/irq: Introduce apci_isa_irq_to_gsi
| -rw-r--r-- | arch/ia64/kernel/acpi.c | 8 | ||||
| -rw-r--r-- | arch/x86/include/asm/io_apic.h | 13 | ||||
| -rw-r--r-- | arch/x86/include/asm/mpspec.h | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 133 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/es7000_32.c | 19 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 99 | ||||
| -rw-r--r-- | arch/x86/kernel/mpparse.c | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/sfi.c | 4 | ||||
| -rw-r--r-- | drivers/acpi/pci_irq.c | 8 | ||||
| -rw-r--r-- | include/linux/acpi.h | 5 |
10 files changed, 155 insertions, 169 deletions
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 4d1a7e9314cf..c6c90f39f4d9 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
| @@ -785,6 +785,14 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) | |||
| 785 | return 0; | 785 | return 0; |
| 786 | } | 786 | } |
| 787 | 787 | ||
| 788 | int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi) | ||
| 789 | { | ||
| 790 | if (isa_irq >= 16) | ||
| 791 | return -1; | ||
| 792 | *gsi = isa_irq; | ||
| 793 | return 0; | ||
| 794 | } | ||
| 795 | |||
| 788 | /* | 796 | /* |
| 789 | * ACPI based hotplug CPU support | 797 | * ACPI based hotplug CPU support |
| 790 | */ | 798 | */ |
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 35832a03a515..63cb4096c3dc 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
| @@ -159,7 +159,6 @@ struct io_apic_irq_attr; | |||
| 159 | extern int io_apic_set_pci_routing(struct device *dev, int irq, | 159 | extern int io_apic_set_pci_routing(struct device *dev, int irq, |
| 160 | struct io_apic_irq_attr *irq_attr); | 160 | struct io_apic_irq_attr *irq_attr); |
| 161 | void setup_IO_APIC_irq_extra(u32 gsi); | 161 | void setup_IO_APIC_irq_extra(u32 gsi); |
| 162 | extern int (*ioapic_renumber_irq)(int ioapic, int irq); | ||
| 163 | extern void ioapic_init_mappings(void); | 162 | extern void ioapic_init_mappings(void); |
| 164 | extern void ioapic_insert_resources(void); | 163 | extern void ioapic_insert_resources(void); |
| 165 | 164 | ||
| @@ -180,12 +179,13 @@ extern void ioapic_write_entry(int apic, int pin, | |||
| 180 | extern void setup_ioapic_ids_from_mpc(void); | 179 | extern void setup_ioapic_ids_from_mpc(void); |
| 181 | 180 | ||
| 182 | struct mp_ioapic_gsi{ | 181 | struct mp_ioapic_gsi{ |
| 183 | int gsi_base; | 182 | u32 gsi_base; |
| 184 | int gsi_end; | 183 | u32 gsi_end; |
| 185 | }; | 184 | }; |
| 186 | extern struct mp_ioapic_gsi mp_gsi_routing[]; | 185 | extern struct mp_ioapic_gsi mp_gsi_routing[]; |
| 187 | int mp_find_ioapic(int gsi); | 186 | extern u32 gsi_end; |
| 188 | int mp_find_ioapic_pin(int ioapic, int gsi); | 187 | int mp_find_ioapic(u32 gsi); |
| 188 | int mp_find_ioapic_pin(int ioapic, u32 gsi); | ||
| 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); | 189 | void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); |
| 190 | extern void __init pre_init_apic_IRQ0(void); | 190 | extern void __init pre_init_apic_IRQ0(void); |
| 191 | 191 | ||
| @@ -197,7 +197,8 @@ static const int timer_through_8259 = 0; | |||
| 197 | static inline void ioapic_init_mappings(void) { } | 197 | static inline void ioapic_init_mappings(void) { } |
| 198 | static inline void ioapic_insert_resources(void) { } | 198 | static inline void ioapic_insert_resources(void) { } |
| 199 | static inline void probe_nr_irqs_gsi(void) { } | 199 | static inline void probe_nr_irqs_gsi(void) { } |
| 200 | static inline int mp_find_ioapic(int gsi) { return 0; } | 200 | #define gsi_end (NR_IRQS_LEGACY - 1) |
| 201 | static inline int mp_find_ioapic(u32 gsi) { return 0; } | ||
| 201 | 202 | ||
| 202 | struct io_apic_irq_attr; | 203 | struct io_apic_irq_attr; |
| 203 | static inline int io_apic_set_pci_routing(struct device *dev, int irq, | 204 | static inline int io_apic_set_pci_routing(struct device *dev, int irq, |
diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h index d8bf23a88d05..c82868e9f905 100644 --- a/arch/x86/include/asm/mpspec.h +++ b/arch/x86/include/asm/mpspec.h | |||
| @@ -105,16 +105,6 @@ extern void mp_config_acpi_legacy_irqs(void); | |||
| 105 | struct device; | 105 | struct device; |
| 106 | extern int mp_register_gsi(struct device *dev, u32 gsi, int edge_level, | 106 | extern int mp_register_gsi(struct device *dev, u32 gsi, int edge_level, |
| 107 | int active_high_low); | 107 | int active_high_low); |
| 108 | extern int acpi_probe_gsi(void); | ||
| 109 | #ifdef CONFIG_X86_IO_APIC | ||
| 110 | extern int mp_find_ioapic(int gsi); | ||
| 111 | extern int mp_find_ioapic_pin(int ioapic, int gsi); | ||
| 112 | #endif | ||
| 113 | #else /* !CONFIG_ACPI: */ | ||
| 114 | static inline int acpi_probe_gsi(void) | ||
| 115 | { | ||
| 116 | return 0; | ||
| 117 | } | ||
| 118 | #endif /* CONFIG_ACPI */ | 108 | #endif /* CONFIG_ACPI */ |
| 119 | 109 | ||
| 120 | #define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS) | 110 | #define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS) |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index cd40aba6aa95..9a5ed58f09dc 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -94,6 +94,53 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC; | |||
| 94 | 94 | ||
| 95 | 95 | ||
| 96 | /* | 96 | /* |
| 97 | * ISA irqs by default are the first 16 gsis but can be | ||
| 98 | * any gsi as specified by an interrupt source override. | ||
| 99 | */ | ||
| 100 | static u32 isa_irq_to_gsi[NR_IRQS_LEGACY] __read_mostly = { | ||
| 101 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | ||
| 102 | }; | ||
| 103 | |||
| 104 | static unsigned int gsi_to_irq(unsigned int gsi) | ||
| 105 | { | ||
| 106 | unsigned int irq = gsi + NR_IRQS_LEGACY; | ||
| 107 | unsigned int i; | ||
| 108 | |||
| 109 | for (i = 0; i < NR_IRQS_LEGACY; i++) { | ||
| 110 | if (isa_irq_to_gsi[i] == gsi) { | ||
| 111 | return i; | ||
| 112 | } | ||
| 113 | } | ||
| 114 | |||
| 115 | /* Provide an identity mapping of gsi == irq | ||
| 116 | * except on truly weird platforms that have | ||
| 117 | * non isa irqs in the first 16 gsis. | ||
| 118 | */ | ||
| 119 | if (gsi >= NR_IRQS_LEGACY) | ||
| 120 | irq = gsi; | ||
| 121 | else | ||
| 122 | irq = gsi_end + 1 + gsi; | ||
| 123 | |||
| 124 | return irq; | ||
| 125 | } | ||
| 126 | |||
| 127 | static u32 irq_to_gsi(int irq) | ||
| 128 | { | ||
| 129 | unsigned int gsi; | ||
| 130 | |||
| 131 | if (irq < NR_IRQS_LEGACY) | ||
| 132 | gsi = isa_irq_to_gsi[irq]; | ||
| 133 | else if (irq <= gsi_end) | ||
| 134 | gsi = irq; | ||
| 135 | else if (irq <= (gsi_end + NR_IRQS_LEGACY)) | ||
| 136 | gsi = irq - gsi_end; | ||
| 137 | else | ||
| 138 | gsi = 0xffffffff; | ||
| 139 | |||
| 140 | return gsi; | ||
| 141 | } | ||
| 142 | |||
| 143 | /* | ||
| 97 | * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END, | 144 | * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END, |
| 98 | * to map the target physical address. The problem is that set_fixmap() | 145 | * to map the target physical address. The problem is that set_fixmap() |
| 99 | * provides a single page, and it is possible that the page is not | 146 | * provides a single page, and it is possible that the page is not |
| @@ -313,7 +360,7 @@ acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end) | |||
| 313 | /* | 360 | /* |
| 314 | * Parse Interrupt Source Override for the ACPI SCI | 361 | * Parse Interrupt Source Override for the ACPI SCI |
| 315 | */ | 362 | */ |
| 316 | static void __init acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger) | 363 | static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger, u32 gsi) |
| 317 | { | 364 | { |
| 318 | if (trigger == 0) /* compatible SCI trigger is level */ | 365 | if (trigger == 0) /* compatible SCI trigger is level */ |
| 319 | trigger = 3; | 366 | trigger = 3; |
| @@ -333,7 +380,7 @@ static void __init acpi_sci_ioapic_setup(u32 gsi, u16 polarity, u16 trigger) | |||
| 333 | * If GSI is < 16, this will update its flags, | 380 | * If GSI is < 16, this will update its flags, |
| 334 | * else it will create a new mp_irqs[] entry. | 381 | * else it will create a new mp_irqs[] entry. |
| 335 | */ | 382 | */ |
| 336 | mp_override_legacy_irq(gsi, polarity, trigger, gsi); | 383 | mp_override_legacy_irq(bus_irq, polarity, trigger, gsi); |
| 337 | 384 | ||
| 338 | /* | 385 | /* |
| 339 | * stash over-ride to indicate we've been here | 386 | * stash over-ride to indicate we've been here |
| @@ -357,9 +404,10 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header, | |||
| 357 | acpi_table_print_madt_entry(header); | 404 | acpi_table_print_madt_entry(header); |
| 358 | 405 | ||
| 359 | if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) { | 406 | if (intsrc->source_irq == acpi_gbl_FADT.sci_interrupt) { |
| 360 | acpi_sci_ioapic_setup(intsrc->global_irq, | 407 | acpi_sci_ioapic_setup(intsrc->source_irq, |
| 361 | intsrc->inti_flags & ACPI_MADT_POLARITY_MASK, | 408 | intsrc->inti_flags & ACPI_MADT_POLARITY_MASK, |
