From: Rob Herring <robherring2@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 5/5] scsi/ahci: add support for non-PCI controllers
Date: Wed, 1 Jun 2011 14:10:27 -0500 [thread overview]
Message-ID: <1306955427-18940-6-git-send-email-robherring2@gmail.com> (raw)
In-Reply-To: <1306955427-18940-1-git-send-email-robherring2@gmail.com>
From: Rob Herring <rob.herring@calxeda.com>
Add support for AHCI controllers that are not PCI based.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
common/cmd_scsi.c | 6 +++-
drivers/block/ahci.c | 62 +++++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 60 insertions(+), 8 deletions(-)
diff --git a/common/cmd_scsi.c b/common/cmd_scsi.c
index be4fe74..25a8299 100644
--- a/common/cmd_scsi.c
+++ b/common/cmd_scsi.c
@@ -47,7 +47,8 @@
#define SCSI_DEV_ID 0x5288
#else
-#error no scsi device defined
+#define SCSI_VEND_ID 0
+#define SCSI_DEV_ID 0
#endif
@@ -174,7 +175,7 @@ removable:
scsi_curr_dev = -1;
}
-
+#ifdef CONFIG_PCI
void scsi_init(void)
{
int busdevfunc;
@@ -192,6 +193,7 @@ void scsi_init(void)
scsi_low_level_init(busdevfunc);
scsi_scan(1);
}
+#endif
block_dev_desc_t * scsi_get_dev(int dev)
{
diff --git a/drivers/block/ahci.c b/drivers/block/ahci.c
index d431c5a..3a69fef 100644
--- a/drivers/block/ahci.c
+++ b/drivers/block/ahci.c
@@ -78,7 +78,9 @@ static int waiting_for_cmd_completed(volatile u8 *offset,
static int ahci_host_init(struct ahci_probe_ent *probe_ent)
{
+#ifdef CONFIG_PCI
pci_dev_t pdev = probe_ent->dev;
+#endif
volatile u8 *mmio = (volatile u8 *)probe_ent->mmio_base;
u32 tmp, cap_save;
u16 tmp16;
@@ -110,6 +112,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
writel(cap_save, mmio + HOST_CAP);
writel_with_flush(0xf, mmio + HOST_PORTS_IMPL);
+#ifdef CONFIG_PCI
pci_read_config_word(pdev, PCI_VENDOR_ID, &vendor);
if (vendor == PCI_VENDOR_ID_INTEL) {
@@ -118,7 +121,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
tmp16 |= 0xf;
pci_write_config_word(pdev, 0x92, tmp16);
}
-
+#endif
probe_ent->cap = readl(mmio + HOST_CAP);
probe_ent->port_map = readl(mmio + HOST_PORTS_IMPL);
probe_ent->n_ports = (probe_ent->cap & 0x1f) + 1;
@@ -183,11 +186,11 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL);
tmp = readl(mmio + HOST_CTL);
debug("HOST_CTL 0x%x\n", tmp);
-
+#ifdef CONFIG_PCI
pci_read_config_word(pdev, PCI_COMMAND, &tmp16);
tmp |= PCI_COMMAND_MASTER;
pci_write_config_word(pdev, PCI_COMMAND, tmp16);
-
+#endif
return 0;
}
@@ -212,7 +215,7 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
speed_s = "3";
else
speed_s = "?";
-
+#ifdef CONFIG_PCI
pci_read_config_word(pdev, 0x0a, &cc);
if (cc == 0x0101)
scc_s = "IDE";
@@ -222,7 +225,9 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
scc_s = "RAID";
else
scc_s = "unknown";
-
+#else
+ scc_s = "SATA";
+#endif
printf("AHCI %02x%02x.%02x%02x "
"%u slots %u ports %s Gbps 0x%x impl %s mode\n",
(vers >> 24) & 0xff,
@@ -249,6 +254,7 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
cap & (1 << 13) ? "part " : "");
}
+#ifdef CONFIG_PCI
static int ahci_init_one(pci_dev_t pdev)
{
u16 vendor;
@@ -291,7 +297,7 @@ static int ahci_init_one(pci_dev_t pdev)
err_out:
return rc;
}
-
+#endif
#define MAX_DATA_BYTE_COUNT (4*1024*1024)
@@ -667,7 +673,9 @@ void scsi_low_level_init(int busdevfunc)
int i;
u32 linkmap;
+#ifdef CONFIG_PCI
ahci_init_one(busdevfunc);
+#endif
linkmap = probe_ent->link_port_map;
@@ -682,6 +690,48 @@ void scsi_low_level_init(int busdevfunc)
}
}
+int ahci_init(u32 base)
+{
+ int i, rc = 0;
+ u32 linkmap;
+
+ memset((void *)ataid, 0, sizeof(hd_driveid_t *) * AHCI_MAX_PORTS);
+
+ probe_ent = malloc(sizeof(struct ahci_probe_ent));
+ memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
+
+ probe_ent->host_flags = ATA_FLAG_SATA
+ | ATA_FLAG_NO_LEGACY
+ | ATA_FLAG_MMIO
+ | ATA_FLAG_PIO_DMA
+ | ATA_FLAG_NO_ATAPI;
+ probe_ent->pio_mask = 0x1f;
+ probe_ent->udma_mask = 0x7f; /*Fixme,assume to support UDMA6 */
+
+ probe_ent->mmio_base = base;
+
+ /* initialize adapter */
+ rc = ahci_host_init(probe_ent);
+ if (rc)
+ goto err_out;
+
+ ahci_print_info(probe_ent);
+
+ linkmap = probe_ent->link_port_map;
+
+ for (i = 0; i < CONFIG_SYS_SCSI_MAX_SCSI_ID; i++) {
+ if (((linkmap >> i) & 0x01)) {
+ if (ahci_port_start((u8) i)) {
+ printf("Can not start port %d\n", i);
+ continue;
+ }
+ ahci_set_feature((u8) i);
+ }
+ }
+ err_out:
+ return rc;
+}
+
void scsi_bus_reset(void)
{
--
1.7.4.1
next prev parent reply other threads:[~2011-06-01 19:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-01 19:10 [U-Boot] [PATCH 0/5] Common AHCI and SDHCI drivers Rob Herring
2011-06-01 19:10 ` [U-Boot] [PATCH 1/5] mmc: copy s5p to sdhci Rob Herring
2011-06-01 19:10 ` [U-Boot] [PATCH 2/5] mmc: sdhci: rework Samsung specfic code Rob Herring
2011-06-01 19:27 ` Wolfgang Denk
2011-06-01 19:10 ` [U-Boot] [PATCH 3/5] mmc: sdhci: exit cmd on error status Rob Herring
2011-06-01 19:10 ` [U-Boot] [PATCH 4/5] scsi/ahci: ata id little endian fix Rob Herring
2011-06-01 19:10 ` Rob Herring [this message]
2011-06-01 19:31 ` [U-Boot] [PATCH 5/5] scsi/ahci: add support for non-PCI controllers Wolfgang Denk
2011-06-01 19:25 ` [U-Boot] [PATCH 0/5] Common AHCI and SDHCI drivers Wolfgang Denk
2011-06-01 19:46 ` Rob Herring
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1306955427-18940-6-git-send-email-robherring2@gmail.com \
--to=robherring2@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.