Commit e58d9e17 authored by Nathan Lynch's avatar Nathan Lynch Committed by Michael Ellerman

powerpc/pseries/lpar: convert to papr_sysparm API

Convert the TLB block invalidate characteristics discovery to the new
papr_sysparm API. This occurs too early in boot to use
papr_sysparm_buf_alloc(), so use a static buffer.
Signed-off-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-18-26929c8cce78@linux.ibm.com
parent 69b9f5a5
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/tlb.h> #include <asm/tlb.h>
#include <asm/cputable.h> #include <asm/cputable.h>
#include <asm/papr-sysparm.h>
#include <asm/udbg.h> #include <asm/udbg.h>
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/trace.h> #include <asm/trace.h>
...@@ -1469,8 +1470,6 @@ static inline void __init check_lp_set_hblkrm(unsigned int lp, ...@@ -1469,8 +1470,6 @@ static inline void __init check_lp_set_hblkrm(unsigned int lp,
} }
} }
#define SPLPAR_TLB_BIC_TOKEN 50
/* /*
* The size of the TLB Block Invalidate Characteristics is variable. But at the * The size of the TLB Block Invalidate Characteristics is variable. But at the
* maximum it will be the number of possible page sizes *2 + 10 bytes. * maximum it will be the number of possible page sizes *2 + 10 bytes.
...@@ -1481,42 +1480,24 @@ static inline void __init check_lp_set_hblkrm(unsigned int lp, ...@@ -1481,42 +1480,24 @@ static inline void __init check_lp_set_hblkrm(unsigned int lp,
void __init pseries_lpar_read_hblkrm_characteristics(void) void __init pseries_lpar_read_hblkrm_characteristics(void)
{ {
const s32 token = rtas_token("ibm,get-system-parameter"); static struct papr_sysparm_buf buf __initdata;
unsigned char local_buffer[SPLPAR_TLB_BIC_MAXLENGTH]; int len, idx, bpsize;
int call_status, len, idx, bpsize;
if (!firmware_has_feature(FW_FEATURE_BLOCK_REMOVE)) if (!firmware_has_feature(FW_FEATURE_BLOCK_REMOVE))
return; return;
do { if (papr_sysparm_get(PAPR_SYSPARM_TLB_BLOCK_INVALIDATE_ATTRS, &buf))
spin_lock(&rtas_data_buf_lock);
memset(rtas_data_buf, 0, RTAS_DATA_BUF_SIZE);
call_status = rtas_call(token, 3, 1, NULL, SPLPAR_TLB_BIC_TOKEN,
__pa(rtas_data_buf), RTAS_DATA_BUF_SIZE);
memcpy(local_buffer, rtas_data_buf, SPLPAR_TLB_BIC_MAXLENGTH);
local_buffer[SPLPAR_TLB_BIC_MAXLENGTH - 1] = '\0';
spin_unlock(&rtas_data_buf_lock);
} while (rtas_busy_delay(call_status));
if (call_status != 0) {
pr_warn("%s %s Error calling get-system-parameter (0x%x)\n",
__FILE__, __func__, call_status);
return; return;
}
/* len = be16_to_cpu(buf.len);
* The first two (2) bytes of the data in the buffer are the length of
* the returned data, not counting these first two (2) bytes.
*/
len = be16_to_cpu(*((u16 *)local_buffer)) + 2;
if (len > SPLPAR_TLB_BIC_MAXLENGTH) { if (len > SPLPAR_TLB_BIC_MAXLENGTH) {
pr_warn("%s too large returned buffer %d", __func__, len); pr_warn("%s too large returned buffer %d", __func__, len);
return; return;
} }
idx = 2; idx = 0;
while (idx < len) { while (idx < len) {
u8 block_shift = local_buffer[idx++]; u8 block_shift = buf.val[idx++];
u32 block_size; u32 block_size;
unsigned int npsize; unsigned int npsize;
...@@ -1525,9 +1506,9 @@ void __init pseries_lpar_read_hblkrm_characteristics(void) ...@@ -1525,9 +1506,9 @@ void __init pseries_lpar_read_hblkrm_characteristics(void)
block_size = 1 << block_shift; block_size = 1 << block_shift;
for (npsize = local_buffer[idx++]; for (npsize = buf.val[idx++];
npsize > 0 && idx < len; npsize--) npsize > 0 && idx < len; npsize--)
check_lp_set_hblkrm((unsigned int) local_buffer[idx++], check_lp_set_hblkrm((unsigned int)buf.val[idx++],
block_size); block_size);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment