Commit 47cd3af6 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-next-2022-09-16-1' of...

Merge tag 'drm-intel-next-2022-09-16-1' of git://anongit.freedesktop.org/drm/drm-intel into drm-next

drm/i915 feature pull #2 for v6.1:

Features and functionality:
- More Meteorlake platform enabling (Radhakrishna, Imre, Madhumitha)
- Allow seamless M/N changes on eDP panels that support it (Ville)
- Switch DSC debugfs from output bpp to input bpc (Swati)

Refactoring and cleanups:
- Clocking and DPLL refactoring and cleanups to support seamless M/N (Ville)
- Plenty of VBT definition and parsing updates and cleanups (Ville)
- Extract SKL watermark code to a separate file, and clean up (Ville)
- Clean up IPC interfaces and debugfs (Jani)
- Continue moving display data under drm_i915_private display sub-struct (Jani)
- Display quirk handling refactoring and abstractions (Jani)
- Stop using implicit dev_priv in gmbus registers (Jani)
- BUG_ON() removals and conversions to drm_WARN_ON() and BUILD_BUG_ON() (Jani)
- Use drm_dp_phy_name() for logging (Jani)
- Use REG_BIT() macros for CDCLK registers (Stan)
- Move display and media IP versions to runtime info (Radhakrishna)

Fixes:
- Fix DP MST suspend to avoid use-after-free (Andrzej)
- Fix HPD suspend to avoid use-after-free for fbdev (Andrzej)
- Fix various PSR issues regarding selective update and damage clips (Jouni)
- Fix runtime pm wakerefs for driver remove and release (Mitul Golani)
- Fix conditions for filtering fixed modes for panels (Ville)
- Fix TV encoder clock computation (Ville)
- Fix dvo mode_valid hook return type (Nathan Huckleberry)

