Commit 7d14f145 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6:
  [IA64] New IA64 core/thread detection patch
  [IA64] Increase max node count on SN platforms
  [IA64] Increase max node count on SN platforms
  [IA64] Increase max node count on SN platforms
  [IA64] Increase max node count on SN platforms
  [IA64] Tollhouse HP: IA64 arch changes
  [IA64] cleanup dig_irq_init
  [IA64] MCA recovery: kernel context recovery table
  IA64: Use early_parm to handle mvec_name and nomca
  [IA64] move patchlist and machvec into init section
  [IA64] add init declaration - nolwsys
  [IA64] add init declaration - gate page functions
  [IA64] add init declaration to memory initialization functions
  [IA64] add init declaration to cpu initialization functions
  [IA64] add __init declaration to mca functions
  [IA64] Ignore disabled Local SAPIC Affinity Structure in SRAT
  [IA64] sn_check_intr: use ia64_get_irr()
  [IA64] fix ia64 is_hugepage_only_range
parents 2e1ca21d 4129a953
...@@ -252,6 +252,15 @@ config NR_CPUS ...@@ -252,6 +252,15 @@ config NR_CPUS
than 64 will cause the use of a CPU mask array, causing a small than 64 will cause the use of a CPU mask array, causing a small
performance hit. performance hit.
config IA64_NR_NODES
int "Maximum number of NODEs (256-1024)" if (IA64_SGI_SN2 || IA64_GENERIC)
range 256 1024
depends on IA64_SGI_SN2 || IA64_GENERIC
default "256"
help
This option specifies the maximum number of nodes in your SSI system.
If in doubt, use the default.
config HOTPLUG_CPU config HOTPLUG_CPU
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
depends on SMP && EXPERIMENTAL depends on SMP && EXPERIMENTAL
......
...@@ -116,6 +116,7 @@ CONFIG_IOSAPIC=y ...@@ -116,6 +116,7 @@ CONFIG_IOSAPIC=y
CONFIG_FORCE_MAX_ZONEORDER=17 CONFIG_FORCE_MAX_ZONEORDER=17
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=512 CONFIG_NR_CPUS=512
CONFIG_IA64_NR_NODES=256
CONFIG_HOTPLUG_CPU=y CONFIG_HOTPLUG_CPU=y
# CONFIG_SCHED_SMT is not set # CONFIG_SCHED_SMT is not set
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
......
...@@ -116,6 +116,7 @@ CONFIG_IA64_SGI_SN_XP=m ...@@ -116,6 +116,7 @@ CONFIG_IA64_SGI_SN_XP=m
CONFIG_FORCE_MAX_ZONEORDER=17 CONFIG_FORCE_MAX_ZONEORDER=17
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=1024 CONFIG_NR_CPUS=1024
CONFIG_IA64_NR_NODES=256
# CONFIG_HOTPLUG_CPU is not set # CONFIG_HOTPLUG_CPU is not set
CONFIG_SCHED_SMT=y CONFIG_SCHED_SMT=y
CONFIG_PREEMPT=y CONFIG_PREEMPT=y
......
...@@ -116,6 +116,7 @@ CONFIG_IOSAPIC=y ...@@ -116,6 +116,7 @@ CONFIG_IOSAPIC=y
CONFIG_FORCE_MAX_ZONEORDER=17 CONFIG_FORCE_MAX_ZONEORDER=17
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=512 CONFIG_NR_CPUS=512
CONFIG_IA64_NR_NODES=256
CONFIG_HOTPLUG_CPU=y CONFIG_HOTPLUG_CPU=y
# CONFIG_SCHED_SMT is not set # CONFIG_SCHED_SMT is not set
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
......
...@@ -69,8 +69,3 @@ dig_setup (char **cmdline_p) ...@@ -69,8 +69,3 @@ dig_setup (char **cmdline_p)
screen_info.orig_video_isVGA = 1; /* XXX fake */ screen_info.orig_video_isVGA = 1; /* XXX fake */
screen_info.orig_video_ega_bx = 3; /* XXX fake */ screen_info.orig_video_ega_bx = 3; /* XXX fake */
} }
void __init
dig_irq_init (void)
{
}
...@@ -420,6 +420,26 @@ int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS]; ...@@ -420,6 +420,26 @@ int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS];
int __initdata nid_to_pxm_map[MAX_NUMNODES]; int __initdata nid_to_pxm_map[MAX_NUMNODES];
static struct acpi_table_slit __initdata *slit_table; static struct acpi_table_slit __initdata *slit_table;
static int get_processor_proximity_domain(struct acpi_table_processor_affinity *pa)
{
int pxm;
pxm = pa->proximity_domain;
if (ia64_platform_is("sn2"))
pxm += pa->reserved[0] << 8;
return pxm;
}
static int get_memory_proximity_domain(struct acpi_table_memory_affinity *ma)
{
int pxm;
pxm = ma->proximity_domain;
if (ia64_platform_is("sn2"))
pxm += ma->reserved1[0] << 8;
return pxm;
}
/* /*
* ACPI 2.0 SLIT (System Locality Information Table) * ACPI 2.0 SLIT (System Locality Information Table)
* http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf
...@@ -443,13 +463,20 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit) ...@@ -443,13 +463,20 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
void __init void __init
acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa) acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
{ {
int pxm;
if (!pa->flags.enabled)
return;
pxm = get_processor_proximity_domain(pa);
/* record this node in proximity bitmap */ /* record this node in proximity bitmap */
pxm_bit_set(pa->proximity_domain); pxm_bit_set(pxm);
node_cpuid[srat_num_cpus].phys_id = node_cpuid[srat_num_cpus].phys_id =
(pa->apic_id << 8) | (pa->lsapic_eid); (pa->apic_id << 8) | (pa->lsapic_eid);
/* nid should be overridden as logical node id later */ /* nid should be overridden as logical node id later */
node_cpuid[srat_num_cpus].nid = pa->proximity_domain; node_cpuid[srat_num_cpus].nid = pxm;
srat_num_cpus++; srat_num_cpus++;
} }
...@@ -457,10 +484,10 @@ void __init ...@@ -457,10 +484,10 @@ void __init
acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma) acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
{ {
unsigned long paddr, size; unsigned long paddr, size;
u8 pxm; int pxm;
struct node_memblk_s *p, *q, *pend; struct node_memblk_s *p, *q, *pend;
pxm = ma->proximity_domain; pxm = get_memory_proximity_domain(ma);
/* fill node memory chunk structure */ /* fill node memory chunk structure */
paddr = ma->base_addr_hi; paddr = ma->base_addr_hi;
......
...@@ -865,6 +865,7 @@ ENTRY(interrupt) ...@@ -865,6 +865,7 @@ ENTRY(interrupt)
;; ;;
SAVE_REST SAVE_REST
;; ;;
MCA_RECOVER_RANGE(interrupt)
alloc r14=ar.pfs,0,0,2,0 // must be first in an insn group alloc r14=ar.pfs,0,0,2,0 // must be first in an insn group
mov out0=cr.ivr // pass cr.ivr as first arg mov out0=cr.ivr // pass cr.ivr as first arg
add out1=16,sp // pass pointer to pt_regs as second arg add out1=16,sp // pass pointer to pt_regs as second arg
......
...@@ -14,7 +14,15 @@ ...@@ -14,7 +14,15 @@
struct ia64_machine_vector ia64_mv; struct ia64_machine_vector ia64_mv;
EXPORT_SYMBOL(ia64_mv); EXPORT_SYMBOL(ia64_mv);
static struct ia64_machine_vector * static __initdata const char *mvec_name;
static __init int setup_mvec(char *s)
{
mvec_name = s;
return 0;
}
early_param("machvec", setup_mvec);
static struct ia64_machine_vector * __init
lookup_machvec (const char *name) lookup_machvec (const char *name)
{ {
extern struct ia64_machine_vector machvec_start[]; extern struct ia64_machine_vector machvec_start[];
...@@ -33,10 +41,13 @@ machvec_init (const char *name) ...@@ -33,10 +41,13 @@ machvec_init (const char *name)
{ {
struct ia64_machine_vector *mv; struct ia64_machine_vector *mv;
if (!name)
name = mvec_name ? mvec_name : acpi_get_sysname();
mv = lookup_machvec(name); mv = lookup_machvec(name);
if (!mv) { if (!mv)
panic("generic kernel failed to find machine vector for platform %s!", name); panic("generic kernel failed to find machine vector for"
} " platform %s!", name);
ia64_mv = *mv; ia64_mv = *mv;
printk(KERN_INFO "booting generic kernel on platform %s\n", name); printk(KERN_INFO "booting generic kernel on platform %s\n", name);
} }
......
...@@ -83,6 +83,7 @@ ...@@ -83,6 +83,7 @@
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/hw_irq.h> #include <asm/hw_irq.h>
#include "mca_drv.h"
#include "entry.h" #include "entry.h"
#if defined(IA64_MCA_DEBUG_INFO) #if defined(IA64_MCA_DEBUG_INFO)
...@@ -133,7 +134,7 @@ static int cpe_poll_enabled = 1; ...@@ -133,7 +134,7 @@ static int cpe_poll_enabled = 1;
extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe); extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe);
static int mca_init; static int mca_init __initdata;
static void inline static void inline
...@@ -184,7 +185,7 @@ static ia64_state_log_t ia64_state_log[IA64_MAX_LOG_TYPES]; ...@@ -184,7 +185,7 @@ static ia64_state_log_t ia64_state_log[IA64_MAX_LOG_TYPES];
* Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE})
* Outputs : None * Outputs : None
*/ */
static void static void __init
ia64_log_init(int sal_info_type) ia64_log_init(int sal_info_type)
{ {
u64 max_size = 0; u64 max_size = 0;
...@@ -281,6 +282,50 @@ ia64_mca_log_sal_error_record(int sal_info_type) ...@@ -281,6 +282,50 @@ ia64_mca_log_sal_error_record(int sal_info_type)
ia64_sal_clear_state_info(sal_info_type); ia64_sal_clear_state_info(sal_info_type);
} }
/*
* search_mca_table
* See if the MCA surfaced in an instruction range
* that has been tagged as recoverable.
*
* Inputs
* first First address range to check
* last Last address range to check
* ip Instruction pointer, address we are looking for
*
* Return value:
* 1 on Success (in the table)/ 0 on Failure (not in the table)
*/
int
search_mca_table (const struct mca_table_entry *first,
const struct mca_table_entry *last,
unsigned long ip)
{
const struct mca_table_entry *curr;
u64 curr_start, curr_end;
curr = first;
while (curr <= last) {
curr_start = (u64) &curr->start_addr + curr->start_addr;
curr_end = (u64) &curr->end_addr + curr->end_addr;
if ((ip >= curr_start) && (ip <= curr_end)) {
return 1;
}
curr++;
}
return 0;
}
/* Given an address, look for it in the mca tables. */
int mca_recover_range(unsigned long addr)
{
extern struct mca_table_entry __start___mca_table[];
extern struct mca_table_entry __stop___mca_table[];
return search_mca_table(__start___mca_table, __stop___mca_table-1, addr);
}
EXPORT_SYMBOL_GPL(mca_recover_range);
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
int cpe_vector = -1; int cpe_vector = -1;
...@@ -355,7 +400,7 @@ ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs) ...@@ -355,7 +400,7 @@ ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs)
* Outputs * Outputs
* None * None
*/ */
static void static void __init
ia64_mca_register_cpev (int cpev) ia64_mca_register_cpev (int cpev)
{ {
/* Register the CPE interrupt vector with SAL */ /* Register the CPE interrupt vector with SAL */
...@@ -386,7 +431,7 @@ ia64_mca_register_cpev (int cpev) ...@@ -386,7 +431,7 @@ ia64_mca_register_cpev (int cpev)
* Outputs * Outputs
* None * None
*/ */
void void __cpuinit
ia64_mca_cmc_vector_setup (void) ia64_mca_cmc_vector_setup (void)
{ {
cmcv_reg_t cmcv; cmcv_reg_t cmcv;
...@@ -747,6 +792,8 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, ...@@ -747,6 +792,8 @@ ia64_mca_modify_original_stack(struct pt_regs *regs,
ia64_mca_modify_comm(previous_current); ia64_mca_modify_comm(previous_current);
goto no_mod; goto no_mod;
} }
if (!mca_recover_range(ms->pmsa_iip)) {
if (r13 != sos->prev_IA64_KR_CURRENT) { if (r13 != sos->prev_IA64_KR_CURRENT) {
msg = "inconsistent previous current and r13"; msg = "inconsistent previous current and r13";
goto no_mod; goto no_mod;
...@@ -773,6 +820,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs, ...@@ -773,6 +820,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs,
msg = "no room for blocked state"; msg = "no room for blocked state";
goto no_mod; goto no_mod;
} }
}
ia64_mca_modify_comm(previous_current); ia64_mca_modify_comm(previous_current);
...@@ -1443,7 +1491,7 @@ static struct irqaction mca_cpep_irqaction = { ...@@ -1443,7 +1491,7 @@ static struct irqaction mca_cpep_irqaction = {
* format most of the fields. * format most of the fields.
*/ */
static void static void __cpuinit
format_mca_init_stack(void *mca_data, unsigned long offset, format_mca_init_stack(void *mca_data, unsigned long offset,
const char *type, int cpu) const char *type, int cpu)
{ {
...@@ -1467,7 +1515,7 @@ format_mca_init_stack(void *mca_data, unsigned long offset, ...@@ -1467,7 +1515,7 @@ format_mca_init_stack(void *mca_data, unsigned long offset,
/* Do per-CPU MCA-related initialization. */ /* Do per-CPU MCA-related initialization. */
void __devinit void __cpuinit
ia64_mca_cpu_init(void *cpu_data) ia64_mca_cpu_init(void *cpu_data)
{ {
void *pal_vaddr; void *pal_vaddr;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* Copyright (C) Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com) * Copyright (C) Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com)
* Copyright (C) 2005 Silicon Graphics, Inc * Copyright (C) 2005 Silicon Graphics, Inc
* Copyright (C) 2005 Keith Owens <kaos@sgi.com> * Copyright (C) 2005 Keith Owens <kaos@sgi.com>
* Copyright (C) 2006 Russ Anderson <rja@sgi.com>
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -121,11 +122,12 @@ mca_page_isolate(unsigned long paddr) ...@@ -121,11 +122,12 @@ mca_page_isolate(unsigned long paddr)
*/ */
void void
mca_handler_bh(unsigned long paddr) mca_handler_bh(unsigned long paddr, void *iip, unsigned long ipsr)
{ {
printk(KERN_ERR printk(KERN_ERR "OS_MCA: process [cpu %d, pid: %d, uid: %d, "
"OS_MCA: process [pid: %d](%s) encounters MCA (paddr=%lx)\n", "iip: %p, psr: 0x%lx,paddr: 0x%lx](%s) encounters MCA.\n",
current->pid, current->comm, paddr); raw_smp_processor_id(), current->pid, current->uid,
iip, ipsr, paddr, current->comm);
spin_lock(&mca_bh_lock); spin_lock(&mca_bh_lock);
switch (mca_page_isolate(paddr)) { switch (mca_page_isolate(paddr)) {
...@@ -442,21 +444,26 @@ recover_from_read_error(slidx_table_t *slidx, ...@@ -442,21 +444,26 @@ recover_from_read_error(slidx_table_t *slidx,
if (!peidx_bottom(peidx) || !(peidx_bottom(peidx)->valid.minstate)) if (!peidx_bottom(peidx) || !(peidx_bottom(peidx)->valid.minstate))
return 0; return 0;
psr1 =(struct ia64_psr *)&(peidx_minstate_area(peidx)->pmsa_ipsr); psr1 =(struct ia64_psr *)&(peidx_minstate_area(peidx)->pmsa_ipsr);
psr2 =(struct ia64_psr *)&(peidx_minstate_area(peidx)->pmsa_xpsr);
/* /*
* Check the privilege level of interrupted context. * Check the privilege level of interrupted context.
* If it is user-mode, then terminate affected process. * If it is user-mode, then terminate affected process.
*/ */
if (psr1->cpl != 0) {
pmsa = sos->pal_min_state;
if (psr1->cpl != 0 ||
((psr2->cpl != 0) && mca_recover_range(pmsa->pmsa_iip))) {
smei = peidx_bus_check(peidx, 0); smei = peidx_bus_check(peidx, 0);
if (smei->valid.target_identifier) { if (smei->valid.target_identifier) {
/* /*
* setup for resume to bottom half of MCA, * setup for resume to bottom half of MCA,
* "mca_handler_bhhook" * "mca_handler_bhhook"
*/ */
pmsa = sos->pal_min_state; /* pass to bhhook as argument (gr8, ...) */
/* pass to bhhook as 1st argument (gr8) */
pmsa->pmsa_gr[8-1] = smei->target_identifier; pmsa->pmsa_gr[8-1] = smei->target_identifier;
pmsa->pmsa_gr[9-1] = pmsa->pmsa_iip;
pmsa->pmsa_gr[10-1] = pmsa->pmsa_ipsr;
/* set interrupted return address (but no use) */ /* set interrupted return address (but no use) */
pmsa->pmsa_br0 = pmsa->pmsa_iip; pmsa->pmsa_br0 = pmsa->pmsa_iip;
/* change resume address to bottom half */ /* change resume address to bottom half */
...@@ -466,6 +473,7 @@ recover_from_read_error(slidx_table_t *slidx, ...@@ -466,6 +473,7 @@ recover_from_read_error(slidx_table_t *slidx,
psr2 = (struct ia64_psr *)&pmsa->pmsa_ipsr; psr2 = (struct ia64_psr *)&pmsa->pmsa_ipsr;
psr2->cpl = 0; psr2->cpl = 0;
psr2->ri = 0; psr2->ri = 0;
psr2->bn = 1;
psr2->i = 0; psr2->i = 0;
return 1; return 1;
......
...@@ -111,3 +111,10 @@ typedef struct slidx_table { ...@@ -111,3 +111,10 @@ typedef struct slidx_table {
slidx_foreach_entry(__pos, &((slidx)->sec)) { __count++; }\ slidx_foreach_entry(__pos, &((slidx)->sec)) { __count++; }\
__count; }) __count; })
struct mca_table_entry {
int start_addr; /* location-relative starting address of MCA recoverable range */
int end_addr; /* location-relative ending address of MCA recoverable range */
};
extern const struct mca_table_entry *search_mca_tables (unsigned long addr);
extern int mca_recover_range(unsigned long);
...@@ -14,15 +14,12 @@ ...@@ -14,15 +14,12 @@
GLOBAL_ENTRY(mca_handler_bhhook) GLOBAL_ENTRY(mca_handler_bhhook)
invala // clear RSE ? invala // clear RSE ?
;;
cover cover
;; ;;
clrrrb clrrrb
;; ;;
alloc r16=ar.pfs,0,2,1,0 // make a new frame alloc r16=ar.pfs,0,2,3,0 // make a new frame
;;
mov ar.rsc=0 mov ar.rsc=0
;;
mov r13=IA64_KR(CURRENT) // current task pointer mov r13=IA64_KR(CURRENT) // current task pointer
;; ;;
mov r2=r13 mov r2=r13
...@@ -30,7 +27,6 @@ GLOBAL_ENTRY(mca_handler_bhhook) ...@@ -30,7 +27,6 @@ GLOBAL_ENTRY(mca_handler_bhhook)
addl r22=IA64_RBS_OFFSET,r2 addl r22=IA64_RBS_OFFSET,r2
;; ;;
mov ar.bspstore=r22 mov ar.bspstore=r22
;;
addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
;; ;;
adds r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13 adds r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
...@@ -40,12 +36,12 @@ GLOBAL_ENTRY(mca_handler_bhhook) ...@@ -40,12 +36,12 @@ GLOBAL_ENTRY(mca_handler_bhhook)
movl loc1=mca_handler_bh // recovery C function movl loc1=mca_handler_bh // recovery C function
;; ;;
mov out0=r8 // poisoned address mov out0=r8 // poisoned address
mov out1=r9 // iip
mov out2=r10 // psr
mov b6=loc1 mov b6=loc1
;; ;;
mov loc1=rp mov loc1=rp
;; ssm psr.i | psr.ic
ssm psr.i
;;
br.call.sptk.many rp=b6 // does not return ... br.call.sptk.many rp=b6 // does not return ...
;; ;;
mov ar.pfs=loc0 mov ar.pfs=loc0
...@@ -53,5 +49,4 @@ GLOBAL_ENTRY(mca_handler_bhhook) ...@@ -53,5 +49,4 @@ GLOBAL_ENTRY(mca_handler_bhhook)
;; ;;
mov r8=r0 mov r8=r0
br.ret.sptk.many rp br.ret.sptk.many rp
;;
END(mca_handler_bhhook) END(mca_handler_bhhook)
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/smp.h> #include <asm/smp.h>
u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; u16 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
EXPORT_SYMBOL(cpu_to_node_map); EXPORT_SYMBOL(cpu_to_node_map);
cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
......
...@@ -115,7 +115,7 @@ ia64_patch_vtop (unsigned long start, unsigned long end) ...@@ -115,7 +115,7 @@ ia64_patch_vtop (unsigned long start, unsigned long end)
ia64_srlz_i(); ia64_srlz_i();
} }
void void __init
ia64_patch_mckinley_e9 (unsigned long start, unsigned long end) ia64_patch_mckinley_e9 (unsigned long start, unsigned long end)
{ {
static int first_time = 1; static int first_time = 1;
...@@ -149,7 +149,7 @@ ia64_patch_mckinley_e9 (unsigned long start, unsigned long end) ...@@ -149,7 +149,7 @@ ia64_patch_mckinley_e9 (unsigned long start, unsigned long end)
ia64_srlz_i(); ia64_srlz_i();
} }
static void static void __init
patch_fsyscall_table (unsigned long start, unsigned long end) patch_fsyscall_table (unsigned long start, unsigned long end)
{ {
extern unsigned long fsyscall_table[NR_syscalls]; extern unsigned long fsyscall_table[NR_syscalls];
...@@ -166,7 +166,7 @@ patch_fsyscall_table (unsigned long start, unsigned long end) ...@@ -166,7 +166,7 @@ patch_fsyscall_table (unsigned long start, unsigned long end)
ia64_srlz_i(); ia64_srlz_i();
} }
static void static void __init
patch_brl_fsys_bubble_down (unsigned long start, unsigned long end) patch_brl_fsys_bubble_down (unsigned long start, unsigned long end)
{ {
extern char fsys_bubble_down[]; extern char fsys_bubble_down[];
...@@ -184,7 +184,7 @@ patch_brl_fsys_bubble_down (unsigned long start, unsigned long end) ...@@ -184,7 +184,7 @@ patch_brl_fsys_bubble_down (unsigned long start, unsigned long end)
ia64_srlz_i(); ia64_srlz_i();
} }
void void __init
ia64_patch_gate (void) ia64_patch_gate (void)
{ {
# define START(name) ((unsigned long) __start_gate_##name##_patchlist) # define START(name) ((unsigned long) __start_gate_##name##_patchlist)
......
...@@ -130,8 +130,8 @@ EXPORT_SYMBOL(ia64_max_iommu_merge_mask); ...@@ -130,8 +130,8 @@ EXPORT_SYMBOL(ia64_max_iommu_merge_mask);
/* /*
* We use a special marker for the end of memory and it uses the extra (+1) slot * We use a special marker for the end of memory and it uses the extra (+1) slot
*/ */
struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1]; struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1] __initdata;
int num_rsvd_regions; int num_rsvd_regions __initdata;
/* /*
...@@ -140,7 +140,7 @@ int num_rsvd_regions; ...@@ -140,7 +140,7 @@ int num_rsvd_regions;
* caller-specified function is called with the memory ranges that remain after filtering. * caller-specified function is called with the memory ranges that remain after filtering.
* This routine does not assume the incoming segments are sorted. * This routine does not assume the incoming segments are sorted.
*/ */
int int __init
filter_rsvd_memory (unsigned long start, unsigned long end, void *arg) filter_rsvd_memory (unsigned long start, unsigned long end, void *arg)
{ {
unsigned long range_start, range_end, prev_start; unsigned long range_start, range_end, prev_start;
...@@ -176,7 +176,7 @@ filter_rsvd_memory (unsigned long start, unsigned long end, void *arg) ...@@ -176,7 +176,7 @@ filter_rsvd_memory (unsigned long start, unsigned long end, void *arg)
return 0; return 0;
} }
static void static void __init
sort_regions (struct rsvd_region *rsvd_region, int max) sort_regions (struct rsvd_region *rsvd_region, int max)
{ {
int j; int j;
...@@ -217,7 +217,7 @@ __initcall(register_memory); ...@@ -217,7 +217,7 @@ __initcall(register_memory);
* initrd, etc. There are currently %IA64_MAX_RSVD_REGIONS defined, * initrd, etc. There are currently %IA64_MAX_RSVD_REGIONS defined,
* see include/asm-ia64/meminit.h if you need to define more. * see include/asm-ia64/meminit.h if you need to define more.
*/ */
void void __init
reserve_memory (void) reserve_memory (void)
{ {
int n = 0; int n = 0;
...@@ -269,7 +269,7 @@ reserve_memory (void) ...@@ -269,7 +269,7 @@ reserve_memory (void)
* Grab the initrd start and end from the boot parameter struct given us by * Grab the initrd start and end from the boot parameter struct given us by
* the boot loader. * the boot loader.
*/ */
void void __init
find_initrd (void) find_initrd (void)
{ {
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
...@@ -361,7 +361,7 @@ mark_bsp_online (void) ...@@ -361,7 +361,7 @@ mark_bsp_online (void)
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static void static void __init
check_for_logical_procs (void) check_for_logical_procs (void)
{ {
pal_logical_to_physical_t info; pal_logical_to_physical_t info;
...@@ -388,6 +388,14 @@ check_for_logical_procs (void) ...@@ -388,6 +388,14 @@ check_for_logical_procs (void)
} }
#endif #endif
static __initdata int nomca;
static __init int setup_nomca(char *s)
{
nomca = 1;
return 0;
}
early_param("nomca", setup_nomca);
void __init void __init
setup_arch (char **cmdline_p) setup_arch (char **cmdline_p)
{ {
...@@ -401,35 +409,15 @@ setup_arch (char **cmdline_p) ...@@ -401,35 +409,15 @@ setup_arch (char **cmdline_p)
efi_init(); efi_init();
io_port_init(); io_port_init();
parse_early_param();
#ifdef CONFIG_IA64_GENERIC #ifdef CONFIG_IA64_GENERIC
{ machvec_init(NULL);
const char *mvec_name = strstr (*cmdline_p, "machvec=");
char str[64];
if (mvec_name) {
const char *end;
size_t len;
mvec_name += 8;
end = strchr (mvec_name, ' ');
if (end)
len = end - mvec_name;
else
len = strlen (mvec_name);
len = min(len, sizeof (str) - 1);
strncpy (str, mvec_name, len);
str[len] = '\0';
mvec_name = str;
} else
mvec_name = acpi_get_sysname();
machvec_init(mvec_name);
}
#endif #endif
if (early_console_setup(*cmdline_p) == 0) if (early_console_setup(*cmdline_p) == 0)
mark_bsp_online(); mark_bsp_online();
parse_early_param();
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
/* Initialize the ACPI boot-time table parser */ /* Initialize the ACPI boot-time table parser */
acpi_table_init(); acpi_table_init();
...@@ -492,7 +480,7 @@ setup_arch (char **cmdline_p) ...@@ -492,7 +480,7 @@ setup_arch (char **cmdline_p)
#endif #endif
/* enable IA-64 Machine Check Abort Handling unless disabled */ /* enable IA-64 Machine Check Abort Handling unless disabled */
if (!strstr(saved_command_line, "nomca")) if (!nomca)
ia64_mca_init(); ia64_mca_init();
platform_setup(cmdline_p); platform_setup(cmdline_p);
...@@ -622,7 +610,7 @@ struct seq_operations cpuinfo_op = { ...@@ -622,7 +610,7 @@ struct seq_operations cpuinfo_op = {
.show = show_cpuinfo .show = show_cpuinfo
}; };
void static void __cpuinit
identify_cpu (struct cpuinfo_ia64 *c) identify_cpu (struct cpuinfo_ia64 *c)
{ {
union { union {
...@@ -699,7 +687,7 @@ setup_per_cpu_areas (void) ...@@ -699,7 +687,7 @@ setup_per_cpu_areas (void)
* In addition, the minimum of the i-cache stride sizes is calculated for * In addition, the minimum of the i-cache stride sizes is calculated for
* "flush_icache_range()". * "flush_icache_range()".
*/ */
static void static void __cpuinit
get_max_cacheline_size (void) get_max_cacheline_size (void)
{ {
unsigned long line_size, max = 1; unsigned long line_size, max = 1;
...@@ -762,10 +750,10 @@ get_max_cacheline_size (void) ...@@ -762,10 +750,10 @@ get_max_cacheline_size (void)
* cpu_init() initializes state that is per-CPU. This function acts * cpu_init() initializes state that is per-CPU. This function acts
* as a 'CPU state barrier', nothing should get across. * as a 'CPU state barrier', nothing should get across.
*/ */
void void __cpuinit
cpu_init (void) cpu_init (void)
{ {
extern void __devinit ia64_mmu_init (void *); extern void __cpuinit ia64_mmu_init (void *);
unsigned long num_phys_stacked; unsigned long num_phys_stacked;
pal_vm_info_2_u_t vmi; pal_vm_info_2_u_t vmi;
unsigned int max_ctx; unsigned int max_ctx;
...@@ -893,7 +881,7 @@ void sched_cacheflush(void) ...@@ -893,7 +881,7 @@ void sched_cacheflush(void)
ia64_sal_cache_flush(3); ia64_sal_cache_flush(3);
} }
void void __init
check_bugs (void) check_bugs (void)
{ {
ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles, ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles,
......
...@@ -624,31 +624,7 @@ void __devinit smp_prepare_boot_cpu(void) ...@@ -624,31 +624,7 @@ void __devinit smp_prepare_boot_cpu(void)
per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
} }
/*
* mt_info[] is a temporary store for all info returned by
* PAL_LOGICAL_TO_PHYSICAL, to be copied into cpuinfo_ia64 when the
* specific cpu comes.
*/
static struct {
__u32 socket_id;
__u16 core_id;
__u16 thread_id;
__u16 proc_fixed_addr;
__u8 valid;
} mt_info[NR_CPUS] __devinitdata;
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
static inline void
remove_from_mtinfo(int cpu)
{
int i;
for_each_cpu(i)
if (mt_info[i].valid && mt_info[i].socket_id ==
cpu_data(cpu)->socket_id)
mt_info[i].valid = 0;
}
static inline void static inline void
clear_cpu_sibling_map(int cpu) clear_cpu_sibling_map(int cpu)
{ {
...@@ -678,12 +654,6 @@ remove_siblinginfo(int cpu) ...@@ -678,12 +654,6 @@ remove_siblinginfo(int cpu)
/* remove it from all sibling map's */ /* remove it from all sibling map's */
clear_cpu_sibling_map(cpu); clear_cpu_sibling_map(cpu);
/* if this cpu is the last in the core group, remove all its info
* from mt_info structure
*/
if (last)
remove_from_mtinfo(cpu);
} }
extern void fixup_irqs(void); extern void fixup_irqs(void);
...@@ -878,40 +848,6 @@ init_smp_config(void) ...@@ -878,40 +848,6 @@ init_smp_config(void)
ia64_sal_strerror(sal_ret)); ia64_sal_strerror(sal_ret));
} }
static inline int __devinit
check_for_mtinfo_index(void)
{
int i;
for_each_cpu(i)
if (!mt_info[i].valid)
return i;
return -1;
}
/*
* Search the mt_info to find out if this socket's cid/tid information is
* cached or not. If the socket exists, fill in the core_id and thread_id
* in cpuinfo
*/
static int __devinit
check_for_new_socket(__u16 logical_address, struct cpuinfo_ia64 *c)
{
int i;
__u32 sid = c->socket_id;
for_each_cpu(i) {
if (mt_info[i].valid && mt_info[i].proc_fixed_addr == logical_address
&& mt_info[i].socket_id == sid) {
c->core_id = mt_info[i].core_id;
c->thread_id = mt_info[i].thread_id;
return 1; /* not a new socket */
}
}
return 0;
}
/* /*
* identify_siblings(cpu) gets called from identify_cpu. This populates the * identify_siblings(cpu) gets called from identify_cpu. This populates the
* information related to logical execution units in per_cpu_data structure. * information related to logical execution units in per_cpu_data structure.
...@@ -921,14 +857,12 @@ identify_siblings(struct cpuinfo_ia64 *c) ...@@ -921,14 +857,12 @@ identify_siblings(struct cpuinfo_ia64 *c)
{ {
s64 status; s64 status;
u16 pltid; u16 pltid;
u64 proc_fixed_addr;
int count, i;
pal_logical_to_physical_t info; pal_logical_to_physical_t info;
if (smp_num_cpucores == 1 && smp_num_siblings == 1) if (smp_num_cpucores == 1 && smp_num_siblings == 1)
return; return;
if ((status = ia64_pal_logical_to_phys(0, &info)) != PAL_STATUS_SUCCESS) { if ((status = ia64_pal_logical_to_phys(-1, &info)) != PAL_STATUS_SUCCESS) {
printk(KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n", printk(KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n",
status); status);
return; return;
...@@ -937,47 +871,12 @@ identify_siblings(struct cpuinfo_ia64 *c) ...@@ -937,47 +871,12 @@ identify_siblings(struct cpuinfo_ia64 *c)
printk(KERN_ERR "ia64_sal_pltid failed with %ld\n", status); printk(KERN_ERR "ia64_sal_pltid failed with %ld\n", status);
return; return;
} }
if ((status = ia64_pal_fixed_addr(&proc_fixed_addr)) != PAL_STATUS_SUCCESS) {
printk(KERN_ERR "ia64_pal_fixed_addr failed with %ld\n", status);
return;
}
c->socket_id = (pltid << 8) | info.overview_ppid; c->socket_id = (pltid << 8) | info.overview_ppid;
c->cores_per_socket = info.overview_cpp; c->cores_per_socket = info.overview_cpp;
c->threads_per_core = info.overview_tpc; c->threads_per_core = info.overview_tpc;
count = c->num_log = info.overview_num_log; c->num_log = info.overview_num_log;
/* If the thread and core id information is already cached, then
* we will simply update cpu_info and return. Otherwise, we will
* do the PAL calls and cache core and thread id's of all the siblings.
*/
if (check_for_new_socket(proc_fixed_addr, c))
return;
for (i = 0; i < count; i++) {
int index;
if (i && (status = ia64_pal_logical_to_phys(i, &info))
!= PAL_STATUS_SUCCESS) {
printk(KERN_ERR "ia64_pal_logical_to_phys failed"
" with %ld\n", status);
return;
}
if (info.log2_la == proc_fixed_addr) {
c->core_id = info.log1_cid; c->core_id = info.log1_cid;
c->thread_id = info.log1_tid; c->thread_id = info.log1_tid;
}
index = check_for_mtinfo_index();
/* We will not do the mt_info caching optimization in this case.
*/
if (index < 0)
continue;
mt_info[index].valid = 1;
mt_info[index].socket_id = c->socket_id;
mt_info[index].core_id = info.log1_cid;
mt_info[index].thread_id = info.log1_tid;
mt_info[index].proc_fixed_addr = info.log2_la;
}
} }
...@@ -70,34 +70,9 @@ SECTIONS ...@@ -70,34 +70,9 @@ SECTIONS
__stop___ex_table = .; __stop___ex_table = .;
} }
.data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET)
{
__start___vtop_patchlist = .;
*(.data.patch.vtop)
__end___vtop_patchlist = .;
}
.data.patch.mckinley_e9 : AT(ADDR(.data.patch.mckinley_e9) - LOAD_OFFSET)
{
__start___mckinley_e9_bundles = .;
*(.data.patch.mckinley_e9)
__end___mckinley_e9_bundles = .;
}
/* Global data */ /* Global data */
_data = .; _data = .;
#if defined(CONFIG_IA64_GENERIC)
/* Machine Vector */
. = ALIGN(16);
.machvec : AT(ADDR(.machvec) - LOAD_OFFSET)
{
machvec_start = .;
*(.machvec)
machvec_end = .;
}
#endif
/* Unwind info & table: */ /* Unwind info & table: */
. = ALIGN(8); . = ALIGN(8);
.IA_64.unwind_info : AT(ADDR(.IA_64.unwind_info) - LOAD_OFFSET) .IA_64.unwind_info : AT(ADDR(.IA_64.unwind_info) - LOAD_OFFSET)
...@@ -154,6 +129,41 @@ SECTIONS ...@@ -154,6 +129,41 @@ SECTIONS
*(.initcall7.init) *(.initcall7.init)
__initcall_end = .; __initcall_end = .;
} }
/* MCA table */
. = ALIGN(16);
__mca_table : AT(ADDR(__mca_table) - LOAD_OFFSET)
{
__start___mca_table = .;
*(__mca_table)
__stop___mca_table = .;
}
.data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET)
{
__start___vtop_patchlist = .;
*(.data.patch.vtop)
__end___vtop_patchlist = .;
}
.data.patch.mckinley_e9 : AT(ADDR(.data.patch.mckinley_e9) - LOAD_OFFSET)
{
__start___mckinley_e9_bundles = .;
*(.data.patch.mckinley_e9)
__end___mckinley_e9_bundles = .;
}
#if defined(CONFIG_IA64_GENERIC)
/* Machine Vector */
. = ALIGN(16);
.machvec : AT(ADDR(.machvec) - LOAD_OFFSET)
{
machvec_start = .;
*(.machvec)
machvec_end = .;
}
#endif
__con_initcall_start = .; __con_initcall_start = .;
.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET)
{ *(.con_initcall.init) } { *(.con_initcall.init) }
......
...@@ -97,7 +97,7 @@ find_max_pfn (unsigned long start, unsigned long end, void *arg) ...@@ -97,7 +97,7 @@ find_max_pfn (unsigned long start, unsigned long end, void *arg)
* Find a place to put the bootmap and return its starting address in * Find a place to put the bootmap and return its starting address in
* bootmap_start. This address must be page-aligned. * bootmap_start. This address must be page-aligned.
*/ */
int static int __init
find_bootmap_location (unsigned long start, unsigned long end, void *arg) find_bootmap_location (unsigned long start, unsigned long end, void *arg)
{ {
unsigned long needed = *(unsigned long *)arg; unsigned long needed = *(unsigned long *)arg;
...@@ -141,7 +141,7 @@ find_bootmap_location (unsigned long start, unsigned long end, void *arg) ...@@ -141,7 +141,7 @@ find_bootmap_location (unsigned long start, unsigned long end, void *arg)
* Walk the EFI memory map and find usable memory for the system, taking * Walk the EFI memory map and find usable memory for the system, taking
* into account reserved areas. * into account reserved areas.
*/ */
void void __init
find_memory (void) find_memory (void)
{ {
unsigned long bootmap_size; unsigned long bootmap_size;
...@@ -176,7 +176,7 @@ find_memory (void) ...@@ -176,7 +176,7 @@ find_memory (void)
* *
* Allocate and setup per-cpu data areas. * Allocate and setup per-cpu data areas.
*/ */
void * void * __cpuinit
per_cpu_init (void) per_cpu_init (void)
{ {
void *cpu_data; void *cpu_data;
...@@ -228,7 +228,7 @@ count_dma_pages (u64 start, u64 end, void *arg) ...@@ -228,7 +228,7 @@ count_dma_pages (u64 start, u64 end, void *arg)
* Set up the page tables. * Set up the page tables.
*/ */
void void __init
paging_init (void) paging_init (void)
{ {
unsigned long max_dma; unsigned long max_dma;
......
...@@ -525,7 +525,7 @@ void __init find_memory(void) ...@@ -525,7 +525,7 @@ void __init find_memory(void)
* find_pernode_space() does most of this already, we just need to set * find_pernode_space() does most of this already, we just need to set
* local_per_cpu_offset * local_per_cpu_offset
*/ */
void *per_cpu_init(void) void __cpuinit *per_cpu_init(void)
{ {
int cpu; int cpu;
static int first_time = 1; static int first_time = 1;
......
...@@ -113,8 +113,7 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb, ...@@ -113,8 +113,7 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb,
unsigned long floor, unsigned long ceiling) unsigned long floor, unsigned long ceiling)
{ {
/* /*
* This is called only when is_hugepage_only_range(addr,), * This is called to free hugetlb page tables.
* and it follows that is_hugepage_only_range(end,) also.
* *
* The offset of these addresses from the base of the hugetlb * The offset of these addresses from the base of the hugetlb
* region must be scaled down by HPAGE_SIZE/PAGE_SIZE so that * region must be scaled down by HPAGE_SIZE/PAGE_SIZE so that
...@@ -126,9 +125,9 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb, ...@@ -126,9 +125,9 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb,
addr = htlbpage_to_page(addr); addr = htlbpage_to_page(addr);
end = htlbpage_to_page(end); end = htlbpage_to_page(end);
if (is_hugepage_only_range(tlb->mm, floor, HPAGE_SIZE)) if (REGION_NUMBER(floor) == RGN_HPAGE)
floor = htlbpage_to_page(floor); floor = htlbpage_to_page(floor);
if (is_hugepage_only_range(tlb->mm, ceiling, HPAGE_SIZE)) if (REGION_NUMBER(ceiling) == RGN_HPAGE)
ceiling = htlbpage_to_page(ceiling); ceiling = htlbpage_to_page(ceiling);
free_pgd_range(tlb, addr, end, floor, ceiling); free_pgd_range(tlb, addr, end, floor, ceiling);
......
...@@ -206,7 +206,7 @@ free_initmem (void) ...@@ -206,7 +206,7 @@ free_initmem (void)
(__init_end - __init_begin) >> 10); (__init_end - __init_begin) >> 10);
} }
void void __init
free_initrd_mem (unsigned long start, unsigned long end) free_initrd_mem (unsigned long start, unsigned long end)
{ {
struct page *page; struct page *page;
...@@ -261,7 +261,7 @@ free_initrd_mem (unsigned long start, unsigned long end) ...@@ -261,7 +261,7 @@ free_initrd_mem (unsigned long start, unsigned long end)
/* /*
* This installs a clean page in the kernel's page table. * This installs a clean page in the kernel's page table.
*/ */
struct page * static struct page * __init
put_kernel_page (struct page *page, unsigned long address, pgprot_t pgprot) put_kernel_page (struct page *page, unsigned long address, pgprot_t pgprot)
{ {
pgd_t *pgd; pgd_t *pgd;
...@@ -294,7 +294,7 @@ put_kernel_page (struct page *page, unsigned long address, pgprot_t pgprot) ...@@ -294,7 +294,7 @@ put_kernel_page (struct page *page, unsigned long address, pgprot_t pgprot)
return page; return page;
} }
static void static void __init
setup_gate (void) setup_gate (void)
{ {
struct page *page; struct page *page;
...@@ -411,7 +411,7 @@ ia64_mmu_init (void *my_cpu_data) ...@@ -411,7 +411,7 @@ ia64_mmu_init (void *my_cpu_data)
#ifdef CONFIG_VIRTUAL_MEM_MAP #ifdef CONFIG_VIRTUAL_MEM_MAP
int int __init
create_mem_map_page_table (u64 start, u64 end, void *arg) create_mem_map_page_table (u64 start, u64 end, void *arg)
{ {
unsigned long address, start_page, end_page; unsigned long address, start_page, end_page;
...@@ -519,7 +519,7 @@ ia64_pfn_valid (unsigned long pfn) ...@@ -519,7 +519,7 @@ ia64_pfn_valid (unsigned long pfn)
} }
EXPORT_SYMBOL(ia64_pfn_valid); EXPORT_SYMBOL(ia64_pfn_valid);
int int __init
find_largest_hole (u64 start, u64 end, void *arg) find_largest_hole (u64 start, u64 end, void *arg)
{ {
u64 *max_gap = arg; u64 *max_gap = arg;
...@@ -535,7 +535,7 @@ find_largest_hole (u64 start, u64 end, void *arg) ...@@ -535,7 +535,7 @@ find_largest_hole (u64 start, u64 end, void *arg)
} }
#endif /* CONFIG_VIRTUAL_MEM_MAP */ #endif /* CONFIG_VIRTUAL_MEM_MAP */
static int static int __init
count_reserved_pages (u64 start, u64 end, void *arg) count_reserved_pages (u64 start, u64 end, void *arg)
{ {
unsigned long num_reserved = 0; unsigned long num_reserved = 0;
...@@ -556,7 +556,7 @@ count_reserved_pages (u64 start, u64 end, void *arg) ...@@ -556,7 +556,7 @@ count_reserved_pages (u64 start, u64 end, void *arg)
* purposes. * purposes.
*/ */
static int nolwsys; static int nolwsys __initdata;
static int __init static int __init
nolwsys_setup (char *s) nolwsys_setup (char *s)
...@@ -567,7 +567,7 @@ nolwsys_setup (char *s) ...@@ -567,7 +567,7 @@ nolwsys_setup (char *s)
__setup("nolwsys", nolwsys_setup); __setup("nolwsys", nolwsys_setup);
void void __init
mem_init (void) mem_init (void)
{ {
long reserved_pages, codesize, datasize, initsize; long reserved_pages, codesize, datasize, initsize;
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <asm/sn/sn_feature_sets.h> #include <asm/sn/sn_feature_sets.h>
#include <asm/sn/geo.h> #include <asm/sn/geo.h>
#include <asm/sn/io.h> #include <asm/sn/io.h>
#include <asm/sn/l1.h>
#include <asm/sn/module.h>
#include <asm/sn/pcibr_provider.h> #include <asm/sn/pcibr_provider.h>
#include <asm/sn/pcibus_provider_defs.h> #include <asm/sn/pcibus_provider_defs.h>
#include <asm/sn/pcidev.h> #include <asm/sn/pcidev.h>
...@@ -710,9 +712,36 @@ cnodeid_get_geoid(cnodeid_t cnode) ...@@ -710,9 +712,36 @@ cnodeid_get_geoid(cnodeid_t cnode)
return hubdev->hdi_geoid; return hubdev->hdi_geoid;
} }
void sn_generate_path(struct pci_bus *pci_bus, char *address)
{
nasid_t nasid;
cnodeid_t cnode;
geoid_t geoid;
moduleid_t moduleid;
u16 bricktype;
nasid = NASID_GET(SN_PCIBUS_BUSSOFT(pci_bus)->bs_base);
cnode = nasid_to_cnodeid(nasid);
geoid = cnodeid_get_geoid(cnode);
moduleid = geo_module(geoid);
sprintf(address, "module_%c%c%c%c%.2d",
'0'+RACK_GET_CLASS(MODULE_GET_RACK(moduleid)),
'0'+RACK_GET_GROUP(MODULE_GET_RACK(moduleid)),
'0'+RACK_GET_NUM(MODULE_GET_RACK(moduleid)),
MODULE_GET_BTCHAR(moduleid), MODULE_GET_BPOS(moduleid));
/* Tollhouse requires slot id to be displayed */
bricktype = MODULE_GET_BTYPE(moduleid);
if ((bricktype == L1_BRICKTYPE_191010) ||
(bricktype == L1_BRICKTYPE_1932))
sprintf(address, "%s^%d", address, geo_slot(geoid));
}
subsys_initcall(sn_pci_init); subsys_initcall(sn_pci_init);
EXPORT_SYMBOL(sn_pci_fixup_slot); EXPORT_SYMBOL(sn_pci_fixup_slot);
EXPORT_SYMBOL(sn_pci_unfixup_slot); EXPORT_SYMBOL(sn_pci_unfixup_slot);
EXPORT_SYMBOL(sn_pci_controller_fixup); EXPORT_SYMBOL(sn_pci_controller_fixup);
EXPORT_SYMBOL(sn_bus_store_sysdata); EXPORT_SYMBOL(sn_bus_store_sysdata);
EXPORT_SYMBOL(sn_bus_free_sysdata); EXPORT_SYMBOL(sn_bus_free_sysdata);
EXPORT_SYMBOL(sn_generate_path);
...@@ -350,9 +350,6 @@ static void force_interrupt(int irq) ...@@ -350,9 +350,6 @@ static void force_interrupt(int irq)
static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info) static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info)
{ {
u64 regval; u64 regval;
int irr_reg_num;
int irr_bit;
u64 irr_reg;
struct pcidev_info *pcidev_info; struct pcidev_info *pcidev_info;
struct pcibus_info *pcibus_info; struct pcibus_info *pcibus_info;
...@@ -373,23 +370,7 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info) ...@@ -373,23 +370,7 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info)
pdi_pcibus_info; pdi_pcibus_info;
regval = pcireg_intr_status_get(pcibus_info); regval = pcireg_intr_status_get(pcibus_info);
irr_reg_num = irq_to_vector(irq) / 64; if (!ia64_get_irr(irq_to_vector(irq))) {
irr_bit = irq_to_vector(irq) % 64;
switch (irr_reg_num) {
case 0:
irr_reg = ia64_getreg(_IA64_REG_CR_IRR0);
break;
case 1:
irr_reg = ia64_getreg(_IA64_REG_CR_IRR1);
break;
case 2:
irr_reg = ia64_getreg(_IA64_REG_CR_IRR2);
break;
case 3:
irr_reg = ia64_getreg(_IA64_REG_CR_IRR3);
break;
}
if (!test_bit(irr_bit, &irr_reg)) {
if (!test_bit(irq, pda->sn_in_service_ivecs)) { if (!test_bit(irq, pda->sn_in_service_ivecs)) {
regval &= 0xff; regval &= 0xff;
if (sn_irq_info->irq_int_bit & regval & if (sn_irq_info->irq_int_bit & regval &
......
...@@ -369,9 +369,15 @@ static void tio_corelet_reset(nasid_t nasid, int corelet) ...@@ -369,9 +369,15 @@ static void tio_corelet_reset(nasid_t nasid, int corelet)
static int is_fpga_tio(int nasid, int *bt) static int is_fpga_tio(int nasid, int *bt)
{ {
int ioboard_type; u16 ioboard_type;
s64 rc;
ioboard_type = ia64_sn_sysctl_ioboard_get(nasid); rc = ia64_sn_sysctl_ioboard_get(nasid, &ioboard_type);
if (rc) {
printk(KERN_WARNING "ia64_sn_sysctl_ioboard_get failed: %ld\n",
rc);
return 0;
}
switch (ioboard_type) { switch (ioboard_type) {
case L1_BRICKTYPE_SA: case L1_BRICKTYPE_SA:
......
...@@ -74,6 +74,22 @@ static int sal_pcibr_error_interrupt(struct pcibus_info *soft) ...@@ -74,6 +74,22 @@ static int sal_pcibr_error_interrupt(struct pcibus_info *soft)
return (int)ret_stuff.v0; return (int)ret_stuff.v0;
} }
u16 sn_ioboard_to_pci_bus(struct pci_bus *pci_bus)
{
s64 rc;
u16 ioboard;
nasid_t nasid = NASID_GET(SN_PCIBUS_BUSSOFT(pci_bus)->bs_base);
rc = ia64_sn_sysctl_ioboard_get(nasid, &ioboard);
if (rc) {
printk(KERN_WARNING "ia64_sn_sysctl_ioboard_get failed: %ld\n",
rc);
return 0;
}
return ioboard;
}
/* /*
* PCI Bridge Error interrupt handler. Gets invoked whenever a PCI * PCI Bridge Error interrupt handler. Gets invoked whenever a PCI
* bridge sends an error interrupt. * bridge sends an error interrupt.
...@@ -255,3 +271,4 @@ pcibr_init_provider(void) ...@@ -255,3 +271,4 @@ pcibr_init_provider(void)
EXPORT_SYMBOL_GPL(sal_pcibr_slot_enable); EXPORT_SYMBOL_GPL(sal_pcibr_slot_enable);
EXPORT_SYMBOL_GPL(sal_pcibr_slot_disable); EXPORT_SYMBOL_GPL(sal_pcibr_slot_disable);
EXPORT_SYMBOL_GPL(sn_ioboard_to_pci_bus);
...@@ -111,7 +111,11 @@ extern int additional_cpus; ...@@ -111,7 +111,11 @@ extern int additional_cpus;
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
/* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ /* Proximity bitmap length; _PXM is at most 255 (8 bit)*/
#ifdef CONFIG_IA64_NR_NODES
#define MAX_PXM_DOMAINS CONFIG_IA64_NR_NODES
#else
#define MAX_PXM_DOMAINS (256) #define MAX_PXM_DOMAINS (256)
#endif
extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS]; extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS];
extern int __initdata nid_to_pxm_map[MAX_NUMNODES]; extern int __initdata nid_to_pxm_map[MAX_NUMNODES];
#endif #endif
......
...@@ -50,6 +50,17 @@ ...@@ -50,6 +50,17 @@
.xdata4 "__ex_table", 99f-., y-.+4; \ .xdata4 "__ex_table", 99f-., y-.+4; \
[99:] x [99:] x
/*
* Tag MCA recoverable instruction ranges.
*/
.section "__mca_table", "a" // declare section & section attributes
.previous
# define MCA_RECOVER_RANGE(y) \
.xdata4 "__mca_table", y-., 99f-.; \
[99:]
/* /*
* Mark instructions that need a load of a virtual address patched to be * Mark instructions that need a load of a virtual address patched to be
* a load of a physical address. We use this either in critical performance * a load of a physical address. We use this either in critical performance
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#define _ASM_IA64_MACHVEC_DIG_h #define _ASM_IA64_MACHVEC_DIG_h
extern ia64_mv_setup_t dig_setup; extern ia64_mv_setup_t dig_setup;
extern ia64_mv_irq_init_t dig_irq_init;
/* /*
* This stuff has dual use! * This stuff has dual use!
...@@ -13,6 +12,5 @@ extern ia64_mv_irq_init_t dig_irq_init; ...@@ -13,6 +12,5 @@ extern ia64_mv_irq_init_t dig_irq_init;
*/ */
#define platform_name "dig" #define platform_name "dig"
#define platform_setup dig_setup #define platform_setup dig_setup
#define platform_irq_init dig_irq_init
#endif /* _ASM_IA64_MACHVEC_DIG_h */ #endif /* _ASM_IA64_MACHVEC_DIG_h */
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include <asm/mmzone.h> #include <asm/mmzone.h>
extern u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; extern u16 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
/* Stuff below this line could be architecture independent */ /* Stuff below this line could be architecture independent */
......
...@@ -3,13 +3,18 @@ ...@@ -3,13 +3,18 @@
#ifdef CONFIG_IA64_DIG #ifdef CONFIG_IA64_DIG
/* Max 8 Nodes */ /* Max 8 Nodes */
#define NODES_SHIFT 3 # define NODES_SHIFT 3
#elif defined(CONFIG_IA64_HP_ZX1) || defined(CONFIG_IA64_HP_ZX1_SWIOTLB) #elif defined(CONFIG_IA64_HP_ZX1) || defined(CONFIG_IA64_HP_ZX1_SWIOTLB)
/* Max 32 Nodes */ /* Max 32 Nodes */
#define NODES_SHIFT 5 # define NODES_SHIFT 5
#elif defined(CONFIG_IA64_SGI_SN2) || defined(CONFIG_IA64_GENERIC) #elif defined(CONFIG_IA64_SGI_SN2) || defined(CONFIG_IA64_GENERIC)
/* Max 256 Nodes */ # if CONFIG_IA64_NR_NODES == 256
#define NODES_SHIFT 8 # define NODES_SHIFT 8
# elif CONFIG_IA64_NR_NODES <= 512
# define NODES_SHIFT 9
# elif CONFIG_IA64_NR_NODES <= 1024
# define NODES_SHIFT 10
# endif
#endif #endif
#endif /* _ASM_MAX_NUMNODES_H */ #endif /* _ASM_MAX_NUMNODES_H */
...@@ -149,7 +149,7 @@ typedef union ia64_va { ...@@ -149,7 +149,7 @@ typedef union ia64_va {
| (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT))) | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT)))
# define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
# define is_hugepage_only_range(mm, addr, len) \ # define is_hugepage_only_range(mm, addr, len) \
(REGION_NUMBER(addr) == RGN_HPAGE && \ (REGION_NUMBER(addr) == RGN_HPAGE || \
REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE) REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE)
extern unsigned int hpage_shift; extern unsigned int hpage_shift;
#endif #endif
......
...@@ -1640,7 +1640,6 @@ ia64_pal_logical_to_phys(u64 proc_number, pal_logical_to_physical_t *mapping) ...@@ -1640,7 +1640,6 @@ ia64_pal_logical_to_phys(u64 proc_number, pal_logical_to_physical_t *mapping)
if (iprv.status == PAL_STATUS_SUCCESS) if (iprv.status == PAL_STATUS_SUCCESS)
{ {
if (proc_number == 0)
mapping->overview.overview_data = iprv.v0; mapping->overview.overview_data = iprv.v0;
mapping->ppli1.ppli1_data = iprv.v1; mapping->ppli1.ppli1_data = iprv.v1;
mapping->ppli2.ppli2_data = iprv.v2; mapping->ppli2.ppli2_data = iprv.v2;
......
...@@ -181,7 +181,6 @@ DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info); ...@@ -181,7 +181,6 @@ DECLARE_PER_CPU(struct cpuinfo_ia64, cpu_info);
#define local_cpu_data (&__ia64_per_cpu_var(cpu_info)) #define local_cpu_data (&__ia64_per_cpu_var(cpu_info))
#define cpu_data(cpu) (&per_cpu(cpu_info, cpu)) #define cpu_data(cpu) (&per_cpu(cpu_info, cpu))
extern void identify_cpu (struct cpuinfo_ia64 *);
extern void print_cpu_info (struct cpuinfo_ia64 *); extern void print_cpu_info (struct cpuinfo_ia64 *);
typedef struct { typedef struct {
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#define L1_BRICKTYPE_IA 0x6b /* k */ #define L1_BRICKTYPE_IA 0x6b /* k */
#define L1_BRICKTYPE_ATHENA 0x2b /* + */ #define L1_BRICKTYPE_ATHENA 0x2b /* + */
#define L1_BRICKTYPE_DAYTONA 0x7a /* z */ #define L1_BRICKTYPE_DAYTONA 0x7a /* z */
#define L1_BRICKTYPE_1932 0x2c /* . */
#define L1_BRICKTYPE_191010 0x2e /* , */
/* board type response codes */ /* board type response codes */
#define L1_BOARDTYPE_IP69 0x0100 /* CA */ #define L1_BOARDTYPE_IP69 0x0100 /* CA */
...@@ -46,5 +48,4 @@ ...@@ -46,5 +48,4 @@
#define L1_BOARDTYPE_DAYTONA 0x0800 /* AD */ #define L1_BOARDTYPE_DAYTONA 0x0800 /* AD */
#define L1_BOARDTYPE_INVAL (-1) /* invalid brick type */ #define L1_BOARDTYPE_INVAL (-1) /* invalid brick type */
#endif /* _ASM_IA64_SN_L1_H */ #endif /* _ASM_IA64_SN_L1_H */
...@@ -144,4 +144,5 @@ extern int sal_pcibr_slot_enable(struct pcibus_info *soft, int device, ...@@ -144,4 +144,5 @@ extern int sal_pcibr_slot_enable(struct pcibus_info *soft, int device,
void *resp); void *resp);
extern int sal_pcibr_slot_disable(struct pcibus_info *soft, int device, extern int sal_pcibr_slot_disable(struct pcibus_info *soft, int device,
int action, void *resp); int action, void *resp);
extern u16 sn_ioboard_to_pci_bus(struct pci_bus *pci_bus);
#endif #endif
...@@ -76,6 +76,7 @@ extern void sn_pci_controller_fixup(int segment, int busnum, ...@@ -76,6 +76,7 @@ extern void sn_pci_controller_fixup(int segment, int busnum,
struct pci_bus *bus); struct pci_bus *bus);
extern void sn_bus_store_sysdata(struct pci_dev *dev); extern void sn_bus_store_sysdata(struct pci_dev *dev);
extern void sn_bus_free_sysdata(void); extern void sn_bus_free_sysdata(void);
extern void sn_generate_path(struct pci_bus *pci_bus, char *address);
extern void sn_pci_fixup_slot(struct pci_dev *dev); extern void sn_pci_fixup_slot(struct pci_dev *dev);
extern void sn_pci_unfixup_slot(struct pci_dev *dev); extern void sn_pci_unfixup_slot(struct pci_dev *dev);
extern void sn_irq_lh_init(void); extern void sn_irq_lh_init(void);
......
...@@ -30,8 +30,7 @@ extern int sn_prom_feature_available(int id); ...@@ -30,8 +30,7 @@ extern int sn_prom_feature_available(int id);
#define PRF_PAL_CACHE_FLUSH_SAFE 0 #define PRF_PAL_CACHE_FLUSH_SAFE 0
#define PRF_DEVICE_FLUSH_LIST 1 #define PRF_DEVICE_FLUSH_LIST 1
#define PRF_HOTPLUG_SUPPORT 2
/* --------------------- OS Features -------------------------------*/ /* --------------------- OS Features -------------------------------*/
......
...@@ -907,18 +907,22 @@ ia64_sn_sysctl_tio_clock_reset(nasid_t nasid) ...@@ -907,18 +907,22 @@ ia64_sn_sysctl_tio_clock_reset(nasid_t nasid)
/* /*
* Get the associated ioboard type for a given nasid. * Get the associated ioboard type for a given nasid.
*/ */
static inline int static inline s64
ia64_sn_sysctl_ioboard_get(nasid_t nasid) ia64_sn_sysctl_ioboard_get(nasid_t nasid, u16 *ioboard)
{ {
struct ia64_sal_retval rv; struct ia64_sal_retval isrv;
SAL_CALL_REENTRANT(rv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_IOBOARD, SAL_CALL_REENTRANT(isrv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_IOBOARD,
nasid, 0, 0, 0, 0, 0); nasid, 0, 0, 0, 0, 0);
if (rv.v0 != 0) if (isrv.v0 != 0) {
return (int)rv.v0; *ioboard = isrv.v0;
if (rv.v1 != 0) return isrv.status;
return (int)rv.v1; }
if (isrv.v1 != 0) {
*ioboard = isrv.v1;
return isrv.status;
}
return 0; return isrv.status;
} }
/** /**
......
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