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

Merge tag 'drm-fixes-2024-03-08' of https://gitlab.freedesktop.org/drm/kernel

Pull drm fixes from Dave Airlie:
"Regular fixes (two weeks for i915), scattered across drivers, amdgpu
and i915 being the main ones, with nouveau having a couple of fixes.
One patch got applied for udl, but reverted soon after as the
maintainer has missed some crucial prior discussion.

Seems quiet and normal enough for this stage.

MAINTAINERS
- update email address

core:
- fix polling in certain configurations

buddy:
- fix kunit test warning

panel:
- boe-tv101wum-nl6: timing tuning fixes

i915:
- Fix to extract HDCP information from primary connector
- Check for NULL mmu_interval_notifier before removing
- Fix for #10184: Kernel crash on UHD Graphics 730 (Cc stable)
- Fix for #10284: Boot delay regresion with PSR
- Fix DP connector DSC HW state readout
- Selftest fix to convert msecs to jiffies

xe:
- error path fix

amdgpu:
- SMU14 fix
- Fix possible NULL pointer
- VRR fix
- pwm fix

nouveau:
- fix deadlock in new ioctls fail path
- fix missing locking around object rbtree

udl:
- apply and revert format change"

* tag 'drm-fixes-2024-03-08' of https://gitlab.freedesktop.org/drm/kernel: (21 commits)
nouveau: lock the client object tree.
drm/tests/buddy: fix print format
drm/xe: Return immediately on tile_init failure
drm/amdgpu/pm: Fix the error of pwm1_enable setting
drm/amd/display: handle range offsets in VRR ranges
drm/amd/display: check dc_link before dereferencing
drm/amd/swsmu: modify the gfx activity scaling
Revert "drm/udl: Add ARGB8888 as a format"
drm/i915/panelreplay: Move out psr_init_dpcd() from init_connector()
drm/i915/dp: Fix connector DSC HW state readout
drm/i915/selftests: Fix dependency of some timeouts on HZ
drm/udl: Add ARGB8888 as a format
drm/nouveau: fix stale locked mutex in nouveau_gem_ioctl_pushbuf
drm/i915: Don't explode when the dig port we don't have an AUX CH
MAINTAINERS: Update email address for Tvrtko Ursulin
drm/panel: boe-tv101wum-nl6: Fine tune Himax83102-j02 panel HFP and HBP (again)
drm: Fix output poll work for drm_kms_helper_poll=n
drm/i915: Check before removing mm notifier
drm/i915/hdcp: Extract hdcp structure from correct connector
drm/i915/hdcp: Remove additional timing for reading mst hdcp message
...

