]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - lib/dma-debug.c
ARM: Do early I/O mapping if spinlock debugging is enabled
[linux-2.6-omap-h63xx.git] / lib / dma-debug.c
index 9a350b414a5067c0f9eb905143566e83a85ce03f..d3da7edc034f7c60496056332850458b849a4f61 100644 (file)
@@ -531,8 +531,11 @@ static void check_unmap(struct dma_debug_entry *ref)
        struct hash_bucket *bucket;
        unsigned long flags;
 
-       if (dma_mapping_error(ref->dev, ref->dev_addr))
+       if (dma_mapping_error(ref->dev, ref->dev_addr)) {
+               err_printk(ref->dev, NULL, "DMA-API: device driver tries "
+                          "to free an invalid DMA memory address\n");
                return;
+       }
 
        bucket = get_hash_bucket(ref, &flags);
        entry = hash_bucket_find(bucket, ref);
@@ -645,7 +648,7 @@ static void check_sync(struct device *dev, dma_addr_t addr,
                err_printk(dev, NULL, "DMA-API: device driver tries "
                                "to sync DMA memory it has not allocated "
                                "[device address=0x%016llx] [size=%llu bytes]\n",
-                               addr, size);
+                               (unsigned long long)addr, size);
                goto out;
        }
 
@@ -663,7 +666,7 @@ static void check_sync(struct device *dev, dma_addr_t addr,
                                "DMA memory with different direction "
                                "[device address=0x%016llx] [size=%llu bytes] "
                                "[mapped with %s] [synced with %s]\n",
-                               addr, entry->size,
+                               (unsigned long long)addr, entry->size,
                                dir2name[entry->direction],
                                dir2name[direction]);
        }
@@ -677,7 +680,7 @@ static void check_sync(struct device *dev, dma_addr_t addr,
                                "device read-only DMA memory for cpu "
                                "[device address=0x%016llx] [size=%llu bytes] "
                                "[mapped with %s] [synced with %s]\n",
-                               addr, entry->size,
+                               (unsigned long long)addr, entry->size,
                                dir2name[entry->direction],
                                dir2name[direction]);
 
@@ -687,7 +690,7 @@ static void check_sync(struct device *dev, dma_addr_t addr,
                                "device write-only DMA memory to device "
                                "[device address=0x%016llx] [size=%llu bytes] "
                                "[mapped with %s] [synced with %s]\n",
-                               addr, entry->size,
+                               (unsigned long long)addr, entry->size,
                                dir2name[entry->direction],
                                dir2name[direction]);
 
@@ -719,10 +722,11 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,
        entry->size      = size;
        entry->direction = direction;
 
-       if (map_single) {
-               void *addr = ((char *)page_address(page)) + offset;
-
+       if (map_single)
                entry->type = dma_debug_single;
+
+       if (!PageHighMem(page)) {
+               void *addr = ((char *)page_address(page)) + offset;
                check_for_stack(dev, addr);
                check_for_illegal_area(dev, addr, size);
        }
@@ -776,8 +780,10 @@ void debug_dma_map_sg(struct device *dev, struct scatterlist *sg,
                entry->sg_call_ents   = nents;
                entry->sg_mapped_ents = mapped_ents;
 
-               check_for_stack(dev, sg_virt(s));
-               check_for_illegal_area(dev, sg_virt(s), s->length);
+               if (!PageHighMem(sg_page(s))) {
+                       check_for_stack(dev, sg_virt(s));
+                       check_for_illegal_area(dev, sg_virt(s), s->length);
+               }
 
                add_dma_entry(entry);
        }