linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] hisi_sas: DIF/DIX support
@ 2018-11-20 14:59 John Garry
  2018-11-20 14:59 ` [PATCH 1/4] scsi: Add scsi_prot_op_normal() John Garry
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: John Garry @ 2018-11-20 14:59 UTC (permalink / raw)
  To: jejb, martin.petersen; +Cc: linuxarm, linux-kernel, linux-scsi, John Garry

This patchset introduces support to the driver for DIF/DIX (or PI -
protection information).

We will only support PI in v3 hw at the moment, even though previous hw
versions also support.

The series is broken down as follows:
- Add a generic helper for checking Scsi command normal operation
- Some tidy-up to accept PI support
- Add components for PI support for main and v3 driver

John Garry (1):
  scsi: Add scsi_prot_op_normal()

Xiang Chen (3):
  scsi: hisi_sas: Relocate some code to reduce complexity
  scsi: hisi_sas: Make sg_tablesize consistent value
  scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw

 drivers/scsi/hisi_sas/hisi_sas.h       |  18 +++
 drivers/scsi/hisi_sas/hisi_sas_main.c  | 242 ++++++++++++++++++++++++---------
 drivers/scsi/hisi_sas/hisi_sas_v1_hw.c |   2 +-
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c |   2 +-
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 192 +++++++++++++++++++++++++-
 include/scsi/scsi_cmnd.h               |   5 +
 6 files changed, 385 insertions(+), 76 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/4] scsi: Add scsi_prot_op_normal()
  2018-11-20 14:59 [PATCH 0/4] hisi_sas: DIF/DIX support John Garry
@ 2018-11-20 14:59 ` John Garry
  2018-11-20 16:19   ` Christoph Hellwig
  2018-11-20 14:59 ` [PATCH 2/4] scsi: hisi_sas: Relocate some code to reduce complexity John Garry
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 13+ messages in thread
From: John Garry @ 2018-11-20 14:59 UTC (permalink / raw)
  To: jejb, martin.petersen; +Cc: linuxarm, linux-kernel, linux-scsi, John Garry

It is a common pattern to check if a Scsi command protection option is
"normal", i.e. regular IO.

Add a common simple wrapper for this.

Signed-off-by: John Garry <john.garry@huawei.com>
---
 include/scsi/scsi_cmnd.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index c891ada..3b26ea1 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -271,6 +271,11 @@ static inline unsigned char scsi_get_prot_op(struct scsi_cmnd *scmd)
 	return scmd->prot_op;
 }
 
+static inline bool scsi_prot_op_normal(struct scsi_cmnd *scmd)
+{
+	return scmd->prot_op == SCSI_PROT_NORMAL;
+}
+
 enum scsi_prot_flags {
 	SCSI_PROT_TRANSFER_PI		= 1 << 0,
 	SCSI_PROT_GUARD_CHECK		= 1 << 1,
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/4] scsi: hisi_sas: Relocate some code to reduce complexity
  2018-11-20 14:59 [PATCH 0/4] hisi_sas: DIF/DIX support John Garry
  2018-11-20 14:59 ` [PATCH 1/4] scsi: Add scsi_prot_op_normal() John Garry
@ 2018-11-20 14:59 ` John Garry
  2018-11-20 14:59 ` [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value John Garry
  2018-11-20 14:59 ` [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw John Garry
  3 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2018-11-20 14:59 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, linux-kernel, linux-scsi, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

Relocate the codes related to dma_map/unmap in hisi_sas_task_prep()
to reduce complexity, with a view to add DIF/DIX support.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_main.c | 146 +++++++++++++++++++++-------------
 1 file changed, 90 insertions(+), 56 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index 65dc749..d13a662 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -296,6 +296,90 @@ static void hisi_sas_task_prep_abort(struct hisi_hba *hisi_hba,
 			device_id, abort_flag, tag_to_abort);
 }
 
