Re: [PATCH 07/22] scsi: hisi_sas: add the initialisation for pci-based controller

2017-05-17 Thread John Garry

On 17/05/2017 13:33, Arnd Bergmann wrote:

On Wed, May 17, 2017 at 12:49 PM, John Garry  wrote:

> Add the code to initialise controller which is based on pci device
> in hisi_sas_pci_init.c
>
> The main functionality added is for probing and initialisation of
> the controller based on pci device.
>
> The core controller routines are still in hisi_sas_main.c; some
> common initialisation functions and structures are also exported from
> hisi_sas_main.c for pci init.
>
> For platform device-based controller, controller properties - like
> phy count - were read from the firmware. For pci-based controller this
> information is hard-coded in the driver, in new struct hisi_sas_pci_hw.
>

Do you plan to add further PCI based front-ends besides the v3 driver
in the future? If not, you can save one level of indirection here and merge
pci_init.c into the v3 implementation.

 Arnd


Hi Arnd,

I think for now, any hw revisions will be very closely based on v3. And, 
for future revisions, the driver has been well abstracted so we can 
still support any updated features in another version of hisi_sas_hw in 
v3 driver.


I actually kept v3 driver and pci_init.c separate as initially I thought 
we could merge v2 and v3 driver eventually. But with different 
functionality, register format, interrupts, I am not 100% confident. Now 
my only concern is that layout differences between v1/2 and v3 driver, 
but this is not critical. Anyway, I think we can merge them for now.


Cheers,
John



Re: [PATCH 07/22] scsi: hisi_sas: add the initialisation for pci-based controller

2017-05-17 Thread Arnd Bergmann
On Wed, May 17, 2017 at 12:49 PM, John Garry  wrote:
> Add the code to initialise controller which is based on pci device
> in hisi_sas_pci_init.c
>
> The main functionality added is for probing and initialisation of
> the controller based on pci device.
>
> The core controller routines are still in hisi_sas_main.c; some
> common initialisation functions and structures are also exported from
> hisi_sas_main.c for pci init.
>
> For platform device-based controller, controller properties - like
> phy count - were read from the firmware. For pci-based controller this
> information is hard-coded in the driver, in new struct hisi_sas_pci_hw.
>

Do you plan to add further PCI based front-ends besides the v3 driver
in the future? If not, you can save one level of indirection here and merge
pci_init.c into the v3 implementation.

 Arnd


[PATCH 07/22] scsi: hisi_sas: add the initialisation for pci-based controller

2017-05-17 Thread John Garry
Add the code to initialise controller which is based on pci device
in hisi_sas_pci_init.c

The main functionality added is for probing and initialisation of
the controller based on pci device.

The core controller routines are still in hisi_sas_main.c; some
common initialisation functions and structures are also exported from
hisi_sas_main.c for pci init.

For platform device-based controller, controller properties - like
phy count - were read from the firmware. For pci-based controller this
information is hard-coded in the driver, in new struct hisi_sas_pci_hw.

Signed-off-by: John Garry 
Signed-off-by: Xiang Chen 
---
 drivers/scsi/hisi_sas/Kconfig |  10 +-
 drivers/scsi/hisi_sas/Makefile|   1 +
 drivers/scsi/hisi_sas/hisi_sas.h  |  19 
 drivers/scsi/hisi_sas/hisi_sas_main.c |  18 ++-
 drivers/scsi/hisi_sas/hisi_sas_pci_init.c | 182 ++
 5 files changed, 223 insertions(+), 7 deletions(-)
 create mode 100644 drivers/scsi/hisi_sas/hisi_sas_pci_init.c

