[PATCH v17 1/7] firmware: arm_rmm: Add SMC definitions for calling the RMM

Suzuki K Poulose suzuki.poulose at arm.com
Thu Sep 10 02:54:47 PDT 2026


On 10/09/2026 10:47, Gavin Shan wrote:
> On 9/9/26 6:39 PM, Suzuki K Poulose wrote:
>> On 08/09/2026 23:41, Gavin Shan wrote:
>>> On 9/8/26 8:37 PM, Suzuki K Poulose wrote:
>>>> On 08/09/2026 07:19, Gavin Shan wrote:
>>>>> On 9/7/26 7:59 PM, Suzuki K Poulose wrote:
>>>>>> From: Steven Price <steven.price at arm.com>
>>>>>>
>>>>>> The RMM (Realm Management Monitor) provides functionality that can be
>>>>>> accessed by SMC calls from the host.
>>>>>>
>>>>>> The SMC definitions are based on DEN0137[1] version 2.0-bet3
>>>>>>
>>>>>> [1] https://developer.arm.com/documentation/den0137/2-0bet3/
>>>>>>
>>>>>> Signed-off-by: Steven Price <steven.price at arm.com>
>>>>>> Signed-off-by: Suzuki K Poulose <suzuki.poulose at arm.com>
>>>>
>>>> ...
>>>>
>>>>>> ---
>>>>>>   include/linux/arm-smccc-rmi.h | 494 ++++++++++++++++++++++++++++ 
>>>>>> ++ ++++
>>>>>>   1 file changed, 494 insertions(+)
>>>>>>   create mode 100644 include/linux/arm-smccc-rmi.h
>>>>>>
>>>>>
>>>>> Some nitpicks below, please pick up the commits that look 
>>>>> reasonable :)
>>>>>
>>>>
>>>>
>>>>>> +
>>>>>> +#define RMI_RETURN_STATUS_MASK        (0xFFUL)
>>>>>> +#define RMI_RETURN_INDEX_MASK        (0xFFUL << 8)
>>>>>> +#define RMI_RETURN_MEMREQ_MASK        (0x3UL << 8)
>>>>>> +#define RMI_RETURN_CAN_CANCEL_MASK    (0x1UL << 10)
>>>>>> +
>>>>>> +#define RMI_RETURN_STATUS(ret) FIELD_GET(RMI_RETURN_STATUS_MASK, 
>>>>>> ret)
>>>>>> +#define RMI_RETURN_INDEX(ret) FIELD_GET(RMI_RETURN_INDEX_MASK, ret)
>>>>>> +#define RMI_RETURN_MEMREQ(ret) FIELD_GET(RMI_RETURN_MEMREQ_MASK, 
>>>>>> ret)
>>>>>> +#define RMI_RETURN_CAN_CANCEL(ret) 
>>>>>> FIELD_GET(RMI_RETURN_CAN_CANCEL_MASK, ret)
>>>>>> +
>>>>>
>>>>> If I'm correct enough, RMI_RETURN_{STATUS, INDEX, MEMREQ, 
>>>>> CAN_CANEL} _MASK are used
>>>>> for once in this header file. So we needn't explicitly expose them 
>>>>> and combine their
>>>>> definitions with users to fetch the corresponding fields, as below.
>>>>>
>>>>> #define RMI_RETURN_STATUS(ret)        FIELD_GET(GENMASK(7, 0), ret)
>>>>> #define RMI_RETURN_INDEX(ret)        FIELD_GET(GENMASK(15, 8), ret)
>>>>> #define RMI_RETURN_MEMREQ(ret)        FIELD_GET(GENMASK(10, 8), ret)
>>>>> #define RMI_RETURN_CAN_CANCEL(ret)    FIELD_GEt(GENMASK(10, 10), ret)
>>>>
>>>> I belive the header files were generated from a tool (by Steven) and
>>>> these would make it easier to compare with the generated header file 
>>>> for
>>>> any deviation from the spec. So, I am a bit reluctant make these
>>>> changes.
>>>>
>>>> That said, I am happy to convert the mask definitions to GENMASK() for
>>>> consistency and readability. i.e., something like:
>>>>
>>>> diff --git a/include/linux/arm-smccc-rmi.h b/include/linux/arm- 
>>>> smccc- rmi.h
>>>> index 3eb88caf40964..078197284415e 100644
>>>> --- a/include/linux/arm-smccc-rmi.h
>>>> +++ b/include/linux/arm-smccc-rmi.h
>>>> @@ -139,10 +139,10 @@
>>>>   #define RMI_ABI_VERSION_GET_MINOR(version) ((version) & 0xFFFF)
>>>>   #define RMI_ABI_VERSION(major, minor)      (((major) << 16) | 
>>>> (minor))
>>>>
>>>> -#define RMI_RETURN_STATUS_MASK         (0xFFUL)
>>>> -#define RMI_RETURN_INDEX_MASK          (0xFFUL << 8)
>>>> -#define RMI_RETURN_MEMREQ_MASK         (0x3UL << 8)
>>>> -#define RMI_RETURN_CAN_CANCEL_MASK     (0x1UL << 10)
>>>> +#define RMI_RETURN_STATUS_MASK         GENMASK(7, 0)
>>>> +#define RMI_RETURN_INDEX_MASK          GENMASK(15, 8)
>>>> +#define RMI_RETURN_MEMREQ_MASK         GENMASK(10, 8)
>>>> +#define RMI_RETURN_CAN_CANCEL_MASK     BIT(10)
>>>>
>>>
>>> Ok.
>>>
>>>>>
>>>>>> +#define RMI_SUCCESS            0
>>>>>> +#define RMI_ERROR_INPUT            1
>>>>>> +#define RMI_ERROR_REALM            2
>>>>>> +#define RMI_ERROR_REC            3
>>>>>> +#define RMI_ERROR_RTT            4
>>>>>> +#define RMI_ERROR_NOT_SUPPORTED        5
>>>>>> +#define RMI_ERROR_DEVICE        6
>>>>>> +#define RMI_ERROR_RTT_AUX        7
>>>>>> +#define RMI_ERROR_PSMMU_ST        8
>>>>>> +#define RMI_ERROR_DPT            9
>>>>>> +#define RMI_BUSY            10
>>>>>> +#define RMI_ERROR_GLOBAL        11
>>>>>> +#define RMI_ERROR_TRACKING        12
>>>>>> +#define RMI_INCOMPLETE            13
>>>>>> +#define RMI_BLOCKED            14
>>>>>> +#define RMI_ERROR_GPT            15
>>>>>> +#define RMI_ERROR_GRANULE        16
>>>>>> +
>>>>>> +#define RMI_CONTINUE_KEEP_GOING        0
>>>>>> +#define RMI_CONTINUE_STOP        1
>>>>>> +
>>>>>> +#define RMI_OP_MEM_REQ_NONE        0
>>>>>> +#define RMI_OP_MEM_REQ_DONATE        1
>>>>>> +#define RMI_OP_MEM_REQ_RECLAIM        2
>>>>>> +
>>>>>> +#define RMI_DONATE_SIZE_MASK        3UL
>>>>>> +#define RMI_DONATE_COUNT_MASK        GENMASK(15, 2)
>>>>>> +#define RMI_DONATE_CONTIG_MASK        BIT(16)
>>>>>> +#define RMI_DONATE_STATE_MASK        GENMASK(18, 17)
>>>>>> +
>>>>>> +#define RMI_DONATE_SIZE(req)        
>>>>>> FIELD_GET(RMI_DONATE_SIZE_MASK, req)
>>>>>> +#define RMI_DONATE_COUNT(req) FIELD_GET(RMI_DONATE_COUNT_MASK, req)
>>>>>> +#define RMI_DONATE_CONTIG(req) FIELD_GET(RMI_DONATE_CONTIG_MASK, 
>>>>>> req)
>>>>>> +#define RMI_DONATE_STATE(req) FIELD_GET(RMI_DONATE_STATE_MASK, req)
>>>>>> +
>>>>>
>>>>> As above, RMI_DONATE_{SIZE, COUNT, CONTIG, STATE}_MASK are used for 
>>>>> once in this
>>>>> header file. So their definitions can be dropped by modifying the 
>>>>> followup macros,
>>>>> as below. Some enhancements are also applicable: (a) Use 'BLOCK' to 
>>>>> indicate the
>>>>> unit encoded in the request. (b) The macros are put into order from 
>>>>> MSB to LSB.
>>>>>
>>>>> #define RMI_DONATE_STATE(req)        FIELD_GET(GENMASK(18, 17), req)
>>>>> #define RMI_DONATE_CONTIG(req)        FIELD_GET(GENMASK(16, 16), req)
>>>>> #define RMI_DONATE_BLOCK_COUNT(req)    FIELD_GET(GENMASK(15, 2), req)
>>>>> #define RMI_DONATE_BLOCK_SIZE(req)    FIELD_GET(GENMASK(1, 0), req)
>>>>
>>>> Same as above.
>>>>
>>>
>>> Please rename RMI_DONATE_{SIZE, COUNT} to RMI_DONATE_BLOCK_{SIZE, 
>>> COUNT} if possible.
>>
>> Sorry, forgot to add that, I have renamed RMI_{DONATE,ADDR_RANGE}_SIZE
>> => RMI_{*}_BLOCK_SIZE, left  the _COUNT as it is.
>>
> 
> It's ok to me. The point is to have "BLOCK", indicating it's related to
> a block. In rmi.c, 'unit' is also used and needs to be replaced with 
> 'block',
> consistent with the spec.

Yep, I could see why Steven went with "unit". But I have replaced them
with block everywhere to be consistent with the spec.

Cheers
Suzuki




More information about the linux-arm-kernel mailing list