drm/radeon/kms: move modeset init outside of GPU init
We are splitting GPU & modeset init so that it's easier to abord only remaining GPU init when somethings fails. We want to always provide enough funcionalities to get fbcon and a shadowfb X working. Only acceptable error during initialization are memory allocation failure or io mapping failure. Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
923f6848e1
commit
6cf8a3f588
@ -933,6 +933,10 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
|
|||||||
#define radeon_clear_surface_reg(rdev, r) ((rdev)->asic->clear_surface_reg((rdev), (r)))
|
#define radeon_clear_surface_reg(rdev, r) ((rdev)->asic->clear_surface_reg((rdev), (r)))
|
||||||
#define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev))
|
#define radeon_bandwidth_update(rdev) (rdev)->asic->bandwidth_update((rdev))
|
||||||
|
|
||||||
|
/* Common functions */
|
||||||
|
int radeon_modeset_init(struct radeon_device *rdev);
|
||||||
|
void radeon_modeset_fini(struct radeon_device *rdev);
|
||||||
|
|
||||||
/* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */
|
/* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */
|
||||||
void r100_cp_disable(struct radeon_device *rdev);
|
void r100_cp_disable(struct radeon_device *rdev);
|
||||||
void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
|
void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
|
||||||
|
@ -469,9 +469,6 @@ void radeon_combios_fini(struct radeon_device *rdev)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int radeon_modeset_init(struct radeon_device *rdev);
|
|
||||||
void radeon_modeset_fini(struct radeon_device *rdev);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Radeon device.
|
* Radeon device.
|
||||||
@ -481,7 +478,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||||||
struct pci_dev *pdev,
|
struct pci_dev *pdev,
|
||||||
uint32_t flags)
|
uint32_t flags)
|
||||||
{
|
{
|
||||||
int r, ret = 0;
|
int r;
|
||||||
int dma_bits;
|
int dma_bits;
|
||||||
|
|
||||||
DRM_INFO("radeon: Initializing kernel modesetting.\n");
|
DRM_INFO("radeon: Initializing kernel modesetting.\n");
|
||||||
@ -660,33 +657,22 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = r;
|
|
||||||
}
|
|
||||||
r = radeon_modeset_init(rdev);
|
|
||||||
if (r) {
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
if (!ret) {
|
|
||||||
DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
|
|
||||||
}
|
}
|
||||||
|
DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
|
||||||
if (radeon_testing) {
|
if (radeon_testing) {
|
||||||
radeon_test_moves(rdev);
|
radeon_test_moves(rdev);
|
||||||
}
|
}
|
||||||
if (radeon_benchmarking) {
|
if (radeon_benchmarking) {
|
||||||
radeon_benchmark(rdev);
|
radeon_benchmark(rdev);
|
||||||
}
|
}
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void radeon_device_fini(struct radeon_device *rdev)
|
void radeon_device_fini(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
if (rdev == NULL || rdev->rmmio == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
DRM_INFO("radeon: finishing device.\n");
|
DRM_INFO("radeon: finishing device.\n");
|
||||||
rdev->shutdown = true;
|
rdev->shutdown = true;
|
||||||
/* Order matter so becarefull if you rearrange anythings */
|
/* Order matter so becarefull if you rearrange anythings */
|
||||||
radeon_modeset_fini(rdev);
|
|
||||||
if (!rdev->new_init_path) {
|
if (!rdev->new_init_path) {
|
||||||
radeon_ib_pool_fini(rdev);
|
radeon_ib_pool_fini(rdev);
|
||||||
radeon_cp_fini(rdev);
|
radeon_cp_fini(rdev);
|
||||||
|
@ -54,12 +54,23 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
|
|||||||
flags |= RADEON_IS_PCI;
|
flags |= RADEON_IS_PCI;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* radeon_device_init should report only fatal error
|
||||||
|
* like memory allocation failure or iomapping failure,
|
||||||
|
* or memory manager initialization failure, it must
|
||||||
|
* properly initialize the GPU MC controller and permit
|
||||||
|
* VRAM allocation
|
||||||
|
*/
|
||||||
r = radeon_device_init(rdev, dev, dev->pdev, flags);
|
r = radeon_device_init(rdev, dev, dev->pdev, flags);
|
||||||
if (r) {
|
if (r) {
|
||||||
DRM_ERROR("Failed to initialize radeon, disabling IOCTL\n");
|
DRM_ERROR("Fatal error while trying to initialize radeon.\n");
|
||||||
radeon_device_fini(rdev);
|
return r;
|
||||||
kfree(rdev);
|
}
|
||||||
dev->dev_private = NULL;
|
/* Again modeset_init should fail only on fatal error
|
||||||
|
* otherwise it should provide enough functionalities
|
||||||
|
* for shadowfb to run
|
||||||
|
*/
|
||||||
|
r = radeon_modeset_init(rdev);
|
||||||
|
if (r) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -69,6 +80,9 @@ int radeon_driver_unload_kms(struct drm_device *dev)
|
|||||||
{
|
{
|
||||||
struct radeon_device *rdev = dev->dev_private;
|
struct radeon_device *rdev = dev->dev_private;
|
||||||
|
|
||||||
|
if (rdev == NULL)
|
||||||
|
return 0;
|
||||||
|
radeon_modeset_fini(rdev);
|
||||||
radeon_device_fini(rdev);
|
radeon_device_fini(rdev);
|
||||||
kfree(rdev);
|
kfree(rdev);
|
||||||
dev->dev_private = NULL;
|
dev->dev_private = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user