Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6083146a authored by Fuad Hossain's avatar Fuad Hossain
Browse files

drm: Add framework support for multilevel dp dsc



Add all necessary drm framework changes to
enable support for multilevel dp dsc. These
include functions to get the number of sdp slots
available in the full path, fec capability, and
the addition of new structures in the mst port to
store dsc related information.

CRs-Fixed: 2471395
Change-Id: I32b52754f52743d9ec1a0d2e6c01c0e74d84ee73
Signed-off-by: default avatarFuad Hossain <fhossain@codeaurora.org>
parent 75829fdf
Loading
Loading
Loading
Loading
+73 −2
Original line number Diff line number Diff line
@@ -486,6 +486,7 @@ static bool drm_dp_sideband_parse_enum_path_resources_ack(struct drm_dp_sideband
{
	int idx = 1;
	repmsg->u.path_resources.port_number = (raw->msg[idx] >> 4) & 0xf;
	repmsg->u.path_resources.fec_capability = (raw->msg[idx]) & 0x1;
	idx++;
	if (idx > raw->curlen)
		goto fail_len;
@@ -1693,9 +1694,14 @@ static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
		else {
			if (port->port_num != txmsg->reply.u.path_resources.port_number)
				DRM_ERROR("got incorrect port in response\n");
			DRM_DEBUG_KMS("enum path resources %d: %d %d\n", txmsg->reply.u.path_resources.port_number, txmsg->reply.u.path_resources.full_payload_bw_number,
			DRM_DEBUG_KMS("enum path resources %d: %d %d %d\n",
			txmsg->reply.u.path_resources.port_number,
			txmsg->reply.u.path_resources.fec_capability,
			txmsg->reply.u.path_resources.full_payload_bw_number,
			txmsg->reply.u.path_resources.avail_payload_bw_number);
			port->available_pbn = txmsg->reply.u.path_resources.avail_payload_bw_number;
			port->fec_capability =
				txmsg->reply.u.path_resources.fec_capability;
		}
	}

@@ -1850,6 +1856,42 @@ static int drm_dp_send_clear_payload_table(struct drm_dp_mst_topology_mgr *mgr,
	return ret;
}

int drm_dp_mst_get_dsc_info(struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port,
		struct drm_dp_mst_dsc_info *dsc_info)
{
	if (!dsc_info)
		return -EINVAL;

	port = drm_dp_get_validated_port_ref(mgr, port);
	if (!port)
		return -EINVAL;

	memcpy(dsc_info, &port->dsc_info, sizeof(struct drm_dp_mst_dsc_info));
	drm_dp_put_port(port);

	return 0;
}
EXPORT_SYMBOL(drm_dp_mst_get_dsc_info);

int drm_dp_mst_update_dsc_info(struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port,
		struct drm_dp_mst_dsc_info *dsc_info)
{
	if (!dsc_info)
		return -EINVAL;

	port = drm_dp_get_validated_port_ref(mgr, port);
	if (!port)
		return -EINVAL;

	memcpy(&port->dsc_info, dsc_info, sizeof(struct drm_dp_mst_dsc_info));
	drm_dp_put_port(port);

	return 0;
}
EXPORT_SYMBOL(drm_dp_mst_update_dsc_info);

static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr,
				       int id,
				       struct drm_dp_payload *payload)
@@ -2122,6 +2164,21 @@ int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr,
}
EXPORT_SYMBOL(drm_dp_send_dpcd_write);

int drm_dp_mst_get_max_sdp_streams_supported(
		struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port)
{
	int ret = -1;

	port = drm_dp_get_validated_port_ref(mgr, port);
	if (!port)
		return ret;
	ret = port->num_sdp_streams;
	drm_dp_put_port(port);
	return ret;
}
EXPORT_SYMBOL(drm_dp_mst_get_max_sdp_streams_supported);

