linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bart Van Assche <bvanassche@acm.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org, Bart Van Assche <bvanassche@acm.org>,
	"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>,
	Peter Wang <peter.wang@mediatek.com>,
	Avri Altman <avri.altman@wdc.com>,
	Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>,
	"Bao D. Nguyen" <quic_nguyenb@quicinc.com>,
	Eric Biggers <ebiggers@google.com>,
	Can Guo <quic_cang@quicinc.com>,
	Minwoo Im <minwoo.im@samsung.com>
Subject: [PATCH 14/24] scsi: ufs: core: Cache the DMA buffer sizes
Date: Thu,  3 Apr 2025 14:17:58 -0700	[thread overview]
Message-ID: <20250403211937.2225615-15-bvanassche@acm.org> (raw)
In-Reply-To: <20250403211937.2225615-1-bvanassche@acm.org>

Prepare for supporting DMA buffer reallocation. Caching the DMA buffer
sizes is essential because a later patch will modify hba->nutrs between
the ufshcd_memory_alloc() and the ufshcd_memory_free() calls.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 62 ++++++++++++++++++++-------------------
 include/ufs/ufshcd.h      |  5 ++++
 2 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 4728cae130a7..26aa07712507 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3857,14 +3857,10 @@ static int ufshcd_get_ref_clk_gating_wait(struct ufs_hba *hba)
  */
 static int ufshcd_memory_alloc(struct ufs_hba *hba)
 {
-	size_t utmrdl_size, utrdl_size, ucdl_size;
-
 	/* Allocate memory for UTP command descriptors */
-	ucdl_size = ufshcd_get_ucd_size(hba) * hba->nutrs;
-	hba->ucdl_base_addr = dmam_alloc_coherent(hba->dev,
-						  ucdl_size,
-						  &hba->ucdl_dma_addr,
-						  GFP_KERNEL);
+	hba->ucdl_size = ufshcd_get_ucd_size(hba) * hba->nutrs;
+	hba->ucdl_base_addr = dmam_alloc_coherent(
+		hba->dev, hba->ucdl_size, &hba->ucdl_dma_addr, GFP_KERNEL);
 
 	/*
 	 * UFSHCI requires UTP command descriptor to be 128 byte aligned.
@@ -3880,11 +3876,9 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
 	 * Allocate memory for UTP Transfer descriptors
 	 * UFSHCI requires 1KB alignment of UTRD
 	 */
-	utrdl_size = (sizeof(struct utp_transfer_req_desc) * hba->nutrs);
-	hba->utrdl_base_addr = dmam_alloc_coherent(hba->dev,
-						   utrdl_size,
-						   &hba->utrdl_dma_addr,
-						   GFP_KERNEL);
+	hba->utrdl_size = sizeof(struct utp_transfer_req_desc) * hba->nutrs;
+	hba->utrdl_base_addr = dmam_alloc_coherent(
+		hba->dev, hba->utrdl_size, &hba->utrdl_dma_addr, GFP_KERNEL);
 	if (!hba->utrdl_base_addr ||
 	    WARN_ON(hba->utrdl_dma_addr & (SZ_1K - 1))) {
 		dev_err(hba->dev,
@@ -3896,7 +3890,7 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
 	 * Skip utmrdl allocation; it may have been
 	 * allocated during first pass and not released during
 	 * MCQ memory allocation.
-	 * See ufshcd_release_sdb_queue() and ufshcd_config_mcq()
+	 * See ufshcd_memory_free() and ufshcd_config_mcq()
 	 */
 	if (hba->utmrdl_base_addr)
 		goto skip_utmrdl;
@@ -3904,11 +3898,9 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
 	 * Allocate memory for UTP Task Management descriptors
 	 * UFSHCI requires 1KB alignment of UTMRD
 	 */
-	utmrdl_size = sizeof(struct utp_task_req_desc) * hba->nutmrs;
-	hba->utmrdl_base_addr = dmam_alloc_coherent(hba->dev,
-						    utmrdl_size,
-						    &hba->utmrdl_dma_addr,
-						    GFP_KERNEL);
+	hba->utmrdl_size = sizeof(struct utp_task_req_desc) * hba->nutmrs;
+	hba->utmrdl_base_addr = dmam_alloc_coherent(
+		hba->dev, hba->utmrdl_size, &hba->utmrdl_dma_addr, GFP_KERNEL);
 	if (!hba->utmrdl_base_addr ||
 	    WARN_ON(hba->utmrdl_dma_addr & (SZ_1K - 1))) {
 		dev_err(hba->dev,
@@ -8705,20 +8697,30 @@ static int ufshcd_add_lus(struct ufs_hba *hba)
 	return ret;
 }
 
-/* SDB - Single Doorbell */
-static void ufshcd_release_sdb_queue(struct ufs_hba *hba, int nutrs)
+/*
+ * Free the memory allocated by ufshcd_memory_alloc() except the utmrdl DMA
+ * memory.
+ */
+static void ufshcd_memory_free(struct ufs_hba *hba)
 {
-	size_t ucdl_size, utrdl_size;
-
-	ucdl_size = ufshcd_get_ucd_size(hba) * nutrs;
-	dmam_free_coherent(hba->dev, ucdl_size, hba->ucdl_base_addr,
-			   hba->ucdl_dma_addr);
+	if (hba->ucdl_base_addr) {
+		dmam_free_coherent(hba->dev, hba->ucdl_size,
+				   hba->ucdl_base_addr, hba->ucdl_dma_addr);
+		hba->ucdl_base_addr = NULL;
+		hba->ucdl_dma_addr = 0;
+	}
 
-	utrdl_size = sizeof(struct utp_transfer_req_desc) * nutrs;
-	dmam_free_coherent(hba->dev, utrdl_size, hba->utrdl_base_addr,
-			   hba->utrdl_dma_addr);
+	if (hba->utrdl_base_addr) {
+		dmam_free_coherent(hba->dev, hba->utrdl_size,
+				   hba->utrdl_base_addr, hba->utrdl_dma_addr);
+		hba->utrdl_base_addr = NULL;
+		hba->utrdl_dma_addr = 0;
+	}
 
-	devm_kfree(hba->dev, hba->lrb);
+	if (hba->lrb) {
+		devm_kfree(hba->dev, hba->lrb);
+		hba->lrb = NULL;
+	}
 }
 
 static int ufshcd_alloc_mcq(struct ufs_hba *hba)
@@ -8740,7 +8742,7 @@ static int ufshcd_alloc_mcq(struct ufs_hba *hba)
 	 * Number of supported tags in MCQ mode may be larger than SDB mode.
 	 */
 	if (hba->nutrs != old_nutrs) {
-		ufshcd_release_sdb_queue(hba, old_nutrs);
+		ufshcd_memory_free(hba);
 		ret = ufshcd_memory_alloc(hba);
 		if (ret)
 			goto err;
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index e928ed0265ff..656c9b668fcc 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -847,6 +847,9 @@ enum ufshcd_mcq_opr {
 /**
  * struct ufs_hba - per adapter private structure
  * @mmio_base: UFSHCI base register address
+ * @ucdl_size: Size of UFS Command Descriptor buffer
+ * @utrdl_size: Size of UTP Transfer Request Descriptor buffer
+ * @utmrdl_size: Size of UTP Task Management Descriptor buffer
  * @ucdl_base_addr: UFS Command Descriptor base address
  * @utrdl_base_addr: UTP Transfer Request Descriptor base address
  * @utmrdl_base_addr: UTP Task Management Descriptor base address
@@ -975,6 +978,8 @@ enum ufshcd_mcq_opr {
 struct ufs_hba {
 	void __iomem *mmio_base;
 
+	u32 ucdl_size, utrdl_size, utmrdl_size;
+
 	/* Virtual memory reference */
 	struct utp_transfer_cmd_desc *ucdl_base_addr;
 	struct utp_transfer_req_desc *utrdl_base_addr;

  parent reply	other threads:[~2025-04-03 21:22 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-03 21:17 [PATCH 00/24] Optimize the hot path in the UFS driver Bart Van Assche
2025-04-03 21:17 ` [PATCH 01/24] scsi: core: Make scsi_cmd_to_rq() accept const arguments Bart Van Assche
2025-04-04 10:39   ` John Garry
2025-04-04 16:23     ` Bart Van Assche
2025-08-18  6:03   ` Hannes Reinecke
2025-08-18 17:17     ` Bart Van Assche
2025-04-03 21:17 ` [PATCH 02/24] scsi: core: Make scsi_cmd_priv() " Bart Van Assche
2025-04-03 21:17 ` [PATCH 03/24] scsi: core: Use scsi_cmd_priv() instead of open-coding it Bart Van Assche
2025-04-03 21:17 ` [PATCH 04/24] scsi: core: Implement reserved command handling Bart Van Assche
2025-04-04 10:49   ` John Garry
2025-04-04 16:34     ` Bart Van Assche
2025-04-04 17:34       ` John Garry
2025-04-14 21:59         ` Bart Van Assche
2025-04-15 17:21         ` Bart Van Assche
2025-04-16  7:16           ` John Garry
2025-04-16  7:39             ` Hannes Reinecke
2025-04-16  8:23               ` John Garry
2025-04-17 21:25             ` Bart Van Assche
2025-04-22  6:54               ` Hannes Reinecke
2025-08-05 22:33               ` Bart Van Assche
2025-08-07 15:40                 ` Bart Van Assche
2025-04-16  7:33           ` Hannes Reinecke
2025-08-07 16:35             ` Bart Van Assche
2025-04-03 21:17 ` [PATCH 05/24] scsi: core: Introduce scsi_host_update_can_queue() Bart Van Assche
2025-04-03 21:17 ` [PATCH 06/24] scsi: ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument Bart Van Assche
2025-04-09  5:34   ` Avri Altman
2025-04-14 12:47   ` Peter Wang (王信友)
2025-04-03 21:17 ` [PATCH 07/24] scsi: ufs: core: Only call ufshcd_add_command_trace() for SCSI commands Bart Van Assche
2025-04-09  6:24   ` Avri Altman
2025-04-14 12:47   ` Peter Wang (王信友)
2025-04-03 21:17 ` [PATCH 08/24] scsi: ufs: core: Change the type of one ufshcd_add_command_trace() argument Bart Van Assche
2025-04-09  6:32   ` Avri Altman
2025-04-09 16:37     ` Bart Van Assche
2025-04-14 12:47   ` Peter Wang (王信友)
2025-04-03 21:17 ` [PATCH 09/24] scsi: ufs: core: Change the type of one ufshcd_send_command() argument Bart Van Assche
2025-04-09  6:34   ` Avri Altman
2025-04-14 12:48   ` Peter Wang (王信友)
2025-04-03 21:17 ` [PATCH 10/24] scsi: ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands Bart Van Assche
2025-04-15  7:34   ` Peter Wang (王信友)
2025-04-03 21:17 ` [PATCH 11/24] scsi: ufs: core: Change the monitor function argument types Bart Van Assche
2025-04-15  7:37   ` Peter Wang (王信友)
2025-04-15 20:10     ` Bart Van Assche
2025-04-03 21:17 ` [PATCH 12/24] scsi: ufs: core: Rework ufshcd_mcq_compl_pending_transfer() Bart Van Assche
2025-04-15  8:00   ` Peter Wang (王信友)
2025-04-15 20:22     ` Bart Van Assche
2025-04-17 12:39       ` Peter Wang (王信友)
2025-04-17 21:33         ` Bart Van Assche
2025-04-22 13:07           ` Peter Wang (王信友)
2025-04-03 21:17 ` [PATCH 13/24] scsi: ufs: core: Rework ufshcd_eh_device_reset_handler() Bart Van Assche
2025-04-03 21:17 ` Bart Van Assche [this message]
2025-04-03 21:17 ` [PATCH 15/24] scsi: ufs: core: Add an argument to ufshcd_mcq_decide_queue_depth() Bart Van Assche
2025-04-03 21:18 ` [PATCH 16/24] scsi: ufs: core: Add an argument to ufshcd_alloc_mcq() Bart Van Assche
2025-04-03 21:18 ` [PATCH 17/24] scsi: ufs: core: Call ufshcd_mcq_init() once Bart Van Assche
2025-04-09  6:52   ` Avri Altman
2025-04-09 16:42     ` Bart Van Assche
2025-04-03 21:18 ` [PATCH 18/24] scsi: ufs: core: Allocate the SCSI host earlier Bart Van Assche
2025-04-03 21:18 ` [PATCH 19/24] scsi: ufs: core: Call ufshcd_init_lrb() later Bart Van Assche
2025-04-03 21:18 ` [PATCH 20/24] scsi: ufs: core: Use hba->reserved_slot Bart Van Assche
2025-04-03 21:18 ` [PATCH 21/24] scsi: ufs: core: Allocate the reserved slot as a reserved request Bart Van Assche
2025-04-03 21:18 ` [PATCH 22/24] scsi: ufs: core: Do not clear driver-private command data Bart Van Assche
2025-04-03 21:18 ` [PATCH 23/24] scsi: ufs: core: Optimize the hot path Bart Van Assche
2025-04-03 21:18 ` [PATCH 24/24] scsi: ufs: core: Remove the ufshcd_lrb task_tag member Bart Van Assche
2025-04-04 10:15 ` [PATCH 00/24] Optimize the hot path in the UFS driver John Garry
2025-04-04 17:05   ` Bart Van Assche
2025-04-05 12:03     ` Avri Altman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250403211937.2225615-15-bvanassche@acm.org \
    --to=bvanassche@acm.org \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=avri.altman@wdc.com \
    --cc=ebiggers@google.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=manivannan.sadhasivam@linaro.org \
    --cc=martin.petersen@oracle.com \
    --cc=minwoo.im@samsung.com \
    --cc=peter.wang@mediatek.com \
    --cc=quic_cang@quicinc.com \
    --cc=quic_nguyenb@quicinc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).