103831d35Sstevel /*
203831d35Sstevel  * CDDL HEADER START
303831d35Sstevel  *
403831d35Sstevel  * The contents of this file are subject to the terms of the
503831d35Sstevel  * Common Development and Distribution License (the "License").
603831d35Sstevel  * You may not use this file except in compliance with the License.
703831d35Sstevel  *
803831d35Sstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
903831d35Sstevel  * or http://www.opensolaris.org/os/licensing.
1003831d35Sstevel  * See the License for the specific language governing permissions
1103831d35Sstevel  * and limitations under the License.
1203831d35Sstevel  *
1303831d35Sstevel  * When distributing Covered Code, include this CDDL HEADER in each
1403831d35Sstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1503831d35Sstevel  * If applicable, add the following below this CDDL HEADER, with the
1603831d35Sstevel  * fields enclosed by brackets "[]" replaced with your own identifying
1703831d35Sstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
1803831d35Sstevel  *
1903831d35Sstevel  * CDDL HEADER END
2003831d35Sstevel  */
2103831d35Sstevel 
2203831d35Sstevel /*
23*25cf1a30Sjl  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
2403831d35Sstevel  * Use is subject to license terms.
2503831d35Sstevel  */
2603831d35Sstevel 
2703831d35Sstevel #ifndef _SBDP_MEM_H
2803831d35Sstevel #define	_SBDP_MEM_H
2903831d35Sstevel 
3003831d35Sstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
3103831d35Sstevel 
3203831d35Sstevel #ifdef	__cplusplus
3303831d35Sstevel extern "C" {
3403831d35Sstevel #endif
3503831d35Sstevel 
3603831d35Sstevel #include <sys/sbd.h>
3703831d35Sstevel #include <sys/sbdp_priv.h>
3803831d35Sstevel 
3903831d35Sstevel #define	SBDP_MAX_MCS_PER_NODE		4
4003831d35Sstevel #define	SBDP_MAX_MEM_NODES_PER_BOARD	4
41*25cf1a30Sjl #define	SBDP_MAX_CORES_PER_CMP		2
4203831d35Sstevel 
4303831d35Sstevel typedef uint64_t mc_dc_regs_t[SBDP_MAX_MCS_PER_NODE];
4403831d35Sstevel 
4503831d35Sstevel typedef struct {
4603831d35Sstevel 	int	board;
4703831d35Sstevel 	pnode_t	*nodes;
4803831d35Sstevel 	int	nmem;
4903831d35Sstevel } mem_op_t;
5003831d35Sstevel 
5103831d35Sstevel typedef struct {
5203831d35Sstevel 	uint_t	regspec_addr_hi;
5303831d35Sstevel 	uint_t	regspec_addr_lo;
5403831d35Sstevel 	uint_t	regspec_size_hi;
5503831d35Sstevel 	uint_t	regspec_size_lo;
5603831d35Sstevel } mc_regspace;
5703831d35Sstevel 
5803831d35Sstevel typedef struct {
5903831d35Sstevel 	uint64_t	mc_decode[SBDP_MAX_MCS_PER_NODE];
6003831d35Sstevel 	uint64_t	mc_memctl;
6103831d35Sstevel } mc_regs_t;
6203831d35Sstevel 
6303831d35Sstevel /*
6403831d35Sstevel  * Memory controller register offsets
6503831d35Sstevel  */
6603831d35Sstevel #define	SG_MEM_TIMING1_CTL	0x400000
6703831d35Sstevel #define	SG_MEM_TIMING2_CTL	0x400008
6803831d35Sstevel #define	SG_MEM_TIMING3_CTL	0x400038
6903831d35Sstevel #define	SG_MEM_TIMING4_CTL	0x400040
7003831d35Sstevel #define	SG_MEM_DECODE0_ADR	0x400028
7103831d35Sstevel #define	SG_MEM_DECODE1_ADR	0x400010
7203831d35Sstevel #define	SG_MEM_DECODE2_ADR	0x400018
7303831d35Sstevel #define	SG_MEM_DECODE3_ADR	0x400020
7403831d35Sstevel #define	SG_MEM_CONTROL_ADR	0x400030
7503831d35Sstevel #define	SG_EMU_ACTIVITY_STATUS	0x400050
7603831d35Sstevel 
7703831d35Sstevel /*
7803831d35Sstevel  * Bit fields for the decode registers
7903831d35Sstevel  */
8003831d35Sstevel #define	SG_DECODE_VALID		0x8000000000000000ull
8103831d35Sstevel #define	SG_DECODE_UK		0x001ffe0000000000ull
8203831d35Sstevel #define	SG_DECODE_UM		0x000001fffff00000ull
8303831d35Sstevel #define	SG_DECODE_LK		0x00000000000fc000ull
8403831d35Sstevel #define	SG_DECODE_LM		0x0000000000003f00ull
8503831d35Sstevel #define	SG_INVAL_UM		0x0000000ffff00000ull
8603831d35Sstevel #define	SG_SLICE_INFO		0x000001fc00000000ull
8703831d35Sstevel #define	SG_ALIGNMENT		0x800000000ULL
8803831d35Sstevel 
8903831d35Sstevel 
9003831d35Sstevel /*
9103831d35Sstevel  * Memory Macros
9203831d35Sstevel  */
9303831d35Sstevel #define	MC_MEMDEC0(mc_addr) \
9403831d35Sstevel 	(mc_addr) | SG_MEM_DECODE0_ADR
9503831d35Sstevel #define	MC_MEMDEC1(mc_addr) \
9603831d35Sstevel 	(mc_addr) | SG_MEM_DECODE1_ADR
9703831d35Sstevel #define	MC_MEMDEC2(mc_addr) \
9803831d35Sstevel 	(mc_addr) | SG_MEM_DECODE2_ADR
9903831d35Sstevel #define	MC_MEMDEC3(mc_addr) \
10003831d35Sstevel 	(mc_addr) | SG_MEM_DECODE3_ADR
10103831d35Sstevel #define	MC_ACTIVITY_STATUS(mc_addr) \
10203831d35Sstevel 	(mc_addr) | SG_EMU_ACTIVITY_STATUS
10303831d35Sstevel 
10403831d35Sstevel 
10503831d35Sstevel /*
10603831d35Sstevel  * Mappings to the array for the decode registers only
10703831d35Sstevel  */
10803831d35Sstevel #define	SG_MC_DECODE_I		0
10903831d35Sstevel #define	SG_MC_DECODE_II		1
11003831d35Sstevel #define	SG_MC_DECODE_III	2
11103831d35Sstevel #define	SG_MC_DECODE_IV		3
11203831d35Sstevel /*
11303831d35Sstevel  * Memory Macros
11403831d35Sstevel  */
11503831d35Sstevel #define	SG_REG_2_OFFSET(num) \
11603831d35Sstevel 	    ((num) == SG_MC_DECODE_I ? (uint64_t)SG_MEM_DECODE0_ADR : \
11703831d35Sstevel 	    (num) == SG_MC_DECODE_II ? (uint64_t)SG_MEM_DECODE1_ADR : \
11803831d35Sstevel 	    (num) == SG_MC_DECODE_III ? (uint64_t)SG_MEM_DECODE2_ADR : \
11903831d35Sstevel 	    (num) == SG_MC_DECODE_IV ? (uint64_t)SG_MEM_DECODE3_ADR : \
12003831d35Sstevel 	    (uint64_t)-1)
12103831d35Sstevel 
12203831d35Sstevel #define	MC_VALID_SHIFT		63
12303831d35Sstevel #define	MC_UK_SHIFT		41
12403831d35Sstevel #define	MC_UM_SHIFT		20
12503831d35Sstevel #define	MC_LK_SHIFT		14
12603831d35Sstevel #define	MC_LM_SHIFT		8
12703831d35Sstevel #define	PHYS2UM_SHIFT		26
12803831d35Sstevel #define	MC_UK(memdec)		(((memdec) >> MC_UK_SHIFT) & 0xfffu)
12903831d35Sstevel #define	MC_LK(memdec)		(((memdec) >> MC_LK_SHIFT)& 0x3fu)
13003831d35Sstevel #define	MC_INTLV(memdec)	((~(MC_LK(memdec)) & 0xfu) + 1)
13103831d35Sstevel #define	MC_UK2SPAN(memdec)	((MC_UK(memdec) + 1) << PHYS2UM_SHIFT)
13203831d35Sstevel #define	MC_SPANMB(memdec)	(MC_UK2SPAN(memdec) >> 20)
13303831d35Sstevel #define	MC_UM(memdec)		(((memdec) >> MC_UM_SHIFT) & 0x1fffffu)
13403831d35Sstevel #define	MC_LM(memdec)		(((memdec) >> MC_LM_SHIFT) & 0x3f)
13503831d35Sstevel #define	MC_BASE(memdec)		(MC_UM(memdec) & ~(MC_UK(memdec)))
13603831d35Sstevel #define	MC_BASE2UM(base)	(((base) & 0x1fffffu) << MC_UM_SHIFT)
13703831d35Sstevel #define	SAF_MASK		0x000007ffff800000ull
13803831d35Sstevel #define	MC_OFFSET_MASK		0xffu
13903831d35Sstevel 
14003831d35Sstevel /*
14103831d35Sstevel  * Memory Slice information
14203831d35Sstevel  */
14303831d35Sstevel #define	SG_SLICE_16G_SIZE	0x400000000ULL
14403831d35Sstevel #define	SG_SLICE_32G_SIZE	0x800000000ULL
14503831d35Sstevel #define	SG_SLICE_64G_SIZE	0x1000000000ULL
14603831d35Sstevel 
14703831d35Sstevel /*
14803831d35Sstevel  * Copy-rename info
14903831d35Sstevel  */
15003831d35Sstevel 
15103831d35Sstevel #define	SBDP_RENAME_MAXOP	(PAGESIZE / sizeof (sbdp_rename_script_t))
15203831d35Sstevel 
15303831d35Sstevel /*
15403831d35Sstevel  * Must be same size as sbdp_rename_script_t.
15503831d35Sstevel  */
15603831d35Sstevel typedef struct {
15703831d35Sstevel 	uint64_t	addr;
15803831d35Sstevel 	uint_t		bd_id;
15903831d35Sstevel 	pnode_t		node;
16003831d35Sstevel 	uint_t		asi;
16103831d35Sstevel 	uint_t		_filler;
16203831d35Sstevel } sbdp_mc_idle_script_t;
16303831d35Sstevel 
16403831d35Sstevel typedef struct {
16503831d35Sstevel 	uint64_t	masr_addr;
16603831d35Sstevel 	uint64_t	masr;
16703831d35Sstevel 	uint_t		asi;
16803831d35Sstevel 	uint_t		_filler;
16903831d35Sstevel } sbdp_rename_script_t;
17003831d35Sstevel 
17103831d35Sstevel typedef struct {
17203831d35Sstevel 	sbdp_bd_t	*s_bdp;	/* pointer to src bd info */
17303831d35Sstevel 	sbdp_bd_t	*t_bdp;	/* pointer to tgt bd info */
17403831d35Sstevel 	sbdp_rename_script_t *script; 	/* points to the actual script */
17503831d35Sstevel 	uint64_t	ret;
17603831d35Sstevel 	sbdp_mc_idle_script_t *busy_mc;
17703831d35Sstevel } sbdp_cr_handle_t;
17803831d35Sstevel 
17903831d35Sstevel 
18003831d35Sstevel extern uint64_t lddsafaddr(uint64_t physaddr);
18103831d35Sstevel extern uint64_t lddmcdecode(uint64_t physaddr);
18203831d35Sstevel extern void stdmcdecode(uint64_t, uint64_t);
18303831d35Sstevel 
18403831d35Sstevel int sbdp_is_mem(pnode_t node, void *arg);
18503831d35Sstevel #ifdef DEBUG
18603831d35Sstevel int sbdp_passthru_readmem(sbdp_handle_t *hp, void *);
18703831d35Sstevel int sbdp_passthru_prep_script(sbdp_handle_t *hp, void *);
18803831d35Sstevel #endif
18903831d35Sstevel 
19003831d35Sstevel #ifdef	__cplusplus
19103831d35Sstevel }
19203831d35Sstevel #endif
19303831d35Sstevel 
19403831d35Sstevel #endif	/* _SBDP_MEM_H */
195