STRUCT DPU_HW_INTF_OPS(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… struct dpu_hw_intf_ops(9) β€” the kernel API manual, but make it cute

okay so bestie, this is the manual page for struct dpu_hw_intf_ops, and no cap, it's basically the interface to the interface Hw driver functions. yes that's a lot of "interface" but we move πŸ’–

the one big assumption you gotta hold in your head the whole time: these functions get called after clocks are enabled. periodt. that's the vibe contract, don't break it 🫢


✨ SYNOPSIS ✨

here's the whole struct, verbatim, because we do not paraphrase code in this house:

struct dpu_hw_intf_ops {
    void (*setup_timing_gen)(struct dpu_hw_intf *intf, const struct
dpu_hw_intf_timing_params *p, const struct msm_format *fmt);
    void (*setup_prg_fetch)(struct dpu_hw_intf *intf, const struct
dpu_hw_intf_prog_fetch *fetch);
    void (*enable_timing)(struct dpu_hw_intf *intf, u8 enable);
    void (*get_status)(struct dpu_hw_intf *intf, struct
dpu_hw_intf_status *status);
    u32 (*get_line_count)(struct dpu_hw_intf *intf);
    void (*bind_pingpong_blk)(struct dpu_hw_intf *intf, const enum
dpu_pingpong pp);
    void (*setup_misr)(struct dpu_hw_intf *intf);
    int (*collect_misr)(struct dpu_hw_intf *intf, u32 *misr_value);
    int (*enable_tearcheck)(struct dpu_hw_intf *intf, struct
dpu_hw_tear_check *cfg);
    int (*disable_tearcheck)(struct dpu_hw_intf *intf);
    int (*connect_external_te)(struct dpu_hw_intf *intf, bool
enable_external_te);
    void (*vsync_sel)(struct dpu_hw_intf *intf, struct
dpu_vsync_source_cfg *cfg);
    void (*disable_autorefresh)(struct dpu_hw_intf *intf, uint32_t
encoder_id, u16 vdisplay);
    void (*program_intf_cmd_cfg)(struct dpu_hw_intf *intf, struct
dpu_hw_intf_cmd_mode_cfg *cmd_mode_cfg);
 };

it's giving "function pointer catalog" and honestly? iconic. let's go member by member πŸ‘‘


πŸŽ€ Members πŸŽ€

  • setup_timing_gen β€” programs the timing engine. that's literally the whole job, she's the main character of timing πŸ’…
  • setup_prg_fetch β€” enables/disables the programmable fetch logic. toggle queen πŸ¦‹
  • enable_timing β€” enable/disable timing engine. the on/off switch, the moment of truth ✨
  • get_status β€” returns if timing engine is enabled or not. vibe check on the timing engine, fr πŸ”
  • get_line_count β€” reads current vertical line counter. lowkey just counting lines, but make it hardware πŸ’œ
  • bind_pingpong_blk β€” enable/disable the connection with pingpong which will feed pixels to this interface. yes it's called pingpong, no i will not be explaining why, that's just her name πŸ“
  • setup_misr β€” enable/disable MISR 🌸
  • collect_misr β€” read MISR signature. go get that signature bestie πŸŽ€
  • enable_tearcheck β€” Enables vsync generation and sets up init value of read pointer and programs the tear check configuration. three jobs, one function, she ate πŸ”₯
  • disable_tearcheck β€” Disables tearcheck block. bye bye tearcheck block πŸ‘‹
  • connect_external_te β€” Read, modify, write to either set or clear listening to external TE. Returns 1 if TE was originally connected, 0 if not, or -ERROR. note the capital ERROR right there in the original, we're keeping it exactly as-is, no edits, that's the law 😀
  • vsync_sel β€” Select vsync signal for tear-effect configuration ⭐
  • disable_autorefresh β€” Disable autorefresh if enabled. conditional queen πŸ™ˆ
  • program_intf_cmd_cfg β€” Program the DPU to interface datapath for command mode. get that datapath into command mode, slay πŸ’«

🌈 SEE ALSO 🌈

  • Kernel file ./drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h β€” go read it, iykyk πŸ“–

ok but real talk: everything above runs on the assumption that the clocks are enabled. if they're not, that's not a vibe, that's a problem 🫢

and that's the page bestie!! this one came from the kernel source tree at ./drivers/gpu/drm/msm/disp/dpu1, dated October 2026, and it's the struct dpu_hw_intf_ops(9) page β€” same title at the top and the bottom, symmetrical queen πŸ‘‘πŸ’– mwah, go program some timing engines responsibly πŸ§šβ€β™€οΈβœ¨

πŸ“¦ where this page comes from