1 // SPDX-License-Identifier: MIT 2 /* Copyright © 2025 Intel Corporation */ 3 4 /* 5 * Convenience wrapper functions to call the parent interface functions: 6 * 7 * - display->parent->SUBSTRUCT->FUNCTION() 8 * - display->parent->FUNCTION() 9 * 10 * All functions here should be named accordingly: 11 * 12 * - intel_parent_SUBSTRUCT_FUNCTION() 13 * - intel_parent_FUNCTION() 14 * 15 * These functions may use display driver specific types for parameters and 16 * return values, translating them to and from the generic types used in the 17 * function pointer interface. 18 */ 19 20 #include <drm/drm_print.h> 21 #include <drm/intel/display_parent_interface.h> 22 #include <drm/intel/vlv_iosf_sb_regs.h> 23 24 #include "intel_display_core.h" 25 #include "intel_parent.h" 26 27 /* dpt */ 28 struct intel_dpt *intel_parent_dpt_create(struct intel_display *display, 29 struct drm_gem_object *obj, size_t size) 30 { 31 if (display->parent->dpt) 32 return display->parent->dpt->create(obj, size); 33 34 return NULL; 35 } 36 37 void intel_parent_dpt_destroy(struct intel_display *display, struct intel_dpt *dpt) 38 { 39 if (display->parent->dpt) 40 display->parent->dpt->destroy(dpt); 41 } 42 43 void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *dpt) 44 { 45 if (display->parent->dpt) 46 display->parent->dpt->suspend(dpt); 47 } 48 49 void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt) 50 { 51 if (display->parent->dpt) 52 display->parent->dpt->resume(dpt); 53 } 54 55 /* frontbuffer */ 56 struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj) 57 { 58 return display->parent->frontbuffer->get(obj); 59 } 60 61 void intel_parent_frontbuffer_ref(struct intel_display *display, struct intel_frontbuffer *front) 62 { 63 display->parent->frontbuffer->ref(front); 64 } 65 66 void intel_parent_frontbuffer_put(struct intel_display *display, struct intel_frontbuffer *front) 67 { 68 display->parent->frontbuffer->put(front); 69 } 70 71 void intel_parent_frontbuffer_flush_for_display(struct intel_display *display, struct intel_frontbuffer *front) 72 { 73 display->parent->frontbuffer->flush_for_display(front); 74 } 75 76 /* hdcp */ 77 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, 78 struct intel_hdcp_gsc_context *gsc_context, 79 void *msg_in, size_t msg_in_len, 80 void *msg_out, size_t msg_out_len) 81 { 82 return display->parent->hdcp->gsc_msg_send(gsc_context, msg_in, msg_in_len, msg_out, msg_out_len); 83 } 84 85 bool intel_parent_hdcp_gsc_check_status(struct intel_display *display) 86 { 87 return display->parent->hdcp->gsc_check_status(display->drm); 88 } 89 90 struct intel_hdcp_gsc_context *intel_parent_hdcp_gsc_context_alloc(struct intel_display *display) 91 { 92 return display->parent->hdcp->gsc_context_alloc(display->drm); 93 } 94 95 void intel_parent_hdcp_gsc_context_free(struct intel_display *display, 96 struct intel_hdcp_gsc_context *gsc_context) 97 { 98 display->parent->hdcp->gsc_context_free(gsc_context); 99 } 100 101 /* irq */ 102 bool intel_parent_irq_enabled(struct intel_display *display) 103 { 104 return display->parent->irq->enabled(display->drm); 105 } 106 107 void intel_parent_irq_synchronize(struct intel_display *display) 108 { 109 display->parent->irq->synchronize(display->drm); 110 } 111 112 /* overlay */ 113 bool intel_parent_overlay_is_active(struct intel_display *display) 114 { 115 return display->parent->overlay->is_active(display->drm); 116 } 117 118 int intel_parent_overlay_on(struct intel_display *display, 119 u32 frontbuffer_bits) 120 { 121 return display->parent->overlay->overlay_on(display->drm, 122 frontbuffer_bits); 123 } 124 125 int intel_parent_overlay_continue(struct intel_display *display, 126 struct i915_vma *vma, 127 bool load_polyphase_filter) 128 { 129 return display->parent->overlay->overlay_continue(display->drm, vma, 130 load_polyphase_filter); 131 } 132 133 int intel_parent_overlay_off(struct intel_display *display) 134 { 135 return display->parent->overlay->overlay_off(display->drm); 136 } 137 138 int intel_parent_overlay_recover_from_interrupt(struct intel_display *display) 139 { 140 return display->parent->overlay->recover_from_interrupt(display->drm); 141 } 142 143 int intel_parent_overlay_release_old_vid(struct intel_display *display) 144 { 145 return display->parent->overlay->release_old_vid(display->drm); 146 } 147 148 void intel_parent_overlay_reset(struct intel_display *display) 149 { 150 display->parent->overlay->reset(display->drm); 151 } 152 153 struct i915_vma *intel_parent_overlay_pin_fb(struct intel_display *display, 154 struct drm_gem_object *obj, 155 u32 *offset) 156 { 157 return display->parent->overlay->pin_fb(display->drm, obj, offset); 158 } 159 160 void intel_parent_overlay_unpin_fb(struct intel_display *display, 161 struct i915_vma *vma) 162 { 163 return display->parent->overlay->unpin_fb(display->drm, vma); 164 } 165 166 struct drm_gem_object *intel_parent_overlay_obj_lookup(struct intel_display *display, 167 struct drm_file *filp, 168 u32 handle) 169 { 170 return display->parent->overlay->obj_lookup(display->drm, 171 filp, handle); 172 } 173 174 void __iomem *intel_parent_overlay_setup(struct intel_display *display, 175 bool needs_physical) 176 { 177 if (drm_WARN_ON_ONCE(display->drm, !display->parent->overlay)) 178 return ERR_PTR(-ENODEV); 179 180 return display->parent->overlay->setup(display->drm, needs_physical); 181 } 182 183 void intel_parent_overlay_cleanup(struct intel_display *display) 184 { 185 display->parent->overlay->cleanup(display->drm); 186 } 187 188 /* panic */ 189 struct intel_panic *intel_parent_panic_alloc(struct intel_display *display) 190 { 191 return display->parent->panic->alloc(); 192 } 193 194 int intel_parent_panic_setup(struct intel_display *display, struct intel_panic *panic, struct drm_scanout_buffer *sb) 195 { 196 return display->parent->panic->setup(panic, sb); 197 } 198 199 void intel_parent_panic_finish(struct intel_display *display, struct intel_panic *panic) 200 { 201 display->parent->panic->finish(panic); 202 } 203 204 /* pc8 */ 205 void intel_parent_pc8_block(struct intel_display *display) 206 { 207 if (drm_WARN_ON_ONCE(display->drm, !display->parent->pc8)) 208 return; 209 210 display->parent->pc8->block(display->drm); 211 } 212 213 void intel_parent_pc8_unblock(struct intel_display *display) 214 { 215 if (drm_WARN_ON_ONCE(display->drm, !display->parent->pc8)) 216 return; 217 218 display->parent->pc8->unblock(display->drm); 219 } 220 221 /* pcode */ 222 int intel_parent_pcode_read(struct intel_display *display, u32 mbox, u32 *val, u32 *val1) 223 { 224 return display->parent->pcode->read(display->drm, mbox, val, val1); 225 } 226 227 int intel_parent_pcode_write_timeout(struct intel_display *display, u32 mbox, u32 val, int timeout_ms) 228 { 229 return display->parent->pcode->write(display->drm, mbox, val, timeout_ms); 230 } 231 232 int intel_parent_pcode_write(struct intel_display *display, u32 mbox, u32 val) 233 { 234 return intel_parent_pcode_write_timeout(display, mbox, val, 1); 235 } 236 237 int intel_parent_pcode_request(struct intel_display *display, u32 mbox, u32 request, 238 u32 reply_mask, u32 reply, int timeout_base_ms) 239 { 240 return display->parent->pcode->request(display->drm, mbox, request, reply_mask, reply, timeout_base_ms); 241 } 242 243 /* rps */ 244 bool intel_parent_rps_available(struct intel_display *display) 245 { 246 return display->parent->rps; 247 } 248 249 void intel_parent_rps_boost_if_not_started(struct intel_display *display, struct dma_fence *fence) 250 { 251 if (display->parent->rps) 252 display->parent->rps->boost_if_not_started(fence); 253 } 254 255 void intel_parent_rps_mark_interactive(struct intel_display *display, bool interactive) 256 { 257 if (display->parent->rps) 258 display->parent->rps->mark_interactive(display->drm, interactive); 259 } 260 261 void intel_parent_rps_ilk_irq_handler(struct intel_display *display) 262 { 263 if (display->parent->rps) 264 display->parent->rps->ilk_irq_handler(display->drm); 265 } 266 267 /* stolen */ 268 int intel_parent_stolen_insert_node_in_range(struct intel_display *display, 269 struct intel_stolen_node *node, u64 size, 270 unsigned int align, u64 start, u64 end) 271 { 272 return display->parent->stolen->insert_node_in_range(node, size, align, start, end); 273 } 274 275 int intel_parent_stolen_insert_node(struct intel_display *display, struct intel_stolen_node *node, u64 size, 276 unsigned int align) 277 { 278 if (drm_WARN_ON_ONCE(display->drm, !display->parent->stolen->insert_node)) 279 return -ENODEV; 280 281 return display->parent->stolen->insert_node(node, size, align); 282 } 283 284 void intel_parent_stolen_remove_node(struct intel_display *display, 285 struct intel_stolen_node *node) 286 { 287 display->parent->stolen->remove_node(node); 288 } 289 290 bool intel_parent_stolen_initialized(struct intel_display *display) 291 { 292 return display->parent->stolen->initialized(display->drm); 293 } 294 295 bool intel_parent_stolen_node_allocated(struct intel_display *display, 296 const struct intel_stolen_node *node) 297 { 298 return display->parent->stolen->node_allocated(node); 299 } 300 301 u32 intel_parent_stolen_node_offset(struct intel_display *display, struct intel_stolen_node *node) 302 { 303 return display->parent->stolen->node_offset(node); 304 } 305 306 u64 intel_parent_stolen_area_address(struct intel_display *display) 307 { 308 if (drm_WARN_ON_ONCE(display->drm, !display->parent->stolen->area_address)) 309 return 0; 310 311 return display->parent->stolen->area_address(display->drm); 312 } 313 314 u64 intel_parent_stolen_area_size(struct intel_display *display) 315 { 316 if (drm_WARN_ON_ONCE(display->drm, !display->parent->stolen->area_size)) 317 return 0; 318 319 return display->parent->stolen->area_size(display->drm); 320 } 321 322 u64 intel_parent_stolen_node_address(struct intel_display *display, struct intel_stolen_node *node) 323 { 324 return display->parent->stolen->node_address(node); 325 } 326 327 u64 intel_parent_stolen_node_size(struct intel_display *display, const struct intel_stolen_node *node) 328 { 329 return display->parent->stolen->node_size(node); 330 } 331 332 struct intel_stolen_node *intel_parent_stolen_node_alloc(struct intel_display *display) 333 { 334 return display->parent->stolen->node_alloc(display->drm); 335 } 336 337 void intel_parent_stolen_node_free(struct intel_display *display, const struct intel_stolen_node *node) 338 { 339 display->parent->stolen->node_free(node); 340 } 341 342 /* vlv iosf */ 343 void intel_parent_vlv_iosf_get(struct intel_display *display, unsigned long unit_mask) 344 { 345 if (drm_WARN_ON_ONCE(display->drm, !display->parent->vlv_iosf)) 346 return; 347 348 display->parent->vlv_iosf->get(display->drm, unit_mask); 349 } 350 351 void intel_parent_vlv_iosf_put(struct intel_display *display, unsigned long unit_mask) 352 { 353 if (drm_WARN_ON_ONCE(display->drm, !display->parent->vlv_iosf)) 354 return; 355 356 display->parent->vlv_iosf->put(display->drm, unit_mask); 357 } 358 359 u32 intel_parent_vlv_iosf_read(struct intel_display *display, enum vlv_iosf_sb_unit unit, u32 addr) 360 { 361 if (drm_WARN_ON_ONCE(display->drm, !display->parent->vlv_iosf)) 362 return 0; 363 364 return display->parent->vlv_iosf->read(display->drm, unit, addr); 365 } 366 367 int intel_parent_vlv_iosf_write(struct intel_display *display, enum vlv_iosf_sb_unit unit, u32 addr, u32 val) 368 { 369 if (drm_WARN_ON_ONCE(display->drm, !display->parent->vlv_iosf)) 370 return -EINVAL; 371 372 return display->parent->vlv_iosf->write(display->drm, unit, addr, val); 373 } 374 375 /* generic */ 376 void intel_parent_fence_priority_display(struct intel_display *display, struct dma_fence *fence) 377 { 378 if (display->parent->fence_priority_display) 379 display->parent->fence_priority_display(fence); 380 } 381 382 bool intel_parent_has_auxccs(struct intel_display *display) 383 { 384 return display->parent->has_auxccs && display->parent->has_auxccs(display->drm); 385 } 386 387 bool intel_parent_has_fenced_regions(struct intel_display *display) 388 { 389 return display->parent->has_fenced_regions && display->parent->has_fenced_regions(display->drm); 390 } 391 392 bool intel_parent_vgpu_active(struct intel_display *display) 393 { 394 return display->parent->vgpu_active && display->parent->vgpu_active(display->drm); 395 } 396