# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1178619507 -32400 # Node ID 1c42e2281e1679d7cd662ecbeb5d929967a2d24a # Parent 89b0cc16c053c917adf6219d55356f969b029a38 code clean up using xen machine vector. PATCHNAME: ia64_machine_vector_clean_up Signed-off-by: Isaku Yamahata diff -r 89b0cc16c053 -r 1c42e2281e16 linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c --- a/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c Tue May 08 15:40:08 2007 +0900 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/irq_ia64.c Tue May 08 19:18:27 2007 +0900 @@ -514,6 +514,68 @@ void xen_smp_intr_init(void) #endif /* CONFIG_SMP */ } +void +xen_irq_init(void) +{ + struct callback_register event = { + .type = CALLBACKTYPE_event, + .address = (unsigned long)&xen_event_callback, + }; + xen_init_IRQ(); + BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event)); + late_time_init = xen_bind_early_percpu_irq; +#ifdef CONFIG_SMP + register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction); +#endif /* CONFIG_SMP */ +} + +void +xen_platform_send_ipi(int cpu, int vector, int delivery_mode, int redirect) +{ + int irq = -1; + +#ifdef CONFIG_SMP + /* TODO: we need to call vcpu_up here */ + if (unlikely(vector == ap_wakeup_vector)) { + extern void xen_send_ipi (int cpu, int vec); + + /* XXX + * This should be in __cpu_up(cpu) in ia64 smpboot.c + * like x86. But don't want to modify it, + * keep it untouched. + */ + xen_smp_intr_init_early(cpu); + + xen_send_ipi (cpu, vector); + //vcpu_prepare_and_up(cpu); + return; + } +#endif + + switch(vector) { + case IA64_IPI_VECTOR: + irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR]; + break; + case IA64_IPI_RESCHEDULE: + irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR]; + break; + case IA64_CMCP_VECTOR: + irq = per_cpu(ipi_to_irq, cpu)[CMCP_VECTOR]; + break; + case IA64_CPEP_VECTOR: + irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR]; + break; + default: + printk(KERN_WARNING "Unsupported IPI type 0x%x\n", + vector); + irq = 0; + break; + } + + BUG_ON(irq < 0); + notify_remote_via_irq(irq); + return; +} #endif /* CONFIG_XEN */ void @@ -541,21 +603,6 @@ void __init void __init init_IRQ (void) { -#ifdef CONFIG_XEN - /* Maybe put into platform_irq_init later */ - if (is_running_on_xen()) { - struct callback_register event = { - .type = CALLBACKTYPE_event, - .address = (unsigned long)&xen_event_callback, - }; - xen_init_IRQ(); - BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event)); - late_time_init = xen_bind_early_percpu_irq; -#ifdef CONFIG_SMP - register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction); -#endif /* CONFIG_SMP */ - } -#endif /* CONFIG_XEN */ register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL); #ifdef CONFIG_SMP register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction); @@ -564,6 +611,10 @@ init_IRQ (void) pfm_init_percpu(); #endif platform_irq_init(); +#ifdef CONFIG_XEN + if (is_running_on_xen() && !ia64_platform_is("xen")) + xen_irq_init(); +#endif } void @@ -574,52 +625,11 @@ ia64_send_ipi (int cpu, int vector, int unsigned long phys_cpu_id; #ifdef CONFIG_XEN - if (is_running_on_xen()) { - int irq = -1; - -#ifdef CONFIG_SMP - /* TODO: we need to call vcpu_up here */ - if (unlikely(vector == ap_wakeup_vector)) { - extern void xen_send_ipi (int cpu, int vec); - - /* XXX - * This should be in __cpu_up(cpu) in ia64 smpboot.c - * like x86. But don't want to modify it, - * keep it untouched. - */ - xen_smp_intr_init_early(cpu); - - xen_send_ipi (cpu, vector); - //vcpu_prepare_and_up(cpu); - return; - } -#endif - - switch(vector) { - case IA64_IPI_VECTOR: - irq = per_cpu(ipi_to_irq, cpu)[IPI_VECTOR]; - break; - case IA64_IPI_RESCHEDULE: - irq = per_cpu(ipi_to_irq, cpu)[RESCHEDULE_VECTOR]; - break; - case IA64_CMCP_VECTOR: - irq = per_cpu(ipi_to_irq, cpu)[CMCP_VECTOR]; - break; - case IA64_CPEP_VECTOR: - irq = per_cpu(ipi_to_irq, cpu)[CPEP_VECTOR]; - break; - default: - printk(KERN_WARNING "Unsupported IPI type 0x%x\n", - vector); - irq = 0; - break; - } - - BUG_ON(irq < 0); - notify_remote_via_irq(irq); + if (is_running_on_xen()) { + xen_platform_send_ipi(cpu, vector, delivery_mode, redirect); return; - } -#endif /* CONFIG_XEN */ + } +#endif #ifdef CONFIG_SMP phys_cpu_id = cpu_physical_id(cpu); diff -r 89b0cc16c053 -r 1c42e2281e16 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Tue May 08 15:40:08 2007 +0900 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Tue May 08 19:18:27 2007 +0900 @@ -603,7 +603,10 @@ setup_arch (char **cmdline_p) platform_setup(cmdline_p); #ifdef CONFIG_XEN - xen_setup(); + if (!is_running_on_xen() && !ia64_platform_is("xen")) { + extern ia64_mv_setup_t xen_setup; + xen_setup(cmdline_p); + } #endif paging_init(); #ifdef CONFIG_XEN @@ -993,12 +996,10 @@ cpu_init (void) /* size of physical stacked register partition plus 8 bytes: */ __get_cpu_var(ia64_phys_stacked_size_p8) = num_phys_stacked*8 + 8; platform_cpu_init(); - #ifdef CONFIG_XEN - /* Need to be moved into platform_cpu_init later */ - if (is_running_on_xen()) { - extern void xen_smp_intr_init(void); - xen_smp_intr_init(); + if (is_running_on_xen() && !ia64_platform_is("xen")) { + extern ia64_mv_cpu_init_t xen_cpu_init; + xen_cpu_init(); } #endif diff -r 89b0cc16c053 -r 1c42e2281e16 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c --- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Tue May 08 15:40:08 2007 +0900 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Tue May 08 19:18:27 2007 +0900 @@ -53,9 +53,13 @@ static int p2m_expose_init(void); EXPORT_SYMBOL(__hypercall); -void -xen_setup(void) -{ +void __init +xen_setup(char **cmdline_p) +{ + extern void dig_setup(char **cmdline_p); + if (ia64_platform_is("xen")) + dig_setup(cmdline_p); + if (!is_running_on_xen() || !is_initial_xendomain()) return; @@ -69,6 +73,13 @@ xen_setup(void) } xen_start_info->console.domU.mfn = 0; xen_start_info->console.domU.evtchn = 0; +} + +void __cpuinit +xen_cpu_init(void) +{ + extern void xen_smp_intr_init(void); + xen_smp_intr_init(); } //XXX same as i386, x86_64 contiguous_bitmap_set(), contiguous_bitmap_clear() diff -r 89b0cc16c053 -r 1c42e2281e16 linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h --- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Tue May 08 15:40:08 2007 +0900 +++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Tue May 08 19:18:27 2007 +0900 @@ -36,7 +36,6 @@ #ifdef CONFIG_XEN extern int running_on_xen; #define is_running_on_xen() (running_on_xen) -extern void xen_setup(void); #else /* CONFIG_XEN */ # ifdef CONFIG_VMX_GUEST # define is_running_on_xen() (1) @@ -44,7 +43,6 @@ extern void xen_setup(void); # define is_running_on_xen() (0) # define HYPERVISOR_ioremap(offset, size) (offset) # endif /* CONFIG_VMX_GUEST */ -#define xen_setup() do { } while (0) #endif /* CONFIG_XEN */ #if defined(CONFIG_XEN) || defined(CONFIG_VMX_GUEST) diff -r 89b0cc16c053 -r 1c42e2281e16 linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h --- a/linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h Tue May 08 15:40:08 2007 +0900 +++ b/linux-2.6-xen-sparse/include/asm-ia64/machvec_xen.h Tue May 08 19:18:27 2007 +0900 @@ -1,7 +1,10 @@ #ifndef _ASM_IA64_MACHVEC_XEN_h #define _ASM_IA64_MACHVEC_XEN_h -extern ia64_mv_setup_t dig_setup; +extern ia64_mv_setup_t xen_setup; +extern ia64_mv_cpu_init_t xen_cpu_init; +extern ia64_mv_irq_init_t xen_irq_init; +extern ia64_mv_send_ipi_t xen_platform_send_ipi; extern ia64_mv_dma_alloc_coherent xen_alloc_coherent; extern ia64_mv_dma_free_coherent xen_free_coherent; extern ia64_mv_dma_map_single xen_map_single; @@ -19,7 +22,10 @@ extern ia64_mv_dma_mapping_error xen_dma * the macros are used directly. */ #define platform_name "xen" -#define platform_setup dig_setup +#define platform_setup xen_setup +#define platform_cpu_init xen_cpu_init +#define platform_irq_init xen_irq_init +#define platform_send_ipi xen_platform_send_ipi #define platform_dma_init machvec_noop #define platform_dma_alloc_coherent xen_alloc_coherent #define platform_dma_free_coherent xen_free_coherent