diff options
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_cmd.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_display.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.h | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_ioctl.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r300_cmdbuf.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.c | 12 | ||||
| -rw-r--r-- | include/drm/drm_os_linux.h | 9 |
7 files changed, 36 insertions, 41 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index 08b0823c93d5..f86771481317 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c | |||
| @@ -277,7 +277,7 @@ out_unref: | |||
| 277 | return 0; | 277 | return 0; |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port) | 280 | static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port, bool intr) |
| 281 | { | 281 | { |
| 282 | int irq_num; | 282 | int irq_num; |
| 283 | long addr = qdev->io_base + port; | 283 | long addr = qdev->io_base + port; |
| @@ -285,20 +285,29 @@ static int wait_for_io_cmd_user(struct qxl_device *qdev, uint8_t val, long port) | |||
| 285 | 285 | ||
| 286 | mutex_lock(&qdev->async_io_mutex); | 286 | mutex_lock(&qdev->async_io_mutex); |
| 287 | irq_num = atomic_read(&qdev->irq_received_io_cmd); | 287 | irq_num = atomic_read(&qdev->irq_received_io_cmd); |
| 288 | |||
| 289 | |||
| 290 | if (qdev->last_sent_io_cmd > irq_num) { | 288 | if (qdev->last_sent_io_cmd > irq_num) { |
| 291 | ret = wait_event_interruptible(qdev->io_cmd_event, | 289 | if (intr) |
| 292 | atomic_read(&qdev->irq_received_io_cmd) > irq_num); | 290 | ret = wait_event_interruptible_timeout(qdev->io_cmd_event, |
| 293 | if (ret) | 291 | atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); |
| 292 | else | ||
| 293 | ret = wait_event_timeout(qdev->io_cmd_event, | ||
| 294 | atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); | ||
| 295 | /* 0 is timeout, just bail the "hw" has gone away */ | ||
| 296 | if (ret <= 0) | ||
| 294 | goto out; | 297 | goto out; |
| 295 | irq_num = atomic_read(&qdev->irq_received_io_cmd); | 298 | irq_num = atomic_read(&qdev->irq_received_io_cmd); |
| 296 | } | 299 | } |
| 297 | outb(val, addr); | 300 | outb(val, addr); |
| 298 | qdev->last_sent_io_cmd = irq_num + 1; | 301 | qdev->last_sent_io_cmd = irq_num + 1; |
| 299 | ret = wait_event_interruptible(qdev->io_cmd_event, | 302 | if (intr) |
| 300 | atomic_read(&qdev->irq_received_io_cmd) > irq_num); | 303 | ret = wait_event_interruptible_timeout(qdev->io_cmd_event, |
| 304 | atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); | ||
| 305 | else | ||
| 306 | ret = wait_event_timeout(qdev->io_cmd_event, | ||
| 307 | atomic_read(&qdev->irq_received_io_cmd) > irq_num, 5*HZ); | ||
| 301 | out: | 308 | out: |
| 309 | if (ret > 0) | ||
| 310 | ret = 0; | ||
| 302 | mutex_unlock(&qdev->async_io_mutex); | 311 | mutex_unlock(&qdev->async_io_mutex); |
| 303 | return ret; | 312 | return ret; |
| 304 | } | 313 | } |
| @@ -308,7 +317,7 @@ static void wait_for_io_cmd(struct qxl_device *qdev, uint8_t val, long port) | |||
| 308 | int ret; | 317 | int ret; |
| 309 | 318 | ||
| 310 | restart: | 319 | restart: |
| 311 | ret = wait_for_io_cmd_user(qdev, val, port); | 320 | ret = wait_for_io_cmd_user(qdev, val, port, false); |
| 312 | if (ret == -ERESTARTSYS) | 321 | if (ret == -ERESTARTSYS) |
| 313 | goto restart; | 322 | goto restart; |
| 314 | } | 323 | } |
| @@ -340,7 +349,7 @@ int qxl_io_update_area(struct qxl_device *qdev, struct qxl_bo *surf, | |||
| 340 | mutex_lock(&qdev->update_area_mutex); | 349 | mutex_lock(&qdev->update_area_mutex); |
| 341 | qdev->ram_header->update_area = *area; | 350 | qdev->ram_header->update_area = *area; |
| 342 | qdev->ram_header->update_surface = surface_id; | 351 | qdev->ram_header->update_surface = surface_id; |
| 343 | ret = wait_for_io_cmd_user(qdev, 0, QXL_IO_UPDATE_AREA_ASYNC); | 352 | ret = wait_for_io_cmd_user(qdev, 0, QXL_IO_UPDATE_AREA_ASYNC, true); |
| 344 | mutex_unlock(&qdev->update_area_mutex); | 353 | mutex_unlock(&qdev->update_area_mutex); |
| 345 | return ret; | 354 | return ret; |
| 346 | } | 355 | } |
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index fcfd4436ceed..823d29e926ec 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c | |||
| @@ -428,10 +428,10 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb, | |||
| 428 | int inc = 1; | 428 | int inc = 1; |
| 429 | 429 | ||
| 430 | qobj = gem_to_qxl_bo(qxl_fb->obj); | 430 | qobj = gem_to_qxl_bo(qxl_fb->obj); |
| 431 | if (qxl_fb != qdev->active_user_framebuffer) { | 431 | /* if we aren't primary surface ignore this */ |
| 432 | DRM_INFO("%s: qxl_fb 0x%p != qdev->active_user_framebuffer 0x%p\n", | 432 | if (!qobj->is_primary) |
| 433 | __func__, qxl_fb, qdev->active_user_framebuffer); | 433 | return 0; |
| 434 | } | 434 | |
| 435 | if (!num_clips) { | 435 | if (!num_clips) { |
| 436 | num_clips = 1; | 436 | num_clips = 1; |
| 437 | clips = &norect; | 437 | clips = &norect; |
| @@ -604,7 +604,6 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc, | |||
| 604 | mode->hdisplay, | 604 | mode->hdisplay, |
| 605 | mode->vdisplay); | 605 | mode->vdisplay); |
| 606 | } | 606 | } |
| 607 | qdev->mode_set = true; | ||
| 608 | return 0; | 607 | return 0; |
| 609 | } | 608 | } |
| 610 | 609 | ||
| @@ -893,7 +892,6 @@ qxl_user_framebuffer_create(struct drm_device *dev, | |||
| 893 | { | 892 | { |
| 894 | struct drm_gem_object *obj; | 893 | struct drm_gem_object *obj; |
| 895 | struct qxl_framebuffer *qxl_fb; | 894 | struct qxl_framebuffer *qxl_fb; |
| 896 | struct qxl_device *qdev = dev->dev_private; | ||
| 897 | int ret; | 895 | int ret; |
| 898 | 896 | ||
| 899 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); | 897 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); |
| @@ -909,13 +907,6 @@ qxl_user_framebuffer_create(struct drm_device *dev, | |||
| 909 | return NULL; | 907 | return NULL; |
| 910 | } | 908 | } |
| 911 | 909 | ||
| 912 | if (qdev->active_user_framebuffer) { | ||
| 913 | DRM_INFO("%s: active_user_framebuffer %p -> %p\n", | ||
| 914 | __func__, | ||
| 915 | qdev->active_user_framebuffer, qxl_fb); | ||
| 916 | } | ||
| 917 | qdev->active_user_framebuffer = qxl_fb; | ||
| 918 | |||
| 919 | return &qxl_fb->base; | 910 | return &qxl_fb->base; |
| 920 | } | 911 | } |
| 921 | 912 | ||
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index 52b582c211da..43d06ab28a21 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h | |||
| @@ -255,12 +255,6 @@ struct qxl_device { | |||
| 255 | struct qxl_gem gem; | 255 | struct qxl_gem gem; |
| 256 | struct qxl_mode_info mode_info; | 256 | struct qxl_mode_info mode_info; |
| 257 | 257 | ||
| 258 | /* | ||
| 259 | * last created framebuffer with fb_create | ||
| 260 | * only used by debugfs dumbppm | ||
| 261 | */ | ||
| 262 | struct qxl_framebuffer *active_user_framebuffer; | ||
| 263 | |||
| 264 | struct fb_info *fbdev_info; | 258 | struct fb_info *fbdev_info; |
| 265 | struct qxl_framebuffer *fbdev_qfb; | 259 | struct qxl_framebuffer *fbdev_qfb; |
| 266 | void *ram_physical; | 260 | void *ram_physical; |
| @@ -270,7 +264,6 @@ struct qxl_device { | |||
| 270 | struct qxl_ring *cursor_ring; | 264 | struct qxl_ring *cursor_ring; |
| 271 | 265 | ||
| 272 | struct qxl_ram_header *ram_header; | 266 | struct qxl_ram_header *ram_header; |
| 273 | bool mode_set; | ||
| 274 | 267 | ||
| 275 | bool primary_created; | 268 | bool primary_created; |
| 276 | 269 | ||
diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index 04b64f9cbfdb..6db7370373ea 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c | |||
| @@ -294,6 +294,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data, | |||
| 294 | goto out; | 294 | goto out; |
| 295 | 295 | ||
| 296 | if (!qobj->pin_count) { | 296 | if (!qobj->pin_count) { |
| 297 | qxl_ttm_placement_from_domain(qobj, qobj->type); | ||
| 297 | ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, | 298 | ret = ttm_bo_validate(&qobj->tbo, &qobj->placement, |
| 298 | true, false); | 299 | true, false); |
| 299 | if (unlikely(ret)) | 300 | if (unlikely(ret)) |
diff --git a/drivers/gpu/drm/radeon/r300_cmdbuf.c b/drivers/gpu/drm/radeon/r300_cmdbuf.c index 865e2c9980db..60170ea5e3a2 100644 --- a/drivers/gpu/drm/radeon/r300_cmdbuf.c +++ b/drivers/gpu/drm/radeon/r300_cmdbuf.c | |||
| @@ -75,7 +75,7 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv, | |||
| 75 | OUT_RING(CP_PACKET0(R300_RE_CLIPRECT_TL_0, nr * 2 - 1)); | 75 | OUT_RING(CP_PACKET0(R300_RE_CLIPRECT_TL_0, nr * 2 - 1)); |
| 76 | 76 | ||
| 77 | for (i = 0; i < nr; ++i) { | 77 | for (i = 0; i < nr; ++i) { |
| 78 | if (DRM_COPY_FROM_USER_UNCHECKED | 78 | if (DRM_COPY_FROM_USER |
| 79 | (&box, &cmdbuf->boxes[n + i], sizeof(box))) { | 79 | (&box, &cmdbuf->boxes[n + i], sizeof(box))) { |
| 80 | DRM_ERROR("copy cliprect faulted\n"); | 80 | DRM_ERROR("copy cliprect faulted\n"); |
| 81 | return -EFAULT; | 81 | return -EFAULT; |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index d33f484ace48..094e7e5ea39e 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
| @@ -147,7 +147,7 @@ static inline void radeon_unregister_atpx_handler(void) {} | |||
| 147 | #endif | 147 | #endif |
| 148 | 148 | ||
| 149 | int radeon_no_wb; | 149 | int radeon_no_wb; |
| 150 | int radeon_modeset = 1; | 150 | int radeon_modeset = -1; |
| 151 | int radeon_dynclks = -1; | 151 | int radeon_dynclks = -1; |
| 152 | int radeon_r4xx_atom = 0; | 152 | int radeon_r4xx_atom = 0; |
| 153 | int radeon_agpmode = 0; | 153 | int radeon_agpmode = 0; |
| @@ -456,6 +456,16 @@ static struct pci_driver radeon_kms_pci_driver = { | |||
| 456 | 456 | ||
| 457 | static int __init radeon_init(void) | 457 | static int __init radeon_init(void) |
| 458 | { | 458 | { |
| 459 | #ifdef CONFIG_VGA_CONSOLE | ||
| 460 | if (vgacon_text_force() && radeon_modeset == -1) { | ||
| 461 | DRM_INFO("VGACON disable radeon kernel modesetting.\n"); | ||
| 462 | radeon_modeset = 0; | ||
| 463 | } | ||
| 464 | #endif | ||
| 465 | /* set to modesetting by default if not nomodeset */ | ||
| 466 | if (radeon_modeset == -1) | ||
| 467 | radeon_modeset = 1; | ||
| 468 | |||
| 459 | if (radeon_modeset == 1) { | 469 | if (radeon_modeset == 1) { |
| 460 | DRM_INFO("radeon kernel modesetting enabled.\n"); | 470 | DRM_INFO("radeon kernel modesetting enabled.\n"); |
| 461 | driver = &kms_driver; | 471 | driver = &kms_driver; |
diff --git a/include/drm/drm_os_linux.h b/include/drm/drm_os_linux.h index 393369147a2d..675ddf4b441f 100644 --- a/include/drm/drm_os_linux.h +++ b/include/drm/drm_os_linux.h | |||
| @@ -87,15 +87,6 @@ static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size) | |||
| 87 | /** Other copying of data from kernel space */ | 87 | /** Other copying of data from kernel space */ |
| 88 | #define DRM_COPY_TO_USER(arg1, arg2, arg3) \ | 88 | #define DRM_COPY_TO_USER(arg1, arg2, arg3) \ |
| 89 | copy_to_user(arg1, arg2, arg3) | 89 | copy_to_user(arg1, arg2, arg3) |
| 90 | /* Macros for copyfrom user, but checking readability only once */ | ||
| 91 | #define DRM_VERIFYAREA_READ( uaddr, size ) \ | ||
| 92 | (access_ok( VERIFY_READ, uaddr, size ) ? 0 : -EFAULT) | ||
| 93 | #define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3) \ | ||
| 94 | __copy_from_user(arg1, arg2, arg3) | ||
| 95 | #define DRM_COPY_TO_USER_UNCHECKED(arg1, arg2, arg3) \ | ||
| 96 | __copy_to_user(arg1, arg2, arg3) | ||
| 97 | #define DRM_GET_USER_UNCHECKED(val, uaddr) \ | ||
| 98 | __get_user(val, uaddr) | ||
| 99 | 90 | ||
| 100 | #define DRM_HZ HZ | 91 | #define DRM_HZ HZ |
| 101 | 92 | ||
