Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'topic/drm-misc-2015-03-31' of git://anongit.freedesktop.org/drm-intel into drm-next

Final drm-misc pull for 4.0, just various things all over, including a few
more important atomic fixes. btw I didn't pick up the vmwgfx patch from
Ville's series, but one patch has one hunk touching vmwgfx and
Thomas/Jakob didn't get around to ack it. I figured it's simple enough to
be ok though.

* tag 'topic/drm-misc-2015-03-31' of git://anongit.freedesktop.org/drm-intel:
drm: line wrap DRM_IOCTL_DEF* macros
drm/atomic: Don't try to free a NULL state
drm/atomic: Clear crtcs, connectors and planes when clearing state
drm: Rewrite drm_ioctl_flags() to resemble the new drm_ioctl() code
drm: Use max() to make the ioctl alloc size code cleaner
drm: Simplify core vs. drv ioctl handling
drm: Drop ioctl->cmd_drv
drm: Fix DRM_IOCTL_DEF_DRV()
drm/atomic-helpers: Properly avoid full modeset dance
drm: atomic: Allow setting CRTC active property
drm: atomic: Expose CRTC active property
drm: crtc_helper: Update hwmode before mode_set call
drm: mode: Allow NULL modes for equality check
drm: fb_helper: Simplify exit condition
drm: mode: Fix typo in kerneldoc
drm/dp: Print the number of bytes processed for aux nacks

