Commit 46df790c authored by Andrey Grodzovsky's avatar Andrey Grodzovsky Committed by Alex Deucher

drm/amd/display: i2c/aux Remove link index.

Link index is an unnecessery level of inderection when
calling from kernel i2c/aux transfer into DAL.
Signed-off-by: default avatarAndrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 15a27de2
...@@ -546,13 +546,13 @@ enum amdgpu_connector_dither { ...@@ -546,13 +546,13 @@ enum amdgpu_connector_dither {
struct amdgpu_dm_dp_aux { struct amdgpu_dm_dp_aux {
struct drm_dp_aux aux; struct drm_dp_aux aux;
uint32_t link_index; struct ddc_service *ddc_service;
}; };
struct amdgpu_i2c_adapter { struct amdgpu_i2c_adapter {
struct i2c_adapter base; struct i2c_adapter base;
struct amdgpu_display_manager *dm;
uint32_t link_index; struct ddc_service *ddc_service;
}; };
#define TO_DM_AUX(x) container_of((x), struct amdgpu_dm_dp_aux, aux) #define TO_DM_AUX(x) container_of((x), struct amdgpu_dm_dp_aux, aux)
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
#include "dc.h" #include "dc.h"
#include "dm_helpers.h" #include "dm_helpers.h"
#include "dc_link_ddc.h"
/* #define TRACE_DPCD */ /* #define TRACE_DPCD */
#ifdef TRACE_DPCD #ifdef TRACE_DPCD
...@@ -77,43 +79,41 @@ void log_dpcd(uint8_t type, ...@@ -77,43 +79,41 @@ void log_dpcd(uint8_t type,
static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) 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;
enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ? I2C_MOT_TRUE : I2C_MOT_FALSE; enum i2c_mot_mode mot = (msg->request & DP_AUX_I2C_MOT) ? I2C_MOT_TRUE : I2C_MOT_FALSE;
bool res; enum ddc_result res;
switch (msg->request & ~DP_AUX_I2C_MOT) { switch (msg->request & ~DP_AUX_I2C_MOT) {
case DP_AUX_NATIVE_READ: case DP_AUX_NATIVE_READ:
res = dc_read_aux_dpcd( res = dal_ddc_service_read_dpcd_data(
dc, TO_DM_AUX(aux)->ddc_service,
TO_DM_AUX(aux)->link_index, false,
I2C_MOT_UNDEF,
msg->address, msg->address,
msg->buffer, msg->buffer,
msg->size); msg->size);
break; break;
case DP_AUX_NATIVE_WRITE: case DP_AUX_NATIVE_WRITE:
res = dc_write_aux_dpcd( res = dal_ddc_service_write_dpcd_data(
dc, TO_DM_AUX(aux)->ddc_service,
TO_DM_AUX(aux)->link_index, false,
I2C_MOT_UNDEF,
msg->address, msg->address,
msg->buffer, msg->buffer,
msg->size); msg->size);
break; break;
case DP_AUX_I2C_READ: case DP_AUX_I2C_READ:
res = dc_read_aux_i2c( res = dal_ddc_service_read_dpcd_data(
dc, TO_DM_AUX(aux)->ddc_service,
TO_DM_AUX(aux)->link_index, true,
mot, mot,
msg->address, msg->address,
msg->buffer, msg->buffer,
msg->size); msg->size);
break; break;
case DP_AUX_I2C_WRITE: case DP_AUX_I2C_WRITE:
res = dc_write_aux_i2c( res = dal_ddc_service_write_dpcd_data(
dc, TO_DM_AUX(aux)->ddc_service,
TO_DM_AUX(aux)->link_index, true,
mot, mot,
msg->address, msg->address,
msg->buffer, msg->buffer,
...@@ -128,7 +128,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg ...@@ -128,7 +128,7 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg
msg->address, msg->address,
msg->buffer, msg->buffer,
msg->size, msg->size,
res); r == DDC_RESULT_SUCESSFULL);
#endif #endif
return msg->size; return msg->size;
...@@ -444,7 +444,7 @@ void amdgpu_dm_initialize_dp_connector( ...@@ -444,7 +444,7 @@ void amdgpu_dm_initialize_dp_connector(
aconnector->dm_dp_aux.aux.name = "dmdc"; aconnector->dm_dp_aux.aux.name = "dmdc";
aconnector->dm_dp_aux.aux.dev = dm->adev->dev; aconnector->dm_dp_aux.aux.dev = dm->adev->dev;
aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer; 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); drm_dp_aux_register(&aconnector->dm_dp_aux.aux);
aconnector->mst_mgr.cbs = &dm_mst_cbs; aconnector->mst_mgr.cbs = &dm_mst_cbs;
......
...@@ -50,6 +50,8 @@ ...@@ -50,6 +50,8 @@
#include "modules/inc/mod_freesync.h" #include "modules/inc/mod_freesync.h"
#include "i2caux_interface.h"
struct dm_connector_state { struct dm_connector_state {
struct drm_connector_state base; struct drm_connector_state base;
...@@ -1999,6 +2001,7 @@ int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap, ...@@ -1999,6 +2001,7 @@ int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap,
struct i2c_msg *msgs, int num) struct i2c_msg *msgs, int num)
{ {
struct amdgpu_i2c_adapter *i2c = i2c_get_adapdata(i2c_adap); struct amdgpu_i2c_adapter *i2c = i2c_get_adapdata(i2c_adap);
struct ddc_service *ddc_service = i2c->ddc_service;
struct i2c_command cmd; struct i2c_command cmd;
int i; int i;
int result = -EIO; int result = -EIO;
...@@ -2019,11 +2022,13 @@ int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap, ...@@ -2019,11 +2022,13 @@ int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap,
cmd.payloads[i].data = msgs[i].buf; cmd.payloads[i].data = msgs[i].buf;
} }
if (dc_submit_i2c(i2c->dm->dc, i2c->link_index, &cmd)) if (dal_i2caux_submit_i2c_command(
ddc_service->ctx->i2caux,
ddc_service->ddc_pin,
&cmd))
result = num; result = num;
kfree(cmd.payloads); kfree(cmd.payloads);
return result; return result;
} }
...@@ -2037,19 +2042,22 @@ static const struct i2c_algorithm amdgpu_dm_i2c_algo = { ...@@ -2037,19 +2042,22 @@ static const struct i2c_algorithm amdgpu_dm_i2c_algo = {
.functionality = amdgpu_dm_i2c_func, .functionality = amdgpu_dm_i2c_func,
}; };
struct amdgpu_i2c_adapter *create_i2c(unsigned int link_index, struct amdgpu_display_manager *dm, int *res) static struct amdgpu_i2c_adapter *create_i2c(
struct ddc_service *ddc_service,
int link_index,
int *res)
{ {
struct amdgpu_device *adev = ddc_service->ctx->driver_context;
struct amdgpu_i2c_adapter *i2c; struct amdgpu_i2c_adapter *i2c;
i2c = kzalloc(sizeof (struct amdgpu_i2c_adapter), GFP_KERNEL); i2c = kzalloc(sizeof (struct amdgpu_i2c_adapter), GFP_KERNEL);
i2c->dm = dm;
i2c->base.owner = THIS_MODULE; i2c->base.owner = THIS_MODULE;
i2c->base.class = I2C_CLASS_DDC; i2c->base.class = I2C_CLASS_DDC;
i2c->base.dev.parent = &dm->adev->pdev->dev; i2c->base.dev.parent = &adev->pdev->dev;
i2c->base.algo = &amdgpu_dm_i2c_algo; i2c->base.algo = &amdgpu_dm_i2c_algo;
snprintf(i2c->base.name, sizeof (i2c->base.name), "AMDGPU DM i2c hw bus %d", link_index); snprintf(i2c->base.name, sizeof (i2c->base.name), "AMDGPU DM i2c hw bus %d", link_index);
i2c->link_index = link_index;
i2c_set_adapdata(&i2c->base, i2c); i2c_set_adapdata(&i2c->base, i2c);
i2c->ddc_service = ddc_service;
return i2c; return i2c;
} }
...@@ -2071,7 +2079,7 @@ int amdgpu_dm_connector_init( ...@@ -2071,7 +2079,7 @@ int amdgpu_dm_connector_init(
DRM_DEBUG_KMS("%s()\n", __func__); DRM_DEBUG_KMS("%s()\n", __func__);
i2c = create_i2c(link->link_index, dm, &res); i2c = create_i2c(link->ddc, link->link_index, &res);
aconnector->i2c = i2c; aconnector->i2c = i2c;
res = i2c_add_adapter(&i2c->base); res = i2c_add_adapter(&i2c->base);
......
...@@ -1525,13 +1525,6 @@ const struct graphics_object_id dc_get_link_id_at_index( ...@@ -1525,13 +1525,6 @@ const struct graphics_object_id dc_get_link_id_at_index(
return core_dc->links[link_index]->link_id; return core_dc->links[link_index]->link_id;
} }
const struct ddc_service *dc_get_ddc_at_index(
struct dc *dc, uint32_t link_index)
{
struct core_dc *core_dc = DC_TO_CORE(dc);
return core_dc->links[link_index]->ddc;
}
enum dc_irq_source dc_get_hpd_irq_source_at_index( enum dc_irq_source dc_get_hpd_irq_source_at_index(
struct dc *dc, uint32_t link_index) struct dc *dc, uint32_t link_index)
{ {
...@@ -1639,7 +1632,7 @@ bool dc_read_aux_dpcd( ...@@ -1639,7 +1632,7 @@ bool dc_read_aux_dpcd(
struct core_link *link = core_dc->links[link_index]; struct core_link *link = core_dc->links[link_index];
enum ddc_result r = dal_ddc_service_read_dpcd_data( enum ddc_result r = dal_ddc_service_read_dpcd_data(
link->ddc, link->public.ddc,
false, false,
I2C_MOT_UNDEF, I2C_MOT_UNDEF,
address, address,
...@@ -1659,7 +1652,7 @@ bool dc_write_aux_dpcd( ...@@ -1659,7 +1652,7 @@ bool dc_write_aux_dpcd(
struct core_link *link = core_dc->links[link_index]; struct core_link *link = core_dc->links[link_index];
enum ddc_result r = dal_ddc_service_write_dpcd_data( enum ddc_result r = dal_ddc_service_write_dpcd_data(
link->ddc, link->public.ddc,
false, false,
I2C_MOT_UNDEF, I2C_MOT_UNDEF,
address, address,
...@@ -1680,7 +1673,7 @@ bool dc_read_aux_i2c( ...@@ -1680,7 +1673,7 @@ bool dc_read_aux_i2c(
struct core_link *link = core_dc->links[link_index]; struct core_link *link = core_dc->links[link_index];
enum ddc_result r = dal_ddc_service_read_dpcd_data( enum ddc_result r = dal_ddc_service_read_dpcd_data(
link->ddc, link->public.ddc,
true, true,
mot, mot,
address, address,
...@@ -1701,7 +1694,7 @@ bool dc_write_aux_i2c( ...@@ -1701,7 +1694,7 @@ bool dc_write_aux_i2c(
struct core_link *link = core_dc->links[link_index]; struct core_link *link = core_dc->links[link_index];
enum ddc_result r = dal_ddc_service_write_dpcd_data( enum ddc_result r = dal_ddc_service_write_dpcd_data(
link->ddc, link->public.ddc,
true, true,
mot, mot,
address, address,
...@@ -1724,7 +1717,7 @@ bool dc_query_ddc_data( ...@@ -1724,7 +1717,7 @@ bool dc_query_ddc_data(
struct core_link *link = core_dc->links[link_index]; struct core_link *link = core_dc->links[link_index];
bool result = dal_ddc_service_query_ddc_data( bool result = dal_ddc_service_query_ddc_data(
link->ddc, link->public.ddc,
address, address,
write_buf, write_buf,
write_size, write_size,
...@@ -1742,7 +1735,7 @@ bool dc_submit_i2c( ...@@ -1742,7 +1735,7 @@ bool dc_submit_i2c(
struct core_dc *core_dc = DC_TO_CORE(dc); struct core_dc *core_dc = DC_TO_CORE(dc);
struct core_link *link = core_dc->links[link_index]; struct core_link *link = core_dc->links[link_index];
struct ddc_service *ddc = link->ddc; struct ddc_service *ddc = link->public.ddc;
return dal_i2caux_submit_i2c_command( return dal_i2caux_submit_i2c_command(
ddc->ctx->i2caux, ddc->ctx->i2caux,
......
...@@ -66,8 +66,8 @@ static void destruct(struct core_link *link) ...@@ -66,8 +66,8 @@ static void destruct(struct core_link *link)
{ {
int i; int i;
if (link->ddc) if (link->public.ddc)
dal_ddc_service_destroy(&link->ddc); dal_ddc_service_destroy(&link->public.ddc);
if(link->link_enc) if(link->link_enc)
link->link_enc->funcs->destroy(&link->link_enc); link->link_enc->funcs->destroy(&link->link_enc);
...@@ -320,7 +320,7 @@ static bool is_dp_sink_present(struct core_link *link) ...@@ -320,7 +320,7 @@ static bool is_dp_sink_present(struct core_link *link)
((connector_id == CONNECTOR_ID_DISPLAY_PORT) || ((connector_id == CONNECTOR_ID_DISPLAY_PORT) ||
(connector_id == CONNECTOR_ID_EDP)); (connector_id == CONNECTOR_ID_EDP));
ddc = dal_ddc_service_get_ddc_pin(link->ddc); ddc = dal_ddc_service_get_ddc_pin(link->public.ddc);
if (!ddc) { if (!ddc) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
...@@ -526,7 +526,7 @@ static void detect_dp( ...@@ -526,7 +526,7 @@ static void detect_dp(
} }
} else { } else {
/* DP passive dongles */ /* DP passive dongles */
sink_caps->signal = dp_passive_dongle_detection(link->ddc, sink_caps->signal = dp_passive_dongle_detection(link->public.ddc,
sink_caps, sink_caps,
audio_support); audio_support);
} }
...@@ -629,11 +629,11 @@ bool dc_link_detect(const struct dc_link *dc_link, bool boot) ...@@ -629,11 +629,11 @@ bool dc_link_detect(const struct dc_link *dc_link, bool boot)
link->dpcd_sink_count = 1; link->dpcd_sink_count = 1;
dal_ddc_service_set_transaction_type( dal_ddc_service_set_transaction_type(
link->ddc, link->public.ddc,
sink_caps.transaction_type); sink_caps.transaction_type);
link->public.aux_mode = dal_ddc_service_is_in_aux_transaction_mode( link->public.aux_mode = dal_ddc_service_is_in_aux_transaction_mode(
link->ddc); link->public.ddc);
sink_init_data.link = &link->public; sink_init_data.link = &link->public;
sink_init_data.sink_signal = sink_caps.signal; sink_init_data.sink_signal = sink_caps.signal;
...@@ -784,7 +784,7 @@ static enum channel_id get_ddc_line(struct core_link *link) ...@@ -784,7 +784,7 @@ static enum channel_id get_ddc_line(struct core_link *link)
struct ddc *ddc; struct ddc *ddc;
enum channel_id channel = CHANNEL_ID_UNKNOWN; enum channel_id channel = CHANNEL_ID_UNKNOWN;
ddc = dal_ddc_service_get_ddc_pin(link->ddc); ddc = dal_ddc_service_get_ddc_pin(link->public.ddc);
if (ddc) { if (ddc) {
switch (dal_ddc_get_line(ddc)) { switch (dal_ddc_get_line(ddc)) {
...@@ -971,16 +971,16 @@ static bool construct( ...@@ -971,16 +971,16 @@ static bool construct(
ddc_service_init_data.ctx = link->ctx; ddc_service_init_data.ctx = link->ctx;
ddc_service_init_data.id = link->link_id; ddc_service_init_data.id = link->link_id;
ddc_service_init_data.link = link; ddc_service_init_data.link = link;
link->ddc = dal_ddc_service_create(&ddc_service_init_data); link->public.ddc = dal_ddc_service_create(&ddc_service_init_data);
if (NULL == link->ddc) { if (link->public.ddc == NULL) {
DC_ERROR("Failed to create ddc_service!\n"); DC_ERROR("Failed to create ddc_service!\n");
goto ddc_create_fail; goto ddc_create_fail;
} }
link->public.ddc_hw_inst = link->public.ddc_hw_inst =
dal_ddc_get_line( dal_ddc_get_line(
dal_ddc_service_get_ddc_pin(link->ddc)); dal_ddc_service_get_ddc_pin(link->public.ddc));
enc_init_data.ctx = dc_ctx; enc_init_data.ctx = dc_ctx;
bp_funcs->get_src_obj(dc_ctx->dc_bios, link->link_id, 0, &enc_init_data.encoder); bp_funcs->get_src_obj(dc_ctx->dc_bios, link->link_id, 0, &enc_init_data.encoder);
...@@ -1049,7 +1049,7 @@ static bool construct( ...@@ -1049,7 +1049,7 @@ static bool construct(
device_tag_fail: device_tag_fail:
link->link_enc->funcs->destroy(&link->link_enc); link->link_enc->funcs->destroy(&link->link_enc);
link_enc_create_fail: link_enc_create_fail:
dal_ddc_service_destroy(&link->ddc); dal_ddc_service_destroy(&link->public.ddc);
ddc_create_fail: ddc_create_fail:
create_fail: create_fail:
...@@ -1256,7 +1256,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) ...@@ -1256,7 +1256,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) if (dc_is_hdmi_signal(pipe_ctx->stream->signal))
dal_ddc_service_write_scdc_data( dal_ddc_service_write_scdc_data(
stream->sink->link->ddc, stream->sink->link->public.ddc,
stream->phy_pix_clk, stream->phy_pix_clk,
stream->public.timing.flags.LTE_340MCSC_SCRAMBLE); stream->public.timing.flags.LTE_340MCSC_SCRAMBLE);
...@@ -1276,7 +1276,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) ...@@ -1276,7 +1276,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
stream->phy_pix_clk); stream->phy_pix_clk);
if (pipe_ctx->stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) if (pipe_ctx->stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
dal_ddc_service_read_scdc_data(link->ddc); dal_ddc_service_read_scdc_data(link->public.ddc);
} }
/****************************enable_link***********************************/ /****************************enable_link***********************************/
...@@ -1474,7 +1474,7 @@ bool dc_link_setup_psr(const struct dc_link *dc_link, ...@@ -1474,7 +1474,7 @@ bool dc_link_setup_psr(const struct dc_link *dc_link,
&psr_configuration.raw, &psr_configuration.raw,
sizeof(psr_configuration.raw)); sizeof(psr_configuration.raw));
psr_context.channel = link->ddc->ddc_pin->hw_info.ddc_channel; psr_context.channel = link->public.ddc->ddc_pin->hw_info.ddc_channel;
psr_context.transmitterId = link->link_enc->transmitter; psr_context.transmitterId = link->link_enc->transmitter;
psr_context.engineId = link->link_enc->preferred_engine; psr_context.engineId = link->link_enc->preferred_engine;
......
...@@ -1913,7 +1913,7 @@ static void get_active_converter_info( ...@@ -1913,7 +1913,7 @@ static void get_active_converter_info(
/* decode converter info*/ /* decode converter info*/
if (!ds_port.fields.PORT_PRESENT) { if (!ds_port.fields.PORT_PRESENT) {
link->dpcd_caps.dongle_type = DISPLAY_DONGLE_NONE; link->dpcd_caps.dongle_type = DISPLAY_DONGLE_NONE;
ddc_service_set_dongle_type(link->ddc, ddc_service_set_dongle_type(link->public.ddc,
link->dpcd_caps.dongle_type); link->dpcd_caps.dongle_type);
return; return;
} }
...@@ -1983,7 +1983,7 @@ static void get_active_converter_info( ...@@ -1983,7 +1983,7 @@ static void get_active_converter_info(
} }
} }
ddc_service_set_dongle_type(link->ddc, link->dpcd_caps.dongle_type); ddc_service_set_dongle_type(link->public.ddc, link->dpcd_caps.dongle_type);
{ {
struct dp_device_vendor_id dp_id; struct dp_device_vendor_id dp_id;
......
...@@ -646,6 +646,8 @@ struct dc_link { ...@@ -646,6 +646,8 @@ struct dc_link {
void *priv; void *priv;
bool aux_mode; bool aux_mode;
struct ddc_service *ddc;
}; };
struct dpcd_caps { struct dpcd_caps {
...@@ -829,13 +831,6 @@ void dc_set_power_state( ...@@ -829,13 +831,6 @@ void dc_set_power_state(
enum dc_acpi_cm_power_state power_state); enum dc_acpi_cm_power_state power_state);
void dc_resume(const struct dc *dc); void dc_resume(const struct dc *dc);
/*******************************************************************************
* DDC Interfaces
******************************************************************************/
const struct ddc_service *dc_get_ddc_at_index(
struct dc *dc, uint32_t link_index);
/* /*
* DPCD access interfaces * DPCD access interfaces
*/ */
......
...@@ -151,7 +151,6 @@ struct core_link { ...@@ -151,7 +151,6 @@ struct core_link {
struct dc_context *ctx; /* TODO: AUTO remove 'dal' when DC is complete*/ struct dc_context *ctx; /* TODO: AUTO remove 'dal' when DC is complete*/
struct link_encoder *link_enc; struct link_encoder *link_enc;
struct ddc_service *ddc;
struct graphics_object_id link_id; struct graphics_object_id link_id;
union ddi_channel_mapping ddi_channel_mapping; union ddi_channel_mapping ddi_channel_mapping;
struct connector_device_tag_info device_tag; struct connector_device_tag_info device_tag;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment