Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Oct 2010 15:37:55 +0000 (UTC)
From:      "Jayachandran C." <jchandra@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r213484 - head/sys/mips/rmi
Message-ID:  <201010061537.o96FbtK6009617@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jchandra
Date: Wed Oct  6 15:37:55 2010
New Revision: 213484
URL: http://svn.freebsd.org/changeset/base/213484

Log:
  PCI fix for XLR C revision chips, limit DMA address to the first 2GB
  physical address.  Adds a dma tag to the XLR/XLS pci bus with the
  lowaddr if the CPU happens to be a XLR C rev.
  
  Submitted by:	Sreekanth M. S. (kanthms at netlogicmicro dot com))

Modified:
  head/sys/mips/rmi/board.h
  head/sys/mips/rmi/xlr_pci.c

Modified: head/sys/mips/rmi/board.h
==============================================================================
--- head/sys/mips/rmi/board.h	Wed Oct  6 15:01:37 2010	(r213483)
+++ head/sys/mips/rmi/board.h	Wed Oct  6 15:37:55 2010	(r213484)
@@ -117,6 +117,35 @@ xlr_processor_id(void)
 }
 
 /*
+ * The processor is XLR and C-Series
+ */
+static __inline unsigned int
+xlr_is_c_revision(void)
+{
+	int processor_id = xlr_processor_id();
+	int revision_id  = xlr_revision();
+
+	switch (processor_id) {
+	/* 
+	 * These are the relevant PIDs for XLR
+	 * steppings (hawk and above). For these,
+	 * PIDs, Rev-Ids of [5-9] indicate 'C'.
+	 */
+	case RMI_CHIP_XLR308_C:
+	case RMI_CHIP_XLR508_C:
+	case RMI_CHIP_XLR516_C:
+	case RMI_CHIP_XLR532_C:
+	case RMI_CHIP_XLR716:
+	case RMI_CHIP_XLR732:
+		if (revision_id >= 5 && revision_id <= 9) 
+			return (1);
+	default:
+		return (0);
+	}
+	return (0);
+}
+
+/*
  * RMI Engineering boards which are PCI cards
  * These should come up in PCI device mode (not yet)
  */

Modified: head/sys/mips/rmi/xlr_pci.c
==============================================================================
--- head/sys/mips/rmi/xlr_pci.c	Wed Oct  6 15:01:37 2010	(r213483)
+++ head/sys/mips/rmi/xlr_pci.c	Wed Oct  6 15:37:55 2010	(r213484)
@@ -113,7 +113,7 @@ __FBSDID("$FreeBSD$");
 #endif
 
 struct xlr_pcib_softc {
-	int junk;		/* no softc */
+	bus_dma_tag_t	sc_pci_dmat;	/* PCI DMA tag pointer */
 };
 
 static devclass_t pcib_devclass;
@@ -300,7 +300,19 @@ xlr_pcib_write_config(device_t dev, u_in
 static int 
 xlr_pcib_attach(device_t dev)
 {
-
+	struct xlr_pcib_softc *sc;
+	sc = device_get_softc(dev);
+	
+	/*
+	 * XLR C revision chips cannot do DMA above 2G physical address
+	 * create a parent tag with this lowaddr
+	 */
+	if (xlr_is_c_revision()) {
+		if (bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0,
+		    0x7fffffff, ~0, NULL, NULL, 0x7fffffff,
+		    0xff, 0x7fffffff, 0, NULL, NULL, &sc->sc_pci_dmat) != 0)
+			panic("%s: bus_dma_tag_create failed", __func__);
+	}
 	device_add_child(dev, "pci", 0);
 	bus_generic_attach(dev);
 	return (0);
@@ -566,6 +578,15 @@ xlr_pci_release_resource(device_t bus, d
 	return (rman_release_resource(r));
 }
 
+static bus_dma_tag_t
+xlr_pci_get_dma_tag(device_t bus, device_t child)
+{
+	struct xlr_pcib_softc *sc;
+
+	sc = device_get_softc(bus);
+	return (sc->sc_pci_dmat);
+}
+
 static int
 xlr_pci_activate_resource(device_t bus, device_t child, int type, int rid,
                       struct resource *r)
@@ -618,6 +639,7 @@ static device_method_t xlr_pcib_methods[
 	DEVMETHOD(bus_write_ivar, xlr_pcib_write_ivar),
 	DEVMETHOD(bus_alloc_resource, xlr_pci_alloc_resource),
 	DEVMETHOD(bus_release_resource, xlr_pci_release_resource),
+	DEVMETHOD(bus_get_dma_tag, xlr_pci_get_dma_tag),
 	DEVMETHOD(bus_activate_resource, xlr_pci_activate_resource),
 	DEVMETHOD(bus_deactivate_resource, xlr_pci_deactivate_resource),
 	DEVMETHOD(bus_setup_intr, mips_platform_pci_setup_intr),



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