/* 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;
}
Exemple #2
0
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);
}
Exemple #4
0
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);
	}
}
Exemple #5
0
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;
}
Exemple #8
0
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);
}
Exemple #9
0
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);
}