drivers/gpu/drm/amd/display/dc/dc_helper.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/dc_helper.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/dc/dc_helper.c- Extension
.c- Size
- 22503 bytes
- Lines
- 768
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/delay.hlinux/stdarg.hdm_services.hdc.hdc_dmub_srv.hreg_helper.h
Detected Declarations
struct dc_reg_value_masksfunction filesfunction submit_dmub_burst_writefunction submit_dmub_reg_waitfunction set_reg_field_value_masksfunction set_reg_field_valuesfunction dmub_flush_buffer_executefunction dmub_flush_burst_write_buffer_executefunction dmub_reg_value_burst_set_packfunction dmub_reg_value_packfunction dmub_reg_wait_done_packfunction generic_reg_update_exfunction generic_reg_set_exfunction generic_reg_getfunction generic_reg_get2function generic_reg_get3function generic_reg_get4function generic_reg_get5function generic_reg_get6function generic_reg_get7function generic_reg_get8function generic_reg_getfunction generic_reg_waitfunction generic_write_indirect_regfunction generic_read_indirect_regfunction generic_indirect_reg_getfunction generic_indirect_reg_update_exfunction generic_indirect_reg_update_ex_syncfunction generic_indirect_reg_get_syncfunction reg_sequence_start_gatherfunction reg_sequence_start_executefunction reg_sequence_wait_donefunction dc_supports_vrr
Annotated Snippet
struct dc_reg_value_masks {
uint32_t value;
uint32_t mask;
};
static inline void set_reg_field_value_masks(
struct dc_reg_value_masks *field_value_mask,
uint32_t value,
uint32_t mask,
uint8_t shift)
{
ASSERT(mask != 0);
field_value_mask->value = (field_value_mask->value & ~mask) | (mask & (value << shift));
field_value_mask->mask = field_value_mask->mask | mask;
}
static void set_reg_field_values(struct dc_reg_value_masks *field_value_mask,
uint32_t addr, int n,
uint8_t shift1, uint32_t mask1, uint32_t field_value1,
va_list ap)
{
(void)addr;
uint32_t shift, mask, field_value;
int i = 1;
/* gather all bits value/mask getting updated in this register */
set_reg_field_value_masks(field_value_mask,
field_value1, mask1, shift1);
while (i < n) {
shift = va_arg(ap, uint32_t);
mask = va_arg(ap, uint32_t);
field_value = va_arg(ap, uint32_t);
set_reg_field_value_masks(field_value_mask,
field_value, mask, (uint8_t)shift);
i++;
}
}
static void dmub_flush_buffer_execute(
struct dc_reg_helper_state *offload,
const struct dc_context *ctx)
{
submit_dmub_read_modify_write(offload, ctx);
}
static void dmub_flush_burst_write_buffer_execute(
struct dc_reg_helper_state *offload,
const struct dc_context *ctx)
{
submit_dmub_burst_write(offload, ctx);
}
static bool dmub_reg_value_burst_set_pack(const struct dc_context *ctx, uint32_t addr,
uint32_t reg_val)
{
struct dc_reg_helper_state *offload = &ctx->dmub_srv->reg_helper_offload;
struct dmub_rb_cmd_burst_write *cmd_buf = &offload->cmd_data.burst_write;
/* flush command if buffer is full */
if (offload->reg_seq_count == DMUB_BURST_WRITE_VALUES__MAX)
dmub_flush_burst_write_buffer_execute(offload, ctx);
if (offload->cmd_data.cmd_common.header.type == DMUB_CMD__REG_SEQ_BURST_WRITE &&
addr != cmd_buf->addr) {
dmub_flush_burst_write_buffer_execute(offload, ctx);
return false;
}
cmd_buf->header.type = DMUB_CMD__REG_SEQ_BURST_WRITE;
cmd_buf->header.sub_type = 0;
cmd_buf->addr = addr;
cmd_buf->write_values[offload->reg_seq_count] = reg_val;
offload->reg_seq_count++;
return true;
}
static uint32_t dmub_reg_value_pack(const struct dc_context *ctx, uint32_t addr,
struct dc_reg_value_masks *field_value_mask)
{
struct dc_reg_helper_state *offload = &ctx->dmub_srv->reg_helper_offload;
struct dmub_rb_cmd_read_modify_write *cmd_buf = &offload->cmd_data.read_modify_write;
struct dmub_cmd_read_modify_write_sequence *seq;
/* flush command if buffer is full */
if (offload->cmd_data.cmd_common.header.type != DMUB_CMD__REG_SEQ_BURST_WRITE &&
offload->reg_seq_count == DMUB_READ_MODIFY_WRITE_SEQ__MAX)
Annotation
- Immediate include surface: `linux/delay.h`, `linux/stdarg.h`, `dm_services.h`, `dc.h`, `dc_dmub_srv.h`, `reg_helper.h`.
- Detected declarations: `struct dc_reg_value_masks`, `function files`, `function submit_dmub_burst_write`, `function submit_dmub_reg_wait`, `function set_reg_field_value_masks`, `function set_reg_field_values`, `function dmub_flush_buffer_execute`, `function dmub_flush_burst_write_buffer_execute`, `function dmub_reg_value_burst_set_pack`, `function dmub_reg_value_pack`.
- 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.