diff --git a/drivers/scsi/hisi_sas/Kconfig b/drivers/scsi/hisi_sas/Kconfig
index 374a329..d42f29a 100644
--- a/drivers/scsi/hisi_sas/Kconfig
+++ b/drivers/scsi/hisi_sas/Kconfig
@@ -6,4 +6,12 @@ config SCSI_HISI_SAS
select BLK_DEV_INTEGRITY
depends on ATA
help
-   This driver supports HiSilicon's SAS HBA
+   This driver supports HiSilicon's SAS HBA, including support 
based
+   on platform device
+
+config SCSI_HISI_SAS_PCI
+   tristate "HiSilicon SAS on PCI bus"
+   depends on SCSI_HISI_SAS
+   depends on PCI
+   help
+   This driver supports HiSilicon's SAS HBA based on PCI device
diff --git a/drivers/scsi/hisi_sas/Makefile b/drivers/scsi/hisi_sas/Makefile
index c6d3a1b..3a036a8 100644
--- a/drivers/scsi/hisi_sas/Makefile
+++ b/drivers/scsi/hisi_sas/Makefile
@@ -1,2 +1,3 @@
 obj-$(CONFIG_SCSI_HISI_SAS)+= hisi_sas_main.o
 obj-$(CONFIG_SCSI_HISI_SAS)+= hisi_sas_v1_hw.o hisi_sas_v2_hw.o
+obj-$(CONFIG_SCSI_HISI_SAS_PCI)+= hisi_sas_pci_init.o
diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
index 18044b7..9bc9550 100644
--- a/drivers/scsi/hisi_sas/hisi_sas.h
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
@@ -186,6 +186,12 @@ struct hisi_sas_hw {
int complete_hdr_size;
 };
 
+struct hisi_sas_pci_hw {
+   int n_phy;
+   int queue_count;
+   const struct hisi_sas_hw *hw;
+};
+
 struct hisi_hba {
/* This must be the first element, used by SHOST_TO_SAS_HA */
struct sas_ha_struct *p;
@@ -359,6 +365,19 @@ struct hisi_sas_command_table_ssp {
struct hisi_sas_command_table_stp stp;
 };
 
+extern struct scsi_transport_template *hisi_sas_stt;
+extern struct scsi_host_template *hisi_sas_sht;
+
+extern void hisi_sas_init_add(struct hisi_hba *hisi_hba);
+extern int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost);
+extern void hisi_sas_free(struct hisi_hba *hisi_hba);
+
+#if IS_ENABLED(CONFIG_SCSI_HISI_SAS_PCI)
+extern int hisi_sas_pci_probe(struct pci_dev *pdev,
+  const struct hisi_sas_pci_hw *hw);
+extern void hisi_sas_pci_remove(struct pci_dev *pdev);
+#endif
+
 extern u8 hisi_sas_get_ata_protocol(u8 cmd, int direction);
 extern struct hisi_sas_port *to_hisi_sas_port(struct asd_sas_port *sas_port);
 extern void hisi_sas_sata_done(struct sas_task *task,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c 
b/drivers/scsi/hisi_sas/hisi_sas_main.c
index d20a2f2..33bd3c45 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -1476,9 +1476,10 @@ void hisi_sas_rescan_topology(struct hisi_hba *hisi_hba, 
u32 old_state,
 }
 EXPORT_SYMBOL_GPL(hisi_sas_rescan_topology);
 
-static struct scsi_transport_template *hisi_sas_stt;
+struct scsi_transport_template *hisi_sas_stt;
+EXPORT_SYMBOL_GPL(hisi_sas_stt);
 
-static struct scsi_host_template hisi_sas_sht = {
+static struct scsi_host_template _hisi_sas_sht = {
.module = THIS_MODULE,
.name   = DRV_NAME,
.queuecommand   = sas_queuecommand,
@@ -1498,6 +1499,8 @@ void hisi_sas_rescan_topology(struct hisi_hba *hisi_hba, 
u32 old_state,
.target_destroy = sas_target_destroy,
.ioctl  = sas_ioctl,
 };
+struct scsi_host_template *hisi_sas_sht = &_hisi_sas_sht;
+EXPORT_SYMBOL_GPL(hisi_sas_sht);
 
 static struct sas_domain_function_template hisi_sas_transport_ops = {
.lldd_dev_found = hisi_sas_dev_found,
@@ -1545,7 +1548,7 @@ void hisi_sas_init_mem(struct hisi_hba *hisi_hba)
 }
 EXPORT_SYMBOL_GPL(hisi_sas_init_mem);
 
-static int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost)
+int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost)
 {
struct device *dev = hisi_hba->dev;
int i, s,