+static void hisi_sas_dma_unmap(struct hisi_hba *hisi_hba,
+			       struct sas_task *task, int n_elem,
+			       int n_elem_req, int n_elem_resp)
+{
+	struct device *dev = hisi_hba->dev;
+
+	if (!sas_protocol_ata(task->task_proto)) {
+		if (task->num_scatter) {
+			if (n_elem)
+				dma_unmap_sg(dev, task->scatter,
+					     task->num_scatter,
+					     task->data_dir);
+		} else if (task->task_proto & SAS_PROTOCOL_SMP) {
+			if (n_elem_req)
+				dma_unmap_sg(dev, &task->smp_task.smp_req,
+					     1, DMA_TO_DEVICE);
+			if (n_elem_resp)
+				dma_unmap_sg(dev, &task->smp_task.smp_resp,
+					     1, DMA_FROM_DEVICE);
+		}
+	}
+}
+
+static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
+			    struct sas_task *task, int *n_elem,
+			    int *n_elem_req, int *n_elem_resp)
+{
+	struct device *dev = hisi_hba->dev;
+	int rc;
+
+	if (sas_protocol_ata(task->task_proto)) {
+		*n_elem = task->num_scatter;
+	} else {
+		unsigned int req_len, resp_len;
+
+		if (task->num_scatter) {
+			*n_elem = dma_map_sg(dev, task->scatter,
+					     task->num_scatter, task->data_dir);
+			if (!*n_elem) {
+				rc = -ENOMEM;
+				goto prep_out;
+			}
+		} else if (task->task_proto & SAS_PROTOCOL_SMP) {
+			*n_elem_req = dma_map_sg(dev, &task->smp_task.smp_req,
+						 1, DMA_TO_DEVICE);
+			if (!*n_elem_req) {
+				rc = -ENOMEM;
+				goto prep_out;
+			}
+			req_len = sg_dma_len(&task->smp_task.smp_req);
+			if (req_len & 0x3) {
+				rc = -EINVAL;
+				goto err_out_dma_unmap;
+			}
+			*n_elem_resp = dma_map_sg(dev, &task->smp_task.smp_resp,
+						  1, DMA_FROM_DEVICE);
+			if (!*n_elem_resp) {
+				rc = -ENOMEM;
+				goto err_out_dma_unmap;
+			}
+			resp_len = sg_dma_len(&task->smp_task.smp_resp);
+			if (resp_len & 0x3) {
+				rc = -EINVAL;
+				goto err_out_dma_unmap;
+			}
+		}
+	}
+
+	if (*n_elem > HISI_SAS_SGE_PAGE_CNT) {
+		dev_err(dev, "task prep: n_elem(%d) > HISI_SAS_SGE_PAGE_CNT",
+			*n_elem);
+		rc = -EINVAL;
+		goto err_out_dma_unmap;
+	}
+	return 0;
+
+err_out_dma_unmap:
+	/* It would be better to call dma_unmap_sg() here, but it's messy */
+	hisi_sas_dma_unmap(hisi_hba, task, *n_elem,
+			   *n_elem_req, *n_elem_resp);
+prep_out:
+	return rc;
+}
+
 static int hisi_sas_task_prep(struct sas_task *task,
 			      struct hisi_sas_dq **dq_pointer,
 			      bool is_tmf, struct hisi_sas_tmf_task *tmf,
@@ -338,49 +422,10 @@ static int hisi_sas_task_prep(struct sas_task *task,
 		return -ECOMM;
 	}
 
-	if (!sas_protocol_ata(task->task_proto)) {
-		unsigned int req_len, resp_len;
-
-		if (task->num_scatter) {
-			n_elem = dma_map_sg(dev, task->scatter,
-					    task->num_scatter, task->data_dir);
-			if (!n_elem) {
-				rc = -ENOMEM;
-				goto prep_out;
-			}
-		} else if (task->task_proto & SAS_PROTOCOL_SMP) {
-			n_elem_req = dma_map_sg(dev, &task->smp_task.smp_req,
-						1, DMA_TO_DEVICE);
-			if (!n_elem_req) {
-				rc = -ENOMEM;
-				goto prep_out;
-			}
-			req_len = sg_dma_len(&task->smp_task.smp_req);
-			if (req_len & 0x3) {
-				rc = -EINVAL;
-				goto err_out_dma_unmap;
-			}
-			n_elem_resp = dma_map_sg(dev, &task->smp_task.smp_resp,
-						 1, DMA_FROM_DEVICE);
-			if (!n_elem_resp) {
-				rc = -ENOMEM;
-				goto err_out_dma_unmap;
-			}
-			resp_len = sg_dma_len(&task->smp_task.smp_resp);
-			if (resp_len & 0x3) {
-				rc = -EINVAL;
-				goto err_out_dma_unmap;
-			}
-		}
-	} else
-		n_elem = task->num_scatter;
-
-	if (n_elem > HISI_SAS_SGE_PAGE_CNT) {
-		dev_err(dev, "task prep: n_elem(%d) > HISI_SAS_SGE_PAGE_CNT",
-			n_elem);
-		rc = -EINVAL;
-		goto err_out_dma_unmap;
-	}
+	rc = hisi_sas_dma_map(hisi_hba, task, &n_elem,
+			      &n_elem_req, &n_elem_resp);
+	if (rc < 0)
+		goto prep_out;
 
 	if (hisi_hba->hw->slot_index_alloc)
 		rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
@@ -465,19 +510,8 @@ static int hisi_sas_task_prep(struct sas_task *task,
 err_out_tag:
 	hisi_sas_slot_index_free(hisi_hba, slot_idx);
 err_out_dma_unmap:
-	if (!sas_protocol_ata(task->task_proto)) {
-		if (task->num_scatter) {
-			dma_unmap_sg(dev, task->scatter, task->num_scatter,
-			     task->data_dir);
-		} else if (task->task_proto & SAS_PROTOCOL_SMP) {
-			if (n_elem_req)
-				dma_unmap_sg(dev, &task->smp_task.smp_req,
-					     1, DMA_TO_DEVICE);
-			if (n_elem_resp)
-				dma_unmap_sg(dev, &task->smp_task.smp_resp,
-					     1, DMA_FROM_DEVICE);
-		}
-	}
+	hisi_sas_dma_unmap(hisi_hba, task, n_elem,
+			   n_elem_req, n_elem_resp);
 prep_out:
 	dev_err(dev, "task prep: failed[%d]!\n", rc);
 	return rc;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value
  2018-11-20 14:59 [PATCH 0/4] hisi_sas: DIF/DIX support John Garry
  2018-11-20 14:59 ` [PATCH 1/4] scsi: Add scsi_prot_op_normal() John Garry
  2018-11-20 14:59 ` [PATCH 2/4] scsi: hisi_sas: Relocate some code to reduce complexity John Garry
@ 2018-11-20 14:59 ` John Garry
  2018-11-21 11:02   ` Steffen Maier
  2018-11-20 14:59 ` [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw John Garry
  3 siblings, 1 reply; 13+ messages in thread
From: John Garry @ 2018-11-20 14:59 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, linux-kernel, linux-scsi, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

Sht->sg_tablesize is set in the driver, and it will be assigned to
shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
assign shost->sg_table one more time in the driver.

In addition to the change, change each scsi_host_template.sg_tablesize
to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_main.c  | 1 -
 drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
 4 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index d13a662..cbda48e 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
 	shost->max_lun = ~0;
 	shost->max_channel = 1;
 	shost->max_cmd_len = 16;
-	shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
 	if (hisi_hba->hw->slot_index_alloc) {
 		shost->can_queue = hisi_hba->hw->max_command_entries;
 		shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
index d24342b..2d035cc 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
@@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba *hisi_hba)
 	.change_queue_depth	= sas_change_queue_depth,
 	.bios_param		= sas_bios_param,
 	.this_id		= -1,
-	.sg_tablesize		= SG_ALL,
+	.sg_tablesize		= HISI_SAS_SGE_PAGE_CNT,
 	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index e78a97e..79e58a7 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
 	.change_queue_depth	= sas_change_queue_depth,
 	.bios_param		= sas_bios_param,
 	.this_id		= -1,
-	.sg_tablesize		= SG_ALL,
+	.sg_tablesize		= HISI_SAS_SGE_PAGE_CNT,
 	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index 7e2b020..8a08078 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
 	.change_queue_depth	= sas_change_queue_depth,
 	.bios_param		= sas_bios_param,
 	.this_id		= -1,
-	.sg_tablesize		= SG_ALL,
+	.sg_tablesize		= HISI_SAS_SGE_PAGE_CNT,
 	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
@@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
 	shost->max_lun = ~0;
 	shost->max_channel = 1;
 	shost->max_cmd_len = 16;
-	shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
 	shost->can_queue = hisi_hba->hw->max_command_entries -
 		HISI_SAS_RESERVED_IPTT_CNT;
 	shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw
  2018-11-20 14:59 [PATCH 0/4] hisi_sas: DIF/DIX support John Garry
                   ` (2 preceding siblings ...)
  2018-11-20 14:59 ` [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value John Garry
@ 2018-11-20 14:59 ` John Garry
  2018-11-24 17:50   ` kbuild test robot
  3 siblings, 1 reply; 13+ messages in thread
From: John Garry @ 2018-11-20 14:59 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, linux-kernel, linux-scsi, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

For v3 hw, we support DIF/DIX operation for SAS, but not SATA.

In addition, DIF CRC16 is supported.

This patchset adds the SW support for the described features. The main
components are as follows:
- Allocate memory for PI
- Fill PI fields
- Fill related to DIF/DIX in DQ and protection iu memories

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas.h       |  18 ++++
 drivers/scsi/hisi_sas/hisi_sas_main.c  |  99 ++++++++++++++---
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 189 ++++++++++++++++++++++++++++++++-
 3 files changed, 289 insertions(+), 17 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
index 535c613..a73aad6 100644
--- a/drivers/scsi/hisi_sas/hisi_sas.h
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
@@ -55,6 +55,11 @@
 #define hisi_sas_sge_addr_mem(slot) hisi_sas_sge_addr(slot->buf)
 #define hisi_sas_sge_addr_dma(slot) hisi_sas_sge_addr(slot->buf_dma)
 
+#define hisi_sas_sge_dif_addr(buf) \
+	(buf + offsetof(struct hisi_sas_slot_dif_buf_table, sge_dif_page))
+#define hisi_sas_sge_dif_addr_mem(slot) hisi_sas_sge_dif_addr(slot->buf)
+#define hisi_sas_sge_dif_addr_dma(slot) hisi_sas_sge_dif_addr(slot->buf_dma)
+
 #define HISI_SAS_MAX_SSP_RESP_SZ (sizeof(struct ssp_frame_hdr) + 1024)
 #define HISI_SAS_MAX_SMP_RESP_SZ 1028
 #define HISI_SAS_MAX_STP_RESP_SZ 28
@@ -197,6 +202,7 @@ struct hisi_sas_slot {
 	struct sas_task *task;
 	struct hisi_sas_port	*port;
 	u64	n_elem;
+	u64	n_elem_dif;
 	int	dlvry_queue;
 	int	dlvry_queue_slot;
 	int	cmplt_queue;
@@ -268,6 +274,8 @@ struct hisi_hba {
 	struct pci_dev *pci_dev;
 	struct device *dev;
 
+	bool enable_dif_dix;
+
 	void __iomem *regs;
 	void __iomem *sgpio_regs;
 	struct regmap *ctrl;
@@ -422,6 +430,11 @@ struct hisi_sas_sge_page {
 	struct hisi_sas_sge sge[HISI_SAS_SGE_PAGE_CNT];
 }  __aligned(16);
 
+#define HISI_SAS_SGE_DIF_PAGE_CNT   SG_CHUNK_SIZE
+struct hisi_sas_sge_dif_page {
+	struct hisi_sas_sge sge[HISI_SAS_SGE_DIF_PAGE_CNT];
+}  __aligned(16);
+
 struct hisi_sas_command_table_ssp {
 	struct ssp_frame_hdr hdr;
 	union {
@@ -452,6 +465,11 @@ struct hisi_sas_slot_buf_table {
 	struct hisi_sas_sge_page sge_page;
 };
 
+struct hisi_sas_slot_dif_buf_table {
+	struct hisi_sas_slot_buf_table slot_buf;
+	struct hisi_sas_sge_dif_page sge_dif_page;
+};
+
 extern struct scsi_transport_template *hisi_sas_stt;
 extern void hisi_sas_stop_phys(struct hisi_hba *hisi_hba);
 extern int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost);
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index cbda48e..d0b693b 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -252,14 +252,21 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
 
 		task->lldd_task = NULL;
 
-		if (!sas_protocol_ata(task->task_proto))
+		if (!sas_protocol_ata(task->task_proto)) {
+			struct sas_ssp_task *ssp_task = &task->ssp_task;
+			struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
+
 			if (slot->n_elem)
 				dma_unmap_sg(dev, task->scatter,
 					     task->num_scatter,
 					     task->data_dir);
+			if (slot->n_elem_dif)
+				dma_unmap_sg(dev, scsi_prot_sglist(scsi_cmnd),
+					     scsi_prot_sg_count(scsi_cmnd),
+					     task->data_dir);
+		}
 	}
 
-
 	spin_lock_irqsave(&dq->lock, flags);
 	list_del_init(&slot->entry);
 	spin_unlock_irqrestore(&dq->lock, flags);
@@ -380,6 +387,59 @@ static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
 	return rc;
 }
 
+static void hisi_sas_dif_dma_unmap(struct hisi_hba *hisi_hba,
+				   struct sas_task *task, int n_elem_dif)
+{
+	struct device *dev = hisi_hba->dev;
+
+	if (n_elem_dif) {
+		struct sas_ssp_task *ssp_task = &task->ssp_task;
+		struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
+
+		dma_unmap_sg(dev, scsi_prot_sglist(scsi_cmnd),
+			     scsi_prot_sg_count(scsi_cmnd),
+			     task->data_dir);
+	}
+}
+
+static int hisi_sas_dif_dma_map(struct hisi_hba *hisi_hba,
+				int *n_elem_dif, struct sas_task *task)
+{
+	struct device *dev = hisi_hba->dev;
+	struct sas_ssp_task *ssp_task;
+	struct scsi_cmnd *scsi_cmnd;
+	int rc;
+
+	if (task->num_scatter) {
+		ssp_task = &task->ssp_task;
+		scsi_cmnd = ssp_task->cmd;
+
+		if (scsi_prot_sg_count(scsi_cmnd)) {
+			*n_elem_dif = dma_map_sg(dev,
+						 scsi_prot_sglist(scsi_cmnd),
+						 scsi_prot_sg_count(scsi_cmnd),
+						 task->data_dir);
+
+			if (!*n_elem_dif)
+				return -ENOMEM;
+
+			if (*n_elem_dif > HISI_SAS_SGE_DIF_PAGE_CNT) {
+				dev_err(dev, "task prep: n_elem_dif(%d) too large\n",
+					*n_elem_dif);
+				rc = -EINVAL;
+				goto err_out_dif_dma_unmap;
+			}
+		}
+	}
+
+	return 0;
+
+err_out_dif_dma_unmap:
+	dma_unmap_sg(dev, scsi_prot_sglist(scsi_cmnd),
+		     scsi_prot_sg_count(scsi_cmnd), task->data_dir);
+	return rc;
+}
+
 static int hisi_sas_task_prep(struct sas_task *task,
 			      struct hisi_sas_dq **dq_pointer,
 			      bool is_tmf, struct hisi_sas_tmf_task *tmf,
@@ -394,7 +454,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
 	struct asd_sas_port *sas_port = device->port;
 	struct device *dev = hisi_hba->dev;
 	int dlvry_queue_slot, dlvry_queue, rc, slot_idx;
-	int n_elem = 0, n_elem_req = 0, n_elem_resp = 0;
+	int n_elem = 0, n_elem_dif = 0, n_elem_req = 0, n_elem_resp = 0;
 	struct hisi_sas_dq *dq;
 	unsigned long flags;
 	int wr_q_index;
@@ -427,6 +487,12 @@ static int hisi_sas_task_prep(struct sas_task *task,
 	if (rc < 0)
 		goto prep_out;
 
+	if (!sas_protocol_ata(task->task_proto)) {
+		rc = hisi_sas_dif_dma_map(hisi_hba, &n_elem_dif, task);
+		if (rc < 0)
+			goto err_out_dma_unmap;
+	}
+
 	if (hisi_hba->hw->slot_index_alloc)
 		rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
 	else {
@@ -445,7 +511,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
 		rc  = hisi_sas_slot_index_alloc(hisi_hba, scsi_cmnd);
 	}
 	if (rc < 0)
-		goto err_out_dma_unmap;
+		goto err_out_dif_dma_unmap;
 
 	slot_idx = rc;
 	slot = &hisi_hba->slot_info[slot_idx];
@@ -466,6 +532,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
 	dlvry_queue_slot = wr_q_index;
 
 	slot->n_elem = n_elem;
+	slot->n_elem_dif = n_elem_dif;
 	slot->dlvry_queue = dlvry_queue;
 	slot->dlvry_queue_slot = dlvry_queue_slot;
 	cmd_hdr_base = hisi_hba->cmd_hdr[dlvry_queue];
@@ -509,6 +576,9 @@ static int hisi_sas_task_prep(struct sas_task *task,
 
 err_out_tag:
 	hisi_sas_slot_index_free(hisi_hba, slot_idx);
+err_out_dif_dma_unmap:
+	if (!sas_protocol_ata(task->task_proto))
+		hisi_sas_dif_dma_unmap(hisi_hba, task, n_elem_dif);
 err_out_dma_unmap:
 	hisi_sas_dma_unmap(hisi_hba, task, n_elem,
 			   n_elem_req, n_elem_resp);
@@ -2142,21 +2212,26 @@ int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost)
 	if (!hisi_hba->slot_info)
 		goto err_out;
 
-	/* roundup to avoid overly large block size */
+	/* roundup to avoid an overly large block size */
 	max_command_entries_ru = roundup(max_command_entries, 64);
-	sz_slot_buf_ru = roundup(sizeof(struct hisi_sas_slot_buf_table), 64);
+	if (hisi_hba->enable_dif_dix)
+		sz_slot_buf_ru = sizeof(struct hisi_sas_slot_dif_buf_table);
+	else
+		sz_slot_buf_ru = sizeof(struct hisi_sas_slot_buf_table);
+	sz_slot_buf_ru = roundup(sz_slot_buf_ru, 64);
 	s = lcm(max_command_entries_ru, sz_slot_buf_ru);
 	blk_cnt = (max_command_entries_ru * sz_slot_buf_ru) / s;
 	slots_per_blk = s / sz_slot_buf_ru;
+
 	for (i = 0; i < blk_cnt; i++) {
-		struct hisi_sas_slot_buf_table *buf;
-		dma_addr_t buf_dma;
 		int slot_index = i * slots_per_blk;
+		dma_addr_t buf_dma;
+		void *buf;
 
-		buf = dmam_alloc_coherent(dev, s, &buf_dma, GFP_KERNEL);
+		buf = dmam_alloc_coherent(dev, s, &buf_dma,
+					  GFP_KERNEL | __GFP_ZERO);
 		if (!buf)
 			goto err_out;
-		memset(buf, 0, s);
 
 		for (j = 0; j < slots_per_blk; j++, slot_index++) {
 			struct hisi_sas_slot *slot;
@@ -2166,8 +2241,8 @@ int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost)
 			slot->buf_dma = buf_dma;
 			slot->idx = slot_index;
 
-			buf++;
-			buf_dma += sizeof(*buf);
+			buf += sz_slot_buf_ru;
+			buf_dma += sz_slot_buf_ru;
 		}
 	}
 
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index 8a08078..314918c 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -127,6 +127,8 @@
 #define PHY_CTRL			(PORT_BASE + 0x14)
 #define PHY_CTRL_RESET_OFF		0
 #define PHY_CTRL_RESET_MSK		(0x1 << PHY_CTRL_RESET_OFF)
+#define CMD_HDR_PIR_OFF			8
+#define CMD_HDR_PIR_MSK			(0x1 << CMD_HDR_PIR_OFF)
 #define SL_CFG				(PORT_BASE + 0x84)
 #define AIP_LIMIT			(PORT_BASE + 0x90)
 #define SL_CONTROL			(PORT_BASE + 0x94)
@@ -333,6 +335,16 @@
 #define ITCT_HDR_RTOLT_OFF		48
 #define ITCT_HDR_RTOLT_MSK		(0xffffULL << ITCT_HDR_RTOLT_OFF)
 
+struct hisi_sas_protect_iu_v3_hw {
+	u32 dw0;
+	u32 lbrtcv;
+	u32 lbrtgv;
+	u32 dw3;
+	u32 dw4;
+	u32 dw5;
+	u32 rsv;
+};
+
 struct hisi_sas_complete_v3_hdr {
 	__le32 dw0;
 	__le32 dw1;
@@ -372,9 +384,27 @@ struct hisi_sas_err_record_v3 {
 	((fis.command == ATA_CMD_DEV_RESET) && \
 	((fis.control & ATA_SRST) != 0)))
 
+#define T10_INSRT_EN_OFF    0
+#define T10_INSRT_EN_MSK    (1 << T10_INSRT_EN_OFF)
+#define T10_RMV_EN_OFF	    1
+#define T10_RMV_EN_MSK	    (1 << T10_RMV_EN_OFF)
+#define T10_RPLC_EN_OFF	    2
+#define T10_RPLC_EN_MSK	    (1 << T10_RPLC_EN_OFF)
+#define T10_CHK_EN_OFF	    3
+#define T10_CHK_EN_MSK	    (1 << T10_CHK_EN_OFF)
+#define INCR_LBRT_OFF	    5
+#define INCR_LBRT_MSK	    (1 << INCR_LBRT_OFF)
+#define USR_DATA_BLOCK_SZ_OFF	20
+#define USR_DATA_BLOCK_SZ_MSK	(0x3 << USR_DATA_BLOCK_SZ_OFF)
+#define T10_CHK_MSK_OFF	    16
+
 static bool hisi_sas_intr_conv;
 MODULE_PARM_DESC(intr_conv, "interrupt converge enable (0-1)");
 
+static bool enable_dif_dix;
+module_param(enable_dif_dix, bool, 0444);
+MODULE_PARM_DESC(enable_dif_dix, "DIF/DIX enable (0-1)");
+
 static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
 {
 	void __iomem *regs = hisi_hba->regs + off;
@@ -937,7 +967,107 @@ static void prep_prd_sge_v3_hw(struct hisi_hba *hisi_hba,
 
 	hdr->prd_table_addr = cpu_to_le64(hisi_sas_sge_addr_dma(slot));
 
-	hdr->sg_len = cpu_to_le32(n_elem << CMD_HDR_DATA_SGL_LEN_OFF);
+	hdr->sg_len |= cpu_to_le32(n_elem << CMD_HDR_DATA_SGL_LEN_OFF);
+}
+
+static void prep_prd_sge_dif_v3_hw(struct hisi_hba *hisi_hba,
+				  struct hisi_sas_slot *slot,
+				  struct hisi_sas_cmd_hdr *hdr,
+				  struct scatterlist *scatter,
+				  int n_elem)
+{
+	struct hisi_sas_sge_dif_page *sge_dif_page;
+	struct scatterlist *sg;
+	int i;
+
+	sge_dif_page = hisi_sas_sge_dif_addr_mem(slot);
+
+	for_each_sg(scatter, sg, n_elem, i) {
+		struct hisi_sas_sge *entry = &sge_dif_page->sge[i];
+
+		entry->addr = cpu_to_le64(sg_dma_address(sg));
+		entry->page_ctrl_0 = entry->page_ctrl_1 = 0;
+		entry->data_len = cpu_to_le32(sg_dma_len(sg));
+		entry->data_off = 0;
+	}
+
+	hdr->dif_prd_table_addr = cpu_to_le64(
+			hisi_sas_sge_dif_addr_dma(slot));
+
+	hdr->sg_len |= cpu_to_le32(n_elem << CMD_HDR_DIF_SGL_LEN_OFF);
+}
+
+static void fill_prot_v3_hw(struct scsi_cmnd *scsi_cmnd,
+			    struct hisi_sas_protect_iu_v3_hw *prot)
+{
+	u8 prot_type = scsi_get_prot_type(scsi_cmnd);
+	u8 prot_op = scsi_get_prot_op(scsi_cmnd);
+	unsigned int interval = scsi_prot_interval(scsi_cmnd);
+	u32 lbrt_chk_val;
+
+	if (interval == 4096)
+		lbrt_chk_val = (u32)(scsi_get_lba(scsi_cmnd) >> 3);
+	else
+		lbrt_chk_val = (u32)scsi_get_lba(scsi_cmnd);
+
+	switch (prot_op) {
+	case SCSI_PROT_READ_INSERT:
+		prot->dw0 |= T10_INSRT_EN_MSK;
+		prot->lbrtgv = lbrt_chk_val;
+		break;
+	case SCSI_PROT_READ_STRIP:
+		prot->dw0 |= (T10_RMV_EN_MSK | T10_CHK_EN_MSK);
+		prot->lbrtcv = lbrt_chk_val;
+		if (prot_type == SCSI_PROT_DIF_TYPE1)
+			prot->dw4 |= (0xc << 16);
+		else if (prot_type == SCSI_PROT_DIF_TYPE3)
+			prot->dw4 |= (0xfc << 16);
+		break;
+	case SCSI_PROT_READ_PASS:
+		prot->dw0 |= T10_CHK_EN_MSK;
+		prot->lbrtcv = lbrt_chk_val;
+		if (prot_type == SCSI_PROT_DIF_TYPE1)
+			prot->dw4 |= (0xc << 16);
+		else if (prot_type == SCSI_PROT_DIF_TYPE3)
+			prot->dw4 |= (0xfc << 16);
+		break;
+	case SCSI_PROT_WRITE_INSERT:
+		prot->dw0 |= T10_INSRT_EN_MSK;
+		prot->lbrtgv = lbrt_chk_val;
+		break;
+	case SCSI_PROT_WRITE_STRIP:
+		prot->dw0 |= (T10_RMV_EN_MSK | T10_CHK_EN_MSK);
+		prot->lbrtcv = lbrt_chk_val;
+		break;
+	case SCSI_PROT_WRITE_PASS:
+		prot->dw0 |= T10_CHK_EN_MSK;
+		prot->lbrtcv = lbrt_chk_val;
+		if (prot_type == SCSI_PROT_DIF_TYPE1)
+			prot->dw4 |= (0xc << 16);
+		else if (prot_type == SCSI_PROT_DIF_TYPE3)
+			prot->dw4 |= (0xfc << 16);
+		break;
+	default:
+		WARN(1, "prot_op(0x%x) is not valid\n", prot_op);
+		break;
+	}
+
+	switch (interval) {
+	case 512:
+		break;
+	case 4096:
+		prot->dw0 |= (0x1 << USR_DATA_BLOCK_SZ_OFF);
+		break;
+	case 520:
+		prot->dw0 |= (0x2 << USR_DATA_BLOCK_SZ_OFF);
+		break;
+	default:
+		WARN(1, "protection interval (0x%x) invalid\n",
+		     interval);
+		break;
+	}
+
+	prot->dw0 |= INCR_LBRT_MSK;
 }
 
 static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
@@ -953,7 +1083,7 @@ static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
 	struct hisi_sas_tmf_task *tmf = slot->tmf;
 	int has_data = 0, priority = !!tmf;
 	u8 *buf_cmd;
-	u32 dw1 = 0, dw2 = 0;
+	u32 dw1 = 0, dw2 = 0, len = 0;
 
 	hdr->dw0 = cpu_to_le32((1 << CMD_HDR_RESP_REPORT_OFF) |
 			       (2 << CMD_HDR_TLR_CTRL_OFF) |
@@ -992,11 +1122,16 @@ static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
 	hdr->dw2 = cpu_to_le32(dw2);
 	hdr->transfer_tags = cpu_to_le32(slot->idx);
 
-	if (has_data)
+	if (has_data) {
 		prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task->scatter,
-					slot->n_elem);
+				   slot->n_elem);
+
+		if (scsi_prot_sg_count(scsi_cmnd))
+			prep_prd_sge_dif_v3_hw(hisi_hba, slot, hdr,
+					       scsi_prot_sglist(scsi_cmnd),
+					       slot->n_elem_dif);
+	}
 
-	hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len);
 	hdr->cmd_table_addr = cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
 	hdr->sts_buffer_addr = cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));
 
@@ -1021,6 +1156,35 @@ static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
 			break;
 		}
 	}
+
+	if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
+		struct hisi_sas_protect_iu_v3_hw prot;
+		unsigned char prot_op = scsi_get_prot_op(scsi_cmnd);
+		u8 *buf_cmd_prot;
+
+		hdr->dw7 |= 1 << CMD_HDR_ADDR_MODE_SEL_OFF;
+		hdr->dw1 |= CMD_HDR_PIR_MSK;
+		buf_cmd_prot = hisi_sas_cmd_hdr_addr_mem(slot) +
+			       sizeof(struct ssp_frame_hdr) +
+			       sizeof(struct ssp_command_iu);
+
+		memset(&prot, 0, sizeof(struct hisi_sas_protect_iu_v3_hw));
+		fill_prot_v3_hw(scsi_cmnd, &prot);
+		memcpy(buf_cmd_prot, &prot,
+		       sizeof(struct hisi_sas_protect_iu_v3_hw));
+
+		if ((prot_op == SCSI_PROT_READ_INSERT) ||
+		    (prot_op == SCSI_PROT_WRITE_INSERT) ||
+		    (prot_op == SCSI_PROT_WRITE_PASS) ||
+		    (prot_op == SCSI_PROT_READ_PASS)) {
+			unsigned int interval = scsi_prot_interval(scsi_cmnd);
+			unsigned int ilog2_interval = ilog2(interval);
+
+			len = (task->total_xfer_len >> ilog2_interval) * 8;
+		}
+	}
+
+	hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len + len);
 }
 
 static void prep_smp_v3_hw(struct hisi_hba *hisi_hba,
@@ -2225,6 +2389,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
 	.bios_param		= sas_bios_param,
 	.this_id		= -1,
 	.sg_tablesize		= HISI_SAS_SGE_PAGE_CNT,
+	.sg_prot_tablesize	= HISI_SAS_SGE_PAGE_CNT,
 	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
 	.use_clustering		= ENABLE_CLUSTERING,
 	.eh_device_reset_handler = sas_eh_device_reset_handler,
@@ -2284,6 +2449,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
 	hisi_hba->dev = dev;
 	hisi_hba->shost = shost;
 	SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;
+	hisi_hba->enable_dif_dix = enable_dif_dix;
 
 	timer_setup(&hisi_hba->timer, NULL, 0);
 
@@ -2395,6 +2561,19 @@ struct device_attribute *host_attrs_v3_hw[] = {
 	if (rc)
 		goto err_out_register_ha;
 
+	if (hisi_hba->enable_dif_dix) {
+		dev_info(dev, "Registering for DIF/DIX type 1/2/3 protection.\n");
+		scsi_host_set_prot(hisi_hba->shost,
+				   SHOST_DIF_TYPE1_PROTECTION |
+				   SHOST_DIF_TYPE2_PROTECTION |
+				   SHOST_DIF_TYPE3_PROTECTION |
+				   SHOST_DIX_TYPE1_PROTECTION |
+				   SHOST_DIX_TYPE2_PROTECTION |
+				   SHOST_DIX_TYPE3_PROTECTION);
+		scsi_host_set_guard(hisi_hba->shost,
+				    SHOST_DIX_GUARD_CRC);
+	}
+
 	scsi_scan_host(shost);
 
 	return 0;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/4] scsi: Add scsi_prot_op_normal()
  2018-11-20 14:59 ` [PATCH 1/4] scsi: Add scsi_prot_op_normal() John Garry
@ 2018-11-20 16:19   ` Christoph Hellwig
  2018-11-20 16:36     ` John Garry
  0 siblings, 1 reply; 13+ messages in thread
From: Christoph Hellwig @ 2018-11-20 16:19 UTC (permalink / raw)
  To: John Garry; +Cc: jejb, martin.petersen, linuxarm, linux-kernel, linux-scsi

> +static inline bool scsi_prot_op_normal(struct scsi_cmnd *scmd)
> +{
> +	return scmd->prot_op == SCSI_PROT_NORMAL;
> +}

This "wrapper" just obsfucates the check being performed, please drop
it.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/4] scsi: Add scsi_prot_op_normal()
  2018-11-20 16:19   ` Christoph Hellwig
@ 2018-11-20 16:36     ` John Garry
  0 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2018-11-20 16:36 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: jejb, martin.petersen, linuxarm, linux-kernel, linux-scsi

On 20/11/2018 16:19, Christoph Hellwig wrote:
>> +static inline bool scsi_prot_op_normal(struct scsi_cmnd *scmd)
>> +{
>> +	return scmd->prot_op == SCSI_PROT_NORMAL;
>> +}
>
> This "wrapper" just obsfucates the check being performed, please drop
> it.
>
> .
>

ok, if you think so.

I just thought that was better for a more concise check, rather than 
this common pattern:
if ((scsi_get_prot_op(scsi_cmnd) != SCSI_PROT_NORMAL) ...

cheers,



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value
  2018-11-20 14:59 ` [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value John Garry
@ 2018-11-21 11:02   ` Steffen Maier
  2018-11-21 11:08     ` Steffen Maier
  0 siblings, 1 reply; 13+ messages in thread
From: Steffen Maier @ 2018-11-21 11:02 UTC (permalink / raw)
  To: John Garry, jejb, martin.petersen
  Cc: linuxarm, linux-kernel, linux-scsi, Xiang Chen

On 11/20/2018 03:59 PM, John Garry wrote:
> From: Xiang Chen <chenxiang66@hisilicon.com>
> 
> Sht->sg_tablesize is set in the driver, and it will be assigned to
> shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
> assign shost->sg_table one more time in the driver.
> 
> In addition to the change, change each scsi_host_template.sg_tablesize
> to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.

Might be completely irrelevant, so just as information: I once had 
problems due to changing (reducing) SHT.sg_tablesize because block queue 
limits of BSG devices of Scsi_Host and fc_host (not sure if you have an 
equivalent bsg device for your transport(s)) inherit from SHT, but don't 
update (automatically) on later updates of shost->sg_tablesize, which in 
turn affect scsi_devices allocated after the shost update.
Cf. 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/s390/scsi?id=5fea4291deacd80188b996d2f555fc6a1940e5d4
("[SCSI] zfcp: block queue limits with data router")
if you need more details.

> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
> Signed-off-by: John Garry <john.garry@huawei.com>
> ---
>   drivers/scsi/hisi_sas/hisi_sas_main.c  | 1 -
>   drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
>   drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
>   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
>   4 files changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
> index d13a662..cbda48e 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
> @@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
>   	shost->max_lun = ~0;
>   	shost->max_channel = 1;
>   	shost->max_cmd_len = 16;
> -	shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>   	if (hisi_hba->hw->slot_index_alloc) {
>   		shost->can_queue = hisi_hba->hw->max_command_entries;
>   		shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
> index d24342b..2d035cc 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
> @@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba *hisi_hba)
>   	.change_queue_depth	= sas_change_queue_depth,
>   	.bios_param		= sas_bios_param,
>   	.this_id		= -1,
> -	.sg_tablesize		= SG_ALL,
> +	.sg_tablesize		= HISI_SAS_SGE_PAGE_CNT,
>   	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
>   	.use_clustering		= ENABLE_CLUSTERING,
>   	.eh_device_reset_handler = sas_eh_device_reset_handler,
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> index e78a97e..79e58a7 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> @@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
>   	.change_queue_depth	= sas_change_queue_depth,
>   	.bios_param		= sas_bios_param,
>   	.this_id		= -1,
> -	.sg_tablesize		= SG_ALL,
> +	.sg_tablesize		= HISI_SAS_SGE_PAGE_CNT,
>   	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
>   	.use_clustering		= ENABLE_CLUSTERING,
>   	.eh_device_reset_handler = sas_eh_device_reset_handler,
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> index 7e2b020..8a08078 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> @@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
>   	.change_queue_depth	= sas_change_queue_depth,
>   	.bios_param		= sas_bios_param,
>   	.this_id		= -1,
> -	.sg_tablesize		= SG_ALL,
> +	.sg_tablesize		= HISI_SAS_SGE_PAGE_CNT,
>   	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
>   	.use_clustering		= ENABLE_CLUSTERING,
>   	.eh_device_reset_handler = sas_eh_device_reset_handler,
> @@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
>   	shost->max_lun = ~0;
>   	shost->max_channel = 1;
>   	shost->max_cmd_len = 16;
> -	shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>   	shost->can_queue = hisi_hba->hw->max_command_entries -
>   		HISI_SAS_RESERVED_IPTT_CNT;
>   	shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
> 


-- 
Mit freundlichen Gruessen / Kind regards
Steffen Maier

Linux on IBM Z Development

IBM Deutschland Research & Development GmbH
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value
  2018-11-21 11:02   ` Steffen Maier
@ 2018-11-21 11:08     ` Steffen Maier
  2018-11-21 11:45       ` John Garry
  0 siblings, 1 reply; 13+ messages in thread
From: Steffen Maier @ 2018-11-21 11:08 UTC (permalink / raw)
  To: John Garry, jejb, martin.petersen
  Cc: linuxarm, linux-kernel, linux-scsi, Xiang Chen

On 11/21/2018 12:02 PM, Steffen Maier wrote:
> On 11/20/2018 03:59 PM, John Garry wrote:
>> From: Xiang Chen <chenxiang66@hisilicon.com>
>>
>> Sht->sg_tablesize is set in the driver, and it will be assigned to
>> shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
>> assign shost->sg_table one more time in the driver.
>>
>> In addition to the change, change each scsi_host_template.sg_tablesize
>> to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.
> 
> Might be completely irrelevant, so just as information: I once had 
> problems due to changing (reducing) SHT.sg_tablesize because block queue 
> limits of BSG devices of Scsi_Host and fc_host (not sure if you have an 
> equivalent bsg device for your transport(s)) inherit from SHT, but don't 
> update (automatically) on later updates of shost->sg_tablesize, which in 
> turn affect scsi_devices allocated after the shost update.
> Cf. 
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/s390/scsi?id=5fea4291deacd80188b996d2f555fc6a1940e5d4 

Figured, your new constant seems to have the same value so no problem.

#define SG_CHUNK_SIZE	128
#define SG_ALL	SG_CHUNK_SIZE
#define HISI_SAS_SGE_PAGE_CNT SG_CHUNK_SIZE

> ("[SCSI] zfcp: block queue limits with data router")
> if you need more details.
> 
>> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
>> Signed-off-by: John Garry <john.garry@huawei.com>
>> ---
>>   drivers/scsi/hisi_sas/hisi_sas_main.c  | 1 -
>>   drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
>>   drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
>>   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
>>   4 files changed, 3 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c 
>> b/drivers/scsi/hisi_sas/hisi_sas_main.c
>> index d13a662..cbda48e 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
>> @@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
>>       shost->max_lun = ~0;
>>       shost->max_channel = 1;
>>       shost->max_cmd_len = 16;
>> -    shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>       if (hisi_hba->hw->slot_index_alloc) {
>>           shost->can_queue = hisi_hba->hw->max_command_entries;
>>           shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c 
>> b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>> index d24342b..2d035cc 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>> @@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba 
>> *hisi_hba)
>>       .change_queue_depth    = sas_change_queue_depth,
>>       .bios_param        = sas_bios_param,
>>       .this_id        = -1,
>> -    .sg_tablesize        = SG_ALL,
>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>       .use_clustering        = ENABLE_CLUSTERING,
>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c 
>> b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> index e78a97e..79e58a7 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> @@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
>>       .change_queue_depth    = sas_change_queue_depth,
>>       .bios_param        = sas_bios_param,
>>       .this_id        = -1,
>> -    .sg_tablesize        = SG_ALL,
>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>       .use_clustering        = ENABLE_CLUSTERING,
>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c 
>> b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>> index 7e2b020..8a08078 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>> @@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>       .change_queue_depth    = sas_change_queue_depth,
>>       .bios_param        = sas_bios_param,
>>       .this_id        = -1,
>> -    .sg_tablesize        = SG_ALL,
>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>       .use_clustering        = ENABLE_CLUSTERING,
>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>> @@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>       shost->max_lun = ~0;
>>       shost->max_channel = 1;
>>       shost->max_cmd_len = 16;
>> -    shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>       shost->can_queue = hisi_hba->hw->max_command_entries -
>>           HISI_SAS_RESERVED_IPTT_CNT;
>>       shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
>>
> 
> 


-- 
Mit freundlichen Gruessen / Kind regards
Steffen Maier

Linux on IBM Z Development

IBM Deutschland Research & Development GmbH
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value
  2018-11-21 11:08     ` Steffen Maier
@ 2018-11-21 11:45       ` John Garry
  0 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2018-11-21 11:45 UTC (permalink / raw)
  To: Steffen Maier, jejb, martin.petersen
  Cc: linuxarm, linux-kernel, linux-scsi, Xiang Chen

On 21/11/2018 11:08, Steffen Maier wrote:
> On 11/21/2018 12:02 PM, Steffen Maier wrote:
>> On 11/20/2018 03:59 PM, John Garry wrote:
>>> From: Xiang Chen <chenxiang66@hisilicon.com>
>>>
>>> Sht->sg_tablesize is set in the driver, and it will be assigned to
>>> shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
>>> assign shost->sg_table one more time in the driver.
>>>
>>> In addition to the change, change each scsi_host_template.sg_tablesize
>>> to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.
>>
>> Might be completely irrelevant, so just as information: I once had
>> problems due to changing (reducing) SHT.sg_tablesize because block
>> queue limits of BSG devices of Scsi_Host and fc_host (not sure if you
>> have an equivalent bsg device for your transport(s)) inherit from SHT,
>> but don't update (automatically) on later updates of
>> shost->sg_tablesize, which in turn affect scsi_devices allocated after
>> the shost update.
>> Cf.
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/s390/scsi?id=5fea4291deacd80188b996d2f555fc6a1940e5d4
>
>
> Figured, your new constant seems to have the same value so no problem.
>

Right, so previously we were doing similar to what you describe - 
setting the value in the SHT and then setting shost->sg_tablesize after 
the host is allocated.

However the values were the same, so in this patch we're just removing 
setting shost->sg_tablesize (again).

Thanks,
John

> #define SG_CHUNK_SIZE    128
> #define SG_ALL    SG_CHUNK_SIZE
> #define HISI_SAS_SGE_PAGE_CNT SG_CHUNK_SIZE
>
>> ("[SCSI] zfcp: block queue limits with data router")
>> if you need more details.
>>
>>> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
>>> Signed-off-by: John Garry <john.garry@huawei.com>
>>> ---
>>>   drivers/scsi/hisi_sas/hisi_sas_main.c  | 1 -
>>>   drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
>>>   drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
>>>   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
>>>   4 files changed, 3 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> index d13a662..cbda48e 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> @@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
>>>       shost->max_lun = ~0;
>>>       shost->max_channel = 1;
>>>       shost->max_cmd_len = 16;
>>> -    shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>>       if (hisi_hba->hw->slot_index_alloc) {
>>>           shost->can_queue = hisi_hba->hw->max_command_entries;
>>>           shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> index d24342b..2d035cc 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> @@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba
>>> *hisi_hba)
>>>       .change_queue_depth    = sas_change_queue_depth,
>>>       .bios_param        = sas_bios_param,
>>>       .this_id        = -1,
>>> -    .sg_tablesize        = SG_ALL,
>>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>>       .use_clustering        = ENABLE_CLUSTERING,
>>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> index e78a97e..79e58a7 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> @@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
>>>       .change_queue_depth    = sas_change_queue_depth,
>>>       .bios_param        = sas_bios_param,
>>>       .this_id        = -1,
>>> -    .sg_tablesize        = SG_ALL,
>>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>>       .use_clustering        = ENABLE_CLUSTERING,
>>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> index 7e2b020..8a08078 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> @@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>>       .change_queue_depth    = sas_change_queue_depth,
>>>       .bios_param        = sas_bios_param,
>>>       .this_id        = -1,
>>> -    .sg_tablesize        = SG_ALL,
>>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>>       .use_clustering        = ENABLE_CLUSTERING,
>>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>>> @@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>>       shost->max_lun = ~0;
>>>       shost->max_channel = 1;
>>>       shost->max_cmd_len = 16;
>>> -    shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>>       shost->can_queue = hisi_hba->hw->max_command_entries -
>>>           HISI_SAS_RESERVED_IPTT_CNT;
>>>       shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
>>>
>>
>>
>
>



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw
  2018-11-20 14:59 ` [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw John Garry
@ 2018-11-24 17:50   ` kbuild test robot
  2018-11-26 15:42     ` John Garry
  0 siblings, 1 reply; 13+ messages in thread
From: kbuild test robot @ 2018-11-24 17:50 UTC (permalink / raw)
  To: John Garry
  Cc: kbuild-all, jejb, martin.petersen, linuxarm, linux-kernel,
	linux-scsi, Xiang Chen, John Garry

[-- Attachment #1: Type: text/plain, Size: 9354 bytes --]

Hi Xiang,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mkp-scsi/for-next]
[also build test WARNING on next-20181123]
[cannot apply to v4.20-rc3]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/John-Garry/hisi_sas-DIF-DIX-support/20181123-202805
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: x86_64-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: incorrect type in argument 1 (different base types)
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26:    expected unsigned long long [unsigned] [usertype] val
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26:    got restricted __le64 [usertype] sas_addr
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: warning: incorrect type in assignment (different base types)
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24:    expected restricted __le64 [usertype] sas_addr
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24:    got unsigned long long
>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: warning: invalid assignment: |=
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26:    left side has type restricted __le32
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26:    right side has type int
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: warning: invalid assignment: |=
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26:    left side has type restricted __le32
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26:    right side has type int
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: warning: incorrect type in initializer (different base types)
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37:    expected unsigned int [unsigned] [usertype] dma_rx_err_type
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37:    got restricted __le32 [usertype] dma_rx_err_type
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: warning: incorrect type in initializer (different base types)
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40:    expected unsigned int [unsigned] [usertype] trans_tx_fail_type
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40:    got restricted __le32 [usertype] trans_tx_fail_type
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1767:40: warning: restricted __le32 degrades to integer
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1781:40: warning: restricted __le32 degrades to integer
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1840:30: warning: restricted __le32 degrades to integer
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1864:26: warning: restricted __le32 degrades to integer
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1976:37: warning: restricted __le32 degrades to integer
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2372:25: warning: symbol 'host_attrs_v3_hw' was not declared. Should it be static?
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: warning: incorrect type in assignment (different base types)
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22:    expected unsigned int [unsigned] [usertype] device_state
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22:    got restricted pci_power_t
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: warning: incorrect type in argument 2 (different base types)
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35:    expected restricted pci_power_t [usertype] state
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35:    got unsigned int [unsigned] [usertype] device_state
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: warning: incorrect type in initializer (different base types)
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32:    expected unsigned int [unsigned] [usertype] device_state
   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32:    got restricted pci_power_t [usertype] current_state

vim +1165 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

  1072	
  1073	static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
  1074				  struct hisi_sas_slot *slot)
  1075	{
  1076		struct sas_task *task = slot->task;
  1077		struct hisi_sas_cmd_hdr *hdr = slot->cmd_hdr;
  1078		struct domain_device *device = task->dev;
  1079		struct hisi_sas_device *sas_dev = device->lldd_dev;
  1080		struct hisi_sas_port *port = slot->port;
  1081		struct sas_ssp_task *ssp_task = &task->ssp_task;
  1082		struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
  1083		struct hisi_sas_tmf_task *tmf = slot->tmf;
  1084		int has_data = 0, priority = !!tmf;
  1085		u8 *buf_cmd;
  1086		u32 dw1 = 0, dw2 = 0, len = 0;
  1087	
  1088		hdr->dw0 = cpu_to_le32((1 << CMD_HDR_RESP_REPORT_OFF) |
  1089				       (2 << CMD_HDR_TLR_CTRL_OFF) |
  1090				       (port->id << CMD_HDR_PORT_OFF) |
  1091				       (priority << CMD_HDR_PRIORITY_OFF) |
  1092				       (1 << CMD_HDR_CMD_OFF)); /* ssp */
  1093	
  1094		dw1 = 1 << CMD_HDR_VDTL_OFF;
  1095		if (tmf) {
  1096			dw1 |= 2 << CMD_HDR_FRAME_TYPE_OFF;
  1097			dw1 |= DIR_NO_DATA << CMD_HDR_DIR_OFF;
  1098		} else {
  1099			dw1 |= 1 << CMD_HDR_FRAME_TYPE_OFF;
  1100			switch (scsi_cmnd->sc_data_direction) {
  1101			case DMA_TO_DEVICE:
  1102				has_data = 1;
  1103				dw1 |= DIR_TO_DEVICE << CMD_HDR_DIR_OFF;
  1104				break;
  1105			case DMA_FROM_DEVICE:
  1106				has_data = 1;
  1107				dw1 |= DIR_TO_INI << CMD_HDR_DIR_OFF;
  1108				break;
  1109			default:
  1110				dw1 &= ~CMD_HDR_DIR_MSK;
  1111			}
  1112		}
  1113	
  1114		/* map itct entry */
  1115		dw1 |= sas_dev->device_id << CMD_HDR_DEV_ID_OFF;
  1116		hdr->dw1 = cpu_to_le32(dw1);
  1117	
  1118		dw2 = (((sizeof(struct ssp_command_iu) + sizeof(struct ssp_frame_hdr)
  1119		      + 3) / 4) << CMD_HDR_CFL_OFF) |
  1120		      ((HISI_SAS_MAX_SSP_RESP_SZ / 4) << CMD_HDR_MRFL_OFF) |
  1121		      (2 << CMD_HDR_SG_MOD_OFF);
  1122		hdr->dw2 = cpu_to_le32(dw2);
  1123		hdr->transfer_tags = cpu_to_le32(slot->idx);
  1124	
  1125		if (has_data) {
  1126			prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task->scatter,
  1127					   slot->n_elem);
  1128	
  1129			if (scsi_prot_sg_count(scsi_cmnd))
  1130				prep_prd_sge_dif_v3_hw(hisi_hba, slot, hdr,
  1131						       scsi_prot_sglist(scsi_cmnd),
  1132						       slot->n_elem_dif);
  1133		}
  1134	
  1135		hdr->cmd_table_addr = cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
  1136		hdr->sts_buffer_addr = cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));
  1137	
  1138		buf_cmd = hisi_sas_cmd_hdr_addr_mem(slot) +
  1139			sizeof(struct ssp_frame_hdr);
  1140	
  1141		memcpy(buf_cmd, &task->ssp_task.LUN, 8);
  1142		if (!tmf) {
  1143			buf_cmd[9] = ssp_task->task_attr | (ssp_task->task_prio << 3);
  1144			memcpy(buf_cmd + 12, scsi_cmnd->cmnd, scsi_cmnd->cmd_len);
  1145		} else {
  1146			buf_cmd[10] = tmf->tmf;
  1147			switch (tmf->tmf) {
  1148			case TMF_ABORT_TASK:
  1149			case TMF_QUERY_TASK:
  1150				buf_cmd[12] =
  1151					(tmf->tag_of_task_to_be_managed >> 8) & 0xff;
  1152				buf_cmd[13] =
  1153					tmf->tag_of_task_to_be_managed & 0xff;
  1154				break;
  1155			default:
  1156				break;
  1157			}
  1158		}
  1159	
  1160		if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
  1161			struct hisi_sas_protect_iu_v3_hw prot;
  1162			unsigned char prot_op = scsi_get_prot_op(scsi_cmnd);
  1163			u8 *buf_cmd_prot;
  1164	
> 1165			hdr->dw7 |= 1 << CMD_HDR_ADDR_MODE_SEL_OFF;
  1166			hdr->dw1 |= CMD_HDR_PIR_MSK;
  1167			buf_cmd_prot = hisi_sas_cmd_hdr_addr_mem(slot) +
  1168				       sizeof(struct ssp_frame_hdr) +
  1169				       sizeof(struct ssp_command_iu);
  1170	
  1171			memset(&prot, 0, sizeof(struct hisi_sas_protect_iu_v3_hw));
  1172			fill_prot_v3_hw(scsi_cmnd, &prot);
  1173			memcpy(buf_cmd_prot, &prot,
  1174			       sizeof(struct hisi_sas_protect_iu_v3_hw));
  1175	
  1176			if ((prot_op == SCSI_PROT_READ_INSERT) ||
  1177			    (prot_op == SCSI_PROT_WRITE_INSERT) ||
  1178			    (prot_op == SCSI_PROT_WRITE_PASS) ||
  1179			    (prot_op == SCSI_PROT_READ_PASS)) {
  1180				unsigned int interval = scsi_prot_interval(scsi_cmnd);
  1181				unsigned int ilog2_interval = ilog2(interval);
  1182	
  1183				len = (task->total_xfer_len >> ilog2_interval) * 8;
  1184			}
  1185		}
  1186	
  1187		hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len + len);
  1188	}
  1189	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 66613 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw
  2018-11-24 17:50   ` kbuild test robot
@ 2018-11-26 15:42     ` John Garry
  2018-12-05  0:50       ` [kbuild-all] " Li, Philip
  0 siblings, 1 reply; 13+ messages in thread
From: John Garry @ 2018-11-26 15:42 UTC (permalink / raw)
  To: kbuild test robot
  Cc: kbuild-all, jejb, martin.petersen, linuxarm, linux-kernel,
	linux-scsi, Xiang Chen

On 24/11/2018 17:50, kbuild test robot wrote:
> Hi Xiang,
>
> Thank you for the patch! Perhaps something to improve:
>
> [auto build test WARNING on mkp-scsi/for-next]
> [also build test WARNING on next-20181123]
> [cannot apply to v4.20-rc3]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url:    https://github.com/0day-ci/linux/commits/John-Garry/hisi_sas-DIF-DIX-support/20181123-202805
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
> config: x86_64-allmodconfig (attached as .config)
> compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=x86_64

For sparse errors - which are detected, below - we need C=2 option, right?

It would be good to include that in the instructions.

Thanks,
John

>
> All warnings (new ones prefixed by >>):
>
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: incorrect type in argument 1 (different base types)
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26:    expected unsigned long long [unsigned] [usertype] val
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26:    got restricted __le64 [usertype] sas_addr
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: warning: incorrect type in assignment (different base types)
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24:    expected restricted __le64 [usertype] sas_addr
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24:    got unsigned long long
>>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: warning: invalid assignment: |=
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26:    left side has type restricted __le32
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26:    right side has type int
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: warning: invalid assignment: |=
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26:    left side has type restricted __le32
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26:    right side has type int
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: warning: incorrect type in initializer (different base types)
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37:    expected unsigned int [unsigned] [usertype] dma_rx_err_type
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37:    got restricted __le32 [usertype] dma_rx_err_type
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: warning: incorrect type in initializer (different base types)
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40:    expected unsigned int [unsigned] [usertype] trans_tx_fail_type
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40:    got restricted __le32 [usertype] trans_tx_fail_type
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1767:40: warning: restricted __le32 degrades to integer
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1781:40: warning: restricted __le32 degrades to integer
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1840:30: warning: restricted __le32 degrades to integer
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1864:26: warning: restricted __le32 degrades to integer
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1976:37: warning: restricted __le32 degrades to integer
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2372:25: warning: symbol 'host_attrs_v3_hw' was not declared. Should it be static?
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: warning: incorrect type in assignment (different base types)
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22:    expected unsigned int [unsigned] [usertype] device_state
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22:    got restricted pci_power_t
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: warning: incorrect type in argument 2 (different base types)
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35:    expected restricted pci_power_t [usertype] state
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35:    got unsigned int [unsigned] [usertype] device_state
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: warning: incorrect type in initializer (different base types)
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32:    expected unsigned int [unsigned] [usertype] device_state
>    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32:    got restricted pci_power_t [usertype] current_state
>
> vim +1165 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>
>   1072	
>   1073	static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
>   1074				  struct hisi_sas_slot *slot)
>   1075	{
>   1076		struct sas_task *task = slot->task;
>   1077		struct hisi_sas_cmd_hdr *hdr = slot->cmd_hdr;
>   1078		struct domain_device *device = task->dev;
>   1079		struct hisi_sas_device *sas_dev = device->lldd_dev;
>   1080		struct hisi_sas_port *port = slot->port;
>   1081		struct sas_ssp_task *ssp_task = &task->ssp_task;
>   1082		struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
>   1083		struct hisi_sas_tmf_task *tmf = slot->tmf;
>   1084		int has_data = 0, priority = !!tmf;
>   1085		u8 *buf_cmd;
>   1086		u32 dw1 = 0, dw2 = 0, len = 0;
>   1087	
>   1088		hdr->dw0 = cpu_to_le32((1 << CMD_HDR_RESP_REPORT_OFF) |
>   1089				       (2 << CMD_HDR_TLR_CTRL_OFF) |
>   1090				       (port->id << CMD_HDR_PORT_OFF) |
>   1091				       (priority << CMD_HDR_PRIORITY_OFF) |
>   1092				       (1 << CMD_HDR_CMD_OFF)); /* ssp */
>   1093	
>   1094		dw1 = 1 << CMD_HDR_VDTL_OFF;
>   1095		if (tmf) {
>   1096			dw1 |= 2 << CMD_HDR_FRAME_TYPE_OFF;
>   1097			dw1 |= DIR_NO_DATA << CMD_HDR_DIR_OFF;
>   1098		} else {
>   1099			dw1 |= 1 << CMD_HDR_FRAME_TYPE_OFF;
>   1100			switch (scsi_cmnd->sc_data_direction) {
>   1101			case DMA_TO_DEVICE:
>   1102				has_data = 1;
>   1103				dw1 |= DIR_TO_DEVICE << CMD_HDR_DIR_OFF;
>   1104				break;
>   1105			case DMA_FROM_DEVICE:
>   1106				has_data = 1;
>   1107				dw1 |= DIR_TO_INI << CMD_HDR_DIR_OFF;
>   1108				break;
>   1109			default:
>   1110				dw1 &= ~CMD_HDR_DIR_MSK;
>   1111			}
>   1112		}
>   1113	
>   1114		/* map itct entry */
>   1115		dw1 |= sas_dev->device_id << CMD_HDR_DEV_ID_OFF;
>   1116		hdr->dw1 = cpu_to_le32(dw1);
>   1117	
>   1118		dw2 = (((sizeof(struct ssp_command_iu) + sizeof(struct ssp_frame_hdr)
>   1119		      + 3) / 4) << CMD_HDR_CFL_OFF) |
>   1120		      ((HISI_SAS_MAX_SSP_RESP_SZ / 4) << CMD_HDR_MRFL_OFF) |
>   1121		      (2 << CMD_HDR_SG_MOD_OFF);
>   1122		hdr->dw2 = cpu_to_le32(dw2);
>   1123		hdr->transfer_tags = cpu_to_le32(slot->idx);
>   1124	
>   1125		if (has_data) {
>   1126			prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task->scatter,
>   1127					   slot->n_elem);
>   1128	
>   1129			if (scsi_prot_sg_count(scsi_cmnd))
>   1130				prep_prd_sge_dif_v3_hw(hisi_hba, slot, hdr,
>   1131						       scsi_prot_sglist(scsi_cmnd),
>   1132						       slot->n_elem_dif);
>   1133		}
>   1134	
>   1135		hdr->cmd_table_addr = cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
>   1136		hdr->sts_buffer_addr = cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));
>   1137	
>   1138		buf_cmd = hisi_sas_cmd_hdr_addr_mem(slot) +
>   1139			sizeof(struct ssp_frame_hdr);
>   1140	
>   1141		memcpy(buf_cmd, &task->ssp_task.LUN, 8);
>   1142		if (!tmf) {
>   1143			buf_cmd[9] = ssp_task->task_attr | (ssp_task->task_prio << 3);
>   1144			memcpy(buf_cmd + 12, scsi_cmnd->cmnd, scsi_cmnd->cmd_len);
>   1145		} else {
>   1146			buf_cmd[10] = tmf->tmf;
>   1147			switch (tmf->tmf) {
>   1148			case TMF_ABORT_TASK:
>   1149			case TMF_QUERY_TASK:
>   1150				buf_cmd[12] =
>   1151					(tmf->tag_of_task_to_be_managed >> 8) & 0xff;
>   1152				buf_cmd[13] =
>   1153					tmf->tag_of_task_to_be_managed & 0xff;
>   1154				break;
>   1155			default:
>   1156				break;
>   1157			}
>   1158		}
>   1159	
>   1160		if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
>   1161			struct hisi_sas_protect_iu_v3_hw prot;
>   1162			unsigned char prot_op = scsi_get_prot_op(scsi_cmnd);
>   1163			u8 *buf_cmd_prot;
>   1164	
>> 1165			hdr->dw7 |= 1 << CMD_HDR_ADDR_MODE_SEL_OFF;
>   1166			hdr->dw1 |= CMD_HDR_PIR_MSK;
>   1167			buf_cmd_prot = hisi_sas_cmd_hdr_addr_mem(slot) +
>   1168				       sizeof(struct ssp_frame_hdr) +
>   1169				       sizeof(struct ssp_command_iu);
>   1170	
>   1171			memset(&prot, 0, sizeof(struct hisi_sas_protect_iu_v3_hw));
>   1172			fill_prot_v3_hw(scsi_cmnd, &prot);
>   1173			memcpy(buf_cmd_prot, &prot,
>   1174			       sizeof(struct hisi_sas_protect_iu_v3_hw));
>   1175	
>   1176			if ((prot_op == SCSI_PROT_READ_INSERT) ||
>   1177			    (prot_op == SCSI_PROT_WRITE_INSERT) ||
>   1178			    (prot_op == SCSI_PROT_WRITE_PASS) ||
>   1179			    (prot_op == SCSI_PROT_READ_PASS)) {
>   1180				unsigned int interval = scsi_prot_interval(scsi_cmnd);
>   1181				unsigned int ilog2_interval = ilog2(interval);
>   1182	
>   1183				len = (task->total_xfer_len >> ilog2_interval) * 8;
>   1184			}
>   1185		}
>   1186	
>   1187		hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len + len);
>   1188	}
>   1189	
>
> ---
> 0-DAY kernel test infrastructure                Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
>



