]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Merge tag 'drm-intel-next-2024-02-07' of git://anongit.freedesktop.org/drm/drm-intel...
authorDave Airlie <airlied@redhat.com>
Thu, 15 Feb 2024 20:52:03 +0000 (06:52 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 15 Feb 2024 20:52:04 +0000 (06:52 +1000)
drm/i915 feature pull for v6.9:

Features and functionality:
- Early transport for panel replay and PSR (Jouni)
- New ARL PCI IDs (Matt)
- DP TPS4 PHY test pattern support (Khaled)

Refactoring and cleanups:
- Unify and improve VSC SDP for PSR and non-PSR cases (Jouni)
- Refactor memory regions and improve debug logging (Ville)
- Rework global state serialization (Ville)
- Remove unused CDCLK divider fields (Gustavo)
- Unify HDCP connector logging format (Jani)
- Use display instead of graphics version in display code (Jani)
- Move VBT and opregion debugfs next to the implementation (Jani)
- Abstract opregion interface, use opaque type (Jani)

Fixes:
- Fix MTL stolen memory access (Ville)
- Fix initial display plane readout for MTL (Ville)
- Fix HPD handling during driver init/shutdown (Imre)
- Cursor vblank evasion fixes (Ville)
- Various VSC SDP fixes (Jouni)
- Allow PSR mode changes without full modeset (Jouni)
- Fix CDCLK sanitization on module load for Xe2_LPD (Gustavo)
- Fix the max DSC bpc supported by the source (Ankit)
- Add missing LNL ALPM AUX wake configuration (Jouni)
- Cx0 PHY state readout and verify fixes (Mika)
- Fix PSR (panel replay) debugfs for MST connectors (Imre)
- Fail HDCP repeater authentication if Type1 device not present (Suraj)
- Ratelimit debug logging in vm_fault_ttm (Nirmoy)
- Use a fake PCH for MTL because south display is not on the PCH (Haridhar)
- Disable DSB for Xe driver for now (José)
- Fix some LNL display register changes (Lucas)
- Fix build on ChromeOS (Paz Zcharya)
- Preserve current shared DPLL for fastsets on Type-C ports (Ville)
- Fix state checker warnings for MG/TC/TBT PLLs (Ville)
- Fix HDCP repeater ctl register value on errors (Jani)
- Allow FBC with CCS modifiers on SKL+ (Ville)
- Fix HDCP GGTT pinning (Ville)

DRM core changes:
- Add ratelimited drm dbg print (Nirmoy)
- DPCD PSR early transport macro (Jouni)

Merges:
- Backmerge drm-next to bring Xe driver to drm-intel-next (Jani)

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/87cyt8cxsh.fsf@intel.com
1  2 
drivers/gpu/drm/i915/display/intel_backlight.c
drivers/gpu/drm/i915/display/intel_gmbus.c
drivers/gpu/drm/i915/display/intel_sdvo.c
drivers/gpu/drm/i915/gem/i915_gem_ttm.c

index 3f3cd944a1c5bfcc1a94cfa02ae180496140f408,696ae59874a9f2b35665ba4fa71fc6e7b0f7b04e..1946d7fb3c2e512b50e7715c9d50e7109b9e190e
@@@ -275,7 -275,7 +275,7 @@@ static void ext_pwm_set_backlight(cons
        struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
  
        pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
 -      pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
 +      pwm_apply_might_sleep(panel->backlight.pwm, &panel->backlight.pwm_state);
  }
  
  static void
@@@ -428,7 -428,7 +428,7 @@@ static void ext_pwm_disable_backlight(c
        intel_backlight_set_pwm_level(old_conn_state, level);
  
        panel->backlight.pwm_state.enabled = false;
 -      pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
 +      pwm_apply_might_sleep(panel->backlight.pwm, &panel->backlight.pwm_state);
  }
  
  void intel_backlight_disable(const struct drm_connector_state *old_conn_state)
@@@ -750,7 -750,7 +750,7 @@@ static void ext_pwm_enable_backlight(co
  
        pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
        panel->backlight.pwm_state.enabled = true;
 -      pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
 +      pwm_apply_might_sleep(panel->backlight.pwm, &panel->backlight.pwm_state);
  }
  
  static void __intel_backlight_enable(const struct intel_crtc_state *crtc_state,
@@@ -1465,7 -1465,7 +1465,7 @@@ static bool cnp_backlight_controller_is
  
        if (controller == 1 &&
            INTEL_PCH_TYPE(i915) >= PCH_ICP &&
-           INTEL_PCH_TYPE(i915) < PCH_MTP)
+           INTEL_PCH_TYPE(i915) <= PCH_ADP)
                return intel_de_read(i915, SOUTH_CHICKEN1) & ICP_SECOND_PPS_IO_SELECT;
  
        return true;
index e9e4dcf345f95722b6c67cb4db802a193c84b0dd,854566ba5414976925ff1be044a03f018ef8007b..d3e03ed5b79c56438a2d48b22602f44ce70824bb
@@@ -155,7 -155,7 +155,7 @@@ static const struct gmbus_pin *get_gmbu
        const struct gmbus_pin *pins;
        size_t size;
  
-       if (INTEL_PCH_TYPE(i915) >= PCH_LNL) {
+       if (INTEL_PCH_TYPE(i915) >= PCH_MTL) {
                pins = gmbus_pins_mtp;
                size = ARRAY_SIZE(gmbus_pins_mtp);
        } else if (INTEL_PCH_TYPE(i915) >= PCH_DG2) {
        } else if (INTEL_PCH_TYPE(i915) >= PCH_DG1) {
                pins = gmbus_pins_dg1;
                size = ARRAY_SIZE(gmbus_pins_dg1);
-       } else if (INTEL_PCH_TYPE(i915) >= PCH_MTP) {
-               pins = gmbus_pins_mtp;
-               size = ARRAY_SIZE(gmbus_pins_mtp);
        } else if (INTEL_PCH_TYPE(i915) >= PCH_ICP) {
                pins = gmbus_pins_icp;
                size = ARRAY_SIZE(gmbus_pins_icp);
@@@ -899,6 -896,7 +896,6 @@@ int intel_gmbus_setup(struct drm_i915_p
                }
  
                bus->adapter.owner = THIS_MODULE;
 -              bus->adapter.class = I2C_CLASS_DDC;
                snprintf(bus->adapter.name,
                         sizeof(bus->adapter.name),
                         "i915 gmbus %s", gmbus_pin->name);
index acc6b6804105102389dc26c3fefce80444d0adad,a086d5f51e612ebafb3c16ba96e7ce266eb1cc41..2571ef5a1b211221f7a21afc442a0c9b96dbdc7f
@@@ -44,6 -44,7 +44,7 @@@
  #include "intel_connector.h"
  #include "intel_crtc.h"
  #include "intel_de.h"
+ #include "intel_display_driver.h"
  #include "intel_display_types.h"
  #include "intel_fdi.h"
  #include "intel_fifo_underrun.h"
@@@ -2140,6 -2141,9 +2141,9 @@@ intel_sdvo_detect(struct drm_connector 
        if (!intel_display_device_enabled(i915))
                return connector_status_disconnected;
  
+       if (!intel_display_driver_check_access(i915))
+               return connector->status;
        if (!intel_sdvo_set_target_output(intel_sdvo,
                                          intel_sdvo_connector->output_flag))
                return connector_status_unknown;
@@@ -2805,6 -2809,7 +2809,7 @@@ intel_sdvo_dvi_init(struct intel_sdvo *
        } else {
                intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
        }
+       intel_connector->base.polled = intel_connector->polled;
        encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
        connector->connector_type = DRM_MODE_CONNECTOR_DVID;
  
@@@ -2880,6 -2885,7 +2885,7 @@@ intel_sdvo_analog_init(struct intel_sdv
        intel_connector = &intel_sdvo_connector->base;
        connector = &intel_connector->base;
        intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+       intel_connector->base.polled = intel_connector->polled;
        encoder->encoder_type = DRM_MODE_ENCODER_DAC;
        connector->connector_type = DRM_MODE_CONNECTOR_VGA;
  
@@@ -3327,6 -3333,7 +3333,6 @@@ intel_sdvo_init_ddc_proxy(struct intel_
        ddc->ddc_bus = ddc_bus;
  
        ddc->ddc.owner = THIS_MODULE;
 -      ddc->ddc.class = I2C_CLASS_DDC;
        snprintf(ddc->ddc.name, I2C_NAME_SIZE, "SDVO %c DDC%d",
                 port_name(sdvo->base.port), ddc_bus);
        ddc->ddc.dev.parent = &pdev->dev;
index a6b0aaf30cbe5fa2cb61d506c8deb95b8b2f4416,19467ff70ca9586f74a17b42676e62ee15064e07..27dcfd8a34bb1ddfbdee9c1cc44444be580e4dca
@@@ -65,6 -65,8 +65,6 @@@ static const struct ttm_place sys_place
  static struct ttm_placement i915_sys_placement = {
        .num_placement = 1,
        .placement = &sys_placement_flags,
 -      .num_busy_placement = 1,
 -      .busy_placement = &sys_placement_flags,
  };
  
  /**
@@@ -142,41 -144,45 +142,41 @@@ i915_ttm_place_from_region(const struc
                place->fpfn = offset >> PAGE_SHIFT;
                WARN_ON(overflows_type(place->fpfn + (size >> PAGE_SHIFT), place->lpfn));
                place->lpfn = place->fpfn + (size >> PAGE_SHIFT);
-       } else if (mr->io_size && mr->io_size < mr->total) {
+       } else if (resource_size(&mr->io) && resource_size(&mr->io) < mr->total) {
                if (flags & I915_BO_ALLOC_GPU_ONLY) {
                        place->flags |= TTM_PL_FLAG_TOPDOWN;
                } else {
                        place->fpfn = 0;
-                       WARN_ON(overflows_type(mr->io_size >> PAGE_SHIFT, place->lpfn));
-                       place->lpfn = mr->io_size >> PAGE_SHIFT;
+                       WARN_ON(overflows_type(resource_size(&mr->io) >> PAGE_SHIFT, place->lpfn));
+                       place->lpfn = resource_size(&mr->io) >> PAGE_SHIFT;
                }
        }
  }
  
  static void
  i915_ttm_placement_from_obj(const struct drm_i915_gem_object *obj,
 -                          struct ttm_place *requested,
 -                          struct ttm_place *busy,
 +                          struct ttm_place *places,
                            struct ttm_placement *placement)
  {
        unsigned int num_allowed = obj->mm.n_placements;
        unsigned int flags = obj->flags;
        unsigned int i;
  
 -      placement->num_placement = 1;
 +      places[0].flags |= TTM_PL_FLAG_DESIRED;
        i915_ttm_place_from_region(num_allowed ? obj->mm.placements[0] :
 -                                 obj->mm.region, requested, obj->bo_offset,
 +                                 obj->mm.region, &places[0], obj->bo_offset,
                                   obj->base.size, flags);
  
        /* Cache this on object? */
 -      placement->num_busy_placement = num_allowed;
 -      for (i = 0; i < placement->num_busy_placement; ++i)
 -              i915_ttm_place_from_region(obj->mm.placements[i], busy + i,
 -                                         obj->bo_offset, obj->base.size, flags);
 -
 -      if (num_allowed == 0) {
 -              *busy = *requested;
 -              placement->num_busy_placement = 1;
 +      for (i = 0; i < num_allowed; ++i) {
 +              i915_ttm_place_from_region(obj->mm.placements[i],
 +                                         &places[i + 1], obj->bo_offset,
 +                                         obj->base.size, flags);
 +              places[i + 1].flags |= TTM_PL_FLAG_FALLBACK;
        }
  
 -      placement->placement = requested;
 -      placement->busy_placement = busy;
 +      placement->num_placement = num_allowed + 1;
 +      placement->placement = places;
  }
  
  static int i915_ttm_tt_shmem_populate(struct ttm_device *bdev,
@@@ -783,8 -789,7 +783,8 @@@ static int __i915_ttm_get_pages(struct 
        int ret;
  
        /* First try only the requested placement. No eviction. */
 -      real_num_busy = fetch_and_zero(&placement->num_busy_placement);
 +      real_num_busy = placement->num_placement;
 +      placement->num_placement = 1;
        ret = ttm_bo_validate(bo, placement, &ctx);
        if (ret) {
                ret = i915_ttm_err_to_gem(ret);
                 * If the initial attempt fails, allow all accepted placements,
                 * evicting if necessary.
                 */
 -              placement->num_busy_placement = real_num_busy;
 +              placement->num_placement = real_num_busy;
                ret = ttm_bo_validate(bo, placement, &ctx);
                if (ret)
                        return i915_ttm_err_to_gem(ret);
  
  static int i915_ttm_get_pages(struct drm_i915_gem_object *obj)
  {
 -      struct ttm_place requested, busy[I915_TTM_MAX_PLACEMENTS];
 +      struct ttm_place places[I915_TTM_MAX_PLACEMENTS + 1];
        struct ttm_placement placement;
  
        /* restricted by sg_alloc_table */
        GEM_BUG_ON(obj->mm.n_placements > I915_TTM_MAX_PLACEMENTS);
  
        /* Move to the requested placement. */
 -      i915_ttm_placement_from_obj(obj, &requested, busy, &placement);
 +      i915_ttm_placement_from_obj(obj, places, &placement);
  
        return __i915_ttm_get_pages(obj, &placement);
  }
@@@ -874,7 -879,9 +874,7 @@@ static int __i915_ttm_migrate(struct dr
        i915_ttm_place_from_region(mr, &requested, obj->bo_offset,
                                   obj->base.size, flags);
        placement.num_placement = 1;
 -      placement.num_busy_placement = 1;
        placement.placement = &requested;
 -      placement.busy_placement = &requested;
  
        ret = __i915_ttm_get_pages(obj, &placement);
        if (ret)
@@@ -1083,7 -1090,7 +1083,7 @@@ static vm_fault_t vm_fault_ttm(struct v
                        struct intel_memory_region *mr = obj->mm.placements[i];
                        unsigned int flags;
  
-                       if (!mr->io_size && mr->type != INTEL_MEMORY_SYSTEM)
+                       if (!resource_size(&mr->io) && mr->type != INTEL_MEMORY_SYSTEM)
                                continue;
  
                        flags = obj->flags;
                }
  
                if (err) {
-                       drm_dbg(dev, "Unable to make resource CPU accessible(err = %pe)\n",
-                               ERR_PTR(err));
+                       drm_dbg_ratelimited(dev,
+                                           "Unable to make resource CPU accessible(err = %pe)\n",
+                                           ERR_PTR(err));
                        dma_resv_unlock(bo->base.resv);
                        ret = VM_FAULT_SIGBUS;
                        goto out_rpm;