/* pin, prepare for scanout: */ int omap_framebuffer_pin(struct drm_framebuffer *fb) { struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); int ret, i, n = drm_format_num_planes(fb->pixel_format); if (omap_fb->pin_count > 0) { omap_fb->pin_count++; return 0; } for (i = 0; i < n; i++) { struct plane *plane = &omap_fb->planes[i]; ret = omap_gem_get_paddr(plane->bo, &plane->paddr, true); if (ret) goto fail; omap_gem_dma_sync(plane->bo, DMA_TO_DEVICE); } omap_fb->pin_count++; return 0; fail: for (i--; i >= 0; i--) { struct plane *plane = &omap_fb->planes[i]; omap_gem_put_paddr(plane->bo); plane->paddr = 0; } return ret; }
static void omap_plane_post_apply(struct omap_drm_apply *apply) { struct omap_plane *omap_plane = container_of(apply, struct omap_plane, apply); struct drm_plane *plane = &omap_plane->base; struct omap_overlay_info *info = &omap_plane->info; struct drm_gem_object *bo = NULL; struct callback cb; cb = omap_plane->apply_done_cb; omap_plane->apply_done_cb.fxn = NULL; while (kfifo_get(&omap_plane->unpin_fifo, &bo)) { omap_gem_put_paddr(bo); drm_gem_object_unreference_unlocked(bo); } if (cb.fxn) cb.fxn(cb.arg); if (omap_plane->enabled) { omap_framebuffer_flush(plane->fb, info->pos_x, info->pos_y, info->out_width, info->out_height); } }
static void omap_gem_unmap_dma_buf(struct dma_buf_attachment *attachment, struct sg_table *sg, enum dma_data_direction dir) { struct drm_gem_object *obj = attachment->dmabuf->priv; omap_gem_put_paddr(obj); sg_free_table(sg); kfree(sg); }
static void unpin(void *arg, struct drm_gem_object *bo) { struct drm_plane *plane = arg; struct omap_plane *omap_plane = to_omap_plane(plane); if (kfifo_put(&omap_plane->unpin_fifo, (const struct drm_gem_object **)&bo)) { /* also hold a ref so it isn't free'd while pinned */ drm_gem_object_reference(bo); } else { dev_err(plane->dev->dev, "unpin fifo full!\n"); omap_gem_put_paddr(bo); } }
static void codec_unlockbuf(struct dce_file_priv *priv, uint32_t codec_handle, int32_t id) { struct dce_codec *codec = &priv->codecs[codec_handle-1]; int i; for (i = 0; i < ARRAY_SIZE(codec->locked_buffers); i++) { struct dce_buffer *buf = &codec->locked_buffers[i]; /* if id==0, unlock all buffers.. */ if (((id == 0) && (buf->id != 0)) || ((id != 0) && (buf->id == id))) { struct drm_gem_object *y, *uv; y = buf->y; uv = buf->uv; DBG("unlock[%d]: y=%p, uv=%p", buf->id, y, uv); /* release extra ref */ omap_gem_put_paddr(y); drm_gem_object_unreference_unlocked(y); if (uv) { omap_gem_put_paddr(uv); drm_gem_object_unreference_unlocked(uv); } buf->id = 0; buf->y = NULL; buf->uv = NULL; /* if id==0, unlock all buffers.. */ if (id != 0) return; } } }
/* unpin, no longer being scanned out: */ void omap_framebuffer_unpin(struct drm_framebuffer *fb) { struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); int i, n = drm_format_num_planes(fb->pixel_format); omap_fb->pin_count--; if (omap_fb->pin_count > 0) return; for (i = 0; i < n; i++) { struct plane *plane = &omap_fb->planes[i]; omap_gem_put_paddr(plane->bo); plane->paddr = 0; } }
/* unpin, no longer being scanned out: */ int omap_framebuffer_unpin(struct drm_framebuffer *fb) { struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); int ret, i, n = drm_format_num_planes(fb->pixel_format); for (i = 0; i < n; i++) { struct plane *plane = &omap_fb->planes[i]; ret = omap_gem_put_paddr(plane->bo); if (ret) goto fail; plane->paddr = 0; } return 0; fail: return ret; }
static void omap_framebuffer_destroy(struct drm_framebuffer *fb) { struct drm_device *dev = fb->dev; struct omap_framebuffer *omap_fb = to_omap_framebuffer(fb); DBG("destroy: FB ID: %d (%p)", fb->base.id, fb); drm_framebuffer_cleanup(fb); if (omap_gem_put_paddr(omap_fb->bo)) { dev_err(dev->dev, "could not unmap!\n"); } if (omap_fb->bo) { drm_gem_object_unreference_unlocked(omap_fb->bo); } kfree(omap_fb); }
static void txn_cleanup(struct omap_dce_txn *txn) { int i; mutex_lock(&lock); kfree(txn->rsp); txn->rsp = NULL; /* unpin/unref buffers associated with this transaction */ for (i = 0; i < txn->bo_count; i++) { struct drm_gem_object *obj = txn->objs[i]; DBG("obj=%p", obj); omap_gem_put_paddr(obj); drm_gem_object_unreference_unlocked(obj); } txn->bo_count = 0; mutex_unlock(&lock); }