STRUCT TIMING_GENERATOR_FUNCS(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… 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. Return false if CRCs are not enabled (via configure_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