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 686 floppy= [HW] 687 687 See Documentation/floppy.txt. 688 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 + 689 695 gamecon.map[2|3]= 690 696 [HW,JOY] Multisystem joystick and NES/SNES/PSX pad 691 697 support via parallel port (up to 5 devices per port)
+13
arch/ia64/Kconfig
··· 135 135 HP-zx1/sx1000 For HP systems 136 136 HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices. 137 137 SGI-SN2 For SGI Altix systems 138 + SGI-UV For SGI UV systems 138 139 Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> 139 140 140 141 If you don't know what to do, choose "generic". ··· 168 167 Selecting this option will optimize the kernel for use on sn2 based 169 168 systems, but the resulting kernel binary will not run on other 170 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 171 182 to select this option. If in doubt, select ia64 generic support 172 183 instead. 173 184
+1 -1
arch/ia64/Makefile
··· 63 63 drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ 64 64 drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ 65 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/ 66 + drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/ arch/ia64/uv/ 67 67 drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ 68 68 69 69 boot := arch/ia64/hp/sim/boot
-10
arch/ia64/ia32/ia32_support.c
··· 15 15 #include <linux/kernel.h> 16 16 #include <linux/init.h> 17 17 #include <linux/mm.h> 18 - #include <linux/personality.h> 19 18 #include <linux/sched.h> 20 19 21 20 #include <asm/intrinsics.h> ··· 28 29 29 30 extern int die_if_kernel (char *str, struct pt_regs *regs, long err); 30 31 31 - struct exec_domain ia32_exec_domain; 32 32 struct page *ia32_shared_page[NR_CPUS]; 33 33 unsigned long *ia32_boot_gdt; 34 34 unsigned long *cpu_gdt_table[NR_CPUS]; ··· 238 240 static int __init 239 241 ia32_init (void) 240 242 { 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 243 #if PAGE_SHIFT > IA32_PAGE_SHIFT 250 244 { 251 245 extern struct kmem_cache *ia64_partial_page_cachep;
+9 -1
arch/ia64/kernel/acpi.c
··· 117 117 if (!strcmp(hdr->oem_id, "HP")) { 118 118 return "hpzx1"; 119 119 } else if (!strcmp(hdr->oem_id, "SGI")) { 120 - return "sn2"; 120 + if (!strcmp(hdr->oem_table_id + 4, "UV")) 121 + return "uv"; 122 + else 123 + return "sn2"; 121 124 } 122 125 123 126 return "dig"; ··· 133 130 return "hpzx1_swiotlb"; 134 131 # elif defined (CONFIG_IA64_SGI_SN2) 135 132 return "sn2"; 133 + # elif defined (CONFIG_IA64_SGI_UV) 134 + return "uv"; 136 135 # elif defined (CONFIG_IA64_DIG) 137 136 return "dig"; 138 137 # else ··· 625 620 void acpi_unregister_gsi(u32 gsi) 626 621 { 627 622 if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) 623 + return; 624 + 625 + if (has_8259 && gsi < 16) 628 626 return; 629 627 630 628 iosapic_unregister_intr(gsi);
+16 -10
arch/ia64/kernel/entry.S
··· 1156 1156 * r31 = current->thread_info->flags 1157 1157 * On exit: 1158 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. 1159 1162 */ 1160 1163 .work_pending_syscall: 1161 1164 add r2=-8,r2 ··· 1167 1164 st8 [r2]=r8 1168 1165 st8 [r3]=r10 1169 1166 .work_pending: 1170 - tbit.z p6,p0=r31,TIF_NEED_RESCHED // current_thread_info()->need_resched==0? 1167 + tbit.z p6,p0=r31,TIF_NEED_RESCHED // is resched not needed? 1171 1168 (p6) br.cond.sptk.few .notify 1172 1169 #ifdef CONFIG_PREEMPT 1173 1170 (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 1174 1171 ;; 1175 1172 (pKStk) st4 [r20]=r21 1176 - ssm psr.i // enable interrupts 1177 1173 #endif 1174 + ssm psr.i // enable interrupts 1178 1175 br.call.spnt.many rp=schedule 1179 - .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 1176 + .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check) 1180 1177 rsm psr.i // disable interrupts 1181 1178 ;; 1182 1179 #ifdef CONFIG_PREEMPT ··· 1185 1182 (pKStk) st4 [r20]=r0 // preempt_count() <- 0 1186 1183 #endif 1187 1184 (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1188 - br.cond.sptk.many .work_processed_kernel // re-check 1185 + br.cond.sptk.many .work_processed_kernel 1189 1186 1190 1187 .notify: 1191 1188 (pUStk) br.call.spnt.many rp=notify_resume_user 1192 - .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 1189 + .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 (don't re-check) 1193 1190 (pLvSys)br.cond.sptk.few .work_pending_syscall_end 1194 - br.cond.sptk.many .work_processed_kernel // don't re-check 1191 + br.cond.sptk.many .work_processed_kernel 1195 1192 1196 1193 .work_pending_syscall_end: 1197 1194 adds r2=PT(R8)+16,r12 ··· 1199 1196 ;; 1200 1197 ld8 r8=[r2] 1201 1198 ld8 r10=[r3] 1202 - br.cond.sptk.many .work_processed_syscall // re-check 1199 + br.cond.sptk.many .work_processed_syscall 1203 1200 1204 1201 END(ia64_leave_kernel) 1205 1202 ··· 1237 1234 END(ia64_invoke_schedule_tail) 1238 1235 1239 1236 /* 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. 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 1243 */ 1244 1244 ENTRY(notify_resume_user) 1245 1245 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
-6
arch/ia64/kernel/palinfo.c
··· 900 900 palinfo_smp_call(void *info) 901 901 { 902 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 903 data->ret = (*data->func)(data->page); 910 904 } 911 905
+10 -6
arch/ia64/kernel/perfmon.c
··· 5013 5013 } 5014 5014 5015 5015 static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds); 5016 + 5016 5017 /* 5017 5018 * pfm_handle_work() can be called with interrupts enabled 5018 5019 * (TIF_NEED_RESCHED) or disabled. The down_interruptible 5019 5020 * call may sleep, therefore we must re-enable interrupts 5020 5021 * 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 + * is called ONLY when returning to user level (pUStk=1), in which case 5022 5023 * there is no risk of kernel stack overflow due to deep 5023 5024 * interrupt nesting. 5024 5025 */ ··· 5035 5034 5036 5035 ctx = PFM_GET_CTX(current); 5037 5036 if (ctx == NULL) { 5038 - printk(KERN_ERR "perfmon: [%d] has no PFM context\n", task_pid_nr(current)); 5037 + printk(KERN_ERR "perfmon: [%d] has no PFM context\n", 5038 + task_pid_nr(current)); 5039 5039 return; 5040 5040 } 5041 5041 ··· 5060 5058 /* 5061 5059 * must be done before we check for simple-reset mode 5062 5060 */ 5063 - if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) goto do_zombie; 5064 - 5061 + if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) 5062 + goto do_zombie; 5065 5063 5066 5064 //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking; 5067 - if (reason == PFM_TRAP_REASON_RESET) goto skip_blocking; 5065 + if (reason == PFM_TRAP_REASON_RESET) 5066 + goto skip_blocking; 5068 5067 5069 5068 /* 5070 5069 * restore interrupt mask to what it was on entry. ··· 5113 5110 /* 5114 5111 * in case of interruption of down() we don't restart anything 5115 5112 */ 5116 - if (ret < 0) goto nothing_to_do; 5113 + if (ret < 0) 5114 + goto nothing_to_do; 5117 5115 5118 5116 skip_blocking: 5119 5117 pfm_resume_after_ovfl(ctx, ovfl_regs, regs);
+21 -4
arch/ia64/kernel/process.c
··· 167 167 clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME); 168 168 } 169 169 170 + /* 171 + * do_notify_resume_user(): 172 + * Called from notify_resume_user at entry.S, with interrupts disabled. 173 + */ 170 174 void 171 - do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall) 175 + do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall) 172 176 { 173 177 if (fsys_mode(current, &scr->pt)) { 174 - /* defer signal-handling etc. until we return to privilege-level 0. */ 178 + /* 179 + * defer signal-handling etc. until we return to 180 + * privilege-level 0. 181 + */ 175 182 if (!ia64_psr(&scr->pt)->lp) 176 183 ia64_psr(&scr->pt)->lp = 1; 177 184 return; ··· 186 179 187 180 #ifdef CONFIG_PERFMON 188 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 + */ 189 186 pfm_handle_work(); 190 187 #endif 191 188 192 189 /* deal with pending signal delivery */ 193 - if (test_thread_flag(TIF_SIGPENDING)) 190 + if (test_thread_flag(TIF_SIGPENDING)) { 191 + local_irq_enable(); /* force interrupt enable */ 194 192 ia64_do_signal(scr, in_syscall); 193 + } 195 194 196 195 /* copy user rbs to kernel rbs */ 197 - if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) 196 + if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) { 197 + local_irq_enable(); /* force interrupt enable */ 198 198 ia64_sync_krbs(); 199 + } 200 + 201 + local_irq_disable(); /* force interrupt disable */ 199 202 } 200 203 201 204 static int pal_halt = 1;
+11
arch/ia64/kernel/sal.c
··· 229 229 */ 230 230 static int sal_cache_flush_drops_interrupts; 231 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 + 232 240 void __init 233 241 check_sal_cache_flush (void) 234 242 { ··· 244 236 int cpu; 245 237 u64 vector, cache_type = 3; 246 238 struct ia64_sal_retval isrv; 239 + 240 + if (sal_cache_flush_drops_interrupts) 241 + return; 247 242 248 243 cpu = get_cpu(); 249 244 local_irq_save(flags);
+29
arch/ia64/kernel/setup.c
··· 239 239 240 240 241 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 + 242 261 static void __init setup_crashkernel(unsigned long total, int *n) 243 262 { 244 263 unsigned long long base = 0, size = 0; ··· 271 252 base = kdump_find_rsvd_region(size, 272 253 rsvd_region, *n); 273 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 + 274 265 if (base != ~0UL) { 275 266 printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " 276 267 "for crashkernel (System RAM: %ldMB)\n",
+25
arch/ia64/mm/init.c
··· 719 719 EXPORT_SYMBOL_GPL(remove_memory); 720 720 #endif /* CONFIG_MEMORY_HOTREMOVE */ 721 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 126 # include <asm/machvec_hpzx1_swiotlb.h> 127 127 # elif defined (CONFIG_IA64_SGI_SN2) 128 128 # include <asm/machvec_sn2.h> 129 + # elif defined (CONFIG_IA64_SGI_UV) 130 + # include <asm/machvec_uv.h> 129 131 # elif defined (CONFIG_IA64_GENERIC) 130 132 131 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__ */