Cross-subsystem Changes:
- x86/gpu: add JasperLake to gen11 early quirks (Although the patch lacks the Ack info, it has been Acked by Borislav) Driver Changes: - General DMC improves (Anusha) - More ADL-P enabling (Vandita, Matt, Jose, Mika, Anusha, Imre, Lucas, Jani, Manasi, Ville, Stanislav) - Introduce MBUS relative dbuf offset (Ville) - PSR fixes and improvements (Gwan, Jose, Ville) - Re-enable LTTPR non-transparent LT mode for DPCD_REV < 1.4 (Ville) - Remove duplicated declarations (Shaokun, Wan) - Check HDMI sink deep color capabilities during .mode_valid (Ville) - Fix display flicker screan related to console and FBC (Chris) - Remaining conversions of GRAPHICS_VER (Lucas) - Drop invalid FIXME (Jose) - Fix bigjoiner check in dsc_disable (Vandita) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAmDBMp8ACgkQ+mJfZA7r E8rkngf/cq6JI3nLmQpNSoDJ1VosuuLgVKGMeL+NR4UmHqsjzaxTL7evaJzf38mS wDaTvB3eEUKAFuvIY/US6xO3gPXb1TtmJ4UBizzkK7DOeh53LXvrxX+ifdg6RXx9 7WsNvnUMItGX5+CRtHeWqmqptBCXTup1ntjAvTOKc9S20gshDHX0/eyk04Ub5FOb cVgt9FoDhTVY6Z2wWG9G0pezbuWc3rDMei+cboXUXCx+QEjjdYNyrb32UT6e1Qfm oBWRhOMTe+aJtbGen+l134I1uS3XCfjZ8zHVqLXMUhCJ443yB0LEhPdk56PJSD9F MoKujBlyxF1dM7SDQ/h6+7uhpvOkvA== =0nIT -----END PGP SIGNATURE----- Merge tag 'drm-intel-next-2021-06-09' of git://anongit.freedesktop.org/drm/drm-intel into drm-next Cross-subsystem Changes: - x86/gpu: add JasperLake to gen11 early quirks (Although the patch lacks the Ack info, it has been Acked by Borislav) Driver Changes: - General DMC improves (Anusha) - More ADL-P enabling (Vandita, Matt, Jose, Mika, Anusha, Imre, Lucas, Jani, Manasi, Ville, Stanislav) - Introduce MBUS relative dbuf offset (Ville) - PSR fixes and improvements (Gwan, Jose, Ville) - Re-enable LTTPR non-transparent LT mode for DPCD_REV < 1.4 (Ville) - Remove duplicated declarations (Shaokun, Wan) - Check HDMI sink deep color capabilities during .mode_valid (Ville) - Fix display flicker screan related to console and FBC (Chris) - Remaining conversions of GRAPHICS_VER (Lucas) - Drop invalid FIXME (Jose) - Fix bigjoiner check in dsc_disable (Vandita) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/YMEy2Ew82BeL/hDK@intel.com
This commit is contained in:
commit
a2098e857b
|
@ -210,13 +210,13 @@ DPIO
|
|||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dpio_phy.c
|
||||
:doc: DPIO
|
||||
|
||||
CSR firmware support for DMC
|
||||
----------------------------
|
||||
DMC Firmware Support
|
||||
--------------------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_csr.c
|
||||
:doc: csr support for dmc
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dmc.c
|
||||
:doc: DMC Firmware Support
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_csr.c
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dmc.c
|
||||
:internal:
|
||||
|
||||
Video BIOS Table (VBT)
|
||||
|
@ -537,7 +537,7 @@ The HuC FW layout is the same as the GuC one, see `GuC Firmware Layout`_
|
|||
|
||||
DMC
|
||||
---
|
||||
See `CSR firmware support for DMC`_
|
||||
See `DMC Firmware Support`_
|
||||
|
||||
Tracing
|
||||
=======
|
||||
|
|
|
@ -549,6 +549,7 @@ static const struct pci_device_id intel_early_ids[] __initconst = {
|
|||
INTEL_CNL_IDS(&gen9_early_ops),
|
||||
INTEL_ICL_11_IDS(&gen11_early_ops),
|
||||
INTEL_EHL_IDS(&gen11_early_ops),
|
||||
INTEL_JSL_IDS(&gen11_early_ops),
|
||||
INTEL_TGL_12_IDS(&gen11_early_ops),
|
||||
INTEL_RKL_IDS(&gen11_early_ops),
|
||||
INTEL_ADLS_IDS(&gen11_early_ops),
|
||||
|
|
|
@ -201,10 +201,10 @@ i915-y += \
|
|||
display/intel_combo_phy.o \
|
||||
display/intel_connector.o \
|
||||
display/intel_crtc.o \
|
||||
display/intel_csr.o \
|
||||
display/intel_cursor.o \
|
||||
display/intel_display.o \
|
||||
display/intel_display_power.o \
|
||||
display/intel_dmc.o \
|
||||
display/intel_dpio_phy.o \
|
||||
display/intel_dpll.o \
|
||||
display/intel_dpll_mgr.o \
|
||||
|
@ -263,6 +263,7 @@ i915-y += \
|
|||
display/intel_lvds.o \
|
||||
display/intel_panel.o \
|
||||
display/intel_pps.o \
|
||||
display/intel_qp_tables.o \
|
||||
display/intel_sdvo.o \
|
||||
display/intel_tv.o \
|
||||
display/intel_vdsc.o \
|
||||
|
|
|
@ -363,10 +363,19 @@ static void gen11_dsi_program_esc_clk_div(struct intel_encoder *encoder,
|
|||
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
|
||||
enum port port;
|
||||
int afe_clk_khz;
|
||||
u32 esc_clk_div_m;
|
||||
int theo_word_clk, act_word_clk;
|
||||
u32 esc_clk_div_m, esc_clk_div_m_phy;
|
||||
|
||||
afe_clk_khz = afe_clk(encoder, crtc_state);
|
||||
esc_clk_div_m = DIV_ROUND_UP(afe_clk_khz, DSI_MAX_ESC_CLK);
|
||||
|
||||
if (IS_ALDERLAKE_S(dev_priv) || IS_ALDERLAKE_P(dev_priv)) {
|
||||
theo_word_clk = DIV_ROUND_UP(afe_clk_khz, 8 * DSI_MAX_ESC_CLK);
|
||||
act_word_clk = max(3, theo_word_clk + (theo_word_clk + 1) % 2);
|
||||
esc_clk_div_m = act_word_clk * 8;
|
||||
esc_clk_div_m_phy = (act_word_clk - 1) / 2;
|
||||
} else {
|
||||
esc_clk_div_m = DIV_ROUND_UP(afe_clk_khz, DSI_MAX_ESC_CLK);
|
||||
}
|
||||
|
||||
for_each_dsi_port(port, intel_dsi->ports) {
|
||||
intel_de_write(dev_priv, ICL_DSI_ESC_CLK_DIV(port),
|
||||
|
@ -379,6 +388,14 @@ static void gen11_dsi_program_esc_clk_div(struct intel_encoder *encoder,
|
|||
esc_clk_div_m & ICL_ESC_CLK_DIV_MASK);
|
||||
intel_de_posting_read(dev_priv, ICL_DPHY_ESC_CLK_DIV(port));
|
||||
}
|
||||
|
||||
if (IS_ALDERLAKE_S(dev_priv) || IS_ALDERLAKE_P(dev_priv)) {
|
||||
for_each_dsi_port(port, intel_dsi->ports) {
|
||||
intel_de_write(dev_priv, ADL_MIPIO_DW(port, 8),
|
||||
esc_clk_div_m_phy & TX_ESC_CLK_DIV_PHY);
|
||||
intel_de_posting_read(dev_priv, ADL_MIPIO_DW(port, 8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void get_dsi_io_power_domains(struct drm_i915_private *dev_priv,
|
||||
|
|
|
@ -187,6 +187,26 @@ intel_connector_needs_modeset(struct intel_atomic_state *state,
|
|||
new_conn_state->crtc)));
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_any_crtc_needs_modeset - check if any CRTC needs a modeset
|
||||
* @state: the atomic state corresponding to this modeset
|
||||
*
|
||||
* Returns true if any CRTC in @state needs a modeset.
|
||||
*/
|
||||
bool intel_any_crtc_needs_modeset(struct intel_atomic_state *state)
|
||||
{
|
||||
struct intel_crtc *crtc;
|
||||
struct intel_crtc_state *crtc_state;
|
||||
int i;
|
||||
|
||||
for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
|
||||
if (intel_crtc_needs_modeset(crtc_state))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
struct intel_digital_connector_state *
|
||||
intel_atomic_get_digital_connector_state(struct intel_atomic_state *state,
|
||||
struct intel_connector *connector)
|
||||
|
|
|
@ -35,6 +35,7 @@ struct drm_connector_state *
|
|||
intel_digital_connector_duplicate_state(struct drm_connector *connector);
|
||||
bool intel_connector_needs_modeset(struct intel_atomic_state *state,
|
||||
struct drm_connector *connector);
|
||||
bool intel_any_crtc_needs_modeset(struct intel_atomic_state *state);
|
||||
struct intel_digital_connector_state *
|
||||
intel_atomic_get_digital_connector_state(struct intel_atomic_state *state,
|
||||
struct intel_connector *connector);
|
||||
|
|
|
@ -162,7 +162,7 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
|
|||
{
|
||||
struct intel_qgv_info qi = {};
|
||||
bool is_y_tile = true; /* assume y tile may be used */
|
||||
int num_channels = dev_priv->dram_info.num_channels;
|
||||
int num_channels = max_t(u8, 1, dev_priv->dram_info.num_channels);
|
||||
int deinterleave;
|
||||
int ipqdepth, ipqdepthpch;
|
||||
int dclk_max;
|
||||
|
@ -267,7 +267,7 @@ void intel_bw_init_hw(struct drm_i915_private *dev_priv)
|
|||
if (!HAS_DISPLAY(dev_priv))
|
||||
return;
|
||||
|
||||
if (IS_ALDERLAKE_S(dev_priv))
|
||||
if (IS_ALDERLAKE_S(dev_priv) || IS_ALDERLAKE_P(dev_priv))
|
||||
icl_get_bw_info(dev_priv, &adls_sa_info);
|
||||
else if (IS_ROCKETLAKE(dev_priv))
|
||||
icl_get_bw_info(dev_priv, &rkl_sa_info);
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "intel_cdclk.h"
|
||||
#include "intel_de.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_psr.h"
|
||||
#include "intel_sideband.h"
|
||||
|
||||
/**
|
||||
|
@ -1547,6 +1548,35 @@ static void cnl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
|
|||
dev_priv->cdclk.hw.vco = vco;
|
||||
}
|
||||
|
||||
static bool has_cdclk_crawl(struct drm_i915_private *i915)
|
||||
{
|
||||
return INTEL_INFO(i915)->has_cdclk_crawl;
|
||||
}
|
||||
|
||||
static void adlp_cdclk_pll_crawl(struct drm_i915_private *dev_priv, int vco)
|
||||
{
|
||||
int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
|
||||
u32 val;
|
||||
|
||||
/* Write PLL ratio without disabling */
|
||||
val = CNL_CDCLK_PLL_RATIO(ratio) | BXT_DE_PLL_PLL_ENABLE;
|
||||
intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
|
||||
|
||||
/* Submit freq change request */
|
||||
val |= BXT_DE_PLL_FREQ_REQ;
|
||||
intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
|
||||
|
||||
/* Timeout 200us */
|
||||
if (intel_de_wait_for_set(dev_priv, BXT_DE_PLL_ENABLE,
|
||||
BXT_DE_PLL_LOCK | BXT_DE_PLL_FREQ_REQ_ACK, 1))
|
||||
DRM_ERROR("timeout waiting for FREQ change request ack\n");
|
||||
|
||||
val &= ~BXT_DE_PLL_FREQ_REQ;
|
||||
intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
|
||||
|
||||
dev_priv->cdclk.hw.vco = vco;
|
||||
}
|
||||
|
||||
static u32 bxt_cdclk_cd2x_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
|
||||
{
|
||||
if (DISPLAY_VER(dev_priv) >= 12) {
|
||||
|
@ -1619,14 +1649,16 @@ static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
|
|||
return;
|
||||
}
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) {
|
||||
if (has_cdclk_crawl(dev_priv) && dev_priv->cdclk.hw.vco > 0 && vco > 0) {
|
||||
if (dev_priv->cdclk.hw.vco != vco)
|
||||
adlp_cdclk_pll_crawl(dev_priv, vco);
|
||||
} else if (DISPLAY_VER(dev_priv) >= 11 || IS_CANNONLAKE(dev_priv)) {
|
||||
if (dev_priv->cdclk.hw.vco != 0 &&
|
||||
dev_priv->cdclk.hw.vco != vco)
|
||||
cnl_cdclk_pll_disable(dev_priv);
|
||||
|
||||
if (dev_priv->cdclk.hw.vco != vco)
|
||||
cnl_cdclk_pll_enable(dev_priv, vco);
|
||||
|
||||
} else {
|
||||
if (dev_priv->cdclk.hw.vco != 0 &&
|
||||
dev_priv->cdclk.hw.vco != vco)
|
||||
|
@ -1819,6 +1851,28 @@ void intel_cdclk_uninit_hw(struct drm_i915_private *i915)
|
|||
skl_cdclk_uninit_hw(i915);
|
||||
}
|
||||
|
||||
static bool intel_cdclk_can_crawl(struct drm_i915_private *dev_priv,
|
||||
const struct intel_cdclk_config *a,
|
||||
const struct intel_cdclk_config *b)
|
||||
{
|
||||
int a_div, b_div;
|
||||
|
||||
if (!has_cdclk_crawl(dev_priv))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* The vco and cd2x divider will change independently
|
||||
* from each, so we disallow cd2x change when crawling.
|
||||
*/
|
||||
a_div = DIV_ROUND_CLOSEST(a->vco, a->cdclk);
|
||||
b_div = DIV_ROUND_CLOSEST(b->vco, b->cdclk);
|
||||
|
||||
return a->vco != 0 && b->vco != 0 &&
|
||||
a->vco != b->vco &&
|
||||
a_div == b_div &&
|
||||
a->ref == b->ref;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_cdclk_needs_modeset - Determine if changong between the CDCLK
|
||||
* configurations requires a modeset on all pipes
|
||||
|
@ -1908,6 +1962,12 @@ static void intel_set_cdclk(struct drm_i915_private *dev_priv,
|
|||
|
||||
intel_dump_cdclk_config(cdclk_config, "Changing CDCLK to");
|
||||
|
||||
for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) {
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
|
||||
intel_psr_pause(intel_dp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock aux/gmbus while we change cdclk in case those
|
||||
* functions use cdclk. Not all platforms/ports do,
|
||||
|
@ -1930,6 +1990,12 @@ static void intel_set_cdclk(struct drm_i915_private *dev_priv,
|
|||
}
|
||||
mutex_unlock(&dev_priv->gmbus_mutex);
|
||||
|
||||
for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) {
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
|
||||
intel_psr_resume(intel_dp);
|
||||
}
|
||||
|
||||
if (drm_WARN(&dev_priv->drm,
|
||||
intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_config),
|
||||
"cdclk state doesn't match!\n")) {
|
||||
|
@ -2462,7 +2528,7 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
|
|||
struct drm_i915_private *dev_priv = to_i915(state->base.dev);
|
||||
const struct intel_cdclk_state *old_cdclk_state;
|
||||
struct intel_cdclk_state *new_cdclk_state;
|
||||
enum pipe pipe;
|
||||
enum pipe pipe = INVALID_PIPE;
|
||||
int ret;
|
||||
|
||||
new_cdclk_state = intel_atomic_get_cdclk_state(state);
|
||||
|
@ -2514,15 +2580,18 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
|
|||
|
||||
if (drm_atomic_crtc_needs_modeset(&crtc_state->uapi))
|
||||
pipe = INVALID_PIPE;
|
||||
} else {
|
||||
pipe = INVALID_PIPE;
|
||||
}
|
||||
|
||||
if (pipe != INVALID_PIPE) {
|
||||
if (intel_cdclk_can_crawl(dev_priv,
|
||||
&old_cdclk_state->actual,
|
||||
&new_cdclk_state->actual)) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Can change cdclk via crawl\n");
|
||||
} else if (pipe != INVALID_PIPE) {
|
||||
new_cdclk_state->pipe = pipe;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Can change cdclk with pipe %c active\n",
|
||||
"Can change cdclk cd2x divider with pipe %c active\n",
|
||||
pipe_name(pipe));
|
||||
} else if (intel_cdclk_needs_modeset(&old_cdclk_state->actual,
|
||||
&new_cdclk_state->actual)) {
|
||||
|
@ -2531,8 +2600,6 @@ int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
new_cdclk_state->pipe = INVALID_PIPE;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Modeset required for cdclk change\n");
|
||||
}
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_CSR_H__
|
||||
#define __INTEL_CSR_H__
|
||||
|
||||
struct drm_i915_private;
|
||||
|
||||
#define CSR_VERSION(major, minor) ((major) << 16 | (minor))
|
||||
#define CSR_VERSION_MAJOR(version) ((version) >> 16)
|
||||
#define CSR_VERSION_MINOR(version) ((version) & 0xffff)
|
||||
|
||||
void intel_csr_ucode_init(struct drm_i915_private *i915);
|
||||
void intel_csr_load_program(struct drm_i915_private *i915);
|
||||
void intel_csr_ucode_fini(struct drm_i915_private *i915);
|
||||
void intel_csr_ucode_suspend(struct drm_i915_private *i915);
|
||||
void intel_csr_ucode_resume(struct drm_i915_private *i915);
|
||||
|
||||
#endif /* __INTEL_CSR_H__ */
|
|
@ -383,6 +383,10 @@ static u32 i9xx_cursor_ctl(const struct intel_crtc_state *crtc_state,
|
|||
if (plane_state->hw.rotation & DRM_MODE_ROTATE_180)
|
||||
cntl |= MCURSOR_ROTATE_180;
|
||||
|
||||
/* Wa_22012358565:adlp */
|
||||
if (DISPLAY_VER(dev_priv) == 13)
|
||||
cntl |= MCURSOR_ARB_SLOTS(1);
|
||||
|
||||
return cntl;
|
||||
}
|
||||
|
||||
|
|
|
@ -249,15 +249,48 @@ static u32 icl_pll_to_ddi_clk_sel(struct intel_encoder *encoder,
|
|||
}
|
||||
}
|
||||
|
||||
static u32 ddi_buf_phy_link_rate(int port_clock)
|
||||
{
|
||||
switch (port_clock) {
|
||||
case 162000:
|
||||
return DDI_BUF_PHY_LINK_RATE(0);
|
||||
case 216000:
|
||||
return DDI_BUF_PHY_LINK_RATE(4);
|
||||
case 243000:
|
||||
return DDI_BUF_PHY_LINK_RATE(5);
|
||||
case 270000:
|
||||
return DDI_BUF_PHY_LINK_RATE(1);
|
||||
case 324000:
|
||||
return DDI_BUF_PHY_LINK_RATE(6);
|
||||
case 432000:
|
||||
return DDI_BUF_PHY_LINK_RATE(7);
|
||||
case 540000:
|
||||
return DDI_BUF_PHY_LINK_RATE(2);
|
||||
case 810000:
|
||||
return DDI_BUF_PHY_LINK_RATE(3);
|
||||
default:
|
||||
MISSING_CASE(port_clock);
|
||||
return DDI_BUF_PHY_LINK_RATE(0);
|
||||
}
|
||||
}
|
||||
|
||||
static void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
|
||||
enum phy phy = intel_port_to_phy(i915, encoder->port);
|
||||
|
||||
intel_dp->DP = dig_port->saved_port_bits |
|
||||
DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
|
||||
intel_dp->DP |= DDI_PORT_WIDTH(crtc_state->lane_count);
|
||||
|
||||
if (IS_ALDERLAKE_P(i915) && intel_phy_is_tc(i915, phy)) {
|
||||
intel_dp->DP |= ddi_buf_phy_link_rate(crtc_state->port_clock);
|
||||
if (dig_port->tc_mode != TC_PORT_TBT_ALT)
|
||||
intel_dp->DP |= DDI_BUF_CTL_TC_PHY_OWNERSHIP;
|
||||
}
|
||||
}
|
||||
|
||||
static int icl_calc_tbt_pll_link(struct drm_i915_private *dev_priv,
|
||||
|
@ -979,6 +1012,8 @@ static u8 intel_ddi_dp_voltage_max(struct intel_dp *intel_dp,
|
|||
if (DISPLAY_VER(dev_priv) >= 12) {
|
||||
if (intel_phy_is_combo(dev_priv, phy))
|
||||
tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries);
|
||||
else if (IS_ALDERLAKE_P(dev_priv))
|
||||
adlp_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
|
||||
else
|
||||
tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
|
||||
} else if (DISPLAY_VER(dev_priv) == 11) {
|
||||
|
@ -1425,7 +1460,10 @@ tgl_dkl_phy_ddi_vswing_sequence(struct intel_encoder *encoder,
|
|||
if (enc_to_dig_port(encoder)->tc_mode == TC_PORT_TBT_ALT)
|
||||
return;
|
||||
|
||||
ddi_translations = tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
ddi_translations = adlp_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
|
||||
else
|
||||
ddi_translations = tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries);
|
||||
|
||||
if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))
|
||||
return;
|
||||
|
@ -2772,7 +2810,6 @@ static void intel_ddi_pre_enable(struct intel_atomic_state *state,
|
|||
conn_state);
|
||||
|
||||
/* FIXME precompute everything properly */
|
||||
/* FIXME how do we turn infoframes off again? */
|
||||
if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink)
|
||||
dig_port->set_infoframes(encoder,
|
||||
crtc_state->has_infoframe,
|
||||
|
@ -3157,6 +3194,9 @@ static void intel_enable_ddi_hdmi(struct intel_atomic_state *state,
|
|||
/* In HDMI/DVI mode, the port width, and swing/emphasis values
|
||||
* are ignored so nothing special needs to be done besides
|
||||
* enabling the port.
|
||||
*
|
||||
* On ADL_P the PHY link rate and lane count must be programmed but
|
||||
* these are both 0 for HDMI.
|
||||
*/
|
||||
intel_de_write(dev_priv, DDI_BUF_CTL(port),
|
||||
dig_port->saved_port_bits | DDI_BUF_CTL_ENABLE);
|
||||
|
@ -4022,9 +4062,11 @@ static int intel_ddi_compute_config_late(struct intel_encoder *encoder,
|
|||
|
||||
static void intel_ddi_encoder_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->dev);
|
||||
struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder));
|
||||
|
||||
intel_dp_encoder_flush_work(encoder);
|
||||
intel_display_power_flush_work(i915);
|
||||
|
||||
drm_encoder_cleanup(encoder);
|
||||
if (dig_port)
|
||||
|
@ -4688,9 +4730,12 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
|
|||
|
||||
dig_port->hpd_pulse = intel_dp_hpd_pulse;
|
||||
|
||||
/* Splitter enable for eDP MSO is supported for pipe A only. */
|
||||
if (dig_port->dp.mso_link_count)
|
||||
/* Splitter enable for eDP MSO is limited to certain pipes. */
|
||||
if (dig_port->dp.mso_link_count) {
|
||||
encoder->pipe_mask = BIT(PIPE_A);
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
encoder->pipe_mask |= BIT(PIPE_B);
|
||||
}
|
||||
}
|
||||
|
||||
/* In theory we don't need the encoder->type check, but leave it just in
|
||||
|
|
|
@ -735,6 +735,34 @@ static const struct cnl_ddi_buf_trans rkl_combo_phy_ddi_translations_dp_hbr2_hbr
|
|||
{ 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */
|
||||
};
|
||||
|
||||
static const struct tgl_dkl_phy_ddi_buf_trans adlp_dkl_phy_dp_ddi_trans_hbr[] = {
|
||||
/* VS pre-emp Non-trans mV Pre-emph dB */
|
||||
{ 0x7, 0x0, 0x01 }, /* 0 0 400mV 0 dB */
|
||||
{ 0x5, 0x0, 0x06 }, /* 0 1 400mV 3.5 dB */
|
||||
{ 0x2, 0x0, 0x0B }, /* 0 2 400mV 6 dB */
|
||||
{ 0x0, 0x0, 0x17 }, /* 0 3 400mV 9.5 dB */
|
||||
{ 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB */
|
||||
{ 0x2, 0x0, 0x08 }, /* 1 1 600mV 3.5 dB */
|
||||
{ 0x0, 0x0, 0x14 }, /* 1 2 600mV 6 dB */
|
||||
{ 0x2, 0x0, 0x00 }, /* 2 0 800mV 0 dB */
|
||||
{ 0x0, 0x0, 0x0B }, /* 2 1 800mV 3.5 dB */
|
||||
{ 0x0, 0x0, 0x00 }, /* 3 0 1200mV 0 dB */
|
||||
};
|
||||
|
||||
static const struct tgl_dkl_phy_ddi_buf_trans adlp_dkl_phy_dp_ddi_trans_hbr2_hbr3[] = {
|
||||
/* VS pre-emp Non-trans mV Pre-emph dB */
|
||||
{ 0x7, 0x0, 0x00 }, /* 0 0 400mV 0 dB */
|
||||
{ 0x5, 0x0, 0x04 }, /* 0 1 400mV 3.5 dB */
|
||||
{ 0x2, 0x0, 0x0A }, /* 0 2 400mV 6 dB */
|
||||
{ 0x0, 0x0, 0x18 }, /* 0 3 400mV 9.5 dB */
|
||||
{ 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB */
|
||||
{ 0x2, 0x0, 0x06 }, /* 1 1 600mV 3.5 dB */
|
||||
{ 0x0, 0x0, 0x14 }, /* 1 2 600mV 6 dB */
|
||||
{ 0x2, 0x0, 0x00 }, /* 2 0 800mV 0 dB */
|
||||
{ 0x0, 0x0, 0x09 }, /* 2 1 800mV 3.5 dB */
|
||||
{ 0x0, 0x0, 0x00 }, /* 3 0 1200mV 0 dB */
|
||||
};
|
||||
|
||||
bool is_hobl_buf_trans(const struct cnl_ddi_buf_trans *table)
|
||||
{
|
||||
return table == tgl_combo_phy_ddi_translations_edp_hbr2_hobl;
|
||||
|
@ -1348,6 +1376,31 @@ tgl_get_dkl_buf_trans(struct intel_encoder *encoder,
|
|||
return tgl_get_dkl_buf_trans_dp(encoder, crtc_state, n_entries);
|
||||
}
|
||||
|
||||
static const struct tgl_dkl_phy_ddi_buf_trans *
|
||||
adlp_get_dkl_buf_trans_dp(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
int *n_entries)
|
||||
{
|
||||
if (crtc_state->port_clock > 270000) {
|
||||
*n_entries = ARRAY_SIZE(adlp_dkl_phy_dp_ddi_trans_hbr2_hbr3);
|
||||
return adlp_dkl_phy_dp_ddi_trans_hbr2_hbr3;
|
||||
}
|
||||
|
||||
*n_entries = ARRAY_SIZE(adlp_dkl_phy_dp_ddi_trans_hbr);
|
||||
return adlp_dkl_phy_dp_ddi_trans_hbr;
|
||||
}
|
||||
|
||||
const struct tgl_dkl_phy_ddi_buf_trans *
|
||||
adlp_get_dkl_buf_trans(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
int *n_entries)
|
||||
{
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
|
||||
return tgl_get_dkl_buf_trans_hdmi(encoder, crtc_state, n_entries);
|
||||
else
|
||||
return adlp_get_dkl_buf_trans_dp(encoder, crtc_state, n_entries);
|
||||
}
|
||||
|
||||
int intel_ddi_hdmi_num_entries(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
int *default_entry)
|
||||
|
|
|
@ -67,6 +67,10 @@ bxt_get_buf_trans(struct intel_encoder *encoder,
|
|||
const struct intel_crtc_state *crtc_state,
|
||||
int *n_entries);
|
||||
|
||||
const struct tgl_dkl_phy_ddi_buf_trans *
|
||||
adlp_get_dkl_buf_trans(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
int *n_entries);
|
||||
const struct cnl_ddi_buf_trans *
|
||||
tgl_get_combo_buf_trans(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
|
|
|
@ -79,9 +79,9 @@
|
|||
#include "intel_cdclk.h"
|
||||
#include "intel_color.h"
|
||||
#include "intel_crtc.h"
|
||||
#include "intel_csr.h"
|
||||
#include "intel_de.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_dmc.h"
|
||||
#include "intel_dp_link_training.h"
|
||||
#include "intel_fbc.h"
|
||||
#include "intel_fdi.h"
|
||||
|
@ -975,6 +975,11 @@ void intel_enable_pipe(const struct intel_crtc_state *new_crtc_state)
|
|||
/* FIXME: assert CPU port conditions for SNB+ */
|
||||
}
|
||||
|
||||
/* Wa_22012358565:adlp */
|
||||
if (DISPLAY_VER(dev_priv) == 13)
|
||||
intel_de_rmw(dev_priv, PIPE_ARB_CTL(pipe),
|
||||
0, PIPE_ARB_USE_PROG_SLOTS);
|
||||
|
||||
reg = PIPECONF(cpu_transcoder);
|
||||
val = intel_de_read(dev_priv, reg);
|
||||
if (val & PIPECONF_ENABLE) {
|
||||
|
@ -1690,7 +1695,8 @@ initial_plane_vma(struct drm_i915_private *i915,
|
|||
* important and we should probably use that space with FBC or other
|
||||
* features.
|
||||
*/
|
||||
if (size * 2 > i915->stolen_usable_size)
|
||||
if (IS_ENABLED(CONFIG_FRAMEBUFFER_CONSOLE) &&
|
||||
size * 2 > i915->stolen_usable_size)
|
||||
return NULL;
|
||||
|
||||
obj = i915_gem_object_create_stolen_for_preallocated(i915, base, size);
|
||||
|
@ -2208,6 +2214,21 @@ static void icl_set_pipe_chicken(struct intel_crtc *crtc)
|
|||
* across pipe
|
||||
*/
|
||||
tmp |= PIXEL_ROUNDING_TRUNC_FB_PASSTHRU;
|
||||
|
||||
/*
|
||||
* "The underrun recovery mechanism should be disabled
|
||||
* when the following is enabled for this pipe:
|
||||
* WiDi
|
||||
* Downscaling (this includes YUV420 fullblend)
|
||||
* COG
|
||||
* DSC
|
||||
* PSR2"
|
||||
*
|
||||
* FIXME: enable whenever possible...
|
||||
*/
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
tmp |= UNDERRUN_RECOVERY_DISABLE;
|
||||
|
||||
intel_de_write(dev_priv, PIPE_CHICKEN(pipe), tmp);
|
||||
}
|
||||
|
||||
|
@ -3675,7 +3696,9 @@ bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy)
|
|||
|
||||
bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy)
|
||||
{
|
||||
if (IS_TIGERLAKE(dev_priv))
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
return phy >= PHY_F && phy <= PHY_I;
|
||||
else if (IS_TIGERLAKE(dev_priv))
|
||||
return phy >= PHY_D && phy <= PHY_I;
|
||||
else if (IS_ICELAKE(dev_priv))
|
||||
return phy >= PHY_C && phy <= PHY_F;
|
||||
|
@ -5714,8 +5737,12 @@ static void hsw_set_pipeconf(const struct intel_crtc_state *crtc_state)
|
|||
static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
const struct intel_crtc_scaler_state *scaler_state =
|
||||
&crtc_state->scaler_state;
|
||||
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 val = 0;
|
||||
int i;
|
||||
|
||||
switch (crtc_state->pipe_bpp) {
|
||||
case 18:
|
||||
|
@ -5754,6 +5781,23 @@ static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state)
|
|||
if (DISPLAY_VER(dev_priv) >= 12)
|
||||
val |= PIPEMISC_PIXEL_ROUNDING_TRUNC;
|
||||
|
||||
if (IS_ALDERLAKE_P(dev_priv)) {
|
||||
bool scaler_in_use = false;
|
||||
|
||||
for (i = 0; i < crtc->num_scalers; i++) {
|
||||
if (!scaler_state->scalers[i].in_use)
|
||||
continue;
|
||||
|
||||
scaler_in_use = true;
|
||||
break;
|
||||
}
|
||||
|
||||
intel_de_rmw(dev_priv, PIPE_MISC2(crtc->pipe),
|
||||
PIPE_MISC2_UNDERRUN_BUBBLE_COUNTER_MASK,
|
||||
scaler_in_use ? PIPE_MISC2_BUBBLE_COUNTER_SCALER_EN :
|
||||
PIPE_MISC2_BUBBLE_COUNTER_SCALER_DIS);
|
||||
}
|
||||
|
||||
intel_de_write(dev_priv, PIPEMISC(crtc->pipe), val);
|
||||
}
|
||||
|
||||
|
@ -7631,10 +7675,11 @@ static void intel_dump_pipe_config(const struct intel_crtc_state *pipe_config,
|
|||
intel_hdmi_infoframe_enable(DP_SDP_VSC))
|
||||
intel_dump_dp_vsc_sdp(dev_priv, &pipe_config->infoframes.vsc);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "vrr: %s, vmin: %d, vmax: %d, pipeline full: %d, flipline: %d, vmin vblank: %d, vmax vblank: %d\n",
|
||||
drm_dbg_kms(&dev_priv->drm, "vrr: %s, vmin: %d, vmax: %d, pipeline full: %d, guardband: %d flipline: %d, vmin vblank: %d, vmax vblank: %d\n",
|
||||
yesno(pipe_config->vrr.enable),
|
||||
pipe_config->vrr.vmin, pipe_config->vrr.vmax,
|
||||
pipe_config->vrr.pipeline_full, pipe_config->vrr.flipline,
|
||||
pipe_config->vrr.pipeline_full, pipe_config->vrr.guardband,
|
||||
pipe_config->vrr.flipline,
|
||||
intel_vrr_vmin_vblank_start(pipe_config),
|
||||
intel_vrr_vmax_vblank_start(pipe_config));
|
||||
|
||||
|
@ -8270,6 +8315,16 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#define PIPE_CONF_CHECK_X_WITH_MASK(name, mask) do { \
|
||||
if ((current_config->name & (mask)) != (pipe_config->name & (mask))) { \
|
||||
pipe_config_mismatch(fastset, crtc, __stringify(name), \
|
||||
"(expected 0x%08x, found 0x%08x)", \
|
||||
current_config->name & (mask), \
|
||||
pipe_config->name & (mask)); \
|
||||
ret = false; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define PIPE_CONF_CHECK_I(name) do { \
|
||||
if (current_config->name != pipe_config->name) { \
|
||||
pipe_config_mismatch(fastset, crtc, __stringify(name), \
|
||||
|
@ -8558,6 +8613,11 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
|||
bp_gamma = intel_color_get_gamma_bit_precision(pipe_config);
|
||||
if (bp_gamma)
|
||||
PIPE_CONF_CHECK_COLOR_LUT(gamma_mode, hw.gamma_lut, bp_gamma);
|
||||
|
||||
PIPE_CONF_CHECK_BOOL(has_psr);
|
||||
PIPE_CONF_CHECK_BOOL(has_psr2);
|
||||
PIPE_CONF_CHECK_BOOL(enable_psr2_sel_fetch);
|
||||
PIPE_CONF_CHECK_I(dc3co_exitline);
|
||||
}
|
||||
|
||||
PIPE_CONF_CHECK_BOOL(double_wide);
|
||||
|
@ -8611,7 +8671,12 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
|||
PIPE_CONF_CHECK_I(min_voltage_level);
|
||||
}
|
||||
|
||||
PIPE_CONF_CHECK_X(infoframes.enable);
|
||||
if (fastset && (current_config->has_psr || pipe_config->has_psr))
|
||||
PIPE_CONF_CHECK_X_WITH_MASK(infoframes.enable,
|
||||
~intel_hdmi_infoframe_enable(DP_SDP_VSC));
|
||||
else
|
||||
PIPE_CONF_CHECK_X(infoframes.enable);
|
||||
|
||||
PIPE_CONF_CHECK_X(infoframes.gcp);
|
||||
PIPE_CONF_CHECK_INFOFRAME(avi);
|
||||
PIPE_CONF_CHECK_INFOFRAME(spd);
|
||||
|
@ -8640,11 +8705,7 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
|||
PIPE_CONF_CHECK_I(vrr.vmax);
|
||||
PIPE_CONF_CHECK_I(vrr.flipline);
|
||||
PIPE_CONF_CHECK_I(vrr.pipeline_full);
|
||||
|
||||
PIPE_CONF_CHECK_BOOL(has_psr);
|
||||
PIPE_CONF_CHECK_BOOL(has_psr2);
|
||||
PIPE_CONF_CHECK_BOOL(enable_psr2_sel_fetch);
|
||||
PIPE_CONF_CHECK_I(dc3co_exitline);
|
||||
PIPE_CONF_CHECK_I(vrr.guardband);
|
||||
|
||||
#undef PIPE_CONF_CHECK_X
|
||||
#undef PIPE_CONF_CHECK_I
|
||||
|
@ -8750,6 +8811,38 @@ static void verify_wm_state(struct intel_crtc *crtc,
|
|||
hw_wm_level->lines);
|
||||
}
|
||||
|
||||
hw_wm_level = &hw->wm.planes[plane->id].sagv.wm0;
|
||||
sw_wm_level = &sw_wm->planes[plane->id].sagv.wm0;
|
||||
|
||||
if (HAS_HW_SAGV_WM(dev_priv) &&
|
||||
!skl_wm_level_equals(hw_wm_level, sw_wm_level)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"[PLANE:%d:%s] mismatch in SAGV WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n",
|
||||
plane->base.base.id, plane->base.name,
|
||||
sw_wm_level->enable,
|
||||
sw_wm_level->blocks,
|
||||
sw_wm_level->lines,
|
||||
hw_wm_level->enable,
|
||||
hw_wm_level->blocks,
|
||||
hw_wm_level->lines);
|
||||
}
|
||||
|
||||
hw_wm_level = &hw->wm.planes[plane->id].sagv.trans_wm;
|
||||
sw_wm_level = &sw_wm->planes[plane->id].sagv.trans_wm;
|
||||
|
||||
if (HAS_HW_SAGV_WM(dev_priv) &&
|
||||
!skl_wm_level_equals(hw_wm_level, sw_wm_level)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"[PLANE:%d:%s] mismatch in SAGV trans WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n",
|
||||
plane->base.base.id, plane->base.name,
|
||||
sw_wm_level->enable,
|
||||
sw_wm_level->blocks,
|
||||
sw_wm_level->lines,
|
||||
hw_wm_level->enable,
|
||||
hw_wm_level->blocks,
|
||||
hw_wm_level->lines);
|
||||
}
|
||||
|
||||
/* DDB */
|
||||
hw_ddb_entry = &hw->ddb_y[plane->id];
|
||||
sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb_y[plane->id];
|
||||
|
@ -9923,6 +10016,9 @@ static int intel_atomic_check(struct drm_device *dev,
|
|||
if (ret)
|
||||
goto fail;
|
||||
|
||||
if (intel_any_crtc_needs_modeset(state))
|
||||
any_ms = true;
|
||||
|
||||
if (any_ms) {
|
||||
ret = intel_modeset_checks(state);
|
||||
if (ret)
|
||||
|
@ -11219,7 +11315,14 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
|
|||
if (!HAS_DISPLAY(dev_priv))
|
||||
return;
|
||||
|
||||
if (IS_ALDERLAKE_S(dev_priv)) {
|
||||
if (IS_ALDERLAKE_P(dev_priv)) {
|
||||
intel_ddi_init(dev_priv, PORT_A);
|
||||
intel_ddi_init(dev_priv, PORT_B);
|
||||
intel_ddi_init(dev_priv, PORT_TC1);
|
||||
intel_ddi_init(dev_priv, PORT_TC2);
|
||||
intel_ddi_init(dev_priv, PORT_TC3);
|
||||
intel_ddi_init(dev_priv, PORT_TC4);
|
||||
} else if (IS_ALDERLAKE_S(dev_priv)) {
|
||||
intel_ddi_init(dev_priv, PORT_A);
|
||||
intel_ddi_init(dev_priv, PORT_TC1);
|
||||
intel_ddi_init(dev_priv, PORT_TC2);
|
||||
|
@ -12192,7 +12295,7 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)
|
|||
if (!HAS_DISPLAY(i915))
|
||||
return 0;
|
||||
|
||||
intel_csr_ucode_init(i915);
|
||||
intel_dmc_ucode_init(i915);
|
||||
|
||||
i915->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
|
||||
i915->flip_wq = alloc_workqueue("i915_flip", WQ_HIGHPRI |
|
||||
|
@ -12200,19 +12303,21 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)
|
|||
|
||||
i915->framestart_delay = 1; /* 1-4 */
|
||||
|
||||
i915->window2_delay = 0; /* No DSB so no window2 delay */
|
||||
|
||||
intel_mode_config_init(i915);
|
||||
|
||||
ret = intel_cdclk_init(i915);
|
||||
if (ret)
|
||||
goto cleanup_vga_client_pw_domain_csr;
|
||||
goto cleanup_vga_client_pw_domain_dmc;
|
||||
|
||||
ret = intel_dbuf_init(i915);
|
||||
if (ret)
|
||||
goto cleanup_vga_client_pw_domain_csr;
|
||||
goto cleanup_vga_client_pw_domain_dmc;
|
||||
|
||||
ret = intel_bw_init(i915);
|
||||
if (ret)
|
||||
goto cleanup_vga_client_pw_domain_csr;
|
||||
goto cleanup_vga_client_pw_domain_dmc;
|
||||
|
||||
init_llist_head(&i915->atomic_helper.free_list);
|
||||
INIT_WORK(&i915->atomic_helper.free_work,
|
||||
|
@ -12224,8 +12329,8 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915)
|
|||
|
||||
return 0;
|
||||
|
||||
cleanup_vga_client_pw_domain_csr:
|
||||
intel_csr_ucode_fini(i915);
|
||||
cleanup_vga_client_pw_domain_dmc:
|
||||
intel_dmc_ucode_fini(i915);
|
||||
intel_power_domains_driver_remove(i915);
|
||||
intel_vga_unregister(i915);
|
||||
cleanup_bios:
|
||||
|
@ -13304,7 +13409,7 @@ void intel_modeset_driver_remove_noirq(struct drm_i915_private *i915)
|
|||
/* part #3: call after gem init */
|
||||
void intel_modeset_driver_remove_nogem(struct drm_i915_private *i915)
|
||||
{
|
||||
intel_csr_ucode_fini(i915);
|
||||
intel_dmc_ucode_fini(i915);
|
||||
|
||||
intel_power_domains_driver_remove(i915);
|
||||
|
||||
|
|
|
@ -7,11 +7,11 @@
|
|||
#include <drm/drm_fourcc.h>
|
||||
|
||||
#include "i915_debugfs.h"
|
||||
#include "intel_csr.h"
|
||||
#include "intel_display_debugfs.h"
|
||||
#include "intel_display_power.h"
|
||||
#include "intel_de.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_dmc.h"
|
||||
#include "intel_dp.h"
|
||||
#include "intel_fbc.h"
|
||||
#include "intel_hdcp.h"
|
||||
|
@ -532,24 +532,24 @@ static int i915_dmc_info(struct seq_file *m, void *unused)
|
|||
{
|
||||
struct drm_i915_private *dev_priv = node_to_i915(m->private);
|
||||
intel_wakeref_t wakeref;
|
||||
struct intel_csr *csr;
|
||||
struct intel_dmc *dmc;
|
||||
i915_reg_t dc5_reg, dc6_reg = {};
|
||||
|
||||
if (!HAS_CSR(dev_priv))
|
||||
if (!HAS_DMC(dev_priv))
|
||||
return -ENODEV;
|
||||
|
||||
csr = &dev_priv->csr;
|
||||
dmc = &dev_priv->dmc;
|
||||
|
||||
wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
|
||||
|
||||
seq_printf(m, "fw loaded: %s\n", yesno(csr->dmc_payload != NULL));
|
||||
seq_printf(m, "path: %s\n", csr->fw_path);
|
||||
seq_printf(m, "fw loaded: %s\n", yesno(intel_dmc_has_payload(dev_priv)));
|
||||
seq_printf(m, "path: %s\n", dmc->fw_path);
|
||||
|
||||
if (!csr->dmc_payload)
|
||||
if (!intel_dmc_has_payload(dev_priv))
|
||||
goto out;
|
||||
|
||||
seq_printf(m, "version: %d.%d\n", CSR_VERSION_MAJOR(csr->version),
|
||||
CSR_VERSION_MINOR(csr->version));
|
||||
seq_printf(m, "version: %d.%d\n", DMC_VERSION_MAJOR(dmc->version),
|
||||
DMC_VERSION_MINOR(dmc->version));
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 12) {
|
||||
if (IS_DGFX(dev_priv)) {
|
||||
|
@ -568,10 +568,10 @@ static int i915_dmc_info(struct seq_file *m, void *unused)
|
|||
seq_printf(m, "DC3CO count: %d\n",
|
||||
intel_de_read(dev_priv, DMC_DEBUG3));
|
||||
} else {
|
||||
dc5_reg = IS_BROXTON(dev_priv) ? BXT_CSR_DC3_DC5_COUNT :
|
||||
SKL_CSR_DC3_DC5_COUNT;
|
||||
dc5_reg = IS_BROXTON(dev_priv) ? BXT_DMC_DC3_DC5_COUNT :
|
||||
SKL_DMC_DC3_DC5_COUNT;
|
||||
if (!IS_GEMINILAKE(dev_priv) && !IS_BROXTON(dev_priv))
|
||||
dc6_reg = SKL_CSR_DC5_DC6_COUNT;
|
||||
dc6_reg = SKL_DMC_DC5_DC6_COUNT;
|
||||
}
|
||||
|
||||
seq_printf(m, "DC3 -> DC5 count: %d\n",
|
||||
|
@ -582,10 +582,10 @@ static int i915_dmc_info(struct seq_file *m, void *unused)
|
|||
|
||||
out:
|
||||
seq_printf(m, "program base: 0x%08x\n",
|
||||
intel_de_read(dev_priv, CSR_PROGRAM(0)));
|
||||
intel_de_read(dev_priv, DMC_PROGRAM(0)));
|
||||
seq_printf(m, "ssp base: 0x%08x\n",
|
||||
intel_de_read(dev_priv, CSR_SSP_BASE));
|
||||
seq_printf(m, "htp: 0x%08x\n", intel_de_read(dev_priv, CSR_HTP_SKL));
|
||||
intel_de_read(dev_priv, DMC_SSP_BASE));
|
||||
seq_printf(m, "htp: 0x%08x\n", intel_de_read(dev_priv, DMC_HTP_SKL));
|
||||
|
||||
intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
|
||||
|
||||
|
|
|
@ -9,10 +9,10 @@
|
|||
#include "i915_irq.h"
|
||||
#include "intel_cdclk.h"
|
||||
#include "intel_combo_phy.h"
|
||||
#include "intel_csr.h"
|
||||
#include "intel_display_power.h"
|
||||
#include "intel_de.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_dmc.h"
|
||||
#include "intel_dpio_phy.h"
|
||||
#include "intel_hotplug.h"
|
||||
#include "intel_pm.h"
|
||||
|
@ -291,8 +291,7 @@ static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv,
|
|||
#define ICL_TBT_AUX_PW_TO_CH(pw_idx) \
|
||||
((pw_idx) - ICL_PW_CTL_IDX_AUX_TBT1 + AUX_CH_C)
|
||||
|
||||
static enum aux_ch icl_tc_phy_aux_ch(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
static enum aux_ch icl_aux_pw_to_ch(const struct i915_power_well *power_well)
|
||||
{
|
||||
int pw_idx = power_well->desc->hsw.idx;
|
||||
|
||||
|
@ -327,6 +326,15 @@ aux_ch_to_digital_port(struct drm_i915_private *dev_priv,
|
|||
return dig_port;
|
||||
}
|
||||
|
||||
static enum phy icl_aux_pw_to_phy(struct drm_i915_private *i915,
|
||||
const struct i915_power_well *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);
|
||||
|
||||
return intel_port_to_phy(i915, dig_port->base.port);
|
||||
}
|
||||
|
||||
static void hsw_wait_for_power_well_enable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well,
|
||||
bool timeout_expected)
|
||||
|
@ -468,15 +476,13 @@ static void hsw_power_well_disable(struct drm_i915_private *dev_priv,
|
|||
hsw_wait_for_power_well_disable(dev_priv, power_well);
|
||||
}
|
||||
|
||||
#define ICL_AUX_PW_TO_PHY(pw_idx) ((pw_idx) - ICL_PW_CTL_IDX_AUX_A)
|
||||
|
||||
static void
|
||||
icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
|
||||
int pw_idx = power_well->desc->hsw.idx;
|
||||
enum phy phy = ICL_AUX_PW_TO_PHY(pw_idx);
|
||||
enum phy phy = icl_aux_pw_to_phy(dev_priv, power_well);
|
||||
u32 val;
|
||||
|
||||
drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));
|
||||
|
@ -508,7 +514,7 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
|
|||
{
|
||||
const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
|
||||
int pw_idx = power_well->desc->hsw.idx;
|
||||
enum phy phy = ICL_AUX_PW_TO_PHY(pw_idx);
|
||||
enum phy phy = icl_aux_pw_to_phy(dev_priv, power_well);
|
||||
u32 val;
|
||||
|
||||
drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));
|
||||
|
@ -595,7 +601,7 @@ static void
|
|||
icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
enum aux_ch aux_ch = icl_tc_phy_aux_ch(dev_priv, 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(dev_priv, aux_ch);
|
||||
const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
|
||||
bool is_tbt = power_well->desc->hsw.is_tc_tbt;
|
||||
|
@ -619,11 +625,9 @@ icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
|
|||
* or need to enable AUX on a legacy TypeC port as part of the TC-cold
|
||||
* exit sequence.
|
||||
*/
|
||||
timeout_expected = is_tbt;
|
||||
if (DISPLAY_VER(dev_priv) == 11 && dig_port->tc_legacy_port) {
|
||||
timeout_expected = is_tbt || intel_tc_cold_requires_aux_pw(dig_port);
|
||||
if (DISPLAY_VER(dev_priv) == 11 && dig_port->tc_legacy_port)
|
||||
icl_tc_cold_exit(dev_priv);
|
||||
timeout_expected = true;
|
||||
}
|
||||
|
||||
hsw_wait_for_power_well_enable(dev_priv, power_well, timeout_expected);
|
||||
|
||||
|
@ -645,7 +649,7 @@ static void
|
|||
icl_tc_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
enum aux_ch aux_ch = icl_tc_phy_aux_ch(dev_priv, 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(dev_priv, aux_ch);
|
||||
|
||||
icl_tc_port_assert_ref_held(dev_priv, power_well, dig_port);
|
||||
|
@ -657,11 +661,9 @@ static void
|
|||
icl_aux_power_well_enable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
int pw_idx = power_well->desc->hsw.idx;
|
||||
enum phy phy = ICL_AUX_PW_TO_PHY(pw_idx); /* non-TBT only */
|
||||
bool is_tbt = power_well->desc->hsw.is_tc_tbt;
|
||||
enum phy phy = icl_aux_pw_to_phy(dev_priv, power_well);
|
||||
|
||||
if (is_tbt || intel_phy_is_tc(dev_priv, phy))
|
||||
if (intel_phy_is_tc(dev_priv, phy))
|
||||
return icl_tc_phy_aux_power_well_enable(dev_priv, power_well);
|
||||
else if (IS_ICELAKE(dev_priv))
|
||||
return icl_combo_phy_aux_power_well_enable(dev_priv,
|
||||
|
@ -674,11 +676,9 @@ static void
|
|||
icl_aux_power_well_disable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
int pw_idx = power_well->desc->hsw.idx;
|
||||
enum phy phy = ICL_AUX_PW_TO_PHY(pw_idx); /* non-TBT only */
|
||||
bool is_tbt = power_well->desc->hsw.is_tc_tbt;
|
||||
enum phy phy = icl_aux_pw_to_phy(dev_priv, power_well);
|
||||
|
||||
if (is_tbt || intel_phy_is_tc(dev_priv, phy))
|
||||
if (intel_phy_is_tc(dev_priv, phy))
|
||||
return icl_tc_phy_aux_power_well_disable(dev_priv, power_well);
|
||||
else if (IS_ICELAKE(dev_priv))
|
||||
return icl_combo_phy_aux_power_well_disable(dev_priv,
|
||||
|
@ -829,8 +829,8 @@ static void gen9_sanitize_dc_state(struct drm_i915_private *dev_priv)
|
|||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Resetting DC state tracking from %02x to %02x\n",
|
||||
dev_priv->csr.dc_state, val);
|
||||
dev_priv->csr.dc_state = val;
|
||||
dev_priv->dmc.dc_state, val);
|
||||
dev_priv->dmc.dc_state = val;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -865,8 +865,8 @@ static void gen9_set_dc_state(struct drm_i915_private *dev_priv, u32 state)
|
|||
return;
|
||||
|
||||
if (drm_WARN_ON_ONCE(&dev_priv->drm,
|
||||
state & ~dev_priv->csr.allowed_dc_mask))
|
||||
state &= dev_priv->csr.allowed_dc_mask;
|
||||
state & ~dev_priv->dmc.allowed_dc_mask))
|
||||
state &= dev_priv->dmc.allowed_dc_mask;
|
||||
|
||||
val = intel_de_read(dev_priv, DC_STATE_EN);
|
||||
mask = gen9_dc_mask(dev_priv);
|
||||
|
@ -874,16 +874,16 @@ static void gen9_set_dc_state(struct drm_i915_private *dev_priv, u32 state)
|
|||
val & mask, state);
|
||||
|
||||
/* Check if DMC is ignoring our DC state requests */
|
||||
if ((val & mask) != dev_priv->csr.dc_state)
|
||||
if ((val & mask) != dev_priv->dmc.dc_state)
|
||||
drm_err(&dev_priv->drm, "DC state mismatch (0x%x -> 0x%x)\n",
|
||||
dev_priv->csr.dc_state, val & mask);
|
||||
dev_priv->dmc.dc_state, val & mask);
|
||||
|
||||
val &= ~mask;
|
||||
val |= state;
|
||||
|
||||
gen9_write_dc_state(dev_priv, val);
|
||||
|
||||
dev_priv->csr.dc_state = val & mask;
|
||||
dev_priv->dmc.dc_state = val & mask;
|
||||
}
|
||||
|
||||
static u32
|
||||
|
@ -902,7 +902,7 @@ sanitize_target_dc_state(struct drm_i915_private *dev_priv,
|
|||
if (target_dc_state != states[i])
|
||||
continue;
|
||||
|
||||
if (dev_priv->csr.allowed_dc_mask & target_dc_state)
|
||||
if (dev_priv->dmc.allowed_dc_mask & target_dc_state)
|
||||
break;
|
||||
|
||||
target_dc_state = states[i + 1];
|
||||
|
@ -958,15 +958,15 @@ static void bxt_disable_dc9(struct drm_i915_private *dev_priv)
|
|||
intel_pps_unlock_regs_wa(dev_priv);
|
||||
}
|
||||
|
||||
static void assert_csr_loaded(struct drm_i915_private *dev_priv)
|
||||
static void assert_dmc_loaded(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
drm_WARN_ONCE(&dev_priv->drm,
|
||||
!intel_de_read(dev_priv, CSR_PROGRAM(0)),
|
||||
"CSR program storage start is NULL\n");
|
||||
drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, CSR_SSP_BASE),
|
||||
"CSR SSP Base Not fine\n");
|
||||
drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, CSR_HTP_SKL),
|
||||
"CSR HTP Not fine\n");
|
||||
!intel_de_read(dev_priv, DMC_PROGRAM(0)),
|
||||
"DMC program storage start is NULL\n");
|
||||
drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, DMC_SSP_BASE),
|
||||
"DMC SSP Base Not fine\n");
|
||||
drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, DMC_HTP_SKL),
|
||||
"DMC HTP Not fine\n");
|
||||
}
|
||||
|
||||
static struct i915_power_well *
|
||||
|
@ -1016,7 +1016,7 @@ void intel_display_power_set_target_dc_state(struct drm_i915_private *dev_priv,
|
|||
|
||||
state = sanitize_target_dc_state(dev_priv, state);
|
||||
|
||||
if (state == dev_priv->csr.target_dc_state)
|
||||
if (state == dev_priv->dmc.target_dc_state)
|
||||
goto unlock;
|
||||
|
||||
dc_off_enabled = power_well->desc->ops->is_enabled(dev_priv,
|
||||
|
@ -1028,7 +1028,7 @@ void intel_display_power_set_target_dc_state(struct drm_i915_private *dev_priv,
|
|||
if (!dc_off_enabled)
|
||||
power_well->desc->ops->enable(dev_priv, power_well);
|
||||
|
||||
dev_priv->csr.target_dc_state = state;
|
||||
dev_priv->dmc.target_dc_state = state;
|
||||
|
||||
if (!dc_off_enabled)
|
||||
power_well->desc->ops->disable(dev_priv, power_well);
|
||||
|
@ -1057,7 +1057,7 @@ static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
|
|||
"DC5 already programmed to be enabled.\n");
|
||||
assert_rpm_wakelock_held(&dev_priv->runtime_pm);
|
||||
|
||||
assert_csr_loaded(dev_priv);
|
||||
assert_dmc_loaded(dev_priv);
|
||||
}
|
||||
|
||||
static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
|
||||
|
@ -1084,7 +1084,7 @@ static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
|
|||
DC_STATE_EN_UPTO_DC6),
|
||||
"DC6 already programmed to be enabled.\n");
|
||||
|
||||
assert_csr_loaded(dev_priv);
|
||||
assert_dmc_loaded(dev_priv);
|
||||
}
|
||||
|
||||
static void skl_enable_dc6(struct drm_i915_private *dev_priv)
|
||||
|
@ -1181,7 +1181,7 @@ static void gen9_disable_dc_states(struct drm_i915_private *dev_priv)
|
|||
{
|
||||
struct intel_cdclk_config cdclk_config = {};
|
||||
|
||||
if (dev_priv->csr.target_dc_state == DC_STATE_EN_DC3CO) {
|
||||
if (dev_priv->dmc.target_dc_state == DC_STATE_EN_DC3CO) {
|
||||
tgl_disable_dc3co(dev_priv);
|
||||
return;
|
||||
}
|
||||
|
@ -1220,10 +1220,10 @@ static void gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv,
|
|||
static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
if (!dev_priv->csr.dmc_payload)
|
||||
if (!intel_dmc_has_payload(dev_priv))
|
||||
return;
|
||||
|
||||
switch (dev_priv->csr.target_dc_state) {
|
||||
switch (dev_priv->dmc.target_dc_state) {
|
||||
case DC_STATE_EN_DC3CO:
|
||||
tgl_enable_dc3co(dev_priv);
|
||||
break;
|
||||
|
@ -2265,6 +2265,12 @@ intel_display_power_put_async_work(struct work_struct *work)
|
|||
fetch_and_zero(&power_domains->async_put_domains[1]);
|
||||
queue_async_put_domains_work(power_domains,
|
||||
fetch_and_zero(&new_work_wakeref));
|
||||
} else {
|
||||
/*
|
||||
* Cancel the work that got queued after this one got dequeued,
|
||||
* since here we released the corresponding async-put reference.
|
||||
*/
|
||||
cancel_delayed_work(&power_domains->async_put_work);
|
||||
}
|
||||
|
||||
out_verify:
|
||||
|
@ -3072,7 +3078,6 @@ intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
|
|||
BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \
|
||||
BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_D_XELPD) | \
|
||||
BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_E_XELPD) | \
|
||||
BIT_ULL(POWER_DOMAIN_AUX_C) | \
|
||||
BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \
|
||||
BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \
|
||||
BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \
|
||||
|
@ -3084,6 +3089,10 @@ intel_display_power_put_mask_in_set(struct drm_i915_private *i915,
|
|||
BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \
|
||||
BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \
|
||||
BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \
|
||||
BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \
|
||||
BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \
|
||||
BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \
|
||||
BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \
|
||||
BIT_ULL(POWER_DOMAIN_INIT))
|
||||
|
||||
/*
|
||||
|
@ -5090,10 +5099,10 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
|
|||
dev_priv->params.disable_power_well =
|
||||
sanitize_disable_power_well_option(dev_priv,
|
||||
dev_priv->params.disable_power_well);
|
||||
dev_priv->csr.allowed_dc_mask =
|
||||
dev_priv->dmc.allowed_dc_mask =
|
||||
get_allowed_dc_mask(dev_priv, dev_priv->params.enable_dc);
|
||||
|
||||
dev_priv->csr.target_dc_state =
|
||||
dev_priv->dmc.target_dc_state =
|
||||
sanitize_target_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
|
||||
|
||||
BUILD_BUG_ON(POWER_DOMAIN_NUM > 64);
|
||||
|
@ -5245,6 +5254,9 @@ static void gen12_dbuf_slices_config(struct drm_i915_private *dev_priv)
|
|||
{
|
||||
enum dbuf_slice slice;
|
||||
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
return;
|
||||
|
||||
for_each_dbuf_slice(dev_priv, slice)
|
||||
intel_de_rmw(dev_priv, DBUF_CTL_S(slice),
|
||||
DBUF_TRACKER_STATE_SERVICE_MASK,
|
||||
|
@ -5256,6 +5268,9 @@ static void icl_mbus_init(struct drm_i915_private *dev_priv)
|
|||
unsigned long abox_regs = INTEL_INFO(dev_priv)->abox_mask;
|
||||
u32 mask, val, i;
|
||||
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
return;
|
||||
|
||||
mask = MBUS_ABOX_BT_CREDIT_POOL1_MASK |
|
||||
MBUS_ABOX_BT_CREDIT_POOL2_MASK |
|
||||
MBUS_ABOX_B_CREDIT_MASK |
|
||||
|
@ -5573,8 +5588,8 @@ static void skl_display_core_init(struct drm_i915_private *dev_priv,
|
|||
|
||||
gen9_dbuf_enable(dev_priv);
|
||||
|
||||
if (resume && dev_priv->csr.dmc_payload)
|
||||
intel_csr_load_program(dev_priv);
|
||||
if (resume && intel_dmc_has_payload(dev_priv))
|
||||
intel_dmc_load_program(dev_priv);
|
||||
}
|
||||
|
||||
static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
|
||||
|
@ -5640,8 +5655,8 @@ static void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume
|
|||
|
||||
gen9_dbuf_enable(dev_priv);
|
||||
|
||||
if (resume && dev_priv->csr.dmc_payload)
|
||||
intel_csr_load_program(dev_priv);
|
||||
if (resume && intel_dmc_has_payload(dev_priv))
|
||||
intel_dmc_load_program(dev_priv);
|
||||
}
|
||||
|
||||
static void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
|
||||
|
@ -5706,8 +5721,8 @@ static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume
|
|||
/* 6. Enable DBUF */
|
||||
gen9_dbuf_enable(dev_priv);
|
||||
|
||||
if (resume && dev_priv->csr.dmc_payload)
|
||||
intel_csr_load_program(dev_priv);
|
||||
if (resume && intel_dmc_has_payload(dev_priv))
|
||||
intel_dmc_load_program(dev_priv);
|
||||
}
|
||||
|
||||
static void cnl_display_core_uninit(struct drm_i915_private *dev_priv)
|
||||
|
@ -5863,8 +5878,8 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
|
|||
if (DISPLAY_VER(dev_priv) >= 12)
|
||||
tgl_bw_buddy_init(dev_priv);
|
||||
|
||||
if (resume && dev_priv->csr.dmc_payload)
|
||||
intel_csr_load_program(dev_priv);
|
||||
if (resume && intel_dmc_has_payload(dev_priv))
|
||||
intel_dmc_load_program(dev_priv);
|
||||
|
||||
/* Wa_14011508470 */
|
||||
if (DISPLAY_VER(dev_priv) == 12) {
|
||||
|
@ -6218,13 +6233,13 @@ void intel_power_domains_suspend(struct drm_i915_private *i915,
|
|||
/*
|
||||
* In case of suspend-to-idle (aka S0ix) on a DMC platform without DC9
|
||||
* support don't manually deinit the power domains. This also means the
|
||||
* CSR/DMC firmware will stay active, it will power down any HW
|
||||
* DMC firmware will stay active, it will power down any HW
|
||||
* resources as required and also enable deeper system power states
|
||||
* that would be blocked if the firmware was inactive.
|
||||
*/
|
||||
if (!(i915->csr.allowed_dc_mask & DC_STATE_EN_DC9) &&
|
||||
if (!(i915->dmc.allowed_dc_mask & DC_STATE_EN_DC9) &&
|
||||
suspend_mode == I915_DRM_SUSPEND_IDLE &&
|
||||
i915->csr.dmc_payload) {
|
||||
intel_dmc_has_payload(i915)) {
|
||||
intel_display_power_flush_work(i915);
|
||||
intel_power_domains_verify_state(i915);
|
||||
return;
|
||||
|
@ -6414,19 +6429,19 @@ void intel_display_power_resume(struct drm_i915_private *i915)
|
|||
if (DISPLAY_VER(i915) >= 11) {
|
||||
bxt_disable_dc9(i915);
|
||||
icl_display_core_init(i915, true);
|
||||
if (i915->csr.dmc_payload) {
|
||||
if (i915->csr.allowed_dc_mask &
|
||||
if (intel_dmc_has_payload(i915)) {
|
||||
if (i915->dmc.allowed_dc_mask &
|
||||
DC_STATE_EN_UPTO_DC6)
|
||||
skl_enable_dc6(i915);
|
||||
else if (i915->csr.allowed_dc_mask &
|
||||
else if (i915->dmc.allowed_dc_mask &
|
||||
DC_STATE_EN_UPTO_DC5)
|
||||
gen9_enable_dc5(i915);
|
||||
}
|
||||
} else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) {
|
||||
bxt_disable_dc9(i915);
|
||||
bxt_display_core_init(i915, true);
|
||||
if (i915->csr.dmc_payload &&
|
||||
(i915->csr.allowed_dc_mask & DC_STATE_EN_UPTO_DC5))
|
||||
if (intel_dmc_has_payload(i915) &&
|
||||
(i915->dmc.allowed_dc_mask & DC_STATE_EN_UPTO_DC5))
|
||||
gen9_enable_dc5(i915);
|
||||
} else if (IS_HASWELL(i915) || IS_BROADWELL(i915)) {
|
||||
hsw_disable_pc8(i915);
|
||||
|
|
|
@ -1202,7 +1202,7 @@ struct intel_crtc_state {
|
|||
struct {
|
||||
bool enable;
|
||||
u8 pipeline_full;
|
||||
u16 flipline, vmin, vmax;
|
||||
u16 flipline, vmin, vmax, guardband;
|
||||
} vrr;
|
||||
|
||||
/* Stream Splitter for eDP MSO */
|
||||
|
@ -1482,6 +1482,7 @@ struct intel_psr {
|
|||
bool sink_support;
|
||||
bool source_support;
|
||||
bool enabled;
|
||||
bool paused;
|
||||
enum pipe pipe;
|
||||
enum transcoder transcoder;
|
||||
bool active;
|
||||
|
@ -1498,7 +1499,7 @@ struct intel_psr {
|
|||
bool sink_not_reliable;
|
||||
bool irq_aux_error;
|
||||
u16 su_x_granularity;
|
||||
bool dc3co_enabled;
|
||||
u32 dc3co_exitline;
|
||||
u32 dc3co_exit_delay;
|
||||
struct delayed_work dc3co_work;
|
||||
struct drm_dp_vsc_sdp vsc;
|
||||
|
|
|
@ -26,14 +26,13 @@
|
|||
|
||||
#include "i915_drv.h"
|
||||
#include "i915_reg.h"
|
||||
#include "intel_csr.h"
|
||||
#include "intel_de.h"
|
||||
#include "intel_dmc.h"
|
||||
|
||||
/**
|
||||
* DOC: csr support for dmc
|
||||
* DOC: DMC Firmware Support
|
||||
*
|
||||
* Display Context Save and Restore (CSR) firmware support added from gen9
|
||||
* onwards to drive newly added DMC (Display microcontroller) in display
|
||||
* From gen9 onwards we have newly added DMC (Display microcontroller) in display
|
||||
* engine to save and restore the state of display engine when it enter into
|
||||
* low-power state and comes back to normal.
|
||||
*/
|
||||
|
@ -44,55 +43,55 @@
|
|||
__stringify(major) "_" \
|
||||
__stringify(minor) ".bin"
|
||||
|
||||
#define GEN12_CSR_MAX_FW_SIZE ICL_CSR_MAX_FW_SIZE
|
||||
#define GEN12_DMC_MAX_FW_SIZE ICL_DMC_MAX_FW_SIZE
|
||||
|
||||
#define ADLS_CSR_PATH DMC_PATH(adls, 2, 01)
|
||||
#define ADLS_CSR_VERSION_REQUIRED CSR_VERSION(2, 1)
|
||||
MODULE_FIRMWARE(ADLS_CSR_PATH);
|
||||
#define ADLS_DMC_PATH DMC_PATH(adls, 2, 01)
|
||||
#define ADLS_DMC_VERSION_REQUIRED DMC_VERSION(2, 1)
|
||||
MODULE_FIRMWARE(ADLS_DMC_PATH);
|
||||
|
||||
#define DG1_CSR_PATH DMC_PATH(dg1, 2, 02)
|
||||
#define DG1_CSR_VERSION_REQUIRED CSR_VERSION(2, 2)
|
||||
MODULE_FIRMWARE(DG1_CSR_PATH);
|
||||
#define DG1_DMC_PATH DMC_PATH(dg1, 2, 02)
|
||||
#define DG1_DMC_VERSION_REQUIRED DMC_VERSION(2, 2)
|
||||
MODULE_FIRMWARE(DG1_DMC_PATH);
|
||||
|
||||
#define RKL_CSR_PATH DMC_PATH(rkl, 2, 02)
|
||||
#define RKL_CSR_VERSION_REQUIRED CSR_VERSION(2, 2)
|
||||
MODULE_FIRMWARE(RKL_CSR_PATH);
|
||||
#define RKL_DMC_PATH DMC_PATH(rkl, 2, 02)
|
||||
#define RKL_DMC_VERSION_REQUIRED DMC_VERSION(2, 2)
|
||||
MODULE_FIRMWARE(RKL_DMC_PATH);
|
||||
|
||||
#define TGL_CSR_PATH DMC_PATH(tgl, 2, 08)
|
||||
#define TGL_CSR_VERSION_REQUIRED CSR_VERSION(2, 8)
|
||||
MODULE_FIRMWARE(TGL_CSR_PATH);
|
||||
#define TGL_DMC_PATH DMC_PATH(tgl, 2, 08)
|
||||
#define TGL_DMC_VERSION_REQUIRED DMC_VERSION(2, 8)
|
||||
MODULE_FIRMWARE(TGL_DMC_PATH);
|
||||
|
||||
#define ICL_CSR_PATH DMC_PATH(icl, 1, 09)
|
||||
#define ICL_CSR_VERSION_REQUIRED CSR_VERSION(1, 9)
|
||||
#define ICL_CSR_MAX_FW_SIZE 0x6000
|
||||
MODULE_FIRMWARE(ICL_CSR_PATH);
|
||||
#define ICL_DMC_PATH DMC_PATH(icl, 1, 09)
|
||||
#define ICL_DMC_VERSION_REQUIRED DMC_VERSION(1, 9)
|
||||
#define ICL_DMC_MAX_FW_SIZE 0x6000
|
||||
MODULE_FIRMWARE(ICL_DMC_PATH);
|
||||
|
||||
#define CNL_CSR_PATH DMC_PATH(cnl, 1, 07)
|
||||
#define CNL_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
|
||||
#define CNL_CSR_MAX_FW_SIZE GLK_CSR_MAX_FW_SIZE
|
||||
MODULE_FIRMWARE(CNL_CSR_PATH);
|
||||
#define CNL_DMC_PATH DMC_PATH(cnl, 1, 07)
|
||||
#define CNL_DMC_VERSION_REQUIRED DMC_VERSION(1, 7)
|
||||
#define CNL_DMC_MAX_FW_SIZE GLK_DMC_MAX_FW_SIZE
|
||||
MODULE_FIRMWARE(CNL_DMC_PATH);
|
||||
|
||||
#define GLK_CSR_PATH DMC_PATH(glk, 1, 04)
|
||||
#define GLK_CSR_VERSION_REQUIRED CSR_VERSION(1, 4)
|
||||
#define GLK_CSR_MAX_FW_SIZE 0x4000
|
||||
MODULE_FIRMWARE(GLK_CSR_PATH);
|
||||
#define GLK_DMC_PATH DMC_PATH(glk, 1, 04)
|
||||
#define GLK_DMC_VERSION_REQUIRED DMC_VERSION(1, 4)
|
||||
#define GLK_DMC_MAX_FW_SIZE 0x4000
|
||||
MODULE_FIRMWARE(GLK_DMC_PATH);
|
||||
|
||||
#define KBL_CSR_PATH DMC_PATH(kbl, 1, 04)
|
||||
#define KBL_CSR_VERSION_REQUIRED CSR_VERSION(1, 4)
|
||||
#define KBL_CSR_MAX_FW_SIZE BXT_CSR_MAX_FW_SIZE
|
||||
MODULE_FIRMWARE(KBL_CSR_PATH);
|
||||
#define KBL_DMC_PATH DMC_PATH(kbl, 1, 04)
|
||||
#define KBL_DMC_VERSION_REQUIRED DMC_VERSION(1, 4)
|
||||
#define KBL_DMC_MAX_FW_SIZE BXT_DMC_MAX_FW_SIZE
|
||||
MODULE_FIRMWARE(KBL_DMC_PATH);
|
||||
|
||||
#define SKL_CSR_PATH DMC_PATH(skl, 1, 27)
|
||||
#define SKL_CSR_VERSION_REQUIRED CSR_VERSION(1, 27)
|
||||
#define SKL_CSR_MAX_FW_SIZE BXT_CSR_MAX_FW_SIZE
|
||||
MODULE_FIRMWARE(SKL_CSR_PATH);
|
||||
#define SKL_DMC_PATH DMC_PATH(skl, 1, 27)
|
||||
#define SKL_DMC_VERSION_REQUIRED DMC_VERSION(1, 27)
|
||||
#define SKL_DMC_MAX_FW_SIZE BXT_DMC_MAX_FW_SIZE
|
||||
MODULE_FIRMWARE(SKL_DMC_PATH);
|
||||
|
||||
#define BXT_CSR_PATH DMC_PATH(bxt, 1, 07)
|
||||
#define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
|
||||
#define BXT_CSR_MAX_FW_SIZE 0x3000
|
||||
MODULE_FIRMWARE(BXT_CSR_PATH);
|
||||
#define BXT_DMC_PATH DMC_PATH(bxt, 1, 07)
|
||||
#define BXT_DMC_VERSION_REQUIRED DMC_VERSION(1, 7)
|
||||
#define BXT_DMC_MAX_FW_SIZE 0x3000
|
||||
MODULE_FIRMWARE(BXT_DMC_PATH);
|
||||
|
||||
#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF
|
||||
#define DMC_DEFAULT_FW_OFFSET 0xFFFFFFFF
|
||||
#define PACKAGE_MAX_FW_INFO_ENTRIES 20
|
||||
#define PACKAGE_V2_MAX_FW_INFO_ENTRIES 32
|
||||
#define DMC_V1_MAX_MMIO_COUNT 8
|
||||
|
@ -238,6 +237,11 @@ struct stepping_info {
|
|||
char substepping;
|
||||
};
|
||||
|
||||
bool intel_dmc_has_payload(struct drm_i915_private *i915)
|
||||
{
|
||||
return i915->dmc.dmc_payload;
|
||||
}
|
||||
|
||||
static const struct stepping_info skl_stepping_info[] = {
|
||||
{'A', '0'}, {'B', '0'}, {'C', '0'},
|
||||
{'D', '0'}, {'E', '0'}, {'F', '0'},
|
||||
|
@ -303,47 +307,47 @@ static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv)
|
|||
}
|
||||
|
||||
/**
|
||||
* intel_csr_load_program() - write the firmware from memory to register.
|
||||
* intel_dmc_load_program() - write the firmware from memory to register.
|
||||
* @dev_priv: i915 drm device.
|
||||
*
|
||||
* CSR firmware is read from a .bin file and kept in internal memory one time.
|
||||
* DMC firmware is read from a .bin file and kept in internal memory one time.
|
||||
* Everytime display comes back from low power state this function is called to
|
||||
* copy the firmware from internal memory to registers.
|
||||
*/
|
||||
void intel_csr_load_program(struct drm_i915_private *dev_priv)
|
||||
void intel_dmc_load_program(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
u32 *payload = dev_priv->csr.dmc_payload;
|
||||
u32 *payload = dev_priv->dmc.dmc_payload;
|
||||
u32 i, fw_size;
|
||||
|
||||
if (!HAS_CSR(dev_priv)) {
|
||||
if (!HAS_DMC(dev_priv)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"No CSR support available for this platform\n");
|
||||
"No DMC support available for this platform\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!dev_priv->csr.dmc_payload) {
|
||||
if (!intel_dmc_has_payload(dev_priv)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Tried to program CSR with empty payload\n");
|
||||
return;
|
||||
}
|
||||
|
||||
fw_size = dev_priv->csr.dmc_fw_size;
|
||||
fw_size = dev_priv->dmc.dmc_fw_size;
|
||||
assert_rpm_wakelock_held(&dev_priv->runtime_pm);
|
||||
|
||||
preempt_disable();
|
||||
|
||||
for (i = 0; i < fw_size; i++)
|
||||
intel_uncore_write_fw(&dev_priv->uncore, CSR_PROGRAM(i),
|
||||
intel_uncore_write_fw(&dev_priv->uncore, DMC_PROGRAM(i),
|
||||
payload[i]);
|
||||
|
||||
preempt_enable();
|
||||
|
||||
for (i = 0; i < dev_priv->csr.mmio_count; i++) {
|
||||
intel_de_write(dev_priv, dev_priv->csr.mmioaddr[i],
|
||||
dev_priv->csr.mmiodata[i]);
|
||||
for (i = 0; i < dev_priv->dmc.mmio_count; i++) {
|
||||
intel_de_write(dev_priv, dev_priv->dmc.mmioaddr[i],
|
||||
dev_priv->dmc.mmiodata[i]);
|
||||
}
|
||||
|
||||
dev_priv->csr.dc_state = 0;
|
||||
dev_priv->dmc.dc_state = 0;
|
||||
|
||||
gen9_set_dc_state_debugmask(dev_priv);
|
||||
}
|
||||
|
@ -357,7 +361,7 @@ static u32 find_dmc_fw_offset(const struct intel_fw_info *fw_info,
|
|||
const struct stepping_info *si,
|
||||
u8 package_ver)
|
||||
{
|
||||
u32 dmc_offset = CSR_DEFAULT_FW_OFFSET;
|
||||
u32 dmc_offset = DMC_DEFAULT_FW_OFFSET;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < num_entries; i++) {
|
||||
|
@ -392,17 +396,18 @@ static u32 find_dmc_fw_offset(const struct intel_fw_info *fw_info,
|
|||
return dmc_offset;
|
||||
}
|
||||
|
||||
static u32 parse_csr_fw_dmc(struct intel_csr *csr,
|
||||
const struct intel_dmc_header_base *dmc_header,
|
||||
size_t rem_size)
|
||||
static u32 parse_dmc_fw_header(struct intel_dmc *dmc,
|
||||
const struct intel_dmc_header_base *dmc_header,
|
||||
size_t rem_size)
|
||||
{
|
||||
struct drm_i915_private *i915 = container_of(dmc, typeof(*i915), dmc);
|
||||
unsigned int header_len_bytes, dmc_header_size, payload_size, i;
|
||||
const u32 *mmioaddr, *mmiodata;
|
||||
u32 mmio_count, mmio_count_max;
|
||||
u8 *payload;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(csr->mmioaddr) < DMC_V3_MAX_MMIO_COUNT ||
|
||||
ARRAY_SIZE(csr->mmioaddr) < DMC_V1_MAX_MMIO_COUNT);
|
||||
BUILD_BUG_ON(ARRAY_SIZE(dmc->mmioaddr) < DMC_V3_MAX_MMIO_COUNT ||
|
||||
ARRAY_SIZE(dmc->mmioaddr) < DMC_V1_MAX_MMIO_COUNT);
|
||||
|
||||
/*
|
||||
* Check if we can access common fields, we will checkc again below
|
||||
|
@ -440,34 +445,34 @@ static u32 parse_csr_fw_dmc(struct intel_csr *csr,
|
|||
header_len_bytes = dmc_header->header_len;
|
||||
dmc_header_size = sizeof(*v1);
|
||||
} else {
|
||||
DRM_ERROR("Unknown DMC fw header version: %u\n",
|
||||
dmc_header->header_ver);
|
||||
drm_err(&i915->drm, "Unknown DMC fw header version: %u\n",
|
||||
dmc_header->header_ver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (header_len_bytes != dmc_header_size) {
|
||||
DRM_ERROR("DMC firmware has wrong dmc header length "
|
||||
"(%u bytes)\n", header_len_bytes);
|
||||
drm_err(&i915->drm, "DMC firmware has wrong dmc header length "
|
||||
"(%u bytes)\n", header_len_bytes);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Cache the dmc header info. */
|
||||
if (mmio_count > mmio_count_max) {
|
||||
DRM_ERROR("DMC firmware has wrong mmio count %u\n", mmio_count);
|
||||
drm_err(&i915->drm, "DMC firmware has wrong mmio count %u\n", mmio_count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < mmio_count; i++) {
|
||||
if (mmioaddr[i] < CSR_MMIO_START_RANGE ||
|
||||
mmioaddr[i] > CSR_MMIO_END_RANGE) {
|
||||
DRM_ERROR("DMC firmware has wrong mmio address 0x%x\n",
|
||||
mmioaddr[i]);
|
||||
if (mmioaddr[i] < DMC_MMIO_START_RANGE ||
|
||||
mmioaddr[i] > DMC_MMIO_END_RANGE) {
|
||||
drm_err(&i915->drm, "DMC firmware has wrong mmio address 0x%x\n",
|
||||
mmioaddr[i]);
|
||||
return 0;
|
||||
}
|
||||
csr->mmioaddr[i] = _MMIO(mmioaddr[i]);
|
||||
csr->mmiodata[i] = mmiodata[i];
|
||||
dmc->mmioaddr[i] = _MMIO(mmioaddr[i]);
|
||||
dmc->mmiodata[i] = mmiodata[i];
|
||||
}
|
||||
csr->mmio_count = mmio_count;
|
||||
dmc->mmio_count = mmio_count;
|
||||
|
||||
rem_size -= header_len_bytes;
|
||||
|
||||
|
@ -476,34 +481,33 @@ static u32 parse_csr_fw_dmc(struct intel_csr *csr,
|
|||
if (rem_size < payload_size)
|
||||
goto error_truncated;
|
||||
|
||||
if (payload_size > csr->max_fw_size) {
|
||||
DRM_ERROR("DMC FW too big (%u bytes)\n", payload_size);
|
||||
if (payload_size > dmc->max_fw_size) {
|
||||
drm_err(&i915->drm, "DMC FW too big (%u bytes)\n", payload_size);
|
||||
return 0;
|
||||
}
|
||||
csr->dmc_fw_size = dmc_header->fw_size;
|
||||
dmc->dmc_fw_size = dmc_header->fw_size;
|
||||
|
||||
csr->dmc_payload = kmalloc(payload_size, GFP_KERNEL);
|
||||
if (!csr->dmc_payload) {
|
||||
DRM_ERROR("Memory allocation failed for dmc payload\n");
|
||||
dmc->dmc_payload = kmalloc(payload_size, GFP_KERNEL);
|
||||
if (!dmc->dmc_payload)
|
||||
return 0;
|
||||
}
|
||||
|
||||
payload = (u8 *)(dmc_header) + header_len_bytes;
|
||||
memcpy(csr->dmc_payload, payload, payload_size);
|
||||
memcpy(dmc->dmc_payload, payload, payload_size);
|
||||
|
||||
return header_len_bytes + payload_size;
|
||||
|
||||
error_truncated:
|
||||
DRM_ERROR("Truncated DMC firmware, refusing.\n");
|
||||
drm_err(&i915->drm, "Truncated DMC firmware, refusing.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32
|
||||
parse_csr_fw_package(struct intel_csr *csr,
|
||||
parse_dmc_fw_package(struct intel_dmc *dmc,
|
||||
const struct intel_package_header *package_header,
|
||||
const struct stepping_info *si,
|
||||
size_t rem_size)
|
||||
{
|
||||
struct drm_i915_private *i915 = container_of(dmc, typeof(*i915), dmc);
|
||||
u32 package_size = sizeof(struct intel_package_header);
|
||||
u32 num_entries, max_entries, dmc_offset;
|
||||
const struct intel_fw_info *fw_info;
|
||||
|
@ -516,8 +520,8 @@ parse_csr_fw_package(struct intel_csr *csr,
|
|||
} else if (package_header->header_ver == 2) {
|
||||
max_entries = PACKAGE_V2_MAX_FW_INFO_ENTRIES;
|
||||
} else {
|
||||
DRM_ERROR("DMC firmware has unknown header version %u\n",
|
||||
package_header->header_ver);
|
||||
drm_err(&i915->drm, "DMC firmware has unknown header version %u\n",
|
||||
package_header->header_ver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -530,8 +534,8 @@ parse_csr_fw_package(struct intel_csr *csr,
|
|||
goto error_truncated;
|
||||
|
||||
if (package_header->header_len * 4 != package_size) {
|
||||
DRM_ERROR("DMC firmware has wrong package header length "
|
||||
"(%u bytes)\n", package_size);
|
||||
drm_err(&i915->drm, "DMC firmware has wrong package header length "
|
||||
"(%u bytes)\n", package_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -543,9 +547,9 @@ parse_csr_fw_package(struct intel_csr *csr,
|
|||
((u8 *)package_header + sizeof(*package_header));
|
||||
dmc_offset = find_dmc_fw_offset(fw_info, num_entries, si,
|
||||
package_header->header_ver);
|
||||
if (dmc_offset == CSR_DEFAULT_FW_OFFSET) {
|
||||
DRM_ERROR("DMC firmware not supported for %c stepping\n",
|
||||
si->stepping);
|
||||
if (dmc_offset == DMC_DEFAULT_FW_OFFSET) {
|
||||
drm_err(&i915->drm, "DMC firmware not supported for %c stepping\n",
|
||||
si->stepping);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -553,51 +557,53 @@ parse_csr_fw_package(struct intel_csr *csr,
|
|||
return package_size + dmc_offset * 4;
|
||||
|
||||
error_truncated:
|
||||
DRM_ERROR("Truncated DMC firmware, refusing.\n");
|
||||
drm_err(&i915->drm, "Truncated DMC firmware, refusing.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return number of bytes parsed or 0 on error */
|
||||
static u32 parse_csr_fw_css(struct intel_csr *csr,
|
||||
static u32 parse_dmc_fw_css(struct intel_dmc *dmc,
|
||||
struct intel_css_header *css_header,
|
||||
size_t rem_size)
|
||||
{
|
||||
struct drm_i915_private *i915 = container_of(dmc, typeof(*i915), dmc);
|
||||
|
||||
if (rem_size < sizeof(struct intel_css_header)) {
|
||||
DRM_ERROR("Truncated DMC firmware, refusing.\n");
|
||||
drm_err(&i915->drm, "Truncated DMC firmware, refusing.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sizeof(struct intel_css_header) !=
|
||||
(css_header->header_len * 4)) {
|
||||
DRM_ERROR("DMC firmware has wrong CSS header length "
|
||||
"(%u bytes)\n",
|
||||
(css_header->header_len * 4));
|
||||
drm_err(&i915->drm, "DMC firmware has wrong CSS header length "
|
||||
"(%u bytes)\n",
|
||||
(css_header->header_len * 4));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (csr->required_version &&
|
||||
css_header->version != csr->required_version) {
|
||||
DRM_INFO("Refusing to load DMC firmware v%u.%u,"
|
||||
if (dmc->required_version &&
|
||||
css_header->version != dmc->required_version) {
|
||||
drm_info(&i915->drm, "Refusing to load DMC firmware v%u.%u,"
|
||||
" please use v%u.%u\n",
|
||||
CSR_VERSION_MAJOR(css_header->version),
|
||||
CSR_VERSION_MINOR(css_header->version),
|
||||
CSR_VERSION_MAJOR(csr->required_version),
|
||||
CSR_VERSION_MINOR(csr->required_version));
|
||||
DMC_VERSION_MAJOR(css_header->version),
|
||||
DMC_VERSION_MINOR(css_header->version),
|
||||
DMC_VERSION_MAJOR(dmc->required_version),
|
||||
DMC_VERSION_MINOR(dmc->required_version));
|
||||
return 0;
|
||||
}
|
||||
|
||||
csr->version = css_header->version;
|
||||
dmc->version = css_header->version;
|
||||
|
||||
return sizeof(struct intel_css_header);
|
||||
}
|
||||
|
||||
static void parse_csr_fw(struct drm_i915_private *dev_priv,
|
||||
static void parse_dmc_fw(struct drm_i915_private *dev_priv,
|
||||
const struct firmware *fw)
|
||||
{
|
||||
struct intel_css_header *css_header;
|
||||
struct intel_package_header *package_header;
|
||||
struct intel_dmc_header_base *dmc_header;
|
||||
struct intel_csr *csr = &dev_priv->csr;
|
||||
struct intel_dmc *dmc = &dev_priv->dmc;
|
||||
const struct stepping_info *si = intel_get_stepping_info(dev_priv);
|
||||
u32 readcount = 0;
|
||||
u32 r;
|
||||
|
@ -607,7 +613,7 @@ static void parse_csr_fw(struct drm_i915_private *dev_priv,
|
|||
|
||||
/* Extract CSS Header information */
|
||||
css_header = (struct intel_css_header *)fw->data;
|
||||
r = parse_csr_fw_css(csr, css_header, fw->size);
|
||||
r = parse_dmc_fw_css(dmc, css_header, fw->size);
|
||||
if (!r)
|
||||
return;
|
||||
|
||||
|
@ -615,7 +621,7 @@ static void parse_csr_fw(struct drm_i915_private *dev_priv,
|
|||
|
||||
/* Extract Package Header information */
|
||||
package_header = (struct intel_package_header *)&fw->data[readcount];
|
||||
r = parse_csr_fw_package(csr, package_header, si, fw->size - readcount);
|
||||
r = parse_dmc_fw_package(dmc, package_header, si, fw->size - readcount);
|
||||
if (!r)
|
||||
return;
|
||||
|
||||
|
@ -623,49 +629,49 @@ static void parse_csr_fw(struct drm_i915_private *dev_priv,
|
|||
|
||||
/* Extract dmc_header information */
|
||||
dmc_header = (struct intel_dmc_header_base *)&fw->data[readcount];
|
||||
parse_csr_fw_dmc(csr, dmc_header, fw->size - readcount);
|
||||
parse_dmc_fw_header(dmc, dmc_header, fw->size - readcount);
|
||||
}
|
||||
|
||||
static void intel_csr_runtime_pm_get(struct drm_i915_private *dev_priv)
|
||||
static void intel_dmc_runtime_pm_get(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
drm_WARN_ON(&dev_priv->drm, dev_priv->csr.wakeref);
|
||||
dev_priv->csr.wakeref =
|
||||
drm_WARN_ON(&dev_priv->drm, dev_priv->dmc.wakeref);
|
||||
dev_priv->dmc.wakeref =
|
||||
intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
|
||||
}
|
||||
|
||||
static void intel_csr_runtime_pm_put(struct drm_i915_private *dev_priv)
|
||||
static void intel_dmc_runtime_pm_put(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
intel_wakeref_t wakeref __maybe_unused =
|
||||
fetch_and_zero(&dev_priv->csr.wakeref);
|
||||
fetch_and_zero(&dev_priv->dmc.wakeref);
|
||||
|
||||
intel_display_power_put(dev_priv, POWER_DOMAIN_INIT, wakeref);
|
||||
}
|
||||
|
||||
static void csr_load_work_fn(struct work_struct *work)
|
||||
static void dmc_load_work_fn(struct work_struct *work)
|
||||
{
|
||||
struct drm_i915_private *dev_priv;
|
||||
struct intel_csr *csr;
|
||||
struct intel_dmc *dmc;
|
||||
const struct firmware *fw = NULL;
|
||||
|
||||
dev_priv = container_of(work, typeof(*dev_priv), csr.work);
|
||||
csr = &dev_priv->csr;
|
||||
dev_priv = container_of(work, typeof(*dev_priv), dmc.work);
|
||||
dmc = &dev_priv->dmc;
|
||||
|
||||
request_firmware(&fw, dev_priv->csr.fw_path, dev_priv->drm.dev);
|
||||
parse_csr_fw(dev_priv, fw);
|
||||
request_firmware(&fw, dev_priv->dmc.fw_path, dev_priv->drm.dev);
|
||||
parse_dmc_fw(dev_priv, fw);
|
||||
|
||||
if (dev_priv->csr.dmc_payload) {
|
||||
intel_csr_load_program(dev_priv);
|
||||
intel_csr_runtime_pm_put(dev_priv);
|
||||
if (intel_dmc_has_payload(dev_priv)) {
|
||||
intel_dmc_load_program(dev_priv);
|
||||
intel_dmc_runtime_pm_put(dev_priv);
|
||||
|
||||
drm_info(&dev_priv->drm,
|
||||
"Finished loading DMC firmware %s (v%u.%u)\n",
|
||||
dev_priv->csr.fw_path, CSR_VERSION_MAJOR(csr->version),
|
||||
CSR_VERSION_MINOR(csr->version));
|
||||
dev_priv->dmc.fw_path, DMC_VERSION_MAJOR(dmc->version),
|
||||
DMC_VERSION_MINOR(dmc->version));
|
||||
} else {
|
||||
drm_notice(&dev_priv->drm,
|
||||
"Failed to load DMC firmware %s."
|
||||
" Disabling runtime power management.\n",
|
||||
csr->fw_path);
|
||||
dmc->fw_path);
|
||||
drm_notice(&dev_priv->drm, "DMC firmware homepage: %s",
|
||||
INTEL_UC_FIRMWARE_URL);
|
||||
}
|
||||
|
@ -674,152 +680,152 @@ static void csr_load_work_fn(struct work_struct *work)
|
|||
}
|
||||
|
||||
/**
|
||||
* intel_csr_ucode_init() - initialize the firmware loading.
|
||||
* intel_dmc_ucode_init() - initialize the firmware loading.
|
||||
* @dev_priv: i915 drm device.
|
||||
*
|
||||
* This function is called at the time of loading the display driver to read
|
||||
* firmware from a .bin file and copied into a internal memory.
|
||||
*/
|
||||
void intel_csr_ucode_init(struct drm_i915_private *dev_priv)
|
||||
void intel_dmc_ucode_init(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct intel_csr *csr = &dev_priv->csr;
|
||||
struct intel_dmc *dmc = &dev_priv->dmc;
|
||||
|
||||
INIT_WORK(&dev_priv->csr.work, csr_load_work_fn);
|
||||
INIT_WORK(&dev_priv->dmc.work, dmc_load_work_fn);
|
||||
|
||||
if (!HAS_CSR(dev_priv))
|
||||
if (!HAS_DMC(dev_priv))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Obtain a runtime pm reference, until CSR is loaded, to avoid entering
|
||||
* Obtain a runtime pm reference, until DMC is loaded, to avoid entering
|
||||
* runtime-suspend.
|
||||
*
|
||||
* On error, we return with the rpm wakeref held to prevent runtime
|
||||
* suspend as runtime suspend *requires* a working CSR for whatever
|
||||
* suspend as runtime suspend *requires* a working DMC for whatever
|
||||
* reason.
|
||||
*/
|
||||
intel_csr_runtime_pm_get(dev_priv);
|
||||
intel_dmc_runtime_pm_get(dev_priv);
|
||||
|
||||
if (IS_ALDERLAKE_S(dev_priv)) {
|
||||
csr->fw_path = ADLS_CSR_PATH;
|
||||
csr->required_version = ADLS_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = GEN12_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = ADLS_DMC_PATH;
|
||||
dmc->required_version = ADLS_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = GEN12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_DG1(dev_priv)) {
|
||||
csr->fw_path = DG1_CSR_PATH;
|
||||
csr->required_version = DG1_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = GEN12_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = DG1_DMC_PATH;
|
||||
dmc->required_version = DG1_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = GEN12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_ROCKETLAKE(dev_priv)) {
|
||||
csr->fw_path = RKL_CSR_PATH;
|
||||
csr->required_version = RKL_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = GEN12_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = RKL_DMC_PATH;
|
||||
dmc->required_version = RKL_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = GEN12_DMC_MAX_FW_SIZE;
|
||||
} else if (DISPLAY_VER(dev_priv) >= 12) {
|
||||
csr->fw_path = TGL_CSR_PATH;
|
||||
csr->required_version = TGL_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = GEN12_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = TGL_DMC_PATH;
|
||||
dmc->required_version = TGL_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = GEN12_DMC_MAX_FW_SIZE;
|
||||
} else if (DISPLAY_VER(dev_priv) == 11) {
|
||||
csr->fw_path = ICL_CSR_PATH;
|
||||
csr->required_version = ICL_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = ICL_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = ICL_DMC_PATH;
|
||||
dmc->required_version = ICL_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = ICL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_CANNONLAKE(dev_priv)) {
|
||||
csr->fw_path = CNL_CSR_PATH;
|
||||
csr->required_version = CNL_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = CNL_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = CNL_DMC_PATH;
|
||||
dmc->required_version = CNL_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = CNL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_GEMINILAKE(dev_priv)) {
|
||||
csr->fw_path = GLK_CSR_PATH;
|
||||
csr->required_version = GLK_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = GLK_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = GLK_DMC_PATH;
|
||||
dmc->required_version = GLK_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = GLK_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_KABYLAKE(dev_priv) ||
|
||||
IS_COFFEELAKE(dev_priv) ||
|
||||
IS_COMETLAKE(dev_priv)) {
|
||||
csr->fw_path = KBL_CSR_PATH;
|
||||
csr->required_version = KBL_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = KBL_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = KBL_DMC_PATH;
|
||||
dmc->required_version = KBL_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = KBL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_SKYLAKE(dev_priv)) {
|
||||
csr->fw_path = SKL_CSR_PATH;
|
||||
csr->required_version = SKL_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = SKL_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = SKL_DMC_PATH;
|
||||
dmc->required_version = SKL_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = SKL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_BROXTON(dev_priv)) {
|
||||
csr->fw_path = BXT_CSR_PATH;
|
||||
csr->required_version = BXT_CSR_VERSION_REQUIRED;
|
||||
csr->max_fw_size = BXT_CSR_MAX_FW_SIZE;
|
||||
dmc->fw_path = BXT_DMC_PATH;
|
||||
dmc->required_version = BXT_DMC_VERSION_REQUIRED;
|
||||
dmc->max_fw_size = BXT_DMC_MAX_FW_SIZE;
|
||||
}
|
||||
|
||||
if (dev_priv->params.dmc_firmware_path) {
|
||||
if (strlen(dev_priv->params.dmc_firmware_path) == 0) {
|
||||
csr->fw_path = NULL;
|
||||
dmc->fw_path = NULL;
|
||||
drm_info(&dev_priv->drm,
|
||||
"Disabling CSR firmware and runtime PM\n");
|
||||
"Disabling DMC firmware and runtime PM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
csr->fw_path = dev_priv->params.dmc_firmware_path;
|
||||
dmc->fw_path = dev_priv->params.dmc_firmware_path;
|
||||
/* Bypass version check for firmware override. */
|
||||
csr->required_version = 0;
|
||||
dmc->required_version = 0;
|
||||
}
|
||||
|
||||
if (csr->fw_path == NULL) {
|
||||
if (!dmc->fw_path) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"No known CSR firmware for platform, disabling runtime PM\n");
|
||||
"No known DMC firmware for platform, disabling runtime PM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Loading %s\n", csr->fw_path);
|
||||
schedule_work(&dev_priv->csr.work);
|
||||
drm_dbg_kms(&dev_priv->drm, "Loading %s\n", dmc->fw_path);
|
||||
schedule_work(&dev_priv->dmc.work);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_csr_ucode_suspend() - prepare CSR firmware before system suspend
|
||||
* intel_dmc_ucode_suspend() - prepare DMC firmware before system suspend
|
||||
* @dev_priv: i915 drm device
|
||||
*
|
||||
* Prepare the DMC firmware before entering system suspend. This includes
|
||||
* flushing pending work items and releasing any resources acquired during
|
||||
* init.
|
||||
*/
|
||||
void intel_csr_ucode_suspend(struct drm_i915_private *dev_priv)
|
||||
void intel_dmc_ucode_suspend(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
if (!HAS_CSR(dev_priv))
|
||||
if (!HAS_DMC(dev_priv))
|
||||
return;
|
||||
|
||||
flush_work(&dev_priv->csr.work);
|
||||
flush_work(&dev_priv->dmc.work);
|
||||
|
||||
/* Drop the reference held in case DMC isn't loaded. */
|
||||
if (!dev_priv->csr.dmc_payload)
|
||||
intel_csr_runtime_pm_put(dev_priv);
|
||||
if (!intel_dmc_has_payload(dev_priv))
|
||||
intel_dmc_runtime_pm_put(dev_priv);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_csr_ucode_resume() - init CSR firmware during system resume
|
||||
* intel_dmc_ucode_resume() - init DMC firmware during system resume
|
||||
* @dev_priv: i915 drm device
|
||||
*
|
||||
* Reinitialize the DMC firmware during system resume, reacquiring any
|
||||
* resources released in intel_csr_ucode_suspend().
|
||||
* resources released in intel_dmc_ucode_suspend().
|
||||
*/
|
||||
void intel_csr_ucode_resume(struct drm_i915_private *dev_priv)
|
||||
void intel_dmc_ucode_resume(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
if (!HAS_CSR(dev_priv))
|
||||
if (!HAS_DMC(dev_priv))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Reacquire the reference to keep RPM disabled in case DMC isn't
|
||||
* loaded.
|
||||
*/
|
||||
if (!dev_priv->csr.dmc_payload)
|
||||
intel_csr_runtime_pm_get(dev_priv);
|
||||
if (!intel_dmc_has_payload(dev_priv))
|
||||
intel_dmc_runtime_pm_get(dev_priv);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_csr_ucode_fini() - unload the CSR firmware.
|
||||
* intel_dmc_ucode_fini() - unload the DMC firmware.
|
||||
* @dev_priv: i915 drm device.
|
||||
*
|
||||
* Firmmware unloading includes freeing the internal memory and reset the
|
||||
* firmware loading status.
|
||||
*/
|
||||
void intel_csr_ucode_fini(struct drm_i915_private *dev_priv)
|
||||
void intel_dmc_ucode_fini(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
if (!HAS_CSR(dev_priv))
|
||||
if (!HAS_DMC(dev_priv))
|
||||
return;
|
||||
|
||||
intel_csr_ucode_suspend(dev_priv);
|
||||
drm_WARN_ON(&dev_priv->drm, dev_priv->csr.wakeref);
|
||||
intel_dmc_ucode_suspend(dev_priv);
|
||||
drm_WARN_ON(&dev_priv->drm, dev_priv->dmc.wakeref);
|
||||
|
||||
kfree(dev_priv->csr.dmc_payload);
|
||||
kfree(dev_priv->dmc.dmc_payload);
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_DMC_H__
|
||||
#define __INTEL_DMC_H__
|
||||
|
||||
#include "i915_reg.h"
|
||||
#include "intel_wakeref.h"
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct drm_i915_private;
|
||||
|
||||
#define DMC_VERSION(major, minor) ((major) << 16 | (minor))
|
||||
#define DMC_VERSION_MAJOR(version) ((version) >> 16)
|
||||
#define DMC_VERSION_MINOR(version) ((version) & 0xffff)
|
||||
|
||||
struct intel_dmc {
|
||||
struct work_struct work;
|
||||
const char *fw_path;
|
||||
u32 required_version;
|
||||
u32 max_fw_size; /* bytes */
|
||||
u32 *dmc_payload;
|
||||
u32 dmc_fw_size; /* dwords */
|
||||
u32 version;
|
||||
u32 mmio_count;
|
||||
i915_reg_t mmioaddr[20];
|
||||
u32 mmiodata[20];
|
||||
u32 dc_state;
|
||||
u32 target_dc_state;
|
||||
u32 allowed_dc_mask;
|
||||
intel_wakeref_t wakeref;
|
||||
};
|
||||
|
||||
void intel_dmc_ucode_init(struct drm_i915_private *i915);
|
||||
void intel_dmc_load_program(struct drm_i915_private *i915);
|
||||
void intel_dmc_ucode_fini(struct drm_i915_private *i915);
|
||||
void intel_dmc_ucode_suspend(struct drm_i915_private *i915);
|
||||
void intel_dmc_ucode_resume(struct drm_i915_private *i915);
|
||||
bool intel_dmc_has_payload(struct drm_i915_private *i915);
|
||||
|
||||
#endif /* __INTEL_DMC_H__ */
|
|
@ -128,50 +128,14 @@ intel_dp_set_lttpr_transparent_mode(struct intel_dp *intel_dp, bool enable)
|
|||
return drm_dp_dpcd_write(&intel_dp->aux, DP_PHY_REPEATER_MODE, &val, 1) == 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dp_init_lttpr_and_dprx_caps - detect LTTPR and DPRX caps, init the LTTPR link training mode
|
||||
* @intel_dp: Intel DP struct
|
||||
*
|
||||
* Read the LTTPR common and DPRX capabilities and switch to non-transparent
|
||||
* link training mode if any is detected and read the PHY capabilities for all
|
||||
* detected LTTPRs. In case of an LTTPR detection error or if the number of
|
||||
* LTTPRs is more than is supported (8), fall back to the no-LTTPR,
|
||||
* transparent mode link training mode.
|
||||
*
|
||||
* Returns:
|
||||
* >0 if LTTPRs were detected and the non-transparent LT mode was set. The
|
||||
* DPRX capabilities are read out.
|
||||
* 0 if no LTTPRs or more than 8 LTTPRs were detected or in case of a
|
||||
* detection failure and the transparent LT mode was set. The DPRX
|
||||
* capabilities are read out.
|
||||
* <0 Reading out the DPRX capabilities failed.
|
||||
*/
|
||||
int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
|
||||
static int intel_dp_init_lttpr(struct intel_dp *intel_dp)
|
||||
{
|
||||
int lttpr_count;
|
||||
bool ret;
|
||||
int i;
|
||||
|
||||
ret = intel_dp_read_lttpr_common_caps(intel_dp);
|
||||
|
||||
/* The DPTX shall read the DPRX caps after LTTPR detection. */
|
||||
if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd)) {
|
||||
intel_dp_reset_lttpr_common_caps(intel_dp);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
if (!intel_dp_read_lttpr_common_caps(intel_dp))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* The 0xF0000-0xF02FF range is only valid if the DPCD revision is
|
||||
* at least 1.4.
|
||||
*/
|
||||
if (intel_dp->dpcd[DP_DPCD_REV] < 0x14) {
|
||||
intel_dp_reset_lttpr_common_caps(intel_dp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
lttpr_count = drm_dp_lttpr_count(intel_dp->lttpr_common_caps);
|
||||
/*
|
||||
* Prevent setting LTTPR transparent mode explicitly if no LTTPRs are
|
||||
|
@ -211,6 +175,37 @@ int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
|
|||
|
||||
return lttpr_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dp_init_lttpr_and_dprx_caps - detect LTTPR and DPRX caps, init the LTTPR link training mode
|
||||
* @intel_dp: Intel DP struct
|
||||
*
|
||||
* Read the LTTPR common and DPRX capabilities and switch to non-transparent
|
||||
* link training mode if any is detected and read the PHY capabilities for all
|
||||
* detected LTTPRs. In case of an LTTPR detection error or if the number of
|
||||
* LTTPRs is more than is supported (8), fall back to the no-LTTPR,
|
||||
* transparent mode link training mode.
|
||||
*
|
||||
* Returns:
|
||||
* >0 if LTTPRs were detected and the non-transparent LT mode was set. The
|
||||
* DPRX capabilities are read out.
|
||||
* 0 if no LTTPRs or more than 8 LTTPRs were detected or in case of a
|
||||
* detection failure and the transparent LT mode was set. The DPRX
|
||||
* capabilities are read out.
|
||||
* <0 Reading out the DPRX capabilities failed.
|
||||
*/
|
||||
int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
|
||||
{
|
||||
int lttpr_count = intel_dp_init_lttpr(intel_dp);
|
||||
|
||||
/* The DPTX shall read the DPRX caps after LTTPR detection. */
|
||||
if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd)) {
|
||||
intel_dp_reset_lttpr_common_caps(intel_dp);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return lttpr_count;
|
||||
}
|
||||
EXPORT_SYMBOL(intel_dp_init_lttpr_and_dprx_caps);
|
||||
|
||||
static u8 dp_voltage_max(u8 preemph)
|
||||
|
|
|
@ -149,6 +149,16 @@ void assert_shared_dpll(struct drm_i915_private *dev_priv,
|
|||
pll->info->name, onoff(state), onoff(cur_state));
|
||||
}
|
||||
|
||||
static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
|
||||
{
|
||||
return TC_PORT_1 + id - DPLL_ID_ICL_MGPLL1;
|
||||
}
|
||||
|
||||
enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port)
|
||||
{
|
||||
return tc_port - TC_PORT_1 + DPLL_ID_ICL_MGPLL1;
|
||||
}
|
||||
|
||||
static i915_reg_t
|
||||
intel_combo_pll_enable_reg(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
|
@ -161,6 +171,19 @@ intel_combo_pll_enable_reg(struct drm_i915_private *i915,
|
|||
return CNL_DPLL_ENABLE(pll->info->id);
|
||||
}
|
||||
|
||||
static i915_reg_t
|
||||
intel_tc_pll_enable_reg(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
const enum intel_dpll_id id = pll->info->id;
|
||||
enum tc_port tc_port = icl_pll_id_to_tc_port(id);
|
||||
|
||||
if (IS_ALDERLAKE_P(i915))
|
||||
return ADLP_PORTTC_PLL_ENABLE(tc_port);
|
||||
|
||||
return MG_PLL_ENABLE(tc_port);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_prepare_shared_dpll - call a dpll's prepare hook
|
||||
* @crtc_state: CRTC, and its state, which has a shared dpll
|
||||
|
@ -3120,16 +3143,6 @@ static void icl_calc_dpll_state(struct drm_i915_private *i915,
|
|||
pll_state->cfgcr1 |= DPLL_CFGCR1_CENTRAL_FREQ_8400;
|
||||
}
|
||||
|
||||
static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
|
||||
{
|
||||
return id - DPLL_ID_ICL_MGPLL1;
|
||||
}
|
||||
|
||||
enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port)
|
||||
{
|
||||
return tc_port + DPLL_ID_ICL_MGPLL1;
|
||||
}
|
||||
|
||||
static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc,
|
||||
u32 *target_dco_khz,
|
||||
struct intel_dpll_hw_state *state,
|
||||
|
@ -3728,12 +3741,14 @@ static bool mg_pll_get_hw_state(struct drm_i915_private *dev_priv,
|
|||
bool ret = false;
|
||||
u32 val;
|
||||
|
||||
i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll);
|
||||
|
||||
wakeref = intel_display_power_get_if_enabled(dev_priv,
|
||||
POWER_DOMAIN_DISPLAY_CORE);
|
||||
if (!wakeref)
|
||||
return false;
|
||||
|
||||
val = intel_de_read(dev_priv, MG_PLL_ENABLE(tc_port));
|
||||
val = intel_de_read(dev_priv, enable_reg);
|
||||
if (!(val & PLL_ENABLE))
|
||||
goto out;
|
||||
|
||||
|
@ -3797,7 +3812,7 @@ static bool dkl_pll_get_hw_state(struct drm_i915_private *dev_priv,
|
|||
if (!wakeref)
|
||||
return false;
|
||||
|
||||
val = intel_de_read(dev_priv, MG_PLL_ENABLE(tc_port));
|
||||
val = intel_de_read(dev_priv, intel_tc_pll_enable_reg(dev_priv, pll));
|
||||
if (!(val & PLL_ENABLE))
|
||||
goto out;
|
||||
|
||||
|
@ -4169,8 +4184,7 @@ static void tbt_pll_enable(struct drm_i915_private *dev_priv,
|
|||
static void mg_pll_enable(struct drm_i915_private *dev_priv,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
i915_reg_t enable_reg =
|
||||
MG_PLL_ENABLE(icl_pll_id_to_tc_port(pll->info->id));
|
||||
i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll);
|
||||
|
||||
icl_pll_power_enable(dev_priv, pll, enable_reg);
|
||||
|
||||
|
@ -4249,8 +4263,7 @@ static void tbt_pll_disable(struct drm_i915_private *dev_priv,
|
|||
static void mg_pll_disable(struct drm_i915_private *dev_priv,
|
||||
struct intel_shared_dpll *pll)
|
||||
{
|
||||
i915_reg_t enable_reg =
|
||||
MG_PLL_ENABLE(icl_pll_id_to_tc_port(pll->info->id));
|
||||
i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll);
|
||||
|
||||
icl_pll_disable(dev_priv, pll, enable_reg);
|
||||
}
|
||||
|
@ -4416,6 +4429,26 @@ static const struct intel_dpll_mgr adls_pll_mgr = {
|
|||
.dump_hw_state = icl_dump_hw_state,
|
||||
};
|
||||
|
||||
static const struct dpll_info adlp_plls[] = {
|
||||
{ "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 },
|
||||
{ "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 },
|
||||
{ "TBT PLL", &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
|
||||
{ "TC PLL 1", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
|
||||
{ "TC PLL 2", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
|
||||
{ "TC PLL 3", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
|
||||
{ "TC PLL 4", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
|
||||
{ },
|
||||
};
|
||||
|
||||
static const struct intel_dpll_mgr adlp_pll_mgr = {
|
||||
.dpll_info = adlp_plls,
|
||||
.get_dplls = icl_get_dplls,
|
||||
.put_dplls = icl_put_dplls,
|
||||
.update_active_dpll = icl_update_active_dpll,
|
||||
.update_ref_clks = icl_update_dpll_ref_clks,
|
||||
.dump_hw_state = icl_dump_hw_state,
|
||||
};
|
||||
|
||||
/**
|
||||
* intel_shared_dpll_init - Initialize shared DPLLs
|
||||
* @dev: drm device
|
||||
|
@ -4429,7 +4462,9 @@ void intel_shared_dpll_init(struct drm_device *dev)
|
|||
const struct dpll_info *dpll_info;
|
||||
int i;
|
||||
|
||||
if (IS_ALDERLAKE_S(dev_priv))
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
dpll_mgr = &adlp_pll_mgr;
|
||||
else if (IS_ALDERLAKE_S(dev_priv))
|
||||
dpll_mgr = &adls_pll_mgr;
|
||||
else if (IS_DG1(dev_priv))
|
||||
dpll_mgr = &dg1_pll_mgr;
|
||||
|
|
|
@ -355,8 +355,17 @@ static int intel_fb_offset_to_xy(int *x, int *y,
|
|||
unsigned int height;
|
||||
u32 alignment;
|
||||
|
||||
if (DISPLAY_VER(i915) >= 12 &&
|
||||
is_semiplanar_uv_plane(fb, color_plane))
|
||||
/*
|
||||
* All DPT color planes must be 512*4k aligned (the amount mapped by a
|
||||
* single DPT page). For ADL_P CCS FBs this only works by requiring
|
||||
* the allocated offsets to be 2MB aligned. Once supoort to remap
|
||||
* such FBs is added we can remove this requirement, as then all the
|
||||
* planes can be remapped to an aligned offset.
|
||||
*/
|
||||
if (IS_ALDERLAKE_P(i915) && is_ccs_modifier(fb->modifier))
|
||||
alignment = 512 * 4096;
|
||||
else if (DISPLAY_VER(i915) >= 12 &&
|
||||
is_semiplanar_uv_plane(fb, color_plane))
|
||||
alignment = intel_tile_row_size(fb, color_plane);
|
||||
else if (fb->modifier != DRM_FORMAT_MOD_LINEAR)
|
||||
alignment = intel_tile_size(i915);
|
||||
|
|
|
@ -185,15 +185,34 @@ static void ivb_set_fifo_underrun_reporting(struct drm_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
static u32
|
||||
icl_pipe_status_underrun_mask(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
u32 mask = PIPE_STATUS_UNDERRUN;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 13)
|
||||
mask |= PIPE_STATUS_SOFT_UNDERRUN_XELPD |
|
||||
PIPE_STATUS_HARD_UNDERRUN_XELPD |
|
||||
PIPE_STATUS_PORT_UNDERRUN_XELPD;
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static void bdw_set_fifo_underrun_reporting(struct drm_device *dev,
|
||||
enum pipe pipe, bool enable)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
u32 mask = gen8_de_pipe_underrun_mask(dev_priv);
|
||||
|
||||
if (enable)
|
||||
bdw_enable_pipe_irq(dev_priv, pipe, GEN8_PIPE_FIFO_UNDERRUN);
|
||||
else
|
||||
bdw_disable_pipe_irq(dev_priv, pipe, GEN8_PIPE_FIFO_UNDERRUN);
|
||||
if (enable) {
|
||||
if (DISPLAY_VER(dev_priv) >= 11)
|
||||
intel_de_write(dev_priv, ICL_PIPESTATUS(pipe),
|
||||
icl_pipe_status_underrun_mask(dev_priv));
|
||||
|
||||
bdw_enable_pipe_irq(dev_priv, pipe, mask);
|
||||
} else {
|
||||
bdw_disable_pipe_irq(dev_priv, pipe, mask);
|
||||
}
|
||||
}
|
||||
|
||||
static void ibx_set_fifo_underrun_reporting(struct drm_device *dev,
|
||||
|
@ -373,6 +392,7 @@ void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
|
|||
enum pipe pipe)
|
||||
{
|
||||
struct intel_crtc *crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
|
||||
u32 underruns = 0;
|
||||
|
||||
/* We may be called too early in init, thanks BIOS! */
|
||||
if (crtc == NULL)
|
||||
|
@ -383,10 +403,35 @@ void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
|
|||
crtc->cpu_fifo_underrun_disabled)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Starting with display version 11, the PIPE_STAT register records
|
||||
* whether an underrun has happened, and on XELPD+, it will also record
|
||||
* whether the underrun was soft/hard and whether it was triggered by
|
||||
* the downstream port logic. We should clear these bits (which use
|
||||
* write-1-to-clear logic) too.
|
||||
*
|
||||
* Note that although the IIR gives us the same underrun and soft/hard
|
||||
* information, PIPE_STAT is the only place we can find out whether
|
||||
* the underrun was caused by the downstream port.
|
||||
*/
|
||||
if (DISPLAY_VER(dev_priv) >= 11) {
|
||||
underruns = intel_de_read(dev_priv, ICL_PIPESTATUS(pipe)) &
|
||||
icl_pipe_status_underrun_mask(dev_priv);
|
||||
intel_de_write(dev_priv, ICL_PIPESTATUS(pipe), underruns);
|
||||
}
|
||||
|
||||
if (intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false)) {
|
||||
trace_intel_cpu_fifo_underrun(dev_priv, pipe);
|
||||
drm_err(&dev_priv->drm, "CPU pipe %c FIFO underrun\n",
|
||||
pipe_name(pipe));
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 11)
|
||||
drm_err(&dev_priv->drm, "CPU pipe %c FIFO underrun: %s%s%s%s\n",
|
||||
pipe_name(pipe),
|
||||
underruns & PIPE_STATUS_SOFT_UNDERRUN_XELPD ? "soft," : "",
|
||||
underruns & PIPE_STATUS_HARD_UNDERRUN_XELPD ? "hard," : "",
|
||||
underruns & PIPE_STATUS_PORT_UNDERRUN_XELPD ? "port," : "",
|
||||
underruns & PIPE_STATUS_UNDERRUN ? "transcoder," : "");
|
||||
else
|
||||
drm_err(&dev_priv->drm, "CPU pipe %c FIFO underrun\n", pipe_name(pipe));
|
||||
}
|
||||
|
||||
intel_fbc_handle_fifo_underrun_irq(dev_priv);
|
||||
|
|
|
@ -1865,28 +1865,69 @@ static int intel_hdmi_port_clock(int clock, int bpc)
|
|||
return clock * bpc / 8;
|
||||
}
|
||||
|
||||
static enum drm_mode_status
|
||||
intel_hdmi_mode_clock_valid(struct intel_hdmi *hdmi, int clock, bool has_hdmi_sink)
|
||||
static bool intel_hdmi_bpc_possible(struct drm_connector *connector,
|
||||
int bpc, bool has_hdmi_sink, bool ycbcr420_output)
|
||||
{
|
||||
struct drm_device *dev = intel_hdmi_to_dev(hdmi);
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct drm_i915_private *i915 = to_i915(connector->dev);
|
||||
const struct drm_display_info *info = &connector->display_info;
|
||||
const struct drm_hdmi_info *hdmi = &info->hdmi;
|
||||
|
||||
switch (bpc) {
|
||||
case 12:
|
||||
if (HAS_GMCH(i915))
|
||||
return false;
|
||||
|
||||
if (!has_hdmi_sink)
|
||||
return false;
|
||||
|
||||
if (ycbcr420_output)
|
||||
return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_36;
|
||||
else
|
||||
return info->edid_hdmi_dc_modes & DRM_EDID_HDMI_DC_36;
|
||||
case 10:
|
||||
if (DISPLAY_VER(i915) < 11)
|
||||
return false;
|
||||
|
||||
if (!has_hdmi_sink)
|
||||
return false;
|
||||
|
||||
if (ycbcr420_output)
|
||||
return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_30;
|
||||
else
|
||||
return info->edid_hdmi_dc_modes & DRM_EDID_HDMI_DC_30;
|
||||
case 8:
|
||||
return true;
|
||||
default:
|
||||
MISSING_CASE(bpc);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static enum drm_mode_status
|
||||
intel_hdmi_mode_clock_valid(struct drm_connector *connector, int clock,
|
||||
bool has_hdmi_sink, bool ycbcr420_output)
|
||||
{
|
||||
struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
|
||||
enum drm_mode_status status;
|
||||
|
||||
if (ycbcr420_output)
|
||||
clock /= 2;
|
||||
|
||||
/* check if we can do 8bpc */
|
||||
status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 8),
|
||||
true, has_hdmi_sink);
|
||||
|
||||
if (has_hdmi_sink) {
|
||||
/* if we can't do 8bpc we may still be able to do 12bpc */
|
||||
if (status != MODE_OK && !HAS_GMCH(dev_priv))
|
||||
status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 12),
|
||||
true, has_hdmi_sink);
|
||||
/* if we can't do 8bpc we may still be able to do 12bpc */
|
||||
if (status != MODE_OK &&
|
||||
intel_hdmi_bpc_possible(connector, 12, has_hdmi_sink, ycbcr420_output))
|
||||
status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 12),
|
||||
true, has_hdmi_sink);
|
||||
|
||||
/* if we can't do 8,12bpc we may still be able to do 10bpc */
|
||||
if (status != MODE_OK && DISPLAY_VER(dev_priv) >= 11)
|
||||
status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 10),
|
||||
true, has_hdmi_sink);
|
||||
}
|
||||
/* if we can't do 8,12bpc we may still be able to do 10bpc */
|
||||
if (status != MODE_OK &&
|
||||
intel_hdmi_bpc_possible(connector, 10, has_hdmi_sink, ycbcr420_output))
|
||||
status = hdmi_port_clock_valid(hdmi, intel_hdmi_port_clock(clock, 10),
|
||||
true, has_hdmi_sink);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -1920,18 +1961,15 @@ intel_hdmi_mode_valid(struct drm_connector *connector,
|
|||
}
|
||||
|
||||
ycbcr_420_only = drm_mode_is_420_only(&connector->display_info, mode);
|
||||
if (ycbcr_420_only)
|
||||
clock /= 2;
|
||||
|
||||
status = intel_hdmi_mode_clock_valid(hdmi, clock, has_hdmi_sink);
|
||||
status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, ycbcr_420_only);
|
||||
if (status != MODE_OK) {
|
||||
if (ycbcr_420_only ||
|
||||
!connector->ycbcr_420_allowed ||
|
||||
!drm_mode_is_420_also(&connector->display_info, mode))
|
||||
return status;
|
||||
|
||||
clock /= 2;
|
||||
status = intel_hdmi_mode_clock_valid(hdmi, clock, has_hdmi_sink);
|
||||
status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, true);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
}
|
||||
|
@ -1950,32 +1988,12 @@ bool intel_hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
|
|||
if (crtc_state->pipe_bpp < bpc * 3)
|
||||
return false;
|
||||
|
||||
if (!has_hdmi_sink)
|
||||
return false;
|
||||
|
||||
for_each_new_connector_in_state(state, connector, connector_state, i) {
|
||||
const struct drm_display_info *info = &connector->display_info;
|
||||
|
||||
if (connector_state->crtc != crtc_state->uapi.crtc)
|
||||
continue;
|
||||
|
||||
if (ycbcr420_output) {
|
||||
const struct drm_hdmi_info *hdmi = &info->hdmi;
|
||||
|
||||
if (bpc == 12 && !(hdmi->y420_dc_modes &
|
||||
DRM_EDID_YCBCR420_DC_36))
|
||||
return false;
|
||||
else if (bpc == 10 && !(hdmi->y420_dc_modes &
|
||||
DRM_EDID_YCBCR420_DC_30))
|
||||
return false;
|
||||
} else {
|
||||
if (bpc == 12 && !(info->edid_hdmi_dc_modes &
|
||||
DRM_EDID_HDMI_DC_36))
|
||||
return false;
|
||||
else if (bpc == 10 && !(info->edid_hdmi_dc_modes &
|
||||
DRM_EDID_HDMI_DC_30))
|
||||
return false;
|
||||
}
|
||||
if (!intel_hdmi_bpc_possible(connector, bpc, has_hdmi_sink, ycbcr420_output))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1989,12 +2007,6 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
|
|||
const struct drm_display_mode *adjusted_mode =
|
||||
&crtc_state->hw.adjusted_mode;
|
||||
|
||||
if (HAS_GMCH(dev_priv))
|
||||
return false;
|
||||
|
||||
if (bpc == 10 && DISPLAY_VER(dev_priv) < 11)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* HDMI deep color affects the clocks, so it's only possible
|
||||
* when not cloning with other encoder types.
|
||||
|
|
|
@ -638,7 +638,7 @@ unlock:
|
|||
|
||||
static void tgl_disallow_dc3co_on_psr2_exit(struct intel_dp *intel_dp)
|
||||
{
|
||||
if (!intel_dp->psr.dc3co_enabled)
|
||||
if (!intel_dp->psr.dc3co_exitline)
|
||||
return;
|
||||
|
||||
cancel_delayed_work(&intel_dp->psr.dc3co_work);
|
||||
|
@ -646,12 +646,26 @@ static void tgl_disallow_dc3co_on_psr2_exit(struct intel_dp *intel_dp)
|
|||
tgl_psr2_disable_dc3co(intel_dp);
|
||||
}
|
||||
|
||||
static bool
|
||||
dc3co_is_pipe_port_compatible(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
enum port port = dig_port->base.port;
|
||||
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
return pipe <= PIPE_B && port <= PORT_B;
|
||||
else
|
||||
return pipe == PIPE_A && port == PORT_A;
|
||||
}
|
||||
|
||||
static void
|
||||
tgl_dc3co_exitline_compute_config(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
const u32 crtc_vdisplay = crtc_state->uapi.adjusted_mode.crtc_vdisplay;
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
u32 exit_scanlines;
|
||||
|
||||
|
@ -669,12 +683,10 @@ tgl_dc3co_exitline_compute_config(struct intel_dp *intel_dp,
|
|||
if (crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
if (!(dev_priv->csr.allowed_dc_mask & DC_STATE_EN_DC3CO))
|
||||
if (!(dev_priv->dmc.allowed_dc_mask & DC_STATE_EN_DC3CO))
|
||||
return;
|
||||
|
||||
/* B.Specs:49196 DC3CO only works with pipeA and DDIA.*/
|
||||
if (to_intel_crtc(crtc_state->uapi.crtc)->pipe != PIPE_A ||
|
||||
dig_port->base.port != PORT_A)
|
||||
if (!dc3co_is_pipe_port_compatible(intel_dp, crtc_state))
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -753,6 +765,15 @@ static bool intel_psr2_config_valid(struct intel_dp *intel_dp,
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* We are missing the implementation of some workarounds to enabled PSR2
|
||||
* in Alderlake_P, until ready PSR2 should be kept disabled.
|
||||
*/
|
||||
if (IS_ALDERLAKE_P(dev_priv)) {
|
||||
drm_dbg_kms(&dev_priv->drm, "PSR2 is missing the implementation of workarounds\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!transcoder_has_psr2(dev_priv, crtc_state->cpu_transcoder)) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"PSR2 not supported in transcoder %s\n",
|
||||
|
@ -969,11 +990,10 @@ static void intel_psr_activate(struct intel_dp *intel_dp)
|
|||
intel_dp->psr.active = true;
|
||||
}
|
||||
|
||||
static void intel_psr_enable_source(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
static void intel_psr_enable_source(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
|
||||
enum transcoder cpu_transcoder = intel_dp->psr.transcoder;
|
||||
u32 mask;
|
||||
|
||||
/* Only HSW and BDW have PSR AUX registers that need to be setup. SKL+
|
||||
|
@ -1010,7 +1030,7 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
|
|||
|
||||
psr_irq_control(intel_dp);
|
||||
|
||||
if (crtc_state->dc3co_exitline) {
|
||||
if (intel_dp->psr.dc3co_exitline) {
|
||||
u32 val;
|
||||
|
||||
/*
|
||||
|
@ -1019,7 +1039,7 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
|
|||
*/
|
||||
val = intel_de_read(dev_priv, EXITLINE(cpu_transcoder));
|
||||
val &= ~EXITLINE_MASK;
|
||||
val |= crtc_state->dc3co_exitline << EXITLINE_SHIFT;
|
||||
val |= intel_dp->psr.dc3co_exitline << EXITLINE_SHIFT;
|
||||
val |= EXITLINE_ENABLE;
|
||||
intel_de_write(dev_priv, EXITLINE(cpu_transcoder), val);
|
||||
}
|
||||
|
@ -1030,27 +1050,11 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
|
|||
IGNORE_PSR2_HW_TRACKING : 0);
|
||||
}
|
||||
|
||||
static void intel_psr_enable_locked(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct drm_connector_state *conn_state)
|
||||
static bool psr_interrupt_error_check(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
u32 val;
|
||||
|
||||
drm_WARN_ON(&dev_priv->drm, intel_dp->psr.enabled);
|
||||
|
||||
intel_dp->psr.psr2_enabled = crtc_state->has_psr2;
|
||||
intel_dp->psr.busy_frontbuffer_bits = 0;
|
||||
intel_dp->psr.pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
|
||||
intel_dp->psr.dc3co_enabled = !!crtc_state->dc3co_exitline;
|
||||
intel_dp->psr.transcoder = crtc_state->cpu_transcoder;
|
||||
/* DC5/DC6 requires at least 6 idle frames */
|
||||
val = usecs_to_jiffies(intel_get_frame_time_us(crtc_state) * 6);
|
||||
intel_dp->psr.dc3co_exit_delay = val;
|
||||
intel_dp->psr.psr2_sel_fetch_enabled = crtc_state->enable_psr2_sel_fetch;
|
||||
|
||||
/*
|
||||
* If a PSR error happened and the driver is reloaded, the EDP_PSR_IIR
|
||||
* will still keep the error set even after the reset done in the
|
||||
|
@ -1071,17 +1075,45 @@ static void intel_psr_enable_locked(struct intel_dp *intel_dp,
|
|||
intel_dp->psr.sink_not_reliable = true;
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"PSR interruption error set, not enabling PSR\n");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void intel_psr_enable_locked(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
u32 val;
|
||||
|
||||
drm_WARN_ON(&dev_priv->drm, intel_dp->psr.enabled);
|
||||
|
||||
intel_dp->psr.psr2_enabled = crtc_state->has_psr2;
|
||||
intel_dp->psr.busy_frontbuffer_bits = 0;
|
||||
intel_dp->psr.pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
|
||||
intel_dp->psr.transcoder = crtc_state->cpu_transcoder;
|
||||
/* DC5/DC6 requires at least 6 idle frames */
|
||||
val = usecs_to_jiffies(intel_get_frame_time_us(crtc_state) * 6);
|
||||
intel_dp->psr.dc3co_exit_delay = val;
|
||||
intel_dp->psr.dc3co_exitline = crtc_state->dc3co_exitline;
|
||||
intel_dp->psr.psr2_sel_fetch_enabled = crtc_state->enable_psr2_sel_fetch;
|
||||
|
||||
if (!psr_interrupt_error_check(intel_dp))
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Enabling PSR%s\n",
|
||||
intel_dp->psr.psr2_enabled ? "2" : "1");
|
||||
intel_dp_compute_psr_vsc_sdp(intel_dp, crtc_state, conn_state,
|
||||
&intel_dp->psr.vsc);
|
||||
intel_write_dp_vsc_sdp(encoder, crtc_state, &intel_dp->psr.vsc);
|
||||
intel_psr_enable_sink(intel_dp);
|
||||
intel_psr_enable_source(intel_dp, crtc_state);
|
||||
intel_psr_enable_source(intel_dp);
|
||||
intel_dp->psr.enabled = true;
|
||||
intel_dp->psr.paused = false;
|
||||
|
||||
intel_psr_activate(intel_dp);
|
||||
}
|
||||
|
@ -1151,22 +1183,12 @@ static void intel_psr_exit(struct intel_dp *intel_dp)
|
|||
intel_dp->psr.active = false;
|
||||
}
|
||||
|
||||
static void intel_psr_disable_locked(struct intel_dp *intel_dp)
|
||||
static void intel_psr_wait_exit_locked(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
i915_reg_t psr_status;
|
||||
u32 psr_status_mask;
|
||||
|
||||
lockdep_assert_held(&intel_dp->psr.lock);
|
||||
|
||||
if (!intel_dp->psr.enabled)
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Disabling PSR%s\n",
|
||||
intel_dp->psr.psr2_enabled ? "2" : "1");
|
||||
|
||||
intel_psr_exit(intel_dp);
|
||||
|
||||
if (intel_dp->psr.psr2_enabled) {
|
||||
psr_status = EDP_PSR2_STATUS(intel_dp->psr.transcoder);
|
||||
psr_status_mask = EDP_PSR2_STATUS_STATE_MASK;
|
||||
|
@ -1179,6 +1201,22 @@ static void intel_psr_disable_locked(struct intel_dp *intel_dp)
|
|||
if (intel_de_wait_for_clear(dev_priv, psr_status,
|
||||
psr_status_mask, 2000))
|
||||
drm_err(&dev_priv->drm, "Timed out waiting PSR idle state\n");
|
||||
}
|
||||
|
||||
static void intel_psr_disable_locked(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
|
||||
lockdep_assert_held(&intel_dp->psr.lock);
|
||||
|
||||
if (!intel_dp->psr.enabled)
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Disabling PSR%s\n",
|
||||
intel_dp->psr.psr2_enabled ? "2" : "1");
|
||||
|
||||
intel_psr_exit(intel_dp);
|
||||
intel_psr_wait_exit_locked(intel_dp);
|
||||
|
||||
/* WA 1408330847 */
|
||||
if (intel_dp->psr.psr2_sel_fetch_enabled &&
|
||||
|
@ -1223,6 +1261,61 @@ void intel_psr_disable(struct intel_dp *intel_dp,
|
|||
cancel_delayed_work_sync(&intel_dp->psr.dc3co_work);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_psr_pause - Pause PSR
|
||||
* @intel_dp: Intel DP
|
||||
*
|
||||
* This function need to be called after enabling psr.
|
||||
*/
|
||||
void intel_psr_pause(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct intel_psr *psr = &intel_dp->psr;
|
||||
|
||||
if (!CAN_PSR(intel_dp))
|
||||
return;
|
||||
|
||||
mutex_lock(&psr->lock);
|
||||
|
||||
if (!psr->enabled) {
|
||||
mutex_unlock(&psr->lock);
|
||||
return;
|
||||
}
|
||||
|
||||
intel_psr_exit(intel_dp);
|
||||
intel_psr_wait_exit_locked(intel_dp);
|
||||
psr->paused = true;
|
||||
|
||||
mutex_unlock(&psr->lock);
|
||||
|
||||
cancel_work_sync(&psr->work);
|
||||
cancel_delayed_work_sync(&psr->dc3co_work);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_psr_resume - Resume PSR
|
||||
* @intel_dp: Intel DP
|
||||
*
|
||||
* This function need to be called after pausing psr.
|
||||
*/
|
||||
void intel_psr_resume(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct intel_psr *psr = &intel_dp->psr;
|
||||
|
||||
if (!CAN_PSR(intel_dp))
|
||||
return;
|
||||
|
||||
mutex_lock(&psr->lock);
|
||||
|
||||
if (!psr->paused)
|
||||
goto unlock;
|
||||
|
||||
psr->paused = false;
|
||||
intel_psr_activate(intel_dp);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&psr->lock);
|
||||
}
|
||||
|
||||
static void psr_force_hw_tracking_exit(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
|
@ -1818,7 +1911,7 @@ tgl_dc3co_flush(struct intel_dp *intel_dp, unsigned int frontbuffer_bits,
|
|||
{
|
||||
mutex_lock(&intel_dp->psr.lock);
|
||||
|
||||
if (!intel_dp->psr.dc3co_enabled)
|
||||
if (!intel_dp->psr.dc3co_exitline)
|
||||
goto unlock;
|
||||
|
||||
if (!intel_dp->psr.psr2_enabled || !intel_dp->psr.active)
|
||||
|
@ -1877,6 +1970,16 @@ void intel_psr_flush(struct drm_i915_private *dev_priv,
|
|||
INTEL_FRONTBUFFER_ALL_MASK(intel_dp->psr.pipe);
|
||||
intel_dp->psr.busy_frontbuffer_bits &= ~pipe_frontbuffer_bits;
|
||||
|
||||
/*
|
||||
* If the PSR is paused by an explicit intel_psr_paused() call,
|
||||
* we have to ensure that the PSR is not activated until
|
||||
* intel_psr_resume() is called.
|
||||
*/
|
||||
if (intel_dp->psr.paused) {
|
||||
mutex_unlock(&intel_dp->psr.lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* By definition flush = invalidate + flush */
|
||||
if (pipe_frontbuffer_bits)
|
||||
psr_force_hw_tracking_exit(intel_dp);
|
||||
|
|
|
@ -51,5 +51,7 @@ void intel_psr2_program_plane_sel_fetch(struct intel_plane *plane,
|
|||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state,
|
||||
int color_plane);
|
||||
void intel_psr_pause(struct intel_dp *intel_dp);
|
||||
void intel_psr_resume(struct intel_dp *intel_dp);
|
||||
|
||||
#endif /* __INTEL_PSR_H__ */
|
||||
|
|
|
@ -0,0 +1,309 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
/*
|
||||
* Copyright © 2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <drm/drm_dsc.h>
|
||||
|
||||
#include "i915_utils.h"
|
||||
#include "intel_qp_tables.h"
|
||||
|
||||
/* from BPP 6 to 24 in steps of 0.5 */
|
||||
#define RC_RANGE_QP444_8BPC_MAX_NUM_BPP 37
|
||||
|
||||
/* from BPP 6 to 30 in steps of 0.5 */
|
||||
#define RC_RANGE_QP444_10BPC_MAX_NUM_BPP 49
|
||||
|
||||
/* from BPP 6 to 36 in steps of 0.5 */
|
||||
#define RC_RANGE_QP444_12BPC_MAX_NUM_BPP 61
|
||||
|
||||
/*
|
||||
* These qp tables are as per the C model
|
||||
* and it has the rows pointing to bpps which increment
|
||||
* in steps of 0.5
|
||||
* We do not support fractional bpps as of today,
|
||||
* hence we would skip the fractional bpps during
|
||||
* our references for qp calclulations.
|
||||
*/
|
||||
static const u8 rc_range_minqp444_8bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_8BPC_MAX_NUM_BPP] = {
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
|
||||
{ 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
|
||||
{ 6, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
|
||||
{ 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3,
|
||||
3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
|
||||
{ 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0 },
|
||||
{ 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4,
|
||||
4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0 },
|
||||
{ 9, 9, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5,
|
||||
5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1 },
|
||||
{ 14, 14, 13, 13, 12, 12, 12, 12, 11, 11, 10, 10, 10, 10, 9, 9, 9, 8, 8,
|
||||
8, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3 }
|
||||
};
|
||||
|
||||
static const u8 rc_range_maxqp444_8bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_8BPC_MAX_NUM_BPP] = {
|
||||
{ 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
|
||||
{ 8, 7, 7, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 3, 2, 2, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
|
||||
{ 8, 8, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 4, 3, 3, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
|
||||
{ 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 4, 4, 3, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
|
||||
{ 9, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 4, 4, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 },
|
||||
{ 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 4, 4, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 },
|
||||
{ 10, 10, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 5, 5, 4, 4, 4, 4, 3,
|
||||
3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1 },
|
||||
{ 11, 11, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8, 8, 7, 7, 6, 6, 5, 5, 5, 5, 5,
|
||||
4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
|
||||
{ 12, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 8, 8, 7, 6, 6, 5, 5, 5,
|
||||
5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
|
||||
{ 12, 12, 11, 11, 10, 10, 10, 10, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6,
|
||||
5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1 },
|
||||
{ 12, 12, 12, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7,
|
||||
6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1 },
|
||||
{ 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7,
|
||||
6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1 },
|
||||
{ 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8,
|
||||
8, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2 },
|
||||
{ 15, 15, 14, 14, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 10, 9,
|
||||
9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4 }
|
||||
};
|
||||
|
||||
static const u8 rc_range_minqp444_10bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_10BPC_MAX_NUM_BPP] = {
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 7, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2,
|
||||
2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 7, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3,
|
||||
3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3,
|
||||
3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 9, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4,
|
||||
4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5,
|
||||
4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 5,
|
||||
5, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 0,
|
||||
0, 0, 0 },
|
||||
{ 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 5,
|
||||
5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1,
|
||||
1, 0, 0 },
|
||||
{ 10, 9, 9, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1,
|
||||
1, 1, 0 },
|
||||
{ 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6,
|
||||
6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 1,
|
||||
1, 1, 1 },
|
||||
{ 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8,
|
||||
7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2,
|
||||
2, 1, 1, 1 },
|
||||
{ 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8,
|
||||
8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2,
|
||||
2, 2, 2, 1 },
|
||||
{ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11,
|
||||
11, 11, 11, 10, 10, 9, 9, 9, 9, 8, 8, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4,
|
||||
4, 3, 3, 3, 3, 2, 2, 2, 2, 1 },
|
||||
{ 18, 18, 17, 17, 16, 16, 16, 16, 15, 15, 14, 14, 14, 14, 13, 13, 13,
|
||||
12, 12, 12, 11, 11, 11, 11, 10, 10, 9, 9, 9, 9, 9, 8, 8, 7, 7, 7, 7,
|
||||
7, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3 }
|
||||
};
|
||||
|
||||
static const u8 rc_range_maxqp444_10bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_10BPC_MAX_NUM_BPP] = {
|
||||
{ 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 10, 10, 9, 9, 8, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3,
|
||||
3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0 },
|
||||
{ 12, 11, 11, 10, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 7, 6, 6, 5, 5, 5, 4,
|
||||
4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
|
||||
0, 0, 0, 0 },
|
||||
{ 12, 12, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 8, 7, 7, 6,
|
||||
6, 6, 5, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1,
|
||||
1, 0, 0, 0, 0, 0, 0 },
|
||||
{ 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 9, 8, 8, 7,
|
||||
6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1,
|
||||
1, 1, 1, 0, 0, 0, 0, 0 },
|
||||
{ 13, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 9, 8, 8,
|
||||
7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
|
||||
2, 2, 1, 1, 1, 1, 0, 0 },
|
||||
{ 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 9, 8, 8,
|
||||
7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2,
|
||||
2, 2, 2, 1, 1, 1, 1, 1 },
|
||||
{ 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 10, 9, 9,
|
||||
8, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3,
|
||||
3, 2, 2, 2, 1, 1, 1, 1 },
|
||||
{ 15, 15, 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 12, 11, 11, 10, 10, 9,
|
||||
9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 3,
|
||||
3, 3, 2, 2, 2, 2, 1, 1 },
|
||||
{ 16, 15, 15, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 12, 12, 11, 10,
|
||||
10, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4,
|
||||
4, 3, 3, 3, 2, 2, 2, 2, 1 },
|
||||
{ 16, 16, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 12, 12, 11, 11,
|
||||
10, 10, 10, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5,
|
||||
4, 4, 4, 3, 3, 3, 2, 2, 2, 2 },
|
||||
{ 16, 16, 16, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12,
|
||||
11, 11, 11, 10, 10, 9, 9, 9, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5,
|
||||
5, 4, 4, 4, 4, 3, 3, 2, 2, 2 },
|
||||
{ 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 13, 13, 13, 12, 12, 12,
|
||||
11, 11, 11, 10, 10, 9, 9, 9, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 5, 5, 5,
|
||||
5, 4, 4, 4, 4, 3, 3, 3, 3, 2 },
|
||||
{ 17, 17, 17, 17, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 12,
|
||||
12, 12, 12, 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 6,
|
||||
6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2 },
|
||||
{ 19, 19, 18, 18, 17, 17, 17, 17, 16, 16, 15, 15, 15, 15, 14, 14, 14,
|
||||
13, 13, 13, 12, 12, 12, 12, 11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 8, 8,
|
||||
8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4 }
|
||||
};
|
||||
|
||||
static const u8 rc_range_minqp444_12bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_12BPC_MAX_NUM_BPP] = {
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 11, 10, 10, 9, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 5, 5, 4, 4, 4, 3, 3, 3, 3,
|
||||
3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 11, 11, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 7, 6, 6, 6, 6, 6, 5, 5, 5,
|
||||
5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 9, 9, 9, 8, 7, 7, 7,
|
||||
7, 5, 5, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1,
|
||||
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 13, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 9, 9, 8, 8,
|
||||
8, 8, 6, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2,
|
||||
2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 9, 9, 9, 9,
|
||||
9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3,
|
||||
3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
|
||||
{ 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10,
|
||||
10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4,
|
||||
4, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0 },
|
||||
{ 13, 13, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
||||
11, 11, 11, 10, 10, 10, 10, 9, 9, 8, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 5, 5,
|
||||
5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0 },
|
||||
{ 14, 13, 13, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
||||
11, 11, 11, 10, 10, 10, 10, 9, 9, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 5,
|
||||
5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 0 },
|
||||
{ 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12,
|
||||
12, 11, 11, 11, 11, 11, 11, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7,
|
||||
6, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1 },
|
||||
{ 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
||||
13, 12, 12, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8,
|
||||
7, 7, 7, 7, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1 },
|
||||
{ 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
||||
13, 12, 12, 12, 12, 12, 12, 11, 11, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8,
|
||||
7, 7, 7, 7, 6, 6, 6, 6, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1 },
|
||||
{ 17, 17, 17, 17, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
||||
15, 14, 14, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 9, 9, 9, 9, 8, 8,
|
||||
7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 1 },
|
||||
{ 22, 22, 21, 21, 20, 20, 20, 20, 19, 19, 18, 18, 18, 18, 17, 17, 17, 16, 16,
|
||||
16, 15, 15, 15, 15, 14, 14, 13, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 11,
|
||||
10, 10, 9, 9, 9, 9, 9, 8, 8, 7, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 3 }
|
||||
};
|
||||
|
||||
static const u8 rc_range_maxqp444_12bpc[DSC_NUM_BUF_RANGES][RC_RANGE_QP444_12BPC_MAX_NUM_BPP] = {
|
||||
{ 12, 12, 12, 12, 12, 12, 11, 11, 11, 10, 9, 9, 6, 6, 5, 5, 5, 4, 4, 4, 4, 4,
|
||||
4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 14, 14, 13, 13, 12, 12, 12, 12, 12, 12, 11, 11, 9, 9, 9, 8, 8, 7, 7, 7, 7, 5,
|
||||
5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 16, 15, 15, 14, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 11, 10, 10, 9, 9,
|
||||
9, 7, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1,
|
||||
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 16, 16, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 12, 11, 11, 10,
|
||||
10, 10, 8, 8, 8, 8, 8, 7, 7, 6, 5, 5, 5, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 3, 2,
|
||||
2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 17, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 13, 12, 12, 11, 10,
|
||||
10, 10, 10, 8, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3,
|
||||
2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
|
||||
{ 17, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 12, 12, 11,
|
||||
11, 11, 11, 9, 9, 9, 9, 8, 8, 8, 8, 7, 6, 6, 6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3,
|
||||
3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0 },
|
||||
{ 17, 17, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 13, 12, 12, 11,
|
||||
11, 11, 11, 11, 10, 10, 10, 9, 9, 9, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 5,
|
||||
5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0 },
|
||||
{ 18, 18, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 14, 13, 13, 12,
|
||||
12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6,
|
||||
6, 5, 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1 },
|
||||
{ 19, 19, 18, 18, 17, 17, 17, 17, 17, 17, 16, 16, 16, 15, 15, 14, 14, 13, 13,
|
||||
13, 13, 13, 12, 12, 12, 12, 11, 11, 10, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6,
|
||||
6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1 },
|
||||
{ 20, 19, 19, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 16, 16, 15, 14, 14, 13,
|
||||
13, 13, 13, 12, 12, 12, 12, 11, 11, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 8, 7, 7,
|
||||
6, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 1 },
|
||||
{ 20, 20, 19, 19, 18, 18, 18, 18, 18, 18, 17, 17, 17, 16, 16, 15, 15, 14, 14,
|
||||
14, 13, 13, 12, 12, 12, 12, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9,
|
||||
8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2 },
|
||||
{ 20, 20, 20, 19, 19, 19, 18, 18, 18, 18, 17, 17, 17, 17, 16, 16, 16, 15, 15,
|
||||
15, 14, 14, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9,
|
||||
9, 8, 8, 8, 8, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2 },
|
||||
{ 20, 20, 20, 20, 19, 19, 19, 19, 19, 18, 18, 17, 17, 17, 16, 16, 16, 15, 15,
|
||||
15, 14, 14, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9,
|
||||
9, 8, 8, 8, 8, 7, 7, 7, 7, 6, 5, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2 },
|
||||
{ 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 18, 18, 18, 18, 17, 17, 16, 16, 16,
|
||||
16, 15, 15, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 11, 11, 10, 10, 10, 10,
|
||||
9, 9, 8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2 },
|
||||
{ 23, 23, 22, 22, 21, 21, 21, 21, 20, 20, 19, 19, 19, 19, 18, 18, 18, 17, 17,
|
||||
17, 16, 16, 16, 16, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 12, 12,
|
||||
11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 4 }
|
||||
};
|
||||
|
||||
#define PARAM_TABLE(_minmax, _bpc, _row, _col) do { \
|
||||
if (bpc == (_bpc)) \
|
||||
return rc_range_##_minmax##qp444_##_bpc##bpc[_row][_col]; \
|
||||
} while (0)
|
||||
|
||||
u8 intel_lookup_range_min_qp(int bpc, int buf_i, int bpp_i)
|
||||
{
|
||||
PARAM_TABLE(min, 8, buf_i, bpp_i);
|
||||
PARAM_TABLE(min, 10, buf_i, bpp_i);
|
||||
PARAM_TABLE(min, 12, buf_i, bpp_i);
|
||||
|
||||
MISSING_CASE(bpc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 intel_lookup_range_max_qp(int bpc, int buf_i, int bpp_i)
|
||||
{
|
||||
PARAM_TABLE(max, 8, buf_i, bpp_i);
|
||||
PARAM_TABLE(max, 10, buf_i, bpp_i);
|
||||
PARAM_TABLE(max, 12, buf_i, bpp_i);
|
||||
|
||||
MISSING_CASE(bpc);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef _INTEL_QP_TABLES_H_
|
||||
#define _INTEL_QP_TABLES_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
u8 intel_lookup_range_min_qp(int bpc, int buf_i, int bpp_i);
|
||||
u8 intel_lookup_range_max_qp(int bpc, int buf_i, int bpp_i);
|
||||
|
||||
#endif
|
|
@ -26,9 +26,7 @@ static const char *tc_port_mode_name(enum tc_port_mode mode)
|
|||
static enum intel_display_power_domain
|
||||
tc_cold_get_power_domain(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
||||
if (DISPLAY_VER(i915) == 11)
|
||||
if (intel_tc_cold_requires_aux_pw(dig_port))
|
||||
return intel_legacy_aux_to_power_domain(dig_port->aux_ch);
|
||||
else
|
||||
return POWER_DOMAIN_TC_COLD_OFF;
|
||||
|
@ -205,7 +203,7 @@ static void tc_port_fixup_legacy_flag(struct intel_digital_port *dig_port,
|
|||
dig_port->tc_legacy_port = !dig_port->tc_legacy_port;
|
||||
}
|
||||
|
||||
static u32 tc_port_live_status_mask(struct intel_digital_port *dig_port)
|
||||
static u32 icl_tc_port_live_status_mask(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
struct intel_uncore *uncore = &i915->uncore;
|
||||
|
@ -238,6 +236,40 @@ static u32 tc_port_live_status_mask(struct intel_digital_port *dig_port)
|
|||
return mask;
|
||||
}
|
||||
|
||||
static u32 adl_tc_port_live_status_mask(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
enum tc_port tc_port = intel_port_to_tc(i915, dig_port->base.port);
|
||||
u32 isr_bit = i915->hotplug.pch_hpd[dig_port->base.hpd_pin];
|
||||
struct intel_uncore *uncore = &i915->uncore;
|
||||
u32 val, mask = 0;
|
||||
|
||||
val = intel_uncore_read(uncore, TCSS_DDI_STATUS(tc_port));
|
||||
if (val & TCSS_DDI_STATUS_HPD_LIVE_STATUS_ALT)
|
||||
mask |= BIT(TC_PORT_DP_ALT);
|
||||
if (val & TCSS_DDI_STATUS_HPD_LIVE_STATUS_TBT)
|
||||
mask |= BIT(TC_PORT_TBT_ALT);
|
||||
|
||||
if (intel_uncore_read(uncore, SDEISR) & isr_bit)
|
||||
mask |= BIT(TC_PORT_LEGACY);
|
||||
|
||||
/* The sink can be connected only in a single mode. */
|
||||
if (!drm_WARN_ON(&i915->drm, hweight32(mask) > 1))
|
||||
tc_port_fixup_legacy_flag(dig_port, mask);
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static u32 tc_port_live_status_mask(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
||||
if (IS_ALDERLAKE_P(i915))
|
||||
return adl_tc_port_live_status_mask(dig_port);
|
||||
|
||||
return icl_tc_port_live_status_mask(dig_port);
|
||||
}
|
||||
|
||||
static bool icl_tc_phy_status_complete(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
@ -256,6 +288,33 @@ static bool icl_tc_phy_status_complete(struct intel_digital_port *dig_port)
|
|||
return val & DP_PHY_MODE_STATUS_COMPLETED(dig_port->tc_phy_fia_idx);
|
||||
}
|
||||
|
||||
static bool adl_tc_phy_status_complete(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
struct intel_uncore *uncore = &i915->uncore;
|
||||
u32 val;
|
||||
|
||||
val = intel_uncore_read(uncore, TCSS_DDI_STATUS(dig_port->tc_phy_fia_idx));
|
||||
if (val == 0xffffffff) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"Port %s: PHY in TCCOLD, assuming not complete\n",
|
||||
dig_port->tc_port_name);
|
||||
return false;
|
||||
}
|
||||
|
||||
return val & TCSS_DDI_STATUS_READY;
|
||||
}
|
||||
|
||||
static bool tc_phy_status_complete(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
||||
if (IS_ALDERLAKE_P(i915))
|
||||
return adl_tc_phy_status_complete(dig_port);
|
||||
|
||||
return icl_tc_phy_status_complete(dig_port);
|
||||
}
|
||||
|
||||
static bool icl_tc_phy_take_ownership(struct intel_digital_port *dig_port,
|
||||
bool take)
|
||||
{
|
||||
|
@ -280,7 +339,7 @@ static bool icl_tc_phy_take_ownership(struct intel_digital_port *dig_port,
|
|||
intel_uncore_write(uncore,
|
||||
PORT_TX_DFLEXDPCSSS(dig_port->tc_phy_fia), val);
|
||||
|
||||
if (!take && wait_for(!icl_tc_phy_status_complete(dig_port), 10))
|
||||
if (!take && wait_for(!tc_phy_status_complete(dig_port), 10))
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"Port %s: PHY complete clear timed out\n",
|
||||
dig_port->tc_port_name);
|
||||
|
@ -288,6 +347,34 @@ static bool icl_tc_phy_take_ownership(struct intel_digital_port *dig_port,
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool adl_tc_phy_take_ownership(struct intel_digital_port *dig_port,
|
||||
bool take)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
struct intel_uncore *uncore = &i915->uncore;
|
||||
enum port port = dig_port->base.port;
|
||||
u32 val;
|
||||
|
||||
val = intel_uncore_read(uncore, DDI_BUF_CTL(port));
|
||||
if (take)
|
||||
val |= DDI_BUF_CTL_TC_PHY_OWNERSHIP;
|
||||
else
|
||||
val &= ~DDI_BUF_CTL_TC_PHY_OWNERSHIP;
|
||||
intel_uncore_write(uncore, DDI_BUF_CTL(port), val);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool tc_phy_take_ownership(struct intel_digital_port *dig_port, bool take)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
||||
if (IS_ALDERLAKE_P(i915))
|
||||
return adl_tc_phy_take_ownership(dig_port, take);
|
||||
|
||||
return icl_tc_phy_take_ownership(dig_port, take);
|
||||
}
|
||||
|
||||
static bool icl_tc_phy_is_owned(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
@ -306,6 +393,27 @@ static bool icl_tc_phy_is_owned(struct intel_digital_port *dig_port)
|
|||
return val & DP_PHY_MODE_STATUS_NOT_SAFE(dig_port->tc_phy_fia_idx);
|
||||
}
|
||||
|
||||
static bool adl_tc_phy_is_owned(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
struct intel_uncore *uncore = &i915->uncore;
|
||||
enum port port = dig_port->base.port;
|
||||
u32 val;
|
||||
|
||||
val = intel_uncore_read(uncore, DDI_BUF_CTL(port));
|
||||
return val & DDI_BUF_CTL_TC_PHY_OWNERSHIP;
|
||||
}
|
||||
|
||||
static bool tc_phy_is_owned(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
||||
if (IS_ALDERLAKE_P(i915))
|
||||
return adl_tc_phy_is_owned(dig_port);
|
||||
|
||||
return icl_tc_phy_is_owned(dig_port);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function implements the first part of the Connect Flow described by our
|
||||
* specification, Gen11 TypeC Programming chapter. The rest of the flow (reading
|
||||
|
@ -323,13 +431,13 @@ static void icl_tc_phy_connect(struct intel_digital_port *dig_port,
|
|||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
int max_lanes;
|
||||
|
||||
if (!icl_tc_phy_status_complete(dig_port)) {
|
||||
if (!tc_phy_status_complete(dig_port)) {
|
||||
drm_dbg_kms(&i915->drm, "Port %s: PHY not ready\n",
|
||||
dig_port->tc_port_name);
|
||||
goto out_set_tbt_alt_mode;
|
||||
}
|
||||
|
||||
if (!icl_tc_phy_take_ownership(dig_port, true) &&
|
||||
if (!tc_phy_take_ownership(dig_port, true) &&
|
||||
!drm_WARN_ON(&i915->drm, dig_port->tc_legacy_port))
|
||||
goto out_set_tbt_alt_mode;
|
||||
|
||||
|
@ -364,7 +472,7 @@ static void icl_tc_phy_connect(struct intel_digital_port *dig_port,
|
|||
return;
|
||||
|
||||
out_release_phy:
|
||||
icl_tc_phy_take_ownership(dig_port, false);
|
||||
tc_phy_take_ownership(dig_port, false);
|
||||
out_set_tbt_alt_mode:
|
||||
dig_port->tc_mode = TC_PORT_TBT_ALT;
|
||||
}
|
||||
|
@ -380,7 +488,7 @@ static void icl_tc_phy_disconnect(struct intel_digital_port *dig_port)
|
|||
/* Nothing to do, we never disconnect from legacy mode */
|
||||
break;
|
||||
case TC_PORT_DP_ALT:
|
||||
icl_tc_phy_take_ownership(dig_port, false);
|
||||
tc_phy_take_ownership(dig_port, false);
|
||||
dig_port->tc_mode = TC_PORT_TBT_ALT;
|
||||
break;
|
||||
case TC_PORT_TBT_ALT:
|
||||
|
@ -395,13 +503,13 @@ static bool icl_tc_phy_is_connected(struct intel_digital_port *dig_port)
|
|||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
||||
if (!icl_tc_phy_status_complete(dig_port)) {
|
||||
if (!tc_phy_status_complete(dig_port)) {
|
||||
drm_dbg_kms(&i915->drm, "Port %s: PHY status not complete\n",
|
||||
dig_port->tc_port_name);
|
||||
return dig_port->tc_mode == TC_PORT_TBT_ALT;
|
||||
}
|
||||
|
||||
if (!icl_tc_phy_is_owned(dig_port)) {
|
||||
if (!tc_phy_is_owned(dig_port)) {
|
||||
drm_dbg_kms(&i915->drm, "Port %s: PHY not owned\n",
|
||||
dig_port->tc_port_name);
|
||||
|
||||
|
@ -419,8 +527,8 @@ intel_tc_port_get_current_mode(struct intel_digital_port *dig_port)
|
|||
u32 live_status_mask = tc_port_live_status_mask(dig_port);
|
||||
enum tc_port_mode mode;
|
||||
|
||||
if (!icl_tc_phy_is_owned(dig_port) ||
|
||||
drm_WARN_ON(&i915->drm, !icl_tc_phy_status_complete(dig_port)))
|
||||
if (!tc_phy_is_owned(dig_port) ||
|
||||
drm_WARN_ON(&i915->drm, !tc_phy_status_complete(dig_port)))
|
||||
return TC_PORT_TBT_ALT;
|
||||
|
||||
mode = dig_port->tc_legacy_port ? TC_PORT_LEGACY : TC_PORT_DP_ALT;
|
||||
|
@ -442,7 +550,7 @@ intel_tc_port_get_target_mode(struct intel_digital_port *dig_port)
|
|||
if (live_status_mask)
|
||||
return fls(live_status_mask) - 1;
|
||||
|
||||
return icl_tc_phy_status_complete(dig_port) &&
|
||||
return tc_phy_status_complete(dig_port) &&
|
||||
dig_port->tc_legacy_port ? TC_PORT_LEGACY :
|
||||
TC_PORT_TBT_ALT;
|
||||
}
|
||||
|
@ -454,7 +562,7 @@ static void intel_tc_port_reset_mode(struct intel_digital_port *dig_port,
|
|||
enum tc_port_mode old_tc_mode = dig_port->tc_mode;
|
||||
|
||||
intel_display_power_flush_work(i915);
|
||||
if (DISPLAY_VER(i915) != 11 || !dig_port->tc_legacy_port) {
|
||||
if (!intel_tc_cold_requires_aux_pw(dig_port)) {
|
||||
enum intel_display_power_domain aux_domain;
|
||||
bool aux_powered;
|
||||
|
||||
|
@ -624,13 +732,11 @@ tc_has_modular_fia(struct drm_i915_private *i915, struct intel_digital_port *dig
|
|||
if (!INTEL_INFO(i915)->display.has_modular_fia)
|
||||
return false;
|
||||
|
||||
/* TODO: check if in real HW MODULAR_FIA_MASK is set, if so remove this block */
|
||||
if (IS_ALDERLAKE_P(i915))
|
||||
return true;
|
||||
|
||||
mutex_lock(&dig_port->tc_lock);
|
||||
wakeref = tc_cold_block(dig_port);
|
||||
val = intel_uncore_read(&i915->uncore, PORT_TX_DFLEXDPSP(FIA1));
|
||||
tc_cold_unblock(dig_port, wakeref);
|
||||
mutex_unlock(&dig_port->tc_lock);
|
||||
|
||||
drm_WARN_ON(&i915->drm, val == 0xffffffff);
|
||||
|
||||
|
@ -673,3 +779,11 @@ void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
|
|||
dig_port->tc_link_refcount = 0;
|
||||
tc_port_load_fia_params(i915, dig_port);
|
||||
}
|
||||
|
||||
bool intel_tc_cold_requires_aux_pw(struct intel_digital_port *dig_port)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
|
||||
return (DISPLAY_VER(i915) == 11 && dig_port->tc_legacy_port) ||
|
||||
IS_ALDERLAKE_P(i915);
|
||||
}
|
||||
|
|
|
@ -29,4 +29,6 @@ bool intel_tc_port_ref_held(struct intel_digital_port *dig_port);
|
|||
|
||||
void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy);
|
||||
|
||||
bool intel_tc_cold_requires_aux_pw(struct intel_digital_port *dig_port);
|
||||
|
||||
#endif /* __INTEL_TC_H__ */
|
||||
|
|
|
@ -1307,7 +1307,7 @@ intel_tv_compute_config(struct intel_encoder *encoder,
|
|||
* the active portion. Hence following this formula seems
|
||||
* more trouble that it's worth.
|
||||
*
|
||||
* if (IS_GEN(dev_priv, 4)) {
|
||||
* if (GRAPHICS_VER(dev_priv) == 4) {
|
||||
* num = cdclk * (tv_mode->oversample >> !tv_mode->progressive);
|
||||
* den = tv_mode->clock;
|
||||
* } else {
|
||||
|
|
|
@ -5,12 +5,13 @@
|
|||
* Author: Gaurav K Singh <gaurav.k.singh@intel.com>
|
||||
* Manasi Navare <manasi.d.navare@intel.com>
|
||||
*/
|
||||
|
||||
#include <linux/limits.h>
|
||||
#include "i915_drv.h"
|
||||
#include "intel_de.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_dsi.h"
|
||||
#include "intel_vdsc.h"
|
||||
#include "intel_qp_tables.h"
|
||||
|
||||
enum ROW_INDEX_BPP {
|
||||
ROW_INDEX_6BPP = 0,
|
||||
|
@ -373,12 +374,81 @@ static bool is_pipe_dsc(const struct intel_crtc_state *crtc_state)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
calculate_rc_params(struct rc_parameters *rc,
|
||||
struct drm_dsc_config *vdsc_cfg)
|
||||
{
|
||||
int bpc = vdsc_cfg->bits_per_component;
|
||||
int bpp = vdsc_cfg->bits_per_pixel >> 4;
|
||||
int ofs_und6[] = { 0, -2, -2, -4, -6, -6, -8, -8, -8, -10, -10, -12, -12, -12, -12 };
|
||||
int ofs_und8[] = { 2, 0, 0, -2, -4, -6, -8, -8, -8, -10, -10, -10, -12, -12, -12 };
|
||||
int ofs_und12[] = { 2, 0, 0, -2, -4, -6, -8, -8, -8, -10, -10, -10, -12, -12, -12 };
|
||||
int ofs_und15[] = { 10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10, -10, -12, -12, -12 };
|
||||
int qp_bpc_modifier = (bpc - 8) * 2;
|
||||
u32 res, buf_i, bpp_i;
|
||||
|
||||
if (vdsc_cfg->slice_height >= 8)
|
||||
rc->first_line_bpg_offset =
|
||||
12 + DIV_ROUND_UP((9 * min(34, vdsc_cfg->slice_height - 8)), 100);
|
||||
else
|
||||
rc->first_line_bpg_offset = 2 * (vdsc_cfg->slice_height - 1);
|
||||
|
||||
/* Our hw supports only 444 modes as of today */
|
||||
if (bpp >= 12)
|
||||
rc->initial_offset = 2048;
|
||||
else if (bpp >= 10)
|
||||
rc->initial_offset = 5632 - DIV_ROUND_UP(((bpp - 10) * 3584), 2);
|
||||
else if (bpp >= 8)
|
||||
rc->initial_offset = 6144 - DIV_ROUND_UP(((bpp - 8) * 512), 2);
|
||||
else
|
||||
rc->initial_offset = 6144;
|
||||
|
||||
/* initial_xmit_delay = rc_model_size/2/compression_bpp */
|
||||
rc->initial_xmit_delay = DIV_ROUND_UP(DSC_RC_MODEL_SIZE_CONST, 2 * bpp);
|
||||
|
||||
rc->flatness_min_qp = 3 + qp_bpc_modifier;
|
||||
rc->flatness_max_qp = 12 + qp_bpc_modifier;
|
||||
|
||||
rc->rc_quant_incr_limit0 = 11 + qp_bpc_modifier;
|
||||
rc->rc_quant_incr_limit1 = 11 + qp_bpc_modifier;
|
||||
|
||||
bpp_i = (2 * (bpp - 6));
|
||||
for (buf_i = 0; buf_i < DSC_NUM_BUF_RANGES; buf_i++) {
|
||||
/* Read range_minqp and range_max_qp from qp tables */
|
||||
rc->rc_range_params[buf_i].range_min_qp =
|
||||
intel_lookup_range_min_qp(bpc, buf_i, bpp_i);
|
||||
rc->rc_range_params[buf_i].range_max_qp =
|
||||
intel_lookup_range_max_qp(bpc, buf_i, bpp_i);
|
||||
|
||||
/* Calculate range_bgp_offset */
|
||||
if (bpp <= 6) {
|
||||
rc->rc_range_params[buf_i].range_bpg_offset = ofs_und6[buf_i];
|
||||
} else if (bpp <= 8) {
|
||||
res = DIV_ROUND_UP(((bpp - 6) * (ofs_und8[buf_i] - ofs_und6[buf_i])), 2);
|
||||
rc->rc_range_params[buf_i].range_bpg_offset =
|
||||
ofs_und6[buf_i] + res;
|
||||
} else if (bpp <= 12) {
|
||||
rc->rc_range_params[buf_i].range_bpg_offset =
|
||||
ofs_und8[buf_i];
|
||||
} else if (bpp <= 15) {
|
||||
res = DIV_ROUND_UP(((bpp - 12) * (ofs_und15[buf_i] - ofs_und12[buf_i])), 3);
|
||||
rc->rc_range_params[buf_i].range_bpg_offset =
|
||||
ofs_und12[buf_i] + res;
|
||||
} else {
|
||||
rc->rc_range_params[buf_i].range_bpg_offset =
|
||||
ofs_und15[buf_i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int intel_dsc_compute_params(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct drm_dsc_config *vdsc_cfg = &pipe_config->dsc.config;
|
||||
u16 compressed_bpp = pipe_config->dsc.compressed_bpp;
|
||||
const struct rc_parameters *rc_params;
|
||||
struct rc_parameters *rc = NULL;
|
||||
u8 i = 0;
|
||||
|
||||
vdsc_cfg->pic_width = pipe_config->hw.adjusted_mode.crtc_hdisplay;
|
||||
|
@ -413,9 +483,24 @@ int intel_dsc_compute_params(struct intel_encoder *encoder,
|
|||
vdsc_cfg->rc_buf_thresh[13] = 0x7D;
|
||||
}
|
||||
|
||||
rc_params = get_rc_params(compressed_bpp, vdsc_cfg->bits_per_component);
|
||||
if (!rc_params)
|
||||
return -EINVAL;
|
||||
/*
|
||||
* From XE_LPD onwards we supports compression bpps in steps of 1
|
||||
* upto uncompressed bpp-1, hence add calculations for all the rc
|
||||
* parameters
|
||||
*/
|
||||
if (DISPLAY_VER(dev_priv) >= 13) {
|
||||
rc = kmalloc(sizeof(*rc), GFP_KERNEL);
|
||||
if (!rc)
|
||||
return -ENOMEM;
|
||||
|
||||
calculate_rc_params(rc, vdsc_cfg);
|
||||
rc_params = rc;
|
||||
} else {
|
||||
rc_params = get_rc_params(compressed_bpp,
|
||||
vdsc_cfg->bits_per_component);
|
||||
if (!rc_params)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vdsc_cfg->first_line_bpg_offset = rc_params->first_line_bpg_offset;
|
||||
vdsc_cfg->initial_xmit_delay = rc_params->initial_xmit_delay;
|
||||
|
@ -441,20 +526,20 @@ int intel_dsc_compute_params(struct intel_encoder *encoder,
|
|||
|
||||
/*
|
||||
* BitsPerComponent value determines mux_word_size:
|
||||
* When BitsPerComponent is 12bpc, muxWordSize will be equal to 64 bits
|
||||
* When BitsPerComponent is 8 or 10bpc, muxWordSize will be equal to
|
||||
* 48 bits
|
||||
* When BitsPerComponent is less than or 10bpc, muxWordSize will be equal to
|
||||
* 48 bits otherwise 64
|
||||
*/
|
||||
if (vdsc_cfg->bits_per_component == 8 ||
|
||||
vdsc_cfg->bits_per_component == 10)
|
||||
if (vdsc_cfg->bits_per_component <= 10)
|
||||
vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_8_10_BPC;
|
||||
else if (vdsc_cfg->bits_per_component == 12)
|
||||
else
|
||||
vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_12_BPC;
|
||||
|
||||
/* InitialScaleValue is a 6 bit value with 3 fractional bits (U3.3) */
|
||||
vdsc_cfg->initial_scale_value = (vdsc_cfg->rc_model_size << 3) /
|
||||
(vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset);
|
||||
|
||||
kfree(rc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1076,12 +1161,12 @@ void intel_dsc_disable(const struct intel_crtc_state *old_crtc_state)
|
|||
struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
|
||||
if (!(old_crtc_state->dsc.compression_enable &&
|
||||
old_crtc_state->bigjoiner))
|
||||
return;
|
||||
|
||||
intel_de_write(dev_priv, dss_ctl1_reg(old_crtc_state), 0);
|
||||
intel_de_write(dev_priv, dss_ctl2_reg(old_crtc_state), 0);
|
||||
/* Disable only if either of them is enabled */
|
||||
if (old_crtc_state->dsc.compression_enable ||
|
||||
old_crtc_state->bigjoiner) {
|
||||
intel_de_write(dev_priv, dss_ctl1_reg(old_crtc_state), 0);
|
||||
intel_de_write(dev_priv, dss_ctl2_reg(old_crtc_state), 0);
|
||||
}
|
||||
}
|
||||
|
||||
void intel_uncompressed_joiner_get_config(struct intel_crtc_state *crtc_state)
|
||||
|
|
|
@ -68,7 +68,10 @@ static int intel_vrr_vblank_exit_length(const struct intel_crtc_state *crtc_stat
|
|||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
||||
|
||||
/* The hw imposes the extra scanline before frame start */
|
||||
return crtc_state->vrr.pipeline_full + i915->framestart_delay + 1;
|
||||
if (DISPLAY_VER(i915) >= 13)
|
||||
return crtc_state->vrr.guardband + i915->framestart_delay + 1;
|
||||
else
|
||||
return crtc_state->vrr.pipeline_full + i915->framestart_delay + 1;
|
||||
}
|
||||
|
||||
int intel_vrr_vmin_vblank_start(const struct intel_crtc_state *crtc_state)
|
||||
|
@ -86,6 +89,8 @@ void
|
|||
intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
|
||||
struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
||||
struct intel_connector *connector =
|
||||
to_intel_connector(conn_state->connector);
|
||||
struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
|
||||
|
@ -124,17 +129,26 @@ intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
|
|||
crtc_state->vrr.flipline = crtc_state->vrr.vmin + 1;
|
||||
|
||||
/*
|
||||
* FIXME: s/4/framestart_delay+1/ to get consistent
|
||||
* earliest/latest points for register latching regardless
|
||||
* of the framestart_delay used?
|
||||
*
|
||||
* FIXME: this really needs the extra scanline to provide consistent
|
||||
* behaviour for all framestart_delay values. Otherwise with
|
||||
* framestart_delay==3 we will end up extending the min vblank by
|
||||
* one extra line.
|
||||
* For XE_LPD+, we use guardband and pipeline override
|
||||
* is deprecated.
|
||||
*/
|
||||
crtc_state->vrr.pipeline_full =
|
||||
min(255, crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay - 4 - 1);
|
||||
if (DISPLAY_VER(i915) >= 13)
|
||||
crtc_state->vrr.guardband =
|
||||
crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay -
|
||||
i915->window2_delay;
|
||||
else
|
||||
/*
|
||||
* FIXME: s/4/framestart_delay+1/ to get consistent
|
||||
* earliest/latest points for register latching regardless
|
||||
* of the framestart_delay used?
|
||||
*
|
||||
* FIXME: this really needs the extra scanline to provide consistent
|
||||
* behaviour for all framestart_delay values. Otherwise with
|
||||
* framestart_delay==3 we will end up extending the min vblank by
|
||||
* one extra line.
|
||||
*/
|
||||
crtc_state->vrr.pipeline_full =
|
||||
min(255, crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay - 4 - 1);
|
||||
|
||||
crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
|
||||
}
|
||||
|
@ -149,10 +163,15 @@ void intel_vrr_enable(struct intel_encoder *encoder,
|
|||
if (!crtc_state->vrr.enable)
|
||||
return;
|
||||
|
||||
trans_vrr_ctl = VRR_CTL_VRR_ENABLE |
|
||||
VRR_CTL_IGN_MAX_SHIFT | VRR_CTL_FLIP_LINE_EN |
|
||||
VRR_CTL_PIPELINE_FULL(crtc_state->vrr.pipeline_full) |
|
||||
VRR_CTL_PIPELINE_FULL_OVERRIDE;
|
||||
if (DISPLAY_VER(dev_priv) >= 13)
|
||||
trans_vrr_ctl = VRR_CTL_VRR_ENABLE |
|
||||
VRR_CTL_IGN_MAX_SHIFT | VRR_CTL_FLIP_LINE_EN |
|
||||
XELPD_VRR_CTL_VRR_GUARDBAND(crtc_state->vrr.guardband);
|
||||
else
|
||||
trans_vrr_ctl = VRR_CTL_VRR_ENABLE |
|
||||
VRR_CTL_IGN_MAX_SHIFT | VRR_CTL_FLIP_LINE_EN |
|
||||
VRR_CTL_PIPELINE_FULL(crtc_state->vrr.pipeline_full) |
|
||||
VRR_CTL_PIPELINE_FULL_OVERRIDE;
|
||||
|
||||
intel_de_write(dev_priv, TRANS_VRR_VMIN(cpu_transcoder), crtc_state->vrr.vmin - 1);
|
||||
intel_de_write(dev_priv, TRANS_VRR_VMAX(cpu_transcoder), crtc_state->vrr.vmax - 1);
|
||||
|
@ -199,8 +218,13 @@ void intel_vrr_get_config(struct intel_crtc *crtc,
|
|||
if (!crtc_state->vrr.enable)
|
||||
return;
|
||||
|
||||
if (trans_vrr_ctl & VRR_CTL_PIPELINE_FULL_OVERRIDE)
|
||||
crtc_state->vrr.pipeline_full = REG_FIELD_GET(VRR_CTL_PIPELINE_FULL_MASK, trans_vrr_ctl);
|
||||
if (DISPLAY_VER(dev_priv) >= 13)
|
||||
crtc_state->vrr.guardband =
|
||||
REG_FIELD_GET(XELPD_VRR_CTL_VRR_GUARDBAND_MASK, trans_vrr_ctl);
|
||||
else
|
||||
if (trans_vrr_ctl & VRR_CTL_PIPELINE_FULL_OVERRIDE)
|
||||
crtc_state->vrr.pipeline_full =
|
||||
REG_FIELD_GET(VRR_CTL_PIPELINE_FULL_MASK, trans_vrr_ctl);
|
||||
if (trans_vrr_ctl & VRR_CTL_FLIP_LINE_EN)
|
||||
crtc_state->vrr.flipline = intel_de_read(dev_priv, TRANS_VRR_FLIPLINE(cpu_transcoder)) + 1;
|
||||
crtc_state->vrr.vmax = intel_de_read(dev_priv, TRANS_VRR_VMAX(cpu_transcoder)) + 1;
|
||||
|
|
|
@ -850,6 +850,29 @@ static u32 cnl_plane_ctl_flip(unsigned int reflect)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u32 adlp_plane_ctl_arb_slots(const struct intel_plane_state *plane_state)
|
||||
{
|
||||
const struct drm_framebuffer *fb = plane_state->hw.fb;
|
||||
|
||||
if (intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier)) {
|
||||
switch (fb->format->cpp[0]) {
|
||||
case 2:
|
||||
return PLANE_CTL_ARB_SLOTS(1);
|
||||
default:
|
||||
return PLANE_CTL_ARB_SLOTS(0);
|
||||
}
|
||||
} else {
|
||||
switch (fb->format->cpp[0]) {
|
||||
case 8:
|
||||
return PLANE_CTL_ARB_SLOTS(3);
|
||||
case 4:
|
||||
return PLANE_CTL_ARB_SLOTS(1);
|
||||
default:
|
||||
return PLANE_CTL_ARB_SLOTS(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static u32 skl_plane_ctl_crtc(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
|
||||
|
@ -903,6 +926,10 @@ static u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state,
|
|||
else if (key->flags & I915_SET_COLORKEY_SOURCE)
|
||||
plane_ctl |= PLANE_CTL_KEY_ENABLE_SOURCE;
|
||||
|
||||
/* Wa_22012358565:adlp */
|
||||
if (DISPLAY_VER(dev_priv) == 13)
|
||||
plane_ctl |= adlp_plane_ctl_arb_slots(plane_state);
|
||||
|
||||
return plane_ctl;
|
||||
}
|
||||
|
||||
|
|
|
@ -359,6 +359,7 @@ struct i915_ppgtt {
|
|||
|
||||
#define i915_is_ggtt(vm) ((vm)->is_ggtt)
|
||||
#define i915_is_dpt(vm) ((vm)->is_dpt)
|
||||
#define i915_is_ggtt_or_dpt(vm) (i915_is_ggtt(vm) || i915_is_dpt(vm))
|
||||
|
||||
int __must_check
|
||||
i915_vm_lock_objects(struct i915_address_space *vm, struct i915_gem_ww_ctx *ww);
|
||||
|
@ -393,7 +394,7 @@ static inline struct i915_ppgtt *
|
|||
i915_vm_to_ppgtt(struct i915_address_space *vm)
|
||||
{
|
||||
BUILD_BUG_ON(offsetof(struct i915_ppgtt, vm));
|
||||
GEM_BUG_ON(i915_is_ggtt(vm));
|
||||
GEM_BUG_ON(i915_is_ggtt_or_dpt(vm));
|
||||
return container_of(vm, struct i915_ppgtt, vm);
|
||||
}
|
||||
|
||||
|
|
|
@ -1006,7 +1006,7 @@ static int cmd_reg_handler(struct parser_exec_state *s,
|
|||
* update reg values in it into vregs, so LRIs in workload with
|
||||
* inhibit context will restore with correct values
|
||||
*/
|
||||
if (IS_GEN(s->engine->i915, 9) &&
|
||||
if (GRAPHICS_VER(s->engine->i915) == 9 &&
|
||||
intel_gvt_mmio_is_sr_in_ctx(gvt, offset) &&
|
||||
!strncmp(cmd, "lri", 3)) {
|
||||
intel_gvt_hypervisor_read_gpa(s->vgpu,
|
||||
|
@ -1390,7 +1390,7 @@ static int gen8_check_mi_display_flip(struct parser_exec_state *s,
|
|||
if (!info->async_flip)
|
||||
return 0;
|
||||
|
||||
if (INTEL_GEN(s->engine->i915) >= 9) {
|
||||
if (GRAPHICS_VER(s->engine->i915) >= 9) {
|
||||
stride = vgpu_vreg_t(s->vgpu, info->stride_reg) & GENMASK(9, 0);
|
||||
tile = (vgpu_vreg_t(s->vgpu, info->ctrl_reg) &
|
||||
GENMASK(12, 10)) >> 10;
|
||||
|
@ -1418,7 +1418,7 @@ static int gen8_update_plane_mmio_from_mi_display_flip(
|
|||
|
||||
set_mask_bits(&vgpu_vreg_t(vgpu, info->surf_reg), GENMASK(31, 12),
|
||||
info->surf_val << 12);
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
if (GRAPHICS_VER(dev_priv) >= 9) {
|
||||
set_mask_bits(&vgpu_vreg_t(vgpu, info->stride_reg), GENMASK(9, 0),
|
||||
info->stride_val);
|
||||
set_mask_bits(&vgpu_vreg_t(vgpu, info->ctrl_reg), GENMASK(12, 10),
|
||||
|
@ -1446,7 +1446,7 @@ static int decode_mi_display_flip(struct parser_exec_state *s,
|
|||
{
|
||||
if (IS_BROADWELL(s->engine->i915))
|
||||
return gen8_decode_mi_display_flip(s, info);
|
||||
if (INTEL_GEN(s->engine->i915) >= 9)
|
||||
if (GRAPHICS_VER(s->engine->i915) >= 9)
|
||||
return skl_decode_mi_display_flip(s, info);
|
||||
|
||||
return -ENODEV;
|
||||
|
|
|
@ -223,7 +223,7 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev,
|
|||
|
||||
obj->read_domains = I915_GEM_DOMAIN_GTT;
|
||||
obj->write_domain = 0;
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
if (GRAPHICS_VER(dev_priv) >= 9) {
|
||||
unsigned int tiling_mode = 0;
|
||||
unsigned int stride = 0;
|
||||
|
||||
|
|
|
@ -151,7 +151,7 @@ static u32 intel_vgpu_get_stride(struct intel_vgpu *vgpu, int pipe,
|
|||
u32 stride_reg = vgpu_vreg_t(vgpu, DSPSTRIDE(pipe)) & stride_mask;
|
||||
u32 stride = stride_reg;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
if (GRAPHICS_VER(dev_priv) >= 9) {
|
||||
switch (tiled) {
|
||||
case PLANE_CTL_TILED_LINEAR:
|
||||
stride = stride_reg * 64;
|
||||
|
@ -215,7 +215,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu,
|
|||
if (!plane->enabled)
|
||||
return -ENODEV;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
if (GRAPHICS_VER(dev_priv) >= 9) {
|
||||
plane->tiled = val & PLANE_CTL_TILED_MASK;
|
||||
fmt = skl_format_to_drm(
|
||||
val & PLANE_CTL_FORMAT_MASK,
|
||||
|
@ -256,9 +256,9 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu,
|
|||
}
|
||||
|
||||
plane->stride = intel_vgpu_get_stride(vgpu, pipe, plane->tiled,
|
||||
(INTEL_GEN(dev_priv) >= 9) ?
|
||||
(_PRI_PLANE_STRIDE_MASK >> 6) :
|
||||
_PRI_PLANE_STRIDE_MASK, plane->bpp);
|
||||
(GRAPHICS_VER(dev_priv) >= 9) ?
|
||||
(_PRI_PLANE_STRIDE_MASK >> 6) :
|
||||
_PRI_PLANE_STRIDE_MASK, plane->bpp);
|
||||
|
||||
plane->width = (vgpu_vreg_t(vgpu, PIPESRC(pipe)) & _PIPE_H_SRCSZ_MASK) >>
|
||||
_PIPE_H_SRCSZ_SHIFT;
|
||||
|
|
|
@ -1055,12 +1055,12 @@ static bool vgpu_ips_enabled(struct intel_vgpu *vgpu)
|
|||
{
|
||||
struct drm_i915_private *dev_priv = vgpu->gvt->gt->i915;
|
||||
|
||||
if (INTEL_GEN(dev_priv) == 9 || INTEL_GEN(dev_priv) == 10) {
|
||||
if (GRAPHICS_VER(dev_priv) == 9 || GRAPHICS_VER(dev_priv) == 10) {
|
||||
u32 ips = vgpu_vreg_t(vgpu, GEN8_GAMW_ECO_DEV_RW_IA) &
|
||||
GAMW_ECO_ENABLE_64K_IPS_FIELD;
|
||||
|
||||
return ips == GAMW_ECO_ENABLE_64K_IPS_FIELD;
|
||||
} else if (INTEL_GEN(dev_priv) >= 11) {
|
||||
} else if (GRAPHICS_VER(dev_priv) >= 11) {
|
||||
/* 64K paging only controlled by IPS bit in PTE now. */
|
||||
return true;
|
||||
} else
|
||||
|
|
|
@ -220,7 +220,7 @@ static int gamw_echo_dev_rw_ia_write(struct intel_vgpu *vgpu,
|
|||
{
|
||||
u32 ips = (*(u32 *)p_data) & GAMW_ECO_ENABLE_64K_IPS_FIELD;
|
||||
|
||||
if (INTEL_GEN(vgpu->gvt->gt->i915) <= 10) {
|
||||
if (GRAPHICS_VER(vgpu->gvt->gt->i915) <= 10) {
|
||||
if (ips == GAMW_ECO_ENABLE_64K_IPS_FIELD)
|
||||
gvt_dbg_core("vgpu%d: ips enabled\n", vgpu->id);
|
||||
else if (!ips)
|
||||
|
@ -286,7 +286,7 @@ static int mul_force_wake_write(struct intel_vgpu *vgpu,
|
|||
old = vgpu_vreg(vgpu, offset);
|
||||
new = CALC_MODE_MASK_REG(old, *(u32 *)p_data);
|
||||
|
||||
if (INTEL_GEN(vgpu->gvt->gt->i915) >= 9) {
|
||||
if (GRAPHICS_VER(vgpu->gvt->gt->i915) >= 9) {
|
||||
switch (offset) {
|
||||
case FORCEWAKE_RENDER_GEN9_REG:
|
||||
ack_reg_offset = FORCEWAKE_ACK_RENDER_GEN9_REG;
|
||||
|
@ -1174,7 +1174,7 @@ static int dp_aux_ch_ctl_mmio_write(struct intel_vgpu *vgpu,
|
|||
write_vreg(vgpu, offset, p_data, bytes);
|
||||
data = vgpu_vreg(vgpu, offset);
|
||||
|
||||
if ((INTEL_GEN(vgpu->gvt->gt->i915) >= 9)
|
||||
if ((GRAPHICS_VER(vgpu->gvt->gt->i915) >= 9)
|
||||
&& offset != _REG_SKL_DP_AUX_CH_CTL(port_index)) {
|
||||
/* SKL DPB/C/D aux ctl register changed */
|
||||
return 0;
|
||||
|
@ -3342,9 +3342,9 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
|
|||
MMIO_D(_MMIO(_PLANE_SURF_3_A), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_PLANE_SURF_3_B), D_SKL_PLUS);
|
||||
|
||||
MMIO_D(CSR_SSP_BASE, D_SKL_PLUS);
|
||||
MMIO_D(CSR_HTP_SKL, D_SKL_PLUS);
|
||||
MMIO_D(CSR_LAST_WRITE, D_SKL_PLUS);
|
||||
MMIO_D(DMC_SSP_BASE, D_SKL_PLUS);
|
||||
MMIO_D(DMC_HTP_SKL, D_SKL_PLUS);
|
||||
MMIO_D(DMC_LAST_WRITE, D_SKL_PLUS);
|
||||
|
||||
MMIO_DFH(BDW_SCRATCH1, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
|
||||
|
@ -3655,7 +3655,7 @@ void intel_gvt_clean_mmio_info(struct intel_gvt *gvt)
|
|||
* otherwise, need to update cmd_reg_handler in cmd_parser.c
|
||||
*/
|
||||
static struct gvt_mmio_block mmio_blocks[] = {
|
||||
{D_SKL_PLUS, _MMIO(CSR_MMIO_START_RANGE), 0x3000, NULL, NULL},
|
||||
{D_SKL_PLUS, _MMIO(DMC_MMIO_START_RANGE), 0x3000, NULL, NULL},
|
||||
{D_ALL, _MMIO(MCHBAR_MIRROR_BASE_SNB), 0x40000, NULL, NULL},
|
||||
{D_ALL, _MMIO(VGT_PVINFO_PAGE), VGT_PVINFO_SIZE,
|
||||
pvinfo_mmio_read, pvinfo_mmio_write},
|
||||
|
|
|
@ -585,7 +585,7 @@ static void gen8_init_irq(
|
|||
|
||||
SET_BIT_INFO(irq, 4, PRIMARY_C_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_C);
|
||||
SET_BIT_INFO(irq, 5, SPRITE_C_FLIP_DONE, INTEL_GVT_IRQ_INFO_DE_PIPE_C);
|
||||
} else if (INTEL_GEN(gvt->gt->i915) >= 9) {
|
||||
} else if (GRAPHICS_VER(gvt->gt->i915) >= 9) {
|
||||
SET_BIT_INFO(irq, 25, AUX_CHANNEL_B, INTEL_GVT_IRQ_INFO_DE_PORT);
|
||||
SET_BIT_INFO(irq, 26, AUX_CHANNEL_C, INTEL_GVT_IRQ_INFO_DE_PORT);
|
||||
SET_BIT_INFO(irq, 27, AUX_CHANNEL_D, INTEL_GVT_IRQ_INFO_DE_PORT);
|
||||
|
|
|
@ -373,7 +373,7 @@ static void handle_tlb_pending_event(struct intel_vgpu *vgpu,
|
|||
*/
|
||||
fw = intel_uncore_forcewake_for_reg(uncore, reg,
|
||||
FW_REG_READ | FW_REG_WRITE);
|
||||
if (engine->id == RCS0 && INTEL_GEN(engine->i915) >= 9)
|
||||
if (engine->id == RCS0 && GRAPHICS_VER(engine->i915) >= 9)
|
||||
fw |= FORCEWAKE_RENDER;
|
||||
|
||||
intel_uncore_forcewake_get(uncore, fw);
|
||||
|
@ -409,7 +409,7 @@ static void switch_mocs(struct intel_vgpu *pre, struct intel_vgpu *next,
|
|||
if (drm_WARN_ON(&engine->i915->drm, engine->id >= ARRAY_SIZE(regs)))
|
||||
return;
|
||||
|
||||
if (engine->id == RCS0 && IS_GEN(engine->i915, 9))
|
||||
if (engine->id == RCS0 && GRAPHICS_VER(engine->i915) == 9)
|
||||
return;
|
||||
|
||||
if (!pre && !gen9_render_mocs.initialized)
|
||||
|
@ -474,7 +474,7 @@ static void switch_mmio(struct intel_vgpu *pre,
|
|||
struct engine_mmio *mmio;
|
||||
u32 old_v, new_v;
|
||||
|
||||
if (INTEL_GEN(engine->i915) >= 9)
|
||||
if (GRAPHICS_VER(engine->i915) >= 9)
|
||||
switch_mocs(pre, next, engine);
|
||||
|
||||
for (mmio = engine->i915->gvt->engine_mmio_list.mmio;
|
||||
|
@ -486,7 +486,7 @@ static void switch_mmio(struct intel_vgpu *pre,
|
|||
* state image on gen9, it's initialized by lri command and
|
||||
* save or restore with context together.
|
||||
*/
|
||||
if (IS_GEN(engine->i915, 9) && mmio->in_context)
|
||||
if (GRAPHICS_VER(engine->i915) == 9 && mmio->in_context)
|
||||
continue;
|
||||
|
||||
// save
|
||||
|
@ -580,7 +580,7 @@ void intel_gvt_init_engine_mmio_context(struct intel_gvt *gvt)
|
|||
{
|
||||
struct engine_mmio *mmio;
|
||||
|
||||
if (INTEL_GEN(gvt->gt->i915) >= 9) {
|
||||
if (GRAPHICS_VER(gvt->gt->i915) >= 9) {
|
||||
gvt->engine_mmio_list.mmio = gen9_engine_mmio_list;
|
||||
gvt->engine_mmio_list.tlb_mmio_offset_list = gen8_tlb_mmio_offset_list;
|
||||
gvt->engine_mmio_list.tlb_mmio_offset_list_cnt = ARRAY_SIZE(gen8_tlb_mmio_offset_list);
|
||||
|
|
|
@ -364,7 +364,7 @@ static int copy_workload_to_ring_buffer(struct intel_vgpu_workload *workload)
|
|||
u32 *cs;
|
||||
int err;
|
||||
|
||||
if (IS_GEN(req->engine->i915, 9) && is_inhibit_context(req->context))
|
||||
if (GRAPHICS_VER(req->engine->i915) == 9 && is_inhibit_context(req->context))
|
||||
intel_vgpu_restore_inhibit_context(vgpu, req);
|
||||
|
||||
/*
|
||||
|
@ -1148,7 +1148,7 @@ static void complete_current_workload(struct intel_gvt *gvt, int ring_id)
|
|||
static int workload_thread(void *arg)
|
||||
{
|
||||
struct intel_engine_cs *engine = arg;
|
||||
const bool need_force_wake = INTEL_GEN(engine->i915) >= 9;
|
||||
const bool need_force_wake = GRAPHICS_VER(engine->i915) >= 9;
|
||||
struct intel_gvt *gvt = engine->i915->gvt;
|
||||
struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
|
||||
struct intel_vgpu_workload *workload = NULL;
|
||||
|
|
|
@ -149,10 +149,10 @@ int intel_gvt_init_vgpu_types(struct intel_gvt *gvt)
|
|||
gvt->types[i].avail_instance = min(low_avail / vgpu_types[i].low_mm,
|
||||
high_avail / vgpu_types[i].high_mm);
|
||||
|
||||
if (IS_GEN(gvt->gt->i915, 8))
|
||||
if (GRAPHICS_VER(gvt->gt->i915) == 8)
|
||||
sprintf(gvt->types[i].name, "GVTg_V4_%s",
|
||||
vgpu_types[i].name);
|
||||
else if (IS_GEN(gvt->gt->i915, 9))
|
||||
else if (GRAPHICS_VER(gvt->gt->i915) == 9)
|
||||
sprintf(gvt->types[i].name, "GVTg_V5_%s",
|
||||
vgpu_types[i].name);
|
||||
|
||||
|
|
|
@ -946,8 +946,8 @@ int intel_engine_init_cmd_parser(struct intel_engine_cs *engine)
|
|||
int cmd_table_count;
|
||||
int ret;
|
||||
|
||||
if (!IS_GEN(engine->i915, 7) && !(IS_GEN(engine->i915, 9) &&
|
||||
engine->class == COPY_ENGINE_CLASS))
|
||||
if (GRAPHICS_VER(engine->i915) != 7 && !(GRAPHICS_VER(engine->i915) == 9 &&
|
||||
engine->class == COPY_ENGINE_CLASS))
|
||||
return 0;
|
||||
|
||||
switch (engine->class) {
|
||||
|
@ -977,7 +977,7 @@ int intel_engine_init_cmd_parser(struct intel_engine_cs *engine)
|
|||
break;
|
||||
case COPY_ENGINE_CLASS:
|
||||
engine->get_cmd_length_mask = gen7_blt_get_cmd_length_mask;
|
||||
if (IS_GEN(engine->i915, 9)) {
|
||||
if (GRAPHICS_VER(engine->i915) == 9) {
|
||||
cmd_tables = gen9_blt_cmd_table;
|
||||
cmd_table_count = ARRAY_SIZE(gen9_blt_cmd_table);
|
||||
engine->get_cmd_length_mask =
|
||||
|
@ -993,7 +993,7 @@ int intel_engine_init_cmd_parser(struct intel_engine_cs *engine)
|
|||
cmd_table_count = ARRAY_SIZE(gen7_blt_cmd_table);
|
||||
}
|
||||
|
||||
if (IS_GEN(engine->i915, 9)) {
|
||||
if (GRAPHICS_VER(engine->i915) == 9) {
|
||||
engine->reg_tables = gen9_blt_reg_tables;
|
||||
engine->reg_table_count =
|
||||
ARRAY_SIZE(gen9_blt_reg_tables);
|
||||
|
@ -1537,7 +1537,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
|
|||
if (IS_HASWELL(engine->i915))
|
||||
flags = MI_BATCH_NON_SECURE_HSW;
|
||||
|
||||
GEM_BUG_ON(!IS_GEN_RANGE(engine->i915, 6, 7));
|
||||
GEM_BUG_ON(!IS_GRAPHICS_VER(engine->i915, 6, 7));
|
||||
__gen6_emit_bb_start(batch_end,
|
||||
batch_addr,
|
||||
flags);
|
||||
|
|
|
@ -124,6 +124,17 @@ stringify_page_sizes(unsigned int page_sizes, char *buf, size_t len)
|
|||
}
|
||||
}
|
||||
|
||||
static const char *stringify_vma_type(const struct i915_vma *vma)
|
||||
{
|
||||
if (i915_vma_is_ggtt(vma))
|
||||
return "ggtt";
|
||||
|
||||
if (i915_vma_is_dpt(vma))
|
||||
return "dpt";
|
||||
|
||||
return "ppgtt";
|
||||
}
|
||||
|
||||
void
|
||||
i915_debugfs_describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
|
||||
{
|
||||
|
@ -156,11 +167,11 @@ i915_debugfs_describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
|
|||
if (i915_vma_is_pinned(vma))
|
||||
pin_count++;
|
||||
|
||||
seq_printf(m, " (%sgtt offset: %08llx, size: %08llx, pages: %s",
|
||||
i915_vma_is_ggtt(vma) ? "g" : "pp",
|
||||
seq_printf(m, " (%s offset: %08llx, size: %08llx, pages: %s",
|
||||
stringify_vma_type(vma),
|
||||
vma->node.start, vma->node.size,
|
||||
stringify_page_sizes(vma->page_sizes.gtt, NULL, 0));
|
||||
if (i915_vma_is_ggtt(vma)) {
|
||||
if (i915_vma_is_ggtt(vma) || i915_vma_is_dpt(vma)) {
|
||||
switch (vma->ggtt_view.type) {
|
||||
case I915_GGTT_VIEW_NORMAL:
|
||||
seq_puts(m, ", normal");
|
||||
|
@ -350,7 +361,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
|
|||
|
||||
wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
|
||||
|
||||
if (IS_GEN(dev_priv, 5)) {
|
||||
if (GRAPHICS_VER(dev_priv) == 5) {
|
||||
u16 rgvswctl = intel_uncore_read16(uncore, MEMSWCTL);
|
||||
u16 rgvstat = intel_uncore_read16(uncore, MEMSTAT_ILK);
|
||||
|
||||
|
@ -397,7 +408,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
|
|||
seq_printf(m,
|
||||
"efficient (RPe) frequency: %d MHz\n",
|
||||
intel_gpu_freq(rps, rps->efficient_freq));
|
||||
} else if (INTEL_GEN(dev_priv) >= 6) {
|
||||
} else if (GRAPHICS_VER(dev_priv) >= 6) {
|
||||
u32 rp_state_limits;
|
||||
u32 gt_perf_status;
|
||||
u32 rp_state_cap;
|
||||
|
@ -421,7 +432,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
|
|||
intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
|
||||
|
||||
reqf = intel_uncore_read(&dev_priv->uncore, GEN6_RPNSWREQ);
|
||||
if (INTEL_GEN(dev_priv) >= 9)
|
||||
if (GRAPHICS_VER(dev_priv) >= 9)
|
||||
reqf >>= 23;
|
||||
else {
|
||||
reqf &= ~GEN6_TURBO_DISABLE;
|
||||
|
@ -447,7 +458,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
|
|||
|
||||
intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 11) {
|
||||
if (GRAPHICS_VER(dev_priv) >= 11) {
|
||||
pm_ier = intel_uncore_read(&dev_priv->uncore, GEN11_GPM_WGBOXPERF_INTR_ENABLE);
|
||||
pm_imr = intel_uncore_read(&dev_priv->uncore, GEN11_GPM_WGBOXPERF_INTR_MASK);
|
||||
/*
|
||||
|
@ -456,7 +467,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
|
|||
*/
|
||||
pm_isr = 0;
|
||||
pm_iir = 0;
|
||||
} else if (INTEL_GEN(dev_priv) >= 8) {
|
||||
} else if (GRAPHICS_VER(dev_priv) >= 8) {
|
||||
pm_ier = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IER(2));
|
||||
pm_imr = intel_uncore_read(&dev_priv->uncore, GEN8_GT_IMR(2));
|
||||
pm_isr = intel_uncore_read(&dev_priv->uncore, GEN8_GT_ISR(2));
|
||||
|
@ -479,14 +490,14 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
|
|||
|
||||
seq_printf(m, "PM IER=0x%08x IMR=0x%08x, MASK=0x%08x\n",
|
||||
pm_ier, pm_imr, pm_mask);
|
||||
if (INTEL_GEN(dev_priv) <= 10)
|
||||
if (GRAPHICS_VER(dev_priv) <= 10)
|
||||
seq_printf(m, "PM ISR=0x%08x IIR=0x%08x\n",
|
||||
pm_isr, pm_iir);
|
||||
seq_printf(m, "pm_intrmsk_mbz: 0x%08x\n",
|
||||
rps->pm_intrmsk_mbz);
|
||||
seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status);
|
||||
seq_printf(m, "Render p-state ratio: %d\n",
|
||||
(gt_perf_status & (INTEL_GEN(dev_priv) >= 9 ? 0x1ff00 : 0xff00)) >> 8);
|
||||
(gt_perf_status & (GRAPHICS_VER(dev_priv) >= 9 ? 0x1ff00 : 0xff00)) >> 8);
|
||||
seq_printf(m, "Render p-state VID: %d\n",
|
||||
gt_perf_status & 0xff);
|
||||
seq_printf(m, "Render p-state limit: %d\n",
|
||||
|
@ -527,20 +538,20 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
|
|||
max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 0 :
|
||||
rp_state_cap >> 16) & 0xff;
|
||||
max_freq *= (IS_GEN9_BC(dev_priv) ||
|
||||
INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
|
||||
GRAPHICS_VER(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
|
||||
seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
|
||||
intel_gpu_freq(rps, max_freq));
|
||||
|
||||
max_freq = (rp_state_cap & 0xff00) >> 8;
|
||||
max_freq *= (IS_GEN9_BC(dev_priv) ||
|
||||
INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
|
||||
GRAPHICS_VER(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
|
||||
seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
|
||||
intel_gpu_freq(rps, max_freq));
|
||||
|
||||
max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 16 :
|
||||
rp_state_cap >> 0) & 0xff;
|
||||
max_freq *= (IS_GEN9_BC(dev_priv) ||
|
||||
INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
|
||||
GRAPHICS_VER(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
|
||||
seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
|
||||
intel_gpu_freq(rps, max_freq));
|
||||
seq_printf(m, "Max overclocked frequency: %dMHz\n",
|
||||
|
@ -611,12 +622,12 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
|
|||
seq_puts(m, "L-shaped memory detected\n");
|
||||
|
||||
/* On BDW+, swizzling is not used. See detect_bit_6_swizzle() */
|
||||
if (INTEL_GEN(dev_priv) >= 8 || IS_VALLEYVIEW(dev_priv))
|
||||
if (GRAPHICS_VER(dev_priv) >= 8 || IS_VALLEYVIEW(dev_priv))
|
||||
return 0;
|
||||
|
||||
wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
|
||||
|
||||
if (IS_GEN_RANGE(dev_priv, 3, 4)) {
|
||||
if (IS_GRAPHICS_VER(dev_priv, 3, 4)) {
|
||||
seq_printf(m, "DDC = 0x%08x\n",
|
||||
intel_uncore_read(uncore, DCC));
|
||||
seq_printf(m, "DDC2 = 0x%08x\n",
|
||||
|
@ -634,7 +645,7 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
|
|||
intel_uncore_read(uncore, MAD_DIMM_C2));
|
||||
seq_printf(m, "TILECTL = 0x%08x\n",
|
||||
intel_uncore_read(uncore, TILECTL));
|
||||
if (INTEL_GEN(dev_priv) >= 8)
|
||||
if (GRAPHICS_VER(dev_priv) >= 8)
|
||||
seq_printf(m, "GAMTARBMODE = 0x%08x\n",
|
||||
intel_uncore_read(uncore, GAMTARBMODE));
|
||||
else
|
||||
|
@ -945,7 +956,7 @@ static int i915_forcewake_open(struct inode *inode, struct file *file)
|
|||
|
||||
atomic_inc(>->user_wakeref);
|
||||
intel_gt_pm_get(gt);
|
||||
if (INTEL_GEN(i915) >= 6)
|
||||
if (GRAPHICS_VER(i915) >= 6)
|
||||
intel_uncore_forcewake_user_get(gt->uncore);
|
||||
|
||||
return 0;
|
||||
|
@ -956,7 +967,7 @@ static int i915_forcewake_release(struct inode *inode, struct file *file)
|
|||
struct drm_i915_private *i915 = inode->i_private;
|
||||
struct intel_gt *gt = &i915->gt;
|
||||
|
||||
if (INTEL_GEN(i915) >= 6)
|
||||
if (GRAPHICS_VER(i915) >= 6)
|
||||
intel_uncore_forcewake_user_put(&i915->uncore);
|
||||
intel_gt_pm_put(gt);
|
||||
atomic_dec(>->user_wakeref);
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
#include "display/intel_acpi.h"
|
||||
#include "display/intel_bw.h"
|
||||
#include "display/intel_cdclk.h"
|
||||
#include "display/intel_csr.h"
|
||||
#include "display/intel_dmc.h"
|
||||
#include "display/intel_display_types.h"
|
||||
#include "display/intel_dp.h"
|
||||
#include "display/intel_fbdev.h"
|
||||
|
@ -106,12 +106,12 @@ static int i915_get_bridge_dev(struct drm_i915_private *dev_priv)
|
|||
static int
|
||||
intel_alloc_mchbar_resource(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
int reg = INTEL_GEN(dev_priv) >= 4 ? MCHBAR_I965 : MCHBAR_I915;
|
||||
int reg = GRAPHICS_VER(dev_priv) >= 4 ? MCHBAR_I965 : MCHBAR_I915;
|
||||
u32 temp_lo, temp_hi = 0;
|
||||
u64 mchbar_addr;
|
||||
int ret;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 4)
|
||||
if (GRAPHICS_VER(dev_priv) >= 4)
|
||||
pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi);
|
||||
pci_read_config_dword(dev_priv->bridge_dev, reg, &temp_lo);
|
||||
mchbar_addr = ((u64)temp_hi << 32) | temp_lo;
|
||||
|
@ -138,7 +138,7 @@ intel_alloc_mchbar_resource(struct drm_i915_private *dev_priv)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 4)
|
||||
if (GRAPHICS_VER(dev_priv) >= 4)
|
||||
pci_write_config_dword(dev_priv->bridge_dev, reg + 4,
|
||||
upper_32_bits(dev_priv->mch_res.start));
|
||||
|
||||
|
@ -151,7 +151,7 @@ intel_alloc_mchbar_resource(struct drm_i915_private *dev_priv)
|
|||
static void
|
||||
intel_setup_mchbar(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
int mchbar_reg = INTEL_GEN(dev_priv) >= 4 ? MCHBAR_I965 : MCHBAR_I915;
|
||||
int mchbar_reg = GRAPHICS_VER(dev_priv) >= 4 ? MCHBAR_I965 : MCHBAR_I915;
|
||||
u32 temp;
|
||||
bool enabled;
|
||||
|
||||
|
@ -190,7 +190,7 @@ intel_setup_mchbar(struct drm_i915_private *dev_priv)
|
|||
static void
|
||||
intel_teardown_mchbar(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
int mchbar_reg = INTEL_GEN(dev_priv) >= 4 ? MCHBAR_I965 : MCHBAR_I915;
|
||||
int mchbar_reg = GRAPHICS_VER(dev_priv) >= 4 ? MCHBAR_I965 : MCHBAR_I915;
|
||||
|
||||
if (dev_priv->mchbar_need_disable) {
|
||||
if (IS_I915G(dev_priv) || IS_I915GM(dev_priv)) {
|
||||
|
@ -475,7 +475,7 @@ static int i915_set_dma_info(struct drm_i915_private *i915)
|
|||
goto mask_err;
|
||||
|
||||
/* overlay on gen2 is broken and can't address above 1G */
|
||||
if (IS_GEN(i915, 2))
|
||||
if (GRAPHICS_VER(i915) == 2)
|
||||
mask_size = 30;
|
||||
|
||||
/*
|
||||
|
@ -601,7 +601,7 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
|
|||
* device. The kernel then disables that interrupt source and so
|
||||
* prevents the other device from working properly.
|
||||
*/
|
||||
if (INTEL_GEN(dev_priv) >= 5) {
|
||||
if (GRAPHICS_VER(dev_priv) >= 5) {
|
||||
if (pci_enable_msi(pdev) < 0)
|
||||
drm_dbg(&dev_priv->drm, "can't enable MSI");
|
||||
}
|
||||
|
@ -729,7 +729,7 @@ static void i915_welcome_messages(struct drm_i915_private *dev_priv)
|
|||
intel_platform_name(INTEL_INFO(dev_priv)->platform),
|
||||
intel_subplatform(RUNTIME_INFO(dev_priv),
|
||||
INTEL_INFO(dev_priv)->platform),
|
||||
INTEL_GEN(dev_priv));
|
||||
GRAPHICS_VER(dev_priv));
|
||||
|
||||
intel_device_info_print_static(INTEL_INFO(dev_priv), &p);
|
||||
intel_device_info_print_runtime(RUNTIME_INFO(dev_priv), &p);
|
||||
|
@ -803,7 +803,7 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
*/
|
||||
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
|
||||
if (IS_ENABLED(CONFIG_DRM_I915_UNSTABLE_FAKE_LMEM)) {
|
||||
if (INTEL_GEN(i915) >= 9 && i915_selftest.live < 0 &&
|
||||
if (GRAPHICS_VER(i915) >= 9 && i915_selftest.live < 0 &&
|
||||
i915->params.fake_lmem_start) {
|
||||
mkwrite_device_info(i915)->memory_regions =
|
||||
REGION_SMEM | REGION_LMEM | REGION_STOLEN_SMEM;
|
||||
|
@ -1043,7 +1043,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
|
|||
intel_suspend_encoders(i915);
|
||||
intel_shutdown_encoders(i915);
|
||||
|
||||
intel_csr_ucode_suspend(i915);
|
||||
intel_dmc_ucode_suspend(i915);
|
||||
|
||||
/*
|
||||
* The only requirement is to reboot with display DC states disabled,
|
||||
|
@ -1124,7 +1124,7 @@ static int i915_drm_suspend(struct drm_device *dev)
|
|||
|
||||
dev_priv->suspend_count++;
|
||||
|
||||
intel_csr_ucode_suspend(dev_priv);
|
||||
intel_dmc_ucode_suspend(dev_priv);
|
||||
|
||||
enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
|
||||
|
||||
|
@ -1182,7 +1182,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
|
|||
* Fujitsu FSC S7110
|
||||
* Acer Aspire 1830T
|
||||
*/
|
||||
if (!(hibernation && INTEL_GEN(dev_priv) < 6))
|
||||
if (!(hibernation && GRAPHICS_VER(dev_priv) < 6))
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
|
||||
out:
|
||||
|
@ -1226,7 +1226,7 @@ static int i915_drm_resume(struct drm_device *dev)
|
|||
|
||||
i915_ggtt_resume(&dev_priv->ggtt);
|
||||
|
||||
intel_csr_ucode_resume(dev_priv);
|
||||
intel_dmc_ucode_resume(dev_priv);
|
||||
|
||||
i915_restore_display(dev_priv);
|
||||
intel_pps_unlock_regs_wa(dev_priv);
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
#include "display/intel_bios.h"
|
||||
#include "display/intel_display.h"
|
||||
#include "display/intel_display_power.h"
|
||||
#include "display/intel_dmc.h"
|
||||
#include "display/intel_dpll_mgr.h"
|
||||
#include "display/intel_dsb.h"
|
||||
#include "display/intel_frontbuffer.h"
|
||||
|
@ -328,23 +329,6 @@ struct drm_i915_display_funcs {
|
|||
void (*read_luts)(struct intel_crtc_state *crtc_state);
|
||||
};
|
||||
|
||||
struct intel_csr {
|
||||
struct work_struct work;
|
||||
const char *fw_path;
|
||||
u32 required_version;
|
||||
u32 max_fw_size; /* bytes */
|
||||
u32 *dmc_payload;
|
||||
u32 dmc_fw_size; /* dwords */
|
||||
u32 version;
|
||||
u32 mmio_count;
|
||||
i915_reg_t mmioaddr[20];
|
||||
u32 mmiodata[20];
|
||||
u32 dc_state;
|
||||
u32 target_dc_state;
|
||||
u32 allowed_dc_mask;
|
||||
intel_wakeref_t wakeref;
|
||||
};
|
||||
|
||||
enum i915_cache_level {
|
||||
I915_CACHE_NONE = 0,
|
||||
I915_CACHE_LLC, /* also used for snoopable memory on non-LLC */
|
||||
|
@ -589,6 +573,8 @@ i915_fence_timeout(const struct drm_i915_private *i915)
|
|||
/* Amount of SAGV/QGV points, BSpec precisely defines this */
|
||||
#define I915_NUM_QGV_POINTS 8
|
||||
|
||||
#define HAS_HW_SAGV_WM(i915) (DISPLAY_VER(i915) >= 13 && !IS_DGFX(i915))
|
||||
|
||||
struct ddi_vbt_port_info {
|
||||
/* Non-NULL if port present. */
|
||||
struct intel_bios_encoder_data *devdata;
|
||||
|
@ -824,7 +810,7 @@ struct drm_i915_private {
|
|||
|
||||
struct intel_wopcm wopcm;
|
||||
|
||||
struct intel_csr csr;
|
||||
struct intel_dmc dmc;
|
||||
|
||||
struct intel_gmbus gmbus[GMBUS_NUM_PINS];
|
||||
|
||||
|
@ -1138,6 +1124,9 @@ struct drm_i915_private {
|
|||
|
||||
u8 framestart_delay;
|
||||
|
||||
/* Window2 specifies time required to program DSB (Window2) in number of scan lines */
|
||||
u8 window2_delay;
|
||||
|
||||
u8 pch_ssc_use;
|
||||
|
||||
/* For i915gm/i945gm vblank irq workaround */
|
||||
|
@ -1558,9 +1547,9 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
(IS_ALDERLAKE_P(__i915) && \
|
||||
IS_GT_STEP(__i915, since, until))
|
||||
|
||||
#define IS_LP(dev_priv) (INTEL_INFO(dev_priv)->is_lp)
|
||||
#define IS_GEN9_LP(dev_priv) (IS_GEN(dev_priv, 9) && IS_LP(dev_priv))
|
||||
#define IS_GEN9_BC(dev_priv) (IS_GEN(dev_priv, 9) && !IS_LP(dev_priv))
|
||||
#define IS_LP(dev_priv) (INTEL_INFO(dev_priv)->is_lp)
|
||||
#define IS_GEN9_LP(dev_priv) (GRAPHICS_VER(dev_priv) == 9 && IS_LP(dev_priv))
|
||||
#define IS_GEN9_BC(dev_priv) (GRAPHICS_VER(dev_priv) == 9 && !IS_LP(dev_priv))
|
||||
|
||||
#define __HAS_ENGINE(engine_mask, id) ((engine_mask) & BIT(id))
|
||||
#define HAS_ENGINE(gt, id) __HAS_ENGINE((gt)->info.engine_mask, id)
|
||||
|
@ -1580,12 +1569,12 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
* The Gen7 cmdparser copies the scanned buffer to the ggtt for execution
|
||||
* All later gens can run the final buffer from the ppgtt
|
||||
*/
|
||||
#define CMDPARSER_USES_GGTT(dev_priv) IS_GEN(dev_priv, 7)
|
||||
#define CMDPARSER_USES_GGTT(dev_priv) (GRAPHICS_VER(dev_priv) == 7)
|
||||
|
||||
#define HAS_LLC(dev_priv) (INTEL_INFO(dev_priv)->has_llc)
|
||||
#define HAS_SNOOP(dev_priv) (INTEL_INFO(dev_priv)->has_snoop)
|
||||
#define HAS_EDRAM(dev_priv) ((dev_priv)->edram_size_mb)
|
||||
#define HAS_SECURE_BATCHES(dev_priv) (INTEL_GEN(dev_priv) < 6)
|
||||
#define HAS_SECURE_BATCHES(dev_priv) (GRAPHICS_VER(dev_priv) < 6)
|
||||
#define HAS_WT(dev_priv) HAS_EDRAM(dev_priv)
|
||||
|
||||
#define HWS_NEEDS_PHYSICAL(dev_priv) (INTEL_INFO(dev_priv)->hws_needs_physical)
|
||||
|
@ -1618,7 +1607,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
#define HAS_BROKEN_CS_TLB(dev_priv) (IS_I830(dev_priv) || IS_I845G(dev_priv))
|
||||
|
||||
#define NEEDS_RC6_CTX_CORRUPTION_WA(dev_priv) \
|
||||
(IS_BROADWELL(dev_priv) || IS_GEN(dev_priv, 9))
|
||||
(IS_BROADWELL(dev_priv) || GRAPHICS_VER(dev_priv) == 9)
|
||||
|
||||
/* WaRsDisableCoarsePowerGating:skl,cnl */
|
||||
#define NEEDS_WaRsDisableCoarsePowerGating(dev_priv) \
|
||||
|
@ -1626,23 +1615,22 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
IS_SKL_GT3(dev_priv) || \
|
||||
IS_SKL_GT4(dev_priv))
|
||||
|
||||
#define HAS_GMBUS_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4)
|
||||
#define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \
|
||||
#define HAS_GMBUS_IRQ(dev_priv) (GRAPHICS_VER(dev_priv) >= 4)
|
||||
#define HAS_GMBUS_BURST_READ(dev_priv) (GRAPHICS_VER(dev_priv) >= 10 || \
|
||||
IS_GEMINILAKE(dev_priv) || \
|
||||
IS_KABYLAKE(dev_priv))
|
||||
|
||||
/* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
|
||||
* rows, which changed the alignment requirements and fence programming.
|
||||
*/
|
||||
#define HAS_128_BYTE_Y_TILING(dev_priv) (!IS_GEN(dev_priv, 2) && \
|
||||
!(IS_I915G(dev_priv) || \
|
||||
IS_I915GM(dev_priv)))
|
||||
#define HAS_128_BYTE_Y_TILING(dev_priv) (GRAPHICS_VER(dev_priv) != 2 && \
|
||||
!(IS_I915G(dev_priv) || IS_I915GM(dev_priv)))
|
||||
#define SUPPORTS_TV(dev_priv) (INTEL_INFO(dev_priv)->display.supports_tv)
|
||||
#define I915_HAS_HOTPLUG(dev_priv) (INTEL_INFO(dev_priv)->display.has_hotplug)
|
||||
|
||||
#define HAS_FW_BLC(dev_priv) (INTEL_GEN(dev_priv) > 2)
|
||||
#define HAS_FW_BLC(dev_priv) (GRAPHICS_VER(dev_priv) > 2)
|
||||
#define HAS_FBC(dev_priv) (INTEL_INFO(dev_priv)->display.has_fbc)
|
||||
#define HAS_CUR_FBC(dev_priv) (!HAS_GMCH(dev_priv) && INTEL_GEN(dev_priv) >= 7)
|
||||
#define HAS_CUR_FBC(dev_priv) (!HAS_GMCH(dev_priv) && GRAPHICS_VER(dev_priv) >= 7)
|
||||
|
||||
#define HAS_IPS(dev_priv) (IS_HSW_ULT(dev_priv) || IS_BROADWELL(dev_priv))
|
||||
|
||||
|
@ -1653,7 +1641,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
#define HAS_PSR(dev_priv) (INTEL_INFO(dev_priv)->display.has_psr)
|
||||
#define HAS_PSR_HW_TRACKING(dev_priv) \
|
||||
(INTEL_INFO(dev_priv)->display.has_psr_hw_tracking)
|
||||
#define HAS_PSR2_SEL_FETCH(dev_priv) (INTEL_GEN(dev_priv) >= 12)
|
||||
#define HAS_PSR2_SEL_FETCH(dev_priv) (GRAPHICS_VER(dev_priv) >= 12)
|
||||
#define HAS_TRANSCODER(dev_priv, trans) ((INTEL_INFO(dev_priv)->cpu_transcoder_mask & BIT(trans)) != 0)
|
||||
|
||||
#define HAS_RC6(dev_priv) (INTEL_INFO(dev_priv)->has_rc6)
|
||||
|
@ -1662,9 +1650,9 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
|
||||
#define HAS_RPS(dev_priv) (INTEL_INFO(dev_priv)->has_rps)
|
||||
|
||||
#define HAS_CSR(dev_priv) (INTEL_INFO(dev_priv)->display.has_csr)
|
||||
#define HAS_DMC(dev_priv) (INTEL_INFO(dev_priv)->display.has_dmc)
|
||||
|
||||
#define HAS_MSO(i915) (INTEL_GEN(i915) >= 12)
|
||||
#define HAS_MSO(i915) (GRAPHICS_VER(i915) >= 12)
|
||||
|
||||
#define HAS_RUNTIME_PM(dev_priv) (INTEL_INFO(dev_priv)->has_runtime_pm)
|
||||
#define HAS_64BIT_RELOC(dev_priv) (INTEL_INFO(dev_priv)->has_64bit_reloc)
|
||||
|
@ -1683,7 +1671,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
|
||||
#define HAS_GMCH(dev_priv) (INTEL_INFO(dev_priv)->display.has_gmch)
|
||||
|
||||
#define HAS_LSPCON(dev_priv) (IS_GEN_RANGE(dev_priv, 9, 10))
|
||||
#define HAS_LSPCON(dev_priv) (IS_GRAPHICS_VER(dev_priv, 9, 10))
|
||||
|
||||
/* DPF == dynamic parity feature */
|
||||
#define HAS_L3_DPF(dev_priv) (INTEL_INFO(dev_priv)->has_l3_dpf)
|
||||
|
@ -1697,7 +1685,7 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
|||
|
||||
#define HAS_DISPLAY(dev_priv) (INTEL_INFO(dev_priv)->pipe_mask != 0)
|
||||
|
||||
#define HAS_VRR(i915) (INTEL_GEN(i915) >= 12)
|
||||
#define HAS_VRR(i915) (GRAPHICS_VER(i915) >= 12)
|
||||
|
||||
/* Only valid when HAS_DISPLAY() is true */
|
||||
#define INTEL_DISPLAY_ENABLED(dev_priv) \
|
||||
|
@ -1724,7 +1712,7 @@ static inline bool intel_vtd_active(void)
|
|||
|
||||
static inline bool intel_scanout_needs_vtd_wa(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
return INTEL_GEN(dev_priv) >= 6 && intel_vtd_active();
|
||||
return GRAPHICS_VER(dev_priv) >= 6 && intel_vtd_active();
|
||||
}
|
||||
|
||||
static inline bool
|
||||
|
@ -1942,7 +1930,7 @@ int remap_io_sg(struct vm_area_struct *vma,
|
|||
|
||||
static inline int intel_hws_csb_write_index(struct drm_i915_private *i915)
|
||||
{
|
||||
if (INTEL_GEN(i915) >= 10)
|
||||
if (GRAPHICS_VER(i915) >= 10)
|
||||
return CNL_HWS_CSB_WRITE_INDEX;
|
||||
else
|
||||
return I915_HWS_CSB_WRITE_INDEX;
|
||||
|
|
|
@ -442,7 +442,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
|
|||
/* PREAD is disallowed for all platforms after TGL-LP. This also
|
||||
* covers all platforms with local memory.
|
||||
*/
|
||||
if (INTEL_GEN(i915) >= 12 && !IS_TIGERLAKE(i915))
|
||||
if (GRAPHICS_VER(i915) >= 12 && !IS_TIGERLAKE(i915))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (args->size == 0)
|
||||
|
@ -722,7 +722,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
|
|||
/* PWRITE is disallowed for all platforms after TGL-LP. This also
|
||||
* covers all platforms with local memory.
|
||||
*/
|
||||
if (INTEL_GEN(i915) >= 12 && !IS_TIGERLAKE(i915))
|
||||
if (GRAPHICS_VER(i915) >= 12 && !IS_TIGERLAKE(i915))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (args->size == 0)
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "display/intel_csr.h"
|
||||
#include "display/intel_dmc.h"
|
||||
#include "display/intel_overlay.h"
|
||||
|
||||
#include "gem/i915_gem_context.h"
|
||||
|
@ -435,13 +435,13 @@ static void error_print_instdone(struct drm_i915_error_state_buf *m,
|
|||
err_printf(m, " INSTDONE: 0x%08x\n",
|
||||
ee->instdone.instdone);
|
||||
|
||||
if (ee->engine->class != RENDER_CLASS || INTEL_GEN(m->i915) <= 3)
|
||||
if (ee->engine->class != RENDER_CLASS || GRAPHICS_VER(m->i915) <= 3)
|
||||
return;
|
||||
|
||||
err_printf(m, " SC_INSTDONE: 0x%08x\n",
|
||||
ee->instdone.slice_common);
|
||||
|
||||
if (INTEL_GEN(m->i915) <= 6)
|
||||
if (GRAPHICS_VER(m->i915) <= 6)
|
||||
return;
|
||||
|
||||
for_each_instdone_slice_subslice(m->i915, sseu, slice, subslice)
|
||||
|
@ -454,7 +454,7 @@ static void error_print_instdone(struct drm_i915_error_state_buf *m,
|
|||
slice, subslice,
|
||||
ee->instdone.row[slice][subslice]);
|
||||
|
||||
if (INTEL_GEN(m->i915) < 12)
|
||||
if (GRAPHICS_VER(m->i915) < 12)
|
||||
return;
|
||||
|
||||
err_printf(m, " SC_INSTDONE_EXTRA: 0x%08x\n",
|
||||
|
@ -543,7 +543,7 @@ static void error_print_engine(struct drm_i915_error_state_buf *m,
|
|||
upper_32_bits(start), lower_32_bits(start),
|
||||
upper_32_bits(end), lower_32_bits(end));
|
||||
}
|
||||
if (INTEL_GEN(m->i915) >= 4) {
|
||||
if (GRAPHICS_VER(m->i915) >= 4) {
|
||||
err_printf(m, " BBADDR: 0x%08x_%08x\n",
|
||||
(u32)(ee->bbaddr>>32), (u32)ee->bbaddr);
|
||||
err_printf(m, " BB_STATE: 0x%08x\n", ee->bbstate);
|
||||
|
@ -552,14 +552,14 @@ static void error_print_engine(struct drm_i915_error_state_buf *m,
|
|||
err_printf(m, " INSTPM: 0x%08x\n", ee->instpm);
|
||||
err_printf(m, " FADDR: 0x%08x %08x\n", upper_32_bits(ee->faddr),
|
||||
lower_32_bits(ee->faddr));
|
||||
if (INTEL_GEN(m->i915) >= 6) {
|
||||
if (GRAPHICS_VER(m->i915) >= 6) {
|
||||
err_printf(m, " RC PSMI: 0x%08x\n", ee->rc_psmi);
|
||||
err_printf(m, " FAULT_REG: 0x%08x\n", ee->fault_reg);
|
||||
}
|
||||
if (HAS_PPGTT(m->i915)) {
|
||||
err_printf(m, " GFX_MODE: 0x%08x\n", ee->vm_info.gfx_mode);
|
||||
|
||||
if (INTEL_GEN(m->i915) >= 8) {
|
||||
if (GRAPHICS_VER(m->i915) >= 8) {
|
||||
int i;
|
||||
for (i = 0; i < 4; i++)
|
||||
err_printf(m, " PDP%d: 0x%016llx\n",
|
||||
|
@ -706,25 +706,25 @@ static void err_print_gt(struct drm_i915_error_state_buf *m,
|
|||
for (i = 0; i < gt->nfence; i++)
|
||||
err_printf(m, " fence[%d] = %08llx\n", i, gt->fence[i]);
|
||||
|
||||
if (IS_GEN_RANGE(m->i915, 6, 11)) {
|
||||
if (IS_GRAPHICS_VER(m->i915, 6, 11)) {
|
||||
err_printf(m, "ERROR: 0x%08x\n", gt->error);
|
||||
err_printf(m, "DONE_REG: 0x%08x\n", gt->done_reg);
|
||||
}
|
||||
|
||||
if (INTEL_GEN(m->i915) >= 8)
|
||||
if (GRAPHICS_VER(m->i915) >= 8)
|
||||
err_printf(m, "FAULT_TLB_DATA: 0x%08x 0x%08x\n",
|
||||
gt->fault_data1, gt->fault_data0);
|
||||
|
||||
if (IS_GEN(m->i915, 7))
|
||||
if (GRAPHICS_VER(m->i915) == 7)
|
||||
err_printf(m, "ERR_INT: 0x%08x\n", gt->err_int);
|
||||
|
||||
if (IS_GEN_RANGE(m->i915, 8, 11))
|
||||
if (IS_GRAPHICS_VER(m->i915, 8, 11))
|
||||
err_printf(m, "GTT_CACHE_EN: 0x%08x\n", gt->gtt_cache);
|
||||
|
||||
if (IS_GEN(m->i915, 12))
|
||||
if (GRAPHICS_VER(m->i915) == 12)
|
||||
err_printf(m, "AUX_ERR_DBG: 0x%08x\n", gt->aux_err);
|
||||
|
||||
if (INTEL_GEN(m->i915) >= 12) {
|
||||
if (GRAPHICS_VER(m->i915) >= 12) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < GEN12_SFC_DONE_MAX; i++)
|
||||
|
@ -788,14 +788,14 @@ static void __err_print_to_sgl(struct drm_i915_error_state_buf *m,
|
|||
|
||||
err_printf(m, "IOMMU enabled?: %d\n", error->iommu);
|
||||
|
||||
if (HAS_CSR(m->i915)) {
|
||||
struct intel_csr *csr = &m->i915->csr;
|
||||
if (HAS_DMC(m->i915)) {
|
||||
struct intel_dmc *dmc = &m->i915->dmc;
|
||||
|
||||
err_printf(m, "DMC loaded: %s\n",
|
||||
yesno(csr->dmc_payload != NULL));
|
||||
yesno(intel_dmc_has_payload(m->i915) != 0));
|
||||
err_printf(m, "DMC fw version: %d.%d\n",
|
||||
CSR_VERSION_MAJOR(csr->version),
|
||||
CSR_VERSION_MINOR(csr->version));
|
||||
DMC_VERSION_MAJOR(dmc->version),
|
||||
DMC_VERSION_MINOR(dmc->version));
|
||||
}
|
||||
|
||||
err_printf(m, "RPM wakelock: %s\n", yesno(error->wakelock));
|
||||
|
@ -1092,12 +1092,12 @@ static void gt_record_fences(struct intel_gt_coredump *gt)
|
|||
struct intel_uncore *uncore = gt->_gt->uncore;
|
||||
int i;
|
||||
|
||||
if (INTEL_GEN(uncore->i915) >= 6) {
|
||||
if (GRAPHICS_VER(uncore->i915) >= 6) {
|
||||
for (i = 0; i < ggtt->num_fences; i++)
|
||||
gt->fence[i] =
|
||||
intel_uncore_read64(uncore,
|
||||
FENCE_REG_GEN6_LO(i));
|
||||
} else if (INTEL_GEN(uncore->i915) >= 4) {
|
||||
} else if (GRAPHICS_VER(uncore->i915) >= 4) {
|
||||
for (i = 0; i < ggtt->num_fences; i++)
|
||||
gt->fence[i] =
|
||||
intel_uncore_read64(uncore,
|
||||
|
@ -1115,20 +1115,20 @@ static void engine_record_registers(struct intel_engine_coredump *ee)
|
|||
const struct intel_engine_cs *engine = ee->engine;
|
||||
struct drm_i915_private *i915 = engine->i915;
|
||||
|
||||
if (INTEL_GEN(i915) >= 6) {
|
||||
if (GRAPHICS_VER(i915) >= 6) {
|
||||
ee->rc_psmi = ENGINE_READ(engine, RING_PSMI_CTL);
|
||||
|
||||
if (INTEL_GEN(i915) >= 12)
|
||||
if (GRAPHICS_VER(i915) >= 12)
|
||||
ee->fault_reg = intel_uncore_read(engine->uncore,
|
||||
GEN12_RING_FAULT_REG);
|
||||
else if (INTEL_GEN(i915) >= 8)
|
||||
else if (GRAPHICS_VER(i915) >= 8)
|
||||
ee->fault_reg = intel_uncore_read(engine->uncore,
|
||||
GEN8_RING_FAULT_REG);
|
||||
else
|
||||
ee->fault_reg = GEN6_RING_FAULT_REG_READ(engine);
|
||||
}
|
||||
|
||||
if (INTEL_GEN(i915) >= 4) {
|
||||
if (GRAPHICS_VER(i915) >= 4) {
|
||||
ee->esr = ENGINE_READ(engine, RING_ESR);
|
||||
ee->faddr = ENGINE_READ(engine, RING_DMA_FADD);
|
||||
ee->ipeir = ENGINE_READ(engine, RING_IPEIR);
|
||||
|
@ -1136,7 +1136,7 @@ static void engine_record_registers(struct intel_engine_coredump *ee)
|
|||
ee->instps = ENGINE_READ(engine, RING_INSTPS);
|
||||
ee->bbaddr = ENGINE_READ(engine, RING_BBADDR);
|
||||
ee->ccid = ENGINE_READ(engine, CCID);
|
||||
if (INTEL_GEN(i915) >= 8) {
|
||||
if (GRAPHICS_VER(i915) >= 8) {
|
||||
ee->faddr |= (u64)ENGINE_READ(engine, RING_DMA_FADD_UDW) << 32;
|
||||
ee->bbaddr |= (u64)ENGINE_READ(engine, RING_BBADDR_UDW) << 32;
|
||||
}
|
||||
|
@ -1155,13 +1155,13 @@ static void engine_record_registers(struct intel_engine_coredump *ee)
|
|||
ee->head = ENGINE_READ(engine, RING_HEAD);
|
||||
ee->tail = ENGINE_READ(engine, RING_TAIL);
|
||||
ee->ctl = ENGINE_READ(engine, RING_CTL);
|
||||
if (INTEL_GEN(i915) > 2)
|
||||
if (GRAPHICS_VER(i915) > 2)
|
||||
ee->mode = ENGINE_READ(engine, RING_MI_MODE);
|
||||
|
||||
if (!HWS_NEEDS_PHYSICAL(i915)) {
|
||||
i915_reg_t mmio;
|
||||
|
||||
if (IS_GEN(i915, 7)) {
|
||||
if (GRAPHICS_VER(i915) == 7) {
|
||||
switch (engine->id) {
|
||||
default:
|
||||
MISSING_CASE(engine->id);
|
||||
|
@ -1179,7 +1179,7 @@ static void engine_record_registers(struct intel_engine_coredump *ee)
|
|||
mmio = VEBOX_HWS_PGA_GEN7;
|
||||
break;
|
||||
}
|
||||
} else if (IS_GEN(engine->i915, 6)) {
|
||||
} else if (GRAPHICS_VER(engine->i915) == 6) {
|
||||
mmio = RING_HWS_PGA_GEN6(engine->mmio_base);
|
||||
} else {
|
||||
/* XXX: gen8 returns to sanity */
|
||||
|
@ -1196,13 +1196,13 @@ static void engine_record_registers(struct intel_engine_coredump *ee)
|
|||
|
||||
ee->vm_info.gfx_mode = ENGINE_READ(engine, RING_MODE_GEN7);
|
||||
|
||||
if (IS_GEN(i915, 6)) {
|
||||
if (GRAPHICS_VER(i915) == 6) {
|
||||
ee->vm_info.pp_dir_base =
|
||||
ENGINE_READ(engine, RING_PP_DIR_BASE_READ);
|
||||
} else if (IS_GEN(i915, 7)) {
|
||||
} else if (GRAPHICS_VER(i915) == 7) {
|
||||
ee->vm_info.pp_dir_base =
|
||||
ENGINE_READ(engine, RING_PP_DIR_BASE);
|
||||
} else if (INTEL_GEN(i915) >= 8) {
|
||||
} else if (GRAPHICS_VER(i915) >= 8) {
|
||||
u32 base = engine->mmio_base;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
|
@ -1534,52 +1534,52 @@ static void gt_record_regs(struct intel_gt_coredump *gt)
|
|||
gt->forcewake = intel_uncore_read_fw(uncore, FORCEWAKE_VLV);
|
||||
}
|
||||
|
||||
if (IS_GEN(i915, 7))
|
||||
if (GRAPHICS_VER(i915) == 7)
|
||||
gt->err_int = intel_uncore_read(uncore, GEN7_ERR_INT);
|
||||
|
||||
if (INTEL_GEN(i915) >= 12) {
|
||||
if (GRAPHICS_VER(i915) >= 12) {
|
||||
gt->fault_data0 = intel_uncore_read(uncore,
|
||||
GEN12_FAULT_TLB_DATA0);
|
||||
gt->fault_data1 = intel_uncore_read(uncore,
|
||||
GEN12_FAULT_TLB_DATA1);
|
||||
} else if (INTEL_GEN(i915) >= 8) {
|
||||
} else if (GRAPHICS_VER(i915) >= 8) {
|
||||
gt->fault_data0 = intel_uncore_read(uncore,
|
||||
GEN8_FAULT_TLB_DATA0);
|
||||
gt->fault_data1 = intel_uncore_read(uncore,
|
||||
GEN8_FAULT_TLB_DATA1);
|
||||
}
|
||||
|
||||
if (IS_GEN(i915, 6)) {
|
||||
if (GRAPHICS_VER(i915) == 6) {
|
||||
gt->forcewake = intel_uncore_read_fw(uncore, FORCEWAKE);
|
||||
gt->gab_ctl = intel_uncore_read(uncore, GAB_CTL);
|
||||
gt->gfx_mode = intel_uncore_read(uncore, GFX_MODE);
|
||||
}
|
||||
|
||||
/* 2: Registers which belong to multiple generations */
|
||||
if (INTEL_GEN(i915) >= 7)
|
||||
if (GRAPHICS_VER(i915) >= 7)
|
||||
gt->forcewake = intel_uncore_read_fw(uncore, FORCEWAKE_MT);
|
||||
|
||||
if (INTEL_GEN(i915) >= 6) {
|
||||
if (GRAPHICS_VER(i915) >= 6) {
|
||||
gt->derrmr = intel_uncore_read(uncore, DERRMR);
|
||||
if (INTEL_GEN(i915) < 12) {
|
||||
if (GRAPHICS_VER(i915) < 12) {
|
||||
gt->error = intel_uncore_read(uncore, ERROR_GEN6);
|
||||
gt->done_reg = intel_uncore_read(uncore, DONE_REG);
|
||||
}
|
||||
}
|
||||
|
||||
/* 3: Feature specific registers */
|
||||
if (IS_GEN_RANGE(i915, 6, 7)) {
|
||||
if (IS_GRAPHICS_VER(i915, 6, 7)) {
|
||||
gt->gam_ecochk = intel_uncore_read(uncore, GAM_ECOCHK);
|
||||
gt->gac_eco = intel_uncore_read(uncore, GAC_ECO_BITS);
|
||||
}
|
||||
|
||||
if (IS_GEN_RANGE(i915, 8, 11))
|
||||
if (IS_GRAPHICS_VER(i915, 8, 11))
|
||||
gt->gtt_cache = intel_uncore_read(uncore, HSW_GTT_CACHE_EN);
|
||||
|
||||
if (IS_GEN(i915, 12))
|
||||
if (GRAPHICS_VER(i915) == 12)
|
||||
gt->aux_err = intel_uncore_read(uncore, GEN12_AUX_ERR_DBG);
|
||||
|
||||
if (INTEL_GEN(i915) >= 12) {
|
||||
if (GRAPHICS_VER(i915) >= 12) {
|
||||
for (i = 0; i < GEN12_SFC_DONE_MAX; i++) {
|
||||
gt->sfc_done[i] =
|
||||
intel_uncore_read(uncore, GEN12_SFC_DONE(i));
|
||||
|
@ -1589,7 +1589,7 @@ static void gt_record_regs(struct intel_gt_coredump *gt)
|
|||
}
|
||||
|
||||
/* 4: Everything else */
|
||||
if (INTEL_GEN(i915) >= 11) {
|
||||
if (GRAPHICS_VER(i915) >= 11) {
|
||||
gt->ier = intel_uncore_read(uncore, GEN8_DE_MISC_IER);
|
||||
gt->gtier[0] =
|
||||
intel_uncore_read(uncore,
|
||||
|
@ -1608,7 +1608,7 @@ static void gt_record_regs(struct intel_gt_coredump *gt)
|
|||
intel_uncore_read(uncore,
|
||||
GEN11_GUNIT_CSME_INTR_ENABLE);
|
||||
gt->ngtier = 6;
|
||||
} else if (INTEL_GEN(i915) >= 8) {
|
||||
} else if (GRAPHICS_VER(i915) >= 8) {
|
||||
gt->ier = intel_uncore_read(uncore, GEN8_DE_MISC_IER);
|
||||
for (i = 0; i < 4; i++)
|
||||
gt->gtier[i] =
|
||||
|
@ -1618,7 +1618,7 @@ static void gt_record_regs(struct intel_gt_coredump *gt)
|
|||
gt->ier = intel_uncore_read(uncore, DEIER);
|
||||
gt->gtier[0] = intel_uncore_read(uncore, GTIER);
|
||||
gt->ngtier = 1;
|
||||
} else if (IS_GEN(i915, 2)) {
|
||||
} else if (GRAPHICS_VER(i915) == 2) {
|
||||
gt->ier = intel_uncore_read16(uncore, GEN2_IER);
|
||||
} else if (!IS_VALLEYVIEW(i915)) {
|
||||
gt->ier = intel_uncore_read(uncore, GEN2_IER);
|
||||
|
@ -1674,7 +1674,7 @@ static const char *error_msg(struct i915_gpu_coredump *error)
|
|||
|
||||
len = scnprintf(error->error_msg, sizeof(error->error_msg),
|
||||
"GPU HANG: ecode %d:%x:%08x",
|
||||
INTEL_GEN(error->i915), hung_classes,
|
||||
GRAPHICS_VER(error->i915), hung_classes,
|
||||
generate_ecode(first));
|
||||
if (first && first->context.pid) {
|
||||
/* Just show the first executing process, more is confusing */
|
||||
|
|
|
@ -2175,7 +2175,7 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
|
|||
gt_iir = raw_reg_read(regs, GTIIR);
|
||||
if (gt_iir) {
|
||||
raw_reg_write(regs, GTIIR, gt_iir);
|
||||
if (INTEL_GEN(i915) >= 6)
|
||||
if (GRAPHICS_VER(i915) >= 6)
|
||||
gen6_gt_irq_handler(&i915->gt, gt_iir);
|
||||
else
|
||||
gen5_gt_irq_handler(&i915->gt, gt_iir);
|
||||
|
@ -2192,7 +2192,7 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
|
|||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (INTEL_GEN(i915) >= 6) {
|
||||
if (GRAPHICS_VER(i915) >= 6) {
|
||||
u32 pm_iir = raw_reg_read(regs, GEN6_PMIIR);
|
||||
if (pm_iir) {
|
||||
raw_reg_write(regs, GEN6_PMIIR, pm_iir);
|
||||
|
@ -2425,6 +2425,17 @@ static u32 gen8_de_pipe_flip_done_mask(struct drm_i915_private *i915)
|
|||
return GEN8_PIPE_PRIMARY_FLIP_DONE;
|
||||
}
|
||||
|
||||
u32 gen8_de_pipe_underrun_mask(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
u32 mask = GEN8_PIPE_FIFO_UNDERRUN;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 13)
|
||||
mask |= XELPD_PIPE_SOFT_UNDERRUN |
|
||||
XELPD_PIPE_HARD_UNDERRUN;
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
|
||||
{
|
||||
|
@ -2536,7 +2547,7 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
|
|||
if (iir & GEN8_PIPE_CDCLK_CRC_DONE)
|
||||
hsw_pipe_crc_irq_handler(dev_priv, pipe);
|
||||
|
||||
if (iir & GEN8_PIPE_FIFO_UNDERRUN)
|
||||
if (iir & gen8_de_pipe_underrun_mask(dev_priv))
|
||||
intel_cpu_fifo_underrun_irq_handler(dev_priv, pipe);
|
||||
|
||||
fault_errors = iir & gen8_de_pipe_fault_mask(dev_priv);
|
||||
|
@ -3028,7 +3039,7 @@ static void ilk_irq_reset(struct drm_i915_private *dev_priv)
|
|||
GEN3_IRQ_RESET(uncore, DE);
|
||||
dev_priv->irq_mask = ~0u;
|
||||
|
||||
if (IS_GEN(dev_priv, 7))
|
||||
if (GRAPHICS_VER(dev_priv) == 7)
|
||||
intel_uncore_write(uncore, GEN7_ERR_INT, 0xffffffff);
|
||||
|
||||
if (IS_HASWELL(dev_priv)) {
|
||||
|
@ -3173,7 +3184,8 @@ void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
|
|||
u8 pipe_mask)
|
||||
{
|
||||
struct intel_uncore *uncore = &dev_priv->uncore;
|
||||
u32 extra_ier = GEN8_PIPE_VBLANK | GEN8_PIPE_FIFO_UNDERRUN |
|
||||
u32 extra_ier = GEN8_PIPE_VBLANK |
|
||||
gen8_de_pipe_underrun_mask(dev_priv) |
|
||||
gen8_de_pipe_flip_done_mask(dev_priv);
|
||||
enum pipe pipe;
|
||||
|
||||
|
@ -3646,7 +3658,7 @@ static void ilk_irq_postinstall(struct drm_i915_private *dev_priv)
|
|||
struct intel_uncore *uncore = &dev_priv->uncore;
|
||||
u32 display_mask, extra_mask;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 7) {
|
||||
if (GRAPHICS_VER(dev_priv) >= 7) {
|
||||
display_mask = (DE_MASTER_IRQ_CONTROL | DE_GSE_IVB |
|
||||
DE_PCH_EVENT_IVB | DE_AUX_CHANNEL_A_IVB);
|
||||
extra_mask = (DE_PIPEC_VBLANK_IVB | DE_PIPEB_VBLANK_IVB |
|
||||
|
@ -3757,7 +3769,8 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
|
|||
}
|
||||
|
||||
de_pipe_enables = de_pipe_masked |
|
||||
GEN8_PIPE_VBLANK | GEN8_PIPE_FIFO_UNDERRUN |
|
||||
GEN8_PIPE_VBLANK |
|
||||
gen8_de_pipe_underrun_mask(dev_priv) |
|
||||
gen8_de_pipe_flip_done_mask(dev_priv);
|
||||
|
||||
de_port_enables = de_port_masked;
|
||||
|
@ -4317,7 +4330,7 @@ void intel_irq_init(struct drm_i915_private *dev_priv)
|
|||
dev_priv->l3_parity.remap_info[i] = NULL;
|
||||
|
||||
/* pre-gen11 the guc irqs bits are in the upper 16 bits of the pm reg */
|
||||
if (HAS_GT_UC(dev_priv) && INTEL_GEN(dev_priv) < 11)
|
||||
if (HAS_GT_UC(dev_priv) && GRAPHICS_VER(dev_priv) < 11)
|
||||
dev_priv->gt.pm_guc_events = GUC_INTR_GUC2HOST << 16;
|
||||
|
||||
if (!HAS_DISPLAY(dev_priv))
|
||||
|
@ -4388,18 +4401,18 @@ static irq_handler_t intel_irq_handler(struct drm_i915_private *dev_priv)
|
|||
return cherryview_irq_handler;
|
||||
else if (IS_VALLEYVIEW(dev_priv))
|
||||
return valleyview_irq_handler;
|
||||
else if (IS_GEN(dev_priv, 4))
|
||||
else if (GRAPHICS_VER(dev_priv) == 4)
|
||||
return i965_irq_handler;
|
||||
else if (IS_GEN(dev_priv, 3))
|
||||
else if (GRAPHICS_VER(dev_priv) == 3)
|
||||
return i915_irq_handler;
|
||||
else
|
||||
return i8xx_irq_handler;
|
||||
} else {
|
||||
if (HAS_MASTER_UNIT_IRQ(dev_priv))
|
||||
return dg1_irq_handler;
|
||||
if (INTEL_GEN(dev_priv) >= 11)
|
||||
if (GRAPHICS_VER(dev_priv) >= 11)
|
||||
return gen11_irq_handler;
|
||||
else if (INTEL_GEN(dev_priv) >= 8)
|
||||
else if (GRAPHICS_VER(dev_priv) >= 8)
|
||||
return gen8_irq_handler;
|
||||
else
|
||||
return ilk_irq_handler;
|
||||
|
@ -4413,16 +4426,16 @@ static void intel_irq_reset(struct drm_i915_private *dev_priv)
|
|||
cherryview_irq_reset(dev_priv);
|
||||
else if (IS_VALLEYVIEW(dev_priv))
|
||||
valleyview_irq_reset(dev_priv);
|
||||
else if (IS_GEN(dev_priv, 4))
|
||||
else if (GRAPHICS_VER(dev_priv) == 4)
|
||||
i965_irq_reset(dev_priv);
|
||||
else if (IS_GEN(dev_priv, 3))
|
||||
else if (GRAPHICS_VER(dev_priv) == 3)
|
||||
i915_irq_reset(dev_priv);
|
||||
else
|
||||
i8xx_irq_reset(dev_priv);
|
||||
} else {
|
||||
if (INTEL_GEN(dev_priv) >= 11)
|
||||
if (GRAPHICS_VER(dev_priv) >= 11)
|
||||
gen11_irq_reset(dev_priv);
|
||||
else if (INTEL_GEN(dev_priv) >= 8)
|
||||
else if (GRAPHICS_VER(dev_priv) >= 8)
|
||||
gen8_irq_reset(dev_priv);
|
||||
else
|
||||
ilk_irq_reset(dev_priv);
|
||||
|
@ -4436,16 +4449,16 @@ static void intel_irq_postinstall(struct drm_i915_private *dev_priv)
|
|||
cherryview_irq_postinstall(dev_priv);
|
||||
else if (IS_VALLEYVIEW(dev_priv))
|
||||
valleyview_irq_postinstall(dev_priv);
|
||||
else if (IS_GEN(dev_priv, 4))
|
||||
else if (GRAPHICS_VER(dev_priv) == 4)
|
||||
i965_irq_postinstall(dev_priv);
|
||||
else if (IS_GEN(dev_priv, 3))
|
||||
else if (GRAPHICS_VER(dev_priv) == 3)
|
||||
i915_irq_postinstall(dev_priv);
|
||||
else
|
||||
i8xx_irq_postinstall(dev_priv);
|
||||
} else {
|
||||
if (INTEL_GEN(dev_priv) >= 11)
|
||||
if (GRAPHICS_VER(dev_priv) >= 11)
|
||||
gen11_irq_postinstall(dev_priv);
|
||||
else if (INTEL_GEN(dev_priv) >= 8)
|
||||
else if (GRAPHICS_VER(dev_priv) >= 8)
|
||||
gen8_irq_postinstall(dev_priv);
|
||||
else
|
||||
ilk_irq_postinstall(dev_priv);
|
||||
|
|
|
@ -100,6 +100,7 @@ void gen8_irq_power_well_post_enable(struct drm_i915_private *dev_priv,
|
|||
u8 pipe_mask);
|
||||
void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
|
||||
u8 pipe_mask);
|
||||
u32 gen8_de_pipe_underrun_mask(struct drm_i915_private *dev_priv);
|
||||
|
||||
bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
|
||||
ktime_t *vblank_time, bool in_vblank_irq);
|
||||
|
|
|
@ -643,7 +643,7 @@ static const struct intel_device_info chv_info = {
|
|||
GEN8_FEATURES, \
|
||||
GEN(9), \
|
||||
GEN9_DEFAULT_PAGE_SIZES, \
|
||||
.display.has_csr = 1, \
|
||||
.display.has_dmc = 1, \
|
||||
.has_gt_uc = 1, \
|
||||
.display.has_hdcp = 1, \
|
||||
.display.has_ipc = 1, \
|
||||
|
@ -698,7 +698,7 @@ static const struct intel_device_info skl_gt4_info = {
|
|||
.display.has_psr = 1, \
|
||||
.display.has_psr_hw_tracking = 1, \
|
||||
.has_runtime_pm = 1, \
|
||||
.display.has_csr = 1, \
|
||||
.display.has_dmc = 1, \
|
||||
.has_rc6 = 1, \
|
||||
.has_rps = true, \
|
||||
.display.has_dp_mst = 1, \
|
||||
|
@ -953,6 +953,7 @@ static const struct intel_device_info adl_p_info = {
|
|||
GEN12_FEATURES,
|
||||
XE_LPD_FEATURES,
|
||||
PLATFORM(INTEL_ALDERLAKE_P),
|
||||
.has_cdclk_crawl = 1,
|
||||
.require_force_probe = 1,
|
||||
.display.has_modular_fia = 1,
|
||||
.platform_engine_mask =
|
||||
|
|
|
@ -719,7 +719,7 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
|
|||
* it to userspace...
|
||||
*/
|
||||
reason = ((report32[0] >> OAREPORT_REASON_SHIFT) &
|
||||
(IS_GEN(stream->perf->i915, 12) ?
|
||||
(GRAPHICS_VER(stream->perf->i915) == 12 ?
|
||||
OAREPORT_REASON_MASK_EXTENDED :
|
||||
OAREPORT_REASON_MASK));
|
||||
|
||||
|
@ -734,7 +734,7 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
|
|||
* understand that the ID has been squashed by the kernel.
|
||||
*/
|
||||
if (!(report32[0] & stream->perf->gen8_valid_ctx_bit) &&
|
||||
INTEL_GEN(stream->perf->i915) <= 11)
|
||||
GRAPHICS_VER(stream->perf->i915) <= 11)
|
||||
ctx_id = report32[2] = INVALID_CTX_ID;
|
||||
|
||||
/*
|
||||
|
@ -801,7 +801,7 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
|
|||
if (start_offset != *offset) {
|
||||
i915_reg_t oaheadptr;
|
||||
|
||||
oaheadptr = IS_GEN(stream->perf->i915, 12) ?
|
||||
oaheadptr = GRAPHICS_VER(stream->perf->i915) == 12 ?
|
||||
GEN12_OAG_OAHEADPTR : GEN8_OAHEADPTR;
|
||||
|
||||
spin_lock_irqsave(&stream->oa_buffer.ptr_lock, flags);
|
||||
|
@ -854,7 +854,7 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
|
|||
if (drm_WARN_ON(&uncore->i915->drm, !stream->oa_buffer.vaddr))
|
||||
return -EIO;
|
||||
|
||||
oastatus_reg = IS_GEN(stream->perf->i915, 12) ?
|
||||
oastatus_reg = GRAPHICS_VER(stream->perf->i915) == 12 ?
|
||||
GEN12_OAG_OASTATUS : GEN8_OASTATUS;
|
||||
|
||||
oastatus = intel_uncore_read(uncore, oastatus_reg);
|
||||
|
@ -901,7 +901,7 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
|
|||
intel_uncore_rmw(uncore, oastatus_reg,
|
||||
GEN8_OASTATUS_COUNTER_OVERFLOW |
|
||||
GEN8_OASTATUS_REPORT_LOST,
|
||||
IS_GEN_RANGE(uncore->i915, 8, 11) ?
|
||||
IS_GRAPHICS_VER(uncore->i915, 8, 11) ?
|
||||
(GEN8_OASTATUS_HEAD_POINTER_WRAP |
|
||||
GEN8_OASTATUS_TAIL_POINTER_WRAP) : 0);
|
||||
}
|
||||
|
@ -1243,7 +1243,7 @@ static int oa_get_render_ctx_id(struct i915_perf_stream *stream)
|
|||
if (IS_ERR(ce))
|
||||
return PTR_ERR(ce);
|
||||
|
||||
switch (INTEL_GEN(ce->engine->i915)) {
|
||||
switch (GRAPHICS_VER(ce->engine->i915)) {
|
||||
case 7: {
|
||||
/*
|
||||
* On Haswell we don't do any post processing of the reports
|
||||
|
@ -1297,7 +1297,7 @@ static int oa_get_render_ctx_id(struct i915_perf_stream *stream)
|
|||
}
|
||||
|
||||
default:
|
||||
MISSING_CASE(INTEL_GEN(ce->engine->i915));
|
||||
MISSING_CASE(GRAPHICS_VER(ce->engine->i915));
|
||||
}
|
||||
|
||||
ce->tag = stream->specific_ctx_id;
|
||||
|
@ -1602,7 +1602,7 @@ static u32 *save_restore_register(struct i915_perf_stream *stream, u32 *cs,
|
|||
|
||||
cmd = save ? MI_STORE_REGISTER_MEM : MI_LOAD_REGISTER_MEM;
|
||||
cmd |= MI_SRM_LRM_GLOBAL_GTT;
|
||||
if (INTEL_GEN(stream->perf->i915) >= 8)
|
||||
if (GRAPHICS_VER(stream->perf->i915) >= 8)
|
||||
cmd++;
|
||||
|
||||
for (d = 0; d < dword_count; d++) {
|
||||
|
@ -1731,7 +1731,7 @@ retry:
|
|||
*cs++ = i915_mmio_reg_offset(MI_PREDICATE_RESULT_1);
|
||||
|
||||
/* Restart from the beginning if we had timestamps roll over. */
|
||||
*cs++ = (INTEL_GEN(i915) < 8 ?
|
||||
*cs++ = (GRAPHICS_VER(i915) < 8 ?
|
||||
MI_BATCH_BUFFER_START :
|
||||
MI_BATCH_BUFFER_START_GEN8) |
|
||||
MI_BATCH_PREDICATE;
|
||||
|
@ -1768,7 +1768,7 @@ retry:
|
|||
*cs++ = i915_mmio_reg_offset(MI_PREDICATE_RESULT_1);
|
||||
|
||||
/* Predicate the jump. */
|
||||
*cs++ = (INTEL_GEN(i915) < 8 ?
|
||||
*cs++ = (GRAPHICS_VER(i915) < 8 ?
|
||||
MI_BATCH_BUFFER_START :
|
||||
MI_BATCH_BUFFER_START_GEN8) |
|
||||
MI_BATCH_PREDICATE;
|
||||
|
@ -1892,7 +1892,7 @@ retry:
|
|||
oa_config->flex_regs_len);
|
||||
|
||||
/* Jump into the active wait. */
|
||||
*cs++ = (INTEL_GEN(stream->perf->i915) < 8 ?
|
||||
*cs++ = (GRAPHICS_VER(stream->perf->i915) < 8 ?
|
||||
MI_BATCH_BUFFER_START :
|
||||
MI_BATCH_BUFFER_START_GEN8);
|
||||
*cs++ = i915_ggtt_offset(stream->noa_wait);
|
||||
|
@ -2492,7 +2492,7 @@ gen8_enable_metric_set(struct i915_perf_stream *stream,
|
|||
* be read back from automatically triggered reports, as part of the
|
||||
* RPT_ID field.
|
||||
*/
|
||||
if (IS_GEN_RANGE(stream->perf->i915, 9, 11)) {
|
||||
if (IS_GRAPHICS_VER(stream->perf->i915, 9, 11)) {
|
||||
intel_uncore_write(uncore, GEN8_OA_DEBUG,
|
||||
_MASKED_BIT_ENABLE(GEN9_OA_DEBUG_DISABLE_CLK_RATIO_REPORTS |
|
||||
GEN9_OA_DEBUG_INCLUDE_CLK_RATIO));
|
||||
|
@ -2797,7 +2797,7 @@ get_default_sseu_config(struct intel_sseu *out_sseu,
|
|||
|
||||
*out_sseu = intel_sseu_from_device_info(devinfo_sseu);
|
||||
|
||||
if (IS_GEN(engine->i915, 11)) {
|
||||
if (GRAPHICS_VER(engine->i915) == 11) {
|
||||
/*
|
||||
* We only need subslice count so it doesn't matter which ones
|
||||
* we select - just turn off low bits in the amount of half of
|
||||
|
@ -2864,7 +2864,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
|
|||
}
|
||||
|
||||
if (!(props->sample_flags & SAMPLE_OA_REPORT) &&
|
||||
(INTEL_GEN(perf->i915) < 12 || !stream->ctx)) {
|
||||
(GRAPHICS_VER(perf->i915) < 12 || !stream->ctx)) {
|
||||
DRM_DEBUG("Only OA report sampling supported\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -3006,7 +3006,7 @@ void i915_oa_init_reg_state(const struct intel_context *ce,
|
|||
|
||||
/* perf.exclusive_stream serialised by lrc_configure_all_contexts() */
|
||||
stream = READ_ONCE(engine->i915->perf.exclusive_stream);
|
||||
if (stream && INTEL_GEN(stream->perf->i915) < 12)
|
||||
if (stream && GRAPHICS_VER(stream->perf->i915) < 12)
|
||||
gen8_update_reg_state_unlocked(ce, stream);
|
||||
}
|
||||
|
||||
|
@ -3443,7 +3443,7 @@ i915_perf_open_ioctl_locked(struct i915_perf *perf,
|
|||
*/
|
||||
if (IS_HASWELL(perf->i915) && specific_ctx)
|
||||
privileged_op = false;
|
||||
else if (IS_GEN(perf->i915, 12) && specific_ctx &&
|
||||
else if (GRAPHICS_VER(perf->i915) == 12 && specific_ctx &&
|
||||
(props->sample_flags & SAMPLE_OA_REPORT) == 0)
|
||||
privileged_op = false;
|
||||
|
||||
|
@ -4119,7 +4119,7 @@ int i915_perf_add_config_ioctl(struct drm_device *dev, void *data,
|
|||
}
|
||||
oa_config->b_counter_regs = regs;
|
||||
|
||||
if (INTEL_GEN(perf->i915) < 8) {
|
||||
if (GRAPHICS_VER(perf->i915) < 8) {
|
||||
if (args->n_flex_regs != 0) {
|
||||
err = -EINVAL;
|
||||
goto reg_err;
|
||||
|
@ -4365,7 +4365,7 @@ void i915_perf_init(struct drm_i915_private *i915)
|
|||
*/
|
||||
perf->ops.read = gen8_oa_read;
|
||||
|
||||
if (IS_GEN_RANGE(i915, 8, 9)) {
|
||||
if (IS_GRAPHICS_VER(i915, 8, 9)) {
|
||||
perf->ops.is_valid_b_counter_reg =
|
||||
gen7_is_valid_b_counter_addr;
|
||||
perf->ops.is_valid_mux_reg =
|
||||
|
@ -4384,7 +4384,7 @@ void i915_perf_init(struct drm_i915_private *i915)
|
|||
perf->ops.disable_metric_set = gen8_disable_metric_set;
|
||||
perf->ops.oa_hw_tail_read = gen8_oa_hw_tail_read;
|
||||
|
||||
if (IS_GEN(i915, 8)) {
|
||||
if (GRAPHICS_VER(i915) == 8) {
|
||||
perf->ctx_oactxctrl_offset = 0x120;
|
||||
perf->ctx_flexeu0_offset = 0x2ce;
|
||||
|
||||
|
@ -4395,7 +4395,7 @@ void i915_perf_init(struct drm_i915_private *i915)
|
|||
|
||||
perf->gen8_valid_ctx_bit = BIT(16);
|
||||
}
|
||||
} else if (IS_GEN_RANGE(i915, 10, 11)) {
|
||||
} else if (IS_GRAPHICS_VER(i915, 10, 11)) {
|
||||
perf->ops.is_valid_b_counter_reg =
|
||||
gen7_is_valid_b_counter_addr;
|
||||
perf->ops.is_valid_mux_reg =
|
||||
|
@ -4409,7 +4409,7 @@ void i915_perf_init(struct drm_i915_private *i915)
|
|||
perf->ops.disable_metric_set = gen10_disable_metric_set;
|
||||
perf->ops.oa_hw_tail_read = gen8_oa_hw_tail_read;
|
||||
|
||||
if (IS_GEN(i915, 10)) {
|
||||
if (GRAPHICS_VER(i915) == 10) {
|
||||
perf->ctx_oactxctrl_offset = 0x128;
|
||||
perf->ctx_flexeu0_offset = 0x3de;
|
||||
} else {
|
||||
|
@ -4417,7 +4417,7 @@ void i915_perf_init(struct drm_i915_private *i915)
|
|||
perf->ctx_flexeu0_offset = 0x78e;
|
||||
}
|
||||
perf->gen8_valid_ctx_bit = BIT(16);
|
||||
} else if (IS_GEN(i915, 12)) {
|
||||
} else if (GRAPHICS_VER(i915) == 12) {
|
||||
perf->ops.is_valid_b_counter_reg =
|
||||
gen12_is_valid_b_counter_addr;
|
||||
perf->ops.is_valid_mux_reg =
|
||||
|
|
|
@ -287,7 +287,7 @@ static bool exclusive_mmio_access(const struct drm_i915_private *i915)
|
|||
* risk a machine hang. For a fun history lesson dig out the old
|
||||
* userspace intel_gpu_top and run it on Ivybridge or Haswell!
|
||||
*/
|
||||
return IS_GEN(i915, 7);
|
||||
return GRAPHICS_VER(i915) == 7;
|
||||
}
|
||||
|
||||
static void engine_sample(struct intel_engine_cs *engine, unsigned int period_ns)
|
||||
|
@ -463,7 +463,7 @@ engine_event_status(struct intel_engine_cs *engine,
|
|||
case I915_SAMPLE_WAIT:
|
||||
break;
|
||||
case I915_SAMPLE_SEMA:
|
||||
if (INTEL_GEN(engine->i915) < 6)
|
||||
if (GRAPHICS_VER(engine->i915) < 6)
|
||||
return -ENODEV;
|
||||
break;
|
||||
default:
|
||||
|
@ -485,7 +485,7 @@ config_status(struct drm_i915_private *i915, u64 config)
|
|||
return -ENODEV;
|
||||
fallthrough;
|
||||
case I915_PMU_REQUESTED_FREQUENCY:
|
||||
if (INTEL_GEN(i915) < 6)
|
||||
if (GRAPHICS_VER(i915) < 6)
|
||||
return -ENODEV;
|
||||
break;
|
||||
case I915_PMU_INTERRUPTS:
|
||||
|
@ -1147,7 +1147,7 @@ void i915_pmu_register(struct drm_i915_private *i915)
|
|||
|
||||
int ret = -ENOMEM;
|
||||
|
||||
if (INTEL_GEN(i915) <= 2) {
|
||||
if (GRAPHICS_VER(i915) <= 2) {
|
||||
drm_info(&i915->drm, "PMU not supported for this GPU.");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -2941,6 +2941,15 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
|
|||
#define MBUS_BBOX_CTL_S1 _MMIO(0x45040)
|
||||
#define MBUS_BBOX_CTL_S2 _MMIO(0x45044)
|
||||
|
||||
#define MBUS_CTL _MMIO(0x4438C)
|
||||
#define MBUS_JOIN REG_BIT(31)
|
||||
#define MBUS_HASHING_MODE_MASK REG_BIT(30)
|
||||
#define MBUS_HASHING_MODE_2x2 REG_FIELD_PREP(MBUS_HASHING_MODE_MASK, 0)
|
||||
#define MBUS_HASHING_MODE_1x4 REG_FIELD_PREP(MBUS_HASHING_MODE_MASK, 1)
|
||||
#define MBUS_JOIN_PIPE_SELECT_MASK REG_GENMASK(28, 26)
|
||||
#define MBUS_JOIN_PIPE_SELECT(pipe) REG_FIELD_PREP(MBUS_JOIN_PIPE_SELECT_MASK, pipe)
|
||||
#define MBUS_JOIN_PIPE_SELECT_NONE MBUS_JOIN_PIPE_SELECT(7)
|
||||
|
||||
#define HDPORT_STATE _MMIO(0x45050)
|
||||
#define HDPORT_DPLL_USED_MASK REG_GENMASK(15, 12)
|
||||
#define HDPORT_DDI_USED(phy) REG_BIT(2 * (phy) + 1)
|
||||
|
@ -4382,6 +4391,8 @@ enum {
|
|||
#define VRR_CTL_PIPELINE_FULL_MASK REG_GENMASK(10, 3)
|
||||
#define VRR_CTL_PIPELINE_FULL(x) REG_FIELD_PREP(VRR_CTL_PIPELINE_FULL_MASK, (x))
|
||||
#define VRR_CTL_PIPELINE_FULL_OVERRIDE REG_BIT(0)
|
||||
#define XELPD_VRR_CTL_VRR_GUARDBAND_MASK REG_GENMASK(15, 0)
|
||||
#define XELPD_VRR_CTL_VRR_GUARDBAND(x) REG_FIELD_PREP(XELPD_VRR_CTL_VRR_GUARDBAND_MASK, (x))
|
||||
|
||||
#define _TRANS_VRR_VMAX_A 0x60424
|
||||
#define _TRANS_VRR_VMAX_B 0x61424
|
||||
|
@ -6141,6 +6152,10 @@ enum {
|
|||
#define _PIPEBGCMAX 0x71010
|
||||
#define PIPEGCMAX(pipe, i) _MMIO_PIPE2(pipe, _PIPEAGCMAX + (i) * 4)
|
||||
|
||||
#define _PIPE_ARB_CTL_A 0x70028 /* icl+ */
|
||||
#define PIPE_ARB_CTL(pipe) _MMIO_PIPE2(pipe, _PIPE_ARB_CTL_A)
|
||||
#define PIPE_ARB_USE_PROG_SLOTS REG_BIT(13)
|
||||
|
||||
#define _PIPE_MISC_A 0x70030
|
||||
#define _PIPE_MISC_B 0x71030
|
||||
#define PIPEMISC_YUV420_ENABLE (1 << 27) /* glk+ */
|
||||
|
@ -6158,12 +6173,26 @@ enum {
|
|||
#define PIPEMISC_DITHER_TYPE_SP (0 << 2)
|
||||
#define PIPEMISC(pipe) _MMIO_PIPE2(pipe, _PIPE_MISC_A)
|
||||
|
||||
#define _PIPE_MISC2_A 0x7002C
|
||||
#define _PIPE_MISC2_B 0x7102C
|
||||
#define PIPE_MISC2_BUBBLE_COUNTER_SCALER_EN (0x50 << 24)
|
||||
#define PIPE_MISC2_BUBBLE_COUNTER_SCALER_DIS (0x14 << 24)
|
||||
#define PIPE_MISC2_UNDERRUN_BUBBLE_COUNTER_MASK (0xff << 24)
|
||||
#define PIPE_MISC2(pipe) _MMIO_PIPE2(pipe, _PIPE_MISC2_A)
|
||||
|
||||
/* Skylake+ pipe bottom (background) color */
|
||||
#define _SKL_BOTTOM_COLOR_A 0x70034
|
||||
#define SKL_BOTTOM_COLOR_GAMMA_ENABLE (1 << 31)
|
||||
#define SKL_BOTTOM_COLOR_CSC_ENABLE (1 << 30)
|
||||
#define SKL_BOTTOM_COLOR(pipe) _MMIO_PIPE2(pipe, _SKL_BOTTOM_COLOR_A)
|
||||
|
||||
#define _ICL_PIPE_A_STATUS 0x70058
|
||||
#define ICL_PIPESTATUS(pipe) _MMIO_PIPE2(pipe, _ICL_PIPE_A_STATUS)
|
||||
#define PIPE_STATUS_UNDERRUN REG_BIT(31)
|
||||
#define PIPE_STATUS_SOFT_UNDERRUN_XELPD REG_BIT(28)
|
||||
#define PIPE_STATUS_HARD_UNDERRUN_XELPD REG_BIT(27)
|
||||
#define PIPE_STATUS_PORT_UNDERRUN_XELPD REG_BIT(26)
|
||||
|
||||
#define VLV_DPFLIPSTAT _MMIO(VLV_DISPLAY_BASE + 0x70028)
|
||||
#define PIPEB_LINE_COMPARE_INT_EN (1 << 29)
|
||||
#define PIPEB_HLINE_INT_EN (1 << 28)
|
||||
|
@ -6432,16 +6461,28 @@ enum {
|
|||
/* Watermark register definitions for SKL */
|
||||
#define _CUR_WM_A_0 0x70140
|
||||
#define _CUR_WM_B_0 0x71140
|
||||
#define _CUR_WM_SAGV_A 0x70158
|
||||
#define _CUR_WM_SAGV_B 0x71158
|
||||
#define _CUR_WM_SAGV_TRANS_A 0x7015C
|
||||
#define _CUR_WM_SAGV_TRANS_B 0x7115C
|
||||
#define _CUR_WM_TRANS_A 0x70168
|
||||
#define _CUR_WM_TRANS_B 0x71168
|
||||
#define _PLANE_WM_1_A_0 0x70240
|
||||
#define _PLANE_WM_1_B_0 0x71240
|
||||
#define _PLANE_WM_2_A_0 0x70340
|
||||
#define _PLANE_WM_2_B_0 0x71340
|
||||
#define _PLANE_WM_TRANS_1_A_0 0x70268
|
||||
#define _PLANE_WM_TRANS_1_B_0 0x71268
|
||||
#define _PLANE_WM_TRANS_2_A_0 0x70368
|
||||
#define _PLANE_WM_TRANS_2_B_0 0x71368
|
||||
#define _CUR_WM_TRANS_A_0 0x70168
|
||||
#define _CUR_WM_TRANS_B_0 0x71168
|
||||
#define _PLANE_WM_SAGV_1_A 0x70258
|
||||
#define _PLANE_WM_SAGV_1_B 0x71258
|
||||
#define _PLANE_WM_SAGV_2_A 0x70358
|
||||
#define _PLANE_WM_SAGV_2_B 0x71358
|
||||
#define _PLANE_WM_SAGV_TRANS_1_A 0x7025C
|
||||
#define _PLANE_WM_SAGV_TRANS_1_B 0x7125C
|
||||
#define _PLANE_WM_SAGV_TRANS_2_A 0x7035C
|
||||
#define _PLANE_WM_SAGV_TRANS_2_B 0x7135C
|
||||
#define _PLANE_WM_TRANS_1_A 0x70268
|
||||
#define _PLANE_WM_TRANS_1_B 0x71268
|
||||
#define _PLANE_WM_TRANS_2_A 0x70368
|
||||
#define _PLANE_WM_TRANS_2_B 0x71368
|
||||
#define PLANE_WM_EN (1 << 31)
|
||||
#define PLANE_WM_IGNORE_LINES (1 << 30)
|
||||
#define PLANE_WM_LINES_MASK REG_GENMASK(26, 14)
|
||||
|
@ -6449,19 +6490,32 @@ enum {
|
|||
|
||||
#define _CUR_WM_0(pipe) _PIPE(pipe, _CUR_WM_A_0, _CUR_WM_B_0)
|
||||
#define CUR_WM(pipe, level) _MMIO(_CUR_WM_0(pipe) + ((4) * (level)))
|
||||
#define CUR_WM_TRANS(pipe) _MMIO_PIPE(pipe, _CUR_WM_TRANS_A_0, _CUR_WM_TRANS_B_0)
|
||||
|
||||
#define CUR_WM_SAGV(pipe) _MMIO_PIPE(pipe, _CUR_WM_SAGV_A, _CUR_WM_SAGV_B)
|
||||
#define CUR_WM_SAGV_TRANS(pipe) _MMIO_PIPE(pipe, _CUR_WM_SAGV_TRANS_A, _CUR_WM_SAGV_TRANS_B)
|
||||
#define CUR_WM_TRANS(pipe) _MMIO_PIPE(pipe, _CUR_WM_TRANS_A, _CUR_WM_TRANS_B)
|
||||
#define _PLANE_WM_1(pipe) _PIPE(pipe, _PLANE_WM_1_A_0, _PLANE_WM_1_B_0)
|
||||
#define _PLANE_WM_2(pipe) _PIPE(pipe, _PLANE_WM_2_A_0, _PLANE_WM_2_B_0)
|
||||
#define _PLANE_WM_BASE(pipe, plane) \
|
||||
_PLANE(plane, _PLANE_WM_1(pipe), _PLANE_WM_2(pipe))
|
||||
#define PLANE_WM(pipe, plane, level) \
|
||||
_MMIO(_PLANE_WM_BASE(pipe, plane) + ((4) * (level)))
|
||||
#define _PLANE_WM_TRANS_1(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_TRANS_1_A_0, _PLANE_WM_TRANS_1_B_0)
|
||||
#define _PLANE_WM_TRANS_2(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_TRANS_2_A_0, _PLANE_WM_TRANS_2_B_0)
|
||||
#define PLANE_WM_TRANS(pipe, plane) \
|
||||
#define _PLANE_WM_BASE(pipe, plane) \
|
||||
_PLANE(plane, _PLANE_WM_1(pipe), _PLANE_WM_2(pipe))
|
||||
#define PLANE_WM(pipe, plane, level) \
|
||||
_MMIO(_PLANE_WM_BASE(pipe, plane) + ((4) * (level)))
|
||||
#define _PLANE_WM_SAGV_1(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_SAGV_1_A, _PLANE_WM_SAGV_1_B)
|
||||
#define _PLANE_WM_SAGV_2(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_SAGV_2_A, _PLANE_WM_SAGV_2_B)
|
||||
#define PLANE_WM_SAGV(pipe, plane) \
|
||||
_MMIO(_PLANE(plane, _PLANE_WM_SAGV_1(pipe), _PLANE_WM_SAGV_2(pipe)))
|
||||
#define _PLANE_WM_SAGV_TRANS_1(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_SAGV_TRANS_1_A, _PLANE_WM_SAGV_TRANS_1_B)
|
||||
#define _PLANE_WM_SAGV_TRANS_2(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_SAGV_TRANS_2_A, _PLANE_WM_SAGV_TRANS_2_B)
|
||||
#define PLANE_WM_SAGV_TRANS(pipe, plane) \
|
||||
_MMIO(_PLANE(plane, _PLANE_WM_SAGV_TRANS_1(pipe), _PLANE_WM_SAGV_TRANS_2(pipe)))
|
||||
#define _PLANE_WM_TRANS_1(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_TRANS_1_A, _PLANE_WM_TRANS_1_B)
|
||||
#define _PLANE_WM_TRANS_2(pipe) \
|
||||
_PIPE(pipe, _PLANE_WM_TRANS_2_A, _PLANE_WM_TRANS_2_B)
|
||||
#define PLANE_WM_TRANS(pipe, plane) \
|
||||
_MMIO(_PLANE(plane, _PLANE_WM_TRANS_1(pipe), _PLANE_WM_TRANS_2(pipe)))
|
||||
|
||||
/* define the Watermark register on Ironlake */
|
||||
|
@ -6566,6 +6620,8 @@ enum {
|
|||
#define MCURSOR_MODE_128_ARGB_AX ((1 << 5) | MCURSOR_MODE_128_32B_AX)
|
||||
#define MCURSOR_MODE_256_ARGB_AX ((1 << 5) | MCURSOR_MODE_256_32B_AX)
|
||||
#define MCURSOR_MODE_64_ARGB_AX ((1 << 5) | MCURSOR_MODE_64_32B_AX)
|
||||
#define MCURSOR_ARB_SLOTS_MASK REG_GENMASK(30, 28) /* icl+ */
|
||||
#define MCURSOR_ARB_SLOTS(x) REG_FIELD_PREP(MCURSOR_ARB_SLOTS_MASK, (x)) /* icl+ */
|
||||
#define MCURSOR_PIPE_SELECT_MASK (0x3 << 28)
|
||||
#define MCURSOR_PIPE_SELECT_SHIFT 28
|
||||
#define MCURSOR_PIPE_SELECT(pipe) ((pipe) << 28)
|
||||
|
@ -7017,6 +7073,8 @@ enum {
|
|||
#define _PLANE_CTL_2_A 0x70280
|
||||
#define _PLANE_CTL_3_A 0x70380
|
||||
#define PLANE_CTL_ENABLE (1 << 31)
|
||||
#define PLANE_CTL_ARB_SLOTS_MASK REG_GENMASK(30, 28) /* icl+ */
|
||||
#define PLANE_CTL_ARB_SLOTS(x) REG_FIELD_PREP(PLANE_CTL_ARB_SLOTS_MASK, (x)) /* icl+ */
|
||||
#define PLANE_CTL_PIPE_GAMMA_ENABLE (1 << 30) /* Pre-GLK */
|
||||
#define PLANE_CTL_YUV_RANGE_CORRECTION_DISABLE (1 << 28)
|
||||
/*
|
||||
|
@ -7280,7 +7338,7 @@ enum {
|
|||
|
||||
#define _PLANE_BUF_CFG_1_B 0x7127c
|
||||
#define _PLANE_BUF_CFG_2_B 0x7137c
|
||||
#define DDB_ENTRY_MASK 0x7FF /* skl+: 10 bits, icl+ 11 bits */
|
||||
#define DDB_ENTRY_MASK 0xFFF /* skl+: 10 bits, icl+ 11 bits, adlp+ 12 bits */
|
||||
#define DDB_ENTRY_END_SHIFT 16
|
||||
#define _PLANE_BUF_CFG_1(pipe) \
|
||||
_PIPE(pipe, _PLANE_BUF_CFG_1_A, _PLANE_BUF_CFG_1_B)
|
||||
|
@ -7692,20 +7750,20 @@ enum {
|
|||
#define GAMMA_MODE_MODE_SPLIT (3 << 0) /* ivb-bdw */
|
||||
#define GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED (3 << 0) /* icl + */
|
||||
|
||||
/* DMC/CSR */
|
||||
#define CSR_PROGRAM(i) _MMIO(0x80000 + (i) * 4)
|
||||
#define CSR_SSP_BASE_ADDR_GEN9 0x00002FC0
|
||||
#define CSR_HTP_ADDR_SKL 0x00500034
|
||||
#define CSR_SSP_BASE _MMIO(0x8F074)
|
||||
#define CSR_HTP_SKL _MMIO(0x8F004)
|
||||
#define CSR_LAST_WRITE _MMIO(0x8F034)
|
||||
#define CSR_LAST_WRITE_VALUE 0xc003b400
|
||||
/* MMIO address range for CSR program (0x80000 - 0x82FFF) */
|
||||
#define CSR_MMIO_START_RANGE 0x80000
|
||||
#define CSR_MMIO_END_RANGE 0x8FFFF
|
||||
#define SKL_CSR_DC3_DC5_COUNT _MMIO(0x80030)
|
||||
#define SKL_CSR_DC5_DC6_COUNT _MMIO(0x8002C)
|
||||
#define BXT_CSR_DC3_DC5_COUNT _MMIO(0x80038)
|
||||
/* DMC */
|
||||
#define DMC_PROGRAM(i) _MMIO(0x80000 + (i) * 4)
|
||||
#define DMC_SSP_BASE_ADDR_GEN9 0x00002FC0
|
||||
#define DMC_HTP_ADDR_SKL 0x00500034
|
||||
#define DMC_SSP_BASE _MMIO(0x8F074)
|
||||
#define DMC_HTP_SKL _MMIO(0x8F004)
|
||||
#define DMC_LAST_WRITE _MMIO(0x8F034)
|
||||
#define DMC_LAST_WRITE_VALUE 0xc003b400
|
||||
/* MMIO address range for DMC program (0x80000 - 0x82FFF) */
|
||||
#define DMC_MMIO_START_RANGE 0x80000
|
||||
#define DMC_MMIO_END_RANGE 0x8FFFF
|
||||
#define SKL_DMC_DC3_DC5_COUNT _MMIO(0x80030)
|
||||
#define SKL_DMC_DC5_DC6_COUNT _MMIO(0x8002C)
|
||||
#define BXT_DMC_DC3_DC5_COUNT _MMIO(0x80038)
|
||||
#define TGL_DMC_DEBUG_DC5_COUNT _MMIO(0x101084)
|
||||
#define TGL_DMC_DEBUG_DC6_COUNT _MMIO(0x101088)
|
||||
#define DG1_DMC_DEBUG_DC5_COUNT _MMIO(0x134154)
|
||||
|
@ -7820,6 +7878,8 @@ enum {
|
|||
#define GEN8_PIPE_FIFO_UNDERRUN (1 << 31)
|
||||
#define GEN8_PIPE_CDCLK_CRC_ERROR (1 << 29)
|
||||
#define GEN8_PIPE_CDCLK_CRC_DONE (1 << 28)
|
||||
#define XELPD_PIPE_SOFT_UNDERRUN (1 << 22)
|
||||
#define XELPD_PIPE_HARD_UNDERRUN (1 << 21)
|
||||
#define GEN8_PIPE_CURSOR_FAULT (1 << 10)
|
||||
#define GEN8_PIPE_SPRITE_FAULT (1 << 9)
|
||||
#define GEN8_PIPE_PRIMARY_FAULT (1 << 8)
|
||||
|
@ -8115,13 +8175,29 @@ enum {
|
|||
#define DISP_DATA_PARTITION_5_6 (1 << 6)
|
||||
#define DISP_IPC_ENABLE (1 << 3)
|
||||
|
||||
#define _DBUF_CTL_S1 0x45008
|
||||
#define _DBUF_CTL_S2 0x44FE8
|
||||
#define DBUF_CTL_S(slice) _MMIO(_PICK_EVEN(slice, _DBUF_CTL_S1, _DBUF_CTL_S2))
|
||||
/*
|
||||
* The below are numbered starting from "S1" on gen11/gen12, but starting
|
||||
* with gen13 display, the bspec switches to a 0-based numbering scheme
|
||||
* (although the addresses stay the same so new S0 = old S1, new S1 = old S2).
|
||||
* We'll just use the 0-based numbering here for all platforms since it's the
|
||||
* way things will be named by the hardware team going forward, plus it's more
|
||||
* consistent with how most of the rest of our registers are named.
|
||||
*/
|
||||
#define _DBUF_CTL_S0 0x45008
|
||||
#define _DBUF_CTL_S1 0x44FE8
|
||||
#define _DBUF_CTL_S2 0x44300
|
||||
#define _DBUF_CTL_S3 0x44304
|
||||
#define DBUF_CTL_S(slice) _MMIO(_PICK(slice, \
|
||||
_DBUF_CTL_S0, \
|
||||
_DBUF_CTL_S1, \
|
||||
_DBUF_CTL_S2, \
|
||||
_DBUF_CTL_S3))
|
||||
#define DBUF_POWER_REQUEST REG_BIT(31)
|
||||
#define DBUF_POWER_STATE REG_BIT(30)
|
||||
#define DBUF_TRACKER_STATE_SERVICE_MASK REG_GENMASK(23, 19)
|
||||
#define DBUF_TRACKER_STATE_SERVICE(x) REG_FIELD_PREP(DBUF_TRACKER_STATE_SERVICE_MASK, x)
|
||||
#define DBUF_MIN_TRACKER_STATE_SERVICE_MASK REG_GENMASK(18, 16) /* ADL-P+ */
|
||||
#define DBUF_MIN_TRACKER_STATE_SERVICE(x) REG_FIELD_PREP(DBUF_MIN_TRACKER_STATE_SERVICE_MASK, x) /* ADL-P+ */
|
||||
|
||||
#define GEN7_MSG_CTL _MMIO(0x45010)
|
||||
#define WAIT_FOR_PCH_RESET_ACK (1 << 1)
|
||||
|
@ -8306,6 +8382,7 @@ enum {
|
|||
#define _PIPEC_CHICKEN 0x72038
|
||||
#define PIPE_CHICKEN(pipe) _MMIO_PIPE(pipe, _PIPEA_CHICKEN,\
|
||||
_PIPEB_CHICKEN)
|
||||
#define UNDERRUN_RECOVERY_DISABLE REG_BIT(30)
|
||||
#define PIXEL_ROUNDING_TRUNC_FB_PASSTHRU (1 << 15)
|
||||
#define PER_PIXEL_ALPHA_BYPASS_EN (1 << 7)
|
||||
|
||||
|
@ -9831,7 +9908,7 @@ enum skl_power_gate {
|
|||
#define TRANS_HDCP_CONF(trans) _MMIO_TRANS(trans, _TRANSA_HDCP_CONF, \
|
||||
_TRANSB_HDCP_CONF)
|
||||
#define HDCP_CONF(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_CONF(trans) : \
|
||||
PORT_HDCP_CONF(port))
|
||||
|
||||
|
@ -9844,7 +9921,7 @@ enum skl_power_gate {
|
|||
_TRANSA_HDCP_ANINIT, \
|
||||
_TRANSB_HDCP_ANINIT)
|
||||
#define HDCP_ANINIT(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_ANINIT(trans) : \
|
||||
PORT_HDCP_ANINIT(port))
|
||||
|
||||
|
@ -9854,7 +9931,7 @@ enum skl_power_gate {
|
|||
#define TRANS_HDCP_ANLO(trans) _MMIO_TRANS(trans, _TRANSA_HDCP_ANLO, \
|
||||
_TRANSB_HDCP_ANLO)
|
||||
#define HDCP_ANLO(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_ANLO(trans) : \
|
||||
PORT_HDCP_ANLO(port))
|
||||
|
||||
|
@ -9864,7 +9941,7 @@ enum skl_power_gate {
|
|||
#define TRANS_HDCP_ANHI(trans) _MMIO_TRANS(trans, _TRANSA_HDCP_ANHI, \
|
||||
_TRANSB_HDCP_ANHI)
|
||||
#define HDCP_ANHI(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_ANHI(trans) : \
|
||||
PORT_HDCP_ANHI(port))
|
||||
|
||||
|
@ -9875,7 +9952,7 @@ enum skl_power_gate {
|
|||
_TRANSA_HDCP_BKSVLO, \
|
||||
_TRANSB_HDCP_BKSVLO)
|
||||
#define HDCP_BKSVLO(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_BKSVLO(trans) : \
|
||||
PORT_HDCP_BKSVLO(port))
|
||||
|
||||
|
@ -9886,7 +9963,7 @@ enum skl_power_gate {
|
|||
_TRANSA_HDCP_BKSVHI, \
|
||||
_TRANSB_HDCP_BKSVHI)
|
||||
#define HDCP_BKSVHI(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_BKSVHI(trans) : \
|
||||
PORT_HDCP_BKSVHI(port))
|
||||
|
||||
|
@ -9897,7 +9974,7 @@ enum skl_power_gate {
|
|||
_TRANSA_HDCP_RPRIME, \
|
||||
_TRANSB_HDCP_RPRIME)
|
||||
#define HDCP_RPRIME(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_RPRIME(trans) : \
|
||||
PORT_HDCP_RPRIME(port))
|
||||
|
||||
|
@ -9908,7 +9985,7 @@ enum skl_power_gate {
|
|||
_TRANSA_HDCP_STATUS, \
|
||||
_TRANSB_HDCP_STATUS)
|
||||
#define HDCP_STATUS(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP_STATUS(trans) : \
|
||||
PORT_HDCP_STATUS(port))
|
||||
|
||||
|
@ -9949,7 +10026,7 @@ enum skl_power_gate {
|
|||
#define AUTH_FORCE_CLR_INPUTCTR BIT(19)
|
||||
#define AUTH_CLR_KEYS BIT(18)
|
||||
#define HDCP2_AUTH(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP2_AUTH(trans) : \
|
||||
PORT_HDCP2_AUTH(port))
|
||||
|
||||
|
@ -9960,7 +10037,7 @@ enum skl_power_gate {
|
|||
_TRANSB_HDCP2_CTL)
|
||||
#define CTL_LINK_ENCRYPTION_REQ BIT(31)
|
||||
#define HDCP2_CTL(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP2_CTL(trans) : \
|
||||
PORT_HDCP2_CTL(port))
|
||||
|
||||
|
@ -9974,7 +10051,7 @@ enum skl_power_gate {
|
|||
#define LINK_AUTH_STATUS BIT(21)
|
||||
#define LINK_ENCRYPTION_STATUS BIT(20)
|
||||
#define HDCP2_STATUS(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP2_STATUS(trans) : \
|
||||
PORT_HDCP2_STATUS(port))
|
||||
|
||||
|
@ -9996,7 +10073,7 @@ enum skl_power_gate {
|
|||
#define STREAM_ENCRYPTION_STATUS BIT(31)
|
||||
#define STREAM_TYPE_STATUS BIT(30)
|
||||
#define HDCP2_STREAM_STATUS(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP2_STREAM_STATUS(trans) : \
|
||||
PIPE_HDCP2_STREAM_STATUS(pipe))
|
||||
|
||||
|
@ -10012,7 +10089,7 @@ enum skl_power_gate {
|
|||
_TRANSB_HDCP2_AUTH_STREAM)
|
||||
#define AUTH_STREAM_TYPE BIT(31)
|
||||
#define HDCP2_AUTH_STREAM(dev_priv, trans, port) \
|
||||
(INTEL_GEN(dev_priv) >= 12 ? \
|
||||
(GRAPHICS_VER(dev_priv) >= 12 ? \
|
||||
TRANS_HDCP2_AUTH_STREAM(trans) : \
|
||||
PORT_HDCP2_AUTH_STREAM(port))
|
||||
|
||||
|
@ -10128,8 +10205,10 @@ enum skl_power_gate {
|
|||
#define DDI_BUF_CTL_ENABLE (1 << 31)
|
||||
#define DDI_BUF_TRANS_SELECT(n) ((n) << 24)
|
||||
#define DDI_BUF_EMP_MASK (0xf << 24)
|
||||
#define DDI_BUF_PHY_LINK_RATE(r) ((r) << 20)
|
||||
#define DDI_BUF_PORT_REVERSAL (1 << 16)
|
||||
#define DDI_BUF_IS_IDLE (1 << 7)
|
||||
#define DDI_BUF_CTL_TC_PHY_OWNERSHIP REG_BIT(6)
|
||||
#define DDI_A_4_LANES (1 << 4)
|
||||
#define DDI_PORT_WIDTH(width) (((width) - 1) << 1)
|
||||
#define DDI_PORT_WIDTH_MASK (7 << 1)
|
||||
|
@ -10492,6 +10571,14 @@ enum skl_power_gate {
|
|||
#define DG1_DPLL_ENABLE(pll) _MMIO_PLL3(pll, DPLL0_ENABLE, DPLL1_ENABLE, \
|
||||
_MG_PLL1_ENABLE, _MG_PLL2_ENABLE)
|
||||
|
||||
/* ADL-P Type C PLL */
|
||||
#define PORTTC1_PLL_ENABLE 0x46038
|
||||
#define PORTTC2_PLL_ENABLE 0x46040
|
||||
|
||||
#define ADLP_PORTTC_PLL_ENABLE(tc_port) _MMIO_PORT((tc_port), \
|
||||
PORTTC1_PLL_ENABLE, \
|
||||
PORTTC2_PLL_ENABLE)
|
||||
|
||||
#define _MG_REFCLKIN_CTL_PORT1 0x16892C
|
||||
#define _MG_REFCLKIN_CTL_PORT2 0x16992C
|
||||
#define _MG_REFCLKIN_CTL_PORT3 0x16A92C
|
||||
|
@ -10906,6 +10993,8 @@ enum skl_power_gate {
|
|||
#define BXT_DE_PLL_ENABLE _MMIO(0x46070)
|
||||
#define BXT_DE_PLL_PLL_ENABLE (1 << 31)
|
||||
#define BXT_DE_PLL_LOCK (1 << 30)
|
||||
#define BXT_DE_PLL_FREQ_REQ (1 << 23)
|
||||
#define BXT_DE_PLL_FREQ_REQ_ACK (1 << 22)
|
||||
#define CNL_CDCLK_PLL_RATIO(x) (x)
|
||||
#define CNL_CDCLK_PLL_RATIO_MASK 0xff
|
||||
|
||||
|
@ -11280,6 +11369,12 @@ enum skl_power_gate {
|
|||
#define ICL_ESC_CLK_DIV_SHIFT 0
|
||||
#define DSI_MAX_ESC_CLK 20000 /* in KHz */
|
||||
|
||||
#define _ADL_MIPIO_REG 0x180
|
||||
#define ADL_MIPIO_DW(port, dw) _MMIO(_ICL_COMBOPHY(port) + _ADL_MIPIO_REG + 4 * (dw))
|
||||
#define TX_ESC_CLK_DIV_PHY_SEL REGBIT(16)
|
||||
#define TX_ESC_CLK_DIV_PHY_MASK REG_GENMASK(23, 16)
|
||||
#define TX_ESC_CLK_DIV_PHY REG_FIELD_PREP(TX_ESC_CLK_DIV_PHY_MASK, 0x7f)
|
||||
|
||||
#define _DSI_CMD_FRMCTL_0 0x6b034
|
||||
#define _DSI_CMD_FRMCTL_1 0x6b834
|
||||
#define DSI_CMD_FRMCTL(port) _MMIO_PORT(port, \
|
||||
|
@ -12566,6 +12661,15 @@ enum skl_power_gate {
|
|||
#define DP_PIN_ASSIGNMENT_MASK(idx) (0xf << ((idx) * 4))
|
||||
#define DP_PIN_ASSIGNMENT(idx, x) ((x) << ((idx) * 4))
|
||||
|
||||
#define _TCSS_DDI_STATUS_1 0x161500
|
||||
#define _TCSS_DDI_STATUS_2 0x161504
|
||||
#define TCSS_DDI_STATUS(tc) _MMIO(_PICK_EVEN(tc, \
|
||||
_TCSS_DDI_STATUS_1, \
|
||||
_TCSS_DDI_STATUS_2))
|
||||
#define TCSS_DDI_STATUS_READY REG_BIT(2)
|
||||
#define TCSS_DDI_STATUS_HPD_LIVE_STATUS_TBT REG_BIT(1)
|
||||
#define TCSS_DDI_STATUS_HPD_LIVE_STATUS_ALT REG_BIT(0)
|
||||
|
||||
/* This register controls the Display State Buffer (DSB) engines. */
|
||||
#define _DSBSL_INSTANCE_BASE 0x70B00
|
||||
#define DSBSL_INSTANCE(pipe, id) (_DSBSL_INSTANCE_BASE + \
|
||||
|
|
|
@ -1176,12 +1176,12 @@ __emit_semaphore_wait(struct i915_request *to,
|
|||
struct i915_request *from,
|
||||
u32 seqno)
|
||||
{
|
||||
const int has_token = INTEL_GEN(to->engine->i915) >= 12;
|
||||
const int has_token = GRAPHICS_VER(to->engine->i915) >= 12;
|
||||
u32 hwsp_offset;
|
||||
int len, err;
|
||||
u32 *cs;
|
||||
|
||||
GEM_BUG_ON(INTEL_GEN(to->engine->i915) < 8);
|
||||
GEM_BUG_ON(GRAPHICS_VER(to->engine->i915) < 8);
|
||||
GEM_BUG_ON(i915_request_has_initial_breadcrumb(to));
|
||||
|
||||
/* We need to pin the signaler's HWSP until we are finished reading. */
|
||||
|
|
|
@ -38,14 +38,14 @@ static void intel_save_swf(struct drm_i915_private *dev_priv)
|
|||
int i;
|
||||
|
||||
/* Scratch space */
|
||||
if (IS_GEN(dev_priv, 2) && IS_MOBILE(dev_priv)) {
|
||||
if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
|
||||
for (i = 0; i < 7; i++) {
|
||||
dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv, SWF0(i));
|
||||
dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv, SWF1(i));
|
||||
}
|
||||
for (i = 0; i < 3; i++)
|
||||
dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv, SWF3(i));
|
||||
} else if (IS_GEN(dev_priv, 2)) {
|
||||
} else if (GRAPHICS_VER(dev_priv) == 2) {
|
||||
for (i = 0; i < 7; i++)
|
||||
dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv, SWF1(i));
|
||||
} else if (HAS_GMCH(dev_priv)) {
|
||||
|
@ -63,14 +63,14 @@ static void intel_restore_swf(struct drm_i915_private *dev_priv)
|
|||
int i;
|
||||
|
||||
/* Scratch space */
|
||||
if (IS_GEN(dev_priv, 2) && IS_MOBILE(dev_priv)) {
|
||||
if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
|
||||
for (i = 0; i < 7; i++) {
|
||||
intel_de_write(dev_priv, SWF0(i), dev_priv->regfile.saveSWF0[i]);
|
||||
intel_de_write(dev_priv, SWF1(i), dev_priv->regfile.saveSWF1[i]);
|
||||
}
|
||||
for (i = 0; i < 3; i++)
|
||||
intel_de_write(dev_priv, SWF3(i), dev_priv->regfile.saveSWF3[i]);
|
||||
} else if (IS_GEN(dev_priv, 2)) {
|
||||
} else if (GRAPHICS_VER(dev_priv) == 2) {
|
||||
for (i = 0; i < 7; i++)
|
||||
intel_de_write(dev_priv, SWF1(i), dev_priv->regfile.saveSWF1[i]);
|
||||
} else if (HAS_GMCH(dev_priv)) {
|
||||
|
@ -91,10 +91,10 @@ void i915_save_display(struct drm_i915_private *dev_priv)
|
|||
return;
|
||||
|
||||
/* Display arbitration control */
|
||||
if (INTEL_GEN(dev_priv) <= 4)
|
||||
if (GRAPHICS_VER(dev_priv) <= 4)
|
||||
dev_priv->regfile.saveDSPARB = intel_de_read(dev_priv, DSPARB);
|
||||
|
||||
if (IS_GEN(dev_priv, 4))
|
||||
if (GRAPHICS_VER(dev_priv) == 4)
|
||||
pci_read_config_word(pdev, GCDGMBUS,
|
||||
&dev_priv->regfile.saveGCDGMBUS);
|
||||
|
||||
|
@ -110,12 +110,12 @@ void i915_restore_display(struct drm_i915_private *dev_priv)
|
|||
|
||||
intel_restore_swf(dev_priv);
|
||||
|
||||
if (IS_GEN(dev_priv, 4))
|
||||
if (GRAPHICS_VER(dev_priv) == 4)
|
||||
pci_write_config_word(pdev, GCDGMBUS,
|
||||
dev_priv->regfile.saveGCDGMBUS);
|
||||
|
||||
/* Display arbitration */
|
||||
if (INTEL_GEN(dev_priv) <= 4)
|
||||
if (GRAPHICS_VER(dev_priv) <= 4)
|
||||
intel_de_write(dev_priv, DSPARB, dev_priv->regfile.saveDSPARB);
|
||||
|
||||
/* only restore FBC info on the platform that supports FBC*/
|
||||
|
|
|
@ -595,7 +595,7 @@ void i915_setup_sysfs(struct drm_i915_private *dev_priv)
|
|||
ret = 0;
|
||||
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
|
||||
ret = sysfs_create_files(&kdev->kobj, vlv_attrs);
|
||||
else if (INTEL_GEN(dev_priv) >= 6)
|
||||
else if (GRAPHICS_VER(dev_priv) >= 6)
|
||||
ret = sysfs_create_files(&kdev->kobj, gen6_attrs);
|
||||
if (ret)
|
||||
drm_err(&dev_priv->drm, "RPS sysfs setup failed\n");
|
||||
|
|
|
@ -74,7 +74,7 @@ void intel_vgpu_detect(struct drm_i915_private *dev_priv)
|
|||
* we do not support VGT on older gens, return early so we don't have
|
||||
* to consider differently numbered or sized MMIO bars
|
||||
*/
|
||||
if (INTEL_GEN(dev_priv) < 6)
|
||||
if (GRAPHICS_VER(dev_priv) < 6)
|
||||
return;
|
||||
|
||||
shared_area = pci_iomap_range(pdev, 0, VGT_PVINFO_PAGE, VGT_PVINFO_SIZE);
|
||||
|
|
|
@ -274,7 +274,7 @@ i915_vma_instance(struct drm_i915_gem_object *obj,
|
|||
{
|
||||
struct i915_vma *vma;
|
||||
|
||||
GEM_BUG_ON(view && !i915_is_ggtt(vm));
|
||||
GEM_BUG_ON(view && !i915_is_ggtt_or_dpt(vm));
|
||||
GEM_BUG_ON(!atomic_read(&vm->open));
|
||||
|
||||
spin_lock(&obj->vma.lock);
|
||||
|
|
|
@ -68,6 +68,11 @@ static inline bool i915_vma_is_ggtt(const struct i915_vma *vma)
|
|||
return test_bit(I915_VMA_GGTT_BIT, __i915_vma_flags(vma));
|
||||
}
|
||||
|
||||
static inline bool i915_vma_is_dpt(const struct i915_vma *vma)
|
||||
{
|
||||
return i915_is_dpt(vma->vm);
|
||||
}
|
||||
|
||||
static inline bool i915_vma_has_ggtt_write(const struct i915_vma *vma)
|
||||
{
|
||||
return test_bit(I915_VMA_GGTT_WRITE_BIT, __i915_vma_flags(vma));
|
||||
|
@ -158,7 +163,7 @@ i915_vma_compare(struct i915_vma *vma,
|
|||
{
|
||||
ptrdiff_t cmp;
|
||||
|
||||
GEM_BUG_ON(view && !i915_is_ggtt(vm));
|
||||
GEM_BUG_ON(view && !i915_is_ggtt_or_dpt(vm));
|
||||
|
||||
cmp = ptrdiff(vma->vm, vm);
|
||||
if (cmp)
|
||||
|
|
|
@ -257,10 +257,10 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
|
|||
if (IS_ADLS_DISPLAY_STEP(dev_priv, STEP_A0, STEP_A0))
|
||||
for_each_pipe(dev_priv, pipe)
|
||||
runtime->num_scalers[pipe] = 0;
|
||||
else if (INTEL_GEN(dev_priv) >= 10) {
|
||||
else if (GRAPHICS_VER(dev_priv) >= 10) {
|
||||
for_each_pipe(dev_priv, pipe)
|
||||
runtime->num_scalers[pipe] = 2;
|
||||
} else if (IS_GEN(dev_priv, 9)) {
|
||||
} else if (GRAPHICS_VER(dev_priv) == 9) {
|
||||
runtime->num_scalers[PIPE_A] = 2;
|
||||
runtime->num_scalers[PIPE_B] = 2;
|
||||
runtime->num_scalers[PIPE_C] = 1;
|
||||
|
@ -271,10 +271,10 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
|
|||
if (DISPLAY_VER(dev_priv) >= 13 || HAS_D12_PLANE_MINIMIZATION(dev_priv))
|
||||
for_each_pipe(dev_priv, pipe)
|
||||
runtime->num_sprites[pipe] = 4;
|
||||
else if (INTEL_GEN(dev_priv) >= 11)
|
||||
else if (GRAPHICS_VER(dev_priv) >= 11)
|
||||
for_each_pipe(dev_priv, pipe)
|
||||
runtime->num_sprites[pipe] = 6;
|
||||
else if (IS_GEN(dev_priv, 10) || IS_GEMINILAKE(dev_priv))
|
||||
else if (GRAPHICS_VER(dev_priv) == 10 || IS_GEMINILAKE(dev_priv))
|
||||
for_each_pipe(dev_priv, pipe)
|
||||
runtime->num_sprites[pipe] = 3;
|
||||
else if (IS_BROXTON(dev_priv)) {
|
||||
|
@ -293,12 +293,12 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
|
|||
} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
|
||||
for_each_pipe(dev_priv, pipe)
|
||||
runtime->num_sprites[pipe] = 2;
|
||||
} else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) {
|
||||
} else if (GRAPHICS_VER(dev_priv) >= 5 || IS_G4X(dev_priv)) {
|
||||
for_each_pipe(dev_priv, pipe)
|
||||
runtime->num_sprites[pipe] = 1;
|
||||
}
|
||||
|
||||
if (HAS_DISPLAY(dev_priv) && IS_GEN_RANGE(dev_priv, 7, 8) &&
|
||||
if (HAS_DISPLAY(dev_priv) && IS_GRAPHICS_VER(dev_priv, 7, 8) &&
|
||||
HAS_PCH_SPLIT(dev_priv)) {
|
||||
u32 fuse_strap = intel_de_read(dev_priv, FUSE_STRAP);
|
||||
u32 sfuse_strap = intel_de_read(dev_priv, SFUSE_STRAP);
|
||||
|
@ -325,7 +325,7 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
|
|||
info->pipe_mask &= ~BIT(PIPE_C);
|
||||
info->cpu_transcoder_mask &= ~BIT(TRANSCODER_C);
|
||||
}
|
||||
} else if (HAS_DISPLAY(dev_priv) && INTEL_GEN(dev_priv) >= 9) {
|
||||
} else if (HAS_DISPLAY(dev_priv) && GRAPHICS_VER(dev_priv) >= 9) {
|
||||
u32 dfsm = intel_de_read(dev_priv, SKL_DFSM);
|
||||
|
||||
if (dfsm & SKL_DFSM_PIPE_A_DISABLE) {
|
||||
|
@ -340,7 +340,7 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
|
|||
info->pipe_mask &= ~BIT(PIPE_C);
|
||||
info->cpu_transcoder_mask &= ~BIT(TRANSCODER_C);
|
||||
}
|
||||
if (INTEL_GEN(dev_priv) >= 12 &&
|
||||
if (GRAPHICS_VER(dev_priv) >= 12 &&
|
||||
(dfsm & TGL_DFSM_PIPE_D_DISABLE)) {
|
||||
info->pipe_mask &= ~BIT(PIPE_D);
|
||||
info->cpu_transcoder_mask &= ~BIT(TRANSCODER_D);
|
||||
|
@ -352,15 +352,15 @@ void intel_device_info_runtime_init(struct drm_i915_private *dev_priv)
|
|||
if (dfsm & SKL_DFSM_DISPLAY_PM_DISABLE)
|
||||
info->display.has_fbc = 0;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 11 && (dfsm & ICL_DFSM_DMC_DISABLE))
|
||||
info->display.has_csr = 0;
|
||||
if (GRAPHICS_VER(dev_priv) >= 11 && (dfsm & ICL_DFSM_DMC_DISABLE))
|
||||
info->display.has_dmc = 0;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 10 &&
|
||||
if (GRAPHICS_VER(dev_priv) >= 10 &&
|
||||
(dfsm & CNL_DFSM_DISPLAY_DSC_DISABLE))
|
||||
info->display.has_dsc = 0;
|
||||
}
|
||||
|
||||
if (IS_GEN(dev_priv, 6) && intel_vtd_active()) {
|
||||
if (GRAPHICS_VER(dev_priv) == 6 && intel_vtd_active()) {
|
||||
drm_info(&dev_priv->drm,
|
||||
"Disabling ppGTT for VT-d support\n");
|
||||
info->ppgtt_type = INTEL_PPGTT_NONE;
|
||||
|
|
|
@ -141,7 +141,7 @@ enum intel_ppgtt_type {
|
|||
#define DEV_INFO_DISPLAY_FOR_EACH_FLAG(func) \
|
||||
/* Keep in alphabetical order */ \
|
||||
func(cursor_needs_physical); \
|
||||
func(has_csr); \
|
||||
func(has_dmc); \
|
||||
func(has_ddi); \
|
||||
func(has_dp_mst); \
|
||||
func(has_dsb); \
|
||||
|
@ -185,6 +185,8 @@ struct intel_device_info {
|
|||
|
||||
u8 abox_mask;
|
||||
|
||||
u8 has_cdclk_crawl; /* does support CDCLK crawling */
|
||||
|
||||
#define DEFINE_FLAG(name) u8 name:1
|
||||
DEV_INFO_FOR_EACH_FLAG(DEFINE_FLAG);
|
||||
#undef DEFINE_FLAG
|
||||
|
|
|
@ -121,7 +121,7 @@ skl_dram_get_dimm_info(struct drm_i915_private *i915,
|
|||
struct dram_dimm_info *dimm,
|
||||
int channel, char dimm_name, u16 val)
|
||||
{
|
||||
if (INTEL_GEN(i915) >= 10) {
|
||||
if (GRAPHICS_VER(i915) >= 10) {
|
||||
dimm->size = cnl_get_dimm_size(val);
|
||||
dimm->width = cnl_get_dimm_width(val);
|
||||
dimm->ranks = cnl_get_dimm_ranks(val);
|
||||
|
@ -422,7 +422,7 @@ static int icl_pcode_read_mem_global_info(struct drm_i915_private *dev_priv)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (IS_GEN(dev_priv, 12)) {
|
||||
if (GRAPHICS_VER(dev_priv) == 12) {
|
||||
switch (val & 0xf) {
|
||||
case 0:
|
||||
dram_info->type = INTEL_DRAM_DDR4;
|
||||
|
@ -501,12 +501,12 @@ void intel_dram_detect(struct drm_i915_private *i915)
|
|||
*/
|
||||
dram_info->wm_lv_0_adjust_needed = !IS_GEN9_LP(i915);
|
||||
|
||||
if (INTEL_GEN(i915) < 9 || !HAS_DISPLAY(i915))
|
||||
if (GRAPHICS_VER(i915) < 9 || !HAS_DISPLAY(i915))
|
||||
return;
|
||||
|
||||
if (INTEL_GEN(i915) >= 12)
|
||||
if (GRAPHICS_VER(i915) >= 12)
|
||||
ret = gen12_get_dram_info(i915);
|
||||
else if (INTEL_GEN(i915) >= 11)
|
||||
else if (GRAPHICS_VER(i915) >= 11)
|
||||
ret = gen11_get_dram_info(i915);
|
||||
else if (IS_GEN9_LP(i915))
|
||||
ret = bxt_get_dram_info(i915);
|
||||
|
@ -535,7 +535,7 @@ void intel_dram_edram_detect(struct drm_i915_private *i915)
|
|||
{
|
||||
u32 edram_cap = 0;
|
||||
|
||||
if (!(IS_HASWELL(i915) || IS_BROADWELL(i915) || INTEL_GEN(i915) >= 9))
|
||||
if (!(IS_HASWELL(i915) || IS_BROADWELL(i915) || GRAPHICS_VER(i915) >= 9))
|
||||
return;
|
||||
|
||||
edram_cap = __raw_uncore_read32(&i915->uncore, HSW_EDRAM_CAP);
|
||||
|
@ -549,7 +549,7 @@ void intel_dram_edram_detect(struct drm_i915_private *i915)
|
|||
* The needed capability bits for size calculation are not there with
|
||||
* pre gen9 so return 128MB always.
|
||||
*/
|
||||
if (INTEL_GEN(i915) < 9)
|
||||
if (GRAPHICS_VER(i915) < 9)
|
||||
i915->edram_size_mb = 128;
|
||||
else
|
||||
i915->edram_size_mb = gen9_edram_size_mb(i915, edram_cap);
|
||||
|
|
|
@ -13,17 +13,17 @@ intel_pch_type(const struct drm_i915_private *dev_priv, unsigned short id)
|
|||
switch (id) {
|
||||
case INTEL_PCH_IBX_DEVICE_ID_TYPE:
|
||||
drm_dbg_kms(&dev_priv->drm, "Found Ibex Peak PCH\n");
|
||||
drm_WARN_ON(&dev_priv->drm, !IS_GEN(dev_priv, 5));
|
||||
drm_WARN_ON(&dev_priv->drm, GRAPHICS_VER(dev_priv) != 5);
|
||||
return PCH_IBX;
|
||||
case INTEL_PCH_CPT_DEVICE_ID_TYPE:
|
||||
drm_dbg_kms(&dev_priv->drm, "Found CougarPoint PCH\n");
|
||||
drm_WARN_ON(&dev_priv->drm,
|
||||
!IS_GEN(dev_priv, 6) && !IS_IVYBRIDGE(dev_priv));
|
||||
GRAPHICS_VER(dev_priv) != 6 && !IS_IVYBRIDGE(dev_priv));
|
||||
return PCH_CPT;
|
||||
case INTEL_PCH_PPT_DEVICE_ID_TYPE:
|
||||
drm_dbg_kms(&dev_priv->drm, "Found PantherPoint PCH\n");
|
||||
drm_WARN_ON(&dev_priv->drm,
|
||||
!IS_GEN(dev_priv, 6) && !IS_IVYBRIDGE(dev_priv));
|
||||
GRAPHICS_VER(dev_priv) != 6 && !IS_IVYBRIDGE(dev_priv));
|
||||
/* PantherPoint is CPT compatible */
|
||||
return PCH_CPT;
|
||||
case INTEL_PCH_LPT_DEVICE_ID_TYPE:
|
||||
|
@ -181,9 +181,9 @@ intel_virt_detect_pch(const struct drm_i915_private *dev_priv,
|
|||
id = INTEL_PCH_LPT_LP_DEVICE_ID_TYPE;
|
||||
else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
|
||||
id = INTEL_PCH_LPT_DEVICE_ID_TYPE;
|
||||
else if (IS_GEN(dev_priv, 6) || IS_IVYBRIDGE(dev_priv))
|
||||
else if (GRAPHICS_VER(dev_priv) == 6 || IS_IVYBRIDGE(dev_priv))
|
||||
id = INTEL_PCH_CPT_DEVICE_ID_TYPE;
|
||||
else if (IS_GEN(dev_priv, 5))
|
||||
else if (GRAPHICS_VER(dev_priv) == 5)
|
||||
id = INTEL_PCH_IBX_DEVICE_ID_TYPE;
|
||||
|
||||
if (id)
|
||||
|
|
|
@ -2983,7 +2983,9 @@ static void intel_fixup_cur_wm_latency(struct drm_i915_private *dev_priv,
|
|||
int ilk_wm_max_level(const struct drm_i915_private *dev_priv)
|
||||
{
|
||||
/* how many WM levels are we expecting */
|
||||
if (DISPLAY_VER(dev_priv) >= 9)
|
||||
if (HAS_HW_SAGV_WM(dev_priv))
|
||||
return 5;
|
||||
else if (DISPLAY_VER(dev_priv) >= 9)
|
||||
return 7;
|
||||
else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
|
||||
return 4;
|
||||
|
@ -4011,8 +4013,9 @@ static int intel_compute_sagv_mask(struct intel_atomic_state *state)
|
|||
* latter from the plane commit hooks (especially in the legacy
|
||||
* cursor case)
|
||||
*/
|
||||
pipe_wm->use_sagv_wm = DISPLAY_VER(dev_priv) >= 12 &&
|
||||
intel_can_enable_sagv(dev_priv, new_bw_state);
|
||||
pipe_wm->use_sagv_wm = !HAS_HW_SAGV_WM(dev_priv) &&
|
||||
DISPLAY_VER(dev_priv) >= 12 &&
|
||||
intel_can_enable_sagv(dev_priv, new_bw_state);
|
||||
}
|
||||
|
||||
if (intel_can_enable_sagv(dev_priv, new_bw_state) !=
|
||||
|
@ -4054,6 +4057,20 @@ skl_ddb_entry_for_slices(struct drm_i915_private *dev_priv, u8 slice_mask,
|
|||
WARN_ON(ddb->end > INTEL_INFO(dev_priv)->dbuf.size);
|
||||
}
|
||||
|
||||
static unsigned int mbus_ddb_offset(struct drm_i915_private *i915, u8 slice_mask)
|
||||
{
|
||||
struct skl_ddb_entry ddb;
|
||||
|
||||
if (slice_mask & (BIT(DBUF_S1) | BIT(DBUF_S2)))
|
||||
slice_mask = BIT(DBUF_S1);
|
||||
else if (slice_mask & (BIT(DBUF_S3) | BIT(DBUF_S4)))
|
||||
slice_mask = BIT(DBUF_S3);
|
||||
|
||||
skl_ddb_entry_for_slices(i915, slice_mask, &ddb);
|
||||
|
||||
return ddb.start;
|
||||
}
|
||||
|
||||
u32 skl_ddb_dbuf_slice_mask(struct drm_i915_private *dev_priv,
|
||||
const struct skl_ddb_entry *entry)
|
||||
{
|
||||
|
@ -4146,6 +4163,7 @@ skl_crtc_allocate_ddb(struct intel_atomic_state *state, struct intel_crtc *crtc)
|
|||
struct intel_crtc_state *crtc_state;
|
||||
struct skl_ddb_entry ddb_slices;
|
||||
enum pipe pipe = crtc->pipe;
|
||||
unsigned int mbus_offset = 0;
|
||||
u32 ddb_range_size;
|
||||
u32 dbuf_slice_mask;
|
||||
u32 start, end;
|
||||
|
@ -4160,6 +4178,7 @@ skl_crtc_allocate_ddb(struct intel_atomic_state *state, struct intel_crtc *crtc)
|
|||
dbuf_slice_mask = new_dbuf_state->slices[pipe];
|
||||
|
||||
skl_ddb_entry_for_slices(dev_priv, dbuf_slice_mask, &ddb_slices);
|
||||
mbus_offset = mbus_ddb_offset(dev_priv, dbuf_slice_mask);
|
||||
ddb_range_size = skl_ddb_entry_size(&ddb_slices);
|
||||
|
||||
intel_crtc_dbuf_weights(new_dbuf_state, pipe,
|
||||
|
@ -4168,11 +4187,11 @@ skl_crtc_allocate_ddb(struct intel_atomic_state *state, struct intel_crtc *crtc)
|
|||
start = ddb_range_size * weight_start / weight_total;
|
||||
end = ddb_range_size * weight_end / weight_total;
|
||||
|
||||
new_dbuf_state->ddb[pipe].start = ddb_slices.start + start;
|
||||
new_dbuf_state->ddb[pipe].end = ddb_slices.start + end;
|
||||
|
||||
new_dbuf_state->ddb[pipe].start = ddb_slices.start - mbus_offset + start;
|
||||
new_dbuf_state->ddb[pipe].end = ddb_slices.start - mbus_offset + end;
|
||||
out:
|
||||
if (skl_ddb_entry_equal(&old_dbuf_state->ddb[pipe],
|
||||
if (old_dbuf_state->slices[pipe] == new_dbuf_state->slices[pipe] &&
|
||||
skl_ddb_entry_equal(&old_dbuf_state->ddb[pipe],
|
||||
&new_dbuf_state->ddb[pipe]))
|
||||
return 0;
|
||||
|
||||
|
@ -4184,7 +4203,12 @@ out:
|
|||
if (IS_ERR(crtc_state))
|
||||
return PTR_ERR(crtc_state);
|
||||
|
||||
crtc_state->wm.skl.ddb = new_dbuf_state->ddb[pipe];
|
||||
/*
|
||||
* Used for checking overlaps, so we need absolute
|
||||
* offsets instead of MBUS relative offsets.
|
||||
*/
|
||||
crtc_state->wm.skl.ddb.start = mbus_offset + new_dbuf_state->ddb[pipe].start;
|
||||
crtc_state->wm.skl.ddb.end = mbus_offset + new_dbuf_state->ddb[pipe].end;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"[CRTC:%d:%s] dbuf slices 0x%x -> 0x%x, ddb (%d - %d) -> (%d - %d), active pipes 0x%x -> 0x%x\n",
|
||||
|
@ -4242,7 +4266,6 @@ skl_cursor_allocation(const struct intel_crtc_state *crtc_state,
|
|||
static void skl_ddb_entry_init_from_hw(struct drm_i915_private *dev_priv,
|
||||
struct skl_ddb_entry *entry, u32 reg)
|
||||
{
|
||||
|
||||
entry->start = reg & DDB_ENTRY_MASK;
|
||||
entry->end = (reg >> DDB_ENTRY_END_SHIFT) & DDB_ENTRY_MASK;
|
||||
|
||||
|
@ -4367,6 +4390,7 @@ skl_plane_downscale_amount(const struct intel_crtc_state *crtc_state,
|
|||
struct dbuf_slice_conf_entry {
|
||||
u8 active_pipes;
|
||||
u8 dbuf_mask[I915_MAX_PIPES];
|
||||
bool join_mbus;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -4555,6 +4579,137 @@ static const struct dbuf_slice_conf_entry tgl_allowed_dbufs[] =
|
|||
{}
|
||||
};
|
||||
|
||||
static const struct dbuf_slice_conf_entry adlp_allowed_dbufs[] = {
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
.join_mbus = true,
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_B),
|
||||
.dbuf_mask = {
|
||||
[PIPE_B] = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
.join_mbus = true,
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_B),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_C),
|
||||
.dbuf_mask = {
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_C),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_B) | BIT(PIPE_C),
|
||||
.dbuf_mask = {
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_B) | BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_C) | BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_C) | BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_C] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
[PIPE_D] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
},
|
||||
{}
|
||||
|
||||
};
|
||||
|
||||
static bool check_mbus_joined(u8 active_pipes,
|
||||
const struct dbuf_slice_conf_entry *dbuf_slices)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < dbuf_slices[i].active_pipes; i++) {
|
||||
if (dbuf_slices[i].active_pipes == active_pipes)
|
||||
return dbuf_slices[i].join_mbus;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool adlp_check_mbus_joined(u8 active_pipes)
|
||||
{
|
||||
return check_mbus_joined(active_pipes, adlp_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u8 compute_dbuf_slices(enum pipe pipe, u8 active_pipes,
|
||||
const struct dbuf_slice_conf_entry *dbuf_slices)
|
||||
{
|
||||
|
@ -4594,12 +4749,19 @@ static u8 tgl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes)
|
|||
return compute_dbuf_slices(pipe, active_pipes, tgl_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u32 adlp_compute_dbuf_slices(enum pipe pipe, u32 active_pipes)
|
||||
{
|
||||
return compute_dbuf_slices(pipe, active_pipes, adlp_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u8 skl_compute_dbuf_slices(struct intel_crtc *crtc, u8 active_pipes)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
enum pipe pipe = crtc->pipe;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) == 12)
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
return adlp_compute_dbuf_slices(pipe, active_pipes);
|
||||
else if (DISPLAY_VER(dev_priv) == 12)
|
||||
return tgl_compute_dbuf_slices(pipe, active_pipes);
|
||||
else if (DISPLAY_VER(dev_priv) == 11)
|
||||
return icl_compute_dbuf_slices(pipe, active_pipes);
|
||||
|
@ -5619,6 +5781,13 @@ void skl_write_plane_wm(struct intel_plane *plane,
|
|||
skl_write_wm_level(dev_priv, PLANE_WM_TRANS(pipe, plane_id),
|
||||
skl_plane_trans_wm(pipe_wm, plane_id));
|
||||
|
||||
if (HAS_HW_SAGV_WM(dev_priv)) {
|
||||
skl_write_wm_level(dev_priv, PLANE_WM_SAGV(pipe, plane_id),
|
||||
&wm->sagv.wm0);
|
||||
skl_write_wm_level(dev_priv, PLANE_WM_SAGV_TRANS(pipe, plane_id),
|
||||
&wm->sagv.trans_wm);
|
||||
}
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 11) {
|
||||
skl_ddb_entry_write(dev_priv,
|
||||
PLANE_BUF_CFG(pipe, plane_id), ddb_y);
|
||||
|
@ -5652,6 +5821,15 @@ void skl_write_cursor_wm(struct intel_plane *plane,
|
|||
skl_write_wm_level(dev_priv, CUR_WM_TRANS(pipe),
|
||||
skl_plane_trans_wm(pipe_wm, plane_id));
|
||||
|
||||
if (HAS_HW_SAGV_WM(dev_priv)) {
|
||||
const struct skl_plane_wm *wm = &pipe_wm->planes[plane_id];
|
||||
|
||||
skl_write_wm_level(dev_priv, CUR_WM_SAGV(pipe),
|
||||
&wm->sagv.wm0);
|
||||
skl_write_wm_level(dev_priv, CUR_WM_SAGV_TRANS(pipe),
|
||||
&wm->sagv.trans_wm);
|
||||
}
|
||||
|
||||
skl_ddb_entry_write(dev_priv, CUR_BUF_CFG(pipe), ddb);
|
||||
}
|
||||
|
||||
|
@ -5813,16 +5991,29 @@ skl_compute_ddb(struct intel_atomic_state *state)
|
|||
|
||||
new_dbuf_state->enabled_slices = intel_dbuf_enabled_slices(new_dbuf_state);
|
||||
|
||||
if (old_dbuf_state->enabled_slices != new_dbuf_state->enabled_slices) {
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
new_dbuf_state->joined_mbus = adlp_check_mbus_joined(new_dbuf_state->active_pipes);
|
||||
|
||||
if (old_dbuf_state->enabled_slices != new_dbuf_state->enabled_slices ||
|
||||
old_dbuf_state->joined_mbus != new_dbuf_state->joined_mbus) {
|
||||
ret = intel_atomic_serialize_global_state(&new_dbuf_state->base);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (old_dbuf_state->joined_mbus != new_dbuf_state->joined_mbus) {
|
||||
/* TODO: Implement vblank synchronized MBUS joining changes */
|
||||
ret = intel_modeset_all_pipes(state);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Enabled dbuf slices 0x%x -> 0x%x (total dbuf slices 0x%x)\n",
|
||||
"Enabled dbuf slices 0x%x -> 0x%x (total dbuf slices 0x%x), mbus joined? %s->%s\n",
|
||||
old_dbuf_state->enabled_slices,
|
||||
new_dbuf_state->enabled_slices,
|
||||
INTEL_INFO(dev_priv)->dbuf.slice_mask);
|
||||
INTEL_INFO(dev_priv)->dbuf.slice_mask,
|
||||
yesno(old_dbuf_state->joined_mbus),
|
||||
yesno(new_dbuf_state->joined_mbus));
|
||||
}
|
||||
|
||||
for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) {
|
||||
|
@ -6016,6 +6207,15 @@ static bool skl_plane_selected_wm_equals(struct intel_plane *plane,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (HAS_HW_SAGV_WM(i915)) {
|
||||
const struct skl_plane_wm *old_wm = &old_pipe_wm->planes[plane->id];
|
||||
const struct skl_plane_wm *new_wm = &new_pipe_wm->planes[plane->id];
|
||||
|
||||
if (!skl_wm_level_equals(&old_wm->sagv.wm0, &new_wm->sagv.wm0) ||
|
||||
!skl_wm_level_equals(&old_wm->sagv.trans_wm, &new_wm->sagv.trans_wm))
|
||||
return false;
|
||||
}
|
||||
|
||||
return skl_wm_level_equals(skl_plane_trans_wm(old_pipe_wm, plane->id),
|
||||
skl_plane_trans_wm(new_pipe_wm, plane->id));
|
||||
}
|
||||
|
@ -6234,7 +6434,25 @@ void skl_pipe_wm_get_hw_state(struct intel_crtc *crtc,
|
|||
|
||||
skl_wm_level_from_reg_val(val, &wm->trans_wm);
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 12) {
|
||||
if (HAS_HW_SAGV_WM(dev_priv)) {
|
||||
if (plane_id != PLANE_CURSOR)
|
||||
val = intel_uncore_read(&dev_priv->uncore,
|
||||
PLANE_WM_SAGV(pipe, plane_id));
|
||||
else
|
||||
val = intel_uncore_read(&dev_priv->uncore,
|
||||
CUR_WM_SAGV(pipe));
|
||||
|
||||
skl_wm_level_from_reg_val(val, &wm->sagv.wm0);
|
||||
|
||||
if (plane_id != PLANE_CURSOR)
|
||||
val = intel_uncore_read(&dev_priv->uncore,
|
||||
PLANE_WM_SAGV_TRANS(pipe, plane_id));
|
||||
else
|
||||
val = intel_uncore_read(&dev_priv->uncore,
|
||||
CUR_WM_SAGV_TRANS(pipe));
|
||||
|
||||
skl_wm_level_from_reg_val(val, &wm->sagv.trans_wm);
|
||||
} else if (DISPLAY_VER(dev_priv) >= 12) {
|
||||
wm->sagv.wm0 = wm->wm[0];
|
||||
wm->sagv.trans_wm = wm->trans_wm;
|
||||
}
|
||||
|
@ -6247,10 +6465,14 @@ void skl_wm_get_hw_state(struct drm_i915_private *dev_priv)
|
|||
to_intel_dbuf_state(dev_priv->dbuf.obj.state);
|
||||
struct intel_crtc *crtc;
|
||||
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
dbuf_state->joined_mbus = intel_de_read(dev_priv, MBUS_CTL) & MBUS_JOIN;
|
||||
|
||||
for_each_intel_crtc(&dev_priv->drm, crtc) {
|
||||
struct intel_crtc_state *crtc_state =
|
||||
to_intel_crtc_state(crtc->base.state);
|
||||
enum pipe pipe = crtc->pipe;
|
||||
unsigned int mbus_offset;
|
||||
enum plane_id plane_id;
|
||||
|
||||
skl_pipe_wm_get_hw_state(crtc, &crtc_state->wm.skl.optimal);
|
||||
|
@ -6276,13 +6498,20 @@ void skl_wm_get_hw_state(struct drm_i915_private *dev_priv)
|
|||
|
||||
dbuf_state->weight[pipe] = intel_crtc_ddb_weight(crtc_state);
|
||||
|
||||
crtc_state->wm.skl.ddb = dbuf_state->ddb[pipe];
|
||||
/*
|
||||
* Used for checking overlaps, so we need absolute
|
||||
* offsets instead of MBUS relative offsets.
|
||||
*/
|
||||
mbus_offset = mbus_ddb_offset(dev_priv, dbuf_state->slices[pipe]);
|
||||
crtc_state->wm.skl.ddb.start = mbus_offset + dbuf_state->ddb[pipe].start;
|
||||
crtc_state->wm.skl.ddb.end = mbus_offset + dbuf_state->ddb[pipe].end;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"[CRTC:%d:%s] dbuf slices 0x%x, ddb (%d - %d), active pipes 0x%x\n",
|
||||
"[CRTC:%d:%s] dbuf slices 0x%x, ddb (%d - %d), active pipes 0x%x, mbus joined: %s\n",
|
||||
crtc->base.base.id, crtc->base.name,
|
||||
dbuf_state->slices[pipe], dbuf_state->ddb[pipe].start,
|
||||
dbuf_state->ddb[pipe].end, dbuf_state->active_pipes);
|
||||
dbuf_state->ddb[pipe].end, dbuf_state->active_pipes,
|
||||
yesno(dbuf_state->joined_mbus));
|
||||
}
|
||||
|
||||
dbuf_state->enabled_slices = dev_priv->dbuf.enabled_slices;
|
||||
|
@ -7630,9 +7859,9 @@ void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv)
|
|||
dev_priv->display.init_clock_gating = adlp_init_clock_gating;
|
||||
else if (IS_DG1(dev_priv))
|
||||
dev_priv->display.init_clock_gating = dg1_init_clock_gating;
|
||||
else if (IS_GEN(dev_priv, 12))
|
||||
else if (GRAPHICS_VER(dev_priv) == 12)
|
||||
dev_priv->display.init_clock_gating = gen12lp_init_clock_gating;
|
||||
else if (IS_GEN(dev_priv, 11))
|
||||
else if (GRAPHICS_VER(dev_priv) == 11)
|
||||
dev_priv->display.init_clock_gating = icl_init_clock_gating;
|
||||
else if (IS_CANNONLAKE(dev_priv))
|
||||
dev_priv->display.init_clock_gating = cnl_init_clock_gating;
|
||||
|
@ -7656,9 +7885,9 @@ void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv)
|
|||
dev_priv->display.init_clock_gating = ivb_init_clock_gating;
|
||||
else if (IS_VALLEYVIEW(dev_priv))
|
||||
dev_priv->display.init_clock_gating = vlv_init_clock_gating;
|
||||
else if (IS_GEN(dev_priv, 6))
|
||||
else if (GRAPHICS_VER(dev_priv) == 6)
|
||||
dev_priv->display.init_clock_gating = gen6_init_clock_gating;
|
||||
else if (IS_GEN(dev_priv, 5))
|
||||
else if (GRAPHICS_VER(dev_priv) == 5)
|
||||
dev_priv->display.init_clock_gating = ilk_init_clock_gating;
|
||||
else if (IS_G4X(dev_priv))
|
||||
dev_priv->display.init_clock_gating = g4x_init_clock_gating;
|
||||
|
@ -7666,11 +7895,11 @@ void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv)
|
|||
dev_priv->display.init_clock_gating = i965gm_init_clock_gating;
|
||||
else if (IS_I965G(dev_priv))
|
||||
dev_priv->display.init_clock_gating = i965g_init_clock_gating;
|
||||
else if (IS_GEN(dev_priv, 3))
|
||||
else if (GRAPHICS_VER(dev_priv) == 3)
|
||||
dev_priv->display.init_clock_gating = gen3_init_clock_gating;
|
||||
else if (IS_I85X(dev_priv) || IS_I865G(dev_priv))
|
||||
dev_priv->display.init_clock_gating = i85x_init_clock_gating;
|
||||
else if (IS_GEN(dev_priv, 2))
|
||||
else if (GRAPHICS_VER(dev_priv) == 2)
|
||||
dev_priv->display.init_clock_gating = i830_init_clock_gating;
|
||||
else {
|
||||
MISSING_CASE(INTEL_DEVID(dev_priv));
|
||||
|
@ -7684,7 +7913,7 @@ void intel_init_pm(struct drm_i915_private *dev_priv)
|
|||
/* For cxsr */
|
||||
if (IS_PINEVIEW(dev_priv))
|
||||
pnv_get_mem_freq(dev_priv);
|
||||
else if (IS_GEN(dev_priv, 5))
|
||||
else if (GRAPHICS_VER(dev_priv) == 5)
|
||||
ilk_get_mem_freq(dev_priv);
|
||||
|
||||
if (intel_has_sagv(dev_priv))
|
||||
|
@ -7816,6 +8045,45 @@ int intel_dbuf_init(struct drm_i915_private *dev_priv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure MBUS_CTL and all DBUF_CTL_S of each slice to join_mbus state before
|
||||
* update the request state of all DBUS slices.
|
||||
*/
|
||||
static void update_mbus_pre_enable(struct intel_atomic_state *state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(state->base.dev);
|
||||
u32 mbus_ctl, dbuf_min_tracker_val;
|
||||
enum dbuf_slice slice;
|
||||
const struct intel_dbuf_state *dbuf_state =
|
||||
intel_atomic_get_new_dbuf_state(state);
|
||||
|
||||
if (!IS_ALDERLAKE_P(dev_priv))
|
||||
return;
|
||||
|
||||
/*
|
||||
* TODO: Implement vblank synchronized MBUS joining changes.
|
||||
* Must be properly coordinated with dbuf reprogramming.
|
||||
*/
|
||||
if (dbuf_state->joined_mbus) {
|
||||
mbus_ctl = MBUS_HASHING_MODE_1x4 | MBUS_JOIN |
|
||||
MBUS_JOIN_PIPE_SELECT_NONE;
|
||||
dbuf_min_tracker_val = DBUF_MIN_TRACKER_STATE_SERVICE(3);
|
||||
} else {
|
||||
mbus_ctl = MBUS_HASHING_MODE_2x2 |
|
||||
MBUS_JOIN_PIPE_SELECT_NONE;
|
||||
dbuf_min_tracker_val = DBUF_MIN_TRACKER_STATE_SERVICE(1);
|
||||
}
|
||||
|
||||
intel_de_rmw(dev_priv, MBUS_CTL,
|
||||
MBUS_HASHING_MODE_MASK | MBUS_JOIN |
|
||||
MBUS_JOIN_PIPE_SELECT_MASK, mbus_ctl);
|
||||
|
||||
for_each_dbuf_slice(dev_priv, slice)
|
||||
intel_de_rmw(dev_priv, DBUF_CTL_S(slice),
|
||||
DBUF_MIN_TRACKER_STATE_SERVICE_MASK,
|
||||
dbuf_min_tracker_val);
|
||||
}
|
||||
|
||||
void intel_dbuf_pre_plane_update(struct intel_atomic_state *state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(state->base.dev);
|
||||
|
@ -7825,11 +8093,13 @@ void intel_dbuf_pre_plane_update(struct intel_atomic_state *state)
|
|||
intel_atomic_get_old_dbuf_state(state);
|
||||
|
||||
if (!new_dbuf_state ||
|
||||
new_dbuf_state->enabled_slices == old_dbuf_state->enabled_slices)
|
||||
((new_dbuf_state->enabled_slices == old_dbuf_state->enabled_slices)
|
||||
&& (new_dbuf_state->joined_mbus == old_dbuf_state->joined_mbus)))
|
||||
return;
|
||||
|
||||
WARN_ON(!new_dbuf_state->base.changed);
|
||||
|
||||
update_mbus_pre_enable(state);
|
||||
gen9_dbuf_slices_update(dev_priv,
|
||||
old_dbuf_state->enabled_slices |
|
||||
new_dbuf_state->enabled_slices);
|
||||
|
@ -7844,7 +8114,8 @@ void intel_dbuf_post_plane_update(struct intel_atomic_state *state)
|
|||
intel_atomic_get_old_dbuf_state(state);
|
||||
|
||||
if (!new_dbuf_state ||
|
||||
new_dbuf_state->enabled_slices == old_dbuf_state->enabled_slices)
|
||||
((new_dbuf_state->enabled_slices == old_dbuf_state->enabled_slices)
|
||||
&& (new_dbuf_state->joined_mbus == old_dbuf_state->joined_mbus)))
|
||||
return;
|
||||
|
||||
WARN_ON(!new_dbuf_state->base.changed);
|
||||
|
|
|
@ -78,13 +78,11 @@ struct intel_dbuf_state {
|
|||
struct skl_ddb_entry ddb[I915_MAX_PIPES];
|
||||
unsigned int weight[I915_MAX_PIPES];
|
||||
u8 slices[I915_MAX_PIPES];
|
||||
|
||||
u8 enabled_slices;
|
||||
u8 active_pipes;
|
||||
bool joined_mbus;
|
||||
};
|
||||
|
||||
int intel_dbuf_init(struct drm_i915_private *dev_priv);
|
||||
|
||||
struct intel_dbuf_state *
|
||||
intel_atomic_get_dbuf_state(struct intel_atomic_state *state);
|
||||
|
||||
|
|
|
@ -430,7 +430,7 @@ static int __sandybridge_pcode_rw(struct drm_i915_private *i915,
|
|||
if (is_read && val1)
|
||||
*val1 = intel_uncore_read_fw(uncore, GEN6_PCODE_DATA1);
|
||||
|
||||
if (INTEL_GEN(i915) > 6)
|
||||
if (GRAPHICS_VER(i915) > 6)
|
||||
return gen7_check_mailbox_status(mbox);
|
||||
else
|
||||
return gen6_check_mailbox_status(mbox);
|
||||
|
|
|
@ -1635,7 +1635,7 @@ static int intel_uncore_fw_domains_init(struct intel_uncore *uncore)
|
|||
#define fw_domain_init(uncore__, id__, set__, ack__) \
|
||||
(ret ?: (ret = __fw_domain_init((uncore__), (id__), (set__), (ack__))))
|
||||
|
||||
if (INTEL_GEN(i915) >= 11) {
|
||||
if (GRAPHICS_VER(i915) >= 11) {
|
||||
/* we'll prune the domains of missing engines later */
|
||||
intel_engine_mask_t emask = INTEL_INFO(i915)->platform_engine_mask;
|
||||
int i;
|
||||
|
@ -1665,7 +1665,7 @@ static int intel_uncore_fw_domains_init(struct intel_uncore *uncore)
|
|||
FORCEWAKE_MEDIA_VEBOX_GEN11(i),
|
||||
FORCEWAKE_ACK_MEDIA_VEBOX_GEN11(i));
|
||||
}
|
||||
} else if (IS_GEN_RANGE(i915, 9, 10)) {
|
||||
} else if (IS_GRAPHICS_VER(i915, 9, 10)) {
|
||||
uncore->funcs.force_wake_get = fw_domains_get_with_fallback;
|
||||
uncore->funcs.force_wake_put = fw_domains_put;
|
||||
fw_domain_init(uncore, FW_DOMAIN_ID_RENDER,
|
||||
|
@ -1733,7 +1733,7 @@ static int intel_uncore_fw_domains_init(struct intel_uncore *uncore)
|
|||
fw_domain_init(uncore, FW_DOMAIN_ID_RENDER,
|
||||
FORCEWAKE, FORCEWAKE_ACK);
|
||||
}
|
||||
} else if (IS_GEN(i915, 6)) {
|
||||
} else if (GRAPHICS_VER(i915) == 6) {
|
||||
uncore->funcs.force_wake_get =
|
||||
fw_domains_get_with_thread_status;
|
||||
uncore->funcs.force_wake_put = fw_domains_put;
|
||||
|
@ -1800,7 +1800,7 @@ static int uncore_mmio_setup(struct intel_uncore *uncore)
|
|||
int mmio_bar;
|
||||
int mmio_size;
|
||||
|
||||
mmio_bar = IS_GEN(i915, 2) ? 1 : 0;
|
||||
mmio_bar = GRAPHICS_VER(i915) == 2 ? 1 : 0;
|
||||
/*
|
||||
* Before gen4, the registers and the GTT are behind different BARs.
|
||||
* However, from gen4 onwards, the registers and the GTT are shared
|
||||
|
@ -1810,7 +1810,7 @@ static int uncore_mmio_setup(struct intel_uncore *uncore)
|
|||
* generations up to Ironlake.
|
||||
* For dgfx chips register range is expanded to 4MB.
|
||||
*/
|
||||
if (INTEL_GEN(i915) < 5)
|
||||
if (GRAPHICS_VER(i915) < 5)
|
||||
mmio_size = 512 * 1024;
|
||||
else if (IS_DGFX(i915))
|
||||
mmio_size = 4 * 1024 * 1024;
|
||||
|
@ -1849,7 +1849,7 @@ static void uncore_raw_init(struct intel_uncore *uncore)
|
|||
if (intel_vgpu_active(uncore->i915)) {
|
||||
ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, vgpu);
|
||||
ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, vgpu);
|
||||
} else if (IS_GEN(uncore->i915, 5)) {
|
||||
} else if (GRAPHICS_VER(uncore->i915) == 5) {
|
||||
ASSIGN_RAW_WRITE_MMIO_VFUNCS(uncore, gen5);
|
||||
ASSIGN_RAW_READ_MMIO_VFUNCS(uncore, gen5);
|
||||
} else {
|
||||
|
@ -1870,7 +1870,7 @@ static int uncore_forcewake_init(struct intel_uncore *uncore)
|
|||
return ret;
|
||||
forcewake_early_sanitize(uncore, 0);
|
||||
|
||||
if (IS_GEN_RANGE(i915, 6, 7)) {
|
||||
if (IS_GRAPHICS_VER(i915, 6, 7)) {
|
||||
ASSIGN_WRITE_MMIO_VFUNCS(uncore, gen6);
|
||||
|
||||
if (IS_VALLEYVIEW(i915)) {
|
||||
|
@ -1879,7 +1879,7 @@ static int uncore_forcewake_init(struct intel_uncore *uncore)
|
|||
} else {
|
||||
ASSIGN_READ_MMIO_VFUNCS(uncore, gen6);
|
||||
}
|
||||
} else if (IS_GEN(i915, 8)) {
|
||||
} else if (GRAPHICS_VER(i915) == 8) {
|
||||
if (IS_CHERRYVIEW(i915)) {
|
||||
ASSIGN_FW_DOMAINS_TABLE(uncore, __chv_fw_ranges);
|
||||
ASSIGN_WRITE_MMIO_VFUNCS(uncore, fwtable);
|
||||
|
@ -1888,11 +1888,11 @@ static int uncore_forcewake_init(struct intel_uncore *uncore)
|
|||
ASSIGN_WRITE_MMIO_VFUNCS(uncore, gen8);
|
||||
ASSIGN_READ_MMIO_VFUNCS(uncore, gen6);
|
||||
}
|
||||
} else if (IS_GEN_RANGE(i915, 9, 10)) {
|
||||
} else if (IS_GRAPHICS_VER(i915, 9, 10)) {
|
||||
ASSIGN_FW_DOMAINS_TABLE(uncore, __gen9_fw_ranges);
|
||||
ASSIGN_WRITE_MMIO_VFUNCS(uncore, fwtable);
|
||||
ASSIGN_READ_MMIO_VFUNCS(uncore, fwtable);
|
||||
} else if (IS_GEN(i915, 11)) {
|
||||
} else if (GRAPHICS_VER(i915) == 11) {
|
||||
ASSIGN_FW_DOMAINS_TABLE(uncore, __gen11_fw_ranges);
|
||||
ASSIGN_WRITE_MMIO_VFUNCS(uncore, gen11_fwtable);
|
||||
ASSIGN_READ_MMIO_VFUNCS(uncore, gen11_fwtable);
|
||||
|
@ -1952,7 +1952,7 @@ int intel_uncore_init_mmio(struct intel_uncore *uncore)
|
|||
if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
|
||||
uncore->flags |= UNCORE_HAS_DBG_UNCLAIMED;
|
||||
|
||||
if (IS_GEN_RANGE(i915, 6, 7))
|
||||
if (IS_GRAPHICS_VER(i915, 6, 7))
|
||||
uncore->flags |= UNCORE_HAS_FIFO;
|
||||
|
||||
/* clear out unclaimed reg detection bit */
|
||||
|
@ -1979,7 +1979,7 @@ void intel_uncore_prune_engine_fw_domains(struct intel_uncore *uncore,
|
|||
enum forcewake_domain_id domain_id;
|
||||
int i;
|
||||
|
||||
if (!intel_uncore_has_forcewake(uncore) || INTEL_GEN(uncore->i915) < 11)
|
||||
if (!intel_uncore_has_forcewake(uncore) || GRAPHICS_VER(uncore->i915) < 11)
|
||||
return;
|
||||
|
||||
for (i = 0; i < I915_MAX_VCS; i++) {
|
||||
|
|
|
@ -81,7 +81,7 @@ void intel_wopcm_init_early(struct intel_wopcm *wopcm)
|
|||
if (!HAS_GT_UC(i915))
|
||||
return;
|
||||
|
||||
if (INTEL_GEN(i915) >= 11)
|
||||
if (GRAPHICS_VER(i915) >= 11)
|
||||
wopcm->size = GEN11_WOPCM_SIZE;
|
||||
else
|
||||
wopcm->size = GEN9_WOPCM_SIZE;
|
||||
|
@ -93,7 +93,7 @@ static u32 context_reserved_size(struct drm_i915_private *i915)
|
|||
{
|
||||
if (IS_GEN9_LP(i915))
|
||||
return BXT_WOPCM_RC6_CTX_RESERVED;
|
||||
else if (INTEL_GEN(i915) >= 10)
|
||||
else if (GRAPHICS_VER(i915) >= 10)
|
||||
return CNL_WOPCM_HW_CTX_RESERVED;
|
||||
else
|
||||
return 0;
|
||||
|
@ -145,11 +145,11 @@ static bool check_hw_restrictions(struct drm_i915_private *i915,
|
|||
u32 guc_wopcm_base, u32 guc_wopcm_size,
|
||||
u32 huc_fw_size)
|
||||
{
|
||||
if (IS_GEN(i915, 9) && !gen9_check_dword_gap(i915, guc_wopcm_base,
|
||||
guc_wopcm_size))
|
||||
if (GRAPHICS_VER(i915) == 9 && !gen9_check_dword_gap(i915, guc_wopcm_base,
|
||||
guc_wopcm_size))
|
||||
return false;
|
||||
|
||||
if (IS_GEN(i915, 9) &&
|
||||
if (GRAPHICS_VER(i915) == 9 &&
|
||||
!gen9_check_huc_fw_fits(i915, guc_wopcm_size, huc_fw_size))
|
||||
return false;
|
||||
|
||||
|
|
|
@ -1884,9 +1884,9 @@ static int igt_cs_tlb(void *arg)
|
|||
u32 *cs = batch + i * 64 / sizeof(*cs);
|
||||
u64 addr = (vm->total - PAGE_SIZE) + i * sizeof(u32);
|
||||
|
||||
GEM_BUG_ON(INTEL_GEN(i915) < 6);
|
||||
GEM_BUG_ON(GRAPHICS_VER(i915) < 6);
|
||||
cs[0] = MI_STORE_DWORD_IMM_GEN4;
|
||||
if (INTEL_GEN(i915) >= 8) {
|
||||
if (GRAPHICS_VER(i915) >= 8) {
|
||||
cs[1] = lower_32_bits(addr);
|
||||
cs[2] = upper_32_bits(addr);
|
||||
cs[3] = i;
|
||||
|
|
|
@ -98,7 +98,7 @@ test_stream(struct i915_perf *perf)
|
|||
I915_ENGINE_CLASS_RENDER,
|
||||
0),
|
||||
.sample_flags = SAMPLE_OA_REPORT,
|
||||
.oa_format = IS_GEN(perf->i915, 12) ?
|
||||
.oa_format = GRAPHICS_VER(perf->i915) == 12 ?
|
||||
I915_OA_FORMAT_A32u40_A4u32_B8_C8 : I915_OA_FORMAT_C4_B8,
|
||||
};
|
||||
struct i915_perf_stream *stream;
|
||||
|
@ -162,7 +162,7 @@ static int write_timestamp(struct i915_request *rq, int slot)
|
|||
return PTR_ERR(cs);
|
||||
|
||||
len = 5;
|
||||
if (INTEL_GEN(rq->engine->i915) >= 8)
|
||||
if (GRAPHICS_VER(rq->engine->i915) >= 8)
|
||||
len++;
|
||||
|
||||
*cs++ = GFX_OP_PIPE_CONTROL(len);
|
||||
|
@ -363,7 +363,7 @@ static int live_noa_gpr(void *arg)
|
|||
}
|
||||
|
||||
cmd = MI_STORE_REGISTER_MEM;
|
||||
if (INTEL_GEN(i915) >= 8)
|
||||
if (GRAPHICS_VER(i915) >= 8)
|
||||
cmd++;
|
||||
cmd |= MI_USE_GGTT;
|
||||
|
||||
|
|
|
@ -963,7 +963,7 @@ out_batch:
|
|||
static struct i915_vma *recursive_batch(struct drm_i915_private *i915)
|
||||
{
|
||||
struct drm_i915_gem_object *obj;
|
||||
const int gen = INTEL_GEN(i915);
|
||||
const int ver = GRAPHICS_VER(i915);
|
||||
struct i915_vma *vma;
|
||||
u32 *cmd;
|
||||
int err;
|
||||
|
@ -988,11 +988,11 @@ static struct i915_vma *recursive_batch(struct drm_i915_private *i915)
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (gen >= 8) {
|
||||
if (ver >= 8) {
|
||||
*cmd++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
|
||||
*cmd++ = lower_32_bits(vma->node.start);
|
||||
*cmd++ = upper_32_bits(vma->node.start);
|
||||
} else if (gen >= 6) {
|
||||
} else if (ver >= 6) {
|
||||
*cmd++ = MI_BATCH_BUFFER_START | 1 << 8;
|
||||
*cmd++ = lower_32_bits(vma->node.start);
|
||||
} else {
|
||||
|
@ -2482,7 +2482,7 @@ static int perf_request_latency(void *arg)
|
|||
struct pm_qos_request qos;
|
||||
int err = 0;
|
||||
|
||||
if (INTEL_GEN(i915) < 8) /* per-engine CS timestamp, semaphores */
|
||||
if (GRAPHICS_VER(i915) < 8) /* per-engine CS timestamp, semaphores */
|
||||
return 0;
|
||||
|
||||
cpu_latency_qos_add_request(&qos, 0); /* disable cstates */
|
||||
|
|
|
@ -174,15 +174,15 @@ igt_spinner_create_request(struct igt_spinner *spin,
|
|||
|
||||
batch = spin->batch;
|
||||
|
||||
if (INTEL_GEN(rq->engine->i915) >= 8) {
|
||||
if (GRAPHICS_VER(rq->engine->i915) >= 8) {
|
||||
*batch++ = MI_STORE_DWORD_IMM_GEN4;
|
||||
*batch++ = lower_32_bits(hws_address(hws, rq));
|
||||
*batch++ = upper_32_bits(hws_address(hws, rq));
|
||||
} else if (INTEL_GEN(rq->engine->i915) >= 6) {
|
||||
} else if (GRAPHICS_VER(rq->engine->i915) >= 6) {
|
||||
*batch++ = MI_STORE_DWORD_IMM_GEN4;
|
||||
*batch++ = 0;
|
||||
*batch++ = hws_address(hws, rq);
|
||||
} else if (INTEL_GEN(rq->engine->i915) >= 4) {
|
||||
} else if (GRAPHICS_VER(rq->engine->i915) >= 4) {
|
||||
*batch++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
|
||||
*batch++ = 0;
|
||||
*batch++ = hws_address(hws, rq);
|
||||
|
@ -194,11 +194,11 @@ igt_spinner_create_request(struct igt_spinner *spin,
|
|||
|
||||
*batch++ = arbitration_command;
|
||||
|
||||
if (INTEL_GEN(rq->engine->i915) >= 8)
|
||||
if (GRAPHICS_VER(rq->engine->i915) >= 8)
|
||||
*batch++ = MI_BATCH_BUFFER_START | BIT(8) | 1;
|
||||
else if (IS_HASWELL(rq->engine->i915))
|
||||
*batch++ = MI_BATCH_BUFFER_START | MI_BATCH_PPGTT_HSW;
|
||||
else if (INTEL_GEN(rq->engine->i915) >= 6)
|
||||
else if (GRAPHICS_VER(rq->engine->i915) >= 6)
|
||||
*batch++ = MI_BATCH_BUFFER_START;
|
||||
else
|
||||
*batch++ = MI_BATCH_BUFFER_START | MI_BATCH_GTT;
|
||||
|
@ -216,7 +216,7 @@ igt_spinner_create_request(struct igt_spinner *spin,
|
|||
}
|
||||
|
||||
flags = 0;
|
||||
if (INTEL_GEN(rq->engine->i915) <= 5)
|
||||
if (GRAPHICS_VER(rq->engine->i915) <= 5)
|
||||
flags |= I915_DISPATCH_SECURE;
|
||||
err = engine->emit_bb_start(rq, vma->node.start, PAGE_SIZE, flags);
|
||||
|
||||
|
|
|
@ -321,7 +321,7 @@ static int live_fw_table(void *arg)
|
|||
/* Confirm the table we load is still valid */
|
||||
return intel_fw_table_check(gt->uncore->fw_domains_table,
|
||||
gt->uncore->fw_domains_table_entries,
|
||||
INTEL_GEN(gt->i915) >= 9);
|
||||
GRAPHICS_VER(gt->i915) >= 9);
|
||||
}
|
||||
|
||||
int intel_uncore_live_selftests(struct drm_i915_private *i915)
|
||||
|
|
Loading…
Reference in New Issue