2020-03-16 03:45:07

by Stanley Chu

[permalink] [raw]
Subject: [PATCH v5 0/8] scsi: ufs: some cleanups and make the delay for host enabling customizable

Hi,

This patchset applies some driver cleanups and performance improvement
in ufs host drivers by making the delay for host enabling customizable
according to vendors' requirements.

v4 -> v5
- Collect review tags in v4
- Fix patch #7: Fix typo "initializatoin" in title

v3 -> v4
- Collect review tags in v2
- In patch #8, fix incorrect condition of customized delay for host enabling

v2 -> v3
- Remove /arch/arm64/configs/defconfig chnage because it is for local test only

v1 -> v2
- Add patch #1 "scsi: ufs: fix uninitialized tx_lanes in ufshcd_disable_tx_lcc"
- Remove struct ufs_init_prefetch in patch #2 "scsi: ufs: remove init_prefetch_data in struct ufs_hba"
- Introduce common delay function in patch #4
- Replace all delay places by common delay function in ufs-mediatek in patch #5
- Use common delay function instead for host enabling delay in patch #6
- Add patch #7 "scsi: ufs: make HCE polling more compact to improve initializatoin latency"
- In patch #8, customize the delay in ufs_mtk_hce_enable_notify callback instead of ufs_mtk_init (Avri)

Stanley Chu (8):
scsi: ufs: fix uninitialized tx_lanes in ufshcd_disable_tx_lcc()
scsi: ufs: remove init_prefetch_data in struct ufs_hba
scsi: ufs: use an enum for host capabilities
scsi: ufs: introduce common delay function
scsi: ufs-mediatek: replace all delay places by common delay function
scsi: ufs: allow customized delay for host enabling
scsi: ufs: make HCE polling more compact to improve initialization
latency
scsi: ufs-mediatek: customize the delay for host enabling

drivers/scsi/ufs/ufs-mediatek.c | 64 ++++++++++++++++-----------
drivers/scsi/ufs/ufs-mediatek.h | 1 +
drivers/scsi/ufs/ufshcd.c | 47 +++++++++++---------
drivers/scsi/ufs/ufshcd.h | 78 ++++++++++++++++-----------------
4 files changed, 106 insertions(+), 84 deletions(-)

--
2.18.0


2020-03-16 03:48:17

by Stanley Chu

[permalink] [raw]
Subject: [PATCH v5 2/8] scsi: ufs: remove init_prefetch_data in struct ufs_hba

Struct init_prefetch_data currently is used privately in
ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.

Signed-off-by: Stanley Chu <[email protected]>
Reviewed-by: Asutosh Das <[email protected]>
Reviewed-by: Avri Altman <[email protected]>
---
drivers/scsi/ufs/ufshcd.c | 15 ++++++---------
drivers/scsi/ufs/ufshcd.h | 11 -----------
2 files changed, 6 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 314e808b0d4e..b4988b9ee36c 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6501,6 +6501,7 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba)
{
int ret;
int buff_len = hba->desc_size.pwr_desc;
+ u32 icc_level;
u8 *desc_buf;

desc_buf = kmalloc(buff_len, GFP_KERNEL);
@@ -6516,21 +6517,17 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba)
goto out;
}

- hba->init_prefetch_data.icc_level =
- ufshcd_find_max_sup_active_icc_level(hba,
- desc_buf, buff_len);
- dev_dbg(hba->dev, "%s: setting icc_level 0x%x",
- __func__, hba->init_prefetch_data.icc_level);
+ icc_level =
+ ufshcd_find_max_sup_active_icc_level(hba, desc_buf, buff_len);
+ dev_dbg(hba->dev, "%s: setting icc_level 0x%x", __func__, icc_level);

ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
- QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0,
- &hba->init_prefetch_data.icc_level);
+ QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0, &icc_level);

if (ret)
dev_err(hba->dev,
"%s: Failed configuring bActiveICCLevel = %d ret = %d",
- __func__, hba->init_prefetch_data.icc_level , ret);
-
+ __func__, icc_level, ret);
out:
kfree(desc_buf);
}
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 5c10777154fc..5cf79d2319a6 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -402,15 +402,6 @@ struct ufs_clk_scaling {
bool is_suspended;
};

-/**
- * struct ufs_init_prefetch - contains data that is pre-fetched once during
- * initialization
- * @icc_level: icc level which was read during initialization
- */
-struct ufs_init_prefetch {
- u32 icc_level;
-};
-
#define UFS_ERR_REG_HIST_LENGTH 8
/**
* struct ufs_err_reg_hist - keeps history of errors
@@ -541,7 +532,6 @@ enum ufshcd_quirks {
* @intr_mask: Interrupt Mask Bits
* @ee_ctrl_mask: Exception event control mask
* @is_powered: flag to check if HBA is powered
- * @init_prefetch_data: data pre-fetched during initialization
* @eh_work: Worker to handle UFS errors that require s/w attention
* @eeh_work: Worker to handle exception events
* @errors: HBA errors
@@ -627,7 +617,6 @@ struct ufs_hba {
u32 intr_mask;
u16 ee_ctrl_mask;
bool is_powered;
- struct ufs_init_prefetch init_prefetch_data;

/* Work Queues */
struct work_struct eh_work;
--
2.18.0

2020-03-16 06:29:14

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH v5 2/8] scsi: ufs: remove init_prefetch_data in struct ufs_hba

