Skip to content

Commit d5d88cd

Browse files
committed
Merge tag 'amd-drm-next-5.6-2020-01-09' of git://people.freedesktop.org/~agd5f/linux into drm-next
amd-drm-next-5.6-2020-01-09: amdgpu: - Enable DCN support on POWER - Enable GFXOFF for Raven1 refresh - Clean up MM engine idle handlers - HDMI 2.0 audio fixes - Fixes for some 10 bpc EDP panels - Watermark fixes for renoir - SR-IOV fixes - Runtime pm robustness fixes - Arcturus VCN fixes - RAS fixes - BACO fixes for Arcturus - Stable pstate fixes for swSMU - HDCP fixes - PSP cleanup - HDMI fixes - Misc cleanups amdkfd: - Spread interrupt work across cores to reduce latency - Topology fixes for APUs - GPU reset improvements UAPI: - Enable DRIVER_SYNCOBJ_TIMELINE for vulkan - Return better error values for kfd process ioctl Signed-off-by: Dave Airlie <[email protected]> From: Alex Deucher <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 79f88da + 0f899fd commit d5d88cd

File tree

205 files changed

+8629
-2089
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

205 files changed

+8629
-2089
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -636,9 +636,8 @@ struct amdgpu_fw_vram_usage {
636636
struct amdgpu_bo *reserved_bo;
637637
void *va;
638638

639-
/* Offset on the top of VRAM, used as c2p write buffer.
639+
/* GDDR6 training support flag.
640640
*/
641-
u64 mem_train_fb_loc;
642641
bool mem_train_support;
643642
};
644643

@@ -994,8 +993,6 @@ struct amdgpu_device {
994993

995994
bool pm_sysfs_en;
996995
bool ucode_sysfs_en;
997-
998-
bool in_baco;
999996
};
1000997

1001998
static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev)

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
#include "soc15.h"
4747
#include "soc15d.h"
4848
#include "amdgpu_amdkfd_gfx_v9.h"
49+
#include "gfxhub_v1_0.h"
50+
#include "mmhub_v9_4.h"
4951

5052
#define HQD_N_REGS 56
5153
#define DUMP_REG(addr) do { \
@@ -258,6 +260,22 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
258260
return 0;
259261
}
260262

