From: <ai...@fr...> - 2007-08-14 01:21:17
|
libdrm/xf86drm.c | 5 ++++- libdrm/xf86mm.h | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) New commits: commit 97f4a9a57c2472bd07c5c6d015c781abcb5c85a8 Author: Dave Airlie <ai...@re...> Date: Tue Aug 14 10:02:29 2007 +1000 drm: add priv pointer to the bo list diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index 44786cf..cbb2501 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -2640,6 +2640,7 @@ drmBONode *drmAddListItem(drmBOList *list, drmBO *item, node->buf = item; node->arg0 = arg0; node->arg1 = arg1; + node->priv = NULL; if (node->nr_reloc_lists) { for (i = 0; i < node->nr_reloc_lists; i++) { @@ -3010,7 +3011,7 @@ int drmBOBusy(int fd, drmBO *buf, int *busy) } int drmAddValidateItemReloc(drmBOList *list, drmBO *buf, unsigned flags, unsigned mask, - drm_handle_t reloc_handle, uint64_t reloc, uint32_t delta, + drm_handle_t reloc_handle, uint64_t reloc, uint32_t delta, void *priv, int *itemLoc) { drmBONode *node, *cur; @@ -3058,6 +3059,7 @@ int drmAddValidateItemReloc(drmBOList *list, drmBO *buf, unsigned flags, unsigne } cur->arg0 = flags; cur->arg1 = mask; + cur->priv = priv; } else { unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM; unsigned memFlags = cur->arg0 & flags & memMask; @@ -3084,6 +3086,7 @@ int drmAddValidateItemReloc(drmBOList *list, drmBO *buf, unsigned flags, unsigne cur->arg0 = memFlags | ((cur->arg0 | flags) & cur->arg1 & ~DRM_BO_MASK_MEM); + cur->priv = priv; if (reloc_handle) { for (i = 0; i < cur->nr_reloc_lists; i++) if (cur->relocs[i][0] == reloc_handle) diff --git a/libdrm/xf86mm.h b/libdrm/xf86mm.h index 4a2a72a..f729f59 100644 --- a/libdrm/xf86mm.h +++ b/libdrm/xf86mm.h @@ -134,6 +134,7 @@ typedef struct _drmBONode struct drm_bo_op_arg bo_arg; unsigned long arg0; unsigned long arg1; + void *priv; int nr_reloc_lists; uint32_t **relocs; } drmBONode; @@ -201,8 +202,7 @@ extern int drmBOBusy(int fd, drmBO *buf, int *busy); extern int drmAddValidateItemReloc(drmBOList *list, drmBO *buf, unsigned flags, unsigned mask, - drm_handle_t reloc_handle, uint64_t reloc, uint32_t delta, - int *itemLoc); + drm_handle_t reloc_handle, uint64_t reloc, uint32_t delta, void *priv, int *itemLoc); extern int drmBOValidateList(int fd, drmBOList *list); extern int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle); |
From: <ai...@fr...> - 2007-08-16 07:28:04
|
linux-core/drm_ttm.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) New commits: commit fa496c2728e6c992cd2a6b0f0bdeaf11567ba583 Author: Dave Airlie <ai...@re...> Date: Thu Aug 16 17:21:34 2007 +1000 woah lordy those pages need reservin.... or do they? diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index 60c64cb..445cbd8 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -92,10 +92,14 @@ static struct page *drm_ttm_alloc_page(void) drm_free_memctl(PAGE_SIZE); return NULL; } + + get_page(page); + + SetPageReserved(page); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)) - SetPageLocked(page); + // SetPageLocked(page); #else - SetPageReserved(page); + #endif return page; } @@ -113,10 +117,10 @@ static int drm_set_caching(struct drm_ttm * ttm, int noncached) if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) == noncached) return 0; - +#if 0 if (noncached) drm_ttm_cache_flush(); - +#endif for (i = 0; i < ttm->num_pages; ++i) { cur_page = ttm->pages + i; if (*cur_page) { @@ -167,10 +171,12 @@ int drm_destroy_ttm(struct drm_ttm * ttm) cur_page = ttm->pages + i; if (*cur_page) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)) - unlock_page(*cur_page); + // unlock_page(*cur_page); #else ClearPageReserved(*cur_page); #endif + ClearPageReserved(*cur_page); + put_page(*cur_page); if (page_count(*cur_page) != 1) { DRM_ERROR("Erroneous page count. " "Leaking pages.\n"); |
From: <ai...@fr...> - 2007-08-19 22:40:37
|
libdrm/xf86drm.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) New commits: commit 0f08564e57a19a32b054ccf419edc229f8b8f52f Author: Dave Airlie <ai...@re...> Date: Fri Aug 17 13:46:35 2007 +1000 libdrm: fix memory allocation issues diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index cbb2501..68be921 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -2538,6 +2538,18 @@ int drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type) return 0; } +static int drmBOFreeNode(drmBONode *node) +{ + int i; + if (node->nr_reloc_lists) { + for (i = 0 ; i < node->nr_reloc_lists; i++) { + free(node->relocs[i]); + } + free(node->relocs); + } + free(node); + +} static int drmAdjustListNodes(drmBOList *list) { drmBONode *node; @@ -2560,7 +2572,7 @@ static int drmAdjustListNodes(drmBOList *list) break; DRMLISTDEL(l); node = DRMLISTENTRY(drmBONode, l, head); - free(node); + drmBOFreeNode(node); list->numCurrent--; } return ret; @@ -2575,7 +2587,7 @@ void drmBOFreeList(drmBOList *list) while(l != &list->list) { DRMLISTDEL(l); node = DRMLISTENTRY(drmBONode, l, head); - free(node); + drmBOFreeNode(node); l = list->list.next; list->numCurrent--; list->numOnList--; @@ -2585,14 +2597,7 @@ void drmBOFreeList(drmBOList *list) while(l != &list->free) { DRMLISTDEL(l); node = DRMLISTENTRY(drmBONode, l, head); - - if (node->nr_reloc_lists) { - for (i = 0 ; i < node->nr_reloc_lists; i++) { - free(node->relocs[i]); - } - free(node->relocs); - } - free(node); + drmBOFreeNode(node); l = list->free.next; list->numCurrent--; } @@ -3094,7 +3099,7 @@ int drmAddValidateItemReloc(drmBOList *list, drmBO *buf, unsigned flags, unsigne /* didn't find the bo handle add a new relocation list */ if (i == cur->nr_reloc_lists) { - cur->relocs = realloc(cur->relocs, cur->nr_reloc_lists + 1); + cur->relocs = realloc(cur->relocs, (cur->nr_reloc_lists + 1) * (sizeof(unsigned int *))); if (!cur->relocs) { drmMsg("Out of memory creating validate list node.\n"); return -ENOMEM; |
From: <ai...@fr...> - 2007-08-21 07:57:51
|
shared-core/i915_dma.c | 2 ++ 1 file changed, 2 insertions(+) New commits: commit 07e2b55dd12e2cf34a0ad18886d907b60525c9f3 Author: root <root@pegasus.(none)> Date: Tue Aug 21 17:57:00 2007 +1000 i915: make sure virtual address is valid before writing to it diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index d1ccef3..15d838b 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -785,6 +785,8 @@ int i915_process_relocs(struct drm_device *dev, struct drm_file *file_priv, unsi if (this_page != cur_page) { cur_page = this_page; ttm_get_kmap_page(bo->ttm, cur_page, &bb_virt, &bb_page); + if (!bb_virt) + return -EINVAL; } *(u32 *)(bb_virt + this_offset) = offset + reloc_list[i+1]; } |
From: <ai...@fr...> - 2007-08-28 01:46:15
|
linux-core/drm_bo_move.c | 15 ++++++++++----- linux-core/drm_objects.h | 3 ++- linux-core/drm_ttm.c | 12 ++++++++---- shared-core/i915_dma.c | 8 +++++++- 4 files changed, 27 insertions(+), 11 deletions(-) New commits: commit f37deaceaf55017bc97a97e7afb18f1518b1ffe8 Author: Dave Airlie <airlied@optimus.(none)> Date: Tue Aug 28 11:43:34 2007 +1000 ttm: avoid using ioremap nocache when we know the area is already cached diff --git a/linux-core/drm_bo_move.c b/linux-core/drm_bo_move.c index 21ab4bb..7dee31f 100644 --- a/linux-core/drm_bo_move.c +++ b/linux-core/drm_bo_move.c @@ -90,7 +90,8 @@ EXPORT_SYMBOL(drm_bo_move_ttm); /** * \c Return a kernel virtual address to the buffer object PCI memory. * - * \param bo The buffer object. + * \param mem the BO mem region + * \param cached whether the region is current in cached or uncached memory. * \return Failure indication. * * Returns -EINVAL if the buffer object is currently not mappable. @@ -103,7 +104,7 @@ EXPORT_SYMBOL(drm_bo_move_ttm); */ int drm_mem_reg_ioremap(struct drm_device * dev, struct drm_bo_mem_reg * mem, - void **virtual) + void **virtual, int cached) { struct drm_buffer_manager *bm = &dev->bm; struct drm_mem_type_manager *man = &bm->man[mem->mem_type]; @@ -121,7 +122,11 @@ int drm_mem_reg_ioremap(struct drm_device * dev, struct drm_bo_mem_reg * mem, if (!(man->flags & _DRM_FLAG_NEEDS_IOREMAP)) addr = (void *)(((u8 *) man->io_addr) + bus_offset); else { - addr = ioremap_nocache(bus_base + bus_offset, bus_size); + /* if the area is already uncached no need to make ioremap do the uncaching again */ + if (cached) + addr = ioremap_nocache(bus_base + bus_offset, bus_size); + else + addr = ioremap(bus_base + bus_offset, bus_size); if (!addr) return -ENOMEM; } @@ -220,10 +225,10 @@ int drm_bo_move_memcpy(struct drm_buffer_object * bo, unsigned long add = 0; int dir; - ret = drm_mem_reg_ioremap(dev, old_mem, &old_iomap); + ret = drm_mem_reg_ioremap(dev, old_mem, &old_iomap, 1); if (ret) return ret; - ret = drm_mem_reg_ioremap(dev, new_mem, &new_iomap); + ret = drm_mem_reg_ioremap(dev, new_mem, &new_iomap, 1); if (ret) goto out; diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h index 8dc2933..480d261 100644 --- a/linux-core/drm_objects.h +++ b/linux-core/drm_objects.h @@ -299,6 +299,7 @@ extern void drm_ttm_unbind(struct drm_ttm * ttm); extern void drm_ttm_evict(struct drm_ttm * ttm); extern void drm_ttm_fixup_caching(struct drm_ttm * ttm); extern struct page *drm_ttm_get_page(struct drm_ttm * ttm, int index); +extern int drm_ttm_get_caching(struct drm_ttm *ttm); /* * Destroy a ttm. The user normally calls drmRmMap or a similar IOCTL to do this, @@ -513,7 +514,7 @@ extern int drm_bo_move_accel_cleanup(struct drm_buffer_object * bo, extern int drm_mem_reg_ioremap(struct drm_device * dev, struct drm_bo_mem_reg * mem, - void **virtual); + void **virtual, int cached); extern void drm_mem_reg_iounmap(struct drm_device * dev, struct drm_bo_mem_reg * mem, diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index 445cbd8..930a916 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -117,10 +117,7 @@ static int drm_set_caching(struct drm_ttm * ttm, int noncached) if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) == noncached) return 0; -#if 0 - if (noncached) - drm_ttm_cache_flush(); -#endif + for (i = 0; i < ttm->num_pages; ++i) { cur_page = ttm->pages + i; if (*cur_page) { @@ -348,3 +345,10 @@ int drm_bind_ttm(struct drm_ttm * ttm, int cached, unsigned long aper_offset) } EXPORT_SYMBOL(drm_bind_ttm); + +/* returns 1 for cached ttm, 0 for uncached ttm */ +int drm_ttm_get_caching(struct drm_ttm *ttm) +{ + return (!(ttm->page_flags & DRM_TTM_PAGE_UNCACHED)); +} +EXPORT_SYMBOL(drm_ttm_get_caching); diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 8755f8a..2e1cd11 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -734,6 +734,7 @@ int i915_process_relocs(struct drm_device *dev, struct drm_file *file_priv, unsi int ret; struct drm_buffer_object *bo; void *bb_virt; + int caching = 1; ret = get_user(bo_handle, &reloc_hdr[0]); if (ret) @@ -751,10 +752,15 @@ int i915_process_relocs(struct drm_device *dev, struct drm_file *file_priv, unsi if (!bo) return -EINVAL; + /* need to relocate in side a TTM */ + if (bo->ttm) + if (!drm_ttm_get_caching(bo->ttm)) + caching = 0; + /* TODO **** NEED TO CHECK FOR BO BUSY HERE */ /* map the batchbuffer object into kernel space */ - ret = drm_mem_reg_ioremap(dev, &bo->mem, &bb_virt); + ret = drm_mem_reg_ioremap(dev, &bo->mem, &bb_virt, caching); if (ret) { DRM_ERROR("Couldn't ioremap buffer \n"); return -EINVAL; |