drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_cm.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_cm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp_cm.c- Extension
.c- Size
- 27093 bytes
- Lines
- 880
- 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.hdcn10/dcn10_dpp.hbasics/conversion.hdcn10/dcn10_cm_common.h
Detected Declarations
enum dcn10_coef_filter_type_selenum dscl_autocal_modeenum dscl_mode_selfunction program_gamut_remapfunction dpp1_cm_set_gamut_remapfunction read_gamut_remapfunction dpp1_cm_get_gamut_remapfunction dpp1_cm_program_color_matrixfunction dpp1_cm_set_output_csc_defaultfunction dpp1_cm_get_reg_fieldfunction dpp1_cm_get_degamma_reg_fieldfunction dpp1_cm_set_output_csc_adjustmentfunction dpp1_cm_power_on_regamma_lutfunction dpp1_cm_program_regamma_lutfunction dpp1_cm_configure_regamma_lutfunction dpp1_cm_program_regamma_luta_settingsfunction dpp1_cm_program_regamma_lutb_settingsfunction dpp1_program_input_cscfunction dpp1_program_bias_and_scalefunction dpp1_program_degamma_lutb_settingsfunction dpp1_program_degamma_luta_settingsfunction dpp1_power_on_degamma_lutfunction dpp1_enable_cm_blockfunction dpp1_set_degammafunction dpp1_degamma_ram_selectfunction dpp1_degamma_ram_inusefunction dpp1_program_degamma_lutfunction dpp1_set_degamma_pwlfunction dpp1_full_bypassfunction dpp1_ingamma_ram_inusefunction channelfunction dpp1_set_hdr_multiplier
Annotated Snippet
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_SET(CM_TEST_DEBUG_INDEX, 0,
CM_TEST_DEBUG_INDEX, 9);
REG_GET(CM_TEST_DEBUG_DATA,
CM_TEST_DEBUG_DATA_ID9_ICSC_MODE, &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_ICSC_C11;
gam_regs.masks.csc_c11 = dpp->tf_mask->CM_ICSC_C11;
gam_regs.shifts.csc_c12 = dpp->tf_shift->CM_ICSC_C12;
gam_regs.masks.csc_c12 = dpp->tf_mask->CM_ICSC_C12;
if (select == INPUT_CSC_SELECT_ICSC) {
gam_regs.csc_c11_c12 = REG(CM_ICSC_C11_C12);
gam_regs.csc_c33_c34 = REG(CM_ICSC_C33_C34);
} else {
gam_regs.csc_c11_c12 = REG(CM_COMA_C11_C12);
gam_regs.csc_c33_c34 = REG(CM_COMA_C33_C34);
}
cm_helper_program_color_matrices(
dpp->base.ctx,
regval,
&gam_regs);
REG_SET(CM_ICSC_CONTROL, 0,
CM_ICSC_MODE, select);
}
//keep here for now, decide multi dce support later
void dpp1_program_bias_and_scale(
struct dpp *dpp_base,
struct dc_bias_and_scale *params)
{
struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
REG_SET_2(CM_BNS_VALUES_R, 0,
CM_BNS_SCALE_R, params->scale_red,
CM_BNS_BIAS_R, params->bias_red);
REG_SET_2(CM_BNS_VALUES_G, 0,
CM_BNS_SCALE_G, params->scale_green,
CM_BNS_BIAS_G, params->bias_green);
REG_SET_2(CM_BNS_VALUES_B, 0,
CM_BNS_SCALE_B, params->scale_blue,
CM_BNS_BIAS_B, params->bias_blue);
}
/*program de gamma RAM B*/
void dpp1_program_degamma_lutb_settings(
struct dpp *dpp_base,
const struct pwl_params *params)
{
struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
struct xfer_func_reg gam_regs;
dpp1_cm_get_degamma_reg_field(dpp, &gam_regs);
gam_regs.start_cntl_b = REG(CM_DGAM_RAMB_START_CNTL_B);
gam_regs.start_cntl_g = REG(CM_DGAM_RAMB_START_CNTL_G);
gam_regs.start_cntl_r = REG(CM_DGAM_RAMB_START_CNTL_R);
gam_regs.start_slope_cntl_b = REG(CM_DGAM_RAMB_SLOPE_CNTL_B);
gam_regs.start_slope_cntl_g = REG(CM_DGAM_RAMB_SLOPE_CNTL_G);
Annotation
- Immediate include surface: `dm_services.h`, `core_types.h`, `reg_helper.h`, `dcn10/dcn10_dpp.h`, `basics/conversion.h`, `dcn10/dcn10_cm_common.h`.
- Detected declarations: `enum dcn10_coef_filter_type_sel`, `enum dscl_autocal_mode`, `enum dscl_mode_sel`, `function program_gamut_remap`, `function dpp1_cm_set_gamut_remap`, `function read_gamut_remap`, `function dpp1_cm_get_gamut_remap`, `function dpp1_cm_program_color_matrix`, `function dpp1_cm_set_output_csc_default`, `function dpp1_cm_get_reg_field`.
- 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.