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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_SERENGETI_H 28 #define _SYS_SERENGETI_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* 37 * serengeti.h - Serengeti/WildCat common header file 38 * 39 * This header file contains the common definitions and macros for the 40 * Serengeti and WildCat platforms. We define them all here to avoid them 41 * being redefined in numerous different drivers. 42 */ 43 44 #include <sys/dditypes.h> 45 46 /* 47 * Definitions 48 * =========== 49 */ 50 51 #ifndef TRUE 52 #define TRUE 1 53 #endif 54 55 #ifndef FALSE 56 #define FALSE 0 57 #endif 58 59 60 #define SG_MAX_IO_PER_BD 5 /* 4 pci buses + cpci */ 61 #define SG_MAX_CMPS_PER_BD 4 62 #define SG_MAX_CPUS_PER_BD 8 63 #define SG_MAX_MEM_PER_BD 1 64 #define SG_MAX_CPU_BDS 6 65 #define SG_MAX_IO_BDS 4 66 #define SG_MAX_POWER_SUPPLIES 6 67 #define SG_MAX_FAN_TRAYS 6 68 #define SG_MAX_REPEATER_BDS 4 69 #define SG_MAX_BDS (SG_MAX_CPU_BDS + SG_MAX_IO_BDS) 70 #define SG_MAX_CPUS (SG_MAX_CPUS_PER_BD * SG_MAX_CPU_BDS) 71 72 #define SG_MAX_SLOTS_PER_IO_BD 8 73 #define SG_SCHIZO_PER_IO_BD 2 74 75 #define SSM_MAX_INSTANCES 16 76 #define SSM_MAX_BDS (SSM_MAX_INSTANCES * SG_MAX_BDS) 77 78 #define SG_MIN_CPU_SAFARI_ID 0 /* 0x00 */ 79 #define SG_MAX_CPU_SAFARI_ID 23 /* 0x17 */ 80 #define SG_MIN_IO_SAFARI_ID 24 /* 0x18 */ 81 #define SG_MAX_IO_SAFARI_ID 31 /* 0x1F */ 82 83 84 /* 85 * possible states for the Keyswitch Position. 86 */ 87 #define SG_KEYSWITCH_POSN_UNKNOWN (-1) 88 #define SG_KEYSWITCH_POSN_ON 2 89 #define SG_KEYSWITCH_POSN_DIAG 3 90 #define SG_KEYSWITCH_POSN_SECURE 4 91 92 93 94 /* 95 * Macros 96 * ====== 97 */ 98 99 /* we only need the 5 LSB of the portid to calculate the board number */ 100 #define SG_SAFARI_ID_MASK 0x1F /* 5 bits */ 101 #define SG_CPU_ID_MASK 0x21F /* bit 9 and bits 0-4 */ 102 #define SG_CORE_ID_MASK 0x200 /* bit 9 */ 103 #define SG_NODE_MASK 0x0F /* 4 bits */ 104 #define SG_PORTID_NODE_SHIFT 5 105 106 /* 107 * For Serengeti and WildCat the portid consists of 10 bits. 108 * 109 * [9] [8 -------- 5][4 --------- 0] 110 * ^ NodeID AgentID 111 * |___ Used in CMP to identify core 1. Unused with non-CMP. 112 * 113 * For CPU boards: 114 * Aid <4:2> : Board ID/Number 115 * Aid <1:0> : CPU ID 116 * For IO boards: 117 * (Aid <4:0> - 24) / 2 + 6 : Board ID/Number 118 * (Aid <4:0> - 24) % 2 : Schizo ID 119 */ 120 121 /* 122 * For Jaguar there are two CPU IDs the can be derived from portid 123 * and coreid. On Serengeti, bit 9 is set for core 1, resulting in 124 * the cpuid for core 1 being 512 off from the one for core 0. 125 */ 126 #define SG_JG_CORE1_SHIFT 9 127 #define SG_JG_CORE1_OFFSET (1 << SG_JG_CORE1_SHIFT) 128 #define SG_PORTID_TO_CPUID(p, c) ((p) + ((c) << SG_JG_CORE1_SHIFT)) 129 #define SG_PORTID_TO_CPU_UNIT(p, c) ((p % SG_MAX_CMPS_PER_BD) | \ 130 ((c) * SG_MAX_CMPS_PER_BD)) 131 #define SG_CPUID_TO_PORTID(c) ((c) & SG_SAFARI_ID_MASK) 132 #define SG_CPUID_TO_COREID(c) (((c) & SG_CORE_ID_MASK) >> \ 133 SG_JG_CORE1_SHIFT) 134 #define SG_CPUID_TO_CPU_UNIT(c) SG_PORTID_TO_CPU_UNIT( \ 135 SG_CPUID_TO_PORTID(c), \ 136 SG_CPUID_TO_COREID(c)) 137 138 /* 139 * SG_PORTID_TO_NODEID 140 * 141 * Calculates the SSM NodeID from the portid 142 */ 143 #define SG_PORTID_TO_NODEID(portid) (((portid) >> SG_PORTID_NODE_SHIFT) & \ 144 SG_NODE_MASK) 145 146 /* 147 * SG_PORTID_TO_SAFARI_ID 148 * 149 * Calculates the Safari Agent ID from the portid. 150 */ 151 #define SG_PORTID_TO_SAFARI_ID(portid) ((portid) & SG_SAFARI_ID_MASK) 152 153 154 /* 155 * SG_PORTID_TO_BOARD_NUM 156 * 157 * If a valid portid is passed in, this macro returns the board number 158 * associated with it, otherwise it returns -1. 159 */ 160 #define SG_PORTID_TO_BOARD_NUM(portid) \ 161 ((SG_PORTID_IS_CPU_TYPE(portid)) ? \ 162 (SG_CPU_BD_PORTID_TO_BD_NUM(portid)) : \ 163 ((SG_PORTID_IS_IO_TYPE(portid)) ? \ 164 SG_IO_BD_PORTID_TO_BD_NUM(portid) : (-1))) 165 166 /* 167 * SG_BOARD_IS_CPU_TYPE 168 * 169 * If the board number of a board of CPU type is passed in, TRUE is returned, 170 * otherwise FALSE. 171 */ 172 #define SG_BOARD_IS_CPU_TYPE(board_num) \ 173 ((((board_num) >= 0) && ((board_num) < SG_MAX_CPU_BDS)) ? TRUE: FALSE) 174 175 /* 176 * SG_BOARD_IS_IO_TYPE 177 * 178 * If the board number of a board of IO type is passed in, TRUE is returned, 179 * otherwise FALSE. 180 */ 181 #define SG_BOARD_IS_IO_TYPE(board_num) \ 182 ((((board_num) >= SG_MAX_CPU_BDS) && \ 183 ((board_num) < SG_MAX_BDS)) ? TRUE: FALSE) 184 185 /* 186 * SG_PORTID_IS_CPU_TYPE 187 * 188 * If the portid associated with a CPU board is passed in, TRUE is returned, 189 * otherwise FALSE. 190 */ 191 #define SG_PORTID_IS_CPU_TYPE(portid) \ 192 (((((portid) & SG_SAFARI_ID_MASK) >= SG_MIN_CPU_SAFARI_ID) && \ 193 (((portid) & SG_SAFARI_ID_MASK) <= SG_MAX_CPU_SAFARI_ID)) ? TRUE: FALSE) 194 195 /* 196 * SG_PORTID_IS_IO_TYPE 197 * 198 * If the portid associated with an IO board is passed in, TRUE is returned, 199 * otherwise FALSE. 200 */ 201 #define SG_PORTID_IS_IO_TYPE(portid) \ 202 (((((portid) & SG_SAFARI_ID_MASK) >= SG_MIN_IO_SAFARI_ID) && \ 203 (((portid) & SG_SAFARI_ID_MASK) <= SG_MAX_IO_SAFARI_ID)) ? TRUE: FALSE) 204 205 /* 206 * SG_CPU_BD_PORTID_TO_BD_NUM 207 * 208 * If the portid associated with a CPU board is passed in, the board number 209 * associated with this portid is returned, otherwise -1. 210 */ 211 #define SG_CPU_BD_PORTID_TO_BD_NUM(portid) \ 212 ((SG_PORTID_IS_CPU_TYPE(portid)) ? \ 213 (((portid) & SG_SAFARI_ID_MASK) / 4) : (-1)) 214 215 /* 216 * SG_IO_BD_PORTID_TO_BD_NUM 217 * 218 * If the portid associated with an IO board is passed in, the board number 219 * associated with this portid is returned, otherwise -1. 220 */ 221 #define SG_IO_BD_PORTID_TO_BD_NUM(portid) \ 222 (SG_PORTID_IS_IO_TYPE(portid) ? \ 223 (((((portid) & SG_SAFARI_ID_MASK) - 24) / 2) + 6) : (-1)) 224 225 /* 226 * SG_PORTID_TO_CPU_POSN 227 * 228 * If the portid associated with a CPU board is passed in, the position 229 * of the CPU module for this portid is returned, otherwise -1. 230 */ 231 #define SG_PORTID_TO_CPU_POSN(portid) \ 232 ((SG_PORTID_IS_CPU_TYPE(portid)) ? \ 233 (((portid) & SG_SAFARI_ID_MASK) % 4) : (-1)) 234 235 /* 236 * Serengeti slices are defined by bits 34..41 of the physical address 237 * space, and can contain Safari agent ID bits depending upon the SC 238 * firmware being used. 239 */ 240 241 #define PA_SLICE_SHIFT (34) 242 #define PFN_SLICE_SHIFT (PA_SLICE_SHIFT - MMU_PAGESHIFT) 243 #define PA_2_SLICE(pa) (((pa) >> PA_SLICE_SHIFT) & SG_SLICE_MASK) 244 #define PFN_2_SLICE(pfn) (((pfn) >> PFN_SLICE_SHIFT) & SG_SLICE_MASK) 245 246 /* Define the max memory banks per CPU board */ 247 #define SG_MAX_BANKS_PER_MC (4) 248 249 /* Define the number of possible slices for the span of slice bits */ 250 #define SG_SLICE_MASK (0xff) 251 #define SG_MAX_SLICE (SG_SLICE_MASK + 1) 252 253 /* 254 * b represents the SB and c represents the processor (P) 255 * in relation to the SB. 256 */ 257 #define MAKE_CPUID(b, c) ((b*4) + c) 258 259 /* Each physical CPU has 2 ecache DIMMs */ 260 #define SG_NUM_ECACHE_DIMMS_PER_CPU 2 261 262 /* Bit 4 of the physical address indicates ecache dimm 0 or 1 */ 263 #define SG_ECACHE_DIMM_SHIFT 4 264 #define SG_ECACHE_DIMM_MASK 0x10 265 266 extern dev_info_t *find_chosen_dip(void); 267 268 extern int sg_get_prom_version(int *sysp, int *intfp, int *bldp); 269 extern int sg_prom_sb_dr_check(void); 270 extern int sg_prom_cpci_dr_check(void); 271 extern int sg_get_ecacheunum(int cpuid, uint64_t physaddr, char *buf, 272 uint_t buflen, int *lenp); 273 274 #ifdef __cplusplus 275 } 276 #endif 277 278 #endif /* _SYS_SERENGETI_H */ 279