static int drm_dp_encode_up_ack_reply(struct drm_dp_sideband_msg_tx *msg, u8 req_type)
{
	struct drm_dp_sideband_msg_reply_body reply;
@@ -2624,6 +2681,20 @@ bool drm_dp_mst_port_has_audio(struct drm_dp_mst_topology_mgr *mgr,
}
EXPORT_SYMBOL(drm_dp_mst_port_has_audio);

bool drm_dp_mst_has_fec(struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port)
{
	bool ret = false;

	port = drm_dp_get_validated_port_ref(mgr, port);
	if (!port)
		return ret;
	ret = port->fec_capability;
	drm_dp_put_port(port);
	return ret;
}
EXPORT_SYMBOL(drm_dp_mst_has_fec);

/**
 * drm_dp_mst_get_edid() - get EDID for an MST port
 * @connector: toplevel connector to get EDID for
+42 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <drm/drm_atomic.h>

struct drm_dp_mst_branch;
struct drm_dp_mst_port;

/**
 * struct drm_dp_vcpi - Virtual Channel Payload Identifier
@@ -42,6 +43,18 @@ struct drm_dp_vcpi {
	int num_slots;
};

struct drm_dp_mst_dsc_dpcd_cache {
	bool valid;
	bool use_parent_dpcd;
	u8 dsc_dpcd[16];
};

struct drm_dp_mst_dsc_info {
	bool dsc_support;
	struct drm_dp_mst_port *dsc_port;
	struct drm_dp_mst_dsc_dpcd_cache dsc_dpcd_cache;
};

/**
 * struct drm_dp_mst_port - MST port
 * @kref: reference count for this port.
@@ -62,6 +75,8 @@ struct drm_dp_vcpi {
 * @vcpi: Virtual Channel Payload info for this port.
 * @connector: DRM connector this port is connected to.
 * @mgr: topology manager this port lives under.
 * @fec_capability: Tracks full path fec capability.
 * @dsc_info: stores dpcd and configuration information.
 *
 * This structure represents an MST port endpoint on a device somewhere
 * in the MST topology.
@@ -98,6 +113,16 @@ struct drm_dp_mst_port {
	 * audio-capable.
	 */
	bool has_audio;
	/**
	 * @fec_capability: Tracks full path fec capability as reported by
	 * enum path resources.
	 */
	bool fec_capability;
	/**
	 * @dsc_info: stores dpcd and configuration information for the mst
	 * port where dsc decoding will be enabled.
	 */
	struct drm_dp_mst_dsc_info dsc_info;
};

/**
@@ -291,6 +316,7 @@ struct drm_dp_port_number_req {

struct drm_dp_enum_path_resources_ack_reply {
	u8 port_number;
	bool fec_capability;
	u16 full_payload_bw_number;
	u16 avail_payload_bw_number;
};
@@ -588,6 +614,10 @@ enum drm_connector_status drm_dp_mst_detect_port(struct drm_connector *connector

bool drm_dp_mst_port_has_audio(struct drm_dp_mst_topology_mgr *mgr,
					struct drm_dp_mst_port *port);

bool drm_dp_mst_has_fec(struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port);

struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);


@@ -634,6 +664,14 @@ int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,
int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr,
				 struct drm_dp_mst_port *port, bool power_up);

int drm_dp_mst_get_dsc_info(struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port,
		struct drm_dp_mst_dsc_info *dsc_info);

int drm_dp_mst_update_dsc_info(struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port,
		struct drm_dp_mst_dsc_info *dsc_info);

int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr,
			   struct drm_dp_mst_port *port,
			   int offset, int size, u8 *bytes);
@@ -642,4 +680,8 @@ int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr,
				 struct drm_dp_mst_port *port,
				 int offset, int size, u8 *bytes);

int drm_dp_mst_get_max_sdp_streams_supported(
		struct drm_dp_mst_topology_mgr *mgr,
		struct drm_dp_mst_port *port);

#endif