aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDean Nelson <dcn@sgi.com>2005-04-04 16:14:00 -0400
committerTony Luck <tony.luck@intel.com>2005-05-03 15:50:22 -0400
commit3a7d555bfc4d4631d9118fb4d0ed7ab62cc2ca1c (patch)
tree3f788937066dff5befaf3b4e70539bf3f9e4702b
parenta2d974da0afe659cff98913184a97c0ee686d02b (diff)
[IA64-SGI] convert AMO address found in XPC's reserved page
This patch detects the existence of an uncached physical AMO address setup by EFI's XPBOOT (SGI) and converts it to an uncached virtual AMO address. Depends on a patch submitted on 23 March 2005 with the subject of: [PATCH 2/3] SGI Altix cross partition functionality (2nd revision) Signed-off-by: Dean Nelson <dcn@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r--arch/ia64/sn/kernel/xpc_partition.c15
-rw-r--r--include/asm-ia64/sn/addrs.h8
2 files changed, 22 insertions, 1 deletions
diff --git a/arch/ia64/sn/kernel/xpc_partition.c b/arch/ia64/sn/kernel/xpc_partition.c
index b31d9988a37a..2c3c4a8af553 100644
--- a/arch/ia64/sn/kernel/xpc_partition.c
+++ b/arch/ia64/sn/kernel/xpc_partition.c
@@ -204,6 +204,19 @@ xpc_rsvd_page_init(void)
204 return NULL; 204 return NULL;
205 } 205 }
206 } 206 }
207 } else if (!IS_AMO_ADDRESS((u64) amos_page)) {
208 /*
209 * EFI's XPBOOT can also set amos_page in the reserved page,
210 * but it happens to leave it as an uncached physical address
211 * and we need it to be an uncached virtual, so we'll have to
212 * convert it.
213 */
214 if (!IS_AMO_PHYS_ADDRESS((u64) amos_page)) {
215 dev_err(xpc_part, "previously used amos_page address "
216 "is bad = 0x%p\n", (void *) amos_page);
217 return NULL;
218 }
219 amos_page = (AMO_t *) TO_AMO((u64) amos_page);
207 } 220 }
208 221
209 memset(xpc_vars, 0, sizeof(struct xpc_vars)); 222 memset(xpc_vars, 0, sizeof(struct xpc_vars));
@@ -944,7 +957,7 @@ xpc_discovery(void)
944 957
945/* 958/*
946 * Given a partid, get the nasids owned by that partition from the 959 * Given a partid, get the nasids owned by that partition from the
947 * remote partitions reserved page. 960 * remote partition's reserved page.
948 */ 961 */
949enum xpc_retval 962enum xpc_retval
950xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask) 963xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask)
diff --git a/include/asm-ia64/sn/addrs.h b/include/asm-ia64/sn/addrs.h
index 960d626ee589..1bfdfb4d7b01 100644
--- a/include/asm-ia64/sn/addrs.h
+++ b/include/asm-ia64/sn/addrs.h
@@ -136,6 +136,7 @@
136 */ 136 */
137#define CAC_BASE (CACHED | AS_CAC_SPACE) 137#define CAC_BASE (CACHED | AS_CAC_SPACE)
138#define AMO_BASE (UNCACHED | AS_AMO_SPACE) 138#define AMO_BASE (UNCACHED | AS_AMO_SPACE)
139#define AMO_PHYS_BASE (UNCACHED_PHYS | AS_AMO_SPACE)
139#define GET_BASE (CACHED | AS_GET_SPACE) 140#define GET_BASE (CACHED | AS_GET_SPACE)
140 141
141/* 142/*
@@ -161,6 +162,13 @@
161 162
162 163
163/* 164/*
165 * Macros to test for address type.
166 */
167#define IS_AMO_ADDRESS(x) (((u64)(x) & (REGION_BITS | AS_MASK)) == AMO_BASE)
168#define IS_AMO_PHYS_ADDRESS(x) (((u64)(x) & (REGION_BITS | AS_MASK)) == AMO_PHYS_BASE)
169
170
171/*
164 * The following definitions pertain to the IO special address 172 * The following definitions pertain to the IO special address
165 * space. They define the location of the big and little windows 173 * space. They define the location of the big and little windows
166 * of any given node. 174 * of any given node.