提交 733289c2 编写于 作者: J Jerome Glisse 提交者: Dave Airlie

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: NJerome Glisse <jglisse@redhat.com>
Signed-off-by: NDave Airlie <airlied@redhat.com>
上级 7cbb355e
...@@ -329,6 +329,7 @@ int r420_init(struct radeon_device *rdev) ...@@ -329,6 +329,7 @@ int r420_init(struct radeon_device *rdev)
return r; return r;
} }
r300_set_reg_safe(rdev); r300_set_reg_safe(rdev);
rdev->accel_working = true;
r = r420_resume(rdev); r = r420_resume(rdev);
if (r) { if (r) {
/* Somethings want wront with the accel init stop accel */ /* Somethings want wront with the accel init stop accel */
...@@ -343,6 +344,7 @@ int r420_init(struct radeon_device *rdev) ...@@ -343,6 +344,7 @@ int r420_init(struct radeon_device *rdev)
r100_pci_gart_fini(rdev); r100_pci_gart_fini(rdev);
radeon_agp_fini(rdev); radeon_agp_fini(rdev);
radeon_irq_kms_fini(rdev); radeon_irq_kms_fini(rdev);
rdev->accel_working = false;
} }
return 0; return 0;
} }
......
...@@ -1573,6 +1573,7 @@ int r600_init(struct radeon_device *rdev) ...@@ -1573,6 +1573,7 @@ int r600_init(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
rdev->accel_working = true;
r = r600_resume(rdev); r = r600_resume(rdev);
if (r) { if (r) {
if (rdev->flags & RADEON_IS_AGP) { if (rdev->flags & RADEON_IS_AGP) {
...@@ -1581,22 +1582,24 @@ int r600_init(struct radeon_device *rdev) ...@@ -1581,22 +1582,24 @@ int r600_init(struct radeon_device *rdev)
rdev->flags &= ~RADEON_IS_AGP; rdev->flags &= ~RADEON_IS_AGP;
return r600_init(rdev); return r600_init(rdev);
} }
return r; rdev->accel_working = false;
} }
if (rdev->accel_working) {
r = radeon_ib_pool_init(rdev); r = radeon_ib_pool_init(rdev);
if (r) { if (r) {
DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
return r; rdev->accel_working = false;
} }
r = r600_blit_init(rdev); r = r600_blit_init(rdev);
if (r) { if (r) {
DRM_ERROR("radeon: failled blitter (%d).\n", r); DRM_ERROR("radeon: failled blitter (%d).\n", r);
return r; rdev->accel_working = false;
} }
r = radeon_ib_test(rdev); r = radeon_ib_test(rdev);
if (r) { if (r) {
DRM_ERROR("radeon: failled testing IB (%d).\n", r); DRM_ERROR("radeon: failled testing IB (%d).\n", r);
return r; rdev->accel_working = false;
}
} }
return 0; return 0;
} }
......
...@@ -793,6 +793,7 @@ struct radeon_device { ...@@ -793,6 +793,7 @@ struct radeon_device {
bool suspend; bool suspend;
bool need_dma32; bool need_dma32;
bool new_init_path; bool new_init_path;
bool accel_working;
struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES]; struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES];
const struct firmware *me_fw; /* all family ME firmware */ const struct firmware *me_fw; /* all family ME firmware */
const struct firmware *pfp_fw; /* r6/700 PFP firmware */ const struct firmware *pfp_fw; /* r6/700 PFP firmware */
......
...@@ -504,6 +504,7 @@ int radeon_device_init(struct radeon_device *rdev, ...@@ -504,6 +504,7 @@ int radeon_device_init(struct radeon_device *rdev,
rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT; rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT;
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
rdev->gpu_lockup = false; rdev->gpu_lockup = false;
rdev->accel_working = false;
/* mutex initialization are all done here so we /* mutex initialization are all done here so we
* can recall function without having locking issues */ * can recall function without having locking issues */
mutex_init(&rdev->cs_mutex); mutex_init(&rdev->cs_mutex);
...@@ -649,35 +650,26 @@ int radeon_device_init(struct radeon_device *rdev, ...@@ -649,35 +650,26 @@ int radeon_device_init(struct radeon_device *rdev,
/* Initialize GART (initialize after TTM so we can allocate /* Initialize GART (initialize after TTM so we can allocate
* memory through TTM but finalize after TTM) */ * memory through TTM but finalize after TTM) */
r = radeon_gart_enable(rdev); r = radeon_gart_enable(rdev);
if (!r) { if (r)
return 0;
r = radeon_gem_init(rdev); r = radeon_gem_init(rdev);
} if (r)
return 0;
/* 1M ring buffer */ /* 1M ring buffer */
if (!r) {
r = radeon_cp_init(rdev, 1024 * 1024); r = radeon_cp_init(rdev, 1024 * 1024);
} if (r)
if (!r) { return 0;
r = radeon_wb_init(rdev); r = radeon_wb_init(rdev);
if (r) { if (r)
DRM_ERROR("radeon: failled initializing WB (%d).\n", r); DRM_ERROR("radeon: failled initializing WB (%d).\n", r);
return r;
}
}
if (!r) {
r = radeon_ib_pool_init(rdev); r = radeon_ib_pool_init(rdev);
if (r) { if (r)
DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); return 0;
return r;
}
}
if (!r) {
r = radeon_ib_test(rdev); r = radeon_ib_test(rdev);
if (r) { if (r)
DRM_ERROR("radeon: failled testing IB (%d).\n", r); return 0;
return r; rdev->accel_working = true;
}
}
} }
DRM_INFO("radeon: kernel modesetting successfully initialized.\n"); DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
if (radeon_testing) { if (radeon_testing) {
......
...@@ -112,6 +112,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) ...@@ -112,6 +112,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
case RADEON_INFO_NUM_Z_PIPES: case RADEON_INFO_NUM_Z_PIPES:
value = rdev->num_z_pipes; value = rdev->num_z_pipes;
break; break;
case RADEON_INFO_ACCEL_WORKING:
value = rdev->accel_working;
break;
default: default:
DRM_DEBUG("Invalid request %d\n", info->request); DRM_DEBUG("Invalid request %d\n", info->request);
return -EINVAL; return -EINVAL;
......
...@@ -953,6 +953,7 @@ int rv770_init(struct radeon_device *rdev) ...@@ -953,6 +953,7 @@ int rv770_init(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
rdev->accel_working = true;
r = rv770_resume(rdev); r = rv770_resume(rdev);
if (r) { if (r) {
if (rdev->flags & RADEON_IS_AGP) { if (rdev->flags & RADEON_IS_AGP) {
...@@ -961,22 +962,24 @@ int rv770_init(struct radeon_device *rdev) ...@@ -961,22 +962,24 @@ int rv770_init(struct radeon_device *rdev)
rdev->flags &= ~RADEON_IS_AGP; rdev->flags &= ~RADEON_IS_AGP;
return rv770_init(rdev); return rv770_init(rdev);
} }
return r; rdev->accel_working = false;
} }
if (rdev->accel_working) {
r = r600_blit_init(rdev); r = r600_blit_init(rdev);
if (r) { if (r) {
DRM_ERROR("radeon: failled blitter (%d).\n", r); DRM_ERROR("radeon: failled blitter (%d).\n", r);
return r; rdev->accel_working = false;
} }
r = radeon_ib_pool_init(rdev); r = radeon_ib_pool_init(rdev);
if (r) { if (r) {
DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
return r; rdev->accel_working = false;
} }
r = radeon_ib_test(rdev); r = radeon_ib_test(rdev);
if (r) { if (r) {
DRM_ERROR("radeon: failled testing IB (%d).\n", r); DRM_ERROR("radeon: failled testing IB (%d).\n", r);
return r; rdev->accel_working = false;
}
} }
return 0; return 0;
} }
......
...@@ -899,6 +899,7 @@ struct drm_radeon_cs { ...@@ -899,6 +899,7 @@ struct drm_radeon_cs {
#define RADEON_INFO_DEVICE_ID 0x00 #define RADEON_INFO_DEVICE_ID 0x00
#define RADEON_INFO_NUM_GB_PIPES 0x01 #define RADEON_INFO_NUM_GB_PIPES 0x01
#define RADEON_INFO_NUM_Z_PIPES 0x02 #define RADEON_INFO_NUM_Z_PIPES 0x02
#define RADEON_INFO_ACCEL_WORKING 0x03
struct drm_radeon_info { struct drm_radeon_info {
uint32_t request; uint32_t request;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册