Commit 2b5982c5 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by David Mosberger

[PATCH] ia64: minor IOSAPIC cleanup

Introduce iosapic_{read,write,eoi} to hide the IOSAPIC REG_SELECT
stuff.  i386 and x86_64 already do this for io_apic_{read,write}.
Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarDavid Mosberger <davidm@hpl.hp.com>
parent 73d7c706
...@@ -217,10 +217,8 @@ set_rte (unsigned int vector, unsigned int dest, int mask) ...@@ -217,10 +217,8 @@ set_rte (unsigned int vector, unsigned int dest, int mask)
spin_lock_irqsave(&iosapic_lock, flags); spin_lock_irqsave(&iosapic_lock, flags);
{ {
writel(IOSAPIC_RTE_HIGH(rte_index), addr + IOSAPIC_REG_SELECT); iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), high32);
writel(high32, addr + IOSAPIC_WINDOW); iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
writel(low32, addr + IOSAPIC_WINDOW);
iosapic_intr_info[vector].low32 = low32; iosapic_intr_info[vector].low32 = low32;
} }
spin_unlock_irqrestore(&iosapic_lock, flags); spin_unlock_irqrestore(&iosapic_lock, flags);
...@@ -249,12 +247,9 @@ mask_irq (unsigned int irq) ...@@ -249,12 +247,9 @@ mask_irq (unsigned int irq)
spin_lock_irqsave(&iosapic_lock, flags); spin_lock_irqsave(&iosapic_lock, flags);
{ {
writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
/* set only the mask bit */ /* set only the mask bit */
low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK; low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK;
iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
writel(low32, addr + IOSAPIC_WINDOW);
} }
spin_unlock_irqrestore(&iosapic_lock, flags); spin_unlock_irqrestore(&iosapic_lock, flags);
} }
...@@ -275,9 +270,8 @@ unmask_irq (unsigned int irq) ...@@ -275,9 +270,8 @@ unmask_irq (unsigned int irq)
spin_lock_irqsave(&iosapic_lock, flags); spin_lock_irqsave(&iosapic_lock, flags);
{ {
writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
low32 = iosapic_intr_info[vec].low32 &= ~IOSAPIC_MASK; low32 = iosapic_intr_info[vec].low32 &= ~IOSAPIC_MASK;
writel(low32, addr + IOSAPIC_WINDOW); iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
} }
spin_unlock_irqrestore(&iosapic_lock, flags); spin_unlock_irqrestore(&iosapic_lock, flags);
} }
...@@ -325,10 +319,8 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask) ...@@ -325,10 +319,8 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask)
low32 |= (IOSAPIC_FIXED << IOSAPIC_DELIVERY_SHIFT); low32 |= (IOSAPIC_FIXED << IOSAPIC_DELIVERY_SHIFT);
iosapic_intr_info[vec].low32 = low32; iosapic_intr_info[vec].low32 = low32;
writel(IOSAPIC_RTE_HIGH(rte_index), addr + IOSAPIC_REG_SELECT); iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), high32);
writel(high32, addr + IOSAPIC_WINDOW); iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
writel(low32, addr + IOSAPIC_WINDOW);
} }
spin_unlock_irqrestore(&iosapic_lock, flags); spin_unlock_irqrestore(&iosapic_lock, flags);
#endif #endif
...@@ -351,7 +343,7 @@ iosapic_end_level_irq (unsigned int irq) ...@@ -351,7 +343,7 @@ iosapic_end_level_irq (unsigned int irq)
ia64_vector vec = irq_to_vector(irq); ia64_vector vec = irq_to_vector(irq);
move_irq(irq); move_irq(irq);
writel(vec, iosapic_intr_info[vec].addr + IOSAPIC_EOI); iosapic_eoi(iosapic_intr_info[vec].addr, vec);
} }
#define iosapic_shutdown_level_irq mask_irq #define iosapic_shutdown_level_irq mask_irq
...@@ -428,8 +420,7 @@ iosapic_version (char *addr) ...@@ -428,8 +420,7 @@ iosapic_version (char *addr)
* unsigned int reserved2 : 8; * unsigned int reserved2 : 8;
* } * }
*/ */
writel(IOSAPIC_VERSION, addr + IOSAPIC_REG_SELECT); return iosapic_read(addr, IOSAPIC_VERSION);
return readl(IOSAPIC_WINDOW + addr);
} }
/* /*
......
#ifndef __ASM_IA64_IOSAPIC_H #ifndef __ASM_IA64_IOSAPIC_H
#define __ASM_IA64_IOSAPIC_H #define __ASM_IA64_IOSAPIC_H
#define IOSAPIC_DEFAULT_ADDR 0xFEC00000
#define IOSAPIC_REG_SELECT 0x0 #define IOSAPIC_REG_SELECT 0x0
#define IOSAPIC_WINDOW 0x10 #define IOSAPIC_WINDOW 0x10
#define IOSAPIC_EOI 0x40 #define IOSAPIC_EOI 0x40
#define IOSAPIC_VERSION 0x1 #define IOSAPIC_VERSION 0x1
/* /*
* Redirection table entry * Redirection table entry
...@@ -55,6 +53,23 @@ ...@@ -55,6 +53,23 @@
#define NR_IOSAPICS 256 #define NR_IOSAPICS 256
static inline unsigned int iosapic_read(char *iosapic, unsigned int reg)
{
writel(reg, iosapic + IOSAPIC_REG_SELECT);
return readl(iosapic + IOSAPIC_WINDOW);
}
static inline void iosapic_write(char *iosapic, unsigned int reg, u32 val)
{
writel(reg, iosapic + IOSAPIC_REG_SELECT);
writel(val, iosapic + IOSAPIC_WINDOW);
}
static inline void iosapic_eoi(char *iosapic, u32 vector)
{
writel(vector, iosapic + IOSAPIC_EOI);
}
extern void __init iosapic_system_init (int pcat_compat); extern void __init iosapic_system_init (int pcat_compat);
extern void __init iosapic_init (unsigned long address, extern void __init iosapic_init (unsigned long address,
unsigned int gsi_base); unsigned int gsi_base);
......
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