STRUCT AMDGPU_DISPLAY_MANAGER(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’– NAME πŸ’–

Okay bestie, this is the struct amdgpu_display_manager page from the Kernel API Manual β€” manual name struct amdgpu_display_manager(9) β€” and it’s literally the central amdgpu display manager device. One big struct, whole lotta display-manager glue, main character energy. 🫢

✨ SYNOPSIS ✨

Here’s the struct in all its glory β€” exact fields, exact names, no β€œI fixed the spacing” nonsense, bestie πŸ’…

struct amdgpu_display_manager {
    struct dc *dc;
    struct dmub_srv *dmub_srv;
    struct dmub_notification *dmub_notify;
    dmub_notify_interrupt_callback_t
dmub_callback[AMDGPU_DMUB_NOTIFICATION_MAX];
    bool dmub_thread_offload[AMDGPU_DMUB_NOTIFICATION_MAX];
    struct dmub_srv_fb_info *dmub_fb_info;
    const struct firmware *dmub_fw;
    struct amdgpu_bo *dmub_bo;
    u64 dmub_bo_gpu_addr;
    void *dmub_bo_cpu_addr;
    uint32_t dmcub_fw_version;
    uint32_t fw_inst_size;
    struct cgs_device *cgs_device;
    struct amdgpu_device *adev;
    struct drm_device *ddev;
    u16 display_indexes_num;
    struct drm_private_obj atomic_obj;
    struct mutex dc_lock;
    spinlock_t dmub_lock;
    struct mutex audio_lock;
    struct drm_audio_component *audio_component;
    bool audio_registered;
    struct list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
    struct list_head irq_handler_list_high_tab[DAL_IRQ_SOURCES_NUMBER];
    struct common_irq_params pflip_params[DC_IRQ_SOURCE_PFLIP_LAST -
DC_IRQ_SOURCE_PFLIP_FIRST + 1];
    struct common_irq_params vblank_params[DC_IRQ_SOURCE_VBLANK6 -
DC_IRQ_SOURCE_VBLANK1 + 1];
    struct common_irq_params vline0_params[DC_IRQ_SOURCE_DC6_VLINE0 -
DC_IRQ_SOURCE_DC1_VLINE0 + 1];
    struct common_irq_params vupdate_params[DC_IRQ_SOURCE_VUPDATE6 -
DC_IRQ_SOURCE_VUPDATE1 + 1];
    spinlock_t irq_reg_lock;
    struct common_irq_params dmub_trace_params[1];
    struct common_irq_params dmub_outbox_params[1];
    spinlock_t irq_handler_list_table_lock;
    struct workqueue_struct *irq_wq;
    struct workqueue_struct *vmin_vmax_wq;
    struct backlight_device *backlight_dev[AMDGPU_DM_MAX_NUM_EDP];
    const struct dc_link *backlight_link[AMDGPU_DM_MAX_NUM_EDP];
    uint8_t num_of_edps;
    struct amdgpu_dm_backlight_caps
backlight_caps[AMDGPU_DM_MAX_NUM_EDP];
    struct mod_freesync *freesync_module;
    struct mod_power *power_module;
    struct hdcp_workqueue *hdcp_workqueue;
    struct workqueue_struct *vblank_control_workqueue;
    struct idle_workqueue *idle_workqueue;
    struct drm_atomic_commit *cached_state;
    struct dc_state *cached_dc_state;
    struct dm_compressor_info compressor;
    const struct firmware *fw_dmcu;
    uint32_t dmcu_fw_version;
    const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
    uint32_t active_vblank_irq_count;
  #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY);
    struct secure_display_context secure_display_ctx;
  #endif;
    struct hpd_rx_irq_offload_work_queue *hpd_rx_offload_wq;
    struct amdgpu_encoder mst_encoders[AMDGPU_DM_MAX_CRTC];
    bool force_timing_sync;
    bool disable_hpd_irq;
    bool dmcub_trace_event_en;
    struct list_head da_list;
    struct completion dmub_aux_transfer_done;
    struct workqueue_struct *delayed_hpd_wq;
    u32 brightness[AMDGPU_DM_MAX_NUM_EDP];
    u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP];
    bool aux_hpd_discon_quirk;
    bool edp0_on_dp1_quirk;
    struct mutex dpia_aux_lock;
    void *bb_from_dmub;
    void *i2c_devres_group;
    struct amdgpu_i2c_adapter *oem_i2c;
    struct fused_io_sync {
      struct completion replied;
      char reply_data[0x40];
    } fused_io[8];
    struct workqueue_struct *hdmi_frl_status_polling_wq;
    struct delayed_work hdmi_frl_status_polling_work;
    unsigned int hdmi_frl_status_polling_delay_ms;
    struct dm_boot_time_crc_info boot_time_crc_info;
};
Quick heads-up, bestie: power_module, hdmi_frl_status_polling_wq, hdmi_frl_status_polling_delay_ms, and boot_time_crc_info are all in the struct above, but the original Members list doesn’t describe those β€” so I’m not inventing lore, they’re just chilling in the code block 🫢

