125cf1a30Sjl139090 /* 225cf1a30Sjl139090 * CDDL HEADER START 325cf1a30Sjl139090 * 425cf1a30Sjl139090 * The contents of this file are subject to the terms of the 525cf1a30Sjl139090 * Common Development and Distribution License (the "License"). 625cf1a30Sjl139090 * You may not use this file except in compliance with the License. 725cf1a30Sjl139090 * 825cf1a30Sjl139090 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 925cf1a30Sjl139090 * or http://www.opensolaris.org/os/licensing. 1025cf1a30Sjl139090 * See the License for the specific language governing permissions 1125cf1a30Sjl139090 * and limitations under the License. 1225cf1a30Sjl139090 * 1325cf1a30Sjl139090 * When distributing Covered Code, include this CDDL HEADER in each 1425cf1a30Sjl139090 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1525cf1a30Sjl139090 * If applicable, add the following below this CDDL HEADER, with the 1625cf1a30Sjl139090 * fields enclosed by brackets "[]" replaced with your own identifying 1725cf1a30Sjl139090 * information: Portions Copyright [yyyy] [name of copyright owner] 1825cf1a30Sjl139090 * 1925cf1a30Sjl139090 * CDDL HEADER END 2025cf1a30Sjl139090 */ 2125cf1a30Sjl139090 /* 22*0b240fcdSwh31274 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 2325cf1a30Sjl139090 * Use is subject to license terms. 2425cf1a30Sjl139090 */ 2525cf1a30Sjl139090 2625cf1a30Sjl139090 #ifndef _SYS_MC_OPL_H 2725cf1a30Sjl139090 #define _SYS_MC_OPL_H 2825cf1a30Sjl139090 2925cf1a30Sjl139090 #pragma ident "%Z%%M% %I% %E% SMI" 3025cf1a30Sjl139090 3125cf1a30Sjl139090 #ifdef __cplusplus 3225cf1a30Sjl139090 extern "C" { 3325cf1a30Sjl139090 #endif 3425cf1a30Sjl139090 3525cf1a30Sjl139090 #include <sys/note.h> 3625cf1a30Sjl139090 3725cf1a30Sjl139090 #ifdef DEBUG 3825cf1a30Sjl139090 #define MC_LOG if (oplmc_debug) printf 3925cf1a30Sjl139090 extern int oplmc_debug; 4025cf1a30Sjl139090 #else 4125cf1a30Sjl139090 #define MC_LOG _NOTE(CONSTANTCONDITION) if (0) printf 4225cf1a30Sjl139090 #endif 4325cf1a30Sjl139090 440cc8ae86Sav145390 #define MC_PATROL_INTERVAL_SEC 10 450cc8ae86Sav145390 460cc8ae86Sav145390 #define MC_POLL_EXIT 0x01 470cc8ae86Sav145390 4825cf1a30Sjl139090 /* 4925cf1a30Sjl139090 * load/store MAC register 5025cf1a30Sjl139090 */ 5125cf1a30Sjl139090 extern uint32_t mc_ldphysio(uint64_t); 5225cf1a30Sjl139090 extern void mc_stphysio(uint64_t, uint32_t); 5325cf1a30Sjl139090 #define LD_MAC_REG(paddr) mc_ldphysio(paddr) 5425cf1a30Sjl139090 #define ST_MAC_REG(paddr, data) mc_stphysio((paddr), (data)) 5525cf1a30Sjl139090 5625cf1a30Sjl139090 #define BANKNUM_PER_SB 8 5725cf1a30Sjl139090 580cc8ae86Sav145390 typedef struct { 590cc8ae86Sav145390 uint32_t cs_num; 600cc8ae86Sav145390 uint32_t cs_status; 610cc8ae86Sav145390 uint32_t cs_avail_hi; 620cc8ae86Sav145390 uint32_t cs_avail_low; 630cc8ae86Sav145390 uint32_t dimm_capa_hi; 640cc8ae86Sav145390 uint32_t dimm_capa_low; 650cc8ae86Sav145390 uint32_t ndimms; 660cc8ae86Sav145390 } cs_status_t; 670cc8ae86Sav145390 6825cf1a30Sjl139090 typedef struct scf_log { 6925cf1a30Sjl139090 struct scf_log *sl_next; 7025cf1a30Sjl139090 int sl_bank; 7125cf1a30Sjl139090 uint32_t sl_err_add; 7225cf1a30Sjl139090 uint32_t sl_err_log; 7325cf1a30Sjl139090 } scf_log_t; 7425cf1a30Sjl139090 750cc8ae86Sav145390 /* 760cc8ae86Sav145390 * Current max serial number size is 12, but keep enough room 770cc8ae86Sav145390 * to accomodate any future changes. 780cc8ae86Sav145390 * 790cc8ae86Sav145390 * Current max part number size is 18 + 18(Sun's partnumber + FJ's partnumber), 800cc8ae86Sav145390 * but keep enough room to accomodate any future changes. 810cc8ae86Sav145390 */ 820cc8ae86Sav145390 #define MCOPL_MAX_DIMMNAME 3 830cc8ae86Sav145390 #define MCOPL_MAX_SERIAL 20 840cc8ae86Sav145390 #define MCOPL_MAX_PARTNUM 44 850cc8ae86Sav145390 #define MCOPL_MAX_SERIALID (MCOPL_MAX_SERIAL + MCOPL_MAX_PARTNUM) 860cc8ae86Sav145390 870cc8ae86Sav145390 typedef struct mc_dimm_info { 880cc8ae86Sav145390 struct mc_dimm_info *md_next; 890cc8ae86Sav145390 char md_dimmname[MCOPL_MAX_DIMMNAME + 1]; 900cc8ae86Sav145390 char md_serial[MCOPL_MAX_SERIAL + 1]; 910cc8ae86Sav145390 char md_partnum[MCOPL_MAX_PARTNUM + 1]; 920cc8ae86Sav145390 } mc_dimm_info_t; 930cc8ae86Sav145390 94601c2e1eSdhain typedef struct mc_retry_info { 95601c2e1eSdhain struct mc_retry_info *ri_next; 96601c2e1eSdhain #define RETRY_STATE_PENDING 0 97601c2e1eSdhain #define RETRY_STATE_ACTIVE 1 98601c2e1eSdhain #define RETRY_STATE_REWRITE 2 99601c2e1eSdhain int ri_state; 100601c2e1eSdhain uint32_t ri_addr; 101601c2e1eSdhain } mc_retry_info_t; 102601c2e1eSdhain 10325cf1a30Sjl139090 typedef struct mc_opl_state { 10425cf1a30Sjl139090 struct mc_opl_state *next; 10525cf1a30Sjl139090 dev_info_t *mc_dip; 10625cf1a30Sjl139090 uint32_t mc_status; 10725cf1a30Sjl139090 #define MC_POLL_RUNNING 0x1 10825cf1a30Sjl139090 #define MC_SOFT_SUSPENDED 0x2 /* suspended by DR */ 10925cf1a30Sjl139090 #define MC_DRIVER_SUSPENDED 0x4 /* DDI_SUSPEND */ 1100cc8ae86Sav145390 #define MC_MEMORYLESS 0x8 11125cf1a30Sjl139090 uint32_t mc_board_num; /* board# */ 112aeb241b2Sav145390 uint32_t mc_phys_board_num; /* physical board# */ 11325cf1a30Sjl139090 uint64_t mc_start_address; /* sb-mem-ranges */ 11425cf1a30Sjl139090 uint64_t mc_size; 11525cf1a30Sjl139090 struct mc_bank { 11625cf1a30Sjl139090 uint32_t mcb_status; 11725cf1a30Sjl139090 #define BANK_INSTALLED 0x80000000 11825cf1a30Sjl139090 #define BANK_MIRROR_MODE 0x40000000 /* 0: normal 1: mirror */ 119601c2e1eSdhain #define BANK_REWRITE_MODE 0x10000000 120601c2e1eSdhain 12125cf1a30Sjl139090 #define BANK_PTRL_RUNNING 0x00000001 122601c2e1eSdhain 123601c2e1eSdhain #define MC_RETRY_COUNT 2 124601c2e1eSdhain mc_retry_info_t mcb_retry_infos[MC_RETRY_COUNT]; 125601c2e1eSdhain mc_retry_info_t *mcb_retry_freelist; 126601c2e1eSdhain mc_retry_info_t *mcb_retry_pending; 127601c2e1eSdhain mc_retry_info_t *mcb_active; 128601c2e1eSdhain int mcb_rewrite_count; 129601c2e1eSdhain 13025cf1a30Sjl139090 uint64_t mcb_reg_base; 13125cf1a30Sjl139090 uint32_t mcb_ptrl_cntl; 13225cf1a30Sjl139090 } mc_bank[BANKNUM_PER_SB]; 13325cf1a30Sjl139090 uchar_t mc_trans_table[2][64]; /* csX-mac-pa-trans-table */ 13425cf1a30Sjl139090 kmutex_t mc_lock; 1350cc8ae86Sav145390 scf_log_t *mc_scf_log[BANKNUM_PER_SB]; 1360cc8ae86Sav145390 scf_log_t *mc_scf_log_tail[BANKNUM_PER_SB]; 1370cc8ae86Sav145390 int mc_scf_total[BANKNUM_PER_SB]; 13825cf1a30Sjl139090 struct memlist *mlist; 13925cf1a30Sjl139090 int mc_scf_retry[BANKNUM_PER_SB]; 14025cf1a30Sjl139090 int mc_last_error; 1410cc8ae86Sav145390 /* number of times memory scanned */ 1420cc8ae86Sav145390 uint64_t mc_period[BANKNUM_PER_SB]; 1430cc8ae86Sav145390 uint32_t mc_speed; 1440cc8ae86Sav145390 int mc_speedup_period[BANKNUM_PER_SB]; 1450cc8ae86Sav145390 int mc_tick_left; 1460cc8ae86Sav145390 mc_dimm_info_t *mc_dimm_list; 14725cf1a30Sjl139090 } mc_opl_t; 14825cf1a30Sjl139090 14925cf1a30Sjl139090 #define IS_MIRROR(mcp, bn) ((mcp)->mc_bank[bn].mcb_status\ 15025cf1a30Sjl139090 & BANK_MIRROR_MODE) 15125cf1a30Sjl139090 typedef struct mc_addr { 15225cf1a30Sjl139090 int ma_bd; /* board number */ 153aeb241b2Sav145390 int ma_phys_bd; /* phyiscal board number */ 15425cf1a30Sjl139090 int ma_bank; /* bank number */ 15525cf1a30Sjl139090 uint32_t ma_dimm_addr; /* DIMM address (same format as ERR_ADD) */ 15625cf1a30Sjl139090 } mc_addr_t; 15725cf1a30Sjl139090 158738dd194Shyw typedef struct mc_rsaddr_info { /* patrol restart address/info */ 159738dd194Shyw struct mc_addr mi_restartaddr; 16025cf1a30Sjl139090 int mi_valid; 161738dd194Shyw int mi_injectrestart; 162738dd194Shyw } mc_rsaddr_info_t; 16325cf1a30Sjl139090 16425cf1a30Sjl139090 typedef struct mc_flt_stat { 16525cf1a30Sjl139090 uint32_t mf_type; /* fault type */ 1660cc8ae86Sav145390 #define FLT_TYPE_INTERMITTENT_CE 0x0001 1670cc8ae86Sav145390 #define FLT_TYPE_PERMANENT_CE 0x0002 1680cc8ae86Sav145390 #define FLT_TYPE_UE 0x0003 1690cc8ae86Sav145390 #define FLT_TYPE_SUE 0x0004 1700cc8ae86Sav145390 #define FLT_TYPE_MUE 0x0005 1710cc8ae86Sav145390 #define FLT_TYPE_CMPE 0x0006 17225cf1a30Sjl139090 uint32_t mf_cntl; /* MAC_BANKm_PTRL_CNTL Register */ 17325cf1a30Sjl139090 uint32_t mf_err_add; /* MAC_BANKm_{PTRL|MI}_ERR_ADD Register */ 17425cf1a30Sjl139090 uint32_t mf_err_log; /* MAC_BANKm_{PTRL|MI}_ERR_LOG Register */ 17525cf1a30Sjl139090 uint32_t mf_synd; 17625cf1a30Sjl139090 uchar_t mf_errlog_valid; 17725cf1a30Sjl139090 uchar_t mf_dimm_slot; 17825cf1a30Sjl139090 uchar_t mf_dram_place; 17925cf1a30Sjl139090 uint64_t mf_flt_paddr; /* faulty physical address */ 18025cf1a30Sjl139090 mc_addr_t mf_flt_maddr; /* faulty DIMM address */ 18125cf1a30Sjl139090 } mc_flt_stat_t; 18225cf1a30Sjl139090 18325cf1a30Sjl139090 typedef struct mc_aflt { 18425cf1a30Sjl139090 uint64_t mflt_id; /* gethrtime() at time of fault */ 18525cf1a30Sjl139090 mc_opl_t *mflt_mcp; /* mc-opl structure */ 18625cf1a30Sjl139090 char *mflt_erpt_class; /* ereport class name */ 18725cf1a30Sjl139090 int mflt_is_ptrl; /* detected by PTRL or MI */ 18825cf1a30Sjl139090 int mflt_nflts; /* 1 or 2 */ 18925cf1a30Sjl139090 int mflt_pr; /* page retire flags */ 19025cf1a30Sjl139090 mc_flt_stat_t *mflt_stat[2]; /* fault status */ 19125cf1a30Sjl139090 } mc_aflt_t; 19225cf1a30Sjl139090 193*0b240fcdSwh31274 typedef struct mc_flt_page { 194*0b240fcdSwh31274 uint32_t err_add; /* MAC_BANKm_{PTRL|MI}_ERR_ADD reg */ 195*0b240fcdSwh31274 uint32_t err_log; /* MAC_BANKm_{PTRL|MI}_ERR_LOG reg */ 196*0b240fcdSwh31274 uint64_t fmri_addr; /* FRU name string */ 197*0b240fcdSwh31274 uint32_t fmri_sz; /* length of FRU name +1 */ 198*0b240fcdSwh31274 } mc_flt_page_t; 199*0b240fcdSwh31274 20025cf1a30Sjl139090 #define MAC_PTRL_STAT(mcp, i) (mcp->mc_bank[i].mcb_reg_base) 20125cf1a30Sjl139090 #define MAC_PTRL_CNTL(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x10) 20225cf1a30Sjl139090 #define MAC_PTRL_ERR_ADD(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x20) 20325cf1a30Sjl139090 #define MAC_PTRL_ERR_LOG(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x24) 20425cf1a30Sjl139090 #define MAC_MI_ERR_ADD(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x28) 20525cf1a30Sjl139090 #define MAC_MI_ERR_LOG(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x2c) 20625cf1a30Sjl139090 #define MAC_STATIC_ERR_ADD(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x30) 20725cf1a30Sjl139090 #define MAC_STATIC_ERR_LOG(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x34) 20825cf1a30Sjl139090 #define MAC_RESTART_ADD(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x40) 20925cf1a30Sjl139090 #define MAC_REWRITE_ADD(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x44) 21025cf1a30Sjl139090 #define MAC_EG_ADD(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x48) 21125cf1a30Sjl139090 #define MAC_EG_CNTL(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x4c) 21225cf1a30Sjl139090 #define MAC_MIRR(mcp, i) (mcp->mc_bank[i].mcb_reg_base + 0x50) 21325cf1a30Sjl139090 21425cf1a30Sjl139090 /* use PA[37:6] */ 21525cf1a30Sjl139090 #define MAC_RESTART_PA(pa) ((pa >> 6) & 0xffffffff) 216*0b240fcdSwh31274 217*0b240fcdSwh31274 /* 218*0b240fcdSwh31274 * This is for changing MI_ERR_ADDR accuracy. 219*0b240fcdSwh31274 * Last two bits of PTRL_ERR_ADDR are always 0. 220*0b240fcdSwh31274 */ 221*0b240fcdSwh31274 #define ROUNDDOWN(a, n) (((a) & ~((n) - 1))) 222*0b240fcdSwh31274 #define MC_BOUND_BYTE 4 223*0b240fcdSwh31274 22425cf1a30Sjl139090 /* 22525cf1a30Sjl139090 * MAC_BANKm_PTRL_STAT_Register 22625cf1a30Sjl139090 */ 22725cf1a30Sjl139090 #define MAC_STAT_PTRL_CE 0x00000020 22825cf1a30Sjl139090 #define MAC_STAT_PTRL_UE 0x00000010 22925cf1a30Sjl139090 #define MAC_STAT_PTRL_CMPE 0x00000008 23025cf1a30Sjl139090 #define MAC_STAT_MI_CE 0x00000004 23125cf1a30Sjl139090 #define MAC_STAT_MI_UE 0x00000002 23225cf1a30Sjl139090 #define MAC_STAT_MI_CMPE 0x00000001 23325cf1a30Sjl139090 23425cf1a30Sjl139090 #define MAC_STAT_PTRL_ERRS (MAC_STAT_PTRL_CE|MAC_STAT_PTRL_UE\ 23525cf1a30Sjl139090 |MAC_STAT_PTRL_CMPE) 23625cf1a30Sjl139090 #define MAC_STAT_MI_ERRS (MAC_STAT_MI_CE|MAC_STAT_MI_UE\ 23725cf1a30Sjl139090 |MAC_STAT_MI_CMPE) 23825cf1a30Sjl139090 23925cf1a30Sjl139090 /* 24025cf1a30Sjl139090 * MAC_BANKm_PTRL_CTRL_Register 24125cf1a30Sjl139090 */ 24225cf1a30Sjl139090 #define MAC_CNTL_PTRL_START 0x80000000 24325cf1a30Sjl139090 #define MAC_CNTL_USE_RESTART_ADD 0x40000000 24425cf1a30Sjl139090 #define MAC_CNTL_PTRL_STOP 0x20000000 24525cf1a30Sjl139090 #define MAC_CNTL_PTRL_INTERVAL 0x1c000000 24625cf1a30Sjl139090 #define MAC_CNTL_PTRL_RESET 0x02000000 24725cf1a30Sjl139090 #define MAC_CNTL_PTRL_STATUS 0x01000000 24825cf1a30Sjl139090 #define MAC_CNTL_REW_REQ 0x00800000 24925cf1a30Sjl139090 #define MAC_CNTL_REW_RESET 0x00400000 25025cf1a30Sjl139090 #define MAC_CNTL_CS0_DEG_MODE 0x00200000 25125cf1a30Sjl139090 #define MAC_CNTL_PTRL_CE 0x00008000 25225cf1a30Sjl139090 #define MAC_CNTL_PTRL_UE 0x00004000 25325cf1a30Sjl139090 #define MAC_CNTL_PTRL_CMPE 0x00002000 25425cf1a30Sjl139090 #define MAC_CNTL_MI_CE 0x00001000 25525cf1a30Sjl139090 #define MAC_CNTL_MI_UE 0x00000800 25625cf1a30Sjl139090 #define MAC_CNTL_MI_CMPE 0x00000400 25725cf1a30Sjl139090 #define MAC_CNTL_REW_CE 0x00000200 25825cf1a30Sjl139090 #define MAC_CNTL_REW_UE 0x00000100 25925cf1a30Sjl139090 #define MAC_CNTL_REW_END 0x00000080 26025cf1a30Sjl139090 #define MAC_CNTL_PTRL_ADD_MAX 0x00000040 26125cf1a30Sjl139090 #define MAC_CNTL_REW_CMPE 0x00000020 26225cf1a30Sjl139090 2630cc8ae86Sav145390 #define MAC_CNTL_PTRL_ERR_SHIFT 13 2640cc8ae86Sav145390 #define MAC_CNTL_MI_ERR_SHIFT 10 2650cc8ae86Sav145390 26625cf1a30Sjl139090 #define MAC_CNTL_PTRL_PRESERVE_BITS (MAC_CNTL_PTRL_INTERVAL) 26725cf1a30Sjl139090 26825cf1a30Sjl139090 #define MAC_CNTL_PTRL_ERRS (MAC_CNTL_PTRL_CE|MAC_CNTL_PTRL_UE\ 26925cf1a30Sjl139090 |MAC_CNTL_PTRL_CMPE) 27025cf1a30Sjl139090 #define MAC_CNTL_MI_ERRS (MAC_CNTL_MI_CE|MAC_CNTL_MI_UE\ 27125cf1a30Sjl139090 |MAC_CNTL_MI_CMPE) 27225cf1a30Sjl139090 #define MAC_CNTL_REW_ERRS (MAC_CNTL_REW_CE|MAC_CNTL_REW_CMPE|\ 27325cf1a30Sjl139090 MAC_CNTL_REW_UE|MAC_CNTL_REW_END) 27425cf1a30Sjl139090 #define MAC_CNTL_ALL_ERRS (MAC_CNTL_PTRL_ERRS|\ 27525cf1a30Sjl139090 MAC_CNTL_MI_ERRS|MAC_CNTL_REW_ERRS) 27625cf1a30Sjl139090 27725cf1a30Sjl139090 #define MAC_ERRLOG_SYND_SHIFT 16 27825cf1a30Sjl139090 #define MAC_ERRLOG_SYND_MASK 0xffff 27925cf1a30Sjl139090 #define MAC_ERRLOG_DIMMSLOT_SHIFT 13 28025cf1a30Sjl139090 #define MAC_ERRLOG_DIMMSLOT_MASK 0x7 28125cf1a30Sjl139090 #define MAC_ERRLOG_DRAM_PLACE_SHIFT 8 28225cf1a30Sjl139090 #define MAC_ERRLOG_DRAM_PLACE_MASK 0x1f 28325cf1a30Sjl139090 28425cf1a30Sjl139090 #define MAC_SET_ERRLOG_INFO(flt_stat) \ 28525cf1a30Sjl139090 (flt_stat)->mf_errlog_valid = 1; \ 28625cf1a30Sjl139090 (flt_stat)->mf_synd = ((flt_stat)->mf_err_log >> \ 28725cf1a30Sjl139090 MAC_ERRLOG_SYND_SHIFT) & \ 28825cf1a30Sjl139090 MAC_ERRLOG_SYND_MASK; \ 28925cf1a30Sjl139090 (flt_stat)->mf_dimm_slot = ((flt_stat)->mf_err_log >> \ 29025cf1a30Sjl139090 MAC_ERRLOG_DIMMSLOT_SHIFT) & \ 29125cf1a30Sjl139090 MAC_ERRLOG_DIMMSLOT_MASK; \ 29225cf1a30Sjl139090 (flt_stat)->mf_dram_place = ((flt_stat)->mf_err_log >> \ 29325cf1a30Sjl139090 MAC_ERRLOG_DRAM_PLACE_SHIFT) & \ 29425cf1a30Sjl139090 MAC_ERRLOG_DRAM_PLACE_MASK; 29525cf1a30Sjl139090 29625cf1a30Sjl139090 extern void mc_write_cntl(mc_opl_t *, int, uint32_t); 29725cf1a30Sjl139090 #define MAC_CMD(mcp, i, cmd) mc_write_cntl(mcp, i, cmd) 29825cf1a30Sjl139090 2990cc8ae86Sav145390 #define MAC_PTRL_START(mcp, i) { if (!(ldphysio(MAC_PTRL_CNTL(mcp, i)) \ 3000cc8ae86Sav145390 & MAC_CNTL_PTRL_START)) \ 3010cc8ae86Sav145390 MAC_CMD((mcp), (i), MAC_CNTL_PTRL_START); } 3020cc8ae86Sav145390 30325cf1a30Sjl139090 #define MAC_PTRL_START_ADD(mcp, i) MAC_CMD((mcp), (i),\ 30425cf1a30Sjl139090 MAC_CNTL_PTRL_START|MAC_CNTL_USE_RESTART_ADD) 30525cf1a30Sjl139090 #define MAC_PTRL_STOP(mcp, i) MAC_CMD((mcp), (i), MAC_CNTL_PTRL_STOP) 30625cf1a30Sjl139090 #define MAC_PTRL_RESET(mcp, i) MAC_CMD((mcp), (i), MAC_CNTL_PTRL_RESET) 30725cf1a30Sjl139090 #define MAC_REW_REQ(mcp, i) MAC_CMD((mcp), (i), MAC_CNTL_REW_REQ) 30825cf1a30Sjl139090 #define MAC_REW_RESET(mcp, i) MAC_CMD((mcp), (i), MAC_CNTL_REW_RESET) 30925cf1a30Sjl139090 #define MAC_CLEAR_ERRS(mcp, i, errs) MAC_CMD((mcp), (i), errs) 31025cf1a30Sjl139090 #define MAC_CLEAR_ALL_ERRS(mcp, i) MAC_CMD((mcp), (i),\ 31125cf1a30Sjl139090 MAC_CNTL_ALL_ERRS) 31225cf1a30Sjl139090 #define MAC_CLEAR_MAX(mcp, i) \ 31325cf1a30Sjl139090 MAC_CMD((mcp), (i), MAC_CNTL_PTRL_ADD_MAX) 31425cf1a30Sjl139090 31525cf1a30Sjl139090 31625cf1a30Sjl139090 /* 31725cf1a30Sjl139090 * MAC_BANKm_PTRL/MI_ERR_ADD/LOG_Register 31825cf1a30Sjl139090 */ 31925cf1a30Sjl139090 #define MAC_ERR_ADD_INVALID 0x80000000 32025cf1a30Sjl139090 #define MAC_ERR_LOG_INVALID 0x00000080 32125cf1a30Sjl139090 32225cf1a30Sjl139090 /* 32325cf1a30Sjl139090 * MAC_BANKm_STATIC_ERR_ADD_Register 32425cf1a30Sjl139090 */ 32525cf1a30Sjl139090 #define MAC_STATIC_ERR_VLD 0x80000000 32625cf1a30Sjl139090 32725cf1a30Sjl139090 /* 32825cf1a30Sjl139090 * MAC_BANKm_MIRR_Register 32925cf1a30Sjl139090 */ 33025cf1a30Sjl139090 #define MAC_MIRR_MIRROR_MODE 0x80000000 33125cf1a30Sjl139090 #define MAC_MIRR_BANK_EXCLUSIVE 0x40000000 33225cf1a30Sjl139090 33325cf1a30Sjl139090 #define OPL_BOARD_MAX 16 33425cf1a30Sjl139090 #define OPL_BANK_MAX 8 33525cf1a30Sjl139090 336601c2e1eSdhain #define MC_SET_REWRITE_MODE(mcp, bank) \ 337601c2e1eSdhain ((mcp)->mc_bank[bank].mcb_status |= BANK_REWRITE_MODE) 338601c2e1eSdhain 339601c2e1eSdhain #define MC_CLEAR_REWRITE_MODE(mcp, bank) \ 340601c2e1eSdhain ((mcp)->mc_bank[bank].mcb_status &= ~BANK_REWRITE_MODE) 341601c2e1eSdhain 342601c2e1eSdhain #define MC_REWRITE_MODE(mcp, bank) \ 343601c2e1eSdhain ((mcp)->mc_bank[bank].mcb_status & BANK_REWRITE_MODE) 344601c2e1eSdhain 345601c2e1eSdhain #define MC_REWRITE_ACTIVE(mcp, bank) \ 346601c2e1eSdhain ((mcp)->mc_bank[bank].mcb_active) 347601c2e1eSdhain 34825cf1a30Sjl139090 /* 34925cf1a30Sjl139090 * MAC_BANKm_EG_ADD_Register 35025cf1a30Sjl139090 */ 35125cf1a30Sjl139090 #define MAC_EG_ADD_MASK 0x7ffffffc 35225cf1a30Sjl139090 /* 35325cf1a30Sjl139090 * To set the EG_CNTL register, bit[26-25] and 35425cf1a30Sjl139090 * bit[21-20] must be cleared. Then the other 35525cf1a30Sjl139090 * control bit should be set. Then the bit[26-25] 35625cf1a30Sjl139090 * and bit[21-20] should be set while other bits 35725cf1a30Sjl139090 * should be the same as before. 35825cf1a30Sjl139090 */ 35925cf1a30Sjl139090 #define MAC_EG_CNTL_MASK 0x06300000 36025cf1a30Sjl139090 36125cf1a30Sjl139090 #define MAC_EG_ADD_FIX 0x80000000 36225cf1a30Sjl139090 #define MAC_EG_FORCE_DERR00 0x40000000 36325cf1a30Sjl139090 #define MAC_EG_FORCE_DERR16 0x20000000 36425cf1a30Sjl139090 #define MAC_EG_FORCE_DERR64 0x10000000 36525cf1a30Sjl139090 #define MAC_EG_FORCE_DERR80 0x08000000 36625cf1a30Sjl139090 #define MAC_EG_DERR_ALWAYS 0x02000000 36725cf1a30Sjl139090 #define MAC_EG_DERR_ONCE 0x04000000 36825cf1a30Sjl139090 #define MAC_EG_DERR_NOP 0x06000000 36925cf1a30Sjl139090 #define MAC_EG_FORCE_READ00 0x00800000 37025cf1a30Sjl139090 #define MAC_EG_FORCE_READ16 0x00400000 37125cf1a30Sjl139090 #define MAC_EG_RDERR_ALWAYS 0x00100000 37225cf1a30Sjl139090 #define MAC_EG_RDERR_ONCE 0x00200000 37325cf1a30Sjl139090 #define MAC_EG_RDERR_NOP 0x00300000 37425cf1a30Sjl139090 37525cf1a30Sjl139090 #define MAC_EG_SETUP_MASK 0xf9cfffff 37625cf1a30Sjl139090 37725cf1a30Sjl139090 /* For MAC-PA translation */ 378738dd194Shyw #define MC_ADDRESS_BITS 40 37925cf1a30Sjl139090 #define PA_BITS_FOR_MAC 39 38025cf1a30Sjl139090 #define INDEX_OF_BANK_SUPPLEMENT_BIT 39 38125cf1a30Sjl139090 #define MP_NONE 128 38225cf1a30Sjl139090 #define MP_BANK_0 129 38325cf1a30Sjl139090 #define MP_BANK_1 130 38425cf1a30Sjl139090 #define MP_BANK_2 131 38525cf1a30Sjl139090 38625cf1a30Sjl139090 #define CS_SHIFT 29 38725cf1a30Sjl139090 #define MC_TT_ENTRIES 64 38825cf1a30Sjl139090 #define MC_TT_CS 2 38925cf1a30Sjl139090 39025cf1a30Sjl139090 39125cf1a30Sjl139090 /* export interface for error injection */ 39225cf1a30Sjl139090 extern int mc_inject_error(int error_type, uint64_t pa, uint32_t flags); 39325cf1a30Sjl139090 39425cf1a30Sjl139090 #define MC_INJECT_NOP 0x0 39525cf1a30Sjl139090 #define MC_INJECT_INTERMITTENT_CE 0x1 39625cf1a30Sjl139090 #define MC_INJECT_PERMANENT_CE 0x2 39725cf1a30Sjl139090 #define MC_INJECT_UE 0x3 39825cf1a30Sjl139090 #define MC_INJECT_INTERMITTENT_MCE 0x11 39925cf1a30Sjl139090 #define MC_INJECT_PERMANENT_MCE 0x12 40025cf1a30Sjl139090 #define MC_INJECT_SUE 0x13 40125cf1a30Sjl139090 #define MC_INJECT_MUE 0x14 40225cf1a30Sjl139090 #define MC_INJECT_CMPE 0x15 40325cf1a30Sjl139090 40425cf1a30Sjl139090 #define MC_INJECT_MIRROR_MODE 0x10 40525cf1a30Sjl139090 #define MC_INJECT_MIRROR(x) (x & MC_INJECT_MIRROR_MODE) 40625cf1a30Sjl139090 407cfb9e062Shyw #define MC_INJECT_FLAG_PREFETCH 0x1 408cfb9e062Shyw #define MC_INJECT_FLAG_NO_TRAP MC_INJECT_FLAG_PREFETCH 40925cf1a30Sjl139090 #define MC_INJECT_FLAG_RESTART 0x2 41025cf1a30Sjl139090 #define MC_INJECT_FLAG_POLL 0x4 41125cf1a30Sjl139090 #define MC_INJECT_FLAG_RESET 0x8 41225cf1a30Sjl139090 #define MC_INJECT_FLAG_OTHER 0x10 41325cf1a30Sjl139090 #define MC_INJECT_FLAG_LD 0x20 41425cf1a30Sjl139090 #define MC_INJECT_FLAG_ST 0x40 41525cf1a30Sjl139090 #define MC_INJECT_FLAG_PATH 0x80 41625cf1a30Sjl139090 417*0b240fcdSwh31274 #define MCIOC ('M' << 8) 418*0b240fcdSwh31274 #define MCIOC_FAULT_PAGE (MCIOC|1) 419*0b240fcdSwh31274 4200cc8ae86Sav145390 #ifdef DEBUG 4210cc8ae86Sav145390 4220cc8ae86Sav145390 #define MCI_NOP 0x0 4230cc8ae86Sav145390 #define MCI_CE 0x1 4240cc8ae86Sav145390 #define MCI_PERM_CE 0x2 4250cc8ae86Sav145390 #define MCI_UE 0x3 4260cc8ae86Sav145390 #define MCI_SHOW_ALL 0x4 4270cc8ae86Sav145390 #define MCI_SHOW_NONE 0x5 4280cc8ae86Sav145390 #define MCI_CMP 0x6 4290cc8ae86Sav145390 #define MCI_ALLOC 0x7 4300cc8ae86Sav145390 #define MCI_M_CE 0x8 4310cc8ae86Sav145390 #define MCI_M_PCE 0x9 4320cc8ae86Sav145390 #define MCI_M_UE 0xA 4330cc8ae86Sav145390 #define MCI_SUSPEND 0xB 4340cc8ae86Sav145390 #define MCI_RESUME 0xC 4350cc8ae86Sav145390 4360cc8ae86Sav145390 #endif 4370cc8ae86Sav145390 43825cf1a30Sjl139090 #ifdef __cplusplus 43925cf1a30Sjl139090 } 44025cf1a30Sjl139090 #endif 44125cf1a30Sjl139090 44225cf1a30Sjl139090 #endif /* _SYS_MC_OPL_H */ 443