-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
powerpc/vphn: move VPHN parsing logic to a separate file
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
Showing
4 changed files
with
70 additions
and
58 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |