8354 sync regcomp(3C) with upstream (fix make catalog)
[unleashed/tickless.git] / usr / src / uts / sun4u / serengeti / sys / sgsbbc_mailbox_priv.h
blobb8c073f0b5148e6fa2deddee5b2ad1cf19dd0eef
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
23 * Copyright 2001 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SYS_SGSBBC_MAILBOX_PRIV_H
28 #define _SYS_SGSBBC_MAILBOX_PRIV_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
32 #include <sys/sgsbbc_mailbox.h>
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
39 * Internal flags for message processing
41 #define WAIT_FOR_REPLY 0x1
42 #define NOWAIT_FOR_REPLY 0x2
43 #define WAIT_FOR_SPACE 0x4
44 #define NOWAIT_FOR_SPACE 0x8
46 #define MBOX_INTRS 4
47 #define MBOX_MSGIN_INTR 0
48 #define MBOX_MSGOUT_INTR 1
49 #define MBOX_SPACEIN_INTR 2
50 #define MBOX_SPACEOUT_INTR 3
53 #define SBBC_MAILBOXES 2 /* InBox & OutBox */
54 #define SBBC_INBOX 0
55 #define SBBC_OUTBOX 1
56 #define SBBC_MBOX_MSG_TYPES 32 /* this will do for now */
57 #define SBBC_MBOX_INTR_TYPES 4 /* see below */
60 #define SBBC_MSG_TYPE_MASK 0xffff
62 /* Number of bytes the mailbox messages align at */
63 #define MBOX_ALIGN_BYTES 8 /* align at 8-byte boundary */
65 #define PANIC_ENV_EVENT_MSG "SC triggered Domain shutdown due to " \
66 "temperature exceeding limits.\n"
69 * This struct is used internally by both the SC & OS mailbox
70 * handlers. Every message in the mailbox is made up
71 * of a fragment struct followed immediately by some optional
72 * user data. (We will allow zero-length messages.)
74 * Note: ID == 0 => unsolicited
76 * make them all 32-bit ints and add a bit of
77 * user-data padding to make life easy for the SC
79 struct sbbc_fragment {
80 uint32_t f_id; /* msg_id */
81 sbbc_msg_type_t f_type; /* msg_type */
82 uint32_t f_status; /* not used yet */
83 uint32_t f_total_len;
84 uint32_t f_frag_len;
85 uint32_t f_frag_offset; /* offset into msg_buf */
86 uint32_t f_data[2]; /* for junk mail */
90 typedef enum { INBOX, OUTBOX } mb_type_t;
93 * this describes the In/Out mailboxes
95 typedef struct sbbc_mbox {
96 kmutex_t mb_lock; /* global lock for this mailbox */
97 mb_type_t mb_type; /* read-only/read-write */
99 * If the mailbox is full, we can either block waiting
100 * for space or just return an error. We will make this
101 * dependent on the message flag
103 kcondvar_t mb_full; /* protected by mb_lock */
104 } sbbc_mbox_t;
108 * When a message requires a reply, it is put on a waitlist
109 * until a message of that type with a matching ID comes in.
111 struct sbbc_msg_waiter {
112 uint32_t w_id; /* ID */
113 sbbc_msg_t *w_msg; /* message we are waiting for */
114 kcondvar_t w_cv; /* protected by wait_list lock */
115 time_t w_timeout;
116 struct sbbc_msg_waiter *w_next;
121 * this struct describes the mailbox as seen by the OS
123 typedef struct sbbc_mailbox {
125 * Two mailboxes, SC -> OS mbox_in
126 * OS -> SC mbox_out
128 sbbc_mbox_t *mbox_in;
129 sbbc_mbox_t *mbox_out;
131 * Interrupt handlers. Mailbox registers itself with
132 * the SBBC for the following interrupt types
134 * SBBC_MAILBOX_IN
135 * SBBC_MAILBOX_OUT
136 * SBBC_MAILBOX_SPACE_IN
137 * SBBC_MAILBOX_SPACE_OUT
139 * Of course, we should only ever see the *-IN interrupts
140 * but we will register the *-OUT ones as ours anyway to ensure
141 * no-one else tries to overload these interrupt types.
144 struct {
145 kmutex_t mbox_intr_lock;
146 uint_t mbox_intr_state;
147 } intr_state[SBBC_MBOX_INTR_TYPES];
150 * Message handlers - one per message type
151 * These are used for incoming unsolicited messages
153 sbbc_intrs_t *intrs[SBBC_MBOX_MSG_TYPES];
156 * Next message ID
158 uint32_t mbox_msg_id;
161 * List of 'waiters' for each incoming message type
163 kmutex_t mbox_wait_lock[SBBC_MBOX_MSG_TYPES];
164 struct sbbc_msg_waiter *mbox_wait_list[SBBC_MBOX_MSG_TYPES];
166 } sbbc_mailbox_t;
170 * This data will be written by the SC at the
171 * start of the mailbox in IOSRAM.
172 * This is read from offset 0 with key SBBC_MAILBOX_KEY
174 * make them all 32-bit ints and add a bit of
175 * user-data padding to make life easy for the SC
177 struct sbbc_mbox_header {
178 uint32_t mbox_magic;
179 uint32_t mbox_version;
180 struct mbox {
181 uint32_t mbox_type; /* SBBC_{IN|OUT}BOX */
182 uint32_t mbox_offset; /* from start of mailbox */
183 /* SRAM area */
184 uint32_t mbox_len; /* size in bytes */
185 uint32_t mbox_producer; /* producer offset from */
186 /* start of this mailbox */
187 uint32_t mbox_consumer; /* consumer offset from */
188 /* start of this mailbox */
189 } mailboxes[SBBC_MAILBOXES];
190 uint32_t mbox_data[4]; /* pad */
194 extern void sbbc_mbox_init();
195 extern void sbbc_mbox_fini();
196 extern int sbbc_mbox_create(sbbc_softstate_t *);
197 extern int sbbc_mbox_switch(sbbc_softstate_t *);
199 extern sbbc_mailbox_t *master_mbox;
201 #ifdef __cplusplus
203 #endif
205 #endif /* _SYS_SGSBBC_MAILBOX_PRIV_H */