OSDN Git Service

Last minute changes to support multi-page size buffer offset alignments.
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Fri, 27 Oct 2006 09:28:37 +0000 (11:28 +0200)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Fri, 27 Oct 2006 09:28:37 +0000 (11:28 +0200)
This will come in very handy for tiled buffers on intel hardware.
Also add some padding to interface structures to allow future binary backwards
compatible changes.

libdrm/xf86drm.c
libdrm/xf86mm.h
linux-core/drmP.h
linux-core/drm_bo.c
linux-core/drm_mm.c
shared-core/drm.h

index 9047c8d..ebf3f83 100644 (file)
@@ -2613,12 +2613,14 @@ static void drmBOCopyReply(const drm_bo_arg_reply_t *rep,
     buf->start = rep->buffer_start;
     buf->fenceFlags = rep->fence_flags;
     buf->replyFlags = rep->rep_flags;
+    buf->pageAlignment = rep->page_alignment;
 }
     
     
 
-int drmBOCreate(int fd, void *ttm, unsigned long start, unsigned long size,
-               void *user_buffer, drm_bo_type_t type, unsigned mask,
+int drmBOCreate(int fd, unsigned long start, unsigned long size, 
+               unsigned pageAlignment, void *user_buffer, drm_bo_type_t type, 
+               unsigned mask,
                unsigned hint, drmBO *buf)
 {
     drm_bo_arg_t arg;
@@ -2632,6 +2634,7 @@ int drmBOCreate(int fd, void *ttm, unsigned long start, unsigned long size,
     req->hint = hint;
     req->size = size;
     req->type = type;
+    req->page_alignment = pageAlignment;
 
     buf->virtual = NULL;
 
index da868fe..bd0d281 100644 (file)
@@ -99,6 +99,7 @@ typedef struct _drmFence{
         unsigned type; 
         unsigned flags;
         unsigned signaled;
+        unsigned pad[4]; /* for future expansion */
 } drmFence;
 
 typedef struct _drmBO{
@@ -113,9 +114,11 @@ typedef struct _drmBO{
     unsigned long start;
     unsigned replyFlags;
     unsigned fenceFlags;
+    unsigned pageAlignment;
     void *virtual;
     void *mapVirtual;
     int mapCount;
+    unsigned pad[8];     /* for future expansion */
 } drmBO;
 
 
@@ -168,9 +171,10 @@ extern int drmBOCreateList(int numTarget, drmBOList *list);
  * Buffer object functions.
  */
 
-extern int drmBOCreate(int fd, void *ttm, unsigned long start, unsigned long size,
-                             void *user_buffer, drm_bo_type_t type, unsigned mask,
-               unsigned hint, drmBO *buf);
+extern int drmBOCreate(int fd, unsigned long start, unsigned long size,
+                      unsigned pageAlignment,void *user_buffer, 
+                      drm_bo_type_t type, unsigned mask,
+                      unsigned hint, drmBO *buf);
 extern int drmBODestroy(int fd, drmBO *buf);
 extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
 extern int drmBOUnReference(int fd, drmBO *buf);
index 1ed20b0..d02184c 100644 (file)
@@ -1016,7 +1016,7 @@ typedef struct drm_buffer_object{
         unsigned long buffer_start;
         drm_bo_type_t type;
         unsigned long offset;
-
+        uint32_t page_alignment;
        atomic_t mapped;
        uint32_t flags;
        uint32_t mask;
index 954b7a0..65e24fb 100644 (file)
@@ -571,7 +571,7 @@ int drm_bo_alloc_space(drm_buffer_object_t * buf, unsigned mem_type,
 
        mutex_lock(&dev->struct_mutex);
        do {
-               node = drm_mm_search_free(mm, size, 0, 1);
+               node = drm_mm_search_free(mm, size, buf->page_alignment, 1);
                if (node)
                        break;
 
@@ -599,7 +599,7 @@ int drm_bo_alloc_space(drm_buffer_object_t * buf, unsigned mem_type,
                return -ENOMEM;
        }
 
-       node = drm_mm_get_block(node, size, 0);
+       node = drm_mm_get_block(node, size, buf->page_alignment);
        mutex_unlock(&dev->struct_mutex);
        BUG_ON(!node);
        node->private = (void *)buf;
@@ -959,6 +959,7 @@ static void drm_bo_fill_rep_arg(drm_buffer_object_t * bo,
        rep->buffer_start = bo->buffer_start;
        rep->fence_flags = bo->fence_type;
        rep->rep_flags = 0;
+       rep->page_alignment = bo->page_alignment;
 
        if ((bo->priv_flags & _DRM_BO_FLAG_UNFENCED) || drm_bo_quick_busy(bo)) {
                DRM_FLAG_MASKED(rep->rep_flags, DRM_BO_REP_BUSY,
@@ -1387,6 +1388,7 @@ int drm_buffer_object_create(drm_file_t * priv,
                             drm_bo_type_t type,
                             uint32_t mask,
                             uint32_t hint,
+                            uint32_t page_alignment,
                             unsigned long buffer_start,
                             drm_buffer_object_t ** buf_obj)
 {
@@ -1426,6 +1428,7 @@ int drm_buffer_object_create(drm_file_t * priv,
        bo->num_pages = num_pages;
        bo->node_card = NULL;
        bo->node_ttm = NULL;
+       bo->page_alignment = page_alignment;
        if (bo->type == drm_bo_type_fake) {
                bo->offset = buffer_start;
                bo->buffer_start = 0;
@@ -1516,6 +1519,7 @@ int drm_bo_ioctl(DRM_IOCTL_ARGS)
                                                     req->type,
                                                     req->mask,
                                                     req->hint,
+                                                    req->page_alignment,
                                                     req->buffer_start, &entry);
                        if (rep.ret)
                                break;
index dcd5520..a5566b2 100644 (file)
@@ -147,7 +147,10 @@ drm_mm_node_t *drm_mm_get_block(drm_mm_node_t * parent,
 
        drm_mm_node_t *align_splitoff = NULL;
        drm_mm_node_t *child;
-       unsigned tmp = size % alignment;
+       unsigned tmp = 0;
+
+       if (alignment)
+               tmp = size % alignment;
        
        if (tmp) {
                align_splitoff = drm_mm_split_at_start(parent, alignment - tmp);
index 5784e59..330aa3f 100644 (file)
@@ -770,6 +770,7 @@ typedef struct drm_bo_arg_request {
        drm_bo_type_t type;
        unsigned arg_handle;
        drm_u64_t buffer_start;
+        unsigned page_alignment;
        unsigned expand_pad[4]; /*Future expansion */
        enum {
                drm_bo_create,
@@ -804,6 +805,7 @@ typedef struct drm_bo_arg_reply {
         drm_u64_t buffer_start;
         unsigned fence_flags;
         unsigned rep_flags;
+        unsigned page_alignment;
        unsigned expand_pad[4]; /*Future expansion */
 }drm_bo_arg_reply_t;