]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
drm/amd/display: Merge amdgpu_dm_types and amdgpu_dm
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / amd / display / amdgpu_dm / amdgpu_dm_mst_types.c
index 069511bb6fab5921afe716fb01894bffd46df084..82e4d49fb1844f911579263c5e44535341aa2a56 100644 (file)
 #include <drm/drm_atomic_helper.h>
 #include "dm_services.h"
 #include "amdgpu.h"
-#include "amdgpu_dm_types.h"
+#include "amdgpu_dm.h"
 #include "amdgpu_dm_mst_types.h"
 
 #include "dc.h"
 #include "dm_helpers.h"
 
+#include "dc_link_ddc.h"
+
 /* #define TRACE_DPCD */
 
 #ifdef TRACE_DPCD
@@ -77,28 +79,45 @@ void log_dpcd(uint8_t type,
 
 static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
 {
-       struct pci_dev *pdev = to_pci_dev(aux->dev);
-       struct drm_device *drm_dev = pci_get_drvdata(pdev);
-       struct amdgpu_device *adev = drm_dev->dev_private;
-       struct dc *dc = adev->dm.dc;
-       bool res;
+       enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ? I2C_MOT_TRUE : I2C_MOT_FALSE;
+       enum ddc_result res;
 
-       switch (msg->request) {
+       switch (msg->request & ~DP_AUX_I2C_MOT) {
        case DP_AUX_NATIVE_READ:
-               res = dc_read_dpcd(
-                       dc,
-                       TO_DM_AUX(aux)->link_index,
-                       msg->address,
-                       msg->buffer,
-                       msg->size);
+               res = dal_ddc_service_read_dpcd_data(
+                               TO_DM_AUX(aux)->ddc_service,
+                               false,
+                               I2C_MOT_UNDEF,
+                               msg->address,
+                               msg->buffer,
+                               msg->size);
                break;
        case DP_AUX_NATIVE_WRITE:
-               res = dc_write_dpcd(
-                       dc,
-                       TO_DM_AUX(aux)->link_index,
-                       msg->address,
-                       msg->buffer,
-                       msg->size);
+               res = dal_ddc_service_write_dpcd_data(
+                               TO_DM_AUX(aux)->ddc_service,
+                               false,
+                               I2C_MOT_UNDEF,
+                               msg->address,
+                               msg->buffer,
+                               msg->size);
+               break;
+       case DP_AUX_I2C_READ:
+               res = dal_ddc_service_read_dpcd_data(
+                               TO_DM_AUX(aux)->ddc_service,
+                               true,
+                               mot,
+                               msg->address,
+                               msg->buffer,
+                               msg->size);
+               break;
+       case DP_AUX_I2C_WRITE:
+               res = dal_ddc_service_write_dpcd_data(
+                               TO_DM_AUX(aux)->ddc_service,
+                               true,
+                               mot,
+                               msg->address,
+                               msg->buffer,
+                               msg->size);
                break;
        default:
                return 0;
@@ -109,7 +128,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg
                        msg->address,
                        msg->buffer,
                        msg->size,
-                       res);
+                       r == DDC_RESULT_SUCESSFULL);
 #endif
 
        return msg->size;
@@ -149,7 +168,8 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
        .reset = amdgpu_dm_connector_funcs_reset,
        .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-       .atomic_set_property = amdgpu_dm_connector_atomic_set_property
+       .atomic_set_property = amdgpu_dm_connector_atomic_set_property,
+       .atomic_get_property = amdgpu_dm_connector_atomic_get_property
 };
 
 static int dm_dp_mst_get_modes(struct drm_connector *connector)
@@ -418,14 +438,14 @@ static const struct drm_dp_mst_topology_cbs dm_mst_cbs = {
        .register_connector = dm_dp_mst_register_connector
 };
 
-void amdgpu_dm_initialize_mst_connector(
+void amdgpu_dm_initialize_dp_connector(
        struct amdgpu_display_manager *dm,
        struct amdgpu_connector *aconnector)
 {
        aconnector->dm_dp_aux.aux.name = "dmdc";
        aconnector->dm_dp_aux.aux.dev = dm->adev->dev;
        aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer;
-       aconnector->dm_dp_aux.link_index = aconnector->connector_id;
+       aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc;
 
        drm_dp_aux_register(&aconnector->dm_dp_aux.aux);
        aconnector->mst_mgr.cbs = &dm_mst_cbs;