sgi-xp: isolate xpc_vars_part structure to sn2 only
[deliverable/linux.git] / drivers / misc / sgi-xp / xpc_partition.c
index acd3fd4285d7c954c824286a804c48c6a75d39ce..be5b7547dab45a2ab9d27b7ca9bf3f3920b65e57 100644 (file)
@@ -20,8 +20,6 @@
 #include <linux/cache.h>
 #include <linux/mmzone.h>
 #include <linux/nodemask.h>
-#include <asm/uncached.h>
-#include <asm/sn/bte.h>
 #include <asm/sn/intr.h>
 #include <asm/sn/sn_sal.h>
 #include <asm/sn/nodepda.h>
@@ -45,19 +43,12 @@ u64 xpc_prot_vec[MAX_NUMNODES];
 struct xpc_rsvd_page *xpc_rsvd_page;
 static u64 *xpc_part_nasids;
 static u64 *xpc_mach_nasids;
-struct xpc_vars *xpc_vars;
-struct xpc_vars_part *xpc_vars_part;
 
-static int xp_nasid_mask_bytes;        /* actual size in bytes of nasid mask */
-static int xp_nasid_mask_words;        /* actual size in words of nasid mask */
+/* >>> next two variables should be 'xpc_' if they remain here */
+static int xp_sizeof_nasid_mask;       /* actual size in bytes of nasid mask */
+int xp_nasid_mask_words;       /* actual size in words of nasid mask */
 
-/*
- * For performance reasons, each entry of xpc_partitions[] is cacheline
- * aligned. And xpc_partitions[] is padded with an additional entry at the
- * end so that the last legitimate entry doesn't share its cacheline with
- * another variable.
- */
-struct xpc_partition xpc_partitions[XP_MAX_PARTITIONS + 1];
+struct xpc_partition *xpc_partitions;
 
 /*
  * Generic buffer used to store a local copy of portions of a remote
@@ -98,7 +89,7 @@ xpc_kmalloc_cacheline_aligned(size_t size, gfp_t flags, void **base)
 static u64
 xpc_get_rsvd_page_pa(int nasid)
 {
-       bte_result_t bte_res;
+       enum xp_retval ret;
        s64 status;
        u64 cookie = 0;
        u64 rp_pa = nasid;      /* seed with nasid */
@@ -119,6 +110,7 @@ xpc_get_rsvd_page_pa(int nasid)
                if (status != SALRET_MORE_PASSES)
                        break;
 
+               /* >>> L1_CACHE_ALIGN() is only a sn2-bte_copy requirement */
                if (L1_CACHE_ALIGN(len) > buf_len) {
                        kfree(buf_base);
                        buf_len = L1_CACHE_ALIGN(len);
@@ -133,10 +125,9 @@ xpc_get_rsvd_page_pa(int nasid)
                        }
                }
 
