Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Nov 2013 15:41:52 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r258427 - head/sys/powerpc/pseries
Message-ID:  <201311211541.rALFfq49047588@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Thu Nov 21 15:41:52 2013
New Revision: 258427
URL: http://svnweb.freebsd.org/changeset/base/258427

Log:
  For PCI<->PCI bridges, #address-cells may be 3. Allow this when parsing the
  ibm,dma-window properties. This is especially a concern when
  #ibm,dma-address-cells is not specified and we have to use the regular
  #address-cells property.
  
  MFC after:	1 week

Modified:
  head/sys/powerpc/pseries/plpar_iommu.c

Modified: head/sys/powerpc/pseries/plpar_iommu.c
==============================================================================
--- head/sys/powerpc/pseries/plpar_iommu.c	Thu Nov 21 14:12:36 2013	(r258426)
+++ head/sys/powerpc/pseries/plpar_iommu.c	Thu Nov 21 15:41:52 2013	(r258427)
@@ -73,8 +73,9 @@ phyp_iommu_set_dma_tag(device_t bus, dev
 {
 	device_t p;
 	phandle_t node;
-	cell_t dma_acells, dma_scells, dmawindow[5];
+	cell_t dma_acells, dma_scells, dmawindow[6];
 	struct iommu_map *i;
+	int cell;
 
 	for (p = dev; device_get_parent(p) != NULL; p = device_get_parent(p)) {
 		if (ofw_bus_has_prop(p, "ibm,my-dma-window"))
@@ -104,16 +105,17 @@ phyp_iommu_set_dma_tag(device_t bus, dev
 
 	struct dma_window *window = malloc(sizeof(struct dma_window),
 	    M_PHYPIOMMU, M_WAITOK);
-	if (dma_acells == 1)
-		window->start = dmawindow[1];
-	else
-		window->start = ((uint64_t)(dmawindow[1]) << 32) | dmawindow[2];
-	if (dma_scells == 1)
-		window->end = window->start + dmawindow[dma_acells + 1];
-	else
-		window->end = window->start +
-		    (((uint64_t)(dmawindow[dma_acells + 1]) << 32) |
-		    dmawindow[dma_acells + 2]);
+	window->start = 0;
+	for (cell = 1; cell < 1 + dma_acells; cell++) {
+		window->start <<= 32;
+		window->start |= dmawindow[cell];
+	}
+	window->end = 0;
+	for (; cell < 1 + dma_acells + dma_scells; cell++) {
+		window->end <<= 32;
+		window->end |= dmawindow[cell];
+	}
+	window->end += window->start;
 
 	if (bootverbose)
 		device_printf(dev, "Mapping IOMMU domain %#x\n", dmawindow[0]);



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