mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
[PATCH] ppc64: kill bitfields in ppc64 hash code
This patch removes the use of bitfield types from the ppc64 hash table manipulation code. Signed-off-by: David Gibson <[email protected]> Acked-by: Stephen Rothwell <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
f13487c66c
commit
96e2844999
11 changed files with 164 additions and 228 deletions
|
|
@ -77,27 +77,26 @@ static inline u64 HvCallHpt_invalidateSetSwBitsGet(u32 hpteIndex, u8 bitson,
|
|||
return compressedStatus;
|
||||
}
|
||||
|
||||
static inline u64 HvCallHpt_findValid(HPTE *hpte, u64 vpn)
|
||||
static inline u64 HvCallHpt_findValid(hpte_t *hpte, u64 vpn)
|
||||
{
|
||||
return HvCall3Ret16(HvCallHptFindValid, hpte, vpn, 0, 0);
|
||||
}
|
||||
|
||||
static inline u64 HvCallHpt_findNextValid(HPTE *hpte, u32 hpteIndex,
|
||||
static inline u64 HvCallHpt_findNextValid(hpte_t *hpte, u32 hpteIndex,
|
||||
u8 bitson, u8 bitsoff)
|
||||
{
|
||||
return HvCall3Ret16(HvCallHptFindNextValid, hpte, hpteIndex,
|
||||
bitson, bitsoff);
|
||||
}
|
||||
|
||||
static inline void HvCallHpt_get(HPTE *hpte, u32 hpteIndex)
|
||||
static inline void HvCallHpt_get(hpte_t *hpte, u32 hpteIndex)
|
||||
{
|
||||
HvCall2Ret16(HvCallHptGet, hpte, hpteIndex, 0);
|
||||
}
|
||||
|
||||
static inline void HvCallHpt_addValidate(u32 hpteIndex, u32 hBit, HPTE *hpte)
|
||||
static inline void HvCallHpt_addValidate(u32 hpteIndex, u32 hBit, hpte_t *hpte)
|
||||
{
|
||||
HvCall4(HvCallHptAddValidate, hpteIndex, hBit, (*((u64 *)hpte)),
|
||||
(*(((u64 *)hpte)+1)));
|
||||
HvCall4(HvCallHptAddValidate, hpteIndex, hBit, hpte->v, hpte->r);
|
||||
}
|
||||
|
||||
#endif /* _HVCALLHPT_H */
|
||||
|
|
|
|||
|
|
@ -53,10 +53,8 @@ struct machdep_calls {
|
|||
long (*hpte_insert)(unsigned long hpte_group,
|
||||
unsigned long va,
|
||||
unsigned long prpn,
|
||||
int secondary,
|
||||
unsigned long hpteflags,
|
||||
int bolted,
|
||||
int large);
|
||||
unsigned long vflags,
|
||||
unsigned long rflags);
|
||||
long (*hpte_remove)(unsigned long hpte_group);
|
||||
void (*flush_hash_range)(unsigned long context,
|
||||
unsigned long number,
|
||||
|
|
|
|||
|
|
@ -60,6 +60,22 @@
|
|||
|
||||
#define HPTES_PER_GROUP 8
|
||||
|
||||
#define HPTE_V_AVPN_SHIFT 7
|
||||
#define HPTE_V_AVPN ASM_CONST(0xffffffffffffff80)
|
||||
#define HPTE_V_AVPN_VAL(x) (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
|
||||
#define HPTE_V_BOLTED ASM_CONST(0x0000000000000010)
|
||||
#define HPTE_V_LOCK ASM_CONST(0x0000000000000008)
|
||||
#define HPTE_V_LARGE ASM_CONST(0x0000000000000004)
|
||||
#define HPTE_V_SECONDARY ASM_CONST(0x0000000000000002)
|
||||
#define HPTE_V_VALID ASM_CONST(0x0000000000000001)
|
||||
|
||||
#define HPTE_R_PP0 ASM_CONST(0x8000000000000000)
|
||||
#define HPTE_R_TS ASM_CONST(0x4000000000000000)
|
||||
#define HPTE_R_RPN_SHIFT 12
|
||||
#define HPTE_R_RPN ASM_CONST(0x3ffffffffffff000)
|
||||
#define HPTE_R_FLAGS ASM_CONST(0x00000000000003ff)
|
||||
#define HPTE_R_PP ASM_CONST(0x0000000000000003)
|
||||
|
||||
/* Values for PP (assumes Ks=0, Kp=1) */
|
||||
/* pp0 will always be 0 for linux */
|
||||
#define PP_RWXX 0 /* Supervisor read/write, User none */
|
||||
|
|
@ -69,54 +85,13 @@
|
|||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* Hardware Page Table Entry */
|
||||
typedef struct {
|
||||
unsigned long avpn:57; /* vsid | api == avpn */
|
||||
unsigned long : 2; /* Software use */
|
||||
unsigned long bolted: 1; /* HPTE is "bolted" */
|
||||
unsigned long lock: 1; /* lock on pSeries SMP */
|
||||
unsigned long l: 1; /* Virtual page is large (L=1) or 4 KB (L=0) */
|
||||
unsigned long h: 1; /* Hash function identifier */
|
||||
unsigned long v: 1; /* Valid (v=1) or invalid (v=0) */
|
||||
} Hpte_dword0;
|
||||
unsigned long v;
|
||||
unsigned long r;
|
||||
} hpte_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned long pp0: 1; /* Page protection bit 0 */
|
||||
unsigned long ts: 1; /* Tag set bit */
|
||||
unsigned long rpn: 50; /* Real page number */
|
||||
unsigned long : 2; /* Reserved */
|
||||
unsigned long ac: 1; /* Address compare */
|
||||
unsigned long r: 1; /* Referenced */
|
||||
unsigned long c: 1; /* Changed */
|
||||
unsigned long w: 1; /* Write-thru cache mode */
|
||||
unsigned long i: 1; /* Cache inhibited */
|
||||
unsigned long m: 1; /* Memory coherence required */
|
||||
unsigned long g: 1; /* Guarded */
|
||||
unsigned long n: 1; /* No-execute */
|
||||
unsigned long pp: 2; /* Page protection bits 1:2 */
|
||||
} Hpte_dword1;
|
||||
|
||||
typedef struct {
|
||||
char padding[6]; /* padding */
|
||||
unsigned long : 6; /* padding */
|
||||
unsigned long flags: 10; /* HPTE flags */
|
||||
} Hpte_dword1_flags;
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
unsigned long dword0;
|
||||
Hpte_dword0 dw0;
|
||||
} dw0;
|
||||
|
||||
union {
|
||||
unsigned long dword1;
|
||||
Hpte_dword1 dw1;
|
||||
Hpte_dword1_flags flags;
|
||||
} dw1;
|
||||
} HPTE;
|
||||
|
||||
extern HPTE * htab_address;
|
||||
extern unsigned long htab_hash_mask;
|
||||
extern hpte_t *htab_address;
|
||||
extern unsigned long htab_hash_mask;
|
||||
|
||||
static inline unsigned long hpt_hash(unsigned long vpn, int large)
|
||||
{
|
||||
|
|
@ -181,18 +156,18 @@ static inline void tlbiel(unsigned long va)
|
|||
asm volatile("ptesync": : :"memory");
|
||||
}
|
||||
|
||||
static inline unsigned long slot2va(unsigned long avpn, unsigned long large,
|
||||
unsigned long secondary, unsigned long slot)
|
||||
static inline unsigned long slot2va(unsigned long hpte_v, unsigned long slot)
|
||||
{
|
||||
unsigned long avpn = HPTE_V_AVPN_VAL(hpte_v);
|
||||
unsigned long va;
|
||||
|
||||
va = avpn << 23;
|
||||
|
||||
if (!large) {
|
||||
if (! (hpte_v & HPTE_V_LARGE)) {
|
||||
unsigned long vpi, pteg;
|
||||
|
||||
pteg = slot / HPTES_PER_GROUP;
|
||||
if (secondary)
|
||||
if (hpte_v & HPTE_V_SECONDARY)
|
||||
pteg = ~pteg;
|
||||
|
||||
vpi = ((va >> 28) ^ pteg) & htab_hash_mask;
|
||||
|
|
@ -219,11 +194,11 @@ extern void hpte_init_iSeries(void);
|
|||
|
||||
extern long pSeries_lpar_hpte_insert(unsigned long hpte_group,
|
||||
unsigned long va, unsigned long prpn,
|
||||
int secondary, unsigned long hpteflags,
|
||||
int bolted, int large);
|
||||
unsigned long vflags,
|
||||
unsigned long rflags);
|
||||
extern long native_hpte_insert(unsigned long hpte_group, unsigned long va,
|
||||
unsigned long prpn, int secondary,
|
||||
unsigned long hpteflags, int bolted, int large);
|
||||
unsigned long prpn,
|
||||
unsigned long vflags, unsigned long rflags);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue