On 27/08/2026 18:07, Linlin Zhang wrote:
> From: linlzhan <[email protected]>
>
> On Qualcomm platforms where UFS inline encryption is shared between
> the host and guest VMs, the ICE hardware keyslots must be partitioned
> so that each VM operates only within its own physical slot range.
> Without this, the host's blk_crypto_profile would manage all hardware
> slots, conflicting with slots already allocated to guests.
>
> Add ufs_qcom_ice_parse_slot_table() to read the qcom,ice-keyslot-map
> device-tree node. The function parses all child entries and validates
> that no entry's slot range or the combined total exceeds the hardware
> slot count from REG_UFS_CCAP. The first child entry is taken as the
> host's own reservation; its slot count and offset are returned to the
> caller.
>
> In ufs_qcom_ice_init(), use the parsed host reservation to initialize
> the blk_crypto_profile with only the host's slot count rather than the
> full hardware range. Set profile->slot_offset so that
> blk_crypto_keyslot_index() returns the correct physical ICE slot
> number when programming hardware. If no qcom,ice-keyslot-map node is
> present, the existing behaviour (profile manages all slots) is
> preserved.
>
> Note: This patch is submitted for visibility. The ufs-qcom driver
> gets its max_slots and slot_offset based on the the current
> DT-based keyslot mechanis. we are aware this may need to be replaced
> by a TZ SCM interface, submit it RFC for design discussion.
>
> Signed-off-by: linlzhan <[email protected]>
> ---
> drivers/ufs/host/ufs-qcom.c | 91 ++++++++++++++++++++++++++++++++++++-
> 1 file changed, 90 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 62396212a0a7..0611ab50f4cc 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -163,6 +163,74 @@ static inline void ufs_qcom_ice_enable(struct
> ufs_qcom_host *host)
> qcom_ice_enable(host->ice);
> }
>
> +/**
> + * ufs_qcom_ice_parse_slot_table() - parse qcom,ice-keyslot-map DT node
> + * @dev: UFS controller device
> + * @hw_max_slots: total physical ICE keyslots reported by REG_UFS_CCAP
> + * @num_slots: receives host max_ice_slots (0 = no partitioning)
> + * @slot_offset: receives host ice-slot-offset
> + *
> + * Parses the qcom,ice-keyslot-map device-tree node. The first child entry
> + * is the host's own reservation; subsequent children are guest reservations.
> + * Validates that no entry's range exceeds @hw_max_slots and that the sum of
> + * all entries does not exceed @hw_max_slots.
> + *
> + * If no qcom,ice-keyslot-map phandle is present, sets @num_slots to 0 and
> + * returns 0. Returns -EINVAL if any entry or the total exceeds
> @hw_max_slots.
> + */
> +static int ufs_qcom_ice_parse_slot_table(struct device *dev,
> + unsigned int hw_max_slots,
> + unsigned int *num_slots,
> + unsigned int *slot_offset)
> +{
> + struct device_node *slots_np, *child;
> + unsigned int total_slots = 0;
> + bool first = true;
> + int ret = 0;
> +
> + *num_slots = 0;
> + *slot_offset = 0;
> +
> + slots_np = of_parse_phandle(dev->of_node, "qcom,ice-keyslot-map", 0);
No
> + if (!slots_np)
> + return 0;
> +
> + for_each_child_of_node(slots_np, child) {
> + u32 off, max;
> +
> + if (of_property_read_u32(child, "qcom,ice-slot-offset", &off) ||
> + of_property_read_u32(child, "qcom,max-ice-slots", &max))
No, there is no such ABI.
Best regards,
Krzysztof