| /* |
| * Copyright (c) 2020 Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_DRIVERS_EDAC_IBECC_H_ |
| #define ZEPHYR_DRIVERS_EDAC_IBECC_H_ |
| |
| /* TODO: Add to include/sys/util.h */ |
| #define BITFIELD(val, h, l) (((val) & GENMASK(h, l)) >> l) |
| |
| #define PCI_VENDOR_ID_INTEL 0x8086 |
| |
| /* Supported SKU map */ |
| #define PCI_DEVICE_ID_SKU5 0x4514 |
| #define PCI_DEVICE_ID_SKU6 0x4528 |
| #define PCI_DEVICE_ID_SKU7 0x452a |
| #define PCI_DEVICE_ID_SKU8 0x4516 |
| #define PCI_DEVICE_ID_SKU9 0x452c |
| #define PCI_DEVICE_ID_SKU10 0x452e |
| #define PCI_DEVICE_ID_SKU11 0x4532 |
| #define PCI_DEVICE_ID_SKU12 0x4518 |
| #define PCI_DEVICE_ID_SKU13 0x451a |
| #define PCI_DEVICE_ID_SKU14 0x4534 |
| #define PCI_DEVICE_ID_SKU15 0x4536 |
| |
| /* TODO: Move to correct place NMI registers */ |
| |
| /* NMI Status and Control Register (NMI_STS_CNT) */ |
| #define NMI_STS_CNT_REG 0x61 |
| /* Set by any source of PCH SERR (SERR_NMI_STS) */ |
| #define NMI_STS_SRC_SERR BIT(7) |
| /* Mask for all source bits in the NMI_STS_CNT_REG */ |
| #define NMI_STS_SRC_MASK GENMASK(7, 6) |
| |
| /** |
| * Writing 1 SERR NMI are disabled and cleared, writing 0 |
| * SERR NMIs are enabled |
| */ |
| #define NMI_STS_SERR_EN BIT(2) |
| /* Mask for all enable bits in the NMI_STS_CNT_REG */ |
| #define NMI_STS_MASK_EN GENMASK(3, 0) |
| |
| /** |
| * In-Band Error Correction Code (IBECC) protects data at a cache line |
| * granularity (64 Bytes) with 16 bits SECDED code. |
| * Reports following fields: |
| * - CMI (Converged Memory Interface) Address |
| * - Syndrome |
| * - Error Type (Correctable, Uncorrectable) |
| */ |
| |
| /** |
| * PCI Configuration space registers area |
| */ |
| |
| /* Top of Upper Usable DRAM, offset 0xa8, 64 bit */ |
| #define TOUUD_REG 0x2a |
| #define TOUUD_MASK GENMASK(38, 20) |
| |
| /* Top of Low Usable DRAM, offset 0xbc, 32 bit */ |
| #define TOLUD_REG 0x2f |
| #define TOLUD_MASK GENMASK(31, 20) |
| |
| /* Total amount of physical memory, offset 0xa0, 64 bit */ |
| #define TOM_REG 0x28 |
| #define TOM_MASK GENMASK(38, 20) |
| |
| /* Base address for the Host Memory Mapped Configuration space, |
| * offset 0x48, 64 bit |
| */ |
| #define MCHBAR_REG 0x12 |
| #define MCHBAR_MASK GENMASK(38, 16) |
| #define MCHBAR_ENABLE BIT(0) |
| /* Size of Host Memory Mapped Configuration space (64K) */ |
| #define MCH_SIZE 0x10000 |
| |
| /* Capability register, offset 0xec, 32 bit */ |
| #define CAPID0_C_REG 0x3b |
| #define CAPID0_C_IBECC_ENABLED BIT(15) |
| |
| /* Register controlling reporting error SERR, offset 0xc8, 16 bit */ |
| #define ERRSTS_REG 0x32 |
| #define ERRSTS_IBECC_COR BIT(6) /* Correctable error */ |
| #define ERRSTS_IBECC_UC BIT(7) /* Uncorrectable error */ |
| |
| /* Register controlling Host Bridge responses to system errors, |
| * offset 0xca, 16 bit |
| * |
| * TODO: Fix this after PCI access is fixed, now we have to access |
| * ERRSTS_REG with 32 bit access and get this 16 bits |
| */ |
| #define ERRCMD_REG 0x32 |
| #define ERRCMD_IBECC_COR BIT(6) /* Correctable error */ |
| #define ERRCMD_IBECC_UC BIT(7) /* Uncorrectable error */ |
| |
| /** |
| * Host Memory Mapped Configuration Space (MCHBAR) registers area |
| */ |
| |
| #define CHANNEL_HASH 0x5024 |
| |
| /* ECC Injection Registers */ |
| |
| #define IBECC_INJ_ADDR_BASE 0xdd88 |
| #define INJ_ADDR_BASE_MASK GENMASK(38, 6) |
| |
| #define IBECC_INJ_ADDR_MASK 0xdd80 |
| #define INJ_ADDR_BASE_MASK_MASK GENMASK(38, 6) |
| |
| #define IBECC_INJ_ADDR_CTRL 0xdd98 |
| #define INJ_CTRL_COR 0x1 |
| #define INJ_CTRL_UC 0x5 |
| |
| /* Error Logging Registers */ |
| |
| /* ECC Error Log register, 64 bit (ECC_ERROR_LOG) */ |
| #define IBECC_ECC_ERROR_LOG 0xdd70 |
| /* Uncorrectable (Multiple-bit) Error Status (MERRSTS) */ |
| #define ECC_ERROR_MERRSTS BIT64(63) |
| /* Correctable Error Status (CERRSTS) */ |
| #define ECC_ERROR_CERRSTS BIT64(62) |
| #define ECC_ERROR_ERRTYPE(val) BITFIELD(val, 63, 62) |
| /* CMI address of the address block of main memory where error happened */ |
| #define ECC_ERROR_ERRADD(val) ((val) & GENMASK(38, 5)) |
| /* ECC Error Syndrome (ERRSYND) */ |
| #define ECC_ERROR_ERRSYND(val) BITFIELD(val, 61, 46) |
| |
| /* Parity Error Log (PARITY_ERR_LOG) */ |
| #define IBECC_PARITY_ERROR_LOG 0xdd78 |
| /* Error Status (ERRSTS) */ |
| #define PARITY_ERROR_ERRSTS BIT64(63) |
| |
| /* Memory configuration registers */ |
| |
| #define DRAM_MAX_CHANNELS 2 |
| #define DRAM_MAX_DIMMS 2 |
| |
| /* Memory channel decoding register, 32 bit */ |
| #define MAD_INTER_CHAN 0x5000 |
| #define INTER_CHAN_DDR_TYPE(v) BITFIELD(v, 2, 0) |
| /* Enhanced channel mode for LPDDR4 */ |
| #define INTER_CHAN_ECHM(v) BITFIELD(v, 3, 3) |
| /* Channel L mapping to physical channel */ |
| #define INTER_CHAN_CH_L_MAP(v) BITFIELD(v, 4, 4) |
| /* Channel S size in multiples of 0.5GB */ |
| #define INTER_CHAN_CH_S_SIZE BITFIELD(v, 19, 12) |
| |
| /* DRAM decode stage 2 registers, 32 bit */ |
| #define MAD_INTRA_CH(index) (0x5004 + index * sizeof(uint32_t)) |
| /* Virtual DIMM L mapping to physical DIMM */ |
| #define DIMM_L_MAP(v) BITFIELD(v, 0, 0) |
| |
| /* DIMM channel characteristic 2 registers, 32 bit */ |
| #define MAD_DIMM_CH(index) (0x500c + index * sizeof(uint32_t)) |
| /* Size of DIMM L in 0.5GB multiples */ |
| #define DIMM_L_SIZE(v) (BITFIELD(v, 6, 0) << 29) |
| /* DIMM L width of DDR chips (DLW) */ |
| #define DIMM_L_WIDTH(v) BITFIELD(v, 8, 7) |
| /* Size of DIMM S in 0.5GB multiples */ |
| #define DIMM_S_SIZE(v) (BITFIELD(v, 22, 16) << 29) |
| /* DIMM S width of DDR chips (DSW) */ |
| #define DIMM_S_WIDTH(v) BITFIELD(v, 25, 24) |
| |
| |
| /* MC Channel Selection register, 32 bit */ |
| #define CHANNEL_HASH 0x5024 |
| |
| /* MC Enhanced Channel Selection register, 32 bit */ |
| #define CHANNEL_EHASH 0x5028 |
| |
| struct ibecc_error { |
| uint32_t type; |
| uint64_t address; |
| uint16_t syndrome; |
| }; |
| |
| #define PCI_HOST_BRIDGE PCIE_BDF(0, 0, 0) |
| |
| #endif /* ZEPHYR_DRIVERS_EDAC_IBECC_H_ */ |