Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 104517
b: refs/heads/master
c: 85cbc50
h: refs/heads/master
i:
  104515: b2c1448
v: v3
  • Loading branch information
Isaku Yamahata authored and Tony Luck committed May 27, 2008
1 parent de3ec8d commit a3c6fbb
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 10 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: 33b39e84209b0308b572dce017df7ee9b63f086c
refs/heads/master: 85cbc503787d577c215f9540c57294e1ec799144
18 changes: 13 additions & 5 deletions trunk/arch/ia64/kernel/irq_ia64.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ static void clear_irq_vector(int irq)
}

int
assign_irq_vector (int irq)
ia64_native_assign_irq_vector (int irq)
{
unsigned long flags;
int vector, cpu;
Expand All @@ -222,7 +222,7 @@ assign_irq_vector (int irq)
}

void
free_irq_vector (int vector)
ia64_native_free_irq_vector (int vector)
{
if (vector < IA64_FIRST_DEVICE_VECTOR ||
vector > IA64_LAST_DEVICE_VECTOR)
Expand Down Expand Up @@ -622,7 +622,7 @@ static struct irqaction tlb_irqaction = {
#endif

void
register_percpu_irq (ia64_vector vec, struct irqaction *action)
ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action)
{
irq_desc_t *desc;
unsigned int irq;
Expand All @@ -637,13 +637,21 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action)
}

void __init
init_IRQ (void)
ia64_native_register_ipi(void)
{
register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
#ifdef CONFIG_SMP
register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &tlb_irqaction);
#endif
}

void __init
init_IRQ (void)
{
ia64_register_ipi();
register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
#ifdef CONFIG_SMP
#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)
if (vector_domain_type != VECTOR_DOMAIN_NONE) {
BUG_ON(IA64_FIRST_DEVICE_VECTOR != IA64_IRQ_MOVE_VECTOR);
Expand Down
15 changes: 15 additions & 0 deletions trunk/arch/ia64/kernel/paravirt.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,3 +337,18 @@ struct pv_iosapic_ops pv_iosapic_ops = {
.__read = ia64_native_iosapic_read,
.__write = ia64_native_iosapic_write,
};

/***************************************************************************
* pv_irq_ops
* irq operations
*/

struct pv_irq_ops pv_irq_ops = {
.register_ipi = ia64_native_register_ipi,

.assign_irq_vector = ia64_native_assign_irq_vector,
.free_irq_vector = ia64_native_free_irq_vector,
.register_percpu_irq = ia64_native_register_percpu_irq,

.resend_irq = ia64_native_resend_irq,
};
23 changes: 19 additions & 4 deletions trunk/include/asm-ia64/hw_irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
#include <asm/ptrace.h>
#include <asm/smp.h>

#ifndef CONFIG_PARAVIRT
typedef u8 ia64_vector;
#else
typedef u16 ia64_vector;
#endif

/*
* 0 special
Expand Down Expand Up @@ -104,13 +108,24 @@ DECLARE_PER_CPU(int[IA64_NUM_VECTORS], vector_irq);

extern struct hw_interrupt_type irq_type_ia64_lsapic; /* CPU-internal interrupt controller */

#ifdef CONFIG_PARAVIRT_GUEST
#include <asm/paravirt.h>
#else
#define ia64_register_ipi ia64_native_register_ipi
#define assign_irq_vector ia64_native_assign_irq_vector
#define free_irq_vector ia64_native_free_irq_vector
#define register_percpu_irq ia64_native_register_percpu_irq
#define ia64_resend_irq ia64_native_resend_irq
#endif

extern void ia64_native_register_ipi(void);
extern int bind_irq_vector(int irq, int vector, cpumask_t domain);
extern int assign_irq_vector (int irq); /* allocate a free vector */
extern void free_irq_vector (int vector);
extern int ia64_native_assign_irq_vector (int irq); /* allocate a free vector */
extern void ia64_native_free_irq_vector (int vector);
extern int reserve_irq_vector (int vector);
extern void __setup_vector_irq(int cpu);
extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect);
extern void register_percpu_irq (ia64_vector vec, struct irqaction *action);
extern void ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action);
extern int check_irq_used (int irq);
extern void destroy_and_reserve_irq (unsigned int irq);

Expand All @@ -122,7 +137,7 @@ static inline int irq_prepare_move(int irq, int cpu) { return 0; }
static inline void irq_complete_move(unsigned int irq) {}
#endif

static inline void ia64_resend_irq(unsigned int vector)
static inline void ia64_native_resend_irq(unsigned int vector)
{
platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0);
}
Expand Down
48 changes: 48 additions & 0 deletions trunk/include/asm-ia64/paravirt.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,54 @@ __iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
return pv_iosapic_ops.__write(iosapic, reg, val);
}

/******************************************************************************
* replacement of irq operations.
*/

struct pv_irq_ops {
void (*register_ipi)(void);

int (*assign_irq_vector)(int irq);
void (*free_irq_vector)(int vector);

void (*register_percpu_irq)(ia64_vector vec,
struct irqaction *action);

void (*resend_irq)(unsigned int vector);
};

extern struct pv_irq_ops pv_irq_ops;

static inline void
ia64_register_ipi(void)
{
pv_irq_ops.register_ipi();
}

static inline int
assign_irq_vector(int irq)
{
return pv_irq_ops.assign_irq_vector(irq);
}

static inline void
free_irq_vector(int vector)
{
return pv_irq_ops.free_irq_vector(vector);
}

static inline void
register_percpu_irq(ia64_vector vec, struct irqaction *action)
{
pv_irq_ops.register_percpu_irq(vec, action);
}

static inline void
ia64_resend_irq(unsigned int vector)
{
pv_irq_ops.resend_irq(vector);
}

#endif /* !__ASSEMBLY__ */

#else
Expand Down

0 comments on commit a3c6fbb

Please sign in to comment.