|
@@ -66,7 +66,7 @@ struct irq_cfg {
|
|
};
|
|
};
|
|
|
|
|
|
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
|
|
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
|
|
-static struct irq_cfg irq_cfg[NR_IRQS] __read_mostly = {
|
|
|
|
|
|
+static struct irq_cfg irq_cfg_legacy[] __initdata = {
|
|
[0] = { .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
|
|
[0] = { .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
|
|
[1] = { .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
|
|
[1] = { .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
|
|
[2] = { .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
|
|
[2] = { .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
|
|
@@ -85,6 +85,17 @@ static struct irq_cfg irq_cfg[NR_IRQS] __read_mostly = {
|
|
[15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
|
|
[15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct irq_cfg *irq_cfg;
|
|
|
|
+
|
|
|
|
+static void __init init_work(void *data)
|
|
|
|
+{
|
|
|
|
+ struct dyn_array *da = data;
|
|
|
|
+
|
|
|
|
+ memcpy(*da->name, irq_cfg_legacy, sizeof(irq_cfg_legacy));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+DEFINE_DYN_ARRAY(irq_cfg, sizeof(struct irq_cfg), nr_irqs, PAGE_SIZE, init_work);
|
|
|
|
+
|
|
static int assign_irq_vector(int irq, cpumask_t mask);
|
|
static int assign_irq_vector(int irq, cpumask_t mask);
|
|
|
|
|
|
int first_system_vector = 0xfe;
|
|
int first_system_vector = 0xfe;
|
|
@@ -129,10 +140,9 @@ DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
|
|
* Rough estimation of how many shared IRQs there are, can
|
|
* Rough estimation of how many shared IRQs there are, can
|
|
* be changed anytime.
|
|
* be changed anytime.
|
|
*/
|
|
*/
|
|
-#define MAX_PLUS_SHARED_IRQS NR_IRQS
|
|
|
|
-#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
|
|
|
|
|
|
|
|
-int pin_map_size = PIN_MAP_SIZE;
|
|
|
|
|
|
+int pin_map_size;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* This is performance-critical, we want to do it O(1)
|
|
* This is performance-critical, we want to do it O(1)
|
|
*
|
|
*
|
|
@@ -141,8 +151,12 @@ int pin_map_size = PIN_MAP_SIZE;
|
|
*/
|
|
*/
|
|
|
|
|
|
static struct irq_pin_list {
|
|
static struct irq_pin_list {
|
|
- short apic, pin, next;
|
|
|
|
-} irq_2_pin[PIN_MAP_SIZE];
|
|
|
|
|
|
+ short apic, pin;
|
|
|
|
+ int next;
|
|
|
|
+} *irq_2_pin;
|
|
|
|
+
|
|
|
|
+DEFINE_DYN_ARRAY(irq_2_pin, sizeof(struct irq_pin_list), pin_map_size, sizeof(struct irq_pin_list), NULL);
|
|
|
|
+
|
|
|
|
|
|
struct io_apic {
|
|
struct io_apic {
|
|
unsigned int index;
|
|
unsigned int index;
|
|
@@ -359,7 +373,7 @@ static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
|
|
* shared ISA-space IRQs, so we have to support them. We are super
|
|
* shared ISA-space IRQs, so we have to support them. We are super
|
|
* fast in the common case, and fast for shared ISA-space IRQs.
|
|
* fast in the common case, and fast for shared ISA-space IRQs.
|
|
*/
|
|
*/
|
|
-int first_free_entry = NR_IRQS;
|
|
|
|
|
|
+int first_free_entry;
|
|
static void add_pin_to_irq(unsigned int irq, int apic, int pin)
|
|
static void add_pin_to_irq(unsigned int irq, int apic, int pin)
|
|
{
|
|
{
|
|
struct irq_pin_list *entry = irq_2_pin + irq;
|
|
struct irq_pin_list *entry = irq_2_pin + irq;
|