summaryrefslogtreecommitdiff
AgeCommit message (Expand)Author
2008-05-05Correct execbuffer offset. Add memory barrier and chipset flush.Keith Packard
2008-05-05Add i915_dispatch_gem_execbuffer (broken).Keith Packard
2008-05-05r500: add allowed range for us config/pixsizeDave Airlie
2008-05-02Don't forget to set the memrange private, and reset ring on kernel entry.Eric Anholt
2008-05-02Don't include the tail guard memrange in foreach callbacking.Eric Anholt
2008-05-02Check for do_mmap errorsKeith Packard
2008-05-02Add a bit of /proc/dri/*/gem support. Clean up some refcount/pagelock issues.Keith Packard
2008-05-02Add name/open ioctls, separate handle and pointer ref counts.Keith Packard
2008-05-02Remove drm_driver argument to functions taking drm_gem_object.Keith Packard
2008-05-02Fix nouveau warning when returning pointers in uint64_t objects.Keith Packard
2008-05-01Add alignment to all aperture allocation requests.Keith Packard
2008-05-01Fix gem ioctls to be 32/64-bit clean.Keith Packard
2008-05-01Use krefs for refcounting.Keith Packard
2008-05-01Unbind objects when freeing, fix some error paths, and warn in others.Eric Anholt
2008-05-01Fix offset passed to AGP to be pages instead of bytes.Eric Anholt
2008-05-01Fix missing member settings in obj/obj_priv, and some error paths.Eric Anholt
2008-05-01Make GEM object handles be nonzero.Eric Anholt
2008-05-01Update mm tests for GEM rename.Eric Anholt
2008-05-01Remove _args from gem ioctl argument structure tags.Eric Anholt
2008-05-01Add pin/unpin object ioctls for gem.Eric Anholt
2008-05-01checkpoint: relocations support.Eric Anholt
2008-05-01checkpoint: gtt binding written.Eric Anholt
2008-05-01checkpoint: rename to GEM and a few more i915 bits.Eric Anholt
2008-05-02nv50: enable 0x400500 bit 0 after PGRAPH exception alsoBen Skeggs
2008-05-02nouveau: guard against channels potentially not having a context, fix nv50Ben Skeggs
2008-05-02nouveau: disable all card interrupts when unknown PFIFO IRQ occurs.Ben Skeggs
2008-05-02nouveau: restore original NV_PFIFO_CACHES_REASSIGN value in fifo handlerBen Skeggs
2008-05-02nouveau: gather nsource in trap_info()Ben Skeggs
2008-05-02nv50: PGRAPH exception handling completely different from earlier chipsBen Skeggs
2008-05-01nv50: I cave... Add nv84 initial context values.Ben Skeggs
2008-04-30Hacking towards hooking up execbuffer.Eric Anholt
2008-04-29Remove the remainder of the mmfs device.Eric Anholt
2008-04-29Move mmfs tests over to be drm tests.Eric Anholt
2008-04-29Move mmfs ioctls into the DRM. Untested.Eric Anholt
2008-04-29i915: fix off by one in VGA save/restore of AR & CR regsJesse Barnes
2008-04-29nouveau: NV9x cards exist as well.Maarten Maathuis
2008-04-28Rename drm_mm.c and its fuctions to drm_memrange.Eric Anholt
2008-04-28Merge branch 'master' into modesetting-101Thomas Hellstrom
2008-04-27Use fixed sized types in new ioctlsJesse Barnes
2008-04-26Enum-ectomy of vblank modesetting ioctlJesse Barnes
2008-04-23Add mmap ioctl to mmfs.Eric Anholt
2008-04-23Add pread/pwrite ioctls to mmfs.Eric Anholt
2008-04-23Extend the mmfs basic test to do a couple of ioctls.Eric Anholt
2008-04-23Move mmfs.h userland interface to shared-core.Eric Anholt
2008-04-23Initial add of mmfs module.Eric Anholt
2008-04-23Clarify that drm_agp_ttm_backend is associated with a drm_ttm.Eric Anholt
2008-04-23Make via compile.Kristian Høgsberg
2008-04-23Make radeon_ms compile.Kristian Høgsberg
2008-04-23Don't disable IRQs, just tasklets, when taking the drm lock spinlock.Thomas Hellstrom
2008-04-23Fixed unlock check on EAGAINJakob Bornecrantz
ies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #define __NO_VERSION__ #include "via.h" #include "drmP.h" #include "via_drm.h" #include "via_drv.h" #include "via_ds.h" #include "via_mm.h" #define MAX_CONTEXT 100 unsigned int VIA_DEBUG = 1; typedef struct { int used; int context; set_t *sets[2]; /* 0 for frame buffer, 1 for AGP , 2 for System*/ } via_context_t; static via_context_t global_ppriv[MAX_CONTEXT]; static int add_alloc_set(int context, int type, unsigned int val) { int i, retval = 0; for (i = 0; i < MAX_CONTEXT; i++) { if (global_ppriv[i].used && global_ppriv[i].context == context) { retval = via_setAdd(global_ppriv[i].sets[type], val); break; } } return retval; } static int del_alloc_set(int context, int type, unsigned int val) { int i, retval = 0; for (i = 0; i < MAX_CONTEXT; i++) if (global_ppriv[i].used && global_ppriv[i].context == context) { retval = via_setDel(global_ppriv[i].sets[type], val); break; } return retval; } /* agp memory management */ static memHeap_t *AgpHeap = NULL; int via_agp_init( DRM_IOCTL_ARGS ) { drm_via_agp_t agp; DRM_COPY_FROM_USER_IOCTL(agp, (drm_via_agp_t *)data, sizeof(agp)); AgpHeap = via_mmInit(agp.offset, agp.size); DRM_DEBUG("offset = %u, size = %u", agp.offset, agp.size); return 0; } /* fb memory management */ static memHeap_t *FBHeap = NULL; int via_fb_init( DRM_IOCTL_ARGS ) { drm_via_fb_t fb; DRM_COPY_FROM_USER_IOCTL(fb, (drm_via_fb_t *)data, sizeof(fb)); FBHeap = via_mmInit(fb.offset, fb.size); DRM_DEBUG("offset = %u, size = %u", fb.offset, fb.size); return 0; } int via_init_context(int context) { int i; for (i = 0; i < MAX_CONTEXT ; i++) if (global_ppriv[i].used && (global_ppriv[i].context == context)) break; if (i >= MAX_CONTEXT) { for (i = 0; i < MAX_CONTEXT ; i++) { if (!global_ppriv[i].used) { global_ppriv[i].context = context; global_ppriv[i].used = 1; global_ppriv[i].sets[0] = via_setInit(); global_ppriv[i].sets[1] = via_setInit(); DRM_DEBUG("init allocation set, socket=%d," " context = %d\n", i, context); break; } } if ((i >= MAX_CONTEXT) || (global_ppriv[i].sets[0] == NULL) || (global_ppriv[i].sets[1] == NULL)) { return 0; } } return 1; } int via_final_context(int context) { int i; for (i=0; i<MAX_CONTEXT; i++) if (global_ppriv[i].used && (global_ppriv[i].context == context)) break; if (i < MAX_CONTEXT) { set_t *set; unsigned int item; int retval; DRM_DEBUG("find socket %d, context = %d\n", i, context); /* Video Memory */ set = global_ppriv[i].sets[0]; retval = via_setFirst(set, &item); while (retval) { DRM_DEBUG("free video memory 0x%x\n", item); via_mmFreeMem((PMemBlock)item); retval = via_setNext(set, &item); } via_setDestroy(set); /* AGP Memory */ set = global_ppriv[i].sets[1]; retval = via_setFirst(set, &item); while (retval) { DRM_DEBUG("free agp memory 0x%x\n", item); via_mmFreeMem((PMemBlock)item); retval = via_setNext(set, &item); } via_setDestroy(set); global_ppriv[i].used = 0; } return 1; } int via_mem_alloc( DRM_IOCTL_ARGS) { drm_via_mem_t mem; DRM_COPY_FROM_USER_IOCTL(mem, (drm_via_mem_t *)data, sizeof(mem)); switch (mem.type) { case VIDEO : if (via_fb_alloc(&mem) < 0) return -EFAULT; DRM_COPY_TO_USER_IOCTL((drm_via_mem_t *)data, mem, sizeof(mem)); return 0; case AGP : if (via_agp_alloc(&mem) < 0) return -EFAULT; DRM_COPY_TO_USER_IOCTL((drm_via_mem_t *)data, mem, sizeof(mem)); return 0; } return -EFAULT; } int via_fb_alloc(drm_via_mem_t* mem) { drm_via_mm_t fb; PMemBlock block; int retval = 0; if (!FBHeap) return -1; fb.size = mem->size; fb.context = mem->context; block = via_mmAllocMem(FBHeap, fb.size, 5, 0); if (block) { fb.offset = block->ofs; fb.free = (unsigned int)block; if (!add_alloc_set(fb.context, VIDEO, fb.free)) { DRM_DEBUG("adding to allocation set fails\n"); via_mmFreeMem((PMemBlock)fb.free); retval = -1; } } else { fb.offset = 0; fb.size = 0; fb.free = 0; retval = -1; } mem->offset = fb.offset; mem->index = fb.free; DRM_DEBUG("alloc fb, size = %d, offset = %d\n", fb.size, (int)fb.offset); return retval; } int via_agp_alloc(drm_via_mem_t* mem) { drm_via_mm_t agp; PMemBlock block; int retval = 0; if (!AgpHeap) return -1; agp.size = mem->size; agp.context = mem->context; block = via_mmAllocMem(AgpHeap, agp.size, 5, 0); if (block) { agp.offset = block->ofs; agp.free = (unsigned int)block; if (!add_alloc_set(agp.context, AGP, agp.free)) { DRM_DEBUG("adding to allocation set fails\n"); via_mmFreeMem((PMemBlock)agp.free); retval = -1; } } else { agp.offset = 0; agp.size = 0; agp.free = 0; } mem->offset = agp.offset; mem->index = agp.free; DRM_DEBUG("alloc agp, size = %d, offset = %d\n", agp.size, (unsigned int)agp.offset); return retval; } int via_mem_free( DRM_IOCTL_ARGS ) { drm_via_mem_t mem; DRM_COPY_FROM_USER_IOCTL(mem, (drm_via_mem_t *)data, sizeof(mem)); switch (mem.type) { case VIDEO : if (via_fb_free(&mem) == 0) return 0; break; case AGP : if (via_agp_free(&mem) == 0) return 0; break; } return -EFAULT; } int via_fb_free(drm_via_mem_t* mem) { drm_via_mm_t fb; int retval = 0; if (!FBHeap) { return -1; } fb.free = mem->index; fb.context = mem->context; if (!fb.free) { return -1; } via_mmFreeMem((PMemBlock)fb.free); if (!del_alloc_set(fb.context, VIDEO, fb.free)) { retval = -1; } DRM_DEBUG("free fb, free = %d\n", fb.free); return retval; } int via_agp_free(drm_via_mem_t* mem) { drm_via_mm_t agp; int retval = 0; agp.free = mem->index; agp.context = mem->context; if (!agp.free) return -1; via_mmFreeMem((PMemBlock)agp.free); if (!del_alloc_set(agp.context, AGP, agp.free)) { retval = -1; } DRM_DEBUG("free agp, free = %d\n", agp.free); return retval; } EXPORT_SYMBOL(via_fb_alloc); EXPORT_SYMBOL(via_fb_free);