• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/staging/tidspbridge/core/
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 */
68struct 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 */
82struct 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 */
109struct 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 */
129struct 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 */
137struct msg_frame {
138	struct list_head list_elem;
139	struct msg_dspmsg msg_data;
140};
141
142#endif /* _MSG_SM_ */
143