drm/i915: Enable infoframes on GLK+ for HDR
This patch enables infoframes on GLK+ to be used to send HDR metadata to HDMI sink. v2: Addressed Shashank's review comment. v3: Addressed Shashank's review comment. v4: Added Shashank's RB. v5: Dropped hdr_metadata_change check while modeset, as per Ville's suggestion. v6: Removed an unused and duplicate bit defintion, as per Ville's comment. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Uma Shankar <uma.shankar@intel.com> Reviewed-by: Shashank Sharma <shashank.sharma@intel.com> [mlankhorst: Reorder patch series] Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/1558110145-3422-1-git-send-email-uma.shankar@intel.com
This commit is contained in:
parent
c0560fab6d
commit
44b42ebfcc
@ -4697,7 +4697,7 @@ enum {
|
|||||||
#define VIDEO_DIP_FREQ_2VSYNC (2 << 16)
|
#define VIDEO_DIP_FREQ_2VSYNC (2 << 16)
|
||||||
#define VIDEO_DIP_FREQ_MASK (3 << 16)
|
#define VIDEO_DIP_FREQ_MASK (3 << 16)
|
||||||
/* HSW and later: */
|
/* HSW and later: */
|
||||||
#define DRM_DIP_ENABLE (1 << 28)
|
#define VIDEO_DIP_ENABLE_DRM_GLK (1 << 28)
|
||||||
#define PSR_VSC_BIT_7_SET (1 << 27)
|
#define PSR_VSC_BIT_7_SET (1 << 27)
|
||||||
#define VSC_SELECT_MASK (0x3 << 25)
|
#define VSC_SELECT_MASK (0x3 << 25)
|
||||||
#define VSC_SELECT_SHIFT 25
|
#define VSC_SELECT_SHIFT 25
|
||||||
@ -8156,6 +8156,7 @@ enum {
|
|||||||
#define _HSW_VIDEO_DIP_SPD_DATA_A 0x602A0
|
#define _HSW_VIDEO_DIP_SPD_DATA_A 0x602A0
|
||||||
#define _HSW_VIDEO_DIP_GMP_DATA_A 0x602E0
|
#define _HSW_VIDEO_DIP_GMP_DATA_A 0x602E0
|
||||||
#define _HSW_VIDEO_DIP_VSC_DATA_A 0x60320
|
#define _HSW_VIDEO_DIP_VSC_DATA_A 0x60320
|
||||||
|
#define _GLK_VIDEO_DIP_DRM_DATA_A 0x60440
|
||||||
#define _HSW_VIDEO_DIP_AVI_ECC_A 0x60240
|
#define _HSW_VIDEO_DIP_AVI_ECC_A 0x60240
|
||||||
#define _HSW_VIDEO_DIP_VS_ECC_A 0x60280
|
#define _HSW_VIDEO_DIP_VS_ECC_A 0x60280
|
||||||
#define _HSW_VIDEO_DIP_SPD_ECC_A 0x602C0
|
#define _HSW_VIDEO_DIP_SPD_ECC_A 0x602C0
|
||||||
@ -8169,6 +8170,7 @@ enum {
|
|||||||
#define _HSW_VIDEO_DIP_SPD_DATA_B 0x612A0
|
#define _HSW_VIDEO_DIP_SPD_DATA_B 0x612A0
|
||||||
#define _HSW_VIDEO_DIP_GMP_DATA_B 0x612E0
|
#define _HSW_VIDEO_DIP_GMP_DATA_B 0x612E0
|
||||||
#define _HSW_VIDEO_DIP_VSC_DATA_B 0x61320
|
#define _HSW_VIDEO_DIP_VSC_DATA_B 0x61320
|
||||||
|
#define _GLK_VIDEO_DIP_DRM_DATA_B 0x61440
|
||||||
#define _HSW_VIDEO_DIP_BVI_ECC_B 0x61240
|
#define _HSW_VIDEO_DIP_BVI_ECC_B 0x61240
|
||||||
#define _HSW_VIDEO_DIP_VS_ECC_B 0x61280
|
#define _HSW_VIDEO_DIP_VS_ECC_B 0x61280
|
||||||
#define _HSW_VIDEO_DIP_SPD_ECC_B 0x612C0
|
#define _HSW_VIDEO_DIP_SPD_ECC_B 0x612C0
|
||||||
@ -8194,6 +8196,7 @@ enum {
|
|||||||
#define HSW_TVIDEO_DIP_SPD_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_SPD_DATA_A + (i) * 4)
|
#define HSW_TVIDEO_DIP_SPD_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_SPD_DATA_A + (i) * 4)
|
||||||
#define HSW_TVIDEO_DIP_GMP_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_GMP_DATA_A + (i) * 4)
|
#define HSW_TVIDEO_DIP_GMP_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_GMP_DATA_A + (i) * 4)
|
||||||
#define HSW_TVIDEO_DIP_VSC_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_VSC_DATA_A + (i) * 4)
|
#define HSW_TVIDEO_DIP_VSC_DATA(trans, i) _MMIO_TRANS2(trans, _HSW_VIDEO_DIP_VSC_DATA_A + (i) * 4)
|
||||||
|
#define GLK_TVIDEO_DIP_DRM_DATA(trans, i) _MMIO_TRANS2(trans, _GLK_VIDEO_DIP_DRM_DATA_A + (i) * 4)
|
||||||
#define ICL_VIDEO_DIP_PPS_DATA(trans, i) _MMIO_TRANS2(trans, _ICL_VIDEO_DIP_PPS_DATA_A + (i) * 4)
|
#define ICL_VIDEO_DIP_PPS_DATA(trans, i) _MMIO_TRANS2(trans, _ICL_VIDEO_DIP_PPS_DATA_A + (i) * 4)
|
||||||
#define ICL_VIDEO_DIP_PPS_ECC(trans, i) _MMIO_TRANS2(trans, _ICL_VIDEO_DIP_PPS_ECC_A + (i) * 4)
|
#define ICL_VIDEO_DIP_PPS_ECC(trans, i) _MMIO_TRANS2(trans, _ICL_VIDEO_DIP_PPS_ECC_A + (i) * 4)
|
||||||
|
|
||||||
|
@ -154,6 +154,8 @@ static u32 hsw_infoframe_enable(unsigned int type)
|
|||||||
return VIDEO_DIP_ENABLE_SPD_HSW;
|
return VIDEO_DIP_ENABLE_SPD_HSW;
|
||||||
case HDMI_INFOFRAME_TYPE_VENDOR:
|
case HDMI_INFOFRAME_TYPE_VENDOR:
|
||||||
return VIDEO_DIP_ENABLE_VS_HSW;
|
return VIDEO_DIP_ENABLE_VS_HSW;
|
||||||
|
case HDMI_INFOFRAME_TYPE_DRM:
|
||||||
|
return VIDEO_DIP_ENABLE_DRM_GLK;
|
||||||
default:
|
default:
|
||||||
MISSING_CASE(type);
|
MISSING_CASE(type);
|
||||||
return 0;
|
return 0;
|
||||||
@ -179,6 +181,8 @@ hsw_dip_data_reg(struct drm_i915_private *dev_priv,
|
|||||||
return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
|
return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
|
||||||
case HDMI_INFOFRAME_TYPE_VENDOR:
|
case HDMI_INFOFRAME_TYPE_VENDOR:
|
||||||
return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
|
return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
|
||||||
|
case HDMI_INFOFRAME_TYPE_DRM:
|
||||||
|
return GLK_TVIDEO_DIP_DRM_DATA(cpu_transcoder, i);
|
||||||
default:
|
default:
|
||||||
MISSING_CASE(type);
|
MISSING_CASE(type);
|
||||||
return INVALID_MMIO_REG;
|
return INVALID_MMIO_REG;
|
||||||
@ -552,10 +556,16 @@ static u32 hsw_infoframes_enabled(struct intel_encoder *encoder,
|
|||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||||
u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
|
u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
|
||||||
|
u32 mask;
|
||||||
|
|
||||||
return val & (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
|
mask = (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
|
||||||
VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
|
VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
|
||||||
VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
|
VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
|
||||||
|
|
||||||
|
if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
|
||||||
|
mask |= VIDEO_DIP_ENABLE_DRM_GLK;
|
||||||
|
|
||||||
|
return val & mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const u8 infoframe_type_to_idx[] = {
|
static const u8 infoframe_type_to_idx[] = {
|
||||||
@ -1149,7 +1159,8 @@ static void hsw_set_infoframes(struct intel_encoder *encoder,
|
|||||||
|
|
||||||
val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
|
val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
|
||||||
VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
|
VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
|
||||||
VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
|
VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
|
||||||
|
VIDEO_DIP_ENABLE_DRM_GLK);
|
||||||
|
|
||||||
if (!enable) {
|
if (!enable) {
|
||||||
I915_WRITE(reg, val);
|
I915_WRITE(reg, val);
|
||||||
|
Loading…
Reference in New Issue
Block a user