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

Commit fc8effa4 authored by Ian Munsie's avatar Ian Munsie Committed by Benjamin Herrenschmidt
Browse files

powerpc: Enable relocation on during exceptions at boot



We currently do this synchronously at boot from setup_arch. On a large
system this could hypothetically take a little while to complete, so
currently we will give up if we are asked to wait for more than a second
in total.

If we actually start hitting that timeout in practice we can always move
this code into a kernel thread to take care of it in the background.

Signed-off-by: default avatarIan Munsie <imunsie@au1.ibm.com>
Signed-off-by: default avatarMichael Neuling <mikey@neuling.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent cca55d9d
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -367,6 +367,36 @@ static void pSeries_idle(void)
	}
}

/*
 * Enable relocation on during exceptions. This has partition wide scope and
 * may take a while to complete, if it takes longer than one second we will
 * just give up rather than wasting any more time on this - if that turns out
 * to ever be a problem in practice we can move this into a kernel thread to
 * finish off the process later in boot.
 */
static int __init pSeries_enable_reloc_on_exc(void)
{
	long rc;
	unsigned int delay, total_delay = 0;

	while (1) {
		rc = enable_reloc_on_exceptions();
		if (!H_IS_LONG_BUSY(rc))
			return rc;

		delay = get_longbusy_msecs(rc);
		total_delay += delay;
		if (total_delay > 1000) {
			pr_warn("Warning: Giving up waiting to enable "
				"relocation on exceptions (%u msec)!\n",
				total_delay);
			return rc;
		}

		mdelay(delay);
	}
}

static void __init pSeries_setup_arch(void)
{
	panic_timeout = 10;
@@ -402,6 +432,14 @@ static void __init pSeries_setup_arch(void)
		ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
	else
		ppc_md.enable_pmcs = power4_enable_pmcs;

	if (firmware_has_feature(FW_FEATURE_SET_MODE)) {
		long rc;
		if ((rc = pSeries_enable_reloc_on_exc()) != H_SUCCESS) {
			pr_warn("Unable to enable relocation on exceptions: "
				"%ld\n", rc);
		}
	}
}

static int __init pSeries_init_panel(void)