xref: /linux/drivers/gpu/drm/amd/amdgpu/amdgpu_reg_access.c (revision 38f7e5450ebfc6f2e046a249a3f629ea7bec8c31)
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 #include <linux/delay.h>
25 
26 #include "amdgpu.h"
27 #include "amdgpu_reset.h"
28 #include "amdgpu_trace.h"
29 #include "amdgpu_virt.h"
30 #include "amdgpu_reg_access.h"
31 
32 #define AMDGPU_PCIE_INDEX_FALLBACK (0x38 >> 2)
33 #define AMDGPU_PCIE_INDEX_HI_FALLBACK (0x44 >> 2)
34 #define AMDGPU_PCIE_DATA_FALLBACK (0x3C >> 2)
35 
36 void amdgpu_reg_access_init(struct amdgpu_device *adev)
37 {
38 	spin_lock_init(&adev->reg.smc.lock);
39 	adev->reg.smc.rreg = NULL;
40 	adev->reg.smc.wreg = NULL;
41 
42 	spin_lock_init(&adev->reg.uvd_ctx.lock);
43 	adev->reg.uvd_ctx.rreg = NULL;
44 	adev->reg.uvd_ctx.wreg = NULL;
45 
46 	spin_lock_init(&adev->reg.didt.lock);
47 	adev->reg.didt.rreg = NULL;
48 	adev->reg.didt.wreg = NULL;
49 
50 	spin_lock_init(&adev->reg.gc_cac.lock);
51 	adev->reg.gc_cac.rreg = NULL;
52 	adev->reg.gc_cac.wreg = NULL;
53 
54 	spin_lock_init(&adev->reg.se_cac.lock);
55 	adev->reg.se_cac.rreg = NULL;
56 	adev->reg.se_cac.wreg = NULL;
57 
58 	spin_lock_init(&adev->reg.audio_endpt.lock);
59 	adev->reg.audio_endpt.rreg = NULL;
60 	adev->reg.audio_endpt.wreg = NULL;
61 
62 	spin_lock_init(&adev->reg.pcie.lock);
63 	adev->reg.pcie.rreg = NULL;
64 	adev->reg.pcie.wreg = NULL;
65 	adev->reg.pcie.rreg_ext = NULL;
66 	adev->reg.pcie.wreg_ext = NULL;
67 	adev->reg.pcie.rreg64 = NULL;
68 	adev->reg.pcie.wreg64 = NULL;
69 	adev->reg.pcie.rreg64_ext = NULL;
70 	adev->reg.pcie.wreg64_ext = NULL;
71 	adev->reg.pcie.port_rreg = NULL;
72 	adev->reg.pcie.port_wreg = NULL;
73 }
74 
75 uint32_t amdgpu_reg_smc_rd32(struct amdgpu_device *adev, uint32_t reg)
76 {
77 	if (!adev->reg.smc.rreg) {
78 		dev_err_once(adev->dev, "SMC register read not supported\n");
79 		return 0;
80 	}
81 	return adev->reg.smc.rreg(adev, reg);
82 }
83 
84 void amdgpu_reg_smc_wr32(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
85 {
86 	if (!adev->reg.smc.wreg) {
87 		dev_err_once(adev->dev, "SMC register write not supported\n");
88 		return;
89 	}
90 	adev->reg.smc.wreg(adev, reg, v);
91 }
92 
93 uint32_t amdgpu_reg_uvd_ctx_rd32(struct amdgpu_device *adev, uint32_t reg)
94 {
95 	if (!adev->reg.uvd_ctx.rreg) {
96 		dev_err_once(adev->dev,
97 			     "UVD_CTX register read not supported\n");
98 		return 0;
99 	}
100 	return adev->reg.uvd_ctx.rreg(adev, reg);
101 }
102 
103 void amdgpu_reg_uvd_ctx_wr32(struct amdgpu_device *adev, uint32_t reg,
104 			     uint32_t v)
105 {
106 	if (!adev->reg.uvd_ctx.wreg) {
107 		dev_err_once(adev->dev,
108 			     "UVD_CTX register write not supported\n");
109 		return;
110 	}
111 	adev->reg.uvd_ctx.wreg(adev, reg, v);
112 }
113 
114 uint32_t amdgpu_reg_didt_rd32(struct amdgpu_device *adev, uint32_t reg)
115 {
116 	if (!adev->reg.didt.rreg) {
117 		dev_err_once(adev->dev, "DIDT register read not supported\n");
118 		return 0;
119 	}
120 	return adev->reg.didt.rreg(adev, reg);
121 }
122 
123 void amdgpu_reg_didt_wr32(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
124 {
125 	if (!adev->reg.didt.wreg) {
126 		dev_err_once(adev->dev, "DIDT register write not supported\n");
127 		return;
128 	}
129 	adev->reg.didt.wreg(adev, reg, v);
130 }
131 
132 uint32_t amdgpu_reg_gc_cac_rd32(struct amdgpu_device *adev, uint32_t reg)
133 {
134 	if (!adev->reg.gc_cac.rreg) {
135 		dev_err_once(adev->dev, "GC_CAC register read not supported\n");
136 		return 0;
137 	}
138 	return adev->reg.gc_cac.rreg(adev, reg);
139 }
140 
141 void amdgpu_reg_gc_cac_wr32(struct amdgpu_device *adev, uint32_t reg,
142 			    uint32_t v)
143 {
144 	if (!adev->reg.gc_cac.wreg) {
145 		dev_err_once(adev->dev,
146 			     "GC_CAC register write not supported\n");
147 		return;
148 	}
149 	adev->reg.gc_cac.wreg(adev, reg, v);
150 }
151 
152 uint32_t amdgpu_reg_se_cac_rd32(struct amdgpu_device *adev, uint32_t reg)
153 {
154 	if (!adev->reg.se_cac.rreg) {
155 		dev_err_once(adev->dev, "SE_CAC register read not supported\n");
156 		return 0;
157 	}
158 	return adev->reg.se_cac.rreg(adev, reg);
159 }
160 
161 void amdgpu_reg_se_cac_wr32(struct amdgpu_device *adev, uint32_t reg,
162 			    uint32_t v)
163 {
164 	if (!adev->reg.se_cac.wreg) {
165 		dev_err_once(adev->dev,
166 			     "SE_CAC register write not supported\n");
167 		return;
168 	}
169 	adev->reg.se_cac.wreg(adev, reg, v);
170 }
171 
172 uint32_t amdgpu_reg_audio_endpt_rd32(struct amdgpu_device *adev, uint32_t block,
173 				     uint32_t reg)
174 {
175 	if (!adev->reg.audio_endpt.rreg) {
176 		dev_err_once(adev->dev,
177 			     "AUDIO_ENDPT register read not supported\n");
178 		return 0;
179 	}
180 	return adev->reg.audio_endpt.rreg(adev, block, reg);
181 }
182 
183 void amdgpu_reg_audio_endpt_wr32(struct amdgpu_device *adev, uint32_t block,
184 				 uint32_t reg, uint32_t v)
185 {
186 	if (!adev->reg.audio_endpt.wreg) {
187 		dev_err_once(adev->dev,
188 			     "AUDIO_ENDPT register write not supported\n");
189 		return;
190 	}
191 	adev->reg.audio_endpt.wreg(adev, block, reg, v);
192 }
193 
194 uint32_t amdgpu_reg_pcie_rd32(struct amdgpu_device *adev, uint32_t reg)
195 {
196 	if (!adev->reg.pcie.rreg) {
197 		dev_err_once(adev->dev, "PCIE register read not supported\n");
198 		return 0;
199 	}
200 	return adev->reg.pcie.rreg(adev, reg);
201 }
202 
203 void amdgpu_reg_pcie_wr32(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
204 {
205 	if (!adev->reg.pcie.wreg) {
206 		dev_err_once(adev->dev, "PCIE register write not supported\n");
207 		return;
208 	}
209 	adev->reg.pcie.wreg(adev, reg, v);
210 }
211 
212 uint32_t amdgpu_reg_pcie_ext_rd32(struct amdgpu_device *adev, uint64_t reg)
213 {
214 	if (!adev->reg.pcie.rreg_ext) {
215 		dev_err_once(adev->dev, "PCIE EXT register read not supported\n");
216 		return 0;
217 	}
218 	return adev->reg.pcie.rreg_ext(adev, reg);
219 }
220 
221 void amdgpu_reg_pcie_ext_wr32(struct amdgpu_device *adev, uint64_t reg,
222 			      uint32_t v)
223 {
224 	if (!adev->reg.pcie.wreg_ext) {
225 		dev_err_once(adev->dev, "PCIE EXT register write not supported\n");
226 		return;
227 	}
228 	adev->reg.pcie.wreg_ext(adev, reg, v);
229 }
230 
231 uint64_t amdgpu_reg_pcie_rd64(struct amdgpu_device *adev, uint32_t reg)
232 {
233 	if (!adev->reg.pcie.rreg64) {
234 		dev_err_once(adev->dev, "PCIE 64-bit register read not supported\n");
235 		return 0;
236 	}
237 	return adev->reg.pcie.rreg64(adev, reg);
238 }
239 
240 void amdgpu_reg_pcie_wr64(struct amdgpu_device *adev, uint32_t reg, uint64_t v)
241 {
242 	if (!adev->reg.pcie.wreg64) {
243 		dev_err_once(adev->dev, "PCIE 64-bit register write not supported\n");
244 		return;
245 	}
246 	adev->reg.pcie.wreg64(adev, reg, v);
247 }
248 
249 uint64_t amdgpu_reg_pcie_ext_rd64(struct amdgpu_device *adev, uint64_t reg)
250 {
251 	if (!adev->reg.pcie.rreg64_ext) {
252 		dev_err_once(adev->dev, "PCIE EXT 64-bit register read not supported\n");
253 		return 0;
254 	}
255 	return adev->reg.pcie.rreg64_ext(adev, reg);
256 }
257 
258 void amdgpu_reg_pcie_ext_wr64(struct amdgpu_device *adev, uint64_t reg,
259 			      uint64_t v)
260 {
261 	if (!adev->reg.pcie.wreg64_ext) {
262 		dev_err_once(adev->dev, "PCIE EXT 64-bit register write not supported\n");
263 		return;
264 	}
265 	adev->reg.pcie.wreg64_ext(adev, reg, v);
266 }
267 
268 uint32_t amdgpu_reg_pciep_rd32(struct amdgpu_device *adev, uint32_t reg)
269 {
270 	if (!adev->reg.pcie.port_rreg) {
271 		dev_err_once(adev->dev, "PCIEP register read not supported\n");
272 		return 0;
273 	}
274 	return adev->reg.pcie.port_rreg(adev, reg);
275 }
276 
277 void amdgpu_reg_pciep_wr32(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
278 {
279 	if (!adev->reg.pcie.port_wreg) {
280 		dev_err_once(adev->dev, "PCIEP register write not supported\n");
281 		return;
282 	}
283 	adev->reg.pcie.port_wreg(adev, reg, v);
284 }
285 
286 static int amdgpu_reg_get_smn_base_version(struct amdgpu_device *adev)
287 {
288 	struct pci_dev *pdev = adev->pdev;
289 	int id;
290 
291 	if (amdgpu_sriov_vf(adev))
292 		return -EOPNOTSUPP;
293 
294 	id = (pdev->device >> 4) & 0xFFFF;
295 	if (id == 0x74A || id == 0x74B || id == 0x75A || id == 0x75B)
296 		return 1;
297 
298 	return -EOPNOTSUPP;
299 }
300 
301 uint64_t amdgpu_reg_get_smn_base64(struct amdgpu_device *adev,
302 				   enum amd_hw_ip_block_type block,
303 				   int die_inst)
304 {
305 	if (!adev->reg.smn.get_smn_base) {
306 		int version = amdgpu_reg_get_smn_base_version(adev);
307 		switch (version) {
308 		case 1:
309 			return amdgpu_reg_smn_v1_0_get_base(adev, block,
310 							    die_inst);
311 		default:
312 			dev_err_once(
313 				adev->dev,
314 				"SMN base address query not supported for this device\n");
315 			return 0;
316 		}
317 		return 0;
318 	}
319 	return adev->reg.smn.get_smn_base(adev, block, die_inst);
320 }
321 
322 uint64_t amdgpu_reg_smn_v1_0_get_base(struct amdgpu_device *adev,
323 				      enum amd_hw_ip_block_type block,
324 				      int die_inst)
325 {
326 	uint64_t smn_base;
327 
328 	if (die_inst == 0)
329 		return 0;
330 
331 	switch (block) {
332 	case XGMI_HWIP:
333 	case NBIO_HWIP:
334 	case MP0_HWIP:
335 	case UMC_HWIP:
336 	case DF_HWIP:
337 		smn_base = ((uint64_t)(die_inst & 0x3) << 32) | (1ULL << 34);
338 		break;
339 	default:
340 		dev_warn_once(
341 			adev->dev,
342 			"SMN base address query not supported for this block %d\n",
343 			block);
344 		smn_base = 0;
345 		break;
346 	}
347 
348 	return smn_base;
349 }
350 
351 /*
352  * register access helper functions.
353  */
354 
355 /**
356  * amdgpu_device_rreg - read a memory mapped IO or indirect register
357  *
358  * @adev: amdgpu_device pointer
359  * @reg: dword aligned register offset
360  * @acc_flags: access flags which require special behavior
361  *
362  * Returns the 32 bit value from the offset specified.
363  */
364 uint32_t amdgpu_device_rreg(struct amdgpu_device *adev, uint32_t reg,
365 			    uint32_t acc_flags)
366 {
367 	uint32_t ret;
368 
369 	if (amdgpu_device_skip_hw_access(adev))
370 		return 0;
371 
372 	if ((reg * 4) < adev->rmmio_size) {
373 		if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
374 		    amdgpu_sriov_runtime(adev) &&
375 		    down_read_trylock(&adev->reset_domain->sem)) {
376 			ret = amdgpu_kiq_rreg(adev, reg, 0);
377 			up_read(&adev->reset_domain->sem);
378 		} else {
379 			ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
380 		}
381 	} else {
382 		ret = amdgpu_reg_pcie_rd32(adev, reg * 4);
383 	}
384 
385 	trace_amdgpu_device_rreg(adev->pdev->device, reg, ret);
386 
387 	return ret;
388 }
389 
390 /*
391  * MMIO register read with bytes helper functions
392  * @offset:bytes offset from MMIO start
393  */
394 
395 /**
396  * amdgpu_mm_rreg8 - read a memory mapped IO register
397  *
398  * @adev: amdgpu_device pointer
399  * @offset: byte aligned register offset
400  *
401  * Returns the 8 bit value from the offset specified.
402  */
403 uint8_t amdgpu_mm_rreg8(struct amdgpu_device *adev, uint32_t offset)
404 {
405 	if (amdgpu_device_skip_hw_access(adev))
406 		return 0;
407 
408 	if (offset < adev->rmmio_size)
409 		return (readb(adev->rmmio + offset));
410 	BUG();
411 }
412 
413 /**
414  * amdgpu_device_xcc_rreg - read a memory mapped IO or indirect register with specific XCC
415  *
416  * @adev: amdgpu_device pointer
417  * @reg: dword aligned register offset
418  * @acc_flags: access flags which require special behavior
419  * @xcc_id: xcc accelerated compute core id
420  *
421  * Returns the 32 bit value from the offset specified.
422  */
423 uint32_t amdgpu_device_xcc_rreg(struct amdgpu_device *adev, uint32_t reg,
424 				uint32_t acc_flags, uint32_t xcc_id)
425 {
426 	uint32_t ret, rlcg_flag;
427 
428 	if (amdgpu_device_skip_hw_access(adev))
429 		return 0;
430 
431 	if ((reg * 4) < adev->rmmio_size) {
432 		if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_runtime(adev) &&
433 		    adev->gfx.rlc.rlcg_reg_access_supported &&
434 		    amdgpu_virt_get_rlcg_reg_access_flag(
435 			    adev, acc_flags, GC_HWIP, false, &rlcg_flag)) {
436 			ret = amdgpu_virt_rlcg_reg_rw(adev, reg, 0, rlcg_flag,
437 						      GET_INST(GC, xcc_id));
438 		} else if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
439 			   amdgpu_sriov_runtime(adev) &&
440 			   down_read_trylock(&adev->reset_domain->sem)) {
441 			ret = amdgpu_kiq_rreg(adev, reg, xcc_id);
442 			up_read(&adev->reset_domain->sem);
443 		} else {
444 			ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
445 		}
446 	} else {
447 		ret = amdgpu_reg_pcie_rd32(adev, reg * 4);
448 	}
449 
450 	return ret;
451 }
452 
453 /*
454  * MMIO register write with bytes helper functions
455  * @offset:bytes offset from MMIO start
456  * @value: the value want to be written to the register
457  */
458 
459 /**
460  * amdgpu_mm_wreg8 - read a memory mapped IO register
461  *
462  * @adev: amdgpu_device pointer
463  * @offset: byte aligned register offset
464  * @value: 8 bit value to write
465  *
466  * Writes the value specified to the offset specified.
467  */
468 void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value)
469 {
470 	if (amdgpu_device_skip_hw_access(adev))
471 		return;
472 
473 	if (offset < adev->rmmio_size)
474 		writeb(value, adev->rmmio + offset);
475 	else
476 		BUG();
477 }
478 
479 /**
480  * amdgpu_device_wreg - write to a memory mapped IO or indirect register
481  *
482  * @adev: amdgpu_device pointer
483  * @reg: dword aligned register offset
484  * @v: 32 bit value to write to the register
485  * @acc_flags: access flags which require special behavior
486  *
487  * Writes the value specified to the offset specified.
488  */
489 void amdgpu_device_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
490 			uint32_t acc_flags)
491 {
492 	if (amdgpu_device_skip_hw_access(adev))
493 		return;
494 
495 	if ((reg * 4) < adev->rmmio_size) {
496 		if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
497 		    amdgpu_sriov_runtime(adev) &&
498 		    down_read_trylock(&adev->reset_domain->sem)) {
499 			amdgpu_kiq_wreg(adev, reg, v, 0);
500 			up_read(&adev->reset_domain->sem);
501 		} else {
502 			writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
503 		}
504 	} else {
505 		amdgpu_reg_pcie_wr32(adev, reg * 4, v);
506 	}
507 
508 	trace_amdgpu_device_wreg(adev->pdev->device, reg, v);
509 }
510 
511 /**
512  * amdgpu_mm_wreg_mmio_rlc -  write register either with direct/indirect mmio or with RLC path if in range
513  *
514  * @adev: amdgpu_device pointer
515  * @reg: mmio/rlc register
516  * @v: value to write
517  * @xcc_id: xcc accelerated compute core id
518  *
519  * this function is invoked only for the debugfs register access
520  */
521 void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, uint32_t reg,
522 			     uint32_t v, uint32_t xcc_id)
523 {
524 	if (amdgpu_device_skip_hw_access(adev))
525 		return;
526 
527 	if (amdgpu_sriov_fullaccess(adev) && adev->gfx.rlc.funcs &&
528 	    adev->gfx.rlc.funcs->is_rlcg_access_range) {
529 		if (adev->gfx.rlc.funcs->is_rlcg_access_range(adev, reg))
530 			return amdgpu_sriov_wreg(adev, reg, v, 0, 0, xcc_id);
531 	} else if ((reg * 4) >= adev->rmmio_size) {
532 		amdgpu_reg_pcie_wr32(adev, reg * 4, v);
533 	} else {
534 		writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
535 	}
536 }
537 
538 /**
539  * amdgpu_device_xcc_wreg - write to a memory mapped IO or indirect register with specific XCC
540  *
541  * @adev: amdgpu_device pointer
542  * @reg: dword aligned register offset
543  * @v: 32 bit value to write to the register
544  * @acc_flags: access flags which require special behavior
545  * @xcc_id: xcc accelerated compute core id
546  *
547  * Writes the value specified to the offset specified.
548  */
549 void amdgpu_device_xcc_wreg(struct amdgpu_device *adev, uint32_t reg,
550 			    uint32_t v, uint32_t acc_flags, uint32_t xcc_id)
551 {
552 	uint32_t rlcg_flag;
553 
554 	if (amdgpu_device_skip_hw_access(adev))
555 		return;
556 
557 	if ((reg * 4) < adev->rmmio_size) {
558 		if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_runtime(adev) &&
559 		    adev->gfx.rlc.rlcg_reg_access_supported &&
560 		    amdgpu_virt_get_rlcg_reg_access_flag(
561 			    adev, acc_flags, GC_HWIP, true, &rlcg_flag)) {
562 			amdgpu_virt_rlcg_reg_rw(adev, reg, v, rlcg_flag,
563 						GET_INST(GC, xcc_id));
564 		} else if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
565 			   amdgpu_sriov_runtime(adev) &&
566 			   down_read_trylock(&adev->reset_domain->sem)) {
567 			amdgpu_kiq_wreg(adev, reg, v, xcc_id);
568 			up_read(&adev->reset_domain->sem);
569 		} else {
570 			writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
571 		}
572 	} else {
573 		amdgpu_reg_pcie_wr32(adev, reg * 4, v);
574 	}
575 }
576 
577 /**
578  * amdgpu_device_indirect_rreg - read an indirect register
579  *
580  * @adev: amdgpu_device pointer
581  * @reg_addr: indirect register address to read from
582  *
583  * Returns the value of indirect register @reg_addr
584  */
585 u32 amdgpu_device_indirect_rreg(struct amdgpu_device *adev, u32 reg_addr)
586 {
587 	unsigned long flags, pcie_index, pcie_data;
588 	void __iomem *pcie_index_offset;
589 	void __iomem *pcie_data_offset;
590 	u32 r;
591 
592 	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
593 	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
594 
595 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
596 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
597 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
598 
599 	writel(reg_addr, pcie_index_offset);
600 	readl(pcie_index_offset);
601 	r = readl(pcie_data_offset);
602 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
603 
604 	return r;
605 }
606 
607 u32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev, u64 reg_addr)
608 {
609 	unsigned long flags, pcie_index, pcie_index_hi, pcie_data;
610 	u32 r;
611 	void __iomem *pcie_index_offset;
612 	void __iomem *pcie_index_hi_offset;
613 	void __iomem *pcie_data_offset;
614 
615 	if (unlikely(!adev->nbio.funcs)) {
616 		pcie_index = AMDGPU_PCIE_INDEX_FALLBACK;
617 		pcie_data = AMDGPU_PCIE_DATA_FALLBACK;
618 	} else {
619 		pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
620 		pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
621 	}
622 
623 	if (reg_addr >> 32) {
624 		if (unlikely(!adev->nbio.funcs))
625 			pcie_index_hi = AMDGPU_PCIE_INDEX_HI_FALLBACK;
626 		else
627 			pcie_index_hi =
628 				adev->nbio.funcs->get_pcie_index_hi_offset(
629 					adev);
630 	} else {
631 		pcie_index_hi = 0;
632 	}
633 
634 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
635 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
636 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
637 	if (pcie_index_hi != 0)
638 		pcie_index_hi_offset =
639 			(void __iomem *)adev->rmmio + pcie_index_hi * 4;
640 
641 	writel(reg_addr, pcie_index_offset);
642 	readl(pcie_index_offset);
643 	if (pcie_index_hi != 0) {
644 		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
645 		readl(pcie_index_hi_offset);
646 	}
647 	r = readl(pcie_data_offset);
648 
649 	/* clear the high bits */
650 	if (pcie_index_hi != 0) {
651 		writel(0, pcie_index_hi_offset);
652 		readl(pcie_index_hi_offset);
653 	}
654 
655 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
656 
657 	return r;
658 }
659 
660 /**
661  * amdgpu_device_indirect_rreg64 - read a 64bits indirect register
662  *
663  * @adev: amdgpu_device pointer
664  * @reg_addr: indirect register address to read from
665  *
666  * Returns the value of indirect register @reg_addr
667  */
668 u64 amdgpu_device_indirect_rreg64(struct amdgpu_device *adev, u32 reg_addr)
669 {
670 	unsigned long flags, pcie_index, pcie_data;
671 	void __iomem *pcie_index_offset;
672 	void __iomem *pcie_data_offset;
673 	u64 r;
674 
675 	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
676 	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
677 
678 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
679 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
680 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
681 
682 	/* read low 32 bits */
683 	writel(reg_addr, pcie_index_offset);
684 	readl(pcie_index_offset);
685 	r = readl(pcie_data_offset);
686 	/* read high 32 bits */
687 	writel(reg_addr + 4, pcie_index_offset);
688 	readl(pcie_index_offset);
689 	r |= ((u64)readl(pcie_data_offset) << 32);
690 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
691 
692 	return r;
693 }
694 
695 u64 amdgpu_device_indirect_rreg64_ext(struct amdgpu_device *adev, u64 reg_addr)
696 {
697 	unsigned long flags, pcie_index, pcie_data;
698 	unsigned long pcie_index_hi = 0;
699 	void __iomem *pcie_index_offset;
700 	void __iomem *pcie_index_hi_offset;
701 	void __iomem *pcie_data_offset;
702 	u64 r;
703 
704 	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
705 	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
706 	if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset))
707 		pcie_index_hi =
708 			adev->nbio.funcs->get_pcie_index_hi_offset(adev);
709 
710 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
711 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
712 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
713 	if (pcie_index_hi != 0)
714 		pcie_index_hi_offset =
715 			(void __iomem *)adev->rmmio + pcie_index_hi * 4;
716 
717 	/* read low 32 bits */
718 	writel(reg_addr, pcie_index_offset);
719 	readl(pcie_index_offset);
720 	if (pcie_index_hi != 0) {
721 		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
722 		readl(pcie_index_hi_offset);
723 	}
724 	r = readl(pcie_data_offset);
725 	/* read high 32 bits */
726 	writel(reg_addr + 4, pcie_index_offset);
727 	readl(pcie_index_offset);
728 	if (pcie_index_hi != 0) {
729 		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
730 		readl(pcie_index_hi_offset);
731 	}
732 	r |= ((u64)readl(pcie_data_offset) << 32);
733 
734 	/* clear the high bits */
735 	if (pcie_index_hi != 0) {
736 		writel(0, pcie_index_hi_offset);
737 		readl(pcie_index_hi_offset);
738 	}
739 
740 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
741 
742 	return r;
743 }
744 
745 /**
746  * amdgpu_device_indirect_wreg - write an indirect register address
747  *
748  * @adev: amdgpu_device pointer
749  * @reg_addr: indirect register offset
750  * @reg_data: indirect register data
751  *
752  */
753 void amdgpu_device_indirect_wreg(struct amdgpu_device *adev, u32 reg_addr,
754 				 u32 reg_data)
755 {
756 	unsigned long flags, pcie_index, pcie_data;
757 	void __iomem *pcie_index_offset;
758 	void __iomem *pcie_data_offset;
759 
760 	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
761 	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
762 
763 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
764 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
765 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
766 
767 	writel(reg_addr, pcie_index_offset);
768 	readl(pcie_index_offset);
769 	writel(reg_data, pcie_data_offset);
770 	readl(pcie_data_offset);
771 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
772 }
773 
774 void amdgpu_device_indirect_wreg_ext(struct amdgpu_device *adev, u64 reg_addr,
775 				     u32 reg_data)
776 {
777 	unsigned long flags, pcie_index, pcie_index_hi, pcie_data;
778 	void __iomem *pcie_index_offset;
779 	void __iomem *pcie_index_hi_offset;
780 	void __iomem *pcie_data_offset;
781 
782 	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
783 	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
784 	if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset))
785 		pcie_index_hi =
786 			adev->nbio.funcs->get_pcie_index_hi_offset(adev);
787 	else
788 		pcie_index_hi = 0;
789 
790 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
791 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
792 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
793 	if (pcie_index_hi != 0)
794 		pcie_index_hi_offset =
795 			(void __iomem *)adev->rmmio + pcie_index_hi * 4;
796 
797 	writel(reg_addr, pcie_index_offset);
798 	readl(pcie_index_offset);
799 	if (pcie_index_hi != 0) {
800 		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
801 		readl(pcie_index_hi_offset);
802 	}
803 	writel(reg_data, pcie_data_offset);
804 	readl(pcie_data_offset);
805 
806 	/* clear the high bits */
807 	if (pcie_index_hi != 0) {
808 		writel(0, pcie_index_hi_offset);
809 		readl(pcie_index_hi_offset);
810 	}
811 
812 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
813 }
814 
815 /**
816  * amdgpu_device_indirect_wreg64 - write a 64bits indirect register address
817  *
818  * @adev: amdgpu_device pointer
819  * @reg_addr: indirect register offset
820  * @reg_data: indirect register data
821  *
822  */
823 void amdgpu_device_indirect_wreg64(struct amdgpu_device *adev, u32 reg_addr,
824 				   u64 reg_data)
825 {
826 	unsigned long flags, pcie_index, pcie_data;
827 	void __iomem *pcie_index_offset;
828 	void __iomem *pcie_data_offset;
829 
830 	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
831 	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
832 
833 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
834 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
835 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
836 
837 	/* write low 32 bits */
838 	writel(reg_addr, pcie_index_offset);
839 	readl(pcie_index_offset);
840 	writel((u32)(reg_data & 0xffffffffULL), pcie_data_offset);
841 	readl(pcie_data_offset);
842 	/* write high 32 bits */
843 	writel(reg_addr + 4, pcie_index_offset);
844 	readl(pcie_index_offset);
845 	writel((u32)(reg_data >> 32), pcie_data_offset);
846 	readl(pcie_data_offset);
847 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
848 }
849 
850 void amdgpu_device_indirect_wreg64_ext(struct amdgpu_device *adev, u64 reg_addr,
851 				       u64 reg_data)
852 {
853 	unsigned long flags, pcie_index, pcie_data;
854 	unsigned long pcie_index_hi = 0;
855 	void __iomem *pcie_index_offset;
856 	void __iomem *pcie_index_hi_offset;
857 	void __iomem *pcie_data_offset;
858 
859 	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev);
860 	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev);
861 	if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset))
862 		pcie_index_hi =
863 			adev->nbio.funcs->get_pcie_index_hi_offset(adev);
864 
865 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
866 	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4;
867 	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4;
868 	if (pcie_index_hi != 0)
869 		pcie_index_hi_offset =
870 			(void __iomem *)adev->rmmio + pcie_index_hi * 4;
871 
872 	/* write low 32 bits */
873 	writel(reg_addr, pcie_index_offset);
874 	readl(pcie_index_offset);
875 	if (pcie_index_hi != 0) {
876 		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
877 		readl(pcie_index_hi_offset);
878 	}
879 	writel((u32)(reg_data & 0xffffffffULL), pcie_data_offset);
880 	readl(pcie_data_offset);
881 	/* write high 32 bits */
882 	writel(reg_addr + 4, pcie_index_offset);
883 	readl(pcie_index_offset);
884 	if (pcie_index_hi != 0) {
885 		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset);
886 		readl(pcie_index_hi_offset);
887 	}
888 	writel((u32)(reg_data >> 32), pcie_data_offset);
889 	readl(pcie_data_offset);
890 
891 	/* clear the high bits */
892 	if (pcie_index_hi != 0) {
893 		writel(0, pcie_index_hi_offset);
894 		readl(pcie_index_hi_offset);
895 	}
896 
897 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
898 }
899 
900 u32 amdgpu_device_pcie_port_rreg(struct amdgpu_device *adev, u32 reg)
901 {
902 	unsigned long flags, address, data;
903 	u32 r;
904 
905 	address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
906 	data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
907 
908 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
909 	WREG32(address, reg * 4);
910 	(void)RREG32(address);
911 	r = RREG32(data);
912 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
913 	return r;
914 }
915 
916 void amdgpu_device_pcie_port_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
917 {
918 	unsigned long flags, address, data;
919 
920 	address = adev->nbio.funcs->get_pcie_port_index_offset(adev);
921 	data = adev->nbio.funcs->get_pcie_port_data_offset(adev);
922 
923 	spin_lock_irqsave(&adev->reg.pcie.lock, flags);
924 	WREG32(address, reg * 4);
925 	(void)RREG32(address);
926 	WREG32(data, v);
927 	(void)RREG32(data);
928 	spin_unlock_irqrestore(&adev->reg.pcie.lock, flags);
929 }
930 
931 uint32_t amdgpu_device_wait_on_rreg(struct amdgpu_device *adev, uint32_t inst,
932 				    uint32_t reg_addr, char reg_name[],
933 				    uint32_t expected_value, uint32_t mask)
934 {
935 	uint32_t ret = 0;
936 	uint32_t old_ = 0;
937 	uint32_t tmp_ = RREG32(reg_addr);
938 	uint32_t loop = adev->usec_timeout;
939 
940 	while ((tmp_ & (mask)) != (expected_value)) {
941 		if (old_ != tmp_) {
942 			loop = adev->usec_timeout;
943 			old_ = tmp_;
944 		} else
945 			udelay(1);
946 		tmp_ = RREG32(reg_addr);
947 		loop--;
948 		if (!loop) {
949 			dev_warn(
950 				adev->dev,
951 				"Register(%d) [%s] failed to reach value 0x%08x != 0x%08xn",
952 				inst, reg_name, (uint32_t)expected_value,
953 				(uint32_t)(tmp_ & (mask)));
954 			ret = -ETIMEDOUT;
955 			break;
956 		}
957 	}
958 	return ret;
959 }
960