]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
scsi: ufs: core: Fix RPMB region size detection for UFS 2.2
authorAlexey Charkov <alchark@flipper.net>
Mon, 9 Feb 2026 15:17:34 +0000 (19:17 +0400)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 18 Feb 2026 02:16:04 +0000 (21:16 -0500)
Older UFS spec devices (2.2 and earlier) do not expose per-region RPMB
sizes, as only one RPMB region is supported. In such cases, the size of the
single RPMB region can be deduced from the Logical Block Count and Logical
Block Size fields in the RPMB Unit Descriptor.

Add a fallback mechanism to calculate the RPMB region size from these
fields if the device implements an older spec, so that the RPMB driver can
work with such devices - otherwise it silently skips the whole RPMB.

        Section 14.1.4.6 (RPMB Unit Descriptor)

Link: https://www.jedec.org/system/files/docs/JESD220C-2_2.pdf
Cc: stable@vger.kernel.org
Fixes: b06b8c421485 ("scsi: ufs: core: Add OP-TEE based RPMB driver for UFS devices")
Reviewed-by: Bean Huo <beanhuo@micron.com>
Signed-off-by: Alexey Charkov <alchark@flipper.net>
Link: https://patch.msgid.link/20260209-ufs-rpmb-v3-1-b1804e71bd38@flipper.net
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index 8349fe2090db6c998289970ef27a41d9436aa6da..12f1bdc705877a985a26592ae9afc1d32da4b8a7 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/pm_opp.h>
 #include <linux/regulator/consumer.h>
 #include <linux/sched/clock.h>
+#include <linux/sizes.h>
 #include <linux/iopoll.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_dbg.h>
@@ -5248,6 +5249,25 @@ static void ufshcd_lu_init(struct ufs_hba *hba, struct scsi_device *sdev)
                hba->dev_info.rpmb_region_size[1] = desc_buf[RPMB_UNIT_DESC_PARAM_REGION1_SIZE];
                hba->dev_info.rpmb_region_size[2] = desc_buf[RPMB_UNIT_DESC_PARAM_REGION2_SIZE];
                hba->dev_info.rpmb_region_size[3] = desc_buf[RPMB_UNIT_DESC_PARAM_REGION3_SIZE];
+
+               if (hba->dev_info.wspecversion <= 0x0220) {
+                       /*
+                        * These older spec chips have only one RPMB region,
+                        * sized between 128 kB minimum and 16 MB maximum.
+                        * No per region size fields are provided (respective
+                        * REGIONX_SIZE fields always contain zeros), so get
+                        * it from the logical block count and size fields for
+                        * compatibility
+                        *
+                        * (See JESD220C-2_2 Section 14.1.4.6
+                        * RPMB Unit Descriptor,* offset 13h, 4 bytes)
+                        */
+                       hba->dev_info.rpmb_region_size[0] =
+                               (get_unaligned_be64(desc_buf
+                                       + RPMB_UNIT_DESC_PARAM_LOGICAL_BLK_COUNT)
+                               << desc_buf[RPMB_UNIT_DESC_PARAM_LOGICAL_BLK_SIZE])
+                               / SZ_128K;
+               }
        }