mirror of
https://github.com/torvalds/linux.git
synced 2026-04-24 01:25:49 -04:00
drm/i915 feature pull for v6.15: Features and functionality: - Enable DP 128b/132b SST DSC (Jani, Imre) - Allow DSB to perform commits when VRR is enabled (Ville) - Compute HDMI PLLs for SNPS/C10 PHYs for rates not in fixed tables (Ankit) - Allow DSB usage when PSR is enabled on LNL+ (Jouni) - Enable Panel Replay mode change without full modeset (Jouni) - Enable async flips with compressed buffers on ICL+ (Ville) - Support luminance based brightness control via DPCD for eDP (Suraj) - Enable VRR enable/disable without full modeset (Mitul, Ankit) - Add debugfs facility for force testing HDCP 1.4 (Suraj) - Add scaler tracepoints, improve plane tracepoints (Ville) - Improve DMC wakelock debugging facilities (Gustavo) - Allow GuC SLPC default strategies on MTL+ for performance (Rodrigo) - Provide more information on display faults (Ville) Refactoring and cleanups: - Continue conversions to struct intel_display (Ville, Jani, Suraj, Imre) - Joiner and Y plane reorganization (Ville) - Move HDCP debugfs to intel_hdcp.c (Jani) - Clean up and unify LSPCON interfaces (Jani) - Move code out of intel_display.c to reduce its size (Ville) - Clean up and simplify DDI port enabling/disabling (Imre) - Make LPT LP a dedicated PCH type, refactor (Jani) - Simplify DSC range BPG offset calculation (Ankit) - Scaler cleanups (Ville) - Remove unused code from GVT (David Alan Gilbert) - Improve plane debugging (Ville) - DSB and VRR refactoring (Ville) Fixes: - Check if vblank is sufficient for DSC prefill and scaler (Mitul) - Fix Mesa clear color alignment regression (Ville) - Add missing TC DP PHY lane stagger delay (Imre) - Fix DSB + VRR usage for PTL+ (Ville) - Improve robustness of display VT-d workarounds (Ville) - Fix platforms for dbuf tracker state service programming (Ravi) - Fix DMC wakelock support conditions (Gustavo) - Amend DMC wakelock register ranges (Gustavo) - Disable the Common Primary Timing Generator (CMTG) (Gustavo) - Enable C20 PHY SSC (Suraj) - Add workaround for DKL PHY DP mode write (Nemesa) - Fix build warnings on clamp() usage (Guenter Roeck, Ankit) - Fix error handling while adding a connector (Imre) - Avoid full modeset at probe on vblank delay mismatches (Ville) - Fix encoder HDMI check for HDCP line rekeying (Suraj) - Fix HDCP repeater authentication during topology change (Suraj) - Handle display PHY power state reset for power savings (Mika) - Fix typos all over the place (Nitin) - Update HDMI TMDS C20 parameters for various platforms (Dnyaneshwar) - Guarantee a minimum hblank time for 128b/132b and 8b/10b MST (Arun, Imre) - Do not hardcode LSPCON settle timeout (Giedrius Statkevičius) Xe driver changes: - Re-use display vmas when possible (Maarten) - Remove double pageflip (Maarten) - Enable DP tunneling (Imre) - Separate i915 and xe tracepoints (Ville) DRM core changes: - Increase DPCD eDP display control CAP size to 5 bytes (Suraj) - Add DPCD eDP version 1.5 definition (Suraj) - Add timeout parameter to drm_lspcon_set_mode() (Giedrius Statkevičius) Merges: - Backmerge drm-next (Jani) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/87h64j7b7n.fsf@intel.com
132 lines
3.3 KiB
C
132 lines
3.3 KiB
C
// SPDX-License-Identifier: MIT
|
|
/*
|
|
* Copyright © 2018 Intel Corporation
|
|
*/
|
|
|
|
#include <drm/drm_mipi_dsi.h>
|
|
|
|
#include "i915_drv.h"
|
|
#include "intel_dsi.h"
|
|
#include "intel_panel.h"
|
|
|
|
void intel_dsi_wait_panel_power_cycle(struct intel_dsi *intel_dsi)
|
|
{
|
|
ktime_t panel_power_on_time;
|
|
s64 panel_power_off_duration;
|
|
|
|
panel_power_on_time = ktime_get_boottime();
|
|
panel_power_off_duration = ktime_ms_delta(panel_power_on_time,
|
|
intel_dsi->panel_power_off_time);
|
|
|
|
if (panel_power_off_duration < (s64)intel_dsi->panel_pwr_cycle_delay)
|
|
msleep(intel_dsi->panel_pwr_cycle_delay - panel_power_off_duration);
|
|
}
|
|
|
|
void intel_dsi_shutdown(struct intel_encoder *encoder)
|
|
{
|
|
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
|
|
|
|
intel_dsi_wait_panel_power_cycle(intel_dsi);
|
|
}
|
|
|
|
int intel_dsi_bitrate(const struct intel_dsi *intel_dsi)
|
|
{
|
|
int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
|
|
|
|
if (WARN_ON(bpp < 0))
|
|
bpp = 16;
|
|
|
|
return intel_dsi->pclk * bpp / intel_dsi->lane_count;
|
|
}
|
|
|
|
int intel_dsi_tlpx_ns(const struct intel_dsi *intel_dsi)
|
|
{
|
|
switch (intel_dsi->escape_clk_div) {
|
|
default:
|
|
case 0:
|
|
return 50;
|
|
case 1:
|
|
return 100;
|
|
case 2:
|
|
return 200;
|
|
}
|
|
}
|
|
|
|
int intel_dsi_get_modes(struct drm_connector *connector)
|
|
{
|
|
return intel_panel_get_modes(to_intel_connector(connector));
|
|
}
|
|
|
|
enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector,
|
|
const struct drm_display_mode *mode)
|
|
{
|
|
struct intel_display *display = to_intel_display(connector->dev);
|
|
struct intel_connector *intel_connector = to_intel_connector(connector);
|
|
const struct drm_display_mode *fixed_mode =
|
|
intel_panel_fixed_mode(intel_connector, mode);
|
|
int max_dotclk = display->cdclk.max_dotclk_freq;
|
|
enum drm_mode_status status;
|
|
|
|
drm_dbg_kms(display->drm, "\n");
|
|
|
|
status = intel_panel_mode_valid(intel_connector, mode);
|
|
if (status != MODE_OK)
|
|
return status;
|
|
|
|
if (fixed_mode->clock > max_dotclk)
|
|
return MODE_CLOCK_HIGH;
|
|
|
|
return intel_mode_valid_max_plane_size(display, mode, 1);
|
|
}
|
|
|
|
struct intel_dsi_host *intel_dsi_host_init(struct intel_dsi *intel_dsi,
|
|
const struct mipi_dsi_host_ops *funcs,
|
|
enum port port)
|
|
{
|
|
struct intel_dsi_host *host;
|
|
struct mipi_dsi_device *device;
|
|
|
|
host = kzalloc(sizeof(*host), GFP_KERNEL);
|
|
if (!host)
|
|
return NULL;
|
|
|
|
host->base.ops = funcs;
|
|
host->intel_dsi = intel_dsi;
|
|
host->port = port;
|
|
|
|
/*
|
|
* We should call mipi_dsi_host_register(&host->base) here, but we don't
|
|
* have a host->dev, and we don't have OF stuff either. So just use the
|
|
* dsi framework as a library and hope for the best. Create the dsi
|
|
* devices by ourselves here too. Need to be careful though, because we
|
|
* don't initialize any of the driver model devices here.
|
|
*/
|
|
device = kzalloc(sizeof(*device), GFP_KERNEL);
|
|
if (!device) {
|
|
kfree(host);
|
|
return NULL;
|
|
}
|
|
|
|
device->host = &host->base;
|
|
host->device = device;
|
|
|
|
return host;
|
|
}
|
|
|
|
enum drm_panel_orientation
|
|
intel_dsi_get_panel_orientation(struct intel_connector *connector)
|
|
{
|
|
struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
|
|
enum drm_panel_orientation orientation;
|
|
|
|
orientation = connector->panel.vbt.dsi.orientation;
|
|
if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
|
|
return orientation;
|
|
|
|
orientation = dev_priv->display.vbt.orientation;
|
|
if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
|
|
return orientation;
|
|
|
|
return DRM_MODE_PANEL_ORIENTATION_NORMAL;
|
|
}
|