Merge tag 'rtc-6.6' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / nouveau / dispnv50 / crc.h
1 /* SPDX-License-Identifier: MIT */
2 #ifndef __NV50_CRC_H__
3 #define __NV50_CRC_H__
4
5 #include <linux/mutex.h>
6 #include <drm/drm_crtc.h>
7 #include <drm/drm_vblank_work.h>
8
9 #include <nvif/mem.h>
10 #include <nvkm/subdev/bios.h>
11 #include "nouveau_encoder.h"
12
13 struct nv50_atom;
14 struct nv50_disp;
15 struct nv50_head;
16
17 #if IS_ENABLED(CONFIG_DEBUG_FS)
18 enum nv50_crc_source {
19         NV50_CRC_SOURCE_NONE = 0,
20         NV50_CRC_SOURCE_AUTO,
21         NV50_CRC_SOURCE_RG,
22         NV50_CRC_SOURCE_OUTP_ACTIVE,
23         NV50_CRC_SOURCE_OUTP_COMPLETE,
24         NV50_CRC_SOURCE_OUTP_INACTIVE,
25 };
26
27 /* RG -> SF (DP only)
28  *    -> SOR
29  *    -> PIOR
30  *    -> DAC
31  */
32 enum nv50_crc_source_type {
33         NV50_CRC_SOURCE_TYPE_NONE = 0,
34         NV50_CRC_SOURCE_TYPE_SOR,
35         NV50_CRC_SOURCE_TYPE_PIOR,
36         NV50_CRC_SOURCE_TYPE_DAC,
37         NV50_CRC_SOURCE_TYPE_RG,
38         NV50_CRC_SOURCE_TYPE_SF,
39 };
40
41 struct nv50_crc_notifier_ctx {
42         struct nvif_mem mem;
43         struct nvif_object ntfy;
44 };
45
46 struct nv50_crc_atom {
47         enum nv50_crc_source src;
48 };
49
50 struct nv50_crc_func {
51         int (*set_src)(struct nv50_head *, int or, enum nv50_crc_source_type type,
52                        struct nv50_crc_notifier_ctx *ctx);
53         int (*set_ctx)(struct nv50_head *, struct nv50_crc_notifier_ctx *);
54         u32 (*get_entry)(struct nv50_head *, struct nv50_crc_notifier_ctx *,
55                          enum nv50_crc_source, int idx);
56         bool (*ctx_finished)(struct nv50_head *,
57                              struct nv50_crc_notifier_ctx *);
58         short flip_threshold;
59         short num_entries;
60         size_t notifier_len;
61 };
62
63 struct nv50_crc {
64         spinlock_t lock;
65         struct nv50_crc_notifier_ctx ctx[2];
66         struct drm_vblank_work flip_work;
67         enum nv50_crc_source src;
68
69         u64 frame;
70         short entry_idx;
71         short flip_threshold;
72         u8 ctx_idx : 1;
73         bool ctx_changed : 1;
74 };
75
76 void nv50_crc_init(struct drm_device *dev);
77 int nv50_head_crc_late_register(struct nv50_head *);
78 void nv50_crc_handle_vblank(struct nv50_head *head);
79
80 int nv50_crc_verify_source(struct drm_crtc *, const char *, size_t *);
81 const char *const *nv50_crc_get_sources(struct drm_crtc *, size_t *);
82 int nv50_crc_set_source(struct drm_crtc *, const char *);
83
84 int nv50_crc_atomic_check_head(struct nv50_head *, struct nv50_head_atom *,
85                                struct nv50_head_atom *);
86 void nv50_crc_atomic_check_outp(struct nv50_atom *atom);
87 void nv50_crc_atomic_stop_reporting(struct drm_atomic_state *);
88 void nv50_crc_atomic_init_notifier_contexts(struct drm_atomic_state *);
89 void nv50_crc_atomic_release_notifier_contexts(struct drm_atomic_state *);
90 void nv50_crc_atomic_start_reporting(struct drm_atomic_state *);
91 void nv50_crc_atomic_set(struct nv50_head *, struct nv50_head_atom *);
92 void nv50_crc_atomic_clr(struct nv50_head *);
93
94 extern const struct nv50_crc_func crc907d;
95 extern const struct nv50_crc_func crcc37d;
96 extern const struct nv50_crc_func crcc57d;
97
98 #else /* IS_ENABLED(CONFIG_DEBUG_FS) */
99 struct nv50_crc {};
100 struct nv50_crc_func {};
101 struct nv50_crc_atom {};
102
103 #define nv50_crc_verify_source NULL
104 #define nv50_crc_get_sources NULL
105 #define nv50_crc_set_source NULL
106
107 static inline void nv50_crc_init(struct drm_device *dev) {}
108 static inline int
109 nv50_head_crc_late_register(struct nv50_head *head) { return 0; }
110 static inline void nv50_crc_handle_vblank(struct nv50_head *head) {}
111
112 static inline int
113 nv50_crc_atomic_check_head(struct nv50_head *head,
114                            struct nv50_head_atom *asyh,
115                            struct nv50_head_atom *armh) { return 0; }
116 static inline void nv50_crc_atomic_check_outp(struct nv50_atom *atom) {}
117 static inline void
118 nv50_crc_atomic_stop_reporting(struct drm_atomic_state *state) {}
119 static inline void
120 nv50_crc_atomic_init_notifier_contexts(struct drm_atomic_state *state) {}
121 static inline void
122 nv50_crc_atomic_release_notifier_contexts(struct drm_atomic_state *state) {}
123 static inline void
124 nv50_crc_atomic_start_reporting(struct drm_atomic_state *state) {}
125 static inline void
126 nv50_crc_atomic_set(struct nv50_head *head, struct nv50_head_atom *state) {}
127 static inline void
128 nv50_crc_atomic_clr(struct nv50_head *head) {}
129
130 #endif /* IS_ENABLED(CONFIG_DEBUG_FS) */
131 #endif /* !__NV50_CRC_H__ */