powerpc/vphn: move VPHN parsing logic to a separate file
authorGreg Kurz <gkurz@linux.vnet.ibm.com>
Mon, 23 Feb 2015 15:14:31 +0000 (16:14 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 17 Mar 2015 23:48:59 +0000 (10:48 +1100)
The goal behind this patch is to be able to write userland tests for the
VPHN parsing code.

Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/Makefile
arch/powerpc/mm/numa.c
arch/powerpc/mm/vphn.c [new file with mode: 0644]
arch/powerpc/mm/vphn.h [new file with mode: 0644]

index 438dcd3fd0d1dc09b76af41f32ca5e1693a7a1ca..9c8770b5f96f20212a3995559e4a4c7c9eb28786 100644 (file)
@@ -24,6 +24,7 @@ obj-$(CONFIG_40x)             += 40x_mmu.o
 obj-$(CONFIG_44x)              += 44x_mmu.o
 obj-$(CONFIG_PPC_FSL_BOOK3E)   += fsl_booke_mmu.o
 obj-$(CONFIG_NEED_MULTIPLE_NODES) += numa.o
+obj-$(CONFIG_PPC_SPLPAR)       += vphn.o
 obj-$(CONFIG_PPC_MM_SLICES)    += slice.o
 obj-y                          += hugetlbpage.o
 ifeq ($(CONFIG_HUGETLB_PAGE),y)
index 59196c5a0984baa01930f83067851addc4215498..c68471c33731a4292d91efdd605a8bbb856c6918 100644 (file)
@@ -1177,6 +1177,9 @@ u64 memory_hotplug_max(void)
 
 /* Virtual Processor Home Node (VPHN) support */
 #ifdef CONFIG_PPC_SPLPAR
+
+#include "vphn.h"
+
 struct topology_update_data {
        struct topology_update_data *next;
        unsigned int cpu;
@@ -1247,64 +1250,6 @@ static int update_cpu_associativity_changes_mask(void)
        return cpumask_weight(changes);
 }
 
-/* The H_HOME_NODE_ASSOCIATIVITY h_call returns 6 64-bit registers.
- */
-#define VPHN_REGISTER_COUNT 6
-
-/*
- * 6 64-bit registers unpacked into 12 32-bit associativity values. To form
- * the complete property we have to add the length in the first cell.
- */
-#define VPHN_ASSOC_BUFSIZE (VPHN_REGISTER_COUNT*sizeof(u64)/sizeof(u32) + 1)
-
-/*
- * Convert the associativity domain numbers returned from the hypervisor
- * to the sequence they would appear in the ibm,associativity property.
- */
-static int vphn_unpack_associativity(const long *packed, __be32 *unpacked)
-{
-       __be64 be_packed[VPHN_REGISTER_COUNT];
-       int i, nr_assoc_doms = 0;
-       const __be16 *field = (const __be16 *) be_packed;
-
-#define VPHN_FIELD_UNUSED      (0xffff)
-#define VPHN_FIELD_MSB         (0x8000)
-#define VPHN_FIELD_MASK                (~VPHN_FIELD_MSB)
-
-       /* Let's recreate the original stream. */
-       for (i = 0; i < VPHN_REGISTER_COUNT; i++)
-               be_packed[i] = cpu_to_be64(packed[i]);
-
-       for (i = 1; i < VPHN_ASSOC_BUFSIZE; i++) {
-               if (be16_to_cpup(field) == VPHN_FIELD_UNUSED) {
-                       /* All significant fields processed, and remaining
-                        * fields contain the reserved value of all 1's.
-                        * Just store them.
-                        */
-                       unpacked[i] = *((__be32 *)field);
-                       field += 2;
-               } else if (be16_to_cpup(field) & VPHN_FIELD_MSB) {
-                       /* Data is in the lower 15 bits of this field */
-                       unpacked[i] = cpu_to_be32(
-                               be16_to_cpup(field) & VPHN_FIELD_MASK);
-                       field++;
-                       nr_assoc_doms++;
-               } else {
-                       /* Data is in the lower 15 bits of this field
-                        * concatenated with the next 16 bit field
-                        */
-                       unpacked[i] = *((__be32 *)field);
-                       field += 2;
-                       nr_assoc_doms++;
-               }
-       }
-
-       /* The first cell contains the length of the property */
-       unpacked[0] = cpu_to_be32(nr_assoc_doms);
-
-       return nr_assoc_doms;
-}
-
 /*
  * Retrieve the new associativity information for a virtual processor's
  * home node.
diff --git a/arch/powerpc/mm/vphn.c b/arch/powerpc/mm/vphn.c
new file mode 100644 (file)
index 0000000..c49ed51
--- /dev/null
@@ -0,0 +1,50 @@
+#include <asm/byteorder.h>
+#include "vphn.h"
+
+/*
+ * Convert the associativity domain numbers returned from the hypervisor
+ * to the sequence they would appear in the ibm,associativity property.
+ */
+int vphn_unpack_associativity(const long *packed, __be32 *unpacked)
+{
+       __be64 be_packed[VPHN_REGISTER_COUNT];
+       int i, nr_assoc_doms = 0;
+       const __be16 *field = (const __be16 *) be_packed;
+
+#define VPHN_FIELD_UNUSED      (0xffff)
+#define VPHN_FIELD_MSB         (0x8000)
+#define VPHN_FIELD_MASK                (~VPHN_FIELD_MSB)
+
+       /* Let's recreate the original stream. */
+       for (i = 0; i < VPHN_REGISTER_COUNT; i++)
+               be_packed[i] = cpu_to_be64(packed[i]);
+
+       for (i = 1; i < VPHN_ASSOC_BUFSIZE; i++) {
+               if (be16_to_cpup(field) == VPHN_FIELD_UNUSED) {
+                       /* All significant fields processed, and remaining
+                        * fields contain the reserved value of all 1's.
+                        * Just store them.
+                        */
+                       unpacked[i] = *((__be32 *)field);
+                       field += 2;
+               } else if (be16_to_cpup(field) & VPHN_FIELD_MSB) {
+                       /* Data is in the lower 15 bits of this field */
+                       unpacked[i] = cpu_to_be32(
+                               be16_to_cpup(field) & VPHN_FIELD_MASK);
+                       field++;
+                       nr_assoc_doms++;
+               } else {
+                       /* Data is in the lower 15 bits of this field
+                        * concatenated with the next 16 bit field
+                        */
+                       unpacked[i] = *((__be32 *)field);
+                       field += 2;
+                       nr_assoc_doms++;
+               }
+       }
+
+       /* The first cell contains the length of the property */
+       unpacked[0] = cpu_to_be32(nr_assoc_doms);
+
+       return nr_assoc_doms;
+}
diff --git a/arch/powerpc/mm/vphn.h b/arch/powerpc/mm/vphn.h
new file mode 100644 (file)
index 0000000..96af9a4
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _ARCH_POWERPC_MM_VPHN_H_
+#define _ARCH_POWERPC_MM_VPHN_H_
+
+/* The H_HOME_NODE_ASSOCIATIVITY h_call returns 6 64-bit registers.
+ */
+#define VPHN_REGISTER_COUNT 6
+
+/*
+ * 6 64-bit registers unpacked into 12 32-bit associativity values. To form
+ * the complete property we have to add the length in the first cell.
+ */
+#define VPHN_ASSOC_BUFSIZE (VPHN_REGISTER_COUNT*sizeof(u64)/sizeof(u32) + 1)
+
+extern int vphn_unpack_associativity(const long *packed, __be32 *unpacked);
+
+#endif