static int drmAdjustListNodes(drmBOList * list) { drmBONode *node; drmMMListHead *l; int ret = 0; while (list->numCurrent < list->numTarget) { node = (drmBONode *) malloc(sizeof(*node)); if (!node) { ret = -ENOMEM; break; } list->numCurrent++; DRMLISTADD(&node->head, &list->free); } while (list->numCurrent > list->numTarget) { l = list->free.next; if (l == &list->free) break; DRMLISTDEL(l); node = DRMLISTENTRY(drmBONode, l, head); free(node); list->numCurrent--; } return ret; }
static int drmBOResetList(drmBOList * list) { drmMMListHead *l; int ret; ret = drmAdjustListNodes(list); if (ret) return ret; l = list->list.next; while (l != &list->list) { DRMLISTDEL(l); DRMLISTADD(l, &list->free); list->numOnList--; l = list->list.next; } return drmAdjustListNodes(list); }
int drm_tegra_bo_create(struct drm_tegra *drm, uint32_t flags, uint32_t size, struct drm_tegra_bo **bop) { struct drm_tegra_gem_create args; struct drm_tegra_bo *bo; int err; if (!drm || size == 0 || !bop) return -EINVAL; bo = calloc(1, sizeof(*bo)); if (!bo) return -ENOMEM; DRMINITLISTHEAD(&bo->list); atomic_set(&bo->ref, 1); bo->flags = flags; bo->size = size; bo->drm = drm; memset(&args, 0, sizeof(args)); args.flags = flags; args.size = size; err = drmCommandWriteRead(drm->fd, DRM_TEGRA_GEM_CREATE, &args, sizeof(args)); if (err < 0) { free(bo); return -errno; } DRMLISTADD(&bo->list, &drm->bo_list); bo->handle = args.handle; *bop = bo; return 0; }
int drm_tegra_bo_open(struct drm_tegra *drm, uint32_t name, struct drm_tegra_bo **bop) { struct drm_gem_open args; struct drm_tegra_bo *bo; int err; if (!drm || !name || !bop) return -EINVAL; bo = calloc(1, sizeof(*bo)); if (!bo) return -ENOMEM; DRMINITLISTHEAD(&bo->list); atomic_set(&bo->ref, 1); bo->flags = 0; bo->drm = drm; memset(&args, 0, sizeof(args)); args.name = name; err = drmIoctl(drm->fd, DRM_IOCTL_GEM_OPEN, &args); if (err < 0) { free(bo); return -errno; } DRMLISTADD(&bo->list, &drm->bo_list); bo->handle = args.handle; bo->size = args.size; *bop = bo; return 0; }