diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-05-25 12:15:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-05-25 12:15:13 -0400 |
commit | b9f57019a9ec74f4c6f0b475e9d6bfdd6fa38f37 (patch) | |
tree | 52d136e9e6dcac7f0432cee0fbfd8d67b3a48cac | |
parent | a1a9f537aa44862a14c00c52f934b79fb725292d (diff) | |
parent | 4bc6f777952cf2d5b39e0c5a97a18caa743f03b7 (diff) |
Merge tag 'drm-fixes-for-v4.17-rc7' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie:
"Only two sets of drivers fixes: one rcar-du lvds regression fix, and a
group of fixes for vmwgfx"
* tag 'drm-fixes-for-v4.17-rc7' of git://people.freedesktop.org/~airlied/linux:
drm/vmwgfx: Schedule an fb dirty update after resume
drm/vmwgfx: Fix host logging / guestinfo reading error paths
drm/vmwgfx: Fix 32-bit VMW_PORT_HB_[IN|OUT] macros
drm: rcar-du: lvds: Fix crash in .atomic_check when disabling connector
-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), \ |