Commit a81ac299 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'amd-drm-fixes-5.10-2020-12-09' of...

Merge tag 'amd-drm-fixes-5.10-2020-12-09' of git://people.freedesktop.org/~agd5f/linux

 into drm-fixes

amd-drm-fixes-5.10-2020-12-09:

amdgpu:
- Fan fix for CI asics
- Fix a warning in possible_crtcs
- Build fix for when debugfs is disabled
- Display overflow fix
- Display watermark fixes for Renoir
- SDMA 5.2 fix
- Stolen vga memory regression fix
- Power profile fixes
- Fix a regression from removal of GEM and PRIME callbacks

amdkfd:
- Fix a memory leak in dmabuf import

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201210034848.18108-1-alexander.deucher@amd.com
parents 0477e928 c5b58c8c
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -459,6 +459,7 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
	struct amdgpu_device *adev = drm_to_adev(dev);
	struct amdgpu_device *adev = drm_to_adev(dev);
	struct amdgpu_bo *bo;
	struct amdgpu_bo *bo;
	struct amdgpu_bo_param bp;
	struct amdgpu_bo_param bp;
	struct drm_gem_object *gobj;
	int ret;
	int ret;


	memset(&bp, 0, sizeof(bp));
	memset(&bp, 0, sizeof(bp));
@@ -469,17 +470,20 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
	bp.type = ttm_bo_type_sg;
	bp.type = ttm_bo_type_sg;
	bp.resv = resv;
	bp.resv = resv;
	dma_resv_lock(resv, NULL);
	dma_resv_lock(resv, NULL);
	ret = amdgpu_bo_create(adev, &bp, &bo);
	ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
			AMDGPU_GEM_DOMAIN_CPU,
			0, ttm_bo_type_sg, resv, &gobj);
	if (ret)
	if (ret)
		goto error;
		goto error;


	bo = gem_to_amdgpu_bo(gobj);
	bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
	bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
	bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
	bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
	if (dma_buf->ops != &amdgpu_dmabuf_ops)
	if (dma_buf->ops != &amdgpu_dmabuf_ops)
		bo->prime_shared_count = 1;
		bo->prime_shared_count = 1;


	dma_resv_unlock(resv);
	dma_resv_unlock(resv);
	return &bo->tbo.base;
	return gobj;


error:
error:
	dma_resv_unlock(resv);
	dma_resv_unlock(resv);
+23 −18
Original line number Original line Diff line number Diff line
@@ -66,26 +66,12 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
	bp.type = type;
	bp.type = type;
	bp.resv = resv;
	bp.resv = resv;
	bp.preferred_domain = initial_domain;
	bp.preferred_domain = initial_domain;
retry:
	bp.flags = flags;
	bp.flags = flags;
	bp.domain = initial_domain;
	bp.domain = initial_domain;
	r = amdgpu_bo_create(adev, &bp, &bo);
	r = amdgpu_bo_create(adev, &bp, &bo);
	if (r) {
	if (r)
		if (r != -ERESTARTSYS) {
			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
				goto retry;
			}

			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
				goto retry;
			}
			DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",
				  size, initial_domain, alignment, r);
		}
		return r;
		return r;
	}

	*obj = &bo->tbo.base;
	*obj = &bo->tbo.base;


	return 0;
	return 0;
@@ -225,7 +211,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
	uint64_t size = args->in.bo_size;
	uint64_t size = args->in.bo_size;
	struct dma_resv *resv = NULL;
	struct dma_resv *resv = NULL;
	struct drm_gem_object *gobj;
	struct drm_gem_object *gobj;
	uint32_t handle;
	uint32_t handle, initial_domain;
	int r;
	int r;


	/* reject invalid gem flags */
	/* reject invalid gem flags */
@@ -269,9 +255,28 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
		resv = vm->root.base.bo->tbo.base.resv;
		resv = vm->root.base.bo->tbo.base.resv;
	}
	}