263+
static void kgd_set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
264+
uint64_t page_table_base)
265+
{
266+
struct amdgpu_device *adev = get_amdgpu_device(kgd);
267+
268+
if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
269+
pr_err("trying to set page table base for wrong VMID %u\n",
270+
vmid);
271+
return;
272+
}
273+
274+
mmhub_v9_4_setup_vm_pt_regs(adev, vmid, page_table_base);
275+
276+
gfxhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
277+
}
278+
261279
const struct kfd2kgd_calls arcturus_kfd2kgd = {
262280
.program_sh_mem_settings = kgd_gfx_v9_program_sh_mem_settings,
263281
.set_pasid_vmid_mapping = kgd_gfx_v9_set_pasid_vmid_mapping,
@@ -277,7 +295,7 @@ const struct kfd2kgd_calls arcturus_kfd2kgd = {
277295
.get_atc_vmid_pasid_mapping_info =
278296
kgd_gfx_v9_get_atc_vmid_pasid_mapping_info,
279297
.get_tile_config = kgd_gfx_v9_get_tile_config,
280-
.set_vm_context_page_table_base = kgd_gfx_v9_set_vm_context_page_table_base,
298+
.set_vm_context_page_table_base = kgd_set_vm_context_page_table_base,
281299
.invalidate_tlbs = kgd_gfx_v9_invalidate_tlbs,
282300
.invalidate_tlbs_vmid = kgd_gfx_v9_invalidate_tlbs_vmid,
283301
.get_hive_id = amdgpu_amdkfd_get_hive_id,

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
#include "soc15d.h"
4141
#include "mmhub_v1_0.h"
4242
#include "gfxhub_v1_0.h"
43-
#include "mmhub_v9_4.h"
4443

4544

4645
enum hqd_dequeue_request_type {
@@ -758,8 +757,8 @@ uint32_t kgd_gfx_v9_address_watch_get_offset(struct kgd_dev *kgd,
758757
return 0;
759758
}
760759

761-
void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
762-
uint64_t page_table_base)
760+
static void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd,
761+
uint32_t vmid, uint64_t page_table_base)
763762
{
764763
struct amdgpu_device *adev = get_amdgpu_device(kgd);
765764

@@ -769,14 +768,7 @@ void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmi
769768
return;
770769
}
771770

772-
/* TODO: take advantage of per-process address space size. For
773-
* now, all processes share the same address space size, like
774-
* on GFX8 and older.
775-
*/
776-
if (adev->asic_type == CHIP_ARCTURUS) {
777-
mmhub_v9_4_setup_vm_pt_regs(adev, vmid, page_table_base);
778-
} else
779-
mmhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
771+
mmhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
780772

781773
gfxhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
782774
}

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ uint32_t kgd_gfx_v9_address_watch_get_offset(struct kgd_dev *kgd,
5757

5858
bool kgd_gfx_v9_get_atc_vmid_pasid_mapping_info(struct kgd_dev *kgd,
5959
uint8_t vmid, uint16_t *p_pasid);
60-
void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
61-
uint64_t page_table_base);
6260
int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
6361
int kgd_gfx_v9_invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
6462
int kgd_gfx_v9_get_tile_config(struct kgd_dev *kgd,

drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2022,7 +2022,7 @@ int amdgpu_atombios_init(struct amdgpu_device *adev)
20222022
if (adev->is_atom_fw) {
20232023
amdgpu_atomfirmware_scratch_regs_init(adev);
20242024
amdgpu_atomfirmware_allocate_fb_scratch(adev);
2025-
ret = amdgpu_atomfirmware_get_mem_train_fb_loc(adev);
2025+
ret = amdgpu_atomfirmware_get_mem_train_info(adev);
20262026
if (ret) {
20272027
DRM_ERROR("Failed to get mem train fb location.\n");
20282028
return ret;

drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -525,16 +525,12 @@ static int gddr6_mem_train_support(struct amdgpu_device *adev)
525525
return ret;
526526
}
527527

528-
int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev)
528+
int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev)
529529
{
530530
struct atom_context *ctx = adev->mode_info.atom_context;
531-
unsigned char *bios = ctx->bios;
532-
struct vram_reserve_block *reserved_block;
533-
int index, block_number;
531+
int index;
534532
uint8_t frev, crev;
535533
uint16_t data_offset, size;
536-
uint32_t start_address_in_kb;
537-
uint64_t offset;
538534
int ret;
539535

540536
adev->fw_vram_usage.mem_train_support = false;
@@ -569,32 +565,6 @@ int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev)
569565
return -EINVAL;
570566
}
571567

572-
reserved_block = (struct vram_reserve_block *)
573-
(bios + data_offset + sizeof(struct atom_common_table_header));
574-
block_number = ((unsigned int)size - sizeof(struct atom_common_table_header))
575-
/ sizeof(struct vram_reserve_block);
576-
reserved_block += (block_number > 0) ? block_number-1 : 0;
577-
DRM_DEBUG("block_number:0x%04x, last block: 0x%08xkb sz, %dkb fw, %dkb drv.\n",
578-
block_number,
579-
le32_to_cpu(reserved_block->start_address_in_kb),
580-
le16_to_cpu(reserved_block->used_by_firmware_in_kb),
581-
le16_to_cpu(reserved_block->used_by_driver_in_kb));
582-
if (reserved_block->used_by_firmware_in_kb > 0) {
583-
start_address_in_kb = le32_to_cpu(reserved_block->start_address_in_kb);
584-
offset = (uint64_t)start_address_in_kb * ONE_KiB;
585-
if ((offset & (ONE_MiB - 1)) < (4 * ONE_KiB + 1) ) {
586-
offset -= ONE_MiB;
587-
}
588-
589-
offset &= ~(ONE_MiB - 1);
590-
adev->fw_vram_usage.mem_train_fb_loc = offset;
591-
adev->fw_vram_usage.mem_train_support = true;
592-
DRM_DEBUG("mem_train_fb_loc:0x%09llx.\n", offset);
593-
ret = 0;
594-
} else {
595-
DRM_ERROR("used_by_firmware_in_kb is 0!\n");
596-
ret = -EINVAL;
597-
}
598-
599-
return ret;
568+
adev->fw_vram_usage.mem_train_support = true;
569+
return 0;
600570
}

drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev);
3131
int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev);
3232
int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
3333
int *vram_width, int *vram_type, int *vram_vendor);
34-
int amdgpu_atomfirmware_get_mem_train_fb_loc(struct amdgpu_device *adev);
34+
int amdgpu_atomfirmware_get_mem_train_info(struct amdgpu_device *adev);
3535
int amdgpu_atomfirmware_get_clock_info(struct amdgpu_device *adev);
3636
int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev);
3737
bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev);

drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,17 @@ static bool amdgpu_atpx_detect(void)
613613
bool d3_supported = false;
614614
struct pci_dev *parent_pdev;
615615

616-
while ((pdev = pci_get_class(PCI_BASE_CLASS_DISPLAY << 16, pdev)) != NULL) {
616+
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
617+
vga_count++;
618+
619+
has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
620+
621+
parent_pdev = pci_upstream_bridge(pdev);
622+
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
623+
amdgpu_atpx_get_quirks(pdev);
624+
}
625+
626+
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {
617627
vga_count++;
618628

619629
has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);

drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c

Lines changed: 70 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
7474
struct amdgpu_ctx *ctx)
7575
{
7676
unsigned num_entities = amdgpu_ctx_total_num_entities();
77-
unsigned i, j, k;
77+
unsigned i, j;
7878
int r;
7979

8080
if (priority < 0 || priority >= DRM_SCHED_PRIORITY_MAX)
@@ -121,72 +121,57 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
121121
ctx->override_priority = DRM_SCHED_PRIORITY_UNSET;
122122

123123
for (i = 0; i < AMDGPU_HW_IP_NUM; ++i) {
124-
struct amdgpu_ring *rings[AMDGPU_MAX_RINGS];
125-
struct drm_sched_rq *rqs[AMDGPU_MAX_RINGS];
126-
unsigned num_rings = 0;
127-
unsigned num_rqs = 0;
124+
struct drm_gpu_scheduler **scheds;
125+
struct drm_gpu_scheduler *sched;
126+
unsigned num_scheds = 0;
128127

129128
switch (i) {
130129
case AMDGPU_HW_IP_GFX:
131-
rings[0] = &adev->gfx.gfx_ring[0];
132-
num_rings = 1;
130+
sched = &adev->gfx.gfx_ring[0].sched;
131+
scheds = &sched;
132+
num_scheds = 1;
133133
break;
134134
case AMDGPU_HW_IP_COMPUTE:
135-
for (j = 0; j < adev->gfx.num_compute_rings; ++j)
136-
rings[j] = &adev->gfx.compute_ring[j];
137-
num_rings = adev->gfx.num_compute_rings;
135+
scheds = adev->gfx.compute_sched;
136+
num_scheds = adev->gfx.num_compute_sched;
138137
break;
139138
case AMDGPU_HW_IP_DMA:
140-
for (j = 0; j < adev->sdma.num_instances; ++j)
141-
rings[j] = &adev->sdma.instance[j].ring;
142-
num_rings = adev->sdma.num_instances;
139+
scheds = adev->sdma.sdma_sched;
140+
num_scheds = adev->sdma.num_sdma_sched;
143141
break;
144142
case AMDGPU_HW_IP_UVD:
145-
rings[0] = &adev->uvd.inst[0].ring;
146-
num_rings = 1;
143+
sched = &adev->uvd.inst[0].ring.sched;
144+
scheds = &sched;
145+
num_scheds = 1;
147146
break;
148147
case AMDGPU_HW_IP_VCE:
149-
rings[0] = &adev->vce.ring[0];
150-
num_rings = 1;
148+
sched = &adev->vce.ring[0].sched;
149+
scheds = &sched;
150+
num_scheds = 1;
151151
break;
152152
case AMDGPU_HW_IP_UVD_ENC:
153-
rings[0] = &adev->uvd.inst[0].ring_enc[0];
154-
num_rings = 1;
153+
sched = &adev->uvd.inst[0].ring_enc[0].sched;
154+
scheds = &sched;
155+
num_scheds = 1;
155156
break;
156157
case AMDGPU_HW_IP_VCN_DEC:
157-
for (j = 0; j < adev->vcn.num_vcn_inst; ++j) {
158-
if (adev->vcn.harvest_config & (1 << j))
159-
continue;
160-
rings[num_rings++] = &adev->vcn.inst[j].ring_dec;
161-
}
158+
scheds = adev->vcn.vcn_dec_sched;
159+
num_scheds = adev->vcn.num_vcn_dec_sched;
162160
break;
163161
case AMDGPU_HW_IP_VCN_ENC:
164-
for (j = 0; j < adev->vcn.num_vcn_inst; ++j) {
165-
if (adev->vcn.harvest_config & (1 << j))
166-
continue;
167-
for (k = 0; k < adev->vcn.num_enc_rings; ++k)
168-
rings[num_rings++] = &adev->vcn.inst[j].ring_enc[k];
169-
}
162+
scheds = adev->vcn.vcn_enc_sched;
163+
num_scheds = adev->vcn.num_vcn_enc_sched;
170164
break;
171165
case AMDGPU_HW_IP_VCN_JPEG:
172-
for (j = 0; j < adev->jpeg.num_jpeg_inst; ++j) {
173-
if (adev->jpeg.harvest_config & (1 << j))
174-
continue;
175-
rings[num_rings++] = &adev->jpeg.inst[j].ring_dec;
176-
}
166+
scheds = adev->jpeg.jpeg_sched;
167+
num_scheds = adev->jpeg.num_jpeg_sched;
177168
break;
178169
}
179170

180-
for (j = 0; j < num_rings; ++j) {
181-
if (!rings[j]->adev)
182-
continue;
183-
184-
rqs[num_rqs++] = &rings[j]->sched.sched_rq[priority];
185-
}
186-
187171
for (j = 0; j < amdgpu_ctx_num_entities[i]; ++j)
188172
r = drm_sched_entity_init(&ctx->entities[i][j].entity,
189-
rqs, num_rqs, &ctx->guilty);
173+
priority, scheds,
174+
num_scheds, &ctx->guilty);
190175
if (r)
191176
goto error_cleanup_entities;
192177
}
@@ -627,3 +612,45 @@ void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr)
627612
idr_destroy(&mgr->ctx_handles);
628613
mutex_destroy(&mgr->lock);
629614
}
615+
616+
void amdgpu_ctx_init_sched(struct amdgpu_device *adev)
617+
{
618+
int i, j;
619+
620+
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
621+
adev->gfx.gfx_sched[i] = &adev->gfx.gfx_ring[i].sched;
622+
adev->gfx.num_gfx_sched++;
623+
}
624+
625+
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
626+
adev->gfx.compute_sched[i] = &adev->gfx.compute_ring[i].sched;
627+
adev->gfx.num_compute_sched++;
628+
}
629+
630+
for (i = 0; i < adev->sdma.num_instances; i++) {
631+
adev->sdma.sdma_sched[i] = &adev->sdma.instance[i].ring.sched;
632+
adev->sdma.num_sdma_sched++;
633+
}
634+
635+
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
636+
if (adev->vcn.harvest_config & (1 << i))
637+
continue;
638+
adev->vcn.vcn_dec_sched[adev->vcn.num_vcn_dec_sched++] =
639+
&adev->vcn.inst[i].ring_dec.sched;
640+
}
641+
642+
for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
643+
if (adev->vcn.harvest_config & (1 << i))
644+
continue;
645+
for (j = 0; j < adev->vcn.num_enc_rings; ++j)
646+
adev->vcn.vcn_enc_sched[adev->vcn.num_vcn_enc_sched++] =
647+
&adev->vcn.inst[i].ring_enc[j].sched;
648+
}
649+
650+
for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) {
651+
if (adev->jpeg.harvest_config & (1 << i))
652+
continue;
653+
adev->jpeg.jpeg_sched[adev->jpeg.num_jpeg_sched++] =
654+
&adev->jpeg.inst[i].ring_dec.sched;
655+
}
656+
}

drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,7 @@ void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr);
8787
long amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr, long timeout);
8888
void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr);
8989

90+
void amdgpu_ctx_init_sched(struct amdgpu_device *adev);
91+
92+
9093
#endif

0 commit comments

Comments
 (0)