Blame view

include/drm/drm_bridge.h 10.1 KB
199e4e967   Daniel Vetter   drm: Extract drm_...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  /*
   * Copyright (c) 2016 Intel Corporation
   *
   * Permission to use, copy, modify, distribute, and sell this software and its
   * documentation for any purpose is hereby granted without fee, provided that
   * the above copyright notice appear in all copies and that both that copyright
   * notice and this permission notice appear in supporting documentation, and
   * that the name of the copyright holders not be used in advertising or
   * publicity pertaining to distribution of the software without specific,
   * written prior permission.  The copyright holders make no representations
   * about the suitability of this software for any purpose.  It is provided "as
   * is" without express or implied warranty.
   *
   * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
   * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
   * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
   * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
   * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
   * OF THIS SOFTWARE.
   */
  
  #ifndef __DRM_BRIDGE_H__
  #define __DRM_BRIDGE_H__
  
  #include <linux/list.h>
  #include <linux/ctype.h>
  #include <drm/drm_mode_object.h>
  #include <drm/drm_modes.h>
  
  struct drm_bridge;
13dfc0540   Eric Anholt   drm/bridge: Refac...
32
  struct drm_panel;
199e4e967   Daniel Vetter   drm: Extract drm_...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  
  /**
   * struct drm_bridge_funcs - drm_bridge control functions
   */
  struct drm_bridge_funcs {
  	/**
  	 * @attach:
  	 *
  	 * This callback is invoked whenever our bridge is being attached to a
  	 * &drm_encoder.
  	 *
  	 * The attach callback is optional.
  	 *
  	 * RETURNS:
  	 *
  	 * Zero on success, error code on failure.
  	 */
  	int (*attach)(struct drm_bridge *bridge);
  
  	/**
  	 * @detach:
  	 *
  	 * This callback is invoked whenever our bridge is being detached from a
  	 * &drm_encoder.
  	 *
  	 * The detach callback is optional.
  	 */
  	void (*detach)(struct drm_bridge *bridge);
  
  	/**
3eb220a53   Jose Abreu   drm: Add crtc/enc...
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  	 * @mode_valid:
  	 *
  	 * This callback is used to check if a specific mode is valid in this
  	 * bridge. This should be implemented if the bridge has some sort of
  	 * restriction in the modes it can display. For example, a given bridge
  	 * may be responsible to set a clock value. If the clock can not
  	 * produce all the values for the available modes then this callback
  	 * can be used to restrict the number of modes to only the ones that
  	 * can be displayed.
  	 *
  	 * This hook is used by the probe helpers to filter the mode list in
  	 * drm_helper_probe_single_connector_modes(), and it is used by the
  	 * atomic helpers to validate modes supplied by userspace in
  	 * drm_atomic_helper_check_modeset().
  	 *
  	 * This function is optional.
  	 *
  	 * NOTE:
  	 *
  	 * Since this function is both called from the check phase of an atomic
  	 * commit, and the mode validation in the probe paths it is not allowed
  	 * to look at anything else but the passed-in mode, and validate it
  	 * against configuration-invariant hardward constraints. Any further
  	 * limits which depend upon the configuration can only be checked in
  	 * @mode_fixup.
  	 *
  	 * RETURNS:
  	 *
  	 * drm_mode_status Enum
  	 */
  	enum drm_mode_status (*mode_valid)(struct drm_bridge *crtc,
  					   const struct drm_display_mode *mode);
  
  	/**
199e4e967   Daniel Vetter   drm: Extract drm_...
97
98
99
100
101
102
103
  	 * @mode_fixup:
  	 *
  	 * This callback is used to validate and adjust a mode. The paramater
  	 * mode is the display mode that should be fed to the next element in
  	 * the display chain, either the final &drm_connector or the next
  	 * &drm_bridge. The parameter adjusted_mode is the input mode the bridge
  	 * requires. It can be modified by this callback and does not need to
9de5d4a61   Daniel Vetter   drm/doc: Document...
104
  	 * match mode. See also &drm_crtc_state.adjusted_mode for more details.
199e4e967   Daniel Vetter   drm: Extract drm_...
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
  	 *
  	 * This is the only hook that allows a bridge to reject a modeset. If
  	 * this function passes all other callbacks must succeed for this
  	 * configuration.
  	 *
  	 * The mode_fixup callback is optional.
  	 *
  	 * NOTE:
  	 *
  	 * This function is called in the check phase of atomic modesets, which
  	 * can be aborted for any reason (including on userspace's request to
  	 * just check whether a configuration would be possible). Drivers MUST
  	 * NOT touch any persistent state (hardware or software) or data
  	 * structures except the passed in @state parameter.
  	 *
3eb220a53   Jose Abreu   drm: Add crtc/enc...
120
121
122
123
124
125
  	 * Also beware that userspace can request its own custom modes, neither
  	 * core nor helpers filter modes to the list of probe modes reported by
  	 * the GETCONNECTOR IOCTL and stored in &drm_connector.modes. To ensure
  	 * that modes are filtered consistently put any bridge constraints and
  	 * limits checks into @mode_valid.
  	 *
199e4e967   Daniel Vetter   drm: Extract drm_...
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	 * RETURNS:
  	 *
  	 * True if an acceptable configuration is possible, false if the modeset
  	 * operation should be rejected.
  	 */
  	bool (*mode_fixup)(struct drm_bridge *bridge,
  			   const struct drm_display_mode *mode,
  			   struct drm_display_mode *adjusted_mode);
  	/**
  	 * @disable:
  	 *
  	 * This callback should disable the bridge. It is called right before
  	 * the preceding element in the display pipe is disabled. If the
  	 * preceding element is a bridge this means it's called before that
4541d31e2   Daniel Vetter   drm/bridge: Use r...
140
141
142
143
  	 * bridge's @disable vfunc. If the preceding element is a &drm_encoder
  	 * it's called right before the &drm_encoder_helper_funcs.disable,
  	 * &drm_encoder_helper_funcs.prepare or &drm_encoder_helper_funcs.dpms
  	 * hook.
199e4e967   Daniel Vetter   drm: Extract drm_...
144
145
146
147
148
149
150
151
152
153
154
  	 *
  	 * The bridge can assume that the display pipe (i.e. clocks and timing
  	 * signals) feeding it is still running when this callback is called.
  	 *
  	 * The disable callback is optional.
  	 */
  	void (*disable)(struct drm_bridge *bridge);
  
  	/**
  	 * @post_disable:
  	 *
4541d31e2   Daniel Vetter   drm/bridge: Use r...
155
156
157
158
159
160
161
  	 * This callback should disable the bridge. It is called right after the
  	 * preceding element in the display pipe is disabled. If the preceding
  	 * element is a bridge this means it's called after that bridge's
  	 * @post_disable function. If the preceding element is a &drm_encoder
  	 * it's called right after the encoder's
  	 * &drm_encoder_helper_funcs.disable, &drm_encoder_helper_funcs.prepare
  	 * or &drm_encoder_helper_funcs.dpms hook.
199e4e967   Daniel Vetter   drm: Extract drm_...
162
163
164
165
166
167
168
169
170
171
172
173
174
  	 *
  	 * The bridge must assume that the display pipe (i.e. clocks and timing
  	 * singals) feeding it is no longer running when this callback is
  	 * called.
  	 *
  	 * The post_disable callback is optional.
  	 */
  	void (*post_disable)(struct drm_bridge *bridge);
  
  	/**
  	 * @mode_set:
  	 *
  	 * This callback should set the given mode on the bridge. It is called
4541d31e2   Daniel Vetter   drm/bridge: Use r...
175
176
177
178
179
  	 * after the @mode_set callback for the preceding element in the display
  	 * pipeline has been called already. If the bridge is the first element
  	 * then this would be &drm_encoder_helper_funcs.mode_set. The display
  	 * pipe (i.e.  clocks and timing signals) is off when this function is
  	 * called.
199e4e967   Daniel Vetter   drm: Extract drm_...
180
181
182
183
184
185
186
187
188
189
  	 */
  	void (*mode_set)(struct drm_bridge *bridge,
  			 struct drm_display_mode *mode,
  			 struct drm_display_mode *adjusted_mode);
  	/**
  	 * @pre_enable:
  	 *
  	 * This callback should enable the bridge. It is called right before
  	 * the preceding element in the display pipe is enabled. If the
  	 * preceding element is a bridge this means it's called before that
4541d31e2   Daniel Vetter   drm/bridge: Use r...
190
191
192
193
  	 * bridge's @pre_enable function. If the preceding element is a
  	 * &drm_encoder it's called right before the encoder's
  	 * &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
  	 * &drm_encoder_helper_funcs.dpms hook.
199e4e967   Daniel Vetter   drm: Extract drm_...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
  	 *
  	 * The display pipe (i.e. clocks and timing signals) feeding this bridge
  	 * will not yet be running when this callback is called. The bridge must
  	 * not enable the display link feeding the next bridge in the chain (if
  	 * there is one) when this callback is called.
  	 *
  	 * The pre_enable callback is optional.
  	 */
  	void (*pre_enable)(struct drm_bridge *bridge);
  
  	/**
  	 * @enable:
  	 *
  	 * This callback should enable the bridge. It is called right after
  	 * the preceding element in the display pipe is enabled. If the
  	 * preceding element is a bridge this means it's called after that
4541d31e2   Daniel Vetter   drm/bridge: Use r...
210
211
212
213
  	 * bridge's @enable function. If the preceding element is a
  	 * &drm_encoder it's called right after the encoder's
  	 * &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
  	 * &drm_encoder_helper_funcs.dpms hook.
199e4e967   Daniel Vetter   drm: Extract drm_...
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
  	 *
  	 * The bridge can assume that the display pipe (i.e. clocks and timing
  	 * signals) feeding it is running when this callback is called. This
  	 * callback must enable the display link feeding the next bridge in the
  	 * chain if there is one.
  	 *
  	 * The enable callback is optional.
  	 */
  	void (*enable)(struct drm_bridge *bridge);
  };
  
  /**
   * struct drm_bridge - central DRM bridge control structure
   * @dev: DRM device this bridge belongs to
   * @encoder: encoder to which this bridge is connected
   * @next: the next bridge in the encoder chain
   * @of_node: device node pointer to the bridge
   * @list: to keep track of all added bridges
   * @funcs: control functions
   * @driver_private: pointer to the bridge driver's internal context
   */
  struct drm_bridge {
  	struct drm_device *dev;
  	struct drm_encoder *encoder;
  	struct drm_bridge *next;
  #ifdef CONFIG_OF
  	struct device_node *of_node;
  #endif
  	struct list_head list;
  
  	const struct drm_bridge_funcs *funcs;
  	void *driver_private;
  };
  
  int drm_bridge_add(struct drm_bridge *bridge);
  void drm_bridge_remove(struct drm_bridge *bridge);
  struct drm_bridge *of_drm_find_bridge(struct device_node *np);
