Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d8ca4985 authored by Nathan Lynch's avatar Nathan Lynch Committed by Greg Kroah-Hartman
Browse files

powerpc/pseries/lparcfg: add missing RTAS retry status handling



[ Upstream commit 5d08633e5f6564b60f1cbe09af3af40a74d66431 ]

The ibm,get-system-parameter RTAS function may return -2 or 990x,
which indicate that the caller should try again.

lparcfg's parse_system_parameter_string() ignores this, making it
possible to intermittently report incorrect SPLPAR characteristics.

Move the RTAS call into a coventional rtas_busy_delay()-based loop.

Signed-off-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20230125-b4-powerpc-rtas-queue-v3-4-26929c8cce78@linux.ibm.com


Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 421c59c2
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -289,6 +289,7 @@ static void parse_mpp_x_data(struct seq_file *m)
 */
static void parse_system_parameter_string(struct seq_file *m)
{
	const s32 token = rtas_token("ibm,get-system-parameter");
	int call_status;

	unsigned char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL);
@@ -298,16 +299,15 @@ static void parse_system_parameter_string(struct seq_file *m)
		return;
	}

	do {
		spin_lock(&rtas_data_buf_lock);
		memset(rtas_data_buf, 0, SPLPAR_MAXLENGTH);
	call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1,
				NULL,
				SPLPAR_CHARACTERISTICS_TOKEN,
				__pa(rtas_data_buf),
				RTAS_DATA_BUF_SIZE);
		call_status = rtas_call(token, 3, 1, NULL, SPLPAR_CHARACTERISTICS_TOKEN,
					__pa(rtas_data_buf), RTAS_DATA_BUF_SIZE);
		memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH);
		local_buffer[SPLPAR_MAXLENGTH - 1] = '\0';
		spin_unlock(&rtas_data_buf_lock);
	} while (rtas_busy_delay(call_status));

	if (call_status != 0) {
		printk(KERN_INFO