[IA64-SGI] convert AMO address found in XPC's reserved page
authorDean Nelson <dcn@sgi.com>
Mon, 4 Apr 2005 20:14:00 +0000 (13:14 -0700)
committerTony Luck <tony.luck@intel.com>
Tue, 3 May 2005 19:50:22 +0000 (12:50 -0700)
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>
arch/ia64/sn/kernel/xpc_partition.c
include/asm-ia64/sn/addrs.h

index b31d9988a37a70d444bd51007e55c3aab0e884f2..2c3c4a8af553d181e5e772242e6df9442842f53a 100644 (file)
@@ -204,6 +204,19 @@ xpc_rsvd_page_init(void)
                                return NULL;
                        }
                }
+       } else if (!IS_AMO_ADDRESS((u64) amos_page)) {
+               /*
+                * EFI's XPBOOT can also set amos_page in the reserved page,
+                * but it happens to leave it as an uncached physical address
+                * and we need it to be an uncached virtual, so we'll have to
+                * convert it.
+                */
+               if (!IS_AMO_PHYS_ADDRESS((u64) amos_page)) {
+                       dev_err(xpc_part, "previously used amos_page address "
+                               "is bad = 0x%p\n", (void *) amos_page);
+                       return NULL;
+               }
+               amos_page = (AMO_t *) TO_AMO((u64) amos_page);
        }
 
        memset(xpc_vars, 0, sizeof(struct xpc_vars));
@@ -944,7 +957,7 @@ xpc_discovery(void)
 
 /*
  * Given a partid, get the nasids owned by that partition from the
- * remote partitions reserved page.
+ * remote partition's reserved page.
  */
 enum xpc_retval
 xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask)
index 960d626ee589fa45a28d6ba0df79ba7837d84065..1bfdfb4d7b0110224b17f51a429f7d880c32c7a6 100644 (file)
  */
 #define CAC_BASE               (CACHED   | AS_CAC_SPACE)
 #define AMO_BASE               (UNCACHED | AS_AMO_SPACE)
+#define AMO_PHYS_BASE          (UNCACHED_PHYS | AS_AMO_SPACE)
 #define GET_BASE               (CACHED   | AS_GET_SPACE)
 
 /*
 #define PHYS_TO_DMA(x)          ( (((u64)(x) & NASID_MASK) >> 2) | NODE_OFFSET(x))
 
 
+/*
+ * Macros to test for address type.
+ */
+#define IS_AMO_ADDRESS(x)      (((u64)(x) & (REGION_BITS | AS_MASK)) == AMO_BASE)
+#define IS_AMO_PHYS_ADDRESS(x) (((u64)(x) & (REGION_BITS | AS_MASK)) == AMO_PHYS_BASE)
+
+
 /*
  * The following definitions pertain to the IO special address
  * space.  They define the location of the big and little windows