[PATCH v19 6/7] firmware: arm_rmm: Ensure the RMM has GPT entries for memory
Suzuki K Poulose
suzuki.poulose at arm.com
Wed Sep 30 01:17:00 PDT 2026
On 29/09/2026 23:29, Shanker Donthineni wrote:
> Hi Suzuki,
>
> On 9/24/2026 8:52 AM, Suzuki K Poulose wrote:
>> External email: Use caution opening links or attachments
>>
>>
>> From: Steven Price <steven.price at arm.com>
>>
>> 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 or TRACKING_INTERMEDIATE). The region size depends on
>> the
>> underlying "RMI_GRANULE_SIZE". For a "coarse"/"intermediate" 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 by the firmware.
...
>> +
>> +/*
>> + * We do not support creating L1 GPTs yet. So, make sure that
>> + * all the regions are managed by the firmware.
>> + */
>> +static int rmi_verify_gpt_firmware_managed(phys_addr_t start,
>> phys_addr_t end)
>> +{
>> + unsigned long l0gpt_sz;
>> + unsigned long next, par_state;
>> +
>> + 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_info(start, end, &next, &par_state);
>> +
>> + if (ret != RMI_SUCCESS)
>> + return -ENOMEM;
>> +
>> + if (WARN_ON(next <= start))
>> + return -ENXIO;
>> +
>> + if (par_state != RMI_GPT_PAR_PLAT) {
>> + pr_err("GPT for the region is not managed by
>> firmware %llx-%lx\n",
>> + start, next);
>> + return -ENOMEM;
>
> Accepting only RMI_GPT_PAR_PLAT rules out the host ever creating its own
> L1 GPTs. On NVIDIA platforms the PARs backing system RAM come up as
> RMI_GPT_PAR_HOST_NOT_CREATED, so this returns -ENOMEM and CCA cannot be
> enabled at all.
Like I mentioned in the previous response, this is staged upstreaming.
The dynamic GPT/Tracking will follow after. This also calls for
on-demand activation which Catalin requested and can be combined together,
as we dedicate quite a lot of memory for the metadata and L1GPTs.
>
> With local changes to promote granule tracking via RMI_GRANULE_TRACKING_SET
> and to create the host L1 GPTs, I was able to boot a Realm with multiple
> vCPUs and exercise basic boot functionality on NVIDIA silicon.
Thanks for the testing !
Cheers
Suzuki
More information about the linux-arm-kernel
mailing list