Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Apr 2010 04:07:39 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r206737 - projects/altix/sys/ia64/sgisn
Message-ID:  <201004170407.o3H47dG4042610@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Sat Apr 17 04:07:38 2010
New Revision: 206737
URL: http://svn.freebsd.org/changeset/base/206737

Log:
  We need to iterate all busses in each domain. As it seems,
  bus number 1 in domain 1 has the devices we're looking for.
  For the busses that are present, the SAL call returns an
  non-NULL value for the addr parameter so use that as well
  as the status code to determine whether to create a child.
  
  Save the domain, bus number and PROM address in the softc
  after assigning the driver to the new device.
  
  This yields:
  	...
      pcib0: <SGI PCI-X host controller> on motherboard
      pci0: <PCI bus> on pcib0
      pci0: domain=1, physical bus=1
  	...
      pcib1: <SGI PCI-X host controller> on motherboard
      pci1: <PCI bus> on pcib1
      pci1: domain=2, physical bus=1
  	...

Modified:
  projects/altix/sys/ia64/sgisn/sgisn_pcib.c

Modified: projects/altix/sys/ia64/sgisn/sgisn_pcib.c
==============================================================================
--- projects/altix/sys/ia64/sgisn/sgisn_pcib.c	Sat Apr 17 04:06:40 2010	(r206736)
+++ projects/altix/sys/ia64/sgisn/sgisn_pcib.c	Sat Apr 17 04:07:38 2010	(r206737)
@@ -44,10 +44,12 @@ __FBSDID("$FreeBSD$");
 #include <machine/sal.h>
 #include <machine/sgisn.h>
 
-static struct sgisn_hub sgisn_pcib_hub;
+static struct sgisn_hub sgisn_hub;
 
 struct sgisn_pcib_softc {
 	device_t	sc_dev;
+	void		*sc_promaddr;
+	u_int		sc_domain;
 	u_int		sc_busnr;
 };
 
@@ -113,12 +115,13 @@ static uint32_t
 sgisn_pcib_cfgread(device_t dev, u_int bus, u_int slot, u_int func,
     u_int reg, int bytes)
 {
-	u_int domain = device_get_unit(dev);
+	struct sgisn_pcib_softc *sc;
 	uint32_t val;
 
-	device_printf(dev, "%u:%u:%u: reg=%u", bus, slot, func, reg);
-	val = pci_cfgregread(domain << 8 | bus, slot, func, reg, bytes);
-	printf(" -> %u (%u bytes)\n", val, bytes);
+	sc = device_get_softc(dev);
+
+	val = pci_cfgregread((sc->sc_domain << 8) | bus, slot, func, reg,
+	    bytes);
 	return (val);
 }
 
@@ -126,39 +129,46 @@ static void
 sgisn_pcib_cfgwrite(device_t dev, u_int bus, u_int slot, u_int func,
     u_int reg, uint32_t val, int bytes)
 {
-	u_int domain = device_get_unit(dev);
+	struct sgisn_pcib_softc *sc;
+
+	sc = device_get_softc(dev);
 
-	device_printf(dev, "%u:%u:%u: reg=%u <- %u (%u bytes)\n", bus, slot,
-	    func, reg, val, bytes);
-	pci_cfgregwrite(domain << 8 | bus, slot, func, reg, val, bytes);
+	pci_cfgregwrite((sc->sc_domain << 8) | bus, slot, func, reg, val,
+	    bytes);
 }
 
 static void
 sgisn_pcib_identify(driver_t *drv, device_t bus)
 {
 	struct ia64_sal_result r;
+	device_t dev;
+	struct sgisn_pcib_softc *sc;
 	void *addr;
-	u_int seg;
+	u_int busno, segno;
 
-	sgisn_pcib_hub.hub_pci_maxseg = 0xffffffff;
-	sgisn_pcib_hub.hub_pci_maxbus = 0xff;
+	sgisn_hub.hub_pci_maxseg = 0xffffffff;
+	sgisn_hub.hub_pci_maxbus = 0xff;
 	r = ia64_sal_entry(SAL_SGISN_IOHUB_INFO, PCPU_GET(md.sgisn_nasid),
-	    ia64_tpa((uintptr_t)&sgisn_pcib_hub), 0, 0, 0, 0, 0);
+	    ia64_tpa((uintptr_t)&sgisn_hub), 0, 0, 0, 0, 0);
 	if (r.sal_status != 0)
 		return;
 
-	printf("XXX: %s: maxseg=%u, maxbus=%u\n", __func__,
-	    sgisn_pcib_hub.hub_pci_maxseg, sgisn_pcib_hub.hub_pci_maxbus);
-
-	for (seg = 0; seg <= sgisn_pcib_hub.hub_pci_maxseg; seg++) {
-		r = ia64_sal_entry(SAL_SGISN_IOBUS_INFO, seg, 0,
-		    ia64_tpa((uintptr_t)&addr), 0, 0, 0, 0);
-
-		printf("XXX: %s: seg=%u: stat=%#lx, addr=%p\n", __func__, seg,
-		    r.sal_status, addr);
-
-		if (r.sal_status == 0)
-			BUS_ADD_CHILD(bus, 100 + seg, drv->name, seg);
+	for (segno = 0; segno <= sgisn_hub.hub_pci_maxseg; segno++) {
+		for (busno = 0; busno <= sgisn_hub.hub_pci_maxbus; busno++) {
+			r = ia64_sal_entry(SAL_SGISN_IOBUS_INFO, segno, busno,
+			    ia64_tpa((uintptr_t)&addr), 0, 0, 0, 0);
+
+			if (r.sal_status == 0 && addr != NULL) {
+				dev = BUS_ADD_CHILD(bus, 0, drv->name, -1);
+				if (dev == NULL)
+					continue;
+				device_set_driver(dev, drv);
+				sc = device_get_softc(dev);
+				sc->sc_promaddr = addr;
+				sc->sc_domain = segno;
+				sc->sc_busnr = busno;
+			}
+		}
 	}
 }
 
@@ -192,7 +202,7 @@ sgisn_pcib_read_ivar(device_t dev, devic
 		*res = sc->sc_busnr;
 		return (0);
 	case PCIB_IVAR_DOMAIN:
-		*res = device_get_unit(dev);
+		*res = sc->sc_domain;
 		return (0);
 	}
 	return (ENOENT);



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