aboutsummaryrefslogtreecommitdiff
path: root/drivers/video/arm/v5xx/base/mve_com.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/arm/v5xx/base/mve_com.c')
-rw-r--r--drivers/video/arm/v5xx/base/mve_com.c230
1 files changed, 230 insertions, 0 deletions
diff --git a/drivers/video/arm/v5xx/base/mve_com.c b/drivers/video/arm/v5xx/base/mve_com.c
new file mode 100644
index 000000000000..4d1a93641d06
--- /dev/null
+++ b/drivers/video/arm/v5xx/base/mve_com.c
@@ -0,0 +1,230 @@
+/*
+ * (C) COPYRIGHT ARM Limited. All rights reserved.
+ *
+ * This program is free software and is provided to you under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation, and any use by you of this program is subject to the terms
+ * of such GNU licence.
+ *
+ * A copy of the licence is included with the program, and can also be obtained
+ * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "mve_com.h"
+#include "mve_session.h"
+#include "mve_rsrc_log.h"
+
+#include <host_interface_v1/mve_protocol_kernel.h>
+
+#include "mve_com_host_interface_v1.h"
+#include "mve_com_host_interface_v2.h"
+
+mve_base_error mve_com_add_message(struct mve_session *session,
+ uint16_t code,
+ uint16_t size,
+ uint32_t *data)
+{
+ mve_base_error ret = MVE_BASE_ERROR_NONE;
+
+ if (session->com == NULL || session->com->host_interface.add_message == NULL)
+ {
+ return MVE_BASE_ERROR_VERSION_MISMATCH;
+ }
+
+ ret = session->com->host_interface.add_message(session, code, size, data);
+
+ if (MVE_BASE_ERROR_NONE != ret)
+ {
+ MVE_LOG_PRINT(&mve_rsrc_log_fwif, MVE_LOG_ERROR, "%p mve_com_add_message() returned error status. ret=%u, code=%u, size=%u.", session, ret, code, size);
+ }
+
+ if (MVE_MESSAGE_CODE_SWITCH != code)
+ {
+ session->state.idle_state = IDLE_STATE_ACTIVE;
+ }
+
+ return ret;
+}
+
+uint32_t *mve_com_get_message(struct mve_session *session,
+ struct mve_msg_header *header)
+{
+ uint32_t *ret = NULL;
+
+ if (session->com == NULL || session->com->host_interface.get_message == NULL)
+ {
+ return NULL;
+ }
+
+ ret = session->com->host_interface.get_message(session, header);
+
+ return ret;
+}
+
+mve_base_error mve_com_add_input_buffer(struct mve_session *session,
+ mve_com_buffer *buffer,
+ enum mve_com_buffer_type type)
+{
+ mve_base_error res;
+
+ if (session->com == NULL || session->com->host_interface.add_input_buffer == NULL)
+ {
+ return MVE_BASE_ERROR_VERSION_MISMATCH;
+ }
+
+ res = session->com->host_interface.add_input_buffer(session, buffer, type);
+
+ if (MVE_BASE_ERROR_NONE == res)
+ {
+ if (type != MVE_COM_BUFFER_TYPE_ROI)
+ {
+ session->input_buffer_count++;
+ }
+ }
+ else
+ {
+ MVE_LOG_PRINT(&mve_rsrc_log_fwif, MVE_LOG_ERROR, "%p mve_com_add_input_buffer() returned error status. ret=%u.", session, res);
+ }
+
+ return res;
+}
+
+mve_base_error mve_com_add_output_buffer(struct mve_session *session,
+ mve_com_buffer *buffer,
+ enum mve_com_buffer_type type)
+{
+ mve_base_error res;
+
+ if (session->com == NULL || session->com->host_interface.add_output_buffer == NULL)
+ {
+ return MVE_BASE_ERROR_VERSION_MISMATCH;
+ }
+
+ res = session->com->host_interface.add_output_buffer(session, buffer, type);
+
+ if (MVE_BASE_ERROR_NONE == res)
+ {
+ if (type != MVE_COM_BUFFER_TYPE_ROI)
+ {
+ session->output_buffer_count++;
+ }
+ }
+ else
+ {
+ MVE_LOG_PRINT(&mve_rsrc_log_fwif, MVE_LOG_ERROR, "%p mve_com_add_output_buffer() returned error status. ret=%u.", session, res);
+ }
+
+ return res;
+}
+
+mve_base_error mve_com_get_input_buffer(struct mve_session *session,
+ mve_com_buffer *buffer)
+{
+ mve_base_error ret;
+
+ if (session->com == NULL || session->com->host_interface.get_input_buffer == NULL)
+ {
+ return MVE_BASE_ERROR_VERSION_MISMATCH;
+ }
+
+ ret = session->com->host_interface.get_input_buffer(session, buffer);
+
+ if (MVE_BASE_ERROR_NONE == ret)
+ {
+ session->input_buffer_count--;
+ }
+ else
+ {
+ MVE_LOG_PRINT(&mve_rsrc_log_fwif, MVE_LOG_ERROR, "%p mve_com_get_input_buffer() returned error status. ret=%u.", session, ret);
+ }
+
+ return ret;
+}
+
+mve_base_error mve_com_get_output_buffer(struct mve_session *session,
+ mve_com_buffer *buffer)
+{
+ mve_base_error ret;
+
+ if (session->com == NULL || session->com->host_interface.get_output_buffer == NULL)
+ {
+ return MVE_BASE_ERROR_VERSION_MISMATCH;
+ }
+
+ ret = session->com->host_interface.get_output_buffer(session, buffer);
+
+ if (MVE_BASE_ERROR_NONE == ret)
+ {
+ session->output_buffer_count--;
+ }
+ else
+ {
+ MVE_LOG_PRINT(&mve_rsrc_log_fwif, MVE_LOG_ERROR, "%p mve_com_get_output_buffer() returned error status. ret=%u.", session, ret);
+ }
+
+ return ret;
+}
+
+mve_base_error mve_com_get_rpc_message(struct mve_session *session,
+ mve_com_rpc *rpc)
+{
+ if (NULL == session->com || NULL == session->com->host_interface.get_rpc_message)
+ {
+ return MVE_BASE_ERROR_VERSION_MISMATCH;
+ }
+
+ return session->com->host_interface.get_rpc_message(session, rpc);
+}
+
+mve_base_error mve_com_put_rpc_message(struct mve_session *session,
+ mve_com_rpc *rpc)
+{
+ if (NULL == session->com || NULL == session->com->host_interface.put_rpc_message)
+ {
+ return MVE_BASE_ERROR_VERSION_MISMATCH;
+ }
+
+ return session->com->host_interface.put_rpc_message(session, rpc);
+}
+
+void mve_com_delete(struct mve_session *session)
+{
+ MVE_RSRC_MEM_FREE(session->com);
+ session->com = NULL;
+}
+
+mve_base_error mve_com_set_interface_version(struct mve_session *session,
+ enum mve_fw_protocol_version version)
+{
+ mve_com_delete(session);
+
+ switch (version)
+ {
+ case MVE_FW_PROTOCOL_VERSION_1_0:
+ {
+ session->com = mve_com_host_interface_v1_new();
+ break;
+ }
+
+ case MVE_FW_PROTOCOL_VERSION_2_0:
+ {
+ session->com = mve_com_host_interface_v2_new();
+ break;
+ }
+
+ default:
+ {
+ MVE_LOG_PRINT(&mve_rsrc_log_fwif, MVE_LOG_ERROR, "%p unsupported interface version configured. version=%u.", session, version);
+ return MVE_BASE_ERROR_BAD_PARAMETER;
+ }
+ }
+
+ if (session->com == NULL)
+ {
+ return MVE_BASE_ERROR_INSUFFICIENT_RESOURCES;
+ }
+
+ return MVE_BASE_ERROR_NONE;
+}