1e3d60c9bSAdrian Frost /* 2e3d60c9bSAdrian Frost * CDDL HEADER START 3e3d60c9bSAdrian Frost * 4e3d60c9bSAdrian Frost * The contents of this file are subject to the terms of the 5e3d60c9bSAdrian Frost * Common Development and Distribution License (the "License"). 6e3d60c9bSAdrian Frost * You may not use this file except in compliance with the License. 7e3d60c9bSAdrian Frost * 8e3d60c9bSAdrian Frost * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9e3d60c9bSAdrian Frost * or http://www.opensolaris.org/os/licensing. 10e3d60c9bSAdrian Frost * See the License for the specific language governing permissions 11e3d60c9bSAdrian Frost * and limitations under the License. 12e3d60c9bSAdrian Frost * 13e3d60c9bSAdrian Frost * When distributing Covered Code, include this CDDL HEADER in each 14e3d60c9bSAdrian Frost * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15e3d60c9bSAdrian Frost * If applicable, add the following below this CDDL HEADER, with the 16e3d60c9bSAdrian Frost * fields enclosed by brackets "[]" replaced with your own identifying 17e3d60c9bSAdrian Frost * information: Portions Copyright [yyyy] [name of copyright owner] 18e3d60c9bSAdrian Frost * 19e3d60c9bSAdrian Frost * CDDL HEADER END 20e3d60c9bSAdrian Frost */ 21e3d60c9bSAdrian Frost 22e3d60c9bSAdrian Frost /* 23*e8ee2240SAdrian Frost * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24e3d60c9bSAdrian Frost * Use is subject to license terms. 25e3d60c9bSAdrian Frost */ 26e3d60c9bSAdrian Frost 27e3d60c9bSAdrian Frost #ifndef _INTEL_NHM_H 28e3d60c9bSAdrian Frost #define _INTEL_NHM_H 29e3d60c9bSAdrian Frost 30e3d60c9bSAdrian Frost #ifdef __cplusplus 31e3d60c9bSAdrian Frost extern "C" { 32e3d60c9bSAdrian Frost #endif 33e3d60c9bSAdrian Frost 34ee9ef9e5SAdrian Frost #define NHM_EP_CPU 0x2c408086 35ee9ef9e5SAdrian Frost #define NHM_WS_CPU 0x2c418086 36ee9ef9e5SAdrian Frost #define NHM_CPU_RAS 0x2c1a8086 3735366b93SAdrian Frost #define NHM_JF_CPU 0x2c588086 3835366b93SAdrian Frost #define NHM_JF_CPU_RAS 0x2cda8086 3935366b93SAdrian Frost #define NHM_WM_CPU 0x2c708086 4035366b93SAdrian Frost #define NHM_WM_CPU_RAS 0x2d9a8086 41ee9ef9e5SAdrian Frost 42ee9ef9e5SAdrian Frost #define NHM_INTERCONNECT "Intel QuickPath" 43e3d60c9bSAdrian Frost 44e3d60c9bSAdrian Frost #define MAX_CPU_NODES 2 45e3d60c9bSAdrian Frost #define CPU_PCI_DEVS 6 46e3d60c9bSAdrian Frost #define CPU_PCI_FUNCS 6 47e3d60c9bSAdrian Frost 48e3d60c9bSAdrian Frost #define MAX_BUS_NUMBER max_bus_number 49e3d60c9bSAdrian Frost 50e3d60c9bSAdrian Frost #define SOCKET_BUS(cpu) (MAX_BUS_NUMBER - (cpu)) 51e3d60c9bSAdrian Frost #define CPU_ID_RD(cpu) nhm_pci_getl(SOCKET_BUS(cpu), 0, 0, 0, 0) 52e3d60c9bSAdrian Frost #define MC_CONTROL_RD(cpu) \ 53e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x48, 0) 54e3d60c9bSAdrian Frost #define MC_STATUS_RD(cpu) \ 55e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x4c, 0) 56e3d60c9bSAdrian Frost #define MC_SMI_SPARE_DIMM_ERROR_STATUS_RD(cpu) \ 57e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x50, 0) 58ee9ef9e5SAdrian Frost #define MC_CPU_RAS_RD(cpu) \ 59ee9ef9e5SAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0, 0) 60e3d60c9bSAdrian Frost #define MC_SCRUB_CONTROL_RD(cpu) \ 61e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x4c, 0) 62e3d60c9bSAdrian Frost #define MC_SCRUB_CONTROL_WR(cpu, reg) nhm_pci_putl(SOCKET_BUS(cpu), 3, 2, \ 63e3d60c9bSAdrian Frost 0x4c, reg); 64e3d60c9bSAdrian Frost #define MC_SSR_CONTROL_RD(cpu) nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x48, 0) 65e3d60c9bSAdrian Frost #define MC_SSR_CONTROL_WR(cpu, reg) nhm_pci_putl(SOCKET_BUS(cpu), 3, 2, 0x48, \ 66e3d60c9bSAdrian Frost reg); 67e3d60c9bSAdrian Frost #define MC_SSR_SCRUB_CONTROL_RD(cpu) nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, \ 68e3d60c9bSAdrian Frost 0x4c, 0) 69e3d60c9bSAdrian Frost #define MC_RAS_ENABLES_RD(cpu) nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x50, 0) 70e3d60c9bSAdrian Frost #define MC_RAS_STATUS_RD(cpu) nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x54, 0) 71e3d60c9bSAdrian Frost #define MC_SSR_STATUS_RD(cpu) nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x60, 0) 72e3d60c9bSAdrian Frost #define MC_CHANNEL_MAPPER_RD(cpu) nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, \ 73e3d60c9bSAdrian Frost 0x60, 0) 74e3d60c9bSAdrian Frost #define MC_COR_ECC_CNT_RD(cpu, select) \ 75e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x80 + ((select) * 4), 0) 76e3d60c9bSAdrian Frost #define MC_CHANNEL_RANK_PRESENT_RD(cpu, channel) \ 77e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 0, 0x7c, 0) 78e3d60c9bSAdrian Frost #define MC_DOD_RD(cpu, channel, select) \ 79e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 1, 0x48 + ((select) * 4), 0) 80e3d60c9bSAdrian Frost #define MC_SAG_RD(cpu, channel, select) \ 81e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 1, 0x80 + ((select) * 4), 0) 82e3d60c9bSAdrian Frost #define MC_RIR_LIMIT_RD(cpu, channel, select) \ 83e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 2, 0x40 + ((select) * 4), 0) 84e3d60c9bSAdrian Frost #define MC_RIR_WAY_RD(cpu, channel, select) \ 85e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 2, 0x80 + ((select) * 4), 0) 86e3d60c9bSAdrian Frost #define MC_CHANNEL_DIMM_INIT_PARAMS_RD(cpu, channel) \ 87e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 0, 0x58, 0) 88e3d60c9bSAdrian Frost #define SAD_DRAM_RULE_RD(cpu, rule) \ 89e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 0, 1, 0x80 + (4 * (rule)), 0) 90e3d60c9bSAdrian Frost #define SAD_INTERLEAVE_LIST_RD(cpu, rule) \ 91e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 0, 1, 0xc0 + (4 * (rule)), 0) 92e3d60c9bSAdrian Frost #define TAD_DRAM_RULE_RD(cpu, rule) \ 93e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 1, 0x80 + (4 * (rule)), 0) 94e3d60c9bSAdrian Frost #define TAD_INTERLEAVE_LIST_RD(cpu, rule) \ 95e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 1, 0xc0 + (4 * (rule)), 0) 96e3d60c9bSAdrian Frost #define MC_DIMM_CLK_RATIO_STATUS(cpu) \ 97e3d60c9bSAdrian Frost nhm_pci_getl(SOCKET_BUS(cpu), 3, 4, 0x50, 0) 98e3d60c9bSAdrian Frost 99e3d60c9bSAdrian Frost /* 100e3d60c9bSAdrian Frost * MC_CONTROL 101e3d60c9bSAdrian Frost */ 102e3d60c9bSAdrian Frost #define MC_CONTROL_CHANNEL_ACTIVE(reg, channel) \ 103e3d60c9bSAdrian Frost ((reg) & (1 << (8 + (channel))) != 0) 104e3d60c9bSAdrian Frost #define MC_CONTROL_ECCEN(reg) (((reg) >> 1) & 1) 105e3d60c9bSAdrian Frost #define MC_CONTROL_CLOSED_PAGE(reg) ((reg) & 1) 106f899e573SVuong Nguyen #define MC_CONTROL_DIVBY3(reg) ((reg >> 6) &1) 107f899e573SVuong Nguyen 108f899e573SVuong Nguyen #define NUM_CACHELINE_BITS 6 /* Cachelines are 64B */ 109f899e573SVuong Nguyen 110e3d60c9bSAdrian Frost /* 111e3d60c9bSAdrian Frost * MC_STATUS 112e3d60c9bSAdrian Frost */ 113e3d60c9bSAdrian Frost #define CHANNEL_DISABLED(reg, channel) ((reg) & (1 << (channel))) 114ee9ef9e5SAdrian Frost #define WS_ECC_ENABLED 0x10 115e3d60c9bSAdrian Frost /* 116e3d60c9bSAdrian Frost * MC_CHANNEL_DIMM_INIT_PARAMS 117e3d60c9bSAdrian Frost */ 118e3d60c9bSAdrian Frost #define THREE_DIMMS_PRESENT (1 << 24) /* not quad rank */ 119e3d60c9bSAdrian Frost #define SINGLE_QUAD_RANK_PRESENT (1 << 23) 120e3d60c9bSAdrian Frost #define QUAD_RANK_PRESENT (1 << 22) /* 1 or 2 quad rank dimms */ 121e3d60c9bSAdrian Frost #define REGISTERED_DIMM (1 << 15) 122e3d60c9bSAdrian Frost 123e3d60c9bSAdrian Frost /* 124e3d60c9bSAdrian Frost * MC_DOD_CH 125e3d60c9bSAdrian Frost */ 126e3d60c9bSAdrian Frost #define RANKOFFSET(reg) (((reg) >> 10) & 7) 127e3d60c9bSAdrian Frost #define DIMMPRESENT(reg) (((reg) & (1 << 9)) != 0) 128e3d60c9bSAdrian Frost #define NUMBANK(reg) (((reg) & (3 << 7)) == 0 ? 4 : (((reg) >> 7) & 3) * 8) 129e3d60c9bSAdrian Frost #define NUMRANK(reg) (((reg) & (3 << 5)) == 0 ? 1 : (((reg) >> 5) & 3) * 2) 130e3d60c9bSAdrian Frost #define NUMROW(reg) ((((reg) >> 2) & 7) + 12) 131e3d60c9bSAdrian Frost #define NUMCOL(reg) (((reg) & 3) + 10) 132e3d60c9bSAdrian Frost #define DIMMWIDTH 8 133e3d60c9bSAdrian Frost #define DIMMSIZE(reg) ((1ULL << (NUMCOL(reg) + NUMROW(reg))) * NUMRANK(reg) \ 134e3d60c9bSAdrian Frost * NUMBANK(reg) * DIMMWIDTH) 135e3d60c9bSAdrian Frost 136e3d60c9bSAdrian Frost /* 137e3d60c9bSAdrian Frost * MC_SAG_CH 138e3d60c9bSAdrian Frost */ 139e3d60c9bSAdrian Frost #define DIVBY3(reg) (((reg) >> 27) & 1) /* 3 or 6 way interleave */ 140e3d60c9bSAdrian Frost #define REMOVE_6(reg) (((reg) >> 24) & 1) 141e3d60c9bSAdrian Frost #define REMOVE_7(reg) (((reg) >> 25) & 1) 142e3d60c9bSAdrian Frost #define REMOVE_8(reg) (((reg) >> 26) & 1) 143e3d60c9bSAdrian Frost #define CH_ADDRESS_OFFSET(reg) \ 144f899e573SVuong Nguyen (int64_t)((uint64_t)(reg) & 0x00ffffff) 145f899e573SVuong Nguyen #define CH_ADDRESS_SOFFSET(reg) \ 146f899e573SVuong Nguyen ((int64_t)(((uint64_t)(reg) & 0x00ffffff) << 40) >>40) 147f899e573SVuong Nguyen /* SAG offset covers SA[39:16] so granularity is 2^16 = 64KB */ 148f899e573SVuong Nguyen #define SAG_OFFSET_GRANULARITY 16 149f899e573SVuong Nguyen /* 24-bit mask for TTMAD_CR_SAG_CH*.OFFSET */ 150f899e573SVuong Nguyen #define SAG_OFFSET_SIZE_MASK 0xffffffULL 151f899e573SVuong Nguyen /* 16-bit mask for lower bits not covered by CREG value (SA[15:0]) */ 152f899e573SVuong Nguyen #define SAG_OFFSET_ADDR_MASK 0xffffULL 153f899e573SVuong Nguyen #define CACHELINE_ADDR_MASK 0x3fULL /* 6-bit mask */ 154f899e573SVuong Nguyen 155e3d60c9bSAdrian Frost /* 156e3d60c9bSAdrian Frost * MC_RIR_LIMIT_CH 157e3d60c9bSAdrian Frost */ 158e3d60c9bSAdrian Frost #define RIR_LIMIT(reg) ((((uint64_t)(reg) & 0x000003ff) + 1) << 28) 159e3d60c9bSAdrian Frost /* 160e3d60c9bSAdrian Frost * MC_RIR_WAY_CH 161e3d60c9bSAdrian Frost */ 162f899e573SVuong Nguyen #define RIR_OFFSET(reg) (int64_t)((uint64_t)(reg >> 4)& 0x3ff) 163f899e573SVuong Nguyen #define RIR_SOFFSET(reg) ((int64_t)(((uint64_t)(reg) & 0x3ff0) << 50) \ 164f899e573SVuong Nguyen >> 54) 165f899e573SVuong Nguyen #define RIR_DIMM_RANK(reg) ((reg) & 0xf) 166f899e573SVuong Nguyen #define RIR_RANK(reg) ((reg) & 0x3) 167f899e573SVuong Nguyen #define RIR_DIMM(reg) ((reg)>>2 & 0x03) 168f899e573SVuong Nguyen #define RIR_OFFSET_SIZE_MASK 0x3ff 169e3d60c9bSAdrian Frost 170e3d60c9bSAdrian Frost #define MAX_RIR_WAY 4 171e3d60c9bSAdrian Frost 172f899e573SVuong Nguyen #define RIR_LIMIT_GRANULARITY 28 173f899e573SVuong Nguyen #define RIR_OFFSET_ADDR_MASK 0xfffffffULL /* 28-bit mask */ 174f899e573SVuong Nguyen #define RIR_INTLV_PGOPEN_BIT 12 /* Rank interleaving */ 175f899e573SVuong Nguyen #define RIR_INTLV_PGOPEN_MASK 0xfffULL /* 12-bit mask */ 176f899e573SVuong Nguyen #define RIR_INTLV_PGCLS_BIT 6 /* Rank interleaving */ 177f899e573SVuong Nguyen #define RIR_INTLV_PGCLS_MASK 0x3fULL /* 6-bit mask */ 178f899e573SVuong Nguyen #define RIR_INTLV_SIZE_MASK 0x3ULL 179e3d60c9bSAdrian Frost /* 180e3d60c9bSAdrian Frost * MC_RAS_ENABLES 181e3d60c9bSAdrian Frost */ 182e3d60c9bSAdrian Frost #define RAS_LOCKSTEP_ENABLE(reg) (((reg) & 2) != 0) 183e3d60c9bSAdrian Frost #define RAS_MIRROR_MEM_ENABLE(reg) (((reg) & 1) != 0) 184e3d60c9bSAdrian Frost /* 185e3d60c9bSAdrian Frost * MC_RAS_STATUS 186e3d60c9bSAdrian Frost */ 187e3d60c9bSAdrian Frost #define REDUNDANCY_LOSS(reg) (((reg) & 1) != 0) 188e3d60c9bSAdrian Frost /* 189e3d60c9bSAdrian Frost * MC_SSRSTATUS 190e3d60c9bSAdrian Frost */ 191e3d60c9bSAdrian Frost #define SPAREING_IN_PROGRESS(reg) (((reg) & 2) != 0) 192e3d60c9bSAdrian Frost #define SPAREING_COMPLETE(reg) (((reg) & 1) != 0) 193e3d60c9bSAdrian Frost 194e3d60c9bSAdrian Frost /* 195e3d60c9bSAdrian Frost * MC_SSR_CONTROL 196e3d60c9bSAdrian Frost */ 197e3d60c9bSAdrian Frost #define SSR_MODE(reg) ((reg) & 3) 198e3d60c9bSAdrian Frost #define SSR_IDLE 0 199e3d60c9bSAdrian Frost #define SSR_SCRUB 1 200e3d60c9bSAdrian Frost #define SSR_SPARE 2 201e3d60c9bSAdrian Frost #define DEMAND_SCRUB_ENABLE (1 << 6) 202e3d60c9bSAdrian Frost /* 203e3d60c9bSAdrian Frost * MC_SCRUB_CONTROL 204e3d60c9bSAdrian Frost */ 205e3d60c9bSAdrian Frost #define STARTSCRUB (1 << 24) 206e3d60c9bSAdrian Frost /* 207e3d60c9bSAdrian Frost * MC_DIMM_CLK_RATIO_STATUS 208e3d60c9bSAdrian Frost */ 209e3d60c9bSAdrian Frost #define MAX_DIMM_CLK_RATIO(reg) (((reg) >> 24) & 0x1f) 210e3d60c9bSAdrian Frost /* 211e3d60c9bSAdrian Frost * MC_SMI_SPARE_DIMM_ERROR_STATUS_RD 212e3d60c9bSAdrian Frost */ 213e3d60c9bSAdrian Frost #define REDUNDANCY_LOSS_FAILING_DIMM(status) (((status) >> 12) & 3) 214e3d60c9bSAdrian Frost #define DIMM_ERROR_OVERFLOW_STATUS(status) ((status) & 0xfff) 215e3d60c9bSAdrian Frost 216e3d60c9bSAdrian Frost #define MAX_MEMORY_CONTROLLERS MAX_CPU_NODES 217e3d60c9bSAdrian Frost #define CHANNELS_PER_MEMORY_CONTROLLER 3 218e3d60c9bSAdrian Frost #define MAX_DIMMS_PER_CHANNEL 3 219e3d60c9bSAdrian Frost 220e3d60c9bSAdrian Frost /* 221e3d60c9bSAdrian Frost * SAD_DRAM_RULE 222e3d60c9bSAdrian Frost */ 223e3d60c9bSAdrian Frost #define SAD_DRAM_LIMIT(sad) ((((uint64_t)(sad) & 0x000fffc0ULL) + 0x40) << 20) 224e3d60c9bSAdrian Frost #define SAD_DRAM_MODE(sad) (((sad) >> 1) & 3) 225e3d60c9bSAdrian Frost #define SAD_DRAM_RULE_ENABLE(sad) ((sad) & 1) 226e3d60c9bSAdrian Frost 227f899e573SVuong Nguyen /* 228f899e573SVuong Nguyen * from SAD_DRAM_RULE*.MODE 229f899e573SVuong Nguyen */ 230f899e573SVuong Nguyen #define DIRECT 0 231f899e573SVuong Nguyen #define XOR 1 232f899e573SVuong Nguyen #define MOD3 2 233f899e573SVuong Nguyen #define SAD_INTERLEAVE(list, num) (((list) >> ((num) * 4)) & 0x3) 234f899e573SVuong Nguyen #define INTERLEAVE_NWAY 8 235f899e573SVuong Nguyen #define MAX_SAD_DRAM_RULE 8 236f899e573SVuong Nguyen 237f899e573SVuong Nguyen #define SAD_LIMIT_GRANULARITY 26 238f899e573SVuong Nguyen #define SAD_LIMIT_ADDR_MASK 0x3ffffffULL 239f899e573SVuong Nguyen #define SAD_INTLV_DIRECT_BIT 6 240f899e573SVuong Nguyen #define SAD_INTLV_XOR_BIT 16 241f899e573SVuong Nguyen #define SAD_INTLV_SIZE_MASK 0x7ULL 242f899e573SVuong Nguyen #define SAD_INTLV_ADDR_MASK 0x3fULL 243e3d60c9bSAdrian Frost 244e3d60c9bSAdrian Frost /* 245e3d60c9bSAdrian Frost * TAD_DRAM_RULE 246e3d60c9bSAdrian Frost */ 247e3d60c9bSAdrian Frost #define TAD_DRAM_LIMIT(tad) ((((uint64_t)(tad) & 0x000fffc0ULL) + 0x40) << 20) 248e3d60c9bSAdrian Frost #define TAD_DRAM_MODE(tad) (((tad) >> 1) & 3) 249e3d60c9bSAdrian Frost #define TAD_DRAM_RULE_ENABLE(tad) ((tad) & 1) 250e3d60c9bSAdrian Frost 251e3d60c9bSAdrian Frost #define TAD_INTERLEAVE(list, channel) (((list) >> ((channel) * 4)) & 3) 252e3d60c9bSAdrian Frost 253e3d60c9bSAdrian Frost #define MAX_TAD_DRAM_RULE 8 254e3d60c9bSAdrian Frost 255*e8ee2240SAdrian Frost #define VRANK_SZ 0x10000000 256e3d60c9bSAdrian Frost 257f899e573SVuong Nguyen typedef struct sad { 258f899e573SVuong Nguyen uint64_t limit; 259f899e573SVuong Nguyen uint32_t node_list; 260f899e573SVuong Nguyen uint32_t node_tgt[INTERLEAVE_NWAY]; 261f899e573SVuong Nguyen char mode; 262f899e573SVuong Nguyen char enable; 263f899e573SVuong Nguyen char interleave; 264f899e573SVuong Nguyen } sad_t; 265f899e573SVuong Nguyen 266f899e573SVuong Nguyen typedef struct tad { 267f899e573SVuong Nguyen uint64_t limit; 268f899e573SVuong Nguyen uint32_t pkg_list; 269f899e573SVuong Nguyen uint32_t pkg_tgt[INTERLEAVE_NWAY]; 270f899e573SVuong Nguyen char mode; 271f899e573SVuong Nguyen char enable; 272f899e573SVuong Nguyen char interleave; 273f899e573SVuong Nguyen } tad_t; 274f899e573SVuong Nguyen 275f899e573SVuong Nguyen typedef struct sag_ch { 276f899e573SVuong Nguyen uint32_t offset; 277f899e573SVuong Nguyen int32_t soffset; 278f899e573SVuong Nguyen char divby3; 279f899e573SVuong Nguyen char remove6; 280f899e573SVuong Nguyen char remove7; 281f899e573SVuong Nguyen char remove8; 282f899e573SVuong Nguyen } sag_ch_t; 283f899e573SVuong Nguyen 284f899e573SVuong Nguyen typedef struct rir_way { 285f899e573SVuong Nguyen uint16_t offset; 286f899e573SVuong Nguyen int16_t soffset; 287f899e573SVuong Nguyen uint8_t rank; 288f899e573SVuong Nguyen uint8_t dimm; 289f899e573SVuong Nguyen uint8_t dimm_rank; 290f899e573SVuong Nguyen uint64_t rlimit; 291f899e573SVuong Nguyen } way_t; 292f899e573SVuong Nguyen 293f899e573SVuong Nguyen typedef struct rir { 294f899e573SVuong Nguyen uint64_t limit; 295f899e573SVuong Nguyen way_t way[MAX_RIR_WAY]; 296f899e573SVuong Nguyen char interleave; 297f899e573SVuong Nguyen } rir_t; 298f899e573SVuong Nguyen 299f899e573SVuong Nguyen typedef struct dod_type { 300f899e573SVuong Nguyen int NUMCol; 301f899e573SVuong Nguyen int NUMRow; 302f899e573SVuong Nguyen int NUMRank; 303f899e573SVuong Nguyen int NUMBank; 304f899e573SVuong Nguyen int DIMMPresent; 305f899e573SVuong Nguyen int RankOffset; 306f899e573SVuong Nguyen } dod_t; 307f899e573SVuong Nguyen 308e3d60c9bSAdrian Frost /* 309e3d60c9bSAdrian Frost * MC_CHANNEL_MAPPER 310e3d60c9bSAdrian Frost */ 311e3d60c9bSAdrian Frost #define CHANNEL_MAP(reg, channel, write) (((reg) >> ((channel) * 6 + \ 312e3d60c9bSAdrian Frost ((write) ? 0 : 3))) & 7) 313e3d60c9bSAdrian Frost 314e3d60c9bSAdrian Frost extern int max_bus_number; 315e3d60c9bSAdrian Frost 316e3d60c9bSAdrian Frost #ifdef __cplusplus 317e3d60c9bSAdrian Frost } 318e3d60c9bSAdrian Frost #endif 319e3d60c9bSAdrian Frost 320e3d60c9bSAdrian Frost #endif /* _INTEL_NHM_H */ 321