blob: 61758d7f7b4fc8a73541f66015d8c95ad9350361 [file] [log] [blame]
/*
* Samsung Exynos SoC series VPU driver
*
* Copyright (c) 2015 Samsung Electronics Co., Ltd
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef VPU_MAILBOX_H_
#define VPU_MAILBOX_H_
#include "lib/vpu-fwif-hw-proj210.h"
#define VPU_MAILBOX_SIGNATURE1 0xCAFE
#define VPU_MAILBOX_SIGNATURE2 0xEFAC
#define VPU_MAILBOX_BASEOFFSET 16
struct vpu_mailbox_hdr {
/* Set to VPUM_SIGNATURE_1_VALUE after entire CORE init is done */
u16 signature1;
/* Set to VPUM_SIGNATURE_2_VALUE after entire CORE init is done */
u16 signature2;
/* The negative offset from this structure base
* (VPUM_INTERFACE_BASE_ADR) to VPUM_HostAllMboxContStr structure
* in 16B units
*/
u16 stack_ofs16;
/* 2100 for VPU_2_10_0. Other values for future HW implementations. */
u16 hw_version;
/* VPUI_CMND_FW_VERSION_ID */
u16 fw_version;
/* VPUM_MBOX_IF_VERSION_ID */
u16 mbox_version;
/* VPUI_CMND_IF_VERSION_ID */
u16 cmd_version;
/* The entire heap size in 16 bits units */
u16 heap_size16;
/* Total MBOXes sizes in 16 bits units (MBOXes are allocated as part of
* the heap, extra place in heap used for internal data)
*/
u16 mbox_totsize16;
u8 reserved[14];
};
struct vpu_info_chain {
/* VPUI_INVALID_TASK_INVOKE_ID when HW Chain isn't allocated */
u8 task_id;
/* The process index in the task the HW chain is allocated to */
u8 vertex_index;
};
struct vpu_info {
/* Which HW Chains are currently active. HW chain might be allocated
* allocated bit not currently active when a CPU chain is active and
* when control operations are invoked
*/
u16 active_chain_mask;
struct vpu_info_chain chains[VPUH_HW_CHAINS];
};
#define VPU_CMD_SIGNATURE 0x1234
#define VPU_DUM_SIGNATURE 0x5678
struct vpu_mailbox_h2f_hdr {
/* either VPUM_REAL_CMND_SIGNATURE or VPUM_DUMMY_CMND_SIGNATURE */
u16 signature;
/* Used by commands response reports. Might be used to verify there are
* no lost commands (lost commands will be reported as system error -
* not command error). Different CommandInd for each HOST MBOX.
*/
u16 cid;
/* Include the header. */
u16 size16;
};
struct vpu_mailbox_h2f {
/* The offset from the MBOX controller base to the MBOX data
* (up to 128K offset). Assumed to be positive.
*/
u16 data_ofs16;
/* The size in 16 bits units of the entire MBOX. MBOX may include only
* DataSize16b-1 words (since NextWrMsgInd == NextRdMsgInd stands for
* empty MBOX)
*/
u16 data_size16;
/* Incremented up to DataSize16b by the writer (HOST) after the entire
* message is written. If new NextWrPtr16bOfs == DataSize16b it is
* set to 0. Message must not be folded - if message size > DataSize16b
* NextWrPtr16bOfs dummy message should set NextWrPtr16bOfs to 0
*/
u16 wptr_ofs16;
/* Incremented by the reader(CORE) after the entire message is read
* (if new NextRdtr16bOfs == DataSize16b it is set to 0)
* Notice - NextWrPtr16bOfs == NextRdPtr16bOfs stands for empty MBOX
*/
u16 rptr_ofs16;
/* Initialized to TRUE and updated (by the CORE) on VPUI_CMND_INIT
* according to HOST request. Refers to core messages written to
* appropriate MBOX for commands - if set message is sent only on
* errors, if reset - message is sent on each command.
*/
u16 response_on_error_only;
};
struct vpu_mailbox_f2h {
/* The offset from the MBOX controller base to the MBOX data
* (up to 128K offset). Assumed to be positive.
*/
u16 data_ofs16;
/* The size in 16 bits units of each message */
u16 msg_size16;
/* The data size of the MBOX. MBOX may include only MsgNum - 1 messages
* (since NextWrMsgInd == NextRdMsgInd stands for empty MBOX)
*/
u16 emsg_idx;
/* Incremented modulo emsg_idx by the writer (CORE) after the entire
* message is written.
*/
u16 wmsg_idx;
/* Incremented modulo MsgNum by the reader (HOST) when message might be
* overwritten. In messages units.
* Notice - NextWrMsgInd == NextRdMsgInd stands for empty MBOX
*/
u16 rmsg_idx;
/* Set by the Writer (CORE) when new message should be written and
* NextWrMsgInd + 1 % emsg_idx == NextRdMsgInd Released by the Reader
* (HOST) - after NextRdMsgInd is updated.
*/
u16 full;
/* VPUM_MboxIntr. Initialized to VPUM_INTR_NONE and updated
* (by the CORE) on VPUI_CMND_INIT according to HOST request
*/
u16 intr_type;
};
/******************* Core report description *********************************/
/* Each message in CoreReport MBOX has the below structure
* (MsgSize16b == sizeof(struct VPUM_CoreReport) / 2)
*/
#define VPUM_REP_VER_END_IND 0
#define VPUM_REP_ABORT_IND 0xffff
struct vpu_mailbox_f2h_report {
/* The task Id that one of its vertices reports */
u16 task_id;
/* The vertex that reports - either the VPUI_TVER_END vertex or one of
* VPUI_TVER_HOST_REP vertices
*/
u16 vertex_idx;
/* Unique (per task) invocation Id. Copied from Invoke command */
u16 cid_lsb;
u16 cid_msb;
/* Place holder. Actual number is set by ReportDataSize
* on VPUM_MboxInitCmndInfo
*/
/* The actual data size on the message. Expected values are 0 .. ReportDataSize */
u16 data_size;
u16 data[1];
};
/**************** Core Create sizes description******************************/
/* Each message in CoreCreateSizes MBOX has the below structure
* (MsgSize16b == sizeof(struct VPUM_CoreCrSizes) / 2)
*/
struct vpu_mailbox_f2h_size {
/* The task Id that is created */
u16 task_id;
/* The size in 16b units of the basic task information */
u16 base_size16;
/* The size in 16b units of each slot of the task */
u16 each_slot_size16;
};
/*************** Core system error description *******************************/
/* Each message in SystemErr MBOX has the below structure
* (MsgSize16b == sizeof(struct VPUM_SysErr) / 2)
*/
struct vpu_mailbox_syserr {
u16 err_type; /* enum VPUM_SysErrType value */
u16 info1; /* extra data for explicit error description */
u16 info2; /* extra data for explicit error description */
};
/*************** Core command error description ******************************/
/* Each message in CoreCmndErr MBOX has the below structure
* (MsgSize16b == sizeof(struct VPUM_CoreCmndErr) / 2)
*/
struct vpu_mailbox_reply {
/* copied from Command message */
u16 cid;
/* The offset in the appropriate command queue */
u16 cmd_ptr_ofs16;
/* VPUM_MboxErr value */
u16 err_type;
};
/**************** Core debug info description ********************************/
/* Each message in Debug information MBOX has the below structure
* (MsgSize16b == sizeof(struct VPUM_DebugInfo) / 2)
*/
struct vpu_mailbox_debug {
__u16 Info[4]; /* enum VPUM_SysErrType value */
};
enum vpu_mailbox_h2f_type {
/* All commands except those defined as "Low priority" */
VPU_MTYPE_H2F_NORMAL,
/* "Low priority" commands are Create & Allocate - long process time,
* low priority and long messages
*/
VPU_MTYPE_H2F_LOW,
VPU_MTYPE_H2F_CNT
};
enum vpu_mailbox_f2h_type {
/* Send the reports to HOST from each invoked task */
VPU_MTYPE_F2H_REPORT,
/* Send the task base size and each slot size for each created task */
VPU_MTYPE_F2H_SIZE,
/* General system errors to HOST */
VPU_MTYPE_F2H_SYS_ERROR,
/* report errors in HOST MBOX normal commands */
VPU_MTYPE_F2H_NORMAL_RESPONSE,
/* report errors in HOST MBOX low priority commands */
VPU_MTYPE_F2H_LOW_RESPONSE,
VPU_MTYPE_F2H_DEBUG,
VPU_MTYPE_F2H_CNT
};
struct vpu_mailbox_stack {
struct vpu_info info;
struct vpu_mailbox_h2f h2f[VPU_MTYPE_H2F_CNT];
struct vpu_mailbox_f2h f2h[VPU_MTYPE_F2H_CNT];
};
struct vpu_mailbox_ctrl {
struct vpu_mailbox_hdr *hdr;
struct vpu_mailbox_stack *stack;
};
struct vpu_mailbox_hdr * vpu_mbox_g_hdr(void *code, u32 code_size);
struct vpu_mailbox_stack * vpu_mbox_g_stack(struct vpu_mailbox_hdr *hdr);
int vpu_mbox_ready(struct vpu_mailbox_ctrl *mctrl, size_t size, u32 type);
int vpu_mbox_write(struct vpu_mailbox_ctrl *mctrl,
void *payload, size_t size, u32 type, u32 gid, u32 cmd, u32 cid);
int vpu_mbox_read(struct vpu_mailbox_ctrl *mctrl,
void *payload, u32 type, void *debug_data);
#endif