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