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