upload tizen1.0 source
[kernel/linux-2.6.36.git] / drivers / staging / tidspbridge / core / _msg_sm.h
1 /*
2  * _msg_sm.h
3  *
4  * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5  *
6  * Private header file defining msg_ctrl manager objects and defines needed
7  * by IO manager.
8  *
9  * Copyright (C) 2005-2006 Texas Instruments, Inc.
10  *
11  * This package is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  *
15  * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18  */
19
20 #ifndef _MSG_SM_
21 #define _MSG_SM_
22
23 #include <dspbridge/list.h>
24 #include <dspbridge/msgdefs.h>
25
26 /*
27  *  These target side symbols define the beginning and ending addresses
28  *  of the section of shared memory used for messages. They are
29  *  defined in the *cfg.cmd file by cdb code.
30  */
31 #define MSG_SHARED_BUFFER_BASE_SYM      "_MSG_BEG"
32 #define MSG_SHARED_BUFFER_LIMIT_SYM     "_MSG_END"
33
34 #ifndef _CHNL_WORDSIZE
35 #define _CHNL_WORDSIZE 4        /* default _CHNL_WORDSIZE is 2 bytes/word */
36 #endif
37
38 /*
39  *  ======== msg_ctrl ========
40  *  There is a control structure for messages to the DSP, and a control
41  *  structure for messages from the DSP. The shared memory region for
42  *  transferring messages is partitioned as follows:
43  *
44  *  ----------------------------------------------------------
45  *  |Control | Messages from DSP | Control | Messages to DSP |
46  *  ----------------------------------------------------------
47  *
48  *  msg_ctrl control structure for messages to the DSP is used in the following
49  *  way:
50  *
51  *  buf_empty -      This flag is set to FALSE by the GPP after it has output
52  *                  messages for the DSP. The DSP host driver sets it to
53  *                  TRUE after it has copied the messages.
54  *  post_swi -       Set to 1 by the GPP after it has written the messages,
55  *                  set the size, and set buf_empty to FALSE.
56  *                  The DSP Host driver uses SWI_andn of the post_swi field
57  *                  when a host interrupt occurs. The host driver clears
58  *                  this after posting the SWI.
59  *  size -          Number of messages to be read by the DSP.
60  *
61  *  For messages from the DSP:
62  *  buf_empty -      This flag is set to FALSE by the DSP after it has output
63  *                  messages for the GPP. The DPC on the GPP sets it to
64  *                  TRUE after it has copied the messages.
65  *  post_swi -       Set to 1 the DPC on the GPP after copying the messages.
66  *  size -          Number of messages to be read by the GPP.
67  */
68 struct msg_ctrl {
69         u32 buf_empty;          /* to/from DSP buffer is empty */
70         u32 post_swi;           /* Set to "1" to post msg_ctrl SWI */
71         u32 size;               /* Number of messages to/from the DSP */
72         u32 resvd;
73 };
74
75 /*
76  *  ======== msg_mgr ========
77  *  The msg_mgr maintains a list of all MSG_QUEUEs. Each NODE object can
78  *  have msg_queue to hold all messages that come up from the corresponding
79  *  node on the DSP. The msg_mgr also has a shared queue of messages
80  *  ready to go to the DSP.
81  */
82 struct msg_mgr {
83         /* The first field must match that in msgobj.h */
84
85         /* Function interface to Bridge driver */
86         struct bridge_drv_interface *intf_fxns;
87
88         struct io_mgr *hio_mgr; /* IO manager */
89         struct lst_list *queue_list;    /* List of MSG_QUEUEs */
90         spinlock_t msg_mgr_lock;        /* For critical sections */
91         /* Signalled when MsgFrame is available */
92         struct sync_object *sync_event;
93         struct lst_list *msg_free_list; /* Free MsgFrames ready to be filled */
94         struct lst_list *msg_used_list; /* MsgFrames ready to go to DSP */
95         u32 msgs_pending;       /* # of queued messages to go to DSP */
96         u32 max_msgs;           /* Max # of msgs that fit in buffer */
97         msg_onexit on_exit;     /* called when RMS_EXIT is received */
98 };
99
100 /*
101  *  ======== msg_queue ========
102  *  Each NODE has a msg_queue for receiving messages from the
103  *  corresponding node on the DSP. The msg_queue object maintains a list
104  *  of messages that have been sent to the host, but not yet read (MSG_Get),
105  *  and a list of free frames that can be filled when new messages arrive
106  *  from the DSP.
107  *  The msg_queue's hSynEvent gets posted when a message is ready.
108  */
109 struct msg_queue {
110         struct list_head list_elem;
111         struct msg_mgr *hmsg_mgr;
112         u32 max_msgs;           /* Node message depth */
113         u32 msgq_id;            /* Node environment pointer */
114         struct lst_list *msg_free_list; /* Free MsgFrames ready to be filled */
115         /* Filled MsgFramess waiting to be read */
116         struct lst_list *msg_used_list;
117         void *arg;              /* Handle passed to mgr on_exit callback */
118         struct sync_object *sync_event; /* Signalled when message is ready */
119         struct sync_object *sync_done;  /* For synchronizing cleanup */
120         struct sync_object *sync_done_ack;      /* For synchronizing cleanup */
121         struct ntfy_object *ntfy_obj;   /* For notification of message ready */
122         bool done;              /* TRUE <==> deleting the object */
123         u32 io_msg_pend;        /* Number of pending MSG_get/put calls */
124 };
125
126 /*
127  *  ======== msg_dspmsg ========
128  */
129 struct msg_dspmsg {
130         struct dsp_msg msg;
131         u32 msgq_id;            /* Identifies the node the message goes to */
132 };
133
134 /*
135  *  ======== msg_frame ========
136  */
137 struct msg_frame {
138         struct list_head list_elem;
139         struct msg_dspmsg msg_data;
140 };
141
142 #endif /* _MSG_SM_ */