retry:
	initial_domain = (u32)(0xffffffff & args->in.domains);
	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
	r = amdgpu_gem_object_create(adev, size, args->in.alignment,
				     (u32)(0xffffffff & args->in.domains),
				     initial_domain,
				     flags, ttm_bo_type_device, resv, &gobj);
				     flags, ttm_bo_type_device, resv, &gobj);
	if (r) {
		if (r != -ERESTARTSYS) {
			if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
				flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
				goto retry;
			}

			if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) {
				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;
				goto retry;
			}
			DRM_DEBUG("Failed to allocate GEM object (%llu, %d, %llu, %d)\n",
				  size, initial_domain, args->in.alignment, r);
		}
		return r;
	}

	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
	if (flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) {
		if (!r) {
		if (!r) {
			struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
			struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
+3 −0
Original line number Original line Diff line number Diff line
@@ -499,6 +499,9 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
	else
	else
		size = amdgpu_gmc_get_vbios_fb_size(adev);
		size = amdgpu_gmc_get_vbios_fb_size(adev);


	if (adev->mman.keep_stolen_vga_memory)
		size = max(size, (unsigned)AMDGPU_VBIOS_VGA_ALLOCATION);

	/* set to 0 if the pre-OS buffer uses up most of vram */
	/* set to 0 if the pre-OS buffer uses up most of vram */
	if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024))
	if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024))
		size = 0;
		size = 0;
+5 −8
Original line number Original line Diff line number Diff line
@@ -1172,7 +1172,7 @@ static void amdgpu_ras_debugfs_create_ctrl_node(struct amdgpu_device *adev)
			con->dir, &con->disable_ras_err_cnt_harvest);
			con->dir, &con->disable_ras_err_cnt_harvest);
}
}


void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
static void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
		struct ras_fs_if *head)
		struct ras_fs_if *head)
{
{
	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
@@ -1194,7 +1194,6 @@ void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,


void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
{
{
#if defined(CONFIG_DEBUG_FS)
	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
	struct ras_manager *obj;
	struct ras_manager *obj;
	struct ras_fs_if fs_info;
	struct ras_fs_if fs_info;
@@ -1203,7 +1202,7 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
	 * it won't be called in resume path, no need to check
	 * it won't be called in resume path, no need to check
	 * suspend and gpu reset status
	 * suspend and gpu reset status
	 */
	 */
	if (!con)
	if (!IS_ENABLED(CONFIG_DEBUG_FS) || !con)
		return;
		return;


	amdgpu_ras_debugfs_create_ctrl_node(adev);
	amdgpu_ras_debugfs_create_ctrl_node(adev);
@@ -1217,10 +1216,9 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
			amdgpu_ras_debugfs_create(adev, &fs_info);
			amdgpu_ras_debugfs_create(adev, &fs_info);
		}
		}
	}
	}
#endif
}
}


void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
static void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
		struct ras_common_if *head)
		struct ras_common_if *head)
{
{
	struct ras_manager *obj = amdgpu_ras_find_obj(adev, head);
	struct ras_manager *obj = amdgpu_ras_find_obj(adev, head);
@@ -1234,7 +1232,6 @@ void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,


static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev)
static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev)
{
{
#if defined(CONFIG_DEBUG_FS)
	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
	struct ras_manager *obj, *tmp;
	struct ras_manager *obj, *tmp;


@@ -1243,7 +1240,6 @@ static void amdgpu_ras_debugfs_remove_all(struct amdgpu_device *adev)
	}
	}


	con->dir = NULL;
	con->dir = NULL;
#endif
}
}
/* debugfs end */
/* debugfs end */


@@ -1291,6 +1287,7 @@ static int amdgpu_ras_fs_init(struct amdgpu_device *adev)


static int amdgpu_ras_fs_fini(struct amdgpu_device *adev)
static int amdgpu_ras_fs_fini(struct amdgpu_device *adev)
{
{
	if (IS_ENABLED(CONFIG_DEBUG_FS))
		amdgpu_ras_debugfs_remove_all(adev);
		amdgpu_ras_debugfs_remove_all(adev);
	amdgpu_ras_sysfs_remove_all(adev);
	amdgpu_ras_sysfs_remove_all(adev);
	return 0;
	return 0;
+0 −6
Original line number Original line Diff line number Diff line
@@ -607,14 +607,8 @@ int amdgpu_ras_sysfs_create(struct amdgpu_device *adev,
int amdgpu_ras_sysfs_remove(struct amdgpu_device *adev,
int amdgpu_ras_sysfs_remove(struct amdgpu_device *adev,
		struct ras_common_if *head);
		struct ras_common_if *head);


void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
		struct ras_fs_if *head);

void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev);
void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev);


void amdgpu_ras_debugfs_remove(struct amdgpu_device *adev,
		struct ras_common_if *head);

int amdgpu_ras_error_query(struct amdgpu_device *adev,
int amdgpu_ras_error_query(struct amdgpu_device *adev,
		struct ras_query_if *info);
		struct ras_query_if *info);


Loading