/* * _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 #include /* * 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_ */