drm/dp: move intel_dp_vsc_sdp_pack() to generic helper
intel_dp_vsc_sdp_pack() can be re-used by other DRM drivers as well. Lets move this to drm_dp_helper to achieve this. changes in v2: - rebased on top of drm-tip Acked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Signed-off-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Acked-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Link: https://patchwork.freedesktop.org/patch/msgid/20240220195348.1270854-1-quic_abhinavk@quicinc.com
This commit is contained in:
parent
32e5a120a5
commit
47f419e071
3 changed files with 83 additions and 69 deletions
|
@ -2913,6 +2913,84 @@ void drm_dp_vsc_sdp_log(struct drm_printer *p, const struct drm_dp_vsc_sdp *vsc)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_dp_vsc_sdp_log);
|
EXPORT_SYMBOL(drm_dp_vsc_sdp_log);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_dp_vsc_sdp_pack() - pack a given vsc sdp into generic dp_sdp
|
||||||
|
* @vsc: vsc sdp initialized according to its purpose as defined in
|
||||||
|
* table 2-118 - table 2-120 in DP 1.4a specification
|
||||||
|
* @sdp: valid handle to the generic dp_sdp which will be packed
|
||||||
|
* @size: valid size of the passed sdp handle
|
||||||
|
*
|
||||||
|
* Returns length of sdp on success and error code on failure
|
||||||
|
*/
|
||||||
|
ssize_t drm_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
|
||||||
|
struct dp_sdp *sdp, size_t size)
|
||||||
|
{
|
||||||
|
size_t length = sizeof(struct dp_sdp);
|
||||||
|
|
||||||
|
if (size < length)
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
|
memset(sdp, 0, size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119
|
||||||
|
* VSC SDP Header Bytes
|
||||||
|
*/
|
||||||
|
sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */
|
||||||
|
sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */
|
||||||
|
sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */
|
||||||
|
sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */
|
||||||
|
|
||||||
|
if (vsc->revision == 0x6) {
|
||||||
|
sdp->db[0] = 1;
|
||||||
|
sdp->db[3] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Revision 0x5 and revision 0x7 supports Pixel Encoding/Colorimetry
|
||||||
|
* Format as per DP 1.4a spec and DP 2.0 respectively.
|
||||||
|
*/
|
||||||
|
if (!(vsc->revision == 0x5 || vsc->revision == 0x7))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* VSC SDP Payload for DB16 through DB18 */
|
||||||
|
/* Pixel Encoding and Colorimetry Formats */
|
||||||
|
sdp->db[16] = (vsc->pixelformat & 0xf) << 4; /* DB16[7:4] */
|
||||||
|
sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */
|
||||||
|
|
||||||
|
switch (vsc->bpc) {
|
||||||
|
case 6:
|
||||||
|
/* 6bpc: 0x0 */
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
sdp->db[17] = 0x1; /* DB17[3:0] */
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
sdp->db[17] = 0x2;
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
sdp->db[17] = 0x3;
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
sdp->db[17] = 0x4;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN(1, "Missing case %d\n", vsc->bpc);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dynamic Range and Component Bit Depth */
|
||||||
|
if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA)
|
||||||
|
sdp->db[17] |= 0x80; /* DB17[7] */
|
||||||
|
|
||||||
|
/* Content Type */
|
||||||
|
sdp->db[18] = vsc->content_type & 0x7;
|
||||||
|
|
||||||
|
out:
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_dp_vsc_sdp_pack);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_dp_get_pcon_max_frl_bw() - maximum frl supported by PCON
|
* drm_dp_get_pcon_max_frl_bw() - maximum frl supported by PCON
|
||||||
* @dpcd: DisplayPort configuration data
|
* @dpcd: DisplayPort configuration data
|
||||||
|
|
|
@ -4110,73 +4110,6 @@ intel_dp_needs_vsc_sdp(const struct intel_crtc_state *crtc_state,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
|
|
||||||
struct dp_sdp *sdp, size_t size)
|
|
||||||
{
|
|
||||||
size_t length = sizeof(struct dp_sdp);
|
|
||||||
|
|
||||||
if (size < length)
|
|
||||||
return -ENOSPC;
|
|
||||||
|
|
||||||
memset(sdp, 0, size);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119
|
|
||||||
* VSC SDP Header Bytes
|
|
||||||
*/
|
|
||||||
sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */
|
|
||||||
sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */
|
|
||||||
sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */
|
|
||||||
sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */
|
|
||||||
|
|
||||||
if (vsc->revision == 0x6) {
|
|
||||||
sdp->db[0] = 1;
|
|
||||||
sdp->db[3] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Revision 0x5 and revision 0x7 supports Pixel Encoding/Colorimetry
|
|
||||||
* Format as per DP 1.4a spec and DP 2.0 respectively.
|
|
||||||
*/
|
|
||||||
if (!(vsc->revision == 0x5 || vsc->revision == 0x7))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* VSC SDP Payload for DB16 through DB18 */
|
|
||||||
/* Pixel Encoding and Colorimetry Formats */
|
|
||||||
sdp->db[16] = (vsc->pixelformat & 0xf) << 4; /* DB16[7:4] */
|
|
||||||
sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */
|
|
||||||
|
|
||||||
switch (vsc->bpc) {
|
|
||||||
case 6:
|
|
||||||
/* 6bpc: 0x0 */
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
sdp->db[17] = 0x1; /* DB17[3:0] */
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
sdp->db[17] = 0x2;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
sdp->db[17] = 0x3;
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
sdp->db[17] = 0x4;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
MISSING_CASE(vsc->bpc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Dynamic Range and Component Bit Depth */
|
|
||||||
if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA)
|
|
||||||
sdp->db[17] |= 0x80; /* DB17[7] */
|
|
||||||
|
|
||||||
/* Content Type */
|
|
||||||
sdp->db[18] = vsc->content_type & 0x7;
|
|
||||||
|
|
||||||
out:
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
intel_dp_hdr_metadata_infoframe_sdp_pack(struct drm_i915_private *i915,
|
intel_dp_hdr_metadata_infoframe_sdp_pack(struct drm_i915_private *i915,
|
||||||
const struct hdmi_drm_infoframe *drm_infoframe,
|
const struct hdmi_drm_infoframe *drm_infoframe,
|
||||||
|
@ -4269,8 +4202,8 @@ static void intel_write_dp_sdp(struct intel_encoder *encoder,
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case DP_SDP_VSC:
|
case DP_SDP_VSC:
|
||||||
len = intel_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp,
|
len = drm_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp,
|
||||||
sizeof(sdp));
|
sizeof(sdp));
|
||||||
break;
|
break;
|
||||||
case HDMI_PACKET_TYPE_GAMUT_METADATA:
|
case HDMI_PACKET_TYPE_GAMUT_METADATA:
|
||||||
len = intel_dp_hdr_metadata_infoframe_sdp_pack(dev_priv,
|
len = intel_dp_hdr_metadata_infoframe_sdp_pack(dev_priv,
|
||||||
|
|
|
@ -812,4 +812,7 @@ int drm_dp_bw_overhead(int lane_count, int hactive,
|
||||||
int bpp_x16, unsigned long flags);
|
int bpp_x16, unsigned long flags);
|
||||||
int drm_dp_bw_channel_coding_efficiency(bool is_uhbr);
|
int drm_dp_bw_channel_coding_efficiency(bool is_uhbr);
|
||||||
|
|
||||||
|
ssize_t drm_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc,
|
||||||
|
struct dp_sdp *sdp, size_t size);
|
||||||
|
|
||||||
#endif /* _DRM_DP_HELPER_H_ */
|
#endif /* _DRM_DP_HELPER_H_ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue