summaryrefslogtreecommitdiff
path: root/drivers/staging/tidspbridge/core/_msg_sm.h
blob: f6e58e3f3b48e3d181e9b85a761674fdd931ea99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * _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_ */