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-SGI] SN2-XP reduce kmalloc wrapper inlining
[IA64] MCA: remove obsolete ifdef
[IA64] MCA: update MCA comm field for user space tasks
[IA64] MCA: print messages in MCA handler
[IA64-SGI] - Eliminate SN pio_phys_xxx macros. Move to assembly
[IA64] use icc defined constant
[IA64] add __builtin_trap definition for icc build
[IA64] clean up asm/intel_intrin.h
[IA64] map ia64_hint definition to intel compiler intrinsic
[IA64] hooks to wait for mmio writes to drain when migrating processes
[IA64-SGI] driver bugfixes and hardware workarounds for CE1.0 asic
[IA64-SGI] Handle SC env. powerdown events
[IA64] Delete MCA/INIT sigdelayed code
[IA64-SGI] sem2mutex ioc4.c
[IA64] implement ia64 specific mutex primitives
[IA64] Fix UP build with BSP removal support.
[IA64] support for cpu0 removal

+952 -478
+19
arch/ia64/Kconfig
··· 271 271 Intel IA64 chips with MultiThreading at a cost of slightly increased 272 272 overhead in some places. If unsure say N here. 273 273 274 + config PERMIT_BSP_REMOVE 275 + bool "Support removal of Bootstrap Processor" 276 + depends on HOTPLUG_CPU 277 + default n 278 + ---help--- 279 + Say Y here if your platform SAL will support removal of BSP with HOTPLUG_CPU 280 + support. 281 + 282 + config FORCE_CPEI_RETARGET 283 + bool "Force assumption that CPEI can be re-targetted" 284 + depends on PERMIT_BSP_REMOVE 285 + default n 286 + ---help--- 287 + Say Y if you need to force the assumption that CPEI can be re-targetted to 288 + any cpu in the system. This hint is available via ACPI 3.0 specifications. 289 + Tiger4 systems are capable of re-directing CPEI to any CPU other than BSP. 290 + This option it useful to enable this feature on older BIOS's as well. 291 + You can also enable this by using boot command line option force_cpei=1. 292 + 274 293 config PREEMPT 275 294 bool "Preemptible Kernel" 276 295 help
+2
arch/ia64/configs/tiger_defconfig
··· 116 116 CONFIG_SMP=y 117 117 CONFIG_NR_CPUS=4 118 118 CONFIG_HOTPLUG_CPU=y 119 + CONFIG_PERMIT_BSP_REMOVE=y 120 + CONFIG_FORCE_CPEI_RETARGET=y 119 121 # CONFIG_SCHED_SMT is not set 120 122 # CONFIG_PREEMPT is not set 121 123 CONFIG_SELECT_MEMORY_MODEL=y
+10 -4
arch/ia64/kernel/acpi.c
··· 284 284 return 0; 285 285 } 286 286 287 + #ifdef CONFIG_HOTPLUG_CPU 287 288 unsigned int can_cpei_retarget(void) 288 289 { 289 290 extern int cpe_vector; 291 + extern unsigned int force_cpei_retarget; 290 292 291 293 /* 292 294 * Only if CPEI is supported and the override flag 293 295 * is present, otherwise return that its re-targettable 294 296 * if we are in polling mode. 295 297 */ 296 - if (cpe_vector > 0 && !acpi_cpei_override) 297 - return 0; 298 - else 299 - return 1; 298 + if (cpe_vector > 0) { 299 + if (acpi_cpei_override || force_cpei_retarget) 300 + return 1; 301 + else 302 + return 0; 303 + } 304 + return 1; 300 305 } 301 306 302 307 unsigned int is_cpu_cpei_target(unsigned int cpu) ··· 320 315 { 321 316 acpi_cpei_phys_cpuid = cpu_physical_id(cpu); 322 317 } 318 + #endif 323 319 324 320 unsigned int get_cpei_target_cpu(void) 325 321 {
-14
arch/ia64/kernel/entry.S
··· 1102 1102 st8 [r2]=r8 1103 1103 st8 [r3]=r10 1104 1104 .work_pending: 1105 - tbit.nz p6,p0=r31,TIF_SIGDELAYED // signal delayed from MCA/INIT/NMI/PMI context? 1106 - (p6) br.cond.sptk.few .sigdelayed 1107 - ;; 1108 1105 tbit.z p6,p0=r31,TIF_NEED_RESCHED // current_thread_info()->need_resched==0? 1109 1106 (p6) br.cond.sptk.few .notify 1110 1107 #ifdef CONFIG_PREEMPT ··· 1127 1130 .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 1128 1131 (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1129 1132 br.cond.sptk.many .work_processed_kernel // don't re-check 1130 - 1131 - // There is a delayed signal that was detected in MCA/INIT/NMI/PMI context where 1132 - // it could not be delivered. Deliver it now. The signal might be for us and 1133 - // may set TIF_SIGPENDING, so redrive ia64_leave_* after processing the delayed 1134 - // signal. 1135 - 1136 - .sigdelayed: 1137 - br.call.sptk.many rp=do_sigdelayed 1138 - cmp.eq p6,p0=r0,r0 // p6 <- 1, always re-check 1139 - (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1140 - br.cond.sptk.many .work_processed_kernel // re-check 1141 1133 1142 1134 .work_pending_syscall_end: 1143 1135 adds r2=PT(R8)+16,r12
+6
arch/ia64/kernel/iosapic.c
··· 631 631 { 632 632 #ifdef CONFIG_SMP 633 633 static int cpu = -1; 634 + extern int cpe_vector; 634 635 635 636 /* 636 637 * In case of vector shared by multiple RTEs, all RTEs that ··· 653 652 */ 654 653 if (!cpu_online(smp_processor_id())) 655 654 return cpu_physical_id(smp_processor_id()); 655 + 656 + #ifdef CONFIG_ACPI 657 + if (cpe_vector > 0 && vector == IA64_CPEP_VECTOR) 658 + return get_cpei_target_cpu(); 659 + #endif 656 660 657 661 #ifdef CONFIG_NUMA 658 662 {
+12 -1
arch/ia64/kernel/irq.c
··· 163 163 { 164 164 unsigned int irq; 165 165 extern void ia64_process_pending_intr(void); 166 + extern void ia64_disable_timer(void); 167 + extern volatile int time_keeper_id; 166 168 167 - ia64_set_itv(1<<16); 169 + ia64_disable_timer(); 170 + 171 + /* 172 + * Find a new timesync master 173 + */ 174 + if (smp_processor_id() == time_keeper_id) { 175 + time_keeper_id = first_cpu(cpu_online_map); 176 + printk ("CPU %d is now promoted to time-keeper master\n", time_keeper_id); 177 + } 178 + 168 179 /* 169 180 * Phase 1: Locate irq's bound to this cpu and 170 181 * relocate them for cpu removal.
+60 -30
arch/ia64/kernel/mca.c
··· 281 281 ia64_sal_clear_state_info(sal_info_type); 282 282 } 283 283 284 - /* 285 - * platform dependent error handling 286 - */ 287 - #ifndef PLATFORM_MCA_HANDLERS 288 - 289 284 #ifdef CONFIG_ACPI 290 285 291 286 int cpe_vector = -1; 287 + int ia64_cpe_irq = -1; 292 288 293 289 static irqreturn_t 294 290 ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs) ··· 372 376 "vector %#x registered\n", __FUNCTION__, cpev); 373 377 } 374 378 #endif /* CONFIG_ACPI */ 375 - 376 - #endif /* PLATFORM_MCA_HANDLERS */ 377 379 378 380 /* 379 381 * ia64_mca_cmc_vector_setup ··· 624 630 *tnat |= (nat << tslot); 625 631 } 626 632 633 + /* Change the comm field on the MCA/INT task to include the pid that 634 + * was interrupted, it makes for easier debugging. If that pid was 0 635 + * (swapper or nested MCA/INIT) then use the start of the previous comm 636 + * field suffixed with its cpu. 637 + */ 638 + 639 + static void 640 + ia64_mca_modify_comm(const task_t *previous_current) 641 + { 642 + char *p, comm[sizeof(current->comm)]; 643 + if (previous_current->pid) 644 + snprintf(comm, sizeof(comm), "%s %d", 645 + current->comm, previous_current->pid); 646 + else { 647 + int l; 648 + if ((p = strchr(previous_current->comm, ' '))) 649 + l = p - previous_current->comm; 650 + else 651 + l = strlen(previous_current->comm); 652 + snprintf(comm, sizeof(comm), "%s %*s %d", 653 + current->comm, l, previous_current->comm, 654 + task_thread_info(previous_current)->cpu); 655 + } 656 + memcpy(current->comm, comm, sizeof(current->comm)); 657 + } 658 + 627 659 /* On entry to this routine, we are running on the per cpu stack, see 628 660 * mca_asm.h. The original stack has not been touched by this event. Some of 629 661 * the original stack's registers will be in the RBS on this stack. This stack ··· 668 648 struct ia64_sal_os_state *sos, 669 649 const char *type) 670 650 { 671 - char *p, comm[sizeof(current->comm)]; 651 + char *p; 672 652 ia64_va va; 673 653 extern char ia64_leave_kernel[]; /* Need asm address, not function descriptor */ 674 654 const pal_min_state_area_t *ms = sos->pal_min_state; ··· 741 721 /* Verify the previous stack state before we change it */ 742 722 if (user_mode(regs)) { 743 723 msg = "occurred in user space"; 724 + /* previous_current is guaranteed to be valid when the task was 725 + * in user space, so ... 726 + */ 727 + ia64_mca_modify_comm(previous_current); 744 728 goto no_mod; 745 729 } 746 730 if (r13 != sos->prev_IA64_KR_CURRENT) { ··· 774 750 goto no_mod; 775 751 } 776 752 777 - /* Change the comm field on the MCA/INT task to include the pid that 778 - * was interrupted, it makes for easier debugging. If that pid was 0 779 - * (swapper or nested MCA/INIT) then use the start of the previous comm 780 - * field suffixed with its cpu. 781 - */ 782 - if (previous_current->pid) 783 - snprintf(comm, sizeof(comm), "%s %d", 784 - current->comm, previous_current->pid); 785 - else { 786 - int l; 787 - if ((p = strchr(previous_current->comm, ' '))) 788 - l = p - previous_current->comm; 789 - else 790 - l = strlen(previous_current->comm); 791 - snprintf(comm, sizeof(comm), "%s %*s %d", 792 - current->comm, l, previous_current->comm, 793 - task_thread_info(previous_current)->cpu); 794 - } 795 - memcpy(current->comm, comm, sizeof(current->comm)); 753 + ia64_mca_modify_comm(previous_current); 796 754 797 755 /* Make the original task look blocked. First stack a struct pt_regs, 798 756 * describing the state at the time of interrupt. mca_asm.S built a ··· 914 908 static void 915 909 ia64_wait_for_slaves(int monarch) 916 910 { 917 - int c, wait = 0; 911 + int c, wait = 0, missing = 0; 918 912 for_each_online_cpu(c) { 919 913 if (c == monarch) 920 914 continue; ··· 925 919 } 926 920 } 927 921 if (!wait) 928 - return; 922 + goto all_in; 929 923 for_each_online_cpu(c) { 930 924 if (c == monarch) 931 925 continue; 932 926 if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) { 933 927 udelay(5*1000000); /* wait 5 seconds for slaves (arbitrary) */ 928 + if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) 929 + missing = 1; 934 930 break; 935 931 } 936 932 } 933 + if (!missing) 934 + goto all_in; 935 + printk(KERN_INFO "OS MCA slave did not rendezvous on cpu"); 936 + for_each_online_cpu(c) { 937 + if (c == monarch) 938 + continue; 939 + if (ia64_mc_info.imi_rendez_checkin[c] == IA64_MCA_RENDEZ_CHECKIN_NOTDONE) 940 + printk(" %d", c); 941 + } 942 + printk("\n"); 943 + return; 944 + 945 + all_in: 946 + printk(KERN_INFO "All OS MCA slaves have reached rendezvous\n"); 947 + return; 937 948 } 938 949 939 950 /* ··· 976 953 task_t *previous_current; 977 954 978 955 oops_in_progress = 1; /* FIXME: make printk NMI/MCA/INIT safe */ 956 + console_loglevel = 15; /* make sure printks make it to console */ 957 + printk(KERN_INFO "Entered OS MCA handler. PSP=%lx cpu=%d monarch=%ld\n", 958 + sos->proc_state_param, cpu, sos->monarch); 959 + 979 960 previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA"); 980 961 monarch_cpu = cpu; 981 962 if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, 0, 0, 0) ··· 1471 1444 ia64_mca_cpu_init(void *cpu_data) 1472 1445 { 1473 1446 void *pal_vaddr; 1447 + static int first_time = 1; 1474 1448 1475 - if (smp_processor_id() == 0) { 1449 + if (first_time) { 1476 1450 void *mca_data; 1477 1451 int cpu; 1478 1452 1453 + first_time = 0; 1479 1454 mca_data = alloc_bootmem(sizeof(struct ia64_mca_cpu) 1480 1455 * NR_CPUS + KERNEL_STACK_SIZE); 1481 1456 mca_data = (void *)(((unsigned long)mca_data + ··· 1733 1704 desc = irq_descp(irq); 1734 1705 desc->status |= IRQ_PER_CPU; 1735 1706 setup_irq(irq, &mca_cpe_irqaction); 1707 + ia64_cpe_irq = irq; 1736 1708 } 1737 1709 ia64_mca_register_cpev(cpe_vector); 1738 1710 IA64_MCA_DEBUG("%s: CPEI/P setup and enabled.\n", __FUNCTION__);
+4 -1
arch/ia64/kernel/perfmon.c
··· 6722 6722 void 6723 6723 pfm_init_percpu (void) 6724 6724 { 6725 + static int first_time=1; 6725 6726 /* 6726 6727 * make sure no measurement is active 6727 6728 * (may inherit programmed PMCs from EFI). ··· 6735 6734 */ 6736 6735 pfm_unfreeze_pmu(); 6737 6736 6738 - if (smp_processor_id() == 0) 6737 + if (first_time) { 6739 6738 register_percpu_irq(IA64_PERFMON_VECTOR, &perfmon_irqaction); 6739 + first_time=0; 6740 + } 6740 6741 6741 6742 ia64_setreg(_IA64_REG_CR_PMV, IA64_PERFMON_VECTOR); 6742 6743 ia64_srlz_d();
-101
arch/ia64/kernel/signal.c
··· 588 588 } 589 589 return 0; 590 590 } 591 - 592 - /* Set a delayed signal that was detected in MCA/INIT/NMI/PMI context where it 593 - * could not be delivered. It is important that the target process is not 594 - * allowed to do any more work in user space. Possible cases for the target 595 - * process: 596 - * 597 - * - It is sleeping and will wake up soon. Store the data in the current task, 598 - * the signal will be sent when the current task returns from the next 599 - * interrupt. 600 - * 601 - * - It is running in user context. Store the data in the current task, the 602 - * signal will be sent when the current task returns from the next interrupt. 603 - * 604 - * - It is running in kernel context on this or another cpu and will return to 605 - * user context. Store the data in the target task, the signal will be sent 606 - * to itself when the target task returns to user space. 607 - * 608 - * - It is running in kernel context on this cpu and will sleep before 609 - * returning to user context. Because this is also the current task, the 610 - * signal will not get delivered and the task could sleep indefinitely. 611 - * Store the data in the idle task for this cpu, the signal will be sent 612 - * after the idle task processes its next interrupt. 613 - * 614 - * To cover all cases, store the data in the target task, the current task and 615 - * the idle task on this cpu. Whatever happens, the signal will be delivered 616 - * to the target task before it can do any useful user space work. Multiple 617 - * deliveries have no unwanted side effects. 618 - * 619 - * Note: This code is executed in MCA/INIT/NMI/PMI context, with interrupts 620 - * disabled. It must not take any locks nor use kernel structures or services 621 - * that require locks. 622 - */ 623 - 624 - /* To ensure that we get the right pid, check its start time. To avoid extra 625 - * include files in thread_info.h, convert the task start_time to unsigned long, 626 - * giving us a cycle time of > 580 years. 627 - */ 628 - static inline unsigned long 629 - start_time_ul(const struct task_struct *t) 630 - { 631 - return t->start_time.tv_sec * NSEC_PER_SEC + t->start_time.tv_nsec; 632 - } 633 - 634 - void 635 - set_sigdelayed(pid_t pid, int signo, int code, void __user *addr) 636 - { 637 - struct task_struct *t; 638 - unsigned long start_time = 0; 639 - int i; 640 - 641 - for (i = 1; i <= 3; ++i) { 642 - switch (i) { 643 - case 1: 644 - t = find_task_by_pid(pid); 645 - if (t) 646 - start_time = start_time_ul(t); 647 - break; 648 - case 2: 649 - t = current; 650 - break; 651 - default: 652 - t = idle_task(smp_processor_id()); 653 - break; 654 - } 655 - 656 - if (!t) 657 - return; 658 - task_thread_info(t)->sigdelayed.signo = signo; 659 - task_thread_info(t)->sigdelayed.code = code; 660 - task_thread_info(t)->sigdelayed.addr = addr; 661 - task_thread_info(t)->sigdelayed.start_time = start_time; 662 - task_thread_info(t)->sigdelayed.pid = pid; 663 - wmb(); 664 - set_tsk_thread_flag(t, TIF_SIGDELAYED); 665 - } 666 - } 667 - 668 - /* Called from entry.S when it detects TIF_SIGDELAYED, a delayed signal that 669 - * was detected in MCA/INIT/NMI/PMI context where it could not be delivered. 670 - */ 671 - 672 - void 673 - do_sigdelayed(void) 674 - { 675 - struct siginfo siginfo; 676 - pid_t pid; 677 - struct task_struct *t; 678 - 679 - clear_thread_flag(TIF_SIGDELAYED); 680 - memset(&siginfo, 0, sizeof(siginfo)); 681 - siginfo.si_signo = current_thread_info()->sigdelayed.signo; 682 - siginfo.si_code = current_thread_info()->sigdelayed.code; 683 - siginfo.si_addr = current_thread_info()->sigdelayed.addr; 684 - pid = current_thread_info()->sigdelayed.pid; 685 - t = find_task_by_pid(pid); 686 - if (!t) 687 - return; 688 - if (current_thread_info()->sigdelayed.start_time != start_time_ul(t)) 689 - return; 690 - force_sig_info(siginfo.si_signo, &siginfo, t); 691 - }
+108 -6
arch/ia64/kernel/smpboot.c
··· 70 70 #endif 71 71 72 72 #ifdef CONFIG_HOTPLUG_CPU 73 + #ifdef CONFIG_PERMIT_BSP_REMOVE 74 + #define bsp_remove_ok 1 75 + #else 76 + #define bsp_remove_ok 0 77 + #endif 78 + 73 79 /* 74 80 * Store all idle threads, this can be reused instead of creating 75 81 * a new thread. Also avoids complicated thread destroy functionality ··· 110 104 /* 111 105 * ITC synchronization related stuff: 112 106 */ 113 - #define MASTER 0 107 + #define MASTER (0) 114 108 #define SLAVE (SMP_CACHE_BYTES/8) 115 109 116 110 #define NUM_ROUNDS 64 /* magic value */ ··· 157 151 158 152 unsigned char smp_int_redirect; /* are INT and IPI redirectable by the chipset? */ 159 153 154 + #ifdef CONFIG_FORCE_CPEI_RETARGET 155 + #define CPEI_OVERRIDE_DEFAULT (1) 156 + #else 157 + #define CPEI_OVERRIDE_DEFAULT (0) 158 + #endif 159 + 160 + unsigned int force_cpei_retarget = CPEI_OVERRIDE_DEFAULT; 161 + 162 + static int __init 163 + cmdl_force_cpei(char *str) 164 + { 165 + int value=0; 166 + 167 + get_option (&str, &value); 168 + force_cpei_retarget = value; 169 + 170 + return 1; 171 + } 172 + 173 + __setup("force_cpei=", cmdl_force_cpei); 174 + 160 175 static int __init 161 176 nointroute (char *str) 162 177 { ··· 187 160 } 188 161 189 162 __setup("nointroute", nointroute); 163 + 164 + static void fix_b0_for_bsp(void) 165 + { 166 + #ifdef CONFIG_HOTPLUG_CPU 167 + int cpuid; 168 + static int fix_bsp_b0 = 1; 169 + 170 + cpuid = smp_processor_id(); 171 + 172 + /* 173 + * Cache the b0 value on the first AP that comes up 174 + */ 175 + if (!(fix_bsp_b0 && cpuid)) 176 + return; 177 + 178 + sal_boot_rendez_state[0].br[0] = sal_boot_rendez_state[cpuid].br[0]; 179 + printk ("Fixed BSP b0 value from CPU %d\n", cpuid); 180 + 181 + fix_bsp_b0 = 0; 182 + #endif 183 + } 190 184 191 185 void 192 186 sync_master (void *arg) ··· 375 327 static void __devinit 376 328 smp_callin (void) 377 329 { 378 - int cpuid, phys_id; 330 + int cpuid, phys_id, itc_master; 379 331 extern void ia64_init_itm(void); 332 + extern volatile int time_keeper_id; 380 333 381 334 #ifdef CONFIG_PERFMON 382 335 extern void pfm_init_percpu(void); ··· 385 336 386 337 cpuid = smp_processor_id(); 387 338 phys_id = hard_smp_processor_id(); 339 + itc_master = time_keeper_id; 388 340 389 341 if (cpu_online(cpuid)) { 390 342 printk(KERN_ERR "huh, phys CPU#0x%x, CPU#0x%x already present??\n", 391 343 phys_id, cpuid); 392 344 BUG(); 393 345 } 346 + 347 + fix_b0_for_bsp(); 394 348 395 349 lock_ipi_calllock(); 396 350 cpu_set(cpuid, cpu_online_map); ··· 417 365 * calls spin_unlock_bh(), which calls spin_unlock_bh(), which calls 418 366 * local_bh_enable(), which bugs out if irqs are not enabled... 419 367 */ 420 - Dprintk("Going to syncup ITC with BP.\n"); 421 - ia64_sync_itc(0); 368 + Dprintk("Going to syncup ITC with ITC Master.\n"); 369 + ia64_sync_itc(itc_master); 422 370 } 423 371 424 372 /* ··· 687 635 } 688 636 689 637 extern void fixup_irqs(void); 638 + 639 + int migrate_platform_irqs(unsigned int cpu) 640 + { 641 + int new_cpei_cpu; 642 + irq_desc_t *desc = NULL; 643 + cpumask_t mask; 644 + int retval = 0; 645 + 646 + /* 647 + * dont permit CPEI target to removed. 648 + */ 649 + if (cpe_vector > 0 && is_cpu_cpei_target(cpu)) { 650 + printk ("CPU (%d) is CPEI Target\n", cpu); 651 + if (can_cpei_retarget()) { 652 + /* 653 + * Now re-target the CPEI to a different processor 654 + */ 655 + new_cpei_cpu = any_online_cpu(cpu_online_map); 656 + mask = cpumask_of_cpu(new_cpei_cpu); 657 + set_cpei_target_cpu(new_cpei_cpu); 658 + desc = irq_descp(ia64_cpe_irq); 659 + /* 660 + * Switch for now, immediatly, we need to do fake intr 661 + * as other interrupts, but need to study CPEI behaviour with 662 + * polling before making changes. 663 + */ 664 + if (desc) { 665 + desc->handler->disable(ia64_cpe_irq); 666 + desc->handler->set_affinity(ia64_cpe_irq, mask); 667 + desc->handler->enable(ia64_cpe_irq); 668 + printk ("Re-targetting CPEI to cpu %d\n", new_cpei_cpu); 669 + } 670 + } 671 + if (!desc) { 672 + printk ("Unable to retarget CPEI, offline cpu [%d] failed\n", cpu); 673 + retval = -EBUSY; 674 + } 675 + } 676 + return retval; 677 + } 678 + 690 679 /* must be called with cpucontrol mutex held */ 691 680 int __cpu_disable(void) 692 681 { ··· 736 643 /* 737 644 * dont permit boot processor for now 738 645 */ 739 - if (cpu == 0) 740 - return -EBUSY; 646 + if (cpu == 0 && !bsp_remove_ok) { 647 + printk ("Your platform does not support removal of BSP\n"); 648 + return (-EBUSY); 649 + } 650 + 651 + cpu_clear(cpu, cpu_online_map); 652 + 653 + if (migrate_platform_irqs(cpu)) { 654 + cpu_set(cpu, cpu_online_map); 655 + return (-EBUSY); 656 + } 741 657 742 658 remove_siblinginfo(cpu); 743 659 cpu_clear(cpu, cpu_online_map);
+7 -2
arch/ia64/kernel/time.c
··· 32 32 33 33 extern unsigned long wall_jiffies; 34 34 35 - #define TIME_KEEPER_ID 0 /* smp_processor_id() of time-keeper */ 35 + volatile int time_keeper_id = 0; /* smp_processor_id() of time-keeper */ 36 36 37 37 #ifdef CONFIG_IA64_DEBUG_IRQ 38 38 ··· 71 71 72 72 new_itm += local_cpu_data->itm_delta; 73 73 74 - if (smp_processor_id() == TIME_KEEPER_ID) { 74 + if (smp_processor_id() == time_keeper_id) { 75 75 /* 76 76 * Here we are in the timer irq handler. We have irqs locally 77 77 * disabled, but we don't know if the timer_bh is running on ··· 235 235 .flags = SA_INTERRUPT, 236 236 .name = "timer" 237 237 }; 238 + 239 + void __devinit ia64_disable_timer(void) 240 + { 241 + ia64_set_itv(1 << 16); 242 + } 238 243 239 244 void __init 240 245 time_init (void)
+1 -1
arch/ia64/kernel/topology.c
··· 36 36 parent = &sysfs_nodes[cpu_to_node(num)]; 37 37 #endif /* CONFIG_NUMA */ 38 38 39 - #ifdef CONFIG_ACPI 39 + #if defined (CONFIG_ACPI) && defined (CONFIG_HOTPLUG_CPU) 40 40 /* 41 41 * If CPEI cannot be re-targetted, and this is 42 42 * CPEI target, then dont create the control file
+3 -1
arch/ia64/mm/contig.c
··· 181 181 { 182 182 void *cpu_data; 183 183 int cpu; 184 + static int first_time=1; 184 185 185 186 /* 186 187 * get_free_pages() cannot be used before cpu_init() done. BSP 187 188 * allocates "NR_CPUS" pages for all CPUs to avoid that AP calls 188 189 * get_zeroed_page(). 189 190 */ 190 - if (smp_processor_id() == 0) { 191 + if (first_time) { 192 + first_time=0; 191 193 cpu_data = __alloc_bootmem(PERCPU_PAGE_SIZE * NR_CPUS, 192 194 PERCPU_PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); 193 195 for (cpu = 0; cpu < NR_CPUS; cpu++) {
+7 -2
arch/ia64/mm/discontig.c
··· 528 528 void *per_cpu_init(void) 529 529 { 530 530 int cpu; 531 + static int first_time = 1; 532 + 531 533 532 534 if (smp_processor_id() != 0) 533 535 return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; 534 536 535 - for (cpu = 0; cpu < NR_CPUS; cpu++) 536 - per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu]; 537 + if (first_time) { 538 + first_time = 0; 539 + for (cpu = 0; cpu < NR_CPUS; cpu++) 540 + per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu]; 541 + } 537 542 538 543 return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; 539 544 }
+2 -1
arch/ia64/sn/kernel/Makefile
··· 10 10 CPPFLAGS += -I$(srctree)/arch/ia64/sn/include 11 11 12 12 obj-y += setup.o bte.o bte_error.o irq.o mca.o idle.o \ 13 - huberror.o io_init.o iomv.o klconflib.o sn2/ 13 + huberror.o io_init.o iomv.o klconflib.o pio_phys.o \ 14 + sn2/ 14 15 obj-$(CONFIG_IA64_GENERIC) += machvec.o 15 16 obj-$(CONFIG_SGI_TIOCX) += tiocx.o 16 17 obj-$(CONFIG_IA64_SGI_SN_XP) += xp.o
+71
arch/ia64/sn/kernel/pio_phys.S
··· 1 + /* 2 + * This file is subject to the terms and conditions of the GNU General Public 3 + * License. See the file "COPYING" in the main directory of this archive 4 + * for more details. 5 + * 6 + * Copyright (C) 2000-2005 Silicon Graphics, Inc. All rights reserved. 7 + * 8 + * This file contains macros used to access MMR registers via 9 + * uncached physical addresses. 10 + * pio_phys_read_mmr - read an MMR 11 + * pio_phys_write_mmr - write an MMR 12 + * pio_atomic_phys_write_mmrs - atomically write 1 or 2 MMRs with psr.ic=0 13 + * Second MMR will be skipped if address is NULL 14 + * 15 + * Addresses passed to these routines should be uncached physical addresses 16 + * ie., 0x80000.... 17 + */ 18 + 19 + 20 + 21 + #include <asm/asmmacro.h> 22 + #include <asm/page.h> 23 + 24 + GLOBAL_ENTRY(pio_phys_read_mmr) 25 + .prologue 26 + .regstk 1,0,0,0 27 + .body 28 + mov r2=psr 29 + rsm psr.i | psr.dt 30 + ;; 31 + srlz.d 32 + ld8.acq r8=[r32] 33 + ;; 34 + mov psr.l=r2;; 35 + srlz.d 36 + br.ret.sptk.many rp 37 + END(pio_phys_read_mmr) 38 + 39 + GLOBAL_ENTRY(pio_phys_write_mmr) 40 + .prologue 41 + .regstk 2,0,0,0 42 + .body 43 + mov r2=psr 44 + rsm psr.i | psr.dt 45 + ;; 46 + srlz.d 47 + st8.rel [r32]=r33 48 + ;; 49 + mov psr.l=r2;; 50 + srlz.d 51 + br.ret.sptk.many rp 52 + END(pio_phys_write_mmr) 53 + 54 + GLOBAL_ENTRY(pio_atomic_phys_write_mmrs) 55 + .prologue 56 + .regstk 4,0,0,0 57 + .body 58 + mov r2=psr 59 + cmp.ne p9,p0=r34,r0; 60 + rsm psr.i | psr.dt | psr.ic 61 + ;; 62 + srlz.d 63 + st8.rel [r32]=r33 64 + (p9) st8.rel [r34]=r35 65 + ;; 66 + mov psr.l=r2;; 67 + srlz.d 68 + br.ret.sptk.many rp 69 + END(pio_atomic_phys_write_mmrs) 70 + 71 +
+4 -2
arch/ia64/sn/kernel/setup.c
··· 3 3 * License. See the file "COPYING" in the main directory of this archive 4 4 * for more details. 5 5 * 6 - * Copyright (C) 1999,2001-2005 Silicon Graphics, Inc. All rights reserved. 6 + * Copyright (C) 1999,2001-2006 Silicon Graphics, Inc. All rights reserved. 7 7 */ 8 8 9 9 #include <linux/config.h> ··· 498 498 * for sn. 499 499 */ 500 500 pm_power_off = ia64_sn_power_down; 501 + current->thread.flags |= IA64_THREAD_MIGRATION; 501 502 } 502 503 503 504 /** ··· 661 660 SH2_PIO_WRITE_STATUS_1, SH2_PIO_WRITE_STATUS_3}; 662 661 u64 *pio; 663 662 pio = is_shub1() ? pio1 : pio2; 664 - pda->pio_write_status_addr = (volatile unsigned long *) LOCAL_MMR_ADDR(pio[slice]); 663 + pda->pio_write_status_addr = 664 + (volatile unsigned long *)GLOBAL_MMR_ADDR(nasid, pio[slice]); 665 665 pda->pio_write_status_val = is_shub1() ? SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK : 0; 666 666 } 667 667
+21
arch/ia64/sn/kernel/sn2/sn2_smp.c
··· 93 93 return (ws & SH_PIO_WRITE_STATUS_WRITE_DEADLOCK_MASK) != 0; 94 94 } 95 95 96 + /** 97 + * sn_migrate - SN-specific task migration actions 98 + * @task: Task being migrated to new CPU 99 + * 100 + * SN2 PIO writes from separate CPUs are not guaranteed to arrive in order. 101 + * Context switching user threads which have memory-mapped MMIO may cause 102 + * PIOs to issue from seperate CPUs, thus the PIO writes must be drained 103 + * from the previous CPU's Shub before execution resumes on the new CPU. 104 + */ 105 + void sn_migrate(struct task_struct *task) 106 + { 107 + pda_t *last_pda = pdacpu(task_thread_info(task)->last_cpu); 108 + volatile unsigned long *adr = last_pda->pio_write_status_addr; 109 + unsigned long val = last_pda->pio_write_status_val; 110 + 111 + /* Drain PIO writes from old CPU's Shub */ 112 + while (unlikely((*adr & SH_PIO_WRITE_STATUS_PENDING_WRITE_COUNT_MASK) 113 + != val)) 114 + cpu_relax(); 115 + } 116 + 96 117 void sn_tlb_migrate_finish(struct mm_struct *mm) 97 118 { 98 119 /* flush_tlb_mm is inefficient if more than 1 users of mm */
+59 -43
arch/ia64/sn/kernel/xpc_channel.c
··· 21 21 #include <linux/sched.h> 22 22 #include <linux/cache.h> 23 23 #include <linux/interrupt.h> 24 - #include <linux/slab.h> 25 24 #include <linux/mutex.h> 26 25 #include <linux/completion.h> 27 26 #include <asm/sn/bte.h> 28 27 #include <asm/sn/sn_sal.h> 29 28 #include <asm/sn/xpc.h> 29 + 30 + 31 + /* 32 + * Guarantee that the kzalloc'd memory is cacheline aligned. 33 + */ 34 + static void * 35 + xpc_kzalloc_cacheline_aligned(size_t size, gfp_t flags, void **base) 36 + { 37 + /* see if kzalloc will give us cachline aligned memory by default */ 38 + *base = kzalloc(size, flags); 39 + if (*base == NULL) { 40 + return NULL; 41 + } 42 + if ((u64) *base == L1_CACHE_ALIGN((u64) *base)) { 43 + return *base; 44 + } 45 + kfree(*base); 46 + 47 + /* nope, we'll have to do it ourselves */ 48 + *base = kzalloc(size + L1_CACHE_BYTES, flags); 49 + if (*base == NULL) { 50 + return NULL; 51 + } 52 + return (void *) L1_CACHE_ALIGN((u64) *base); 53 + } 30 54 31 55 32 56 /* ··· 117 93 * Allocate all of the channel structures as a contiguous chunk of 118 94 * memory. 119 95 */ 120 - part->channels = kmalloc(sizeof(struct xpc_channel) * XPC_NCHANNELS, 96 + part->channels = kzalloc(sizeof(struct xpc_channel) * XPC_NCHANNELS, 121 97 GFP_KERNEL); 122 98 if (part->channels == NULL) { 123 99 dev_err(xpc_chan, "can't get memory for channels\n"); 124 100 return xpcNoMemory; 125 101 } 126 - memset(part->channels, 0, sizeof(struct xpc_channel) * XPC_NCHANNELS); 127 102 128 103 part->nchannels = XPC_NCHANNELS; 129 104 130 105 131 106 /* allocate all the required GET/PUT values */ 132 107 133 - part->local_GPs = xpc_kmalloc_cacheline_aligned(XPC_GP_SIZE, 108 + part->local_GPs = xpc_kzalloc_cacheline_aligned(XPC_GP_SIZE, 134 109 GFP_KERNEL, &part->local_GPs_base); 135 110 if (part->local_GPs == NULL) { 136 111 kfree(part->channels); ··· 138 115 "values\n"); 139 116 return xpcNoMemory; 140 117 } 141 - memset(part->local_GPs, 0, XPC_GP_SIZE); 142 118 143 - part->remote_GPs = xpc_kmalloc_cacheline_aligned(XPC_GP_SIZE, 119 + part->remote_GPs = xpc_kzalloc_cacheline_aligned(XPC_GP_SIZE, 144 120 GFP_KERNEL, &part->remote_GPs_base); 145 121 if (part->remote_GPs == NULL) { 146 - kfree(part->channels); 147 - part->channels = NULL; 148 - kfree(part->local_GPs_base); 149 - part->local_GPs = NULL; 150 122 dev_err(xpc_chan, "can't get memory for remote get/put " 151 123 "values\n"); 124 + kfree(part->local_GPs_base); 125 + part->local_GPs = NULL; 126 + kfree(part->channels); 127 + part->channels = NULL; 152 128 return xpcNoMemory; 153 129 } 154 - memset(part->remote_GPs, 0, XPC_GP_SIZE); 155 130 156 131 157 132 /* allocate all the required open and close args */ 158 133 159 - part->local_openclose_args = xpc_kmalloc_cacheline_aligned( 134 + part->local_openclose_args = xpc_kzalloc_cacheline_aligned( 160 135 XPC_OPENCLOSE_ARGS_SIZE, GFP_KERNEL, 161 136 &part->local_openclose_args_base); 162 137 if (part->local_openclose_args == NULL) { 163 - kfree(part->channels); 164 - part->channels = NULL; 165 - kfree(part->local_GPs_base); 166 - part->local_GPs = NULL; 138 + dev_err(xpc_chan, "can't get memory for local connect args\n"); 167 139 kfree(part->remote_GPs_base); 168 140 part->remote_GPs = NULL; 169 - dev_err(xpc_chan, "can't get memory for local connect args\n"); 141 + kfree(part->local_GPs_base); 142 + part->local_GPs = NULL; 143 + kfree(part->channels); 144 + part->channels = NULL; 170 145 return xpcNoMemory; 171 146 } 172 - memset(part->local_openclose_args, 0, XPC_OPENCLOSE_ARGS_SIZE); 173 147 174 - part->remote_openclose_args = xpc_kmalloc_cacheline_aligned( 148 + part->remote_openclose_args = xpc_kzalloc_cacheline_aligned( 175 149 XPC_OPENCLOSE_ARGS_SIZE, GFP_KERNEL, 176 150 &part->remote_openclose_args_base); 177 151 if (part->remote_openclose_args == NULL) { 178 - kfree(part->channels); 179 - part->channels = NULL; 180 - kfree(part->local_GPs_base); 181 - part->local_GPs = NULL; 182 - kfree(part->remote_GPs_base); 183 - part->remote_GPs = NULL; 152 + dev_err(xpc_chan, "can't get memory for remote connect args\n"); 184 153 kfree(part->local_openclose_args_base); 185 154 part->local_openclose_args = NULL; 186 - dev_err(xpc_chan, "can't get memory for remote connect args\n"); 155 + kfree(part->remote_GPs_base); 156 + part->remote_GPs = NULL; 157 + kfree(part->local_GPs_base); 158 + part->local_GPs = NULL; 159 + kfree(part->channels); 160 + part->channels = NULL; 187 161 return xpcNoMemory; 188 162 } 189 - memset(part->remote_openclose_args, 0, XPC_OPENCLOSE_ARGS_SIZE); 190 163 191 164 192 165 xpc_initialize_channels(part, partid); ··· 205 186 ret = request_irq(SGI_XPC_NOTIFY, xpc_notify_IRQ_handler, SA_SHIRQ, 206 187 part->IPI_owner, (void *) (u64) partid); 207 188 if (ret != 0) { 208 - kfree(part->channels); 209 - part->channels = NULL; 210 - kfree(part->local_GPs_base); 211 - part->local_GPs = NULL; 212 - kfree(part->remote_GPs_base); 213 - part->remote_GPs = NULL; 214 - kfree(part->local_openclose_args_base); 215 - part->local_openclose_args = NULL; 216 - kfree(part->remote_openclose_args_base); 217 - part->remote_openclose_args = NULL; 218 189 dev_err(xpc_chan, "can't register NOTIFY IRQ handler, " 219 190 "errno=%d\n", -ret); 191 + kfree(part->remote_openclose_args_base); 192 + part->remote_openclose_args = NULL; 193 + kfree(part->local_openclose_args_base); 194 + part->local_openclose_args = NULL; 195 + kfree(part->remote_GPs_base); 196 + part->remote_GPs = NULL; 197 + kfree(part->local_GPs_base); 198 + part->local_GPs = NULL; 199 + kfree(part->channels); 200 + part->channels = NULL; 220 201 return xpcLackOfResources; 221 202 } 222 203 ··· 465 446 for (nentries = ch->local_nentries; nentries > 0; nentries--) { 466 447 467 448 nbytes = nentries * ch->msg_size; 468 - ch->local_msgqueue = xpc_kmalloc_cacheline_aligned(nbytes, 449 + ch->local_msgqueue = xpc_kzalloc_cacheline_aligned(nbytes, 469 450 GFP_KERNEL, 470 451 &ch->local_msgqueue_base); 471 452 if (ch->local_msgqueue == NULL) { 472 453 continue; 473 454 } 474 - memset(ch->local_msgqueue, 0, nbytes); 475 455 476 456 nbytes = nentries * sizeof(struct xpc_notify); 477 - ch->notify_queue = kmalloc(nbytes, GFP_KERNEL); 457 + ch->notify_queue = kzalloc(nbytes, GFP_KERNEL); 478 458 if (ch->notify_queue == NULL) { 479 459 kfree(ch->local_msgqueue_base); 480 460 ch->local_msgqueue = NULL; 481 461 continue; 482 462 } 483 - memset(ch->notify_queue, 0, nbytes); 484 463 485 464 spin_lock_irqsave(&ch->lock, irq_flags); 486 465 if (nentries < ch->local_nentries) { ··· 518 501 for (nentries = ch->remote_nentries; nentries > 0; nentries--) { 519 502 520 503 nbytes = nentries * ch->msg_size; 521 - ch->remote_msgqueue = xpc_kmalloc_cacheline_aligned(nbytes, 504 + ch->remote_msgqueue = xpc_kzalloc_cacheline_aligned(nbytes, 522 505 GFP_KERNEL, 523 506 &ch->remote_msgqueue_base); 524 507 if (ch->remote_msgqueue == NULL) { 525 508 continue; 526 509 } 527 - memset(ch->remote_msgqueue, 0, nbytes); 528 510 529 511 spin_lock_irqsave(&ch->lock, irq_flags); 530 512 if (nentries < ch->remote_nentries) {
-1
arch/ia64/sn/kernel/xpc_main.c
··· 52 52 #include <linux/syscalls.h> 53 53 #include <linux/cache.h> 54 54 #include <linux/interrupt.h> 55 - #include <linux/slab.h> 56 55 #include <linux/delay.h> 57 56 #include <linux/reboot.h> 58 57 #include <linux/completion.h>
+26 -2
arch/ia64/sn/kernel/xpc_partition.c
··· 81 81 82 82 83 83 /* 84 + * Guarantee that the kmalloc'd memory is cacheline aligned. 85 + */ 86 + static void * 87 + xpc_kmalloc_cacheline_aligned(size_t size, gfp_t flags, void **base) 88 + { 89 + /* see if kmalloc will give us cachline aligned memory by default */ 90 + *base = kmalloc(size, flags); 91 + if (*base == NULL) { 92 + return NULL; 93 + } 94 + if ((u64) *base == L1_CACHE_ALIGN((u64) *base)) { 95 + return *base; 96 + } 97 + kfree(*base); 98 + 99 + /* nope, we'll have to do it ourselves */ 100 + *base = kmalloc(size + L1_CACHE_BYTES, flags); 101 + if (*base == NULL) { 102 + return NULL; 103 + } 104 + return (void *) L1_CACHE_ALIGN((u64) *base); 105 + } 106 + 107 + 108 + /* 84 109 * Given a nasid, get the physical address of the partition's reserved page 85 110 * for that nasid. This function returns 0 on any error. 86 111 */ ··· 1063 1038 remote_vars = (struct xpc_vars *) remote_rp; 1064 1039 1065 1040 1066 - discovered_nasids = kmalloc(sizeof(u64) * xp_nasid_mask_words, 1041 + discovered_nasids = kzalloc(sizeof(u64) * xp_nasid_mask_words, 1067 1042 GFP_KERNEL); 1068 1043 if (discovered_nasids == NULL) { 1069 1044 kfree(remote_rp_base); 1070 1045 return; 1071 1046 } 1072 - memset(discovered_nasids, 0, sizeof(u64) * xp_nasid_mask_words); 1073 1047 1074 1048 rp = (struct xpc_rsvd_page *) xpc_rsvd_page; 1075 1049
+303 -23
arch/ia64/sn/pci/tioce_provider.c
··· 15 15 #include <asm/sn/pcidev.h> 16 16 #include <asm/sn/pcibus_provider_defs.h> 17 17 #include <asm/sn/tioce_provider.h> 18 + #include <asm/sn/sn2/sn_hwperf.h> 19 + 20 + /* 21 + * 1/26/2006 22 + * 23 + * WAR for SGI PV 944642. For revA TIOCE, need to use the following recipe 24 + * (taken from the above PV) before and after accessing tioce internal MMR's 25 + * to avoid tioce lockups. 26 + * 27 + * The recipe as taken from the PV: 28 + * 29 + * if(mmr address < 0x45000) { 30 + * if(mmr address == 0 or 0x80) 31 + * mmr wrt or read address 0xc0 32 + * else if(mmr address == 0x148 or 0x200) 33 + * mmr wrt or read address 0x28 34 + * else 35 + * mmr wrt or read address 0x158 36 + * 37 + * do desired mmr access (rd or wrt) 38 + * 39 + * if(mmr address == 0x100) 40 + * mmr wrt or read address 0x38 41 + * mmr wrt or read address 0xb050 42 + * } else 43 + * do desired mmr access 44 + * 45 + * According to hw, we can use reads instead of writes to the above addres 46 + * 47 + * Note this WAR can only to be used for accessing internal MMR's in the 48 + * TIOCE Coretalk Address Range 0x0 - 0x07ff_ffff. This includes the 49 + * "Local CE Registers and Memories" and "PCI Compatible Config Space" address 50 + * spaces from table 2-1 of the "CE Programmer's Reference Overview" document. 51 + * 52 + * All registers defined in struct tioce will meet that criteria. 53 + */ 54 + 55 + static void inline 56 + tioce_mmr_war_pre(struct tioce_kernel *kern, void *mmr_addr) 57 + { 58 + u64 mmr_base; 59 + u64 mmr_offset; 60 + 61 + if (kern->ce_common->ce_rev != TIOCE_REV_A) 62 + return; 63 + 64 + mmr_base = kern->ce_common->ce_pcibus.bs_base; 65 + mmr_offset = (u64)mmr_addr - mmr_base; 66 + 67 + if (mmr_offset < 0x45000) { 68 + u64 mmr_war_offset; 69 + 70 + if (mmr_offset == 0 || mmr_offset == 0x80) 71 + mmr_war_offset = 0xc0; 72 + else if (mmr_offset == 0x148 || mmr_offset == 0x200) 73 + mmr_war_offset = 0x28; 74 + else 75 + mmr_war_offset = 0x158; 76 + 77 + readq_relaxed((void *)(mmr_base + mmr_war_offset)); 78 + } 79 + } 80 + 81 + static void inline 82 + tioce_mmr_war_post(struct tioce_kernel *kern, void *mmr_addr) 83 + { 84 + u64 mmr_base; 85 + u64 mmr_offset; 86 + 87 + if (kern->ce_common->ce_rev != TIOCE_REV_A) 88 + return; 89 + 90 + mmr_base = kern->ce_common->ce_pcibus.bs_base; 91 + mmr_offset = (u64)mmr_addr - mmr_base; 92 + 93 + if (mmr_offset < 0x45000) { 94 + if (mmr_offset == 0x100) 95 + readq_relaxed((void *)(mmr_base + 0x38)); 96 + readq_relaxed((void *)(mmr_base + 0xb050)); 97 + } 98 + } 99 + 100 + /* load mmr contents into a variable */ 101 + #define tioce_mmr_load(kern, mmrp, varp) do {\ 102 + tioce_mmr_war_pre(kern, mmrp); \ 103 + *(varp) = readq_relaxed(mmrp); \ 104 + tioce_mmr_war_post(kern, mmrp); \ 105 + } while (0) 106 + 107 + /* store variable contents into mmr */ 108 + #define tioce_mmr_store(kern, mmrp, varp) do {\ 109 + tioce_mmr_war_pre(kern, mmrp); \ 110 + writeq(*varp, mmrp); \ 111 + tioce_mmr_war_post(kern, mmrp); \ 112 + } while (0) 113 + 114 + /* store immediate value into mmr */ 115 + #define tioce_mmr_storei(kern, mmrp, val) do {\ 116 + tioce_mmr_war_pre(kern, mmrp); \ 117 + writeq(val, mmrp); \ 118 + tioce_mmr_war_post(kern, mmrp); \ 119 + } while (0) 120 + 121 + /* set bits (immediate value) into mmr */ 122 + #define tioce_mmr_seti(kern, mmrp, bits) do {\ 123 + u64 tmp; \ 124 + tioce_mmr_load(kern, mmrp, &tmp); \ 125 + tmp |= (bits); \ 126 + tioce_mmr_store(kern, mmrp, &tmp); \ 127 + } while (0) 128 + 129 + /* clear bits (immediate value) into mmr */ 130 + #define tioce_mmr_clri(kern, mmrp, bits) do { \ 131 + u64 tmp; \ 132 + tioce_mmr_load(kern, mmrp, &tmp); \ 133 + tmp &= ~(bits); \ 134 + tioce_mmr_store(kern, mmrp, &tmp); \ 135 + } while (0) 18 136 19 137 /** 20 138 * Bus address ranges for the 5 flavors of TIOCE DMA ··· 180 62 #define TIOCE_ATE_M40 2 181 63 #define TIOCE_ATE_M40S 3 182 64 183 - #define KB(x) ((x) << 10) 184 - #define MB(x) ((x) << 20) 185 - #define GB(x) ((x) << 30) 65 + #define KB(x) ((u64)(x) << 10) 66 + #define MB(x) ((u64)(x) << 20) 67 + #define GB(x) ((u64)(x) << 30) 186 68 187 69 /** 188 70 * tioce_dma_d64 - create a DMA mapping using 64-bit direct mode ··· 269 151 int last; 270 152 int entries; 271 153 int nates; 272 - int pagesize; 154 + u64 pagesize; 273 155 u64 *ate_shadow; 274 156 u64 *ate_reg; 275 157 u64 addr; ··· 346 228 347 229 ate = ATE_MAKE(addr, pagesize); 348 230 ate_shadow[i + j] = ate; 349 - writeq(ate, &ate_reg[i + j]); 231 + tioce_mmr_storei(ce_kern, &ate_reg[i + j], ate); 350 232 addr += pagesize; 351 233 } 352 234 ··· 390 272 u64 tmp; 391 273 392 274 ce_kern->ce_port[port].dirmap_shadow = ct_upper; 393 - writeq(ct_upper, &ce_mmr->ce_ure_dir_map[port]); 275 + tioce_mmr_storei(ce_kern, &ce_mmr->ce_ure_dir_map[port], 276 + ct_upper); 394 277 tmp = ce_mmr->ce_ure_dir_map[port]; 395 278 dma_ok = 1; 396 279 } else ··· 463 344 if (TIOCE_D32_ADDR(bus_addr)) { 464 345 if (--ce_kern->ce_port[port].dirmap_refcnt == 0) { 465 346 ce_kern->ce_port[port].dirmap_shadow = 0; 466 - writeq(0, &ce_mmr->ce_ure_dir_map[port]); 347 + tioce_mmr_storei(ce_kern, &ce_mmr->ce_ure_dir_map[port], 348 + 0); 467 349 } 468 350 } else { 469 351 struct tioce_dmamap *map; ··· 485 365 } else if (--map->refcnt == 0) { 486 366 for (i = 0; i < map->ate_count; i++) { 487 367 map->ate_shadow[i] = 0; 488 - map->ate_hw[i] = 0; 368 + tioce_mmr_storei(ce_kern, &map->ate_hw[i], 0); 489 369 } 490 370 491 371 list_del(&map->ce_dmamap_list); ··· 606 486 spin_unlock_irqrestore(&ce_kern->ce_lock, flags); 607 487 608 488 dma_map_done: 609 - if (mapaddr & barrier) 489 + if (mapaddr && barrier) 610 490 mapaddr = tioce_dma_barrier(mapaddr, 1); 611 491 612 492 return mapaddr; ··· 661 541 soft->ce_pcibus.bs_persist_segment, 662 542 soft->ce_pcibus.bs_persist_busnum, 0, 0, 0, 0, 0); 663 543 544 + if (ret_stuff.v0) 545 + panic("tioce_error_intr_handler: Fatal TIOCE error"); 546 + 664 547 return IRQ_HANDLED; 548 + } 549 + 550 + /** 551 + * tioce_reserve_m32 - reserve M32 ate's for the indicated address range 552 + * @tioce_kernel: TIOCE context to reserve ate's for 553 + * @base: starting bus address to reserve 554 + * @limit: last bus address to reserve 555 + * 556 + * If base/limit falls within the range of bus space mapped through the 557 + * M32 space, reserve the resources corresponding to the range. 558 + */ 559 + static void 560 + tioce_reserve_m32(struct tioce_kernel *ce_kern, u64 base, u64 limit) 561 + { 562 + int ate_index, last_ate, ps; 563 + struct tioce *ce_mmr; 564 + 565 + if (!TIOCE_M32_ADDR(base)) 566 + return; 567 + 568 + ce_mmr = (struct tioce *)ce_kern->ce_common->ce_pcibus.bs_base; 569 + ps = ce_kern->ce_ate3240_pagesize; 570 + ate_index = ATE_PAGE(base, ps); 571 + last_ate = ate_index + ATE_NPAGES(base, limit-base+1, ps) - 1; 572 + 573 + if (ate_index < 64) 574 + ate_index = 64; 575 + 576 + while (ate_index <= last_ate) { 577 + u64 ate; 578 + 579 + ate = ATE_MAKE(0xdeadbeef, ps); 580 + ce_kern->ce_ate3240_shadow[ate_index] = ate; 581 + tioce_mmr_storei(ce_kern, &ce_mmr->ce_ure_ate3240[ate_index], 582 + ate); 583 + ate_index++; 584 + } 665 585 } 666 586 667 587 /** 668 588 * tioce_kern_init - init kernel structures related to a given TIOCE 669 589 * @tioce_common: ptr to a cached tioce_common struct that originated in prom 670 - */ static struct tioce_kernel * 590 + */ 591 + static struct tioce_kernel * 671 592 tioce_kern_init(struct tioce_common *tioce_common) 672 593 { 673 594 int i; 595 + int ps; 596 + int dev; 674 597 u32 tmp; 598 + unsigned int seg, bus; 675 599 struct tioce *tioce_mmr; 676 600 struct tioce_kernel *tioce_kern; 677 601 ··· 736 572 * here to use pci_read_config_xxx() so use the raw_pci_ops vector. 737 573 */ 738 574 739 - raw_pci_ops->read(tioce_common->ce_pcibus.bs_persist_segment, 740 - tioce_common->ce_pcibus.bs_persist_busnum, 741 - PCI_DEVFN(2, 0), PCI_SECONDARY_BUS, 1, &tmp); 575 + seg = tioce_common->ce_pcibus.bs_persist_segment; 576 + bus = tioce_common->ce_pcibus.bs_persist_busnum; 577 + 578 + raw_pci_ops->read(seg, bus, PCI_DEVFN(2, 0), PCI_SECONDARY_BUS, 1,&tmp); 742 579 tioce_kern->ce_port1_secondary = (u8) tmp; 743 580 744 581 /* ··· 748 583 */ 749 584 750 585 tioce_mmr = (struct tioce *)tioce_common->ce_pcibus.bs_base; 751 - __sn_clrq_relaxed(&tioce_mmr->ce_ure_page_map, CE_URE_PAGESIZE_MASK); 752 - __sn_setq_relaxed(&tioce_mmr->ce_ure_page_map, CE_URE_256K_PAGESIZE); 753 - tioce_kern->ce_ate3240_pagesize = KB(256); 586 + tioce_mmr_clri(tioce_kern, &tioce_mmr->ce_ure_page_map, 587 + CE_URE_PAGESIZE_MASK); 588 + tioce_mmr_seti(tioce_kern, &tioce_mmr->ce_ure_page_map, 589 + CE_URE_256K_PAGESIZE); 590 + ps = tioce_kern->ce_ate3240_pagesize = KB(256); 754 591 755 592 for (i = 0; i < TIOCE_NUM_M40_ATES; i++) { 756 593 tioce_kern->ce_ate40_shadow[i] = 0; 757 - writeq(0, &tioce_mmr->ce_ure_ate40[i]); 594 + tioce_mmr_storei(tioce_kern, &tioce_mmr->ce_ure_ate40[i], 0); 758 595 } 759 596 760 597 for (i = 0; i < TIOCE_NUM_M3240_ATES; i++) { 761 598 tioce_kern->ce_ate3240_shadow[i] = 0; 762 - writeq(0, &tioce_mmr->ce_ure_ate3240[i]); 599 + tioce_mmr_storei(tioce_kern, &tioce_mmr->ce_ure_ate3240[i], 0); 600 + } 601 + 602 + /* 603 + * Reserve ATE's corresponding to reserved address ranges. These 604 + * include: 605 + * 606 + * Memory space covered by each PPB mem base/limit register 607 + * Memory space covered by each PPB prefetch base/limit register 608 + * 609 + * These bus ranges are for pio (downstream) traffic only, and so 610 + * cannot be used for DMA. 611 + */ 612 + 613 + for (dev = 1; dev <= 2; dev++) { 614 + u64 base, limit; 615 + 616 + /* mem base/limit */ 617 + 618 + raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 619 + PCI_MEMORY_BASE, 2, &tmp); 620 + base = (u64)tmp << 16; 621 + 622 + raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 623 + PCI_MEMORY_LIMIT, 2, &tmp); 624 + limit = (u64)tmp << 16; 625 + limit |= 0xfffffUL; 626 + 627 + if (base < limit) 628 + tioce_reserve_m32(tioce_kern, base, limit); 629 + 630 + /* 631 + * prefetch mem base/limit. The tioce ppb's have 64-bit 632 + * decoders, so read the upper portions w/o checking the 633 + * attributes. 634 + */ 635 + 636 + raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 637 + PCI_PREF_MEMORY_BASE, 2, &tmp); 638 + base = ((u64)tmp & PCI_PREF_RANGE_MASK) << 16; 639 + 640 + raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 641 + PCI_PREF_BASE_UPPER32, 4, &tmp); 642 + base |= (u64)tmp << 32; 643 + 644 + raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 645 + PCI_PREF_MEMORY_LIMIT, 2, &tmp); 646 + 647 + limit = ((u64)tmp & PCI_PREF_RANGE_MASK) << 16; 648 + limit |= 0xfffffUL; 649 + 650 + raw_pci_ops->read(seg, bus, PCI_DEVFN(dev, 0), 651 + PCI_PREF_LIMIT_UPPER32, 4, &tmp); 652 + limit |= (u64)tmp << 32; 653 + 654 + if ((base < limit) && TIOCE_M32_ADDR(base)) 655 + tioce_reserve_m32(tioce_kern, base, limit); 763 656 } 764 657 765 658 return tioce_kern; ··· 837 614 { 838 615 struct pcidev_info *pcidev_info; 839 616 struct tioce_common *ce_common; 617 + struct tioce_kernel *ce_kern; 840 618 struct tioce *ce_mmr; 841 619 u64 force_int_val; 842 620 ··· 853 629 854 630 ce_common = (struct tioce_common *)pcidev_info->pdi_pcibus_info; 855 631 ce_mmr = (struct tioce *)ce_common->ce_pcibus.bs_base; 632 + ce_kern = (struct tioce_kernel *)ce_common->ce_kernel_private; 633 + 634 + /* 635 + * TIOCE Rev A workaround (PV 945826), force an interrupt by writing 636 + * the TIO_INTx register directly (1/26/2006) 637 + */ 638 + if (ce_common->ce_rev == TIOCE_REV_A) { 639 + u64 int_bit_mask = (1ULL << sn_irq_info->irq_int_bit); 640 + u64 status; 641 + 642 + tioce_mmr_load(ce_kern, &ce_mmr->ce_adm_int_status, &status); 643 + if (status & int_bit_mask) { 644 + u64 force_irq = (1 << 8) | sn_irq_info->irq_irq; 645 + u64 ctalk = sn_irq_info->irq_xtalkaddr; 646 + u64 nasid, offset; 647 + 648 + nasid = (ctalk & CTALK_NASID_MASK) >> CTALK_NASID_SHFT; 649 + offset = (ctalk & CTALK_NODE_OFFSET); 650 + HUB_S(TIO_IOSPACE_ADDR(nasid, offset), force_irq); 651 + } 652 + 653 + return; 654 + } 856 655 857 656 /* 858 657 * irq_int_bit is originally set up by prom, and holds the interrupt ··· 913 666 default: 914 667 return; 915 668 } 916 - writeq(force_int_val, &ce_mmr->ce_adm_force_int); 669 + tioce_mmr_storei(ce_kern, &ce_mmr->ce_adm_force_int, force_int_val); 917 670 } 918 671 919 672 /** ··· 932 685 { 933 686 struct pcidev_info *pcidev_info; 934 687 struct tioce_common *ce_common; 688 + struct tioce_kernel *ce_kern; 935 689 struct tioce *ce_mmr; 936 690 int bit; 937 691 u64 vector; ··· 943 695 944 696 ce_common = (struct tioce_common *)pcidev_info->pdi_pcibus_info; 945 697 ce_mmr = (struct tioce *)ce_common->ce_pcibus.bs_base; 698 + ce_kern = (struct tioce_kernel *)ce_common->ce_kernel_private; 946 699 947 700 bit = sn_irq_info->irq_int_bit; 948 701 949 - __sn_setq_relaxed(&ce_mmr->ce_adm_int_mask, (1UL << bit)); 702 + tioce_mmr_seti(ce_kern, &ce_mmr->ce_adm_int_mask, (1UL << bit)); 950 703 vector = (u64)sn_irq_info->irq_irq << INTR_VECTOR_SHFT; 951 704 vector |= sn_irq_info->irq_xtalkaddr; 952 - writeq(vector, &ce_mmr->ce_adm_int_dest[bit]); 953 - __sn_clrq_relaxed(&ce_mmr->ce_adm_int_mask, (1UL << bit)); 705 + tioce_mmr_storei(ce_kern, &ce_mmr->ce_adm_int_dest[bit], vector); 706 + tioce_mmr_clri(ce_kern, &ce_mmr->ce_adm_int_mask, (1UL << bit)); 954 707 955 708 tioce_force_interrupt(sn_irq_info); 956 709 } ··· 970 721 static void * 971 722 tioce_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *controller) 972 723 { 724 + int my_nasid; 725 + cnodeid_t my_cnode, mem_cnode; 973 726 struct tioce_common *tioce_common; 727 + struct tioce_kernel *tioce_kern; 728 + struct tioce *tioce_mmr; 974 729 975 730 /* 976 731 * Allocate kernel bus soft and copy from prom. ··· 987 734 memcpy(tioce_common, prom_bussoft, sizeof(struct tioce_common)); 988 735 tioce_common->ce_pcibus.bs_base |= __IA64_UNCACHED_OFFSET; 989 736 990 - if (tioce_kern_init(tioce_common) == NULL) { 737 + tioce_kern = tioce_kern_init(tioce_common); 738 + if (tioce_kern == NULL) { 991 739 kfree(tioce_common); 992 740 return NULL; 993 741 } 742 + 743 + /* 744 + * Clear out any transient errors before registering the error 745 + * interrupt handler. 746 + */ 747 + 748 + tioce_mmr = (struct tioce *)tioce_common->ce_pcibus.bs_base; 749 + tioce_mmr_seti(tioce_kern, &tioce_mmr->ce_adm_int_status_alias, ~0ULL); 750 + tioce_mmr_seti(tioce_kern, &tioce_mmr->ce_adm_error_summary_alias, 751 + ~0ULL); 752 + tioce_mmr_seti(tioce_kern, &tioce_mmr->ce_dre_comp_err_addr, ~0ULL); 994 753 995 754 if (request_irq(SGI_PCIASIC_ERROR, 996 755 tioce_error_intr_handler, ··· 1014 749 __FUNCTION__, SGI_PCIASIC_ERROR, 1015 750 tioce_common->ce_pcibus.bs_persist_segment, 1016 751 tioce_common->ce_pcibus.bs_persist_busnum); 752 + 753 + /* 754 + * identify closest nasid for memory allocations 755 + */ 756 + 757 + my_nasid = NASID_GET(tioce_common->ce_pcibus.bs_base); 758 + my_cnode = nasid_to_cnodeid(my_nasid); 759 + 760 + if (sn_hwperf_get_nearest_node(my_cnode, &mem_cnode, NULL) < 0) { 761 + printk(KERN_WARNING "tioce_bus_fixup: failed to find " 762 + "closest node with MEM to TIO node %d\n", my_cnode); 763 + mem_cnode = (cnodeid_t)-1; /* use any node */ 764 + } 765 + 766 + controller->node = mem_cnode; 1017 767 1018 768 return tioce_common; 1019 769 }
+4 -1
drivers/char/snsc.h
··· 5 5 * License. See the file "COPYING" in the main directory of this archive 6 6 * for more details. 7 7 * 8 - * Copyright (C) 2004 Silicon Graphics, Inc. All rights reserved. 8 + * Copyright (C) 2004-2006 Silicon Graphics, Inc. All rights reserved. 9 9 */ 10 10 11 11 /* ··· 69 69 #define EV_CLASS_TEST_FAULT 0x5000ul 70 70 #define EV_CLASS_TEST_WARNING 0x6000ul 71 71 #define EV_CLASS_PWRD_NOTIFY 0x8000ul 72 + 73 + /* ENV class codes */ 74 + #define ENV_PWRDN_PEND 0x4101ul 72 75 73 76 #define EV_SEVERITY_POWER_STABLE 0x0000ul 74 77 #define EV_SEVERITY_POWER_LOW_WARNING 0x0100ul
+24 -8
drivers/char/snsc_event.c
··· 5 5 * License. See the file "COPYING" in the main directory of this archive 6 6 * for more details. 7 7 * 8 - * Copyright (C) 2004 Silicon Graphics, Inc. All rights reserved. 8 + * Copyright (C) 2004-2006 Silicon Graphics, Inc. All rights reserved. 9 9 */ 10 10 11 11 /* ··· 187 187 static void 188 188 scdrv_dispatch_event(char *event, int len) 189 189 { 190 - int code, esp_code, src; 190 + static int snsc_shutting_down = 0; 191 + int code, esp_code, src, class; 191 192 char desc[CHUNKSIZE]; 192 193 char *severity; 193 194 ··· 200 199 /* how urgent is the message? */ 201 200 severity = scdrv_event_severity(code); 202 201 203 - if ((code & EV_CLASS_MASK) == EV_CLASS_PWRD_NOTIFY) { 202 + class = (code & EV_CLASS_MASK); 203 + 204 + if (class == EV_CLASS_PWRD_NOTIFY || code == ENV_PWRDN_PEND) { 204 205 struct task_struct *p; 206 + 207 + if (snsc_shutting_down) 208 + return; 209 + 210 + snsc_shutting_down = 1; 211 + 212 + /* give a message for each type of event */ 213 + if (class == EV_CLASS_PWRD_NOTIFY) 214 + printk(KERN_NOTICE "Power off indication received." 215 + " Sending SIGPWR to init...\n"); 216 + else if (code == ENV_PWRDN_PEND) 217 + printk(KERN_CRIT "WARNING: Shutting down the system" 218 + " due to a critical environmental condition." 219 + " Sending SIGPWR to init...\n"); 205 220 206 221 /* give a SIGPWR signal to init proc */ 207 222 ··· 227 210 if (p->pid == 1) 228 211 break; 229 212 } 230 - if (p) { /* we found init's task */ 231 - printk(KERN_EMERG "Power off indication received. Initiating power fail sequence...\n"); 213 + if (p) { 232 214 force_sig(SIGPWR, p); 233 - } else { /* failed to find init's task - just give message(s) */ 234 - printk(KERN_WARNING "Failed to find init proc to handle power off!\n"); 235 - printk("%s|$(0x%x)%s\n", severity, esp_code, desc); 215 + } else { 216 + printk(KERN_ERR "Failed to signal init!\n"); 217 + snsc_shutting_down = 0; /* so can try again (?) */ 236 218 } 237 219 read_unlock(&tasklist_lock); 238 220 } else {
+18 -23
drivers/sn/ioc4.c
··· 31 31 #include <linux/ioc4.h> 32 32 #include <linux/mmtimer.h> 33 33 #include <linux/rtc.h> 34 - #include <linux/rwsem.h> 34 + #include <linux/mutex.h> 35 35 #include <asm/sn/addrs.h> 36 36 #include <asm/sn/clksupport.h> 37 37 #include <asm/sn/shub_mmr.h> ··· 54 54 * Submodule management * 55 55 ************************/ 56 56 57 - static LIST_HEAD(ioc4_devices); 58 - static DECLARE_RWSEM(ioc4_devices_rwsem); 57 + static DEFINE_MUTEX(ioc4_mutex); 59 58 59 + static LIST_HEAD(ioc4_devices); 60 60 static LIST_HEAD(ioc4_submodules); 61 - static DECLARE_RWSEM(ioc4_submodules_rwsem); 62 61 63 62 /* Register an IOC4 submodule */ 64 63 int ··· 65 66 { 66 67 struct ioc4_driver_data *idd; 67 68 68 - down_write(&ioc4_submodules_rwsem); 69 + mutex_lock(&ioc4_mutex); 69 70 list_add(&is->is_list, &ioc4_submodules); 70 - up_write(&ioc4_submodules_rwsem); 71 71 72 72 /* Initialize submodule for each IOC4 */ 73 73 if (!is->is_probe) 74 - return 0; 74 + goto out; 75 75 76 - down_read(&ioc4_devices_rwsem); 77 76 list_for_each_entry(idd, &ioc4_devices, idd_list) { 78 77 if (is->is_probe(idd)) { 79 78 printk(KERN_WARNING ··· 81 84 pci_name(idd->idd_pdev)); 82 85 } 83 86 } 84 - up_read(&ioc4_devices_rwsem); 85 - 87 + out: 88 + mutex_unlock(&ioc4_mutex); 86 89 return 0; 87 90 } 88 91 ··· 92 95 { 93 96 struct ioc4_driver_data *idd; 94 97 95 - down_write(&ioc4_submodules_rwsem); 98 + mutex_lock(&ioc4_mutex); 96 99 list_del(&is->is_list); 97 - up_write(&ioc4_submodules_rwsem); 98 100 99 101 /* Remove submodule for each IOC4 */ 100 102 if (!is->is_remove) 101 - return; 103 + goto out; 102 104 103 - down_read(&ioc4_devices_rwsem); 104 105 list_for_each_entry(idd, &ioc4_devices, idd_list) { 105 106 if (is->is_remove(idd)) { 106 107 printk(KERN_WARNING ··· 108 113 pci_name(idd->idd_pdev)); 109 114 } 110 115 } 111 - up_read(&ioc4_devices_rwsem); 116 + out: 117 + mutex_unlock(&ioc4_mutex); 112 118 } 113 119 114 120 /********************* ··· 308 312 /* Track PCI-device specific data */ 309 313 idd->idd_serial_data = NULL; 310 314 pci_set_drvdata(idd->idd_pdev, idd); 311 - down_write(&ioc4_devices_rwsem); 315 + 316 + mutex_lock(&ioc4_mutex); 312 317 list_add(&idd->idd_list, &ioc4_devices); 313 - up_write(&ioc4_devices_rwsem); 314 318 315 319 /* Add this IOC4 to all submodules */ 316 - down_read(&ioc4_submodules_rwsem); 317 320 list_for_each_entry(is, &ioc4_submodules, is_list) { 318 321 if (is->is_probe && is->is_probe(idd)) { 319 322 printk(KERN_WARNING ··· 322 327 pci_name(idd->idd_pdev)); 323 328 } 324 329 } 325 - up_read(&ioc4_submodules_rwsem); 330 + mutex_unlock(&ioc4_mutex); 326 331 327 332 return 0; 328 333 ··· 346 351 idd = pci_get_drvdata(pdev); 347 352 348 353 /* Remove this IOC4 from all submodules */ 349 - down_read(&ioc4_submodules_rwsem); 354 + mutex_lock(&ioc4_mutex); 350 355 list_for_each_entry(is, &ioc4_submodules, is_list) { 351 356 if (is->is_remove && is->is_remove(idd)) { 352 357 printk(KERN_WARNING ··· 356 361 pci_name(idd->idd_pdev)); 357 362 } 358 363 } 359 - up_read(&ioc4_submodules_rwsem); 364 + mutex_unlock(&ioc4_mutex); 360 365 361 366 /* Release resources */ 362 367 iounmap(idd->idd_misc_regs); ··· 372 377 pci_disable_device(pdev); 373 378 374 379 /* Remove and free driver data */ 375 - down_write(&ioc4_devices_rwsem); 380 + mutex_lock(&ioc4_mutex); 376 381 list_del(&idd->idd_list); 377 - up_write(&ioc4_devices_rwsem); 382 + mutex_unlock(&ioc4_mutex); 378 383 kfree(idd); 379 384 } 380 385
+17 -117
include/asm-ia64/intel_intrin.h
··· 5 5 * 6 6 * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com> 7 7 * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com> 8 + * Copyright (C) 2005,2006 Hongjiu Lu <hongjiu.lu@intel.com> 8 9 * 9 10 */ 10 - #include <asm/types.h> 11 - 12 - void __lfetch(int lfhint, void *y); 13 - void __lfetch_excl(int lfhint, void *y); 14 - void __lfetch_fault(int lfhint, void *y); 15 - void __lfetch_fault_excl(int lfhint, void *y); 16 - 17 - /* In the following, whichFloatReg should be an integer from 0-127 */ 18 - void __ldfs(const int whichFloatReg, void *src); 19 - void __ldfd(const int whichFloatReg, void *src); 20 - void __ldfe(const int whichFloatReg, void *src); 21 - void __ldf8(const int whichFloatReg, void *src); 22 - void __ldf_fill(const int whichFloatReg, void *src); 23 - void __stfs(void *dst, const int whichFloatReg); 24 - void __stfd(void *dst, const int whichFloatReg); 25 - void __stfe(void *dst, const int whichFloatReg); 26 - void __stf8(void *dst, const int whichFloatReg); 27 - void __stf_spill(void *dst, const int whichFloatReg); 28 - 29 - void __st1_rel(void *dst, const __s8 value); 30 - void __st2_rel(void *dst, const __s16 value); 31 - void __st4_rel(void *dst, const __s32 value); 32 - void __st8_rel(void *dst, const __s64 value); 33 - __u8 __ld1_acq(void *src); 34 - __u16 __ld2_acq(void *src); 35 - __u32 __ld4_acq(void *src); 36 - __u64 __ld8_acq(void *src); 37 - 38 - __u64 __fetchadd4_acq(__u32 *addend, const int increment); 39 - __u64 __fetchadd4_rel(__u32 *addend, const int increment); 40 - __u64 __fetchadd8_acq(__u64 *addend, const int increment); 41 - __u64 __fetchadd8_rel(__u64 *addend, const int increment); 42 - 43 - __u64 __getf_exp(double d); 44 - 45 - /* OS Related Itanium(R) Intrinsics */ 46 - 47 - /* The names to use for whichReg and whichIndReg below come from 48 - the include file asm/ia64regs.h */ 49 - 50 - __u64 __getIndReg(const int whichIndReg, __s64 index); 51 - __u64 __getReg(const int whichReg); 52 - 53 - void __setIndReg(const int whichIndReg, __s64 index, __u64 value); 54 - void __setReg(const int whichReg, __u64 value); 55 - 56 - void __mf(void); 57 - void __mfa(void); 58 - void __synci(void); 59 - void __itcd(__s64 pa); 60 - void __itci(__s64 pa); 61 - void __itrd(__s64 whichTransReg, __s64 pa); 62 - void __itri(__s64 whichTransReg, __s64 pa); 63 - void __ptce(__s64 va); 64 - void __ptcl(__s64 va, __s64 pagesz); 65 - void __ptcg(__s64 va, __s64 pagesz); 66 - void __ptcga(__s64 va, __s64 pagesz); 67 - void __ptri(__s64 va, __s64 pagesz); 68 - void __ptrd(__s64 va, __s64 pagesz); 69 - void __invala (void); 70 - void __invala_gr(const int whichGeneralReg /* 0-127 */ ); 71 - void __invala_fr(const int whichFloatReg /* 0-127 */ ); 72 - void __nop(const int); 73 - void __fc(__u64 *addr); 74 - void __sum(int mask); 75 - void __rum(int mask); 76 - void __ssm(int mask); 77 - void __rsm(int mask); 78 - __u64 __thash(__s64); 79 - __u64 __ttag(__s64); 80 - __s64 __tpa(__s64); 81 - 82 - /* Intrinsics for implementing get/put_user macros */ 83 - void __st_user(const char *tableName, __u64 addr, char size, char relocType, __u64 val); 84 - void __ld_user(const char *tableName, __u64 addr, char size, char relocType); 85 - 86 - /* This intrinsic does not generate code, it creates a barrier across which 87 - * the compiler will not schedule data access instructions. 88 - */ 89 - void __memory_barrier(void); 90 - 91 - void __isrlz(void); 92 - void __dsrlz(void); 93 - 94 - __u64 _m64_mux1(__u64 a, const int n); 95 - __u64 __thash(__u64); 96 - 97 - /* Lock and Atomic Operation Related Intrinsics */ 98 - __u64 _InterlockedExchange8(volatile __u8 *trgt, __u8 value); 99 - __u64 _InterlockedExchange16(volatile __u16 *trgt, __u16 value); 100 - __s64 _InterlockedExchange(volatile __u32 *trgt, __u32 value); 101 - __s64 _InterlockedExchange64(volatile __u64 *trgt, __u64 value); 102 - 103 - __u64 _InterlockedCompareExchange8_rel(volatile __u8 *dest, __u64 xchg, __u64 comp); 104 - __u64 _InterlockedCompareExchange8_acq(volatile __u8 *dest, __u64 xchg, __u64 comp); 105 - __u64 _InterlockedCompareExchange16_rel(volatile __u16 *dest, __u64 xchg, __u64 comp); 106 - __u64 _InterlockedCompareExchange16_acq(volatile __u16 *dest, __u64 xchg, __u64 comp); 107 - __u64 _InterlockedCompareExchange_rel(volatile __u32 *dest, __u64 xchg, __u64 comp); 108 - __u64 _InterlockedCompareExchange_acq(volatile __u32 *dest, __u64 xchg, __u64 comp); 109 - __u64 _InterlockedCompareExchange64_rel(volatile __u64 *dest, __u64 xchg, __u64 comp); 110 - __u64 _InterlockedCompareExchange64_acq(volatile __u64 *dest, __u64 xchg, __u64 comp); 111 - 112 - __s64 _m64_dep_mi(const int v, __s64 s, const int p, const int len); 113 - __s64 _m64_shrp(__s64 a, __s64 b, const int count); 114 - __s64 _m64_popcnt(__s64 a); 11 + #include <ia64intrin.h> 115 12 116 13 #define ia64_barrier() __memory_barrier() 117 14 ··· 19 122 #define ia64_getreg __getReg 20 123 #define ia64_setreg __setReg 21 124 22 - #define ia64_hint(x) 125 + #define ia64_hint __hint 126 + #define ia64_hint_pause __hint_pause 23 127 24 - #define ia64_mux1_brcst 0 25 - #define ia64_mux1_mix 8 26 - #define ia64_mux1_shuf 9 27 - #define ia64_mux1_alt 10 28 - #define ia64_mux1_rev 11 128 + #define ia64_mux1_brcst _m64_mux1_brcst 129 + #define ia64_mux1_mix _m64_mux1_mix 130 + #define ia64_mux1_shuf _m64_mux1_shuf 131 + #define ia64_mux1_alt _m64_mux1_alt 132 + #define ia64_mux1_rev _m64_mux1_rev 29 133 30 - #define ia64_mux1 _m64_mux1 134 + #define ia64_mux1(x,v) _m_to_int64(_m64_mux1(_m_from_int64(x), (v))) 31 135 #define ia64_popcnt _m64_popcnt 32 136 #define ia64_getf_exp __getf_exp 33 137 #define ia64_shrp _m64_shrp ··· 56 158 #define ia64_stf8 __stf8 57 159 #define ia64_stf_spill __stf_spill 58 160 59 - #define ia64_mf __mf 161 + #define ia64_mf __mf 60 162 #define ia64_mfa __mfa 61 163 62 164 #define ia64_fetchadd4_acq __fetchadd4_acq ··· 132 234 133 235 /* Values for lfhint in __lfetch and __lfetch_fault */ 134 236 135 - #define ia64_lfhint_none 0 136 - #define ia64_lfhint_nt1 1 137 - #define ia64_lfhint_nt2 2 138 - #define ia64_lfhint_nta 3 237 + #define ia64_lfhint_none __lfhint_none 238 + #define ia64_lfhint_nt1 __lfhint_nt1 239 + #define ia64_lfhint_nt2 __lfhint_nt2 240 + #define ia64_lfhint_nta __lfhint_nta 139 241 140 242 #define ia64_lfetch __lfetch 141 243 #define ia64_lfetch_excl __lfetch_excl ··· 151 253 ia64_rsm(IA64_PSR_I); \ 152 254 } \ 153 255 } while (0) 256 + 257 + #define __builtin_trap() __break(0); 154 258 155 259 #endif /* _ASM_IA64_INTEL_INTRIN_H */
+13
include/asm-ia64/machvec.h
··· 20 20 struct page; 21 21 struct mm_struct; 22 22 struct pci_bus; 23 + struct task_struct; 23 24 24 25 typedef void ia64_mv_setup_t (char **); 25 26 typedef void ia64_mv_cpu_init_t (void); ··· 35 34 u8 size); 36 35 typedef int ia64_mv_pci_legacy_write_t (struct pci_bus *, u16 port, u32 val, 37 36 u8 size); 37 + typedef void ia64_mv_migrate_t(struct task_struct * task); 38 38 39 39 /* DMA-mapping interface: */ 40 40 typedef void ia64_mv_dma_init (void); ··· 84 82 85 83 static inline void 86 84 machvec_noop_mm (struct mm_struct *mm) 85 + { 86 + } 87 + 88 + static inline void 89 + machvec_noop_task (struct task_struct *task) 87 90 { 88 91 } 89 92 ··· 153 146 # define platform_readw_relaxed ia64_mv.readw_relaxed 154 147 # define platform_readl_relaxed ia64_mv.readl_relaxed 155 148 # define platform_readq_relaxed ia64_mv.readq_relaxed 149 + # define platform_migrate ia64_mv.migrate 156 150 # endif 157 151 158 152 /* __attribute__((__aligned__(16))) is required to make size of the ··· 202 194 ia64_mv_readw_relaxed_t *readw_relaxed; 203 195 ia64_mv_readl_relaxed_t *readl_relaxed; 204 196 ia64_mv_readq_relaxed_t *readq_relaxed; 197 + ia64_mv_migrate_t *migrate; 205 198 } __attribute__((__aligned__(16))); /* align attrib? see above comment */ 206 199 207 200 #define MACHVEC_INIT(name) \ ··· 247 238 platform_readw_relaxed, \ 248 239 platform_readl_relaxed, \ 249 240 platform_readq_relaxed, \ 241 + platform_migrate, \ 250 242 } 251 243 252 244 extern struct ia64_machine_vector ia64_mv; ··· 395 385 #endif 396 386 #ifndef platform_readq_relaxed 397 387 # define platform_readq_relaxed __ia64_readq_relaxed 388 + #endif 389 + #ifndef platform_migrate 390 + # define platform_migrate machvec_noop_task 398 391 #endif 399 392 400 393 #endif /* _ASM_IA64_MACHVEC_H */
+3 -1
include/asm-ia64/machvec_sn2.h
··· 1 1 /* 2 - * Copyright (c) 2002-2003, 2006 Silicon Graphics, Inc. All Rights Reserved. 2 + * Copyright (c) 2002-2003,2006 Silicon Graphics, Inc. All Rights Reserved. 3 3 * 4 4 * This program is free software; you can redistribute it and/or modify it 5 5 * under the terms of version 2 of the GNU General Public License ··· 66 66 extern ia64_mv_dma_sync_sg_for_device sn_dma_sync_sg_for_device; 67 67 extern ia64_mv_dma_mapping_error sn_dma_mapping_error; 68 68 extern ia64_mv_dma_supported sn_dma_supported; 69 + extern ia64_mv_migrate_t sn_migrate; 69 70 70 71 /* 71 72 * This stuff has dual use! ··· 116 115 #define platform_dma_sync_sg_for_device sn_dma_sync_sg_for_device 117 116 #define platform_dma_mapping_error sn_dma_mapping_error 118 117 #define platform_dma_supported sn_dma_supported 118 + #define platform_migrate sn_migrate 119 119 120 120 #include <asm/sn/io.h> 121 121
+2
include/asm-ia64/mca.h
··· 131 131 /* Array of physical addresses of each CPU's MCA area. */ 132 132 extern unsigned long __per_cpu_mca[NR_CPUS]; 133 133 134 + extern int cpe_vector; 135 + extern int ia64_cpe_irq; 134 136 extern void ia64_mca_init(void); 135 137 extern void ia64_mca_cpu_init(void *); 136 138 extern void ia64_os_mca_dispatch(void);
+88 -5
include/asm-ia64/mutex.h
··· 1 1 /* 2 - * Pull in the generic implementation for the mutex fastpath. 2 + * ia64 implementation of the mutex fastpath. 3 3 * 4 - * TODO: implement optimized primitives instead, or leave the generic 5 - * implementation in place, or pick the atomic_xchg() based generic 6 - * implementation. (see asm-generic/mutex-xchg.h for details) 4 + * Copyright (C) 2006 Ken Chen <kenneth.w.chen@intel.com> 5 + * 7 6 */ 8 7 9 - #include <asm-generic/mutex-dec.h> 8 + #ifndef _ASM_MUTEX_H 9 + #define _ASM_MUTEX_H 10 + 11 + /** 12 + * __mutex_fastpath_lock - try to take the lock by moving the count 13 + * from 1 to a 0 value 14 + * @count: pointer of type atomic_t 15 + * @fail_fn: function to call if the original value was not 1 16 + * 17 + * Change the count from 1 to a value lower than 1, and call <fail_fn> if 18 + * it wasn't 1 originally. This function MUST leave the value lower than 19 + * 1 even when the "1" assertion wasn't true. 20 + */ 21 + static inline void 22 + __mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *)) 23 + { 24 + if (unlikely(ia64_fetchadd4_acq(count, -1) != 1)) 25 + fail_fn(count); 26 + } 27 + 28 + /** 29 + * __mutex_fastpath_lock_retval - try to take the lock by moving the count 30 + * from 1 to a 0 value 31 + * @count: pointer of type atomic_t 32 + * @fail_fn: function to call if the original value was not 1 33 + * 34 + * Change the count from 1 to a value lower than 1, and call <fail_fn> if 35 + * it wasn't 1 originally. This function returns 0 if the fastpath succeeds, 36 + * or anything the slow path function returns. 37 + */ 38 + static inline int 39 + __mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) 40 + { 41 + if (unlikely(ia64_fetchadd4_acq(count, -1) != 1)) 42 + return fail_fn(count); 43 + return 0; 44 + } 45 + 46 + /** 47 + * __mutex_fastpath_unlock - try to promote the count from 0 to 1 48 + * @count: pointer of type atomic_t 49 + * @fail_fn: function to call if the original value was not 0 50 + * 51 + * Try to promote the count from 0 to 1. If it wasn't 0, call <fail_fn>. 52 + * In the failure case, this function is allowed to either set the value to 53 + * 1, or to set it to a value lower than 1. 54 + * 55 + * If the implementation sets it to a value of lower than 1, then the 56 + * __mutex_slowpath_needs_to_unlock() macro needs to return 1, it needs 57 + * to return 0 otherwise. 58 + */ 59 + static inline void 60 + __mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *)) 61 + { 62 + int ret = ia64_fetchadd4_rel(count, 1); 63 + if (unlikely(ret < 0)) 64 + fail_fn(count); 65 + } 66 + 67 + #define __mutex_slowpath_needs_to_unlock() 1 68 + 69 + /** 70 + * __mutex_fastpath_trylock - try to acquire the mutex, without waiting 71 + * 72 + * @count: pointer of type atomic_t 73 + * @fail_fn: fallback function 74 + * 75 + * Change the count from 1 to a value lower than 1, and return 0 (failure) 76 + * if it wasn't 1 originally, or return 1 (success) otherwise. This function 77 + * MUST leave the value lower than 1 even when the "1" assertion wasn't true. 78 + * Additionally, if the value was < 0 originally, this function must not leave 79 + * it to 0 on failure. 80 + * 81 + * If the architecture has no effective trylock variant, it should call the 82 + * <fail_fn> spinlock-based trylock variant unconditionally. 83 + */ 84 + static inline int 85 + __mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *)) 86 + { 87 + if (likely(cmpxchg_acq(count, 1, 0)) == 1) 88 + return 1; 89 + return 0; 90 + } 91 + 92 + #endif
+2 -1
include/asm-ia64/processor.h
··· 50 50 #define IA64_THREAD_PM_VALID (__IA64_UL(1) << 2) /* performance registers valid? */ 51 51 #define IA64_THREAD_UAC_NOPRINT (__IA64_UL(1) << 3) /* don't log unaligned accesses */ 52 52 #define IA64_THREAD_UAC_SIGBUS (__IA64_UL(1) << 4) /* generate SIGBUS on unaligned acc. */ 53 - /* bit 5 is currently unused */ 53 + #define IA64_THREAD_MIGRATION (__IA64_UL(1) << 5) /* require migration 54 + sync at ctx sw */ 54 55 #define IA64_THREAD_FPEMU_NOPRINT (__IA64_UL(1) << 6) /* don't log any fpswa faults */ 55 56 #define IA64_THREAD_FPEMU_SIGFPE (__IA64_UL(1) << 7) /* send a SIGFPE for fpswa faults */ 56 57
-2
include/asm-ia64/signal.h
··· 158 158 159 159 #define ptrace_signal_deliver(regs, cookie) do { } while (0) 160 160 161 - void set_sigdelayed(pid_t pid, int signo, int code, void __user *addr); 162 - 163 161 #endif /* __KERNEL__ */ 164 162 165 163 # endif /* !__ASSEMBLY__ */
+8
include/asm-ia64/sn/addrs.h
··· 283 283 #define REMOTE_HUB_L(n, a) HUB_L(REMOTE_HUB_ADDR((n), (a))) 284 284 #define REMOTE_HUB_S(n, a, d) HUB_S(REMOTE_HUB_ADDR((n), (a)), (d)) 285 285 286 + /* 287 + * Coretalk address breakdown 288 + */ 289 + #define CTALK_NASID_SHFT 40 290 + #define CTALK_NASID_MASK (0x3FFFULL << CTALK_NASID_SHFT) 291 + #define CTALK_CID_SHFT 38 292 + #define CTALK_CID_MASK (0x3ULL << CTALK_CID_SHFT) 293 + #define CTALK_NODE_OFFSET 0x3FFFFFFFFF 286 294 287 295 #endif /* _ASM_IA64_SN_ADDRS_H */
+5 -51
include/asm-ia64/sn/rw_mmr.h
··· 3 3 * License. See the file "COPYING" in the main directory of this archive 4 4 * for more details. 5 5 * 6 - * Copyright (C) 2002-2004 Silicon Graphics, Inc. All Rights Reserved. 6 + * Copyright (C) 2002-2006 Silicon Graphics, Inc. All Rights Reserved. 7 7 */ 8 8 #ifndef _ASM_IA64_SN_RW_MMR_H 9 9 #define _ASM_IA64_SN_RW_MMR_H 10 10 11 11 12 12 /* 13 - * This file contains macros used to access MMR registers via 14 - * uncached physical addresses. 13 + * This file that access MMRs via uncached physical addresses. 15 14 * pio_phys_read_mmr - read an MMR 16 15 * pio_phys_write_mmr - write an MMR 17 16 * pio_atomic_phys_write_mmrs - atomically write 1 or 2 MMRs with psr.ic=0 ··· 21 22 */ 22 23 23 24 24 - extern inline long 25 - pio_phys_read_mmr(volatile long *mmr) 26 - { 27 - long val; 28 - asm volatile 29 - ("mov r2=psr;;" 30 - "rsm psr.i | psr.dt;;" 31 - "srlz.i;;" 32 - "ld8.acq %0=[%1];;" 33 - "mov psr.l=r2;;" 34 - "srlz.i;;" 35 - : "=r"(val) 36 - : "r"(mmr) 37 - : "r2"); 38 - return val; 39 - } 40 - 41 - 42 - 43 - extern inline void 44 - pio_phys_write_mmr(volatile long *mmr, long val) 45 - { 46 - asm volatile 47 - ("mov r2=psr;;" 48 - "rsm psr.i | psr.dt;;" 49 - "srlz.i;;" 50 - "st8.rel [%0]=%1;;" 51 - "mov psr.l=r2;;" 52 - "srlz.i;;" 53 - :: "r"(mmr), "r"(val) 54 - : "r2", "memory"); 55 - } 56 - 57 - extern inline void 58 - pio_atomic_phys_write_mmrs(volatile long *mmr1, long val1, volatile long *mmr2, long val2) 59 - { 60 - asm volatile 61 - ("mov r2=psr;;" 62 - "rsm psr.i | psr.dt | psr.ic;;" 63 - "cmp.ne p9,p0=%2,r0;" 64 - "srlz.i;;" 65 - "st8.rel [%0]=%1;" 66 - "(p9) st8.rel [%2]=%3;;" 67 - "mov psr.l=r2;;" 68 - "srlz.i;;" 69 - :: "r"(mmr1), "r"(val1), "r"(mmr2), "r"(val2) 70 - : "p9", "r2", "memory"); 71 - } 25 + extern long pio_phys_read_mmr(volatile long *mmr); 26 + extern void pio_phys_write_mmr(volatile long *mmr, long val); 27 + extern void pio_atomic_phys_write_mmrs(volatile long *mmr1, long val1, volatile long *mmr2, long val2); 72 28 73 29 #endif /* _ASM_IA64_SN_RW_MMR_H */
+34 -2
include/asm-ia64/sn/tioce.h
··· 11 11 12 12 /* CE ASIC part & mfgr information */ 13 13 #define TIOCE_PART_NUM 0xCE00 14 - #define TIOCE_MFGR_NUM 0x36 14 + #define TIOCE_SRC_ID 0x01 15 15 #define TIOCE_REV_A 0x1 16 16 17 17 /* CE Virtual PPB Vendor/Device IDs */ ··· 20 20 21 21 /* CE Host Bridge Vendor/Device IDs */ 22 22 #define CE_HOST_BRIDGE_VENDOR_ID 0x10a9 23 - #define CE_HOST_BRIDGE_DEVICE_ID 0x4003 23 + #define CE_HOST_BRIDGE_DEVICE_ID 0x4001 24 24 25 25 26 26 #define TIOCE_NUM_M40_ATES 4096 ··· 463 463 u64 ce_end_of_struct; /* 0x044400 */ 464 464 } tioce_t; 465 465 466 + /* ce_lsiX_gb_cfg1 register bit masks & shifts */ 467 + #define CE_LSI_GB_CFG1_RXL0S_THS_SHFT 0 468 + #define CE_LSI_GB_CFG1_RXL0S_THS_MASK (0xffULL << 0) 469 + #define CE_LSI_GB_CFG1_RXL0S_SMP_SHFT 8 470 + #define CE_LSI_GB_CFG1_RXL0S_SMP_MASK (0xfULL << 8); 471 + #define CE_LSI_GB_CFG1_RXL0S_ADJ_SHFT 12 472 + #define CE_LSI_GB_CFG1_RXL0S_ADJ_MASK (0x7ULL << 12) 473 + #define CE_LSI_GB_CFG1_RXL0S_FLT_SHFT 15 474 + #define CE_LSI_GB_CFG1_RXL0S_FLT_MASK (0x1ULL << 15) 475 + #define CE_LSI_GB_CFG1_LPBK_SEL_SHFT 16 476 + #define CE_LSI_GB_CFG1_LPBK_SEL_MASK (0x3ULL << 16) 477 + #define CE_LSI_GB_CFG1_LPBK_EN_SHFT 18 478 + #define CE_LSI_GB_CFG1_LPBK_EN_MASK (0x1ULL << 18) 479 + #define CE_LSI_GB_CFG1_RVRS_LB_SHFT 19 480 + #define CE_LSI_GB_CFG1_RVRS_LB_MASK (0x1ULL << 19) 481 + #define CE_LSI_GB_CFG1_RVRS_CLK_SHFT 20 482 + #define CE_LSI_GB_CFG1_RVRS_CLK_MASK (0x3ULL << 20) 483 + #define CE_LSI_GB_CFG1_SLF_TS_SHFT 24 484 + #define CE_LSI_GB_CFG1_SLF_TS_MASK (0xfULL << 24) 466 485 467 486 /* ce_adm_int_mask/ce_adm_int_status register bit defines */ 468 487 #define CE_ADM_INT_CE_ERROR_SHFT 0 ··· 611 592 #define CE_URE_RD_MRG_ENABLE (0x1ULL << 0) 612 593 #define CE_URE_WRT_MRG_ENABLE1 (0x1ULL << 4) 613 594 #define CE_URE_WRT_MRG_ENABLE2 (0x1ULL << 5) 595 + #define CE_URE_WRT_MRG_TIMER_SHFT 12 596 + #define CE_URE_WRT_MRG_TIMER_MASK (0x7FFULL << CE_URE_WRT_MRG_TIMER_SHFT) 597 + #define CE_URE_WRT_MRG_TIMER(x) (((u64)(x) << \ 598 + CE_URE_WRT_MRG_TIMER_SHFT) & \ 599 + CE_URE_WRT_MRG_TIMER_MASK) 614 600 #define CE_URE_RSPQ_BYPASS_DISABLE (0x1ULL << 24) 615 601 #define CE_URE_UPS_DAT1_PAR_DISABLE (0x1ULL << 32) 616 602 #define CE_URE_UPS_HDR1_PAR_DISABLE (0x1ULL << 33) ··· 677 653 #define CE_URE_SI (0x1ULL << 0) 678 654 #define CE_URE_ELAL_SHFT 4 679 655 #define CE_URE_ELAL_MASK (0x7ULL << CE_URE_ELAL_SHFT) 656 + #define CE_URE_ELAL_SET(n) (((u64)(n) << CE_URE_ELAL_SHFT) & \ 657 + CE_URE_ELAL_MASK) 680 658 #define CE_URE_ELAL1_SHFT 8 681 659 #define CE_URE_ELAL1_MASK (0x7ULL << CE_URE_ELAL1_SHFT) 660 + #define CE_URE_ELAL1_SET(n) (((u64)(n) << CE_URE_ELAL1_SHFT) & \ 661 + CE_URE_ELAL1_MASK) 682 662 #define CE_URE_SCC (0x1ULL << 12) 683 663 #define CE_URE_PN1_SHFT 16 684 664 #define CE_URE_PN1_MASK (0xFFULL << CE_URE_PN1_SHFT) ··· 703 675 #define CE_URE_HPC (0x1ULL << 6) 704 676 #define CE_URE_SPLV_SHFT 7 705 677 #define CE_URE_SPLV_MASK (0xFFULL << CE_URE_SPLV_SHFT) 678 + #define CE_URE_SPLV_SET(n) (((u64)(n) << CE_URE_SPLV_SHFT) & \ 679 + CE_URE_SPLV_MASK) 706 680 #define CE_URE_SPLS_SHFT 15 707 681 #define CE_URE_SPLS_MASK (0x3ULL << CE_URE_SPLS_SHFT) 682 + #define CE_URE_SPLS_SET(n) (((u64)(n) << CE_URE_SPLS_SHFT) & \ 683 + CE_URE_SPLS_MASK) 708 684 #define CE_URE_PSN1_SHFT 19 709 685 #define CE_URE_PSN1_MASK (0x1FFFULL << CE_URE_PSN1_SHFT) 710 686 #define CE_URE_PSN2_SHFT 32
-22
include/asm-ia64/sn/xpc.h
··· 1227 1227 1228 1228 1229 1229 1230 - static inline void * 1231 - xpc_kmalloc_cacheline_aligned(size_t size, gfp_t flags, void **base) 1232 - { 1233 - /* see if kmalloc will give us cachline aligned memory by default */ 1234 - *base = kmalloc(size, flags); 1235 - if (*base == NULL) { 1236 - return NULL; 1237 - } 1238 - if ((u64) *base == L1_CACHE_ALIGN((u64) *base)) { 1239 - return *base; 1240 - } 1241 - kfree(*base); 1242 - 1243 - /* nope, we'll have to do it ourselves */ 1244 - *base = kmalloc(size + L1_CACHE_BYTES, flags); 1245 - if (*base == NULL) { 1246 - return NULL; 1247 - } 1248 - return (void *) L1_CACHE_ALIGN((u64) *base); 1249 - } 1250 - 1251 - 1252 1230 /* 1253 1231 * Check to see if there is any channel activity to/from the specified 1254 1232 * partition.
+7
include/asm-ia64/system.h
··· 244 244 __ia64_save_fpu((prev)->thread.fph); \ 245 245 } \ 246 246 __switch_to(prev, next, last); \ 247 + /* "next" in old context is "current" in new context */ \ 248 + if (unlikely((current->thread.flags & IA64_THREAD_MIGRATION) && \ 249 + (task_cpu(current) != \ 250 + task_thread_info(current)->last_cpu))) { \ 251 + platform_migrate(current); \ 252 + task_thread_info(current)->last_cpu = task_cpu(current); \ 253 + } \ 247 254 } while (0) 248 255 #else 249 256 # define switch_to(prev,next,last) __switch_to(prev, next, last)
+2 -10
include/asm-ia64/thread_info.h
··· 26 26 struct exec_domain *exec_domain;/* execution domain */ 27 27 __u32 flags; /* thread_info flags (see TIF_*) */ 28 28 __u32 cpu; /* current CPU */ 29 + __u32 last_cpu; /* Last CPU thread ran on */ 29 30 mm_segment_t addr_limit; /* user-level address space limit */ 30 31 int preempt_count; /* 0=premptable, <0=BUG; will also serve as bh-counter */ 31 32 struct restart_block restart_block; 32 - struct { 33 - int signo; 34 - int code; 35 - void __user *addr; 36 - unsigned long start_time; 37 - pid_t pid; 38 - } sigdelayed; /* Saved information for TIF_SIGDELAYED */ 39 33 }; 40 34 41 35 #define THREAD_SIZE KERNEL_STACK_SIZE ··· 83 89 #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 84 90 #define TIF_SYSCALL_TRACE 3 /* syscall trace active */ 85 91 #define TIF_SYSCALL_AUDIT 4 /* syscall auditing active */ 86 - #define TIF_SIGDELAYED 5 /* signal delayed from MCA/INIT/NMI/PMI context */ 87 92 #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ 88 93 #define TIF_MEMDIE 17 89 94 #define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */ ··· 94 101 #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 95 102 #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 96 103 #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 97 - #define _TIF_SIGDELAYED (1 << TIF_SIGDELAYED) 98 104 #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) 99 105 #define _TIF_MCA_INIT (1 << TIF_MCA_INIT) 100 106 #define _TIF_DB_DISABLED (1 << TIF_DB_DISABLED) 101 107 102 108 /* "work to do on user-return" bits */ 103 - #define TIF_ALLWORK_MASK (_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SIGDELAYED) 109 + #define TIF_ALLWORK_MASK (_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) 104 110 /* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */ 105 111 #define TIF_WORK_MASK (TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)) 106 112