Lines Matching +full:ufs +full:- +full:2
1 // SPDX-License-Identifier: GPL-2.0
3 * UFS OP-TEE based RPMB Driver
20 #include <ufs/ufshcd.h>
22 #include "ufshcd-priv.h"
24 #define UFS_RPMB_SEC_PROTOCOL 0xEC /* JEDEC UFS application */
25 #define UFS_RPMB_SEC_PROTOCOL_ID 0x01 /* JEDEC UFS RPMB protocol ID, CDB byte3 */
31 /* UFS RPMB device structure */
42 struct scsi_device *sdev = hba->ufs_rpmb_wlun; in ufs_sec_submit()
47 put_unaligned_be16(spsp, &cdb[2]); in ufs_sec_submit()
54 /* UFS RPMB route frames implementation */
67 return -ENODEV; in ufs_rpmb_route_frames()
70 hba = ufs_rpmb->hba; in ufs_rpmb_route_frames()
72 req_type = be16_to_cpu(frm_out->req_resp); in ufs_rpmb_route_frames()
77 return -EINVAL; in ufs_rpmb_route_frames()
81 return -EINVAL; in ufs_rpmb_route_frames()
86 return -EINVAL; in ufs_rpmb_route_frames()
90 return -EINVAL; in ufs_rpmb_route_frames()
95 return -EINVAL; in ufs_rpmb_route_frames()
98 protocol_id = ufs_rpmb->region_id << 8 | UFS_RPMB_SEC_PROTOCOL_ID; in ufs_rpmb_route_frames()
110 frm_resp->req_resp = cpu_to_be16(RPMB_RESULT_READ); in ufs_rpmb_route_frames()
131 rpmb_dev_unregister(ufs_rpmb->rdev); in ufs_rpmb_device_release()
134 /* UFS RPMB device registration */
144 if (!hba->ufs_rpmb_wlun || hba->dev_info.b_advanced_rpmb_en) { in ufs_rpmb_probe()
145 dev_info(hba->dev, "Skip OP-TEE RPMB registration\n"); in ufs_rpmb_probe()
146 return -ENODEV; in ufs_rpmb_probe()
150 if (!hba->dev_info.device_id) { in ufs_rpmb_probe()
151 dev_err(hba->dev, "UFS Device ID not available\n"); in ufs_rpmb_probe()
152 return -EINVAL; in ufs_rpmb_probe()
155 INIT_LIST_HEAD(&hba->rpmbs); in ufs_rpmb_probe()
160 .reliable_wr_count = hba->dev_info.rpmb_io_size, in ufs_rpmb_probe()
163 for (region = 0; region < ARRAY_SIZE(hba->dev_info.rpmb_region_size); region++) { in ufs_rpmb_probe()
164 cap = hba->dev_info.rpmb_region_size[region]; in ufs_rpmb_probe()
168 ufs_rpmb = devm_kzalloc(hba->dev, sizeof(*ufs_rpmb), GFP_KERNEL); in ufs_rpmb_probe()
170 ret = -ENOMEM; in ufs_rpmb_probe()
174 ufs_rpmb->hba = hba; in ufs_rpmb_probe()
175 ufs_rpmb->dev.parent = &hba->ufs_rpmb_wlun->sdev_gendev; in ufs_rpmb_probe()
176 ufs_rpmb->dev.bus = &ufs_rpmb_bus_type; in ufs_rpmb_probe()
177 ufs_rpmb->dev.release = ufs_rpmb_device_release; in ufs_rpmb_probe()
178 dev_set_name(&ufs_rpmb->dev, "ufs_rpmb%d", region); in ufs_rpmb_probe()
181 dev_set_drvdata(&ufs_rpmb->dev, ufs_rpmb); in ufs_rpmb_probe()
183 ret = device_register(&ufs_rpmb->dev); in ufs_rpmb_probe()
185 dev_err(hba->dev, "Failed to register UFS RPMB device %d\n", region); in ufs_rpmb_probe()
186 put_device(&ufs_rpmb->dev); in ufs_rpmb_probe()
191 cid = kasprintf(GFP_KERNEL, "%s-R%d", hba->dev_info.device_id, region); in ufs_rpmb_probe()
193 device_unregister(&ufs_rpmb->dev); in ufs_rpmb_probe()
194 ret = -ENOMEM; in ufs_rpmb_probe()
203 rdev = rpmb_dev_register(&ufs_rpmb->dev, &descr); in ufs_rpmb_probe()
205 dev_err(hba->dev, "Failed to register UFS RPMB device.\n"); in ufs_rpmb_probe()
206 device_unregister(&ufs_rpmb->dev); in ufs_rpmb_probe()
214 ufs_rpmb->rdev = rdev; in ufs_rpmb_probe()
215 ufs_rpmb->region_id = region; in ufs_rpmb_probe()
217 list_add_tail(&ufs_rpmb->node, &hba->rpmbs); in ufs_rpmb_probe()
219 dev_info(hba->dev, "UFS RPMB region %d registered (capacity=%u)\n", region, cap); in ufs_rpmb_probe()
225 list_for_each_entry_safe(it, tmp, &hba->rpmbs, node) { in ufs_rpmb_probe()
226 list_del(&it->node); in ufs_rpmb_probe()
227 device_unregister(&it->dev); in ufs_rpmb_probe()
233 /* UFS RPMB remove handler */
238 if (list_empty(&hba->rpmbs)) in ufs_rpmb_remove()
242 list_for_each_entry_safe(ufs_rpmb, tmp, &hba->rpmbs, node) { in ufs_rpmb_remove()
243 dev_info(hba->dev, "Removing UFS RPMB region %d\n", ufs_rpmb->region_id); in ufs_rpmb_remove()
245 list_del(&ufs_rpmb->node); in ufs_rpmb_remove()
247 device_unregister(&ufs_rpmb->dev); in ufs_rpmb_remove()
250 dev_info(hba->dev, "All UFS RPMB devices unregistered\n"); in ufs_rpmb_remove()
254 MODULE_DESCRIPTION("OP-TEE UFS RPMB driver");