Commit 4825b61a authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-next-2020-02-25' of git://anongit.freedesktop.org/drm/drm-intel into drm-next

- A backmerge of drm-next solving conflicts on i915/gt/intel_lrc.c
- Clean up shadow batch after I915_EXEC_SECURE
- Drop assertion that active->fence is unchanged

Here goes drm-intel-next-2020-02-25:
- A backmerge of drm-next solving conflicts on i915/gt/intel_lrc.c
- Clean up shadow batch after I915_EXEC_SECURE
- Drop assertion that active->fence is unchanged
drm-intel-next-2020-02-24-1:
- RC6 fixes - Chris
- Add extra slice common debug register - Lionel
- Align virtual engines uabi_class/instance with i915_drm.h - Tvrtko
- Avoid potential division by zero in computing CS timestamp - Chris
- Avoid using various globals - Michal Winiarski, Matt Auld
- Break up long lists of GEM object reclaim - Chris
- Check that the vma hasn't been closed before we insert it - Chris
- Consolidate SDVO HDMI force_dvi handling - Ville
- Conversion to new logging and warn macros and functions - Pankaj, Wambul, Chris
- DC3CO fixes - Jose
- Disable use of hwsp_cacheline for kernel_context - Chris
- Display IRQ pre/post uninstall refactor - Jani
- Display port sync refactor for robustness and fixes - Ville, Manasi
- Do not attempt to reprogram IA/ring frequencies for dgfx - Chris
- Drop alpha_support for good in favor of force_probe - Jani
- DSI ACPI related fixes and refactors - Vivek, Jani, Rajat
- Encoder refactor for flexibility to add more information, especiallly DSI related - Jani, Vandita
- Engine workarounds refactor for robustness around resue - Daniele
- FBC simplification and tracepoints
- Various fixes for build - Jani, Kees Cook, Chris, Zhang Xiaoxu
- Fix cmdparser - Chris
- Fix DRM_I915_GEM_MMAP_OFFFSET - Chris
- Fix i915_request flags - Chris
- Fix inconsistency between pfit enable and scaler freeing - Stanislav
- Fix inverted warn_on on display code - Chris
- Fix modeset locks in sanitize_watermarks - Ville
- Fix OA context id overlap with idle context id - Umesh
- Fix pipe and vblank enable for MST - Jani
- Fix VBT handling for timing parameters - Vandita
- Fixes o kernel doc - Chris, Ville
- Force full modeset whenever DSC is enabled at probe - Jani
- Various GEM locking simplification and fixes - Jani , Chris, Jose
  - Including some changes in preparation for making GEM execbuf parallel - Chris
- Gen11 pcode error codes - Matt Roper
- Gen8+ interrupt handler refactor - Chris
- Many fixes and improvements around GuC code - Daniele, Michal Wajdeczko
- i915 parameters improvements sfor flexible input and better debugability - Chris, Jani
- Ice Lake and Elkhart Lake Fixes and workarounds - Matt Roper, Jose, Vivek, Matt Atwood
- Improvements on execlists, requests and other areas, fixing hangs and also
  improving hang detection, recover and debugability - Chris
  - Also introducing offline GT error capture - Chris
