Date: Wed, 17 Oct 2018 19:29:58 +0000 (UTC) From: Leandro Lupori <luporl@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r339415 - in projects/power8_bringup_hacks/sys: dev/ahci dev/bge powerpc/powernv Message-ID: <201810171929.w9HJTwZC028748@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: luporl Date: Wed Oct 17 19:29:57 2018 New Revision: 339415 URL: https://svnweb.freebsd.org/changeset/base/339415 Log: ppc64: limited 32-bit DMA address range Further investigation of issues with 32-bit DMA on PowerNV revealed that its window is hardcoded by OPAL (at least in skiboot version 5.4.9) and cannot be changed by the OS. Thus, now jhb suggestion of limiting the range in PCI DMA tag seems the best way to deal with it. This was done in opal_pci.c. This commit also reverts 2 previous hacks, in AHCI and bge(4). 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 projects/power8_bringup_hacks/sys/dev/bge/if_bge.c projects/power8_bringup_hacks/sys/powerpc/powernv/opal_pci.c Modified: projects/power8_bringup_hacks/sys/dev/ahci/ahci.c ============================================================================== --- projects/power8_bringup_hacks/sys/dev/ahci/ahci.c Wed Oct 17 16:54:13 2018 (r339414) +++ projects/power8_bringup_hacks/sys/dev/ahci/ahci.c Wed Oct 17 19:29:57 2018 (r339415) @@ -100,21 +100,6 @@ 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) { @@ -263,10 +248,8 @@ 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) ? - AHCI_BUS_SPACE_MAXADDR(ctlr->quirks) : - AHCI_BUS_SPACE_MAXADDR_32BIT(ctlr->quirks), - AHCI_BUS_SPACE_MAXADDR(ctlr->quirks), NULL, NULL, + (ctlr->caps & AHCI_CAP_64BIT) ? BUS_SPACE_MAXADDR : + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, BUS_SPACE_MAXSIZE, BUS_SPACE_UNRESTRICTED, BUS_SPACE_MAXSIZE, ctlr->dma_coherent ? BUS_DMA_COHERENT : 0, NULL, NULL, &ctlr->dma_tag)) { @@ -960,8 +943,7 @@ ahci_dmainit(device_t dev) /* Command area. */ if (bus_dma_tag_create(bus_get_dma_tag(dev), 1024, 0, - AHCI_BUS_SPACE_MAXADDR(ch->quirks), - AHCI_BUS_SPACE_MAXADDR(ch->quirks), + BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, AHCI_WORK_SIZE, 1, AHCI_WORK_SIZE, 0, NULL, NULL, &ch->dma.work_tag)) goto error; @@ -980,8 +962,7 @@ ahci_dmainit(device_t dev) else rfsize = 256; if (bus_dma_tag_create(bus_get_dma_tag(dev), rfsize, 0, - AHCI_BUS_SPACE_MAXADDR(ch->quirks), - AHCI_BUS_SPACE_MAXADDR(ch->quirks), + BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, rfsize, 1, rfsize, 0, NULL, NULL, &ch->dma.rfis_tag)) goto error; @@ -996,8 +977,7 @@ 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, - AHCI_BUS_SPACE_MAXADDR(ch->quirks), - AHCI_BUS_SPACE_MAXADDR(ch->quirks), + BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, 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 Wed Oct 17 16:54:13 2018 (r339414) +++ projects/power8_bringup_hacks/sys/dev/ahci/ahci.h Wed Oct 17 19:29:57 2018 (r339415) @@ -604,7 +604,6 @@ 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" \ @@ -631,8 +630,7 @@ enum ahci_err_type { "\025NOMSIX" \ "\026MRVL_SR_DEL" \ "\027NOCCS" \ - "\030NOAUX" \ - "\031DMA31" + "\030NOAUX" 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 Wed Oct 17 16:54:13 2018 (r339414) +++ projects/power8_bringup_hacks/sys/dev/ahci/ahci_pci.c Wed Oct 17 19:29:57 2018 (r339415) @@ -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", AHCI_Q_DMA31}, + {0x92351b4b, 0x00, "Marvell 88SE9235", 0}, {0x06201103, 0x00, "HighPoint RocketRAID 620", 0}, {0x06201b4b, 0x00, "HighPoint RocketRAID 620", 0}, {0x06221103, 0x00, "HighPoint RocketRAID 622", 0}, Modified: projects/power8_bringup_hacks/sys/dev/bge/if_bge.c ============================================================================== --- projects/power8_bringup_hacks/sys/dev/bge/if_bge.c Wed Oct 17 16:54:13 2018 (r339414) +++ projects/power8_bringup_hacks/sys/dev/bge/if_bge.c Wed Oct 17 19:29:57 2018 (r339415) @@ -134,8 +134,6 @@ MODULE_DEPEND(bge, miibus, 1, 1, 1); /* "device miibus" required. See GENERIC if you get errors here. */ #include "miibus_if.h" -#define BGE_BUS_SPACE_MAXADDR_32BIT 0x7FFFFFFFU - /* * Various supported device vendors/types and their names. Note: the * spec seems to indicate that the hardware still has Alteon's vendor @@ -3052,16 +3050,15 @@ bge_dma_alloc(struct bge_softc *sc) /* Create parent tag for buffers. */ if ((sc->bge_flags & BGE_FLAG_4G_BNDRY_BUG) != 0) { - lowaddr = BGE_BUS_SPACE_MAXADDR_32BIT; /* * XXX * watchdog timeout issue was observed on BCM5704 which * lives behind PCI-X bridge(e.g AMD 8131 PCI-X bridge). * Both limiting DMA address space to 32bits and flushing * mailbox write seem to address the issue. + */ if (sc->bge_pcixcap != 0) lowaddr = BUS_SPACE_MAXADDR_32BIT; - */ } error = bus_dma_tag_create(bus_get_dma_tag(sc->bge_dev), 1, 0, lowaddr, BUS_SPACE_MAXADDR, NULL, NULL, BUS_SPACE_MAXSIZE_32BIT, 0, Modified: projects/power8_bringup_hacks/sys/powerpc/powernv/opal_pci.c ============================================================================== --- projects/power8_bringup_hacks/sys/powerpc/powernv/opal_pci.c Wed Oct 17 16:54:13 2018 (r339414) +++ projects/power8_bringup_hacks/sys/powerpc/powernv/opal_pci.c Wed Oct 17 19:29:57 2018 (r339415) @@ -96,6 +96,9 @@ static int opalpci_route_interrupt(device_t bus, devic static void opalpic_pic_enable(device_t dev, u_int irq, u_int vector); static void opalpic_pic_eoi(device_t dev, u_int irq); +/* Bus interface */ +static bus_dma_tag_t opalpci_get_dma_tag(device_t dev, device_t child); + /* * Commands */ @@ -119,6 +122,8 @@ static void opalpic_pic_eoi(device_t dev, u_int irq); */ #define OPAL_PCI_DEFAULT_PE 1 +#define OPAL_PCI_BUS_SPACE_LOWADDR_32BIT 0x7FFFFFFFUL + /* * Driver methods. */ @@ -142,6 +147,9 @@ static device_method_t opalpci_methods[] = { DEVMETHOD(pic_enable, opalpic_pic_enable), DEVMETHOD(pic_eoi, opalpic_pic_eoi), + /* Bus interface */ + DEVMETHOD(bus_get_dma_tag, opalpci_get_dma_tag), + DEVMETHOD_END }; @@ -424,6 +432,23 @@ opalpci_attach(device_t dev) msi_ranges[1], msi_ranges[0]); } + /* Create the parent DMA tag */ + err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ + 1, 0, /* alignment, bounds */ + OPAL_PCI_BUS_SPACE_LOWADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR_32BIT, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BUS_SPACE_MAXSIZE, /* maxsize */ + BUS_SPACE_UNRESTRICTED, /* nsegments */ + BUS_SPACE_MAXSIZE, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->ofw_sc.sc_dmat); + if (err != 0) { + device_printf(dev, "Failed to create DMA tag\n"); + return (err); + } + /* * General OFW PCI attach */ @@ -660,4 +685,13 @@ static void opalpic_pic_eoi(device_t dev, u_int irq) opal_call(OPAL_PCI_MSI_EOI, sc->phb_id, irq); PIC_EOI(root_pic, irq); +} + +static bus_dma_tag_t +opalpci_get_dma_tag(device_t dev, device_t child) +{ + struct opalpci_softc *sc; + + sc = device_get_softc(dev); + return (sc->ofw_sc.sc_dmat); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201810171929.w9HJTwZC028748>