drm/amd/display: Add I2C escape to support query device exist.
authorJinZe.Xu <JinZe.Xu@amd.com>
Thu, 10 Mar 2022 22:20:34 +0000 (17:20 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Mar 2022 18:41:03 +0000 (14:41 -0400)
[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.

Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Agustin Gutierrez <agustin.gutierrez@amd.com>
Signed-off-by: JinZe.Xu <JinZe.Xu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dc_link.h
drivers/gpu/drm/amd/display/dc/dce/dce_i2c.c
drivers/gpu/drm/amd/display/dc/dce/dce_i2c.h

index 01b5996..f6e19ef 100644 (file)
@@ -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,
index 78e66e4..aa818bf 100644 (file)
@@ -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,
index dd41736..f5cd239 100644 (file)
 #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,
index a171c5c..535fd58 100644 (file)
 #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,