| /* |
| * _msg_sm.h |
| * |
| * DSP-BIOS Bridge driver support functions for TI OMAP processors. |
| * |
| * Private header file defining msg_ctrl manager objects and defines needed |
| * by IO manager. |
| * |
| * Copyright (C) 2005-2006 Texas Instruments, Inc. |
| * |
| * This package 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. |
| * |
| * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
| * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| */ |
| |
| #ifndef _MSG_SM_ |
| #define _MSG_SM_ |
| |
| #include <linux/list.h> |
| #include <dspbridge/msgdefs.h> |
| |
| /* |
| * These target side symbols define the beginning and ending addresses |
| * of the section of shared memory used for messages. They are |
| * defined in the *cfg.cmd file by cdb code. |
| */ |
| #define MSG_SHARED_BUFFER_BASE_SYM "_MSG_BEG" |
| #define MSG_SHARED_BUFFER_LIMIT_SYM "_MSG_END" |
| |
| #ifndef _CHNL_WORDSIZE |
| #define _CHNL_WORDSIZE 4 /* default _CHNL_WORDSIZE is 2 bytes/word */ |
| #endif |
| |
| /* |
| * ======== msg_ctrl ======== |
| * There is a control structure for messages to the DSP, and a control |
| * structure for messages from the DSP. The shared memory region for |
| * transferring messages is partitioned as follows: |
| * |
| * ---------------------------------------------------------- |
| * |Control | Messages from DSP | Control | Messages to DSP | |
| * ---------------------------------------------------------- |
| * |
| * msg_ctrl control structure for messages to the DSP is used in the following |
| * way: |
| * |
| * buf_empty - This flag is set to FALSE by the GPP after it has output |
| * messages for the DSP. The DSP host driver sets it to |
| * TRUE after it has copied the messages. |
| * post_swi - Set to 1 by the GPP after it has written the messages, |
| * set the size, and set buf_empty to FALSE. |
| * The DSP Host driver uses SWI_andn of the post_swi field |
| * when a host interrupt occurs. The host driver clears |
| * this after posting the SWI. |
| * size - Number of messages to be read by the DSP. |
| * |
| * For messages from the DSP: |
| * buf_empty - This flag is set to FALSE by the DSP after it has output |
| * messages for the GPP. The DPC on the GPP sets it to |
| * TRUE after it has copied the messages. |
| * post_swi - Set to 1 the DPC on the GPP after copying the messages. |
| * size - Number of messages to be read by the GPP. |
| */ |
| struct msg_ctrl { |
| u32 buf_empty; /* to/from DSP buffer is empty */ |
| u32 post_swi; /* Set to "1" to post msg_ctrl SWI */ |
| u32 size; /* Number of messages to/from the DSP */ |
| u32 resvd; |
| }; |
| |
| /* |
| * ======== msg_mgr ======== |
| * The msg_mgr maintains a list of all MSG_QUEUEs. Each NODE object can |
| * have msg_queue to hold all messages that come up from the corresponding |
| * node on the DSP. The msg_mgr also has a shared queue of messages |
| * ready to go to the DSP. |
| */ |
| struct msg_mgr { |
| /* The first field must match that in msgobj.h */ |
| |
| /* Function interface to Bridge driver */ |
| struct bridge_drv_interface *intf_fxns; |
| |
| struct io_mgr *iomgr; /* IO manager */ |
| struct list_head queue_list; /* List of MSG_QUEUEs */ |
| spinlock_t msg_mgr_lock; /* For critical sections */ |
| /* Signalled when MsgFrame is available */ |
| struct sync_object *sync_event; |
| struct list_head msg_free_list; /* Free MsgFrames ready to be filled */ |
| struct list_head msg_used_list; /* MsgFrames ready to go to DSP */ |
| u32 msgs_pending; /* # of queued messages to go to DSP */ |
| u32 max_msgs; /* Max # of msgs that fit in buffer */ |
| msg_onexit on_exit; /* called when RMS_EXIT is received */ |
| }; |
| |
| /* |
| * ======== msg_queue ======== |
| * Each NODE has a msg_queue for receiving messages from the |
| * corresponding node on the DSP. The msg_queue object maintains a list |
| * of messages that have been sent to the host, but not yet read (MSG_Get), |
| * and a list of free frames that can be filled when new messages arrive |
| * from the DSP. |
| * The msg_queue's hSynEvent gets posted when a message is ready. |
| */ |
| struct msg_queue { |
| struct list_head list_elem; |
| struct msg_mgr *msg_mgr; |
| u32 max_msgs; /* Node message depth */ |
| u32 msgq_id; /* Node environment pointer */ |
| struct list_head msg_free_list; /* Free MsgFrames ready to be filled */ |
| /* Filled MsgFramess waiting to be read */ |
| struct list_head msg_used_list; |
| void *arg; /* Handle passed to mgr on_exit callback */ |
| struct sync_object *sync_event; /* Signalled when message is ready */ |
| struct sync_object *sync_done; /* For synchronizing cleanup */ |
| struct sync_object *sync_done_ack; /* For synchronizing cleanup */ |
| struct ntfy_object *ntfy_obj; /* For notification of message ready */ |
| bool done; /* TRUE <==> deleting the object */ |
| u32 io_msg_pend; /* Number of pending MSG_get/put calls */ |
| }; |
| |
| /* |
| * ======== msg_dspmsg ======== |
| */ |
| struct msg_dspmsg { |
| struct dsp_msg msg; |
| u32 msgq_id; /* Identifies the node the message goes to */ |
| }; |
| |
| /* |
| * ======== msg_frame ======== |
| */ |
| struct msg_frame { |
| struct list_head list_elem; |
| struct msg_dspmsg msg_data; |
| }; |
| |
| #endif /* _MSG_SM_ */ |