From 9d6d1a94c99c3a0e89792c5cc118a1d8c8a9dbb7 Mon Sep 17 00:00:00 2001 From: anans Date: Mon, 1 Aug 2022 03:11:28 +0000 Subject: [PATCH] fix(ufs): init utrlba/utrlbau with desc_base Initialising these registers with header address will not work when get_empty_slot returns anything other than 0 because these registers should point to the starting of transfer request list instead of the current descriptor Change-Id: I60b3b59e2be6e2635a59b14dd1f11d93b9d95a1f Signed-off-by: anans --- drivers/ufs/ufs.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/drivers/ufs/ufs.c b/drivers/ufs/ufs.c index 644b670d2..754d17344 100644 --- a/drivers/ufs/ufs.c +++ b/drivers/ufs/ufs.c @@ -299,12 +299,6 @@ static int ufs_prepare_cmd(utp_utrd_t *utrd, uint8_t op, uint8_t lun, unsigned int lba_cnt; int prdt_size; - - mmio_write_32(ufs_params.reg_base + UTRLBA, - utrd->header & UINT32_MAX); - mmio_write_32(ufs_params.reg_base + UTRLBAU, - (utrd->header >> 32) & UINT32_MAX); - hd = (utrd_header_t *)utrd->header; upiu = (cmd_upiu_t *)utrd->upiu; @@ -402,12 +396,6 @@ static int ufs_prepare_query(utp_utrd_t *utrd, uint8_t op, uint8_t idn, hd = (utrd_header_t *)utrd->header; query_upiu = (query_upiu_t *)utrd->upiu; - mmio_write_32(ufs_params.reg_base + UTRLBA, - utrd->header & UINT32_MAX); - mmio_write_32(ufs_params.reg_base + UTRLBAU, - (utrd->header >> 32) & UINT32_MAX); - - hd->i = 1; hd->ct = CT_UFS_STORAGE; hd->ocs = OCS_MASK; @@ -454,11 +442,6 @@ static void ufs_prepare_nop_out(utp_utrd_t *utrd) utrd_header_t *hd; nop_out_upiu_t *nop_out; - mmio_write_32(ufs_params.reg_base + UTRLBA, - utrd->header & UINT32_MAX); - mmio_write_32(ufs_params.reg_base + UTRLBAU, - (utrd->header >> 32) & UINT32_MAX); - hd = (utrd_header_t *)utrd->header; nop_out = (nop_out_upiu_t *)utrd->upiu; @@ -795,6 +778,11 @@ static void ufs_enum(void) unsigned int blk_num, blk_size; int i, result; + mmio_write_32(ufs_params.reg_base + UTRLBA, + ufs_params.desc_base & UINT32_MAX); + mmio_write_32(ufs_params.reg_base + UTRLBAU, + (ufs_params.desc_base >> 32) & UINT32_MAX); + ufs_verify_init(); ufs_verify_ready(); @@ -856,6 +844,11 @@ int ufs_init(const ufs_ops_t *ops, ufs_params_t *params) if (ufs_params.flags & UFS_FLAGS_SKIPINIT) { + mmio_write_32(ufs_params.reg_base + UTRLBA, + ufs_params.desc_base & UINT32_MAX); + mmio_write_32(ufs_params.reg_base + UTRLBAU, + (ufs_params.desc_base >> 32) & UINT32_MAX); + result = ufshc_dme_get(0x1571, 0, &data); assert(result == 0); result = ufshc_dme_get(0x41, 0, &data); -- 2.39.5