Merge tag 'drm-intel-next-2023-12-07' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
- Improve display debug msgs and other general clean-ups (Ville, Rahuul) - PSR fixes and improvements around selective fetch (Jouni, Ville) - Remove FBC restrictions for Xe2LPD displays (Vinod) - Skip some timing checks on BXT/GLK DSI transcoders (Ville) - DP MST Fixes (Ville) - Correct the input parameter on _intel_dsb_commit (heminhong) - Fix IP version of the display WAs (Bala) - DGFX uses direct VBT pin mapping (Clint) - Proper handling of bool on PIPE_CONF_CHECK macros (Jani) - Skip state verification with TBT-ALT mod (Mika Kahona) - General organization of display code for reusage with Xe (Jouni, Luca, Jani, Maarten) - Squelch a sparse warning (Jani) - Don't use "proxy" headers (Andy Shevchenko) - Use devm_gpiod_get() for all GPIOs (Hans) - Fix ADL+ tiled plane stride (Ville) - Use octal permissions in display debugfs (Jani) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/ZXIWG6bRYaUw0w6-@intel.com
This commit is contained in:
@@ -280,6 +280,7 @@ i915-y += \
|
||||
display/intel_dsb.o \
|
||||
display/intel_dsb_buffer.o \
|
||||
display/intel_fb.o \
|
||||
display/intel_fb_bo.o \
|
||||
display/intel_fb_pin.o \
|
||||
display/intel_fbc.o \
|
||||
display/intel_fdi.o \
|
||||
@@ -318,7 +319,8 @@ i915-$(CONFIG_ACPI) += \
|
||||
display/intel_acpi.o \
|
||||
display/intel_opregion.o
|
||||
i915-$(CONFIG_DRM_FBDEV_EMULATION) += \
|
||||
display/intel_fbdev.o
|
||||
display/intel_fbdev.o \
|
||||
display/intel_fbdev_fb.o
|
||||
i915-$(CONFIG_DEBUG_FS) += \
|
||||
display/intel_display_debugfs.o \
|
||||
display/intel_display_debugfs_params.o \
|
||||
|
||||
@@ -2477,7 +2477,7 @@ static unsigned int ilk_plane_wm_max(const struct drm_i915_private *dev_priv,
|
||||
* FIFO size is only half of the self
|
||||
* refresh FIFO size on ILK/SNB.
|
||||
*/
|
||||
if (DISPLAY_VER(dev_priv) <= 6)
|
||||
if (DISPLAY_VER(dev_priv) < 7)
|
||||
fifo_size /= 2;
|
||||
}
|
||||
|
||||
@@ -2818,7 +2818,7 @@ static int ilk_compute_pipe_wm(struct intel_atomic_state *state,
|
||||
usable_level = dev_priv->display.wm.num_levels - 1;
|
||||
|
||||
/* ILK/SNB: LP2+ watermarks only w/o sprites */
|
||||
if (DISPLAY_VER(dev_priv) <= 6 && pipe_wm->sprites_enabled)
|
||||
if (DISPLAY_VER(dev_priv) < 7 && pipe_wm->sprites_enabled)
|
||||
usable_level = 1;
|
||||
|
||||
/* ILK/SNB/IVB: LP1+ watermarks only w/o scaling */
|
||||
@@ -2961,7 +2961,7 @@ static void ilk_wm_merge(struct drm_i915_private *dev_priv,
|
||||
int last_enabled_level = num_levels - 1;
|
||||
|
||||
/* ILK/SNB/IVB: LP1+ watermarks only w/ single pipe */
|
||||
if ((DISPLAY_VER(dev_priv) <= 6 || IS_IVYBRIDGE(dev_priv)) &&
|
||||
if ((DISPLAY_VER(dev_priv) < 7 || IS_IVYBRIDGE(dev_priv)) &&
|
||||
config->num_pipes_active > 1)
|
||||
last_enabled_level = 0;
|
||||
|
||||
@@ -3060,7 +3060,7 @@ static void ilk_compute_wm_results(struct drm_i915_private *dev_priv,
|
||||
* Always set WM_LP_SPRITE_EN when spr_val != 0, even if the
|
||||
* level is disabled. Doing otherwise could cause underruns.
|
||||
*/
|
||||
if (DISPLAY_VER(dev_priv) <= 6 && r->spr_val) {
|
||||
if (DISPLAY_VER(dev_priv) < 7 && r->spr_val) {
|
||||
drm_WARN_ON(&dev_priv->drm, wm_lp != 1);
|
||||
results->wm_lp_spr[wm_lp - 1] |= WM_LP_SPRITE_ENABLE;
|
||||
}
|
||||
|
||||
@@ -1440,6 +1440,13 @@ static void gen11_dsi_post_disable(struct intel_atomic_state *state,
|
||||
static enum drm_mode_status gen11_dsi_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->dev);
|
||||
enum drm_mode_status status;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(i915, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
/* FIXME: DSC? */
|
||||
return intel_dsi_mode_valid(connector, mode);
|
||||
}
|
||||
|
||||
@@ -2201,6 +2201,9 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
|
||||
const u8 *ddc_pin_map;
|
||||
int i, n_entries;
|
||||
|
||||
if (IS_DGFX(i915))
|
||||
return vbt_pin;
|
||||
|
||||
if (INTEL_PCH_TYPE(i915) >= PCH_LNL || HAS_PCH_MTP(i915) ||
|
||||
IS_ALDERLAKE_P(i915)) {
|
||||
ddc_pin_map = adlp_ddc_pin_map;
|
||||
@@ -2208,8 +2211,6 @@ static u8 map_ddc_pin(struct drm_i915_private *i915, u8 vbt_pin)
|
||||
} else if (IS_ALDERLAKE_S(i915)) {
|
||||
ddc_pin_map = adls_ddc_pin_map;
|
||||
n_entries = ARRAY_SIZE(adls_ddc_pin_map);
|
||||
} else if (INTEL_PCH_TYPE(i915) >= PCH_DG1) {
|
||||
return vbt_pin;
|
||||
} else if (IS_ROCKETLAKE(i915) && INTEL_PCH_TYPE(i915) == PCH_TGP) {
|
||||
ddc_pin_map = rkl_pch_tgp_ddc_pin_map;
|
||||
n_entries = ARRAY_SIZE(rkl_pch_tgp_ddc_pin_map);
|
||||
|
||||
@@ -87,7 +87,8 @@ static int icl_pcode_read_qgv_point_info(struct drm_i915_private *dev_priv,
|
||||
return ret;
|
||||
|
||||
dclk = val & 0xffff;
|
||||
sp->dclk = DIV_ROUND_UP((16667 * dclk) + (DISPLAY_VER(dev_priv) > 11 ? 500 : 0), 1000);
|
||||
sp->dclk = DIV_ROUND_UP((16667 * dclk) + (DISPLAY_VER(dev_priv) >= 12 ? 500 : 0),
|
||||
1000);
|
||||
sp->t_rp = (val & 0xff0000) >> 16;
|
||||
sp->t_rcd = (val & 0xff000000) >> 24;
|
||||
|
||||
@@ -480,7 +481,7 @@ static int tgl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
|
||||
if (num_channels < qi.max_numchannels && DISPLAY_VER(dev_priv) >= 12)
|
||||
qi.deinterleave = max(DIV_ROUND_UP(qi.deinterleave, 2), 1);
|
||||
|
||||
if (DISPLAY_VER(dev_priv) > 11 && num_channels > qi.max_numchannels)
|
||||
if (DISPLAY_VER(dev_priv) >= 12 && num_channels > qi.max_numchannels)
|
||||
drm_warn(&dev_priv->drm, "Number of channels exceeds max number of channels.");
|
||||
if (qi.max_numchannels != 0)
|
||||
num_channels = min_t(u8, num_channels, qi.max_numchannels);
|
||||
@@ -897,7 +898,7 @@ static int icl_find_qgv_points(struct drm_i915_private *i915,
|
||||
unsigned int idx;
|
||||
unsigned int max_data_rate;
|
||||
|
||||
if (DISPLAY_VER(i915) > 11)
|
||||
if (DISPLAY_VER(i915) >= 12)
|
||||
idx = tgl_max_bw_index(i915, num_active_planes, i);
|
||||
else
|
||||
idx = icl_max_bw_index(i915, num_active_planes, i);
|
||||
|
||||
@@ -2597,7 +2597,7 @@ static int intel_vdsc_min_cdclk(const struct intel_crtc_state *crtc_state)
|
||||
* Since PPC = 2 with bigjoiner
|
||||
* => CDCLK >= compressed_bpp * Pixel clock / 2 * Bigjoiner Interface bits
|
||||
*/
|
||||
int bigjoiner_interface_bits = DISPLAY_VER(i915) > 13 ? 36 : 24;
|
||||
int bigjoiner_interface_bits = DISPLAY_VER(i915) >= 14 ? 36 : 24;
|
||||
int min_cdclk_bj =
|
||||
(to_bpp_int_roundup(crtc_state->dsc.compressed_bpp_x16) *
|
||||
pixel_clock) / (2 * bigjoiner_interface_bits);
|
||||
|
||||
@@ -348,8 +348,13 @@ intel_crt_mode_valid(struct drm_connector *connector,
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
int max_dotclk = dev_priv->max_dotclk_freq;
|
||||
enum drm_mode_status status;
|
||||
int max_clock;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(dev_priv, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
return MODE_NO_DBLESCAN;
|
||||
|
||||
|
||||
@@ -262,6 +262,15 @@ void intel_crtc_state_dump(const struct intel_crtc_state *pipe_config,
|
||||
drm_dbg_kms(&i915->drm, "fec: %s, enhanced framing: %s\n",
|
||||
str_enabled_disabled(pipe_config->fec_enable),
|
||||
str_enabled_disabled(pipe_config->enhanced_framing));
|
||||
|
||||
drm_dbg_kms(&i915->drm, "sdp split: %s\n",
|
||||
str_enabled_disabled(pipe_config->sdp_split_enable));
|
||||
|
||||
drm_dbg_kms(&i915->drm, "psr: %s, psr2: %s, panel replay: %s, selective fetch: %s\n",
|
||||
str_enabled_disabled(pipe_config->has_psr),
|
||||
str_enabled_disabled(pipe_config->has_psr2),
|
||||
str_enabled_disabled(pipe_config->has_panel_replay),
|
||||
str_enabled_disabled(pipe_config->enable_psr2_sel_fetch));
|
||||
}
|
||||
|
||||
drm_dbg_kms(&i915->drm, "framestart delay: %d, MSA timing delay: %d\n",
|
||||
|
||||
@@ -21,8 +21,11 @@
|
||||
#include "intel_fb_pin.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
#include "intel_psr.h"
|
||||
#include "intel_psr_regs.h"
|
||||
#include "skl_watermark.h"
|
||||
|
||||
#include "gem/i915_gem_object.h"
|
||||
|
||||
/* Cursor formats */
|
||||
static const u32 intel_cursor_formats[] = {
|
||||
DRM_FORMAT_ARGB8888,
|
||||
@@ -33,11 +36,11 @@ static u32 intel_cursor_base(const struct intel_plane_state *plane_state)
|
||||
struct drm_i915_private *dev_priv =
|
||||
to_i915(plane_state->uapi.plane->dev);
|
||||
const struct drm_framebuffer *fb = plane_state->hw.fb;
|
||||
const struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
||||
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
||||
u32 base;
|
||||
|
||||
if (DISPLAY_INFO(dev_priv)->cursor_needs_physical)
|
||||
base = sg_dma_address(obj->mm.pages->sgl);
|
||||
base = i915_gem_object_get_dma_address(obj, 0);
|
||||
else
|
||||
base = intel_plane_ggtt_offset(plane_state);
|
||||
|
||||
@@ -484,6 +487,35 @@ static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void i9xx_cursor_disable_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_CTL(pipe, plane->id), 0);
|
||||
}
|
||||
|
||||
static void i9xx_cursor_update_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
if (drm_rect_height(&plane_state->psr2_sel_fetch_area) > 0)
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane->id),
|
||||
plane_state->ctl);
|
||||
else
|
||||
i9xx_cursor_disable_sel_fetch_arm(plane, crtc_state);
|
||||
}
|
||||
|
||||
/* TODO: split into noarm+arm pair */
|
||||
static void i9xx_cursor_update_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
@@ -531,10 +563,10 @@ static void i9xx_cursor_update_arm(struct intel_plane *plane,
|
||||
skl_write_cursor_wm(plane, crtc_state);
|
||||
|
||||
if (plane_state)
|
||||
intel_psr2_program_plane_sel_fetch_arm(plane, crtc_state,
|
||||
plane_state);
|
||||
i9xx_cursor_update_sel_fetch_arm(plane, crtc_state,
|
||||
plane_state);
|
||||
else
|
||||
intel_psr2_disable_plane_sel_fetch_arm(plane, crtc_state);
|
||||
i9xx_cursor_disable_sel_fetch_arm(plane, crtc_state);
|
||||
|
||||
if (plane->cursor.base != base ||
|
||||
plane->cursor.size != fbc_ctl ||
|
||||
|
||||
@@ -415,9 +415,15 @@ void intel_cx0_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
const struct intel_ddi_buf_trans *trans;
|
||||
enum phy phy = intel_port_to_phy(i915, encoder->port);
|
||||
u8 owned_lane_mask = intel_cx0_get_owned_lane_mask(i915, encoder);
|
||||
u8 owned_lane_mask;
|
||||
intel_wakeref_t wakeref;
|
||||
int n_entries, ln;
|
||||
struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
|
||||
|
||||
if (intel_tc_port_in_tbt_alt_mode(dig_port))
|
||||
return;
|
||||
|
||||
owned_lane_mask = intel_cx0_get_owned_lane_mask(i915, encoder);
|
||||
|
||||
wakeref = intel_cx0_phy_transaction_begin(encoder);
|
||||
|
||||
@@ -3136,6 +3142,9 @@ void intel_cx0pll_state_verify(struct intel_atomic_state *state,
|
||||
encoder = intel_get_crtc_new_encoder(state, new_crtc_state);
|
||||
phy = intel_port_to_phy(i915, encoder->port);
|
||||
|
||||
if (intel_tc_port_in_tbt_alt_mode(enc_to_dig_port(encoder)))
|
||||
return;
|
||||
|
||||
intel_cx0pll_readout_hw_state(encoder, &mpll_hw_state);
|
||||
|
||||
if (intel_is_c10phy(i915, phy))
|
||||
|
||||
@@ -2627,7 +2627,7 @@ static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_sta
|
||||
crtc_vblank_start = 1;
|
||||
}
|
||||
|
||||
if (DISPLAY_VER(dev_priv) > 3)
|
||||
if (DISPLAY_VER(dev_priv) >= 4)
|
||||
intel_de_write(dev_priv, TRANS_VSYNCSHIFT(cpu_transcoder),
|
||||
vsyncshift);
|
||||
|
||||
@@ -3167,7 +3167,7 @@ static void bdw_set_pipe_misc(const struct intel_crtc_state *crtc_state)
|
||||
break;
|
||||
case 36:
|
||||
/* Port output 12BPC defined for ADLP+ */
|
||||
if (DISPLAY_VER(dev_priv) > 12)
|
||||
if (DISPLAY_VER(dev_priv) >= 13)
|
||||
val |= PIPE_MISC_BPC_12_ADLP;
|
||||
break;
|
||||
default:
|
||||
@@ -3224,7 +3224,7 @@ int bdw_get_pipe_misc_bpp(struct intel_crtc *crtc)
|
||||
* MIPI DSI HW readout.
|
||||
*/
|
||||
case PIPE_MISC_BPC_12_ADLP:
|
||||
if (DISPLAY_VER(dev_priv) > 12)
|
||||
if (DISPLAY_VER(dev_priv) >= 13)
|
||||
return 36;
|
||||
fallthrough;
|
||||
default:
|
||||
@@ -4923,6 +4923,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
||||
|
||||
#define PIPE_CONF_CHECK_X(name) do { \
|
||||
if (current_config->name != pipe_config->name) { \
|
||||
BUILD_BUG_ON_MSG(__same_type(current_config->name, bool), \
|
||||
__stringify(name) " is bool"); \
|
||||
pipe_config_mismatch(fastset, crtc, __stringify(name), \
|
||||
"(expected 0x%08x, found 0x%08x)", \
|
||||
current_config->name, \
|
||||
@@ -4933,6 +4935,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
||||
|
||||
#define PIPE_CONF_CHECK_X_WITH_MASK(name, mask) do { \
|
||||
if ((current_config->name & (mask)) != (pipe_config->name & (mask))) { \
|
||||
BUILD_BUG_ON_MSG(__same_type(current_config->name, bool), \
|
||||
__stringify(name) " is bool"); \
|
||||
pipe_config_mismatch(fastset, crtc, __stringify(name), \
|
||||
"(expected 0x%08x, found 0x%08x)", \
|
||||
current_config->name & (mask), \
|
||||
@@ -4943,6 +4947,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
||||
|
||||
#define PIPE_CONF_CHECK_I(name) do { \
|
||||
if (current_config->name != pipe_config->name) { \
|
||||
BUILD_BUG_ON_MSG(__same_type(current_config->name, bool), \
|
||||
__stringify(name) " is bool"); \
|
||||
pipe_config_mismatch(fastset, crtc, __stringify(name), \
|
||||
"(expected %i, found %i)", \
|
||||
current_config->name, \
|
||||
@@ -4953,6 +4959,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
||||
|
||||
#define PIPE_CONF_CHECK_BOOL(name) do { \
|
||||
if (current_config->name != pipe_config->name) { \
|
||||
BUILD_BUG_ON_MSG(!__same_type(current_config->name, bool), \
|
||||
__stringify(name) " is not bool"); \
|
||||
pipe_config_mismatch(fastset, crtc, __stringify(name), \
|
||||
"(expected %s, found %s)", \
|
||||
str_yes_no(current_config->name), \
|
||||
@@ -5091,8 +5099,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
||||
#define PIPE_CONF_QUIRK(quirk) \
|
||||
((current_config->quirks | pipe_config->quirks) & (quirk))
|
||||
|
||||
PIPE_CONF_CHECK_I(hw.enable);
|
||||
PIPE_CONF_CHECK_I(hw.active);
|
||||
PIPE_CONF_CHECK_BOOL(hw.enable);
|
||||
PIPE_CONF_CHECK_BOOL(hw.active);
|
||||
|
||||
PIPE_CONF_CHECK_I(cpu_transcoder);
|
||||
PIPE_CONF_CHECK_I(mst_master_transcoder);
|
||||
@@ -5301,8 +5309,8 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
|
||||
PIPE_CONF_CHECK_I(dsc.config.second_line_bpg_offset);
|
||||
PIPE_CONF_CHECK_I(dsc.config.nsl_bpg_offset);
|
||||
|
||||
PIPE_CONF_CHECK_I(dsc.compression_enable);
|
||||
PIPE_CONF_CHECK_I(dsc.dsc_split);
|
||||
PIPE_CONF_CHECK_BOOL(dsc.compression_enable);
|
||||
PIPE_CONF_CHECK_BOOL(dsc.dsc_split);
|
||||
PIPE_CONF_CHECK_I(dsc.compressed_bpp_x16);
|
||||
|
||||
PIPE_CONF_CHECK_BOOL(splitter.enable);
|
||||
@@ -7734,6 +7742,16 @@ enum drm_mode_status intel_mode_valid(struct drm_device *dev,
|
||||
mode->vtotal > vtotal_max)
|
||||
return MODE_V_ILLEGAL;
|
||||
|
||||
return MODE_OK;
|
||||
}
|
||||
|
||||
enum drm_mode_status intel_cpu_transcoder_mode_valid(struct drm_i915_private *dev_priv,
|
||||
const struct drm_display_mode *mode)
|
||||
{
|
||||
/*
|
||||
* Additional transcoder timing limits,
|
||||
* excluding BXT/GLK DSI transcoders.
|
||||
*/
|
||||
if (DISPLAY_VER(dev_priv) >= 5) {
|
||||
if (mode->hdisplay < 64 ||
|
||||
mode->htotal - mode->hdisplay < 32)
|
||||
@@ -7753,7 +7771,7 @@ enum drm_mode_status intel_mode_valid(struct drm_device *dev,
|
||||
* Cantiga+ cannot handle modes with a hsync front porch of 0.
|
||||
* WaPruneModeWithIncorrectHsyncOffset:ctg,elk,ilk,snb,ivb,vlv,hsw.
|
||||
*/
|
||||
if ((DISPLAY_VER(dev_priv) > 4 || IS_G4X(dev_priv)) &&
|
||||
if ((DISPLAY_VER(dev_priv) >= 5 || IS_G4X(dev_priv)) &&
|
||||
mode->hsync_start == mode->hdisplay)
|
||||
return MODE_H_ILLEGAL;
|
||||
|
||||
|
||||
@@ -402,6 +402,9 @@ enum drm_mode_status
|
||||
intel_mode_valid_max_plane_size(struct drm_i915_private *dev_priv,
|
||||
const struct drm_display_mode *mode,
|
||||
bool bigjoiner);
|
||||
enum drm_mode_status
|
||||
intel_cpu_transcoder_mode_valid(struct drm_i915_private *i915,
|
||||
const struct drm_display_mode *mode);
|
||||
enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port);
|
||||
bool is_trans_port_sync_mode(const struct intel_crtc_state *state);
|
||||
bool is_trans_port_sync_master(const struct intel_crtc_state *state);
|
||||
|
||||
@@ -1095,7 +1095,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915)
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(intel_display_debugfs_files); i++) {
|
||||
debugfs_create_file(intel_display_debugfs_files[i].name,
|
||||
S_IRUGO | S_IWUSR,
|
||||
0644,
|
||||
minor->debugfs_root,
|
||||
to_i915(minor->dev),
|
||||
intel_display_debugfs_files[i].fops);
|
||||
@@ -1116,11 +1116,10 @@ void intel_display_debugfs_register(struct drm_i915_private *i915)
|
||||
|
||||
static int i915_panel_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_connector *connector = m->private;
|
||||
struct intel_dp *intel_dp =
|
||||
intel_attached_dp(to_intel_connector(connector));
|
||||
struct intel_connector *connector = m->private;
|
||||
struct intel_dp *intel_dp = intel_attached_dp(connector);
|
||||
|
||||
if (connector->status != connector_status_connected)
|
||||
if (connector->base.status != connector_status_connected)
|
||||
return -ENODEV;
|
||||
|
||||
seq_printf(m, "Panel power up delay: %d\n",
|
||||
@@ -1138,23 +1137,23 @@ DEFINE_SHOW_ATTRIBUTE(i915_panel);
|
||||
|
||||
static int i915_hdcp_sink_capability_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->dev);
|
||||
struct intel_connector *intel_connector = to_intel_connector(connector);
|
||||
struct intel_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
int ret;
|
||||
|
||||
ret = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!connector->encoder || connector->status != connector_status_connected) {
|
||||
if (!connector->base.encoder ||
|
||||
connector->base.status != connector_status_connected) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
seq_printf(m, "%s:%d HDCP version: ", connector->name,
|
||||
connector->base.id);
|
||||
intel_hdcp_info(m, intel_connector);
|
||||
seq_printf(m, "%s:%d HDCP version: ", connector->base.name,
|
||||
connector->base.base.id);
|
||||
intel_hdcp_info(m, connector);
|
||||
|
||||
out:
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
@@ -1165,16 +1164,16 @@ DEFINE_SHOW_ATTRIBUTE(i915_hdcp_sink_capability);
|
||||
|
||||
static int i915_lpsp_capability_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->dev);
|
||||
struct intel_encoder *encoder;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
int connector_type = connector->base.connector_type;
|
||||
bool lpsp_capable = false;
|
||||
|
||||
encoder = intel_attached_encoder(to_intel_connector(connector));
|
||||
if (!encoder)
|
||||
return -ENODEV;
|
||||
|
||||
if (connector->status != connector_status_connected)
|
||||
if (connector->base.status != connector_status_connected)
|
||||
return -ENODEV;
|
||||
|
||||
if (DISPLAY_VER(i915) >= 13)
|
||||
@@ -1187,15 +1186,15 @@ static int i915_lpsp_capability_show(struct seq_file *m, void *data)
|
||||
*/
|
||||
lpsp_capable = encoder->port <= PORT_B;
|
||||
else if (DISPLAY_VER(i915) == 11)
|
||||
lpsp_capable = (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_eDP);
|
||||
lpsp_capable = (connector_type == DRM_MODE_CONNECTOR_DSI ||
|
||||
connector_type == DRM_MODE_CONNECTOR_eDP);
|
||||
else if (IS_DISPLAY_VER(i915, 9, 10))
|
||||
lpsp_capable = (encoder->port == PORT_A &&
|
||||
(connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort));
|
||||
(connector_type == DRM_MODE_CONNECTOR_DSI ||
|
||||
connector_type == DRM_MODE_CONNECTOR_eDP ||
|
||||
connector_type == DRM_MODE_CONNECTOR_DisplayPort));
|
||||
else if (IS_HASWELL(i915) || IS_BROADWELL(i915))
|
||||
lpsp_capable = connector->connector_type == DRM_MODE_CONNECTOR_eDP;
|
||||
lpsp_capable = connector_type == DRM_MODE_CONNECTOR_eDP;
|
||||
|
||||
seq_printf(m, "LPSP: %s\n", lpsp_capable ? "capable" : "incapable");
|
||||
|
||||
@@ -1205,7 +1204,7 @@ DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability);
|
||||
|
||||
static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(m->private);
|
||||
struct intel_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct drm_crtc *crtc;
|
||||
struct intel_dp *intel_dp;
|
||||
@@ -1275,13 +1274,13 @@ static ssize_t i915_dsc_fec_support_write(struct file *file,
|
||||
const char __user *ubuf,
|
||||
size_t len, loff_t *offp)
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
bool dsc_enable = false;
|
||||
int ret;
|
||||
struct drm_connector *connector =
|
||||
((struct seq_file *)file->private_data)->private;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
|
||||
if (len == 0)
|
||||
return 0;
|
||||
@@ -1319,22 +1318,22 @@ static const struct file_operations i915_dsc_fec_support_fops = {
|
||||
|
||||
static int i915_dsc_bpc_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_connector *connector = m->private;
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct drm_crtc *crtc;
|
||||
struct intel_crtc_state *crtc_state;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
|
||||
int ret;
|
||||
|
||||
if (!encoder)
|
||||
return -ENODEV;
|
||||
|
||||
ret = drm_modeset_lock_single_interruptible(&dev->mode_config.connection_mutex);
|
||||
ret = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
crtc = connector->state->crtc;
|
||||
if (connector->status != connector_status_connected || !crtc) {
|
||||
crtc = connector->base.state->crtc;
|
||||
if (connector->base.status != connector_status_connected || !crtc) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
@@ -1342,7 +1341,7 @@ static int i915_dsc_bpc_show(struct seq_file *m, void *data)
|
||||
crtc_state = to_intel_crtc_state(crtc->state);
|
||||
seq_printf(m, "Input_BPC: %d\n", crtc_state->dsc.config.bits_per_component);
|
||||
|
||||
out: drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
||||
out: drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1351,9 +1350,9 @@ static ssize_t i915_dsc_bpc_write(struct file *file,
|
||||
const char __user *ubuf,
|
||||
size_t len, loff_t *offp)
|
||||
{
|
||||
struct drm_connector *connector =
|
||||
((struct seq_file *)file->private_data)->private;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
|
||||
struct seq_file *m = file->private_data;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
int dsc_bpc = 0;
|
||||
int ret;
|
||||
@@ -1385,22 +1384,22 @@ static const struct file_operations i915_dsc_bpc_fops = {
|
||||
|
||||
static int i915_dsc_output_format_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_connector *connector = m->private;
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct drm_crtc *crtc;
|
||||
struct intel_crtc_state *crtc_state;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
|
||||
int ret;
|
||||
|
||||
if (!encoder)
|
||||
return -ENODEV;
|
||||
|
||||
ret = drm_modeset_lock_single_interruptible(&dev->mode_config.connection_mutex);
|
||||
ret = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
crtc = connector->state->crtc;
|
||||
if (connector->status != connector_status_connected || !crtc) {
|
||||
crtc = connector->base.state->crtc;
|
||||
if (connector->base.status != connector_status_connected || !crtc) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
@@ -1409,7 +1408,7 @@ static int i915_dsc_output_format_show(struct seq_file *m, void *data)
|
||||
seq_printf(m, "DSC_Output_Format: %s\n",
|
||||
intel_output_format_name(crtc_state->output_format));
|
||||
|
||||
out: drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
||||
out: drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1418,9 +1417,9 @@ static ssize_t i915_dsc_output_format_write(struct file *file,
|
||||
const char __user *ubuf,
|
||||
size_t len, loff_t *offp)
|
||||
{
|
||||
struct drm_connector *connector =
|
||||
((struct seq_file *)file->private_data)->private;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
|
||||
struct seq_file *m = file->private_data;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
int dsc_output_format = 0;
|
||||
int ret;
|
||||
@@ -1452,33 +1451,32 @@ static const struct file_operations i915_dsc_output_format_fops = {
|
||||
|
||||
static int i915_dsc_fractional_bpp_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_connector *connector = m->private;
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct drm_crtc *crtc;
|
||||
struct intel_dp *intel_dp;
|
||||
struct intel_connector *intel_connector = to_intel_connector(connector);
|
||||
struct intel_encoder *encoder = intel_attached_encoder(intel_connector);
|
||||
int ret;
|
||||
|
||||
if (!encoder)
|
||||
return -ENODEV;
|
||||
|
||||
ret = drm_modeset_lock_single_interruptible(&dev->mode_config.connection_mutex);
|
||||
ret = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
crtc = connector->state->crtc;
|
||||
if (connector->status != connector_status_connected || !crtc) {
|
||||
crtc = connector->base.state->crtc;
|
||||
if (connector->base.status != connector_status_connected || !crtc) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
intel_dp = intel_attached_dp(intel_connector);
|
||||
intel_dp = intel_attached_dp(connector);
|
||||
seq_printf(m, "Force_DSC_Fractional_BPP_Enable: %s\n",
|
||||
str_yes_no(intel_dp->force_dsc_fractional_bpp_en));
|
||||
|
||||
out:
|
||||
drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1487,10 +1485,10 @@ static ssize_t i915_dsc_fractional_bpp_write(struct file *file,
|
||||
const char __user *ubuf,
|
||||
size_t len, loff_t *offp)
|
||||
{
|
||||
struct drm_connector *connector =
|
||||
((struct seq_file *)file->private_data)->private;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector));
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct seq_file *m = file->private_data;
|
||||
struct intel_connector *connector = m->private;
|
||||
struct intel_encoder *encoder = intel_attached_encoder(connector);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
bool dsc_fractional_bpp_enable = false;
|
||||
int ret;
|
||||
@@ -1565,39 +1563,38 @@ DEFINE_SHOW_ATTRIBUTE(intel_crtc_pipe);
|
||||
|
||||
/**
|
||||
* intel_connector_debugfs_add - add i915 specific connector debugfs files
|
||||
* @intel_connector: pointer to a registered drm_connector
|
||||
* @connector: pointer to a registered intel_connector
|
||||
*
|
||||
* Cleanup will be done by drm_connector_unregister() through a call to
|
||||
* drm_debugfs_connector_remove().
|
||||
*/
|
||||
void intel_connector_debugfs_add(struct intel_connector *intel_connector)
|
||||
void intel_connector_debugfs_add(struct intel_connector *connector)
|
||||
{
|
||||
struct drm_connector *connector = &intel_connector->base;
|
||||
struct dentry *root = connector->debugfs_entry;
|
||||
struct drm_i915_private *dev_priv = to_i915(connector->dev);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct dentry *root = connector->base.debugfs_entry;
|
||||
int connector_type = connector->base.connector_type;
|
||||
|
||||
/* The connector must have been registered beforehands. */
|
||||
if (!root)
|
||||
return;
|
||||
|
||||
intel_drrs_connector_debugfs_add(intel_connector);
|
||||
intel_psr_connector_debugfs_add(intel_connector);
|
||||
intel_drrs_connector_debugfs_add(connector);
|
||||
intel_psr_connector_debugfs_add(connector);
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
|
||||
debugfs_create_file("i915_panel_timings", S_IRUGO, root,
|
||||
if (connector_type == DRM_MODE_CONNECTOR_eDP)
|
||||
debugfs_create_file("i915_panel_timings", 0444, root,
|
||||
connector, &i915_panel_fops);
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) {
|
||||
debugfs_create_file("i915_hdcp_sink_capability", S_IRUGO, root,
|
||||
if (connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
|
||||
connector_type == DRM_MODE_CONNECTOR_HDMIA ||
|
||||
connector_type == DRM_MODE_CONNECTOR_HDMIB) {
|
||||
debugfs_create_file("i915_hdcp_sink_capability", 0444, root,
|
||||
connector, &i915_hdcp_sink_capability_fops);
|
||||
}
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 11 &&
|
||||
((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
|
||||
!to_intel_connector(connector)->mst_port) ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
|
||||
if (DISPLAY_VER(i915) >= 11 &&
|
||||
((connector_type == DRM_MODE_CONNECTOR_DisplayPort && !connector->mst_port) ||
|
||||
connector_type == DRM_MODE_CONNECTOR_eDP)) {
|
||||
debugfs_create_file("i915_dsc_fec_support", 0644, root,
|
||||
connector, &i915_dsc_fec_support_fops);
|
||||
|
||||
@@ -1611,11 +1608,11 @@ void intel_connector_debugfs_add(struct intel_connector *intel_connector)
|
||||
connector, &i915_dsc_fractional_bpp_fops);
|
||||
}
|
||||
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_DSI ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
|
||||
connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)
|
||||
if (connector_type == DRM_MODE_CONNECTOR_DSI ||
|
||||
connector_type == DRM_MODE_CONNECTOR_eDP ||
|
||||
connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
|
||||
connector_type == DRM_MODE_CONNECTOR_HDMIA ||
|
||||
connector_type == DRM_MODE_CONNECTOR_HDMIB)
|
||||
debugfs_create_file("i915_lpsp_capability", 0444, root,
|
||||
connector, &i915_lpsp_capability_fops);
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ struct drm_printer;
|
||||
#define HAS_DSC(__i915) (DISPLAY_RUNTIME_INFO(__i915)->has_dsc)
|
||||
#define HAS_FBC(i915) (DISPLAY_RUNTIME_INFO(i915)->fbc_mask != 0)
|
||||
#define HAS_FPGA_DBG_UNCLAIMED(i915) (DISPLAY_INFO(i915)->has_fpga_dbg)
|
||||
#define HAS_FW_BLC(i915) (DISPLAY_VER(i915) > 2)
|
||||
#define HAS_FW_BLC(i915) (DISPLAY_VER(i915) >= 3)
|
||||
#define HAS_GMBUS_IRQ(i915) (DISPLAY_VER(i915) >= 4)
|
||||
#define HAS_GMBUS_BURST_READ(i915) (DISPLAY_VER(i915) >= 10 || IS_KABYLAKE(i915))
|
||||
#define HAS_GMCH(i915) (DISPLAY_INFO(i915)->has_gmch)
|
||||
|
||||
@@ -896,7 +896,7 @@ gen8_de_misc_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
|
||||
}
|
||||
|
||||
if (!found)
|
||||
drm_err(&dev_priv->drm, "Unexpected DE Misc interrupt\n");
|
||||
drm_err(&dev_priv->drm, "Unexpected DE Misc interrupt: 0x%08x\n", iir);
|
||||
}
|
||||
|
||||
static void gen11_dsi_te_interrupt_handler(struct drm_i915_private *dev_priv,
|
||||
@@ -1653,7 +1653,7 @@ void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
|
||||
else if (HAS_PCH_SPLIT(dev_priv))
|
||||
ibx_irq_postinstall(dev_priv);
|
||||
|
||||
if (DISPLAY_VER(dev_priv) <= 10)
|
||||
if (DISPLAY_VER(dev_priv) < 11)
|
||||
de_misc_masked |= GEN8_DE_MISC_GSE;
|
||||
|
||||
if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
|
||||
|
||||
@@ -1697,14 +1697,14 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
|
||||
if (resume)
|
||||
intel_dmc_load_program(dev_priv);
|
||||
|
||||
/* Wa_14011508470:tgl,dg1,rkl,adl-s,adl-p */
|
||||
if (DISPLAY_VER(dev_priv) >= 12)
|
||||
/* Wa_14011508470:tgl,dg1,rkl,adl-s,adl-p,dg2 */
|
||||
if (IS_DISPLAY_IP_RANGE(dev_priv, IP_VER(12, 0), IP_VER(13, 0)))
|
||||
intel_de_rmw(dev_priv, GEN11_CHICKEN_DCPR_2, 0,
|
||||
DCPR_CLEAR_MEMSTAT_DIS | DCPR_SEND_RESP_IMM |
|
||||
DCPR_MASK_LPMODE | DCPR_MASK_MAXLATENCY_MEMUP_CLR);
|
||||
|
||||
/* Wa_14011503030:xelpd */
|
||||
if (DISPLAY_VER(dev_priv) >= 13)
|
||||
if (DISPLAY_VER(dev_priv) == 13)
|
||||
intel_de_write(dev_priv, XELPD_DISPLAY_ERR_FATAL_MASK, ~0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1227,6 +1227,10 @@ intel_dp_mode_valid(struct drm_connector *_connector,
|
||||
enum drm_mode_status status;
|
||||
bool dsc = false, bigjoiner = false;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(dev_priv, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLCLK)
|
||||
return MODE_H_ILLEGAL;
|
||||
|
||||
@@ -1886,7 +1890,7 @@ static int dsc_src_max_compressed_bpp(struct intel_dp *intel_dp)
|
||||
* Max Compressed bpp for Gen 13+ is 27bpp.
|
||||
* For earlier platform is 23bpp. (Bspec:49259).
|
||||
*/
|
||||
if (DISPLAY_VER(i915) <= 12)
|
||||
if (DISPLAY_VER(i915) < 13)
|
||||
return 23;
|
||||
else
|
||||
return 27;
|
||||
@@ -2844,19 +2848,12 @@ intel_dp_audio_compute_config(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct drm_connector *connector = conn_state->connector;
|
||||
|
||||
pipe_config->has_audio =
|
||||
intel_dp_has_audio(encoder, pipe_config, conn_state) &&
|
||||
intel_audio_compute_config(encoder, pipe_config, conn_state);
|
||||
|
||||
pipe_config->sdp_split_enable = pipe_config->has_audio &&
|
||||
intel_dp_is_uhbr(pipe_config);
|
||||
|
||||
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDP split enable: %s\n",
|
||||
connector->base.id, connector->name,
|
||||
str_yes_no(pipe_config->sdp_split_enable));
|
||||
}
|
||||
|
||||
int
|
||||
|
||||
@@ -54,7 +54,7 @@ static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp
|
||||
struct intel_crtc_state *crtc_state,
|
||||
bool dsc)
|
||||
{
|
||||
if (intel_dp_is_uhbr(crtc_state) && DISPLAY_VER(i915) <= 13 && dsc) {
|
||||
if (intel_dp_is_uhbr(crtc_state) && DISPLAY_VER(i915) < 14 && dsc) {
|
||||
int output_bpp = bpp;
|
||||
/* DisplayPort 2 128b/132b, bits per lane is always 32 */
|
||||
int symbol_clock = crtc_state->port_clock / 32;
|
||||
@@ -1282,6 +1282,10 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
|
||||
return 0;
|
||||
}
|
||||
|
||||
*status = intel_cpu_transcoder_mode_valid(dev_priv, mode);
|
||||
if (*status != MODE_OK)
|
||||
return 0;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLSCAN) {
|
||||
*status = MODE_NO_DBLESCAN;
|
||||
return 0;
|
||||
@@ -1328,6 +1332,10 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
|
||||
if (intel_dp_need_bigjoiner(intel_dp, mode->hdisplay, target_clock)) {
|
||||
bigjoiner = true;
|
||||
max_dotclk *= 2;
|
||||
|
||||
/* TODO: add support for bigjoiner */
|
||||
*status = MODE_CLOCK_HIGH;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 10 &&
|
||||
@@ -1362,11 +1370,15 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
|
||||
* Big joiner configuration needs DSC for TGL which is not true for
|
||||
* XE_LPD where uncompressed joiner is supported.
|
||||
*/
|
||||
if (DISPLAY_VER(dev_priv) < 13 && bigjoiner && !dsc)
|
||||
return MODE_CLOCK_HIGH;
|
||||
if (DISPLAY_VER(dev_priv) < 13 && bigjoiner && !dsc) {
|
||||
*status = MODE_CLOCK_HIGH;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mode_rate > max_rate && !dsc)
|
||||
return MODE_CLOCK_HIGH;
|
||||
if (mode_rate > max_rate && !dsc) {
|
||||
*status = MODE_CLOCK_HIGH;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*status = intel_mode_valid_max_plane_size(dev_priv, mode, false);
|
||||
return 0;
|
||||
|
||||
@@ -4537,7 +4537,7 @@ void intel_shared_dpll_state_verify(struct intel_atomic_state *state,
|
||||
"pll active mismatch (didn't expect pipe %c in active mask (0x%x))\n",
|
||||
pipe_name(crtc->pipe), pll->active_mask);
|
||||
I915_STATE_WARN(i915, pll->state.pipe_mask & pipe_mask,
|
||||
"pll enabled crtcs mismatch (found %x in enabled mask (0x%x))\n",
|
||||
"pll enabled crtcs mismatch (found pipe %c in enabled mask (0x%x))\n",
|
||||
pipe_name(crtc->pipe), pll->state.pipe_mask);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -341,7 +341,7 @@ static int intel_dsb_dewake_scanline(const struct intel_crtc_state *crtc_state)
|
||||
}
|
||||
|
||||
static void _intel_dsb_commit(struct intel_dsb *dsb, u32 ctrl,
|
||||
unsigned int dewake_scanline)
|
||||
int dewake_scanline)
|
||||
{
|
||||
struct intel_crtc *crtc = dsb->crtc;
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
|
||||
@@ -922,7 +922,7 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)
|
||||
gpiod_add_lookup_table(gpiod_lookup_table);
|
||||
|
||||
if (want_panel_gpio) {
|
||||
intel_dsi->gpio_panel = gpiod_get(dev->dev, "panel", flags);
|
||||
intel_dsi->gpio_panel = devm_gpiod_get(dev->dev, "panel", flags);
|
||||
if (IS_ERR(intel_dsi->gpio_panel)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to own gpio for panel control\n");
|
||||
@@ -932,7 +932,7 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)
|
||||
|
||||
if (want_backlight_gpio) {
|
||||
intel_dsi->gpio_backlight =
|
||||
gpiod_get(dev->dev, "backlight", flags);
|
||||
devm_gpiod_get(dev->dev, "backlight", flags);
|
||||
if (IS_ERR(intel_dsi->gpio_backlight)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to own gpio for backlight control\n");
|
||||
@@ -943,16 +943,3 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)
|
||||
if (gpiod_lookup_table)
|
||||
gpiod_remove_lookup_table(gpiod_lookup_table);
|
||||
}
|
||||
|
||||
void intel_dsi_vbt_gpio_cleanup(struct intel_dsi *intel_dsi)
|
||||
{
|
||||
if (intel_dsi->gpio_panel) {
|
||||
gpiod_put(intel_dsi->gpio_panel);
|
||||
intel_dsi->gpio_panel = NULL;
|
||||
}
|
||||
|
||||
if (intel_dsi->gpio_backlight) {
|
||||
gpiod_put(intel_dsi->gpio_backlight);
|
||||
intel_dsi->gpio_backlight = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ struct intel_dsi;
|
||||
|
||||
bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id);
|
||||
void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on);
|
||||
void intel_dsi_vbt_gpio_cleanup(struct intel_dsi *intel_dsi);
|
||||
void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi,
|
||||
enum mipi_seq seq_id);
|
||||
void intel_dsi_log_params(struct intel_dsi *intel_dsi);
|
||||
|
||||
@@ -217,11 +217,17 @@ intel_dvo_mode_valid(struct drm_connector *_connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(_connector);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
|
||||
const struct drm_display_mode *fixed_mode =
|
||||
intel_panel_fixed_mode(connector, mode);
|
||||
int max_dotclk = to_i915(connector->base.dev)->max_dotclk_freq;
|
||||
int target_clock = mode->clock;
|
||||
enum drm_mode_status status;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(i915, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
return MODE_NO_DBLESCAN;
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
*/
|
||||
|
||||
#include <drm/drm_blend.h>
|
||||
#include <drm/drm_framebuffer.h>
|
||||
#include <drm/drm_modeset_helper.h>
|
||||
|
||||
#include <linux/dma-fence.h>
|
||||
@@ -15,6 +14,7 @@
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_dpt.h"
|
||||
#include "intel_fb.h"
|
||||
#include "intel_fb_bo.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
|
||||
#define check_array_bounds(i915, a, i) drm_WARN_ON(&(i915)->drm, (i) >= ARRAY_SIZE(a))
|
||||
@@ -301,6 +301,33 @@ lookup_format_info(const struct drm_format_info formats[],
|
||||
return NULL;
|
||||
}
|
||||
|
||||
unsigned int intel_fb_modifier_to_tiling(u64 fb_modifier)
|
||||
{
|
||||
const struct intel_modifier_desc *md;
|
||||
u8 tiling_caps;
|
||||
|
||||
md = lookup_modifier_or_null(fb_modifier);
|
||||
if (!md)
|
||||
return I915_TILING_NONE;
|
||||
|
||||
tiling_caps = lookup_modifier_or_null(fb_modifier)->plane_caps &
|
||||
INTEL_PLANE_CAP_TILING_MASK;
|
||||
|
||||
switch (tiling_caps) {
|
||||
case INTEL_PLANE_CAP_TILING_Y:
|
||||
return I915_TILING_Y;
|
||||
case INTEL_PLANE_CAP_TILING_X:
|
||||
return I915_TILING_X;
|
||||
case INTEL_PLANE_CAP_TILING_4:
|
||||
case INTEL_PLANE_CAP_TILING_Yf:
|
||||
case INTEL_PLANE_CAP_TILING_NONE:
|
||||
return I915_TILING_NONE;
|
||||
default:
|
||||
MISSING_CASE(tiling_caps);
|
||||
return I915_TILING_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_fb_get_format_info: Get a modifier specific format information
|
||||
* @cmd: FB add command structure
|
||||
@@ -737,26 +764,6 @@ intel_fb_align_height(const struct drm_framebuffer *fb,
|
||||
return ALIGN(height, tile_height);
|
||||
}
|
||||
|
||||
static unsigned int intel_fb_modifier_to_tiling(u64 fb_modifier)
|
||||
{
|
||||
u8 tiling_caps = lookup_modifier(fb_modifier)->plane_caps &
|
||||
INTEL_PLANE_CAP_TILING_MASK;
|
||||
|
||||
switch (tiling_caps) {
|
||||
case INTEL_PLANE_CAP_TILING_Y:
|
||||
return I915_TILING_Y;
|
||||
case INTEL_PLANE_CAP_TILING_X:
|
||||
return I915_TILING_X;
|
||||
case INTEL_PLANE_CAP_TILING_4:
|
||||
case INTEL_PLANE_CAP_TILING_Yf:
|
||||
case INTEL_PLANE_CAP_TILING_NONE:
|
||||
return I915_TILING_NONE;
|
||||
default:
|
||||
MISSING_CASE(tiling_caps);
|
||||
return I915_TILING_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
bool intel_fb_modifier_uses_dpt(struct drm_i915_private *i915, u64 modifier)
|
||||
{
|
||||
return HAS_DPT(i915) && modifier != DRM_FORMAT_MOD_LINEAR;
|
||||
@@ -1374,7 +1381,8 @@ plane_view_scanout_stride(const struct intel_framebuffer *fb, int color_plane,
|
||||
struct drm_i915_private *i915 = to_i915(fb->base.dev);
|
||||
unsigned int stride_tiles;
|
||||
|
||||
if (IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14)
|
||||
if ((IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14) &&
|
||||
src_stride_tiles < dst_stride_tiles)
|
||||
stride_tiles = src_stride_tiles;
|
||||
else
|
||||
stride_tiles = dst_stride_tiles;
|
||||
@@ -1657,10 +1665,10 @@ int intel_fill_fb_info(struct drm_i915_private *i915, struct intel_framebuffer *
|
||||
max_size = max(max_size, offset + size);
|
||||
}
|
||||
|
||||
if (mul_u32_u32(max_size, tile_size) > obj->base.size) {
|
||||
if (mul_u32_u32(max_size, tile_size) > intel_bo_to_drm_bo(obj)->size) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"fb too big for bo (need %llu bytes, have %zu bytes)\n",
|
||||
mul_u32_u32(max_size, tile_size), obj->base.size);
|
||||
mul_u32_u32(max_size, tile_size), intel_bo_to_drm_bo(obj)->size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1881,6 +1889,8 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
|
||||
|
||||
intel_frontbuffer_put(intel_fb->frontbuffer);
|
||||
|
||||
intel_fb_bo_framebuffer_fini(intel_fb_obj(fb));
|
||||
|
||||
kfree(intel_fb);
|
||||
}
|
||||
|
||||
@@ -1889,7 +1899,7 @@ static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
|
||||
unsigned int *handle)
|
||||
{
|
||||
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
||||
struct drm_i915_private *i915 = to_i915(obj->base.dev);
|
||||
struct drm_i915_private *i915 = to_i915(intel_bo_to_drm_bo(obj)->dev);
|
||||
|
||||
if (i915_gem_object_is_userptr(obj)) {
|
||||
drm_dbg(&i915->drm,
|
||||
@@ -1897,7 +1907,7 @@ static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return drm_gem_handle_create(file, &obj->base, handle);
|
||||
return drm_gem_handle_create(file, intel_bo_to_drm_bo(obj), handle);
|
||||
}
|
||||
|
||||
struct frontbuffer_fence_cb {
|
||||
@@ -1975,61 +1985,30 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
struct drm_i915_gem_object *obj,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
|
||||
struct drm_i915_private *dev_priv = to_i915(intel_bo_to_drm_bo(obj)->dev);
|
||||
struct drm_framebuffer *fb = &intel_fb->base;
|
||||
u32 max_stride;
|
||||
unsigned int tiling, stride;
|
||||
int ret = -EINVAL;
|
||||
int i;
|
||||
|
||||
ret = intel_fb_bo_framebuffer_init(intel_fb, obj, mode_cmd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
intel_fb->frontbuffer = intel_frontbuffer_get(obj);
|
||||
if (!intel_fb->frontbuffer)
|
||||
return -ENOMEM;
|
||||
|
||||
i915_gem_object_lock(obj, NULL);
|
||||
tiling = i915_gem_object_get_tiling(obj);
|
||||
stride = i915_gem_object_get_stride(obj);
|
||||
i915_gem_object_unlock(obj);
|
||||
|
||||
if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
|
||||
/*
|
||||
* If there's a fence, enforce that
|
||||
* the fb modifier and tiling mode match.
|
||||
*/
|
||||
if (tiling != I915_TILING_NONE &&
|
||||
tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"tiling_mode doesn't match fb modifier\n");
|
||||
goto err;
|
||||
}
|
||||
} else {
|
||||
if (tiling == I915_TILING_X) {
|
||||
mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED;
|
||||
} else if (tiling == I915_TILING_Y) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"No Y tiling for legacy addfb\n");
|
||||
goto err;
|
||||
}
|
||||
if (!intel_fb->frontbuffer) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = -EINVAL;
|
||||
if (!drm_any_plane_has_format(&dev_priv->drm,
|
||||
mode_cmd->pixel_format,
|
||||
mode_cmd->modifier[0])) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"unsupported pixel format %p4cc / modifier 0x%llx\n",
|
||||
&mode_cmd->pixel_format, mode_cmd->modifier[0]);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* gen2/3 display engine uses the fence if present,
|
||||
* so the tiling mode must match the fb modifier exactly.
|
||||
*/
|
||||
if (DISPLAY_VER(dev_priv) < 4 &&
|
||||
tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"tiling_mode must match fb modifier exactly on gen2/3\n");
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
}
|
||||
|
||||
max_stride = intel_fb_max_stride(dev_priv, mode_cmd->pixel_format,
|
||||
@@ -2040,18 +2019,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR ?
|
||||
"tiled" : "linear",
|
||||
mode_cmd->pitches[0], max_stride);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there's a fence, enforce that
|
||||
* the fb pitch and fence stride match.
|
||||
*/
|
||||
if (tiling != I915_TILING_NONE && mode_cmd->pitches[0] != stride) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"pitch (%d) must match tiling stride (%d)\n",
|
||||
mode_cmd->pitches[0], stride);
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
}
|
||||
|
||||
/* FIXME need to adjust LINOFF/TILEOFF accordingly. */
|
||||
@@ -2059,7 +2027,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"plane 0 offset (0x%08x) must be 0\n",
|
||||
mode_cmd->offsets[0]);
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
}
|
||||
|
||||
drm_helper_mode_fill_fb_struct(&dev_priv->drm, fb, mode_cmd);
|
||||
@@ -2070,7 +2038,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
if (mode_cmd->handles[i] != mode_cmd->handles[0]) {
|
||||
drm_dbg_kms(&dev_priv->drm, "bad plane %d handle\n",
|
||||
i);
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
}
|
||||
|
||||
stride_alignment = intel_fb_stride_alignment(fb, i);
|
||||
@@ -2078,7 +2046,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"plane %d pitch (%d) must be at least %u byte aligned\n",
|
||||
i, fb->pitches[i], stride_alignment);
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
}
|
||||
|
||||
if (intel_fb_is_gen12_ccs_aux_plane(fb, i)) {
|
||||
@@ -2089,7 +2057,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
"ccs aux plane %d pitch (%d) must be %d\n",
|
||||
i,
|
||||
fb->pitches[i], ccs_aux_stride);
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2098,7 +2066,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
|
||||
ret = intel_fill_fb_info(dev_priv, intel_fb);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
|
||||
if (intel_fb_uses_dpt(fb)) {
|
||||
struct i915_address_space *vm;
|
||||
@@ -2107,7 +2075,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
if (IS_ERR(vm)) {
|
||||
drm_dbg_kms(&dev_priv->drm, "failed to create DPT\n");
|
||||
ret = PTR_ERR(vm);
|
||||
goto err;
|
||||
goto err_frontbuffer_put;
|
||||
}
|
||||
|
||||
intel_fb->dpt_vm = vm;
|
||||
@@ -2124,8 +2092,10 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
err_free_dpt:
|
||||
if (intel_fb_uses_dpt(fb))
|
||||
intel_dpt_destroy(intel_fb->dpt_vm);
|
||||
err:
|
||||
err_frontbuffer_put:
|
||||
intel_frontbuffer_put(intel_fb->frontbuffer);
|
||||
err:
|
||||
intel_fb_bo_framebuffer_fini(obj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2137,23 +2107,14 @@ intel_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_framebuffer *fb;
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
|
||||
struct drm_i915_private *i915;
|
||||
struct drm_i915_private *i915 = to_i915(dev);
|
||||
|
||||
obj = i915_gem_object_lookup(filp, mode_cmd.handles[0]);
|
||||
if (!obj)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
/* object is backed with LMEM for discrete */
|
||||
i915 = to_i915(obj->base.dev);
|
||||
if (HAS_LMEM(i915) && !i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM_0)) {
|
||||
/* object is "remote", not in local memory */
|
||||
i915_gem_object_put(obj);
|
||||
drm_dbg_kms(&i915->drm, "framebuffer must reside in local memory\n");
|
||||
return ERR_PTR(-EREMOTE);
|
||||
}
|
||||
obj = intel_fb_bo_lookup_valid_bo(i915, filp, &mode_cmd);
|
||||
if (IS_ERR(obj))
|
||||
return ERR_CAST(obj);
|
||||
|
||||
fb = intel_framebuffer_create(obj, &mode_cmd);
|
||||
i915_gem_object_put(obj);
|
||||
drm_gem_object_put(intel_bo_to_drm_bo(obj));
|
||||
|
||||
return fb;
|
||||
}
|
||||
|
||||
@@ -95,4 +95,6 @@ intel_user_framebuffer_create(struct drm_device *dev,
|
||||
bool intel_fb_modifier_uses_dpt(struct drm_i915_private *i915, u64 modifier);
|
||||
bool intel_fb_uses_dpt(const struct drm_framebuffer *fb);
|
||||
|
||||
unsigned int intel_fb_modifier_to_tiling(u64 fb_modifier);
|
||||
|
||||
#endif /* __INTEL_FB_H__ */
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <drm/drm_framebuffer.h>
|
||||
|
||||
#include "gem/i915_gem_object.h"
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include "intel_fb.h"
|
||||
#include "intel_fb_bo.h"
|
||||
|
||||
void intel_fb_bo_framebuffer_fini(struct drm_i915_gem_object *obj)
|
||||
{
|
||||
/* Nothing to do for i915 */
|
||||
}
|
||||
|
||||
int intel_fb_bo_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
struct drm_i915_gem_object *obj,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(obj->base.dev);
|
||||
unsigned int tiling, stride;
|
||||
|
||||
i915_gem_object_lock(obj, NULL);
|
||||
tiling = i915_gem_object_get_tiling(obj);
|
||||
stride = i915_gem_object_get_stride(obj);
|
||||
i915_gem_object_unlock(obj);
|
||||
|
||||
if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
|
||||
/*
|
||||
* If there's a fence, enforce that
|
||||
* the fb modifier and tiling mode match.
|
||||
*/
|
||||
if (tiling != I915_TILING_NONE &&
|
||||
tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"tiling_mode doesn't match fb modifier\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (tiling == I915_TILING_X) {
|
||||
mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED;
|
||||
} else if (tiling == I915_TILING_Y) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"No Y tiling for legacy addfb\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gen2/3 display engine uses the fence if present,
|
||||
* so the tiling mode must match the fb modifier exactly.
|
||||
*/
|
||||
if (DISPLAY_VER(i915) < 4 &&
|
||||
tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"tiling_mode must match fb modifier exactly on gen2/3\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there's a fence, enforce that
|
||||
* the fb pitch and fence stride match.
|
||||
*/
|
||||
if (tiling != I915_TILING_NONE && mode_cmd->pitches[0] != stride) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"pitch (%d) must match tiling stride (%d)\n",
|
||||
mode_cmd->pitches[0], stride);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct drm_i915_gem_object *
|
||||
intel_fb_bo_lookup_valid_bo(struct drm_i915_private *i915,
|
||||
struct drm_file *filp,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_i915_gem_object *obj;
|
||||
|
||||
obj = i915_gem_object_lookup(filp, mode_cmd->handles[0]);
|
||||
if (!obj)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
/* object is backed with LMEM for discrete */
|
||||
if (HAS_LMEM(i915) && !i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM_0)) {
|
||||
/* object is "remote", not in local memory */
|
||||
i915_gem_object_put(obj);
|
||||
drm_dbg_kms(&i915->drm, "framebuffer must reside in local memory\n");
|
||||
return ERR_PTR(-EREMOTE);
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_FB_BO_H__
|
||||
#define __INTEL_FB_BO_H__
|
||||
|
||||
struct drm_file;
|
||||
struct drm_mode_fb_cmd2;
|
||||
struct drm_i915_gem_object;
|
||||
struct drm_i915_private;
|
||||
struct intel_framebuffer;
|
||||
|
||||
void intel_fb_bo_framebuffer_fini(struct drm_i915_gem_object *obj);
|
||||
|
||||
int intel_fb_bo_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
struct drm_i915_gem_object *obj,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
struct drm_i915_gem_object *
|
||||
intel_fb_bo_lookup_valid_bo(struct drm_i915_private *i915,
|
||||
struct drm_file *filp,
|
||||
const struct drm_mode_fb_cmd2 *user_mode_cmd);
|
||||
|
||||
#endif
|
||||
@@ -1235,7 +1235,7 @@ static int intel_fbc_check_plane(struct intel_atomic_state *state,
|
||||
* Recommendation is to keep this combination disabled
|
||||
* Bspec: 50422 HSD: 14010260002
|
||||
*/
|
||||
if (DISPLAY_VER(i915) >= 12 && crtc_state->has_psr2) {
|
||||
if (IS_DISPLAY_VER(i915, 12, 14) && crtc_state->has_psr2) {
|
||||
plane_state->no_fbc_reason = "PSR2 enabled";
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
#include <drm/drm_fourcc.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
#include "gem/i915_gem_mman.h"
|
||||
|
||||
#include "i915_drv.h"
|
||||
@@ -51,6 +50,7 @@
|
||||
#include "intel_fb.h"
|
||||
#include "intel_fb_pin.h"
|
||||
#include "intel_fbdev.h"
|
||||
#include "intel_fbdev_fb.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
|
||||
struct intel_fbdev {
|
||||
@@ -146,65 +146,6 @@ static const struct fb_ops intelfb_ops = {
|
||||
.fb_mmap = intel_fbdev_mmap,
|
||||
};
|
||||
|
||||
static int intelfb_alloc(struct drm_fb_helper *helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct intel_fbdev *ifbdev = to_intel_fbdev(helper);
|
||||
struct drm_framebuffer *fb;
|
||||
struct drm_device *dev = helper->dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct drm_mode_fb_cmd2 mode_cmd = {};
|
||||
struct drm_i915_gem_object *obj;
|
||||
int size;
|
||||
|
||||
/* we don't do packed 24bpp */
|
||||
if (sizes->surface_bpp == 24)
|
||||
sizes->surface_bpp = 32;
|
||||
|
||||
mode_cmd.width = sizes->surface_width;
|
||||
mode_cmd.height = sizes->surface_height;
|
||||
|
||||
mode_cmd.pitches[0] = ALIGN(mode_cmd.width *
|
||||
DIV_ROUND_UP(sizes->surface_bpp, 8), 64);
|
||||
mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
|
||||
sizes->surface_depth);
|
||||
|
||||
size = mode_cmd.pitches[0] * mode_cmd.height;
|
||||
size = PAGE_ALIGN(size);
|
||||
|
||||
obj = ERR_PTR(-ENODEV);
|
||||
if (HAS_LMEM(dev_priv)) {
|
||||
obj = i915_gem_object_create_lmem(dev_priv, size,
|
||||
I915_BO_ALLOC_CONTIGUOUS |
|
||||
I915_BO_ALLOC_USER);
|
||||
} else {
|
||||
/*
|
||||
* If the FB is too big, just don't use it since fbdev is not very
|
||||
* important and we should probably use that space with FBC or other
|
||||
* features.
|
||||
*
|
||||
* Also skip stolen on MTL as Wa_22018444074 mitigation.
|
||||
*/
|
||||
if (!(IS_METEORLAKE(dev_priv)) && size * 2 < dev_priv->dsm.usable_size)
|
||||
obj = i915_gem_object_create_stolen(dev_priv, size);
|
||||
if (IS_ERR(obj))
|
||||
obj = i915_gem_object_create_shmem(dev_priv, size);
|
||||
}
|
||||
|
||||
if (IS_ERR(obj)) {
|
||||
drm_err(&dev_priv->drm, "failed to allocate framebuffer (%pe)\n", obj);
|
||||
return PTR_ERR(obj);
|
||||
}
|
||||
|
||||
fb = intel_framebuffer_create(obj, &mode_cmd);
|
||||
i915_gem_object_put(obj);
|
||||
if (IS_ERR(fb))
|
||||
return PTR_ERR(fb);
|
||||
|
||||
ifbdev->fb = to_intel_framebuffer(fb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intelfb_create(struct drm_fb_helper *helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
@@ -213,7 +154,6 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
struct drm_device *dev = helper->dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
|
||||
struct i915_ggtt *ggtt = to_gt(dev_priv)->ggtt;
|
||||
const struct i915_gtt_view view = {
|
||||
.type = I915_GTT_VIEW_NORMAL,
|
||||
};
|
||||
@@ -222,9 +162,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
struct i915_vma *vma;
|
||||
unsigned long flags = 0;
|
||||
bool prealloc = false;
|
||||
void __iomem *vaddr;
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct i915_gem_ww_ctx ww;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&ifbdev->hpd_lock);
|
||||
@@ -245,12 +183,13 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
intel_fb = ifbdev->fb = NULL;
|
||||
}
|
||||
if (!intel_fb || drm_WARN_ON(dev, !intel_fb_obj(&intel_fb->base))) {
|
||||
struct drm_framebuffer *fb;
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"no BIOS fb, allocating a new one\n");
|
||||
ret = intelfb_alloc(helper, sizes);
|
||||
if (ret)
|
||||
return ret;
|
||||
intel_fb = ifbdev->fb;
|
||||
fb = intel_fbdev_fb_alloc(helper, sizes);
|
||||
if (IS_ERR(fb))
|
||||
return PTR_ERR(fb);
|
||||
intel_fb = ifbdev->fb = to_intel_framebuffer(fb);
|
||||
} else {
|
||||
drm_dbg_kms(&dev_priv->drm, "re-using BIOS fb\n");
|
||||
prealloc = true;
|
||||
@@ -283,49 +222,18 @@ static int intelfb_create(struct drm_fb_helper *helper,
|
||||
info->fbops = &intelfb_ops;
|
||||
|
||||
obj = intel_fb_obj(&intel_fb->base);
|
||||
if (i915_gem_object_is_lmem(obj)) {
|
||||
struct intel_memory_region *mem = obj->mm.region;
|
||||
|
||||
/* Use fbdev's framebuffer from lmem for discrete */
|
||||
info->fix.smem_start =
|
||||
(unsigned long)(mem->io_start +
|
||||
i915_gem_object_get_dma_address(obj, 0));
|
||||
info->fix.smem_len = obj->base.size;
|
||||
} else {
|
||||
/* Our framebuffer is the entirety of fbdev's system memory */
|
||||
info->fix.smem_start =
|
||||
(unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma));
|
||||
info->fix.smem_len = vma->size;
|
||||
}
|
||||
|
||||
for_i915_gem_ww(&ww, ret, false) {
|
||||
ret = i915_gem_object_lock(vma->obj, &ww);
|
||||
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
vaddr = i915_vma_pin_iomap(vma);
|
||||
if (IS_ERR(vaddr)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
ret = intel_fbdev_fb_fill_info(dev_priv, info, obj, vma);
|
||||
if (ret)
|
||||
goto out_unpin;
|
||||
|
||||
info->screen_base = vaddr;
|
||||
info->screen_size = vma->size;
|
||||
|
||||
drm_fb_helper_fill_info(info, &ifbdev->helper, sizes);
|
||||
|
||||
/* If the object is shmemfs backed, it will have given us zeroed pages.
|
||||
* If the object is stolen however, it will be full of whatever
|
||||
* garbage was left in there.
|
||||
*/
|
||||
if (!i915_gem_object_is_shmem(vma->obj) && !prealloc)
|
||||
if (!i915_gem_object_is_shmem(obj) && !prealloc)
|
||||
memset_io(info->screen_base, 0, info->screen_size);
|
||||
|
||||
/* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
|
||||
@@ -424,12 +332,12 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (obj->base.size > max_size) {
|
||||
if (intel_bo_to_drm_bo(obj)->size > max_size) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"found possible fb from [PLANE:%d:%s]\n",
|
||||
plane->base.base.id, plane->base.name);
|
||||
fb = to_intel_framebuffer(plane_state->uapi.fb);
|
||||
max_size = obj->base.size;
|
||||
max_size = intel_bo_to_drm_bo(obj)->size;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2023 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <drm/drm_fb_helper.h>
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_fbdev_fb.h"
|
||||
|
||||
struct drm_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper,
|
||||
struct drm_fb_helper_surface_size *sizes)
|
||||
{
|
||||
struct drm_framebuffer *fb;
|
||||
struct drm_device *dev = helper->dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct drm_mode_fb_cmd2 mode_cmd = {};
|
||||
struct drm_i915_gem_object *obj;
|
||||
int size;
|
||||
|
||||
/* we don't do packed 24bpp */
|
||||
if (sizes->surface_bpp == 24)
|
||||
sizes->surface_bpp = 32;
|
||||
|
||||
mode_cmd.width = sizes->surface_width;
|
||||
mode_cmd.height = sizes->surface_height;
|
||||
|
||||
mode_cmd.pitches[0] = ALIGN(mode_cmd.width *
|
||||
DIV_ROUND_UP(sizes->surface_bpp, 8), 64);
|
||||
mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
|
||||
sizes->surface_depth);
|
||||
|
||||
size = mode_cmd.pitches[0] * mode_cmd.height;
|
||||
size = PAGE_ALIGN(size);
|
||||
|
||||
obj = ERR_PTR(-ENODEV);
|
||||
if (HAS_LMEM(dev_priv)) {
|
||||
obj = i915_gem_object_create_lmem(dev_priv, size,
|
||||
I915_BO_ALLOC_CONTIGUOUS |
|
||||
I915_BO_ALLOC_USER);
|
||||
} else {
|
||||
/*
|
||||
* If the FB is too big, just don't use it since fbdev is not very
|
||||
* important and we should probably use that space with FBC or other
|
||||
* features.
|
||||
*
|
||||
* Also skip stolen on MTL as Wa_22018444074 mitigation.
|
||||
*/
|
||||
if (!(IS_METEORLAKE(dev_priv)) && size * 2 < dev_priv->dsm.usable_size)
|
||||
obj = i915_gem_object_create_stolen(dev_priv, size);
|
||||
if (IS_ERR(obj))
|
||||
obj = i915_gem_object_create_shmem(dev_priv, size);
|
||||
}
|
||||
|
||||
if (IS_ERR(obj)) {
|
||||
drm_err(&dev_priv->drm, "failed to allocate framebuffer (%pe)\n", obj);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
fb = intel_framebuffer_create(obj, &mode_cmd);
|
||||
i915_gem_object_put(obj);
|
||||
|
||||
return fb;
|
||||
}
|
||||
|
||||
int intel_fbdev_fb_fill_info(struct drm_i915_private *i915, struct fb_info *info,
|
||||
struct drm_i915_gem_object *obj, struct i915_vma *vma)
|
||||
{
|
||||
struct i915_gem_ww_ctx ww;
|
||||
void __iomem *vaddr;
|
||||
int ret;
|
||||
|
||||
if (i915_gem_object_is_lmem(obj)) {
|
||||
struct intel_memory_region *mem = obj->mm.region;
|
||||
|
||||
/* Use fbdev's framebuffer from lmem for discrete */
|
||||
info->fix.smem_start =
|
||||
(unsigned long)(mem->io_start +
|
||||
i915_gem_object_get_dma_address(obj, 0));
|
||||
info->fix.smem_len = obj->base.size;
|
||||
} else {
|
||||
struct i915_ggtt *ggtt = to_gt(i915)->ggtt;
|
||||
|
||||
/* Our framebuffer is the entirety of fbdev's system memory */
|
||||
info->fix.smem_start =
|
||||
(unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma));
|
||||
info->fix.smem_len = vma->size;
|
||||
}
|
||||
|
||||
for_i915_gem_ww(&ww, ret, false) {
|
||||
ret = i915_gem_object_lock(vma->obj, &ww);
|
||||
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
vaddr = i915_vma_pin_iomap(vma);
|
||||
if (IS_ERR(vaddr)) {
|
||||
drm_err(&i915->drm,
|
||||
"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
info->screen_base = vaddr;
|
||||
info->screen_size = intel_bo_to_drm_bo(obj)->size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2023 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_FBDEV_FB_H__
|
||||
#define __INTEL_FBDEV_FB_H__
|
||||
|
||||
struct drm_fb_helper;
|
||||
struct drm_fb_helper_surface_size;
|
||||
struct drm_i915_gem_object;
|
||||
struct drm_i915_private;
|
||||
struct fb_info;
|
||||
struct i915_vma;
|
||||
|
||||
struct drm_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper,
|
||||
struct drm_fb_helper_surface_size *sizes);
|
||||
int intel_fbdev_fb_fill_info(struct drm_i915_private *i915, struct fb_info *info,
|
||||
struct drm_i915_gem_object *obj, struct i915_vma *vma);
|
||||
|
||||
#endif
|
||||
@@ -1983,6 +1983,10 @@ intel_hdmi_mode_valid(struct drm_connector *connector,
|
||||
bool ycbcr_420_only;
|
||||
enum intel_output_format sink_format;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(dev_priv, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
|
||||
clock *= 2;
|
||||
|
||||
|
||||
@@ -185,7 +185,7 @@ static void intel_lvds_pps_get_hw_state(struct drm_i915_private *dev_priv,
|
||||
/* Convert from 100ms to 100us units */
|
||||
pps->t4 = val * 1000;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) <= 4 &&
|
||||
if (DISPLAY_VER(dev_priv) < 5 &&
|
||||
pps->t1_t2 == 0 && pps->t5 == 0 && pps->t3 == 0 && pps->tx == 0) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Panel power timings uninitialized, "
|
||||
@@ -389,11 +389,16 @@ intel_lvds_mode_valid(struct drm_connector *_connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(_connector);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
const struct drm_display_mode *fixed_mode =
|
||||
intel_panel_fixed_mode(connector, mode);
|
||||
int max_pixclk = to_i915(connector->base.dev)->max_dotclk_freq;
|
||||
enum drm_mode_status status;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(i915, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
return MODE_NO_DBLESCAN;
|
||||
|
||||
|
||||
@@ -806,10 +806,10 @@ static void hsw_activate_psr2(struct intel_dp *intel_dp)
|
||||
|
||||
val |= EDP_PSR2_IDLE_FRAMES(psr_compute_idle_frames(intel_dp));
|
||||
|
||||
if (DISPLAY_VER(dev_priv) <= 13 && !IS_ALDERLAKE_P(dev_priv))
|
||||
if (DISPLAY_VER(dev_priv) < 14 && !IS_ALDERLAKE_P(dev_priv))
|
||||
val |= EDP_SU_TRACK_ENABLE;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 10 && DISPLAY_VER(dev_priv) <= 12)
|
||||
if (DISPLAY_VER(dev_priv) >= 10 && DISPLAY_VER(dev_priv) < 13)
|
||||
val |= EDP_Y_COORDINATE_ENABLE;
|
||||
|
||||
val |= EDP_PSR2_FRAME_BEFORE_SU(frames_before_su_entry(intel_dp));
|
||||
@@ -1094,7 +1094,7 @@ static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_d
|
||||
return true;
|
||||
|
||||
/* Not supported <13 / Wa_22012279113:adl-p */
|
||||
if (DISPLAY_VER(dev_priv) <= 13 || intel_dp->edp_dpcd[0] < DP_EDP_14b)
|
||||
if (DISPLAY_VER(dev_priv) < 14 || intel_dp->edp_dpcd[0] < DP_EDP_14b)
|
||||
return false;
|
||||
|
||||
crtc_state->req_psr2_sdp_prior_scanline = true;
|
||||
@@ -1221,7 +1221,7 @@ static bool intel_psr2_config_valid(struct intel_dp *intel_dp,
|
||||
* over PSR2.
|
||||
*/
|
||||
if (crtc_state->dsc.compression_enable &&
|
||||
(DISPLAY_VER(dev_priv) <= 13 && !IS_ALDERLAKE_P(dev_priv))) {
|
||||
(DISPLAY_VER(dev_priv) < 14 && !IS_ALDERLAKE_P(dev_priv))) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"PSR2 cannot be enabled since DSC is enabled\n");
|
||||
return false;
|
||||
@@ -1917,81 +1917,6 @@ static void psr_force_hw_tracking_exit(struct intel_dp *intel_dp)
|
||||
intel_de_write(dev_priv, CURSURFLIVE(intel_dp->psr.pipe), 0);
|
||||
}
|
||||
|
||||
void intel_psr2_disable_plane_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_CTL(pipe, plane->id), 0);
|
||||
}
|
||||
|
||||
void intel_psr2_program_plane_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
if (plane->id == PLANE_CURSOR)
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane->id),
|
||||
plane_state->ctl);
|
||||
else
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane->id),
|
||||
PLANE_SEL_FETCH_CTL_ENABLE);
|
||||
}
|
||||
|
||||
void intel_psr2_program_plane_sel_fetch_noarm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state,
|
||||
int color_plane)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
const struct drm_rect *clip;
|
||||
u32 val;
|
||||
int x, y;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
if (plane->id == PLANE_CURSOR)
|
||||
return;
|
||||
|
||||
clip = &plane_state->psr2_sel_fetch_area;
|
||||
|
||||
val = (clip->y1 + plane_state->uapi.dst.y1) << 16;
|
||||
val |= plane_state->uapi.dst.x1;
|
||||
intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_POS(pipe, plane->id), val);
|
||||
|
||||
x = plane_state->view.color_plane[color_plane].x;
|
||||
|
||||
/*
|
||||
* From Bspec: UV surface Start Y Position = half of Y plane Y
|
||||
* start position.
|
||||
*/
|
||||
if (!color_plane)
|
||||
y = plane_state->view.color_plane[color_plane].y + clip->y1;
|
||||
else
|
||||
y = plane_state->view.color_plane[color_plane].y + clip->y1 / 2;
|
||||
|
||||
val = y << 16 | x;
|
||||
|
||||
intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_OFFSET(pipe, plane->id),
|
||||
val);
|
||||
|
||||
/* Sizes are 0 based */
|
||||
val = (drm_rect_height(clip) - 1) << 16;
|
||||
val |= (drm_rect_width(&plane_state->uapi.src) >> 16) - 1;
|
||||
intel_de_write_fw(dev_priv, PLANE_SEL_FETCH_SIZE(pipe, plane->id), val);
|
||||
}
|
||||
|
||||
void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
|
||||
@@ -2251,8 +2176,19 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
|
||||
continue;
|
||||
|
||||
inter = pipe_clip;
|
||||
if (!drm_rect_intersect(&inter, &new_plane_state->uapi.dst))
|
||||
sel_fetch_area = &new_plane_state->psr2_sel_fetch_area;
|
||||
if (!drm_rect_intersect(&inter, &new_plane_state->uapi.dst)) {
|
||||
sel_fetch_area->y1 = -1;
|
||||
sel_fetch_area->y2 = -1;
|
||||
/*
|
||||
* if plane sel fetch was previously enabled ->
|
||||
* disable it
|
||||
*/
|
||||
if (drm_rect_height(&old_plane_state->psr2_sel_fetch_area) > 0)
|
||||
crtc_state->update_planes |= BIT(plane->id);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!psr2_sel_fetch_plane_state_supported(new_plane_state)) {
|
||||
full_update = true;
|
||||
|
||||
@@ -55,16 +55,6 @@ bool intel_psr_enabled(struct intel_dp *intel_dp);
|
||||
int intel_psr2_sel_fetch_update(struct intel_atomic_state *state,
|
||||
struct intel_crtc *crtc);
|
||||
void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_state);
|
||||
void intel_psr2_program_plane_sel_fetch_noarm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state,
|
||||
int color_plane);
|
||||
void intel_psr2_program_plane_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state);
|
||||
|
||||
void intel_psr2_disable_plane_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state);
|
||||
void intel_psr_pause(struct intel_dp *intel_dp);
|
||||
void intel_psr_resume(struct intel_dp *intel_dp);
|
||||
|
||||
|
||||
@@ -1931,13 +1931,19 @@ static enum drm_mode_status
|
||||
intel_sdvo_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->dev);
|
||||
struct intel_sdvo *intel_sdvo = intel_attached_sdvo(to_intel_connector(connector));
|
||||
struct intel_sdvo_connector *intel_sdvo_connector =
|
||||
to_intel_sdvo_connector(connector);
|
||||
int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
|
||||
bool has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo_connector, connector->state);
|
||||
int max_dotclk = i915->max_dotclk_freq;
|
||||
enum drm_mode_status status;
|
||||
int clock = mode->clock;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(i915, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
return MODE_NO_DBLESCAN;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Copyright © 2019 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/util_macros.h>
|
||||
#include <linux/math.h>
|
||||
|
||||
#include "i915_reg.h"
|
||||
#include "intel_ddi.h"
|
||||
|
||||
@@ -958,8 +958,14 @@ static enum drm_mode_status
|
||||
intel_tv_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->dev);
|
||||
const struct tv_mode *tv_mode = intel_tv_mode_find(connector->state);
|
||||
int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
|
||||
int max_dotclk = i915->max_dotclk_freq;
|
||||
enum drm_mode_status status;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(i915, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
|
||||
if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
|
||||
return MODE_NO_DBLESCAN;
|
||||
|
||||
@@ -265,6 +265,32 @@ int intel_crtc_scanline_to_hw(struct intel_crtc *crtc, int scanline)
|
||||
return (scanline + vtotal - crtc->scanline_offset) % vtotal;
|
||||
}
|
||||
|
||||
/*
|
||||
* The uncore version of the spin lock functions is used to decide
|
||||
* whether we need to lock the uncore lock or not. This is only
|
||||
* needed in i915, not in Xe.
|
||||
*
|
||||
* This lock in i915 is needed because some old platforms (at least
|
||||
* IVB and possibly HSW as well), which are not supported in Xe, need
|
||||
* all register accesses to the same cacheline to be serialized,
|
||||
* otherwise they may hang.
|
||||
*/
|
||||
static void intel_vblank_section_enter(struct drm_i915_private *i915)
|
||||
__acquires(i915->uncore.lock)
|
||||
{
|
||||
#ifdef I915
|
||||
spin_lock(&i915->uncore.lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void intel_vblank_section_exit(struct drm_i915_private *i915)
|
||||
__releases(i915->uncore.lock)
|
||||
{
|
||||
#ifdef I915
|
||||
spin_unlock(&i915->uncore.lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
|
||||
bool in_vblank_irq,
|
||||
int *vpos, int *hpos,
|
||||
@@ -302,11 +328,12 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock uncore.lock, as we will do multiple timing critical raw
|
||||
* register reads, potentially with preemption disabled, so the
|
||||
* following code must not block on uncore.lock.
|
||||
* Enter vblank critical section, as we will do multiple
|
||||
* timing critical raw register reads, potentially with
|
||||
* preemption disabled, so the following code must not block.
|
||||
*/
|
||||
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
|
||||
local_irq_save(irqflags);
|
||||
intel_vblank_section_enter(dev_priv);
|
||||
|
||||
/* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
|
||||
|
||||
@@ -374,7 +401,8 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
|
||||
|
||||
/* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
|
||||
|
||||
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
|
||||
intel_vblank_section_exit(dev_priv);
|
||||
local_irq_restore(irqflags);
|
||||
|
||||
/*
|
||||
* While in vblank, position will be negative
|
||||
@@ -412,9 +440,13 @@ int intel_get_crtc_scanline(struct intel_crtc *crtc)
|
||||
unsigned long irqflags;
|
||||
int position;
|
||||
|
||||
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
|
||||
local_irq_save(irqflags);
|
||||
intel_vblank_section_enter(dev_priv);
|
||||
|
||||
position = __intel_get_crtc_scanline(crtc);
|
||||
spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
|
||||
|
||||
intel_vblank_section_exit(dev_priv);
|
||||
local_irq_restore(irqflags);
|
||||
|
||||
return position;
|
||||
}
|
||||
@@ -537,7 +569,7 @@ void intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state,
|
||||
* Need to audit everything to make sure it's safe.
|
||||
*/
|
||||
spin_lock_irqsave(&i915->drm.vblank_time_lock, irqflags);
|
||||
spin_lock(&i915->uncore.lock);
|
||||
intel_vblank_section_enter(i915);
|
||||
|
||||
drm_calc_timestamping_constants(&crtc->base, &adjusted_mode);
|
||||
|
||||
@@ -546,7 +578,6 @@ void intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state,
|
||||
crtc->mode_flags = mode_flags;
|
||||
|
||||
crtc->scanline_offset = intel_crtc_scanline_offset(crtc_state);
|
||||
|
||||
spin_unlock(&i915->uncore.lock);
|
||||
intel_vblank_section_exit(i915);
|
||||
spin_unlock_irqrestore(&i915->drm.vblank_time_lock, irqflags);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "intel_fbc.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
#include "intel_psr.h"
|
||||
#include "intel_psr_regs.h"
|
||||
#include "skl_scaler.h"
|
||||
#include "skl_universal_plane.h"
|
||||
#include "skl_watermark.h"
|
||||
@@ -629,6 +630,18 @@ skl_plane_disable_arm(struct intel_plane *plane,
|
||||
intel_de_write_fw(dev_priv, PLANE_SURF(pipe, plane_id), 0);
|
||||
}
|
||||
|
||||
static void icl_plane_disable_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane->id), 0);
|
||||
}
|
||||
|
||||
static void
|
||||
icl_plane_disable_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
@@ -642,7 +655,7 @@ icl_plane_disable_arm(struct intel_plane *plane,
|
||||
|
||||
skl_write_plane_wm(plane, crtc_state);
|
||||
|
||||
intel_psr2_disable_plane_sel_fetch_arm(plane, crtc_state);
|
||||
icl_plane_disable_sel_fetch_arm(plane, crtc_state);
|
||||
intel_de_write_fw(dev_priv, PLANE_CTL(pipe, plane_id), 0);
|
||||
intel_de_write_fw(dev_priv, PLANE_SURF(pipe, plane_id), 0);
|
||||
}
|
||||
@@ -1197,6 +1210,48 @@ skl_plane_update_arm(struct intel_plane *plane,
|
||||
skl_plane_surf(plane_state, 0));
|
||||
}
|
||||
|
||||
static void icl_plane_update_sel_fetch_noarm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state,
|
||||
int color_plane)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
const struct drm_rect *clip;
|
||||
u32 val;
|
||||
int x, y;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
clip = &plane_state->psr2_sel_fetch_area;
|
||||
|
||||
val = (clip->y1 + plane_state->uapi.dst.y1) << 16;
|
||||
val |= plane_state->uapi.dst.x1;
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_POS(pipe, plane->id), val);
|
||||
|
||||
x = plane_state->view.color_plane[color_plane].x;
|
||||
|
||||
/*
|
||||
* From Bspec: UV surface Start Y Position = half of Y plane Y
|
||||
* start position.
|
||||
*/
|
||||
if (!color_plane)
|
||||
y = plane_state->view.color_plane[color_plane].y + clip->y1;
|
||||
else
|
||||
y = plane_state->view.color_plane[color_plane].y + clip->y1 / 2;
|
||||
|
||||
val = y << 16 | x;
|
||||
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_OFFSET(pipe, plane->id),
|
||||
val);
|
||||
|
||||
/* Sizes are 0 based */
|
||||
val = (drm_rect_height(clip) - 1) << 16;
|
||||
val |= (drm_rect_width(&plane_state->uapi.src) >> 16) - 1;
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_SIZE(pipe, plane->id), val);
|
||||
}
|
||||
|
||||
static void
|
||||
icl_plane_update_noarm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
@@ -1269,7 +1324,24 @@ icl_plane_update_noarm(struct intel_plane *plane,
|
||||
if (plane_state->force_black)
|
||||
icl_plane_csc_load_black(plane);
|
||||
|
||||
intel_psr2_program_plane_sel_fetch_noarm(plane, crtc_state, plane_state, color_plane);
|
||||
icl_plane_update_sel_fetch_noarm(plane, crtc_state, plane_state, color_plane);
|
||||
}
|
||||
|
||||
static void icl_plane_update_sel_fetch_arm(struct intel_plane *plane,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct intel_plane_state *plane_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(plane->base.dev);
|
||||
enum pipe pipe = plane->pipe;
|
||||
|
||||
if (!crtc_state->enable_psr2_sel_fetch)
|
||||
return;
|
||||
|
||||
if (drm_rect_height(&plane_state->psr2_sel_fetch_area) > 0)
|
||||
intel_de_write_fw(i915, PLANE_SEL_FETCH_CTL(pipe, plane->id),
|
||||
PLANE_SEL_FETCH_CTL_ENABLE);
|
||||
else
|
||||
icl_plane_disable_sel_fetch_arm(plane, crtc_state);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1296,7 +1368,7 @@ icl_plane_update_arm(struct intel_plane *plane,
|
||||
if (plane_state->scaler_id >= 0)
|
||||
skl_program_plane_scaler(plane, crtc_state, plane_state);
|
||||
|
||||
intel_psr2_program_plane_sel_fetch_arm(plane, crtc_state, plane_state);
|
||||
icl_plane_update_sel_fetch_arm(plane, crtc_state, plane_state);
|
||||
|
||||
/*
|
||||
* The control register self-arms if the plane was previously
|
||||
|
||||
@@ -1532,21 +1532,29 @@ static void intel_dsi_unprepare(struct intel_encoder *encoder)
|
||||
}
|
||||
}
|
||||
|
||||
static void intel_dsi_encoder_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder));
|
||||
|
||||
intel_dsi_vbt_gpio_cleanup(intel_dsi);
|
||||
intel_encoder_destroy(encoder);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_funcs intel_dsi_funcs = {
|
||||
.destroy = intel_dsi_encoder_destroy,
|
||||
.destroy = intel_encoder_destroy,
|
||||
};
|
||||
|
||||
static enum drm_mode_status vlv_dsi_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->dev);
|
||||
|
||||
if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915)) {
|
||||
enum drm_mode_status status;
|
||||
|
||||
status = intel_cpu_transcoder_mode_valid(i915, mode);
|
||||
if (status != MODE_OK)
|
||||
return status;
|
||||
}
|
||||
|
||||
return intel_dsi_mode_valid(connector, mode);
|
||||
}
|
||||
|
||||
static const struct drm_connector_helper_funcs intel_dsi_connector_helper_funcs = {
|
||||
.get_modes = intel_dsi_get_modes,
|
||||
.mode_valid = intel_dsi_mode_valid,
|
||||
.mode_valid = vlv_dsi_mode_valid,
|
||||
.atomic_check = intel_digital_connector_atomic_check,
|
||||
};
|
||||
|
||||
|
||||
@@ -50,6 +50,11 @@
|
||||
* present for a given platform.
|
||||
*/
|
||||
|
||||
static struct drm_i915_private *rpm_to_i915(struct intel_runtime_pm *rpm)
|
||||
{
|
||||
return container_of(rpm, struct drm_i915_private, runtime_pm);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM)
|
||||
|
||||
#include <linux/sort.h>
|
||||
@@ -349,9 +354,7 @@ intel_runtime_pm_release(struct intel_runtime_pm *rpm, int wakelock)
|
||||
static intel_wakeref_t __intel_runtime_pm_get(struct intel_runtime_pm *rpm,
|
||||
bool wakelock)
|
||||
{
|
||||
struct drm_i915_private *i915 = container_of(rpm,
|
||||
struct drm_i915_private,
|
||||
runtime_pm);
|
||||
struct drm_i915_private *i915 = rpm_to_i915(rpm);
|
||||
int ret;
|
||||
|
||||
ret = pm_runtime_get_sync(rpm->kdev);
|
||||
@@ -556,9 +559,7 @@ void intel_runtime_pm_put(struct intel_runtime_pm *rpm, intel_wakeref_t wref)
|
||||
*/
|
||||
void intel_runtime_pm_enable(struct intel_runtime_pm *rpm)
|
||||
{
|
||||
struct drm_i915_private *i915 = container_of(rpm,
|
||||
struct drm_i915_private,
|
||||
runtime_pm);
|
||||
struct drm_i915_private *i915 = rpm_to_i915(rpm);
|
||||
struct device *kdev = rpm->kdev;
|
||||
|
||||
/*
|
||||
@@ -611,9 +612,7 @@ void intel_runtime_pm_enable(struct intel_runtime_pm *rpm)
|
||||
|
||||
void intel_runtime_pm_disable(struct intel_runtime_pm *rpm)
|
||||
{
|
||||
struct drm_i915_private *i915 = container_of(rpm,
|
||||
struct drm_i915_private,
|
||||
runtime_pm);
|
||||
struct drm_i915_private *i915 = rpm_to_i915(rpm);
|
||||
struct device *kdev = rpm->kdev;
|
||||
|
||||
/* Transfer rpm ownership back to core */
|
||||
@@ -628,9 +627,7 @@ void intel_runtime_pm_disable(struct intel_runtime_pm *rpm)
|
||||
|
||||
void intel_runtime_pm_driver_release(struct intel_runtime_pm *rpm)
|
||||
{
|
||||
struct drm_i915_private *i915 = container_of(rpm,
|
||||
struct drm_i915_private,
|
||||
runtime_pm);
|
||||
struct drm_i915_private *i915 = rpm_to_i915(rpm);
|
||||
int count = atomic_read(&rpm->wakeref_count);
|
||||
|
||||
intel_wakeref_auto_fini(&rpm->userfault_wakeref);
|
||||
@@ -645,8 +642,7 @@ void intel_runtime_pm_driver_release(struct intel_runtime_pm *rpm)
|
||||
|
||||
void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm)
|
||||
{
|
||||
struct drm_i915_private *i915 =
|
||||
container_of(rpm, struct drm_i915_private, runtime_pm);
|
||||
struct drm_i915_private *i915 = rpm_to_i915(rpm);
|
||||
struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
|
||||
struct device *kdev = &pdev->dev;
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ __sync_print(struct i915_syncmap *p,
|
||||
for_each_set_bit(i, (unsigned long *)&p->bitmap, KSYNCMAP) {
|
||||
buf = __sync_print(__sync_child(p)[i], buf, sz,
|
||||
depth + 1,
|
||||
last << 1 | !!(p->bitmap >> (i + 1)),
|
||||
last << 1 | ((p->bitmap >> (i + 1)) ? 1 : 0),
|
||||
i);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user