Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+349 -294
+9
arch/ia64/Kconfig
··· 252 252 than 64 will cause the use of a CPU mask array, causing a small 253 253 performance hit. 254 254 255 + config IA64_NR_NODES 256 + int "Maximum number of NODEs (256-1024)" if (IA64_SGI_SN2 || IA64_GENERIC) 257 + range 256 1024 258 + depends on IA64_SGI_SN2 || IA64_GENERIC 259 + default "256" 260 + help 261 + This option specifies the maximum number of nodes in your SSI system. 262 + If in doubt, use the default. 263 + 255 264 config HOTPLUG_CPU 256 265 bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" 257 266 depends on SMP && EXPERIMENTAL
+1
arch/ia64/configs/gensparse_defconfig
··· 116 116 CONFIG_FORCE_MAX_ZONEORDER=17 117 117 CONFIG_SMP=y 118 118 CONFIG_NR_CPUS=512 119 + CONFIG_IA64_NR_NODES=256 119 120 CONFIG_HOTPLUG_CPU=y 120 121 # CONFIG_SCHED_SMT is not set 121 122 # CONFIG_PREEMPT is not set
+1
arch/ia64/configs/sn2_defconfig
··· 116 116 CONFIG_FORCE_MAX_ZONEORDER=17 117 117 CONFIG_SMP=y 118 118 CONFIG_NR_CPUS=1024 119 + CONFIG_IA64_NR_NODES=256 119 120 # CONFIG_HOTPLUG_CPU is not set 120 121 CONFIG_SCHED_SMT=y 121 122 CONFIG_PREEMPT=y
+1
arch/ia64/defconfig
··· 116 116 CONFIG_FORCE_MAX_ZONEORDER=17 117 117 CONFIG_SMP=y 118 118 CONFIG_NR_CPUS=512 119 + CONFIG_IA64_NR_NODES=256 119 120 CONFIG_HOTPLUG_CPU=y 120 121 # CONFIG_SCHED_SMT is not set 121 122 # CONFIG_PREEMPT is not set
-5
arch/ia64/dig/setup.c
··· 69 69 screen_info.orig_video_isVGA = 1; /* XXX fake */ 70 70 screen_info.orig_video_ega_bx = 3; /* XXX fake */ 71 71 } 72 - 73 - void __init 74 - dig_irq_init (void) 75 - { 76 - }
+31 -4
arch/ia64/kernel/acpi.c
··· 420 420 int __initdata nid_to_pxm_map[MAX_NUMNODES]; 421 421 static struct acpi_table_slit __initdata *slit_table; 422 422 423 + static int get_processor_proximity_domain(struct acpi_table_processor_affinity *pa) 424 + { 425 + int pxm; 426 + 427 + pxm = pa->proximity_domain; 428 + if (ia64_platform_is("sn2")) 429 + pxm += pa->reserved[0] << 8; 430 + return pxm; 431 + } 432 + 433 + static int get_memory_proximity_domain(struct acpi_table_memory_affinity *ma) 434 + { 435 + int pxm; 436 + 437 + pxm = ma->proximity_domain; 438 + if (ia64_platform_is("sn2")) 439 + pxm += ma->reserved1[0] << 8; 440 + return pxm; 441 + } 442 + 423 443 /* 424 444 * ACPI 2.0 SLIT (System Locality Information Table) 425 445 * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf ··· 463 443 void __init 464 444 acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa) 465 445 { 446 + int pxm; 447 + 448 + if (!pa->flags.enabled) 449 + return; 450 + 451 + pxm = get_processor_proximity_domain(pa); 452 + 466 453 /* record this node in proximity bitmap */ 467 - pxm_bit_set(pa->proximity_domain); 454 + pxm_bit_set(pxm); 468 455 469 456 node_cpuid[srat_num_cpus].phys_id = 470 457 (pa->apic_id << 8) | (pa->lsapic_eid); 471 458 /* nid should be overridden as logical node id later */ 472 - node_cpuid[srat_num_cpus].nid = pa->proximity_domain; 459 + node_cpuid[srat_num_cpus].nid = pxm; 473 460 srat_num_cpus++; 474 461 } 475 462 ··· 484 457 acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma) 485 458 { 486 459 unsigned long paddr, size; 487 - u8 pxm; 460 + int pxm; 488 461 struct node_memblk_s *p, *q, *pend; 489 462 490 - pxm = ma->proximity_domain; 463 + pxm = get_memory_proximity_domain(ma); 491 464 492 465 /* fill node memory chunk structure */ 493 466 paddr = ma->base_addr_hi;
+1
arch/ia64/kernel/ivt.S
··· 865 865 ;; 866 866 SAVE_REST 867 867 ;; 868 + MCA_RECOVER_RANGE(interrupt) 868 869 alloc r14=ar.pfs,0,0,2,0 // must be first in an insn group 869 870 mov out0=cr.ivr // pass cr.ivr as first arg 870 871 add out1=16,sp // pass pointer to pt_regs as second arg
+15 -4
arch/ia64/kernel/machvec.c
··· 14 14 struct ia64_machine_vector ia64_mv; 15 15 EXPORT_SYMBOL(ia64_mv); 16 16 17 - static struct ia64_machine_vector * 17 + static __initdata const char *mvec_name; 18 + static __init int setup_mvec(char *s) 19 + { 20 + mvec_name = s; 21 + return 0; 22 + } 23 + early_param("machvec", setup_mvec); 24 + 25 + static struct ia64_machine_vector * __init 18 26 lookup_machvec (const char *name) 19 27 { 20 28 extern struct ia64_machine_vector machvec_start[]; ··· 41 33 { 42 34 struct ia64_machine_vector *mv; 43 35 36 + if (!name) 37 + name = mvec_name ? mvec_name : acpi_get_sysname(); 44 38 mv = lookup_machvec(name); 45 - if (!mv) { 46 - panic("generic kernel failed to find machine vector for platform %s!", name); 47 - } 39 + if (!mv) 40 + panic("generic kernel failed to find machine vector for" 41 + " platform %s!", name); 42 + 48 43 ia64_mv = *mv; 49 44 printk(KERN_INFO "booting generic kernel on platform %s\n", name); 50 45 }
+79 -31
arch/ia64/kernel/mca.c
··· 83 83 #include <asm/irq.h> 84 84 #include <asm/hw_irq.h> 85 85 86 + #include "mca_drv.h" 86 87 #include "entry.h" 87 88 88 89 #if defined(IA64_MCA_DEBUG_INFO) ··· 134 133 135 134 extern void salinfo_log_wakeup(int type, u8 *buffer, u64 size, int irqsafe); 136 135 137 - static int mca_init; 136 + static int mca_init __initdata; 138 137 139 138 140 139 static void inline ··· 185 184 * Inputs : info_type (SAL_INFO_TYPE_{MCA,INIT,CMC,CPE}) 186 185 * Outputs : None 187 186 */ 188 - static void 187 + static void __init 189 188 ia64_log_init(int sal_info_type) 190 189 { 191 190 u64 max_size = 0; ··· 282 281 ia64_sal_clear_state_info(sal_info_type); 283 282 } 284 283 284 + /* 285 + * search_mca_table 286 + * See if the MCA surfaced in an instruction range 287 + * that has been tagged as recoverable. 288 + * 289 + * Inputs 290 + * first First address range to check 291 + * last Last address range to check 292 + * ip Instruction pointer, address we are looking for 293 + * 294 + * Return value: 295 + * 1 on Success (in the table)/ 0 on Failure (not in the table) 296 + */ 297 + int 298 + search_mca_table (const struct mca_table_entry *first, 299 + const struct mca_table_entry *last, 300 + unsigned long ip) 301 + { 302 + const struct mca_table_entry *curr; 303 + u64 curr_start, curr_end; 304 + 305 + curr = first; 306 + while (curr <= last) { 307 + curr_start = (u64) &curr->start_addr + curr->start_addr; 308 + curr_end = (u64) &curr->end_addr + curr->end_addr; 309 + 310 + if ((ip >= curr_start) && (ip <= curr_end)) { 311 + return 1; 312 + } 313 + curr++; 314 + } 315 + return 0; 316 + } 317 + 318 + /* Given an address, look for it in the mca tables. */ 319 + int mca_recover_range(unsigned long addr) 320 + { 321 + extern struct mca_table_entry __start___mca_table[]; 322 + extern struct mca_table_entry __stop___mca_table[]; 323 + 324 + return search_mca_table(__start___mca_table, __stop___mca_table-1, addr); 325 + } 326 + EXPORT_SYMBOL_GPL(mca_recover_range); 327 + 285 328 #ifdef CONFIG_ACPI 286 329 287 330 int cpe_vector = -1; ··· 400 355 * Outputs 401 356 * None 402 357 */ 403 - static void 358 + static void __init 404 359 ia64_mca_register_cpev (int cpev) 405 360 { 406 361 /* Register the CPE interrupt vector with SAL */ ··· 431 386 * Outputs 432 387 * None 433 388 */ 434 - void 389 + void __cpuinit 435 390 ia64_mca_cmc_vector_setup (void) 436 391 { 437 392 cmcv_reg_t cmcv; ··· 792 747 ia64_mca_modify_comm(previous_current); 793 748 goto no_mod; 794 749 } 795 - if (r13 != sos->prev_IA64_KR_CURRENT) { 796 - msg = "inconsistent previous current and r13"; 797 - goto no_mod; 798 - } 799 - if ((r12 - r13) >= KERNEL_STACK_SIZE) { 800 - msg = "inconsistent r12 and r13"; 801 - goto no_mod; 802 - } 803 - if ((ar_bspstore - r13) >= KERNEL_STACK_SIZE) { 804 - msg = "inconsistent ar.bspstore and r13"; 805 - goto no_mod; 806 - } 807 - va.p = old_bspstore; 808 - if (va.f.reg < 5) { 809 - msg = "old_bspstore is in the wrong region"; 810 - goto no_mod; 811 - } 812 - if ((ar_bsp - r13) >= KERNEL_STACK_SIZE) { 813 - msg = "inconsistent ar.bsp and r13"; 814 - goto no_mod; 815 - } 816 - size += (ia64_rse_skip_regs(old_bspstore, slots) - old_bspstore) * 8; 817 - if (ar_bspstore + size > r12) { 818 - msg = "no room for blocked state"; 819 - goto no_mod; 750 + 751 + if (!mca_recover_range(ms->pmsa_iip)) { 752 + if (r13 != sos->prev_IA64_KR_CURRENT) { 753 + msg = "inconsistent previous current and r13"; 754 + goto no_mod; 755 + } 756 + if ((r12 - r13) >= KERNEL_STACK_SIZE) { 757 + msg = "inconsistent r12 and r13"; 758 + goto no_mod; 759 + } 760 + if ((ar_bspstore - r13) >= KERNEL_STACK_SIZE) { 761 + msg = "inconsistent ar.bspstore and r13"; 762 + goto no_mod; 763 + } 764 + va.p = old_bspstore; 765 + if (va.f.reg < 5) { 766 + msg = "old_bspstore is in the wrong region"; 767 + goto no_mod; 768 + } 769 + if ((ar_bsp - r13) >= KERNEL_STACK_SIZE) { 770 + msg = "inconsistent ar.bsp and r13"; 771 + goto no_mod; 772 + } 773 + size += (ia64_rse_skip_regs(old_bspstore, slots) - old_bspstore) * 8; 774 + if (ar_bspstore + size > r12) { 775 + msg = "no room for blocked state"; 776 + goto no_mod; 777 + } 820 778 } 821 779 822 780 ia64_mca_modify_comm(previous_current); ··· 1491 1443 * format most of the fields. 1492 1444 */ 1493 1445 1494 - static void 1446 + static void __cpuinit 1495 1447 format_mca_init_stack(void *mca_data, unsigned long offset, 1496 1448 const char *type, int cpu) 1497 1449 { ··· 1515 1467 1516 1468 /* Do per-CPU MCA-related initialization. */ 1517 1469 1518 - void __devinit 1470 + void __cpuinit 1519 1471 ia64_mca_cpu_init(void *cpu_data) 1520 1472 { 1521 1473 void *pal_vaddr;
+15 -7
arch/ia64/kernel/mca_drv.c
··· 6 6 * Copyright (C) Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com) 7 7 * Copyright (C) 2005 Silicon Graphics, Inc 8 8 * Copyright (C) 2005 Keith Owens <kaos@sgi.com> 9 + * Copyright (C) 2006 Russ Anderson <rja@sgi.com> 9 10 */ 10 11 #include <linux/config.h> 11 12 #include <linux/types.h> ··· 122 121 */ 123 122 124 123 void 125 - mca_handler_bh(unsigned long paddr) 124 + mca_handler_bh(unsigned long paddr, void *iip, unsigned long ipsr) 126 125 { 127 - printk(KERN_ERR 128 - "OS_MCA: process [pid: %d](%s) encounters MCA (paddr=%lx)\n", 129 - current->pid, current->comm, paddr); 126 + printk(KERN_ERR "OS_MCA: process [cpu %d, pid: %d, uid: %d, " 127 + "iip: %p, psr: 0x%lx,paddr: 0x%lx](%s) encounters MCA.\n", 128 + raw_smp_processor_id(), current->pid, current->uid, 129 + iip, ipsr, paddr, current->comm); 130 130 131 131 spin_lock(&mca_bh_lock); 132 132 switch (mca_page_isolate(paddr)) { ··· 444 442 if (!peidx_bottom(peidx) || !(peidx_bottom(peidx)->valid.minstate)) 445 443 return 0; 446 444 psr1 =(struct ia64_psr *)&(peidx_minstate_area(peidx)->pmsa_ipsr); 445 + psr2 =(struct ia64_psr *)&(peidx_minstate_area(peidx)->pmsa_xpsr); 447 446 448 447 /* 449 448 * Check the privilege level of interrupted context. 450 449 * If it is user-mode, then terminate affected process. 451 450 */ 452 - if (psr1->cpl != 0) { 451 + 452 + pmsa = sos->pal_min_state; 453 + if (psr1->cpl != 0 || 454 + ((psr2->cpl != 0) && mca_recover_range(pmsa->pmsa_iip))) { 453 455 smei = peidx_bus_check(peidx, 0); 454 456 if (smei->valid.target_identifier) { 455 457 /* 456 458 * setup for resume to bottom half of MCA, 457 459 * "mca_handler_bhhook" 458 460 */ 459 - pmsa = sos->pal_min_state; 460 - /* pass to bhhook as 1st argument (gr8) */ 461 + /* pass to bhhook as argument (gr8, ...) */ 461 462 pmsa->pmsa_gr[8-1] = smei->target_identifier; 463 + pmsa->pmsa_gr[9-1] = pmsa->pmsa_iip; 464 + pmsa->pmsa_gr[10-1] = pmsa->pmsa_ipsr; 462 465 /* set interrupted return address (but no use) */ 463 466 pmsa->pmsa_br0 = pmsa->pmsa_iip; 464 467 /* change resume address to bottom half */ ··· 473 466 psr2 = (struct ia64_psr *)&pmsa->pmsa_ipsr; 474 467 psr2->cpl = 0; 475 468 psr2->ri = 0; 469 + psr2->bn = 1; 476 470 psr2->i = 0; 477 471 478 472 return 1;
+7
arch/ia64/kernel/mca_drv.h
··· 111 111 slidx_foreach_entry(__pos, &((slidx)->sec)) { __count++; }\ 112 112 __count; }) 113 113 114 + struct mca_table_entry { 115 + int start_addr; /* location-relative starting address of MCA recoverable range */ 116 + int end_addr; /* location-relative ending address of MCA recoverable range */ 117 + }; 118 + 119 + extern const struct mca_table_entry *search_mca_tables (unsigned long addr); 120 + extern int mca_recover_range(unsigned long);
+4 -9
arch/ia64/kernel/mca_drv_asm.S
··· 14 14 15 15 GLOBAL_ENTRY(mca_handler_bhhook) 16 16 invala // clear RSE ? 17 - ;; 18 17 cover 19 18 ;; 20 19 clrrrb 21 20 ;; 22 - alloc r16=ar.pfs,0,2,1,0 // make a new frame 23 - ;; 21 + alloc r16=ar.pfs,0,2,3,0 // make a new frame 24 22 mov ar.rsc=0 25 - ;; 26 23 mov r13=IA64_KR(CURRENT) // current task pointer 27 24 ;; 28 25 mov r2=r13 ··· 27 30 addl r22=IA64_RBS_OFFSET,r2 28 31 ;; 29 32 mov ar.bspstore=r22 30 - ;; 31 33 addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 32 34 ;; 33 35 adds r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13 ··· 36 40 movl loc1=mca_handler_bh // recovery C function 37 41 ;; 38 42 mov out0=r8 // poisoned address 43 + mov out1=r9 // iip 44 + mov out2=r10 // psr 39 45 mov b6=loc1 40 46 ;; 41 47 mov loc1=rp 42 - ;; 43 - ssm psr.i 44 - ;; 48 + ssm psr.i | psr.ic 45 49 br.call.sptk.many rp=b6 // does not return ... 46 50 ;; 47 51 mov ar.pfs=loc0 ··· 49 53 ;; 50 54 mov r8=r0 51 55 br.ret.sptk.many rp 52 - ;; 53 56 END(mca_handler_bhhook)
+1 -1
arch/ia64/kernel/numa.c
··· 25 25 #include <asm/processor.h> 26 26 #include <asm/smp.h> 27 27 28 - u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; 28 + u16 cpu_to_node_map[NR_CPUS] __cacheline_aligned; 29 29 EXPORT_SYMBOL(cpu_to_node_map); 30 30 31 31 cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
+4 -4
arch/ia64/kernel/patch.c
··· 115 115 ia64_srlz_i(); 116 116 } 117 117 118 - void 118 + void __init 119 119 ia64_patch_mckinley_e9 (unsigned long start, unsigned long end) 120 120 { 121 121 static int first_time = 1; ··· 149 149 ia64_srlz_i(); 150 150 } 151 151 152 - static void 152 + static void __init 153 153 patch_fsyscall_table (unsigned long start, unsigned long end) 154 154 { 155 155 extern unsigned long fsyscall_table[NR_syscalls]; ··· 166 166 ia64_srlz_i(); 167 167 } 168 168 169 - static void 169 + static void __init 170 170 patch_brl_fsys_bubble_down (unsigned long start, unsigned long end) 171 171 { 172 172 extern char fsys_bubble_down[]; ··· 184 184 ia64_srlz_i(); 185 185 } 186 186 187 - void 187 + void __init 188 188 ia64_patch_gate (void) 189 189 { 190 190 # define START(name) ((unsigned long) __start_gate_##name##_patchlist)
+24 -36
arch/ia64/kernel/setup.c
··· 130 130 /* 131 131 * We use a special marker for the end of memory and it uses the extra (+1) slot 132 132 */ 133 - struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1]; 134 - int num_rsvd_regions; 133 + struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1] __initdata; 134 + int num_rsvd_regions __initdata; 135 135 136 136 137 137 /* ··· 140 140 * caller-specified function is called with the memory ranges that remain after filtering. 141 141 * This routine does not assume the incoming segments are sorted. 142 142 */ 143 - int 143 + int __init 144 144 filter_rsvd_memory (unsigned long start, unsigned long end, void *arg) 145 145 { 146 146 unsigned long range_start, range_end, prev_start; ··· 176 176 return 0; 177 177 } 178 178 179 - static void 179 + static void __init 180 180 sort_regions (struct rsvd_region *rsvd_region, int max) 181 181 { 182 182 int j; ··· 217 217 * initrd, etc. There are currently %IA64_MAX_RSVD_REGIONS defined, 218 218 * see include/asm-ia64/meminit.h if you need to define more. 219 219 */ 220 - void 220 + void __init 221 221 reserve_memory (void) 222 222 { 223 223 int n = 0; ··· 269 269 * Grab the initrd start and end from the boot parameter struct given us by 270 270 * the boot loader. 271 271 */ 272 - void 272 + void __init 273 273 find_initrd (void) 274 274 { 275 275 #ifdef CONFIG_BLK_DEV_INITRD ··· 361 361 } 362 362 363 363 #ifdef CONFIG_SMP 364 - static void 364 + static void __init 365 365 check_for_logical_procs (void) 366 366 { 367 367 pal_logical_to_physical_t info; ··· 388 388 } 389 389 #endif 390 390 391 + static __initdata int nomca; 392 + static __init int setup_nomca(char *s) 393 + { 394 + nomca = 1; 395 + return 0; 396 + } 397 + early_param("nomca", setup_nomca); 398 + 391 399 void __init 392 400 setup_arch (char **cmdline_p) 393 401 { ··· 409 401 efi_init(); 410 402 io_port_init(); 411 403 404 + parse_early_param(); 405 + 412 406 #ifdef CONFIG_IA64_GENERIC 413 - { 414 - const char *mvec_name = strstr (*cmdline_p, "machvec="); 415 - char str[64]; 416 - 417 - if (mvec_name) { 418 - const char *end; 419 - size_t len; 420 - 421 - mvec_name += 8; 422 - end = strchr (mvec_name, ' '); 423 - if (end) 424 - len = end - mvec_name; 425 - else 426 - len = strlen (mvec_name); 427 - len = min(len, sizeof (str) - 1); 428 - strncpy (str, mvec_name, len); 429 - str[len] = '\0'; 430 - mvec_name = str; 431 - } else 432 - mvec_name = acpi_get_sysname(); 433 - machvec_init(mvec_name); 434 - } 407 + machvec_init(NULL); 435 408 #endif 436 409 437 410 if (early_console_setup(*cmdline_p) == 0) 438 411 mark_bsp_online(); 439 412 440 - parse_early_param(); 441 413 #ifdef CONFIG_ACPI 442 414 /* Initialize the ACPI boot-time table parser */ 443 415 acpi_table_init(); ··· 480 492 #endif 481 493 482 494 /* enable IA-64 Machine Check Abort Handling unless disabled */ 483 - if (!strstr(saved_command_line, "nomca")) 495 + if (!nomca) 484 496 ia64_mca_init(); 485 497 486 498 platform_setup(cmdline_p); ··· 610 622 .show = show_cpuinfo 611 623 }; 612 624 613 - void 625 + static void __cpuinit 614 626 identify_cpu (struct cpuinfo_ia64 *c) 615 627 { 616 628 union { ··· 687 699 * In addition, the minimum of the i-cache stride sizes is calculated for 688 700 * "flush_icache_range()". 689 701 */ 690 - static void 702 + static void __cpuinit 691 703 get_max_cacheline_size (void) 692 704 { 693 705 unsigned long line_size, max = 1; ··· 750 762 * cpu_init() initializes state that is per-CPU. This function acts 751 763 * as a 'CPU state barrier', nothing should get across. 752 764 */ 753 - void 765 + void __cpuinit 754 766 cpu_init (void) 755 767 { 756 - extern void __devinit ia64_mmu_init (void *); 768 + extern void __cpuinit ia64_mmu_init (void *); 757 769 unsigned long num_phys_stacked; 758 770 pal_vm_info_2_u_t vmi; 759 771 unsigned int max_ctx; ··· 881 893 ia64_sal_cache_flush(3); 882 894 } 883 895 884 - void 896 + void __init 885 897 check_bugs (void) 886 898 { 887 899 ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles,
+4 -105
arch/ia64/kernel/smpboot.c
··· 624 624 per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; 625 625 } 626 626 627 - /* 628 - * mt_info[] is a temporary store for all info returned by 629 - * PAL_LOGICAL_TO_PHYSICAL, to be copied into cpuinfo_ia64 when the 630 - * specific cpu comes. 631 - */ 632 - static struct { 633 - __u32 socket_id; 634 - __u16 core_id; 635 - __u16 thread_id; 636 - __u16 proc_fixed_addr; 637 - __u8 valid; 638 - } mt_info[NR_CPUS] __devinitdata; 639 - 640 627 #ifdef CONFIG_HOTPLUG_CPU 641 - static inline void 642 - remove_from_mtinfo(int cpu) 643 - { 644 - int i; 645 - 646 - for_each_cpu(i) 647 - if (mt_info[i].valid && mt_info[i].socket_id == 648 - cpu_data(cpu)->socket_id) 649 - mt_info[i].valid = 0; 650 - } 651 - 652 628 static inline void 653 629 clear_cpu_sibling_map(int cpu) 654 630 { ··· 654 678 655 679 /* remove it from all sibling map's */ 656 680 clear_cpu_sibling_map(cpu); 657 - 658 - /* if this cpu is the last in the core group, remove all its info 659 - * from mt_info structure 660 - */ 661 - if (last) 662 - remove_from_mtinfo(cpu); 663 681 } 664 682 665 683 extern void fixup_irqs(void); ··· 848 878 ia64_sal_strerror(sal_ret)); 849 879 } 850 880 851 - static inline int __devinit 852 - check_for_mtinfo_index(void) 853 - { 854 - int i; 855 - 856 - for_each_cpu(i) 857 - if (!mt_info[i].valid) 858 - return i; 859 - 860 - return -1; 861 - } 862 - 863 - /* 864 - * Search the mt_info to find out if this socket's cid/tid information is 865 - * cached or not. If the socket exists, fill in the core_id and thread_id 866 - * in cpuinfo 867 - */ 868 - static int __devinit 869 - check_for_new_socket(__u16 logical_address, struct cpuinfo_ia64 *c) 870 - { 871 - int i; 872 - __u32 sid = c->socket_id; 873 - 874 - for_each_cpu(i) { 875 - if (mt_info[i].valid && mt_info[i].proc_fixed_addr == logical_address 876 - && mt_info[i].socket_id == sid) { 877 - c->core_id = mt_info[i].core_id; 878 - c->thread_id = mt_info[i].thread_id; 879 - return 1; /* not a new socket */ 880 - } 881 - } 882 - return 0; 883 - } 884 - 885 881 /* 886 882 * identify_siblings(cpu) gets called from identify_cpu. This populates the 887 883 * information related to logical execution units in per_cpu_data structure. ··· 857 921 { 858 922 s64 status; 859 923 u16 pltid; 860 - u64 proc_fixed_addr; 861 - int count, i; 862 924 pal_logical_to_physical_t info; 863 925 864 926 if (smp_num_cpucores == 1 && smp_num_siblings == 1) 865 927 return; 866 928 867 - if ((status = ia64_pal_logical_to_phys(0, &info)) != PAL_STATUS_SUCCESS) { 929 + if ((status = ia64_pal_logical_to_phys(-1, &info)) != PAL_STATUS_SUCCESS) { 868 930 printk(KERN_ERR "ia64_pal_logical_to_phys failed with %ld\n", 869 931 status); 870 932 return; ··· 871 937 printk(KERN_ERR "ia64_sal_pltid failed with %ld\n", status); 872 938 return; 873 939 } 874 - if ((status = ia64_pal_fixed_addr(&proc_fixed_addr)) != PAL_STATUS_SUCCESS) { 875 - printk(KERN_ERR "ia64_pal_fixed_addr failed with %ld\n", status); 876 - return; 877 - } 878 940 879 941 c->socket_id = (pltid << 8) | info.overview_ppid; 880 942 c->cores_per_socket = info.overview_cpp; 881 943 c->threads_per_core = info.overview_tpc; 882 - count = c->num_log = info.overview_num_log; 944 + c->num_log = info.overview_num_log; 883 945 884 - /* If the thread and core id information is already cached, then 885 - * we will simply update cpu_info and return. Otherwise, we will 886 - * do the PAL calls and cache core and thread id's of all the siblings. 887 - */ 888 - if (check_for_new_socket(proc_fixed_addr, c)) 889 - return; 890 - 891 - for (i = 0; i < count; i++) { 892 - int index; 893 - 894 - if (i && (status = ia64_pal_logical_to_phys(i, &info)) 895 - != PAL_STATUS_SUCCESS) { 896 - printk(KERN_ERR "ia64_pal_logical_to_phys failed" 897 - " with %ld\n", status); 898 - return; 899 - } 900 - if (info.log2_la == proc_fixed_addr) { 901 - c->core_id = info.log1_cid; 902 - c->thread_id = info.log1_tid; 903 - } 904 - 905 - index = check_for_mtinfo_index(); 906 - /* We will not do the mt_info caching optimization in this case. 907 - */ 908 - if (index < 0) 909 - continue; 910 - 911 - mt_info[index].valid = 1; 912 - mt_info[index].socket_id = c->socket_id; 913 - mt_info[index].core_id = info.log1_cid; 914 - mt_info[index].thread_id = info.log1_tid; 915 - mt_info[index].proc_fixed_addr = info.log2_la; 916 - } 946 + c->core_id = info.log1_cid; 947 + c->thread_id = info.log1_tid; 917 948 }
+35 -25
arch/ia64/kernel/vmlinux.lds.S
··· 70 70 __stop___ex_table = .; 71 71 } 72 72 73 - .data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET) 74 - { 75 - __start___vtop_patchlist = .; 76 - *(.data.patch.vtop) 77 - __end___vtop_patchlist = .; 78 - } 79 - 80 - .data.patch.mckinley_e9 : AT(ADDR(.data.patch.mckinley_e9) - LOAD_OFFSET) 81 - { 82 - __start___mckinley_e9_bundles = .; 83 - *(.data.patch.mckinley_e9) 84 - __end___mckinley_e9_bundles = .; 85 - } 86 - 87 73 /* Global data */ 88 74 _data = .; 89 - 90 - #if defined(CONFIG_IA64_GENERIC) 91 - /* Machine Vector */ 92 - . = ALIGN(16); 93 - .machvec : AT(ADDR(.machvec) - LOAD_OFFSET) 94 - { 95 - machvec_start = .; 96 - *(.machvec) 97 - machvec_end = .; 98 - } 99 - #endif 100 75 101 76 /* Unwind info & table: */ 102 77 . = ALIGN(8); ··· 129 154 *(.initcall7.init) 130 155 __initcall_end = .; 131 156 } 157 + 158 + /* MCA table */ 159 + . = ALIGN(16); 160 + __mca_table : AT(ADDR(__mca_table) - LOAD_OFFSET) 161 + { 162 + __start___mca_table = .; 163 + *(__mca_table) 164 + __stop___mca_table = .; 165 + } 166 + 167 + .data.patch.vtop : AT(ADDR(.data.patch.vtop) - LOAD_OFFSET) 168 + { 169 + __start___vtop_patchlist = .; 170 + *(.data.patch.vtop) 171 + __end___vtop_patchlist = .; 172 + } 173 + 174 + .data.patch.mckinley_e9 : AT(ADDR(.data.patch.mckinley_e9) - LOAD_OFFSET) 175 + { 176 + __start___mckinley_e9_bundles = .; 177 + *(.data.patch.mckinley_e9) 178 + __end___mckinley_e9_bundles = .; 179 + } 180 + 181 + #if defined(CONFIG_IA64_GENERIC) 182 + /* Machine Vector */ 183 + . = ALIGN(16); 184 + .machvec : AT(ADDR(.machvec) - LOAD_OFFSET) 185 + { 186 + machvec_start = .; 187 + *(.machvec) 188 + machvec_end = .; 189 + } 190 + #endif 191 + 132 192 __con_initcall_start = .; 133 193 .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) 134 194 { *(.con_initcall.init) }
+4 -4
arch/ia64/mm/contig.c
··· 97 97 * Find a place to put the bootmap and return its starting address in 98 98 * bootmap_start. This address must be page-aligned. 99 99 */ 100 - int 100 + static int __init 101 101 find_bootmap_location (unsigned long start, unsigned long end, void *arg) 102 102 { 103 103 unsigned long needed = *(unsigned long *)arg; ··· 141 141 * Walk the EFI memory map and find usable memory for the system, taking 142 142 * into account reserved areas. 143 143 */ 144 - void 144 + void __init 145 145 find_memory (void) 146 146 { 147 147 unsigned long bootmap_size; ··· 176 176 * 177 177 * Allocate and setup per-cpu data areas. 178 178 */ 179 - void * 179 + void * __cpuinit 180 180 per_cpu_init (void) 181 181 { 182 182 void *cpu_data; ··· 228 228 * Set up the page tables. 229 229 */ 230 230 231 - void 231 + void __init 232 232 paging_init (void) 233 233 { 234 234 unsigned long max_dma;
+1 -1
arch/ia64/mm/discontig.c
··· 525 525 * find_pernode_space() does most of this already, we just need to set 526 526 * local_per_cpu_offset 527 527 */ 528 - void *per_cpu_init(void) 528 + void __cpuinit *per_cpu_init(void) 529 529 { 530 530 int cpu; 531 531 static int first_time = 1;
+3 -4
arch/ia64/mm/hugetlbpage.c
··· 113 113 unsigned long floor, unsigned long ceiling) 114 114 { 115 115 /* 116 - * This is called only when is_hugepage_only_range(addr,), 117 - * and it follows that is_hugepage_only_range(end,) also. 116 + * This is called to free hugetlb page tables. 118 117 * 119 118 * The offset of these addresses from the base of the hugetlb 120 119 * region must be scaled down by HPAGE_SIZE/PAGE_SIZE so that ··· 125 126 126 127 addr = htlbpage_to_page(addr); 127 128 end = htlbpage_to_page(end); 128 - if (is_hugepage_only_range(tlb->mm, floor, HPAGE_SIZE)) 129 + if (REGION_NUMBER(floor) == RGN_HPAGE) 129 130 floor = htlbpage_to_page(floor); 130 - if (is_hugepage_only_range(tlb->mm, ceiling, HPAGE_SIZE)) 131 + if (REGION_NUMBER(ceiling) == RGN_HPAGE) 131 132 ceiling = htlbpage_to_page(ceiling); 132 133 133 134 free_pgd_range(tlb, addr, end, floor, ceiling);
+8 -8
arch/ia64/mm/init.c
··· 206 206 (__init_end - __init_begin) >> 10); 207 207 } 208 208 209 - void 209 + void __init 210 210 free_initrd_mem (unsigned long start, unsigned long end) 211 211 { 212 212 struct page *page; ··· 261 261 /* 262 262 * This installs a clean page in the kernel's page table. 263 263 */ 264 - struct page * 264 + static struct page * __init 265 265 put_kernel_page (struct page *page, unsigned long address, pgprot_t pgprot) 266 266 { 267 267 pgd_t *pgd; ··· 294 294 return page; 295 295 } 296 296 297 - static void 297 + static void __init 298 298 setup_gate (void) 299 299 { 300 300 struct page *page; ··· 411 411 412 412 #ifdef CONFIG_VIRTUAL_MEM_MAP 413 413 414 - int 414 + int __init 415 415 create_mem_map_page_table (u64 start, u64 end, void *arg) 416 416 { 417 417 unsigned long address, start_page, end_page; ··· 519 519 } 520 520 EXPORT_SYMBOL(ia64_pfn_valid); 521 521 522 - int 522 + int __init 523 523 find_largest_hole (u64 start, u64 end, void *arg) 524 524 { 525 525 u64 *max_gap = arg; ··· 535 535 } 536 536 #endif /* CONFIG_VIRTUAL_MEM_MAP */ 537 537 538 - static int 538 + static int __init 539 539 count_reserved_pages (u64 start, u64 end, void *arg) 540 540 { 541 541 unsigned long num_reserved = 0; ··· 556 556 * purposes. 557 557 */ 558 558 559 - static int nolwsys; 559 + static int nolwsys __initdata; 560 560 561 561 static int __init 562 562 nolwsys_setup (char *s) ··· 567 567 568 568 __setup("nolwsys", nolwsys_setup); 569 569 570 - void 570 + void __init 571 571 mem_init (void) 572 572 { 573 573 long reserved_pages, codesize, datasize, initsize;
+29
arch/ia64/sn/kernel/io_init.c
··· 13 13 #include <asm/sn/sn_feature_sets.h> 14 14 #include <asm/sn/geo.h> 15 15 #include <asm/sn/io.h> 16 + #include <asm/sn/l1.h> 17 + #include <asm/sn/module.h> 16 18 #include <asm/sn/pcibr_provider.h> 17 19 #include <asm/sn/pcibus_provider_defs.h> 18 20 #include <asm/sn/pcidev.h> ··· 712 710 return hubdev->hdi_geoid; 713 711 } 714 712 713 + void sn_generate_path(struct pci_bus *pci_bus, char *address) 714 + { 715 + nasid_t nasid; 716 + cnodeid_t cnode; 717 + geoid_t geoid; 718 + moduleid_t moduleid; 719 + u16 bricktype; 720 + 721 + nasid = NASID_GET(SN_PCIBUS_BUSSOFT(pci_bus)->bs_base); 722 + cnode = nasid_to_cnodeid(nasid); 723 + geoid = cnodeid_get_geoid(cnode); 724 + moduleid = geo_module(geoid); 725 + 726 + sprintf(address, "module_%c%c%c%c%.2d", 727 + '0'+RACK_GET_CLASS(MODULE_GET_RACK(moduleid)), 728 + '0'+RACK_GET_GROUP(MODULE_GET_RACK(moduleid)), 729 + '0'+RACK_GET_NUM(MODULE_GET_RACK(moduleid)), 730 + MODULE_GET_BTCHAR(moduleid), MODULE_GET_BPOS(moduleid)); 731 + 732 + /* Tollhouse requires slot id to be displayed */ 733 + bricktype = MODULE_GET_BTYPE(moduleid); 734 + if ((bricktype == L1_BRICKTYPE_191010) || 735 + (bricktype == L1_BRICKTYPE_1932)) 736 + sprintf(address, "%s^%d", address, geo_slot(geoid)); 737 + } 738 + 715 739 subsys_initcall(sn_pci_init); 716 740 EXPORT_SYMBOL(sn_pci_fixup_slot); 717 741 EXPORT_SYMBOL(sn_pci_unfixup_slot); 718 742 EXPORT_SYMBOL(sn_pci_controller_fixup); 719 743 EXPORT_SYMBOL(sn_bus_store_sysdata); 720 744 EXPORT_SYMBOL(sn_bus_free_sysdata); 745 + EXPORT_SYMBOL(sn_generate_path);
+1 -20
arch/ia64/sn/kernel/irq.c
··· 350 350 static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info) 351 351 { 352 352 u64 regval; 353 - int irr_reg_num; 354 - int irr_bit; 355 - u64 irr_reg; 356 353 struct pcidev_info *pcidev_info; 357 354 struct pcibus_info *pcibus_info; 358 355 ··· 370 373 pdi_pcibus_info; 371 374 regval = pcireg_intr_status_get(pcibus_info); 372 375 373 - irr_reg_num = irq_to_vector(irq) / 64; 374 - irr_bit = irq_to_vector(irq) % 64; 375 - switch (irr_reg_num) { 376 - case 0: 377 - irr_reg = ia64_getreg(_IA64_REG_CR_IRR0); 378 - break; 379 - case 1: 380 - irr_reg = ia64_getreg(_IA64_REG_CR_IRR1); 381 - break; 382 - case 2: 383 - irr_reg = ia64_getreg(_IA64_REG_CR_IRR2); 384 - break; 385 - case 3: 386 - irr_reg = ia64_getreg(_IA64_REG_CR_IRR3); 387 - break; 388 - } 389 - if (!test_bit(irr_bit, &irr_reg)) { 376 + if (!ia64_get_irr(irq_to_vector(irq))) { 390 377 if (!test_bit(irq, pda->sn_in_service_ivecs)) { 391 378 regval &= 0xff; 392 379 if (sn_irq_info->irq_int_bit & regval &
+8 -2
arch/ia64/sn/kernel/tiocx.c
··· 369 369 370 370 static int is_fpga_tio(int nasid, int *bt) 371 371 { 372 - int ioboard_type; 372 + u16 ioboard_type; 373 + s64 rc; 373 374 374 - ioboard_type = ia64_sn_sysctl_ioboard_get(nasid); 375 + rc = ia64_sn_sysctl_ioboard_get(nasid, &ioboard_type); 376 + if (rc) { 377 + printk(KERN_WARNING "ia64_sn_sysctl_ioboard_get failed: %ld\n", 378 + rc); 379 + return 0; 380 + } 375 381 376 382 switch (ioboard_type) { 377 383 case L1_BRICKTYPE_SA:
+17
arch/ia64/sn/pci/pcibr/pcibr_provider.c
··· 74 74 return (int)ret_stuff.v0; 75 75 } 76 76 77 + u16 sn_ioboard_to_pci_bus(struct pci_bus *pci_bus) 78 + { 79 + s64 rc; 80 + u16 ioboard; 81 + nasid_t nasid = NASID_GET(SN_PCIBUS_BUSSOFT(pci_bus)->bs_base); 82 + 83 + rc = ia64_sn_sysctl_ioboard_get(nasid, &ioboard); 84 + if (rc) { 85 + printk(KERN_WARNING "ia64_sn_sysctl_ioboard_get failed: %ld\n", 86 + rc); 87 + return 0; 88 + } 89 + 90 + return ioboard; 91 + } 92 + 77 93 /* 78 94 * PCI Bridge Error interrupt handler. Gets invoked whenever a PCI 79 95 * bridge sends an error interrupt. ··· 271 255 272 256 EXPORT_SYMBOL_GPL(sal_pcibr_slot_enable); 273 257 EXPORT_SYMBOL_GPL(sal_pcibr_slot_disable); 258 + EXPORT_SYMBOL_GPL(sn_ioboard_to_pci_bus);
+4
include/asm-ia64/acpi.h
··· 111 111 112 112 #ifdef CONFIG_ACPI_NUMA 113 113 /* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ 114 + #ifdef CONFIG_IA64_NR_NODES 115 + #define MAX_PXM_DOMAINS CONFIG_IA64_NR_NODES 116 + #else 114 117 #define MAX_PXM_DOMAINS (256) 118 + #endif 115 119 extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS]; 116 120 extern int __initdata nid_to_pxm_map[MAX_NUMNODES]; 117 121 #endif
+11
include/asm-ia64/asmmacro.h
··· 51 51 [99:] x 52 52 53 53 /* 54 + * Tag MCA recoverable instruction ranges. 55 + */ 56 + 57 + .section "__mca_table", "a" // declare section & section attributes 58 + .previous 59 + 60 + # define MCA_RECOVER_RANGE(y) \ 61 + .xdata4 "__mca_table", y-., 99f-.; \ 62 + [99:] 63 + 64 + /* 54 65 * Mark instructions that need a load of a virtual address patched to be 55 66 * a load of a physical address. We use this either in critical performance 56 67 * path (ivt.S - TLB miss processing) or in places where it might not be
-2
include/asm-ia64/machvec_dig.h
··· 2 2 #define _ASM_IA64_MACHVEC_DIG_h 3 3 4 4 extern ia64_mv_setup_t dig_setup; 5 - extern ia64_mv_irq_init_t dig_irq_init; 6 5 7 6 /* 8 7 * This stuff has dual use! ··· 12 13 */ 13 14 #define platform_name "dig" 14 15 #define platform_setup dig_setup 15 - #define platform_irq_init dig_irq_init 16 16 17 17 #endif /* _ASM_IA64_MACHVEC_DIG_h */
+1 -1
include/asm-ia64/numa.h
··· 23 23 24 24 #include <asm/mmzone.h> 25 25 26 - extern u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; 26 + extern u16 cpu_to_node_map[NR_CPUS] __cacheline_aligned; 27 27 extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; 28 28 29 29 /* Stuff below this line could be architecture independent */
+9 -4
include/asm-ia64/numnodes.h
··· 3 3 4 4 #ifdef CONFIG_IA64_DIG 5 5 /* Max 8 Nodes */ 6 - #define NODES_SHIFT 3 6 + # define NODES_SHIFT 3 7 7 #elif defined(CONFIG_IA64_HP_ZX1) || defined(CONFIG_IA64_HP_ZX1_SWIOTLB) 8 8 /* Max 32 Nodes */ 9 - #define NODES_SHIFT 5 9 + # define NODES_SHIFT 5 10 10 #elif defined(CONFIG_IA64_SGI_SN2) || defined(CONFIG_IA64_GENERIC) 11 - /* Max 256 Nodes */ 12 - #define NODES_SHIFT 8 11 + # if CONFIG_IA64_NR_NODES == 256 12 + # define NODES_SHIFT 8 13 + # elif CONFIG_IA64_NR_NODES <= 512 14 + # define NODES_SHIFT 9 15 + # elif CONFIG_IA64_NR_NODES <= 1024 16 + # define NODES_SHIFT 10 17 + # endif 13 18 #endif 14 19 15 20 #endif /* _ASM_MAX_NUMNODES_H */
+1 -1
include/asm-ia64/page.h
··· 149 149 | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT))) 150 150 # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) 151 151 # define is_hugepage_only_range(mm, addr, len) \ 152 - (REGION_NUMBER(addr) == RGN_HPAGE && \ 152 + (REGION_NUMBER(addr) == RGN_HPAGE || \ 153 153 REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE) 154 154 extern unsigned int hpage_shift; 155 155 #endif
+1 -2
include/asm-ia64/pal.h
··· 1640 1640 1641 1641 if (iprv.status == PAL_STATUS_SUCCESS) 1642 1642 { 1643 - if (proc_number == 0) 1644 - mapping->overview.overview_data = iprv.v0; 1643 + mapping->overview.overview_data = iprv.v0; 1645 1644 mapping->ppli1.ppli1_data = iprv.v1; 1646 1645 mapping->ppli2.ppli2_data = iprv.v2; 1647 1646 }
-1
include/asm-ia64/processor.h
··· 181 181 #define local_cpu_data (&__ia64_per_cpu_var(cpu_info)) 182 182 #define cpu_data(cpu) (&per_cpu(cpu_info, cpu)) 183 183 184 - extern void identify_cpu (struct cpuinfo_ia64 *); 185 184 extern void print_cpu_info (struct cpuinfo_ia64 *); 186 185 187 186 typedef struct {
+2 -1
include/asm-ia64/sn/l1.h
··· 34 34 #define L1_BRICKTYPE_IA 0x6b /* k */ 35 35 #define L1_BRICKTYPE_ATHENA 0x2b /* + */ 36 36 #define L1_BRICKTYPE_DAYTONA 0x7a /* z */ 37 + #define L1_BRICKTYPE_1932 0x2c /* . */ 38 + #define L1_BRICKTYPE_191010 0x2e /* , */ 37 39 38 40 /* board type response codes */ 39 41 #define L1_BOARDTYPE_IP69 0x0100 /* CA */ ··· 47 45 #define L1_BOARDTYPE_ABACUS 0x0700 /* AB */ 48 46 #define L1_BOARDTYPE_DAYTONA 0x0800 /* AD */ 49 47 #define L1_BOARDTYPE_INVAL (-1) /* invalid brick type */ 50 - 51 48 52 49 #endif /* _ASM_IA64_SN_L1_H */
+1
include/asm-ia64/sn/pcibr_provider.h
··· 144 144 void *resp); 145 145 extern int sal_pcibr_slot_disable(struct pcibus_info *soft, int device, 146 146 int action, void *resp); 147 + extern u16 sn_ioboard_to_pci_bus(struct pci_bus *pci_bus); 147 148 #endif
+1
include/asm-ia64/sn/pcidev.h
··· 76 76 struct pci_bus *bus); 77 77 extern void sn_bus_store_sysdata(struct pci_dev *dev); 78 78 extern void sn_bus_free_sysdata(void); 79 + extern void sn_generate_path(struct pci_bus *pci_bus, char *address); 79 80 extern void sn_pci_fixup_slot(struct pci_dev *dev); 80 81 extern void sn_pci_unfixup_slot(struct pci_dev *dev); 81 82 extern void sn_irq_lh_init(void);
+1 -2
include/asm-ia64/sn/sn_feature_sets.h
··· 30 30 31 31 #define PRF_PAL_CACHE_FLUSH_SAFE 0 32 32 #define PRF_DEVICE_FLUSH_LIST 1 33 - 34 - 33 + #define PRF_HOTPLUG_SUPPORT 2 35 34 36 35 /* --------------------- OS Features -------------------------------*/ 37 36
+14 -10
include/asm-ia64/sn/sn_sal.h
··· 907 907 /* 908 908 * Get the associated ioboard type for a given nasid. 909 909 */ 910 - static inline int 911 - ia64_sn_sysctl_ioboard_get(nasid_t nasid) 910 + static inline s64 911 + ia64_sn_sysctl_ioboard_get(nasid_t nasid, u16 *ioboard) 912 912 { 913 - struct ia64_sal_retval rv; 914 - SAL_CALL_REENTRANT(rv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_IOBOARD, 915 - nasid, 0, 0, 0, 0, 0); 916 - if (rv.v0 != 0) 917 - return (int)rv.v0; 918 - if (rv.v1 != 0) 919 - return (int)rv.v1; 913 + struct ia64_sal_retval isrv; 914 + SAL_CALL_REENTRANT(isrv, SN_SAL_SYSCTL_OP, SAL_SYSCTL_OP_IOBOARD, 915 + nasid, 0, 0, 0, 0, 0); 916 + if (isrv.v0 != 0) { 917 + *ioboard = isrv.v0; 918 + return isrv.status; 919 + } 920 + if (isrv.v1 != 0) { 921 + *ioboard = isrv.v1; 922 + return isrv.status; 923 + } 920 924 921 - return 0; 925 + return isrv.status; 922 926 } 923 927 924 928 /**