+80 -54
+22 -5
drivers/gpu/drm/drm_atomic.c
··· 134 134 135 135 connector->funcs->atomic_destroy_state(connector, 136 136 state->connector_states[i]); 137 + state->connectors[i] = NULL; 137 138 state->connector_states[i] = NULL; 138 139 } 139 140 ··· 146 145 147 146 crtc->funcs->atomic_destroy_state(crtc, 148 147 state->crtc_states[i]); 148 + state->crtcs[i] = NULL; 149 149 state->crtc_states[i] = NULL; 150 150 } 151 151 ··· 158 156 159 157 plane->funcs->atomic_destroy_state(plane, 160 158 state->plane_states[i]); 159 + state->planes[i] = NULL; 161 160 state->plane_states[i] = NULL; 162 161 } 163 162 } ··· 173 170 */ 174 171 void drm_atomic_state_free(struct drm_atomic_state *state) 175 172 { 173 + if (!state) 174 + return; 175 + 176 176 drm_atomic_state_clear(state); 177 177 178 178 DRM_DEBUG_ATOMIC("Freeing atomic state %p\n", state); ··· 254 248 struct drm_mode_config *config = &dev->mode_config; 255 249 256 250 /* FIXME: Mode prop is missing, which also controls ->enable. */ 257 - if (property == config->prop_active) { 251 + if (property == config->prop_active) 258 252 state->active = val; 259 - } else if (crtc->funcs->atomic_set_property) 253 + else if (crtc->funcs->atomic_set_property) 260 254 return crtc->funcs->atomic_set_property(crtc, state, property, val); 261 - return -EINVAL; 255 + else 256 + return -EINVAL; 257 + 258 + return 0; 262 259 } 263 260 EXPORT_SYMBOL(drm_atomic_crtc_set_property); 264 261 ··· 275 266 const struct drm_crtc_state *state, 276 267 struct drm_property *property, uint64_t *val) 277 268 { 278 - if (crtc->funcs->atomic_get_property) 269 + struct drm_device *dev = crtc->dev; 270 + struct drm_mode_config *config = &dev->mode_config; 271 + 272 + if (property == config->prop_active) 273 + *val = state->active; 274 + else if (crtc->funcs->atomic_get_property) 279 275 return crtc->funcs->atomic_get_property(crtc, state, property, val); 280 - return -EINVAL; 276 + else 277 + return -EINVAL; 278 + 279 + return 0; 281 280 } 282 281 283 282 /**
+4 -2
drivers/gpu/drm/drm_atomic_helper.c
··· 587 587 588 588 old_crtc_state = old_state->crtc_states[drm_crtc_index(old_conn_state->crtc)]; 589 589 590 - if (!old_crtc_state->active) 590 + if (!old_crtc_state->active || 591 + !needs_modeset(old_conn_state->crtc->state)) 591 592 continue; 592 593 593 594 encoder = old_conn_state->best_encoder; ··· 848 847 if (!connector || !connector->state->best_encoder) 849 848 continue; 850 849 851 - if (!connector->state->crtc->state->active) 850 + if (!connector->state->crtc->state->active || 851 + !needs_modeset(connector->state->crtc->state)) 852 852 continue; 853 853 854 854 encoder = connector->state->best_encoder;
+5 -4
drivers/gpu/drm/drm_crtc_helper.c
··· 270 270 struct drm_framebuffer *old_fb) 271 271 { 272 272 struct drm_device *dev = crtc->dev; 273 - struct drm_display_mode *adjusted_mode, saved_mode; 273 + struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode; 274 274 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 275 275 struct drm_encoder_helper_funcs *encoder_funcs; 276 276 int saved_x, saved_y; ··· 292 292 } 293 293 294 294 saved_mode = crtc->mode; 295 + saved_hwmode = crtc->hwmode; 295 296 saved_x = crtc->x; 296 297 saved_y = crtc->y; 297 298 ··· 334 333 goto done; 335 334 } 336 335 DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); 336 + 337 + crtc->hwmode = *adjusted_mode; 337 338 338 339 /* Prepare the encoders and CRTCs before setting the mode. */ 339 340 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { ··· 399 396 encoder->bridge->funcs->enable(encoder->bridge); 400 397 } 401 398 402 - /* Store real post-adjustment hardware mode. */ 403 - crtc->hwmode = *adjusted_mode; 404 - 405 399 /* Calculate and store various constants which 406 400 * are later needed by vblank and swap-completion 407 401 * timestamping. They are derived from true hwmode. ··· 411 411 if (!ret) { 412 412 crtc->enabled = saved_enabled; 413 413 crtc->mode = saved_mode; 414 + crtc->hwmode = saved_hwmode; 414 415 crtc->x = saved_x; 415 416 crtc->y = saved_y; 416 417 }
+2 -2
drivers/gpu/drm/drm_dp_helper.c
··· 462 462 break; 463 463 464 464 case DP_AUX_NATIVE_REPLY_NACK: 465 - DRM_DEBUG_KMS("native nack\n"); 465 + DRM_DEBUG_KMS("native nack (result=%d, size=%zu)\n", ret, msg->size); 466 466 return -EREMOTEIO; 467 467 468 468 case DP_AUX_NATIVE_REPLY_DEFER: ··· 493 493 return ret; 494 494 495 495 case DP_AUX_I2C_REPLY_NACK: 496 - DRM_DEBUG_KMS("I2C nack\n"); 496 + DRM_DEBUG_KMS("I2C nack (result=%d, size=%zu\n", ret, msg->size); 497 497 aux->i2c_nack_count++; 498 498 return -EREMOTEIO; 499 499
+3 -3
drivers/gpu/drm/drm_fb_helper.c
··· 1283 1283 int width, int height) 1284 1284 { 1285 1285 struct drm_cmdline_mode *cmdline_mode; 1286 - struct drm_display_mode *mode = NULL; 1286 + struct drm_display_mode *mode; 1287 1287 bool prefer_non_interlace; 1288 1288 1289 1289 cmdline_mode = &fb_helper_conn->connector->cmdline_mode; 1290 1290 if (cmdline_mode->specified == false) 1291 - return mode; 1291 + return NULL; 1292 1292 1293 1293 /* attempt to find a matching mode in the list of modes 1294 1294 * we have gotten so far, if not add a CVT mode that conforms ··· 1297 1297 goto create_mode; 1298 1298 1299 1299 prefer_non_interlace = !cmdline_mode->interlace; 1300 - again: 1300 + again: 1301 1301 list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) { 1302 1302 /* check width/height */ 1303 1303 if (mode->hdisplay != cmdline_mode->xres ||
+28 -32
drivers/gpu/drm/drm_ioctl.c
··· 524 524 return 0; 525 525 } 526 526 527 - #define DRM_IOCTL_DEF(ioctl, _func, _flags) \ 528 - [DRM_IOCTL_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, .cmd_drv = 0, .name = #ioctl} 527 + #define DRM_IOCTL_DEF(ioctl, _func, _flags) \ 528 + [DRM_IOCTL_NR(ioctl)] = { \ 529 + .cmd = ioctl, \ 530 + .func = _func, \ 531 + .flags = _flags, \ 532 + .name = #ioctl \ 533 + } 529 534 530 535 /** Ioctl table */ 531 536 static const struct drm_ioctl_desc drm_ioctls[] = { ··· 668 663 int retcode = -EINVAL; 669 664 char stack_kdata[128]; 670 665 char *kdata = NULL; 671 - unsigned int usize, asize; 666 + unsigned int usize, asize, drv_size; 672 667 673 668 dev = file_priv->minor->dev; 674 669 675 670 if (drm_device_is_unplugged(dev)) 676 671 return -ENODEV; 677 672 678 - if ((nr >= DRM_CORE_IOCTL_COUNT) && 679 - ((nr < DRM_COMMAND_BASE) || (nr >= DRM_COMMAND_END))) 680 - goto err_i1; 681 - if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_END) && 682 - (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) { 683 - u32 drv_size; 673 + if (nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END) { 674 + /* driver ioctl */ 675 + if (nr - DRM_COMMAND_BASE >= dev->driver->num_ioctls) 676 + goto err_i1; 684 677 ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE]; 685 - drv_size = _IOC_SIZE(ioctl->cmd_drv); 686 - usize = asize = _IOC_SIZE(cmd); 687 - if (drv_size > asize) 688 - asize = drv_size; 689 - cmd = ioctl->cmd_drv; 690 - } 691 - else if ((nr >= DRM_COMMAND_END) || (nr < DRM_COMMAND_BASE)) { 692 - u32 drv_size; 693 - 678 + } else { 679 + /* core ioctl */ 680 + if (nr >= DRM_CORE_IOCTL_COUNT) 681 + goto err_i1; 694 682 ioctl = &drm_ioctls[nr]; 683 + } 695 684 696 - drv_size = _IOC_SIZE(ioctl->cmd); 697 - usize = asize = _IOC_SIZE(cmd); 698 - if (drv_size > asize) 699 - asize = drv_size; 700 - 701 - cmd = ioctl->cmd; 702 - } else 703 - goto err_i1; 685 + drv_size = _IOC_SIZE(ioctl->cmd); 686 + usize = _IOC_SIZE(cmd); 687 + asize = max(usize, drv_size); 688 + cmd = ioctl->cmd; 704 689 705 690 DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n", 706 691 task_pid_nr(current), ··· 771 776 */ 772 777 bool drm_ioctl_flags(unsigned int nr, unsigned int *flags) 773 778 { 774 - if ((nr >= DRM_COMMAND_END && nr < DRM_CORE_IOCTL_COUNT) || 775 - (nr < DRM_COMMAND_BASE)) { 776 - *flags = drm_ioctls[nr].flags; 777 - return true; 778 - } 779 + if (nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END) 780 + return false; 779 781 780 - return false; 782 + if (nr >= DRM_CORE_IOCTL_COUNT) 783 + return false; 784 + 785 + *flags = drm_ioctls[nr].flags; 786 + return true; 781 787 } 782 788 EXPORT_SYMBOL(drm_ioctl_flags);
+7 -1
drivers/gpu/drm/drm_modes.c
··· 903 903 */ 904 904 bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2) 905 905 { 906 + if (!mode1 && !mode2) 907 + return true; 908 + 909 + if (!mode1 || !mode2) 910 + return false; 911 + 906 912 /* do clock check convert to PICOS so fb modes get matched 907 913 * the same */ 908 914 if (mode1->clock && mode2->clock) { ··· 1154 1148 /** 1155 1149 * drm_mode_connector_list_update - update the mode list for the connector 1156 1150 * @connector: the connector to update 1157 - * @merge_type_bits: whether to merge or overright type bits. 1151 + * @merge_type_bits: whether to merge or overwrite type bits 1158 1152 * 1159 1153 * This moves the modes from the @connector probed_modes list 1160 1154 * to the actual mode list. It compares the probed mode against the current
+2 -2
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
··· 134 134 */ 135 135 136 136 #define VMW_IOCTL_DEF(ioctl, func, flags) \ 137 - [DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = {DRM_##ioctl, flags, func, DRM_IOCTL_##ioctl} 137 + [DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = {DRM_IOCTL_##ioctl, flags, func} 138 138 139 139 /** 140 140 * Ioctl definitions. ··· 1044 1044 const struct drm_ioctl_desc *ioctl = 1045 1045 &vmw_ioctls[nr - DRM_COMMAND_BASE]; 1046 1046 1047 - if (unlikely(ioctl->cmd_drv != cmd)) { 1047 + if (unlikely(ioctl->cmd != cmd)) { 1048 1048 DRM_ERROR("Invalid command format, ioctl %d\n", 1049 1049 nr - DRM_COMMAND_BASE); 1050 1050 return -EINVAL;
+7 -3
include/drm/drmP.h
··· 253 253 unsigned int cmd; 254 254 int flags; 255 255 drm_ioctl_t *func; 256 - unsigned int cmd_drv; 257 256 const char *name; 258 257 }; 259 258 ··· 261 262 * ioctl, for use by drm_ioctl(). 262 263 */ 263 264 264 - #define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags) \ 265 - [DRM_IOCTL_NR(DRM_##ioctl)] = {.cmd = DRM_##ioctl, .func = _func, .flags = _flags, .cmd_drv = DRM_IOCTL_##ioctl, .name = #ioctl} 265 + #define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags) \ 266 + [DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = { \ 267 + .cmd = DRM_IOCTL_##ioctl, \ 268 + .func = _func, \ 269 + .flags = _flags, \ 270 + .name = #ioctl \ 271 + } 266 272 267 273 /* Event queued up for userspace to read */ 268 274 struct drm_pending_event {