diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_kms.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_kms.c | 76 |
1 files changed, 39 insertions, 37 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index ba128621057a..c633319f98ed 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -30,10 +30,22 @@ | |||
30 | #include "radeon.h" | 30 | #include "radeon.h" |
31 | #include "radeon_drm.h" | 31 | #include "radeon_drm.h" |
32 | 32 | ||
33 | #include <linux/vga_switcheroo.h> | ||
34 | #include <linux/slab.h> | ||
35 | |||
36 | int radeon_driver_unload_kms(struct drm_device *dev) | ||
37 | { | ||
38 | struct radeon_device *rdev = dev->dev_private; | ||
39 | |||
40 | if (rdev == NULL) | ||
41 | return 0; | ||
42 | radeon_modeset_fini(rdev); | ||
43 | radeon_device_fini(rdev); | ||
44 | kfree(rdev); | ||
45 | dev->dev_private = NULL; | ||
46 | return 0; | ||
47 | } | ||
33 | 48 | ||
34 | /* | ||
35 | * Driver load/unload | ||
36 | */ | ||
37 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) | 49 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) |
38 | { | 50 | { |
39 | struct radeon_device *rdev; | 51 | struct radeon_device *rdev; |
@@ -62,31 +74,20 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) | |||
62 | */ | 74 | */ |
63 | r = radeon_device_init(rdev, dev, dev->pdev, flags); | 75 | r = radeon_device_init(rdev, dev, dev->pdev, flags); |
64 | if (r) { | 76 | if (r) { |
65 | DRM_ERROR("Fatal error while trying to initialize radeon.\n"); | 77 | dev_err(&dev->pdev->dev, "Fatal error during GPU init\n"); |
66 | return r; | 78 | goto out; |
67 | } | 79 | } |
68 | /* Again modeset_init should fail only on fatal error | 80 | /* Again modeset_init should fail only on fatal error |
69 | * otherwise it should provide enough functionalities | 81 | * otherwise it should provide enough functionalities |
70 | * for shadowfb to run | 82 | * for shadowfb to run |
71 | */ | 83 | */ |
72 | r = radeon_modeset_init(rdev); | 84 | r = radeon_modeset_init(rdev); |
73 | if (r) { | 85 | if (r) |
74 | return r; | 86 | dev_err(&dev->pdev->dev, "Fatal error during modeset init\n"); |
75 | } | 87 | out: |
76 | return 0; | 88 | if (r) |
77 | } | 89 | radeon_driver_unload_kms(dev); |
78 | 90 | return r; | |
79 | int radeon_driver_unload_kms(struct drm_device *dev) | ||
80 | { | ||
81 | struct radeon_device *rdev = dev->dev_private; | ||
82 | |||
83 | if (rdev == NULL) | ||
84 | return 0; | ||
85 | radeon_modeset_fini(rdev); | ||
86 | radeon_device_fini(rdev); | ||
87 | kfree(rdev); | ||
88 | dev->dev_private = NULL; | ||
89 | return 0; | ||
90 | } | 91 | } |
91 | 92 | ||
92 | 93 | ||
@@ -138,6 +139,7 @@ int radeon_driver_firstopen_kms(struct drm_device *dev) | |||
138 | 139 | ||
139 | void radeon_driver_lastclose_kms(struct drm_device *dev) | 140 | void radeon_driver_lastclose_kms(struct drm_device *dev) |
140 | { | 141 | { |
142 | vga_switcheroo_process_delayed_switch(); | ||
141 | } | 143 | } |
142 | 144 | ||
143 | int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | 145 | int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) |
@@ -163,7 +165,7 @@ u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc) | |||
163 | { | 165 | { |
164 | struct radeon_device *rdev = dev->dev_private; | 166 | struct radeon_device *rdev = dev->dev_private; |
165 | 167 | ||
166 | if (crtc < 0 || crtc > 1) { | 168 | if (crtc < 0 || crtc >= rdev->num_crtc) { |
167 | DRM_ERROR("Invalid crtc %d\n", crtc); | 169 | DRM_ERROR("Invalid crtc %d\n", crtc); |
168 | return -EINVAL; | 170 | return -EINVAL; |
169 | } | 171 | } |
@@ -175,7 +177,7 @@ int radeon_enable_vblank_kms(struct drm_device *dev, int crtc) | |||
175 | { | 177 | { |
176 | struct radeon_device *rdev = dev->dev_private; | 178 | struct radeon_device *rdev = dev->dev_private; |
177 | 179 | ||
178 | if (crtc < 0 || crtc > 1) { | 180 | if (crtc < 0 || crtc >= rdev->num_crtc) { |
179 | DRM_ERROR("Invalid crtc %d\n", crtc); | 181 | DRM_ERROR("Invalid crtc %d\n", crtc); |
180 | return -EINVAL; | 182 | return -EINVAL; |
181 | } | 183 | } |
@@ -189,7 +191,7 @@ void radeon_disable_vblank_kms(struct drm_device *dev, int crtc) | |||
189 | { | 191 | { |
190 | struct radeon_device *rdev = dev->dev_private; | 192 | struct radeon_device *rdev = dev->dev_private; |
191 | 193 | ||
192 | if (crtc < 0 || crtc > 1) { | 194 | if (crtc < 0 || crtc >= rdev->num_crtc) { |
193 | DRM_ERROR("Invalid crtc %d\n", crtc); | 195 | DRM_ERROR("Invalid crtc %d\n", crtc); |
194 | return; | 196 | return; |
195 | } | 197 | } |
@@ -278,17 +280,17 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = { | |||
278 | DRM_IOCTL_DEF(DRM_RADEON_SURF_ALLOC, radeon_surface_alloc_kms, DRM_AUTH), | 280 | DRM_IOCTL_DEF(DRM_RADEON_SURF_ALLOC, radeon_surface_alloc_kms, DRM_AUTH), |
279 | DRM_IOCTL_DEF(DRM_RADEON_SURF_FREE, radeon_surface_free_kms, DRM_AUTH), | 281 | DRM_IOCTL_DEF(DRM_RADEON_SURF_FREE, radeon_surface_free_kms, DRM_AUTH), |
280 | /* KMS */ | 282 | /* KMS */ |
281 | DRM_IOCTL_DEF(DRM_RADEON_GEM_INFO, radeon_gem_info_ioctl, DRM_AUTH), | 283 | DRM_IOCTL_DEF(DRM_RADEON_GEM_INFO, radeon_gem_info_ioctl, DRM_AUTH|DRM_UNLOCKED), |
282 | DRM_IOCTL_DEF(DRM_RADEON_GEM_CREATE, radeon_gem_create_ioctl, DRM_AUTH), | 284 | DRM_IOCTL_DEF(DRM_RADEON_GEM_CREATE, radeon_gem_create_ioctl, DRM_AUTH|DRM_UNLOCKED), |
283 | DRM_IOCTL_DEF(DRM_RADEON_GEM_MMAP, radeon_gem_mmap_ioctl, DRM_AUTH), | 285 | DRM_IOCTL_DEF(DRM_RADEON_GEM_MMAP, radeon_gem_mmap_ioctl, DRM_AUTH|DRM_UNLOCKED), |
284 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_DOMAIN, radeon_gem_set_domain_ioctl, DRM_AUTH), | 286 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_DOMAIN, radeon_gem_set_domain_ioctl, DRM_AUTH|DRM_UNLOCKED), |
285 | DRM_IOCTL_DEF(DRM_RADEON_GEM_PREAD, radeon_gem_pread_ioctl, DRM_AUTH), | 287 | DRM_IOCTL_DEF(DRM_RADEON_GEM_PREAD, radeon_gem_pread_ioctl, DRM_AUTH|DRM_UNLOCKED), |
286 | DRM_IOCTL_DEF(DRM_RADEON_GEM_PWRITE, radeon_gem_pwrite_ioctl, DRM_AUTH), | 288 | DRM_IOCTL_DEF(DRM_RADEON_GEM_PWRITE, radeon_gem_pwrite_ioctl, DRM_AUTH|DRM_UNLOCKED), |
287 | DRM_IOCTL_DEF(DRM_RADEON_GEM_WAIT_IDLE, radeon_gem_wait_idle_ioctl, DRM_AUTH), | 289 | DRM_IOCTL_DEF(DRM_RADEON_GEM_WAIT_IDLE, radeon_gem_wait_idle_ioctl, DRM_AUTH|DRM_UNLOCKED), |
288 | DRM_IOCTL_DEF(DRM_RADEON_CS, radeon_cs_ioctl, DRM_AUTH), | 290 | DRM_IOCTL_DEF(DRM_RADEON_CS, radeon_cs_ioctl, DRM_AUTH|DRM_UNLOCKED), |
289 | DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH), | 291 | DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH|DRM_UNLOCKED), |
290 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH), | 292 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED), |
291 | DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH), | 293 | DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH|DRM_UNLOCKED), |
292 | DRM_IOCTL_DEF(DRM_RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH), | 294 | DRM_IOCTL_DEF(DRM_RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH|DRM_UNLOCKED), |
293 | }; | 295 | }; |
294 | int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); | 296 | int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); |