3bb80f249   Laurent Pinchart   drm: bridge: Link...
251
252
  int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
  		      struct drm_bridge *previous);
199e4e967   Daniel Vetter   drm: Extract drm_...
253
254
255
256
  
  bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
  			const struct drm_display_mode *mode,
  			struct drm_display_mode *adjusted_mode);
b1240f81a   Jose Abreu   drm: Introduce dr...
257
258
  enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge,
  					   const struct drm_display_mode *mode);
199e4e967   Daniel Vetter   drm: Extract drm_...
259
260
261
262
263
264
265
  void drm_bridge_disable(struct drm_bridge *bridge);
  void drm_bridge_post_disable(struct drm_bridge *bridge);
  void drm_bridge_mode_set(struct drm_bridge *bridge,
  			struct drm_display_mode *mode,
  			struct drm_display_mode *adjusted_mode);
  void drm_bridge_pre_enable(struct drm_bridge *bridge);
  void drm_bridge_enable(struct drm_bridge *bridge);
13dfc0540   Eric Anholt   drm/bridge: Refac...
266
267
268
269
  #ifdef CONFIG_DRM_PANEL_BRIDGE
  struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
  					u32 connector_type);
  void drm_panel_bridge_remove(struct drm_bridge *bridge);
67022227f   Eric Anholt   drm/bridge: Add a...
270
271
272
  struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
  					     struct drm_panel *panel,
  					     u32 connector_type);
13dfc0540   Eric Anholt   drm/bridge: Refac...
273
  #endif
199e4e967   Daniel Vetter   drm: Extract drm_...
274
  #endif