diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-15 16:56:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-15 16:56:42 -0400 |
commit | 7371fd11a6e2aed99895db4f100940fa5022f7fe (patch) | |
tree | 7d59ab562e706b9c2b0f73042680b573ec033d0e | |
parent | 487ad7efbf6b0ec338cdfc2a7b0fbeb53f17a94c (diff) | |
parent | 839052d27e8db0c1545256fe5827abcd00fb51c5 (diff) |
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
-rw-r--r-- | Documentation/kernel-parameters.txt | 6 | ||||
-rw-r--r-- | arch/ia64/Kconfig | 13 | ||||
-rw-r--r-- | arch/ia64/Makefile | 2 | ||||
-rw-r--r-- | arch/ia64/ia32/ia32_support.c | 10 | ||||
-rw-r--r-- | arch/ia64/kernel/acpi.c | 10 | ||||
-rw-r--r-- | arch/ia64/kernel/entry.S | 26 | ||||
-rw-r--r-- | arch/ia64/kernel/palinfo.c | 6 | ||||
-rw-r--r-- | arch/ia64/kernel/perfmon.c | 16 | ||||
-rw-r--r-- | arch/ia64/kernel/process.c | 25 | ||||
-rw-r--r-- | arch/ia64/kernel/sal.c | 11 | ||||
-rw-r--r-- | arch/ia64/kernel/setup.c | 29 | ||||
-rw-r--r-- | arch/ia64/mm/init.c | 25 | ||||
-rw-r--r-- | arch/ia64/uv/Makefile | 12 | ||||
-rw-r--r-- | arch/ia64/uv/kernel/Makefile | 13 | ||||
-rw-r--r-- | arch/ia64/uv/kernel/machvec.c | 11 | ||||
-rw-r--r-- | arch/ia64/uv/kernel/setup.c | 98 | ||||
-rw-r--r-- | include/asm-ia64/machvec.h | 2 | ||||
-rw-r--r-- | include/asm-ia64/machvec_uv.h | 26 | ||||
-rw-r--r-- | include/asm-ia64/uv/uv_hub.h | 309 | ||||
-rw-r--r-- | include/asm-ia64/uv/uv_mmrs.h | 266 |
20 files changed, 878 insertions, 38 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 7038a6da3c12..e07c432c731f 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -686,6 +686,12 @@ and is between 256 and 4096 characters. It is defined in the file | |||
686 | floppy= [HW] | 686 | floppy= [HW] |
687 | See Documentation/floppy.txt. | 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 | gamecon.map[2|3]= | 695 | gamecon.map[2|3]= |
690 | [HW,JOY] Multisystem joystick and NES/SNES/PSX pad | 696 | [HW,JOY] Multisystem joystick and NES/SNES/PSX pad |
691 | support via parallel port (up to 5 devices per port) | 697 | support via parallel port (up to 5 devices per port) |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 0df5f6f75edf..16be41446b5b 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -135,6 +135,7 @@ config IA64_GENERIC | |||
135 | HP-zx1/sx1000 For HP systems | 135 | HP-zx1/sx1000 For HP systems |
136 | HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices. | 136 | HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices. |
137 | SGI-SN2 For SGI Altix systems | 137 | SGI-SN2 For SGI Altix systems |
138 | SGI-UV For SGI UV systems | ||
138 | Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> | 139 | Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/> |
139 | 140 | ||
140 | If you don't know what to do, choose "generic". | 141 | If you don't know what to do, choose "generic". |
@@ -170,6 +171,18 @@ config IA64_SGI_SN2 | |||
170 | to select this option. If in doubt, select ia64 generic support | 171 | to select this option. If in doubt, select ia64 generic support |
171 | instead. | 172 | instead. |
172 | 173 | ||
174 | config IA64_SGI_UV` | ||
175 | bool "SGI-UV`" | ||
176 | select NUMA | ||
177 | select ACPI_NUMA | ||
178 | select SWIOTLB | ||
179 | help | ||
180 | Selecting this option will optimize the kernel for use on UV based | ||
181 | systems, but the resulting kernel binary will not run on other | ||
182 | types of ia64 systems. If you have an SGI UV system, it's safe | ||
183 | to select this option. If in doubt, select ia64 generic support | ||
184 | instead. | ||
185 | |||
173 | config IA64_HP_SIM | 186 | config IA64_HP_SIM |
174 | bool "Ski-simulator" | 187 | bool "Ski-simulator" |
175 | select SWIOTLB | 188 | select SWIOTLB |
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index ec4cca477f49..88f1a55c6c94 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
@@ -63,7 +63,7 @@ drivers-$(CONFIG_PCI) += arch/ia64/pci/ | |||
63 | drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ | 63 | drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/ |
64 | drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ | 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/ | 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 | drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ | 67 | drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/ |
68 | 68 | ||
69 | boot := arch/ia64/hp/sim/boot | 69 | boot := arch/ia64/hp/sim/boot |
diff --git a/arch/ia64/ia32/ia32_support.c b/arch/ia64/ia32/ia32_support.c index 896b1ebbfb26..a6965ddafc46 100644 --- a/arch/ia64/ia32/ia32_support.c +++ b/arch/ia64/ia32/ia32_support.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/personality.h> | ||
19 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
20 | 19 | ||
21 | #include <asm/intrinsics.h> | 20 | #include <asm/intrinsics.h> |
@@ -29,7 +28,6 @@ | |||
29 | 28 | ||
30 | extern int die_if_kernel (char *str, struct pt_regs *regs, long err); | 29 | extern int die_if_kernel (char *str, struct pt_regs *regs, long err); |
31 | 30 | ||
32 | struct exec_domain ia32_exec_domain; | ||
33 | struct page *ia32_shared_page[NR_CPUS]; | 31 | struct page *ia32_shared_page[NR_CPUS]; |
34 | unsigned long *ia32_boot_gdt; | 32 | unsigned long *ia32_boot_gdt; |
35 | unsigned long *cpu_gdt_table[NR_CPUS]; | 33 | unsigned long *cpu_gdt_table[NR_CPUS]; |
@@ -240,14 +238,6 @@ ia32_cpu_init (void) | |||
240 | static int __init | 238 | static int __init |
241 | ia32_init (void) | 239 | ia32_init (void) |
242 | { | 240 | { |
243 | ia32_exec_domain.name = "Linux/x86"; | ||
244 | ia32_exec_domain.handler = NULL; | ||
245 | ia32_exec_domain.pers_low = PER_LINUX32; | ||
246 | ia32_exec_domain.pers_high = PER_LINUX32; | ||
247 | ia32_exec_domain.signal_map = default_exec_domain.signal_map; | ||
248 | ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap; | ||
249 | register_exec_domain(&ia32_exec_domain); | ||
250 | |||
251 | #if PAGE_SHIFT > IA32_PAGE_SHIFT | 241 | #if PAGE_SHIFT > IA32_PAGE_SHIFT |
252 | { | 242 | { |
253 | extern struct kmem_cache *ia64_partial_page_cachep; | 243 | extern struct kmem_cache *ia64_partial_page_cachep; |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 19709a079635..853d1f11be00 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -117,7 +117,10 @@ acpi_get_sysname(void) | |||
117 | if (!strcmp(hdr->oem_id, "HP")) { | 117 | if (!strcmp(hdr->oem_id, "HP")) { |
118 | return "hpzx1"; | 118 | return "hpzx1"; |
119 | } else if (!strcmp(hdr->oem_id, "SGI")) { | 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 | return "dig"; | 126 | return "dig"; |
@@ -130,6 +133,8 @@ acpi_get_sysname(void) | |||
130 | return "hpzx1_swiotlb"; | 133 | return "hpzx1_swiotlb"; |
131 | # elif defined (CONFIG_IA64_SGI_SN2) | 134 | # elif defined (CONFIG_IA64_SGI_SN2) |
132 | return "sn2"; | 135 | return "sn2"; |
136 | # elif defined (CONFIG_IA64_SGI_UV) | ||
137 | return "uv"; | ||
133 | # elif defined (CONFIG_IA64_DIG) | 138 | # elif defined (CONFIG_IA64_DIG) |
134 | return "dig"; | 139 | return "dig"; |
135 | # else | 140 | # else |
@@ -622,6 +627,9 @@ void acpi_unregister_gsi(u32 gsi) | |||
622 | if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) | 627 | if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM) |
623 | return; | 628 | return; |
624 | 629 | ||
630 | if (has_8259 && gsi < 16) | ||
631 | return; | ||
632 | |||
625 | iosapic_unregister_intr(gsi); | 633 | iosapic_unregister_intr(gsi); |
626 | } | 634 | } |
627 | 635 | ||
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index e49ad8c5dc69..ca2bb95726de 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -1156,6 +1156,9 @@ skip_rbs_switch: | |||
1156 | * r31 = current->thread_info->flags | 1156 | * r31 = current->thread_info->flags |
1157 | * On exit: | 1157 | * On exit: |
1158 | * p6 = TRUE if work-pending-check needs to be redone | 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 | .work_pending_syscall: | 1163 | .work_pending_syscall: |
1161 | add r2=-8,r2 | 1164 | add r2=-8,r2 |
@@ -1164,16 +1167,16 @@ skip_rbs_switch: | |||
1164 | st8 [r2]=r8 | 1167 | st8 [r2]=r8 |
1165 | st8 [r3]=r10 | 1168 | st8 [r3]=r10 |
1166 | .work_pending: | 1169 | .work_pending: |
1167 | tbit.z p6,p0=r31,TIF_NEED_RESCHED // current_thread_info()->need_resched==0? | 1170 | tbit.z p6,p0=r31,TIF_NEED_RESCHED // is resched not needed? |
1168 | (p6) br.cond.sptk.few .notify | 1171 | (p6) br.cond.sptk.few .notify |
1169 | #ifdef CONFIG_PREEMPT | 1172 | #ifdef CONFIG_PREEMPT |
1170 | (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 | 1173 | (pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 |
1171 | ;; | 1174 | ;; |
1172 | (pKStk) st4 [r20]=r21 | 1175 | (pKStk) st4 [r20]=r21 |
1173 | ssm psr.i // enable interrupts | ||
1174 | #endif | 1176 | #endif |
1177 | ssm psr.i // enable interrupts | ||
1175 | br.call.spnt.many rp=schedule | 1178 | br.call.spnt.many rp=schedule |
1176 | .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 | 1179 | .ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check) |
1177 | rsm psr.i // disable interrupts | 1180 | rsm psr.i // disable interrupts |
1178 | ;; | 1181 | ;; |
1179 | #ifdef CONFIG_PREEMPT | 1182 | #ifdef CONFIG_PREEMPT |
@@ -1182,13 +1185,13 @@ skip_rbs_switch: | |||
1182 | (pKStk) st4 [r20]=r0 // preempt_count() <- 0 | 1185 | (pKStk) st4 [r20]=r0 // preempt_count() <- 0 |
1183 | #endif | 1186 | #endif |
1184 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end | 1187 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end |
1185 | br.cond.sptk.many .work_processed_kernel // re-check | 1188 | br.cond.sptk.many .work_processed_kernel |
1186 | 1189 | ||
1187 | .notify: | 1190 | .notify: |
1188 | (pUStk) br.call.spnt.many rp=notify_resume_user | 1191 | (pUStk) br.call.spnt.many rp=notify_resume_user |
1189 | .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 | 1192 | .ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 (don't re-check) |
1190 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end | 1193 | (pLvSys)br.cond.sptk.few .work_pending_syscall_end |
1191 | br.cond.sptk.many .work_processed_kernel // don't re-check | 1194 | br.cond.sptk.many .work_processed_kernel |
1192 | 1195 | ||
1193 | .work_pending_syscall_end: | 1196 | .work_pending_syscall_end: |
1194 | adds r2=PT(R8)+16,r12 | 1197 | adds r2=PT(R8)+16,r12 |
@@ -1196,7 +1199,7 @@ skip_rbs_switch: | |||
1196 | ;; | 1199 | ;; |
1197 | ld8 r8=[r2] | 1200 | ld8 r8=[r2] |
1198 | ld8 r10=[r3] | 1201 | ld8 r10=[r3] |
1199 | br.cond.sptk.many .work_processed_syscall // re-check | 1202 | br.cond.sptk.many .work_processed_syscall |
1200 | 1203 | ||
1201 | END(ia64_leave_kernel) | 1204 | END(ia64_leave_kernel) |
1202 | 1205 | ||
@@ -1234,9 +1237,12 @@ GLOBAL_ENTRY(ia64_invoke_schedule_tail) | |||
1234 | END(ia64_invoke_schedule_tail) | 1237 | END(ia64_invoke_schedule_tail) |
1235 | 1238 | ||
1236 | /* | 1239 | /* |
1237 | * Setup stack and call do_notify_resume_user(). Note that pSys and pNonSys need to | 1240 | * Setup stack and call do_notify_resume_user(), keeping interrupts |
1238 | * be set up by the caller. We declare 8 input registers so the system call | 1241 | * disabled. |
1239 | * args get preserved, in case we need to restart a system call. | 1242 | * |
1243 | * Note that pSys and pNonSys need to be set up by the caller. | ||
1244 | * We declare 8 input registers so the system call args get preserved, | ||
1245 | * in case we need to restart a system call. | ||
1240 | */ | 1246 | */ |
1241 | ENTRY(notify_resume_user) | 1247 | ENTRY(notify_resume_user) |
1242 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) | 1248 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) |
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index 4547a2092af9..9dc00f7fe10e 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
@@ -900,12 +900,6 @@ static void | |||
900 | palinfo_smp_call(void *info) | 900 | palinfo_smp_call(void *info) |
901 | { | 901 | { |
902 | palinfo_smp_data_t *data = (palinfo_smp_data_t *)info; | 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); | 903 | data->ret = (*data->func)(data->page); |
910 | } | 904 | } |
911 | 905 | ||
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index c1ad27de2dd2..71d05133f556 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -5013,12 +5013,13 @@ pfm_context_force_terminate(pfm_context_t *ctx, struct pt_regs *regs) | |||
5013 | } | 5013 | } |
5014 | 5014 | ||
5015 | static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds); | 5015 | static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds); |
5016 | |||
5016 | /* | 5017 | /* |
5017 | * pfm_handle_work() can be called with interrupts enabled | 5018 | * pfm_handle_work() can be called with interrupts enabled |
5018 | * (TIF_NEED_RESCHED) or disabled. The down_interruptible | 5019 | * (TIF_NEED_RESCHED) or disabled. The down_interruptible |
5019 | * call may sleep, therefore we must re-enable interrupts | 5020 | * call may sleep, therefore we must re-enable interrupts |
5020 | * to avoid deadlocks. It is safe to do so because this function | 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 | * there is no risk of kernel stack overflow due to deep | 5023 | * there is no risk of kernel stack overflow due to deep |
5023 | * interrupt nesting. | 5024 | * interrupt nesting. |
5024 | */ | 5025 | */ |
@@ -5034,7 +5035,8 @@ pfm_handle_work(void) | |||
5034 | 5035 | ||
5035 | ctx = PFM_GET_CTX(current); | 5036 | ctx = PFM_GET_CTX(current); |
5036 | if (ctx == NULL) { | 5037 | if (ctx == NULL) { |
5037 | printk(KERN_ERR "perfmon: [%d] has no PFM context\n", task_pid_nr(current)); | 5038 | printk(KERN_ERR "perfmon: [%d] has no PFM context\n", |
5039 | task_pid_nr(current)); | ||
5038 | return; | 5040 | return; |
5039 | } | 5041 | } |
5040 | 5042 | ||
@@ -5058,11 +5060,12 @@ pfm_handle_work(void) | |||
5058 | /* | 5060 | /* |
5059 | * must be done before we check for simple-reset mode | 5061 | * must be done before we check for simple-reset mode |
5060 | */ | 5062 | */ |
5061 | if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) goto do_zombie; | 5063 | if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) |
5062 | 5064 | goto do_zombie; | |
5063 | 5065 | ||
5064 | //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking; | 5066 | //if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking; |
5065 | if (reason == PFM_TRAP_REASON_RESET) goto skip_blocking; | 5067 | if (reason == PFM_TRAP_REASON_RESET) |
5068 | goto skip_blocking; | ||
5066 | 5069 | ||
5067 | /* | 5070 | /* |
5068 | * restore interrupt mask to what it was on entry. | 5071 | * restore interrupt mask to what it was on entry. |
@@ -5110,7 +5113,8 @@ do_zombie: | |||
5110 | /* | 5113 | /* |
5111 | * in case of interruption of down() we don't restart anything | 5114 | * in case of interruption of down() we don't restart anything |
5112 | */ | 5115 | */ |
5113 | if (ret < 0) goto nothing_to_do; | 5116 | if (ret < 0) |
5117 | goto nothing_to_do; | ||
5114 | 5118 | ||
5115 | skip_blocking: | 5119 | skip_blocking: |
5116 | pfm_resume_after_ovfl(ctx, ovfl_regs, regs); | 5120 | pfm_resume_after_ovfl(ctx, ovfl_regs, regs); |
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 58dcfac5ea88..a3a34b4eb038 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c | |||
@@ -167,11 +167,18 @@ void tsk_clear_notify_resume(struct task_struct *tsk) | |||
167 | clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME); | 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 | void | 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 | if (fsys_mode(current, &scr->pt)) { | 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 | if (!ia64_psr(&scr->pt)->lp) | 182 | if (!ia64_psr(&scr->pt)->lp) |
176 | ia64_psr(&scr->pt)->lp = 1; | 183 | ia64_psr(&scr->pt)->lp = 1; |
177 | return; | 184 | return; |
@@ -179,16 +186,26 @@ do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall | |||
179 | 186 | ||
180 | #ifdef CONFIG_PERFMON | 187 | #ifdef CONFIG_PERFMON |
181 | if (current->thread.pfm_needs_checking) | 188 | if (current->thread.pfm_needs_checking) |
189 | /* | ||
190 | * Note: pfm_handle_work() allow us to call it with interrupts | ||
191 | * disabled, and may enable interrupts within the function. | ||
192 | */ | ||
182 | pfm_handle_work(); | 193 | pfm_handle_work(); |
183 | #endif | 194 | #endif |
184 | 195 | ||
185 | /* deal with pending signal delivery */ | 196 | /* deal with pending signal delivery */ |
186 | if (test_thread_flag(TIF_SIGPENDING)) | 197 | if (test_thread_flag(TIF_SIGPENDING)) { |
198 | local_irq_enable(); /* force interrupt enable */ | ||
187 | ia64_do_signal(scr, in_syscall); | 199 | ia64_do_signal(scr, in_syscall); |
200 | } | ||
188 | 201 | ||
189 | /* copy user rbs to kernel rbs */ | 202 | /* copy user rbs to kernel rbs */ |
190 | if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) | 203 | if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) { |
204 | local_irq_enable(); /* force interrupt enable */ | ||
191 | ia64_sync_krbs(); | 205 | ia64_sync_krbs(); |
206 | } | ||
207 | |||
208 | local_irq_disable(); /* force interrupt disable */ | ||
192 | } | 209 | } |
193 | 210 | ||
194 | static int pal_halt = 1; | 211 | static int pal_halt = 1; |
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index a3022dc48ef8..7e0259709c04 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
@@ -229,6 +229,14 @@ static void __init sal_desc_ap_wakeup(void *p) { } | |||
229 | */ | 229 | */ |
230 | static int sal_cache_flush_drops_interrupts; | 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 | void __init | 240 | void __init |
233 | check_sal_cache_flush (void) | 241 | check_sal_cache_flush (void) |
234 | { | 242 | { |
@@ -237,6 +245,9 @@ check_sal_cache_flush (void) | |||
237 | u64 vector, cache_type = 3; | 245 | u64 vector, cache_type = 3; |
238 | struct ia64_sal_retval isrv; | 246 | struct ia64_sal_retval isrv; |
239 | 247 | ||
248 | if (sal_cache_flush_drops_interrupts) | ||
249 | return; | ||
250 | |||
240 | cpu = get_cpu(); | 251 | cpu = get_cpu(); |
241 | local_irq_save(flags); | 252 | local_irq_save(flags); |
242 | 253 | ||
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 5015ca1275ca..e9596cd0cdab 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -239,6 +239,25 @@ __initcall(register_memory); | |||
239 | 239 | ||
240 | 240 | ||
241 | #ifdef CONFIG_KEXEC | 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 | static void __init setup_crashkernel(unsigned long total, int *n) | 261 | static void __init setup_crashkernel(unsigned long total, int *n) |
243 | { | 262 | { |
244 | unsigned long long base = 0, size = 0; | 263 | unsigned long long base = 0, size = 0; |
@@ -252,6 +271,16 @@ static void __init setup_crashkernel(unsigned long total, int *n) | |||
252 | base = kdump_find_rsvd_region(size, | 271 | base = kdump_find_rsvd_region(size, |
253 | rsvd_region, *n); | 272 | rsvd_region, *n); |
254 | } | 273 | } |
274 | |||
275 | if (!check_crashkernel_memory(base, size)) { | ||
276 | pr_warning("crashkernel: There would be kdump memory " | ||
277 | "at %ld GB but this is unusable because it " | ||
278 | "must\nbe below 4 GB. Change the memory " | ||
279 | "configuration of the machine.\n", | ||
280 | (unsigned long)(base >> 30)); | ||
281 | return; | ||
282 | } | ||
283 | |||
255 | if (base != ~0UL) { | 284 | if (base != ~0UL) { |
256 | printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " | 285 | printk(KERN_INFO "Reserving %ldMB of memory at %ldMB " |
257 | "for crashkernel (System RAM: %ldMB)\n", | 286 | "for crashkernel (System RAM: %ldMB)\n", |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index fc6c6636ffda..200100ea7610 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -719,3 +719,28 @@ out: | |||
719 | EXPORT_SYMBOL_GPL(remove_memory); | 719 | EXPORT_SYMBOL_GPL(remove_memory); |
720 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | 720 | #endif /* CONFIG_MEMORY_HOTREMOVE */ |
721 | #endif | 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); | ||
diff --git a/arch/ia64/uv/Makefile b/arch/ia64/uv/Makefile new file mode 100644 index 000000000000..aa9f91947c49 --- /dev/null +++ b/arch/ia64/uv/Makefile | |||
@@ -0,0 +1,12 @@ | |||
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/ | ||
diff --git a/arch/ia64/uv/kernel/Makefile b/arch/ia64/uv/kernel/Makefile new file mode 100644 index 000000000000..8d92b4684d8e --- /dev/null +++ b/arch/ia64/uv/kernel/Makefile | |||
@@ -0,0 +1,13 @@ | |||
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 | ||
diff --git a/arch/ia64/uv/kernel/machvec.c b/arch/ia64/uv/kernel/machvec.c new file mode 100644 index 000000000000..50737a9dca74 --- /dev/null +++ b/arch/ia64/uv/kernel/machvec.c | |||
@@ -0,0 +1,11 @@ | |||
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> | ||
diff --git a/arch/ia64/uv/kernel/setup.c b/arch/ia64/uv/kernel/setup.c new file mode 100644 index 000000000000..9aa743203c3c --- /dev/null +++ b/arch/ia64/uv/kernel/setup.c | |||
@@ -0,0 +1,98 @@ | |||
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 | |||
diff --git a/include/asm-ia64/machvec.h b/include/asm-ia64/machvec.h index 9f020eb825c5..0721a5e8271e 100644 --- a/include/asm-ia64/machvec.h +++ b/include/asm-ia64/machvec.h | |||
@@ -126,6 +126,8 @@ extern void machvec_tlb_migrate_finish (struct mm_struct *); | |||
126 | # include <asm/machvec_hpzx1_swiotlb.h> | 126 | # include <asm/machvec_hpzx1_swiotlb.h> |
127 | # elif defined (CONFIG_IA64_SGI_SN2) | 127 | # elif defined (CONFIG_IA64_SGI_SN2) |
128 | # include <asm/machvec_sn2.h> | 128 | # include <asm/machvec_sn2.h> |
129 | # elif defined (CONFIG_IA64_SGI_UV) | ||
130 | # include <asm/machvec_uv.h> | ||
129 | # elif defined (CONFIG_IA64_GENERIC) | 131 | # elif defined (CONFIG_IA64_GENERIC) |
130 | 132 | ||
131 | # ifdef MACHVEC_PLATFORM_HEADER | 133 | # ifdef MACHVEC_PLATFORM_HEADER |
diff --git a/include/asm-ia64/machvec_uv.h b/include/asm-ia64/machvec_uv.h new file mode 100644 index 000000000000..2931447f3813 --- /dev/null +++ b/include/asm-ia64/machvec_uv.h | |||
@@ -0,0 +1,26 @@ | |||
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 */ | ||
diff --git a/include/asm-ia64/uv/uv_hub.h b/include/asm-ia64/uv/uv_hub.h new file mode 100644 index 000000000000..f607018af4a1 --- /dev/null +++ b/include/asm-ia64/uv/uv_hub.h | |||
@@ -0,0 +1,309 @@ | |||
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 | |||
diff --git a/include/asm-ia64/uv/uv_mmrs.h b/include/asm-ia64/uv/uv_mmrs.h new file mode 100644 index 000000000000..1cc1dbb0182f --- /dev/null +++ b/include/asm-ia64/uv/uv_mmrs.h | |||
@@ -0,0 +1,266 @@ | |||
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__ */ | ||