diff options
| -rw-r--r-- | drivers/gpu/drm/rcar-du/rcar_lvds.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_msg.c | 48 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_msg.h | 25 |
6 files changed, 58 insertions, 46 deletions
diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c index 3d2d3bbd1342..155ad840f3c5 100644 --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c | |||
| @@ -88,6 +88,9 @@ static int rcar_lvds_connector_atomic_check(struct drm_connector *connector, | |||
| 88 | const struct drm_display_mode *panel_mode; | 88 | const struct drm_display_mode *panel_mode; |
| 89 | struct drm_crtc_state *crtc_state; | 89 | struct drm_crtc_state *crtc_state; |
| 90 | 90 | ||
| 91 | if (!state->crtc) | ||
| 92 | return 0; | ||
| 93 | |||
| 91 | if (list_empty(&connector->modes)) { | 94 | if (list_empty(&connector->modes)) { |
| 92 | dev_dbg(lvds->dev, "connector: empty modes list\n"); | 95 | dev_dbg(lvds->dev, "connector: empty modes list\n"); |
| 93 | return -EINVAL; | 96 | return -EINVAL; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 70e1a8820a7c..8b770a8e02cd 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
| @@ -1278,8 +1278,6 @@ static void vmw_master_drop(struct drm_device *dev, | |||
| 1278 | dev_priv->active_master = &dev_priv->fbdev_master; | 1278 | dev_priv->active_master = &dev_priv->fbdev_master; |
| 1279 | ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM); | 1279 | ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM); |
| 1280 | ttm_vt_unlock(&dev_priv->fbdev_master.lock); | 1280 | ttm_vt_unlock(&dev_priv->fbdev_master.lock); |
| 1281 | |||
| 1282 | vmw_fb_refresh(dev_priv); | ||
| 1283 | } | 1281 | } |
| 1284 | 1282 | ||
| 1285 | /** | 1283 | /** |
| @@ -1483,7 +1481,6 @@ static int vmw_pm_freeze(struct device *kdev) | |||
| 1483 | vmw_kms_resume(dev); | 1481 | vmw_kms_resume(dev); |
| 1484 | if (dev_priv->enable_fb) | 1482 | if (dev_priv->enable_fb) |
| 1485 | vmw_fb_on(dev_priv); | 1483 | vmw_fb_on(dev_priv); |
| 1486 | vmw_fb_refresh(dev_priv); | ||
| 1487 | return -EBUSY; | 1484 | return -EBUSY; |
| 1488 | } | 1485 | } |
| 1489 | 1486 | ||
| @@ -1523,8 +1520,6 @@ static int vmw_pm_restore(struct device *kdev) | |||
| 1523 | if (dev_priv->enable_fb) | 1520 | if (dev_priv->enable_fb) |
| 1524 | vmw_fb_on(dev_priv); | 1521 | vmw_fb_on(dev_priv); |
| 1525 | 1522 | ||
| 1526 | vmw_fb_refresh(dev_priv); | ||
| 1527 | |||
| 1528 | return 0; | 1523 | return 0; |
| 1529 | } | 1524 | } |
| 1530 | 1525 | ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index f34f368c1a2e..5fcbe1620d50 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -910,7 +910,6 @@ int vmw_fb_init(struct vmw_private *vmw_priv); | |||
| 910 | int vmw_fb_close(struct vmw_private *dev_priv); | 910 | int vmw_fb_close(struct vmw_private *dev_priv); |
| 911 | int vmw_fb_off(struct vmw_private *vmw_priv); | 911 | int vmw_fb_off(struct vmw_private *vmw_priv); |
| 912 | int vmw_fb_on(struct vmw_private *vmw_priv); | 912 | int vmw_fb_on(struct vmw_private *vmw_priv); |
| 913 | void vmw_fb_refresh(struct vmw_private *vmw_priv); | ||
| 914 | 913 | ||
| 915 | /** | 914 | /** |
| 916 | * Kernel modesetting - vmwgfx_kms.c | 915 | * Kernel modesetting - vmwgfx_kms.c |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c index ba0cdb743c3e..54e300365a5c 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | |||
| @@ -866,21 +866,13 @@ int vmw_fb_on(struct vmw_private *vmw_priv) | |||
| 866 | spin_lock_irqsave(&par->dirty.lock, flags); | 866 | spin_lock_irqsave(&par->dirty.lock, flags); |
| 867 | par->dirty.active = true; | 867 | par->dirty.active = true; |
| 868 | spin_unlock_irqrestore(&par->dirty.lock, flags); | 868 | spin_unlock_irqrestore(&par->dirty.lock, flags); |
| 869 | |||
| 870 | return 0; | ||
| 871 | } | ||
| 872 | 869 | ||
| 873 | /** | 870 | /* |
| 874 | * vmw_fb_refresh - Refresh fb display | 871 | * Need to reschedule a dirty update, because otherwise that's |
| 875 | * | 872 | * only done in dirty_mark() if the previous coalesced |
| 876 | * @vmw_priv: Pointer to device private | 873 | * dirty region was empty. |
| 877 | * | 874 | */ |
| 878 | * Call into kms to show the fbdev display(s). | 875 | schedule_delayed_work(&par->local_work, 0); |
| 879 | */ | ||
| 880 | void vmw_fb_refresh(struct vmw_private *vmw_priv) | ||
| 881 | { | ||
| 882 | if (!vmw_priv->fb_info) | ||
| 883 | return; | ||
| 884 | 876 | ||
| 885 | vmw_fb_set_par(vmw_priv->fb_info); | 877 | return 0; |
| 886 | } | 878 | } |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c index cdff99211602..21d746bdc922 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c | |||
| @@ -329,8 +329,6 @@ int vmw_host_get_guestinfo(const char *guest_info_param, | |||
| 329 | struct rpc_channel channel; | 329 | struct rpc_channel channel; |
| 330 | char *msg, *reply = NULL; | 330 | char *msg, *reply = NULL; |
| 331 | size_t reply_len = 0; | 331 | size_t reply_len = 0; |
| 332 | int ret = 0; | ||
| 333 | |||
| 334 | 332 | ||
| 335 | if (!vmw_msg_enabled) | 333 | if (!vmw_msg_enabled) |
| 336 | return -ENODEV; | 334 | return -ENODEV; |
| @@ -344,15 +342,14 @@ int vmw_host_get_guestinfo(const char *guest_info_param, | |||
| 344 | return -ENOMEM; | 342 | return -ENOMEM; |
| 345 | } | 343 | } |
| 346 | 344 | ||
| 347 | if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) || | 345 | if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM)) |
| 348 | vmw_send_msg(&channel, msg) || | 346 | goto out_open; |
| 349 | vmw_recv_msg(&channel, (void *) &reply, &reply_len) || | ||
| 350 | vmw_close_channel(&channel)) { | ||
| 351 | DRM_ERROR("Failed to get %s", guest_info_param); | ||
| 352 | 347 | ||
| 353 | ret = -EINVAL; | 348 | if (vmw_send_msg(&channel, msg) || |
| 354 | } | 349 | vmw_recv_msg(&channel, (void *) &reply, &reply_len)) |
| 350 | goto out_msg; | ||
| 355 | 351 | ||
| 352 | vmw_close_channel(&channel); | ||
| 356 | if (buffer && reply && reply_len > 0) { | 353 | if (buffer && reply && reply_len > 0) { |
| 357 | /* Remove reply code, which are the first 2 characters of | 354 | /* Remove reply code, which are the first 2 characters of |
| 358 | * the reply | 355 | * the reply |
| @@ -369,7 +366,17 @@ int vmw_host_get_guestinfo(const char *guest_info_param, | |||
| 369 | kfree(reply); | 366 | kfree(reply); |
| 370 | kfree(msg); | 367 | kfree(msg); |
| 371 | 368 | ||
| 372 | return ret; | 369 | return 0; |
| 370 | |||
| 371 | out_msg: | ||
| 372 | vmw_close_channel(&channel); | ||
| 373 | kfree(reply); | ||
| 374 | out_open: | ||
| 375 | *length = 0; | ||
| 376 | kfree(msg); | ||
| 377 | DRM_ERROR("Failed to get %s", guest_info_param); | ||
| 378 | |||
| 379 | return -EINVAL; | ||
| 373 | } | 380 | } |
| 374 | 381 | ||
| 375 | 382 | ||
| @@ -400,15 +407,22 @@ int vmw_host_log(const char *log) | |||
| 400 | return -ENOMEM; | 407 | return -ENOMEM; |
| 401 | } | 408 | } |
| 402 | 409 | ||
| 403 | if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) || | 410 | if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM)) |
| 404 | vmw_send_msg(&channel, msg) || | 411 | goto out_open; |
| 405 | vmw_close_channel(&channel)) { | ||
| 406 | DRM_ERROR("Failed to send log\n"); | ||
| 407 | 412 | ||
| 408 | ret = -EINVAL; | 413 | if (vmw_send_msg(&channel, msg)) |
| 409 | } | 414 | goto out_msg; |
| 410 | 415 | ||
| 416 | vmw_close_channel(&channel); | ||
| 411 | kfree(msg); | 417 | kfree(msg); |
| 412 | 418 | ||
| 413 | return ret; | 419 | return 0; |
| 420 | |||
| 421 | out_msg: | ||
| 422 | vmw_close_channel(&channel); | ||
| 423 | out_open: | ||
| 424 | kfree(msg); | ||
| 425 | DRM_ERROR("Failed to send log\n"); | ||
| 426 | |||
| 427 | return -EINVAL; | ||
| 414 | } | 428 | } |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.h b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.h index 557a033fb610..8545488aa0cf 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.h | |||
| @@ -135,17 +135,24 @@ | |||
| 135 | 135 | ||
| 136 | #else | 136 | #else |
| 137 | 137 | ||
| 138 | /* In the 32-bit version of this macro, we use "m" because there is no | 138 | /* |
| 139 | * more register left for bp | 139 | * In the 32-bit version of this macro, we store bp in a memory location |
| 140 | * because we've ran out of registers. | ||
| 141 | * Now we can't reference that memory location while we've modified | ||
| 142 | * %esp or %ebp, so we first push it on the stack, just before we push | ||
| 143 | * %ebp, and then when we need it we read it from the stack where we | ||
| 144 | * just pushed it. | ||
| 140 | */ | 145 | */ |
| 141 | #define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di, \ | 146 | #define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di, \ |
| 142 | port_num, magic, bp, \ | 147 | port_num, magic, bp, \ |
| 143 | eax, ebx, ecx, edx, si, di) \ | 148 | eax, ebx, ecx, edx, si, di) \ |
| 144 | ({ \ | 149 | ({ \ |
| 145 | asm volatile ("push %%ebp;" \ | 150 | asm volatile ("push %12;" \ |
| 146 | "mov %12, %%ebp;" \ | 151 | "push %%ebp;" \ |
| 152 | "mov 0x04(%%esp), %%ebp;" \ | ||
| 147 | "rep outsb;" \ | 153 | "rep outsb;" \ |
| 148 | "pop %%ebp;" : \ | 154 | "pop %%ebp;" \ |
| 155 | "add $0x04, %%esp;" : \ | ||
| 149 | "=a"(eax), \ | 156 | "=a"(eax), \ |
| 150 | "=b"(ebx), \ | 157 | "=b"(ebx), \ |
| 151 | "=c"(ecx), \ | 158 | "=c"(ecx), \ |
| @@ -167,10 +174,12 @@ | |||
| 167 | port_num, magic, bp, \ | 174 | port_num, magic, bp, \ |
| 168 | eax, ebx, ecx, edx, si, di) \ | 175 | eax, ebx, ecx, edx, si, di) \ |
| 169 | ({ \ | 176 | ({ \ |
| 170 | asm volatile ("push %%ebp;" \ | 177 | asm volatile ("push %12;" \ |
| 171 | "mov %12, %%ebp;" \ | 178 | "push %%ebp;" \ |
| 179 | "mov 0x04(%%esp), %%ebp;" \ | ||
| 172 | "rep insb;" \ | 180 | "rep insb;" \ |
| 173 | "pop %%ebp" : \ | 181 | "pop %%ebp;" \ |
| 182 | "add $0x04, %%esp;" : \ | ||
| 174 | "=a"(eax), \ | 183 | "=a"(eax), \ |
| 175 | "=b"(ebx), \ | 184 | "=b"(ebx), \ |
| 176 | "=c"(ecx), \ | 185 | "=c"(ecx), \ |
