summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdrm/xf86drm.c7
-rw-r--r--libdrm/xf86mm.h10
-rw-r--r--linux-core/drmP.h2
-rw-r--r--linux-core/drm_bo.c8
-rw-r--r--linux-core/drm_mm.c5
-rw-r--r--shared-core/drm.h2
6 files changed, 25 insertions, 9 deletions
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 9047c8db4..ebf3f8347 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -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;
diff --git a/libdrm/xf86mm.h b/libdrm/xf86mm.h
index da868fe55..bd0d28129 100644
--- a/libdrm/xf86mm.h
+++ b/libdrm/xf86mm.h
@@ -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);
diff --git a/linux-core/drmP.h b/linux-core/drmP.h
index 1ed20b093..d02184c78 100644
--- a/linux-core/drmP.h
+++ b/linux-core/drmP.h
@@ -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;
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c
index 954b7a038..65e24fb63 100644
--- a/linux-core/drm_bo.c
+++ b/linux-core/drm_bo.c
@@ -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;
diff --git a/linux-core/drm_mm.c b/linux-core/drm_mm.c
index dcd552095..a5566b2fa 100644
--- a/linux-core/drm_mm.c
+++ b/linux-core/drm_mm.c
@@ -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);
diff --git a/shared-core/drm.h b/shared-core/drm.h
index 5784e59b8..330aa3ff1 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -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;