linux-headers/arch/e2k/include/asm/p2v/boot_init.h

373 lines
15 KiB
C

/* $Id: boot_init.h,v 1.18 2009/06/29 11:53:32 atic Exp $
*
* Boot-time initialization of Virtual memory support and switch
* from boot execution on physical memory to boot continuation
* on virtual memory
*/
#ifndef _E2K_P2V_BOOT_INIT_H
#define _E2K_P2V_BOOT_INIT_H
#include <linux/init.h>
#include <linux/topology.h>
#include <asm/cpu_regs_access.h>
#include <asm/bootinfo.h>
#include <asm/numnodes.h>
#ifndef __ASSEMBLY__
/*
* The next structures describe list of the memory areas used by boot-time
* initialization. The item 'phys' points to physical base address of
* area, when the item 'virt' points to virtual base address of same area.
* All the used memory areas enumerate below. If a some new area will be used,
* then it should be added to the list of already known ones.
*/
typedef struct mem_area_desc { /* an area descriptor */
e2k_addr_t phys; /* physical base address area */
e2k_addr_t virt; /* virtual base address of same area */
e2k_size_t size; /* bytes size of the area */
e2k_size_t phys_offset; /* physical offset of the area */
e2k_size_t virt_offset; /* virtual offset of the area */
} mem_area_desc_t;
typedef struct node_mem_area_desc { /* node an area descriptor */
mem_area_desc_t nodes[L_MAX_MEM_NUMNODES];
} node_mem_area_desc_t;
typedef struct bootmem_areas { /* list of all areas */
#ifndef CONFIG_NUMA
mem_area_desc_t text; /* segment 'text' of kernel */
mem_area_desc_t data; /* segment 'data' of kernel */
#else /* CONFIG_NUMA */
node_mem_area_desc_t text; /* nodes segment 'text' of kernel */
node_mem_area_desc_t dup_data; /* nodes duplicated 'data' segment */
node_mem_area_desc_t data; /* node segment 'data' of kernel */
#endif /* ! CONFIG_NUMA */
#ifndef CONFIG_SMP
/*
* Boot-time stacks to switch from physical memory to virtual memory
*/
mem_area_desc_t boot_ps; /* procedure stack of kernel */
mem_area_desc_t boot_pcs; /* procedure chain stack of kernel */
mem_area_desc_t boot_stack; /* kernel procedure local data stack */
#else
/*
* Boot-time stacks to switch from physical memory to virtual memory
*/
mem_area_desc_t boot_ps[NR_CPUS];
mem_area_desc_t boot_pcs[NR_CPUS];
mem_area_desc_t boot_stack[NR_CPUS];
#endif /* CONFIG_SMP */
mem_area_desc_t bootinfo; /* boot-time information from loader */
#ifdef CONFIG_BLK_DEV_INITRD
mem_area_desc_t initrd; /* initial disk info */
#endif /* CONFIG_BLK_DEV_INITRD */
#ifdef CONFIG_L_IO_APIC
mem_area_desc_t mpf; /* MP floating table */
mem_area_desc_t mpc; /* MP configuration table */
#endif /* CONFIG_L_IO_APIC */
mem_area_desc_t symtab; /* kernel symbols table */
mem_area_desc_t strtab; /* kernel strings table */
mem_area_desc_t x86_hw; /* PA 640K - 1M are reserved for PC's */
/* integrated hardware: BIOS, VGA,... */
} bootmem_areas_t;
extern unsigned long totalram_real_pages;
#define boot_totalram_real_pages boot_get_vo_value(totalram_real_pages)
extern bootmem_areas_t kernel_bootmem;
#define boot_kernel_bootmem boot_vp_to_pp(&kernel_bootmem)
#ifndef CONFIG_NUMA
#define boot_text_phys_base boot_get_vo_value(kernel_bootmem.text.phys)
#define boot_text_virt_base boot_get_vo_value(kernel_bootmem.text.virt)
#define boot_text_size boot_get_vo_value(kernel_bootmem.text.size)
#define boot_data_phys_base boot_get_vo_value(kernel_bootmem.data.phys)
#define boot_data_virt_base boot_get_vo_value(kernel_bootmem.data.virt)
#define boot_data_size boot_get_vo_value(kernel_bootmem.data.size)
#else /* CONFIG_NUMA */
#define boot_node_text_phys_base(nid) \
boot_get_vo_value(kernel_bootmem.text.nodes[(nid)].phys)
#define boot_node_text_virt_base(nid) \
boot_get_vo_value(kernel_bootmem.text.nodes[(nid)].virt)
#define boot_node_text_size(nid) \
boot_get_vo_value(kernel_bootmem.text.nodes[(nid)].size)
#define boot_node_dup_data_phys_base(nid) \
boot_get_vo_value(kernel_bootmem.dup_data.nodes[(nid)].phys)
#define boot_node_dup_data_virt_base(nid) \
boot_get_vo_value(kernel_bootmem.dup_data.nodes[(nid)].virt)
#define boot_node_dup_data_size(nid) \
boot_get_vo_value(kernel_bootmem.dup_data.nodes[(nid)].size)
#define boot_node_data_phys_base(nid) \
boot_get_vo_value(kernel_bootmem.data.nodes[(nid)].phys)
#define boot_node_data_virt_base(nid) \
boot_get_vo_value(kernel_bootmem.data.nodes[(nid)].virt)
#define boot_node_data_size(nid) \
boot_get_vo_value(kernel_bootmem.data.nodes[(nid)].size)
#define boot_text_phys_base boot_node_text_phys_base(boot_numa_node_id())
#define boot_text_virt_base boot_node_text_virt_base(boot_numa_node_id())
#define boot_text_size boot_node_text_size(boot_numa_node_id())
#define boot_dup_data_phys_base \
boot_node_dup_data_phys_base(boot_numa_node_id())
#define boot_dup_data_virt_base \
boot_node_dup_data_virt_base(boot_numa_node_id())
#define boot_dup_data_size \
boot_node_dup_data_size(boot_numa_node_id())
#define boot_data_phys_base boot_node_data_phys_base(boot_numa_node_id())
#define boot_data_virt_base boot_node_data_virt_base(boot_numa_node_id())
#define boot_data_size boot_node_data_size(boot_numa_node_id())
#endif /* ! CONFIG_NUMA */
#ifndef CONFIG_SMP
#define boot_boot_ps_phys_base boot_get_vo_value(kernel_bootmem.boot_ps.phys)
#define boot_boot_ps_virt_base boot_get_vo_value(kernel_bootmem.boot_ps.virt)
#define boot_boot_ps_size boot_get_vo_value(kernel_bootmem.boot_ps.size)
#define kernel_boot_ps_phys_base(cpuid) kernel_bootmem.boot_ps.phys
#define kernel_boot_ps_virt_base(cpuid) kernel_bootmem.boot_ps.virt
#define kernel_boot_ps_size(cpuid) kernel_bootmem.boot_ps.size
#else
#define boot_boot_ps_phys_base \
boot_get_vo_value(kernel_bootmem.boot_ps[boot_smp_processor_id()].phys)
#define boot_boot_ps_virt_base \
boot_get_vo_value(kernel_bootmem.boot_ps[boot_smp_processor_id()].virt)
#define boot_boot_ps_size \
boot_get_vo_value(kernel_bootmem.boot_ps[boot_smp_processor_id()].size)
#define kernel_boot_ps_phys_base(cpuid) kernel_bootmem.boot_ps[cpuid].phys
#define kernel_boot_ps_virt_base(cpuid) kernel_bootmem.boot_ps[cpuid].virt
#define kernel_boot_ps_size(cpuid) kernel_bootmem.boot_ps[cpuid].size
#endif /* CONFIG_SMP */
#ifndef CONFIG_SMP
#define boot_boot_pcs_phys_base boot_get_vo_value(kernel_bootmem.boot_pcs.phys)
#define boot_boot_pcs_virt_base boot_get_vo_value(kernel_bootmem.boot_pcs.virt)
#define boot_boot_pcs_size boot_get_vo_value(kernel_bootmem.boot_pcs.size)
#define kernel_boot_pcs_phys_base(cpuid) kernel_bootmem.boot_pcs.phys
#define kernel_boot_pcs_virt_base(cpuid) kernel_bootmem.boot_pcs.virt
#define kernel_boot_pcs_size(cpuid) kernel_bootmem.boot_pcs.size
#else
#define boot_boot_pcs_phys_base \
boot_get_vo_value(kernel_bootmem.boot_pcs[boot_smp_processor_id()].phys)
#define boot_boot_pcs_virt_base \
boot_get_vo_value(kernel_bootmem.boot_pcs[boot_smp_processor_id()].virt)
#define boot_boot_pcs_size \
boot_get_vo_value(kernel_bootmem.boot_pcs[boot_smp_processor_id()].size)
#define kernel_boot_pcs_phys_base(cpuid) \
kernel_bootmem.boot_pcs[cpuid].phys
#define kernel_boot_pcs_virt_base(cpuid) \
kernel_bootmem.boot_pcs[cpuid].virt
#define kernel_boot_pcs_size(cpuid) \
kernel_bootmem.boot_pcs[cpuid].size
#endif /* CONFIG_SMP */
#ifndef CONFIG_SMP
#define boot_boot_stack_phys_base \
boot_get_vo_value(kernel_bootmem.boot_stack.phys)
#define boot_boot_stack_virt_base \
boot_get_vo_value(kernel_bootmem.boot_stack.virt)
#define boot_boot_stack_size \
boot_get_vo_value(kernel_bootmem.boot_stack.size)
#define boot_boot_stack_phys_offset \
boot_get_vo_value(kernel_bootmem.boot_stack.phys_offset)
#define boot_boot_stack_virt_offset \
boot_get_vo_value(kernel_bootmem.boot_stack.virt_offset)
#define kernel_boot_stack_phys_base(cpuid) kernel_bootmem.boot_stack.phys
#define kernel_boot_stack_virt_base(cpuid) kernel_bootmem.boot_stack.virt
#define kernel_boot_stack_virt_offset(cpuid) \
kernel_bootmem.boot_stack.virt_offset
#define kernel_boot_stack_size(cpuid) kernel_bootmem.boot_stack.size
#else
#define boot_boot_stack_phys_base \
boot_get_vo_value(kernel_bootmem.boot_stack[boot_smp_processor_id()]. \
phys)
#define boot_boot_stack_virt_base \
boot_get_vo_value(kernel_bootmem.boot_stack[boot_smp_processor_id()]. \
virt)
#define boot_boot_stack_size \
boot_get_vo_value(kernel_bootmem.boot_stack[boot_smp_processor_id()]. \
size)
#define boot_boot_stack_phys_offset \
boot_get_vo_value(kernel_bootmem.boot_stack[boot_smp_processor_id()]. \
phys_offset)
#define boot_boot_stack_virt_offset \
boot_get_vo_value(kernel_bootmem.boot_stack[boot_smp_processor_id()]. \
virt_offset)
#define kernel_boot_stack_phys_base(cpuid) \
kernel_bootmem.boot_stack[cpuid].phys
#define kernel_boot_stack_virt_base(cpuid) \
kernel_bootmem.boot_stack[cpuid].virt
#define kernel_boot_stack_virt_offset(cpuid) \
kernel_bootmem.boot_stack[cpuid].virt_offset
#define kernel_boot_stack_size(cpuid) \
kernel_bootmem.boot_stack[cpuid].size
#endif /* CONFIG_SMP */
#define boot_bootinfo_phys_base boot_get_vo_value(kernel_bootmem.bootinfo.phys)
#define boot_bootinfo_virt_base boot_get_vo_value(kernel_bootmem.bootinfo.virt)
#define boot_bootinfo_size boot_get_vo_value(kernel_bootmem.bootinfo.size)
#define init_bootinfo_phys_base kernel_bootmem.bootinfo.phys
#define init_bootinfo_virt_base kernel_bootmem.bootinfo.virt
#define init_bootinfo_size kernel_bootmem.bootinfo.size
#ifdef CONFIG_BLK_DEV_INITRD
#define boot_initrd_phys_base boot_get_vo_value(kernel_bootmem.initrd.phys)
#define boot_initrd_virt_base boot_get_vo_value(kernel_bootmem.initrd.virt)
#define boot_initrd_size boot_get_vo_value(kernel_bootmem.initrd.size)
#define init_initrd_phys_base kernel_bootmem.initrd.phys
#define init_initrd_virt_base kernel_bootmem.initrd.virt
#define init_initrd_size kernel_bootmem.initrd.size
#endif /* CONFIG_BLK_DEV_INITRD */
#ifdef CONFIG_L_IO_APIC
#define boot_mpf_phys_base boot_get_vo_value(kernel_bootmem.mpf.phys)
#define boot_mpf_virt_base boot_get_vo_value(kernel_bootmem.mpf.virt)
#define boot_mpf_size boot_get_vo_value(kernel_bootmem.mpf.size)
#define init_mpf_phys_base kernel_bootmem.mpf.phys
#define init_mpf_virt_base kernel_bootmem.mpf.virt
#define init_mpf_size kernel_bootmem.mpf.size
#define boot_mpc_phys_base boot_get_vo_value(kernel_bootmem.mpc.phys)
#define boot_mpc_virt_base boot_get_vo_value(kernel_bootmem.mpc.virt)
#define boot_mpc_size boot_get_vo_value(kernel_bootmem.mpc.size)
#define init_mpc_phys_base kernel_bootmem.mpc.phys
#define init_mpc_virt_base kernel_bootmem.mpc.virt
#define init_mpc_size kernel_bootmem.mpc.size
#endif /* CONFIG_L_IO_APIC */
#define boot_symtab_phys_base boot_get_vo_value(kernel_bootmem.symtab.phys)
#define boot_symtab_virt_base boot_get_vo_value(kernel_bootmem.symtab.virt)
#define boot_symtab_size boot_get_vo_value(kernel_bootmem.symtab.size)
#define init_symtab_phys_base kernel_bootmem.symtab.phys
#define init_symtab_virt_base kernel_bootmem.symtab.virt
#define init_symtab_size kernel_bootmem.symtab.size
#define boot_strtab_phys_base boot_get_vo_value(kernel_bootmem.strtab.phys)
#define boot_strtab_virt_base boot_get_vo_value(kernel_bootmem.strtab.virt)
#define boot_strtab_size boot_get_vo_value(kernel_bootmem.strtab.size)
#define init_strtab_phys_base kernel_bootmem.strtab.phys
#define init_strtab_virt_base kernel_bootmem.strtab.virt
#define init_strtab_size kernel_bootmem.strtab.size
#define boot_x86_hw_phys_base boot_get_vo_value(kernel_bootmem.x86_hw.phys)
#define boot_x86_hw_size boot_get_vo_value(kernel_bootmem.x86_hw.size)
#define init_x86_hw_phys_base kernel_bootmem.x86_hw.phys
#define init_x86_hw_size kernel_bootmem.x86_hw.size
extern unsigned long disable_caches;
extern unsigned long disable_secondary_caches;
extern unsigned long disable_IP;
#ifdef CONFIG_NUMA
extern boot_spinlock_t __initdata boot_node_map_lock[MAX_NUMNODES];
extern int __initdata node_mem_mapped[MAX_NUMNODES];
#define boot_node_mem_mapped \
boot_get_vo_value(node_mem_mapped[boot_numa_node_id()])
#else /* ! CONFIG_NUMA */
#define boot_node_map_lock SPIN_LOCK_UNLOCKED;
#define boot_node_mem_mapped 0
#endif /* CONFIG_NUMA */
/*
* Forwards of functions of Virtual memory support initialization
*/
extern void boot_mem_init(bool bsp, int cpuid, boot_info_t *boot_info,
void (*boot_init_sequel_func)(bool bsp, int cpuid, int cpus));
extern int boot_native_loader_probe_memory(
node_phys_mem_t *nodes_phys_mem,
boot_info_t *bootblock);
extern int boot_biosx86_probe_memory(
node_phys_mem_t *nodes_phys_mem,
boot_info_t *bootblock);
extern e2k_size_t boot_native_get_bootblock_size(boot_info_t *bblock);
extern void boot_native_reserve_all_bootmem(bool bsp, boot_info_t *boot_info);
extern void boot_reserve_stacks(boot_info_t *boot_info);
extern void boot_reserve_kernel_image(bool bsp, boot_info_t *boot_info);
extern void boot_reserve_bootblock(bool bsp, boot_info_t *boot_info);
extern void boot_native_map_all_bootmem(bool bsp, boot_info_t *boot_info);
extern void boot_map_kernel_image(bool populate_on_host);
extern void boot_map_kernel_boot_stacks(void);
extern void boot_map_all_phys_memory(void);
extern void boot_map_all_bootinfo_areas(boot_info_t *boot_info);
extern void init_mem_term(int cpuid);
extern void boot_native_map_needful_to_equal_virt_area(
e2k_addr_t stack_top_addr);
extern void boot_native_switch_to_virt(bool bsp, int cpuid,
void (*boot_init_sequel_func)(bool bsp, int cpuid, int cpus));
extern void __init_recv switch_to_phys(void (*restart_sequel_func)(int));
extern void __init_recv switch_to_phys_end(void);
#if defined(CONFIG_PARAVIRT_GUEST)
/* it is paravirtualized host and guest kernel */
#include <asm/paravirt/boot.h>
#elif defined(CONFIG_KVM_GUEST_KERNEL)
/* it is pure guest kernel (not paravirtualized based on pv_ops */
#include <asm/kvm/guest/boot.h>
#else /* native kernel */
/* it is native kernel without any virtualization */
/* or it is native host kernel with virtualization support */
static inline int __init
boot_loader_probe_memory(node_phys_mem_t *nodes_phys_mem,
boot_info_t *bootblock)
{
return boot_native_loader_probe_memory(nodes_phys_mem, bootblock);
}
static inline e2k_size_t __init
boot_get_bootblock_size(boot_info_t *bootblock)
{
return boot_native_get_bootblock_size(bootblock);
}
static inline void __init
boot_reserve_all_bootmem(bool bsp, boot_info_t *boot_info)
{
boot_native_reserve_all_bootmem(bsp, boot_info);
}
static inline void __init
boot_map_all_bootmem(bool bsp, boot_info_t *boot_info)
{
boot_native_map_all_bootmem(bsp, boot_info);
}
static inline void __init_recv
boot_map_needful_to_equal_virt_area(e2k_addr_t stack_top_addr)
{
boot_native_map_needful_to_equal_virt_area(stack_top_addr);
}
static inline void __init_recv
boot_kernel_switch_to_virt(bool bsp, int cpuid,
void (*boot_init_sequel_func)(bool bsp, int cpuid, int cpus_to_sync))
{
boot_native_switch_to_virt(bsp, cpuid, boot_init_sequel_func);
}
/* pv_ops does not used in native host/guest mode */
static inline void native_pv_ops_to_boot_ops(void)
{
}
static inline void native_boot_pv_ops_to_ops(void)
{
}
#endif /* CONFIG_PARAVIRT_GUEST */
#endif /* !(__ASSEMBLY__) */
#endif /* _E2K_P2V_BOOT_INIT_H */