8354 sync regcomp(3C) with upstream (fix make catalog)
[unleashed/tickless.git] / usr / src / uts / sun4u / sys / mc-us3i.h
blobaaf1a0d6836ba4b610ec691ac2c65754dd8626ee
1 /*
2 * CDDL HEADER START
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.
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.
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]
20 * CDDL HEADER END
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SYS_MC_US3I_H
28 #define _SYS_MC_US3I_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
36 #if defined(_KERNEL)
38 #define NDGRPS_PER_MC 2 /* max dimm groups per mctrl */
39 #define NDIMMS_PER_DGRP 2 /* max dimms in a group/pair */
40 #define NLOGBANKS_PER_DGRP 2 /* max logical banks per grp */
41 #define NLOGBANKS_PER_MC 16 /* max logical banks per mc */
42 #define NLOGBANKS_PER_SEG 16 /* max logical banks per seg */
43 #define MAX_DEVLEN 8
44 #define TRANSFER_SIZE 64
46 #define MC_SELECT_MASK 0x3000000000LL /* upto 4 MCs at 64GB boundry */
47 #define MC_SELECT_SHIFT 36
48 #define DIMM_PAIR_SELECT_MASK 0x200000000LL /* at 8GB boundry */
49 #define DIMM_PAIR_SELECT_SHIFT 33
50 #define LOG_BANK_SELECT_MASK 0x100000000LL /* at 4GB boundry */
51 #define LOG_BANK_SELECT_SHIFT 32
52 #define XOR_DEVICE_SELECT_MASK 0x200000LL /* at 2MB boundry */
53 #define XOR_DEVICE_SELECT_SHIFT 21
54 #define XOR_BANK_SELECT_MASK 0x100000LL /* at 1MB boundry */
55 #define XOR_BANK_SELECT_SHIFT 20
57 #define MC_SIZE_MAX 0x1000000000LL /* 64GB */
58 #define DGRP_SIZE_MAX 0x200000000LL /* 8GB */
59 #define BANK_SIZE_MAX 0x100000000LL /* 4GB */
61 #define MC_BASE(id) (id * MC_SIZE_MAX)
62 #define DGRP_BASE(id) ((id & (NDGRPS_PER_MC - 1)) * DGRP_SIZE_MAX)
63 #define LOGBANK_BASE(id) ((id & (NLOGBANKS_PER_SEG - 1)) * BANK_SIZE_MAX)
65 #define ADDR_GEN_128Mb_X8_ROW_0 14
66 #define ADDR_GEN_512Mb_X8_ROW_0 15
68 #ifndef _ASM
70 struct mc_soft_state {
71 dev_info_t *dip; /* dev info of myself */
72 int portid;
73 int mcr_read_ok;
74 uint64_t mcreg1;
75 int reglen;
76 void *reg;
77 int memlayoutlen;
78 void *memlayoutp;
81 struct memory_reg_info {
82 uint64_t base;
83 uint64_t size;
86 struct dimm_info {
87 char label[NDGRPS_PER_MC * NDIMMS_PER_DGRP][MAX_DEVLEN];
88 char table_width; /* 1: symmetric 0: asymmetric */
89 char data[1];
92 struct pin_info {
93 uchar_t dimmtable[18];
94 uchar_t pintable[144];
97 /* This struct is included at the following structs to set up list */
98 typedef struct mc_dlist {
99 struct mc_dlist *next;
100 struct mc_dlist *prev;
101 int id;
102 } mc_dlist_t;
104 /* unique segment id */
105 struct seg_info {
106 mc_dlist_t seg_node;
107 int nbanks; /* The number of banks at this segment */
108 uint32_t ifactor; /* Max interleave factor at this segment */
109 uint64_t base;
110 uint64_t size; /* memory size per segment */
111 struct bank_info *head; /* first bank at this segment */
112 struct bank_info *tail; /* last bank at this segment */
115 /* id = mc_id * nbanks + bank_no */
116 struct bank_info {
117 mc_dlist_t bank_node;
118 int local_id; /* unique local bank id per segment */
119 int seg_id; /* unique segment id */
120 int devgrp_id; /* unique device group id */
121 uint64_t mask; /* If (Physical Address & MASK) == MATCH */
122 uint64_t match; /* Physic Address is located at this bank. */
123 uint64_t base; /* base address of the logical bank */
124 uint64_t size; /* memory size per logical bank */
125 struct bank_info *next; /* next bank at the same segment */
128 /* id = id of dgrp_info * ndevices + device_no */
129 struct device_info {
130 mc_dlist_t dev_node;
131 char label[MAX_DEVLEN];
132 uint64_t size; /* memory size per physical dimm */
135 /* id = mc_id * ndevgrps + devgrp_no */
136 struct dgrp_info {
137 mc_dlist_t dgrp_node;
138 int ndevices; /* number of physical dimms - always a pair */
139 int nlogbanks; /* number of logical banks - single or dual */
140 int base_device; /* base density - 128Mb, 256Mb, 512Mb or 1Gb */
141 int part_type; /* part type - x4, x8 */
142 uint64_t base; /* physical memory base of the dev group */
143 uint64_t size; /* total memory size of the dev group */
144 int deviceids[NDIMMS_PER_DGRP]; /* 2 dimms per group on Jalapeno */
147 /* id = portid */
148 struct mctrl_info {
149 mc_dlist_t mctrl_node;
150 int ndevgrps; /* The number of dimm groups */
151 int devgrpids[NDGRPS_PER_MC];
152 struct dimm_info *dimminfop;
155 extern int (*p2get_mem_unum)(int, uint64_t, char *, int, int *);
156 extern int (*p2get_mem_info)(int, uint64_t, uint64_t *, uint64_t *,
157 uint64_t *, int *, int *, int *);
158 extern void plat_add_mem_unum_label(char *, int, int, int);
160 uint64_t get_mcr(int);
162 /* #ifdef DEBUG */
164 #include <sys/promif.h>
166 /* useful debugging level of DPRINTF */
167 #define MC_ATTACH_DEBUG 0x00000001
168 #define MC_DETACH_DEBUG 0x00000002
169 #define MC_CMD_DEBUG 0x00000004
170 #define MC_REG_DEBUG 0x00000008
171 #define MC_GUNUM_DEBUG 0x00000010
172 #define MC_CNSTRC_DEBUG 0x00000020
173 #define MC_DESTRC_DEBUG 0x00000040
174 #define MC_LIST_DEBUG 0x00000080
177 #define _PRINTF printf
178 #define DPRINTF(flag, args) if (mc_debug & flag) _PRINTF args;
179 #else
180 #define DPRINTF(flag, args)
182 /* #endif DEBUG */
184 #endif /* !_ASM */
186 /* Memory Control Registers */
187 #define ASI_MCU_CTRL 0x72
188 #define MCREG1OFFSET 0x00
190 /* Mask and shift constants for Memory Control Register I */
191 #define MCREG1_DIMM2_BANK3 0x8000000000000000ULL /* bit 63 */
192 #define MCREG1_DIMM1_BANK1 0x4000000000000000ULL /* bit 62 */
193 #define MCREG1_DIMM2_BANK2 0x2000000000000000ULL /* bit 61 */
194 #define MCREG1_DIMM1_BANK0 0x1000000000000000ULL /* bit 60 */
196 #define MCREG1_XOR_ENABLE 0x10000000000LL /* bit 40 */
197 #define MCREG1_ADDRGEN2_MASK 0xE000000000LL /* bits 39:37 */
198 #define MCREG1_ADDRGEN2_SHIFT 37
199 #define MCREG1_ADDRGEN1_MASK 0x1C00000000LL /* bits 36:34 */
200 #define MCREG1_ADDRGEN1_SHIFT 34
201 #define BASE_DEVICE_128Mb 0
202 #define BASE_DEVICE_256Mb 1
203 #define BASE_DEVICE_512Mb 2
204 #define BASE_DEVICE_1Gb 3
206 #define MCREG1_INTERLEAVE_MASK 0x1800000LL /* bits 24:23 */
207 #define MCREG1_INTERLEAVE_SHIFT 23
208 #define INTERLEAVE_DISABLE 0
209 #define INTERLEAVE_INTEXT_SAME_DIMM_PAIR 1
210 #define INTERLEAVE_INTERNAL 2
211 #define INTERLEAVE_INTEXT_BOTH_DIMM_PAIR 3
213 #define MCREG1_X4DIMM2_MASK 0x200000LL /* bit 21 */
214 #define MCREG1_X4DIMM2_SHIFT 21
215 #define MCREG1_X4DIMM1_MASK 0x100000LL /* bit 20 */
216 #define MCREG1_X4DIMM1_SHIFT 20
217 #define PART_TYPE_X4 1
218 #define PART_TYPE_X8 0
220 #endif /* _KERNEL */
222 #ifdef __cplusplus
224 #endif
226 #endif /* _SYS_MC_US3I_H */