aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0666-drm-amd-dal-Clean-up-payload-allocation-table-creati.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0666-drm-amd-dal-Clean-up-payload-allocation-table-creati.patch')
-rw-r--r--common/recipes-kernel/linux/files/0666-drm-amd-dal-Clean-up-payload-allocation-table-creati.patch265
1 files changed, 265 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0666-drm-amd-dal-Clean-up-payload-allocation-table-creati.patch b/common/recipes-kernel/linux/files/0666-drm-amd-dal-Clean-up-payload-allocation-table-creati.patch
new file mode 100644
index 00000000..dd004da1
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0666-drm-amd-dal-Clean-up-payload-allocation-table-creati.patch
@@ -0,0 +1,265 @@
+From d81c058644e81c8ac321d3e7747c4133a78e120a Mon Sep 17 00:00:00 2001
+From: Harry Wentland <harry.wentland@amd.com>
+Date: Wed, 2 Dec 2015 23:25:25 -0500
+Subject: [PATCH 0666/1110] drm/amd/dal: Clean up payload allocation table
+ creation
+
+Using mst_mgr payload's vcpi now since it's been upstreamed.
+
+Also breaking payload table creation into more readble chunks.
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Jordan Lazare <Jordan.Lazare@amd.com>
+---
+ .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c | 201 ++++++++-------------
+ 1 file changed, 80 insertions(+), 121 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
+index 744ab94..3a71159 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
+@@ -160,6 +160,84 @@ static struct amdgpu_connector *get_connector_for_link(
+ return aconnector;
+ }
+
++static const struct dc_stream *get_stream_for_vcid(
++ struct drm_device *dev,
++ struct amdgpu_connector *master_port,
++ int vcid)
++{
++ struct drm_connector *connector;
++ struct amdgpu_connector *aconnector;
++ struct drm_crtc *crtc;
++ struct amdgpu_crtc *acrtc;
++ struct dc_target *dc_target;
++
++ list_for_each_entry(
++ connector,
++ &dev->mode_config.connector_list,
++ head) {
++
++ aconnector = to_amdgpu_connector(connector);
++
++ /* Check whether mst connector */
++ if (!aconnector->mst_port)
++ continue;
++
++ /* Check whether same physical connector. */
++ if (master_port != aconnector->mst_port) {
++ continue;
++ }
++
++ if (aconnector->port->vcpi.vcpi == vcid) {
++ crtc = aconnector->base.state->crtc;
++ acrtc = to_amdgpu_crtc(crtc);
++ dc_target = acrtc->target;
++ return dc_target->streams[0];
++ }
++ }
++ return NULL;
++}
++
++static void get_payload_table(
++ struct drm_device *dev,
++ struct amdgpu_connector *aconnector,
++ struct dp_mst_stream_allocation_table *table)
++{
++ int i;
++ struct drm_dp_mst_topology_mgr *mst_mgr = &aconnector->mst_port->mst_mgr;
++ struct amdgpu_connector *master_port = aconnector->mst_port;
++
++ mutex_lock(&mst_mgr->payload_lock);
++
++ /* number of active streams */
++ for (i = 0; i < mst_mgr->max_payloads; i++) {
++ if (mst_mgr->payloads[i].num_slots == 0)
++ break;
++
++ if (mst_mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL ||
++ mst_mgr->payloads[i].payload_state == DP_PAYLOAD_REMOTE) {
++ table->stream_allocations[i].slot_count = mst_mgr->payloads[i].num_slots;
++ table->stream_allocations[i].stream =
++ get_stream_for_vcid(
++ dev,
++ master_port,
++ mst_mgr->payloads[i].vcpi);
++
++ if (mst_mgr->payloads[i].vcpi ==
++ aconnector->port->vcpi.vcpi)
++ table->cur_stream_payload_idx = i;
++
++ /* TODO remove the following and calculate in DC */
++ table->stream_allocations[i].pbn_per_slot = mst_mgr->pbn_div;
++ table->stream_allocations[i].pbn = mst_mgr->proposed_vcpis[i]->pbn;
++ }
++ }
++
++ table->stream_count = i;
++
++ mutex_unlock(&mst_mgr->payload_lock);
++
++}
++
+ /*
+ * Writes payload allocation table in immediate downstream device.
+ */
+@@ -172,28 +250,20 @@ bool dc_helpers_dp_mst_write_payload_allocation_table(
+ struct amdgpu_device *adev = ctx->driver_context;
+ struct drm_device *dev = adev->ddev;
+ struct amdgpu_connector *aconnector;
+- struct drm_connector *connector;
+- struct amdgpu_crtc *amdgpu_crtc;
+- struct drm_crtc *crtc;
+ struct drm_dp_mst_topology_mgr *mst_mgr;
+ struct drm_dp_mst_port *mst_port;
+- struct amdgpu_connector *master_port;
+ int slots = 0;
+ bool ret;
+ int clock;
+ int bpp = 0;
+ int pbn = 0;
+- uint8_t i;
+- uint8_t vcid = 0;
+- bool find_stream_for_sink;
+
+ aconnector = get_connector_for_sink(dev, stream->sink);
+
+ if (!aconnector->mst_port)
+ return false;
+
+- master_port = aconnector->mst_port;
+- mst_mgr = &master_port->mst_mgr;
++ mst_mgr = &aconnector->mst_port->mst_mgr;
+
+ if (!mst_mgr->mst_state)
+ return false;
+@@ -235,8 +305,6 @@ bool dc_helpers_dp_mst_write_payload_allocation_table(
+ pbn = drm_dp_calc_pbn_mode(clock, bpp);
+
+ ret = drm_dp_mst_allocate_vcpi(mst_mgr, mst_port, pbn, &slots);
+- /* mst_port->vcpi.vcpi is vc_id for this stream.*/
+- vcid = mst_port->vcpi.vcpi;
+
+ if (!ret)
+ return false;
+@@ -252,116 +320,7 @@ bool dc_helpers_dp_mst_write_payload_allocation_table(
+ * stream. AMD ASIC stream slot allocation should follow the same
+ * sequence. copy DRM MST allocation to dc */
+
+- mutex_lock(&mst_mgr->payload_lock);
+-
+- /* number of active streams */
+- for (i = 0; i < mst_mgr->max_payloads; i++) {
+- if (mst_mgr->payloads[i].num_slots == 0)
+- break;
+- }
+-
+- table->stream_count = i;
+-
+- for (i = 0; i < table->stream_count; i++) {
+- table->stream_allocations[i].slot_count =
+- mst_mgr->proposed_vcpis[i]->num_slots;
+- /*
+- * mst_mgr->pbn_div is fixed value after link training for
+- * current link PHY
+- */
+- table->stream_allocations[i].pbn_per_slot = mst_mgr->pbn_div;
+-
+- /*
+- * find which payload is for current stream after
+- * drm_dp_update_payload_part1, payload and proposed_vcpis
+- * are sync to the same allocation sequence. vcpi is not saved
+- * into payload by drm_dp_update_payload_part1. In order to
+- * find sequence of a payload within allocation sequence, we
+- * need check vcpi from proposed_vcpis
+- */
+-
+- table->stream_allocations[i].pbn =
+- mst_mgr->proposed_vcpis[i]->pbn;
+-
+- if (mst_mgr->proposed_vcpis[i]->vcpi == vcid)
+- table->cur_stream_payload_idx = i;
+-
+- find_stream_for_sink = false;
+-
+- list_for_each_entry(
+- connector,
+- &dev->mode_config.connector_list,
+- head) {
+- const struct dc_sink *dc_sink;
+- struct dc_target *dc_target;
+- uint8_t j;
+-
+- aconnector = to_amdgpu_connector(connector);
+-
+- /* not mst connector */
+- if (!aconnector->mst_port)
+- continue;
+-
+- if (master_port != aconnector->mst_port) {
+- /* Not the same physical connector. */
+- continue;
+- }
+-
+- mst_port = aconnector->port;
+-
+- if (mst_port->vcpi.vcpi !=
+- mst_mgr->proposed_vcpis[i]->vcpi)
+- continue;
+-
+- /* find connector with same vcid as payload */
+-
+- dc_sink = aconnector->dc_sink;
+-
+- /*
+- * find stream to drive this sink
+- * crtc -> target -> stream -> sink
+- */
+- crtc = aconnector->base.state->crtc;
+-
+- /*
+- * this situation can happen when crtc moved from one
+- * connector to another for any reason
+- */
+- if (!crtc)
+- continue;
+-
+- amdgpu_crtc = to_amdgpu_crtc(crtc);
+- dc_target = amdgpu_crtc->target;
+-
+- for (j = 0; j < dc_target->stream_count; j++) {
+- if (dc_target->streams[j]->sink ==
+- dc_sink)
+- break;
+- }
+-
+- if (j < dc_target->stream_count) {
+- /*
+- * find sink --> stream --> target -->
+- * connector
+- */
+- table->stream_allocations[i].stream =
+- dc_target->streams[j];
+- /* exit loop connector */
+- find_stream_for_sink = true;
+- break;
+- }
+- }
+-
+- if (!find_stream_for_sink) {
+- /*
+- * TODO: do not find stream for sink. This should not
+- * happen
+- */
+- ASSERT(0);
+- }
+- }
+-
+- mutex_unlock(&mst_mgr->payload_lock);
++ get_payload_table(dev, aconnector, table);
+
+ if (ret)
+ return false;
+--
+2.7.4
+