drm/radeon/kms: move modeset init outside of GPU init
authorJerome Glisse <jglisse@redhat.com>
Thu, 10 Sep 2009 19:46:48 +0000 (21:46 +0200)
committerDave Airlie <airlied@redhat.com>
Fri, 11 Sep 2009 05:53:59 +0000 (15:53 +1000)
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>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_kms.c

index d6ff4e012063cb61c7f0d747bc6cfa8899a089b9..23ede0e4783ed82ac27691c8975a52dd60097803 100644 (file)
@@ -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_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 */
 void r100_cp_disable(struct radeon_device *rdev);
 void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
index bf6939497e15bcc5ed42328b5f9e97b9f5a3f959..72f6262ea73bc301ce7dbbdf1c93c3f0dbbd930a 100644 (file)
@@ -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.
@@ -481,7 +478,7 @@ int radeon_device_init(struct radeon_device *rdev,
                       struct pci_dev *pdev,
                       uint32_t flags)
 {
-       int r, ret = 0;
+       int r;
        int dma_bits;
 
        DRM_INFO("radeon: Initializing kernel modesetting.\n");
@@ -660,33 +657,22 @@ int radeon_device_init(struct radeon_device *rdev,
                                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) {
                radeon_test_moves(rdev);
        }
        if (radeon_benchmarking) {
                radeon_benchmark(rdev);
        }
-       return ret;
+       return 0;
 }
 
 void radeon_device_fini(struct radeon_device *rdev)
 {
-       if (rdev == NULL || rdev->rmmio == NULL) {
-               return;
-       }
        DRM_INFO("radeon: finishing device.\n");
        rdev->shutdown = true;
        /* Order matter so becarefull if you rearrange anythings */
-       radeon_modeset_fini(rdev);
        if (!rdev->new_init_path) {
                radeon_ib_pool_fini(rdev);
                radeon_cp_fini(rdev);
index dce09ada32bcc9461db496c23127b31303d8049b..ac8505fe2ca77bde46d70811f936eb7cb54796b2 100644 (file)
@@ -54,12 +54,23 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
                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);
        if (r) {
-               DRM_ERROR("Failed to initialize radeon, disabling IOCTL\n");
-               radeon_device_fini(rdev);
-               kfree(rdev);
-               dev->dev_private = NULL;
+               DRM_ERROR("Fatal error while trying to initialize radeon.\n");
+               return r;
+       }
+       /* 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 0;
@@ -69,6 +80,9 @@ int radeon_driver_unload_kms(struct drm_device *dev)
 {
        struct radeon_device *rdev = dev->dev_private;
 
+       if (rdev == NULL)
+               return 0;
+       radeon_modeset_fini(rdev);
        radeon_device_fini(rdev);
        kfree(rdev);
        dev->dev_private = NULL;