Am Mi, den 29.12.2004 schrieb Felix K�hling um 21:54:
> Hello DRI developers,
>
> I'm asking for review of the attached patch.
[snip]
It happened again. :-/ Here is the patch. Really!
--
| Felix K�hling <[EMAIL PROTECTED]> http://fxk.de.vu |
| PGP Fingerprint: 6A3C 9566 5B30 DDED 73C3 B152 151C 5CC1 D888 E595 |
Index: linux-core/drm_bufs.c
===================================================================
RCS file: /cvs/dri/drm/linux-core/drm_bufs.c,v
retrieving revision 1.51
diff -u -r1.51 drm_bufs.c
--- linux-core/drm_bufs.c 18 Oct 2004 14:16:41 -0000 1.51
+++ linux-core/drm_bufs.c 29 Dec 2004 20:31:12 -0000
@@ -244,7 +244,21 @@
}
map->offset += dev->sg->handle;
break;
-
+ case _DRM_CONSISTENT: {
+ int order, page_order;
+ order = drm_order(map->size);
+ page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
+ map->size = PAGE_SIZE << page_order;
+ map->handle = (void *)drm_alloc_pages(page_order, DRM_MEM_DMA);
+ DRM_DEBUG("%lu %d %d %p\n",
+ map->size, order, page_order, map->handle);
+ if (!map->handle) {
+ drm_free(map, sizeof(*map), DRM_MEM_MAPS);
+ return -ENOMEM;
+ }
+ map->offset = virt_to_bus(map->handle);
+ break;
+ }
default:
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
return -EINVAL;
@@ -348,6 +362,11 @@
case _DRM_AGP:
case _DRM_SCATTER_GATHER:
break;
+ case _DRM_CONSISTENT:
+ drm_free_pages((unsigned long)map->handle,
+ drm_order(map->size)-PAGE_SHIFT,
+ DRM_MEM_DMA);
+ break;
}
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
}
Index: linux-core/drm_drv.c
===================================================================
RCS file: /cvs/dri/drm/linux-core/drm_drv.c,v
retrieving revision 1.106
diff -u -r1.106 drm_drv.c
--- linux-core/drm_drv.c 7 Dec 2004 12:18:47 -0000 1.106
+++ linux-core/drm_drv.c 29 Dec 2004 20:31:15 -0000
@@ -227,6 +227,12 @@
dev->sg = NULL;
}
break;
+ case _DRM_CONSISTENT:
+ drm_free_pages(
+ (unsigned long)map->handle,
+ drm_order(map->size)-PAGE_SHIFT,
+ DRM_MEM_DMA);
+ break;
}
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
}
@@ -396,6 +402,7 @@
case _DRM_SHM:
case _DRM_AGP:
case _DRM_SCATTER_GATHER:
+ case _DRM_CONSISTENT:
DRM_DEBUG("Extra maplist item\n");
break;
}
Index: linux-core/drm_proc.c
===================================================================
RCS file: /cvs/dri/drm/linux-core/drm_proc.c,v
retrieving revision 1.23
diff -u -r1.23 drm_proc.c
--- linux-core/drm_proc.c 20 Oct 2004 05:11:49 -0000 1.23
+++ linux-core/drm_proc.c 29 Dec 2004 20:31:18 -0000
@@ -211,9 +211,9 @@
struct list_head *list;
/* Hardcoded from _DRM_FRAME_BUFFER,
- _DRM_REGISTERS, _DRM_SHM, _DRM_AGP, and
- _DRM_SCATTER_GATHER. */
- const char *types[] = { "FB", "REG", "SHM", "AGP", "SG" };
+ _DRM_REGISTERS, _DRM_SHM, _DRM_AGP,
+ _DRM_SCATTER_GATHER, and _DRM_CONSISTENT. */
+ const char *types[] = { "FB", "REG", "SHM", "AGP", "SG", "PCI" };
const char *type;
int i;
@@ -234,7 +234,7 @@
map = r_list->map;
if (!map)
continue;
- if (map->type < 0 || map->type > 4)
+ if (map->type < 0 || map->type > 5)
type = "??";
else
type = types[map->type];
Index: linux-core/drm_vm.c
===================================================================
RCS file: /cvs/dri/drm/linux-core/drm_vm.c,v
retrieving revision 1.47
diff -u -r1.47 drm_vm.c
--- linux-core/drm_vm.c 23 Oct 2004 06:59:15 -0000 1.47
+++ linux-core/drm_vm.c 29 Dec 2004 20:31:19 -0000
@@ -232,6 +232,11 @@
case _DRM_AGP:
case _DRM_SCATTER_GATHER:
break;
+ case _DRM_CONSISTENT:
+ drm_free_pages((unsigned long)map->handle,
+ drm_order(map->size)-PAGE_SHIFT,
+ DRM_MEM_DMA);
+ break;
}
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
}
@@ -658,6 +663,9 @@
vma->vm_ops = &drm_vm_ops;
break;
case _DRM_SHM:
+ case _DRM_CONSISTENT:
+ /* Consistent memory is really like shared memory. It's only
+ * allocated in a different way. */
vma->vm_ops = &drm_vm_shm_ops;
vma->vm_private_data = (void *)map;
/* Don't let this area swap. Change when
Index: shared-core/drm.h
===================================================================
RCS file: /cvs/dri/drm/shared-core/drm.h,v
retrieving revision 1.59
diff -u -r1.59 drm.h
--- shared-core/drm.h 30 Sep 2004 21:12:09 -0000 1.59
+++ shared-core/drm.h 29 Dec 2004 20:31:22 -0000
@@ -246,7 +246,8 @@
_DRM_REGISTERS = 1, /**< no caching, no core dump */
_DRM_SHM = 2, /**< shared, cached */
_DRM_AGP = 3, /**< AGP/GART */
- _DRM_SCATTER_GATHER = 4 /**< Scatter/gather memory for PCI DMA */
+ _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */
+ _DRM_CONSISTENT = 5 /**< Consistent memory for PCI DMA */
} drm_map_type_t;
/**
Index: libdrm/xf86drm.h
===================================================================
RCS file: /cvs/dri/drm/libdrm/xf86drm.h,v
retrieving revision 1.2
diff -u -r1.2 xf86drm.h
--- libdrm/xf86drm.h 31 Jul 2004 08:12:39 -0000 1.2
+++ libdrm/xf86drm.h 29 Dec 2004 20:31:22 -0000
@@ -104,7 +104,8 @@
DRM_REGISTERS = 1, /**< no caching, no core dump */
DRM_SHM = 2, /**< shared, cached */
DRM_AGP = 3, /**< AGP/GART */
- DRM_SCATTER_GATHER = 4 /**< PCI scatter/gather */
+ DRM_SCATTER_GATHER = 4, /**< PCI scatter/gather */
+ DRM_CONSISTENT = 5 /**< PCI consistent */
} drmMapType;
typedef enum {