Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jul 2009 19:06:39 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r195808 - in head/sys: dev/pci sparc64/include
Message-ID:  <200907211906.n6LJ6d6x019467@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Tue Jul 21 19:06:39 2009
New Revision: 195808
URL: http://svn.freebsd.org/changeset/base/195808

Log:
  Add a MD __PCI_BAR_ZERO_VALID which denotes that BARs containing 0
  actually specify valid bases that should be treated just as normal.
  The PCI specifications have no indication that 0 would be a magic value
  indicating a disabled BAR as commonly used on at least amd64 and i386
  but not sparc64. It's unclear what to do in pci_delete_resource()
  instead of writing 0 to a BAR though as there's no (other) way do
  disable individual BARs so its decoding is left enabled in case of
  __PCI_BAR_ZERO_VALID for now.
  
  Approved by:	re (kib), jhb
  MFC after:	1 week

Modified:
  head/sys/dev/pci/pci.c
  head/sys/sparc64/include/param.h

Modified: head/sys/dev/pci/pci.c
==============================================================================
--- head/sys/dev/pci/pci.c	Tue Jul 21 19:01:04 2009	(r195807)
+++ head/sys/dev/pci/pci.c	Tue Jul 21 19:06:39 2009	(r195808)
@@ -2352,7 +2352,7 @@ pci_add_map(device_t bus, device_t dev, 
 {
 	pci_addr_t base, map, testval;
 	pci_addr_t start, end, count;
-	int barlen, maprange, mapsize, type;
+	int barlen, basezero, maprange, mapsize, type;
 	uint16_t cmd;
 	struct resource *res;
 
@@ -2365,6 +2365,11 @@ pci_add_map(device_t bus, device_t dev, 
 		type = SYS_RES_IOPORT;
 	mapsize = pci_mapsize(testval);
 	base = pci_mapbase(map);
+#ifdef __PCI_BAR_ZERO_VALID
+	basezero = 0;
+#else
+	basezero = base == 0;
+#endif
 	maprange = pci_maprange(map);
 	barlen = maprange == 64 ? 2 : 1;
 
@@ -2393,17 +2398,17 @@ pci_add_map(device_t bus, device_t dev, 
 	}
 
 	/*
-	 * If base is 0, then we have problems.  It is best to ignore
-	 * such entries for the moment.  These will be allocated later if
-	 * the driver specifically requests them.  However, some
-	 * removable busses look better when all resources are allocated,
-	 * so allow '0' to be overriden.
+	 * If base is 0, then we have problems if this architecture does
+	 * not allow that.  It is best to ignore such entries for the
+	 * moment.  These will be allocated later if the driver specifically
+	 * requests them.  However, some removable busses look better when
+	 * all resources are allocated, so allow '0' to be overriden.
 	 *
 	 * Similarly treat maps whose values is the same as the test value
 	 * read back.  These maps have had all f's written to them by the
 	 * BIOS in an attempt to disable the resources.
 	 */
-	if (!force && (base == 0 || map == testval))
+	if (!force && (basezero || map == testval))
 		return (barlen);
 	if ((u_long)base != base) {
 		device_printf(bus,
@@ -2440,7 +2445,7 @@ pci_add_map(device_t bus, device_t dev, 
 	}
 
 	count = 1 << mapsize;
-	if (base == 0 || base == pci_mapbase(testval)) {
+	if (basezero || base == pci_mapbase(testval)) {
 		start = 0;	/* Let the parent decide. */
 		end = ~0ULL;
 	} else {
@@ -3683,6 +3688,7 @@ pci_delete_resource(device_t dev, device
 			return;
 		}
 
+#ifndef __PCI_BAR_ZERO_VALID
 		/*
 		 * If this is a BAR, clear the BAR so it stops
 		 * decoding before releasing the resource.
@@ -3693,6 +3699,7 @@ pci_delete_resource(device_t dev, device
 			pci_write_bar(child, rid, 0);
 			break;
 		}
+#endif
 		bus_release_resource(dev, type, rid, rle->res);
 	}
 	resource_list_delete(rl, type, rid);

Modified: head/sys/sparc64/include/param.h
==============================================================================
--- head/sys/sparc64/include/param.h	Tue Jul 21 19:01:04 2009	(r195807)
+++ head/sys/sparc64/include/param.h	Tue Jul 21 19:06:39 2009	(r195808)
@@ -48,6 +48,8 @@
 
 #ifndef _NO_NAMESPACE_POLLUTION
 
+#define __PCI_BAR_ZERO_VALID
+
 #ifndef _MACHINE_PARAM_H_
 #define	_MACHINE_PARAM_H_
 



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