drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c- Extension
.c- Size
- 20382 bytes
- Lines
- 647
- 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
reg_helper.hdc.hdcn401_mpc.hdcn10/dcn10_cm_common.hbasics/conversion.hmpc.h
Detected Declarations
function filesfunction mpc401_get_3dlut_fast_load_statusfunction mpc401_set_movable_cm_locationfunction get3dlut_configfunction mpc401_populate_lutfunction mpc401_program_lut_modefunction mpc401_program_lut_read_write_controlfunction mpc_program_gamut_remapfunction mpc401_set_gamut_remapfunction mpc_read_gamut_remapfunction mpc401_get_gamut_remapfunction dcn401_mpc_construct
Annotated Snippet
if (is_17x17x17) {
lut0 = lut3d->tetrahedral_17.lut0;
lut1 = lut3d->tetrahedral_17.lut1;
lut2 = lut3d->tetrahedral_17.lut2;
lut3 = lut3d->tetrahedral_17.lut3;
lut_size0 = sizeof(lut3d->tetrahedral_17.lut0)/
sizeof(lut3d->tetrahedral_17.lut0[0]);
lut_size = sizeof(lut3d->tetrahedral_17.lut1)/
sizeof(lut3d->tetrahedral_17.lut1[0]);
} else {
lut0 = lut3d->tetrahedral_9.lut0;
lut1 = lut3d->tetrahedral_9.lut1;
lut2 = lut3d->tetrahedral_9.lut2;
lut3 = lut3d->tetrahedral_9.lut3;
lut_size0 = sizeof(lut3d->tetrahedral_9.lut0)/
sizeof(lut3d->tetrahedral_9.lut0[0]);
lut_size = sizeof(lut3d->tetrahedral_9.lut1)/
sizeof(lut3d->tetrahedral_9.lut1[0]);
}
mpc32_select_3dlut_ram(mpc, next_mode,
is_12bits_color_channel, mpcc_id);
mpc32_select_3dlut_ram_mask(mpc, 0x1, mpcc_id);
if (is_12bits_color_channel)
mpc32_set3dlut_ram12(mpc, lut0, lut_size0, mpcc_id);
else
mpc32_set3dlut_ram10(mpc, lut0, lut_size0, mpcc_id);
mpc32_select_3dlut_ram_mask(mpc, 0x2, mpcc_id);
if (is_12bits_color_channel)
mpc32_set3dlut_ram12(mpc, lut1, lut_size, mpcc_id);
else
mpc32_set3dlut_ram10(mpc, lut1, lut_size, mpcc_id);
mpc32_select_3dlut_ram_mask(mpc, 0x4, mpcc_id);
if (is_12bits_color_channel)
mpc32_set3dlut_ram12(mpc, lut2, lut_size, mpcc_id);
else
mpc32_set3dlut_ram10(mpc, lut2, lut_size, mpcc_id);
mpc32_select_3dlut_ram_mask(mpc, 0x8, mpcc_id);
if (is_12bits_color_channel)
mpc32_set3dlut_ram12(mpc, lut3, lut_size, mpcc_id);
else
mpc32_set3dlut_ram10(mpc, lut3, lut_size, mpcc_id);
if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
break;
}
}
void mpc401_program_lut_mode(
struct mpc *mpc,
const enum MCM_LUT_ID id,
const enum MCM_LUT_XABLE xable,
bool lut_bank_a,
int mpcc_id)
{
struct dcn401_mpc *mpc401 = TO_DCN401_MPC(mpc);
switch (id) {
case MCM_LUT_3DLUT:
switch (xable) {
case MCM_LUT_DISABLE:
REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_MODE, 0);
break;
case MCM_LUT_ENABLE:
REG_UPDATE(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_MODE, lut_bank_a ? 1 : 2);
break;
}
break;
case MCM_LUT_SHAPER:
switch (xable) {
case MCM_LUT_DISABLE:
REG_UPDATE(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_LUT_MODE, 0);
break;
case MCM_LUT_ENABLE:
REG_UPDATE(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_LUT_MODE, lut_bank_a ? 1 : 2);
break;
}
break;
case MCM_LUT_1DLUT:
switch (xable) {
case MCM_LUT_DISABLE:
REG_UPDATE(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
MPCC_MCM_1DLUT_MODE, 0);
break;
Annotation
- Immediate include surface: `reg_helper.h`, `dc.h`, `dcn401_mpc.h`, `dcn10/dcn10_cm_common.h`, `basics/conversion.h`, `mpc.h`.
- Detected declarations: `function files`, `function mpc401_get_3dlut_fast_load_status`, `function mpc401_set_movable_cm_location`, `function get3dlut_config`, `function mpc401_populate_lut`, `function mpc401_program_lut_mode`, `function mpc401_program_lut_read_write_control`, `function mpc_program_gamut_remap`, `function mpc401_set_gamut_remap`, `function mpc_read_gamut_remap`.
- 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.