Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Sep 2018 16:25:34 +0000 (UTC)
From:      Leandro Lupori <luporl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r338686 - projects/power8_bringup_hacks/sys/dev/ahci
Message-ID:  <201809141625.w8EGPY7N054467@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: luporl
Date: Fri Sep 14 16:25:34 2018
New Revision: 338686
URL: https://svnweb.freebsd.org/changeset/base/338686

Log:
  Added some hacks to AHCI to get it working
  
  Marvell 88SE9235 SATA controller now works on POWER8.
  There is an issue with DMA addresses over 0x7FFFFFFF.
  The root cause is until unknwon. For now, AHCI DMA is being limited,
  to used only addresses below the above threshold.

Modified:
  projects/power8_bringup_hacks/sys/dev/ahci/ahci.c
  projects/power8_bringup_hacks/sys/dev/ahci/ahci.h
  projects/power8_bringup_hacks/sys/dev/ahci/ahci_pci.c

Modified: projects/power8_bringup_hacks/sys/dev/ahci/ahci.c
==============================================================================
--- projects/power8_bringup_hacks/sys/dev/ahci/ahci.c	Fri Sep 14 15:46:31 2018	(r338685)
+++ projects/power8_bringup_hacks/sys/dev/ahci/ahci.c	Fri Sep 14 16:25:34 2018	(r338686)
@@ -100,6 +100,21 @@ static MALLOC_DEFINE(M_AHCI, "AHCI driver", "AHCI driv
 #define RECOVERY_REQUEST_SENSE	2
 #define recovery_slot		spriv_field1
 
+#ifdef __powerpc64__
+#define AHCI_BUS_SPACE_MAXADDR_31BIT	0x7FFFFFFFU
+
+#define AHCI_BUS_SPACE_MAXADDR(quirks) \
+	(quirks & AHCI_Q_DMA31 ? AHCI_BUS_SPACE_MAXADDR_31BIT : \
+	 	BUS_SPACE_MAXADDR)
+
+#define AHCI_BUS_SPACE_MAXADDR_32BIT(quirks) \
+	(quirks & AHCI_Q_DMA31 ? AHCI_BUS_SPACE_MAXADDR_31BIT : \
+	 	BUS_SPACE_MAXADDR_32BIT)
+#else
+#define AHCI_BUS_SPACE_MAXADDR(quirks) 		BUS_SPACE_MAXADDR
+#define AHCI_BUS_SPACE_MAXADDR_32BIT(quirks)	BUS_SPACE_MAXADDR_32BIT
+#endif
+
 int
 ahci_ctlr_setup(device_t dev)
 {
@@ -248,8 +263,10 @@ ahci_attach(device_t dev)
 
 	/* Create controller-wide DMA tag. */
 	if (bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0,
-	    (ctlr->caps & AHCI_CAP_64BIT) ? BUS_SPACE_MAXADDR :
-	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+	    (ctlr->caps & AHCI_CAP_64BIT) ?
+	    	AHCI_BUS_SPACE_MAXADDR(ctlr->quirks) :
+	    		AHCI_BUS_SPACE_MAXADDR_32BIT(ctlr->quirks),
+	    AHCI_BUS_SPACE_MAXADDR(ctlr->quirks), NULL, NULL,
 	    BUS_SPACE_MAXSIZE, BUS_SPACE_UNRESTRICTED, BUS_SPACE_MAXSIZE,
 	    ctlr->dma_coherent ? BUS_DMA_COHERENT : 0, NULL, NULL, 
 	    &ctlr->dma_tag)) {
@@ -943,7 +960,8 @@ ahci_dmainit(device_t dev)
 
 	/* Command area. */
 	if (bus_dma_tag_create(bus_get_dma_tag(dev), 1024, 0,
-	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+	    AHCI_BUS_SPACE_MAXADDR(ch->quirks),
+	    AHCI_BUS_SPACE_MAXADDR(ch->quirks),
 	    NULL, NULL, AHCI_WORK_SIZE, 1, AHCI_WORK_SIZE,
 	    0, NULL, NULL, &ch->dma.work_tag))
 		goto error;
@@ -962,7 +980,8 @@ ahci_dmainit(device_t dev)
 	else
 	    rfsize = 256;
 	if (bus_dma_tag_create(bus_get_dma_tag(dev), rfsize, 0,
-	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+	    AHCI_BUS_SPACE_MAXADDR(ch->quirks),
+	    AHCI_BUS_SPACE_MAXADDR(ch->quirks),
 	    NULL, NULL, rfsize, 1, rfsize,
 	    0, NULL, NULL, &ch->dma.rfis_tag))
 		goto error;
@@ -977,7 +996,8 @@ ahci_dmainit(device_t dev)
 	ch->dma.rfis_bus = dcba.maddr;
 	/* Data area. */
 	if (bus_dma_tag_create(bus_get_dma_tag(dev), 2, 0,
-	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+	    AHCI_BUS_SPACE_MAXADDR(ch->quirks),
+	    AHCI_BUS_SPACE_MAXADDR(ch->quirks),
 	    NULL, NULL,
 	    AHCI_SG_ENTRIES * PAGE_SIZE * ch->numslots,
 	    AHCI_SG_ENTRIES, AHCI_PRD_MAX,

Modified: projects/power8_bringup_hacks/sys/dev/ahci/ahci.h
==============================================================================
--- projects/power8_bringup_hacks/sys/dev/ahci/ahci.h	Fri Sep 14 15:46:31 2018	(r338685)
+++ projects/power8_bringup_hacks/sys/dev/ahci/ahci.h	Fri Sep 14 16:25:34 2018	(r338686)
@@ -604,6 +604,7 @@ enum ahci_err_type {
 #define AHCI_Q_MRVL_SR_DEL	0x00200000
 #define AHCI_Q_NOCCS		0x00400000
 #define AHCI_Q_NOAUX		0x00800000
+#define AHCI_Q_DMA31		0x01000000
 
 #define AHCI_Q_BIT_STRING	\
 	"\020"			\
@@ -630,7 +631,8 @@ enum ahci_err_type {
 	"\025NOMSIX"		\
 	"\026MRVL_SR_DEL"	\
 	"\027NOCCS"		\
-	"\030NOAUX"
+	"\030NOAUX"		\
+	"\031DMA31"
 
 int ahci_attach(device_t dev);
 int ahci_detach(device_t dev);

Modified: projects/power8_bringup_hacks/sys/dev/ahci/ahci_pci.c
==============================================================================
--- projects/power8_bringup_hacks/sys/dev/ahci/ahci_pci.c	Fri Sep 14 15:46:31 2018	(r338685)
+++ projects/power8_bringup_hacks/sys/dev/ahci/ahci_pci.c	Fri Sep 14 16:25:34 2018	(r338686)
@@ -261,7 +261,7 @@ static const struct {
 	{0x92151b4b, 0x00, "Marvell 88SE9215",  0},
 	{0x92201b4b, 0x00, "Marvell 88SE9220",  AHCI_Q_ALTSIG},
 	{0x92301b4b, 0x00, "Marvell 88SE9230",  AHCI_Q_ALTSIG},
-	{0x92351b4b, 0x00, "Marvell 88SE9235",  0},
+	{0x92351b4b, 0x00, "Marvell 88SE9235",  AHCI_Q_DMA31},
 	{0x06201103, 0x00, "HighPoint RocketRAID 620",	0},
 	{0x06201b4b, 0x00, "HighPoint RocketRAID 620",	0},
 	{0x06221103, 0x00, "HighPoint RocketRAID 622",	0},



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201809141625.w8EGPY7N054467>