|
73 | 73 | #include "amdgpu_pmu.h"
|
74 | 74 | #include "amdgpu_fru_eeprom.h"
|
75 | 75 | #include "amdgpu_reset.h"
|
| 76 | +#include "amdgpu_virt.h" |
76 | 77 |
|
77 | 78 | #include <linux/suspend.h>
|
78 | 79 | #include <drm/task_barrier.h>
|
@@ -472,7 +473,7 @@ uint32_t amdgpu_device_rreg(struct amdgpu_device *adev,
|
472 | 473 | if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
|
473 | 474 | amdgpu_sriov_runtime(adev) &&
|
474 | 475 | down_read_trylock(&adev->reset_domain->sem)) {
|
475 |
| - ret = amdgpu_kiq_rreg(adev, reg); |
| 476 | + ret = amdgpu_kiq_rreg(adev, reg, 0); |
476 | 477 | up_read(&adev->reset_domain->sem);
|
477 | 478 | } else {
|
478 | 479 | ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
|
@@ -509,6 +510,49 @@ uint8_t amdgpu_mm_rreg8(struct amdgpu_device *adev, uint32_t offset)
|
509 | 510 | BUG();
|
510 | 511 | }
|
511 | 512 |
|
| 513 | + |
| 514 | +/** |
| 515 | + * amdgpu_device_xcc_rreg - read a memory mapped IO or indirect register with specific XCC |
| 516 | + * |
| 517 | + * @adev: amdgpu_device pointer |
| 518 | + * @reg: dword aligned register offset |
| 519 | + * @acc_flags: access flags which require special behavior |
| 520 | + * @xcc_id: xcc accelerated compute core id |
| 521 | + * |
| 522 | + * Returns the 32 bit value from the offset specified. |
| 523 | + */ |
| 524 | +uint32_t amdgpu_device_xcc_rreg(struct amdgpu_device *adev, |
| 525 | + uint32_t reg, uint32_t acc_flags, |
| 526 | + uint32_t xcc_id) |
| 527 | +{ |
| 528 | + uint32_t ret, rlcg_flag; |
| 529 | + |
| 530 | + if (amdgpu_device_skip_hw_access(adev)) |
| 531 | + return 0; |
| 532 | + |
| 533 | + if ((reg * 4) < adev->rmmio_size) { |
| 534 | + if (amdgpu_sriov_vf(adev) && |
| 535 | + !amdgpu_sriov_runtime(adev) && |
| 536 | + adev->gfx.rlc.rlcg_reg_access_supported && |
| 537 | + amdgpu_virt_get_rlcg_reg_access_flag(adev, acc_flags, |
| 538 | + GC_HWIP, false, |
| 539 | + &rlcg_flag)) { |
| 540 | + ret = amdgpu_virt_rlcg_reg_rw(adev, reg, 0, rlcg_flag, xcc_id); |
| 541 | + } else if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && |
| 542 | + amdgpu_sriov_runtime(adev) && |
| 543 | + down_read_trylock(&adev->reset_domain->sem)) { |
| 544 | + ret = amdgpu_kiq_rreg(adev, reg, xcc_id); |
| 545 | + up_read(&adev->reset_domain->sem); |
| 546 | + } else { |
| 547 | + ret = readl(((void __iomem *)adev->rmmio) + (reg * 4)); |
| 548 | + } |
| 549 | + } else { |
| 550 | + ret = adev->pcie_rreg(adev, reg * 4); |
| 551 | + } |
| 552 | + |
| 553 | + return ret; |
| 554 | +} |
| 555 | + |
512 | 556 | /*
|
513 | 557 | * MMIO register write with bytes helper functions
|
514 | 558 | * @offset:bytes offset from MMIO start
|
@@ -556,7 +600,7 @@ void amdgpu_device_wreg(struct amdgpu_device *adev,
|
556 | 600 | if (!(acc_flags & AMDGPU_REGS_NO_KIQ) &&
|
557 | 601 | amdgpu_sriov_runtime(adev) &&
|
558 | 602 | down_read_trylock(&adev->reset_domain->sem)) {
|
559 |
| - amdgpu_kiq_wreg(adev, reg, v); |
| 603 | + amdgpu_kiq_wreg(adev, reg, v, 0); |
560 | 604 | up_read(&adev->reset_domain->sem);
|
561 | 605 | } else {
|
562 | 606 | writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
|
@@ -597,6 +641,47 @@ void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev,
|
597 | 641 | }
|
598 | 642 | }
|
599 | 643 |
|
| 644 | +/** |
| 645 | + * amdgpu_device_xcc_wreg - write to a memory mapped IO or indirect register with specific XCC |
| 646 | + * |
| 647 | + * @adev: amdgpu_device pointer |
| 648 | + * @reg: dword aligned register offset |
| 649 | + * @v: 32 bit value to write to the register |
| 650 | + * @acc_flags: access flags which require special behavior |
| 651 | + * @xcc_id: xcc accelerated compute core id |
| 652 | + * |
| 653 | + * Writes the value specified to the offset specified. |
| 654 | + */ |
| 655 | +void amdgpu_device_xcc_wreg(struct amdgpu_device *adev, |
| 656 | + uint32_t reg, uint32_t v, |
| 657 | + uint32_t acc_flags, uint32_t xcc_id) |
| 658 | +{ |
| 659 | + uint32_t rlcg_flag; |
| 660 | + |
| 661 | + if (amdgpu_device_skip_hw_access(adev)) |
| 662 | + return; |
| 663 | + |
| 664 | + if ((reg * 4) < adev->rmmio_size) { |
| 665 | + if (amdgpu_sriov_vf(adev) && |
| 666 | + !amdgpu_sriov_runtime(adev) && |
| 667 | + adev->gfx.rlc.rlcg_reg_access_supported && |
| 668 | + amdgpu_virt_get_rlcg_reg_access_flag(adev, acc_flags, |
| 669 | + GC_HWIP, true, |
| 670 | + &rlcg_flag)) { |
| 671 | + amdgpu_virt_rlcg_reg_rw(adev, reg, v, rlcg_flag, xcc_id); |
| 672 | + } else if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && |
| 673 | + amdgpu_sriov_runtime(adev) && |
| 674 | + down_read_trylock(&adev->reset_domain->sem)) { |
| 675 | + amdgpu_kiq_wreg(adev, reg, v, xcc_id); |
| 676 | + up_read(&adev->reset_domain->sem); |
| 677 | + } else { |
| 678 | + writel(v, ((void __iomem *)adev->rmmio) + (reg * 4)); |
| 679 | + } |
| 680 | + } else { |
| 681 | + adev->pcie_wreg(adev, reg * 4, v); |
| 682 | + } |
| 683 | +} |
| 684 | + |
600 | 685 | /**
|
601 | 686 | * amdgpu_device_indirect_rreg - read an indirect register
|
602 | 687 | *
|
|
0 commit comments