Commit a0248d54 authored by JinZe.Xu's avatar JinZe.Xu Committed by Alex Deucher
Browse files

drm/amd/display: Add I2C escape to support query device exist.



[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: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarAgustin Gutierrez <agustin.gutierrez@amd.com>
Signed-off-by: default avatarJinZe.Xu <JinZe.Xu@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 436afdfa
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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,
+5 −0
Original line number Diff line number Diff line
@@ -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,
+26 −0
Original line number Diff line number Diff line
@@ -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,
+6 −0
Original line number Diff line number Diff line
@@ -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,