File Index
Files and directories
Sign in
FILE

ras_umc_v12_0.h

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/amd/ras/rascore/ras_umc_v12_0.h C
  1/* SPDX-License-Identifier: MIT */
  2/*
  3 * Copyright 2025 Advanced Micro Devices, Inc.
  4 *
  5 * Permission is hereby granted, free of charge, to any person obtaining a
  6 * copy of this software and associated documentation files (the "Software"),
  7 * to deal in the Software without restriction, including without limitation
  8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9 * and/or sell copies of the Software, and to permit persons to whom the
 10 * Software is furnished to do so, subject to the following conditions:
 11 *
 12 * The above copyright notice and this permission notice shall be included in
 13 * all copies or substantial portions of the Software.
 14 *
 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 21 * OTHER DEALINGS IN THE SOFTWARE.
 22 *
 23 */
 24#ifndef __RAS_UMC_V12_0_H__
 25#define __RAS_UMC_V12_0_H__
 26#include "ras.h"
 27
 28/* MCA_UMC_UMC0_MCUMC_ADDRT0 */
 29#define MCA_UMC_UMC0_MCUMC_ADDRT0__ErrorAddr__SHIFT                0x0
 30#define MCA_UMC_UMC0_MCUMC_ADDRT0__Reserved__SHIFT                 0x38
 31#define MCA_UMC_UMC0_MCUMC_ADDRT0__ErrorAddr_MASK                  0x00FFFFFFFFFFFFFFL
 32#define MCA_UMC_UMC0_MCUMC_ADDRT0__Reserved_MASK                   0xFF00000000000000L
 33
 34/* MCMP1_IPIDT0 */
 35#define MCMP1_IPIDT0__InstanceIdLo__SHIFT                          0x0
 36#define MCMP1_IPIDT0__HardwareID__SHIFT                            0x20
 37#define MCMP1_IPIDT0__InstanceIdHi__SHIFT                          0x2c
 38#define MCMP1_IPIDT0__McaType__SHIFT                               0x30
 39
 40#define MCMP1_IPIDT0__InstanceIdLo_MASK                            0x00000000FFFFFFFFL
 41#define MCMP1_IPIDT0__HardwareID_MASK                              0x00000FFF00000000L
 42#define MCMP1_IPIDT0__InstanceIdHi_MASK                            0x0000F00000000000L
 43#define MCMP1_IPIDT0__McaType_MASK                                 0xFFFF000000000000L
 44
 45/* number of umc channel instance with memory map register access */
 46#define UMC_V12_0_CHANNEL_INSTANCE_NUM		8
 47/* number of umc instance with memory map register access */
 48#define UMC_V12_0_UMC_INSTANCE_NUM		4
 49
 50/* one piece of normalized address is mapped to 8 pieces of physical address */
 51#define UMC_V12_0_NA_MAP_PA_NUM        8
 52
 53/* bank bits in MCA error address */
 54#define UMC_V12_0_MCA_B0_BIT 6
 55#define UMC_V12_0_MCA_B1_BIT 7
 56#define UMC_V12_0_MCA_B2_BIT 8
 57#define UMC_V12_0_MCA_B3_BIT 9
 58
 59/* row bits in MCA address */
 60#define UMC_V12_0_MCA_R0_BIT 10
 61
 62/* Stack ID bits in SOC physical address */
 63#define UMC_V12_0_PA_SID1_BIT 37
 64#define UMC_V12_0_PA_SID0_BIT 36
 65
 66/* bank bits in SOC physical address */
 67#define UMC_V12_0_PA_B3_BIT 18
 68#define UMC_V12_0_PA_B2_BIT 17
 69#define UMC_V12_0_PA_B1_BIT 20
 70#define UMC_V12_0_PA_B0_BIT 19
 71
 72/* row bits in SOC physical address */
 73#define UMC_V12_0_PA_R13_BIT 35
 74#define UMC_V12_0_PA_R12_BIT 34
 75#define UMC_V12_0_PA_R11_BIT 33
 76#define UMC_V12_0_PA_R10_BIT 32
 77#define UMC_V12_0_PA_R9_BIT 31
 78#define UMC_V12_0_PA_R8_BIT 30
 79#define UMC_V12_0_PA_R7_BIT 29
 80#define UMC_V12_0_PA_R6_BIT 28
 81#define UMC_V12_0_PA_R5_BIT 27
 82#define UMC_V12_0_PA_R4_BIT 26
 83#define UMC_V12_0_PA_R3_BIT 25
 84#define UMC_V12_0_PA_R2_BIT 24
 85#define UMC_V12_0_PA_R1_BIT 23
 86#define UMC_V12_0_PA_R0_BIT 22
 87
 88/* column bits in SOC physical address */
 89#define UMC_V12_0_PA_C4_BIT 21
 90#define UMC_V12_0_PA_C3_BIT 16
 91#define UMC_V12_0_PA_C2_BIT 15
 92#define UMC_V12_0_PA_C1_BIT 6
 93#define UMC_V12_0_PA_C0_BIT 5
 94
 95/* channel index bits in SOC physical address */
 96#define UMC_V12_0_PA_CH6_BIT 14
 97#define UMC_V12_0_PA_CH5_BIT 13
 98#define UMC_V12_0_PA_CH4_BIT 12
 99#define UMC_V12_0_PA_CH3_BIT 11
