[POWERPC] Only use H_BULK_REMOVE if the firmware supports it
The previous patch changing pSeries to use H_BULK_REMOVE broke the JS20 blade, where the firmware doesn't support H_BULK_REMOVE. This adds a firmware check so that on machines that don't have H_BULK_REMOVE, we just use the H_REMOVE call as before. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
f03e64f2ca
commit
12e86f92fc
|
@ -59,6 +59,7 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = {
|
||||||
{FW_FEATURE_XDABR, "hcall-xdabr"},
|
{FW_FEATURE_XDABR, "hcall-xdabr"},
|
||||||
{FW_FEATURE_MULTITCE, "hcall-multi-tce"},
|
{FW_FEATURE_MULTITCE, "hcall-multi-tce"},
|
||||||
{FW_FEATURE_SPLPAR, "hcall-splpar"},
|
{FW_FEATURE_SPLPAR, "hcall-splpar"},
|
||||||
|
{FW_FEATURE_BULK_REMOVE, "hcall-bulk"},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Build up the firmware features bitmask using the contents of
|
/* Build up the firmware features bitmask using the contents of
|
||||||
|
|
|
@ -516,7 +516,7 @@ static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
|
||||||
static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
|
static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
|
||||||
{
|
{
|
||||||
unsigned long i, pix, rc;
|
unsigned long i, pix, rc;
|
||||||
unsigned long flags;
|
unsigned long flags = 0;
|
||||||
struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
|
struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
|
||||||
int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE);
|
int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE);
|
||||||
unsigned long param[9];
|
unsigned long param[9];
|
||||||
|
@ -540,16 +540,22 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
|
||||||
hash = ~hash;
|
hash = ~hash;
|
||||||
slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
|
slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
|
||||||
slot += hidx & _PTEIDX_GROUP_IX;
|
slot += hidx & _PTEIDX_GROUP_IX;
|
||||||
param[pix] = HBR_REQUEST | HBR_AVPN | slot;
|
if (!firmware_has_feature(FW_FEATURE_BULK_REMOVE)) {
|
||||||
param[pix+1] = hpte_encode_v(va, psize) & HPTE_V_AVPN;
|
pSeries_lpar_hpte_invalidate(slot, va, psize,
|
||||||
pix += 2;
|
local);
|
||||||
if (pix == 8) {
|
} else {
|
||||||
rc = plpar_hcall9(H_BULK_REMOVE, param,
|
param[pix] = HBR_REQUEST | HBR_AVPN | slot;
|
||||||
|
param[pix+1] = hpte_encode_v(va, psize) &
|
||||||
|
HPTE_V_AVPN;
|
||||||
|
pix += 2;
|
||||||
|
if (pix == 8) {
|
||||||
|
rc = plpar_hcall9(H_BULK_REMOVE, param,
|
||||||
param[0], param[1], param[2],
|
param[0], param[1], param[2],
|
||||||
param[3], param[4], param[5],
|
param[3], param[4], param[5],
|
||||||
param[6], param[7]);
|
param[6], param[7]);
|
||||||
BUG_ON(rc != H_SUCCESS);
|
BUG_ON(rc != H_SUCCESS);
|
||||||
pix = 0;
|
pix = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} pte_iterate_hashed_end();
|
} pte_iterate_hashed_end();
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000)
|
#define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000)
|
||||||
#define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000)
|
#define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000)
|
||||||
#define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000)
|
#define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000)
|
||||||
|
#define FW_FEATURE_BULK_REMOVE ASM_CONST(0x0000000002000000)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue