Skip to content

Commit

Permalink
powerpc/vphn: move VPHN parsing logic to a separate file
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Greg Kurz authored and Michael Ellerman committed Mar 17, 2015
1 parent b1fc948 commit 4b6cfb2
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 58 deletions.
1 change: 1 addition & 0 deletions arch/powerpc/mm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
61 changes: 3 additions & 58 deletions arch/powerpc/mm/numa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
50 changes: 50 additions & 0 deletions arch/powerpc/mm/vphn.c
Original file line number Diff line number Diff line change
@@ -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;
}
16 changes: 16 additions & 0 deletions arch/powerpc/mm/vphn.h
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 4b6cfb2

Please sign in to comment.