svn commit: r257677 - projects/altix2/sys/ia64/sgisn
Marcel Moolenaar
marcel at FreeBSD.org
Tue Nov 5 05:02:09 UTC 2013
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);
}
More information about the svn-src-projects
mailing list