🫢 Members 🫢

Members time β€” this is the cast of characters. Every technical detail stays exactly where it belongs; I’m just giving it group-chat energy. πŸ’–

  • dc β€” Display Core control structure. Main character of the display-core situation ✨
  • dmub_srv β€” DMUB service, used for controlling the DMUB on hardware that supports it. The pointer to the dmub_srv will be NULL on hardware that does not support it. πŸ’…
  • dmub_notify β€” notification from DMUB. πŸ“¬
  • dmub_callback β€” callback functions to handle notification from DMUB. πŸŽ€
  • dmub_thread_offload β€” flag to indicate if callback is offload. βœ…
  • dmub_fb_info β€” framebuffer regions for the DMUB. πŸ–ΌοΈ
  • dmub_fw β€” DMUB firmware, required on hardware that has DMUB support. πŸ”₯
  • dmub_bo β€” buffer object for the DMUB. 🧸
  • dmub_bo_gpu_addr β€” GPU virtual address for the DMUB buffer object. πŸ›°οΈ
  • dmub_bo_cpu_addr β€” CPU address for the DMUB buffer object. 🧠
  • dmcub_fw_version β€” DMCUB firmware version. 🏷️
  • fw_inst_size β€” size of the firmware instruction buffer. πŸ“
  • cgs_device β€” the Common Graphics Services device. It provides an interface for accessing registers. πŸŽ›οΈ
  • adev β€” AMDGPU base driver structure. 🧱
  • ddev β€” DRM base driver structure. 🎬
  • display_indexes_num β€” max number of display streams supported. πŸ”’
  • atomic_obj β€” in combination with dm_atomic_state it helps manage global atomic state that doesn’t map cleanly into existing drm resources, like dc_context. πŸŒ€
  • dc_lock β€” guards access to DC functions that can issue register write sequences. πŸ”’
  • dmub_lock β€” guards access to DMUB command submission. πŸ›‘οΈ
  • audio_lock β€” guards access to audio instance changes. πŸ”Š
  • audio_component β€” used to notify ELD changes to sound driver. 🎧
  • audio_registered β€” true if the audio component has been registered successfully, false otherwise. βœ…
  • irq_handler_list_low_tab β€” low priority IRQ handler table. It is a n*m table consisting of n IRQ sources, and m handlers per IRQ source. Low priority IRQ handlers are deferred to a workqueue to be processed. Hence, they can sleep. Note that handlers are called in the same order as they were registered (FIFO). 😴
  • irq_handler_list_high_tab β€” high priority IRQ handler table. It is a n*m table, same as irq_handler_list_low_tab. However, handlers in this table are not deferred and are called immediately. ⚑
  • pflip_params β€” page flip IRQ parameters, passed to registered handlers when triggered. πŸ”„
  • vblank_params β€” vertical blanking IRQ parameters, passed to registered handlers when triggered. πŸŒ™
  • vline0_params β€” OTG vertical interrupt0 IRQ parameters, passed to registered handlers when triggered. πŸ“
  • vupdate_params β€” vertical update IRQ parameters, passed to registered handlers when triggered. πŸ”
  • irq_reg_lock β€” serializes the read-modify-writes of the HW interrupt control registers. Several interrupt sources share one register β€” e.g. the enable and clear bits of both VSTARTUP (vblank) and VUPDATE_NO_LOCK live in OTG_GLOBAL_SYNC_STATUS. Therefore, enabling one source must not race with acking another. Held only across amdgpu_dm_irq_set and amdgpu_dm_irq_ack. 🧨
  • dmub_trace_params β€” DMUB trace event IRQ parameters, passed to registered handlers when triggered. 🧡
  • dmub_outbox_params β€” DMUB Outbox parameters. πŸ“€
  • irq_handler_list_table_lock β€” synchronizes access to IRQ tables. πŸ”
  • irq_wq β€” dedicated high-priority unbound workqueue for deferred IRQ work. βš™οΈ
  • vmin_vmax_wq β€” dedicated unbound workqueue for deferred vmin/vmax updates. πŸ“ˆ
  • backlight_dev β€” backlight control device. πŸ’‘
  • backlight_link β€” link on which to control backlight. πŸ”—
  • num_of_edps β€” number of backlight eDPs. πŸ–₯️
  • backlight_caps β€” capabilities of the backlight device. 🎚️
  • freesync_module β€” module handling freesync calculations. πŸŒ€
  • hdcp_workqueue β€” AMDGPU content protection queue. πŸ›‘οΈ
  • vblank_control_workqueue β€” deferred work for vblank control events. πŸŒ™
  • idle_workqueue β€” periodic work for idle events. πŸ’€
  • cached_state β€” caches device atomic state for suspend/resume. πŸ’Ύ
  • cached_dc_state β€” cached state of content streams. 🎞️
  • compressor β€” frame buffer compression buffer. See struct dm_compressor_info. πŸ—œοΈ
  • fw_dmcu β€” reference to DMCU firmware. πŸ“¦
  • dmcu_fw_version β€” version of the DMCU firmware. 🏷️
  • soc_bounding_box β€” gpu_info FW provided soc bounding box struct or 0 if not available in FW. πŸ“¦
  • active_vblank_irq_count β€” number of currently active vblank irqs. πŸ”’
  • secure_display_ctx β€” store secure display relevant info. e.g. the ROI information, the work_struct to command dmub, etc. πŸ”
  • hpd_rx_offload_wq β€” work queue to offload works of hpd_rx_irq. πŸ“₯
  • mst_encoders β€” fake encoders used for DP MST. 🎭
  • force_timing_sync β€” set via debugfs. When set, indicates that all connected displays will be forced to synchronize. πŸ”„
  • disable_hpd_irq β€” disables all HPD and HPD RX interrupt handling in the driver when true. 🚫
  • dmcub_trace_event_en β€” enable dmcub trace events. 🧡
  • da_list β€” DAL fb memory allocation list, for communication with SMU. πŸ“‹
  • dmub_aux_transfer_done β€” struct completion used to indicate when DMUB transfers are done. βœ…
  • delayed_hpd_wq β€” work queue used to delay DMUB HPD work. ⏳
  • brightness β€” cached backlight values. πŸ’‘
  • actual_brightness β€” last successfully applied backlight values. 🌟
  • aux_hpd_discon_quirk β€” quirk for hpd discon while aux is on-going. occurred on certain intel platform. 🧩
  • edp0_on_dp1_quirk β€” quirk for platforms that put edp0 on DP1. 🧩
  • dpia_aux_lock β€” guards access to DPIA AUX. πŸ”’
  • bb_from_dmub β€” bounding box data read from dmub during early initialization for DCN4+. Data is stored as a byte array that should be casted to the appropriate bb struct. 🧱
  • i2c_devres_group β€” devres group for DM i2c adapter lifetime management. 🧡
  • oem_i2c β€” OEM i2c bus. πŸ”Œ
  • fused_io β€” dmub fused io interface. πŸ”—
  • hdmi_frl_status_polling_work β€” workqueue for 200ms frl status polling. ⏱️

