| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * Copyright 2024 NXP |
| */ |
| |
| #ifndef __DC_KMS_H__ |
| #define __DC_KMS_H__ |
| |
| #include <linux/completion.h> |
| |
| #include <drm/drm_crtc.h> |
| #include <drm/drm_plane.h> |
| #include <drm/drm_vblank.h> |
| |
| #include "dc-de.h" |
| #include "dc-fu.h" |
| #include "dc-pe.h" |
| |
| #define DC_CRTC_IRQS 5 |
| |
| struct dc_crtc_irq { |
| struct dc_crtc *dc_crtc; |
| unsigned int irq; |
| }; |
| |
| /** |
| * struct dc_crtc - DC specific drm_crtc |
| * |
| * Each display controller contains one content stream and one safety stream. |
| * In general, the two streams have the same functionality. One stream is |
| * overlaid on the other by @fg. This driver chooses to generate black constant |
| * color from the content stream as background color, build plane(s) on the |
| * content stream by using layerblend(s) and always generate a constant color |
| * from the safety stream. Note that due to the decoupled timing, the safety |
| * stream still works to show the constant color properly even when the content |
| * stream has completely hung up due to mal-function of this driver. |
| */ |
| struct dc_crtc { |
| /** @base: base drm_crtc structure */ |
| struct drm_crtc base; |
| /** @de: display engine */ |
| struct dc_de *de; |
| /** @cf_cont: content stream constframe */ |
| struct dc_cf *cf_cont; |
| /** @cf_safe: safety stream constframe */ |
| struct dc_cf *cf_safe; |
| /** @ed_cont: content stream extdst */ |
| struct dc_ed *ed_cont; |
| /** @ed_safe: safety stream extdst */ |
| struct dc_ed *ed_safe; |
| /** @fg: framegen */ |
| struct dc_fg *fg; |
| /** |
| * @irq_dec_framecomplete: |
| * |
| * display engine configuration frame complete interrupt |
| */ |
| unsigned int irq_dec_framecomplete; |
| /** |
| * @irq_dec_seqcomplete: |
| * |
| * display engine configuration sequence complete interrupt |
| */ |
| unsigned int irq_dec_seqcomplete; |
| /** |
| * @irq_dec_shdload: |
| * |
| * display engine configuration shadow load interrupt |
| */ |
| unsigned int irq_dec_shdload; |
| /** |
| * @irq_ed_cont_shdload: |
| * |
| * content stream extdst shadow load interrupt |
| */ |
| unsigned int irq_ed_cont_shdload; |
| /** |
| * @irq_ed_safe_shdload: |
| * |
| * safety stream extdst shadow load interrupt |
| */ |
| unsigned int irq_ed_safe_shdload; |
| /** |
| * @dec_seqcomplete_done: |
| * |
| * display engine configuration sequence completion |
| */ |
| struct completion dec_seqcomplete_done; |
| /** |
| * @dec_shdload_done: |
| * |
| * display engine configuration shadow load completion |
| */ |
| struct completion dec_shdload_done; |
| /** |
| * @ed_cont_shdload_done: |
| * |
| * content stream extdst shadow load completion |
| */ |
| struct completion ed_cont_shdload_done; |
| /** |
| * @ed_safe_shdload_done: |
| * |
| * safety stream extdst shadow load completion |
| */ |
| struct completion ed_safe_shdload_done; |
| /** @event: cached pending vblank event */ |
| struct drm_pending_vblank_event *event; |
| /** @irqs: interrupt list */ |
| struct dc_crtc_irq irqs[DC_CRTC_IRQS]; |
| }; |
| |
| /** |
| * struct dc_plane - DC specific drm_plane |
| * |
| * Build a plane on content stream with a fetchunit and a layerblend. |
| */ |
| struct dc_plane { |
| /** @base: base drm_plane structure */ |
| struct drm_plane base; |
| /** @fu: fetchunit */ |
| struct dc_fu *fu; |
| /** @cf: content stream constframe */ |
| struct dc_cf *cf; |
| /** @lb: layerblend */ |
| struct dc_lb *lb; |
| /** @ed: content stream extdst */ |
| struct dc_ed *ed; |
| }; |
| |
| #endif /* __DC_KMS_H__ */ |