Commit d4ef410b authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by David Mosberger

[PATCH] ia64: iosapic: remove find_iosapic duplication

emove IOSAPIC address and GSI base from external interrupt
registration interfaces.  This lets us remove acpi_find_iosapic(),
which is functionally similar to find_iosapic().
parent 505ed472
...@@ -291,40 +291,6 @@ acpi_parse_lapic_nmi (acpi_table_entry_header *header) ...@@ -291,40 +291,6 @@ acpi_parse_lapic_nmi (acpi_table_entry_header *header)
} }
static int __init
acpi_find_iosapic (unsigned int gsi, u32 *gsi_base, char **iosapic_address)
{
struct acpi_table_iosapic *iosapic;
int ver;
int max_pin;
char *p;
char *end;
if (!gsi_base || !iosapic_address)
return -ENODEV;
p = (char *) (acpi_madt + 1);
end = p + (acpi_madt->header.length - sizeof(struct acpi_table_madt));
while (p < end) {
if (*p == ACPI_MADT_IOSAPIC) {
iosapic = (struct acpi_table_iosapic *) p;
*gsi_base = iosapic->global_irq_base;
*iosapic_address = ioremap(iosapic->address, 0);
ver = iosapic_version(*iosapic_address);
max_pin = (ver >> 16) & 0xff;
if ((gsi - *gsi_base) <= max_pin)
return 0; /* Found it! */
}
p += p[1];
}
return -ENODEV;
}
static int __init static int __init
acpi_parse_iosapic (acpi_table_entry_header *header) acpi_parse_iosapic (acpi_table_entry_header *header)
{ {
...@@ -348,8 +314,6 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header) ...@@ -348,8 +314,6 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header)
{ {
struct acpi_table_plat_int_src *plintsrc; struct acpi_table_plat_int_src *plintsrc;
int vector; int vector;
u32 gsi_base;
char *iosapic_address;
plintsrc = (struct acpi_table_plat_int_src *) header; plintsrc = (struct acpi_table_plat_int_src *) header;
if (!plintsrc) if (!plintsrc)
...@@ -362,11 +326,6 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header) ...@@ -362,11 +326,6 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header)
return -ENODEV; return -ENODEV;
} }
if (acpi_find_iosapic(plintsrc->global_irq, &gsi_base, &iosapic_address)) {
printk(KERN_WARNING PREFIX "IOSAPIC not found\n");
return -ENODEV;
}
/* /*
* Get vector assignment for this interrupt, set attributes, * Get vector assignment for this interrupt, set attributes,
* and program the IOSAPIC routing table. * and program the IOSAPIC routing table.
...@@ -377,9 +336,7 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header) ...@@ -377,9 +336,7 @@ acpi_parse_plat_int_src (acpi_table_entry_header *header)
plintsrc->eid, plintsrc->eid,
plintsrc->id, plintsrc->id,
(plintsrc->flags.polarity == 1) ? 1 : 0, (plintsrc->flags.polarity == 1) ? 1 : 0,
(plintsrc->flags.trigger == 1) ? 1 : 0, (plintsrc->flags.trigger == 1) ? 1 : 0);
gsi_base,
iosapic_address);
platform_intr_list[plintsrc->type] = vector; platform_intr_list[plintsrc->type] = vector;
return 0; return 0;
...@@ -639,8 +596,7 @@ acpi_parse_fadt (unsigned long phys_addr, unsigned long size) ...@@ -639,8 +596,7 @@ acpi_parse_fadt (unsigned long phys_addr, unsigned long size)
{ {
struct acpi_table_header *fadt_header; struct acpi_table_header *fadt_header;
struct fadt_descriptor_rev2 *fadt; struct fadt_descriptor_rev2 *fadt;
u32 sci_irq, gsi_base; u32 sci_irq;
char *iosapic_address;
if (!phys_addr || !size) if (!phys_addr || !size)
return -EINVAL; return -EINVAL;
...@@ -662,8 +618,7 @@ acpi_parse_fadt (unsigned long phys_addr, unsigned long size) ...@@ -662,8 +618,7 @@ acpi_parse_fadt (unsigned long phys_addr, unsigned long size)
if (has_8259 && sci_irq < 16) if (has_8259 && sci_irq < 16)
return 0; /* legacy, no setup required */ return 0; /* legacy, no setup required */
if (!acpi_find_iosapic(sci_irq, &gsi_base, &iosapic_address)) iosapic_register_intr(sci_irq, 0, 0);
iosapic_register_intr(sci_irq, 0, 0, gsi_base, iosapic_address);
return 0; return 0;
} }
...@@ -717,8 +672,6 @@ acpi_parse_spcr (unsigned long phys_addr, unsigned long size) ...@@ -717,8 +672,6 @@ acpi_parse_spcr (unsigned long phys_addr, unsigned long size)
if ((spcr->base_addr.space_id != ACPI_SERIAL_PCICONF_SPACE) && if ((spcr->base_addr.space_id != ACPI_SERIAL_PCICONF_SPACE) &&
(spcr->int_type == ACPI_SERIAL_INT_SAPIC)) (spcr->int_type == ACPI_SERIAL_INT_SAPIC))
{ {
u32 gsi_base;
char *iosapic_address;
int vector; int vector;
/* We have a UART in memory space with an SAPIC interrupt */ /* We have a UART in memory space with an SAPIC interrupt */
...@@ -728,11 +681,7 @@ acpi_parse_spcr (unsigned long phys_addr, unsigned long size) ...@@ -728,11 +681,7 @@ acpi_parse_spcr (unsigned long phys_addr, unsigned long size)
(spcr->global_int[1] << 8) | (spcr->global_int[1] << 8) |
(spcr->global_int[0]) ); (spcr->global_int[0]) );
/* Which iosapic does this interrupt belong to? */ vector = iosapic_register_intr(gsi, 1, 1);
if (!acpi_find_iosapic(gsi, &gsi_base, &iosapic_address))
vector = iosapic_register_intr(gsi, 1, 1,
gsi_base, iosapic_address);
} }
return 0; return 0;
} }
...@@ -892,8 +841,6 @@ int __init ...@@ -892,8 +841,6 @@ int __init
acpi_register_irq (u32 gsi, u32 polarity, u32 trigger) acpi_register_irq (u32 gsi, u32 polarity, u32 trigger)
{ {
int vector = 0; int vector = 0;
u32 irq_base;
char *iosapic_address;
if (acpi_madt->flags.pcat_compat && (gsi < 16)) if (acpi_madt->flags.pcat_compat && (gsi < 16))
return isa_irq_to_vector(gsi); return isa_irq_to_vector(gsi);
...@@ -901,12 +848,8 @@ acpi_register_irq (u32 gsi, u32 polarity, u32 trigger) ...@@ -901,12 +848,8 @@ acpi_register_irq (u32 gsi, u32 polarity, u32 trigger)
if (!iosapic_register_intr) if (!iosapic_register_intr)
return 0; return 0;
/* Find the IOSAPIC */ /* Turn it on */
if (!acpi_find_iosapic(gsi, &irq_base, &iosapic_address)) { vector = iosapic_register_intr (gsi, polarity, trigger);
/* Turn it on */
vector = iosapic_register_intr (gsi, polarity, trigger,
irq_base, iosapic_address);
}
return vector; return vector;
} }
......
...@@ -444,43 +444,31 @@ iosapic_reassign_vector (int vector) ...@@ -444,43 +444,31 @@ iosapic_reassign_vector (int vector)
static void static void
register_intr (unsigned int gsi, int vector, unsigned char delivery, register_intr (unsigned int gsi, int vector, unsigned char delivery,
unsigned long polarity, unsigned long edge_triggered, unsigned long polarity, unsigned long edge_triggered)
unsigned int gsi_base, char *iosapic_address)
{ {
irq_desc_t *idesc; irq_desc_t *idesc;
struct hw_interrupt_type *irq_type; struct hw_interrupt_type *irq_type;
int rte_index; int rte_index;
int index;
unsigned long gsi_base;
char *iosapic_address;
index = find_iosapic(gsi);
if (index < 0) {
printk(KERN_WARNING "%s: No IOSAPIC for GSI 0x%x\n", __FUNCTION__, gsi);
return;
}
iosapic_address = iosapic_lists[index].addr;
gsi_base = iosapic_lists[index].gsi_base;
rte_index = gsi - gsi_base; rte_index = gsi - gsi_base;
iosapic_intr_info[vector].rte_index = rte_index; iosapic_intr_info[vector].rte_index = rte_index;
iosapic_intr_info[vector].polarity = polarity ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW; iosapic_intr_info[vector].polarity = polarity ? IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW;
iosapic_intr_info[vector].dmode = delivery; iosapic_intr_info[vector].dmode = delivery;
iosapic_intr_info[vector].addr = iosapic_address;
iosapic_intr_info[vector].gsi_base = gsi_base;
/*
* In override, it may not provide addr/gsi_base. GSI is enough to
* locate iosapic addr, gsi_base and rte_index by examining
* gsi_base and num_rte of registered iosapics (tbd)
*/
#ifndef OVERRIDE_DEBUG
if (iosapic_address) {
iosapic_intr_info[vector].addr = iosapic_address;
iosapic_intr_info[vector].gsi_base = gsi_base;
}
#else
if (iosapic_address) {
if (iosapic_intr_info[vector].addr && (iosapic_intr_info[vector].addr != iosapic_address))
printk(KERN_WARNING "warning: register_intr: diff IOSAPIC ADDRESS for "
"GSI 0x%x, vector %d\n", gsi, vector);
iosapic_intr_info[vector].addr = iosapic_address;
if (iosapic_intr_info[vector].gsi_base && (iosapic_intr_info[vector].gsi_base != gsi_base)) {
printk(KERN_WARNING "warning: register_intr: diff GSI base 0x%x for "
"GSI 0x%x, vector %d\n", gsi_base, gsi, vector);
}
iosapic_intr_info[vector].gsi_base = gsi_base;
} else if (!iosapic_intr_info[vector].addr)
printk(KERN_WARNING "warning: register_intr: invalid override for GSI 0x%x, "
"vector %d\n", gsi, vector);
#endif
if (edge_triggered) { if (edge_triggered) {
iosapic_intr_info[vector].trigger = IOSAPIC_EDGE; iosapic_intr_info[vector].trigger = IOSAPIC_EDGE;
irq_type = &irq_type_iosapic_edge; irq_type = &irq_type_iosapic_edge;
...@@ -505,8 +493,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery, ...@@ -505,8 +493,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
*/ */
int int
iosapic_register_intr (unsigned int gsi, iosapic_register_intr (unsigned int gsi,
unsigned long polarity, unsigned long edge_triggered, unsigned long polarity, unsigned long edge_triggered)
unsigned int gsi_base, char *iosapic_address)
{ {
int vector; int vector;
unsigned int dest = (ia64_get_lid() >> 16) & 0xffff; unsigned int dest = (ia64_get_lid() >> 16) & 0xffff;
...@@ -516,7 +503,7 @@ iosapic_register_intr (unsigned int gsi, ...@@ -516,7 +503,7 @@ iosapic_register_intr (unsigned int gsi,
vector = ia64_alloc_vector(); vector = ia64_alloc_vector();
register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY,
polarity, edge_triggered, gsi_base, iosapic_address); polarity, edge_triggered);
printk(KERN_INFO "GSI 0x%x(%s,%s) -> CPU 0x%04x vector %d\n", printk(KERN_INFO "GSI 0x%x(%s,%s) -> CPU 0x%04x vector %d\n",
gsi, (polarity ? "high" : "low"), gsi, (polarity ? "high" : "low"),
...@@ -534,8 +521,7 @@ iosapic_register_intr (unsigned int gsi, ...@@ -534,8 +521,7 @@ iosapic_register_intr (unsigned int gsi,
int int
iosapic_register_platform_intr (u32 int_type, unsigned int gsi, iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
int iosapic_vector, u16 eid, u16 id, int iosapic_vector, u16 eid, u16 id,
unsigned long polarity, unsigned long edge_triggered, unsigned long polarity, unsigned long edge_triggered)
unsigned int gsi_base, char *iosapic_address)
{ {
unsigned char delivery; unsigned char delivery;
int vector; int vector;
...@@ -565,7 +551,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi, ...@@ -565,7 +551,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
} }
register_intr(gsi, vector, delivery, polarity, register_intr(gsi, vector, delivery, polarity,
edge_triggered, gsi_base, iosapic_address); edge_triggered);
printk(KERN_INFO "PLATFORM int 0x%x: GSI 0x%x(%s,%s) -> CPU 0x%04x vector %d\n", printk(KERN_INFO "PLATFORM int 0x%x: GSI 0x%x(%s,%s) -> CPU 0x%04x vector %d\n",
int_type, gsi, (polarity ? "high" : "low"), int_type, gsi, (polarity ? "high" : "low"),
...@@ -586,25 +572,12 @@ iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, ...@@ -586,25 +572,12 @@ iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
unsigned long polarity, unsigned long polarity,
unsigned long edge_triggered) unsigned long edge_triggered)
{ {
int index, vector; int vector;
unsigned int gsi_base;
char *addr;
unsigned int dest = (ia64_get_lid() >> 16) & 0xffff; unsigned int dest = (ia64_get_lid() >> 16) & 0xffff;
index = find_iosapic(gsi);
if (index < 0) {
printk(KERN_ERR "ISA: No corresponding IOSAPIC found : ISA IRQ %u -> GSI 0x%x\n",
isa_irq, gsi);
return;
}
vector = isa_irq_to_vector(isa_irq); vector = isa_irq_to_vector(isa_irq);
addr = iosapic_lists[index].addr;
gsi_base = iosapic_lists[index].gsi_base;
register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, polarity, edge_triggered, register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, polarity, edge_triggered);
gsi_base, addr);
DBG("ISA: IRQ %u -> GSI 0x%x (%s,%s) -> CPU 0x%04x vector %d\n", DBG("ISA: IRQ %u -> GSI 0x%x (%s,%s) -> CPU 0x%04x vector %d\n",
isa_irq, gsi, isa_irq, gsi,
...@@ -673,7 +646,7 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base) ...@@ -673,7 +646,7 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
register_intr(isa_irq, vector, IOSAPIC_LOWEST_PRIORITY, register_intr(isa_irq, vector, IOSAPIC_LOWEST_PRIORITY,
/* IOSAPIC_POL_HIGH, IOSAPIC_EDGE */ /* IOSAPIC_POL_HIGH, IOSAPIC_EDGE */
1, 1, gsi_base, addr); 1, 1);
DBG("ISA: IRQ %u -> GSI 0x%x (high,edge) -> CPU 0x%04x vector %d\n", DBG("ISA: IRQ %u -> GSI 0x%x (high,edge) -> CPU 0x%04x vector %d\n",
isa_irq, isa_irq, dest, vector); isa_irq, isa_irq, dest, vector);
...@@ -734,10 +707,9 @@ iosapic_parse_prt (void) ...@@ -734,10 +707,9 @@ iosapic_parse_prt (void)
{ {
struct acpi_prt_entry *entry; struct acpi_prt_entry *entry;
struct list_head *node; struct list_head *node;
unsigned int gsi, gsi_base; unsigned int gsi;
int index, vector; int vector;
char pci_id[16]; char pci_id[16];
char *addr;
list_for_each(node, &acpi_prt.entries) { list_for_each(node, &acpi_prt.entries) {
entry = list_entry(node, struct acpi_prt_entry, node); entry = list_entry(node, struct acpi_prt_entry, node);
...@@ -751,22 +723,13 @@ iosapic_parse_prt (void) ...@@ -751,22 +723,13 @@ iosapic_parse_prt (void)
vector = gsi_to_vector(gsi); vector = gsi_to_vector(gsi);
if (vector < 0) { if (vector < 0) {
/* allocate a vector for this interrupt line */ /* allocate a vector for this interrupt line */
index = find_iosapic(gsi);
if (index < 0) {
printk(KERN_WARNING "IOSAPIC: GSI 0x%x has no IOSAPIC!\n", gsi);
continue;
}
addr = iosapic_lists[index].addr;
gsi_base = iosapic_lists[index].gsi_base;
if (pcat_compat && (gsi < 16)) if (pcat_compat && (gsi < 16))
vector = isa_irq_to_vector(gsi); vector = isa_irq_to_vector(gsi);
else else
/* new GSI; allocate a vector for it */ /* new GSI; allocate a vector for it */
vector = ia64_alloc_vector(); vector = ia64_alloc_vector();
register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, 0, 0, gsi_base, addr); register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, 0, 0);
} }
snprintf(pci_id, sizeof(pci_id), "%02x:%02x:%02x[%c]", snprintf(pci_id, sizeof(pci_id), "%02x:%02x:%02x[%c]",
entry->id.segment, entry->id.bus, entry->id.device, 'A' + entry->pin); entry->id.segment, entry->id.bus, entry->id.device, 'A' + entry->pin);
......
...@@ -58,8 +58,7 @@ extern int gsi_to_vector (unsigned int gsi); ...@@ -58,8 +58,7 @@ extern int gsi_to_vector (unsigned int gsi);
extern int gsi_to_irq (unsigned int gsi); extern int gsi_to_irq (unsigned int gsi);
extern void iosapic_parse_prt (void); extern void iosapic_parse_prt (void);
extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity, extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,
unsigned long edge_triggered, unsigned long edge_triggered);
u32 gsi_base, char *iosapic_address);
extern void iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, extern void iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
unsigned long polarity, unsigned long polarity,
unsigned long edge_triggered); unsigned long edge_triggered);
...@@ -68,9 +67,7 @@ extern int iosapic_register_platform_intr (u32 int_type, ...@@ -68,9 +67,7 @@ extern int iosapic_register_platform_intr (u32 int_type,
int pmi_vector, int pmi_vector,
u16 eid, u16 id, u16 eid, u16 id,
unsigned long polarity, unsigned long polarity,
unsigned long edge_triggered, unsigned long edge_triggered);
unsigned int gsi_base,
char *iosapic_address);
extern unsigned int iosapic_version (char *addr); extern unsigned int iosapic_version (char *addr);
extern void iosapic_pci_fixup (int); extern void iosapic_pci_fixup (int);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment