1b3c8fa0dSJani Nikula /* SPDX-License-Identifier: MIT */ 2b3c8fa0dSJani Nikula /* Copyright © 2025 Intel Corporation x*/ 3b3c8fa0dSJani Nikula 4b3c8fa0dSJani Nikula #ifndef __DISPLAY_PARENT_INTERFACE_H__ 5b3c8fa0dSJani Nikula #define __DISPLAY_PARENT_INTERFACE_H__ 6b3c8fa0dSJani Nikula 7b3c8fa0dSJani Nikula #include <linux/types.h> 8b3c8fa0dSJani Nikula 913140276SJani Nikula struct dma_fence; 109dacae14SJani Nikula struct drm_crtc; 11b3c8fa0dSJani Nikula struct drm_device; 12adf7968eSJani Nikula struct drm_framebuffer; 13adf7968eSJani Nikula struct drm_gem_object; 145bad0037SJani Nikula struct drm_plane_state; 1563c7f93bSJani Nikula struct drm_scanout_buffer; 16adf7968eSJani Nikula struct i915_vma; 1729fdc6e9SJani Nikula struct intel_hdcp_gsc_context; 18a13f152aSJani Nikula struct intel_initial_plane_config; 1963c7f93bSJani Nikula struct intel_panic; 20d6c86257SJani Nikula struct intel_stolen_node; 211914d686SJouni Högander struct ref_tracker; 221914d686SJouni Högander 2307d46adaSJani Nikula /* Keep struct definitions sorted */ 24b3c8fa0dSJani Nikula 2529fdc6e9SJani Nikula struct intel_display_hdcp_interface { 2629fdc6e9SJani Nikula ssize_t (*gsc_msg_send)(struct intel_hdcp_gsc_context *gsc_context, 2729fdc6e9SJani Nikula void *msg_in, size_t msg_in_len, 2829fdc6e9SJani Nikula void *msg_out, size_t msg_out_len); 2929fdc6e9SJani Nikula bool (*gsc_check_status)(struct drm_device *drm); 3029fdc6e9SJani Nikula struct intel_hdcp_gsc_context *(*gsc_context_alloc)(struct drm_device *drm); 3129fdc6e9SJani Nikula void (*gsc_context_free)(struct intel_hdcp_gsc_context *gsc_context); 3229fdc6e9SJani Nikula }; 3329fdc6e9SJani Nikula 349dacae14SJani Nikula struct intel_display_initial_plane_interface { 359dacae14SJani Nikula void (*vblank_wait)(struct drm_crtc *crtc); 36*82eaf345SJani Nikula struct drm_gem_object *(*alloc_obj)(struct drm_device *drm, struct intel_initial_plane_config *plane_config); 375bad0037SJani Nikula int (*setup)(struct drm_plane_state *plane_state, struct intel_initial_plane_config *plane_config, 38adf7968eSJani Nikula struct drm_framebuffer *fb, struct i915_vma *vma); 39a13f152aSJani Nikula void (*config_fini)(struct intel_initial_plane_config *plane_configs); 409dacae14SJani Nikula }; 419dacae14SJani Nikula 423815e8f2SJani Nikula struct intel_display_irq_interface { 433815e8f2SJani Nikula bool (*enabled)(struct drm_device *drm); 443815e8f2SJani Nikula void (*synchronize)(struct drm_device *drm); 453815e8f2SJani Nikula }; 463815e8f2SJani Nikula 4763c7f93bSJani Nikula struct intel_display_panic_interface { 4863c7f93bSJani Nikula struct intel_panic *(*alloc)(void); 4963c7f93bSJani Nikula int (*setup)(struct intel_panic *panic, struct drm_scanout_buffer *sb); 5063c7f93bSJani Nikula void (*finish)(struct intel_panic *panic); 5163c7f93bSJani Nikula }; 5263c7f93bSJani Nikula 5335ec7128SVille Syrjälä struct intel_display_pc8_interface { 5435ec7128SVille Syrjälä void (*block)(struct drm_device *drm); 5535ec7128SVille Syrjälä void (*unblock)(struct drm_device *drm); 5635ec7128SVille Syrjälä }; 5735ec7128SVille Syrjälä 5807d46adaSJani Nikula struct intel_display_rpm_interface { 5907d46adaSJani Nikula struct ref_tracker *(*get)(const struct drm_device *drm); 6007d46adaSJani Nikula struct ref_tracker *(*get_raw)(const struct drm_device *drm); 6107d46adaSJani Nikula struct ref_tracker *(*get_if_in_use)(const struct drm_device *drm); 6207d46adaSJani Nikula struct ref_tracker *(*get_noresume)(const struct drm_device *drm); 6307d46adaSJani Nikula 6407d46adaSJani Nikula void (*put)(const struct drm_device *drm, struct ref_tracker *wakeref); 6507d46adaSJani Nikula void (*put_raw)(const struct drm_device *drm, struct ref_tracker *wakeref); 6607d46adaSJani Nikula void (*put_unchecked)(const struct drm_device *drm); 6707d46adaSJani Nikula 6807d46adaSJani Nikula bool (*suspended)(const struct drm_device *drm); 6907d46adaSJani Nikula void (*assert_held)(const struct drm_device *drm); 7007d46adaSJani Nikula void (*assert_block)(const struct drm_device *drm); 7107d46adaSJani Nikula void (*assert_unblock)(const struct drm_device *drm); 7207d46adaSJani Nikula }; 7307d46adaSJani Nikula 7413140276SJani Nikula struct intel_display_rps_interface { 7513140276SJani Nikula void (*boost_if_not_started)(struct dma_fence *fence); 7613140276SJani Nikula void (*mark_interactive)(struct drm_device *drm, bool interactive); 7713140276SJani Nikula void (*ilk_irq_handler)(struct drm_device *drm); 7813140276SJani Nikula }; 7913140276SJani Nikula 80d6c86257SJani Nikula struct intel_display_stolen_interface { 81d6c86257SJani Nikula int (*insert_node_in_range)(struct intel_stolen_node *node, u64 size, 82d6c86257SJani Nikula unsigned int align, u64 start, u64 end); 830c085485SJani Nikula int (*insert_node)(struct intel_stolen_node *node, u64 size, unsigned int align); /* Optional */ 84d6c86257SJani Nikula void (*remove_node)(struct intel_stolen_node *node); 85d6c86257SJani Nikula bool (*initialized)(struct drm_device *drm); 86d6c86257SJani Nikula bool (*node_allocated)(const struct intel_stolen_node *node); 87d6c86257SJani Nikula u64 (*node_offset)(const struct intel_stolen_node *node); 880c085485SJani Nikula u64 (*area_address)(struct drm_device *drm); /* Optional */ 890c085485SJani Nikula u64 (*area_size)(struct drm_device *drm); /* Optional */ 90d6c86257SJani Nikula u64 (*node_address)(const struct intel_stolen_node *node); 91d6c86257SJani Nikula u64 (*node_size)(const struct intel_stolen_node *node); 92d6c86257SJani Nikula struct intel_stolen_node *(*node_alloc)(struct drm_device *drm); 93d6c86257SJani Nikula void (*node_free)(const struct intel_stolen_node *node); 94d6c86257SJani Nikula }; 95d6c86257SJani Nikula 96b3c8fa0dSJani Nikula /** 97b3c8fa0dSJani Nikula * struct intel_display_parent_interface - services parent driver provides to display 98b3c8fa0dSJani Nikula * 99b3c8fa0dSJani Nikula * The parent, or core, driver provides a pointer to this structure to display 100b3c8fa0dSJani Nikula * driver when calling intel_display_device_probe(). The display driver uses it 101b3c8fa0dSJani Nikula * to access services provided by the parent driver. The structure may contain 102b3c8fa0dSJani Nikula * sub-struct pointers to group function pointers by functionality. 103b3c8fa0dSJani Nikula * 104b3c8fa0dSJani Nikula * All function and sub-struct pointers must be initialized and callable unless 105b3c8fa0dSJani Nikula * explicitly marked as "optional" below. The display driver will only NULL 106b3c8fa0dSJani Nikula * check the optional pointers. 107b3c8fa0dSJani Nikula */ 108b3c8fa0dSJani Nikula struct intel_display_parent_interface { 10929fdc6e9SJani Nikula /** @hdcp: HDCP GSC interface */ 11029fdc6e9SJani Nikula const struct intel_display_hdcp_interface *hdcp; 11129fdc6e9SJani Nikula 1129dacae14SJani Nikula /** @initial_plane: Initial plane interface */ 1139dacae14SJani Nikula const struct intel_display_initial_plane_interface *initial_plane; 1149dacae14SJani Nikula 1153815e8f2SJani Nikula /** @irq: IRQ interface */ 1163815e8f2SJani Nikula const struct intel_display_irq_interface *irq; 117e8916738SJani Nikula 11863c7f93bSJani Nikula /** @panic: Panic interface */ 11963c7f93bSJani Nikula const struct intel_display_panic_interface *panic; 12063c7f93bSJani Nikula 12135ec7128SVille Syrjälä /** @pc8: PC8 interface. Optional. */ 12235ec7128SVille Syrjälä const struct intel_display_pc8_interface *pc8; 12335ec7128SVille Syrjälä 12407d46adaSJani Nikula /** @rpm: Runtime PM functions */ 12507d46adaSJani Nikula const struct intel_display_rpm_interface *rpm; 12607d46adaSJani Nikula 1274e899d9bSJani Nikula /** @rps: RPS interface. Optional. */ 12813140276SJani Nikula const struct intel_display_rps_interface *rps; 12913140276SJani Nikula 130d6c86257SJani Nikula /** @stolen: Stolen memory. */ 131d6c86257SJani Nikula const struct intel_display_stolen_interface *stolen; 132d6c86257SJani Nikula 1338c88104aSJani Nikula /* Generic independent functions */ 1348c88104aSJani Nikula struct { 13555fc11ceSJani Nikula /** @fence_priority_display: Set display priority. Optional. */ 13655fc11ceSJani Nikula void (*fence_priority_display)(struct dma_fence *fence); 1376a99e91aSTvrtko Ursulin 1384e899d9bSJani Nikula /** @has_auxccs: Are AuxCCS formats supported by the parent. Optional. */ 1396a99e91aSTvrtko Ursulin bool (*has_auxccs)(struct drm_device *drm); 14007d46adaSJani Nikula 14107d46adaSJani Nikula /** @has_fenced_regions: Support legacy fencing? Optional. */ 14207d46adaSJani Nikula bool (*has_fenced_regions)(struct drm_device *drm); 14307d46adaSJani Nikula 14407d46adaSJani Nikula /** @vgpu_active: Is vGPU active? Optional. */ 14507d46adaSJani Nikula bool (*vgpu_active)(struct drm_device *drm); 146b3c8fa0dSJani Nikula }; 1478c88104aSJani Nikula }; 148b3c8fa0dSJani Nikula 149b3c8fa0dSJani Nikula #endif 150