From b652e718d8ea7ac8fc77783137e06f2eb9a51288 Mon Sep 17 00:00:00 2001 From: Hamad Kadmany Date: Tue, 25 Dec 2012 15:51:00 +0200 Subject: [PATCH] dvb: mpq: Add sharing of video buffer with dvb-video When video data is tunneled internally between demux and dvb-video, the ION buffer holding the video data needs to be shared with dvb-video driver. Change-Id: Ia6517bd9cbf284e1314d5275eccc6813dc8d3096 Signed-off-by: Hamad Kadmany --- .../dvb/mpq/demux/mpq_dmx_plugin_common.c | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/media/dvb/mpq/demux/mpq_dmx_plugin_common.c b/drivers/media/dvb/mpq/demux/mpq_dmx_plugin_common.c index 9025ae60aa0..4b674772bed 100644 --- a/drivers/media/dvb/mpq/demux/mpq_dmx_plugin_common.c +++ b/drivers/media/dvb/mpq/demux/mpq_dmx_plugin_common.c @@ -1072,11 +1072,21 @@ static int mpq_dmx_init_internal_buffers( feed_data->buffer_desc.desc[0].size = actual_buffer_size; feed_data->buffer_desc.desc[0].read_ptr = 0; feed_data->buffer_desc.desc[0].write_ptr = 0; - /* TODO: share handle using ion_share_dma_buf */ - feed_data->buffer_desc.desc[0].handle = -1; + feed_data->buffer_desc.desc[0].handle = + ion_share_dma_buf(client, temp_handle); + if (IS_ERR_VALUE(feed_data->buffer_desc.desc[0].handle)) { + MPQ_DVB_ERR_PRINT( + "%s: FAILED to share payload buffer %d\n", + __func__, ret); + ret = -ENOMEM; + goto init_failed_unmap_payload_buffer; + } return 0; +init_failed_unmap_payload_buffer: + ion_unmap_kernel(client, temp_handle); + feed_data->buffer_desc.desc[0].base = NULL; init_failed_free_payload_buffer: ion_free(client, temp_handle); feed_data->buffer_desc.ion_handle[0] = NULL; @@ -1254,6 +1264,7 @@ static void mpq_dmx_release_streambuffer( { int buf_num = 0; int i; + struct dmx_decoder_buffers *dec_buffs = feed->feed.ts.decoder_buffers; mpq_adapter_unregister_stream_if(feed_data->stream_interface); @@ -1268,7 +1279,23 @@ static void mpq_dmx_release_streambuffer( feed_data->buffer_desc.ion_handle[i]); feed_data->buffer_desc.desc[i].base = NULL; } - /* TODO: un-share kernel buffer handle */ + + /* + * Un-share the buffer if kernel it the one that + * shared it. + */ + if (0 == dec_buffs->buffers_num) { + struct file *shared_file = fget( + feed_data->buffer_desc.desc[i].handle); + + if (shared_file) + fput(shared_file); + else + MPQ_DVB_ERR_PRINT( + "%s: failed to get shared-file handle\n", + __func__); + } + ion_free(client, feed_data->buffer_desc.ion_handle[i]); feed_data->buffer_desc.ion_handle[i] = NULL; feed_data->buffer_desc.desc[i].size = 0;