Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1211065 > unrolled thread
| Started by | Alim Akhtar <alim.akhtar@samsung.com> |
|---|---|
| First post | 2015-08-21 11:40 +0200 |
| Last post | 2015-08-28 11:50 +0200 |
| Articles | 4 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH 00/10] exynos-ufs: add support for Exynos Alim Akhtar <alim.akhtar@samsung.com> - 2015-08-21 11:40 +0200
[PATCH 02/10] scsi: ufs: add quirk to contain unconformable utrd field Alim Akhtar <alim.akhtar@samsung.com> - 2015-08-21 11:50 +0200
Re: [PATCH 02/10] scsi: ufs: add quirk to contain unconformable utrd field amit daniel kachhap <amit.daniel@samsung.com> - 2015-08-26 08:20 +0200
Re: [PATCH 02/10] scsi: ufs: add quirk to contain unconformable utrd field Alim Akhtar <alim.akhtar@samsung.com> - 2015-08-28 11:50 +0200
| From | Alim Akhtar <alim.akhtar@samsung.com> |
|---|---|
| Date | 2015-08-21 11:40 +0200 |
| Subject | [PATCH 00/10] exynos-ufs: add support for Exynos |
| Message-ID | <pZQXL-86r-7@gated-at.bofh.it> |
This patch-set introduces UFS (Universal Flash Storage) host support for Samsung Exynos SoC. Mostly, it consists of UFS PHY and host specific driver. And it also contains some quirks handling for Exynos. Seungwon Jeon (10): phy: exynos-ufs: add UFS PHY driver for EXYNOS SoC scsi: ufs: add quirk to contain unconformable utrd field scsi: ufs: add quirk to fix mishandling utrlclr/utmrlclr scsi: ufs: add quirk not to allow reset of interrupt aggregation scsi: ufs: add quirk to enable host controller without hce scsi: ufs: add specific callback for nexus type scsi: ufs: add add specific callback for hibern8 scsi: ufs: make ufshcd_config_pwr_mode of non-static func scsi: ufs: return value of pwr_change_notify scsi: ufs-exynos: add UFS host support for Exynos SoCs .../devicetree/bindings/phy/samsung-phy.txt | 22 + .../devicetree/bindings/ufs/ufs-exynos.txt | 92 ++ drivers/phy/Kconfig | 7 + drivers/phy/Makefile | 1 + drivers/phy/phy-exynos-ufs.c | 277 +++++ drivers/phy/phy-exynos-ufs.h | 73 ++ drivers/phy/phy-exynos7-ufs.h | 89 ++ drivers/scsi/ufs/Kconfig | 12 + drivers/scsi/ufs/Makefile | 1 + drivers/scsi/ufs/ufs-exynos-hw.c | 147 +++ drivers/scsi/ufs/ufs-exynos-hw.h | 43 + drivers/scsi/ufs/ufs-exynos.c | 1175 ++++++++++++++++++++ drivers/scsi/ufs/ufs-exynos.h | 463 ++++++++ drivers/scsi/ufs/ufshcd.c | 196 +++- drivers/scsi/ufs/ufshcd.h | 34 + drivers/scsi/ufs/ufshci.h | 26 +- drivers/scsi/ufs/unipro.h | 47 + include/linux/phy/phy-exynos-ufs.h | 107 ++ 18 files changed, 2785 insertions(+), 27 deletions(-) create mode 100644 Documentation/devicetree/bindings/ufs/ufs-exynos.txt create mode 100644 drivers/phy/phy-exynos-ufs.c create mode 100644 drivers/phy/phy-exynos-ufs.h create mode 100644 drivers/phy/phy-exynos7-ufs.h create mode 100644 drivers/scsi/ufs/ufs-exynos-hw.c create mode 100644 drivers/scsi/ufs/ufs-exynos-hw.h create mode 100644 drivers/scsi/ufs/ufs-exynos.c create mode 100644 drivers/scsi/ufs/ufs-exynos.h create mode 100644 include/linux/phy/phy-exynos-ufs.h -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Alim Akhtar <alim.akhtar@samsung.com> |
|---|---|
| Date | 2015-08-21 11:50 +0200 |
| Subject | [PATCH 02/10] scsi: ufs: add quirk to contain unconformable utrd field |
| Message-ID | <pZR7s-8hE-17@gated-at.bofh.it> |
| In reply to | #1211065 |
From: Seungwon Jeon <tgih.jun@samsung.com>
UTRD(UTP Transfer Request Descriptor)'s field such as offset/length,
especially response's has DWORD expression. This quirk can be specified
for host controller not to conform standard.
Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
---
drivers/scsi/ufs/ufshcd.c | 28 +++++++++++++++++++++-------
drivers/scsi/ufs/ufshcd.h | 7 +++++++
2 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index b0ade73..f882bf0 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1009,7 +1009,7 @@ ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
*
* Returns 0 in case of success, non-zero value in case of failure
*/
-static int ufshcd_map_sg(struct ufshcd_lrb *lrbp)
+static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
{
struct ufshcd_sg_entry *prd_table;
struct scatterlist *sg;
@@ -1023,8 +1023,13 @@ static int ufshcd_map_sg(struct ufshcd_lrb *lrbp)
return sg_segments;
if (sg_segments) {
- lrbp->utr_descriptor_ptr->prd_table_length =
- cpu_to_le16((u16) (sg_segments));
+ if (hba->quirks & UFSHCI_QUIRK_BROKEN_UTRD)
+ lrbp->utr_descriptor_ptr->prd_table_length =
+ cpu_to_le16((u16)(sg_segments *
+ sizeof(struct ufshcd_sg_entry)));
+ else
+ lrbp->utr_descriptor_ptr->prd_table_length =
+ cpu_to_le16((u16) (sg_segments));
prd_table = (struct ufshcd_sg_entry *)lrbp->ucd_prdt_ptr;
@@ -1347,7 +1352,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
/* form UPIU before issuing the command */
ufshcd_compose_upiu(hba, lrbp);
- err = ufshcd_map_sg(lrbp);
+ err = ufshcd_map_sg(hba, lrbp);
if (err) {
lrbp->cmd = NULL;
clear_bit_unlock(tag, &hba->lrb_in_use);
@@ -2035,12 +2040,21 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba)
cpu_to_le32(upper_32_bits(cmd_desc_element_addr));
/* Response upiu and prdt offset should be in double words */
- utrdlp[i].response_upiu_offset =
+ if (hba->quirks & UFSHCI_QUIRK_BROKEN_UTRD) {
+ utrdlp[i].response_upiu_offset =
+ cpu_to_le16(response_offset);
+ utrdlp[i].prd_table_offset =
+ cpu_to_le16(prdt_offset);
+ utrdlp[i].response_upiu_length =
+ cpu_to_le16(ALIGNED_UPIU_SIZE);
+ } else {
+ utrdlp[i].response_upiu_offset =
cpu_to_le16((response_offset >> 2));
- utrdlp[i].prd_table_offset =
+ utrdlp[i].prd_table_offset =
cpu_to_le16((prdt_offset >> 2));
- utrdlp[i].response_upiu_length =
+ utrdlp[i].response_upiu_length =
cpu_to_le16(ALIGNED_UPIU_SIZE >> 2);
+ }
hba->lrb[i].utr_descriptor_ptr = (utrdlp + i);
hba->lrb[i].ucd_req_ptr =
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index c40a0e7..1fa5ac1 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -459,6 +459,13 @@ struct ufs_hba {
*/
#define UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION UFS_BIT(5)
+ /*
+ * This quirk needs to be enabled if host controller doesn't conform
+ * with UTRD. Some fields such as offset/length might not be in double word,
+ * but in byte.
+ */
+ #define UFSHCI_QUIRK_BROKEN_UTRD UFS_BIT(6)
+
unsigned int quirks; /* Deviations from standard UFSHCI spec. */
wait_queue_head_t tm_wq;
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | amit daniel kachhap <amit.daniel@samsung.com> |
|---|---|
| Date | 2015-08-26 08:20 +0200 |
| Subject | Re: [PATCH 02/10] scsi: ufs: add quirk to contain unconformable utrd field |
| Message-ID | <q1CdY-5RD-11@gated-at.bofh.it> |
| In reply to | #1211068 |
Few minor comments below,
On Fri, Aug 21, 2015 at 2:57 PM, Alim Akhtar <alim.akhtar@samsung.com> wrote:
> From: Seungwon Jeon <tgih.jun@samsung.com>
>
> UTRD(UTP Transfer Request Descriptor)'s field such as offset/length,
> especially response's has DWORD expression. This quirk can be specified
> for host controller not to conform standard.
>
> Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
> ---
> drivers/scsi/ufs/ufshcd.c | 28 +++++++++++++++++++++-------
> drivers/scsi/ufs/ufshcd.h | 7 +++++++
> 2 files changed, 28 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index b0ade73..f882bf0 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -1009,7 +1009,7 @@ ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
> *
> * Returns 0 in case of success, non-zero value in case of failure
> */
> -static int ufshcd_map_sg(struct ufshcd_lrb *lrbp)
> +static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
> {
> struct ufshcd_sg_entry *prd_table;
> struct scatterlist *sg;
> @@ -1023,8 +1023,13 @@ static int ufshcd_map_sg(struct ufshcd_lrb *lrbp)
> return sg_segments;
>
> if (sg_segments) {
> - lrbp->utr_descriptor_ptr->prd_table_length =
> - cpu_to_le16((u16) (sg_segments));
> + if (hba->quirks & UFSHCI_QUIRK_BROKEN_UTRD)
> + lrbp->utr_descriptor_ptr->prd_table_length =
> + cpu_to_le16((u16)(sg_segments *
> + sizeof(struct ufshcd_sg_entry)));
> + else
> + lrbp->utr_descriptor_ptr->prd_table_length =
> + cpu_to_le16((u16) (sg_segments));
>
> prd_table = (struct ufshcd_sg_entry *)lrbp->ucd_prdt_ptr;
>
> @@ -1347,7 +1352,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
>
> /* form UPIU before issuing the command */
> ufshcd_compose_upiu(hba, lrbp);
> - err = ufshcd_map_sg(lrbp);
> + err = ufshcd_map_sg(hba, lrbp);
> if (err) {
> lrbp->cmd = NULL;
> clear_bit_unlock(tag, &hba->lrb_in_use);
> @@ -2035,12 +2040,21 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba)
> cpu_to_le32(upper_32_bits(cmd_desc_element_addr));
>
> /* Response upiu and prdt offset should be in double words */
This comment can be moved below for the else case.
> - utrdlp[i].response_upiu_offset =
> + if (hba->quirks & UFSHCI_QUIRK_BROKEN_UTRD) {
> + utrdlp[i].response_upiu_offset =
> + cpu_to_le16(response_offset);
> + utrdlp[i].prd_table_offset =
> + cpu_to_le16(prdt_offset);
> + utrdlp[i].response_upiu_length =
> + cpu_to_le16(ALIGNED_UPIU_SIZE);
> + } else {
> + utrdlp[i].response_upiu_offset =
> cpu_to_le16((response_offset >> 2));
> - utrdlp[i].prd_table_offset =
> + utrdlp[i].prd_table_offset =
> cpu_to_le16((prdt_offset >> 2));
> - utrdlp[i].response_upiu_length =
> + utrdlp[i].response_upiu_length =
> cpu_to_le16(ALIGNED_UPIU_SIZE >> 2);
> + }
>
> hba->lrb[i].utr_descriptor_ptr = (utrdlp + i);
> hba->lrb[i].ucd_req_ptr =
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> index c40a0e7..1fa5ac1 100644
> --- a/drivers/scsi/ufs/ufshcd.h
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -459,6 +459,13 @@ struct ufs_hba {
> */
> #define UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION UFS_BIT(5)
>
> + /*
> + * This quirk needs to be enabled if host controller doesn't conform
> + * with UTRD. Some fields such as offset/length might not be in double word,
> + * but in byte.
> + */
> + #define UFSHCI_QUIRK_BROKEN_UTRD UFS_BIT(6)
This macro name may be given more meaningful name such as
UFSHCI_QUIRK_BYTE_ALIGN_UTRD or something similar.
> +
> unsigned int quirks; /* Deviations from standard UFSHCI spec. */
>
> wait_queue_head_t tm_wq;
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Alim Akhtar <alim.akhtar@samsung.com> |
|---|---|
| Date | 2015-08-28 11:50 +0200 |
| Subject | Re: [PATCH 02/10] scsi: ufs: add quirk to contain unconformable utrd field |
| Message-ID | <q2osi-7VN-17@gated-at.bofh.it> |
| In reply to | #1213568 |
Hi Amit,
Thanks for your review comments.
On 08/26/2015 11:43 AM, amit daniel kachhap wrote:
> Few minor comments below,
>
> On Fri, Aug 21, 2015 at 2:57 PM, Alim Akhtar <alim.akhtar@samsung.com> wrote:
>> From: Seungwon Jeon <tgih.jun@samsung.com>
>>
>> UTRD(UTP Transfer Request Descriptor)'s field such as offset/length,
>> especially response's has DWORD expression. This quirk can be specified
>> for host controller not to conform standard.
>>
>> Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
>> Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
>> ---
>> drivers/scsi/ufs/ufshcd.c | 28 +++++++++++++++++++++-------
>> drivers/scsi/ufs/ufshcd.h | 7 +++++++
>> 2 files changed, 28 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>> index b0ade73..f882bf0 100644
>> --- a/drivers/scsi/ufs/ufshcd.c
>> +++ b/drivers/scsi/ufs/ufshcd.c
>> @@ -1009,7 +1009,7 @@ ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
>> *
>> * Returns 0 in case of success, non-zero value in case of failure
>> */
>> -static int ufshcd_map_sg(struct ufshcd_lrb *lrbp)
>> +static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
>> {
>> struct ufshcd_sg_entry *prd_table;
>> struct scatterlist *sg;
>> @@ -1023,8 +1023,13 @@ static int ufshcd_map_sg(struct ufshcd_lrb *lrbp)
>> return sg_segments;
>>
>> if (sg_segments) {
>> - lrbp->utr_descriptor_ptr->prd_table_length =
>> - cpu_to_le16((u16) (sg_segments));
>> + if (hba->quirks & UFSHCI_QUIRK_BROKEN_UTRD)
>> + lrbp->utr_descriptor_ptr->prd_table_length =
>> + cpu_to_le16((u16)(sg_segments *
>> + sizeof(struct ufshcd_sg_entry)));
>> + else
>> + lrbp->utr_descriptor_ptr->prd_table_length =
>> + cpu_to_le16((u16) (sg_segments));
>>
>> prd_table = (struct ufshcd_sg_entry *)lrbp->ucd_prdt_ptr;
>>
>> @@ -1347,7 +1352,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
>>
>> /* form UPIU before issuing the command */
>> ufshcd_compose_upiu(hba, lrbp);
>> - err = ufshcd_map_sg(lrbp);
>> + err = ufshcd_map_sg(hba, lrbp);
>> if (err) {
>> lrbp->cmd = NULL;
>> clear_bit_unlock(tag, &hba->lrb_in_use);
>> @@ -2035,12 +2040,21 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba)
>> cpu_to_le32(upper_32_bits(cmd_desc_element_addr));
>>
>> /* Response upiu and prdt offset should be in double words */
> This comment can be moved below for the else case.
ok
>> - utrdlp[i].response_upiu_offset =
>> + if (hba->quirks & UFSHCI_QUIRK_BROKEN_UTRD) {
>> + utrdlp[i].response_upiu_offset =
>> + cpu_to_le16(response_offset);
>> + utrdlp[i].prd_table_offset =
>> + cpu_to_le16(prdt_offset);
>> + utrdlp[i].response_upiu_length =
>> + cpu_to_le16(ALIGNED_UPIU_SIZE);
>> + } else {
>> + utrdlp[i].response_upiu_offset =
>> cpu_to_le16((response_offset >> 2));
>> - utrdlp[i].prd_table_offset =
>> + utrdlp[i].prd_table_offset =
>> cpu_to_le16((prdt_offset >> 2));
>> - utrdlp[i].response_upiu_length =
>> + utrdlp[i].response_upiu_length =
>> cpu_to_le16(ALIGNED_UPIU_SIZE >> 2);
>> + }
>>
>> hba->lrb[i].utr_descriptor_ptr = (utrdlp + i);
>> hba->lrb[i].ucd_req_ptr =
>> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
>> index c40a0e7..1fa5ac1 100644
>> --- a/drivers/scsi/ufs/ufshcd.h
>> +++ b/drivers/scsi/ufs/ufshcd.h
>> @@ -459,6 +459,13 @@ struct ufs_hba {
>> */
>> #define UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION UFS_BIT(5)
>>
>> + /*
>> + * This quirk needs to be enabled if host controller doesn't conform
>> + * with UTRD. Some fields such as offset/length might not be in double word,
>> + * but in byte.
>> + */
>> + #define UFSHCI_QUIRK_BROKEN_UTRD UFS_BIT(6)
> This macro name may be given more meaningful name such as
> UFSHCI_QUIRK_BYTE_ALIGN_UTRD or something similar.
ok, will change
>> +
>> unsigned int quirks; /* Deviations from standard UFSHCI spec. */
>>
>> wait_queue_head_t tm_wq;
>> --
>> 1.7.10.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at http://www.tux.org/lkml/
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web