summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2016-05-27AtomicReq: add helper to add multiple propsTomi Valkeinen
2016-05-27add missing idx for Plane & EncoderTomi Valkeinen
2016-05-26Update README.mdTomi Valkeinen
2016-05-26py: add set_prop()Tomi Valkeinen
2016-05-25parallelize drawing of test patternTomi Valkeinen
2016-05-25gamma.py: show a test patternTomi Valkeinen
2016-05-25Add a simple gamma.py testTomi Valkeinen
2016-05-25Add support for DRM blobsTomi Valkeinen
2016-05-25Split properties from DrmObject into DrmPropObjectTomi Valkeinen
2016-05-25disable Wmissing-field-initializers when gcc <= 5.0Tomi Valkeinen
2016-05-25Require libdrm >= 2.4.64Tomi Valkeinen
2016-05-23Update READMETomi Valkeinen
2016-05-23Reorganize libkms++utils headerTomi Valkeinen
2016-05-23File/dir renamesTomi Valkeinen
2016-05-23Fix the rest of the py scriptsTomi Valkeinen
2016-05-23split py filesTomi Valkeinen
2016-05-23update readmeTomi Valkeinen
2016-05-23Automatically use -fltoTomi Valkeinen
2016-05-23improve build typeTomi Valkeinen
2016-05-23Cleanup AtomicReq::commitTomi Valkeinen
2016-05-23Use pybind11 instead of SWIGTomi Valkeinen
2016-05-23Remove swig helpersTomi Valkeinen
2016-05-23Add Crtc::get_primary_planeTomi Valkeinen
2016-05-20testpat: Fix undefined function compilation errorLaurent Pinchart
std::strerror() is defined in the cstring header. Include it directly as it might not be included indirectly with all compiler versions. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2016-05-18add kmsmodeview.pyTomi Valkeinen
2016-05-18fb: fix a few wrong typesTomi Valkeinen
2016-05-16testpat: add dmt & cea parametersTomi Valkeinen
2016-05-16kmsxx: add modedbTomi Valkeinen
2016-05-16testpat: fix crtc regexpTomi Valkeinen
2016-05-11Update TODOTomi Valkeinen
2016-05-09py: fix videomode listTomi Valkeinen
2016-04-26kmscapture: separate step to enable streamingTomi Valkeinen
2016-04-26kmacapture: atomic modesetting supportTomi Valkeinen
2016-04-26kmscapture: cleanupsTomi Valkeinen
2016-04-26kmscapture: cleanups & signedness fixesTomi Valkeinen
2016-04-26kmscapture: renameTomi Valkeinen
2016-04-26kmscapture: use enum classTomi Valkeinen
2016-04-25kmscube: remove unused fieldTomi Valkeinen
2016-04-25kmscube: fix wrong uses of class FramebufferTomi Valkeinen
2016-04-25kmscapture: Clang doesn't like variable len arrays, use vectorTomi Valkeinen
2016-04-25Videomode is a struct, not class, so declare it as oneTomi Valkeinen
2016-04-22kmscube: check errorsTomi Valkeinen
2016-04-21depend on python 3.x, not 3.4Tomi Valkeinen
2016-04-20kmscube: improve the x11 mainloopTomi Valkeinen
2016-04-19kmscube: hackingTomi Valkeinen
2016-04-19kmscube: fix resource leaks & freeingTomi Valkeinen
2016-04-19kmscube: quick hack for fullscreenTomi Valkeinen
2016-04-16kmscube: waylandTomi Valkeinen
2016-04-16add -Wextra & fix warningsTomi Valkeinen
2016-04-16kmscube: split into partsTomi Valkeinen
hl opt">= 0; i < MAX_CONTEXT; i++) { if (global_ppriv[i].used && global_ppriv[i].context == context) { retval = 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 = setDel(global_ppriv[i].sets[type], val); break; } } return retval; } /* fb management via fb device */ #if defined(__linux__) && defined(CONFIG_FB_SIS) static int sis_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { return 0; } static int sis_fb_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_mem_t *fb = data; struct sis_memreq req; int retval = 0; req.size = fb->size; sis_malloc(&req); if (req.offset) { /* TODO */ fb->offset = req.offset; fb->free = req.offset; if (!add_alloc_set(fb->context, VIDEO_TYPE, fb->free)) { DRM_DEBUG("adding to allocation set fails\n"); sis_free(req.offset); retval = -EINVAL; } } else { fb->offset = 0; fb->size = 0; fb->free = 0; } DRM_DEBUG("alloc fb, size = %d, offset = %ld\n", fb->size, req.offset); return retval; } static int sis_fb_free(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_mem_t fb; int retval = 0; if (!fb->free) return -EINVAL; if (!del_alloc_set(fb->context, VIDEO_TYPE, fb->free)) retval = -EINVAL; sis_free(fb->free); DRM_DEBUG("free fb, offset = 0x%lx\n", fb->free); return retval; } #else /* Called by the X Server to initialize the FB heap. Allocations will fail * unless this is called. Offset is the beginning of the heap from the * framebuffer offset (MaxXFBMem in XFree86). * * Memory layout according to Thomas Winischofer: * |------------------|DDDDDDDDDDDDDDDDDDDDDDDDDDDDD|HHHH|CCCCCCCCCCC| * * X driver/sisfb HW- Command- * framebuffer memory DRI heap Cursor queue */ static int sis_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_private_t *dev_priv = dev->dev_private; drm_sis_fb_t *fb = data; if (dev_priv == NULL) { dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t), DRM_MEM_DRIVER); dev_priv = dev->dev_private; if (dev_priv == NULL) return ENOMEM; } if (dev_priv->FBHeap != NULL) return -EINVAL; dev_priv->FBHeap = mmInit(fb->offset, fb->size); DRM_DEBUG("offset = %u, size = %u", fb->offset, fb->size); return 0; } static int sis_fb_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_private_t *dev_priv = dev->dev_private; drm_sis_mem_t *fb = data; PMemBlock block; int retval = 0; if (dev_priv == NULL || dev_priv->FBHeap == NULL) return -EINVAL; block = mmAllocMem(dev_priv->FBHeap, fb->size, 0, 0); if (block) { /* TODO */ fb->offset = block->ofs; fb->free = (unsigned long)block; if (!add_alloc_set(fb->context, VIDEO_TYPE, fb->free)) { DRM_DEBUG("adding to allocation set fails\n"); mmFreeMem((PMemBlock) fb->free); retval = -EINVAL; } } else { fb->offset = 0; fb->size = 0; fb->free = 0; } DRM_DEBUG("alloc fb, size = %d, offset = %d\n", fb->size, fb->offset); return retval; } static int sis_fb_free(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_private_t *dev_priv = dev->dev_private; drm_sis_mem_t *fb = data; if (dev_priv == NULL || dev_priv->FBHeap == NULL) return -EINVAL; if (!mmBlockInHeap(dev_priv->FBHeap, (PMemBlock) fb->free)) return -EINVAL; if (!del_alloc_set(fb->context, VIDEO_TYPE, fb->free)) return -EINVAL; mmFreeMem((PMemBlock) fb->free); DRM_DEBUG("free fb, free = 0x%lx\n", fb->free); return 0; } #endif /* agp memory management */ static int sis_ioctl_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_private_t *dev_priv = dev->dev_private; drm_sis_agp_t *agp = data; if (dev_priv == NULL) { dev->dev_private = drm_calloc(1, sizeof(drm_sis_private_t), DRM_MEM_DRIVER); dev_priv = dev->dev_private; if (dev_priv == NULL) return ENOMEM; } if (dev_priv->AGPHeap != NULL) return -EINVAL; dev_priv->AGPHeap = mmInit(agp->offset, agp->size); DRM_DEBUG("offset = %u, size = %u", agp->offset, agp->size); return 0; } static int sis_ioctl_agp_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_private_t *dev_priv = dev->dev_private; drm_sis_mem_t *agp = data; PMemBlock block; int retval = 0; if (dev_priv == NULL || dev_priv->AGPHeap == NULL) return -EINVAL; block = mmAllocMem(dev_priv->AGPHeap, agp->size, 0, 0); if (block) { /* TODO */ agp->offset = block->ofs; agp->free = (unsigned long)block; if (!add_alloc_set(agp->context, AGP_TYPE, agp->free)) { DRM_DEBUG("adding to allocation set fails\n"); mmFreeMem((PMemBlock) agp->free); retval = -1; } } else { agp->offset = 0; agp->size = 0; agp->free = 0; } DRM_DEBUG("alloc agp, size = %d, offset = %d\n", agp->size, agp->offset); return retval; } static int sis_ioctl_agp_free(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_sis_private_t *dev_priv = dev->dev_private; drm_sis_mem_t *agp = data; if (dev_priv == NULL || dev_priv->AGPHeap == NULL) return -EINVAL; if (!mmBlockInHeap(dev_priv->AGPHeap, (PMemBlock) agp->free)) return -EINVAL; mmFreeMem((PMemBlock) agp->free); if (!del_alloc_set(agp->context, AGP_TYPE, agp->free)) return -EINVAL; DRM_DEBUG("free agp, free = 0x%lx\n", agp->free); return 0; } int sis_init_context(struct drm_device *dev, 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] = setInit(); global_ppriv[i].sets[1] = 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 sis_final_context(struct drm_device *dev, 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; ITEM_TYPE item; int retval; DRM_DEBUG("find socket %d, context = %d\n", i, context); /* Video Memory */ set = global_ppriv[i].sets[0]; retval = setFirst(set, &item); while (retval) { DRM_DEBUG("free video memory 0x%lx\n", item); #if defined(__linux__) && defined(CONFIG_FB_SIS) sis_free(item); #else mmFreeMem((PMemBlock) item); #endif retval = setNext(set, &item); } setDestroy(set); /* AGP Memory */ set = global_ppriv[i].sets[1]; retval = setFirst(set, &item); while (retval) { DRM_DEBUG("free agp memory 0x%lx\n", item); mmFreeMem((PMemBlock) item); retval = setNext(set, &item); } setDestroy(set); global_ppriv[i].used = 0; } return 1; } drm_ioctl_desc_t sis_ioctls[] = { DRM_IOCTL_DEF(DRM_SIS_FB_ALLOC, sis_fb_alloc, DRM_AUTH), DRM_IOCTL_DEF(DRM_SIS_FB_FREE, sis_fb_free, DRM_AUTH), DRM_IOCTL_DEF(DRM_SIS_AGP_INIT, sis_ioctl_agp_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), DRM_IOCTL_DEF(DRM_SIS_AGP_ALLOC, sis_ioctl_agp_alloc, DRM_AUTH), DRM_IOCTL_DEF(DRM_SIS_AGP_FREE, sis_ioctl_agp_free, DRM_AUTH), DRM_IOCTL_DEF(DRM_SIS_FB_INIT, sis_fb_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY) }; int sis_max_ioctl = DRM_ARRAY_SIZE(sis_ioctls);