From: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx> If the queue is configured as VB2_MEMORY_DMABUF then vb2_core_expbuf fails as it ensures the queue is defined as VB2_MEMORY_MMAP. Correct the handling so that we unmap the buffer from vcsm and the VPU on cleanup, and then correctly get the dma buf of the new buffer. Signed-off-by: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx> Signed-off-by: Jacopo Mondi <jacopo@xxxxxxxxxx> --- .../vc04_services/vchiq-mmal/mmal-vchiq.c | 21 +++++++++++++------ .../vc04_services/vchiq-mmal/mmal-vchiq.h | 2 ++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c index 4e559f88d828..9fc1a29f9f1a 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c @@ -1779,13 +1779,9 @@ int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance, } EXPORT_SYMBOL_GPL(mmal_vchi_buffer_init); -int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf) +int mmal_vchi_buffer_unmap(struct mmal_buffer *buf) { - struct mmal_msg_context *msg_context = buf->msg_context; - - if (msg_context) - release_msg_context(msg_context); - buf->msg_context = NULL; + int ret = 0; if (buf->vcsm_handle) { int ret; @@ -1797,6 +1793,19 @@ int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf) pr_err("%s: vcsm_free failed, ret %d\n", __func__, ret); buf->vcsm_handle = 0; } + return ret; +} +EXPORT_SYMBOL_GPL(mmal_vchi_buffer_unmap); + +int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf) +{ + struct mmal_msg_context *msg_context = buf->msg_context; + + if (msg_context) + release_msg_context(msg_context); + buf->msg_context = NULL; + + mmal_vchi_buffer_unmap(buf); return 0; } EXPORT_SYMBOL_GPL(mmal_vchi_buffer_cleanup); diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h index 247521fbcc1d..0a75c96f6d58 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h @@ -167,6 +167,8 @@ int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance, struct vchiq_mmal_port *port, struct mmal_buffer *buf); +int mmal_vchi_buffer_unmap(struct mmal_buffer *buf); + int mmal_vchi_buffer_init(struct vchiq_mmal_instance *instance, struct mmal_buffer *buf); int mmal_vchi_buffer_cleanup(struct mmal_buffer *buf); -- Regards, Laurent Pinchart