summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Decina <alessandro.decina@collabora.co.uk>2012-05-16 10:47:38 +0800
committerAndy Green <andy.green@linaro.org>2012-06-20 12:09:41 +0800
commitf51b40ed900d673e8ffbb2c44499064a3038e473 (patch)
tree07988b18b5dbd731cb0f3657a129f94467a575b3
parent111739aaac03ae33c1dbf91291a42ac500b8a950 (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.c28
-rw-r--r--drivers/staging/omapdce/omap_dce.h1
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__ */