Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 733289c2 authored by Jerome Glisse's avatar Jerome Glisse Committed by Dave Airlie
Browse files

drm/radeon/kms: don't fail if we fail to init GPU acceleration



Userspace can query if acceleration is working or not true get
info ioctl and could fallback to software if for some reason
kernel failed to initialize KMS. This should allow to give a
working KMS setup in all case (even with non functionning accel).

Signed-off-by: default avatarJerome Glisse <jglisse@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 7cbb355e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -329,6 +329,7 @@ int r420_init(struct radeon_device *rdev)
			return r;
	}
	r300_set_reg_safe(rdev);
	rdev->accel_working = true;
	r = r420_resume(rdev);
	if (r) {
		/* Somethings want wront with the accel init stop accel */
@@ -343,6 +344,7 @@ int r420_init(struct radeon_device *rdev)
			r100_pci_gart_fini(rdev);
		radeon_agp_fini(rdev);
		radeon_irq_kms_fini(rdev);
		rdev->accel_working = false;
	}
	return 0;
}
+18 −15
Original line number Diff line number Diff line
@@ -1573,6 +1573,7 @@ int r600_init(struct radeon_device *rdev)
	if (r)
		return r;

	rdev->accel_working = true;
	r = r600_resume(rdev);
	if (r) {
		if (rdev->flags & RADEON_IS_AGP) {
@@ -1581,22 +1582,24 @@ int r600_init(struct radeon_device *rdev)
			rdev->flags &= ~RADEON_IS_AGP;
			return r600_init(rdev);
		}
		return r;
		rdev->accel_working = false;
	}
	if (rdev->accel_working) {
		r = radeon_ib_pool_init(rdev);
		if (r) {
			DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
		return r;
			rdev->accel_working = false;
		}
		r = r600_blit_init(rdev);
		if (r) {
			DRM_ERROR("radeon: failled blitter (%d).\n", r);
		return r;
			rdev->accel_working = false;
		}
		r = radeon_ib_test(rdev);
		if (r) {
			DRM_ERROR("radeon: failled testing IB (%d).\n", r);
			return r;
			rdev->accel_working = false;
		}
	}
	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -793,6 +793,7 @@ struct radeon_device {
	bool				suspend;
	bool				need_dma32;
	bool				new_init_path;
	bool				accel_working;
	struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES];
	const struct firmware *me_fw;	/* all family ME firmware */
	const struct firmware *pfp_fw;	/* r6/700 PFP firmware */
+18 −26
Original line number Diff line number Diff line
@@ -504,6 +504,7 @@ int radeon_device_init(struct radeon_device *rdev,
	rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT;
	rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
	rdev->gpu_lockup = false;
	rdev->accel_working = false;
	/* mutex initialization are all done here so we
	 * can recall function without having locking issues */
	mutex_init(&rdev->cs_mutex);
@@ -649,35 +650,26 @@ int radeon_device_init(struct radeon_device *rdev,
		/* Initialize GART (initialize after TTM so we can allocate
		 * memory through TTM but finalize after TTM) */
		r = radeon_gart_enable(rdev);
		if (!r) {
		if (r)
			return 0;
			r = radeon_gem_init(rdev);
		}
		if (r)
			return 0;

		/* 1M ring buffer */
		if (!r) {
		r = radeon_cp_init(rdev, 1024 * 1024);
		}
		if (!r) {
		if (r)
			return 0;
		r = radeon_wb_init(rdev);
			if (r) {
		if (r)
			DRM_ERROR("radeon: failled initializing WB (%d).\n", r);
				return r;
			}
		}
		if (!r) {
		r = radeon_ib_pool_init(rdev);
			if (r) {
				DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
				return r;
			}
		}
		if (!r) {
		if (r)
			return 0;
		r = radeon_ib_test(rdev);
			if (r) {
				DRM_ERROR("radeon: failled testing IB (%d).\n", r);
				return r;
			}
		}
		if (r)
			return 0;
		rdev->accel_working = true;
	}
	DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
	if (radeon_testing) {
+3 −0
Original line number Diff line number Diff line
@@ -112,6 +112,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
	case RADEON_INFO_NUM_Z_PIPES:
		value = rdev->num_z_pipes;
		break;
	case RADEON_INFO_ACCEL_WORKING:
		value = rdev->accel_working;
		break;
	default:
		DRM_DEBUG("Invalid request %d\n", info->request);
		return -EINVAL;
Loading