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>