1 /* 2 * CDDL HEADER START 3 * 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. 7 * 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. 12 * 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] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2001 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_SGSBBC_MAILBOX_PRIV_H 28 #define _SYS_SGSBBC_MAILBOX_PRIV_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <sys/sgsbbc_mailbox.h> 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 /* 39 * Internal flags for message processing 40 */ 41 #define WAIT_FOR_REPLY 0x1 42 #define NOWAIT_FOR_REPLY 0x2 43 #define WAIT_FOR_SPACE 0x4 44 #define NOWAIT_FOR_SPACE 0x8 45 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 51 52 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 */ 58 59 60 #define SBBC_MSG_TYPE_MASK 0xffff 61 62 /* Number of bytes the mailbox messages align at */ 63 #define MBOX_ALIGN_BYTES 8 /* align at 8-byte boundary */ 64 65 #define PANIC_ENV_EVENT_MSG "SC triggered Domain shutdown due to " \ 66 "temperature exceeding limits.\n" 67 68 /* 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.) 73 * 74 * Note: ID == 0 => unsolicited 75 * 76 * make them all 32-bit ints and add a bit of 77 * user-data padding to make life easy for the SC 78 */ 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 */ 87 }; 88 89 90 typedef enum { INBOX, OUTBOX } mb_type_t; 91 92 /* 93 * this describes the In/Out mailboxes 94 */ 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 */ 98 /* 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 102 */ 103 kcondvar_t mb_full; /* protected by mb_lock */ 104 } sbbc_mbox_t; 105 106 107 /* 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. 110 */ 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; 117 }; 118 119 120 /* 121 * this struct describes the mailbox as seen by the OS 122 */ 123 typedef struct sbbc_mailbox { 124 /* 125 * Two mailboxes, SC -> OS mbox_in 126 * OS -> SC mbox_out 127 */ 128 sbbc_mbox_t *mbox_in; 129 sbbc_mbox_t *mbox_out; 130 /* 131 * Interrupt handlers. Mailbox registers itself with 132 * the SBBC for the following interrupt types 133 * 134 * SBBC_MAILBOX_IN 135 * SBBC_MAILBOX_OUT 136 * SBBC_MAILBOX_SPACE_IN 137 * SBBC_MAILBOX_SPACE_OUT 138 * 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. 142 * 143 */ 144 struct { 145 kmutex_t mbox_intr_lock; 146 uint_t mbox_intr_state; 147 } intr_state[SBBC_MBOX_INTR_TYPES]; 148 149 /* 150 * Message handlers - one per message type 151 * These are used for incoming unsolicited messages 152 */ 153 sbbc_intrs_t *intrs[SBBC_MBOX_MSG_TYPES]; 154 155 /* 156 * Next message ID 157 */ 158 uint32_t mbox_msg_id; 159 160 /* 161 * List of 'waiters' for each incoming message type 162 */ 163 kmutex_t mbox_wait_lock[SBBC_MBOX_MSG_TYPES]; 164 struct sbbc_msg_waiter *mbox_wait_list[SBBC_MBOX_MSG_TYPES]; 165 166 } sbbc_mailbox_t; 167 168 169 /* 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 173 * 174 * make them all 32-bit ints and add a bit of 175 * user-data padding to make life easy for the SC 176 */ 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 */ 191 }; 192 193 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 *); 198 199 extern sbbc_mailbox_t *master_mbox; 200 201 #ifdef __cplusplus 202 } 203 #endif 204 205 #endif /* _SYS_SGSBBC_MAILBOX_PRIV_H */ 206