drivers/gpu/drm/amd/display/dc/link/protocols/link_ddc.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/link/protocols/link_ddc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/dc/link/protocols/link_ddc.c- Extension
.c- Size
- 19290 bytes
- Lines
- 703
- Domain
- Driver Families
- Bucket
- drivers/gpu
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
link_ddc.hlink_hdmi_frl.hvector.hdce/dce_aux.hdal_asic_id.hlink_dpcd.hdm_helpers.hatomfirmware.h
Detected Declarations
struct i2c_payloadsfunction i2c_payloads_createfunction i2c_payloads_get_countfunction i2c_payloads_destroyfunction i2c_payloads_addfunction ddc_service_constructfunction ddc_service_destructfunction link_destroy_ddc_servicefunction set_ddc_transaction_typefunction link_is_in_aux_transaction_modefunction set_dongle_typefunction defer_delay_converter_wafunction link_get_aux_defer_delayfunction submit_aux_commandfunction link_query_ddc_datafunction link_aux_transfer_rawfunction link_get_fixed_vs_pe_retimer_write_addressfunction link_get_fixed_vs_pe_retimer_read_addressfunction link_configure_fixed_vs_pe_retimerfunction link_query_fixed_vs_pe_retimerfunction link_aux_transfer_with_retries_no_mutexfunction try_to_configure_aux_timeoutfunction write_scdc_datafunction read_scdc_datafunction write_idcc_datafunction read_idcc_data
Annotated Snippet
struct i2c_payloads {
struct vector payloads;
};
static bool i2c_payloads_create(
struct dc_context *ctx,
struct i2c_payloads *payloads,
uint32_t count)
{
if (dal_vector_construct(
&payloads->payloads, ctx, count, sizeof(struct i2c_payload)))
return true;
return false;
}
static struct i2c_payload *i2c_payloads_get(struct i2c_payloads *p)
{
return (struct i2c_payload *)p->payloads.container;
}
static uint32_t i2c_payloads_get_count(struct i2c_payloads *p)
{
return p->payloads.count;
}
static void i2c_payloads_destroy(struct i2c_payloads *p)
{
if (!p)
return;
dal_vector_destruct(&p->payloads);
}
#define DDC_MIN(a, b) (((a) < (b)) ? (a) : (b))
static void i2c_payloads_add(
struct i2c_payloads *payloads,
uint32_t address,
uint32_t len,
uint8_t *data,
bool write)
{
uint32_t payload_size = EDID_SEGMENT_SIZE;
uint32_t pos;
for (pos = 0; pos < len; pos += payload_size) {
struct i2c_payload payload = {
.write = write,
.address = (uint8_t)address,
.length = DDC_MIN(payload_size, len - pos),
.data = data + pos };
dal_vector_append(&payloads->payloads, &payload);
}
}
static void ddc_service_construct(
struct ddc_service *ddc_service,
struct ddc_service_init_data *init_data)
{
enum connector_id connector_id =
dal_graphics_object_id_get_connector_id(init_data->id);
struct gpio_service *gpio_service = init_data->ctx->gpio_service;
struct graphics_object_i2c_info i2c_info;
struct gpio_ddc_hw_info hw_info;
struct dc_bios *dcb = init_data->ctx->dc_bios;
ddc_service->link = init_data->link;
ddc_service->ctx = init_data->ctx;
if (ddc_service->link && ddc_service->ctx->dc->config.dp_connector_no_native_i2c &&
ddc_service->link->no_ddc_pin) {
// Obtain aux instance info from i2c_info without GPIO DDC pin info
if (dcb->funcs->get_connector_aux_info(dcb, init_data->id, &i2c_info) == BP_RESULT_OK)
ddc_service->link->aux_hw_inst = (uint8_t)i2c_info.i2c_line;
} else {
if (init_data->is_dpia_link ||
dcb->funcs->get_i2c_info(dcb, init_data->id, &i2c_info) != BP_RESULT_OK) {
ddc_service->ddc_pin = NULL;
} else {
DC_LOGGER_INIT(ddc_service->ctx->logger);
DC_LOG_DC("BIOS object table - i2c_line: %d", i2c_info.i2c_line);
DC_LOG_DC("BIOS object table - i2c_engine_id: %d", i2c_info.i2c_engine_id);
hw_info.ddc_channel = i2c_info.i2c_line;
if (ddc_service->link != NULL)
hw_info.hw_supported = i2c_info.i2c_hw_assist;
else
Annotation
- Immediate include surface: `link_ddc.h`, `link_hdmi_frl.h`, `vector.h`, `dce/dce_aux.h`, `dal_asic_id.h`, `link_dpcd.h`, `dm_helpers.h`, `atomfirmware.h`.
- Detected declarations: `struct i2c_payloads`, `function i2c_payloads_create`, `function i2c_payloads_get_count`, `function i2c_payloads_destroy`, `function i2c_payloads_add`, `function ddc_service_construct`, `function ddc_service_destruct`, `function link_destroy_ddc_service`, `function set_ddc_transaction_type`, `function link_is_in_aux_transaction_mode`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.