drm fixes for 6.8 final
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 -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmXqit4ACgkQDHTzWXnE hr4yvQ//afjOeORfmzmu1OUkdJB8NdwvkvVImK5gF2h84vmRBFZ+zR365t/miFNn mhCNOajLI5QSjUufdEyrBbTJlJQUYcH2LiJSJ0yfXfimtgzapdUUUx72Shya/r/R h6BT3JRw/6HzQnmN6jso9IdJd1Xn5ct0eFKNnOWcf0AKVex6I5iZF9vTiv70ymX6 h1szrOB89ecGSAAvky9fQrjkg/XE+GlYV4j9H27d4x1X8sdZOjL096YHtFSDqWeo D44uUT+4isWsQgcpM11VDvbzWNLLFx4pLkWPODT8jfzL0N+FZ687T2256VnZLTH9 bIHfs257mlJ9zwWorXvXCYX1fUG02G7GFJtvwm2Em5sa6Eow9P+DZ84ZorDK2/Wv OdFWjAKCL+5UkGUbzXsl8jB6/Hvez3WjRJEWt9x8b+RpGryuxSqFAJYvs3NC2V8r ZLHG4lGz8WDgy//Jt0OrtpeQr8e1ogMykCP4/+L0oIuYKjKzgH8ia/zBcKz3KVPy MMUStSGIrYgQ+2m/hL2A1NCcLaQ2OK2mO3RWVQImLjnYarvLYZpPScevfCwqS9Od Fs+jmDFryThlGSlmD8G8+wX+28bLz/xhYR/fWiEF3I4uUVC4p/jRo+4m2TUNP//j ZAWyuy7bbuT7vmxFnvWAhsxl21Ia4bVIIb3sede9fpyVPWIDB3c= =g/du -----END PGP SIGNATURE----- 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 ...
This commit is contained in:
commit
e6fac3c1f3
5
.mailmap
5
.mailmap
@ -610,6 +610,11 @@ TripleX Chung <xxx.phy@gmail.com> <triplex@zh-kernel.org>
|
|||||||
TripleX Chung <xxx.phy@gmail.com> <zhongyu@18mail.cn>
|
TripleX Chung <xxx.phy@gmail.com> <zhongyu@18mail.cn>
|
||||||
Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
|
Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
|
||||||
Tudor Ambarus <tudor.ambarus@linaro.org> <tudor.ambarus@microchip.com>
|
Tudor Ambarus <tudor.ambarus@linaro.org> <tudor.ambarus@microchip.com>
|
||||||
|
Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@intel.com>
|
||||||
|
Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@linux.intel.com>
|
||||||
|
Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@sophos.com>
|
||||||
|
Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko.ursulin@onelan.co.uk>
|
||||||
|
Tvrtko Ursulin <tursulin@ursulin.net> <tvrtko@ursulin.net>
|
||||||
Tycho Andersen <tycho@tycho.pizza> <tycho@tycho.ws>
|
Tycho Andersen <tycho@tycho.pizza> <tycho@tycho.ws>
|
||||||
Tzung-Bi Shih <tzungbi@kernel.org> <tzungbi@google.com>
|
Tzung-Bi Shih <tzungbi@kernel.org> <tzungbi@google.com>
|
||||||
Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
|
||||||
|
@ -10735,7 +10735,7 @@ INTEL DRM I915 DRIVER (Meteor Lake, DG2 and older excluding Poulsbo, Moorestown
|
|||||||
M: Jani Nikula <jani.nikula@linux.intel.com>
|
M: Jani Nikula <jani.nikula@linux.intel.com>
|
||||||
M: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
|
M: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
|
||||||
M: Rodrigo Vivi <rodrigo.vivi@intel.com>
|
M: Rodrigo Vivi <rodrigo.vivi@intel.com>
|
||||||
M: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
|
M: Tvrtko Ursulin <tursulin@ursulin.net>
|
||||||
L: intel-gfx@lists.freedesktop.org
|
L: intel-gfx@lists.freedesktop.org
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://drm.pages.freedesktop.org/intel-docs/
|
W: https://drm.pages.freedesktop.org/intel-docs/
|
||||||
|
@ -6539,7 +6539,7 @@ static void amdgpu_dm_connector_funcs_force(struct drm_connector *connector)
|
|||||||
struct edid *edid;
|
struct edid *edid;
|
||||||
struct i2c_adapter *ddc;
|
struct i2c_adapter *ddc;
|
||||||
|
|
||||||
if (dc_link->aux_mode)
|
if (dc_link && dc_link->aux_mode)
|
||||||
ddc = &aconnector->dm_dp_aux.aux.ddc;
|
ddc = &aconnector->dm_dp_aux.aux.ddc;
|
||||||
else
|
else
|
||||||
ddc = &aconnector->i2c->base;
|
ddc = &aconnector->i2c->base;
|
||||||
@ -11169,14 +11169,23 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
|
|||||||
if (range->flags != 1)
|
if (range->flags != 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
amdgpu_dm_connector->min_vfreq = range->min_vfreq;
|
|
||||||
amdgpu_dm_connector->max_vfreq = range->max_vfreq;
|
|
||||||
amdgpu_dm_connector->pixel_clock_mhz =
|
|
||||||
range->pixel_clock_mhz * 10;
|
|
||||||
|
|
||||||
connector->display_info.monitor_range.min_vfreq = range->min_vfreq;
|
connector->display_info.monitor_range.min_vfreq = range->min_vfreq;
|
||||||
connector->display_info.monitor_range.max_vfreq = range->max_vfreq;
|
connector->display_info.monitor_range.max_vfreq = range->max_vfreq;
|
||||||
|
|
||||||
|
if (edid->revision >= 4) {
|
||||||
|
if (data->pad2 & DRM_EDID_RANGE_OFFSET_MIN_VFREQ)
|
||||||
|
connector->display_info.monitor_range.min_vfreq += 255;
|
||||||
|
if (data->pad2 & DRM_EDID_RANGE_OFFSET_MAX_VFREQ)
|
||||||
|
connector->display_info.monitor_range.max_vfreq += 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
amdgpu_dm_connector->min_vfreq =
|
||||||
|
connector->display_info.monitor_range.min_vfreq;
|
||||||
|
amdgpu_dm_connector->max_vfreq =
|
||||||
|
connector->display_info.monitor_range.max_vfreq;
|
||||||
|
amdgpu_dm_connector->pixel_clock_mhz =
|
||||||
|
range->pixel_clock_mhz * 10;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2558,6 +2558,7 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
|
|||||||
{
|
{
|
||||||
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
struct amdgpu_device *adev = dev_get_drvdata(dev);
|
||||||
int err, ret;
|
int err, ret;
|
||||||
|
u32 pwm_mode;
|
||||||
int value;
|
int value;
|
||||||
|
|
||||||
if (amdgpu_in_reset(adev))
|
if (amdgpu_in_reset(adev))
|
||||||
@ -2569,13 +2570,22 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
if (value == 0)
|
||||||
|
pwm_mode = AMD_FAN_CTRL_NONE;
|
||||||
|
else if (value == 1)
|
||||||
|
pwm_mode = AMD_FAN_CTRL_MANUAL;
|
||||||
|
else if (value == 2)
|
||||||
|
pwm_mode = AMD_FAN_CTRL_AUTO;
|
||||||
|
else
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = pm_runtime_get_sync(adev_to_drm(adev)->dev);
|
ret = pm_runtime_get_sync(adev_to_drm(adev)->dev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
|
pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = amdgpu_dpm_set_fan_control_mode(adev, value);
|
ret = amdgpu_dpm_set_fan_control_mode(adev, pwm_mode);
|
||||||
|
|
||||||
pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
|
pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
|
||||||
pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
|
pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
|
||||||
|
@ -229,8 +229,6 @@ int smu_v14_0_check_fw_version(struct smu_context *smu)
|
|||||||
smu->smc_driver_if_version = SMU14_DRIVER_IF_VERSION_SMU_V14_0_2;
|
smu->smc_driver_if_version = SMU14_DRIVER_IF_VERSION_SMU_V14_0_2;
|
||||||
break;
|
break;
|
||||||
case IP_VERSION(14, 0, 0):
|
case IP_VERSION(14, 0, 0):
|
||||||
if ((smu->smc_fw_version < 0x5d3a00))
|
|
||||||
dev_warn(smu->adev->dev, "The PMFW version(%x) is behind in this BIOS!\n", smu->smc_fw_version);
|
|
||||||
smu->smc_driver_if_version = SMU14_DRIVER_IF_VERSION_SMU_V14_0_0;
|
smu->smc_driver_if_version = SMU14_DRIVER_IF_VERSION_SMU_V14_0_0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -261,6 +261,9 @@ static int smu_v14_0_0_get_smu_metrics_data(struct smu_context *smu,
|
|||||||
*value = metrics->MpipuclkFrequency;
|
*value = metrics->MpipuclkFrequency;
|
||||||
break;
|
break;
|
||||||
case METRICS_AVERAGE_GFXACTIVITY:
|
case METRICS_AVERAGE_GFXACTIVITY:
|
||||||
|
if ((smu->smc_fw_version > 0x5d4600))
|
||||||
|
*value = metrics->GfxActivity;
|
||||||
|
else
|
||||||
*value = metrics->GfxActivity / 100;
|
*value = metrics->GfxActivity / 100;
|
||||||
break;
|
break;
|
||||||
case METRICS_AVERAGE_VCNACTIVITY:
|
case METRICS_AVERAGE_VCNACTIVITY:
|
||||||
|
@ -760,9 +760,11 @@ static void output_poll_execute(struct work_struct *work)
|
|||||||
changed = dev->mode_config.delayed_event;
|
changed = dev->mode_config.delayed_event;
|
||||||
dev->mode_config.delayed_event = false;
|
dev->mode_config.delayed_event = false;
|
||||||
|
|
||||||
if (!drm_kms_helper_poll && dev->mode_config.poll_running) {
|
if (!drm_kms_helper_poll) {
|
||||||
|
if (dev->mode_config.poll_running) {
|
||||||
drm_kms_helper_disable_hpd(dev);
|
drm_kms_helper_disable_hpd(dev);
|
||||||
dev->mode_config.poll_running = false;
|
dev->mode_config.poll_running = false;
|
||||||
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,7 +246,14 @@ static enum phy icl_aux_pw_to_phy(struct drm_i915_private *i915,
|
|||||||
enum aux_ch aux_ch = icl_aux_pw_to_ch(power_well);
|
enum aux_ch aux_ch = icl_aux_pw_to_ch(power_well);
|
||||||
struct intel_digital_port *dig_port = aux_ch_to_digital_port(i915, aux_ch);
|
struct intel_digital_port *dig_port = aux_ch_to_digital_port(i915, aux_ch);
|
||||||
|
|
||||||
return intel_port_to_phy(i915, dig_port->base.port);
|
/*
|
||||||
|
* FIXME should we care about the (VBT defined) dig_port->aux_ch
|
||||||
|
* relationship or should this be purely defined by the hardware layout?
|
||||||
|
* Currently if the port doesn't appear in the VBT, or if it's declared
|
||||||
|
* as HDMI-only and routed to a combo PHY, the encoder either won't be
|
||||||
|
* present at all or it will not have an aux_ch assigned.
|
||||||
|
*/
|
||||||
|
return dig_port ? intel_port_to_phy(i915, dig_port->base.port) : PHY_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv,
|
static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv,
|
||||||
@ -414,7 +421,8 @@ icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
|
|||||||
|
|
||||||
intel_de_rmw(dev_priv, regs->driver, 0, HSW_PWR_WELL_CTL_REQ(pw_idx));
|
intel_de_rmw(dev_priv, regs->driver, 0, HSW_PWR_WELL_CTL_REQ(pw_idx));
|
||||||
|
|
||||||
if (DISPLAY_VER(dev_priv) < 12)
|
/* FIXME this is a mess */
|
||||||
|
if (phy != PHY_NONE)
|
||||||
intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy),
|
intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy),
|
||||||
0, ICL_LANE_ENABLE_AUX);
|
0, ICL_LANE_ENABLE_AUX);
|
||||||
|
|
||||||
@ -437,7 +445,10 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
|
|||||||
|
|
||||||
drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));
|
drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));
|
||||||
|
|
||||||
intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy), ICL_LANE_ENABLE_AUX, 0);
|
/* FIXME this is a mess */
|
||||||
|
if (phy != PHY_NONE)
|
||||||
|
intel_de_rmw(dev_priv, ICL_PORT_CL_DW12(phy),
|
||||||
|
ICL_LANE_ENABLE_AUX, 0);
|
||||||
|
|
||||||
intel_de_rmw(dev_priv, regs->driver, HSW_PWR_WELL_CTL_REQ(pw_idx), 0);
|
intel_de_rmw(dev_priv, regs->driver, HSW_PWR_WELL_CTL_REQ(pw_idx), 0);
|
||||||
|
|
||||||
|
@ -609,6 +609,13 @@ struct intel_connector {
|
|||||||
* and active (i.e. dpms ON state). */
|
* and active (i.e. dpms ON state). */
|
||||||
bool (*get_hw_state)(struct intel_connector *);
|
bool (*get_hw_state)(struct intel_connector *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optional hook called during init/resume to sync any state
|
||||||
|
* stored in the connector (eg. DSC state) wrt. the HW state.
|
||||||
|
*/
|
||||||
|
void (*sync_state)(struct intel_connector *connector,
|
||||||
|
const struct intel_crtc_state *crtc_state);
|
||||||
|
|
||||||
/* Panel info for eDP and LVDS */
|
/* Panel info for eDP and LVDS */
|
||||||
struct intel_panel panel;
|
struct intel_panel panel;
|
||||||
|
|
||||||
|
@ -5699,6 +5699,9 @@ intel_dp_detect(struct drm_connector *connector,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!intel_dp_is_edp(intel_dp))
|
||||||
|
intel_psr_init_dpcd(intel_dp);
|
||||||
|
|
||||||
intel_dp_detect_dsc_caps(intel_dp, intel_connector);
|
intel_dp_detect_dsc_caps(intel_dp, intel_connector);
|
||||||
|
|
||||||
intel_dp_configure_mst(intel_dp);
|
intel_dp_configure_mst(intel_dp);
|
||||||
@ -5859,6 +5862,19 @@ intel_dp_connector_unregister(struct drm_connector *connector)
|
|||||||
intel_connector_unregister(connector);
|
intel_connector_unregister(connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void intel_dp_connector_sync_state(struct intel_connector *connector,
|
||||||
|
const struct intel_crtc_state *crtc_state)
|
||||||
|
{
|
||||||
|
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||||
|
|
||||||
|
if (crtc_state && crtc_state->dsc.compression_enable) {
|
||||||
|
drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux);
|
||||||
|
connector->dp.dsc_decompression_enabled = true;
|
||||||
|
} else {
|
||||||
|
connector->dp.dsc_decompression_enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
|
void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
|
||||||
{
|
{
|
||||||
struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder));
|
struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder));
|
||||||
|
@ -45,6 +45,8 @@ bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
|
|||||||
int intel_dp_min_bpp(enum intel_output_format output_format);
|
int intel_dp_min_bpp(enum intel_output_format output_format);
|
||||||
bool intel_dp_init_connector(struct intel_digital_port *dig_port,
|
bool intel_dp_init_connector(struct intel_digital_port *dig_port,
|
||||||
struct intel_connector *intel_connector);
|
struct intel_connector *intel_connector);
|
||||||
|
void intel_dp_connector_sync_state(struct intel_connector *connector,
|
||||||
|
const struct intel_crtc_state *crtc_state);
|
||||||
void intel_dp_set_link_params(struct intel_dp *intel_dp,
|
void intel_dp_set_link_params(struct intel_dp *intel_dp,
|
||||||
int link_rate, int lane_count);
|
int link_rate, int lane_count);
|
||||||
int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
|
int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
|
||||||
|
@ -330,23 +330,13 @@ static const struct hdcp2_dp_msg_data hdcp2_dp_msg_data[] = {
|
|||||||
0, 0 },
|
0, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct drm_dp_aux *
|
|
||||||
intel_dp_hdcp_get_aux(struct intel_connector *connector)
|
|
||||||
{
|
|
||||||
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
|
||||||
|
|
||||||
if (intel_encoder_is_mst(connector->encoder))
|
|
||||||
return &connector->port->aux;
|
|
||||||
else
|
|
||||||
return &dig_port->dp.aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
intel_dp_hdcp2_read_rx_status(struct intel_connector *connector,
|
intel_dp_hdcp2_read_rx_status(struct intel_connector *connector,
|
||||||
u8 *rx_status)
|
u8 *rx_status)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||||
struct drm_dp_aux *aux = intel_dp_hdcp_get_aux(connector);
|
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
||||||
|
struct drm_dp_aux *aux = &dig_port->dp.aux;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
ret = drm_dp_dpcd_read(aux,
|
ret = drm_dp_dpcd_read(aux,
|
||||||
@ -399,7 +389,9 @@ intel_dp_hdcp2_wait_for_msg(struct intel_connector *connector,
|
|||||||
const struct hdcp2_dp_msg_data *hdcp2_msg_data)
|
const struct hdcp2_dp_msg_data *hdcp2_msg_data)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||||
struct intel_hdcp *hdcp = &connector->hdcp;
|
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
||||||
|
struct intel_dp *dp = &dig_port->dp;
|
||||||
|
struct intel_hdcp *hdcp = &dp->attached_connector->hdcp;
|
||||||
u8 msg_id = hdcp2_msg_data->msg_id;
|
u8 msg_id = hdcp2_msg_data->msg_id;
|
||||||
int ret, timeout;
|
int ret, timeout;
|
||||||
bool msg_ready = false;
|
bool msg_ready = false;
|
||||||
@ -454,8 +446,9 @@ int intel_dp_hdcp2_write_msg(struct intel_connector *connector,
|
|||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
u8 *byte = buf;
|
u8 *byte = buf;
|
||||||
ssize_t ret, bytes_to_write, len;
|
ssize_t ret, bytes_to_write, len;
|
||||||
|
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
||||||
|
struct drm_dp_aux *aux = &dig_port->dp.aux;
|
||||||
const struct hdcp2_dp_msg_data *hdcp2_msg_data;
|
const struct hdcp2_dp_msg_data *hdcp2_msg_data;
|
||||||
struct drm_dp_aux *aux;
|
|
||||||
|
|
||||||
hdcp2_msg_data = get_hdcp2_dp_msg_data(*byte);
|
hdcp2_msg_data = get_hdcp2_dp_msg_data(*byte);
|
||||||
if (!hdcp2_msg_data)
|
if (!hdcp2_msg_data)
|
||||||
@ -463,8 +456,6 @@ int intel_dp_hdcp2_write_msg(struct intel_connector *connector,
|
|||||||
|
|
||||||
offset = hdcp2_msg_data->offset;
|
offset = hdcp2_msg_data->offset;
|
||||||
|
|
||||||
aux = intel_dp_hdcp_get_aux(connector);
|
|
||||||
|
|
||||||
/* No msg_id in DP HDCP2.2 msgs */
|
/* No msg_id in DP HDCP2.2 msgs */
|
||||||
bytes_to_write = size - 1;
|
bytes_to_write = size - 1;
|
||||||
byte++;
|
byte++;
|
||||||
@ -490,7 +481,8 @@ static
|
|||||||
ssize_t get_receiver_id_list_rx_info(struct intel_connector *connector,
|
ssize_t get_receiver_id_list_rx_info(struct intel_connector *connector,
|
||||||
u32 *dev_cnt, u8 *byte)
|
u32 *dev_cnt, u8 *byte)
|
||||||
{
|
{
|
||||||
struct drm_dp_aux *aux = intel_dp_hdcp_get_aux(connector);
|
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
||||||
|
struct drm_dp_aux *aux = &dig_port->dp.aux;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
u8 *rx_info = byte;
|
u8 *rx_info = byte;
|
||||||
|
|
||||||
@ -515,8 +507,9 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector,
|
|||||||
{
|
{
|
||||||
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
||||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||||
struct intel_hdcp *hdcp = &connector->hdcp;
|
struct drm_dp_aux *aux = &dig_port->dp.aux;
|
||||||
struct drm_dp_aux *aux;
|
struct intel_dp *dp = &dig_port->dp;
|
||||||
|
struct intel_hdcp *hdcp = &dp->attached_connector->hdcp;
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
u8 *byte = buf;
|
u8 *byte = buf;
|
||||||
ssize_t ret, bytes_to_recv, len;
|
ssize_t ret, bytes_to_recv, len;
|
||||||
@ -530,8 +523,6 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
offset = hdcp2_msg_data->offset;
|
offset = hdcp2_msg_data->offset;
|
||||||
|
|
||||||
aux = intel_dp_hdcp_get_aux(connector);
|
|
||||||
|
|
||||||
ret = intel_dp_hdcp2_wait_for_msg(connector, hdcp2_msg_data);
|
ret = intel_dp_hdcp2_wait_for_msg(connector, hdcp2_msg_data);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -561,11 +552,6 @@ int intel_dp_hdcp2_read_msg(struct intel_connector *connector,
|
|||||||
|
|
||||||
/* Entire msg read timeout since initiate of msg read */
|
/* Entire msg read timeout since initiate of msg read */
|
||||||
if (bytes_to_recv == size - 1 && hdcp2_msg_data->msg_read_timeout > 0) {
|
if (bytes_to_recv == size - 1 && hdcp2_msg_data->msg_read_timeout > 0) {
|
||||||
if (intel_encoder_is_mst(connector->encoder))
|
|
||||||
msg_end = ktime_add_ms(ktime_get_raw(),
|
|
||||||
hdcp2_msg_data->msg_read_timeout *
|
|
||||||
connector->port->parent->num_ports);
|
|
||||||
else
|
|
||||||
msg_end = ktime_add_ms(ktime_get_raw(),
|
msg_end = ktime_add_ms(ktime_get_raw(),
|
||||||
hdcp2_msg_data->msg_read_timeout);
|
hdcp2_msg_data->msg_read_timeout);
|
||||||
}
|
}
|
||||||
@ -651,12 +637,11 @@ static
|
|||||||
int intel_dp_hdcp2_capable(struct intel_connector *connector,
|
int intel_dp_hdcp2_capable(struct intel_connector *connector,
|
||||||
bool *capable)
|
bool *capable)
|
||||||
{
|
{
|
||||||
struct drm_dp_aux *aux;
|
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
|
||||||
|
struct drm_dp_aux *aux = &dig_port->dp.aux;
|
||||||
u8 rx_caps[3];
|
u8 rx_caps[3];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
aux = intel_dp_hdcp_get_aux(connector);
|
|
||||||
|
|
||||||
*capable = false;
|
*capable = false;
|
||||||
ret = drm_dp_dpcd_read(aux,
|
ret = drm_dp_dpcd_read(aux,
|
||||||
DP_HDCP_2_2_REG_RX_CAPS_OFFSET,
|
DP_HDCP_2_2_REG_RX_CAPS_OFFSET,
|
||||||
|
@ -1534,6 +1534,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
|
intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
|
||||||
|
intel_connector->sync_state = intel_dp_connector_sync_state;
|
||||||
intel_connector->mst_port = intel_dp;
|
intel_connector->mst_port = intel_dp;
|
||||||
intel_connector->port = port;
|
intel_connector->port = port;
|
||||||
drm_dp_mst_get_port_malloc(port);
|
drm_dp_mst_get_port_malloc(port);
|
||||||
|
@ -318,12 +318,6 @@ static void intel_modeset_update_connector_atomic_state(struct drm_i915_private
|
|||||||
const struct intel_crtc_state *crtc_state =
|
const struct intel_crtc_state *crtc_state =
|
||||||
to_intel_crtc_state(crtc->base.state);
|
to_intel_crtc_state(crtc->base.state);
|
||||||
|
|
||||||
if (crtc_state->dsc.compression_enable) {
|
|
||||||
drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux);
|
|
||||||
connector->dp.dsc_decompression_enabled = true;
|
|
||||||
} else {
|
|
||||||
connector->dp.dsc_decompression_enabled = false;
|
|
||||||
}
|
|
||||||
conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3;
|
conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -775,8 +769,9 @@ static void intel_modeset_readout_hw_state(struct drm_i915_private *i915)
|
|||||||
|
|
||||||
drm_connector_list_iter_begin(&i915->drm, &conn_iter);
|
drm_connector_list_iter_begin(&i915->drm, &conn_iter);
|
||||||
for_each_intel_connector_iter(connector, &conn_iter) {
|
for_each_intel_connector_iter(connector, &conn_iter) {
|
||||||
|
struct intel_crtc_state *crtc_state = NULL;
|
||||||
|
|
||||||
if (connector->get_hw_state(connector)) {
|
if (connector->get_hw_state(connector)) {
|
||||||
struct intel_crtc_state *crtc_state;
|
|
||||||
struct intel_crtc *crtc;
|
struct intel_crtc *crtc;
|
||||||
|
|
||||||
connector->base.dpms = DRM_MODE_DPMS_ON;
|
connector->base.dpms = DRM_MODE_DPMS_ON;
|
||||||
@ -802,6 +797,10 @@ static void intel_modeset_readout_hw_state(struct drm_i915_private *i915)
|
|||||||
connector->base.dpms = DRM_MODE_DPMS_OFF;
|
connector->base.dpms = DRM_MODE_DPMS_OFF;
|
||||||
connector->base.encoder = NULL;
|
connector->base.encoder = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (connector->sync_state)
|
||||||
|
connector->sync_state(connector, crtc_state);
|
||||||
|
|
||||||
drm_dbg_kms(&i915->drm,
|
drm_dbg_kms(&i915->drm,
|
||||||
"[CONNECTOR:%d:%s] hw state readout: %s\n",
|
"[CONNECTOR:%d:%s] hw state readout: %s\n",
|
||||||
connector->base.base.id, connector->base.name,
|
connector->base.base.id, connector->base.name,
|
||||||
|
@ -2776,9 +2776,6 @@ void intel_psr_init(struct intel_dp *intel_dp)
|
|||||||
if (!(HAS_PSR(dev_priv) || HAS_DP20(dev_priv)))
|
if (!(HAS_PSR(dev_priv) || HAS_DP20(dev_priv)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!intel_dp_is_edp(intel_dp))
|
|
||||||
intel_psr_init_dpcd(intel_dp);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* HSW spec explicitly says PSR is tied to port A.
|
* HSW spec explicitly says PSR is tied to port A.
|
||||||
* BDW+ platforms have a instance of PSR registers per transcoder but
|
* BDW+ platforms have a instance of PSR registers per transcoder but
|
||||||
|
@ -379,6 +379,9 @@ i915_gem_userptr_release(struct drm_i915_gem_object *obj)
|
|||||||
{
|
{
|
||||||
GEM_WARN_ON(obj->userptr.page_ref);
|
GEM_WARN_ON(obj->userptr.page_ref);
|
||||||
|
|
||||||
|
if (!obj->userptr.notifier.mm)
|
||||||
|
return;
|
||||||
|
|
||||||
mmu_interval_notifier_remove(&obj->userptr.notifier);
|
mmu_interval_notifier_remove(&obj->userptr.notifier);
|
||||||
obj->userptr.notifier.mm = NULL;
|
obj->userptr.notifier.mm = NULL;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
* Copyright © 2021 Intel Corporation
|
* Copyright © 2021 Intel Corporation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/jiffies.h>
|
||||||
|
|
||||||
//#include "gt/intel_engine_user.h"
|
//#include "gt/intel_engine_user.h"
|
||||||
#include "gt/intel_gt.h"
|
#include "gt/intel_gt.h"
|
||||||
#include "i915_drv.h"
|
#include "i915_drv.h"
|
||||||
@ -12,7 +14,7 @@
|
|||||||
|
|
||||||
#define REDUCED_TIMESLICE 5
|
#define REDUCED_TIMESLICE 5
|
||||||
#define REDUCED_PREEMPT 10
|
#define REDUCED_PREEMPT 10
|
||||||
#define WAIT_FOR_RESET_TIME 10000
|
#define WAIT_FOR_RESET_TIME_MS 10000
|
||||||
|
|
||||||
struct intel_engine_cs *intel_selftest_find_any_engine(struct intel_gt *gt)
|
struct intel_engine_cs *intel_selftest_find_any_engine(struct intel_gt *gt)
|
||||||
{
|
{
|
||||||
@ -91,7 +93,7 @@ int intel_selftest_wait_for_rq(struct i915_request *rq)
|
|||||||
{
|
{
|
||||||
long ret;
|
long ret;
|
||||||
|
|
||||||
ret = i915_request_wait(rq, 0, WAIT_FOR_RESET_TIME);
|
ret = i915_request_wait(rq, 0, msecs_to_jiffies(WAIT_FOR_RESET_TIME_MS));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ struct nvkm_client {
|
|||||||
u32 debug;
|
u32 debug;
|
||||||
|
|
||||||
struct rb_root objroot;
|
struct rb_root objroot;
|
||||||
|
spinlock_t obj_lock;
|
||||||
|
|
||||||
void *data;
|
void *data;
|
||||||
int (*event)(u64 token, void *argv, u32 argc);
|
int (*event)(u64 token, void *argv, u32 argc);
|
||||||
|
@ -764,7 +764,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (unlikely(nouveau_cli_uvmm(cli)))
|
if (unlikely(nouveau_cli_uvmm(cli)))
|
||||||
return -ENOSYS;
|
return nouveau_abi16_put(abi16, -ENOSYS);
|
||||||
|
|
||||||
list_for_each_entry(temp, &abi16->channels, head) {
|
list_for_each_entry(temp, &abi16->channels, head) {
|
||||||
if (temp->chan->chid == req->channel) {
|
if (temp->chan->chid == req->channel) {
|
||||||
|
@ -180,6 +180,7 @@ nvkm_client_new(const char *name, u64 device, const char *cfg, const char *dbg,
|
|||||||
client->device = device;
|
client->device = device;
|
||||||
client->debug = nvkm_dbgopt(dbg, "CLIENT");
|
client->debug = nvkm_dbgopt(dbg, "CLIENT");
|
||||||
client->objroot = RB_ROOT;
|
client->objroot = RB_ROOT;
|
||||||
|
spin_lock_init(&client->obj_lock);
|
||||||
client->event = event;
|
client->event = event;
|
||||||
INIT_LIST_HEAD(&client->umem);
|
INIT_LIST_HEAD(&client->umem);
|
||||||
spin_lock_init(&client->lock);
|
spin_lock_init(&client->lock);
|
||||||
|
@ -30,8 +30,10 @@ nvkm_object_search(struct nvkm_client *client, u64 handle,
|
|||||||
const struct nvkm_object_func *func)
|
const struct nvkm_object_func *func)
|
||||||
{
|
{
|
||||||
struct nvkm_object *object;
|
struct nvkm_object *object;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (handle) {
|
if (handle) {
|
||||||
|
spin_lock_irqsave(&client->obj_lock, flags);
|
||||||
struct rb_node *node = client->objroot.rb_node;
|
struct rb_node *node = client->objroot.rb_node;
|
||||||
while (node) {
|
while (node) {
|
||||||
object = rb_entry(node, typeof(*object), node);
|
object = rb_entry(node, typeof(*object), node);
|
||||||
@ -40,9 +42,12 @@ nvkm_object_search(struct nvkm_client *client, u64 handle,
|
|||||||
else
|
else
|
||||||
if (handle > object->object)
|
if (handle > object->object)
|
||||||
node = node->rb_right;
|
node = node->rb_right;
|
||||||
else
|
else {
|
||||||
|
spin_unlock_irqrestore(&client->obj_lock, flags);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
spin_unlock_irqrestore(&client->obj_lock, flags);
|
||||||
return ERR_PTR(-ENOENT);
|
return ERR_PTR(-ENOENT);
|
||||||
} else {
|
} else {
|
||||||
object = &client->object;
|
object = &client->object;
|
||||||
@ -57,30 +62,39 @@ done:
|
|||||||
void
|
void
|
||||||
nvkm_object_remove(struct nvkm_object *object)
|
nvkm_object_remove(struct nvkm_object *object)
|
||||||
{
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&object->client->obj_lock, flags);
|
||||||
if (!RB_EMPTY_NODE(&object->node))
|
if (!RB_EMPTY_NODE(&object->node))
|
||||||
rb_erase(&object->node, &object->client->objroot);
|
rb_erase(&object->node, &object->client->objroot);
|
||||||
|
spin_unlock_irqrestore(&object->client->obj_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
nvkm_object_insert(struct nvkm_object *object)
|
nvkm_object_insert(struct nvkm_object *object)
|
||||||
{
|
{
|
||||||
struct rb_node **ptr = &object->client->objroot.rb_node;
|
struct rb_node **ptr;
|
||||||
struct rb_node *parent = NULL;
|
struct rb_node *parent = NULL;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&object->client->obj_lock, flags);
|
||||||
|
ptr = &object->client->objroot.rb_node;
|
||||||
while (*ptr) {
|
while (*ptr) {
|
||||||
struct nvkm_object *this = rb_entry(*ptr, typeof(*this), node);
|
struct nvkm_object *this = rb_entry(*ptr, typeof(*this), node);
|
||||||
parent = *ptr;
|
parent = *ptr;
|
||||||
if (object->object < this->object)
|
if (object->object < this->object) {
|
||||||
ptr = &parent->rb_left;
|
ptr = &parent->rb_left;
|
||||||
else
|
} else if (object->object > this->object) {
|
||||||
if (object->object > this->object)
|
|
||||||
ptr = &parent->rb_right;
|
ptr = &parent->rb_right;
|
||||||
else
|
} else {
|
||||||
|
spin_unlock_irqrestore(&object->client->obj_lock, flags);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rb_link_node(&object->node, parent, ptr);
|
rb_link_node(&object->node, parent, ptr);
|
||||||
rb_insert_color(&object->node, &object->client->objroot);
|
rb_insert_color(&object->node, &object->client->objroot);
|
||||||
|
spin_unlock_irqrestore(&object->client->obj_lock, flags);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1768,11 +1768,11 @@ static const struct panel_desc starry_qfh032011_53g_desc = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_display_mode starry_himax83102_j02_default_mode = {
|
static const struct drm_display_mode starry_himax83102_j02_default_mode = {
|
||||||
.clock = 162850,
|
.clock = 162680,
|
||||||
.hdisplay = 1200,
|
.hdisplay = 1200,
|
||||||
.hsync_start = 1200 + 50,
|
.hsync_start = 1200 + 60,
|
||||||
.hsync_end = 1200 + 50 + 20,
|
.hsync_end = 1200 + 60 + 20,
|
||||||
.htotal = 1200 + 50 + 20 + 50,
|
.htotal = 1200 + 60 + 20 + 40,
|
||||||
.vdisplay = 1920,
|
.vdisplay = 1920,
|
||||||
.vsync_start = 1920 + 116,
|
.vsync_start = 1920 + 116,
|
||||||
.vsync_end = 1920 + 116 + 8,
|
.vsync_end = 1920 + 116 + 8,
|
||||||
|
@ -189,7 +189,7 @@ static void drm_test_buddy_alloc_range_bias(struct kunit *test)
|
|||||||
&allocated,
|
&allocated,
|
||||||
DRM_BUDDY_RANGE_ALLOCATION),
|
DRM_BUDDY_RANGE_ALLOCATION),
|
||||||
"buddy_alloc failed with bias(%x-%x), size=%u, ps=%u\n",
|
"buddy_alloc failed with bias(%x-%x), size=%u, ps=%u\n",
|
||||||
bias_start, bias_end, size);
|
bias_start, bias_end, size, ps);
|
||||||
bias_rem -= size;
|
bias_rem -= size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -167,9 +167,10 @@ int xe_tile_init_noalloc(struct xe_tile *tile)
|
|||||||
goto err_mem_access;
|
goto err_mem_access;
|
||||||
|
|
||||||
tile->mem.kernel_bb_pool = xe_sa_bo_manager_init(tile, SZ_1M, 16);
|
tile->mem.kernel_bb_pool = xe_sa_bo_manager_init(tile, SZ_1M, 16);
|
||||||
if (IS_ERR(tile->mem.kernel_bb_pool))
|
if (IS_ERR(tile->mem.kernel_bb_pool)) {
|
||||||
err = PTR_ERR(tile->mem.kernel_bb_pool);
|
err = PTR_ERR(tile->mem.kernel_bb_pool);
|
||||||
|
goto err_mem_access;
|
||||||
|
}
|
||||||
xe_wa_apply_tile_workarounds(tile);
|
xe_wa_apply_tile_workarounds(tile);
|
||||||
|
|
||||||
xe_tile_sysfs_init(tile);
|
xe_tile_sysfs_init(tile);
|
||||||
|
Loading…
Reference in New Issue
Block a user