✨ SEE ALSO ✨

okay so like, that was the whole struct, but the kernel docs are not about to let you leave without the rest of the squad πŸ’… these are the other kernel-doc structs that live in the same neighborhood, so go say hi:

  • Kernel file ./drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h β€” this is THE header, the mothership, the one that has all of these in it 🫢
  • struct dm_compressor_info(9)
  • struct dm_boot_time_crc_info(9)
  • struct dmub_hpd_work(9)
  • struct vblank_control_work(9)
  • struct idle_workqueue(9)
  • struct vupdate_offload_work(9)
  • struct amdgpu_dm_luminance_data(9)
  • struct amdgpu_dm_backlight_caps(9)
  • struct dal_allocation(9)
  • struct hpd_rx_irq_offload_work_queue(9)
  • struct hpd_rx_irq_offload_work(9)
  • struct amdgpu_hdmi_vsdb_info(9)

like, yes, that's a lot of structs, and yes, you're gonna read them, because they're literally right there in amdgpu_dm.h and they all get their own manpages πŸ‘‘ completionist behavior only, no cap.


and that's a wrap on struct amdgpu_display_manager(9) bestie πŸŽ€ this whole page is straight out of the kernel source tree at ./drivers/gpu/drm/amd/display/... β€” that path is truncated in the footer but you get the vibe β€” and it's version-dated October 2026, title line all struct amdg...play_manager(9) because even the headers run out of room sometimes 😭 go read the code, slay, bye πŸ’œπŸ¦‹

πŸ“¦ where this page comes from