[PATCH 01/12] drm/amd/display: Add I2C escape to support query device exist.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: "JinZe.Xu" <JinZe.Xu@xxxxxxx>

[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@xxxxxxx>
Acked-by: Agustin Gutierrez <agustin.gutierrez@xxxxxxx>
Signed-off-by: JinZe.Xu <JinZe.Xu@xxxxxxx>
---
 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,
-- 
2.35.1




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux