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>