Merges:
- Backmerge drm-next to sync the DP MST atomic changes (Jani)
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/87o7vfr064.fsf@intel.com
parents 72ca70ac 21f0b7da
...@@ -258,7 +258,8 @@ i915-y += \ ...@@ -258,7 +258,8 @@ i915-y += \
display/intel_vga.o \ display/intel_vga.o \
display/i9xx_plane.o \ display/i9xx_plane.o \
display/skl_scaler.o \ display/skl_scaler.o \
display/skl_universal_plane.o display/skl_universal_plane.o \
display/skl_watermark.o
i915-$(CONFIG_ACPI) += \ i915-$(CONFIG_ACPI) += \
display/intel_acpi.o \ display/intel_acpi.o \
display/intel_opregion.o display/intel_opregion.o
......
...@@ -202,7 +202,7 @@ bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state) ...@@ -202,7 +202,7 @@ bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state)
* Should measure whether using a lower cdclk w/o IPS * Should measure whether using a lower cdclk w/o IPS
*/ */
if (IS_BROADWELL(i915) && if (IS_BROADWELL(i915) &&
crtc_state->pixel_rate > i915->max_cdclk_freq * 95 / 100) crtc_state->pixel_rate > i915->display.cdclk.max_cdclk_freq * 95 / 100)
return false; return false;
return true; return true;
......
...@@ -125,7 +125,7 @@ static struct intel_fbc *i9xx_plane_fbc(struct drm_i915_private *dev_priv, ...@@ -125,7 +125,7 @@ static struct intel_fbc *i9xx_plane_fbc(struct drm_i915_private *dev_priv,
enum i9xx_plane_id i9xx_plane) enum i9xx_plane_id i9xx_plane)
{ {
if (i9xx_plane_has_fbc(dev_priv, i9xx_plane)) if (i9xx_plane_has_fbc(dev_priv, i9xx_plane))
return dev_priv->fbc[INTEL_FBC_A]; return dev_priv->display.fbc[INTEL_FBC_A];
else else
return NULL; return NULL;
} }
......
...@@ -1630,6 +1630,8 @@ static int gen11_dsi_dsc_compute_config(struct intel_encoder *encoder, ...@@ -1630,6 +1630,8 @@ static int gen11_dsi_dsc_compute_config(struct intel_encoder *encoder,
/* FIXME: initialize from VBT */ /* FIXME: initialize from VBT */
vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST; vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
vdsc_cfg->pic_height = crtc_state->hw.adjusted_mode.crtc_vdisplay;
ret = intel_dsc_compute_params(crtc_state); ret = intel_dsc_compute_params(crtc_state);
if (ret) if (ret)
return ret; return ret;
......
...@@ -62,9 +62,9 @@ int intel_digital_connector_atomic_get_property(struct drm_connector *connector, ...@@ -62,9 +62,9 @@ int intel_digital_connector_atomic_get_property(struct drm_connector *connector,
struct intel_digital_connector_state *intel_conn_state = struct intel_digital_connector_state *intel_conn_state =
to_intel_digital_connector_state(state); to_intel_digital_connector_state(state);
if (property == dev_priv->force_audio_property) if (property == dev_priv->display.properties.force_audio)
*val = intel_conn_state->force_audio; *val = intel_conn_state->force_audio;
else if (property == dev_priv->broadcast_rgb_property) else if (property == dev_priv->display.properties.broadcast_rgb)
*val = intel_conn_state->broadcast_rgb; *val = intel_conn_state->broadcast_rgb;
else { else {
drm_dbg_atomic(&dev_priv->drm, drm_dbg_atomic(&dev_priv->drm,
...@@ -95,12 +95,12 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector, ...@@ -95,12 +95,12 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector,
struct intel_digital_connector_state *intel_conn_state = struct intel_digital_connector_state *intel_conn_state =
to_intel_digital_connector_state(state); to_intel_digital_connector_state(state);
if (property == dev_priv->force_audio_property) { if (property == dev_priv->display.properties.force_audio) {
intel_conn_state->force_audio = val; intel_conn_state->force_audio = val;
return 0; return 0;
} }
if (property == dev_priv->broadcast_rgb_property) { if (property == dev_priv->display.properties.broadcast_rgb) {
intel_conn_state->broadcast_rgb = val; intel_conn_state->broadcast_rgb = val;
return 0; return 0;
} }
......
...@@ -42,9 +42,9 @@ ...@@ -42,9 +42,9 @@
#include "intel_display_types.h" #include "intel_display_types.h"
#include "intel_fb.h" #include "intel_fb.h"
#include "intel_fb_pin.h" #include "intel_fb_pin.h"
#include "intel_pm.h"
#include "intel_sprite.h" #include "intel_sprite.h"
#include "skl_scaler.h" #include "skl_scaler.h"
#include "skl_watermark.h"
static void intel_plane_state_reset(struct intel_plane_state *plane_state, static void intel_plane_state_reset(struct intel_plane_state *plane_state,
struct intel_plane *plane) struct intel_plane *plane)
......
...@@ -532,7 +532,7 @@ static unsigned int calc_hblank_early_prog(struct intel_encoder *encoder, ...@@ -532,7 +532,7 @@ static unsigned int calc_hblank_early_prog(struct intel_encoder *encoder,
h_total = crtc_state->hw.adjusted_mode.crtc_htotal; h_total = crtc_state->hw.adjusted_mode.crtc_htotal;
pixel_clk = crtc_state->hw.adjusted_mode.crtc_clock; pixel_clk = crtc_state->hw.adjusted_mode.crtc_clock;
vdsc_bpp = crtc_state->dsc.compressed_bpp; vdsc_bpp = crtc_state->dsc.compressed_bpp;
cdclk = i915->cdclk.hw.cdclk; cdclk = i915->display.cdclk.hw.cdclk;
/* fec= 0.972261, using rounding multiplier of 1000000 */ /* fec= 0.972261, using rounding multiplier of 1000000 */
fec_coeff = 972261; fec_coeff = 972261;
link_clk = crtc_state->port_clock; link_clk = crtc_state->port_clock;
...@@ -971,7 +971,7 @@ void intel_audio_cdclk_change_post(struct drm_i915_private *i915) ...@@ -971,7 +971,7 @@ void intel_audio_cdclk_change_post(struct drm_i915_private *i915)
struct aud_ts_cdclk_m_n aud_ts; struct aud_ts_cdclk_m_n aud_ts;
if (DISPLAY_VER(i915) >= 13) { if (DISPLAY_VER(i915) >= 13) {
get_aud_ts_cdclk_m_n(i915->cdclk.hw.ref, i915->cdclk.hw.cdclk, &aud_ts); get_aud_ts_cdclk_m_n(i915->display.cdclk.hw.ref, i915->display.cdclk.hw.cdclk, &aud_ts);
intel_de_write(i915, AUD_TS_CDCLK_N, aud_ts.n); intel_de_write(i915, AUD_TS_CDCLK_N, aud_ts.n);
intel_de_write(i915, AUD_TS_CDCLK_M, aud_ts.m | AUD_TS_CDCLK_M_EN); intel_de_write(i915, AUD_TS_CDCLK_M, aud_ts.m | AUD_TS_CDCLK_M_EN);
...@@ -1119,7 +1119,7 @@ static int i915_audio_component_get_cdclk_freq(struct device *kdev) ...@@ -1119,7 +1119,7 @@ static int i915_audio_component_get_cdclk_freq(struct device *kdev)
if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_DDI(dev_priv))) if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_DDI(dev_priv)))
return -ENODEV; return -ENODEV;
return dev_priv->cdclk.hw.cdclk; return dev_priv->display.cdclk.hw.cdclk;
} }
/* /*
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "intel_panel.h" #include "intel_panel.h"
#include "intel_pci_config.h" #include "intel_pci_config.h"
#include "intel_pps.h" #include "intel_pps.h"
#include "intel_quirks.h"
/** /**
* scale - scale values from one range to another * scale - scale values from one range to another
...@@ -88,7 +89,7 @@ u32 intel_backlight_invert_pwm_level(struct intel_connector *connector, u32 val) ...@@ -88,7 +89,7 @@ u32 intel_backlight_invert_pwm_level(struct intel_connector *connector, u32 val)
return val; return val;
if (dev_priv->params.invert_brightness > 0 || if (dev_priv->params.invert_brightness > 0 ||
dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) { intel_has_quirk(dev_priv, QUIRK_INVERT_BRIGHTNESS)) {
return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min; return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min;
} }
...@@ -128,7 +129,7 @@ u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 val) ...@@ -128,7 +129,7 @@ u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 val)
panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0); panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
if (dev_priv->params.invert_brightness > 0 || if (dev_priv->params.invert_brightness > 0 ||
(dev_priv->params.invert_brightness == 0 && dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS)) (dev_priv->params.invert_brightness == 0 && intel_has_quirk(dev_priv, QUIRK_INVERT_BRIGHTNESS)))
val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min); val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min);
return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max, return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max,
...@@ -305,7 +306,7 @@ void intel_backlight_set_acpi(const struct drm_connector_state *conn_state, ...@@ -305,7 +306,7 @@ void intel_backlight_set_acpi(const struct drm_connector_state *conn_state,
if (!panel->backlight.present || !conn_state->crtc) if (!panel->backlight.present || !conn_state->crtc)
return; return;
mutex_lock(&dev_priv->backlight_lock); mutex_lock(&dev_priv->display.backlight.lock);
drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
...@@ -321,7 +322,7 @@ void intel_backlight_set_acpi(const struct drm_connector_state *conn_state, ...@@ -321,7 +322,7 @@ void intel_backlight_set_acpi(const struct drm_connector_state *conn_state,
if (panel->backlight.enabled) if (panel->backlight.enabled)
intel_panel_actually_set_backlight(conn_state, hw_level); intel_panel_actually_set_backlight(conn_state, hw_level);
mutex_unlock(&dev_priv->backlight_lock); mutex_unlock(&dev_priv->display.backlight.lock);
} }
static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level) static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
...@@ -465,14 +466,14 @@ void intel_backlight_disable(const struct drm_connector_state *old_conn_state) ...@@ -465,14 +466,14 @@ void intel_backlight_disable(const struct drm_connector_state *old_conn_state)
return; return;
} }
mutex_lock(&dev_priv->backlight_lock); mutex_lock(&dev_priv->display.backlight.lock);
if (panel->backlight.device) if (panel->backlight.device)
panel->backlight.device->props.power = FB_BLANK_POWERDOWN; panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
panel->backlight.enabled = false; panel->backlight.enabled = false;
panel->backlight.funcs->disable(old_conn_state, 0); panel->backlight.funcs->disable(old_conn_state, 0);
mutex_unlock(&dev_priv->backlight_lock); mutex_unlock(&dev_priv->display.backlight.lock);
} }
static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state, static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
...@@ -815,11 +816,11 @@ void intel_backlight_enable(const struct intel_crtc_state *crtc_state, ...@@ -815,11 +816,11 @@ void intel_backlight_enable(const struct intel_crtc_state *crtc_state,
drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe)); drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe));
mutex_lock(&dev_priv->backlight_lock); mutex_lock(&dev_priv->display.backlight.lock);
__intel_backlight_enable(crtc_state, conn_state); __intel_backlight_enable(crtc_state, conn_state);
mutex_unlock(&dev_priv->backlight_lock); mutex_unlock(&dev_priv->display.backlight.lock);
} }
#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
...@@ -829,12 +830,12 @@ static u32 intel_panel_get_backlight(struct intel_connector *connector) ...@@ -829,12 +830,12 @@ static u32 intel_panel_get_backlight(struct intel_connector *connector)
struct intel_panel *panel = &connector->panel; struct intel_panel *panel = &connector->panel;
u32 val = 0; u32 val = 0;
mutex_lock(&dev_priv->backlight_lock); mutex_lock(&dev_priv->display.backlight.lock);
if (panel->backlight.enabled) if (panel->backlight.enabled)
val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector)); val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector));
mutex_unlock(&dev_priv->backlight_lock); mutex_unlock(&dev_priv->display.backlight.lock);
drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val); drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val);
return val; return val;
...@@ -862,7 +863,7 @@ static void intel_panel_set_backlight(const struct drm_connector_state *conn_sta ...@@ -862,7 +863,7 @@ static void intel_panel_set_backlight(const struct drm_connector_state *conn_sta
if (!panel->backlight.present) if (!panel->backlight.present)
return; return;
mutex_lock(&dev_priv->backlight_lock); mutex_lock(&dev_priv->display.backlight.lock);
drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0); drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
...@@ -872,7 +873,7 @@ static void intel_panel_set_backlight(const struct drm_connector_state *conn_sta ...@@ -872,7 +873,7 @@ static void intel_panel_set_backlight(const struct drm_connector_state *conn_sta
if (panel->backlight.enabled) if (panel->backlight.enabled)
intel_panel_actually_set_backlight(conn_state, hw_level); intel_panel_actually_set_backlight(conn_state, hw_level);
mutex_unlock(&dev_priv->backlight_lock); mutex_unlock(&dev_priv->display.backlight.lock);
} }
static int intel_backlight_device_update_status(struct backlight_device *bd) static int intel_backlight_device_update_status(struct backlight_device *bd)
...@@ -1113,7 +1114,7 @@ static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz) ...@@ -1113,7 +1114,7 @@ static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
if (IS_PINEVIEW(dev_priv)) if (IS_PINEVIEW(dev_priv))
clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
else else
clock = KHz(dev_priv->cdclk.hw.cdclk); clock = KHz(dev_priv->display.cdclk.hw.cdclk);
return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32); return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32);
} }
...@@ -1131,7 +1132,7 @@ static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz) ...@@ -1131,7 +1132,7 @@ static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
if (IS_G4X(dev_priv)) if (IS_G4X(dev_priv))
clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq); clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
else else
clock = KHz(dev_priv->cdclk.hw.cdclk); clock = KHz(dev_priv->display.cdclk.hw.cdclk);
return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128); return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128);
} }
...@@ -1591,11 +1592,11 @@ void intel_backlight_update(struct intel_atomic_state *state, ...@@ -1591,11 +1592,11 @@ void intel_backlight_update(struct intel_atomic_state *state,
if (!panel->backlight.present) if (!panel->backlight.present)
return; return;
mutex_lock(&dev_priv->backlight_lock); mutex_lock(&dev_priv->display.backlight.lock);
if (!panel->backlight.enabled) if (!panel->backlight.enabled)
__intel_backlight_enable(crtc_state, conn_state); __intel_backlight_enable(crtc_state, conn_state);
mutex_unlock(&dev_priv->backlight_lock); mutex_unlock(&dev_priv->display.backlight.lock);
} }
int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe) int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
...@@ -1605,7 +1606,7 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe) ...@@ -1605,7 +1606,7 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
int ret; int ret;
if (!connector->panel.vbt.backlight.present) { if (!connector->panel.vbt.backlight.present) {
if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) { if (intel_has_quirk(dev_priv, QUIRK_BACKLIGHT_PRESENT)) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"no backlight present per VBT, but present per quirk\n"); "no backlight present per VBT, but present per quirk\n");
} else { } else {
...@@ -1620,9 +1621,9 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe) ...@@ -1620,9 +1621,9 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
return -ENODEV; return -ENODEV;
/* set level and max in panel struct */ /* set level and max in panel struct */
mutex_lock(&dev_priv->backlight_lock); mutex_lock(&dev_priv->display.backlight.lock);
ret = panel->backlight.funcs->setup(connector, pipe); ret = panel->backlight.funcs->setup(connector, pipe);
mutex_unlock(&dev_priv->backlight_lock); mutex_unlock(&dev_priv->display.backlight.lock);
if (ret) { if (ret) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
...@@ -1777,7 +1778,7 @@ void intel_backlight_init_funcs(struct intel_panel *panel) ...@@ -1777,7 +1778,7 @@ void intel_backlight_init_funcs(struct intel_panel *panel)
if (intel_dp_aux_init_backlight_funcs(connector) == 0) if (intel_dp_aux_init_backlight_funcs(connector) == 0)
return; return;
if (!(dev_priv->quirks & QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK)) if (!intel_has_quirk(dev_priv, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK))
connector->panel.backlight.power = intel_pps_backlight_power; connector->panel.backlight.power = intel_pps_backlight_power;
} }
......
This diff is collapsed.
...@@ -258,6 +258,7 @@ bool intel_bios_get_dsc_params(struct intel_encoder *encoder, ...@@ -258,6 +258,7 @@ bool intel_bios_get_dsc_params(struct intel_encoder *encoder,
int intel_bios_max_tmds_clock(struct intel_encoder *encoder); int intel_bios_max_tmds_clock(struct intel_encoder *encoder);
int intel_bios_hdmi_level_shift(struct intel_encoder *encoder); int intel_bios_hdmi_level_shift(struct intel_encoder *encoder);
int intel_bios_dp_max_link_rate(struct intel_encoder *encoder); int intel_bios_dp_max_link_rate(struct intel_encoder *encoder);
int intel_bios_dp_max_lane_count(struct intel_encoder *encoder);
int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder); int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder);
bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915, enum port port); bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915, enum port port);
bool intel_bios_port_supports_tbt(struct drm_i915_private *i915, enum port port); bool intel_bios_port_supports_tbt(struct drm_i915_private *i915, enum port port);
......
...@@ -5,15 +5,17 @@ ...@@ -5,15 +5,17 @@
#include <drm/drm_atomic_state_helper.h> #include <drm/drm_atomic_state_helper.h>
#include "i915_drv.h"
#include "i915_reg.h" #include "i915_reg.h"
#include "i915_utils.h" #include "i915_utils.h"
#include "intel_atomic.h" #include "intel_atomic.h"
#include "intel_bw.h" #include "intel_bw.h"
#include "intel_cdclk.h" #include "intel_cdclk.h"
#include "intel_display_core.h"
#include "intel_display_types.h" #include "intel_display_types.h"
#include "skl_watermark.h"
#include "intel_mchbar_regs.h" #include "intel_mchbar_regs.h"
#include "intel_pcode.h" #include "intel_pcode.h"
#include "intel_pm.h"
/* Parameters for Qclk Geyserville (QGV) */ /* Parameters for Qclk Geyserville (QGV) */
struct intel_qgv_point { struct intel_qgv_point {
...@@ -137,6 +139,42 @@ int icl_pcode_restrict_qgv_points(struct drm_i915_private *dev_priv, ...@@ -137,6 +139,42 @@ int icl_pcode_restrict_qgv_points(struct drm_i915_private *dev_priv,
return 0; return 0;
} }
static int mtl_read_qgv_point_info(struct drm_i915_private *dev_priv,
struct intel_qgv_point *sp, int point)
{
u32 val, val2;
u16 dclk;
val = intel_uncore_read(&dev_priv->uncore,
MTL_MEM_SS_INFO_QGV_POINT_LOW(point));
val2 = intel_uncore_read(&dev_priv->uncore,
MTL_MEM_SS_INFO_QGV_POINT_HIGH(point));
dclk = REG_FIELD_GET(MTL_DCLK_MASK, val);
sp->dclk = DIV_ROUND_UP((16667 * dclk), 1000);
sp->t_rp = REG_FIELD_GET(MTL_TRP_MASK, val);
sp->t_rcd = REG_FIELD_GET(MTL_TRCD_MASK, val);
sp->t_rdpre = REG_FIELD_GET(MTL_TRDPRE_MASK, val2);
sp->t_ras = REG_FIELD_GET(MTL_TRAS_MASK, val2);
sp->t_rc = sp->t_rp + sp->t_ras;
return 0;
}
static int
intel_read_qgv_point_info(struct drm_i915_private *dev_priv,
struct intel_qgv_point *sp,
int point)
{
if (DISPLAY_VER(dev_priv) >= 14)
return mtl_read_qgv_point_info(dev_priv, sp, point);
else if (IS_DG1(dev_priv))
return dg1_mchbar_read_qgv_point_info(dev_priv, sp, point);
else
return icl_pcode_read_qgv_point_info(dev_priv, sp, point);
}
static int icl_get_qgv_points(struct drm_i915_private *dev_priv, static int icl_get_qgv_points(struct drm_i915_private *dev_priv,
struct intel_qgv_info *qi, struct intel_qgv_info *qi,
bool is_y_tile) bool is_y_tile)
...@@ -218,11 +256,7 @@ static int icl_get_qgv_points(struct drm_i915_private *dev_priv, ...@@ -218,11 +256,7 @@ static int icl_get_qgv_points(struct drm_i915_private *dev_priv,
for (i = 0; i < qi->num_points; i++) { for (i = 0; i < qi->num_points; i++) {
struct intel_qgv_point *sp = &qi->points[i]; struct intel_qgv_point *sp = &qi->points[i];
if (IS_DG1(dev_priv)) ret = intel_read_qgv_point_info(dev_priv, sp, i);
ret = dg1_mchbar_read_qgv_point_info(dev_priv, sp, i);
else
ret = icl_pcode_read_qgv_point_info(dev_priv, sp, i);
if (ret) if (ret)
return ret; return ret;
...@@ -324,7 +358,7 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -324,7 +358,7 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
int ipqdepth, ipqdepthpch = 16; int ipqdepth, ipqdepthpch = 16;
int dclk_max; int dclk_max;
int maxdebw; int maxdebw;
int num_groups = ARRAY_SIZE(dev_priv->max_bw); int num_groups = ARRAY_SIZE(dev_priv->display.bw.max);
int i, ret; int i, ret;
ret = icl_get_qgv_points(dev_priv, &qi, is_y_tile); ret = icl_get_qgv_points(dev_priv, &qi, is_y_tile);
...@@ -340,7 +374,7 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -340,7 +374,7 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
qi.deinterleave = DIV_ROUND_UP(num_channels, is_y_tile ? 4 : 2); qi.deinterleave = DIV_ROUND_UP(num_channels, is_y_tile ? 4 : 2);
for (i = 0; i < num_groups; i++) { for (i = 0; i < num_groups; i++) {
struct intel_bw_info *bi = &dev_priv->max_bw[i]; struct intel_bw_info *bi = &dev_priv->display.bw.max[i];
int clpchgroup; int clpchgroup;
int j; int j;
...@@ -395,7 +429,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -395,7 +429,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
int dclk_max; int dclk_max;
int maxdebw, peakbw; int maxdebw, peakbw;
int clperchgroup; int clperchgroup;
int num_groups = ARRAY_SIZE(dev_priv->max_bw); int num_groups = ARRAY_SIZE(dev_priv->display.bw.max);
int i, ret; int i, ret;
ret = icl_get_qgv_points(dev_priv, &qi, is_y_tile); ret = icl_get_qgv_points(dev_priv, &qi, is_y_tile);
...@@ -431,7 +465,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -431,7 +465,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
clperchgroup = 4 * DIV_ROUND_UP(8, num_channels) * qi.deinterleave; clperchgroup = 4 * DIV_ROUND_UP(8, num_channels) * qi.deinterleave;
for (i = 0; i < num_groups; i++) { for (i = 0; i < num_groups; i++) {
struct intel_bw_info *bi = &dev_priv->max_bw[i]; struct intel_bw_info *bi = &dev_priv->display.bw.max[i];
struct intel_bw_info *bi_next; struct intel_bw_info *bi_next;
int clpchgroup; int clpchgroup;
int j; int j;
...@@ -439,7 +473,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -439,7 +473,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
clpchgroup = (sa->deburst * qi.deinterleave / num_channels) << i; clpchgroup = (sa->deburst * qi.deinterleave / num_channels) << i;
if (i < num_groups - 1) { if (i < num_groups - 1) {
bi_next = &dev_priv->max_bw[i + 1]; bi_next = &dev_priv->display.bw.max[i + 1];
if (clpchgroup < clperchgroup) if (clpchgroup < clperchgroup)
bi_next->num_planes = (ipqdepth - clpchgroup) / bi_next->num_planes = (ipqdepth - clpchgroup) /
...@@ -500,7 +534,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -500,7 +534,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
static void dg2_get_bw_info(struct drm_i915_private *i915) static void dg2_get_bw_info(struct drm_i915_private *i915)
{ {
unsigned int deratedbw = IS_DG2_G11(i915) ? 38000 : 50000; unsigned int deratedbw = IS_DG2_G11(i915) ? 38000 : 50000;
int num_groups = ARRAY_SIZE(i915->max_bw); int num_groups = ARRAY_SIZE(i915->display.bw.max);
int i; int i;
/* /*
...@@ -511,7 +545,7 @@ static void dg2_get_bw_info(struct drm_i915_private *i915) ...@@ -511,7 +545,7 @@ static void dg2_get_bw_info(struct drm_i915_private *i915)
* whereas DG2-G11 platforms have 38 GB/s. * whereas DG2-G11 platforms have 38 GB/s.
*/ */
for (i = 0; i < num_groups; i++) { for (i = 0; i < num_groups; i++) {
struct intel_bw_info *bi = &i915->max_bw[i]; struct intel_bw_info *bi = &i915->display.bw.max[i];
bi->num_planes = 1; bi->num_planes = 1;
/* Need only one dummy QGV point per group */ /* Need only one dummy QGV point per group */
...@@ -532,9 +566,9 @@ static unsigned int icl_max_bw(struct drm_i915_private *dev_priv, ...@@ -532,9 +566,9 @@ static unsigned int icl_max_bw(struct drm_i915_private *dev_priv,
*/ */
num_planes = max(1, num_planes); num_planes = max(1, num_planes);
for (i = 0; i < ARRAY_SIZE(dev_priv->max_bw); i++) { for (i = 0; i < ARRAY_SIZE(dev_priv->display.bw.max); i++) {
const struct intel_bw_info *bi = const struct intel_bw_info *bi =
&dev_priv->max_bw[i]; &dev_priv->display.bw.max[i];
/* /*
* Pcode will not expose all QGV points when * Pcode will not expose all QGV points when
...@@ -560,9 +594,9 @@ static unsigned int tgl_max_bw(struct drm_i915_private *dev_priv, ...@@ -560,9 +594,9 @@ static unsigned int tgl_max_bw(struct drm_i915_private *dev_priv,
*/ */
num_planes = max(1, num_planes); num_planes = max(1, num_planes);
for (i = ARRAY_SIZE(dev_priv->max_bw) - 1; i >= 0; i--) { for (i = ARRAY_SIZE(dev_priv->display.bw.max) - 1; i >= 0; i--) {
const struct intel_bw_info *bi = const struct intel_bw_info *bi =
&dev_priv->max_bw[i]; &dev_priv->display.bw.max[i];
/* /*
* Pcode will not expose all QGV points when * Pcode will not expose all QGV points when
...@@ -575,14 +609,14 @@ static unsigned int tgl_max_bw(struct drm_i915_private *dev_priv, ...@@ -575,14 +609,14 @@ static unsigned int tgl_max_bw(struct drm_i915_private *dev_priv,
return bi->deratedbw[qgv_point]; return bi->deratedbw[qgv_point];
} }
return dev_priv->max_bw[0].deratedbw[qgv_point]; return dev_priv->display.bw.max[0].deratedbw[qgv_point];
} }
static unsigned int adl_psf_bw(struct drm_i915_private *dev_priv, static unsigned int adl_psf_bw(struct drm_i915_private *dev_priv,
int psf_gv_point) int psf_gv_point)
{ {
const struct intel_bw_info *bi = const struct intel_bw_info *bi =
&dev_priv->max_bw[0]; &dev_priv->display.bw.max[0];
return bi->psf_bw[psf_gv_point]; return bi->psf_bw[psf_gv_point];
} }
...@@ -703,7 +737,7 @@ intel_atomic_get_old_bw_state(struct intel_atomic_state *state) ...@@ -703,7 +737,7 @@ intel_atomic_get_old_bw_state(struct intel_atomic_state *state)
struct drm_i915_private *dev_priv = to_i915(state->base.dev); struct drm_i915_private *dev_priv = to_i915(state->base.dev);
struct intel_global_state *bw_state; struct intel_global_state *bw_state;
bw_state = intel_atomic_get_old_global_obj_state(state, &dev_priv->bw_obj); bw_state = intel_atomic_get_old_global_obj_state(state, &dev_priv->display.bw.obj);
return to_intel_bw_state(bw_state); return to_intel_bw_state(bw_state);
} }
...@@ -714,7 +748,7 @@ intel_atomic_get_new_bw_state(struct intel_atomic_state *state) ...@@ -714,7 +748,7 @@ intel_atomic_get_new_bw_state(struct intel_atomic_state *state)
struct drm_i915_private *dev_priv = to_i915(state->base.dev); struct drm_i915_private *dev_priv = to_i915(state->base.dev);
struct intel_global_state *bw_state; struct intel_global_state *bw_state;
bw_state = intel_atomic_get_new_global_obj_state(state, &dev_priv->bw_obj); bw_state = intel_atomic_get_new_global_obj_state(state, &dev_priv->display.bw.obj);
return to_intel_bw_state(bw_state); return to_intel_bw_state(bw_state);
} }
...@@ -725,7 +759,7 @@ intel_atomic_get_bw_state(struct intel_atomic_state *state) ...@@ -725,7 +759,7 @@ intel_atomic_get_bw_state(struct intel_atomic_state *state)
struct drm_i915_private *dev_priv = to_i915(state->base.dev); struct drm_i915_private *dev_priv = to_i915(state->base.dev);
struct intel_global_state *bw_state; struct intel_global_state *bw_state;
bw_state = intel_atomic_get_global_obj_state(state, &dev_priv->bw_obj); bw_state = intel_atomic_get_global_obj_state(state, &dev_priv->display.bw.obj);
if (IS_ERR(bw_state)) if (IS_ERR(bw_state))
return ERR_CAST(bw_state); return ERR_CAST(bw_state);
...@@ -932,8 +966,8 @@ int intel_bw_calc_min_cdclk(struct intel_atomic_state *state, ...@@ -932,8 +966,8 @@ int intel_bw_calc_min_cdclk(struct intel_atomic_state *state,
static u16 icl_qgv_points_mask(struct drm_i915_private *i915) static u16 icl_qgv_points_mask(struct drm_i915_private *i915)
{ {
unsigned int num_psf_gv_points = i915->max_bw[0].num_psf_gv_points; unsigned int num_psf_gv_points = i915->display.bw.max[0].num_psf_gv_points;
unsigned int num_qgv_points = i915->max_bw[0].num_qgv_points; unsigned int num_qgv_points = i915->display.bw.max[0].num_qgv_points;
u16 qgv_points = 0, psf_points = 0; u16 qgv_points = 0, psf_points = 0;
/* /*
...@@ -1006,8 +1040,8 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) ...@@ -1006,8 +1040,8 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
int i, ret; int i, ret;
u16 qgv_points = 0, psf_points = 0; u16 qgv_points = 0, psf_points = 0;
unsigned int max_bw_point = 0, max_bw = 0; unsigned int max_bw_point = 0, max_bw = 0;
unsigned int num_qgv_points = dev_priv->max_bw[0].num_qgv_points; unsigned int num_qgv_points = dev_priv->display.bw.max[0].num_qgv_points;
unsigned int num_psf_gv_points = dev_priv->max_bw[0].num_psf_gv_points; unsigned int num_psf_gv_points = dev_priv->display.bw.max[0].num_psf_gv_points;
bool changed = false; bool changed = false;
/* FIXME earlier gens need some checks too */ /* FIXME earlier gens need some checks too */
...@@ -1162,7 +1196,7 @@ int intel_bw_init(struct drm_i915_private *dev_priv) ...@@ -1162,7 +1196,7 @@ int intel_bw_init(struct drm_i915_private *dev_priv)
if (!state) if (!state)
return -ENOMEM; return -ENOMEM;
intel_atomic_global_obj_init(dev_priv, &dev_priv->bw_obj, intel_atomic_global_obj_init(dev_priv, &dev_priv->display.bw.obj,
&state->base, &intel_bw_funcs); &state->base, &intel_bw_funcs);
return 0; return 0;
......
This diff is collapsed.
...@@ -77,9 +77,9 @@ intel_atomic_get_cdclk_state(struct intel_atomic_state *state); ...@@ -77,9 +77,9 @@ intel_atomic_get_cdclk_state(struct intel_atomic_state *state);
#define to_intel_cdclk_state(x) container_of((x), struct intel_cdclk_state, base) #define to_intel_cdclk_state(x) container_of((x), struct intel_cdclk_state, base)
#define intel_atomic_get_old_cdclk_state(state) \ #define intel_atomic_get_old_cdclk_state(state) \
to_intel_cdclk_state(intel_atomic_get_old_global_obj_state(state, &to_i915(state->base.dev)->cdclk.obj)) to_intel_cdclk_state(intel_atomic_get_old_global_obj_state(state, &to_i915(state->base.dev)->display.cdclk.obj))
#define intel_atomic_get_new_cdclk_state(state) \ #define intel_atomic_get_new_cdclk_state(state) \
to_intel_cdclk_state(intel_atomic_get_new_global_obj_state(state, &to_i915(state->base.dev)->cdclk.obj)) to_intel_cdclk_state(intel_atomic_get_new_global_obj_state(state, &to_i915(state->base.dev)->display.cdclk.obj))
int intel_cdclk_init(struct drm_i915_private *dev_priv); int intel_cdclk_init(struct drm_i915_private *dev_priv);
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "intel_de.h" #include "intel_de.h"
#include "intel_display_types.h" #include "intel_display_types.h"
#include "intel_dpll.h" #include "intel_dpll.h"
#include "intel_dsb.h"
#include "vlv_dsi_pll.h" #include "vlv_dsi_pll.h"
struct intel_color_funcs { struct intel_color_funcs {
......
...@@ -229,7 +229,7 @@ intel_attach_force_audio_property(struct drm_connector *connector) ...@@ -229,7 +229,7 @@ intel_attach_force_audio_property(struct drm_connector *connector)
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct drm_property *prop; struct drm_property *prop;
prop = dev_priv->force_audio_property; prop = dev_priv->display.properties.force_audio;
if (prop == NULL) { if (prop == NULL) {
prop = drm_property_create_enum(dev, 0, prop = drm_property_create_enum(dev, 0,
"audio", "audio",
...@@ -238,7 +238,7 @@ intel_attach_force_audio_property(struct drm_connector *connector) ...@@ -238,7 +238,7 @@ intel_attach_force_audio_property(struct drm_connector *connector)
if (prop == NULL) if (prop == NULL)
return; return;
dev_priv->force_audio_property = prop; dev_priv->display.properties.force_audio = prop;
} }
drm_object_attach_property(&connector->base, prop, 0); drm_object_attach_property(&connector->base, prop, 0);
} }
...@@ -256,7 +256,7 @@ intel_attach_broadcast_rgb_property(struct drm_connector *connector) ...@@ -256,7 +256,7 @@ intel_attach_broadcast_rgb_property(struct drm_connector *connector)
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct drm_property *prop; struct drm_property *prop;
prop = dev_priv->broadcast_rgb_property; prop = dev_priv->display.properties.broadcast_rgb;
if (prop == NULL) { if (prop == NULL) {
prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM,
"Broadcast RGB", "Broadcast RGB",
...@@ -265,7 +265,7 @@ intel_attach_broadcast_rgb_property(struct drm_connector *connector) ...@@ -265,7 +265,7 @@ intel_attach_broadcast_rgb_property(struct drm_connector *connector)
if (prop == NULL) if (prop == NULL)
return; return;
dev_priv->broadcast_rgb_property = prop; dev_priv->display.properties.broadcast_rgb = prop;
} }
drm_object_attach_property(&connector->base, prop, 0); drm_object_attach_property(&connector->base, prop, 0);
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include "intel_gmbus.h" #include "intel_gmbus.h"
#include "intel_hotplug.h" #include "intel_hotplug.h"
#include "intel_pch_display.h" #include "intel_pch_display.h"
#include "intel_pch_refclk.h"
/* Here's the desired hotplug mode */ /* Here's the desired hotplug mode */
#define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 | \ #define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 | \
...@@ -444,6 +445,8 @@ static int hsw_crt_compute_config(struct intel_encoder *encoder, ...@@ -444,6 +445,8 @@ static int hsw_crt_compute_config(struct intel_encoder *encoder,
/* FDI must always be 2.7 GHz */ /* FDI must always be 2.7 GHz */
pipe_config->port_clock = 135000 * 2; pipe_config->port_clock = 135000 * 2;
adjusted_mode->crtc_clock = lpt_iclkip(pipe_config);
return 0; return 0;
} }
...@@ -643,9 +646,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) ...@@ -643,9 +646,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
struct i2c_adapter *i2c; struct i2c_adapter *i2c;
bool ret = false; bool ret = false;
BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG); i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->display.vbt.crt_ddc_pin);
i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->vbt.crt_ddc_pin);
edid = intel_crt_get_edid(connector, i2c); edid = intel_crt_get_edid(connector, i2c);
if (edid) { if (edid) {
...@@ -931,7 +932,7 @@ static int intel_crt_get_modes(struct drm_connector *connector) ...@@ -931,7 +932,7 @@ static int intel_crt_get_modes(struct drm_connector *connector)
wakeref = intel_display_power_get(dev_priv, wakeref = intel_display_power_get(dev_priv,
intel_encoder->power_domain); intel_encoder->power_domain);
i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->vbt.crt_ddc_pin); i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->display.vbt.crt_ddc_pin);
ret = intel_crt_ddc_get_modes(connector, i2c); ret = intel_crt_ddc_get_modes(connector, i2c);
if (ret || !IS_G4X(dev_priv)) if (ret || !IS_G4X(dev_priv))
goto out; goto out;
...@@ -1110,8 +1111,8 @@ void intel_crt_init(struct drm_i915_private *dev_priv) ...@@ -1110,8 +1111,8 @@ void intel_crt_init(struct drm_i915_private *dev_priv)
u32 fdi_config = FDI_RX_POLARITY_REVERSED_LPT | u32 fdi_config = FDI_RX_POLARITY_REVERSED_LPT |
FDI_RX_LINK_REVERSAL_OVERRIDE; FDI_RX_LINK_REVERSAL_OVERRIDE;
dev_priv->fdi_rx_config = intel_de_read(dev_priv, dev_priv->display.fdi.rx_config = intel_de_read(dev_priv,
FDI_RX_CTL(PIPE_A)) & fdi_config; FDI_RX_CTL(PIPE_A)) & fdi_config;
} }
intel_crt_reset(&crt->base.base); intel_crt_reset(&crt->base.base);
......
...@@ -19,9 +19,9 @@ ...@@ -19,9 +19,9 @@
#include "intel_fb.h" #include "intel_fb.h"
#include "intel_fb_pin.h" #include "intel_fb_pin.h"
#include "intel_frontbuffer.h" #include "intel_frontbuffer.h"
#include "intel_pm.h"
#include "intel_psr.h" #include "intel_psr.h"
#include "intel_sprite.h" #include "intel_sprite.h"
#include "skl_watermark.h"
/* Cursor formats */ /* Cursor formats */
static const u32 intel_cursor_formats[] = { static const u32 intel_cursor_formats[] = {
......
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include "intel_lspcon.h" #include "intel_lspcon.h"
#include "intel_pps.h" #include "intel_pps.h"
#include "intel_psr.h" #include "intel_psr.h"
#include "intel_quirks.h"
#include "intel_snps_phy.h" #include "intel_snps_phy.h"
#include "intel_sprite.h" #include "intel_sprite.h"
#include "intel_tc.h" #include "intel_tc.h"
...@@ -323,28 +324,6 @@ static int icl_calc_tbt_pll_link(struct drm_i915_private *dev_priv, ...@@ -323,28 +324,6 @@ static int icl_calc_tbt_pll_link(struct drm_i915_private *dev_priv,
} }
} }
int intel_crtc_dotclock(const struct intel_crtc_state *pipe_config)
{
int dotclock;
if (intel_crtc_has_dp_encoder(pipe_config))
dotclock = intel_dotclock_calculate(pipe_config->port_clock,
&pipe_config->dp_m_n);
else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp > 24)
dotclock = pipe_config->port_clock * 24 / pipe_config->pipe_bpp;
else
dotclock = pipe_config->port_clock;
if (pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 &&
!intel_crtc_has_dp_encoder(pipe_config))
dotclock *= 2;
if (pipe_config->pixel_multiplier)
dotclock /= pipe_config->pixel_multiplier;
return dotclock;
}
static void ddi_dotclock_get(struct intel_crtc_state *pipe_config) static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
{ {
/* CRT dotclock is determined via other means */ /* CRT dotclock is determined via other means */
...@@ -631,7 +610,7 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state ...@@ -631,7 +610,7 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state
intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder), ctl); intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder), ctl);
if (dev_priv->quirks & QUIRK_INCREASE_DDI_DISABLED_TIME && if (intel_has_quirk(dev_priv, QUIRK_INCREASE_DDI_DISABLED_TIME) &&
intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) { intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"Quirk Increase DDI disabled time\n"); "Quirk Increase DDI disabled time\n");
......
...@@ -547,7 +547,7 @@ u8 intel_calc_active_pipes(struct intel_atomic_state *state, ...@@ -547,7 +547,7 @@ u8 intel_calc_active_pipes(struct intel_atomic_state *state,
void intel_link_compute_m_n(u16 bpp, int nlanes, void intel_link_compute_m_n(u16 bpp, int nlanes,
int pixel_clock, int link_clock, int pixel_clock, int link_clock,
struct intel_link_m_n *m_n, struct intel_link_m_n *m_n,
bool constant_n, bool fec_enable); bool fec_enable);
u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv, u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv,
u32 pixel_format, u64 modifier); u32 pixel_format, u64 modifier);
enum drm_mode_status enum drm_mode_status
......
...@@ -6,22 +6,35 @@ ...@@ -6,22 +6,35 @@
#ifndef __INTEL_DISPLAY_CORE_H__ #ifndef __INTEL_DISPLAY_CORE_H__
#define __INTEL_DISPLAY_CORE_H__ #define __INTEL_DISPLAY_CORE_H__
#include <linux/list.h>
#include <linux/llist.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <drm/drm_connector.h>
#include "intel_cdclk.h"
#include "intel_display.h" #include "intel_display.h"
#include "intel_display_power.h"
#include "intel_dmc.h" #include "intel_dmc.h"
#include "intel_dpll_mgr.h" #include "intel_dpll_mgr.h"
#include "intel_fbc.h"
#include "intel_global_state.h"
#include "intel_gmbus.h" #include "intel_gmbus.h"
#include "intel_opregion.h"
#include "intel_pm_types.h" #include "intel_pm_types.h"
struct drm_i915_private; struct drm_i915_private;
struct drm_property;
struct i915_audio_component; struct i915_audio_component;
struct i915_hdcp_comp_master;
struct intel_atomic_state; struct intel_atomic_state;
struct intel_audio_funcs; struct intel_audio_funcs;
struct intel_bios_encoder_data;
struct intel_cdclk_funcs; struct intel_cdclk_funcs;
struct intel_cdclk_vals;
struct intel_color_funcs; struct intel_color_funcs;
struct intel_crtc; struct intel_crtc;
struct intel_crtc_state; struct intel_crtc_state;
...@@ -33,6 +46,12 @@ struct intel_hotplug_funcs; ...@@ -33,6 +46,12 @@ struct intel_hotplug_funcs;
struct intel_initial_plane_config; struct intel_initial_plane_config;
struct intel_overlay; struct intel_overlay;
/* Amount of SAGV/QGV points, BSpec precisely defines this */
#define I915_NUM_QGV_POINTS 8
/* Amount of PSF GV points, BSpec precisely defines this */
#define I915_NUM_PSF_GV_POINTS 3
struct intel_display_funcs { struct intel_display_funcs {
/* /*
* Returns the active state of the crtc, and if the crtc is active, * Returns the active state of the crtc, and if the crtc is active,
...@@ -103,6 +122,17 @@ struct intel_dpll { ...@@ -103,6 +122,17 @@ struct intel_dpll {
} ref_clks; } ref_clks;
}; };
struct intel_frontbuffer_tracking {
spinlock_t lock;
/*
* Tracking bits for delayed frontbuffer flushing du to gpu activity or
* scheduled flips.
*/
unsigned busy_bits;
unsigned flip_bits;
};
struct intel_hotplug { struct intel_hotplug {
struct delayed_work hotplug_work; struct delayed_work hotplug_work;
...@@ -142,6 +172,39 @@ struct intel_hotplug { ...@@ -142,6 +172,39 @@ struct intel_hotplug {
struct workqueue_struct *dp_wq; struct workqueue_struct *dp_wq;
}; };
struct intel_vbt_data {
/* bdb version */
u16 version;
/* Feature bits */
unsigned int int_tv_support:1;
unsigned int int_crt_support:1;
unsigned int lvds_use_ssc:1;
unsigned int int_lvds_support:1;
unsigned int display_clock_mode:1;
unsigned int fdi_rx_polarity_inverted:1;
int lvds_ssc_freq;
enum drm_panel_orientation orientation;
bool override_afc_startup;
u8 override_afc_startup_val;
int crt_ddc_pin;
struct list_head display_devices;
struct list_head bdb_blocks;
struct intel_bios_encoder_data *ports[I915_MAX_PORTS]; /* Non-NULL if port present. */
struct sdvo_device_mapping {
u8 initialized;
u8 dvo_port;
u8 slave_addr;
u8 dvo_wiring;
u8 i2c_pin;
u8 ddc_pin;
} sdvo_mappings[2];
};
struct intel_wm { struct intel_wm {
/* /*
* Raw watermark latency values: * Raw watermark latency values:
...@@ -176,6 +239,8 @@ struct intel_wm { ...@@ -176,6 +239,8 @@ struct intel_wm {
* crtc_state->wm.need_postvbl_update. * crtc_state->wm.need_postvbl_update.
*/ */
struct mutex wm_mutex; struct mutex wm_mutex;
bool ipc_enabled;
}; };
struct intel_display { struct intel_display {
...@@ -207,12 +272,65 @@ struct intel_display { ...@@ -207,12 +272,65 @@ struct intel_display {
} funcs; } funcs;
/* Grouping using anonymous structs. Keep sorted. */ /* Grouping using anonymous structs. Keep sorted. */
struct intel_atomic_helper {
struct llist_head free_list;
struct work_struct free_work;
} atomic_helper;
struct {
/* backlight registers and fields in struct intel_panel */
struct mutex lock;
} backlight;
struct {
struct intel_global_obj obj;
struct intel_bw_info {
/* for each QGV point */
unsigned int deratedbw[I915_NUM_QGV_POINTS];
/* for each PSF GV point */
unsigned int psf_bw[I915_NUM_PSF_GV_POINTS];
u8 num_qgv_points;
u8 num_psf_gv_points;
u8 num_planes;
} max[6];
} bw;
struct {
/* The current hardware cdclk configuration */
struct intel_cdclk_config hw;
/* cdclk, divider, and ratio table from bspec */
const struct intel_cdclk_vals *table;
struct intel_global_obj obj;
unsigned int max_cdclk_freq;
} cdclk;
struct {
/* The current hardware dbuf configuration */
u8 enabled_slices;
struct intel_global_obj obj;
} dbuf;
struct {
/* VLV/CHV/BXT/GLK DSI MMIO register base address */
u32 mmio_base;
} dsi;
struct { struct {
/* list of fbdev register on this device */ /* list of fbdev register on this device */
struct intel_fbdev *fbdev; struct intel_fbdev *fbdev;
struct work_struct suspend_work; struct work_struct suspend_work;
} fbdev; } fbdev;
struct {
unsigned int pll_freq;
u32 rx_config;
} fdi;
struct { struct {
/* /*
* Base address of where the gmbus and gpio blocks are located * Base address of where the gmbus and gpio blocks are located
...@@ -231,6 +349,24 @@ struct intel_display { ...@@ -231,6 +349,24 @@ struct intel_display {
wait_queue_head_t wait_queue; wait_queue_head_t wait_queue;
} gmbus; } gmbus;
struct {
struct i915_hdcp_comp_master *master;
bool comp_added;
/* Mutex to protect the above hdcp component related values. */
struct mutex comp_mutex;
} hdcp;
struct {
struct i915_power_domains domains;
/* Shadow for DISPLAY_PHY_CONTROL which can't be safely read */
u32 chv_phy_control;
/* perform PHY state sanity checks? */
bool chv_phy_assert[2];
} power;
struct { struct {
u32 mmio_base; u32 mmio_base;
...@@ -238,6 +374,15 @@ struct intel_display { ...@@ -238,6 +374,15 @@ struct intel_display {
struct mutex mutex; struct mutex mutex;
} pps; } pps;
struct {
struct drm_property *broadcast_rgb;
struct drm_property *force_audio;
} properties;
struct {
unsigned long mask;
} quirks;
struct { struct {
enum { enum {
I915_SAGV_UNKNOWN = 0, I915_SAGV_UNKNOWN = 0,
...@@ -249,12 +394,24 @@ struct intel_display { ...@@ -249,12 +394,24 @@ struct intel_display {
u32 block_time_us; u32 block_time_us;
} sagv; } sagv;
struct {
/* ordered wq for modesets */
struct workqueue_struct *modeset;
/* unbound hipri wq for page flips/plane updates */
struct workqueue_struct *flip;
} wq;
/* Grouping using named structs. Keep sorted. */ /* Grouping using named structs. Keep sorted. */
struct intel_audio audio; struct intel_audio audio;
struct intel_dmc dmc; struct intel_dmc dmc;
struct intel_dpll dpll; struct intel_dpll dpll;
struct intel_fbc *fbc[I915_MAX_FBCS];
struct intel_frontbuffer_tracking fb_tracking;
struct intel_hotplug hotplug; struct intel_hotplug hotplug;
struct intel_opregion opregion;
struct intel_overlay *overlay; struct intel_overlay *overlay;
struct intel_vbt_data vbt;
struct intel_wm wm; struct intel_wm wm;
}; };
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "intel_pm.h" #include "intel_pm.h"
#include "intel_psr.h" #include "intel_psr.h"
#include "intel_sprite.h" #include "intel_sprite.h"
#include "skl_watermark.h"
static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node) static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node)
{ {
...@@ -37,10 +38,10 @@ static int i915_frontbuffer_tracking(struct seq_file *m, void *unused) ...@@ -37,10 +38,10 @@ static int i915_frontbuffer_tracking(struct seq_file *m, void *unused)
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
seq_printf(m, "FB tracking busy bits: 0x%08x\n", seq_printf(m, "FB tracking busy bits: 0x%08x\n",
dev_priv->fb_tracking.busy_bits); dev_priv->display.fb_tracking.busy_bits);
seq_printf(m, "FB tracking flip bits: 0x%08x\n", seq_printf(m, "FB tracking flip bits: 0x%08x\n",
dev_priv->fb_tracking.flip_bits); dev_priv->display.fb_tracking.flip_bits);
return 0; return 0;
} }
...@@ -103,7 +104,8 @@ static int i915_sr_status(struct seq_file *m, void *unused) ...@@ -103,7 +104,8 @@ static int i915_sr_status(struct seq_file *m, void *unused)
static int i915_opregion(struct seq_file *m, void *unused) static int i915_opregion(struct seq_file *m, void *unused)
{ {
struct intel_opregion *opregion = &node_to_i915(m->private)->opregion; struct drm_i915_private *i915 = node_to_i915(m->private);
struct intel_opregion *opregion = &i915->display.opregion;
if (opregion->header) if (opregion->header)
seq_write(m, opregion->header, OPREGION_SIZE); seq_write(m, opregion->header, OPREGION_SIZE);
...@@ -113,7 +115,8 @@ static int i915_opregion(struct seq_file *m, void *unused) ...@@ -113,7 +115,8 @@ static int i915_opregion(struct seq_file *m, void *unused)
static int i915_vbt(struct seq_file *m, void *unused) static int i915_vbt(struct seq_file *m, void *unused)
{ {
struct intel_opregion *opregion = &node_to_i915(m->private)->opregion; struct drm_i915_private *i915 = node_to_i915(m->private);
struct intel_opregion *opregion = &i915->display.opregion;
if (opregion->vbt) if (opregion->vbt)
seq_write(m, opregion->vbt, opregion->vbt_size); seq_write(m, opregion->vbt, opregion->vbt_size);
...@@ -980,58 +983,6 @@ static int i915_shared_dplls_info(struct seq_file *m, void *unused) ...@@ -980,58 +983,6 @@ static int i915_shared_dplls_info(struct seq_file *m, void *unused)
return 0; return 0;
} }
static int i915_ipc_status_show(struct seq_file *m, void *data)
{
struct drm_i915_private *dev_priv = m->private;
seq_printf(m, "Isochronous Priority Control: %s\n",
str_yes_no(dev_priv->ipc_enabled));
return 0;
}
static int i915_ipc_status_open(struct inode *inode, struct file *file)
{
struct drm_i915_private *dev_priv = inode->i_private;
if (!HAS_IPC(dev_priv))
return -ENODEV;
return single_open(file, i915_ipc_status_show, dev_priv);
}
static ssize_t i915_ipc_status_write(struct file *file, const char __user *ubuf,
size_t len, loff_t *offp)
{
struct seq_file *m = file->private_data;
struct drm_i915_private *dev_priv = m->private;
intel_wakeref_t wakeref;
bool enable;
int ret;
ret = kstrtobool_from_user(ubuf, len, &enable);
if (ret < 0)
return ret;
with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
if (!dev_priv->ipc_enabled && enable)
drm_info(&dev_priv->drm,
"Enabling IPC: WM will be proper only after next commit\n");
dev_priv->ipc_enabled = enable;
intel_enable_ipc(dev_priv);
}
return len;
}
static const struct file_operations i915_ipc_status_fops = {
.owner = THIS_MODULE,
.open = i915_ipc_status_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
.write = i915_ipc_status_write
};
static int i915_ddb_info(struct seq_file *m, void *unused) static int i915_ddb_info(struct seq_file *m, void *unused)
{ {
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
...@@ -1908,7 +1859,6 @@ static const struct { ...@@ -1908,7 +1859,6 @@ static const struct {
{"i915_dp_test_active", &i915_displayport_test_active_fops}, {"i915_dp_test_active", &i915_displayport_test_active_fops},
{"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops}, {"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops},
{"i915_hpd_short_storm_ctl", &i915_hpd_short_storm_ctl_fops}, {"i915_hpd_short_storm_ctl", &i915_hpd_short_storm_ctl_fops},
{"i915_ipc_status", &i915_ipc_status_fops},
{"i915_drrs_ctl", &i915_drrs_ctl_fops}, {"i915_drrs_ctl", &i915_drrs_ctl_fops},
{"i915_edp_psr_debug", &i915_edp_psr_debug_fops}, {"i915_edp_psr_debug", &i915_edp_psr_debug_fops},
}; };
...@@ -1932,6 +1882,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915) ...@@ -1932,6 +1882,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915)
intel_dmc_debugfs_register(i915); intel_dmc_debugfs_register(i915);
intel_fbc_debugfs_register(i915); intel_fbc_debugfs_register(i915);
skl_watermark_ipc_debugfs_register(i915);
} }
static int i915_panel_show(struct seq_file *m, void *data) static int i915_panel_show(struct seq_file *m, void *data)
...@@ -2138,7 +2089,7 @@ static const struct file_operations i915_dsc_fec_support_fops = { ...@@ -2138,7 +2089,7 @@ static const struct file_operations i915_dsc_fec_support_fops = {
.write = i915_dsc_fec_support_write .write = i915_dsc_fec_support_write
}; };
static int i915_dsc_bpp_show(struct seq_file *m, void *data) static int i915_dsc_bpc_show(struct seq_file *m, void *data)
{ {
struct drm_connector *connector = m->private; struct drm_connector *connector = m->private;
struct drm_device *dev = connector->dev; struct drm_device *dev = connector->dev;
...@@ -2161,14 +2112,14 @@ static int i915_dsc_bpp_show(struct seq_file *m, void *data) ...@@ -2161,14 +2112,14 @@ static int i915_dsc_bpp_show(struct seq_file *m, void *data)
} }
crtc_state = to_intel_crtc_state(crtc->state); crtc_state = to_intel_crtc_state(crtc->state);
seq_printf(m, "Compressed_BPP: %d\n", crtc_state->dsc.compressed_bpp); seq_printf(m, "Input_BPC: %d\n", crtc_state->dsc.config.bits_per_component);
out: drm_modeset_unlock(&dev->mode_config.connection_mutex); out: drm_modeset_unlock(&dev->mode_config.connection_mutex);
return ret; return ret;
} }
static ssize_t i915_dsc_bpp_write(struct file *file, static ssize_t i915_dsc_bpc_write(struct file *file,
const char __user *ubuf, const char __user *ubuf,
size_t len, loff_t *offp) size_t len, loff_t *offp)
{ {
...@@ -2176,33 +2127,32 @@ static ssize_t i915_dsc_bpp_write(struct file *file, ...@@ -2176,33 +2127,32 @@ static ssize_t i915_dsc_bpp_write(struct file *file,
((struct seq_file *)file->private_data)->private; ((struct seq_file *)file->private_data)->private;
struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector)); struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
struct intel_dp *intel_dp = enc_to_intel_dp(encoder); struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
int dsc_bpp = 0; int dsc_bpc = 0;
int ret; int ret;
ret = kstrtoint_from_user(ubuf, len, 0, &dsc_bpp); ret = kstrtoint_from_user(ubuf, len, 0, &dsc_bpc);
if (ret < 0) if (ret < 0)
return ret; return ret;
intel_dp->force_dsc_bpp = dsc_bpp; intel_dp->force_dsc_bpc = dsc_bpc;
*offp += len; *offp += len;
return len; return len;
} }
static int i915_dsc_bpp_open(struct inode *inode, static int i915_dsc_bpc_open(struct inode *inode,
struct file *file) struct file *file)
{ {
return single_open(file, i915_dsc_bpp_show, return single_open(file, i915_dsc_bpc_show, inode->i_private);
inode->i_private);
} }
static const struct file_operations i915_dsc_bpp_fops = { static const struct file_operations i915_dsc_bpc_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = i915_dsc_bpp_open, .open = i915_dsc_bpc_open,
.read = seq_read, .read = seq_read,
.llseek = seq_lseek, .llseek = seq_lseek,
.release = single_release, .release = single_release,
.write = i915_dsc_bpp_write .write = i915_dsc_bpc_write
}; };
/* /*
...@@ -2272,8 +2222,8 @@ void intel_connector_debugfs_add(struct intel_connector *intel_connector) ...@@ -2272,8 +2222,8 @@ void intel_connector_debugfs_add(struct intel_connector *intel_connector)
debugfs_create_file("i915_dsc_fec_support", 0644, root, debugfs_create_file("i915_dsc_fec_support", 0644, root,
connector, &i915_dsc_fec_support_fops); connector, &i915_dsc_fec_support_fops);
debugfs_create_file("i915_dsc_bpp", 0644, root, debugfs_create_file("i915_dsc_bpc", 0644, root,
connector, &i915_dsc_bpp_fops); connector, &i915_dsc_bpc_fops);
} }
if (connector->connector_type == DRM_MODE_CONNECTOR_DSI || if (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
......
...@@ -1350,6 +1350,117 @@ static const struct i915_power_well_desc_list xelpd_power_wells[] = { ...@@ -1350,6 +1350,117 @@ static const struct i915_power_well_desc_list xelpd_power_wells[] = {
I915_PW_DESCRIPTORS(xelpd_power_wells_main), I915_PW_DESCRIPTORS(xelpd_power_wells_main),
}; };
/*
* MTL is based on XELPD power domains with the exception of power gating for:
* - DDI_IO (moved to PLL logic)
* - AUX and AUX_IO functionality and register access for USBC1-4 (PICA always-on)
*/
#define XELPDP_PW_2_POWER_DOMAINS \
XELPD_PW_B_POWER_DOMAINS, \
XELPD_PW_C_POWER_DOMAINS, \
XELPD_PW_D_POWER_DOMAINS, \
POWER_DOMAIN_AUDIO_PLAYBACK, \
POWER_DOMAIN_VGA, \
POWER_DOMAIN_PORT_DDI_LANES_TC1, \
POWER_DOMAIN_PORT_DDI_LANES_TC2, \
POWER_DOMAIN_PORT_DDI_LANES_TC3, \
POWER_DOMAIN_PORT_DDI_LANES_TC4
I915_DECL_PW_DOMAINS(xelpdp_pwdoms_pw_2,
XELPDP_PW_2_POWER_DOMAINS,
POWER_DOMAIN_INIT);
I915_DECL_PW_DOMAINS(xelpdp_pwdoms_dc_off,
XELPDP_PW_2_POWER_DOMAINS,
POWER_DOMAIN_AUDIO_MMIO,
POWER_DOMAIN_MODESET,
POWER_DOMAIN_AUX_A,
POWER_DOMAIN_AUX_B,
POWER_DOMAIN_INIT);
I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc1,
POWER_DOMAIN_AUX_USBC1,
POWER_DOMAIN_AUX_TBT1);
I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc2,
POWER_DOMAIN_AUX_USBC2,
POWER_DOMAIN_AUX_TBT2);
I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc3,
POWER_DOMAIN_AUX_USBC3,
POWER_DOMAIN_AUX_TBT3);
I915_DECL_PW_DOMAINS(xelpdp_pwdoms_aux_tc4,
POWER_DOMAIN_AUX_USBC4,
POWER_DOMAIN_AUX_TBT4);
static const struct i915_power_well_desc xelpdp_power_wells_main[] = {
{
.instances = &I915_PW_INSTANCES(
I915_PW("DC_off", &xelpdp_pwdoms_dc_off,
.id = SKL_DISP_DC_OFF),
),
.ops = &gen9_dc_off_power_well_ops,
}, {
.instances = &I915_PW_INSTANCES(
I915_PW("PW_2", &xelpdp_pwdoms_pw_2,
.hsw.idx = ICL_PW_CTL_IDX_PW_2,
.id = SKL_DISP_PW_2),
),
.ops = &hsw_power_well_ops,
.has_vga = true,
.has_fuses = true,
}, {
.instances = &I915_PW_INSTANCES(
I915_PW("PW_A", &xelpd_pwdoms_pw_a,
.hsw.idx = XELPD_PW_CTL_IDX_PW_A),
),
.ops = &hsw_power_well_ops,
.irq_pipe_mask = BIT(PIPE_A),
.has_fuses = true,
}, {
.instances = &I915_PW_INSTANCES(
I915_PW("PW_B", &xelpd_pwdoms_pw_b,
.hsw.idx = XELPD_PW_CTL_IDX_PW_B),
),
.ops = &hsw_power_well_ops,
.irq_pipe_mask = BIT(PIPE_B),
.has_fuses = true,
}, {
.instances = &I915_PW_INSTANCES(
I915_PW("PW_C", &xelpd_pwdoms_pw_c,
.hsw.idx = XELPD_PW_CTL_IDX_PW_C),
),
.ops = &hsw_power_well_ops,
.irq_pipe_mask = BIT(PIPE_C),
.has_fuses = true,
}, {
.instances = &I915_PW_INSTANCES(
I915_PW("PW_D", &xelpd_pwdoms_pw_d,
.hsw.idx = XELPD_PW_CTL_IDX_PW_D),
),
.ops = &hsw_power_well_ops,
.irq_pipe_mask = BIT(PIPE_D),
.has_fuses = true,
}, {
.instances = &I915_PW_INSTANCES(
I915_PW("AUX_A", &icl_pwdoms_aux_a, .xelpdp.aux_ch = AUX_CH_A),
I915_PW("AUX_B", &icl_pwdoms_aux_b, .xelpdp.aux_ch = AUX_CH_B),
I915_PW("AUX_TC1", &xelpdp_pwdoms_aux_tc1, .xelpdp.aux_ch = AUX_CH_USBC1),
I915_PW("AUX_TC2", &xelpdp_pwdoms_aux_tc2, .xelpdp.aux_ch = AUX_CH_USBC2),
I915_PW("AUX_TC3", &xelpdp_pwdoms_aux_tc3, .xelpdp.aux_ch = AUX_CH_USBC3),
I915_PW("AUX_TC4", &xelpdp_pwdoms_aux_tc4, .xelpdp.aux_ch = AUX_CH_USBC4),
),
.ops = &xelpdp_aux_power_well_ops,
},
};
static const struct i915_power_well_desc_list xelpdp_power_wells[] = {
I915_PW_DESCRIPTORS(i9xx_power_wells_always_on),
I915_PW_DESCRIPTORS(icl_power_wells_pw_1),
I915_PW_DESCRIPTORS(xelpdp_power_wells_main),
};
static void init_power_well_domains(const struct i915_power_well_instance *inst, static void init_power_well_domains(const struct i915_power_well_instance *inst,
struct i915_power_well *power_well) struct i915_power_well *power_well)
{ {
...@@ -1388,7 +1499,7 @@ __set_power_wells(struct i915_power_domains *power_domains, ...@@ -1388,7 +1499,7 @@ __set_power_wells(struct i915_power_domains *power_domains,
{ {
struct drm_i915_private *i915 = container_of(power_domains, struct drm_i915_private *i915 = container_of(power_domains,
struct drm_i915_private, struct drm_i915_private,
power_domains); display.power.domains);
u64 power_well_ids = 0; u64 power_well_ids = 0;
const struct i915_power_well_desc_list *desc_list; const struct i915_power_well_desc_list *desc_list;
const struct i915_power_well_desc *desc; const struct i915_power_well_desc *desc;
...@@ -1447,7 +1558,7 @@ int intel_display_power_map_init(struct i915_power_domains *power_domains) ...@@ -1447,7 +1558,7 @@ int intel_display_power_map_init(struct i915_power_domains *power_domains)
{ {
struct drm_i915_private *i915 = container_of(power_domains, struct drm_i915_private *i915 = container_of(power_domains,
struct drm_i915_private, struct drm_i915_private,
power_domains); display.power.domains);
/* /*
* The enabling order will be from lower to higher indexed wells, * The enabling order will be from lower to higher indexed wells,
* the disabling order is reversed. * the disabling order is reversed.
...@@ -1457,7 +1568,9 @@ int intel_display_power_map_init(struct i915_power_domains *power_domains) ...@@ -1457,7 +1568,9 @@ int intel_display_power_map_init(struct i915_power_domains *power_domains)
return 0; return 0;
} }
if (DISPLAY_VER(i915) >= 13) if (DISPLAY_VER(i915) >= 14)
return set_power_wells(power_domains, xelpdp_power_wells);
else if (DISPLAY_VER(i915) >= 13)
return set_power_wells(power_domains, xelpd_power_wells); return set_power_wells(power_domains, xelpd_power_wells);
else if (IS_DG1(i915)) else if (IS_DG1(i915))
return set_power_wells(power_domains, dg1_power_wells); return set_power_wells(power_domains, dg1_power_wells);
......
...@@ -14,15 +14,15 @@ struct drm_i915_private; ...@@ -14,15 +14,15 @@ struct drm_i915_private;
struct i915_power_well; struct i915_power_well;
#define for_each_power_well(__dev_priv, __power_well) \ #define for_each_power_well(__dev_priv, __power_well) \
for ((__power_well) = (__dev_priv)->power_domains.power_wells; \ for ((__power_well) = (__dev_priv)->display.power.domains.power_wells; \
(__power_well) - (__dev_priv)->power_domains.power_wells < \ (__power_well) - (__dev_priv)->display.power.domains.power_wells < \
(__dev_priv)->power_domains.power_well_count; \ (__dev_priv)->display.power.domains.power_well_count; \
(__power_well)++) (__power_well)++)
#define for_each_power_well_reverse(__dev_priv, __power_well) \ #define for_each_power_well_reverse(__dev_priv, __power_well) \
for ((__power_well) = (__dev_priv)->power_domains.power_wells + \ for ((__power_well) = (__dev_priv)->display.power.domains.power_wells + \
(__dev_priv)->power_domains.power_well_count - 1; \ (__dev_priv)->display.power.domains.power_well_count - 1; \
(__power_well) - (__dev_priv)->power_domains.power_wells >= 0; \ (__power_well) - (__dev_priv)->display.power.domains.power_wells >= 0; \
(__power_well)--) (__power_well)--)
/* /*
...@@ -80,6 +80,9 @@ struct i915_power_well_instance { ...@@ -80,6 +80,9 @@ struct i915_power_well_instance {
*/ */
u8 idx; u8 idx;
} hsw; } hsw;
struct {
u8 aux_ch;
} xelpdp;
}; };
}; };
...@@ -169,5 +172,6 @@ extern const struct i915_power_well_ops vlv_dpio_power_well_ops; ...@@ -169,5 +172,6 @@ extern const struct i915_power_well_ops vlv_dpio_power_well_ops;
extern const struct i915_power_well_ops icl_aux_power_well_ops; extern const struct i915_power_well_ops icl_aux_power_well_ops;
extern const struct i915_power_well_ops icl_ddi_power_well_ops; extern const struct i915_power_well_ops icl_ddi_power_well_ops;
extern const struct i915_power_well_ops tgl_tc_cold_off_ops; extern const struct i915_power_well_ops tgl_tc_cold_off_ops;
extern const struct i915_power_well_ops xelpdp_aux_power_well_ops;
#endif #endif
...@@ -1130,6 +1130,7 @@ struct intel_crtc_state { ...@@ -1130,6 +1130,7 @@ struct intel_crtc_state {
/* m2_n2 for eDP downclock */ /* m2_n2 for eDP downclock */
struct intel_link_m_n dp_m2_n2; struct intel_link_m_n dp_m2_n2;
bool has_drrs; bool has_drrs;
bool seamless_m_n;
/* PSR is supported but might not be enabled due the lack of enabled planes */ /* PSR is supported but might not be enabled due the lack of enabled planes */
bool has_psr; bool has_psr;
...@@ -1712,7 +1713,7 @@ struct intel_dp { ...@@ -1712,7 +1713,7 @@ struct intel_dp {
/* Display stream compression testing */ /* Display stream compression testing */
bool force_dsc_en; bool force_dsc_en;
int force_dsc_bpp; int force_dsc_bpc;
bool hobl_failed; bool hobl_failed;
bool hobl_active; bool hobl_active;
......
This diff is collapsed.
...@@ -86,7 +86,7 @@ static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index) ...@@ -86,7 +86,7 @@ static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
* divide by 2000 and use that * divide by 2000 and use that
*/ */
if (dig_port->aux_ch == AUX_CH_A) if (dig_port->aux_ch == AUX_CH_A)
freq = dev_priv->cdclk.hw.cdclk; freq = dev_priv->display.cdclk.hw.cdclk;
else else
freq = RUNTIME_INFO(dev_priv)->rawclk_freq; freq = RUNTIME_INFO(dev_priv)->rawclk_freq;
return DIV_ROUND_CLOSEST(freq, 2000); return DIV_ROUND_CLOSEST(freq, 2000);
...@@ -150,6 +150,7 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp, ...@@ -150,6 +150,7 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp,
u32 unused) u32 unused)
{ {
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
u32 ret; u32 ret;
/* /*
...@@ -170,6 +171,13 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp, ...@@ -170,6 +171,13 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp,
if (intel_tc_port_in_tbt_alt_mode(dig_port)) if (intel_tc_port_in_tbt_alt_mode(dig_port))
ret |= DP_AUX_CH_CTL_TBT_IO; ret |= DP_AUX_CH_CTL_TBT_IO;
/*
* Power request bit is already set during aux power well enable.
* Preserve the bit across aux transactions.
*/
if (DISPLAY_VER(i915) >= 14)
ret |= XELPDP_DP_AUX_CH_CTL_POWER_REQUEST;
return ret; return ret;
} }
...@@ -629,6 +637,46 @@ static i915_reg_t tgl_aux_data_reg(struct intel_dp *intel_dp, int index) ...@@ -629,6 +637,46 @@ static i915_reg_t tgl_aux_data_reg(struct intel_dp *intel_dp, int index)
} }
} }
static i915_reg_t xelpdp_aux_ctl_reg(struct intel_dp *intel_dp)
{
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
enum aux_ch aux_ch = dig_port->aux_ch;
switch (aux_ch) {
case AUX_CH_A:
case AUX_CH_B:
case AUX_CH_USBC1:
case AUX_CH_USBC2:
case AUX_CH_USBC3:
case AUX_CH_USBC4:
return XELPDP_DP_AUX_CH_CTL(aux_ch);
default:
MISSING_CASE(aux_ch);
return XELPDP_DP_AUX_CH_CTL(AUX_CH_A);
}
}
static i915_reg_t xelpdp_aux_data_reg(struct intel_dp *intel_dp, int index)
{
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
enum aux_ch aux_ch = dig_port->aux_ch;
switch (aux_ch) {
case AUX_CH_A:
case AUX_CH_B:
case AUX_CH_USBC1:
case AUX_CH_USBC2:
case AUX_CH_USBC3:
case AUX_CH_USBC4:
return XELPDP_DP_AUX_CH_DATA(aux_ch, index);
default:
MISSING_CASE(aux_ch);
return XELPDP_DP_AUX_CH_DATA(AUX_CH_A, index);
}
}
void intel_dp_aux_fini(struct intel_dp *intel_dp) void intel_dp_aux_fini(struct intel_dp *intel_dp)
{ {
if (cpu_latency_qos_request_active(&intel_dp->pm_qos)) if (cpu_latency_qos_request_active(&intel_dp->pm_qos))
...@@ -644,7 +692,10 @@ void intel_dp_aux_init(struct intel_dp *intel_dp) ...@@ -644,7 +692,10 @@ void intel_dp_aux_init(struct intel_dp *intel_dp)
struct intel_encoder *encoder = &dig_port->base; struct intel_encoder *encoder = &dig_port->base;
enum aux_ch aux_ch = dig_port->aux_ch; enum aux_ch aux_ch = dig_port->aux_ch;
if (DISPLAY_VER(dev_priv) >= 12) { if (DISPLAY_VER(dev_priv) >= 14) {
intel_dp->aux_ch_ctl_reg = xelpdp_aux_ctl_reg;
intel_dp->aux_ch_data_reg = xelpdp_aux_data_reg;
} else if (DISPLAY_VER(dev_priv) >= 12) {
intel_dp->aux_ch_ctl_reg = tgl_aux_ctl_reg; intel_dp->aux_ch_ctl_reg = tgl_aux_ctl_reg;
intel_dp->aux_ch_data_reg = tgl_aux_data_reg; intel_dp->aux_ch_data_reg = tgl_aux_data_reg;
} else if (DISPLAY_VER(dev_priv) >= 9) { } else if (DISPLAY_VER(dev_priv) >= 9) {
......
...@@ -58,7 +58,6 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder, ...@@ -58,7 +58,6 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
struct drm_i915_private *i915 = to_i915(connector->base.dev); struct drm_i915_private *i915 = to_i915(connector->base.dev);
const struct drm_display_mode *adjusted_mode = const struct drm_display_mode *adjusted_mode =
&crtc_state->hw.adjusted_mode; &crtc_state->hw.adjusted_mode;
bool constant_n = drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_CONSTANT_N);
int bpp, slots = -EINVAL; int bpp, slots = -EINVAL;
mst_state = drm_atomic_get_mst_topology_state(state, &intel_dp->mst_mgr); mst_state = drm_atomic_get_mst_topology_state(state, &intel_dp->mst_mgr);
...@@ -100,7 +99,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder, ...@@ -100,7 +99,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
adjusted_mode->crtc_clock, adjusted_mode->crtc_clock,
crtc_state->port_clock, crtc_state->port_clock,
&crtc_state->dp_m_n, &crtc_state->dp_m_n,
constant_n, crtc_state->fec_enable); crtc_state->fec_enable);
crtc_state->dp_m_n.tu = slots; crtc_state->dp_m_n.tu = slots;
return 0; return 0;
...@@ -566,7 +565,10 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state, ...@@ -566,7 +565,10 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
drm_dp_add_payload_part2(&intel_dp->mst_mgr, &state->base, drm_dp_add_payload_part2(&intel_dp->mst_mgr, &state->base,
drm_atomic_get_mst_payload_state(mst_state, connector->port)); drm_atomic_get_mst_payload_state(mst_state, connector->port));
if (DISPLAY_VER(dev_priv) >= 12 && pipe_config->fec_enable) if (DISPLAY_VER(dev_priv) >= 14 && pipe_config->fec_enable)
intel_de_rmw(dev_priv, MTL_CHICKEN_TRANS(trans), 0,
FECSTALL_DIS_DPTSTREAM_DPTTG);
else if (DISPLAY_VER(dev_priv) >= 12 && pipe_config->fec_enable)
intel_de_rmw(dev_priv, CHICKEN_TRANS(trans), 0, intel_de_rmw(dev_priv, CHICKEN_TRANS(trans), 0,
FECSTALL_DIS_DPTSTREAM_DPTTG); FECSTALL_DIS_DPTSTREAM_DPTTG);
......
...@@ -484,7 +484,7 @@ void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy) ...@@ -484,7 +484,7 @@ void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
enum dpio_phy rcomp_phy = phy_info->rcomp_phy; enum dpio_phy rcomp_phy = phy_info->rcomp_phy;
bool was_enabled; bool was_enabled;
lockdep_assert_held(&dev_priv->power_domains.lock); lockdep_assert_held(&dev_priv->display.power.domains.lock);
was_enabled = true; was_enabled = true;
if (rcomp_phy != -1) if (rcomp_phy != -1)
......
...@@ -938,12 +938,25 @@ static int hsw_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -938,12 +938,25 @@ static int hsw_crtc_compute_clock(struct intel_atomic_state *state,
intel_atomic_get_new_crtc_state(state, crtc); intel_atomic_get_new_crtc_state(state, crtc);
struct intel_encoder *encoder = struct intel_encoder *encoder =
intel_get_crtc_new_encoder(state, crtc_state); intel_get_crtc_new_encoder(state, crtc_state);
int ret;
if (DISPLAY_VER(dev_priv) < 11 && if (DISPLAY_VER(dev_priv) < 11 &&
intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI)) intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
return 0; return 0;
return intel_compute_shared_dplls(state, crtc, encoder); ret = intel_compute_shared_dplls(state, crtc, encoder);
if (ret)
return ret;
/* FIXME this is a mess */
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
return 0;
/* CRT dotclock is determined via other means */
if (!crtc_state->has_pch_encoder)
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return 0;
} }
static int hsw_crtc_get_shared_dpll(struct intel_atomic_state *state, static int hsw_crtc_get_shared_dpll(struct intel_atomic_state *state,
...@@ -969,8 +982,15 @@ static int dg2_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -969,8 +982,15 @@ static int dg2_crtc_compute_clock(struct intel_atomic_state *state,
intel_atomic_get_new_crtc_state(state, crtc); intel_atomic_get_new_crtc_state(state, crtc);
struct intel_encoder *encoder = struct intel_encoder *encoder =
intel_get_crtc_new_encoder(state, crtc_state); intel_get_crtc_new_encoder(state, crtc_state);
int ret;
ret = intel_mpllb_calc_state(crtc_state, encoder);
if (ret)
return ret;
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return intel_mpllb_calc_state(crtc_state, encoder); return 0;
} }
static bool ilk_needs_fb_cb_tune(const struct dpll *dpll, int factor) static bool ilk_needs_fb_cb_tune(const struct dpll *dpll, int factor)
...@@ -991,7 +1011,7 @@ static void ilk_update_pll_dividers(struct intel_crtc_state *crtc_state, ...@@ -991,7 +1011,7 @@ static void ilk_update_pll_dividers(struct intel_crtc_state *crtc_state,
factor = 21; factor = 21;
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) { if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
if ((intel_panel_use_ssc(dev_priv) && if ((intel_panel_use_ssc(dev_priv) &&
dev_priv->vbt.lvds_ssc_freq == 100000) || dev_priv->display.vbt.lvds_ssc_freq == 100000) ||
(HAS_PCH_IBX(dev_priv) && (HAS_PCH_IBX(dev_priv) &&
intel_is_dual_link_lvds(dev_priv))) intel_is_dual_link_lvds(dev_priv)))
factor = 25; factor = 25;
...@@ -1096,6 +1116,7 @@ static int ilk_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1096,6 +1116,7 @@ static int ilk_crtc_compute_clock(struct intel_atomic_state *state,
intel_atomic_get_new_crtc_state(state, crtc); intel_atomic_get_new_crtc_state(state, crtc);
const struct intel_limit *limit; const struct intel_limit *limit;
int refclk = 120000; int refclk = 120000;
int ret;
/* CPU eDP is the only output that doesn't need a PCH PLL of its own. */ /* CPU eDP is the only output that doesn't need a PCH PLL of its own. */
if (!crtc_state->has_pch_encoder) if (!crtc_state->has_pch_encoder)
...@@ -1105,8 +1126,8 @@ static int ilk_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1105,8 +1126,8 @@ static int ilk_crtc_compute_clock(struct intel_atomic_state *state,
if (intel_panel_use_ssc(dev_priv)) { if (intel_panel_use_ssc(dev_priv)) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"using SSC reference clock of %d kHz\n", "using SSC reference clock of %d kHz\n",
dev_priv->vbt.lvds_ssc_freq); dev_priv->display.vbt.lvds_ssc_freq);
refclk = dev_priv->vbt.lvds_ssc_freq; refclk = dev_priv->display.vbt.lvds_ssc_freq;
} }
if (intel_is_dual_link_lvds(dev_priv)) { if (intel_is_dual_link_lvds(dev_priv)) {
...@@ -1132,7 +1153,14 @@ static int ilk_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1132,7 +1153,14 @@ static int ilk_crtc_compute_clock(struct intel_atomic_state *state,
ilk_compute_dpll(crtc_state, &crtc_state->dpll, ilk_compute_dpll(crtc_state, &crtc_state->dpll,
&crtc_state->dpll); &crtc_state->dpll);
return intel_compute_shared_dplls(state, crtc, NULL); ret = intel_compute_shared_dplls(state, crtc, NULL);
if (ret)
return ret;
crtc_state->port_clock = crtc_state->dpll.dot;
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return ret;
} }
static int ilk_crtc_get_shared_dpll(struct intel_atomic_state *state, static int ilk_crtc_get_shared_dpll(struct intel_atomic_state *state,
...@@ -1198,6 +1226,13 @@ static int chv_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1198,6 +1226,13 @@ static int chv_crtc_compute_clock(struct intel_atomic_state *state,
chv_compute_dpll(crtc_state); chv_compute_dpll(crtc_state);
/* FIXME this is a mess */
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
return 0;
crtc_state->port_clock = crtc_state->dpll.dot;
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return 0; return 0;
} }
...@@ -1217,6 +1252,13 @@ static int vlv_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1217,6 +1252,13 @@ static int vlv_crtc_compute_clock(struct intel_atomic_state *state,
vlv_compute_dpll(crtc_state); vlv_compute_dpll(crtc_state);
/* FIXME this is a mess */
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
return 0;
crtc_state->port_clock = crtc_state->dpll.dot;
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return 0; return 0;
} }
...@@ -1231,7 +1273,7 @@ static int g4x_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1231,7 +1273,7 @@ static int g4x_crtc_compute_clock(struct intel_atomic_state *state,
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) { if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
if (intel_panel_use_ssc(dev_priv)) { if (intel_panel_use_ssc(dev_priv)) {
refclk = dev_priv->vbt.lvds_ssc_freq; refclk = dev_priv->display.vbt.lvds_ssc_freq;
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"using SSC reference clock of %d kHz\n", "using SSC reference clock of %d kHz\n",
refclk); refclk);
...@@ -1259,6 +1301,11 @@ static int g4x_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1259,6 +1301,11 @@ static int g4x_crtc_compute_clock(struct intel_atomic_state *state,
i9xx_compute_dpll(crtc_state, &crtc_state->dpll, i9xx_compute_dpll(crtc_state, &crtc_state->dpll,
&crtc_state->dpll); &crtc_state->dpll);
crtc_state->port_clock = crtc_state->dpll.dot;
/* FIXME this is a mess */
if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_TVOUT))
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return 0; return 0;
} }
...@@ -1273,7 +1320,7 @@ static int pnv_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1273,7 +1320,7 @@ static int pnv_crtc_compute_clock(struct intel_atomic_state *state,
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) { if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
if (intel_panel_use_ssc(dev_priv)) { if (intel_panel_use_ssc(dev_priv)) {
refclk = dev_priv->vbt.lvds_ssc_freq; refclk = dev_priv->display.vbt.lvds_ssc_freq;
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"using SSC reference clock of %d kHz\n", "using SSC reference clock of %d kHz\n",
refclk); refclk);
...@@ -1292,6 +1339,9 @@ static int pnv_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1292,6 +1339,9 @@ static int pnv_crtc_compute_clock(struct intel_atomic_state *state,
i9xx_compute_dpll(crtc_state, &crtc_state->dpll, i9xx_compute_dpll(crtc_state, &crtc_state->dpll,
&crtc_state->dpll); &crtc_state->dpll);
crtc_state->port_clock = crtc_state->dpll.dot;
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return 0; return 0;
} }
...@@ -1306,7 +1356,7 @@ static int i9xx_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1306,7 +1356,7 @@ static int i9xx_crtc_compute_clock(struct intel_atomic_state *state,
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) { if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
if (intel_panel_use_ssc(dev_priv)) { if (intel_panel_use_ssc(dev_priv)) {
refclk = dev_priv->vbt.lvds_ssc_freq; refclk = dev_priv->display.vbt.lvds_ssc_freq;
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"using SSC reference clock of %d kHz\n", "using SSC reference clock of %d kHz\n",
refclk); refclk);
...@@ -1325,6 +1375,11 @@ static int i9xx_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1325,6 +1375,11 @@ static int i9xx_crtc_compute_clock(struct intel_atomic_state *state,
i9xx_compute_dpll(crtc_state, &crtc_state->dpll, i9xx_compute_dpll(crtc_state, &crtc_state->dpll,
&crtc_state->dpll); &crtc_state->dpll);
crtc_state->port_clock = crtc_state->dpll.dot;
/* FIXME this is a mess */
if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_TVOUT))
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return 0; return 0;
} }
...@@ -1339,7 +1394,7 @@ static int i8xx_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1339,7 +1394,7 @@ static int i8xx_crtc_compute_clock(struct intel_atomic_state *state,
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) { if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
if (intel_panel_use_ssc(dev_priv)) { if (intel_panel_use_ssc(dev_priv)) {
refclk = dev_priv->vbt.lvds_ssc_freq; refclk = dev_priv->display.vbt.lvds_ssc_freq;
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"using SSC reference clock of %d kHz\n", "using SSC reference clock of %d kHz\n",
refclk); refclk);
...@@ -1360,6 +1415,9 @@ static int i8xx_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1360,6 +1415,9 @@ static int i8xx_crtc_compute_clock(struct intel_atomic_state *state,
i8xx_compute_dpll(crtc_state, &crtc_state->dpll, i8xx_compute_dpll(crtc_state, &crtc_state->dpll,
&crtc_state->dpll); &crtc_state->dpll);
crtc_state->port_clock = crtc_state->dpll.dot;
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
return 0; return 0;
} }
...@@ -1411,9 +1469,6 @@ int intel_dpll_crtc_compute_clock(struct intel_atomic_state *state, ...@@ -1411,9 +1469,6 @@ int intel_dpll_crtc_compute_clock(struct intel_atomic_state *state,
drm_WARN_ON(&i915->drm, !intel_crtc_needs_modeset(crtc_state)); drm_WARN_ON(&i915->drm, !intel_crtc_needs_modeset(crtc_state));
if (drm_WARN_ON(&i915->drm, crtc_state->shared_dpll))
return 0;
memset(&crtc_state->dpll_hw_state, 0, memset(&crtc_state->dpll_hw_state, 0,
sizeof(crtc_state->dpll_hw_state)); sizeof(crtc_state->dpll_hw_state));
...@@ -1439,11 +1494,9 @@ int intel_dpll_crtc_get_shared_dpll(struct intel_atomic_state *state, ...@@ -1439,11 +1494,9 @@ int intel_dpll_crtc_get_shared_dpll(struct intel_atomic_state *state,
int ret; int ret;
drm_WARN_ON(&i915->drm, !intel_crtc_needs_modeset(crtc_state)); drm_WARN_ON(&i915->drm, !intel_crtc_needs_modeset(crtc_state));
drm_WARN_ON(&i915->drm, !crtc_state->hw.enable && crtc_state->shared_dpll);
if (drm_WARN_ON(&i915->drm, crtc_state->shared_dpll)) if (!crtc_state->hw.enable || crtc_state->shared_dpll)
return 0;
if (!crtc_state->hw.enable)
return 0; return 0;
if (!i915->display.funcs.dpll->crtc_get_shared_dpll) if (!i915->display.funcs.dpll->crtc_get_shared_dpll)
......
...@@ -9,6 +9,36 @@ ...@@ -9,6 +9,36 @@
#include "i915_drv.h" #include "i915_drv.h"
#include "intel_de.h" #include "intel_de.h"
#include "intel_display_types.h" #include "intel_display_types.h"
#include "intel_dsb.h"
struct i915_vma;
enum dsb_id {
INVALID_DSB = -1,
DSB1,
DSB2,
DSB3,
MAX_DSB_PER_PIPE
};
struct intel_dsb {
enum dsb_id id;
u32 *cmd_buf;
struct i915_vma *vma;
/*
* free_pos will point the first free entry position
* and help in calculating tail of command buffer.
*/
int free_pos;
/*
* ins_start_offset will help to store start address of the dsb
* instuction and help in identifying the batch of auto-increment
* register.
*/
u32 ins_start_offset;
};
#define DSB_BUF_SIZE (2 * PAGE_SIZE) #define DSB_BUF_SIZE (2 * PAGE_SIZE)
......
...@@ -11,34 +11,6 @@ ...@@ -11,34 +11,6 @@
#include "i915_reg_defs.h" #include "i915_reg_defs.h"
struct intel_crtc_state; struct intel_crtc_state;
struct i915_vma;
enum dsb_id {
INVALID_DSB = -1,
DSB1,
DSB2,
DSB3,
MAX_DSB_PER_PIPE
};
struct intel_dsb {
enum dsb_id id;
u32 *cmd_buf;
struct i915_vma *vma;
/*
* free_pos will point the first free entry position
* and help in calculating tail of command buffer.
*/
int free_pos;
/*
* ins_start_offset will help to store start address of the dsb
* instuction and help in identifying the batch of auto-increment
* register.
*/
u32 ins_start_offset;
};
void intel_dsb_prepare(struct intel_crtc_state *crtc_state); void intel_dsb_prepare(struct intel_crtc_state *crtc_state);
void intel_dsb_cleanup(struct intel_crtc_state *crtc_state); void intel_dsb_cleanup(struct intel_crtc_state *crtc_state);
......
...@@ -106,7 +106,7 @@ intel_dsi_get_panel_orientation(struct intel_connector *connector) ...@@ -106,7 +106,7 @@ intel_dsi_get_panel_orientation(struct intel_connector *connector)
if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
return orientation; return orientation;
orientation = dev_priv->vbt.orientation; orientation = dev_priv->display.vbt.orientation;
if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
return orientation; return orientation;
......
...@@ -75,8 +75,8 @@ struct intel_dvo_dev_ops { ...@@ -75,8 +75,8 @@ struct intel_dvo_dev_ops {
* *
* \return MODE_OK if the mode is valid, or another MODE_* otherwise. * \return MODE_OK if the mode is valid, or another MODE_* otherwise.
*/ */
int (*mode_valid)(struct intel_dvo_device *dvo, enum drm_mode_status (*mode_valid)(struct intel_dvo_device *dvo,
struct drm_display_mode *mode); struct drm_display_mode *mode);
/* /*
* Callback for preparing mode changes on an output * Callback for preparing mode changes on an output
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
#define for_each_intel_fbc(__dev_priv, __fbc, __fbc_id) \ #define for_each_intel_fbc(__dev_priv, __fbc, __fbc_id) \
for_each_fbc_id((__dev_priv), (__fbc_id)) \ for_each_fbc_id((__dev_priv), (__fbc_id)) \
for_each_if((__fbc) = (__dev_priv)->fbc[(__fbc_id)]) for_each_if((__fbc) = (__dev_priv)->display.fbc[(__fbc_id)])
struct intel_fbc_funcs { struct intel_fbc_funcs {
void (*activate)(struct intel_fbc *fbc); void (*activate)(struct intel_fbc *fbc);
...@@ -1720,7 +1720,7 @@ void intel_fbc_init(struct drm_i915_private *i915) ...@@ -1720,7 +1720,7 @@ void intel_fbc_init(struct drm_i915_private *i915)
i915->params.enable_fbc); i915->params.enable_fbc);
for_each_fbc_id(i915, fbc_id) for_each_fbc_id(i915, fbc_id)
i915->fbc[fbc_id] = intel_fbc_create(i915, fbc_id); i915->display.fbc[fbc_id] = intel_fbc_create(i915, fbc_id);
} }
/** /**
...@@ -1840,7 +1840,7 @@ void intel_fbc_debugfs_register(struct drm_i915_private *i915) ...@@ -1840,7 +1840,7 @@ void intel_fbc_debugfs_register(struct drm_i915_private *i915)
struct drm_minor *minor = i915->drm.primary; struct drm_minor *minor = i915->drm.primary;
struct intel_fbc *fbc; struct intel_fbc *fbc;
fbc = i915->fbc[INTEL_FBC_A]; fbc = i915->display.fbc[INTEL_FBC_A];
if (fbc) if (fbc)
intel_fbc_debugfs_add(fbc, minor->debugfs_root); intel_fbc_debugfs_add(fbc, minor->debugfs_root);
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -24,6 +24,7 @@ struct i2c_adapter; ...@@ -24,6 +24,7 @@ struct i2c_adapter;
#define GMBUS_PIN_2_BXT 2 #define GMBUS_PIN_2_BXT 2
#define GMBUS_PIN_3_BXT 3 #define GMBUS_PIN_3_BXT 3
#define GMBUS_PIN_4_CNP 4 #define GMBUS_PIN_4_CNP 4
#define GMBUS_PIN_5_MTP 5
#define GMBUS_PIN_9_TC1_ICP 9 #define GMBUS_PIN_9_TC1_ICP 9
#define GMBUS_PIN_10_TC2_ICP 10 #define GMBUS_PIN_10_TC2_ICP 10
#define GMBUS_PIN_11_TC3_ICP 11 #define GMBUS_PIN_11_TC3_ICP 11
......
This diff is collapsed.
This diff is collapsed.
...@@ -1892,7 +1892,7 @@ int intel_hdmi_tmds_clock(int clock, int bpc, bool ycbcr420_output) ...@@ -1892,7 +1892,7 @@ int intel_hdmi_tmds_clock(int clock, int bpc, bool ycbcr420_output)
* 1.5x for 12bpc * 1.5x for 12bpc
* 1.25x for 10bpc * 1.25x for 10bpc
*/ */
return clock * bpc / 8; return DIV_ROUND_CLOSEST(clock * bpc, 8);
} }
static bool intel_hdmi_source_bpc_possible(struct drm_i915_private *i915, int bpc) static bool intel_hdmi_source_bpc_possible(struct drm_i915_private *i915, int bpc)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment