Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Nov 2013 05:02:08 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r257677 - projects/altix2/sys/ia64/sgisn
Message-ID:  <201311050502.rA5528iF006245@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Tue Nov  5 05:02:08 2013
New Revision: 257677
URL: http://svnweb.freebsd.org/changeset/base/257677

Log:
  Implement SHub2 & TIOCP bridge address translations. With this change,
  mpt(4) seems to work.

Modified:
  projects/altix2/sys/ia64/sgisn/sgisn_pcib.c
  projects/altix2/sys/ia64/sgisn/sgisn_shub.c

Modified: projects/altix2/sys/ia64/sgisn/sgisn_pcib.c
==============================================================================
--- projects/altix2/sys/ia64/sgisn/sgisn_pcib.c	Tue Nov  5 05:01:46 2013	(r257676)
+++ projects/altix2/sys/ia64/sgisn/sgisn_pcib.c	Tue Nov  5 05:02:08 2013	(r257677)
@@ -637,7 +637,7 @@ sgisn_pcib_iommu_map(device_t bus, devic
 	struct sgisn_pcib_softc *sc = device_get_softc(bus);
 	busdma_tag_t tag;
 	bus_addr_t maxaddr = 0x80000000UL;
-	bus_addr_t ba, size;
+	bus_addr_t addr, ba, size;
 	uint64_t bits;
 	u_int ate, bitshft, count, entry, flags;
 
@@ -645,15 +645,24 @@ sgisn_pcib_iommu_map(device_t bus, devic
 
 	flags = busdma_md_get_flags(md);
 	if ((flags & BUSDMA_MD_IA64_DIRECT32) && ba < maxaddr) {
-		*ba_p = ba | maxaddr;
+		addr = ba | maxaddr;
+		*ba_p = addr;
 		return (0);
 	}
 
 	tag = busdma_md_get_tag(md);
 	maxaddr = busdma_tag_get_maxaddr(tag);
 	if (maxaddr == BUS_SPACE_MAXADDR) {
-		*ba_p = ba | ((u_long)sc->sc_fwbus->fw_hub_xid << 60) |
-		    (1UL << ((flags & BUSDMA_ALLOC_CONSISTENT) ? 56 : 59));
+		addr = ba;
+		if (flags & BUSDMA_ALLOC_CONSISTENT)
+			addr |= 1UL << 56;	/* bar */
+		if ((sc->sc_fwbus->fw_mode & 1) == 0)
+			addr |= 1UL << 59;	/* prefetch */
+		if (sc->sc_fwbus->fw_common.bus_asic == SGISN_PCIB_PIC)
+			addr |= (u_long)sc->sc_fwbus->fw_hub_xid << 60;
+		else
+			addr |= 1UL << 60;	/* memory */
+		*ba_p = addr;
 		return (0);
 	}
 
@@ -732,9 +741,13 @@ sgisn_pcib_iommu_map(device_t bus, devic
 	    (SGISN_PCIB_PAGE_SIZE * entry);
 
 	ba &= ~SGISN_PCIB_PAGE_MASK;
-	ba |= 1 << 0; /* valid */
-	ba |= 1 << ((flags & BUSDMA_ALLOC_CONSISTENT) ? 4 : 3);
-	ba |= (u_long)sc->sc_fwbus->fw_hub_xid << 8;
+	ba |= 1 << 0;		/* valid */
+	if ((sc->sc_fwbus->fw_mode & 1) == 0)
+		ba |= 1 << 3;	/* prefetch */
+	if (flags & BUSDMA_ALLOC_CONSISTENT)
+		ba |= 1 << 4;	/* bar */
+	if (sc->sc_fwbus->fw_common.bus_asic == SGISN_PCIB_PIC)
+		ba |= (u_long)sc->sc_fwbus->fw_hub_xid << 8;
 	while (count > 0) {
 		bus_space_write_8(sc->sc_tag, sc->sc_hndl,
 		    PCIB_REG_ATE(entry), ba);

Modified: projects/altix2/sys/ia64/sgisn/sgisn_shub.c
==============================================================================
--- projects/altix2/sys/ia64/sgisn/sgisn_shub.c	Tue Nov  5 05:01:46 2013	(r257676)
+++ projects/altix2/sys/ia64/sgisn/sgisn_shub.c	Tue Nov  5 05:02:08 2013	(r257677)
@@ -557,7 +557,7 @@ sgisn_shub_iommu_map(device_t bus, devic
     bus_addr_t *ba_p)
 {
 	struct sgisn_shub_softc *sc;
-	bus_addr_t ba, mask;
+	bus_addr_t addr, ba, mask;
 	u_int flags;
 
 	sc = device_get_softc(bus);
@@ -579,8 +579,17 @@ sgisn_shub_iommu_map(device_t bus, devic
 	 * For all other memory addresses, map to a fully qualified bus
 	 * address.
 	 */
-	mask = (1UL << (sc->sc_nasid_shft - 2)) - 1;
-	*ba_p = ((ba >> 2) & ~mask) | (ba & mask);
+	if (sc->sc_hubtype == 0) {
+		/* XXX assumes a PIC bridge. */
+		mask = (1UL << (sc->sc_nasid_shft - 2)) - 1;
+		addr = ((ba >> 2) & ~mask) | (ba & mask);
+	} else {
+		/* XXX assumes TIOCP bridge. */
+		addr = (ba >> sc->sc_nasid_shft) << 40;
+		addr |= ((ba >> (sc->sc_nasid_shft - 4)) & 0x3UL) << 36;
+		addr |= ba & ((1UL << (sc->sc_nasid_shft - 4)) - 1);
+	}
+	*ba_p = addr;
 	return (0);
 }
 



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