100#define UMC_V12_0_PA_CH2_BIT 10
101#define UMC_V12_0_PA_CH1_BIT 9
102#define UMC_V12_0_PA_CH0_BIT 8
103
104/* Pseudochannel index bits in SOC physical address */
105#define UMC_V12_0_PA_PC0_BIT 7
106
107#define UMC_V12_0_NA_C2_BIT 8
108
109#define UMC_V12_0_SOC_PA_TO_SID(pa) \
110	((((pa >> UMC_V12_0_PA_SID0_BIT) & 0x1ULL) << 0ULL) | \
111	 (((pa >> UMC_V12_0_PA_SID1_BIT) & 0x1ULL) << 1ULL))
112
113#define UMC_V12_0_SOC_PA_TO_BANK(pa) \
114	((((pa >> UMC_V12_0_PA_B0_BIT) & 0x1ULL) << 0ULL) | \
115	 (((pa >> UMC_V12_0_PA_B1_BIT) & 0x1ULL) << 1ULL) | \
116	 (((pa >> UMC_V12_0_PA_B2_BIT) & 0x1ULL) << 2ULL) | \
117	 (((pa >> UMC_V12_0_PA_B3_BIT) & 0x1ULL) << 3ULL))
118
119#define UMC_V12_0_SOC_PA_TO_ROW(pa) \
120	((((pa >> UMC_V12_0_PA_R0_BIT) & 0x1ULL) << 0ULL) | \
121	 (((pa >> UMC_V12_0_PA_R1_BIT) & 0x1ULL) << 1ULL) | \
122	 (((pa >> UMC_V12_0_PA_R2_BIT) & 0x1ULL) << 2ULL) | \
123	 (((pa >> UMC_V12_0_PA_R3_BIT) & 0x1ULL) << 3ULL) | \
124	 (((pa >> UMC_V12_0_PA_R4_BIT) & 0x1ULL) << 4ULL) | \
125	 (((pa >> UMC_V12_0_PA_R5_BIT) & 0x1ULL) << 5ULL) | \
126	 (((pa >> UMC_V12_0_PA_R6_BIT) & 0x1ULL) << 6ULL) | \
127	 (((pa >> UMC_V12_0_PA_R7_BIT) & 0x1ULL) << 7ULL) | \
128	 (((pa >> UMC_V12_0_PA_R8_BIT) & 0x1ULL) << 8ULL) | \
129	 (((pa >> UMC_V12_0_PA_R9_BIT) & 0x1ULL) << 9ULL) | \
130	 (((pa >> UMC_V12_0_PA_R10_BIT) & 0x1ULL) << 10ULL) | \
131	 (((pa >> UMC_V12_0_PA_R11_BIT) & 0x1ULL) << 11ULL) | \
132	 (((pa >> UMC_V12_0_PA_R12_BIT) & 0x1ULL) << 12ULL) | \
133	 (((pa >> UMC_V12_0_PA_R13_BIT) & 0x1ULL) << 13ULL))
134
135#define UMC_V12_0_SOC_PA_TO_COL(pa) \
136	((((pa >> UMC_V12_0_PA_C0_BIT) & 0x1ULL) << 0ULL) | \
137	 (((pa >> UMC_V12_0_PA_C1_BIT) & 0x1ULL) << 1ULL) | \
138	 (((pa >> UMC_V12_0_PA_C2_BIT) & 0x1ULL) << 2ULL) | \
139	 (((pa >> UMC_V12_0_PA_C3_BIT) & 0x1ULL) << 3ULL) | \
140	 (((pa >> UMC_V12_0_PA_C4_BIT) & 0x1ULL) << 4ULL))
141
142#define UMC_V12_0_SOC_PA_TO_CH(pa) \
143	((((pa >> UMC_V12_0_PA_CH0_BIT) & 0x1ULL) << 0ULL) | \
144	 (((pa >> UMC_V12_0_PA_CH1_BIT) & 0x1ULL) << 1ULL) | \
145	 (((pa >> UMC_V12_0_PA_CH2_BIT) & 0x1ULL) << 2ULL) | \
146	 (((pa >> UMC_V12_0_PA_CH3_BIT) & 0x1ULL) << 3ULL) | \
147	 (((pa >> UMC_V12_0_PA_CH4_BIT) & 0x1ULL) << 4ULL) | \
148	 (((pa >> UMC_V12_0_PA_CH5_BIT) & 0x1ULL) << 5ULL) | \
149	 (((pa >> UMC_V12_0_PA_CH6_BIT) & 0x1ULL) << 6ULL))
150
151#define UMC_V12_0_SOC_PA_TO_PC(pa) (((pa >> UMC_V12_0_PA_PC0_BIT) & 0x1ULL) << 0ULL)
152
153#define UMC_V12_0_SOC_SID_TO_PA(sid) \
154	((((sid >> 0ULL) & 0x1ULL) << UMC_V12_0_PA_SID0_BIT) | \
155	 (((sid >> 1ULL) & 0x1ULL) << UMC_V12_0_PA_SID1_BIT))
156
157#define UMC_V12_0_SOC_BANK_TO_PA(bank) \
158	((((bank >> 0ULL) & 0x1ULL) << UMC_V12_0_PA_B0_BIT) | \
159	 (((bank >> 1ULL) & 0x1ULL) << UMC_V12_0_PA_B1_BIT) | \
160	 (((bank >> 2ULL) & 0x1ULL) << UMC_V12_0_PA_B2_BIT) | \
161	 (((bank >> 3ULL) & 0x1ULL) << UMC_V12_0_PA_B3_BIT))
162
163#define UMC_V12_0_SOC_ROW_TO_PA(row) \
164	((((row >> 0ULL) & 0x1ULL) << UMC_V12_0_PA_R0_BIT) | \
165	 (((row >> 1ULL) & 0x1ULL) << UMC_V12_0_PA_R1_BIT) | \
166	 (((row >> 2ULL) & 0x1ULL) << UMC_V12_0_PA_R2_BIT) | \
167	 (((row >> 3ULL) & 0x1ULL) << UMC_V12_0_PA_R3_BIT) | \
168	 (((row >> 4ULL) & 0x1ULL) << UMC_V12_0_PA_R4_BIT) | \
169	 (((row >> 5ULL) & 0x1ULL) << UMC_V12_0_PA_R5_BIT) | \
170	 (((row >> 6ULL) & 0x1ULL) << UMC_V12_0_PA_R6_BIT) | \
171	 (((row >> 7ULL) & 0x1ULL) << UMC_V12_0_PA_R7_BIT) | \
172	 (((row >> 8ULL) & 0x1ULL) << UMC_V12_0_PA_R8_BIT) | \
173	 (((row >> 9ULL) & 0x1ULL) << UMC_V12_0_PA_R9_BIT) | \
174	 (((row >> 10ULL) & 0x1ULL) << UMC_V12_0_PA_R10_BIT) | \
175	 (((row >> 11ULL) & 0x1ULL) << UMC_V12_0_PA_R11_BIT) | \
176	 (((row >> 12ULL) & 0x1ULL) << UMC_V12_0_PA_R12_BIT) | \
177	 (((row >> 13ULL) & 0x1ULL) << UMC_V12_0_PA_R13_BIT))
178
179#define UMC_V12_0_SOC_COL_TO_PA(col) \
180	((((col >> 0ULL) & 0x1ULL) << UMC_V12_0_PA_C0_BIT) | \
181	 (((col >> 1ULL) & 0x1ULL) << UMC_V12_0_PA_C1_BIT) | \
182	 (((col >> 2ULL) & 0x1ULL) << UMC_V12_0_PA_C2_BIT) | \
183	 (((col >> 3ULL) & 0x1ULL) << UMC_V12_0_PA_C3_BIT) | \
184	 (((col >> 4ULL) & 0x1ULL) << UMC_V12_0_PA_C4_BIT))
185
186#define UMC_V12_0_SOC_CH_TO_PA(ch) \
187	((((ch >> 0ULL) & 0x1ULL) << UMC_V12_0_PA_CH0_BIT) | \
188	 (((ch >> 1ULL) & 0x1ULL) << UMC_V12_0_PA_CH1_BIT) | \
189	 (((ch >> 2ULL) & 0x1ULL) << UMC_V12_0_PA_CH2_BIT) | \
190	 (((ch >> 3ULL) & 0x1ULL) << UMC_V12_0_PA_CH3_BIT) | \
191	 (((ch >> 4ULL) & 0x1ULL) << UMC_V12_0_PA_CH4_BIT) | \
192	 (((ch >> 5ULL) & 0x1ULL) << UMC_V12_0_PA_CH5_BIT) | \
193	 (((ch >> 6ULL) & 0x1ULL) << UMC_V12_0_PA_CH6_BIT))
194
195#define UMC_V12_0_SOC_PC_TO_PA(pc) (((pc >> 0ULL) & 0x1ULL) << UMC_V12_0_PA_PC0_BIT)
196
197/* bank hash settings */
198#define UMC_V12_0_XOR_EN0 1
199#define UMC_V12_0_XOR_EN1 1
200#define UMC_V12_0_XOR_EN2 1
201#define UMC_V12_0_XOR_EN3 1
202#define UMC_V12_0_COL_XOR0 0x0
203#define UMC_V12_0_COL_XOR1 0x0
204#define UMC_V12_0_COL_XOR2 0x800
205#define UMC_V12_0_COL_XOR3 0x1000
206#define UMC_V12_0_ROW_XOR0 0x11111
207#define UMC_V12_0_ROW_XOR1 0x22222
208#define UMC_V12_0_ROW_XOR2 0x4444
209#define UMC_V12_0_ROW_XOR3 0x8888
210
211/* channel hash settings */
212#define UMC_V12_0_HASH_4K 0
213#define UMC_V12_0_HASH_64K 1
214#define UMC_V12_0_HASH_2M 1
215#define UMC_V12_0_HASH_1G 1
216#define UMC_V12_0_HASH_1T 1
217
218/* XOR some bits of PA into CH4~CH6 bits (bits 12~14 of PA),
219 * hash bit is only effective when related setting is enabled
220 */
221#define UMC_V12_0_CHANNEL_HASH_CH4(channel_idx, pa) ((((channel_idx) >> 5) & 0x1) ^ \
222				(((pa)  >> 20) & 0x1ULL & UMC_V12_0_HASH_64K) ^ \
223				(((pa)  >> 27) & 0x1ULL & UMC_V12_0_HASH_2M) ^ \
224				(((pa)  >> 34) & 0x1ULL & UMC_V12_0_HASH_1G) ^ \
225				(((pa)  >> 41) & 0x1ULL & UMC_V12_0_HASH_1T))
226#define UMC_V12_0_CHANNEL_HASH_CH5(channel_idx, pa) ((((channel_idx) >> 6) & 0x1) ^ \
227				(((pa)  >> 21) & 0x1ULL & UMC_V12_0_HASH_64K) ^ \
228				(((pa)  >> 28) & 0x1ULL & UMC_V12_0_HASH_2M) ^ \
229				(((pa)  >> 35) & 0x1ULL & UMC_V12_0_HASH_1G) ^ \
230				(((pa)  >> 42) & 0x1ULL & UMC_V12_0_HASH_1T))
231#define UMC_V12_0_CHANNEL_HASH_CH6(channel_idx, pa) ((((channel_idx) >> 4) & 0x1) ^ \
232				(((pa)  >> 19) & 0x1ULL & UMC_V12_0_HASH_64K) ^ \
233				(((pa)  >> 26) & 0x1ULL & UMC_V12_0_HASH_2M) ^ \
234				(((pa)  >> 33) & 0x1ULL & UMC_V12_0_HASH_1G) ^ \
235				(((pa)  >> 40) & 0x1ULL & UMC_V12_0_HASH_1T) ^ \
236				(((pa)  >> 47) & 0x1ULL & UMC_V12_0_HASH_1T))
237#define UMC_V12_0_SET_CHANNEL_HASH(channel_idx, pa) do { \
238		(pa) &= ~(0x7ULL << UMC_V12_0_PA_CH4_BIT); \
239		(pa) |= (UMC_V12_0_CHANNEL_HASH_CH4(channel_idx, pa) << UMC_V12_0_PA_CH4_BIT); \
240		(pa) |= (UMC_V12_0_CHANNEL_HASH_CH5(channel_idx, pa) << UMC_V12_0_PA_CH5_BIT); \
241		(pa) |= (UMC_V12_0_CHANNEL_HASH_CH6(channel_idx, pa) << UMC_V12_0_PA_CH6_BIT); \
242	} while (0)
243
244
245/*
246 * (addr / 256) * 4096, the higher 26 bits in ErrorAddr
247 * is the index of 4KB block
248 */
249#define ADDR_OF_4KB_BLOCK(addr)			(((addr) & ~0xffULL) << 4)
250/*
251 * (addr / 256) * 8192, the higher 26 bits in ErrorAddr
252 * is the index of 8KB block
253 */
254#define ADDR_OF_8KB_BLOCK(addr)			(((addr) & ~0xffULL) << 5)
255/*
256 * (addr / 256) * 32768, the higher 26 bits in ErrorAddr
257 * is the index of 8KB block
258 */
259#define ADDR_OF_32KB_BLOCK(addr)			(((addr) & ~0xffULL) << 7)
260/* channel index is the index of 256B block */
261#define ADDR_OF_256B_BLOCK(channel_index)	((channel_index) << 8)
262/* offset in 256B block */
263#define OFFSET_IN_256B_BLOCK(addr)		((addr) & 0xffULL)
264
265
266#define UMC_V12_ADDR_MASK_BAD_COLS(addr) \
267	((addr) & ~((0x3ULL << UMC_V12_0_PA_C2_BIT) | \
268			(0x1ULL << UMC_V12_0_PA_C4_BIT) | \
269			(0x1ULL << UMC_V12_0_PA_R13_BIT)))
270
271#define ACA_IPID_HI_2_UMC_AID(_ipid_hi) (((_ipid_hi) >> 2) & 0x3)
272#define ACA_IPID_LO_2_UMC_CH(_ipid_lo)  \
273	(((((_ipid_lo) >> 20) & 0x1) * 4) + (((_ipid_lo) >> 12) & 0xF))
274#define ACA_IPID_LO_2_UMC_INST(_ipid_lo) (((_ipid_lo) >> 21) & 0x7)
275
276#define ACA_IPID_2_DIE_ID(ipid)  ((REG_GET_FIELD(ipid, MCMP1_IPIDT0, InstanceIdHi) >> 2) & 0x03)
277#define ACA_IPID_2_UMC_CH(ipid) \
278	(ACA_IPID_LO_2_UMC_CH(REG_GET_FIELD(ipid, MCMP1_IPIDT0, InstanceIdLo)))
279
280#define ACA_IPID_2_UMC_INST(ipid) \
281	(ACA_IPID_LO_2_UMC_INST(REG_GET_FIELD(ipid, MCMP1_IPIDT0, InstanceIdLo)))
282
283#define ACA_IPID_2_SOCKET_ID(ipid) \
284	(((REG_GET_FIELD(ipid, MCMP1_IPIDT0, InstanceIdLo) & 0x1) << 2) | \
285	 (REG_GET_FIELD(ipid, MCMP1_IPIDT0, InstanceIdHi) & 0x03))
286
287#define ACA_ADDR_2_ERR_ADDR(addr) \
288	REG_GET_FIELD(addr, MCA_UMC_UMC0_MCUMC_ADDRT0, ErrorAddr)
289
290/* R13 bit shift should be considered, double the number */
291#define UMC_V12_0_BAD_PAGE_NUM_PER_CHANNEL (UMC_V12_0_NA_MAP_PA_NUM * 2)
292
293
294/* C2, C3, C4, R13, four MCA bits are looped in page retirement */
295#define UMC_V12_0_RETIRE_LOOP_BITS 4
296
297/* invalid node instance value */
298#define UMC_INV_AID_NODE 0xffff
299
300#define UMC_V12_0_AID_NUM_MAX     4
301#define UMC_V12_0_SOCKET_NUM_MAX  8
302
303#define UMC_V12_0_TOTAL_CHANNEL_NUM \
304	(UMC_V12_0_AID_NUM_MAX * UMC_V12_0_UMC_INSTANCE_NUM * UMC_V12_0_CHANNEL_INSTANCE_NUM)
305
306/* one device has 192GB HBM */
307#define SOCKET_LFB_SIZE   0x3000000000ULL
308
309extern const struct ras_umc_ip_func ras_umc_func_v12_0;
310
311int ras_umc_get_badpage_count(struct ras_core_context *ras_core);
312int ras_umc_get_badpage_record(struct ras_core_context *ras_core, uint32_t index, void *record);
313#endif
314
~/ Read-only file preview.