Re: [PATCH v16 06/45] firmware: arm_rmm: Ensure the RMM has GPT entries for memory
Suzuki K Poulose <[email protected]> Sun, 9 Aug 2026 07:42:46 +0100
| Newsgroups | dev.linux.lists.kvmarm,dev.linux.lists.linux-coco,org.infradead.lists.linux-arm-kernel,org.kernel.vger.kvm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 03/08/2026 14:43, Steven Price wrote: > The RMM maintains the state of all the granules in the system to make > sure that the host is abiding by the rules. This state can be maintained > at different granularity, per page (TRACKING_FINE) or per region > (TRACKING_COARSE). The region size depends on the underlying > "RMI_GRANULE_SIZE". For a "coarse" region all pages in the region must > be of the same state, this implies we need to have "fine" tracking for > DRAM, so that we can delegate individual pages. > > For now we only support a statically carved out memory for tracking > granules for the "fine" regions. This can be extended in the future to > allow modifying the tracking granularity and remove the need for a > static allocation. > > Similarly, the firmware may create L0 GPT entries describing the total > address space. But if we change the "PAS" (Physical Address Space) of a > granule then the firmware may need to create L1 tables to track the PAS > at a finer granularity. This sounds a bit incomplete to me. We could add: "Again, this series do not support creation of L1 GPT tables yet. Thus make sure that the firmware has L1 GPTs covering the DRAM region." > > Signed-off-by: Steven Price <[email protected]> > --- > Changes since v15: > * Skip firmware-reserved NOMAP memory in rmi_init_metadata() > * Handle negative error codes from wrappers. > Changes since v14: > * Move the implementation into drivers/firmware/arm_rmm. > Changes since v13: > * Moved out of KVM > --- > drivers/firmware/arm_rmm/rmi.c | 101 +++++++++++++++++++++++++++++++++ > include/linux/arm-rmi-cmds.h | 2 + > 2 files changed, 103 insertions(+) > > diff --git a/drivers/firmware/arm_rmm/rmi.c b/drivers/firmware/arm_rmm/rmi.c > index 51ea661cecf9..bce3304bbc1a 100644 > --- a/drivers/firmware/arm_rmm/rmi.c > +++ b/drivers/firmware/arm_rmm/rmi.c > @@ -12,6 +12,8 @@ > #include <asm/memory.h> > #include <asm/pgtable-hwdef.h> > > +static bool arm64_rmi_is_available; > + > /* Currently only the first 2 registers are used by Linux */ > #define RMI_FEAT_REG_COUNT 2 > static __ro_after_init unsigned long rmi_feat_reg_cache[RMI_FEAT_REG_COUNT]; > @@ -647,6 +649,98 @@ static int rmi_configure(void) > return ret; > } > > +/* > + * Make sure the area is tracked by RMM at FINE granularity. > + * We do not support changing the tracking yet. > + */ > +static int rmi_verify_memory_tracking(phys_addr_t start, phys_addr_t end) > +{ > + while (start < end) { > + unsigned long ret, category, state, next; > + > + ret = rmi_granule_tracking_get(start, end, &category, &state, &next); > + if (ret != RMI_SUCCESS || > + state != RMI_TRACKING_FINE || > + category != RMI_MEM_CATEGORY_CONVENTIONAL) { > + /* TODO: Set granule tracking in this case */ > + pr_err("Granule tracking for region isn't fine/conventional: %llx\n", > + start); > + return -ENODEV; > + } > + start = next; > + } > + > + return 0; > +} > + > +static int rmi_create_gpts(phys_addr_t start, phys_addr_t end) > +{ > + struct rmi_sro_state *sro; > + unsigned long l0gpt_sz; > + > + sro = kmalloc_obj(*sro, GFP_KERNEL); > + if (!sro) > + return -ENOMEM; > + > + l0gpt_sz = 1UL << (30 + FIELD_GET(RMI_FEATURE_REGISTER_1_L0GPTSZ, > + rmi_feat_reg(1))); > + start = ALIGN_DOWN(start, l0gpt_sz); > + end = ALIGN(end, l0gpt_sz); > + > + while (start < end) { > + long ret = rmi_gpt_l1_create(start, sro, GFP_KERNEL); > + > + /* > + * Make sure the L1 GPT tables are created for the region. > + * RMI_ERROR_GPT indicates the L1 table already exists. > + */ minor nit: The comment could be moved down closer to the check. > + if (ret < 0) { > + kfree(sro); > + return ret; > + } > + > + if (ret != RMI_SUCCESS && RMI_RETURN_STATUS(ret) != RMI_ERROR_GPT) { > + pr_err("GPT Level1 table missing for %llx\n", start); > + kfree(sro); > + return -ENOMEM; > + } > + start += l0gpt_sz; > + } > + Rest looks good to me Suzuki