^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: [kbuild-all] [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw
  2018-11-26 15:42     ` John Garry
@ 2018-12-05  0:50       ` Li, Philip
  0 siblings, 0 replies; 13+ messages in thread
From: Li, Philip @ 2018-12-05  0:50 UTC (permalink / raw)
  To: John Garry, lkp
  Cc: jejb, martin.petersen, linux-scsi, Xiang Chen, linux-kernel,
	linuxarm, kbuild-all

Subject: Re: [kbuild-all] [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX
> feature for v3 hw
> 
> On 24/11/2018 17:50, kbuild test robot wrote:
> > Hi Xiang,
> >
> > Thank you for the patch! Perhaps something to improve:
> >
> > [auto build test WARNING on mkp-scsi/for-next]
> > [also build test WARNING on next-20181123]
> > [cannot apply to v4.20-rc3]
> > [if your patch is applied to the wrong git tree, please drop us a note to help
> improve the system]
> >
> > url:    https://github.com/0day-ci/linux/commits/John-Garry/hisi_sas-DIF-DIX-
> support/20181123-202805
> > base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
> > config: x86_64-allmodconfig (attached as .config)
> > compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
> > reproduce:
> >         # save the attached .config to linux build tree
> >         make ARCH=x86_64
> 
> For sparse errors - which are detected, below - we need C=2 option, right?
thanks John for the input, we will look into this to enhance the reproducing steps.

> 
> It would be good to include that in the instructions.
> 
> Thanks,
> John
> 
> >
> > All warnings (new ones prefixed by >>):
> >
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: incorrect type in
> argument 1 (different base types)
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26:    expected unsigned long
> long [unsigned] [usertype] val
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26:    got restricted __le64
> [usertype] sas_addr
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: warning: incorrect type in
> assignment (different base types)
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24:    expected restricted __le64
> [usertype] sas_addr
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24:    got unsigned long long
> >>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: warning: invalid assignment:
> |=
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26:    left side has type restricted
> __le32
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26:    right side has type int
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: warning: invalid assignment:
> |=
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26:    left side has type restricted
> __le32
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26:    right side has type int
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: warning: incorrect type in
> initializer (different base types)
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37:    expected unsigned int
> [unsigned] [usertype] dma_rx_err_type
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37:    got restricted __le32
> [usertype] dma_rx_err_type
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: warning: incorrect type in
> initializer (different base types)
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40:    expected unsigned int
> [unsigned] [usertype] trans_tx_fail_type
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40:    got restricted __le32
> [usertype] trans_tx_fail_type
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1767:40: warning: restricted __le32
> degrades to integer
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1781:40: warning: restricted __le32
> degrades to integer
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1840:30: warning: restricted __le32
> degrades to integer
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1864:26: warning: restricted __le32
> degrades to integer
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1976:37: warning: restricted __le32
> degrades to integer
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2372:25: warning: symbol
> 'host_attrs_v3_hw' was not declared. Should it be static?
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: warning: incorrect type in
> assignment (different base types)
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22:    expected unsigned int
> [unsigned] [usertype] device_state
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22:    got restricted pci_power_t
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: warning: incorrect type in
> argument 2 (different base types)
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35:    expected restricted
> pci_power_t [usertype] state
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35:    got unsigned int [unsigned]
> [usertype] device_state
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: warning: incorrect type in
> initializer (different base types)
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32:    expected unsigned int
> [unsigned] [usertype] device_state
> >    drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32:    got restricted pci_power_t
> [usertype] current_state
> >
> > vim +1165 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> >
> >   1072
> >   1073	static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
> >   1074				  struct hisi_sas_slot *slot)
> >   1075	{
> >   1076		struct sas_task *task = slot->task;
> >   1077		struct hisi_sas_cmd_hdr *hdr = slot->cmd_hdr;
> >   1078		struct domain_device *device = task->dev;
> >   1079		struct hisi_sas_device *sas_dev = device->lldd_dev;
> >   1080		struct hisi_sas_port *port = slot->port;
> >   1081		struct sas_ssp_task *ssp_task = &task->ssp_task;
> >   1082		struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
> >   1083		struct hisi_sas_tmf_task *tmf = slot->tmf;
> >   1084		int has_data = 0, priority = !!tmf;
> >   1085		u8 *buf_cmd;
> >   1086		u32 dw1 = 0, dw2 = 0, len = 0;
> >   1087
> >   1088		hdr->dw0 = cpu_to_le32((1 <<
> CMD_HDR_RESP_REPORT_OFF) |
> >   1089				       (2 << CMD_HDR_TLR_CTRL_OFF) |
> >   1090				       (port->id << CMD_HDR_PORT_OFF)
> |
> >   1091				       (priority <<
> CMD_HDR_PRIORITY_OFF) |
> >   1092				       (1 << CMD_HDR_CMD_OFF)); /*
> ssp */
> >   1093
> >   1094		dw1 = 1 << CMD_HDR_VDTL_OFF;
> >   1095		if (tmf) {
> >   1096			dw1 |= 2 << CMD_HDR_FRAME_TYPE_OFF;
> >   1097			dw1 |= DIR_NO_DATA << CMD_HDR_DIR_OFF;
> >   1098		} else {
> >   1099			dw1 |= 1 << CMD_HDR_FRAME_TYPE_OFF;
> >   1100			switch (scsi_cmnd->sc_data_direction) {
> >   1101			case DMA_TO_DEVICE:
> >   1102				has_data = 1;
> >   1103				dw1 |= DIR_TO_DEVICE <<
> CMD_HDR_DIR_OFF;
> >   1104				break;
> >   1105			case DMA_FROM_DEVICE:
> >   1106				has_data = 1;
> >   1107				dw1 |= DIR_TO_INI <<
> CMD_HDR_DIR_OFF;
> >   1108				break;
> >   1109			default:
> >   1110				dw1 &= ~CMD_HDR_DIR_MSK;
> >   1111			}
> >   1112		}
> >   1113
> >   1114		/* map itct entry */
> >   1115		dw1 |= sas_dev->device_id << CMD_HDR_DEV_ID_OFF;
> >   1116		hdr->dw1 = cpu_to_le32(dw1);
> >   1117
> >   1118		dw2 = (((sizeof(struct ssp_command_iu) + sizeof(struct
> ssp_frame_hdr)
> >   1119		      + 3) / 4) << CMD_HDR_CFL_OFF) |
> >   1120		      ((HISI_SAS_MAX_SSP_RESP_SZ / 4) <<
> CMD_HDR_MRFL_OFF) |
> >   1121		      (2 << CMD_HDR_SG_MOD_OFF);
> >   1122		hdr->dw2 = cpu_to_le32(dw2);
> >   1123		hdr->transfer_tags = cpu_to_le32(slot->idx);
> >   1124
> >   1125		if (has_data) {
> >   1126			prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task-
> >scatter,
> >   1127					   slot->n_elem);
> >   1128
> >   1129			if (scsi_prot_sg_count(scsi_cmnd))
> >   1130				prep_prd_sge_dif_v3_hw(hisi_hba, slot,
> hdr,
> >   1131
> scsi_prot_sglist(scsi_cmnd),
> >   1132						       slot->n_elem_dif);
> >   1133		}
> >   1134
> >   1135		hdr->cmd_table_addr =
> cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
> >   1136		hdr->sts_buffer_addr =
> cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));
> >   1137
> >   1138		buf_cmd = hisi_sas_cmd_hdr_addr_mem(slot) +
> >   1139			sizeof(struct ssp_frame_hdr);
> >   1140
> >   1141		memcpy(buf_cmd, &task->ssp_task.LUN, 8);
> >   1142		if (!tmf) {
> >   1143			buf_cmd[9] = ssp_task->task_attr | (ssp_task-
> >task_prio << 3);
> >   1144			memcpy(buf_cmd + 12, scsi_cmnd->cmnd,
> scsi_cmnd->cmd_len);
> >   1145		} else {
> >   1146			buf_cmd[10] = tmf->tmf;
> >   1147			switch (tmf->tmf) {
> >   1148			case TMF_ABORT_TASK:
> >   1149			case TMF_QUERY_TASK:
> >   1150				buf_cmd[12] =
> >   1151					(tmf-
> >tag_of_task_to_be_managed >> 8) & 0xff;
> >   1152				buf_cmd[13] =
> >   1153					tmf->tag_of_task_to_be_managed
> & 0xff;
> >   1154				break;
> >   1155			default:
> >   1156				break;
> >   1157			}
> >   1158		}
> >   1159
> >   1160		if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
> >   1161			struct hisi_sas_protect_iu_v3_hw prot;
> >   1162			unsigned char prot_op =
> scsi_get_prot_op(scsi_cmnd);
> >   1163			u8 *buf_cmd_prot;
> >   1164
> >> 1165			hdr->dw7 |= 1 <<
> CMD_HDR_ADDR_MODE_SEL_OFF;
> >   1166			hdr->dw1 |= CMD_HDR_PIR_MSK;
> >   1167			buf_cmd_prot =
> hisi_sas_cmd_hdr_addr_mem(slot) +
> >   1168				       sizeof(struct ssp_frame_hdr) +
> >   1169				       sizeof(struct ssp_command_iu);
> >   1170
> >   1171			memset(&prot, 0, sizeof(struct
> hisi_sas_protect_iu_v3_hw));
> >   1172			fill_prot_v3_hw(scsi_cmnd, &prot);
> >   1173			memcpy(buf_cmd_prot, &prot,
> >   1174			       sizeof(struct hisi_sas_protect_iu_v3_hw));
> >   1175
> >   1176			if ((prot_op == SCSI_PROT_READ_INSERT) ||
> >   1177			    (prot_op == SCSI_PROT_WRITE_INSERT) ||
> >   1178			    (prot_op == SCSI_PROT_WRITE_PASS) ||
> >   1179			    (prot_op == SCSI_PROT_READ_PASS)) {
> >   1180				unsigned int interval =
> scsi_prot_interval(scsi_cmnd);
> >   1181				unsigned int ilog2_interval =
> ilog2(interval);
> >   1182
> >   1183				len = (task->total_xfer_len >>
> ilog2_interval) * 8;
> >   1184			}
> >   1185		}
> >   1186
> >   1187		hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len
> + len);
> >   1188	}
> >   1189
> >
> > ---
> > 0-DAY kernel test infrastructure                Open Source Technology Center
> > https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
> >
> 
> 
> _______________________________________________
> kbuild-all mailing list
> kbuild-all@lists.01.org
> https://lists.01.org/mailman/listinfo/kbuild-all

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2018-12-05  0:50 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-20 14:59 [PATCH 0/4] hisi_sas: DIF/DIX support John Garry
2018-11-20 14:59 ` [PATCH 1/4] scsi: Add scsi_prot_op_normal() John Garry
2018-11-20 16:19   ` Christoph Hellwig
2018-11-20 16:36     ` John Garry
2018-11-20 14:59 ` [PATCH 2/4] scsi: hisi_sas: Relocate some code to reduce complexity John Garry
2018-11-20 14:59 ` [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value John Garry
2018-11-21 11:02   ` Steffen Maier
2018-11-21 11:08     ` Steffen Maier
2018-11-21 11:45       ` John Garry
2018-11-20 14:59 ` [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw John Garry
2018-11-24 17:50   ` kbuild test robot
2018-11-26 15:42     ` John Garry
2018-12-05  0:50       ` [kbuild-all] " Li, Philip

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).