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]);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to