On 2020-03-16 11:42, Stanley Chu wrote:
> Struct init_prefetch_data currently is used privately in
> ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.
>
> Signed-off-by: Stanley Chu <[email protected]>
> Reviewed-by: Asutosh Das <[email protected]>
> Reviewed-by: Avri Altman <[email protected]>

Hi Stanley,

Earlier, I have one similar patch for this, but it does more than this.
Please check the mail I just sent.

Thanks,
Can Guo.

> ---
> drivers/scsi/ufs/ufshcd.c | 15 ++++++---------
> drivers/scsi/ufs/ufshcd.h | 11 -----------
> 2 files changed, 6 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 314e808b0d4e..b4988b9ee36c 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -6501,6 +6501,7 @@ static void ufshcd_init_icc_levels(struct ufs_hba
> *hba)
> {
> int ret;
> int buff_len = hba->desc_size.pwr_desc;
> + u32 icc_level;
> u8 *desc_buf;
>
> desc_buf = kmalloc(buff_len, GFP_KERNEL);
> @@ -6516,21 +6517,17 @@ static void ufshcd_init_icc_levels(struct
> ufs_hba *hba)
> goto out;
> }
>
> - hba->init_prefetch_data.icc_level =
> - ufshcd_find_max_sup_active_icc_level(hba,
> - desc_buf, buff_len);
> - dev_dbg(hba->dev, "%s: setting icc_level 0x%x",
> - __func__, hba->init_prefetch_data.icc_level);
> + icc_level =
> + ufshcd_find_max_sup_active_icc_level(hba, desc_buf, buff_len);
> + dev_dbg(hba->dev, "%s: setting icc_level 0x%x", __func__, icc_level);
>
> ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
> - QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0,
> - &hba->init_prefetch_data.icc_level);
> + QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0, &icc_level);
>
> if (ret)
> dev_err(hba->dev,
> "%s: Failed configuring bActiveICCLevel = %d ret = %d",
> - __func__, hba->init_prefetch_data.icc_level , ret);
> -
> + __func__, icc_level, ret);
> out:
> kfree(desc_buf);
> }
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> index 5c10777154fc..5cf79d2319a6 100644
> --- a/drivers/scsi/ufs/ufshcd.h
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -402,15 +402,6 @@ struct ufs_clk_scaling {
> bool is_suspended;
> };
>
> -/**
> - * struct ufs_init_prefetch - contains data that is pre-fetched once
> during
> - * initialization
> - * @icc_level: icc level which was read during initialization
> - */
> -struct ufs_init_prefetch {
> - u32 icc_level;
> -};
> -
> #define UFS_ERR_REG_HIST_LENGTH 8
> /**
> * struct ufs_err_reg_hist - keeps history of errors
> @@ -541,7 +532,6 @@ enum ufshcd_quirks {
> * @intr_mask: Interrupt Mask Bits
> * @ee_ctrl_mask: Exception event control mask
> * @is_powered: flag to check if HBA is powered
> - * @init_prefetch_data: data pre-fetched during initialization
> * @eh_work: Worker to handle UFS errors that require s/w attention
> * @eeh_work: Worker to handle exception events
> * @errors: HBA errors
> @@ -627,7 +617,6 @@ struct ufs_hba {
> u32 intr_mask;
> u16 ee_ctrl_mask;
> bool is_powered;
> - struct ufs_init_prefetch init_prefetch_data;
>
> /* Work Queues */
> struct work_struct eh_work;

2020-03-16 07:09:59

by Stanley Chu

[permalink] [raw]
Subject: Re: [PATCH v5 2/8] scsi: ufs: remove init_prefetch_data in struct ufs_hba

Hi Can,

On Mon, 2020-03-16 at 14:25 +0800, Can Guo wrote:
> On 2020-03-16 11:42, Stanley Chu wrote:
> > Struct init_prefetch_data currently is used privately in
> > ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.
> >
> > Signed-off-by: Stanley Chu <[email protected]>
> > Reviewed-by: Asutosh Das <[email protected]>
> > Reviewed-by: Avri Altman <[email protected]>
>
> Hi Stanley,
>
> Earlier, I have one similar patch for this, but it does more than this.
> Please check the mail I just sent.
>
> Thanks,
> Can Guo.

OK! Thanks to remind me this. Then I can drop this cleanup patch #2 in
its series to not conflict with your proposed one.

Thanks,
Stanley Chu


2020-03-16 07:10:48

by Can Guo

[permalink] [raw]
Subject: Re: [PATCH v5 2/8] scsi: ufs: remove init_prefetch_data in struct ufs_hba

Hi Stanley,

On 2020-03-16 15:08, Stanley Chu wrote:
> Hi Can,
>
> On Mon, 2020-03-16 at 14:25 +0800, Can Guo wrote:
>> On 2020-03-16 11:42, Stanley Chu wrote:
>> > Struct init_prefetch_data currently is used privately in
>> > ufshcd_init_icc_levels(), thus it can be removed from struct ufs_hba.
>> >
>> > Signed-off-by: Stanley Chu <[email protected]>
>> > Reviewed-by: Asutosh Das <[email protected]>
>> > Reviewed-by: Avri Altman <[email protected]>
>>
>> Hi Stanley,
>>
>> Earlier, I have one similar patch for this, but it does more than
>> this.
>> Please check the mail I just sent.
>>
>> Thanks,
>> Can Guo.
>
> OK! Thanks to remind me this. Then I can drop this cleanup patch #2 in
> its series to not conflict with your proposed one.
>
> Thanks,
> Stanley Chu

Sure, thank you for your quick response.

Best regards,
Can Guo