STRUCT TIMING_GENERATOR_FUNCS(9)
π
struct timing_generator_funcs(9)
okay so welcome to the Kernel API Manual entry for struct timing_generator_funcs β literally the whole control squad for the timing generator on a given device. It's giving βall the function pointers you need to boss your timing generator aroundβ energy, and yes bestie, we're going through every single one. no skipping. β¨
π NAME
struct timing_generator_funcs β Control timing generator on a given device. That's the assignment, and this struct ate. π
β¨ SYNOPSIS β¨
here's the whole struct, no cap β every pointer stays exactly as it is:
struct timing_generator_funcs {
bool (*validate_timing)(struct timing_generator *tg, const struct
dc_crtc_timing *timing);
void (*program_timing)(struct timing_generator *tg, const struct
dc_crtc_timing *timing, int vready_offset, int vstartup_start, int
vupdate_offset, int vupdate_width, int pstate_keepout, const enum
signal_type signal, bool use_vbios );
void (*setup_vertical_interrupt0)( struct timing_generator *optc,
uint32_t start_line, uint32_t end_line);
void (*setup_vertical_interrupt1)( struct timing_generator *optc,
uint32_t start_line);
void (*setup_vertical_interrupt2)( struct timing_generator *optc,
uint32_t start_line);
bool (*enable_crtc)(struct timing_generator *tg);
bool (*disable_crtc)(struct timing_generator *tg);
void (*phantom_crtc_post_enable)(struct timing_generator *tg);
void (*disable_phantom_crtc)(struct timing_generator *tg);
bool (*immediate_disable_crtc)(struct timing_generator *tg);
bool (*is_counter_moving)(struct timing_generator *tg);
void (*get_position)(struct timing_generator *tg, struct
crtc_position *position);
uint32_t (*get_frame_count)(struct timing_generator *tg);
void (*get_scanoutpos)( struct timing_generator *tg, uint32_t
*v_blank_start, uint32_t *v_blank_end, uint32_t *h_position, uint32_t
*v_position);
bool (*get_otg_active_size)(struct timing_generator *optc, uint32_t
*otg_active_width, uint32_t *otg_active_height);
bool (*is_matching_timing)(struct timing_generator *tg, const struct
dc_crtc_timing *otg_timing);
void (*set_early_control)(struct timing_generator *tg, uint32_t
early_cntl);
void (*wait_for_state)(struct timing_generator *tg, enum crtc_state
state);
void (*set_blank)(struct timing_generator *tg, bool
enable_blanking);
bool (*is_blanked)(struct timing_generator *tg);
void (*set_overscan_blank_color) (struct timing_generator *tg, const
struct tg_color *color);
void (*set_blank_color)(struct timing_generator *tg, const struct
tg_color *color);
void (*set_colors)(struct timing_generator *tg, const struct
tg_color *blank_color, const struct tg_color *overscan_color);
void (*disable_vga)(struct timing_generator *tg);
bool (*did_triggered_reset_occur)(struct timing_generator *tg);
void (*setup_global_swap_lock)(struct timing_generator *tg, const
struct dcp_gsl_params *gsl_params);
void (*unlock)(struct timing_generator *tg);
void (*lock)(struct timing_generator *tg);
void (*lock_doublebuffer_disable)(struct timing_generator *tg);
void (*lock_doublebuffer_enable)(struct timing_generator *tg);
void(*triplebuffer_unlock)(struct timing_generator *tg);
void(*triplebuffer_lock)(struct timing_generator *tg);
void (*enable_reset_trigger)(struct timing_generator *tg, int
source_tg_inst);
void (*enable_crtc_reset)(struct timing_generator *tg, int
source_tg_inst, struct crtc_trigger_info *crtc_tp);
void (*disable_reset_trigger)(struct timing_generator *tg);
void (*tear_down_global_swap_lock)(struct timing_generator *tg);
void (*enable_advanced_request)(struct timing_generator *tg, bool
enable, const struct dc_crtc_timing *timing);
void (*set_drr)(struct timing_generator *tg, const struct drr_params
*params);
void (*set_vtotal_min_max)(struct timing_generator *optc, int
vtotal_min, int vtotal_max);
void (*get_last_used_drr_vtotal)(struct timing_generator *optc,
uint32_t *refresh_rate);
void (*set_static_screen_control)(struct timing_generator *tg,
uint32_t event_triggers, uint32_t num_frames);
void (*set_test_pattern)( struct timing_generator *tg, enum
controller_dp_test_pattern test_pattern, enum dc_color_depth
color_depth);
bool (*arm_vert_intr)(struct timing_generator *tg, uint8_t width);
void (*program_global_sync)(struct timing_generator *tg, int
vready_offset, int vstartup_start, int vupdate_offset, int
vupdate_width, int pstate_keepout);
void (*enable_optc_clock)(struct timing_generator *tg, bool enable);
void (*program_stereo)(struct timing_generator *tg, const struct
dc_crtc_timing *timing, struct crtc_stereo_flags *flags);
bool (*is_stereo_left_eye)(struct timing_generator *tg);
void (*set_blank_data_double_buffer)(struct timing_generator *tg,
bool enable);
void (*tg_init)(struct timing_generator *tg);
bool (*is_tg_enabled)(struct timing_generator *tg);
bool (*is_optc_underflow_occurred)(struct timing_generator *tg);
void (*clear_optc_underflow)(struct timing_generator *tg);
void (*set_dwb_source)(struct timing_generator *optc, uint32_t
dwb_pipe_inst);
void (*get_optc_source)(struct timing_generator *optc, uint32_t
*num_of_input_segments, uint32_t *seg0_src_sel, uint32_t *seg1_src_sel);
bool (*is_two_pixels_per_container)(const struct dc_crtc_timing
*timing);
bool (*configure_crc)(struct timing_generator *tg, const struct
crc_params *params);
bool (*get_crc)(struct timing_generator *tg, uint8_t idx, uint32_t
*r_cr, uint32_t *g_y, uint32_t *b_cb);
void (*program_manual_trigger)(struct timing_generator *optc);
void (*setup_manual_trigger)(struct timing_generator *optc);
bool (*get_hw_timing)(struct timing_generator *optc, struct
dc_crtc_timing *hw_crtc_timing);
void (*set_vtg_params)(struct timing_generator *optc, const struct
dc_crtc_timing *dc_crtc_timing, bool program_fp2);
void (*set_dsc_config)(struct timing_generator *optc, enum
optc_dsc_mode dsc_mode, uint32_t dsc_bytes_per_pixel, uint32_t
dsc_slice_width);
void (*get_dsc_status)(struct timing_generator *optc, uint32_t
*dsc_mode);
void (*set_odm_bypass)(struct timing_generator *optc, const struct
dc_crtc_timing *dc_crtc_timing);
void (*set_odm_combine)(struct timing_generator *optc, int *opp_id,
int opp_cnt, int segment_width, int last_segment_width);
void (*get_odm_combine_segments)(struct timing_generator *tg, int
*odm_segments);
void (*set_h_timing_div_manual_mode)(struct timing_generator *optc,
bool manual_mode);
void (*set_gsl)(struct timing_generator *optc, const struct
gsl_params *params);
void (*set_gsl_source_select)(struct timing_generator *optc, int
group_idx, uint32_t gsl_ready_signal);
void (*set_out_mux)(struct timing_generator *tg, enum
otg_out_mux_dest dest);
void (*set_drr_trigger_window)(struct timing_generator *optc,
uint32_t window_start, uint32_t window_end);
int (*set_fva_factor)(struct timing_generator *optc, struct fva_adj
*fva_adj);
int (*get_max_hw_supported_fva_factor)(struct timing_generator
*optc, struct dc_crtc_timing *timing, unsigned int max_pixclk_100hz);
void (*set_vtotal_change_limit)(struct timing_generator *optc,
uint32_t limit);
void (*align_vblanks)(struct timing_generator *master_optc, struct
timing_generator *slave_optc, uint32_t master_pixel_clock_100Hz,
uint32_t slave_pixel_clock_100Hz, uint8_t master_clock_divider, uint8_t
slave_clock_divider);
bool (*validate_vmin_vmax)(struct timing_generator *optc, int vmin,
int vmax);
bool (*validate_vtotal_change_limit)(struct timing_generator *optc,
uint32_t vtotal_change_limit);
void (*init_odm)(struct timing_generator *tg);
void (*wait_drr_doublebuffer_pending_clear)(struct timing_generator
*tg);
void (*set_long_vtotal)(struct timing_generator *optc, const struct
long_vtotal_params *params);
void (*wait_odm_doublebuffer_pending_clear)(struct timing_generator
*tg);
void (*wait_otg_disable)(struct timing_generator *optc);
bool (*get_optc_double_buffer_pending)(struct timing_generator *tg);
bool (*get_otg_double_buffer_pending)(struct timing_generator *tg);
bool (*get_pipe_update_pending)(struct timing_generator *tg);
void (*set_vupdate_keepout)(struct timing_generator *tg, bool
enable);
bool (*wait_update_lock_status)(struct timing_generator *tg, bool
locked);
void (*read_otg_state)(struct timing_generator *tg, struct
dcn_otg_state *s);
void (*optc_read_reg_state)(struct timing_generator *tg, struct
dcn_optc_reg_state *optc_reg_state);
void (*enable_otg_pwa)(struct timing_generator *tg, struct
otc_pwa_frame_sync *pwa_param);
void (*disable_otg_pwa)(struct timing_generator *tg);
};
π Members π
okay so these are the extra member notes the page actually spells out β short, sweet, and important:
get_crcβ Get CRCs for the given timing generator. Returnfalseif CRCs are not enabled (viaconfigure_crc). πset_odm_combineβ Set up the ODM block to read from the correct OPP(s) and turn on/off ODM memory. π
π SEE ALSO
- Kernel file
./drivers/gpu/drm/amd/display/dc/inc/hw/timing_generator.h struct timing_generator(9)
source/version: ./drivers/gpu/drm/amd/display/... β date: October 2026 β and that's the struct timi...erator_funcs(9) footer vibe, periodt π«Άβ¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms