From: Nathan Lynch <nath...@linux.ibm.com>

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: Nathan Lynch <nath...@linux.ibm.com>
---
 arch/powerpc/platforms/pseries/lpar.c | 37 +++++++++--------------------------
 1 file changed, 9 insertions(+), 28 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/lpar.c 
b/arch/powerpc/platforms/pseries/lpar.c
index 6597b2126ebb..2eab323f6970 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -32,6 +32,7 @@
 #include <asm/iommu.h>
 #include <asm/tlb.h>
 #include <asm/cputable.h>
+#include <asm/papr-sysparm.h>
 #include <asm/udbg.h>
 #include <asm/smp.h>
 #include <asm/trace.h>
@@ -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
  * 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,
 
 void __init pseries_lpar_read_hblkrm_characteristics(void)
 {
-       const s32 token = rtas_token("ibm,get-system-parameter");
-       unsigned char local_buffer[SPLPAR_TLB_BIC_MAXLENGTH];
-       int call_status, len, idx, bpsize;
+       static struct papr_sysparm_buf buf __initdata;
+       int len, idx, bpsize;
 
        if (!firmware_has_feature(FW_FEATURE_BLOCK_REMOVE))
                return;
 
-       do {
-               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);
+       if (papr_sysparm_get(PAPR_SYSPARM_TLB_BLOCK_INVALIDATE_ATTRS, &buf))
                return;
-       }
 
-       /*
-        * 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;
+       len = be16_to_cpu(buf.len);
        if (len > SPLPAR_TLB_BIC_MAXLENGTH) {
                pr_warn("%s too large returned buffer %d", __func__, len);
                return;
        }
 
-       idx = 2;
+       idx = 0;
        while (idx < len) {
-               u8 block_shift = local_buffer[idx++];
+               u8 block_shift = buf.val[idx++];
                u32 block_size;
                unsigned int npsize;
 
@@ -1525,9 +1506,9 @@ void __init pseries_lpar_read_hblkrm_characteristics(void)
 
                block_size = 1 << block_shift;
 
-               for (npsize = local_buffer[idx++];
+               for (npsize = buf.val[idx++];
                     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);
        }
 

-- 
2.39.1

Reply via email to