-               bte_res = xp_bte_copy(rp_pa, buf, buf_len,
-                                     (BTE_NOTIFY | BTE_WACQUIRE), NULL);
-               if (bte_res != BTE_SUCCESS) {
-                       dev_dbg(xpc_part, "xp_bte_copy failed %i\n", bte_res);
+               ret = xp_remote_memcpy((void *)buf, (void *)rp_pa, buf_len);
+               if (ret != xpSuccess) {
+                       dev_dbg(xpc_part, "xp_remote_memcpy failed %d\n", ret);
                        status = SALRET_ERROR;
                        break;
                }
@@ -157,12 +148,10 @@ xpc_get_rsvd_page_pa(int nasid)
  * communications.
  */
 struct xpc_rsvd_page *
-xpc_rsvd_page_init(void)
+xpc_setup_rsvd_page(void)
 {
        struct xpc_rsvd_page *rp;
-       AMO_t *amos_page;
-       u64 rp_pa, nasid_array = 0;
-       int i, ret;
+       u64 rp_pa;
 
        /* get the local reserved page's address */
 
@@ -175,110 +164,44 @@ xpc_rsvd_page_init(void)
        }
        rp = (struct xpc_rsvd_page *)__va(rp_pa);
 
-       if (rp->partid != sn_partition_id) {
-               dev_err(xpc_part, "the reserved page's partid of %d should be "
-                       "%d\n", rp->partid, sn_partition_id);
+       if (rp->SAL_version < 3) {
+               /* SAL_versions < 3 had a SAL_partid defined as a u8 */
+               rp->SAL_partid &= 0xff;
+       }
+       BUG_ON(rp->SAL_partid != sn_partition_id);
+
+       if (rp->SAL_partid < 0 || rp->SAL_partid >= xp_max_npartitions) {
+               dev_err(xpc_part, "the reserved page's partid of %d is outside "
+                       "supported range (< 0 || >= %d)\n", rp->SAL_partid,
+                       xp_max_npartitions);
                return NULL;
        }
 
        rp->version = XPC_RP_VERSION;
+       rp->max_npartitions = xp_max_npartitions;
 
        /* establish the actual sizes of the nasid masks */
        if (rp->SAL_version == 1) {
                /* SAL_version 1 didn't set the nasids_size field */
-               rp->nasids_size = 128;
+               rp->SAL_nasids_size = 128;
        }
-       xp_nasid_mask_bytes = rp->nasids_size;
-       xp_nasid_mask_words = xp_nasid_mask_bytes / 8;
+       xp_sizeof_nasid_mask = rp->SAL_nasids_size;
+       xp_nasid_mask_words = DIV_ROUND_UP(xp_sizeof_nasid_mask,
+                                          BYTES_PER_WORD);
 
        /* setup the pointers to the various items in the reserved page */
        xpc_part_nasids = XPC_RP_PART_NASIDS(rp);
        xpc_mach_nasids = XPC_RP_MACH_NASIDS(rp);
-       xpc_vars = XPC_RP_VARS(rp);
-       xpc_vars_part = XPC_RP_VARS_PART(rp);
-
-       /*
-        * Before clearing xpc_vars, see if a page of AMOs had been previously
-        * allocated. If not we'll need to allocate one and set permissions
-        * so that cross-partition AMOs are allowed.
-        *
-        * The allocated AMO page needs MCA reporting to remain disabled after
-        * XPC has unloaded.  To make this work, we keep a copy of the pointer
-        * to this page (i.e., amos_page) in the struct xpc_vars structure,
-        * which is pointed to by the reserved page, and re-use that saved copy
-        * on subsequent loads of XPC. This AMO page is never freed, and its
-        * memory protections are never restricted.
-        */
-       amos_page = xpc_vars->amos_page;
-       if (amos_page == NULL) {
-               amos_page = (AMO_t *)TO_AMO(uncached_alloc_page(0, 1));
-               if (amos_page == NULL) {
-                       dev_err(xpc_part, "can't allocate page of AMOs\n");
-                       return NULL;
-               }
-
-               /*
-                * Open up AMO-R/W to cpu.  This is done for Shub 1.1 systems
-                * when xpc_allow_IPI_ops() is called via xpc_hb_init().
-                */
-               if (!enable_shub_wars_1_1()) {
-                       ret = sn_change_memprotect(ia64_tpa((u64)amos_page),
-                                                  PAGE_SIZE,
-                                                  SN_MEMPROT_ACCESS_CLASS_1,
-                                                  &nasid_array);
-                       if (ret != 0) {
-                               dev_err(xpc_part, "can't change memory "
-                                       "protections\n");
-                               uncached_free_page(__IA64_UNCACHED_OFFSET |
-                                                  TO_PHYS((u64)amos_page), 1);
-                               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);
-       }
-
-       /* clear xpc_vars */
-       memset(xpc_vars, 0, sizeof(struct xpc_vars));
-
-       xpc_vars->version = XPC_V_VERSION;
-       xpc_vars->act_nasid = cpuid_to_nasid(0);
-       xpc_vars->act_phys_cpuid = cpu_physical_id(0);
-       xpc_vars->vars_part_pa = __pa(xpc_vars_part);
-       xpc_vars->amos_page_pa = ia64_tpa((u64)amos_page);
-       xpc_vars->amos_page = amos_page;        /* save for next load of XPC */
-
-       /* clear xpc_vars_part */
-       memset((u64 *)xpc_vars_part, 0, sizeof(struct xpc_vars_part) *
-              XP_MAX_PARTITIONS);
-
-       /* initialize the activate IRQ related AMO variables */
-       for (i = 0; i < xp_nasid_mask_words; i++)
-               (void)xpc_IPI_init(XPC_ACTIVATE_IRQ_AMOS + i);
 
-       /* initialize the engaged remote partitions related AMO variables */
-       (void)xpc_IPI_init(XPC_ENGAGED_PARTITIONS_AMO);
-       (void)xpc_IPI_init(XPC_DISENGAGE_REQUEST_AMO);
-
-       /* timestamp of when reserved page was setup by XPC */
-       rp->stamp = CURRENT_TIME;
+       if (xpc_rsvd_page_init(rp) != xpSuccess)
+               return NULL;
 
        /*
+        * Set timestamp of when reserved page was setup by XPC.
         * This signifies to the remote partition that our reserved
         * page is initialized.
         */
-       rp->vars_pa = __pa(xpc_vars);
+       rp->stamp = CURRENT_TIME;
 
        return rp;
 }
@@ -403,12 +326,12 @@ xpc_check_remote_hb(void)
 {
        struct xpc_vars *remote_vars;
        struct xpc_partition *part;
-       partid_t partid;
-       bte_result_t bres;
+       short partid;
+       enum xp_retval ret;
 
        remote_vars = (struct xpc_vars *)xpc_remote_copy_buffer;
 
-       for (partid = 1; partid < XP_MAX_PARTITIONS; partid++) {
+       for (partid = 0; partid < xp_max_npartitions; partid++) {
 
                if (xpc_exiting)
                        break;
@@ -424,13 +347,11 @@ xpc_check_remote_hb(void)
                }
 
                /* pull the remote_hb cache line */
-               bres = xp_bte_copy(part->remote_vars_pa,
-                                  (u64)remote_vars,
-                                  XPC_RP_VARS_SIZE,
-                                  (BTE_NOTIFY | BTE_WACQUIRE), NULL);
-               if (bres != BTE_SUCCESS) {
-                       XPC_DEACTIVATE_PARTITION(part,
-                                                xpc_map_bte_errors(bres));
+               ret = xp_remote_memcpy(remote_vars,
+                                      (void *)part->remote_vars_pa,
+                                      XPC_RP_VARS_SIZE);
+               if (ret != xpSuccess) {
+                       XPC_DEACTIVATE_PARTITION(part, ret);
                        continue;
                }
 
@@ -444,7 +365,7 @@ xpc_check_remote_hb(void)
                     (remote_vars->heartbeat_offline == 0)) ||
                    !xpc_hb_allowed(sn_partition_id, remote_vars)) {
 
-                       XPC_DEACTIVATE_PARTITION(part, xpcNoHeartbeat);
+                       XPC_DEACTIVATE_PARTITION(part, xpNoHeartbeat);
                        continue;
                }
 
@@ -459,24 +380,24 @@ xpc_check_remote_hb(void)
  * is large enough to contain a copy of their reserved page header and
  * part_nasids mask.
  */
-static enum xpc_retval
+static enum xp_retval
 xpc_get_remote_rp(int nasid, u64 *discovered_nasids,
                  struct xpc_rsvd_page *remote_rp, u64 *remote_rp_pa)
 {
-       int bres, i;
+       int i;
+       enum xp_retval ret;
 
        /* get the reserved page's physical address */
 
        *remote_rp_pa = xpc_get_rsvd_page_pa(nasid);
        if (*remote_rp_pa == 0)
-               return xpcNoRsvdPageAddr;
+               return xpNoRsvdPageAddr;
 
        /* pull over the reserved page header and part_nasids mask */
-       bres = xp_bte_copy(*remote_rp_pa, (u64)remote_rp,
-                          XPC_RP_HEADER_SIZE + xp_nasid_mask_bytes,
-                          (BTE_NOTIFY | BTE_WACQUIRE), NULL);
-       if (bres != BTE_SUCCESS)
-               return xpc_map_bte_errors(bres);
+       ret = xp_remote_memcpy(remote_rp, (void *)*remote_rp_pa,
+                              XPC_RP_HEADER_SIZE + xp_sizeof_nasid_mask);
+       if (ret != xpSuccess)
+               return ret;
 
        if (discovered_nasids != NULL) {
                u64 *remote_part_nasids = XPC_RP_PART_NASIDS(remote_rp);
@@ -485,22 +406,29 @@ xpc_get_remote_rp(int nasid, u64 *discovered_nasids,
                        discovered_nasids[i] |= remote_part_nasids[i];
        }
 
-       /* check that the partid is for another partition */
+       /* check that the partid is valid and is for another partition */
 
-       if (remote_rp->partid < 1 ||
-           remote_rp->partid > (XP_MAX_PARTITIONS - 1)) {
-               return xpcInvalidPartid;
+       if (remote_rp->SAL_partid < 0 ||
+           remote_rp->SAL_partid >= xp_max_npartitions) {
+               return xpInvalidPartid;
        }
 
-       if (remote_rp->partid == sn_partition_id)
-               return xpcLocalPartid;
+       if (remote_rp->SAL_partid == sn_partition_id)
+               return xpLocalPartid;
+
+       /* see if the rest of the reserved page has been set up by XPC */
+       if (timespec_equal(&remote_rp->stamp, &ZERO_STAMP))
+               return xpRsvdPageNotSet;
 
        if (XPC_VERSION_MAJOR(remote_rp->version) !=
            XPC_VERSION_MAJOR(XPC_RP_VERSION)) {
-               return xpcBadVersion;
+               return xpBadVersion;
        }
 
-       return xpcSuccess;
+       if (remote_rp->max_npartitions <= sn_partition_id)
+               return xpInvalidPartid;
+
+       return xpSuccess;
 }
 
 /*
@@ -509,26 +437,26 @@ xpc_get_remote_rp(int nasid, u64 *discovered_nasids,
  * remote_vars points to a buffer that is cacheline aligned for BTE copies and
  * assumed to be of size XPC_RP_VARS_SIZE.
  */
-static enum xpc_retval
+static enum xp_retval
 xpc_get_remote_vars(u64 remote_vars_pa, struct xpc_vars *remote_vars)
 {
-       int bres;
+       enum xp_retval ret;
 
        if (remote_vars_pa == 0)
-               return xpcVarsNotSet;
+               return xpVarsNotSet;
 
        /* pull over the cross partition variables */
-       bres = xp_bte_copy(remote_vars_pa, (u64)remote_vars, XPC_RP_VARS_SIZE,
-                          (BTE_NOTIFY | BTE_WACQUIRE), NULL);
-       if (bres != BTE_SUCCESS)
-               return xpc_map_bte_errors(bres);
+       ret = xp_remote_memcpy(remote_vars, (void *)remote_vars_pa,
+                              XPC_RP_VARS_SIZE);
+       if (ret != xpSuccess)
+               return ret;
 
        if (XPC_VERSION_MAJOR(remote_vars->version) !=
            XPC_VERSION_MAJOR(XPC_V_VERSION)) {
-               return xpcBadVersion;
+               return xpBadVersion;
        }
 
-       return xpcSuccess;
+       return xpSuccess;
 }
 
 /*
@@ -558,6 +486,7 @@ xpc_update_partition_info(struct xpc_partition *part, u8 remote_rp_version,
        dev_dbg(xpc_part, "  last_heartbeat = 0x%016lx\n",
                part->last_heartbeat);
 
+/* >>> remote_vars_part_pa and vars_part_pa are sn2 only!!! */
        part->remote_vars_part_pa = remote_vars->vars_part_pa;
        dev_dbg(xpc_part, "  remote_vars_part_pa = 0x%016lx\n",
                part->remote_vars_part_pa);
@@ -603,28 +532,28 @@ xpc_identify_act_IRQ_req(int nasid)
        int remote_rp_version;
        int reactivate = 0;
        int stamp_diff;
-       struct timespec remote_rp_stamp = { 0, 0 };
-       partid_t partid;
+       struct timespec remote_rp_stamp = { 0, 0 }; /*>>> ZERO_STAMP */
+       short partid;
        struct xpc_partition *part;
-       enum xpc_retval ret;
+       enum xp_retval ret;
 
        /* pull over the reserved page structure */
 
        remote_rp = (struct xpc_rsvd_page *)xpc_remote_copy_buffer;
 
        ret = xpc_get_remote_rp(nasid, NULL, remote_rp, &remote_rp_pa);
-       if (ret != xpcSuccess) {
+       if (ret != xpSuccess) {
                dev_warn(xpc_part, "unable to get reserved page from nasid %d, "
                         "which sent interrupt, reason=%d\n", nasid, ret);
                return;
        }
 
-       remote_vars_pa = remote_rp->vars_pa;
+       remote_vars_pa = remote_rp->sn.vars_pa;
        remote_rp_version = remote_rp->version;
        if (XPC_SUPPORTS_RP_STAMP(remote_rp_version))
                remote_rp_stamp = remote_rp->stamp;
 
-       partid = remote_rp->partid;
+       partid = remote_rp->SAL_partid;
        part = &xpc_partitions[partid];
 
        /* pull over the cross partition variables */
@@ -632,7 +561,7 @@ xpc_identify_act_IRQ_req(int nasid)
        remote_vars = (struct xpc_vars *)xpc_remote_copy_buffer;
 
        ret = xpc_get_remote_vars(remote_vars_pa, remote_vars);
-       if (ret != xpcSuccess) {
+       if (ret != xpSuccess) {
 
                dev_warn(xpc_part, "unable to get XPC variables from nasid %d, "
                         "which sent interrupt, reason=%d\n", nasid, ret);
@@ -699,7 +628,7 @@ xpc_identify_act_IRQ_req(int nasid)
                                          &remote_rp_stamp, remote_rp_pa,
                                          remote_vars_pa, remote_vars);
                part->reactivate_nasid = nasid;
-               XPC_DEACTIVATE_PARTITION(part, xpcReactivating);
+               XPC_DEACTIVATE_PARTITION(part, xpReactivating);
                return;
        }
 
@@ -754,11 +683,11 @@ xpc_identify_act_IRQ_req(int nasid)
 
        if (reactivate) {
                part->reactivate_nasid = nasid;
-               XPC_DEACTIVATE_PARTITION(part, xpcReactivating);
+               XPC_DEACTIVATE_PARTITION(part, xpReactivating);
 
        } else if (XPC_SUPPORTS_DISENGAGE_REQUEST(part->remote_vars_version) &&
                   xpc_partition_disengage_requested(1UL << partid)) {
-               XPC_DEACTIVATE_PARTITION(part, xpcOtherGoingDown);
+               XPC_DEACTIVATE_PARTITION(part, xpOtherGoingDown);
        }
 }
 
@@ -825,7 +754,7 @@ xpc_identify_act_IRQ_sender(void)
 int
 xpc_partition_disengaged(struct xpc_partition *part)
 {
-       partid_t partid = XPC_PARTID(part);
+       short partid = XPC_PARTID(part);
        int disengaged;
 
        disengaged = (xpc_partition_engaged(1UL << partid) == 0);
@@ -870,20 +799,20 @@ xpc_partition_disengaged(struct xpc_partition *part)
 /*
  * Mark specified partition as active.
  */
-enum xpc_retval
+enum xp_retval
 xpc_mark_partition_active(struct xpc_partition *part)
 {
        unsigned long irq_flags;
-       enum xpc_retval ret;
+       enum xp_retval ret;
 
        dev_dbg(xpc_part, "setting partition %d to ACTIVE\n", XPC_PARTID(part));
 
        spin_lock_irqsave(&part->act_lock, irq_flags);
        if (part->act_state == XPC_P_ACTIVATING) {
                part->act_state = XPC_P_ACTIVE;
-               ret = xpcSuccess;
+               ret = xpSuccess;
        } else {
-               DBUG_ON(part->reason == xpcSuccess);
+               DBUG_ON(part->reason == xpSuccess);
                ret = part->reason;
        }
        spin_unlock_irqrestore(&part->act_lock, irq_flags);
@@ -896,7 +825,7 @@ xpc_mark_partition_active(struct xpc_partition *part)
  */
 void
 xpc_deactivate_partition(const int line, struct xpc_partition *part,
-                        enum xpc_retval reason)
+                        enum xp_retval reason)
 {
        unsigned long irq_flags;
 
@@ -905,15 +834,15 @@ xpc_deactivate_partition(const int line, struct xpc_partition *part,
        if (part->act_state == XPC_P_INACTIVE) {
                XPC_SET_REASON(part, reason, line);
                spin_unlock_irqrestore(&part->act_lock, irq_flags);
-               if (reason == xpcReactivating) {
+               if (reason == xpReactivating) {
                        /* we interrupt ourselves to reactivate partition */
                        xpc_IPI_send_reactivate(part);
                }
                return;
        }
        if (part->act_state == XPC_P_DEACTIVATING) {
-               if ((part->reason == xpcUnloading && reason != xpcUnloading) ||
-                   reason == xpcReactivating) {
+               if ((part->reason == xpUnloading && reason != xpUnloading) ||
+                   reason == xpReactivating) {
                        XPC_SET_REASON(part, reason, line);
                }
                spin_unlock_irqrestore(&part->act_lock, irq_flags);
@@ -982,13 +911,13 @@ xpc_discovery(void)
        int max_regions;
        int nasid;
        struct xpc_rsvd_page *rp;
-       partid_t partid;
+       short partid;
        struct xpc_partition *part;
        u64 *discovered_nasids;
-       enum xpc_retval ret;
+       enum xp_retval ret;
 
        remote_rp = xpc_kmalloc_cacheline_aligned(XPC_RP_HEADER_SIZE +
-                                                 xp_nasid_mask_bytes,
+                                                 xp_sizeof_nasid_mask,
                                                  GFP_KERNEL, &remote_rp_base);
        if (remote_rp == NULL)
                return;
@@ -1063,26 +992,26 @@ xpc_discovery(void)
 
                        ret = xpc_get_remote_rp(nasid, discovered_nasids,
                                                remote_rp, &remote_rp_pa);
-                       if (ret != xpcSuccess) {
+                       if (ret != xpSuccess) {
                                dev_dbg(xpc_part, "unable to get reserved page "
                                        "from nasid %d, reason=%d\n", nasid,
                                        ret);
 
-                               if (ret == xpcLocalPartid)
+                               if (ret == xpLocalPartid)
                                        break;
 
                                continue;
                        }
 
-                       remote_vars_pa = remote_rp->vars_pa;
+                       remote_vars_pa = remote_rp->sn.vars_pa;
 
-                       partid = remote_rp->partid;
+                       partid = remote_rp->SAL_partid;
                        part = &xpc_partitions[partid];
 
                        /* pull over the cross partition variables */
 
                        ret = xpc_get_remote_vars(remote_vars_pa, remote_vars);
-                       if (ret != xpcSuccess) {
+                       if (ret != xpSuccess) {
                                dev_dbg(xpc_part, "unable to get XPC variables "
                                        "from nasid %d, reason=%d\n", nasid,
                                        ret);
@@ -1116,7 +1045,7 @@ xpc_discovery(void)
                                        "register xp_addr region 0x%016lx\n",
                                        partid, remote_vars->amos_page_pa);
 
-                               XPC_SET_REASON(part, xpcPhysAddrRegFailed,
+                               XPC_SET_REASON(part, xpPhysAddrRegFailed,
                                               __LINE__);
                                break;
                        }
@@ -1151,24 +1080,20 @@ xpc_discovery(void)
  * Given a partid, get the nasids owned by that partition from the
  * remote partition's reserved page.
  */
-enum xpc_retval
-xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask)
+enum xp_retval
+xpc_initiate_partid_to_nasids(short partid, void *nasid_mask)
 {
        struct xpc_partition *part;
        u64 part_nasid_pa;
-       int bte_res;
 
        part = &xpc_partitions[partid];
        if (part->remote_rp_pa == 0)
-               return xpcPartitionDown;
+               return xpPartitionDown;
 
        memset(nasid_mask, 0, XP_NASID_MASK_BYTES);
 
        part_nasid_pa = (u64)XPC_RP_PART_NASIDS(part->remote_rp_pa);
 
-       bte_res = xp_bte_copy(part_nasid_pa, (u64)nasid_mask,
-                             xp_nasid_mask_bytes, (BTE_NOTIFY | BTE_WACQUIRE),
-                             NULL);
-
-       return xpc_map_bte_errors(bte_res);
+       return xp_remote_memcpy(nasid_mask, (void *)part_nasid_pa,
+                               xp_sizeof_nasid_mask);
 }
This page took 0.035766 seconds and 5 git commands to generate.