- Introduce encoder->compute_config_late() to help MST - Ville
- Make dbuf configuration const - Jani
- Few misc clean ups - Ville, Chris
- Never allow userptr into the new mapping types - Janusz
- Poison rings after use and GTT scratch pages - Chris
- Protect signaler walk with RCU - Chris
- PSR fixes - Jose
- Pull sseu context updates under gt - Chris
- Read rawclk_freq earlier - Chris
- Refactor around VBT handling to allow geting information through the encoder - Jani
- Refactor l3cc/mocs availability - Chris
- Refactor to use intel_connector over drm_connector - Ville
- Remove i915_energy_uJ from debugfs - Tvrtko
- Remove lite restore defines - Mika Kuoppala
- Remove prefault_disable modparam - Chris
- Many selftests fixes and improvements - Chris
- Set intel_dp_set_m_n() for MST slaves - Jose
- Simplify hot plug pin handling and other fixes around pin and polled modes - Ville
- Skip CPU synchronization on dma-buf attachments - chris
- Skip global serialization of clear_range for bxt vtd - Chris
- Skip rmw for marked register - Chris
- Some other GEM Fixes - Chris
- Some small changes for satisfying static code analysis - Colin, Chris
- Suppress warnings for unused debugging locals
- Tiger Lake enabling, including re-enable -f RPS, workarounds and other display fixes and changes - Chris, Matt Roper, Mika Kuoppala, Anshuman, Jose, Radhakrishna, Rafael.
- Track hw reported context runtime - Tvrtko
- Update bug filling URL - Jani
- Use async bind for PIN_USER into bsw/bxt ggtt - Chris
- Use the kernel_context to measuer the breadcrumb size - Chris
- Userptr fixes and robustness for big pages - Matt Auld
- Various Display refactors and clean-ups, specially around logs and use of drm_i915_private - Jani, Ville
- Various display refactors and fixes, especially around cdclk, modeset, and encoder - Chris, Jani
- Various eDP/DP fixes around DPCD - Lyude
- Various fixes and refactors for better Display watermark handling - Ville, Stanislav
- Various other display refactors - Ville
- Various refactor for better handling of display plane states - Ville
- Wean off drm_pci_alloc/drm_pci_free - Chris
- Correctly terminate connector iteration- Ville
- Downgrade gen7 (ivb, byt, hsw) back to aliasing-ppgtt - Chris
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200225185853.GA3282832@intel.com
parents aaa9d265 53e3ca67
...@@ -8416,7 +8416,7 @@ M: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> ...@@ -8416,7 +8416,7 @@ M: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
M: Rodrigo Vivi <rodrigo.vivi@intel.com> M: Rodrigo Vivi <rodrigo.vivi@intel.com>
L: intel-gfx@lists.freedesktop.org L: intel-gfx@lists.freedesktop.org
W: https://01.org/linuxgraphics/ W: https://01.org/linuxgraphics/
B: https://01.org/linuxgraphics/documentation/how-report-bugs B: https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs
C: irc://chat.freenode.net/intel-gfx C: irc://chat.freenode.net/intel-gfx
Q: http://patchwork.freedesktop.org/project/intel-gfx/ Q: http://patchwork.freedesktop.org/project/intel-gfx/
T: git git://anongit.freedesktop.org/drm-intel T: git git://anongit.freedesktop.org/drm-intel
......
...@@ -42,16 +42,9 @@ config DRM_I915 ...@@ -42,16 +42,9 @@ config DRM_I915
If "M" is selected, the module will be called i915. If "M" is selected, the module will be called i915.
config DRM_I915_ALPHA_SUPPORT
bool "Enable alpha quality support for new Intel hardware by default"
depends on DRM_I915
help
This option is deprecated. Use DRM_I915_FORCE_PROBE option instead.
config DRM_I915_FORCE_PROBE config DRM_I915_FORCE_PROBE
string "Force probe driver for selected new Intel hardware" string "Force probe driver for selected new Intel hardware"
depends on DRM_I915 depends on DRM_I915
default "*" if DRM_I915_ALPHA_SUPPORT
help help
This is the default value for the i915.force_probe module This is the default value for the i915.force_probe module
parameter. Using the module parameter overrides this option. parameter. Using the module parameter overrides this option.
...@@ -75,9 +68,8 @@ config DRM_I915_CAPTURE_ERROR ...@@ -75,9 +68,8 @@ config DRM_I915_CAPTURE_ERROR
help help
This option enables capturing the GPU state when a hang is detected. This option enables capturing the GPU state when a hang is detected.
This information is vital for triaging hangs and assists in debugging. This information is vital for triaging hangs and assists in debugging.
Please report any hang to Please report any hang for triaging according to:
https://bugs.freedesktop.org/enter_bug.cgi?product=DRI https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs
for triaging.
If in doubt, say "Y". If in doubt, say "Y".
......
...@@ -46,7 +46,6 @@ i915-y += i915_drv.o \ ...@@ -46,7 +46,6 @@ i915-y += i915_drv.o \
i915_switcheroo.o \ i915_switcheroo.o \
i915_sysfs.o \ i915_sysfs.o \
i915_utils.o \ i915_utils.o \
intel_csr.o \
intel_device_info.o \ intel_device_info.o \
intel_memory_region.o \ intel_memory_region.o \
intel_pch.o \ intel_pch.o \
...@@ -54,7 +53,8 @@ i915-y += i915_drv.o \ ...@@ -54,7 +53,8 @@ i915-y += i915_drv.o \
intel_runtime_pm.o \ intel_runtime_pm.o \
intel_sideband.o \ intel_sideband.o \
intel_uncore.o \ intel_uncore.o \
intel_wakeref.o intel_wakeref.o \
vlv_suspend.o
# core library code # core library code
i915-y += \ i915-y += \
...@@ -66,7 +66,11 @@ i915-y += \ ...@@ -66,7 +66,11 @@ i915-y += \
i915_user_extensions.o i915_user_extensions.o
i915-$(CONFIG_COMPAT) += i915_ioc32.o i915-$(CONFIG_COMPAT) += i915_ioc32.o
i915-$(CONFIG_DEBUG_FS) += i915_debugfs.o display/intel_pipe_crc.o i915-$(CONFIG_DEBUG_FS) += \
i915_debugfs.o \
i915_debugfs_params.o \
display/intel_display_debugfs.o \
display/intel_pipe_crc.o
i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o i915-$(CONFIG_PERF_EVENTS) += i915_pmu.o
# "Graphics Technology" (aka we talk to the gpu) # "Graphics Technology" (aka we talk to the gpu)
...@@ -78,6 +82,7 @@ gt-y += \ ...@@ -78,6 +82,7 @@ gt-y += \
gt/gen8_ppgtt.o \ gt/gen8_ppgtt.o \
gt/intel_breadcrumbs.o \ gt/intel_breadcrumbs.o \
gt/intel_context.o \ gt/intel_context.o \
gt/intel_context_sseu.o \
gt/intel_engine_cs.o \ gt/intel_engine_cs.o \
gt/intel_engine_heartbeat.o \ gt/intel_engine_heartbeat.o \
gt/intel_engine_pm.o \ gt/intel_engine_pm.o \
...@@ -179,6 +184,7 @@ i915-y += \ ...@@ -179,6 +184,7 @@ i915-y += \
display/intel_color.o \ display/intel_color.o \
display/intel_combo_phy.o \ display/intel_combo_phy.o \
display/intel_connector.o \ display/intel_connector.o \
display/intel_csr.o \
display/intel_display.o \ display/intel_display.o \
display/intel_display_power.o \ display/intel_display_power.o \
display/intel_dpio_phy.o \ display/intel_dpio_phy.o \
...@@ -187,6 +193,7 @@ i915-y += \ ...@@ -187,6 +193,7 @@ i915-y += \
display/intel_fbc.o \ display/intel_fbc.o \
display/intel_fifo_underrun.o \ display/intel_fifo_underrun.o \
display/intel_frontbuffer.o \ display/intel_frontbuffer.o \
display/intel_global_state.o \
display/intel_hdcp.o \ display/intel_hdcp.o \
display/intel_hotplug.o \ display/intel_hotplug.o \
display/intel_lpe_audio.o \ display/intel_lpe_audio.o \
...@@ -294,7 +301,7 @@ extra-$(CONFIG_DRM_I915_WERROR) += \ ...@@ -294,7 +301,7 @@ extra-$(CONFIG_DRM_I915_WERROR) += \
$(shell cd $(srctree)/$(src) && find * -name '*.h'))) $(shell cd $(srctree)/$(src) && find * -name '*.h')))
quiet_cmd_hdrtest = HDRTEST $(patsubst %.hdrtest,%.h,$@) quiet_cmd_hdrtest = HDRTEST $(patsubst %.hdrtest,%.h,$@)
cmd_hdrtest = $(CC) $(c_flags) -S -o /dev/null -x c /dev/null -include $<; touch $@ cmd_hdrtest = $(CC) $(filter-out $(CFLAGS_GCOV), $(c_flags)) -S -o /dev/null -x c /dev/null -include $<; touch $@
$(obj)/%.hdrtest: $(src)/%.h FORCE $(obj)/%.hdrtest: $(src)/%.h FORCE
$(call if_changed_dep,hdrtest) $(call if_changed_dep,hdrtest)
This diff is collapsed.
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "i915_drv.h" #include "i915_drv.h"
#include "intel_acpi.h" #include "intel_acpi.h"
#include "intel_display_types.h"
#define INTEL_DSM_REVISION_ID 1 /* For Calpella anyway... */ #define INTEL_DSM_REVISION_ID 1 /* For Calpella anyway... */
#define INTEL_DSM_FN_PLATFORM_MUX_INFO 1 /* No args */ #define INTEL_DSM_FN_PLATFORM_MUX_INFO 1 /* No args */
...@@ -156,3 +157,91 @@ void intel_register_dsm_handler(void) ...@@ -156,3 +157,91 @@ void intel_register_dsm_handler(void)
void intel_unregister_dsm_handler(void) void intel_unregister_dsm_handler(void)
{ {
} }
/*
* ACPI Specification, Revision 5.0, Appendix B.3.2 _DOD (Enumerate All Devices
* Attached to the Display Adapter).
*/
#define ACPI_DISPLAY_INDEX_SHIFT 0
#define ACPI_DISPLAY_INDEX_MASK (0xf << 0)
#define ACPI_DISPLAY_PORT_ATTACHMENT_SHIFT 4
#define ACPI_DISPLAY_PORT_ATTACHMENT_MASK (0xf << 4)
#define ACPI_DISPLAY_TYPE_SHIFT 8
#define ACPI_DISPLAY_TYPE_MASK (0xf << 8)
#define ACPI_DISPLAY_TYPE_OTHER (0 << 8)
#define ACPI_DISPLAY_TYPE_VGA (1 << 8)
#define ACPI_DISPLAY_TYPE_TV (2 << 8)
#define ACPI_DISPLAY_TYPE_EXTERNAL_DIGITAL (3 << 8)
#define ACPI_DISPLAY_TYPE_INTERNAL_DIGITAL (4 << 8)
#define ACPI_VENDOR_SPECIFIC_SHIFT 12
#define ACPI_VENDOR_SPECIFIC_MASK (0xf << 12)
#define ACPI_BIOS_CAN_DETECT (1 << 16)
#define ACPI_DEPENDS_ON_VGA (1 << 17)
#define ACPI_PIPE_ID_SHIFT 18
#define ACPI_PIPE_ID_MASK (7 << 18)
#define ACPI_DEVICE_ID_SCHEME (1ULL << 31)
static u32 acpi_display_type(struct intel_connector *connector)
{
u32 display_type;
switch (connector->base.connector_type) {
case DRM_MODE_CONNECTOR_VGA:
case DRM_MODE_CONNECTOR_DVIA:
display_type = ACPI_DISPLAY_TYPE_VGA;
break;
case DRM_MODE_CONNECTOR_Composite:
case DRM_MODE_CONNECTOR_SVIDEO:
case DRM_MODE_CONNECTOR_Component:
case DRM_MODE_CONNECTOR_9PinDIN:
case DRM_MODE_CONNECTOR_TV:
display_type = ACPI_DISPLAY_TYPE_TV;
break;
case DRM_MODE_CONNECTOR_DVII:
case DRM_MODE_CONNECTOR_DVID:
case DRM_MODE_CONNECTOR_DisplayPort:
case DRM_MODE_CONNECTOR_HDMIA:
case DRM_MODE_CONNECTOR_HDMIB:
display_type = ACPI_DISPLAY_TYPE_EXTERNAL_DIGITAL;
break;
case DRM_MODE_CONNECTOR_LVDS:
case DRM_MODE_CONNECTOR_eDP:
case DRM_MODE_CONNECTOR_DSI:
display_type = ACPI_DISPLAY_TYPE_INTERNAL_DIGITAL;
break;
case DRM_MODE_CONNECTOR_Unknown:
case DRM_MODE_CONNECTOR_VIRTUAL:
display_type = ACPI_DISPLAY_TYPE_OTHER;
break;
default:
MISSING_CASE(connector->base.connector_type);
display_type = ACPI_DISPLAY_TYPE_OTHER;
break;
}
return display_type;
}
void intel_acpi_device_id_update(struct drm_i915_private *dev_priv)
{
struct drm_device *drm_dev = &dev_priv->drm;
struct intel_connector *connector;
struct drm_connector_list_iter conn_iter;
u8 display_index[16] = {};
/* Populate the ACPI IDs for all connectors for a given drm_device */
drm_connector_list_iter_begin(drm_dev, &conn_iter);
for_each_intel_connector_iter(connector, &conn_iter) {
u32 device_id, type;
device_id = acpi_display_type(connector);
/* Use display type specific display index. */
type = (device_id & ACPI_DISPLAY_TYPE_MASK)
>> ACPI_DISPLAY_TYPE_SHIFT;
device_id |= display_index[type]++ << ACPI_DISPLAY_INDEX_SHIFT;
connector->acpi_device_id = device_id;
}
drm_connector_list_iter_end(&conn_iter);
}
...@@ -6,12 +6,17 @@ ...@@ -6,12 +6,17 @@
#ifndef __INTEL_ACPI_H__ #ifndef __INTEL_ACPI_H__
#define __INTEL_ACPI_H__ #define __INTEL_ACPI_H__
struct drm_i915_private;
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
void intel_register_dsm_handler(void); void intel_register_dsm_handler(void);
void intel_unregister_dsm_handler(void); void intel_unregister_dsm_handler(void);
void intel_acpi_device_id_update(struct drm_i915_private *i915);
#else #else
static inline void intel_register_dsm_handler(void) { return; } static inline void intel_register_dsm_handler(void) { return; }
static inline void intel_unregister_dsm_handler(void) { return; } static inline void intel_unregister_dsm_handler(void) { return; }
static inline
void intel_acpi_device_id_update(struct drm_i915_private *i915) { return; }
#endif /* CONFIG_ACPI */ #endif /* CONFIG_ACPI */
#endif /* __INTEL_ACPI_H__ */ #endif /* __INTEL_ACPI_H__ */
...@@ -35,7 +35,9 @@ ...@@ -35,7 +35,9 @@
#include <drm/drm_plane_helper.h> #include <drm/drm_plane_helper.h>
#include "intel_atomic.h" #include "intel_atomic.h"
#include "intel_cdclk.h"
#include "intel_display_types.h" #include "intel_display_types.h"
#include "intel_global_state.h"
#include "intel_hdcp.h" #include "intel_hdcp.h"
#include "intel_psr.h" #include "intel_psr.h"
#include "intel_sprite.h" #include "intel_sprite.h"
...@@ -64,8 +66,9 @@ int intel_digital_connector_atomic_get_property(struct drm_connector *connector, ...@@ -64,8 +66,9 @@ int intel_digital_connector_atomic_get_property(struct drm_connector *connector,
else if (property == dev_priv->broadcast_rgb_property) else if (property == dev_priv->broadcast_rgb_property)
*val = intel_conn_state->broadcast_rgb; *val = intel_conn_state->broadcast_rgb;
else { else {
DRM_DEBUG_ATOMIC("Unknown property [PROP:%d:%s]\n", drm_dbg_atomic(&dev_priv->drm,
property->base.id, property->name); "Unknown property [PROP:%d:%s]\n",
property->base.id, property->name);
return -EINVAL; return -EINVAL;
} }
...@@ -101,8 +104,8 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector, ...@@ -101,8 +104,8 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector,
return 0; return 0;
} }
DRM_DEBUG_ATOMIC("Unknown property [PROP:%d:%s]\n", drm_dbg_atomic(&dev_priv->drm, "Unknown property [PROP:%d:%s]\n",
property->base.id, property->name); property->base.id, property->name);
return -EINVAL; return -EINVAL;
} }
...@@ -178,6 +181,8 @@ intel_digital_connector_duplicate_state(struct drm_connector *connector) ...@@ -178,6 +181,8 @@ intel_digital_connector_duplicate_state(struct drm_connector *connector)
/** /**
* intel_connector_needs_modeset - check if connector needs a modeset * intel_connector_needs_modeset - check if connector needs a modeset
* @state: the atomic state corresponding to this modeset
* @connector: the connector
*/ */
bool bool
intel_connector_needs_modeset(struct intel_atomic_state *state, intel_connector_needs_modeset(struct intel_atomic_state *state,
...@@ -314,7 +319,8 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta ...@@ -314,7 +319,8 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta
} }
} }
if (WARN(*scaler_id < 0, "Cannot find scaler for %s:%d\n", name, idx)) if (drm_WARN(&dev_priv->drm, *scaler_id < 0,
"Cannot find scaler for %s:%d\n", name, idx))
return; return;
/* set scaler mode */ /* set scaler mode */
...@@ -357,8 +363,8 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta ...@@ -357,8 +363,8 @@ static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_sta
mode = SKL_PS_SCALER_MODE_DYN; mode = SKL_PS_SCALER_MODE_DYN;
} }
DRM_DEBUG_KMS("Attached scaler id %u.%u to %s:%d\n", drm_dbg_kms(&dev_priv->drm, "Attached scaler id %u.%u to %s:%d\n",
intel_crtc->pipe, *scaler_id, name, idx); intel_crtc->pipe, *scaler_id, name, idx);
scaler_state->scalers[*scaler_id].mode = mode; scaler_state->scalers[*scaler_id].mode = mode;
} }
...@@ -409,8 +415,9 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, ...@@ -409,8 +415,9 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv,
/* fail if required scalers > available scalers */ /* fail if required scalers > available scalers */
if (num_scalers_need > intel_crtc->num_scalers){ if (num_scalers_need > intel_crtc->num_scalers){
DRM_DEBUG_KMS("Too many scaling requests %d > %d\n", drm_dbg_kms(&dev_priv->drm,
num_scalers_need, intel_crtc->num_scalers); "Too many scaling requests %d > %d\n",
num_scalers_need, intel_crtc->num_scalers);
return -EINVAL; return -EINVAL;
} }
...@@ -455,8 +462,9 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, ...@@ -455,8 +462,9 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv,
plane = drm_plane_from_index(&dev_priv->drm, i); plane = drm_plane_from_index(&dev_priv->drm, i);
state = drm_atomic_get_plane_state(drm_state, plane); state = drm_atomic_get_plane_state(drm_state, plane);
if (IS_ERR(state)) { if (IS_ERR(state)) {
DRM_DEBUG_KMS("Failed to add [PLANE:%d] to drm_state\n", drm_dbg_kms(&dev_priv->drm,
plane->base.id); "Failed to add [PLANE:%d] to drm_state\n",
plane->base.id);
return PTR_ERR(state); return PTR_ERR(state);
} }
} }
...@@ -465,7 +473,8 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, ...@@ -465,7 +473,8 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv,
idx = plane->base.id; idx = plane->base.id;
/* plane on different crtc cannot be a scaler user of this crtc */ /* plane on different crtc cannot be a scaler user of this crtc */
if (WARN_ON(intel_plane->pipe != intel_crtc->pipe)) if (drm_WARN_ON(&dev_priv->drm,
intel_plane->pipe != intel_crtc->pipe))
continue; continue;
plane_state = intel_atomic_get_new_plane_state(intel_state, plane_state = intel_atomic_get_new_plane_state(intel_state,
...@@ -494,18 +503,28 @@ intel_atomic_state_alloc(struct drm_device *dev) ...@@ -494,18 +503,28 @@ intel_atomic_state_alloc(struct drm_device *dev)
return &state->base; return &state->base;
} }
void intel_atomic_state_free(struct drm_atomic_state *_state)
{
struct intel_atomic_state *state = to_intel_atomic_state(_state);
drm_atomic_state_default_release(&state->base);
kfree(state->global_objs);
i915_sw_fence_fini(&state->commit_ready);
kfree(state);
}
void intel_atomic_state_clear(struct drm_atomic_state *s) void intel_atomic_state_clear(struct drm_atomic_state *s)
{ {
struct intel_atomic_state *state = to_intel_atomic_state(s); struct intel_atomic_state *state = to_intel_atomic_state(s);
drm_atomic_state_default_clear(&state->base); drm_atomic_state_default_clear(&state->base);
intel_atomic_clear_global_state(state);
state->dpll_set = state->modeset = false; state->dpll_set = state->modeset = false;
state->global_state_changed = false; state->global_state_changed = false;
state->active_pipes = 0; state->active_pipes = 0;
memset(&state->min_cdclk, 0, sizeof(state->min_cdclk));
memset(&state->min_voltage_level, 0, sizeof(state->min_voltage_level));
memset(&state->cdclk.logical, 0, sizeof(state->cdclk.logical));
memset(&state->cdclk.actual, 0, sizeof(state->cdclk.actual));
state->cdclk.pipe = INVALID_PIPE;
} }
struct intel_crtc_state * struct intel_crtc_state *
...@@ -520,7 +539,7 @@ intel_atomic_get_crtc_state(struct drm_atomic_state *state, ...@@ -520,7 +539,7 @@ intel_atomic_get_crtc_state(struct drm_atomic_state *state,
return to_intel_crtc_state(crtc_state); return to_intel_crtc_state(crtc_state);
} }
int intel_atomic_lock_global_state(struct intel_atomic_state *state) int _intel_atomic_lock_global_state(struct intel_atomic_state *state)
{ {
struct drm_i915_private *dev_priv = to_i915(state->base.dev); struct drm_i915_private *dev_priv = to_i915(state->base.dev);
struct intel_crtc *crtc; struct intel_crtc *crtc;
...@@ -539,7 +558,7 @@ int intel_atomic_lock_global_state(struct intel_atomic_state *state) ...@@ -539,7 +558,7 @@ int intel_atomic_lock_global_state(struct intel_atomic_state *state)
return 0; return 0;
} }
int intel_atomic_serialize_global_state(struct intel_atomic_state *state) int _intel_atomic_serialize_global_state(struct intel_atomic_state *state)
{ {
struct drm_i915_private *dev_priv = to_i915(state->base.dev); struct drm_i915_private *dev_priv = to_i915(state->base.dev);
struct intel_crtc *crtc; struct intel_crtc *crtc;
......
...@@ -45,6 +45,7 @@ void intel_crtc_destroy_state(struct drm_crtc *crtc, ...@@ -45,6 +45,7 @@ void intel_crtc_destroy_state(struct drm_crtc *crtc,
void intel_crtc_free_hw_state(struct intel_crtc_state *crtc_state); void intel_crtc_free_hw_state(struct intel_crtc_state *crtc_state);
void intel_crtc_copy_color_blobs(struct intel_crtc_state *crtc_state); void intel_crtc_copy_color_blobs(struct intel_crtc_state *crtc_state);
struct drm_atomic_state *intel_atomic_state_alloc(struct drm_device *dev); struct drm_atomic_state *intel_atomic_state_alloc(struct drm_device *dev);
void intel_atomic_state_free(struct drm_atomic_state *state);
void intel_atomic_state_clear(struct drm_atomic_state *state); void intel_atomic_state_clear(struct drm_atomic_state *state);
struct intel_crtc_state * struct intel_crtc_state *
...@@ -55,8 +56,8 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv, ...@@ -55,8 +56,8 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv,
struct intel_crtc *intel_crtc, struct intel_crtc *intel_crtc,
struct intel_crtc_state *crtc_state); struct intel_crtc_state *crtc_state);
int intel_atomic_lock_global_state(struct intel_atomic_state *state); int _intel_atomic_lock_global_state(struct intel_atomic_state *state);
int intel_atomic_serialize_global_state(struct intel_atomic_state *state); int _intel_atomic_serialize_global_state(struct intel_atomic_state *state);
#endif /* __INTEL_ATOMIC_H__ */ #endif /* __INTEL_ATOMIC_H__ */
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "i915_trace.h" #include "i915_trace.h"
#include "intel_atomic_plane.h" #include "intel_atomic_plane.h"
#include "intel_cdclk.h"
#include "intel_display_types.h" #include "intel_display_types.h"
#include "intel_pm.h" #include "intel_pm.h"
#include "intel_sprite.h" #include "intel_sprite.h"
...@@ -155,42 +156,64 @@ unsigned int intel_plane_data_rate(const struct intel_crtc_state *crtc_state, ...@@ -155,42 +156,64 @@ unsigned int intel_plane_data_rate(const struct intel_crtc_state *crtc_state,
return cpp * crtc_state->pixel_rate; return cpp * crtc_state->pixel_rate;
} }
bool intel_plane_calc_min_cdclk(struct intel_atomic_state *state, int intel_plane_calc_min_cdclk(struct intel_atomic_state *state,
struct intel_plane *plane) struct intel_plane *plane,
bool *need_cdclk_calc)
{ {
struct drm_i915_private *dev_priv = to_i915(plane->base.dev); struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
const struct intel_plane_state *plane_state = const struct intel_plane_state *plane_state =
intel_atomic_get_new_plane_state(state, plane); intel_atomic_get_new_plane_state(state, plane);
struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc); struct intel_crtc *crtc = to_intel_crtc(plane_state->hw.crtc);
struct intel_crtc_state *crtc_state; const struct intel_cdclk_state *cdclk_state;
const struct intel_crtc_state *old_crtc_state;
struct intel_crtc_state *new_crtc_state;
if (!plane_state->uapi.visible || !plane->min_cdclk) if (!plane_state->uapi.visible || !plane->min_cdclk)
return false; return 0;
crtc_state = intel_atomic_get_new_crtc_state(state, crtc); old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
new_crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
crtc_state->min_cdclk[plane->id] = new_crtc_state->min_cdclk[plane->id] =
plane->min_cdclk(crtc_state, plane_state); plane->min_cdclk(new_crtc_state, plane_state);
/* /*
* Does the cdclk need to be bumbed up? * No need to check against the cdclk state if
* the min cdclk for the plane doesn't increase.
* *
* Note: we obviously need to be called before the new * Ie. we only ever increase the cdclk due to plane
* cdclk frequency is calculated so state->cdclk.logical * requirements. This can reduce back and forth
* hasn't been populated yet. Hence we look at the old * display blinking due to constant cdclk changes.
* cdclk state under dev_priv->cdclk.logical. This is
* safe as long we hold at least one crtc mutex (which
* must be true since we have crtc_state).
*/ */
if (crtc_state->min_cdclk[plane->id] > dev_priv->cdclk.logical.cdclk) { if (new_crtc_state->min_cdclk[plane->id] <=
DRM_DEBUG_KMS("[PLANE:%d:%s] min_cdclk (%d kHz) > logical cdclk (%d kHz)\n", old_crtc_state->min_cdclk[plane->id])
plane->base.base.id, plane->base.name, return 0;
crtc_state->min_cdclk[plane->id],
dev_priv->cdclk.logical.cdclk);
return true;
}
return false; cdclk_state = intel_atomic_get_cdclk_state(state);
if (IS_ERR(cdclk_state))
return PTR_ERR(cdclk_state);
/*
* No need to recalculate the cdclk state if
* the min cdclk for the pipe doesn't increase.
*
* Ie. we only ever increase the cdclk due to plane
* requirements. This can reduce back and forth
* display blinking due to constant cdclk changes.
*/
if (new_crtc_state->min_cdclk[plane->id] <=
cdclk_state->min_cdclk[crtc->pipe])
return 0;
drm_dbg_kms(&dev_priv->drm,
"[PLANE:%d:%s] min cdclk (%d kHz) > [CRTC:%d:%s] min cdclk (%d kHz)\n",
plane->base.base.id, plane->base.name,
new_crtc_state->min_cdclk[plane->id],
crtc->base.base.id, crtc->base.name,
cdclk_state->min_cdclk[crtc->pipe]);
*need_cdclk_calc = true;
return 0;
} }
static void intel_plane_clear_hw_state(struct intel_plane_state *plane_state) static void intel_plane_clear_hw_state(struct intel_plane_state *plane_state)
...@@ -225,12 +248,9 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_ ...@@ -225,12 +248,9 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
struct intel_plane_state *new_plane_state) struct intel_plane_state *new_plane_state)
{ {
struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane); struct intel_plane *plane = to_intel_plane(new_plane_state->uapi.plane);
const struct drm_framebuffer *fb; const struct drm_framebuffer *fb = new_plane_state->hw.fb;
int ret; int ret;
intel_plane_copy_uapi_to_hw_state(new_plane_state, new_plane_state);
fb = new_plane_state->hw.fb;
new_crtc_state->active_planes &= ~BIT(plane->id); new_crtc_state->active_planes &= ~BIT(plane->id);
new_crtc_state->nv12_planes &= ~BIT(plane->id); new_crtc_state->nv12_planes &= ~BIT(plane->id);
new_crtc_state->c8_planes &= ~BIT(plane->id); new_crtc_state->c8_planes &= ~BIT(plane->id);
...@@ -292,6 +312,7 @@ int intel_plane_atomic_check(struct intel_atomic_state *state, ...@@ -292,6 +312,7 @@ int intel_plane_atomic_check(struct intel_atomic_state *state,
const struct intel_crtc_state *old_crtc_state; const struct intel_crtc_state *old_crtc_state;
struct intel_crtc_state *new_crtc_state; struct intel_crtc_state *new_crtc_state;
intel_plane_copy_uapi_to_hw_state(new_plane_state, new_plane_state);
new_plane_state->uapi.visible = false; new_plane_state->uapi.visible = false;
if (!crtc) if (!crtc)
return 0; return 0;
......
...@@ -46,7 +46,8 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat ...@@ -46,7 +46,8 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
struct intel_crtc_state *crtc_state, struct intel_crtc_state *crtc_state,
const struct intel_plane_state *old_plane_state, const struct intel_plane_state *old_plane_state,
struct intel_plane_state *plane_state); struct intel_plane_state *plane_state);
bool intel_plane_calc_min_cdclk(struct intel_atomic_state *state, int intel_plane_calc_min_cdclk(struct intel_atomic_state *state,
struct intel_plane *plane); struct intel_plane *plane,
bool *need_cdclk_calc);
#endif /* __INTEL_ATOMIC_PLANE_H__ */ #endif /* __INTEL_ATOMIC_PLANE_H__ */
This diff is collapsed.
This diff is collapsed.
...@@ -247,5 +247,16 @@ enum aux_ch intel_bios_port_aux_ch(struct drm_i915_private *dev_priv, enum port ...@@ -247,5 +247,16 @@ enum aux_ch intel_bios_port_aux_ch(struct drm_i915_private *dev_priv, enum port
bool intel_bios_get_dsc_params(struct intel_encoder *encoder, bool intel_bios_get_dsc_params(struct intel_encoder *encoder,
struct intel_crtc_state *crtc_state, struct intel_crtc_state *crtc_state,
int dsc_max_bpc); int dsc_max_bpc);
int intel_bios_max_tmds_clock(struct intel_encoder *encoder);
int intel_bios_hdmi_level_shift(struct intel_encoder *encoder);
int intel_bios_dp_boost_level(struct intel_encoder *encoder);
int intel_bios_hdmi_boost_level(struct intel_encoder *encoder);
int intel_bios_dp_max_link_rate(struct intel_encoder *encoder);
int intel_bios_alternate_ddc_pin(struct intel_encoder *encoder);
bool intel_bios_port_supports_dvi(struct drm_i915_private *i915, enum port port);
bool intel_bios_port_supports_hdmi(struct drm_i915_private *i915, enum port port);
bool intel_bios_port_supports_dp(struct drm_i915_private *i915, enum port port);
bool intel_bios_port_supports_typec_usb(struct drm_i915_private *i915, enum port port);
bool intel_bios_port_supports_tbt(struct drm_i915_private *i915, enum port port);
#endif /* _INTEL_BIOS_H_ */ #endif /* _INTEL_BIOS_H_ */
...@@ -122,7 +122,8 @@ static int icl_get_qgv_points(struct drm_i915_private *dev_priv, ...@@ -122,7 +122,8 @@ static int icl_get_qgv_points(struct drm_i915_private *dev_priv,
if (ret) if (ret)
return ret; return ret;
if (WARN_ON(qi->num_points > ARRAY_SIZE(qi->points))) if (drm_WARN_ON(&dev_priv->drm,
qi->num_points > ARRAY_SIZE(qi->points)))
qi->num_points = ARRAY_SIZE(qi->points); qi->num_points = ARRAY_SIZE(qi->points);
for (i = 0; i < qi->num_points; i++) { for (i = 0; i < qi->num_points; i++) {
...@@ -132,9 +133,10 @@ static int icl_get_qgv_points(struct drm_i915_private *dev_priv, ...@@ -132,9 +133,10 @@ static int icl_get_qgv_points(struct drm_i915_private *dev_priv,
if (ret) if (ret)
return ret; return ret;
DRM_DEBUG_KMS("QGV %d: DCLK=%d tRP=%d tRDPRE=%d tRAS=%d tRCD=%d tRC=%d\n", drm_dbg_kms(&dev_priv->drm,
i, sp->dclk, sp->t_rp, sp->t_rdpre, sp->t_ras, "QGV %d: DCLK=%d tRP=%d tRDPRE=%d tRAS=%d tRCD=%d tRC=%d\n",
sp->t_rcd, sp->t_rc); i, sp->dclk, sp->t_rp, sp->t_rdpre, sp->t_ras,
sp->t_rcd, sp->t_rc);
} }
return 0; return 0;
...@@ -187,7 +189,8 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -187,7 +189,8 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
ret = icl_get_qgv_points(dev_priv, &qi); ret = icl_get_qgv_points(dev_priv, &qi);
if (ret) { if (ret) {
DRM_DEBUG_KMS("Failed to get memory subsystem information, ignoring bandwidth limits"); drm_dbg_kms(&dev_priv->drm,
"Failed to get memory subsystem information, ignoring bandwidth limits");
return ret; return ret;
} }
num_channels = qi.num_channels; num_channels = qi.num_channels;
...@@ -228,8 +231,9 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel ...@@ -228,8 +231,9 @@ static int icl_get_bw_info(struct drm_i915_private *dev_priv, const struct intel
bi->deratedbw[j] = min(maxdebw, bi->deratedbw[j] = min(maxdebw,
bw * 9 / 10); /* 90% */ bw * 9 / 10); /* 90% */
DRM_DEBUG_KMS("BW%d / QGV %d: num_planes=%d deratedbw=%u\n", drm_dbg_kms(&dev_priv->drm,
i, j, bi->num_planes, bi->deratedbw[j]); "BW%d / QGV %d: num_planes=%d deratedbw=%u\n",
i, j, bi->num_planes, bi->deratedbw[j]);
} }
if (bi->num_planes == 1) if (bi->num_planes == 1)
...@@ -374,10 +378,9 @@ static struct intel_bw_state * ...@@ -374,10 +378,9 @@ static struct intel_bw_state *
intel_atomic_get_bw_state(struct intel_atomic_state *state) intel_atomic_get_bw_state(struct intel_atomic_state *state)
{ {
struct drm_i915_private *dev_priv = to_i915(state->base.dev); struct drm_i915_private *dev_priv = to_i915(state->base.dev);
struct drm_private_state *bw_state; struct intel_global_state *bw_state;
bw_state = drm_atomic_get_private_obj_state(&state->base, bw_state = intel_atomic_get_global_obj_state(state, &dev_priv->bw_obj);
&dev_priv->bw_obj);
if (IS_ERR(bw_state)) if (IS_ERR(bw_state))
return ERR_CAST(bw_state); return ERR_CAST(bw_state);
...@@ -392,7 +395,7 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) ...@@ -392,7 +395,7 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
unsigned int data_rate, max_data_rate; unsigned int data_rate, max_data_rate;
unsigned int num_active_planes; unsigned int num_active_planes;
struct intel_crtc *crtc; struct intel_crtc *crtc;
int i; int i, ret;
/* FIXME earlier gens need some checks too */ /* FIXME earlier gens need some checks too */
if (INTEL_GEN(dev_priv) < 11) if (INTEL_GEN(dev_priv) < 11)
...@@ -424,15 +427,20 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) ...@@ -424,15 +427,20 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
bw_state->data_rate[crtc->pipe] = new_data_rate; bw_state->data_rate[crtc->pipe] = new_data_rate;
bw_state->num_active_planes[crtc->pipe] = new_active_planes; bw_state->num_active_planes[crtc->pipe] = new_active_planes;
DRM_DEBUG_KMS("pipe %c data rate %u num active planes %u\n", drm_dbg_kms(&dev_priv->drm,
pipe_name(crtc->pipe), "pipe %c data rate %u num active planes %u\n",
bw_state->data_rate[crtc->pipe], pipe_name(crtc->pipe),
bw_state->num_active_planes[crtc->pipe]); bw_state->data_rate[crtc->pipe],
bw_state->num_active_planes[crtc->pipe]);
} }
if (!bw_state) if (!bw_state)
return 0; return 0;
ret = intel_atomic_lock_global_state(&bw_state->base);
if (ret)
return ret;
data_rate = intel_bw_data_rate(dev_priv, bw_state); data_rate = intel_bw_data_rate(dev_priv, bw_state);
num_active_planes = intel_bw_num_active_planes(dev_priv, bw_state); num_active_planes = intel_bw_num_active_planes(dev_priv, bw_state);
...@@ -441,15 +449,17 @@ int intel_bw_atomic_check(struct intel_atomic_state *state) ...@@ -441,15 +449,17 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
data_rate = DIV_ROUND_UP(data_rate, 1000); data_rate = DIV_ROUND_UP(data_rate, 1000);
if (data_rate > max_data_rate) { if (data_rate > max_data_rate) {
DRM_DEBUG_KMS("Bandwidth %u MB/s exceeds max available %d MB/s (%d active planes)\n", drm_dbg_kms(&dev_priv->drm,
data_rate, max_data_rate, num_active_planes); "Bandwidth %u MB/s exceeds max available %d MB/s (%d active planes)\n",
data_rate, max_data_rate, num_active_planes);
return -EINVAL; return -EINVAL;
} }
return 0; return 0;
} }
static struct drm_private_state *intel_bw_duplicate_state(struct drm_private_obj *obj) static struct intel_global_state *
intel_bw_duplicate_state(struct intel_global_obj *obj)
{ {
struct intel_bw_state *state; struct intel_bw_state *state;
...@@ -457,18 +467,16 @@ static struct drm_private_state *intel_bw_duplicate_state(struct drm_private_obj ...@@ -457,18 +467,16 @@ static struct drm_private_state *intel_bw_duplicate_state(struct drm_private_obj
if (!state) if (!state)
return NULL; return NULL;
__drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
return &state->base; return &state->base;
} }
static void intel_bw_destroy_state(struct drm_private_obj *obj, static void intel_bw_destroy_state(struct intel_global_obj *obj,
struct drm_private_state *state) struct intel_global_state *state)
{ {
kfree(state); kfree(state);
} }
static const struct drm_private_state_funcs intel_bw_funcs = { static const struct intel_global_state_funcs intel_bw_funcs = {
.atomic_duplicate_state = intel_bw_duplicate_state, .atomic_duplicate_state = intel_bw_duplicate_state,
.atomic_destroy_state = intel_bw_destroy_state, .atomic_destroy_state = intel_bw_destroy_state,
}; };
...@@ -481,13 +489,8 @@ int intel_bw_init(struct drm_i915_private *dev_priv) ...@@ -481,13 +489,8 @@ int intel_bw_init(struct drm_i915_private *dev_priv)
if (!state) if (!state)
return -ENOMEM; return -ENOMEM;
drm_atomic_private_obj_init(&dev_priv->drm, &dev_priv->bw_obj, intel_atomic_global_obj_init(dev_priv, &dev_priv->bw_obj,
&state->base, &intel_bw_funcs); &state->base, &intel_bw_funcs);
return 0; return 0;
} }
void intel_bw_cleanup(struct drm_i915_private *dev_priv)
{
drm_atomic_private_obj_fini(&dev_priv->bw_obj);
}
...@@ -9,13 +9,14 @@ ...@@ -9,13 +9,14 @@
#include <drm/drm_atomic.h> #include <drm/drm_atomic.h>
#include "intel_display.h" #include "intel_display.h"
#include "intel_global_state.h"
struct drm_i915_private; struct drm_i915_private;
struct intel_atomic_state; struct intel_atomic_state;
struct intel_crtc_state; struct intel_crtc_state;
struct intel_bw_state { struct intel_bw_state {
struct drm_private_state base; struct intel_global_state base;
unsigned int data_rate[I915_MAX_PIPES]; unsigned int data_rate[I915_MAX_PIPES];
u8 num_active_planes[I915_MAX_PIPES]; u8 num_active_planes[I915_MAX_PIPES];
...@@ -25,7 +26,6 @@ struct intel_bw_state { ...@@ -25,7 +26,6 @@ struct intel_bw_state {
void intel_bw_init_hw(struct drm_i915_private *dev_priv); void intel_bw_init_hw(struct drm_i915_private *dev_priv);
int intel_bw_init(struct drm_i915_private *dev_priv); int intel_bw_init(struct drm_i915_private *dev_priv);
void intel_bw_cleanup(struct drm_i915_private *dev_priv);
int intel_bw_atomic_check(struct intel_atomic_state *state); int intel_bw_atomic_check(struct intel_atomic_state *state);
void intel_bw_crtc_update(struct intel_bw_state *bw_state, void intel_bw_crtc_update(struct intel_bw_state *bw_state,
const struct intel_crtc_state *crtc_state); const struct intel_crtc_state *crtc_state);
......
This diff is collapsed.
...@@ -8,11 +8,12 @@ ...@@ -8,11 +8,12 @@
#include <linux/types.h> #include <linux/types.h>
#include "i915_drv.h"
#include "intel_display.h" #include "intel_display.h"
#include "intel_global_state.h"
struct drm_i915_private; struct drm_i915_private;
struct intel_atomic_state; struct intel_atomic_state;
struct intel_cdclk_state;
struct intel_crtc_state; struct intel_crtc_state;
struct intel_cdclk_vals { struct intel_cdclk_vals {
...@@ -22,28 +23,62 @@ struct intel_cdclk_vals { ...@@ -22,28 +23,62 @@ struct intel_cdclk_vals {
u8 ratio; u8 ratio;
}; };
struct intel_cdclk_state {
struct intel_global_state base;
/*
* Logical configuration of cdclk (used for all scaling,
* watermark, etc. calculations and checks). This is
* computed as if all enabled crtcs were active.
*/
struct intel_cdclk_config logical;
/*
* Actual configuration of cdclk, can be different from the
* logical configuration only when all crtc's are DPMS off.
*/
struct intel_cdclk_config actual;
/* minimum acceptable cdclk for each pipe */
int min_cdclk[I915_MAX_PIPES];
/* minimum acceptable voltage level for each pipe */
u8 min_voltage_level[I915_MAX_PIPES];
/* pipe to which cd2x update is synchronized */
enum pipe pipe;
/* forced minimum cdclk for glk+ audio w/a */
int force_min_cdclk;
bool force_min_cdclk_changed;
/* bitmask of active pipes */
u8 active_pipes;
};
int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state); int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state);
void intel_cdclk_init(struct drm_i915_private *i915); void intel_cdclk_init_hw(struct drm_i915_private *i915);
void intel_cdclk_uninit(struct drm_i915_private *i915); void intel_cdclk_uninit_hw(struct drm_i915_private *i915);
void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv); void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv);
void intel_update_max_cdclk(struct drm_i915_private *dev_priv); void intel_update_max_cdclk(struct drm_i915_private *dev_priv);
void intel_update_cdclk(struct drm_i915_private *dev_priv); void intel_update_cdclk(struct drm_i915_private *dev_priv);
void intel_update_rawclk(struct drm_i915_private *dev_priv); u32 intel_read_rawclk(struct drm_i915_private *dev_priv);
bool intel_cdclk_needs_modeset(const struct intel_cdclk_state *a, bool intel_cdclk_needs_modeset(const struct intel_cdclk_config *a,
const struct intel_cdclk_state *b); const struct intel_cdclk_config *b);
void intel_cdclk_swap_state(struct intel_atomic_state *state); void intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state);
void void intel_set_cdclk_post_plane_update(struct intel_atomic_state *state);
intel_set_cdclk_pre_plane_update(struct drm_i915_private *dev_priv, void intel_dump_cdclk_config(const struct intel_cdclk_config *cdclk_config,
const struct intel_cdclk_state *old_state, const char *context);
const struct intel_cdclk_state *new_state,
enum pipe pipe);
void
intel_set_cdclk_post_plane_update(struct drm_i915_private *dev_priv,
const struct intel_cdclk_state *old_state,
const struct intel_cdclk_state *new_state,
enum pipe pipe);
void intel_dump_cdclk_state(const struct intel_cdclk_state *cdclk_state,
const char *context);
int intel_modeset_calc_cdclk(struct intel_atomic_state *state); int intel_modeset_calc_cdclk(struct intel_atomic_state *state);
struct intel_cdclk_state *
intel_atomic_get_cdclk_state(struct intel_atomic_state *state);
#define to_intel_cdclk_state(x) container_of((x), struct intel_cdclk_state, base)
#define intel_atomic_get_old_cdclk_state(state) \
to_intel_cdclk_state(intel_atomic_get_old_global_obj_state(state, &to_i915(state->base.dev)->cdclk.obj))
#define intel_atomic_get_new_cdclk_state(state) \
to_intel_cdclk_state(intel_atomic_get_new_global_obj_state(state, &to_i915(state->base.dev)->cdclk.obj))
int intel_cdclk_init(struct drm_i915_private *dev_priv);
#endif /* __INTEL_CDCLK_H__ */ #endif /* __INTEL_CDCLK_H__ */
This diff is collapsed.
...@@ -153,7 +153,7 @@ void intel_connector_attach_encoder(struct intel_connector *connector, ...@@ -153,7 +153,7 @@ void intel_connector_attach_encoder(struct intel_connector *connector,
bool intel_connector_get_hw_state(struct intel_connector *connector) bool intel_connector_get_hw_state(struct intel_connector *connector)
{ {
enum pipe pipe = 0; enum pipe pipe = 0;
struct intel_encoder *encoder = connector->encoder; struct intel_encoder *encoder = intel_attached_encoder(connector);
return encoder->get_hw_state(encoder, &pipe); return encoder->get_hw_state(encoder, &pipe);
} }
...@@ -162,7 +162,8 @@ enum pipe intel_connector_get_pipe(struct intel_connector *connector) ...@@ -162,7 +162,8 @@ enum pipe intel_connector_get_pipe(struct intel_connector *connector)
{ {
struct drm_device *dev = connector->base.dev; struct drm_device *dev = connector->base.dev;
WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex)); drm_WARN_ON(dev,
!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
if (!connector->base.state->crtc) if (!connector->base.state->crtc)
return INVALID_PIPE; return INVALID_PIPE;
......
This diff is collapsed.
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_reg.h" #include "i915_reg.h"
#include "intel_csr.h" #include "intel_csr.h"
#include "intel_de.h"
/** /**
* DOC: csr support for dmc * DOC: csr support for dmc
...@@ -276,11 +277,11 @@ static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv) ...@@ -276,11 +277,11 @@ static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv)
mask |= DC_STATE_DEBUG_MASK_CORES; mask |= DC_STATE_DEBUG_MASK_CORES;
/* The below bit doesn't need to be cleared ever afterwards */ /* The below bit doesn't need to be cleared ever afterwards */
val = I915_READ(DC_STATE_DEBUG); val = intel_de_read(dev_priv, DC_STATE_DEBUG);
if ((val & mask) != mask) { if ((val & mask) != mask) {
val |= mask; val |= mask;
I915_WRITE(DC_STATE_DEBUG, val); intel_de_write(dev_priv, DC_STATE_DEBUG, val);
POSTING_READ(DC_STATE_DEBUG); intel_de_posting_read(dev_priv, DC_STATE_DEBUG);
} }
} }
...@@ -298,12 +299,14 @@ void intel_csr_load_program(struct drm_i915_private *dev_priv) ...@@ -298,12 +299,14 @@ void intel_csr_load_program(struct drm_i915_private *dev_priv)
u32 i, fw_size; u32 i, fw_size;
if (!HAS_CSR(dev_priv)) { if (!HAS_CSR(dev_priv)) {
DRM_ERROR("No CSR support available for this platform\n"); drm_err(&dev_priv->drm,
"No CSR support available for this platform\n");
return; return;
} }
if (!dev_priv->csr.dmc_payload) { if (!dev_priv->csr.dmc_payload) {
DRM_ERROR("Tried to program CSR with empty payload\n"); drm_err(&dev_priv->drm,
"Tried to program CSR with empty payload\n");
return; return;
} }
...@@ -313,13 +316,14 @@ void intel_csr_load_program(struct drm_i915_private *dev_priv) ...@@ -313,13 +316,14 @@ void intel_csr_load_program(struct drm_i915_private *dev_priv)
preempt_disable(); preempt_disable();
for (i = 0; i < fw_size; i++) for (i = 0; i < fw_size; i++)
I915_WRITE_FW(CSR_PROGRAM(i), payload[i]); intel_uncore_write_fw(&dev_priv->uncore, CSR_PROGRAM(i),
payload[i]);
preempt_enable(); preempt_enable();
for (i = 0; i < dev_priv->csr.mmio_count; i++) { for (i = 0; i < dev_priv->csr.mmio_count; i++) {
I915_WRITE(dev_priv->csr.mmioaddr[i], intel_de_write(dev_priv, dev_priv->csr.mmioaddr[i],
dev_priv->csr.mmiodata[i]); dev_priv->csr.mmiodata[i]);
} }
dev_priv->csr.dc_state = 0; dev_priv->csr.dc_state = 0;
...@@ -607,7 +611,7 @@ static void parse_csr_fw(struct drm_i915_private *dev_priv, ...@@ -607,7 +611,7 @@ static void parse_csr_fw(struct drm_i915_private *dev_priv,
static void intel_csr_runtime_pm_get(struct drm_i915_private *dev_priv) static void intel_csr_runtime_pm_get(struct drm_i915_private *dev_priv)
{ {
WARN_ON(dev_priv->csr.wakeref); drm_WARN_ON(&dev_priv->drm, dev_priv->csr.wakeref);
dev_priv->csr.wakeref = dev_priv->csr.wakeref =
intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
} }
...@@ -636,16 +640,16 @@ static void csr_load_work_fn(struct work_struct *work) ...@@ -636,16 +640,16 @@ static void csr_load_work_fn(struct work_struct *work)
intel_csr_load_program(dev_priv); intel_csr_load_program(dev_priv);
intel_csr_runtime_pm_put(dev_priv); intel_csr_runtime_pm_put(dev_priv);
DRM_INFO("Finished loading DMC firmware %s (v%u.%u)\n", drm_info(&dev_priv->drm,
dev_priv->csr.fw_path, "Finished loading DMC firmware %s (v%u.%u)\n",
CSR_VERSION_MAJOR(csr->version), dev_priv->csr.fw_path, CSR_VERSION_MAJOR(csr->version),
CSR_VERSION_MINOR(csr->version)); CSR_VERSION_MINOR(csr->version));
} else { } else {
dev_notice(dev_priv->drm.dev, drm_notice(&dev_priv->drm,
"Failed to load DMC firmware %s." "Failed to load DMC firmware %s."
" Disabling runtime power management.\n", " Disabling runtime power management.\n",
csr->fw_path); csr->fw_path);
dev_notice(dev_priv->drm.dev, "DMC firmware homepage: %s", drm_notice(&dev_priv->drm, "DMC firmware homepage: %s",
INTEL_UC_FIRMWARE_URL); INTEL_UC_FIRMWARE_URL);
} }
...@@ -712,7 +716,8 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv) ...@@ -712,7 +716,8 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv)
if (i915_modparams.dmc_firmware_path) { if (i915_modparams.dmc_firmware_path) {
if (strlen(i915_modparams.dmc_firmware_path) == 0) { if (strlen(i915_modparams.dmc_firmware_path) == 0) {
csr->fw_path = NULL; csr->fw_path = NULL;
DRM_INFO("Disabling CSR firmware and runtime PM\n"); drm_info(&dev_priv->drm,
"Disabling CSR firmware and runtime PM\n");
return; return;
} }
...@@ -722,11 +727,12 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv) ...@@ -722,11 +727,12 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv)
} }
if (csr->fw_path == NULL) { if (csr->fw_path == NULL) {
DRM_DEBUG_KMS("No known CSR firmware for platform, disabling runtime PM\n"); drm_dbg_kms(&dev_priv->drm,
"No known CSR firmware for platform, disabling runtime PM\n");
return; return;
} }
DRM_DEBUG_KMS("Loading %s\n", csr->fw_path); drm_dbg_kms(&dev_priv->drm, "Loading %s\n", csr->fw_path);
schedule_work(&dev_priv->csr.work); schedule_work(&dev_priv->csr.work);
} }
...@@ -783,7 +789,7 @@ void intel_csr_ucode_fini(struct drm_i915_private *dev_priv) ...@@ -783,7 +789,7 @@ void intel_csr_ucode_fini(struct drm_i915_private *dev_priv)
return; return;
intel_csr_ucode_suspend(dev_priv); intel_csr_ucode_suspend(dev_priv);
WARN_ON(dev_priv->csr.wakeref); drm_WARN_ON(&dev_priv->drm, dev_priv->csr.wakeref);
kfree(dev_priv->csr.dmc_payload); kfree(dev_priv->csr.dmc_payload);
} }
This diff is collapsed.
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2019 Intel Corporation
*/
#ifndef __INTEL_DE_H__
#define __INTEL_DE_H__
#include "i915_drv.h"
#include "i915_reg.h"
#include "intel_uncore.h"
static inline u32
intel_de_read(struct drm_i915_private *i915, i915_reg_t reg)
{
return intel_uncore_read(&i915->uncore, reg);
}
static inline void
intel_de_posting_read(struct drm_i915_private *i915, i915_reg_t reg)
{
intel_uncore_posting_read(&i915->uncore, reg);
}
/* Note: read the warnings for intel_uncore_*_fw() functions! */
static inline u32
intel_de_read_fw(struct drm_i915_private *i915, i915_reg_t reg)
{
return intel_uncore_read_fw(&i915->uncore, reg);
}
static inline void
intel_de_write(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
{
intel_uncore_write(&i915->uncore, reg, val);
}
/* Note: read the warnings for intel_uncore_*_fw() functions! */
static inline void
intel_de_write_fw(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
{
intel_uncore_write_fw(&i915->uncore, reg, val);
}
static inline void
intel_de_rmw(struct drm_i915_private *i915, i915_reg_t reg, u32 clear, u32 set)
{
intel_uncore_rmw(&i915->uncore, reg, clear, set);
}
static inline int
intel_de_wait_for_register(struct drm_i915_private *i915, i915_reg_t reg,
u32 mask, u32 value, unsigned int timeout)
{
return intel_wait_for_register(&i915->uncore, reg, mask, value, timeout);
}
static inline int
intel_de_wait_for_set(struct drm_i915_private *i915, i915_reg_t reg,
u32 mask, unsigned int timeout)
{
return intel_de_wait_for_register(i915, reg, mask, mask, timeout);
}
static inline int
intel_de_wait_for_clear(struct drm_i915_private *i915, i915_reg_t reg,
u32 mask, unsigned int timeout)
{
return intel_de_wait_for_register(i915, reg, mask, 0, timeout);
}
#endif /* __INTEL_DE_H__ */
...@@ -44,6 +44,7 @@ struct drm_modeset_acquire_ctx; ...@@ -44,6 +44,7 @@ struct drm_modeset_acquire_ctx;
struct drm_plane; struct drm_plane;
struct drm_plane_state; struct drm_plane_state;
struct i915_ggtt_view; struct i915_ggtt_view;
struct intel_atomic_state;
struct intel_crtc; struct intel_crtc;
struct intel_crtc_state; struct intel_crtc_state;
struct intel_digital_port; struct intel_digital_port;
...@@ -469,6 +470,8 @@ enum phy_fia { ...@@ -469,6 +470,8 @@ enum phy_fia {
((connector) = to_intel_connector((__state)->base.connectors[__i].ptr), \ ((connector) = to_intel_connector((__state)->base.connectors[__i].ptr), \
(new_connector_state) = to_intel_digital_connector_state((__state)->base.connectors[__i].new_state), 1)) (new_connector_state) = to_intel_digital_connector_state((__state)->base.connectors[__i].new_state), 1))
u8 intel_calc_active_pipes(struct intel_atomic_state *state,
u8 active_pipes);
void intel_link_compute_m_n(u16 bpp, int nlanes, void intel_link_compute_m_n(u16 bpp, int nlanes,
int pixel_clock, int link_clock, int pixel_clock, int link_clock,
struct intel_link_m_n *m_n, struct intel_link_m_n *m_n,
...@@ -486,6 +489,7 @@ enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port); ...@@ -486,6 +489,7 @@ 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_mode(const struct intel_crtc_state *state);
void intel_plane_destroy(struct drm_plane *plane); void intel_plane_destroy(struct drm_plane *plane);
void intel_enable_pipe(const struct intel_crtc_state *new_crtc_state);
void intel_disable_pipe(const struct intel_crtc_state *old_crtc_state); void intel_disable_pipe(const struct intel_crtc_state *old_crtc_state);
void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe); void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe);
void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe); void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe);
...@@ -495,6 +499,7 @@ int vlv_get_cck_clock(struct drm_i915_private *dev_priv, ...@@ -495,6 +499,7 @@ int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
const char *name, u32 reg, int ref_freq); const char *name, u32 reg, int ref_freq);
int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv, int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
const char *name, u32 reg); const char *name, u32 reg);
void lpt_pch_enable(const struct intel_crtc_state *crtc_state);
void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv); void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv);
void lpt_disable_iclkip(struct drm_i915_private *dev_priv); void lpt_disable_iclkip(struct drm_i915_private *dev_priv);
void intel_init_display_hooks(struct drm_i915_private *dev_priv); void intel_init_display_hooks(struct drm_i915_private *dev_priv);
...@@ -520,6 +525,7 @@ enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, ...@@ -520,6 +525,7 @@ enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv,
int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data, int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv); struct drm_file *file_priv);
u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc); u32 intel_crtc_get_vblank_counter(struct intel_crtc *crtc);
void intel_crtc_vblank_on(const struct intel_crtc_state *crtc_state);
void intel_crtc_vblank_off(const struct intel_crtc_state *crtc_state); void intel_crtc_vblank_off(const struct intel_crtc_state *crtc_state);
int ilk_get_lanes_required(int target_clock, int link_bw, int bpp); int ilk_get_lanes_required(int target_clock, int link_bw, int bpp);
...@@ -610,6 +616,7 @@ intel_format_info_is_yuv_semiplanar(const struct drm_format_info *info, ...@@ -610,6 +616,7 @@ intel_format_info_is_yuv_semiplanar(const struct drm_format_info *info,
void intel_modeset_init_hw(struct drm_i915_private *i915); void intel_modeset_init_hw(struct drm_i915_private *i915);
int intel_modeset_init(struct drm_i915_private *i915); int intel_modeset_init(struct drm_i915_private *i915);
void intel_modeset_driver_remove(struct drm_i915_private *i915); void intel_modeset_driver_remove(struct drm_i915_private *i915);
void intel_modeset_driver_remove_noirq(struct drm_i915_private *i915);
void intel_display_resume(struct drm_device *dev); void intel_display_resume(struct drm_device *dev);
void intel_init_pch_refclk(struct drm_i915_private *dev_priv); void intel_init_pch_refclk(struct drm_i915_private *dev_priv);
......
This diff is collapsed.
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2020 Intel Corporation
*/
#ifndef __INTEL_DISPLAY_DEBUGFS_H__
#define __INTEL_DISPLAY_DEBUGFS_H__
struct drm_connector;
struct drm_i915_private;
#ifdef CONFIG_DEBUG_FS
int intel_display_debugfs_register(struct drm_i915_private *i915);
int intel_connector_debugfs_add(struct drm_connector *connector);
#else
static inline int intel_display_debugfs_register(struct drm_i915_private *i915) { return 0; }
static inline int intel_connector_debugfs_add(struct drm_connector *connector) { return 0; }
#endif
#endif /* __INTEL_DISPLAY_DEBUGFS_H__ */
...@@ -307,6 +307,11 @@ intel_display_power_put_async(struct drm_i915_private *i915, ...@@ -307,6 +307,11 @@ intel_display_power_put_async(struct drm_i915_private *i915,
} }
#endif #endif
enum dbuf_slice {
DBUF_S1,
DBUF_S2,
};
#define with_intel_display_power(i915, domain, wf) \ #define with_intel_display_power(i915, domain, wf) \
for ((wf) = intel_display_power_get((i915), (domain)); (wf); \ for ((wf) = intel_display_power_get((i915), (domain)); (wf); \
intel_display_power_put_async((i915), (domain), (wf)), (wf) = 0) intel_display_power_put_async((i915), (domain), (wf)), (wf) = 0)
......
...@@ -44,8 +44,10 @@ ...@@ -44,8 +44,10 @@
#include <media/cec-notifier.h> #include <media/cec-notifier.h>
#include "i915_drv.h" #include "i915_drv.h"
#include "intel_de.h"
struct drm_printer; struct drm_printer;
struct __intel_global_objs_state;
/* /*
* Display related stuff * Display related stuff
...@@ -139,6 +141,9 @@ struct intel_encoder { ...@@ -139,6 +141,9 @@ struct intel_encoder {
int (*compute_config)(struct intel_encoder *, int (*compute_config)(struct intel_encoder *,
struct intel_crtc_state *, struct intel_crtc_state *,
struct drm_connector_state *); struct drm_connector_state *);
int (*compute_config_late)(struct intel_encoder *,
struct intel_crtc_state *,
struct drm_connector_state *);
void (*update_prepare)(struct intel_atomic_state *, void (*update_prepare)(struct intel_atomic_state *,
struct intel_encoder *, struct intel_encoder *,
struct intel_crtc *); struct intel_crtc *);
...@@ -214,6 +219,9 @@ struct intel_panel { ...@@ -214,6 +219,9 @@ struct intel_panel {
u8 controller; /* bxt+ only */ u8 controller; /* bxt+ only */
struct pwm_device *pwm; struct pwm_device *pwm;
/* DPCD backlight */
u8 pwmgen_bit_count;
struct backlight_device *device; struct backlight_device *device;
/* Connector and platform specific backlight functions */ /* Connector and platform specific backlight functions */
...@@ -458,25 +466,8 @@ struct intel_atomic_state { ...@@ -458,25 +466,8 @@ struct intel_atomic_state {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
struct { struct __intel_global_objs_state *global_objs;
/* int num_global_objs;
* Logical state of cdclk (used for all scaling, watermark,
* etc. calculations and checks). This is computed as if all
* enabled crtcs were active.
*/
struct intel_cdclk_state logical;
/*
* Actual state of cdclk, can be different from the logical
* state only when all crtc's are DPMS off.
*/
struct intel_cdclk_state actual;
int force_min_cdclk;
bool force_min_cdclk_changed;
/* pipe to which cd2x update is synchronized */
enum pipe pipe;
} cdclk;
bool dpll_set, modeset; bool dpll_set, modeset;
...@@ -491,10 +482,6 @@ struct intel_atomic_state { ...@@ -491,10 +482,6 @@ struct intel_atomic_state {
u8 active_pipe_changes; u8 active_pipe_changes;
u8 active_pipes; u8 active_pipes;
/* minimum acceptable cdclk for each pipe */
int min_cdclk[I915_MAX_PIPES];
/* minimum acceptable voltage level for each pipe */
u8 min_voltage_level[I915_MAX_PIPES];
struct intel_shared_dpll_state shared_dpll[I915_NUM_PLLS]; struct intel_shared_dpll_state shared_dpll[I915_NUM_PLLS];
...@@ -508,14 +495,11 @@ struct intel_atomic_state { ...@@ -508,14 +495,11 @@ struct intel_atomic_state {
/* /*
* active_pipes * active_pipes
* min_cdclk[]
* min_voltage_level[]
* cdclk.*
*/ */
bool global_state_changed; bool global_state_changed;
/* Gen9+ only */ /* Number of enabled DBuf slices */
struct skl_ddb_values wm_results; u8 enabled_dbuf_slices_mask;
struct i915_sw_fence commit_ready; struct i915_sw_fence commit_ready;
...@@ -611,6 +595,7 @@ struct intel_plane_state { ...@@ -611,6 +595,7 @@ struct intel_plane_state {
struct intel_initial_plane_config { struct intel_initial_plane_config {
struct intel_framebuffer *fb; struct intel_framebuffer *fb;
struct i915_vma *vma;
unsigned int tiling; unsigned int tiling;
int size; int size;
u32 base; u32 base;
...@@ -659,7 +644,6 @@ struct intel_crtc_scaler_state { ...@@ -659,7 +644,6 @@ struct intel_crtc_scaler_state {
struct intel_pipe_wm { struct intel_pipe_wm {
struct intel_wm_level wm[5]; struct intel_wm_level wm[5];
u32 linetime;
bool fbc_wm_enabled; bool fbc_wm_enabled;
bool pipe_enabled; bool pipe_enabled;
bool sprites_enabled; bool sprites_enabled;
...@@ -675,7 +659,6 @@ struct skl_plane_wm { ...@@ -675,7 +659,6 @@ struct skl_plane_wm {
struct skl_pipe_wm { struct skl_pipe_wm {
struct skl_plane_wm planes[I915_MAX_PLANES]; struct skl_plane_wm planes[I915_MAX_PLANES];
u32 linetime;
}; };
enum vlv_wm_level { enum vlv_wm_level {
...@@ -1046,6 +1029,10 @@ struct intel_crtc_state { ...@@ -1046,6 +1029,10 @@ struct intel_crtc_state {
struct drm_dsc_config config; struct drm_dsc_config config;
} dsc; } dsc;
/* HSW+ linetime watermarks */
u16 linetime;
u16 ips_linetime;
/* Forward Error correction State */ /* Forward Error correction State */
bool fec_enable; bool fec_enable;
...@@ -1467,7 +1454,7 @@ enc_to_dig_port(struct intel_encoder *encoder) ...@@ -1467,7 +1454,7 @@ enc_to_dig_port(struct intel_encoder *encoder)
} }
static inline struct intel_digital_port * static inline struct intel_digital_port *
conn_to_dig_port(struct intel_connector *connector) intel_attached_dig_port(struct intel_connector *connector)
{ {
return enc_to_dig_port(intel_attached_encoder(connector)); return enc_to_dig_port(intel_attached_encoder(connector));
} }
...@@ -1484,6 +1471,11 @@ static inline struct intel_dp *enc_to_intel_dp(struct intel_encoder *encoder) ...@@ -1484,6 +1471,11 @@ static inline struct intel_dp *enc_to_intel_dp(struct intel_encoder *encoder)
return &enc_to_dig_port(encoder)->dp; return &enc_to_dig_port(encoder)->dp;
} }
static inline struct intel_dp *intel_attached_dp(struct intel_connector *connector)
{
return enc_to_intel_dp(intel_attached_encoder(connector));
}
static inline bool intel_encoder_is_dp(struct intel_encoder *encoder) static inline bool intel_encoder_is_dp(struct intel_encoder *encoder)
{ {
switch (encoder->type) { switch (encoder->type) {
......
This diff is collapsed.
...@@ -57,10 +57,27 @@ static void set_aux_backlight_enable(struct intel_dp *intel_dp, bool enable) ...@@ -57,10 +57,27 @@ static void set_aux_backlight_enable(struct intel_dp *intel_dp, bool enable)
*/ */
static u32 intel_dp_aux_get_backlight(struct intel_connector *connector) static u32 intel_dp_aux_get_backlight(struct intel_connector *connector)
{ {
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); struct intel_dp *intel_dp = intel_attached_dp(connector);
u8 read_val[2] = { 0x0 }; u8 read_val[2] = { 0x0 };
u8 mode_reg;
u16 level = 0; u16 level = 0;
if (drm_dp_dpcd_readb(&intel_dp->aux,
DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
&mode_reg) != 1) {
DRM_DEBUG_KMS("Failed to read the DPCD register 0x%x\n",
DP_EDP_BACKLIGHT_MODE_SET_REGISTER);
return 0;
}
/*
* If we're not in DPCD control mode yet, the programmed brightness
* value is meaningless and we should assume max brightness
*/
if ((mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) !=
DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD)
return connector->panel.backlight.max;
if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB,
&read_val, sizeof(read_val)) < 0) { &read_val, sizeof(read_val)) < 0) {
DRM_DEBUG_KMS("Failed to read DPCD register 0x%x\n", DRM_DEBUG_KMS("Failed to read DPCD register 0x%x\n",
...@@ -82,7 +99,7 @@ static void ...@@ -82,7 +99,7 @@ static void
intel_dp_aux_set_backlight(const struct drm_connector_state *conn_state, u32 level) intel_dp_aux_set_backlight(const struct drm_connector_state *conn_state, u32 level)
{ {
struct intel_connector *connector = to_intel_connector(conn_state->connector); struct intel_connector *connector = to_intel_connector(conn_state->connector);
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); struct intel_dp *intel_dp = intel_attached_dp(connector);
u8 vals[2] = { 0x0 }; u8 vals[2] = { 0x0 };
vals[0] = level; vals[0] = level;
...@@ -110,62 +127,29 @@ intel_dp_aux_set_backlight(const struct drm_connector_state *conn_state, u32 lev ...@@ -110,62 +127,29 @@ intel_dp_aux_set_backlight(const struct drm_connector_state *conn_state, u32 lev
static bool intel_dp_aux_set_pwm_freq(struct intel_connector *connector) static bool intel_dp_aux_set_pwm_freq(struct intel_connector *connector)
{ {
struct drm_i915_private *dev_priv = to_i915(connector->base.dev); struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); struct intel_dp *intel_dp = intel_attached_dp(connector);
int freq, fxp, fxp_min, fxp_max, fxp_actual, f = 1; const u8 pn = connector->panel.backlight.pwmgen_bit_count;
u8 pn, pn_min, pn_max; int freq, fxp, f, fxp_actual, fxp_min, fxp_max;
/* Find desired value of (F x P)
* Note that, if F x P is out of supported range, the maximum value or
* minimum value will applied automatically. So no need to check that.
*/
freq = dev_priv->vbt.backlight.pwm_freq_hz; freq = dev_priv->vbt.backlight.pwm_freq_hz;
DRM_DEBUG_KMS("VBT defined backlight frequency %u Hz\n", freq);
if (!freq) { if (!freq) {
DRM_DEBUG_KMS("Use panel default backlight frequency\n"); DRM_DEBUG_KMS("Use panel default backlight frequency\n");
return false; return false;
} }
fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq); fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq);
f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255);
fxp_actual = f << pn;
/* Use highest possible value of Pn for more granularity of brightness /* Ensure frequency is within 25% of desired value */
* adjustment while satifying the conditions below.
* - Pn is in the range of Pn_min and Pn_max
* - F is in the range of 1 and 255
* - FxP is within 25% of desired value.
* Note: 25% is arbitrary value and may need some tweak.
*/
if (drm_dp_dpcd_readb(&intel_dp->aux,
DP_EDP_PWMGEN_BIT_COUNT_CAP_MIN, &pn_min) != 1) {
DRM_DEBUG_KMS("Failed to read pwmgen bit count cap min\n");
return false;
}
if (drm_dp_dpcd_readb(&intel_dp->aux,
DP_EDP_PWMGEN_BIT_COUNT_CAP_MAX, &pn_max) != 1) {
DRM_DEBUG_KMS("Failed to read pwmgen bit count cap max\n");
return false;
}
pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4); fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4); fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) {
DRM_DEBUG_KMS("VBT defined backlight frequency out of range\n");
return false;
}
for (pn = pn_max; pn >= pn_min; pn--) { if (fxp_min > fxp_actual || fxp_actual > fxp_max) {
f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255); DRM_DEBUG_KMS("Actual frequency out of range\n");
fxp_actual = f << pn;
if (fxp_min <= fxp_actual && fxp_actual <= fxp_max)
break;
}
if (drm_dp_dpcd_writeb(&intel_dp->aux,
DP_EDP_PWMGEN_BIT_COUNT, pn) < 0) {
DRM_DEBUG_KMS("Failed to write aux pwmgen bit count\n");
return false; return false;
} }
if (drm_dp_dpcd_writeb(&intel_dp->aux, if (drm_dp_dpcd_writeb(&intel_dp->aux,
DP_EDP_BACKLIGHT_FREQ_SET, (u8) f) < 0) { DP_EDP_BACKLIGHT_FREQ_SET, (u8) f) < 0) {
DRM_DEBUG_KMS("Failed to write aux backlight freq\n"); DRM_DEBUG_KMS("Failed to write aux backlight freq\n");
...@@ -178,7 +162,8 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st ...@@ -178,7 +162,8 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st
const struct drm_connector_state *conn_state) const struct drm_connector_state *conn_state)
{ {
struct intel_connector *connector = to_intel_connector(conn_state->connector); struct intel_connector *connector = to_intel_connector(conn_state->connector);
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); struct intel_dp *intel_dp = intel_attached_dp(connector);
struct intel_panel *panel = &connector->panel;
u8 dpcd_buf, new_dpcd_buf, edp_backlight_mode; u8 dpcd_buf, new_dpcd_buf, edp_backlight_mode;
if (drm_dp_dpcd_readb(&intel_dp->aux, if (drm_dp_dpcd_readb(&intel_dp->aux,
...@@ -197,6 +182,12 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st ...@@ -197,6 +182,12 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st
case DP_EDP_BACKLIGHT_CONTROL_MODE_PRODUCT: case DP_EDP_BACKLIGHT_CONTROL_MODE_PRODUCT:
new_dpcd_buf &= ~DP_EDP_BACKLIGHT_CONTROL_MODE_MASK; new_dpcd_buf &= ~DP_EDP_BACKLIGHT_CONTROL_MODE_MASK;
new_dpcd_buf |= DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD; new_dpcd_buf |= DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD;
if (drm_dp_dpcd_writeb(&intel_dp->aux,
DP_EDP_PWMGEN_BIT_COUNT,
panel->backlight.pwmgen_bit_count) < 0)
DRM_DEBUG_KMS("Failed to write aux pwmgen bit count\n");
break; break;
/* Do nothing when it is already DPCD mode */ /* Do nothing when it is already DPCD mode */
...@@ -216,8 +207,9 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st ...@@ -216,8 +207,9 @@ static void intel_dp_aux_enable_backlight(const struct intel_crtc_state *crtc_st
} }
} }
intel_dp_aux_set_backlight(conn_state,
connector->panel.backlight.level);
set_aux_backlight_enable(intel_dp, true); set_aux_backlight_enable(intel_dp, true);
intel_dp_aux_set_backlight(conn_state, connector->panel.backlight.level);
} }
static void intel_dp_aux_disable_backlight(const struct drm_connector_state *old_conn_state) static void intel_dp_aux_disable_backlight(const struct drm_connector_state *old_conn_state)
...@@ -226,20 +218,91 @@ static void intel_dp_aux_disable_backlight(const struct drm_connector_state *old ...@@ -226,20 +218,91 @@ static void intel_dp_aux_disable_backlight(const struct drm_connector_state *old
false); false);
} }
static u32 intel_dp_aux_calc_max_backlight(struct intel_connector *connector)
{
struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct intel_dp *intel_dp = intel_attached_dp(connector);
struct intel_panel *panel = &connector->panel;
u32 max_backlight = 0;
int freq, fxp, fxp_min, fxp_max, fxp_actual, f = 1;
u8 pn, pn_min, pn_max;
if (drm_dp_dpcd_readb(&intel_dp->aux, DP_EDP_PWMGEN_BIT_COUNT, &pn) == 1) {
pn &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
max_backlight = (1 << pn) - 1;
}
/* Find desired value of (F x P)
* Note that, if F x P is out of supported range, the maximum value or
* minimum value will applied automatically. So no need to check that.
*/
freq = i915->vbt.backlight.pwm_freq_hz;
DRM_DEBUG_KMS("VBT defined backlight frequency %u Hz\n", freq);
if (!freq) {
DRM_DEBUG_KMS("Use panel default backlight frequency\n");
return max_backlight;
}
fxp = DIV_ROUND_CLOSEST(KHz(DP_EDP_BACKLIGHT_FREQ_BASE_KHZ), freq);
/* Use highest possible value of Pn for more granularity of brightness
* adjustment while satifying the conditions below.
* - Pn is in the range of Pn_min and Pn_max
* - F is in the range of 1 and 255
* - FxP is within 25% of desired value.
* Note: 25% is arbitrary value and may need some tweak.
*/
if (drm_dp_dpcd_readb(&intel_dp->aux,
DP_EDP_PWMGEN_BIT_COUNT_CAP_MIN, &pn_min) != 1) {
DRM_DEBUG_KMS("Failed to read pwmgen bit count cap min\n");
return max_backlight;
}
if (drm_dp_dpcd_readb(&intel_dp->aux,
DP_EDP_PWMGEN_BIT_COUNT_CAP_MAX, &pn_max) != 1) {
DRM_DEBUG_KMS("Failed to read pwmgen bit count cap max\n");
return max_backlight;
}
pn_min &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
pn_max &= DP_EDP_PWMGEN_BIT_COUNT_MASK;
fxp_min = DIV_ROUND_CLOSEST(fxp * 3, 4);
fxp_max = DIV_ROUND_CLOSEST(fxp * 5, 4);
if (fxp_min < (1 << pn_min) || (255 << pn_max) < fxp_max) {
DRM_DEBUG_KMS("VBT defined backlight frequency out of range\n");
return max_backlight;
}
for (pn = pn_max; pn >= pn_min; pn--) {
f = clamp(DIV_ROUND_CLOSEST(fxp, 1 << pn), 1, 255);
fxp_actual = f << pn;
if (fxp_min <= fxp_actual && fxp_actual <= fxp_max)
break;
}
DRM_DEBUG_KMS("Using eDP pwmgen bit count of %d\n", pn);
if (drm_dp_dpcd_writeb(&intel_dp->aux,
DP_EDP_PWMGEN_BIT_COUNT, pn) < 0) {
DRM_DEBUG_KMS("Failed to write aux pwmgen bit count\n");
return max_backlight;
}
panel->backlight.pwmgen_bit_count = pn;
max_backlight = (1 << pn) - 1;
return max_backlight;
}
static int intel_dp_aux_setup_backlight(struct intel_connector *connector, static int intel_dp_aux_setup_backlight(struct intel_connector *connector,
enum pipe pipe) enum pipe pipe)
{ {
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
struct intel_panel *panel = &connector->panel; struct intel_panel *panel = &connector->panel;
if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT) panel->backlight.max = intel_dp_aux_calc_max_backlight(connector);
panel->backlight.max = 0xFFFF; if (!panel->backlight.max)
else return -ENODEV;
panel->backlight.max = 0xFF;
panel->backlight.min = 0; panel->backlight.min = 0;
panel->backlight.level = intel_dp_aux_get_backlight(connector); panel->backlight.level = intel_dp_aux_get_backlight(connector);
panel->backlight.enabled = panel->backlight.level != 0; panel->backlight.enabled = panel->backlight.level != 0;
return 0; return 0;
...@@ -248,7 +311,7 @@ static int intel_dp_aux_setup_backlight(struct intel_connector *connector, ...@@ -248,7 +311,7 @@ static int intel_dp_aux_setup_backlight(struct intel_connector *connector,
static bool static bool
intel_dp_aux_display_control_capable(struct intel_connector *connector) intel_dp_aux_display_control_capable(struct intel_connector *connector)
{ {
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); struct intel_dp *intel_dp = intel_attached_dp(connector);
/* Check the eDP Display control capabilities registers to determine if /* Check the eDP Display control capabilities registers to determine if
* the panel can support backlight control over the aux channel * the panel can support backlight control over the aux channel
......
...@@ -352,8 +352,9 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder, ...@@ -352,8 +352,9 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
intel_dp->active_mst_links--; intel_dp->active_mst_links--;
last_mst_stream = intel_dp->active_mst_links == 0; last_mst_stream = intel_dp->active_mst_links == 0;
WARN_ON(INTEL_GEN(dev_priv) >= 12 && last_mst_stream && drm_WARN_ON(&dev_priv->drm,
!intel_dp_mst_is_master_trans(old_crtc_state)); INTEL_GEN(dev_priv) >= 12 && last_mst_stream &&
!intel_dp_mst_is_master_trans(old_crtc_state));
intel_crtc_vblank_off(old_crtc_state); intel_crtc_vblank_off(old_crtc_state);
...@@ -361,9 +362,12 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder, ...@@ -361,9 +362,12 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder,
drm_dp_update_payload_part2(&intel_dp->mst_mgr); drm_dp_update_payload_part2(&intel_dp->mst_mgr);
val = I915_READ(TRANS_DDI_FUNC_CTL(old_crtc_state->cpu_transcoder)); val = intel_de_read(dev_priv,
TRANS_DDI_FUNC_CTL(old_crtc_state->cpu_transcoder));
val &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC; val &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
I915_WRITE(TRANS_DDI_FUNC_CTL(old_crtc_state->cpu_transcoder), val); intel_de_write(dev_priv,
TRANS_DDI_FUNC_CTL(old_crtc_state->cpu_transcoder),
val);
if (intel_de_wait_for_set(dev_priv, intel_dp->regs.dp_tp_status, if (intel_de_wait_for_set(dev_priv, intel_dp->regs.dp_tp_status,
DP_TP_STATUS_ACT_SENT, 1)) DP_TP_STATUS_ACT_SENT, 1))
...@@ -437,8 +441,9 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, ...@@ -437,8 +441,9 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
connector->encoder = encoder; connector->encoder = encoder;
intel_mst->connector = connector; intel_mst->connector = connector;
first_mst_stream = intel_dp->active_mst_links == 0; first_mst_stream = intel_dp->active_mst_links == 0;
WARN_ON(INTEL_GEN(dev_priv) >= 12 && first_mst_stream && drm_WARN_ON(&dev_priv->drm,
!intel_dp_mst_is_master_trans(pipe_config)); INTEL_GEN(dev_priv) >= 12 && first_mst_stream &&
!intel_dp_mst_is_master_trans(pipe_config));
DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links); DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
...@@ -459,8 +464,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, ...@@ -459,8 +464,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
DRM_ERROR("failed to allocate vcpi\n"); DRM_ERROR("failed to allocate vcpi\n");
intel_dp->active_mst_links++; intel_dp->active_mst_links++;
temp = I915_READ(intel_dp->regs.dp_tp_status); temp = intel_de_read(dev_priv, intel_dp->regs.dp_tp_status);
I915_WRITE(intel_dp->regs.dp_tp_status, temp); intel_de_write(dev_priv, intel_dp->regs.dp_tp_status, temp);
ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr); ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
...@@ -475,6 +480,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, ...@@ -475,6 +480,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
intel_ddi_enable_pipe_clock(pipe_config); intel_ddi_enable_pipe_clock(pipe_config);
intel_ddi_set_dp_msa(pipe_config, conn_state); intel_ddi_set_dp_msa(pipe_config, conn_state);
intel_dp_set_m_n(pipe_config, M1_N1);
} }
static void intel_mst_enable_dp(struct intel_encoder *encoder, static void intel_mst_enable_dp(struct intel_encoder *encoder,
...@@ -486,6 +493,12 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder, ...@@ -486,6 +493,12 @@ static void intel_mst_enable_dp(struct intel_encoder *encoder,
struct intel_dp *intel_dp = &intel_dig_port->dp; struct intel_dp *intel_dp = &intel_dig_port->dp;
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
drm_WARN_ON(&dev_priv->drm, pipe_config->has_pch_encoder);
intel_enable_pipe(pipe_config);
intel_crtc_vblank_on(pipe_config);
DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links); DRM_DEBUG_KMS("active links %d\n", intel_dp->active_mst_links);
if (intel_de_wait_for_set(dev_priv, intel_dp->regs.dp_tp_status, if (intel_de_wait_for_set(dev_priv, intel_dp->regs.dp_tp_status,
...@@ -632,9 +645,9 @@ static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = { ...@@ -632,9 +645,9 @@ static const struct drm_encoder_funcs intel_dp_mst_enc_funcs = {
static bool intel_dp_mst_get_hw_state(struct intel_connector *connector) static bool intel_dp_mst_get_hw_state(struct intel_connector *connector)
{ {
if (connector->encoder && connector->base.state->crtc) { if (intel_attached_encoder(connector) && connector->base.state->crtc) {
enum pipe pipe; enum pipe pipe;
if (!connector->encoder->get_hw_state(connector->encoder, &pipe)) if (!intel_attached_encoder(connector)->get_hw_state(intel_attached_encoder(connector), &pipe))
return false; return false;
return true; return true;
} }
......
This diff is collapsed.
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
static u32 dcs_get_backlight(struct intel_connector *connector) static u32 dcs_get_backlight(struct intel_connector *connector)
{ {
struct intel_encoder *encoder = connector->encoder; struct intel_encoder *encoder = intel_attached_encoder(connector);
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
struct mipi_dsi_device *dsi_device; struct mipi_dsi_device *dsi_device;
u8 data = 0; u8 data = 0;
...@@ -160,13 +160,13 @@ int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector) ...@@ -160,13 +160,13 @@ int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector)
{ {
struct drm_device *dev = intel_connector->base.dev; struct drm_device *dev = intel_connector->base.dev;
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct intel_encoder *encoder = intel_connector->encoder; struct intel_encoder *encoder = intel_attached_encoder(intel_connector);
struct intel_panel *panel = &intel_connector->panel; struct intel_panel *panel = &intel_connector->panel;
if (dev_priv->vbt.backlight.type != INTEL_BACKLIGHT_DSI_DCS) if (dev_priv->vbt.backlight.type != INTEL_BACKLIGHT_DSI_DCS)
return -ENODEV; return -ENODEV;
if (WARN_ON(encoder->type != INTEL_OUTPUT_DSI)) if (drm_WARN_ON(dev, encoder->type != INTEL_OUTPUT_DSI))
return -EINVAL; return -EINVAL;
panel->backlight.setup = dcs_setup_backlight; panel->backlight.setup = dcs_setup_backlight;
......
This diff is collapsed.
This diff is collapsed.
...@@ -19,14 +19,13 @@ struct intel_plane_state; ...@@ -19,14 +19,13 @@ struct intel_plane_state;
void intel_fbc_choose_crtc(struct drm_i915_private *dev_priv, void intel_fbc_choose_crtc(struct drm_i915_private *dev_priv,
struct intel_atomic_state *state); struct intel_atomic_state *state);
bool intel_fbc_is_active(struct drm_i915_private *dev_priv); bool intel_fbc_is_active(struct drm_i915_private *dev_priv);
bool intel_fbc_pre_update(struct intel_crtc *crtc, bool intel_fbc_pre_update(struct intel_atomic_state *state,
const struct intel_crtc_state *crtc_state, struct intel_crtc *crtc);
const struct intel_plane_state *plane_state); void intel_fbc_post_update(struct intel_atomic_state *state,
void intel_fbc_post_update(struct intel_crtc *crtc); struct intel_crtc *crtc);
void intel_fbc_init(struct drm_i915_private *dev_priv); void intel_fbc_init(struct drm_i915_private *dev_priv);
void intel_fbc_enable(struct intel_crtc *crtc, void intel_fbc_enable(struct intel_atomic_state *state,
const struct intel_crtc_state *crtc_state, struct intel_crtc *crtc);
const struct intel_plane_state *plane_state);
void intel_fbc_disable(struct intel_crtc *crtc); void intel_fbc_disable(struct intel_crtc *crtc);
void intel_fbc_global_disable(struct drm_i915_private *dev_priv); void intel_fbc_global_disable(struct drm_i915_private *dev_priv);
void intel_fbc_invalidate(struct drm_i915_private *dev_priv, void intel_fbc_invalidate(struct drm_i915_private *dev_priv,
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -14,6 +14,8 @@ struct drm_connector; ...@@ -14,6 +14,8 @@ struct drm_connector;
struct drm_connector_state; struct drm_connector_state;
struct drm_i915_private; struct drm_i915_private;
struct intel_connector; struct intel_connector;
struct intel_crtc_state;
struct intel_encoder;
struct intel_hdcp_shim; struct intel_hdcp_shim;
enum port; enum port;
enum transcoder; enum transcoder;
...@@ -26,6 +28,9 @@ int intel_hdcp_init(struct intel_connector *connector, ...@@ -26,6 +28,9 @@ int intel_hdcp_init(struct intel_connector *connector,
int intel_hdcp_enable(struct intel_connector *connector, int intel_hdcp_enable(struct intel_connector *connector,
enum transcoder cpu_transcoder, u8 content_type); enum transcoder cpu_transcoder, u8 content_type);
int intel_hdcp_disable(struct intel_connector *connector); int intel_hdcp_disable(struct intel_connector *connector);
void intel_hdcp_update_pipe(struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state,
const struct drm_connector_state *conn_state);
bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port); bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port);
bool intel_hdcp_capable(struct intel_connector *connector); bool intel_hdcp_capable(struct intel_connector *connector);
bool intel_hdcp2_capable(struct intel_connector *connector); bool intel_hdcp2_capable(struct intel_connector *connector);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment