diff options
author | Michal Simek <michal.simek@xilinx.com> | 2016-09-08 15:06:45 +0200 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2016-12-20 09:15:27 +0100 |
commit | e8a016b53731bba820246c9509ce8ef74c944560 (patch) | |
tree | b9382ac0cd9f4dcd9cb8cfae459770d09ea4d43f /include | |
parent | 720ba46e71b09d379a3590a4a35c35d5938338b5 (diff) | |
download | u-boot-imx-e8a016b53731bba820246c9509ce8ef74c944560.zip u-boot-imx-e8a016b53731bba820246c9509ce8ef74c944560.tar.gz u-boot-imx-e8a016b53731bba820246c9509ce8ef74c944560.tar.bz2 |
dm: Add support for scsi/sata based devices
All sata based drivers are bind and corresponding block
device is created. Based on this find_scsi_device() is able
to get back block device based on scsi_curr_dev pointer.
intr_scsi() is commented now but it can be replaced by calling
find_scsi_device() and scsi_scan().
scsi_dev_desc[] is commented out but common/scsi.c heavily depends on
it. That's why CONFIG_SYS_SCSI_MAX_DEVICE is hardcoded to 1 and symbol
is reassigned to a block description allocated by uclass.
There is only one block description by device now but it doesn't need to
be correct when more devices are present.
scsi_bind() ensures corresponding block device creation.
uclass post_probe (scsi_post_probe()) is doing low level init.
SCSI/SATA DM based drivers requires to have 64bit base address as
the first entry in platform data structure to setup mmio_base.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/ahci.h | 2 | ||||
-rw-r--r-- | include/dm/uclass-id.h | 1 | ||||
-rw-r--r-- | include/sata.h | 2 | ||||
-rw-r--r-- | include/scsi.h | 20 |
4 files changed, 23 insertions, 2 deletions
diff --git a/include/ahci.h b/include/ahci.h index a956c6f..4876b41 100644 --- a/include/ahci.h +++ b/include/ahci.h @@ -145,7 +145,7 @@ struct ahci_ioports { }; struct ahci_probe_ent { -#ifdef CONFIG_DM_PCI +#if defined(CONFIG_DM_PCI) || defined(CONFIG_DM_SCSI) struct udevice *dev; #else pci_dev_t dev; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index eb78c4d..8c92d0b 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -66,6 +66,7 @@ enum uclass_id { UCLASS_REMOTEPROC, /* Remote Processor device */ UCLASS_RESET, /* Reset controller device */ UCLASS_RTC, /* Real time clock device */ + UCLASS_SCSI, /* SCSI device */ UCLASS_SERIAL, /* Serial UART */ UCLASS_SPI, /* SPI bus */ UCLASS_SPMI, /* System Power Management Interface bus */ diff --git a/include/sata.h b/include/sata.h index b35359a..d18cc9a 100644 --- a/include/sata.h +++ b/include/sata.h @@ -2,6 +2,7 @@ #define __SATA_H__ #include <part.h> +#if !defined(CONFIG_DM_SCSI) int init_sata(int dev); int reset_sata(int dev); int scan_sata(int dev); @@ -15,5 +16,6 @@ int __sata_stop(void); int sata_port_status(int dev, int port); extern struct blk_desc sata_dev_desc[]; +#endif #endif diff --git a/include/scsi.h b/include/scsi.h index c879678..190dacd 100644 --- a/include/scsi.h +++ b/include/scsi.h @@ -166,8 +166,11 @@ typedef struct SCSI_cmd_block{ void scsi_print_error(ccb *pccb); int scsi_exec(ccb *pccb); void scsi_bus_reset(void); +#if !defined(CONFIG_DM_SCSI) void scsi_low_level_init(int busdevfunc); - +#else +void scsi_low_level_init(int busdevfunc, struct udevice *dev); +#endif /*************************************************************************** * functions residing inside cmd_scsi.c @@ -175,6 +178,21 @@ void scsi_low_level_init(int busdevfunc); void scsi_init(void); int scsi_scan(int mode); +#if defined(CONFIG_DM_SCSI) +/** + * struct scsi_platdata - stores information about SCSI controller + * + * @base: Controller base address + * @max_lun: Maximum number of logical units + * @max_id: Maximum number of target ids + */ +struct scsi_platdata { + unsigned long base; + unsigned long max_lun; + unsigned long max_id; +}; +#endif + #define SCSI_IDENTIFY 0xC0 /* not used */ /* Hardware errors */ |