Dear Augustin,

Am 10.03.22 um 23:20 schrieb Agustin Gutierrez:
From: "JinZe.Xu" <jinze...@amd.com>

Please remove the dot/period and use Jin Ze Xu.

Also please remove the dot/period at the end of the git commit message summary.

[How]
1. Search OEM I2C info from BIOS and compare with input parameter.
2. If BIOS doesn't record it, just try to read one byte.

Please describe the problem in more detail.

Reviewed-by: Aric Cyr <aric....@amd.com>
Acked-by: Agustin Gutierrez <agustin.gutier...@amd.com>
Signed-off-by: JinZe.Xu <jinze...@amd.com>

Ditto.

---
  drivers/gpu/drm/amd/display/dc/core/dc.c     | 13 ++++++++++
  drivers/gpu/drm/amd/display/dc/dc_link.h     |  5 ++++
  drivers/gpu/drm/amd/display/dc/dce/dce_i2c.c | 26 ++++++++++++++++++++
  drivers/gpu/drm/amd/display/dc/dce/dce_i2c.h |  6 +++++
  4 files changed, 50 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 01b5996fa3aa..f6e19efea756 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -3363,6 +3363,19 @@ bool dc_is_dmcu_initialized(struct dc *dc)
        return false;
  }
+bool dc_is_oem_i2c_device_present(
+       struct dc *dc,
+       size_t slave_address)
+{
+       if (dc->res_pool->oem_device)
+               return dce_i2c_oem_device_present(
+                       dc->res_pool,
+                       dc->res_pool->oem_device,
+                       slave_address);
+
+       return false;
+}
+
  bool dc_submit_i2c(
                struct dc *dc,
                uint32_t link_index,
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h 
b/drivers/gpu/drm/amd/display/dc/dc_link.h
index 78e66e4bab5a..aa818bf840eb 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -466,6 +466,11 @@ const struct dc_link_settings *dc_link_get_link_cap(
  void dc_link_overwrite_extended_receiver_cap(
                struct dc_link *link);
+bool dc_is_oem_i2c_device_present(
+       struct dc *dc,
+       size_t slave_address
+);
+
  bool dc_submit_i2c(
                struct dc *dc,
                uint32_t link_index,
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.c 
b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.c
index dd41736bb5c4..f5cd2392fc5f 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.c
@@ -25,6 +25,32 @@
  #include "dce_i2c.h"
  #include "reg_helper.h"
+bool dce_i2c_oem_device_present(
+       struct resource_pool *pool,
+       struct ddc_service *ddc,
+       size_t slave_address
+)
+{
+       struct dc *dc = ddc->ctx->dc;
+       struct dc_bios *dcb = dc->ctx->dc_bios;
+       struct graphics_object_id id = {0};
+       struct graphics_object_i2c_info i2c_info;
+
+       if (!dc->ctx->dc_bios->fw_info.oem_i2c_present)
+               return false;
+
+       id.id = dc->ctx->dc_bios->fw_info.oem_i2c_obj_id;
+       id.enum_id = 0;
+       id.type = OBJECT_TYPE_GENERIC;
+       if (dcb->funcs->get_i2c_info(dcb, id, &i2c_info) != BP_RESULT_OK)
+               return false;
+
+       if (i2c_info.i2c_slave_address != slave_address)
+               return false;
+
+       return true;
+}
+
  bool dce_i2c_submit_command(
        struct resource_pool *pool,
        struct ddc *ddc,
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.h 
b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.h
index a171c5cd8439..535fd58de450 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_i2c.h
@@ -30,6 +30,12 @@
  #include "dce_i2c_hw.h"
  #include "dce_i2c_sw.h"
+bool dce_i2c_oem_device_present(
+       struct resource_pool *pool,
+       struct ddc_service *ddc,
+       size_t slave_address
+);
+
  bool dce_i2c_submit_command(
        struct resource_pool *pool,
        struct ddc *ddc,

Reply via email to