mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
scsi: Provide support for a list of AHCI controllers.
Many AHCI controllers are identical, the main (and often the only) difference being the PCI Vendor ID/Device ID combination reported by the device. This change allows the config file to define a list of PCI vendor ID/device ID pairs. The driver would scan the list and initialize the first device it finds. No actual multiple device list is introduced yet, this change just add the framework. Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Signed-off-by: Taylor Hutt <thutt@chromium.org> Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
284231e49a
commit
4ae5eb7c5b
1 changed files with 35 additions and 5 deletions
|
@ -34,6 +34,9 @@
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <pci.h>
|
#include <pci.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_SCSI_DEV_LIST
|
||||||
|
#define SCSI_DEV_LIST CONFIG_SCSI_DEV_LIST
|
||||||
|
#else
|
||||||
#ifdef CONFIG_SCSI_SYM53C8XX
|
#ifdef CONFIG_SCSI_SYM53C8XX
|
||||||
#define SCSI_VEND_ID 0x1000
|
#define SCSI_VEND_ID 0x1000
|
||||||
#ifndef CONFIG_SCSI_DEV_ID
|
#ifndef CONFIG_SCSI_DEV_ID
|
||||||
|
@ -49,8 +52,12 @@
|
||||||
#elif !defined(CONFIG_SCSI_AHCI_PLAT)
|
#elif !defined(CONFIG_SCSI_AHCI_PLAT)
|
||||||
#error no scsi device defined
|
#error no scsi device defined
|
||||||
#endif
|
#endif
|
||||||
|
#define SCSI_DEV_LIST {SCSI_VEND_ID, SCSI_DEV_ID}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI
|
||||||
|
const struct pci_device_id scsi_device_list[] = { SCSI_DEV_LIST };
|
||||||
|
#endif
|
||||||
static ccb tempccb; /* temporary scsi command buffer */
|
static ccb tempccb; /* temporary scsi command buffer */
|
||||||
|
|
||||||
static unsigned char tempbuff[512]; /* temporary data buffer */
|
static unsigned char tempbuff[512]; /* temporary data buffer */
|
||||||
|
@ -178,15 +185,38 @@ removable:
|
||||||
void scsi_init(void)
|
void scsi_init(void)
|
||||||
{
|
{
|
||||||
int busdevfunc;
|
int busdevfunc;
|
||||||
|
int i;
|
||||||
|
/*
|
||||||
|
* Find a device from the list, this driver will support a single
|
||||||
|
* controller.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) {
|
||||||
|
/* get PCI Device ID */
|
||||||
|
busdevfunc = pci_find_device(scsi_device_list[i].vendor,
|
||||||
|
scsi_device_list[i].device,
|
||||||
|
0);
|
||||||
|
if (busdevfunc != -1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
busdevfunc=pci_find_device(SCSI_VEND_ID,SCSI_DEV_ID,0); /* get PCI Device ID */
|
if (busdevfunc == -1) {
|
||||||
if(busdevfunc==-1) {
|
printf("Error: SCSI Controller(s) ");
|
||||||
printf("Error SCSI Controller (%04X,%04X) not found\n",SCSI_VEND_ID,SCSI_DEV_ID);
|
for (i = 0; i < ARRAY_SIZE(scsi_device_list); i++) {
|
||||||
|
printf("%04X:%04X ",
|
||||||
|
scsi_device_list[i].vendor,
|
||||||
|
scsi_device_list[i].device);
|
||||||
|
}
|
||||||
|
printf("not found\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
else {
|
else {
|
||||||
printf("SCSI Controller (%04X,%04X) found (%d:%d:%d)\n",SCSI_VEND_ID,SCSI_DEV_ID,(busdevfunc>>16)&0xFF,(busdevfunc>>11)&0x1F,(busdevfunc>>8)&0x7);
|
printf("SCSI Controller (%04X,%04X) found (%d:%d:%d)\n",
|
||||||
|
scsi_device_list[i].vendor,
|
||||||
|
scsi_device_list[i].device,
|
||||||
|
(busdevfunc >> 16) & 0xFF,
|
||||||
|
(busdevfunc >> 11) & 0x1F,
|
||||||
|
(busdevfunc >> 8) & 0x7);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
scsi_low_level_init(busdevfunc);
|
scsi_low_level_init(busdevfunc);
|
||||||
|
|
Loading…
Reference in a new issue