Dave Airlie wrote:
>>>>>
>>>>>
>>>>>
>>>>OK. We're using this functionality in Poulsbo, so we should probably
>>>>sort this out to avoid breaking things.
>>>>
>>>>
>>>>
>>>Okay I'll try and fix it back up tomorrow..
>>>
>>>
>>>
>
>I've attached my first attempt at fixing this up but it messes up by the
>time the flags hit the ttm binding function they've lost the CACHED_MAPPED
>bit and I end up with snooped bindings, drm_bo_mt_compatible seems to be
>where it disappears and also where my sanity started to end.. are you sure
>there isn't a nicer way of doing those flags/mask because the current
>system is vastly confusing to trace through..
>
>Can you suggest what I'm missing to fix this up?
>
>
>
Dave, as a general rule, bo_mem->mask is the request and bo_mem->flags
is the code's response to that request. The move code deals with the
DRM_BO_MASK_MEMTYPE, whereas the rest of the flags ~DRM_BO_MASK_MEMTYPE
are transferred from the mask in "drm_buffer_object_validate", which is
after the move and bind.
So I guess you should extend DRM_BO_MASK_MEMTYPE and do a quick sanity
check (perhaps just a passthrough) in drm_bo_mt_compatible. That should
do the drick.
That said, it's probably possible to do this in a nicer way, yes.
>Dave.
>
>------------------------------------------------------------------------
>
>diff --git a/linux-core/drm_agpsupport.c b/linux-core/drm_agpsupport.c
>index 8c7f570..4015659 100644
>--- a/linux-core/drm_agpsupport.c
>+++ b/linux-core/drm_agpsupport.c
>@@ -541,11 +541,17 @@ static int drm_agp_bind_ttm(struct drm_ttm_backend
>*backend,
> container_of(backend, struct drm_agp_ttm_backend, backend);
> DRM_AGP_MEM *mem = agp_be->mem;
> int ret;
>+ int snooped = (bo_mem->flags & DRM_BO_FLAG_CACHED) && !(bo_mem->flags &
>DRM_BO_FLAG_CACHED_MAPPED);
>
> DRM_DEBUG("drm_agp_bind_ttm\n");
> mem->is_flushed = TRUE;
>- mem->type = (bo_mem->flags & DRM_BO_FLAG_CACHED) ?
>AGP_USER_CACHED_MEMORY :
>- AGP_USER_MEMORY;
>+ mem->type = AGP_USER_MEMORY;
>+ /* CACHED MAPPED implies not snooped memory */
>+ if (snooped) {
>+ DRM_ERROR("snooped is set oh no 0x%016llx\n", (unsigned long
>long)bo_mem->flags);
>+ mem->type = AGP_USER_CACHED_MEMORY;
>+ }
>+
> ret = drm_agp_bind_memory(mem, bo_mem->mm_node->start);
> if (ret) {
> DRM_ERROR("AGP Bind memory failed\n");
>diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c
>index 16203c7..05b9f5a 100644
>--- a/linux-core/drm_bo.c
>+++ b/linux-core/drm_bo.c
>@@ -1029,7 +1029,7 @@ static int drm_bo_busy(struct drm_buffer_object * bo)
> return 0;
> }
>
>-static int drm_bo_read_cached(struct drm_buffer_object * bo)
>+static int drm_bo_evict_cached(struct drm_buffer_object * bo)
> {
> int ret = 0;
>
>@@ -1177,15 +1177,11 @@ static int drm_buffer_object_map(struct drm_file
>*file_priv, uint32_t handle,
> goto out;
> }
>
>- if ((map_flags & DRM_BO_FLAG_READ) &&
>- (bo->mem.flags & DRM_BO_FLAG_READ_CACHED) &&
>- (!(bo->mem.flags & DRM_BO_FLAG_CACHED))) {
>- drm_bo_read_cached(bo);
>- }
>+ if (bo->mem.flags & DRM_BO_FLAG_CACHED_MAPPED)
>+ drm_bo_evict_cached(bo);
>+
> break;
>- } else if ((map_flags & DRM_BO_FLAG_READ) &&
>- (bo->mem.flags & DRM_BO_FLAG_READ_CACHED) &&
>- (!(bo->mem.flags & DRM_BO_FLAG_CACHED))) {
>+ } else if (bo->mem.flags & DRM_BO_FLAG_CACHED_MAPPED) {
>
> /*
> * We are already mapped with different flags.
>@@ -1292,6 +1288,7 @@ int drm_bo_move_buffer(struct drm_buffer_object * bo,
>uint64_t new_mem_flags,
> if (ret)
> return ret;
>
>+ DRM_DEBUG("new mem flags 0x%016llx\n", new_mem_flags);
> mem.num_pages = bo->num_pages;
> mem.size = mem.num_pages << PAGE_SHIFT;
> mem.mask = new_mem_flags;
>@@ -1666,7 +1663,6 @@ int drm_buffer_object_create(struct drm_device *dev,
> DRM_BO_FLAG_MAPPABLE;
> atomic_inc(&bm->count);
> ret = drm_bo_new_mask(bo, mask, hint);
>-
> if (ret)
> goto out_err;
>
>diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c
>index df9e7e4..83aa28a 100644
>--- a/linux-core/drm_ttm.c
>+++ b/linux-core/drm_ttm.c
>@@ -327,9 +327,10 @@ int drm_bind_ttm(struct drm_ttm * ttm, struct
>drm_bo_mem_reg *bo_mem)
> if (ret)
> return ret;
>
>+ DRM_DEBUG("bo->mem flags is 0x%016llx\n", bo_mem->flags);
> if (ttm->state == ttm_unbound && !(bo_mem->flags & DRM_BO_FLAG_CACHED))
> {
> drm_set_caching(ttm, DRM_TTM_PAGE_UNCACHED);
>- } else if ((bo_mem->flags & DRM_BO_FLAG_CACHED) &&
>+ } else if ((bo_mem->flags & DRM_BO_FLAG_CACHED_MAPPED) &&
> bo_driver->ttm_cache_flush)
> bo_driver->ttm_cache_flush(ttm);
>
>diff --git a/shared-core/drm.h b/shared-core/drm.h
>index 3a10273..9d00e9f 100644
>--- a/shared-core/drm.h
>+++ b/shared-core/drm.h
>@@ -700,10 +700,12 @@ struct drm_fence_arg {
> */
> #define DRM_BO_FLAG_NO_MOVE (1ULL << 8)
>
>-/* Mask: Make sure the buffer is in cached memory when mapped for reading.
>+/* Mask: Make sure the buffer is in cached memory when mapped
> * Flags: Acknowledge.
>+ * Buffers allocated with this flag should not be used for suballocators
> */
>-#define DRM_BO_FLAG_READ_CACHED (1ULL << 19)
>+#define DRM_BO_FLAG_CACHED_MAPPED (1ULL << 19)
>+
>
> /* Mask: Force DRM_BO_FLAG_CACHED flag strictly also if it is set.
> * Flags: Acknowledge.
>
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel