drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c- Extension
.c- Size
- 51684 bytes
- Lines
- 1572
- 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
dm_services.hcore_types.hreg_helper.hdcn30/dcn30_dpp.hbasics/conversion.hdcn30/dcn30_cm_common.h
Detected Declarations
function filesfunction dpp30_read_reg_statefunction dpp3_program_post_cscfunction dpp3_set_pre_degamfunction dpp3_cnv_setupfunction dpp3_set_cursor_attributesfunction dpp3_get_optimal_number_of_tapsfunction dpp3_deferred_updatefunction dpp3_power_on_blnd_lutfunction dpp3_power_on_hdr3dlutfunction dpp3_power_on_shaperfunction dpp3_configure_blnd_lutfunction dpp3_program_blnd_pwlfunction dcn3_dpp_cm_get_reg_fieldfunction dpp3_program_blnd_luta_settingsfunction dpp3_program_blnd_lutb_settingsfunction dpp3_get_blndgam_currentfunction dpp3_program_blnd_lutfunction dpp3_program_shaper_lutfunction dpp3_get_shaper_currentfunction dpp3_configure_shaper_lutfunction dpp3_program_shaper_luta_settingsfunction dpp3_program_shaper_lutb_settingsfunction dpp3_program_shaperfunction get3dlut_configfunction dpp3_set_3dlut_modefunction dpp3_select_3dlut_ramfunction dpp3_set3dlut_ram12function dpp3_set3dlut_ram10function dpp3_select_3dlut_ram_maskfunction dpp3_program_3dlutfunction dpp3_constructfunction dpp3_should_bypass_post_csc_for_colorspace
Annotated Snippet
if (s->rgam_lut_mode) {
REG_GET(CM_BLNDGAM_CONTROL, CM_BLNDGAM_SELECT_CURRENT, &rgam_lut_mode);
if (!rgam_lut_mode)
s->rgam_lut_mode = LUT_RAM_A; // Otherwise, LUT_RAM_B
}
}
}
void dpp30_read_reg_state(struct dpp *dpp_base, struct dcn_dpp_reg_state *dpp_reg_state)
{
struct dcn3_dpp *dpp = TO_DCN30_DPP(dpp_base);
dpp_reg_state->recout_start = REG_READ(RECOUT_START);
dpp_reg_state->recout_size = REG_READ(RECOUT_SIZE);
dpp_reg_state->scl_horz_filter_scale_ratio = REG_READ(SCL_HORZ_FILTER_SCALE_RATIO);
dpp_reg_state->scl_vert_filter_scale_ratio = REG_READ(SCL_VERT_FILTER_SCALE_RATIO);
dpp_reg_state->scl_mode = REG_READ(SCL_MODE);
dpp_reg_state->cm_control = REG_READ(CM_CONTROL);
dpp_reg_state->dpp_control = REG_READ(DPP_CONTROL);
dpp_reg_state->dscl_control = REG_READ(DSCL_CONTROL);
dpp_reg_state->obuf_control = REG_READ(OBUF_CONTROL);
dpp_reg_state->mpc_size = REG_READ(MPC_SIZE);
}
/*program post scaler scs block in dpp CM*/
void dpp3_program_post_csc(
struct dpp *dpp_base,
enum dc_color_space color_space,
enum dcn10_input_csc_select input_select,
const struct out_csc_color_matrix *tbl_entry)
{
struct dcn3_dpp *dpp = TO_DCN30_DPP(dpp_base);
int i;
int arr_size = sizeof(dpp_input_csc_matrix)/sizeof(struct dpp_input_csc_matrix);
const uint16_t *regval = NULL;
uint32_t cur_select = 0;
enum dcn10_input_csc_select select;
struct color_matrices_reg gam_regs;
if (input_select == INPUT_CSC_SELECT_BYPASS) {
REG_SET(CM_POST_CSC_CONTROL, 0, CM_POST_CSC_MODE, 0);
return;
}
if (tbl_entry == NULL) {
for (i = 0; i < arr_size; i++)
if (dpp_input_csc_matrix[i].color_space == color_space) {
regval = dpp_input_csc_matrix[i].regval;
break;
}
if (regval == NULL) {
BREAK_TO_DEBUGGER();
return;
}
} else {
regval = tbl_entry->regval;
}
/* determine which CSC matrix (icsc or coma) we are using
* currently. select the alternate set to double buffer
* the CSC update so CSC is updated on frame boundary
*/
REG_GET(CM_POST_CSC_CONTROL,
CM_POST_CSC_MODE_CURRENT, &cur_select);
if (cur_select != INPUT_CSC_SELECT_ICSC)
select = INPUT_CSC_SELECT_ICSC;
else
select = INPUT_CSC_SELECT_COMA;
gam_regs.shifts.csc_c11 = dpp->tf_shift->CM_POST_CSC_C11;
gam_regs.masks.csc_c11 = dpp->tf_mask->CM_POST_CSC_C11;
gam_regs.shifts.csc_c12 = dpp->tf_shift->CM_POST_CSC_C12;
gam_regs.masks.csc_c12 = dpp->tf_mask->CM_POST_CSC_C12;
if (select == INPUT_CSC_SELECT_ICSC) {
gam_regs.csc_c11_c12 = REG(CM_POST_CSC_C11_C12);
gam_regs.csc_c33_c34 = REG(CM_POST_CSC_C33_C34);
} else {
gam_regs.csc_c11_c12 = REG(CM_POST_CSC_B_C11_C12);
gam_regs.csc_c33_c34 = REG(CM_POST_CSC_B_C33_C34);
}
cm_helper_program_color_matrices(
dpp->base.ctx,
Annotation
- Immediate include surface: `dm_services.h`, `core_types.h`, `reg_helper.h`, `dcn30/dcn30_dpp.h`, `basics/conversion.h`, `dcn30/dcn30_cm_common.h`.
- Detected declarations: `function files`, `function dpp30_read_reg_state`, `function dpp3_program_post_csc`, `function dpp3_set_pre_degam`, `function dpp3_cnv_setup`, `function dpp3_set_cursor_attributes`, `function dpp3_get_optimal_number_of_taps`, `function dpp3_deferred_update`, `function dpp3_power_on_blnd_lut`, `function dpp3_power_on_hdr3dlut`.
- 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.