On 23/08/2024 14:29, Will Deacon wrote: > On Mon, Aug 19, 2024 at 02:19:09PM +0100, Steven Price wrote: >> From: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> >> >> Add a function to test early if PSCI is present and what conduit it >> uses. Because the PSCI conduit corresponds to the SMCCC one, this will >> let the kernel know whether it can use SMC instructions to discuss with >> the Realm Management Monitor (RMM), early enough to enable RAM and >> serial access when running in a Realm. >> >> Signed-off-by: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> >> Signed-off-by: Steven Price <steven.price@xxxxxxx> >> --- >> v4: New patch >> --- >> drivers/firmware/psci/psci.c | 25 +++++++++++++++++++++++++ >> include/linux/psci.h | 5 +++++ >> 2 files changed, 30 insertions(+) >> >> diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c >> index 2328ca58bba6..2b308f97ef2c 100644 >> --- a/drivers/firmware/psci/psci.c >> +++ b/drivers/firmware/psci/psci.c >> @@ -13,6 +13,7 @@ >> #include <linux/errno.h> >> #include <linux/linkage.h> >> #include <linux/of.h> >> +#include <linux/of_fdt.h> >> #include <linux/pm.h> >> #include <linux/printk.h> >> #include <linux/psci.h> >> @@ -769,6 +770,30 @@ int __init psci_dt_init(void) >> return ret; >> } >> >> +/* >> + * Test early if PSCI is supported, and if its conduit matches @conduit >> + */ >> +bool __init psci_early_test_conduit(enum arm_smccc_conduit conduit) >> +{ >> + int len; >> + int psci_node; >> + const char *method; >> + unsigned long dt_root; >> + >> + /* DT hasn't been unflattened yet, we have to work with the flat blob */ >> + dt_root = of_get_flat_dt_root(); >> + psci_node = of_get_flat_dt_subnode_by_name(dt_root, "psci"); >> + if (psci_node <= 0) >> + return false; >> + >> + method = of_get_flat_dt_prop(psci_node, "method", &len); >> + if (!method) >> + return false; >> + >> + return (conduit == SMCCC_CONDUIT_SMC && strncmp(method, "smc", len) == 0) || >> + (conduit == SMCCC_CONDUIT_HVC && strncmp(method, "hvc", len) == 0); >> +} > > This still looks incomplete to me as per my earlier comments: > > https://lore.kernel.org/all/20240709104851.GE12978@willie-the-truck/ > > For the first implementation, can we punt the RIPAS_RAM to the bootloader > and drop support for earlycon? Even if we manage to shoe-horn enough code > into the early boot path, I think we'll regret it later on because there's > always something that wants to be first and it inevitably ends up being > a nightmare to maintain. Short-answer: yes, although it has drawbacks. I've never been keen on the RIPAS_RAM requirement, the logic behind it is that it makes it easier to have varying amounts of RAM given to the guest without affecting the attestation. But it's a weak argument and I'd personally prefer to punt the responsibility to a bootloader/VMM. earlycon should be fairly easy to remove - and it doesn't have to actually kill earlycon because we can pass in the address with the top bit set - it just requires fixing up the VMM. EFI is the main issue. I'll have a go at coming up with a cut down series - at the very least I'll see if I can rearrange to have the troublesome parts at the end so they can be dropped if necessary. Steve