+141 -74
+5
.mailmap
··· 610 610 TripleX Chung <xxx.phy@gmail.com> <zhongyu@18mail.cn> 611 611 Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com> 612 612 Tudor Ambarus <tudor.ambarus@linaro.org> <tudor.ambarus@microchip.com> 613 + Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@intel.com> 614 + Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@linux.intel.com> 615 + Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@sophos.com> 616 + Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@onelan.co.uk> 617 + Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko@ursulin.net> 613 618 Tycho Andersen <tycho@tycho.pizza> <tycho@tycho.ws> 614 619 Tzung-Bi Shih <tzungbi@kernel.org> <tzungbi@google.com> 615 620 Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
+1 -1
MAINTAINERS
··· 10735 10735 M: Jani Nikula <jani.nikula@linux.intel.com> 10736 10736 M: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> 10737 10737 M: Rodrigo Vivi <rodrigo.vivi@intel.com> 10738 - M: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> 10738 + M: Tvrtko Ursulin <tursulin@ursulin.net> 10739 10739 L: intel-gfx@lists.freedesktop.org 10740 10740 S: Supported 10741 10741 W: https://drm.pages.freedesktop.org/intel-docs/
+15 -6
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 6539 6539 struct edid *edid; 6540 6540 struct i2c_adapter *ddc; 6541 6541 6542 - if (dc_link->aux_mode) 6542 + if (dc_link && dc_link->aux_mode) 6543 6543 ddc = &aconnector->dm_dp_aux.aux.ddc; 6544 6544 else 6545 6545 ddc = &aconnector->i2c->base; ··· 11169 11169 if (range->flags != 1) 11170 11170 continue; 11171 11171 11172 - amdgpu_dm_connector->min_vfreq = range->min_vfreq; 11173 - amdgpu_dm_connector->max_vfreq = range->max_vfreq; 11174 - amdgpu_dm_connector->pixel_clock_mhz = 11175 - range->pixel_clock_mhz * 10; 11176 - 11177 11172 connector->display_info.monitor_range.min_vfreq = range->min_vfreq; 11178 11173 connector->display_info.monitor_range.max_vfreq = range->max_vfreq; 11174 + 11175 + if (edid->revision >= 4) { 11176 + if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ) 11177 + connector->display_info.monitor_range.min_vfreq += 255; 11178 + if (data->pad2 & DRM_EDID_RANGE_OFFSET_MAX_VFREQ) 11179 + connector->display_info.monitor_range.max_vfreq += 255; 11180 + } 11181 + 11182 + amdgpu_dm_connector->min_vfreq = 11183 + connector->display_info.monitor_range.min_vfreq; 11184 + amdgpu_dm_connector->max_vfreq = 11185 + connector->display_info.monitor_range.max_vfreq; 11186 + amdgpu_dm_connector->pixel_clock_mhz = 11187 + range->pixel_clock_mhz * 10; 11179 11188 11180 11189 break; 11181 11190 }
+11 -1
drivers/gpu/drm/amd/pm/amdgpu_pm.c
··· 2558 2558 { 2559 2559 struct amdgpu_device *adev = dev_get_drvdata(dev); 2560 2560 int err, ret; 2561 + u32 pwm_mode; 2561 2562 int value; 2562 2563 2563 2564 if (amdgpu_in_reset(adev)) ··· 2570 2569 if (err) 2571 2570 return err; 2572 2571 2572 + if (value == 0) 2573 + pwm_mode = AMD_FAN_CTRL_NONE; 2574 + else if (value == 1) 2575 + pwm_mode = AMD_FAN_CTRL_MANUAL; 2576 + else if (value == 2) 2577 + pwm_mode = AMD_FAN_CTRL_AUTO; 2578 + else 2579 + return -EINVAL; 2580 + 2573 2581 ret = pm_runtime_get_sync(adev_to_drm(adev)->dev); 2574 2582 if (ret < 0) { 2575 2583 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); 2576 2584 return ret; 2577 2585 } 2578 2586 2579 - ret = amdgpu_dpm_set_fan_control_mode(adev, value); 2587 + ret = amdgpu_dpm_set_fan_control_mode(adev, pwm_mode); 2580 2588 2581 2589 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); 2582 2590 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-2
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c
··· 229 229 smu->smc_driver_if_version = SMU14_DRIVER_IF_VERSION_SMU_V14_0_2; 230 230 break; 231 231 case IP_VERSION(14, 0, 0): 232 - if ((smu->smc_fw_version < 0x5d3a00)) 233 - dev_warn(smu->adev->dev, "The PMFW version(%x) is behind in this BIOS!\n", smu->smc_fw_version); 234 232 smu->smc_driver_if_version = SMU14_DRIVER_IF_VERSION_SMU_V14_0_0; 235 233 break; 236 234 default:
+4 -1
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c
··· 261 261 *value = metrics->MpipuclkFrequency; 262 262 break; 263 263 case METRICS_AVERAGE_GFXACTIVITY: 264 - *value = metrics->GfxActivity / 100; 264 + if ((smu->smc_fw_version > 0x5d4600)) 265 + *value = metrics->GfxActivity; 266 + else 267 + *value = metrics->GfxActivity / 100; 265 268 break; 266 269 case METRICS_AVERAGE_VCNACTIVITY: 267 270 *value = metrics->VcnActivity / 100;
+5 -3
drivers/gpu/drm/drm_probe_helper.c
··· 760 760 changed = dev->mode_config.delayed_event; 761 761 dev->mode_config.delayed_event = false; 762 762 763 - if (!drm_kms_helper_poll && dev->mode_config.poll_running) { 764 - drm_kms_helper_disable_hpd(dev); 765 - dev->mode_config.poll_running = false; 763 + if (!drm_kms_helper_poll) { 764 + if (dev->mode_config.poll_running) { 765 + drm_kms_helper_disable_hpd(dev); 766 + dev->mode_config.poll_running = false; 767 + } 766 768 goto out; 767 769 } 768 770
+14 -3
drivers/gpu/drm/i915/display/intel_display_power_well.c
··· 246 246 enum aux_ch aux_ch = icl_aux_pw_to_ch(power_well); 247 247 struct intel_digital_port *dig_port = aux_ch_to_digital_port(i915, aux_ch); 248 248 249 - return intel_port_to_phy(i915, dig_port->base.port); 249 + /* 250 + * FIXME should we care about the (VBT defined) dig_port->aux_ch 251 + * relationship or should this be purely defined by the hardware layout? 252 + * Currently if the port doesn't appear in the VBT, or if it's declared 253 + * as HDMI-only and routed to a combo PHY, the encoder either won't be 254 + * present at all or it will not have an aux_ch assigned. 255 + */ 256 + return dig_port ? intel_port_to_phy(i915, dig_port->base.port) : PHY_NONE; 250 257 } 251 258 252 259 static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv, ··· 421 414 422 415 intel_de_rmw(dev_priv, regs->driver, 0, HSW_PWR_WELL_CTL_REQ(pw_idx)); 423 416 424 - if (DISPLAY_VER(dev_priv) < 12) 417 + /* FIXME this is a mess */ 418 + if (phy != PHY_NONE) 425 419 intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy), 426 420 0, ICL_LANE_ENABLE_AUX); 427 421 ··· 445 437 446 438 drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv)); 447 439 448 - intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy), ICL_LANE_ENABLE_AUX, 0); 440 + /* FIXME this is a mess */ 441 + if (phy != PHY_NONE) 442 + intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy), 443 + ICL_LANE_ENABLE_AUX, 0); 449 444 450 445 intel_de_rmw(dev_priv, regs->driver, HSW_PWR_WELL_CTL_REQ(pw_idx), 0); 451 446
+7
drivers/gpu/drm/i915/display/intel_display_types.h
··· 609 609 * and active (i.e. dpms ON state). */ 610 610 bool (*get_hw_state)(struct intel_connector *); 611 611 612 + /* 613 + * Optional hook called during init/resume to sync any state 614 + * stored in the connector (eg. DSC state) wrt. the HW state. 615 + */ 616 + void (*sync_state)(struct intel_connector *connector, 617 + const struct intel_crtc_state *crtc_state); 618 + 612 619 /* Panel info for eDP and LVDS */ 613 620 struct intel_panel panel; 614 621
+16
drivers/gpu/drm/i915/display/intel_dp.c
··· 5699 5699 goto out; 5700 5700 } 5701 5701 5702 + if (!intel_dp_is_edp(intel_dp)) 5703 + intel_psr_init_dpcd(intel_dp); 5704 + 5702 5705 intel_dp_detect_dsc_caps(intel_dp, intel_connector); 5703 5706 5704 5707 intel_dp_configure_mst(intel_dp); ··· 5860 5857 drm_dp_cec_unregister_connector(&intel_dp->aux); 5861 5858 drm_dp_aux_unregister(&intel_dp->aux); 5862 5859 intel_connector_unregister(connector); 5860 + } 5861 + 5862 + void intel_dp_connector_sync_state(struct intel_connector *connector, 5863 + const struct intel_crtc_state *crtc_state) 5864 + { 5865 + struct drm_i915_private *i915 = to_i915(connector->base.dev); 5866 + 5867 + if (crtc_state && crtc_state->dsc.compression_enable) { 5868 + drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux); 5869 + connector->dp.dsc_decompression_enabled = true; 5870 + } else { 5871 + connector->dp.dsc_decompression_enabled = false; 5872 + } 5863 5873 } 5864 5874 5865 5875 void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
+2
drivers/gpu/drm/i915/display/intel_dp.h
··· 45 45 int intel_dp_min_bpp(enum intel_output_format output_format); 46 46 bool intel_dp_init_connector(struct intel_digital_port *dig_port, 47 47 struct intel_connector *intel_connector); 48 + void intel_dp_connector_sync_state(struct intel_connector *connector, 49 + const struct intel_crtc_state *crtc_state); 48 50 void intel_dp_set_link_params(struct intel_dp *intel_dp, 49 51 int link_rate, int lane_count); 50 52 int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
+16 -31
drivers/gpu/drm/i915/display/intel_dp_hdcp.c
··· 330 330 0, 0 }, 331 331 }; 332 332 333 - static struct drm_dp_aux * 334 - intel_dp_hdcp_get_aux(struct intel_connector *connector) 335 - { 336 - struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 337 - 338 - if (intel_encoder_is_mst(connector->encoder)) 339 - return &connector->port->aux; 340 - else 341 - return &dig_port->dp.aux; 342 - } 343 - 344 333 static int 345 334 intel_dp_hdcp2_read_rx_status(struct intel_connector *connector, 346 335 u8 *rx_status) 347 336 { 348 337 struct drm_i915_private *i915 = to_i915(connector->base.dev); 349 - struct drm_dp_aux *aux = intel_dp_hdcp_get_aux(connector); 338 + struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 339 + struct drm_dp_aux *aux = &dig_port->dp.aux; 350 340 ssize_t ret; 351 341 352 342 ret = drm_dp_dpcd_read(aux, ··· 389 399 const struct hdcp2_dp_msg_data *hdcp2_msg_data) 390 400 { 391 401 struct drm_i915_private *i915 = to_i915(connector->base.dev); 392 - struct intel_hdcp *hdcp = &connector->hdcp; 402 + struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 403 + struct intel_dp *dp = &dig_port->dp; 404 + struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; 393 405 u8 msg_id = hdcp2_msg_data->msg_id; 394 406 int ret, timeout; 395 407 bool msg_ready = false; ··· 446 454 unsigned int offset; 447 455 u8 *byte = buf; 448 456 ssize_t ret, bytes_to_write, len; 457 + struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 458 + struct drm_dp_aux *aux = &dig_port->dp.aux; 449 459 const struct hdcp2_dp_msg_data *hdcp2_msg_data; 450 - struct drm_dp_aux *aux; 451 460 452 461 hdcp2_msg_data = get_hdcp2_dp_msg_data(*byte); 453 462 if (!hdcp2_msg_data) 454 463 return -EINVAL; 455 464 456 465 offset = hdcp2_msg_data->offset; 457 - 458 - aux = intel_dp_hdcp_get_aux(connector); 459 466 460 467 /* No msg_id in DP HDCP2.2 msgs */ 461 468 bytes_to_write = size - 1; ··· 481 490 ssize_t get_receiver_id_list_rx_info(struct intel_connector *connector, 482 491 u32 *dev_cnt, u8 *byte) 483 492 { 484 - struct drm_dp_aux *aux = intel_dp_hdcp_get_aux(connector); 493 + struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 494 + struct drm_dp_aux *aux = &dig_port->dp.aux; 485 495 ssize_t ret; 486 496 u8 *rx_info = byte; 487 497 ··· 507 515 { 508 516 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 509 517 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 510 - struct intel_hdcp *hdcp = &connector->hdcp; 511 - struct drm_dp_aux *aux; 518 + struct drm_dp_aux *aux = &dig_port->dp.aux; 519 + struct intel_dp *dp = &dig_port->dp; 520 + struct intel_hdcp *hdcp = &dp->attached_connector->hdcp; 512 521 unsigned int offset; 513 522 u8 *byte = buf; 514 523 ssize_t ret, bytes_to_recv, len; ··· 522 529 if (!hdcp2_msg_data) 523 530 return -EINVAL; 524 531 offset = hdcp2_msg_data->offset; 525 - 526 - aux = intel_dp_hdcp_get_aux(connector); 527 532 528 533 ret = intel_dp_hdcp2_wait_for_msg(connector, hdcp2_msg_data); 529 534 if (ret < 0) ··· 552 561 553 562 /* Entire msg read timeout since initiate of msg read */ 554 563 if (bytes_to_recv == size - 1 && hdcp2_msg_data->msg_read_timeout > 0) { 555 - if (intel_encoder_is_mst(connector->encoder)) 556 - msg_end = ktime_add_ms(ktime_get_raw(), 557 - hdcp2_msg_data->msg_read_timeout * 558 - connector->port->parent->num_ports); 559 - else 560 - msg_end = ktime_add_ms(ktime_get_raw(), 561 - hdcp2_msg_data->msg_read_timeout); 564 + msg_end = ktime_add_ms(ktime_get_raw(), 565 + hdcp2_msg_data->msg_read_timeout); 562 566 } 563 567 564 568 ret = drm_dp_dpcd_read(aux, offset, ··· 637 651 int intel_dp_hdcp2_capable(struct intel_connector *connector, 638 652 bool *capable) 639 653 { 640 - struct drm_dp_aux *aux; 654 + struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 655 + struct drm_dp_aux *aux = &dig_port->dp.aux; 641 656 u8 rx_caps[3]; 642 657 int ret; 643 - 644 - aux = intel_dp_hdcp_get_aux(connector); 645 658 646 659 *capable = false; 647 660 ret = drm_dp_dpcd_read(aux,
+1
drivers/gpu/drm/i915/display/intel_dp_mst.c
··· 1534 1534 return NULL; 1535 1535 1536 1536 intel_connector->get_hw_state = intel_dp_mst_get_hw_state; 1537 + intel_connector->sync_state = intel_dp_connector_sync_state; 1537 1538 intel_connector->mst_port = intel_dp; 1538 1539 intel_connector->port = port; 1539 1540 drm_dp_mst_get_port_malloc(port);
+6 -7
drivers/gpu/drm/i915/display/intel_modeset_setup.c
··· 318 318 const struct intel_crtc_state *crtc_state = 319 319 to_intel_crtc_state(crtc->base.state); 320 320 321 - if (crtc_state->dsc.compression_enable) { 322 - drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux); 323 - connector->dp.dsc_decompression_enabled = true; 324 - } else { 325 - connector->dp.dsc_decompression_enabled = false; 326 - } 327 321 conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3; 328 322 } 329 323 } ··· 769 775 770 776 drm_connector_list_iter_begin(&i915->drm, &conn_iter); 771 777 for_each_intel_connector_iter(connector, &conn_iter) { 778 + struct intel_crtc_state *crtc_state = NULL; 779 + 772 780 if (connector->get_hw_state(connector)) { 773 - struct intel_crtc_state *crtc_state; 774 781 struct intel_crtc *crtc; 775 782 776 783 connector->base.dpms = DRM_MODE_DPMS_ON; ··· 797 802 connector->base.dpms = DRM_MODE_DPMS_OFF; 798 803 connector->base.encoder = NULL; 799 804 } 805 + 806 + if (connector->sync_state) 807 + connector->sync_state(connector, crtc_state); 808 + 800 809 drm_dbg_kms(&i915->drm, 801 810 "[CONNECTOR:%d:%s] hw state readout: %s\n", 802 811 connector->base.base.id, connector->base.name,
-3
drivers/gpu/drm/i915/display/intel_psr.c
··· 2776 2776 if (!(HAS_PSR(dev_priv) || HAS_DP20(dev_priv))) 2777 2777 return; 2778 2778 2779 - if (!intel_dp_is_edp(intel_dp)) 2780 - intel_psr_init_dpcd(intel_dp); 2781 - 2782 2779 /* 2783 2780 * HSW spec explicitly says PSR is tied to port A. 2784 2781 * BDW+ platforms have a instance of PSR registers per transcoder but
+3
drivers/gpu/drm/i915/gem/i915_gem_userptr.c
··· 379 379 { 380 380 GEM_WARN_ON(obj->userptr.page_ref); 381 381 382 + if (!obj->userptr.notifier.mm) 383 + return; 384 + 382 385 mmu_interval_notifier_remove(&obj->userptr.notifier); 383 386 obj->userptr.notifier.mm = NULL; 384 387 }
+4 -2
drivers/gpu/drm/i915/selftests/intel_scheduler_helpers.c
··· 3 3 * Copyright © 2021 Intel Corporation 4 4 */ 5 5 6 + #include <linux/jiffies.h> 7 + 6 8 //#include "gt/intel_engine_user.h" 7 9 #include "gt/intel_gt.h" 8 10 #include "i915_drv.h" ··· 14 12 15 13 #define REDUCED_TIMESLICE 5 16 14 #define REDUCED_PREEMPT 10 17 - #define WAIT_FOR_RESET_TIME 10000 15 + #define WAIT_FOR_RESET_TIME_MS 10000 18 16 19 17 struct intel_engine_cs *intel_selftest_find_any_engine(struct intel_gt *gt) 20 18 { ··· 93 91 { 94 92 long ret; 95 93 96 - ret = i915_request_wait(rq, 0, WAIT_FOR_RESET_TIME); 94 + ret = i915_request_wait(rq, 0, msecs_to_jiffies(WAIT_FOR_RESET_TIME_MS)); 97 95 if (ret < 0) 98 96 return ret; 99 97
+1
drivers/gpu/drm/nouveau/include/nvkm/core/client.h
··· 11 11 u32 debug; 12 12 13 13 struct rb_root objroot; 14 + spinlock_t obj_lock; 14 15 15 16 void *data; 16 17 int (*event)(u64 token, void *argv, u32 argc);
+1 -1
drivers/gpu/drm/nouveau/nouveau_gem.c
··· 764 764 return -ENOMEM; 765 765 766 766 if (unlikely(nouveau_cli_uvmm(cli))) 767 - return -ENOSYS; 767 + return nouveau_abi16_put(abi16, -ENOSYS); 768 768 769 769 list_for_each_entry(temp, &abi16->channels, head) { 770 770 if (temp->chan->chid == req->channel) {
+1
drivers/gpu/drm/nouveau/nvkm/core/client.c
··· 180 180 client->device = device; 181 181 client->debug = nvkm_dbgopt(dbg, "CLIENT"); 182 182 client->objroot = RB_ROOT; 183 + spin_lock_init(&client->obj_lock); 183 184 client->event = event; 184 185 INIT_LIST_HEAD(&client->umem); 185 186 spin_lock_init(&client->lock);
+20 -6
drivers/gpu/drm/nouveau/nvkm/core/object.c
··· 30 30 const struct nvkm_object_func *func) 31 31 { 32 32 struct nvkm_object *object; 33 + unsigned long flags; 33 34 34 35 if (handle) { 36 + spin_lock_irqsave(&client->obj_lock, flags); 35 37 struct rb_node *node = client->objroot.rb_node; 36 38 while (node) { 37 39 object = rb_entry(node, typeof(*object), node); ··· 42 40 else 43 41 if (handle > object->object) 44 42 node = node->rb_right; 45 - else 43 + else { 44 + spin_unlock_irqrestore(&client->obj_lock, flags); 46 45 goto done; 46 + } 47 47 } 48 + spin_unlock_irqrestore(&client->obj_lock, flags); 48 49 return ERR_PTR(-ENOENT); 49 50 } else { 50 51 object = &client->object; ··· 62 57 void 63 58 nvkm_object_remove(struct nvkm_object *object) 64 59 { 60 + unsigned long flags; 61 + 62 + spin_lock_irqsave(&object->client->obj_lock, flags); 65 63 if (!RB_EMPTY_NODE(&object->node)) 66 64 rb_erase(&object->node, &object->client->objroot); 65 + spin_unlock_irqrestore(&object->client->obj_lock, flags); 67 66 } 68 67 69 68 bool 70 69 nvkm_object_insert(struct nvkm_object *object) 71 70 { 72 - struct rb_node **ptr = &object->client->objroot.rb_node; 71 + struct rb_node **ptr; 73 72 struct rb_node *parent = NULL; 73 + unsigned long flags; 74 74 75 + spin_lock_irqsave(&object->client->obj_lock, flags); 76 + ptr = &object->client->objroot.rb_node; 75 77 while (*ptr) { 76 78 struct nvkm_object *this = rb_entry(*ptr, typeof(*this), node); 77 79 parent = *ptr; 78 - if (object->object < this->object) 80 + if (object->object < this->object) { 79 81 ptr = &parent->rb_left; 80 - else 81 - if (object->object > this->object) 82 + } else if (object->object > this->object) { 82 83 ptr = &parent->rb_right; 83 - else 84 + } else { 85 + spin_unlock_irqrestore(&object->client->obj_lock, flags); 84 86 return false; 87 + } 85 88 } 86 89 87 90 rb_link_node(&object->node, parent, ptr); 88 91 rb_insert_color(&object->node, &object->client->objroot); 92 + spin_unlock_irqrestore(&object->client->obj_lock, flags); 89 93 return true; 90 94 } 91 95
+4 -4
drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
··· 1768 1768 }; 1769 1769 1770 1770 static const struct drm_display_mode starry_himax83102_j02_default_mode = { 1771 - .clock = 162850, 1771 + .clock = 162680, 1772 1772 .hdisplay = 1200, 1773 - .hsync_start = 1200 + 50, 1774 - .hsync_end = 1200 + 50 + 20, 1775 - .htotal = 1200 + 50 + 20 + 50, 1773 + .hsync_start = 1200 + 60, 1774 + .hsync_end = 1200 + 60 + 20, 1775 + .htotal = 1200 + 60 + 20 + 40, 1776 1776 .vdisplay = 1920, 1777 1777 .vsync_start = 1920 + 116, 1778 1778 .vsync_end = 1920 + 116 + 8,
+1 -1
drivers/gpu/drm/tests/drm_buddy_test.c
··· 189 189 &allocated, 190 190 DRM_BUDDY_RANGE_ALLOCATION), 191 191 "buddy_alloc failed with bias(%x-%x), size=%u, ps=%u\n", 192 - bias_start, bias_end, size); 192 + bias_start, bias_end, size, ps); 193 193 bias_rem -= size; 194 194 195 195 /*
+3 -2
drivers/gpu/drm/xe/xe_tile.c
··· 167 167 goto err_mem_access; 168 168 169 169 tile->mem.kernel_bb_pool = xe_sa_bo_manager_init(tile, SZ_1M, 16); 170 - if (IS_ERR(tile->mem.kernel_bb_pool)) 170 + if (IS_ERR(tile->mem.kernel_bb_pool)) { 171 171 err = PTR_ERR(tile->mem.kernel_bb_pool); 172 - 172 + goto err_mem_access; 173 + } 173 174 xe_wa_apply_tile_workarounds(tile); 174 175 175 176 xe_tile_sysfs_init(tile);