Merge branch 'drm-fixes-4.18' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
A few fixes for 4.18: - fix a read past the end of an array due to vega20 changes - fix driver on systems with non-4K pages - fix locking with pageflipping in DC that could lead to a sleep while atomic - fix VCN firmware version reporting for upcoming firmware Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180628032641.2765-1-alexander.deucher@amd.com
This commit is contained in:
commit
d12bce954e
|
@ -376,7 +376,7 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
|
||||||
struct amdgpu_device *adev = ring->adev;
|
struct amdgpu_device *adev = ring->adev;
|
||||||
uint64_t index;
|
uint64_t index;
|
||||||
|
|
||||||
if (ring != &adev->uvd.inst[ring->me].ring) {
|
if (ring->funcs->type != AMDGPU_RING_TYPE_UVD) {
|
||||||
ring->fence_drv.cpu_addr = &adev->wb.wb[ring->fence_offs];
|
ring->fence_drv.cpu_addr = &adev->wb.wb[ring->fence_offs];
|
||||||
ring->fence_drv.gpu_addr = adev->wb.gpu_addr + (ring->fence_offs * 4);
|
ring->fence_drv.gpu_addr = adev->wb.gpu_addr + (ring->fence_offs * 4);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -52,7 +52,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
||||||
unsigned long bo_size;
|
unsigned long bo_size;
|
||||||
const char *fw_name;
|
const char *fw_name;
|
||||||
const struct common_firmware_header *hdr;
|
const struct common_firmware_header *hdr;
|
||||||
unsigned version_major, version_minor, family_id;
|
unsigned char fw_check;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
INIT_DELAYED_WORK(&adev->vcn.idle_work, amdgpu_vcn_idle_work_handler);
|
INIT_DELAYED_WORK(&adev->vcn.idle_work, amdgpu_vcn_idle_work_handler);
|
||||||
|
@ -83,12 +83,33 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
||||||
|
|
||||||
hdr = (const struct common_firmware_header *)adev->vcn.fw->data;
|
hdr = (const struct common_firmware_header *)adev->vcn.fw->data;
|
||||||
adev->vcn.fw_version = le32_to_cpu(hdr->ucode_version);
|
adev->vcn.fw_version = le32_to_cpu(hdr->ucode_version);
|
||||||
family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
|
|
||||||
version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
|
|
||||||
version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
|
|
||||||
DRM_INFO("Found VCN firmware Version: %hu.%hu Family ID: %hu\n",
|
|
||||||
version_major, version_minor, family_id);
|
|
||||||
|
|
||||||
|
/* Bit 20-23, it is encode major and non-zero for new naming convention.
|
||||||
|
* This field is part of version minor and DRM_DISABLED_FLAG in old naming
|
||||||
|
* convention. Since the l:wq!atest version minor is 0x5B and DRM_DISABLED_FLAG
|
||||||
|
* is zero in old naming convention, this field is always zero so far.
|
||||||
|
* These four bits are used to tell which naming convention is present.
|
||||||
|
*/
|
||||||
|
fw_check = (le32_to_cpu(hdr->ucode_version) >> 20) & 0xf;
|
||||||
|
if (fw_check) {
|
||||||
|
unsigned int dec_ver, enc_major, enc_minor, vep, fw_rev;
|
||||||
|
|
||||||
|
fw_rev = le32_to_cpu(hdr->ucode_version) & 0xfff;
|
||||||
|
enc_minor = (le32_to_cpu(hdr->ucode_version) >> 12) & 0xff;
|
||||||
|
enc_major = fw_check;
|
||||||
|
dec_ver = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xf;
|
||||||
|
vep = (le32_to_cpu(hdr->ucode_version) >> 28) & 0xf;
|
||||||
|
DRM_INFO("Found VCN firmware Version ENC: %hu.%hu DEC: %hu VEP: %hu Revision: %hu\n",
|
||||||
|
enc_major, enc_minor, dec_ver, vep, fw_rev);
|
||||||
|
} else {
|
||||||
|
unsigned int version_major, version_minor, family_id;
|
||||||
|
|
||||||
|
family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
|
||||||
|
version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
|
||||||
|
version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
|
||||||
|
DRM_INFO("Found VCN firmware Version: %hu.%hu Family ID: %hu\n",
|
||||||
|
version_major, version_minor, family_id);
|
||||||
|
}
|
||||||
|
|
||||||
bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8)
|
bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8)
|
||||||
+ AMDGPU_VCN_STACK_SIZE + AMDGPU_VCN_HEAP_SIZE
|
+ AMDGPU_VCN_STACK_SIZE + AMDGPU_VCN_HEAP_SIZE
|
||||||
|
|
|
@ -1463,7 +1463,9 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
|
||||||
uint64_t count;
|
uint64_t count;
|
||||||
|
|
||||||
max_entries = min(max_entries, 16ull * 1024ull);
|
max_entries = min(max_entries, 16ull * 1024ull);
|
||||||
for (count = 1; count < max_entries; ++count) {
|
for (count = 1;
|
||||||
|
count < max_entries / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
|
||||||
|
++count) {
|
||||||
uint64_t idx = pfn + count;
|
uint64_t idx = pfn + count;
|
||||||
|
|
||||||
if (pages_addr[idx] !=
|
if (pages_addr[idx] !=
|
||||||
|
@ -1476,7 +1478,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
|
||||||
dma_addr = pages_addr;
|
dma_addr = pages_addr;
|
||||||
} else {
|
} else {
|
||||||
addr = pages_addr[pfn];
|
addr = pages_addr[pfn];
|
||||||
max_entries = count;
|
max_entries = count * (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (flags & AMDGPU_PTE_VALID) {
|
} else if (flags & AMDGPU_PTE_VALID) {
|
||||||
|
@ -1491,7 +1493,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
pfn += last - start + 1;
|
pfn += (last - start + 1) / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
|
||||||
if (nodes && nodes->size == pfn) {
|
if (nodes && nodes->size == pfn) {
|
||||||
pfn = 0;
|
pfn = 0;
|
||||||
++nodes;
|
++nodes;
|
||||||
|
|
|
@ -3928,10 +3928,11 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc,
|
||||||
if (acrtc->base.state->event)
|
if (acrtc->base.state->event)
|
||||||
prepare_flip_isr(acrtc);
|
prepare_flip_isr(acrtc);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
|
||||||
|
|
||||||
surface_updates->surface = dc_stream_get_status(acrtc_state->stream)->plane_states[0];
|
surface_updates->surface = dc_stream_get_status(acrtc_state->stream)->plane_states[0];
|
||||||
surface_updates->flip_addr = &addr;
|
surface_updates->flip_addr = &addr;
|
||||||
|
|
||||||
|
|
||||||
dc_commit_updates_for_stream(adev->dm.dc,
|
dc_commit_updates_for_stream(adev->dm.dc,
|
||||||
surface_updates,
|
surface_updates,
|
||||||
1,
|
1,
|
||||||
|
@ -3944,9 +3945,6 @@ static void amdgpu_dm_do_flip(struct drm_crtc *crtc,
|
||||||
__func__,
|
__func__,
|
||||||
addr.address.grph.addr.high_part,
|
addr.address.grph.addr.high_part,
|
||||||
addr.address.grph.addr.low_part);
|
addr.address.grph.addr.low_part);
|
||||||
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue