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] fix personality(PER_LINUX32) performance issue
[IA64] Properly unregister legacy interrupts
[IA64] Remove NULL pointer check for argument never passed as NULL.
[IA64] trivial cleanup for perfmon.c
[IA64] trivial cleanup for entry.S
[IA64] fix interrupt masking for pending works on kernel leave
[IA64] allow user to force_pal_cache_flush
[IA64] Don't reserve crashkernel memory > 4 GB
[IA64] machvec support for SGI UV platform
[IA64] Add header files for SGI UV platform

+878 -38
+6
Documentation/kernel-parameters.txt
··· 686 floppy= [HW] 687 See Documentation/floppy.txt. 688 689 gamecon.map[2|3]= 690 [HW,JOY] Multisystem joystick and NES/SNES/PSX pad 691 support via parallel port (up to 5 devices per port)
··· 686 floppy= [HW] 687 See Documentation/floppy.txt. 688 689 + force_pal_cache_flush 690 + [IA-64] Avoid check_sal_cache_flush which may hang on 691 + buggy SAL_CACHE_FLUSH implementations. Using this 692 + parameter will force ia64_sal_cache_flush to call 693 + ia64_pal_cache_flush instead of SAL_CACHE_FLUSH. 694 + 695 gamecon.map[2|3]= 696 [HW,JOY] Multisystem joystick and NES/SNES/PSX pad 697 support via parallel port (up to 5 devices per port)
+13
arch/ia64/Kconfig
··· 135 HP-zx1/sx1000 For HP systems 136 HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices. 137 SGI-SN2 For SGI Altix systems 138 Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> 139 140 If you don't know what to do, choose "generic". ··· 168 Selecting this option will optimize the kernel for use on sn2 based 169 systems, but the resulting kernel binary will not run on other 170 types of ia64 systems. If you have an SGI Altix system, it's safe 171 to select this option. If in doubt, select ia64 generic support 172 instead. 173
··· 135 HP-zx1/sx1000 For HP systems 136 HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices. 137 SGI-SN2 For SGI Altix systems 138 + SGI-UV For SGI UV systems 139 Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> 140 141 If you don't know what to do, choose "generic". ··· 167 Selecting this option will optimize the kernel for use on sn2 based 168 systems, but the resulting kernel binary will not run on other 169 types of ia64 systems. If you have an SGI Altix system, it's safe 170 + to select this option. If in doubt, select ia64 generic support 171 + instead. 172 + 173 + config IA64_SGI_UV` 174 + bool "SGI-UV`" 175 + select NUMA 176 + select ACPI_NUMA 177 + select SWIOTLB 178 + help 179 + Selecting this option will optimize the kernel for use on UV based 180 + systems, but the resulting kernel binary will not run on other 181 + types of ia64 systems. If you have an SGI UV system, it's safe 182 to select this option. If in doubt, select ia64 generic support 183 instead. 184
+1 -1
arch/ia64/Makefile
··· 63 drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ 64 drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ 65 drivers-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ 66 - drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/ 67 drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ 68 69 boot := arch/ia64/hp/sim/boot
··· 63 drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ 64 drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ 65 drivers-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ 66 + drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/ arch/ia64/uv/ 67 drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ 68 69 boot := arch/ia64/hp/sim/boot
-10
arch/ia64/ia32/ia32_support.c
··· 15 #include <linux/kernel.h> 16 #include <linux/init.h> 17 #include <linux/mm.h> 18 - #include <linux/personality.h> 19 #include <linux/sched.h> 20 21 #include <asm/intrinsics.h> ··· 28 29 extern int die_if_kernel (char *str, struct pt_regs *regs, long err); 30 31 - struct exec_domain ia32_exec_domain; 32 struct page *ia32_shared_page[NR_CPUS]; 33 unsigned long *ia32_boot_gdt; 34 unsigned long *cpu_gdt_table[NR_CPUS]; ··· 238 static int __init 239 ia32_init (void) 240 { 241 - ia32_exec_domain.name = "Linux/x86"; 242 - ia32_exec_domain.handler = NULL; 243 - ia32_exec_domain.pers_low = PER_LINUX32; 244 - ia32_exec_domain.pers_high = PER_LINUX32; 245 - ia32_exec_domain.signal_map = default_exec_domain.signal_map; 246 - ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap; 247 - register_exec_domain(&ia32_exec_domain); 248 - 249 #if PAGE_SHIFT > IA32_PAGE_SHIFT 250 { 251 extern struct kmem_cache *ia64_partial_page_cachep;
··· 15 #include <linux/kernel.h> 16 #include <linux/init.h> 17 #include <linux/mm.h> 18 #include <linux/sched.h> 19 20 #include <asm/intrinsics.h> ··· 29 30 extern int die_if_kernel (char *str, struct pt_regs *regs, long err); 31 32 struct page *ia32_shared_page[NR_CPUS]; 33 unsigned long *ia32_boot_gdt; 34 unsigned long *cpu_gdt_table[NR_CPUS]; ··· 240 static int __init 241 ia32_init (void) 242 { 243 #if PAGE_SHIFT > IA32_PAGE_SHIFT 244 { 245 extern struct kmem_cache *ia64_partial_page_cachep;
+9 -1
arch/ia64/kernel/acpi.c
··· 117 if (!strcmp(hdr->oem_id, "HP")) { 118 return "hpzx1"; 119 } else if (!strcmp(hdr->oem_id, "SGI")) { 120 - return "sn2"; 121 } 122 123 return "dig"; ··· 133 return "hpzx1_swiotlb"; 134 # elif defined (CONFIG_IA64_SGI_SN2) 135 return "sn2"; 136 # elif defined (CONFIG_IA64_DIG) 137 return "dig"; 138 # else ··· 625 void acpi_unregister_gsi(u32 gsi) 626 { 627 if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) 628 return; 629 630 iosapic_unregister_intr(gsi);
··· 117 if (!strcmp(hdr->oem_id, "HP")) { 118 return "hpzx1"; 119 } else if (!strcmp(hdr->oem_id, "SGI")) { 120 + if (!strcmp(hdr->oem_table_id + 4, "UV")) 121 + return "uv"; 122 + else 123 + return "sn2"; 124 } 125 126 return "dig"; ··· 130 return "hpzx1_swiotlb"; 131 # elif defined (CONFIG_IA64_SGI_SN2) 132 return "sn2"; 133 + # elif defined (CONFIG_IA64_SGI_UV) 134 + return "uv"; 135 # elif defined (CONFIG_IA64_DIG) 136 return "dig"; 137 # else ··· 620 void acpi_unregister_gsi(u32 gsi) 621 { 622 if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) 623 + return; 624 + 625 + if (has_8259 && gsi < 16) 626 return; 627 628 iosapic_unregister_intr(gsi);
+16 -10
arch/ia64/kernel/entry.S
··· 1156 * r31 = current->thread_info->flags 1157 * On exit: 1158 * p6 = TRUE if work-pending-check needs to be redone 1159 */ 1160 .work_pending_syscall: 1161 add r2=-8,r2 ··· 1167 st8 [r2]=r8 1168 st8 [r3]=r10 1169 .work_pending: 1170 - tbit.z p6,p0=r31,TIF_NEED_RESCHED // current_thread_info()->need_resched==0? 1171 (p6) br.cond.sptk.few .notify 1172 #ifdef CONFIG_PREEMPT 1173 (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 1174 ;; 1175 (pKStk) st4 [r20]=r21 1176 - ssm psr.i // enable interrupts 1177 #endif 1178 br.call.spnt.many rp=schedule 1179 - .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 1180 rsm psr.i // disable interrupts 1181 ;; 1182 #ifdef CONFIG_PREEMPT ··· 1185 (pKStk) st4 [r20]=r0 // preempt_count() <- 0 1186 #endif 1187 (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1188 - br.cond.sptk.many .work_processed_kernel // re-check 1189 1190 .notify: 1191 (pUStk) br.call.spnt.many rp=notify_resume_user 1192 - .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 1193 (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1194 - br.cond.sptk.many .work_processed_kernel // don't re-check 1195 1196 .work_pending_syscall_end: 1197 adds r2=PT(R8)+16,r12 ··· 1199 ;; 1200 ld8 r8=[r2] 1201 ld8 r10=[r3] 1202 - br.cond.sptk.many .work_processed_syscall // re-check 1203 1204 END(ia64_leave_kernel) 1205 ··· 1237 END(ia64_invoke_schedule_tail) 1238 1239 /* 1240 - * Setup stack and call do_notify_resume_user(). Note that pSys and pNonSys need to 1241 - * be set up by the caller. We declare 8 input registers so the system call 1242 - * args get preserved, in case we need to restart a system call. 1243 */ 1244 ENTRY(notify_resume_user) 1245 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
··· 1156 * r31 = current->thread_info->flags 1157 * On exit: 1158 * p6 = TRUE if work-pending-check needs to be redone 1159 + * 1160 + * Interrupts are disabled on entry, reenabled depend on work, and 1161 + * disabled on exit. 1162 */ 1163 .work_pending_syscall: 1164 add r2=-8,r2 ··· 1164 st8 [r2]=r8 1165 st8 [r3]=r10 1166 .work_pending: 1167 + tbit.z p6,p0=r31,TIF_NEED_RESCHED // is resched not needed? 1168 (p6) br.cond.sptk.few .notify 1169 #ifdef CONFIG_PREEMPT 1170 (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 1171 ;; 1172 (pKStk) st4 [r20]=r21 1173 #endif 1174 + ssm psr.i // enable interrupts 1175 br.call.spnt.many rp=schedule 1176 + .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check) 1177 rsm psr.i // disable interrupts 1178 ;; 1179 #ifdef CONFIG_PREEMPT ··· 1182 (pKStk) st4 [r20]=r0 // preempt_count() <- 0 1183 #endif 1184 (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1185 + br.cond.sptk.many .work_processed_kernel 1186 1187 .notify: 1188 (pUStk) br.call.spnt.many rp=notify_resume_user 1189 + .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 (don't re-check) 1190 (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1191 + br.cond.sptk.many .work_processed_kernel 1192 1193 .work_pending_syscall_end: 1194 adds r2=PT(R8)+16,r12 ··· 1196 ;; 1197 ld8 r8=[r2] 1198 ld8 r10=[r3] 1199 + br.cond.sptk.many .work_processed_syscall 1200 1201 END(ia64_leave_kernel) 1202 ··· 1234 END(ia64_invoke_schedule_tail) 1235 1236 /* 1237 + * Setup stack and call do_notify_resume_user(), keeping interrupts 1238 + * disabled. 1239 + * 1240 + * Note that pSys and pNonSys need to be set up by the caller. 1241 + * We declare 8 input registers so the system call args get preserved, 1242 + * in case we need to restart a system call. 1243 */ 1244 ENTRY(notify_resume_user) 1245 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-6
arch/ia64/kernel/palinfo.c
··· 900 palinfo_smp_call(void *info) 901 { 902 palinfo_smp_data_t *data = (palinfo_smp_data_t *)info; 903 - if (data == NULL) { 904 - printk(KERN_ERR "palinfo: data pointer is NULL\n"); 905 - data->ret = 0; /* no output */ 906 - return; 907 - } 908 - /* does this actual call */ 909 data->ret = (*data->func)(data->page); 910 } 911
··· 900 palinfo_smp_call(void *info) 901 { 902 palinfo_smp_data_t *data = (palinfo_smp_data_t *)info; 903 data->ret = (*data->func)(data->page); 904 } 905
+10 -6
arch/ia64/kernel/perfmon.c
··· 5013 } 5014 5015 static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds); 5016 /* 5017 * pfm_handle_work() can be called with interrupts enabled 5018 * (TIF_NEED_RESCHED) or disabled. The down_interruptible 5019 * call may sleep, therefore we must re-enable interrupts 5020 * to avoid deadlocks. It is safe to do so because this function 5021 - * is called ONLY when returning to user level (PUStk=1), in which case 5022 * there is no risk of kernel stack overflow due to deep 5023 * interrupt nesting. 5024 */ ··· 5035 5036 ctx = PFM_GET_CTX(current); 5037 if (ctx == NULL) { 5038 - printk(KERN_ERR "perfmon: [%d] has no PFM context\n", task_pid_nr(current)); 5039 return; 5040 } 5041 ··· 5060 /* 5061 * must be done before we check for simple-reset mode 5062 */ 5063 - if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) goto do_zombie; 5064 - 5065 5066 //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking; 5067 - if (reason == PFM_TRAP_REASON_RESET) goto skip_blocking; 5068 5069 /* 5070 * restore interrupt mask to what it was on entry. ··· 5113 /* 5114 * in case of interruption of down() we don't restart anything 5115 */ 5116 - if (ret < 0) goto nothing_to_do; 5117 5118 skip_blocking: 5119 pfm_resume_after_ovfl(ctx, ovfl_regs, regs);
··· 5013 } 5014 5015 static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds); 5016 + 5017 /* 5018 * pfm_handle_work() can be called with interrupts enabled 5019 * (TIF_NEED_RESCHED) or disabled. The down_interruptible 5020 * call may sleep, therefore we must re-enable interrupts 5021 * to avoid deadlocks. It is safe to do so because this function 5022 + * is called ONLY when returning to user level (pUStk=1), in which case 5023 * there is no risk of kernel stack overflow due to deep 5024 * interrupt nesting. 5025 */ ··· 5034 5035 ctx = PFM_GET_CTX(current); 5036 if (ctx == NULL) { 5037 + printk(KERN_ERR "perfmon: [%d] has no PFM context\n", 5038 + task_pid_nr(current)); 5039 return; 5040 } 5041 ··· 5058 /* 5059 * must be done before we check for simple-reset mode 5060 */ 5061 + if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) 5062 + goto do_zombie; 5063 5064 //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking; 5065 + if (reason == PFM_TRAP_REASON_RESET) 5066 + goto skip_blocking; 5067 5068 /* 5069 * restore interrupt mask to what it was on entry. ··· 5110 /* 5111 * in case of interruption of down() we don't restart anything 5112 */ 5113 + if (ret < 0) 5114 + goto nothing_to_do; 5115 5116 skip_blocking: 5117 pfm_resume_after_ovfl(ctx, ovfl_regs, regs);
+21 -4
arch/ia64/kernel/process.c
··· 167 clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME); 168 } 169 170 void 171 - do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall) 172 { 173 if (fsys_mode(current, &scr->pt)) { 174 - /* defer signal-handling etc. until we return to privilege-level 0. */ 175 if (!ia64_psr(&scr->pt)->lp) 176 ia64_psr(&scr->pt)->lp = 1; 177 return; ··· 186 187 #ifdef CONFIG_PERFMON 188 if (current->thread.pfm_needs_checking) 189 pfm_handle_work(); 190 #endif 191 192 /* deal with pending signal delivery */ 193 - if (test_thread_flag(TIF_SIGPENDING)) 194 ia64_do_signal(scr, in_syscall); 195 196 /* copy user rbs to kernel rbs */ 197 - if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) 198 ia64_sync_krbs(); 199 } 200 201 static int pal_halt = 1;
··· 167 clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME); 168 } 169 170 + /* 171 + * do_notify_resume_user(): 172 + * Called from notify_resume_user at entry.S, with interrupts disabled. 173 + */ 174 void 175 + do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall) 176 { 177 if (fsys_mode(current, &scr->pt)) { 178 + /* 179 + * defer signal-handling etc. until we return to 180 + * privilege-level 0. 181 + */ 182 if (!ia64_psr(&scr->pt)->lp) 183 ia64_psr(&scr->pt)->lp = 1; 184 return; ··· 179 180 #ifdef CONFIG_PERFMON 181 if (current->thread.pfm_needs_checking) 182 + /* 183 + * Note: pfm_handle_work() allow us to call it with interrupts 184 + * disabled, and may enable interrupts within the function. 185 + */ 186 pfm_handle_work(); 187 #endif 188 189 /* deal with pending signal delivery */ 190 + if (test_thread_flag(TIF_SIGPENDING)) { 191 + local_irq_enable(); /* force interrupt enable */ 192 ia64_do_signal(scr, in_syscall); 193 + } 194 195 /* copy user rbs to kernel rbs */ 196 + if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) { 197 + local_irq_enable(); /* force interrupt enable */ 198 ia64_sync_krbs(); 199 + } 200 + 201 + local_irq_disable(); /* force interrupt disable */ 202 } 203 204 static int pal_halt = 1;
+11
arch/ia64/kernel/sal.c
··· 229 */ 230 static int sal_cache_flush_drops_interrupts; 231 232 void __init 233 check_sal_cache_flush (void) 234 { ··· 244 int cpu; 245 u64 vector, cache_type = 3; 246 struct ia64_sal_retval isrv; 247 248 cpu = get_cpu(); 249 local_irq_save(flags);
··· 229 */ 230 static int sal_cache_flush_drops_interrupts; 231 232 + static int __init 233 + force_pal_cache_flush(char *str) 234 + { 235 + sal_cache_flush_drops_interrupts = 1; 236 + return 0; 237 + } 238 + early_param("force_pal_cache_flush", force_pal_cache_flush); 239 + 240 void __init 241 check_sal_cache_flush (void) 242 { ··· 236 int cpu; 237 u64 vector, cache_type = 3; 238 struct ia64_sal_retval isrv; 239 + 240 + if (sal_cache_flush_drops_interrupts) 241 + return; 242 243 cpu = get_cpu(); 244 local_irq_save(flags);
+29
arch/ia64/kernel/setup.c
··· 239 240 241 #ifdef CONFIG_KEXEC 242 static void __init setup_crashkernel(unsigned long total, int *n) 243 { 244 unsigned long long base = 0, size = 0; ··· 271 base = kdump_find_rsvd_region(size, 272 rsvd_region, *n); 273 } 274 if (base != ~0UL) { 275 printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " 276 "for crashkernel (System RAM: %ldMB)\n",
··· 239 240 241 #ifdef CONFIG_KEXEC 242 + 243 + /* 244 + * This function checks if the reserved crashkernel is allowed on the specific 245 + * IA64 machine flavour. Machines without an IO TLB use swiotlb and require 246 + * some memory below 4 GB (i.e. in 32 bit area), see the implementation of 247 + * lib/swiotlb.c. The hpzx1 architecture has an IO TLB but cannot use that 248 + * in kdump case. See the comment in sba_init() in sba_iommu.c. 249 + * 250 + * So, the only machvec that really supports loading the kdump kernel 251 + * over 4 GB is "sn2". 252 + */ 253 + static int __init check_crashkernel_memory(unsigned long pbase, size_t size) 254 + { 255 + if (ia64_platform_is("sn2") || ia64_platform_is("uv")) 256 + return 1; 257 + else 258 + return pbase < (1UL << 32); 259 + } 260 + 261 static void __init setup_crashkernel(unsigned long total, int *n) 262 { 263 unsigned long long base = 0, size = 0; ··· 252 base = kdump_find_rsvd_region(size, 253 rsvd_region, *n); 254 } 255 + 256 + if (!check_crashkernel_memory(base, size)) { 257 + pr_warning("crashkernel: There would be kdump memory " 258 + "at %ld GB but this is unusable because it " 259 + "must\nbe below 4 GB. Change the memory " 260 + "configuration of the machine.\n", 261 + (unsigned long)(base >> 30)); 262 + return; 263 + } 264 + 265 if (base != ~0UL) { 266 printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " 267 "for crashkernel (System RAM: %ldMB)\n",
+25
arch/ia64/mm/init.c
··· 719 EXPORT_SYMBOL_GPL(remove_memory); 720 #endif /* CONFIG_MEMORY_HOTREMOVE */ 721 #endif
··· 719 EXPORT_SYMBOL_GPL(remove_memory); 720 #endif /* CONFIG_MEMORY_HOTREMOVE */ 721 #endif 722 + 723 + /* 724 + * Even when CONFIG_IA32_SUPPORT is not enabled it is 725 + * useful to have the Linux/x86 domain registered to 726 + * avoid an attempted module load when emulators call 727 + * personality(PER_LINUX32). This saves several milliseconds 728 + * on each such call. 729 + */ 730 + static struct exec_domain ia32_exec_domain; 731 + 732 + static int __init 733 + per_linux32_init(void) 734 + { 735 + ia32_exec_domain.name = "Linux/x86"; 736 + ia32_exec_domain.handler = NULL; 737 + ia32_exec_domain.pers_low = PER_LINUX32; 738 + ia32_exec_domain.pers_high = PER_LINUX32; 739 + ia32_exec_domain.signal_map = default_exec_domain.signal_map; 740 + ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap; 741 + register_exec_domain(&ia32_exec_domain); 742 + 743 + return 0; 744 + } 745 + 746 + __initcall(per_linux32_init);
+12
arch/ia64/uv/Makefile
···
··· 1 + # arch/ia64/uv/Makefile 2 + # 3 + # This file is subject to the terms and conditions of the GNU General Public 4 + # License. See the file "COPYING" in the main directory of this archive 5 + # for more details. 6 + # 7 + # Copyright (C) 2008 Silicon Graphics, Inc. All Rights Reserved. 8 + # 9 + # Makefile for the sn uv subplatform 10 + # 11 + 12 + obj-y += kernel/
+13
arch/ia64/uv/kernel/Makefile
···
··· 1 + # arch/ia64/uv/kernel/Makefile 2 + # 3 + # This file is subject to the terms and conditions of the GNU General Public 4 + # License. See the file "COPYING" in the main directory of this archive 5 + # for more details. 6 + # 7 + # Copyright (C) 2008 Silicon Graphics, Inc. All Rights Reserved. 8 + # 9 + 10 + EXTRA_CFLAGS += -Iarch/ia64/sn/include 11 + 12 + obj-y += setup.o 13 + obj-$(CONFIG_IA64_GENERIC) += machvec.o
+11
arch/ia64/uv/kernel/machvec.c
···
··· 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) 2008 Silicon Graphics, Inc. All Rights Reserved. 7 + */ 8 + 9 + #define MACHVEC_PLATFORM_NAME uv 10 + #define MACHVEC_PLATFORM_HEADER <asm/machvec_uv.h> 11 + #include <asm/machvec_init.h>
+98
arch/ia64/uv/kernel/setup.c
···
··· 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 + * SGI UV Core Functions 7 + * 8 + * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. 9 + */ 10 + 11 + #include <linux/module.h> 12 + #include <linux/percpu.h> 13 + #include <asm/sn/simulator.h> 14 + #include <asm/uv/uv_mmrs.h> 15 + #include <asm/uv/uv_hub.h> 16 + 17 + DEFINE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); 18 + EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info); 19 + 20 + 21 + struct redir_addr { 22 + unsigned long redirect; 23 + unsigned long alias; 24 + }; 25 + 26 + #define DEST_SHIFT UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT 27 + 28 + static __initdata struct redir_addr redir_addrs[] = { 29 + {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR, UVH_SI_ALIAS0_OVERLAY_CONFIG}, 30 + {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR, UVH_SI_ALIAS1_OVERLAY_CONFIG}, 31 + {UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR, UVH_SI_ALIAS2_OVERLAY_CONFIG}, 32 + }; 33 + 34 + static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) 35 + { 36 + union uvh_si_alias0_overlay_config_u alias; 37 + union uvh_rh_gam_alias210_redirect_config_2_mmr_u redirect; 38 + int i; 39 + 40 + for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { 41 + alias.v = uv_read_local_mmr(redir_addrs[i].alias); 42 + if (alias.s.base == 0) { 43 + *size = (1UL << alias.s.m_alias); 44 + redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); 45 + *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; 46 + return; 47 + } 48 + } 49 + BUG(); 50 + } 51 + 52 + void __init uv_setup(char **cmdline_p) 53 + { 54 + union uvh_si_addr_map_config_u m_n_config; 55 + union uvh_node_id_u node_id; 56 + unsigned long gnode_upper; 57 + int nid, cpu, m_val, n_val; 58 + unsigned long mmr_base, lowmem_redir_base, lowmem_redir_size; 59 + 60 + if (IS_MEDUSA()) { 61 + lowmem_redir_base = 0; 62 + lowmem_redir_size = 0; 63 + node_id.v = 0; 64 + m_n_config.s.m_skt = 37; 65 + m_n_config.s.n_skt = 0; 66 + mmr_base = 0; 67 + } else { 68 + get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size); 69 + node_id.v = uv_read_local_mmr(UVH_NODE_ID); 70 + m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG); 71 + mmr_base = 72 + uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR) & 73 + ~UV_MMR_ENABLE; 74 + } 75 + 76 + m_val = m_n_config.s.m_skt; 77 + n_val = m_n_config.s.n_skt; 78 + printk(KERN_DEBUG "UV: global MMR base 0x%lx\n", mmr_base); 79 + 80 + gnode_upper = (((unsigned long)node_id.s.node_id) & 81 + ~((1 << n_val) - 1)) << m_val; 82 + 83 + for_each_present_cpu(cpu) { 84 + nid = cpu_to_node(cpu); 85 + uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; 86 + uv_cpu_hub_info(cpu)->lowmem_remap_top = 87 + lowmem_redir_base + lowmem_redir_size; 88 + uv_cpu_hub_info(cpu)->m_val = m_val; 89 + uv_cpu_hub_info(cpu)->n_val = m_val; 90 + uv_cpu_hub_info(cpu)->pnode_mask = (1 << n_val) -1; 91 + uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; 92 + uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; 93 + uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; 94 + uv_cpu_hub_info(cpu)->coherency_domain_number = 0;/* ZZZ */ 95 + printk(KERN_DEBUG "UV cpu %d, nid %d\n", cpu, nid); 96 + } 97 + } 98 +
+2
include/asm-ia64/machvec.h
··· 126 # include <asm/machvec_hpzx1_swiotlb.h> 127 # elif defined (CONFIG_IA64_SGI_SN2) 128 # include <asm/machvec_sn2.h> 129 # elif defined (CONFIG_IA64_GENERIC) 130 131 # ifdef MACHVEC_PLATFORM_HEADER
··· 126 # include <asm/machvec_hpzx1_swiotlb.h> 127 # elif defined (CONFIG_IA64_SGI_SN2) 128 # include <asm/machvec_sn2.h> 129 + # elif defined (CONFIG_IA64_SGI_UV) 130 + # include <asm/machvec_uv.h> 131 # elif defined (CONFIG_IA64_GENERIC) 132 133 # ifdef MACHVEC_PLATFORM_HEADER
+26
include/asm-ia64/machvec_uv.h
···
··· 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 + * SGI UV Core Functions 7 + * 8 + * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. 9 + */ 10 + 11 + #ifndef _ASM_IA64_MACHVEC_UV_H 12 + #define _ASM_IA64_MACHVEC_UV_H 13 + 14 + extern ia64_mv_setup_t uv_setup; 15 + 16 + /* 17 + * This stuff has dual use! 18 + * 19 + * For a generic kernel, the macros are used to initialize the 20 + * platform's machvec structure. When compiling a non-generic kernel, 21 + * the macros are used directly. 22 + */ 23 + #define platform_name "uv" 24 + #define platform_setup uv_setup 25 + 26 + #endif /* _ASM_IA64_MACHVEC_UV_H */
+309
include/asm-ia64/uv/uv_hub.h
···
··· 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 + * SGI UV architectural definitions 7 + * 8 + * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. 9 + */ 10 + 11 + #ifndef __ASM_IA64_UV_HUB_H__ 12 + #define __ASM_IA64_UV_HUB_H__ 13 + 14 + #include <linux/numa.h> 15 + #include <linux/percpu.h> 16 + #include <asm/types.h> 17 + #include <asm/percpu.h> 18 + 19 + 20 + /* 21 + * Addressing Terminology 22 + * 23 + * M - The low M bits of a physical address represent the offset 24 + * into the blade local memory. RAM memory on a blade is physically 25 + * contiguous (although various IO spaces may punch holes in 26 + * it).. 27 + * 28 + * N - Number of bits in the node portion of a socket physical 29 + * address. 30 + * 31 + * NASID - network ID of a router, Mbrick or Cbrick. Nasid values of 32 + * routers always have low bit of 1, C/MBricks have low bit 33 + * equal to 0. Most addressing macros that target UV hub chips 34 + * right shift the NASID by 1 to exclude the always-zero bit. 35 + * NASIDs contain up to 15 bits. 36 + * 37 + * GNODE - NASID right shifted by 1 bit. Most mmrs contain gnodes instead 38 + * of nasids. 39 + * 40 + * PNODE - the low N bits of the GNODE. The PNODE is the most useful variant 41 + * of the nasid for socket usage. 42 + * 43 + * 44 + * NumaLink Global Physical Address Format: 45 + * +--------------------------------+---------------------+ 46 + * |00..000| GNODE | NodeOffset | 47 + * +--------------------------------+---------------------+ 48 + * |<-------53 - M bits --->|<--------M bits -----> 49 + * 50 + * M - number of node offset bits (35 .. 40) 51 + * 52 + * 53 + * Memory/UV-HUB Processor Socket Address Format: 54 + * +----------------+---------------+---------------------+ 55 + * |00..000000000000| PNODE | NodeOffset | 56 + * +----------------+---------------+---------------------+ 57 + * <--- N bits --->|<--------M bits -----> 58 + * 59 + * M - number of node offset bits (35 .. 40) 60 + * N - number of PNODE bits (0 .. 10) 61 + * 62 + * Note: M + N cannot currently exceed 44 (x86_64) or 46 (IA64). 63 + * The actual values are configuration dependent and are set at 64 + * boot time. M & N values are set by the hardware/BIOS at boot. 65 + */ 66 + 67 + 68 + /* 69 + * Maximum number of bricks in all partitions and in all coherency domains. 70 + * This is the total number of bricks accessible in the numalink fabric. It 71 + * includes all C & M bricks. Routers are NOT included. 72 + * 73 + * This value is also the value of the maximum number of non-router NASIDs 74 + * in the numalink fabric. 75 + * 76 + * NOTE: a brick may contain 1 or 2 OS nodes. Don't get these confused. 77 + */ 78 + #define UV_MAX_NUMALINK_BLADES 16384 79 + 80 + /* 81 + * Maximum number of C/Mbricks within a software SSI (hardware may support 82 + * more). 83 + */ 84 + #define UV_MAX_SSI_BLADES 1 85 + 86 + /* 87 + * The largest possible NASID of a C or M brick (+ 2) 88 + */ 89 + #define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_NODES * 2) 90 + 91 + /* 92 + * The following defines attributes of the HUB chip. These attributes are 93 + * frequently referenced and are kept in the per-cpu data areas of each cpu. 94 + * They are kept together in a struct to minimize cache misses. 95 + */ 96 + struct uv_hub_info_s { 97 + unsigned long global_mmr_base; 98 + unsigned long gpa_mask; 99 + unsigned long gnode_upper; 100 + unsigned long lowmem_remap_top; 101 + unsigned long lowmem_remap_base; 102 + unsigned short pnode; 103 + unsigned short pnode_mask; 104 + unsigned short coherency_domain_number; 105 + unsigned short numa_blade_id; 106 + unsigned char blade_processor_id; 107 + unsigned char m_val; 108 + unsigned char n_val; 109 + }; 110 + DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info); 111 + #define uv_hub_info (&__get_cpu_var(__uv_hub_info)) 112 + #define uv_cpu_hub_info(cpu) (&per_cpu(__uv_hub_info, cpu)) 113 + 114 + /* 115 + * Local & Global MMR space macros. 116 + * Note: macros are intended to be used ONLY by inline functions 117 + * in this file - not by other kernel code. 118 + * n - NASID (full 15-bit global nasid) 119 + * g - GNODE (full 15-bit global nasid, right shifted 1) 120 + * p - PNODE (local part of nsids, right shifted 1) 121 + */ 122 + #define UV_NASID_TO_PNODE(n) (((n) >> 1) & uv_hub_info->pnode_mask) 123 + #define UV_PNODE_TO_NASID(p) (((p) << 1) | uv_hub_info->gnode_upper) 124 + 125 + #define UV_LOCAL_MMR_BASE 0xf4000000UL 126 + #define UV_GLOBAL_MMR32_BASE 0xf8000000UL 127 + #define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base) 128 + 129 + #define UV_GLOBAL_MMR32_PNODE_SHIFT 15 130 + #define UV_GLOBAL_MMR64_PNODE_SHIFT 26 131 + 132 + #define UV_GLOBAL_MMR32_PNODE_BITS(p) ((p) << (UV_GLOBAL_MMR32_PNODE_SHIFT)) 133 + 134 + #define UV_GLOBAL_MMR64_PNODE_BITS(p) \ 135 + ((unsigned long)(p) << UV_GLOBAL_MMR64_PNODE_SHIFT) 136 + 137 + /* 138 + * Macros for converting between kernel virtual addresses, socket local physical 139 + * addresses, and UV global physical addresses. 140 + * Note: use the standard __pa() & __va() macros for converting 141 + * between socket virtual and socket physical addresses. 142 + */ 143 + 144 + /* socket phys RAM --> UV global physical address */ 145 + static inline unsigned long uv_soc_phys_ram_to_gpa(unsigned long paddr) 146 + { 147 + if (paddr < uv_hub_info->lowmem_remap_top) 148 + paddr += uv_hub_info->lowmem_remap_base; 149 + return paddr | uv_hub_info->gnode_upper; 150 + } 151 + 152 + 153 + /* socket virtual --> UV global physical address */ 154 + static inline unsigned long uv_gpa(void *v) 155 + { 156 + return __pa(v) | uv_hub_info->gnode_upper; 157 + } 158 + 159 + /* socket virtual --> UV global physical address */ 160 + static inline void *uv_vgpa(void *v) 161 + { 162 + return (void *)uv_gpa(v); 163 + } 164 + 165 + /* UV global physical address --> socket virtual */ 166 + static inline void *uv_va(unsigned long gpa) 167 + { 168 + return __va(gpa & uv_hub_info->gpa_mask); 169 + } 170 + 171 + /* pnode, offset --> socket virtual */ 172 + static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset) 173 + { 174 + return __va(((unsigned long)pnode << uv_hub_info->m_val) | offset); 175 + } 176 + 177 + 178 + /* 179 + * Access global MMRs using the low memory MMR32 space. This region supports 180 + * faster MMR access but not all MMRs are accessible in this space. 181 + */ 182 + static inline unsigned long *uv_global_mmr32_address(int pnode, 183 + unsigned long offset) 184 + { 185 + return __va(UV_GLOBAL_MMR32_BASE | 186 + UV_GLOBAL_MMR32_PNODE_BITS(pnode) | offset); 187 + } 188 + 189 + static inline void uv_write_global_mmr32(int pnode, unsigned long offset, 190 + unsigned long val) 191 + { 192 + *uv_global_mmr32_address(pnode, offset) = val; 193 + } 194 + 195 + static inline unsigned long uv_read_global_mmr32(int pnode, 196 + unsigned long offset) 197 + { 198 + return *uv_global_mmr32_address(pnode, offset); 199 + } 200 + 201 + /* 202 + * Access Global MMR space using the MMR space located at the top of physical 203 + * memory. 204 + */ 205 + static inline unsigned long *uv_global_mmr64_address(int pnode, 206 + unsigned long offset) 207 + { 208 + return __va(UV_GLOBAL_MMR64_BASE | 209 + UV_GLOBAL_MMR64_PNODE_BITS(pnode) | offset); 210 + } 211 + 212 + static inline void uv_write_global_mmr64(int pnode, unsigned long offset, 213 + unsigned long val) 214 + { 215 + *uv_global_mmr64_address(pnode, offset) = val; 216 + } 217 + 218 + static inline unsigned long uv_read_global_mmr64(int pnode, 219 + unsigned long offset) 220 + { 221 + return *uv_global_mmr64_address(pnode, offset); 222 + } 223 + 224 + /* 225 + * Access hub local MMRs. Faster than using global space but only local MMRs 226 + * are accessible. 227 + */ 228 + static inline unsigned long *uv_local_mmr_address(unsigned long offset) 229 + { 230 + return __va(UV_LOCAL_MMR_BASE | offset); 231 + } 232 + 233 + static inline unsigned long uv_read_local_mmr(unsigned long offset) 234 + { 235 + return *uv_local_mmr_address(offset); 236 + } 237 + 238 + static inline void uv_write_local_mmr(unsigned long offset, unsigned long val) 239 + { 240 + *uv_local_mmr_address(offset) = val; 241 + } 242 + 243 + /* 244 + * Structures and definitions for converting between cpu, node, pnode, and blade 245 + * numbers. 246 + */ 247 + 248 + /* Blade-local cpu number of current cpu. Numbered 0 .. <# cpus on the blade> */ 249 + static inline int uv_blade_processor_id(void) 250 + { 251 + return smp_processor_id(); 252 + } 253 + 254 + /* Blade number of current cpu. Numnbered 0 .. <#blades -1> */ 255 + static inline int uv_numa_blade_id(void) 256 + { 257 + return 0; 258 + } 259 + 260 + /* Convert a cpu number to the the UV blade number */ 261 + static inline int uv_cpu_to_blade_id(int cpu) 262 + { 263 + return 0; 264 + } 265 + 266 + /* Convert linux node number to the UV blade number */ 267 + static inline int uv_node_to_blade_id(int nid) 268 + { 269 + return 0; 270 + } 271 + 272 + /* Convert a blade id to the PNODE of the blade */ 273 + static inline int uv_blade_to_pnode(int bid) 274 + { 275 + return 0; 276 + } 277 + 278 + /* Determine the number of possible cpus on a blade */ 279 + static inline int uv_blade_nr_possible_cpus(int bid) 280 + { 281 + return num_possible_cpus(); 282 + } 283 + 284 + /* Determine the number of online cpus on a blade */ 285 + static inline int uv_blade_nr_online_cpus(int bid) 286 + { 287 + return num_online_cpus(); 288 + } 289 + 290 + /* Convert a cpu id to the PNODE of the blade containing the cpu */ 291 + static inline int uv_cpu_to_pnode(int cpu) 292 + { 293 + return 0; 294 + } 295 + 296 + /* Convert a linux node number to the PNODE of the blade */ 297 + static inline int uv_node_to_pnode(int nid) 298 + { 299 + return 0; 300 + } 301 + 302 + /* Maximum possible number of blades */ 303 + static inline int uv_num_possible_blades(void) 304 + { 305 + return 1; 306 + } 307 + 308 + #endif /* __ASM_IA64_UV_HUB__ */ 309 +
+266
include/asm-ia64/uv/uv_mmrs.h
···
··· 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 + * SGI UV MMR definitions 7 + * 8 + * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. 9 + */ 10 + 11 + #ifndef __ASM_IA64_UV_MMRS__ 12 + #define __ASM_IA64_UV_MMRS__ 13 + 14 + /* 15 + * AUTO GENERATED - Do not edit 16 + */ 17 + 18 + #define UV_MMR_ENABLE (1UL << 63) 19 + 20 + /* ========================================================================= */ 21 + /* UVH_NODE_ID */ 22 + /* ========================================================================= */ 23 + #define UVH_NODE_ID 0x0UL 24 + 25 + #define UVH_NODE_ID_FORCE1_SHFT 0 26 + #define UVH_NODE_ID_FORCE1_MASK 0x0000000000000001UL 27 + #define UVH_NODE_ID_MANUFACTURER_SHFT 1 28 + #define UVH_NODE_ID_MANUFACTURER_MASK 0x0000000000000ffeUL 29 + #define UVH_NODE_ID_PART_NUMBER_SHFT 12 30 + #define UVH_NODE_ID_PART_NUMBER_MASK 0x000000000ffff000UL 31 + #define UVH_NODE_ID_REVISION_SHFT 28 32 + #define UVH_NODE_ID_REVISION_MASK 0x00000000f0000000UL 33 + #define UVH_NODE_ID_NODE_ID_SHFT 32 34 + #define UVH_NODE_ID_NODE_ID_MASK 0x00007fff00000000UL 35 + #define UVH_NODE_ID_NODES_PER_BIT_SHFT 48 36 + #define UVH_NODE_ID_NODES_PER_BIT_MASK 0x007f000000000000UL 37 + #define UVH_NODE_ID_NI_PORT_SHFT 56 38 + #define UVH_NODE_ID_NI_PORT_MASK 0x0f00000000000000UL 39 + 40 + union uvh_node_id_u { 41 + unsigned long v; 42 + struct uvh_node_id_s { 43 + unsigned long force1 : 1; /* RO */ 44 + unsigned long manufacturer : 11; /* RO */ 45 + unsigned long part_number : 16; /* RO */ 46 + unsigned long revision : 4; /* RO */ 47 + unsigned long node_id : 15; /* RW */ 48 + unsigned long rsvd_47 : 1; /* */ 49 + unsigned long nodes_per_bit : 7; /* RW */ 50 + unsigned long rsvd_55 : 1; /* */ 51 + unsigned long ni_port : 4; /* RO */ 52 + unsigned long rsvd_60_63 : 4; /* */ 53 + } s; 54 + }; 55 + 56 + /* ========================================================================= */ 57 + /* UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR */ 58 + /* ========================================================================= */ 59 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR 0x16000d0UL 60 + 61 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT 24 62 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_MASK 0x00003fffff000000UL 63 + 64 + union uvh_rh_gam_alias210_redirect_config_0_mmr_u { 65 + unsigned long v; 66 + struct uvh_rh_gam_alias210_redirect_config_0_mmr_s { 67 + unsigned long rsvd_0_23 : 24; /* */ 68 + unsigned long dest_base : 22; /* RW */ 69 + unsigned long rsvd_46_63: 18; /* */ 70 + } s; 71 + }; 72 + 73 + /* ========================================================================= */ 74 + /* UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR */ 75 + /* ========================================================================= */ 76 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR 0x16000e0UL 77 + 78 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR_DEST_BASE_SHFT 24 79 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR_DEST_BASE_MASK 0x00003fffff000000UL 80 + 81 + union uvh_rh_gam_alias210_redirect_config_1_mmr_u { 82 + unsigned long v; 83 + struct uvh_rh_gam_alias210_redirect_config_1_mmr_s { 84 + unsigned long rsvd_0_23 : 24; /* */ 85 + unsigned long dest_base : 22; /* RW */ 86 + unsigned long rsvd_46_63: 18; /* */ 87 + } s; 88 + }; 89 + 90 + /* ========================================================================= */ 91 + /* UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR */ 92 + /* ========================================================================= */ 93 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR 0x16000f0UL 94 + 95 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR_DEST_BASE_SHFT 24 96 + #define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR_DEST_BASE_MASK 0x00003fffff000000UL 97 + 98 + union uvh_rh_gam_alias210_redirect_config_2_mmr_u { 99 + unsigned long v; 100 + struct uvh_rh_gam_alias210_redirect_config_2_mmr_s { 101 + unsigned long rsvd_0_23 : 24; /* */ 102 + unsigned long dest_base : 22; /* RW */ 103 + unsigned long rsvd_46_63: 18; /* */ 104 + } s; 105 + }; 106 + 107 + /* ========================================================================= */ 108 + /* UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR */ 109 + /* ========================================================================= */ 110 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL 111 + 112 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT 28 113 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffff0000000UL 114 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_SHFT 46 115 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_MASK 0x0000400000000000UL 116 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT 52 117 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK 0x00f0000000000000UL 118 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 119 + #define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL 120 + 121 + union uvh_rh_gam_gru_overlay_config_mmr_u { 122 + unsigned long v; 123 + struct uvh_rh_gam_gru_overlay_config_mmr_s { 124 + unsigned long rsvd_0_27: 28; /* */ 125 + unsigned long base : 18; /* RW */ 126 + unsigned long gr4 : 1; /* RW */ 127 + unsigned long rsvd_47_51: 5; /* */ 128 + unsigned long n_gru : 4; /* RW */ 129 + unsigned long rsvd_56_62: 7; /* */ 130 + unsigned long enable : 1; /* RW */ 131 + } s; 132 + }; 133 + 134 + /* ========================================================================= */ 135 + /* UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR */ 136 + /* ========================================================================= */ 137 + #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL 138 + 139 + #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT 26 140 + #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffffc000000UL 141 + #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_SHFT 46 142 + #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_MASK 0x0000400000000000UL 143 + #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63 144 + #define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL 145 + 146 + union uvh_rh_gam_mmr_overlay_config_mmr_u { 147 + unsigned long v; 148 + struct uvh_rh_gam_mmr_overlay_config_mmr_s { 149 + unsigned long rsvd_0_25: 26; /* */ 150 + unsigned long base : 20; /* RW */ 151 + unsigned long dual_hub : 1; /* RW */ 152 + unsigned long rsvd_47_62: 16; /* */ 153 + unsigned long enable : 1; /* RW */ 154 + } s; 155 + }; 156 + 157 + /* ========================================================================= */ 158 + /* UVH_RTC */ 159 + /* ========================================================================= */ 160 + #define UVH_RTC 0x28000UL 161 + 162 + #define UVH_RTC_REAL_TIME_CLOCK_SHFT 0 163 + #define UVH_RTC_REAL_TIME_CLOCK_MASK 0x00ffffffffffffffUL 164 + 165 + union uvh_rtc_u { 166 + unsigned long v; 167 + struct uvh_rtc_s { 168 + unsigned long real_time_clock : 56; /* RW */ 169 + unsigned long rsvd_56_63 : 8; /* */ 170 + } s; 171 + }; 172 + 173 + /* ========================================================================= */ 174 + /* UVH_SI_ADDR_MAP_CONFIG */ 175 + /* ========================================================================= */ 176 + #define UVH_SI_ADDR_MAP_CONFIG 0xc80000UL 177 + 178 + #define UVH_SI_ADDR_MAP_CONFIG_M_SKT_SHFT 0 179 + #define UVH_SI_ADDR_MAP_CONFIG_M_SKT_MASK 0x000000000000003fUL 180 + #define UVH_SI_ADDR_MAP_CONFIG_N_SKT_SHFT 8 181 + #define UVH_SI_ADDR_MAP_CONFIG_N_SKT_MASK 0x0000000000000f00UL 182 + 183 + union uvh_si_addr_map_config_u { 184 + unsigned long v; 185 + struct uvh_si_addr_map_config_s { 186 + unsigned long m_skt : 6; /* RW */ 187 + unsigned long rsvd_6_7: 2; /* */ 188 + unsigned long n_skt : 4; /* RW */ 189 + unsigned long rsvd_12_63: 52; /* */ 190 + } s; 191 + }; 192 + 193 + /* ========================================================================= */ 194 + /* UVH_SI_ALIAS0_OVERLAY_CONFIG */ 195 + /* ========================================================================= */ 196 + #define UVH_SI_ALIAS0_OVERLAY_CONFIG 0xc80008UL 197 + 198 + #define UVH_SI_ALIAS0_OVERLAY_CONFIG_BASE_SHFT 24 199 + #define UVH_SI_ALIAS0_OVERLAY_CONFIG_BASE_MASK 0x00000000ff000000UL 200 + #define UVH_SI_ALIAS0_OVERLAY_CONFIG_M_ALIAS_SHFT 48 201 + #define UVH_SI_ALIAS0_OVERLAY_CONFIG_M_ALIAS_MASK 0x001f000000000000UL 202 + #define UVH_SI_ALIAS0_OVERLAY_CONFIG_ENABLE_SHFT 63 203 + #define UVH_SI_ALIAS0_OVERLAY_CONFIG_ENABLE_MASK 0x8000000000000000UL 204 + 205 + union uvh_si_alias0_overlay_config_u { 206 + unsigned long v; 207 + struct uvh_si_alias0_overlay_config_s { 208 + unsigned long rsvd_0_23: 24; /* */ 209 + unsigned long base : 8; /* RW */ 210 + unsigned long rsvd_32_47: 16; /* */ 211 + unsigned long m_alias : 5; /* RW */ 212 + unsigned long rsvd_53_62: 10; /* */ 213 + unsigned long enable : 1; /* RW */ 214 + } s; 215 + }; 216 + 217 + /* ========================================================================= */ 218 + /* UVH_SI_ALIAS1_OVERLAY_CONFIG */ 219 + /* ========================================================================= */ 220 + #define UVH_SI_ALIAS1_OVERLAY_CONFIG 0xc80010UL 221 + 222 + #define UVH_SI_ALIAS1_OVERLAY_CONFIG_BASE_SHFT 24 223 + #define UVH_SI_ALIAS1_OVERLAY_CONFIG_BASE_MASK 0x00000000ff000000UL 224 + #define UVH_SI_ALIAS1_OVERLAY_CONFIG_M_ALIAS_SHFT 48 225 + #define UVH_SI_ALIAS1_OVERLAY_CONFIG_M_ALIAS_MASK 0x001f000000000000UL 226 + #define UVH_SI_ALIAS1_OVERLAY_CONFIG_ENABLE_SHFT 63 227 + #define UVH_SI_ALIAS1_OVERLAY_CONFIG_ENABLE_MASK 0x8000000000000000UL 228 + 229 + union uvh_si_alias1_overlay_config_u { 230 + unsigned long v; 231 + struct uvh_si_alias1_overlay_config_s { 232 + unsigned long rsvd_0_23: 24; /* */ 233 + unsigned long base : 8; /* RW */ 234 + unsigned long rsvd_32_47: 16; /* */ 235 + unsigned long m_alias : 5; /* RW */ 236 + unsigned long rsvd_53_62: 10; /* */ 237 + unsigned long enable : 1; /* RW */ 238 + } s; 239 + }; 240 + 241 + /* ========================================================================= */ 242 + /* UVH_SI_ALIAS2_OVERLAY_CONFIG */ 243 + /* ========================================================================= */ 244 + #define UVH_SI_ALIAS2_OVERLAY_CONFIG 0xc80018UL 245 + 246 + #define UVH_SI_ALIAS2_OVERLAY_CONFIG_BASE_SHFT 24 247 + #define UVH_SI_ALIAS2_OVERLAY_CONFIG_BASE_MASK 0x00000000ff000000UL 248 + #define UVH_SI_ALIAS2_OVERLAY_CONFIG_M_ALIAS_SHFT 48 249 + #define UVH_SI_ALIAS2_OVERLAY_CONFIG_M_ALIAS_MASK 0x001f000000000000UL 250 + #define UVH_SI_ALIAS2_OVERLAY_CONFIG_ENABLE_SHFT 63 251 + #define UVH_SI_ALIAS2_OVERLAY_CONFIG_ENABLE_MASK 0x8000000000000000UL 252 + 253 + union uvh_si_alias2_overlay_config_u { 254 + unsigned long v; 255 + struct uvh_si_alias2_overlay_config_s { 256 + unsigned long rsvd_0_23: 24; /* */ 257 + unsigned long base : 8; /* RW */ 258 + unsigned long rsvd_32_47: 16; /* */ 259 + unsigned long m_alias : 5; /* RW */ 260 + unsigned long rsvd_53_62: 10; /* */ 261 + unsigned long enable : 1; /* RW */ 262 + } s; 263 + }; 264 + 265 + 266 + #endif /* __ASM_IA64_UV_MMRS__ */