Commit 6cf8a3f5 authored by Jerome Glisse's avatar Jerome Glisse Committed by Dave Airlie

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: default avatarJerome Glisse <jglisse@redhat.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 923f6848
...@@ -933,6 +933,10 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment