diff options
author | Alessandro Decina <alessandro.decina@collabora.co.uk> | 2012-05-16 10:47:38 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2012-06-20 12:09:41 +0800 |
commit | f51b40ed900d673e8ffbb2c44499064a3038e473 (patch) | |
tree | 07988b18b5dbd731cb0f3657a129f94467a575b3 | |
parent | 111739aaac03ae33c1dbf91291a42ac500b8a950 (diff) |
omapdce: add support for decoding into a single buffer object
XDM_MEMTYPE_BO_OFFSET can be used in VIDDEC3_process outBufs to
signal that a buffer descriptor denotes an offset to the bo
passed in the first descriptor. Useful for example to decode NV12
into a single bo.
-rw-r--r-- | drivers/staging/omapdce/dce.c | 28 | ||||
-rw-r--r-- | drivers/staging/omapdce/omap_dce.h | 1 |
2 files changed, 24 insertions, 5 deletions
diff --git a/drivers/staging/omapdce/dce.c b/drivers/staging/omapdce/dce.c index 734ab48b46b..79ec3b3b04b 100644 --- a/drivers/staging/omapdce/dce.c +++ b/drivers/staging/omapdce/dce.c @@ -671,19 +671,33 @@ static inline int cfu(void **top, uint64_t from, int n, void *end) static inline struct drm_gem_object * handle_single_buf_desc( struct dce_file_priv *priv, struct dce_rpc_hdr *req, - struct xdm2_single_buf_desc *desc) + uint32_t base_bo, struct xdm2_single_buf_desc *desc) { struct drm_gem_object *obj; uint32_t flags; + int32_t offset; /* maybe support remapping user ptrs later on.. */ - if (desc->mem_type != XDM_MEMTYPE_BO) + if (desc->mem_type != XDM_MEMTYPE_BO && + desc->mem_type != XDM_MEMTYPE_BO_OFFSET) return ERR_PTR(-EINVAL); + if (desc->mem_type == XDM_MEMTYPE_BO_OFFSET) { + /* desc->buf is an offset to base_bo, which is descs[0].buf as + * passed to _process */ + offset = desc->buf; + desc->buf = base_bo; + } else { + offset = -1; + } + obj = get_paddr(priv, req, &desc->buf, desc->buf); if (IS_ERR(obj)) return obj; + if (offset != -1) + desc->buf += offset; + flags = omap_gem_flags(obj); switch(flags & OMAP_BO_TILED) { case OMAP_BO_TILED_8: @@ -707,8 +721,6 @@ static inline struct drm_gem_object * handle_single_buf_desc( omap_gem_tiled_size(obj, &w, &h); desc->buf_size.tiled.width = w; desc->buf_size.tiled.height = h; - } else { - desc->buf_size.bytes = obj->size; } // XXX not sure if the codecs care about usage_mode.. but we @@ -723,6 +735,7 @@ static inline int handle_buf_desc(struct dce_file_priv *priv, struct drm_gem_object **o1, struct drm_gem_object **o2, uint8_t *len) { struct xdm2_buf_desc *bufs = *ptr; + uint32_t base_bo; int i, ret; /* read num_bufs field: */ @@ -737,13 +750,18 @@ static inline int handle_buf_desc(struct dce_file_priv *priv, *len = (4 + bufs->num_bufs * sizeof(bufs->descs[0])) / 4; + /* the bo used as a base for XDM_MEMTYPE_BO_OFFSET descriptors */ + base_bo = bufs->descs[0].buf; + /* handle buffer mapping.. */ for (i = 0; i < bufs->num_bufs; i++) { struct drm_gem_object *obj = - handle_single_buf_desc(priv, req, &bufs->descs[i]); + handle_single_buf_desc(priv, req, base_bo, + &bufs->descs[i]); if (IS_ERR(obj)) { return PTR_ERR(obj); } + if (i == 0) *o1 = obj; if (o2 && (i == 1)) diff --git a/drivers/staging/omapdce/omap_dce.h b/drivers/staging/omapdce/omap_dce.h index 317ff9d28e7..5853793762c 100644 --- a/drivers/staging/omapdce/omap_dce.h +++ b/drivers/staging/omapdce/omap_dce.h @@ -106,5 +106,6 @@ struct drm_omap_dce_codec_delete { #define DRM_OMAP_DCE_CODEC_DELETE 0x05 #define XDM_MEMTYPE_BO 10 +#define XDM_MEMTYPE_BO_OFFSET 11 #endif /* __OMAP_DCE_H__ */ |