diff options
-rw-r--r-- | arch/ia64/sn/kernel/xpc_partition.c | 15 | ||||
-rw-r--r-- | include/asm-ia64/sn/addrs.h | 8 |
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 | */ |
949 | enum xpc_retval | 962 | enum xpc_retval |
950 | xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask) | 963 | xpc_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. |