change console=tty0 to enable linux framebuffer console
[jz_uboot.git] / cpu / ixp / npe / IxNpeMhReceive.c
blob57c8be30e51ded9e273443c72a82eccad0670116
1 /**
2 * @file IxNpeMhReceive.c
4 * @author Intel Corporation
5 * @date 18 Jan 2002
7 * @brief This file contains the implementation of the private API for the
8 * Receive module.
11 * @par
12 * IXP400 SW Release version 2.0
14 * -- Copyright Notice --
16 * @par
17 * Copyright 2001-2005, Intel Corporation.
18 * All rights reserved.
20 * @par
21 * Redistribution and use in source and binary forms, with or without
22 * modification, are permitted provided that the following conditions
23 * are met:
24 * 1. Redistributions of source code must retain the above copyright
25 * notice, this list of conditions and the following disclaimer.
26 * 2. Redistributions in binary form must reproduce the above copyright
27 * notice, this list of conditions and the following disclaimer in the
28 * documentation and/or other materials provided with the distribution.
29 * 3. Neither the name of the Intel Corporation nor the names of its contributors
30 * may be used to endorse or promote products derived from this software
31 * without specific prior written permission.
33 * @par
34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
35 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
38 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44 * SUCH DAMAGE.
46 * @par
47 * -- End of Copyright Notice --
51 * Put the system defined include files required.
56 * Put the user defined include files required.
58 #include "IxOsal.h"
59 #include "IxNpeMhMacros_p.h"
60 #include "IxNpeMhConfig_p.h"
61 #include "IxNpeMhReceive_p.h"
62 #include "IxNpeMhSolicitedCbMgr_p.h"
63 #include "IxNpeMhUnsolicitedCbMgr_p.h"
66 * #defines and macros used in this file.
70 * Typedefs whose scope is limited to this file.
73 /**
74 * @struct IxNpeMhReceiveStats
76 * @brief This structure is used to maintain statistics for the Receive
77 * module.
80 typedef struct
82 UINT32 isrs; /**< receive ISR invocations */
83 UINT32 receives; /**< receive messages invocations */
84 UINT32 messages; /**< messages received */
85 UINT32 solicited; /**< solicited messages received */
86 UINT32 unsolicited; /**< unsolicited messages received */
87 UINT32 callbacks; /**< callbacks invoked */
88 } IxNpeMhReceiveStats;
91 * Variable declarations global to this file only. Externs are followed by
92 * static variables.
95 PRIVATE IxNpeMhReceiveStats ixNpeMhReceiveStats[IX_NPEMH_NUM_NPES];
98 * Extern function prototypes.
102 * Static function prototypes.
104 PRIVATE
105 void ixNpeMhReceiveIsr (int npeId);
107 PRIVATE
108 void ixNpeMhReceiveIsr (int npeId)
110 int lockKey;
112 IX_NPEMH_TRACE0 (IX_NPEMH_FN_ENTRY_EXIT, "Entering "
113 "ixNpeMhReceiveIsr\n");
115 lockKey = ixOsalIrqLock ();
117 /* invoke the message receive routine to get messages from the NPE */
118 ixNpeMhReceiveMessagesReceive (npeId);
120 /* update statistical info */
121 ixNpeMhReceiveStats[npeId].isrs++;
123 ixOsalIrqUnlock (lockKey);
125 IX_NPEMH_TRACE0 (IX_NPEMH_FN_ENTRY_EXIT, "Exiting "
126 "ixNpeMhReceiveIsr\n");
130 * Function definition: ixNpeMhReceiveInitialize
133 void ixNpeMhReceiveInitialize (void)
135 IxNpeMhNpeId npeId = 0;
137 IX_NPEMH_TRACE0 (IX_NPEMH_FN_ENTRY_EXIT, "Entering "
138 "ixNpeMhReceiveInitialize\n");
140 /* for each NPE ... */
141 for (npeId = 0; npeId < IX_NPEMH_NUM_NPES; npeId++)
143 /* register our internal ISR for the NPE to handle "outFIFO not */
144 /* empty" interrupts */
145 ixNpeMhConfigIsrRegister (npeId, ixNpeMhReceiveIsr);
148 IX_NPEMH_TRACE0 (IX_NPEMH_FN_ENTRY_EXIT, "Exiting "
149 "ixNpeMhReceiveInitialize\n");
153 * Function definition: ixNpeMhReceiveMessagesReceive
156 IX_STATUS ixNpeMhReceiveMessagesReceive (
157 IxNpeMhNpeId npeId)
159 IxNpeMhMessage message = { { 0, 0 } };
160 IxNpeMhMessageId messageId = 0;
161 IxNpeMhCallback callback = NULL;
162 IX_STATUS status;
164 IX_NPEMH_TRACE0 (IX_NPEMH_FN_ENTRY_EXIT, "Entering "
165 "ixNpeMhReceiveMessagesReceive\n");
167 /* update statistical info */
168 ixNpeMhReceiveStats[npeId].receives++;
170 /* while the NPE has messages in its outFIFO */
171 while (!ixNpeMhConfigOutFifoIsEmpty (npeId))
173 /* read a message from the NPE's outFIFO */
174 status = ixNpeMhConfigOutFifoRead (npeId, &message);
176 if (IX_SUCCESS != status)
178 return status;
181 /* get the ID of the message */
182 messageId = ixNpeMhConfigMessageIdGet (message);
184 IX_NPEMH_TRACE2 (IX_NPEMH_DEBUG,
185 "Received message from NPE %d with ID 0x%02X\n",
186 npeId, messageId);
188 /* update statistical info */
189 ixNpeMhReceiveStats[npeId].messages++;
191 /* try to find a matching unsolicited callback for this message. */
193 /* we assume the message is unsolicited. only if there is no */
194 /* unsolicited callback for this message type do we assume the */
195 /* message is solicited. it is much faster to check for an */
196 /* unsolicited callback, so doing this check first should result */
197 /* in better performance. */
199 ixNpeMhUnsolicitedCbMgrCallbackRetrieve (
200 npeId, messageId, &callback);
202 if (callback != NULL)
204 IX_NPEMH_TRACE0 (IX_NPEMH_DEBUG,
205 "Found matching unsolicited callback\n");
207 /* update statistical info */
208 ixNpeMhReceiveStats[npeId].unsolicited++;
211 /* if no unsolicited callback was found try to find a matching */
212 /* solicited callback for this message */
213 if (callback == NULL)
215 ixNpeMhSolicitedCbMgrCallbackRetrieve (
216 npeId, messageId, &callback);
218 if (callback != NULL)
220 IX_NPEMH_TRACE0 (IX_NPEMH_DEBUG,
221 "Found matching solicited callback\n");
223 /* update statistical info */
224 ixNpeMhReceiveStats[npeId].solicited++;
228 /* if a callback (either unsolicited or solicited) was found */
229 if (callback != NULL)
231 /* invoke the callback to pass the message back to the client */
232 callback (npeId, message);
234 /* update statistical info */
235 ixNpeMhReceiveStats[npeId].callbacks++;
237 else /* no callback (neither unsolicited nor solicited) was found */
239 IX_NPEMH_TRACE2 (IX_NPEMH_WARNING,
240 "No matching callback for NPE %d"
241 " and ID 0x%02X, discarding message\n",
242 npeId, messageId);
244 /* the message will be discarded. this is normal behaviour */
245 /* if the client passes a NULL solicited callback when */
246 /* sending a message. this indicates that the client is not */
247 /* interested in receiving the response. alternatively a */
248 /* NULL callback here may signify an unsolicited message */
249 /* with no appropriate registered callback. */
253 IX_NPEMH_TRACE0 (IX_NPEMH_FN_ENTRY_EXIT, "Exiting "
254 "ixNpeMhReceiveMessagesReceive\n");
256 return IX_SUCCESS;
260 * Function definition: ixNpeMhReceiveShow
263 void ixNpeMhReceiveShow (
264 IxNpeMhNpeId npeId)
266 /* show the ISR invocation counter */
267 IX_NPEMH_SHOW ("Receive ISR invocations",
268 ixNpeMhReceiveStats[npeId].isrs);
270 /* show the receive message invocation counter */
271 IX_NPEMH_SHOW ("Receive messages invocations",
272 ixNpeMhReceiveStats[npeId].receives);
274 /* show the message received counter */
275 IX_NPEMH_SHOW ("Messages received",
276 ixNpeMhReceiveStats[npeId].messages);
278 /* show the solicited message counter */
279 IX_NPEMH_SHOW ("Solicited messages received",
280 ixNpeMhReceiveStats[npeId].solicited);
282 /* show the unsolicited message counter */
283 IX_NPEMH_SHOW ("Unsolicited messages received",
284 ixNpeMhReceiveStats[npeId].unsolicited);
286 /* show the callback invoked counter */
287 IX_NPEMH_SHOW ("Callbacks invoked",
288 ixNpeMhReceiveStats[npeId].callbacks);
290 /* show the message discarded counter */
291 IX_NPEMH_SHOW ("Received messages discarded",
292 (ixNpeMhReceiveStats[npeId].messages -
293 ixNpeMhReceiveStats[npeId].callbacks));
297 * Function definition: ixNpeMhReceiveShowReset
300 void ixNpeMhReceiveShowReset (
301 IxNpeMhNpeId npeId)
303 /* reset the ISR invocation counter */
304 ixNpeMhReceiveStats[npeId].isrs = 0;
306 /* reset the receive message invocation counter */
307 ixNpeMhReceiveStats[npeId].receives = 0;
309 /* reset the message received counter */
310 ixNpeMhReceiveStats[npeId].messages = 0;
312 /* reset the solicited message counter */
313 ixNpeMhReceiveStats[npeId].solicited = 0;
315 /* reset the unsolicited message counter */
316 ixNpeMhReceiveStats[npeId].unsolicited = 0;
318 /* reset the callback invoked counter */
319 ixNpeMhReceiveStats[npeId].callbacks = 0;