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*25cf1a30Sjl139090 * 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*25cf1a30Sjl139090 #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