[Letux-kernel] [small team RFC v3 03/10] XXX omapdrm: factor out _omap_gem_(un)pin
H. Nikolaus Schaller
hns at goldelico.com
Mon Feb 5 17:20:58 CET 2018
From: Matthijs van Duin <matthijsvanduin at gmail.com>
---
drivers/gpu/drm/omapdrm/omap_gem.c | 164 ++++++++++++++++++++-----------------
1 file changed, 89 insertions(+), 75 deletions(-)
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c
index 374f259f367d..fa118d3089a3 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem.c
@@ -791,6 +791,66 @@ void omap_gem_dma_sync_buffer(struct drm_gem_object *obj,
}
}
+static int _omap_gem_pin(struct drm_gem_object *obj)
+{
+ struct omap_drm_private *priv = obj->dev->dev_private;
+ struct omap_gem_object *omap_obj = to_omap_bo(obj);
+ struct page **pages;
+ uint32_t npages = obj->size >> PAGE_SHIFT;
+ enum tiler_fmt fmt = gem2fmt(omap_obj->flags);
+ struct tiler_block *block;
+ int ret;
+
+ if (is_contiguous(omap_obj))
+ return 0;
+ if (!priv->has_dmm)
+ return -EINVAL;
+
+ if (omap_obj->dma_addr_cnt) {
+ omap_obj->dma_addr_cnt++;
+ return 0;
+ }
+
+ BUG_ON(omap_obj->block);
+
+ ret = get_pages(obj, &pages);
+ if (ret)
+ return ret;
+
+ if (omap_obj->flags & OMAP_BO_TILED) {
+ block = tiler_reserve_2d(fmt,
+ omap_obj->width,
+ omap_obj->height, 0);
+ } else {
+ block = tiler_reserve_1d(obj->size);
+ }
+
+ if (IS_ERR(block)) {
+ ret = PTR_ERR(block);
+ dev_err(obj->dev->dev,
+ "could not remap: %d (%d)\n", ret, fmt);
+ return ret;
+ }
+
+ /* TODO: enable async refill.. */
+ ret = tiler_pin(block, pages, npages,
+ omap_obj->roll, true);
+ if (ret) {
+ tiler_release(block);
+ dev_err(obj->dev->dev,
+ "could not pin: %d\n", ret);
+ return ret;
+ }
+
+ omap_obj->dma_addr_cnt = 1;
+ omap_obj->dma_addr = tiler_ssptr(block);
+ omap_obj->block = block;
+
+ DBG("got dma address: %pad", &omap_obj->dma_addr);
+
+ return 0;
+}
+
/**
* omap_gem_pin() - Pin a GEM object in memory
* @obj: the GEM object
@@ -807,70 +867,44 @@ void omap_gem_dma_sync_buffer(struct drm_gem_object *obj,
*/
int omap_gem_pin(struct drm_gem_object *obj, dma_addr_t *dma_addr)
{
- struct omap_drm_private *priv = obj->dev->dev_private;
- struct omap_gem_object *omap_obj = to_omap_bo(obj);
- int ret = 0;
+ int ret;
mutex_lock(&obj->dev->struct_mutex);
- if (!is_contiguous(omap_obj) && priv->has_dmm) {
- if (omap_obj->dma_addr_cnt == 0) {
- struct page **pages;
- uint32_t npages = obj->size >> PAGE_SHIFT;
- enum tiler_fmt fmt = gem2fmt(omap_obj->flags);
- struct tiler_block *block;
-
- BUG_ON(omap_obj->block);
-
- ret = get_pages(obj, &pages);
- if (ret)
- goto fail;
+ ret = _omap_gem_pin(obj);
- if (omap_obj->flags & OMAP_BO_TILED) {
- block = tiler_reserve_2d(fmt,
- omap_obj->width,
- omap_obj->height, 0);
- } else {
- block = tiler_reserve_1d(obj->size);
- }
+ if (ret == 0)
+ *dma_addr = to_omap_bo(obj)->dma_addr;
- if (IS_ERR(block)) {
- ret = PTR_ERR(block);
- dev_err(obj->dev->dev,
- "could not remap: %d (%d)\n", ret, fmt);
- goto fail;
- }
-
- /* TODO: enable async refill.. */
- ret = tiler_pin(block, pages, npages,
- omap_obj->roll, true);
- if (ret) {
- tiler_release(block);
- dev_err(obj->dev->dev,
- "could not pin: %d\n", ret);
- goto fail;
- }
+ mutex_unlock(&obj->dev->struct_mutex);
- omap_obj->dma_addr = tiler_ssptr(block);
- omap_obj->block = block;
+ return ret;
+}
- DBG("got dma address: %pad", &omap_obj->dma_addr);
- }
+static void _omap_gem_unpin(struct drm_gem_object *obj)
+{
+ struct omap_gem_object *omap_obj = to_omap_bo(obj);
+ int ret;
- omap_obj->dma_addr_cnt++;
+ if (is_contiguous(omap_obj))
+ return;
+ if (omap_obj->dma_addr_cnt--)
+ return;
+ if (WARN_ON(!omap_obj->block))
+ return;
- *dma_addr = omap_obj->dma_addr;
- } else if (is_contiguous(omap_obj)) {
- *dma_addr = omap_obj->dma_addr;
- } else {
- ret = -EINVAL;
- goto fail;
+ ret = tiler_unpin(omap_obj->block);
+ if (ret) {
+ dev_err(obj->dev->dev,
+ "could not unpin pages: %d\n", ret);
}
-
-fail:
- mutex_unlock(&obj->dev->struct_mutex);
-
- return ret;
+ ret = tiler_release(omap_obj->block);
+ if (ret) {
+ dev_err(obj->dev->dev,
+ "could not release unmap: %d\n", ret);
+ }
+ omap_obj->dma_addr = 0;
+ omap_obj->block = NULL;
}
/**
@@ -883,28 +917,8 @@ int omap_gem_pin(struct drm_gem_object *obj, dma_addr_t *dma_addr)
*/
void omap_gem_unpin(struct drm_gem_object *obj)
{
- struct omap_gem_object *omap_obj = to_omap_bo(obj);
- int ret;
-
mutex_lock(&obj->dev->struct_mutex);
- if (omap_obj->dma_addr_cnt > 0) {
- omap_obj->dma_addr_cnt--;
- if (omap_obj->dma_addr_cnt == 0) {
- ret = tiler_unpin(omap_obj->block);
- if (ret) {
- dev_err(obj->dev->dev,
- "could not unpin pages: %d\n", ret);
- }
- ret = tiler_release(omap_obj->block);
- if (ret) {
- dev_err(obj->dev->dev,
- "could not release unmap: %d\n", ret);
- }
- omap_obj->dma_addr = 0;
- omap_obj->block = NULL;
- }
- }
-
+ _omap_gem_unpin(obj);
mutex_unlock(&obj->dev->struct_mutex);
}
--
2.12.2
More information about the Letux-kernel
mailing list