blob: f6dee6b75b34928cdd5936e5b5a21168a80e950f [file] [log] [blame]
Lloyd Atkinson8c49c582016-11-18 14:23:54 -05001/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
Clarence Ipdd8021c2016-07-20 16:39:47 -04002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef _SDE_CONNECTOR_H_
14#define _SDE_CONNECTOR_H_
15
Ping Li8430ee12017-02-24 14:14:44 -080016#include <uapi/drm/msm_drm_pp.h>
Clarence Ipdd8021c2016-07-20 16:39:47 -040017#include <drm/drmP.h>
18#include <drm/drm_atomic.h>
19#include <drm/drm_panel.h>
20
Clarence Ipcb3afd42016-07-15 16:25:34 -040021#include "msm_drv.h"
Clarence Ipdd8021c2016-07-20 16:39:47 -040022#include "msm_prop.h"
23#include "sde_kms.h"
Clarence Ipe59fb3f2016-07-26 13:39:59 -040024#include "sde_fence.h"
Clarence Ipdd8021c2016-07-20 16:39:47 -040025
26#define SDE_CONNECTOR_NAME_SIZE 16
27
28struct sde_connector;
29struct sde_connector_state;
30
31/**
32 * struct sde_connector_ops - callback functions for generic sde connector
33 * Individual callbacks documented below.
34 */
35struct sde_connector_ops {
36 /**
37 * post_init - perform additional initialization steps
38 * @connector: Pointer to drm connector structure
Alan Kwong769fba92017-11-13 16:50:36 -050039 * @display: Pointer to private display handle
40 * Returns: Zero on success
41 */
42 int (*post_init)(struct drm_connector *connector,
43 void *display);
44
45 /**
46 * set_info_blob - initialize given info blob
47 * @connector: Pointer to drm connector structure
Clarence Ipdd8021c2016-07-20 16:39:47 -040048 * @info: Pointer to sde connector info structure
49 * @display: Pointer to private display handle
Jeykumar Sankaran736d79d2017-10-05 17:44:24 -070050 * @mode_info: Pointer to mode info structure
Clarence Ipdd8021c2016-07-20 16:39:47 -040051 * Returns: Zero on success
52 */
Alan Kwong769fba92017-11-13 16:50:36 -050053 int (*set_info_blob)(struct drm_connector *connector,
Clarence Ipdd8021c2016-07-20 16:39:47 -040054 void *info,
Jeykumar Sankaran736d79d2017-10-05 17:44:24 -070055 void *display,
56 struct msm_mode_info *mode_info);
Clarence Ipdd8021c2016-07-20 16:39:47 -040057
58 /**
59 * detect - determine if connector is connected
60 * @connector: Pointer to drm connector structure
61 * @force: Force detect setting from drm framework
62 * @display: Pointer to private display handle
63 * Returns: Connector 'is connected' status
64 */
65 enum drm_connector_status (*detect)(struct drm_connector *connector,
66 bool force,
67 void *display);
68
69 /**
70 * get_modes - add drm modes via drm_mode_probed_add()
71 * @connector: Pointer to drm connector structure
72 * @display: Pointer to private display handle
73 * Returns: Number of modes added
74 */
75 int (*get_modes)(struct drm_connector *connector,
76 void *display);
77
78 /**
Jeykumar Sankaran446a5f12017-05-09 20:30:39 -070079 * put_modes - free up drm modes of the connector
80 * @connector: Pointer to drm connector structure
81 * @display: Pointer to private display handle
82 */
83 void (*put_modes)(struct drm_connector *connector,
84 void *display);
85
86 /**
Jeykumar Sankaran5c2f0702017-03-09 18:03:15 -080087 * update_pps - update pps command for the display panel
88 * @pps_cmd: Pointer to pps command
89 * @display: Pointer to private display handle
90 * Returns: Zero on success
91 */
92 int (*update_pps)(char *pps_cmd, void *display);
93
94 /**
Clarence Ipdd8021c2016-07-20 16:39:47 -040095 * mode_valid - determine if specified mode is valid
96 * @connector: Pointer to drm connector structure
97 * @mode: Pointer to drm mode structure
98 * @display: Pointer to private display handle
99 * Returns: Validity status for specified mode
100 */
101 enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
102 struct drm_display_mode *mode,
103 void *display);
104
105 /**
106 * set_property - set property value
107 * @connector: Pointer to drm connector structure
108 * @state: Pointer to drm connector state structure
109 * @property_index: DRM property index
110 * @value: Incoming property value
111 * @display: Pointer to private display structure
112 * Returns: Zero on success
113 */
114 int (*set_property)(struct drm_connector *connector,
115 struct drm_connector_state *state,
116 int property_index,
117 uint64_t value,
118 void *display);
119
120 /**
121 * get_property - get property value
122 * @connector: Pointer to drm connector structure
123 * @state: Pointer to drm connector state structure
124 * @property_index: DRM property index
125 * @value: Pointer to variable for accepting property value
126 * @display: Pointer to private display structure
127 * Returns: Zero on success
128 */
129 int (*get_property)(struct drm_connector *connector,
130 struct drm_connector_state *state,
131 int property_index,
132 uint64_t *value,
133 void *display);
Clarence Ipcb3afd42016-07-15 16:25:34 -0400134
135 /**
136 * get_info - get display information
137 * @info: Pointer to msm display info structure
138 * @display: Pointer to private display structure
139 * Returns: Zero on success
140 */
141 int (*get_info)(struct msm_display_info *info, void *display);
Vishnuvardhan Prodduturi75b96802016-10-17 18:45:55 +0530142
Clarence Ipa18d4832017-03-13 12:35:44 -0700143 /**
Jeykumar Sankaran446a5f12017-05-09 20:30:39 -0700144 * get_mode_info - retrieve mode information
Jeykumar Sankaran6b345ac2017-03-15 19:17:19 -0700145 * @drm_mode: Display mode set for the display
Jeykumar Sankaran446a5f12017-05-09 20:30:39 -0700146 * @mode_info: Out parameter. information of the display mode
Jeykumar Sankaran6b345ac2017-03-15 19:17:19 -0700147 * @max_mixer_width: max width supported by HW layer mixer
Alan Kwongb1bca602017-09-18 17:28:45 -0400148 * @display: Pointer to private display structure
Jeykumar Sankaran6b345ac2017-03-15 19:17:19 -0700149 * Returns: Zero on success
150 */
Jeykumar Sankaran446a5f12017-05-09 20:30:39 -0700151 int (*get_mode_info)(const struct drm_display_mode *drm_mode,
152 struct msm_mode_info *mode_info,
Alan Kwongb1bca602017-09-18 17:28:45 -0400153 u32 max_mixer_width, void *display);
Jeykumar Sankaran6b345ac2017-03-15 19:17:19 -0700154
155 /**
Clarence Ipa18d4832017-03-13 12:35:44 -0700156 * enable_event - notify display of event registration/unregistration
157 * @connector: Pointer to drm connector structure
158 * @event_idx: SDE connector event index
159 * @enable: Whether the event is being enabled/disabled
160 * @display: Pointer to private display structure
161 */
162 void (*enable_event)(struct drm_connector *connector,
163 uint32_t event_idx, bool enable, void *display);
164
Vishnuvardhan Prodduturi75b96802016-10-17 18:45:55 +0530165 int (*set_backlight)(void *display, u32 bl_lvl);
Lloyd Atkinson8c49c582016-11-18 14:23:54 -0500166
167 /**
168 * soft_reset - perform a soft reset on the connector
169 * @display: Pointer to private display structure
170 * Return: Zero on success, -ERROR otherwise
171 */
172 int (*soft_reset)(void *display);
Lloyd Atkinson05d75512017-01-17 14:45:51 -0500173
174 /**
175 * pre_kickoff - trigger display to program kickoff-time features
176 * @connector: Pointer to drm connector structure
177 * @display: Pointer to private display structure
178 * @params: Parameter bundle of connector-stored information for
179 * kickoff-time programming into the display
180 * Returns: Zero on success
181 */
182 int (*pre_kickoff)(struct drm_connector *connector,
183 void *display,
184 struct msm_display_kickoff_params *params);
Veera Sundaram Sankaranbb2bf9a2017-03-29 18:56:47 -0700185
186 /**
187 * clk_ctrl - perform clk enable/disable on the connector
188 * @handle: Pointer to clk handle
189 * @type: Type of clks
190 * @enable: State of clks
191 */
192 int (*clk_ctrl)(void *handle, u32 type, u32 state);
Clarence Ip90b282d2017-05-04 10:00:32 -0700193
194 /**
195 * set_power - update dpms setting
196 * @connector: Pointer to drm connector structure
197 * @power_mode: One of the following,
198 * SDE_MODE_DPMS_ON
199 * SDE_MODE_DPMS_LP1
200 * SDE_MODE_DPMS_LP2
201 * SDE_MODE_DPMS_OFF
202 * @display: Pointer to private display structure
203 * Returns: Zero on success
204 */
205 int (*set_power)(struct drm_connector *connector,
206 int power_mode, void *display);
Ping Li8430ee12017-02-24 14:14:44 -0800207
208 /**
209 * get_dst_format - get dst_format from display
210 * @display: Pointer to private display handle
211 * Returns: dst_format of display
212 */
213 enum dsi_pixel_format (*get_dst_format)(void *display);
Raviteja Tamatam68892de2017-06-20 04:47:19 +0530214
215 /**
216 * post_kickoff - display to program post kickoff-time features
217 * @connector: Pointer to drm connector structure
218 * Returns: Zero on success
219 */
220 int (*post_kickoff)(struct drm_connector *connector);
221
Padmanabhan Komanduru71aec2d2017-08-30 20:07:59 +0530222 /**
Ajay Singh Parmar315e5852017-11-23 21:47:32 -0800223 * post_open - calls connector to process post open functionalities
Padmanabhan Komanduru71aec2d2017-08-30 20:07:59 +0530224 * @display: Pointer to private display structure
225 */
Ajay Singh Parmar315e5852017-11-23 21:47:32 -0800226 void (*post_open)(void *display);
Sandeep Panda98d6ab22017-09-05 08:03:16 +0530227
228 /**
229 * check_status - check status of connected display panel
230 * @display: Pointer to private display handle
231 * Returns: positive value for success, negetive or zero for failure
232 */
233 int (*check_status)(void *display);
Clarence Ipdd8021c2016-07-20 16:39:47 -0400234};
235
236/**
Clarence Ipa18d4832017-03-13 12:35:44 -0700237 * enum sde_connector_events - list of recognized connector events
238 */
239enum sde_connector_events {
240 SDE_CONN_EVENT_VID_DONE, /* video mode frame done */
241 SDE_CONN_EVENT_CMD_DONE, /* command mode frame done */
Sandeep Panda11b20d82017-06-19 12:57:27 +0530242 SDE_CONN_EVENT_VID_FIFO_OVERFLOW, /* dsi fifo overflow error */
243 SDE_CONN_EVENT_CMD_FIFO_UNDERFLOW, /* dsi fifo underflow error */
Clarence Ipa18d4832017-03-13 12:35:44 -0700244 SDE_CONN_EVENT_COUNT,
245};
246
247/**
248 * struct sde_connector_evt - local event registration entry structure
249 * @cb_func: Pointer to desired callback function
250 * @usr: User pointer to pass to callback on event trigger
Sandeep Panda11b20d82017-06-19 12:57:27 +0530251 * Returns: Zero success, negetive for failure
Clarence Ipa18d4832017-03-13 12:35:44 -0700252 */
253struct sde_connector_evt {
Sandeep Panda11b20d82017-06-19 12:57:27 +0530254 int (*cb_func)(uint32_t event_idx,
Clarence Ipa18d4832017-03-13 12:35:44 -0700255 uint32_t instance_idx, void *usr,
256 uint32_t data0, uint32_t data1,
257 uint32_t data2, uint32_t data3);
258 void *usr;
259};
260
261/**
Clarence Ipdd8021c2016-07-20 16:39:47 -0400262 * struct sde_connector - local sde connector structure
263 * @base: Base drm connector structure
264 * @connector_type: Set to one of DRM_MODE_CONNECTOR_ types
265 * @encoder: Pointer to preferred drm encoder
266 * @panel: Pointer to drm panel, if present
267 * @display: Pointer to private display data structure
Alan Kwongdfa8c082016-07-29 04:10:00 -0400268 * @mmu_secure: MMU id for secure buffers
269 * @mmu_unsecure: MMU id for unsecure buffers
Clarence Ipdd8021c2016-07-20 16:39:47 -0400270 * @name: ASCII name of connector
Clarence Ip90b282d2017-05-04 10:00:32 -0700271 * @lock: Mutex lock object for this structure
Dhaval Patel39323d42017-03-01 23:48:24 -0800272 * @retire_fence: Retire fence context reference
Clarence Ipdd8021c2016-07-20 16:39:47 -0400273 * @ops: Local callback function pointer table
Clarence Ip90b282d2017-05-04 10:00:32 -0700274 * @dpms_mode: DPMS property setting from user space
275 * @lp_mode: LP property setting from user space
276 * @last_panel_power_mode: Last consolidated dpms/lp mode setting
Clarence Ipdd8021c2016-07-20 16:39:47 -0400277 * @property_info: Private structure for generic property handling
278 * @property_data: Array of private data for generic property handling
Dhaval Patel4e574842016-08-23 15:11:37 -0700279 * @blob_caps: Pointer to blob structure for 'capabilities' property
Ping Li898b1bf2017-02-09 18:03:28 -0800280 * @blob_hdr: Pointer to blob structure for 'hdr_properties' property
Ajay Singh Parmare927aa42017-11-01 00:33:20 -0700281 * @blob_ext_hdr: Pointer to blob structure for 'ext_hdr_properties' property
Ping Li8430ee12017-02-24 14:14:44 -0800282 * @blob_dither: Pointer to blob structure for default dither config
Jeykumar Sankaran83ddcb02017-10-27 11:34:50 -0700283 * @blob_mode_info: Pointer to blob structure for mode info
Alan Kwong578cdaf2017-01-28 17:25:43 -0800284 * @fb_kmap: true if kernel mapping of framebuffer is requested
Clarence Ipa18d4832017-03-13 12:35:44 -0700285 * @event_table: Array of registered events
286 * @event_lock: Lock object for event_table
Dhaval Patel959fdab2017-08-25 15:15:39 -0700287 * @bl_device: backlight device node
Sandeep Panda98d6ab22017-09-05 08:03:16 +0530288 * @status_work: work object to perform status checks
Sandeep Pandaf2274d12017-09-08 19:52:33 +0530289 * @force_panel_dead: variable to trigger forced ESD recovery
Clarence Ipdd8021c2016-07-20 16:39:47 -0400290 */
291struct sde_connector {
292 struct drm_connector base;
293
294 int connector_type;
295
296 struct drm_encoder *encoder;
297 struct drm_panel *panel;
298 void *display;
299
Jordan Croused8e96522017-02-13 10:14:16 -0700300 struct msm_gem_address_space *aspace[SDE_IOMMU_DOMAIN_MAX];
Clarence Ipdd8021c2016-07-20 16:39:47 -0400301
302 char name[SDE_CONNECTOR_NAME_SIZE];
303
Clarence Ip90b282d2017-05-04 10:00:32 -0700304 struct mutex lock;
Dhaval Patel39323d42017-03-01 23:48:24 -0800305 struct sde_fence_context retire_fence;
Clarence Ipdd8021c2016-07-20 16:39:47 -0400306 struct sde_connector_ops ops;
Clarence Ip90b282d2017-05-04 10:00:32 -0700307 int dpms_mode;
308 int lp_mode;
309 int last_panel_power_mode;
Clarence Ipdd8021c2016-07-20 16:39:47 -0400310
311 struct msm_property_info property_info;
312 struct msm_property_data property_data[CONNECTOR_PROP_COUNT];
Dhaval Patel4e574842016-08-23 15:11:37 -0700313 struct drm_property_blob *blob_caps;
Ping Li898b1bf2017-02-09 18:03:28 -0800314 struct drm_property_blob *blob_hdr;
Srikanth Rajagopalan30384d12017-06-08 15:23:31 -0700315 struct drm_property_blob *blob_ext_hdr;
Ping Li8430ee12017-02-24 14:14:44 -0800316 struct drm_property_blob *blob_dither;
Jeykumar Sankaran83ddcb02017-10-27 11:34:50 -0700317 struct drm_property_blob *blob_mode_info;
Alan Kwong578cdaf2017-01-28 17:25:43 -0800318
319 bool fb_kmap;
Clarence Ipa18d4832017-03-13 12:35:44 -0700320 struct sde_connector_evt event_table[SDE_CONN_EVENT_COUNT];
321 spinlock_t event_lock;
Dhaval Patel959fdab2017-08-25 15:15:39 -0700322
323 struct backlight_device *bl_device;
Sandeep Panda98d6ab22017-09-05 08:03:16 +0530324 struct delayed_work status_work;
Sandeep Pandaf2274d12017-09-08 19:52:33 +0530325 u32 force_panel_dead;
Clarence Ipdd8021c2016-07-20 16:39:47 -0400326};
327
328/**
329 * to_sde_connector - convert drm_connector pointer to sde connector pointer
330 * @X: Pointer to drm_connector structure
331 * Returns: Pointer to sde_connector structure
332 */
333#define to_sde_connector(x) container_of((x), struct sde_connector, base)
334
335/**
336 * sde_connector_get_display - get sde connector's private display pointer
337 * @C: Pointer to drm connector structure
338 * Returns: Pointer to associated private display structure
339 */
340#define sde_connector_get_display(C) \
Jeykumar Sankaran586d0922017-09-18 15:01:33 -0700341 ((C) ? to_sde_connector((C))->display : NULL)
Clarence Ipdd8021c2016-07-20 16:39:47 -0400342
343/**
344 * sde_connector_get_panel - get sde connector's private panel pointer
345 * @C: Pointer to drm connector structure
346 * Returns: Pointer to associated private display structure
347 */
348#define sde_connector_get_panel(C) \
Ajay Singh Parmar0d6250b2017-04-02 14:08:51 -0700349 ((C) ? to_sde_connector((C))->panel : NULL)
Clarence Ipdd8021c2016-07-20 16:39:47 -0400350
351/**
352 * sde_connector_get_encoder - get sde connector's private encoder pointer
353 * @C: Pointer to drm connector structure
354 * Returns: Pointer to associated private encoder structure
355 */
356#define sde_connector_get_encoder(C) \
Jeykumar Sankaran586d0922017-09-18 15:01:33 -0700357 ((C) ? to_sde_connector((C))->encoder : NULL)
Clarence Ipdd8021c2016-07-20 16:39:47 -0400358
359/**
360 * sde_connector_get_propinfo - get sde connector's property info pointer
361 * @C: Pointer to drm connector structure
362 * Returns: Pointer to associated private property info structure
363 */
364#define sde_connector_get_propinfo(C) \
Jeykumar Sankaran586d0922017-09-18 15:01:33 -0700365 ((C) ? &to_sde_connector((C))->property_info : NULL)
Clarence Ipdd8021c2016-07-20 16:39:47 -0400366
367/**
368 * struct sde_connector_state - private connector status structure
369 * @base: Base drm connector structure
370 * @out_fb: Pointer to output frame buffer, if applicable
Clarence Ip4a2955d2017-07-04 18:04:33 -0400371 * @property_state: Local storage for msm_prop properties
Clarence Ipdd8021c2016-07-20 16:39:47 -0400372 * @property_values: Local cache of current connector property values
Lloyd Atkinson05d75512017-01-17 14:45:51 -0500373 * @rois: Regions of interest structure for mapping CRTC to Connector output
Ping Li8430ee12017-02-24 14:14:44 -0800374 * @property_blobs: blob properties
Jeykumar Sankaran905ba332017-10-19 10:45:02 -0700375 * @mode_info: local copy of msm_mode_info struct
Ajay Singh Parmare927aa42017-11-01 00:33:20 -0700376 * @hdr_meta: HDR metadata info passed from userspace
Lloyd Atkinson4ced69e2017-11-03 12:16:09 -0400377 * @old_topology_name: topology of previous atomic state. remove this in later
378 * kernel versions which provide drm_atomic_state old_state pointers
Clarence Ipdd8021c2016-07-20 16:39:47 -0400379 */
380struct sde_connector_state {
381 struct drm_connector_state base;
382 struct drm_framebuffer *out_fb;
Clarence Ip4a2955d2017-07-04 18:04:33 -0400383 struct msm_property_state property_state;
384 struct msm_property_value property_values[CONNECTOR_PROP_COUNT];
Lloyd Atkinson05d75512017-01-17 14:45:51 -0500385
Lloyd Atkinson8ba47032017-03-22 17:13:32 -0400386 struct msm_roi_list rois;
Ping Li8430ee12017-02-24 14:14:44 -0800387 struct drm_property_blob *property_blobs[CONNECTOR_PROP_BLOBCOUNT];
Jeykumar Sankaran905ba332017-10-19 10:45:02 -0700388 struct msm_mode_info mode_info;
Ajay Singh Parmare927aa42017-11-01 00:33:20 -0700389 struct drm_msm_ext_hdr_metadata hdr_meta;
Lloyd Atkinson4ced69e2017-11-03 12:16:09 -0400390 enum sde_rm_topology_name old_topology_name;
Clarence Ipdd8021c2016-07-20 16:39:47 -0400391};
392
393/**
394 * to_sde_connector_state - convert drm_connector_state pointer to
395 * sde connector state pointer
396 * @X: Pointer to drm_connector_state structure
397 * Returns: Pointer to sde_connector_state structure
398 */
399#define to_sde_connector_state(x) \
400 container_of((x), struct sde_connector_state, base)
401
402/**
403 * sde_connector_get_property - query integer value of connector property
404 * @S: Pointer to drm connector state
405 * @X: Property index, from enum msm_mdp_connector_property
406 * Returns: Integer value of requested property
407 */
408#define sde_connector_get_property(S, X) \
409 ((S) && ((X) < CONNECTOR_PROP_COUNT) ? \
Clarence Ip4a2955d2017-07-04 18:04:33 -0400410 (to_sde_connector_state((S))->property_values[(X)].value) : 0)
Clarence Ipdd8021c2016-07-20 16:39:47 -0400411
412/**
Clarence Ip4a2955d2017-07-04 18:04:33 -0400413 * sde_connector_get_property_state - retrieve property state cache
Lloyd Atkinson13cee812016-08-16 16:10:31 -0400414 * @S: Pointer to drm connector state
Clarence Ip4a2955d2017-07-04 18:04:33 -0400415 * Returns: Pointer to local property state structure
Lloyd Atkinson13cee812016-08-16 16:10:31 -0400416 */
Clarence Ip4a2955d2017-07-04 18:04:33 -0400417#define sde_connector_get_property_state(S) \
418 ((S) ? (&to_sde_connector_state((S))->property_state) : NULL)
Lloyd Atkinson13cee812016-08-16 16:10:31 -0400419
420/**
Clarence Ipdd8021c2016-07-20 16:39:47 -0400421 * sde_connector_get_out_fb - query out_fb value from sde connector state
422 * @S: Pointer to drm connector state
423 * Returns: Output fb associated with specified connector state
424 */
425#define sde_connector_get_out_fb(S) \
426 ((S) ? to_sde_connector_state((S))->out_fb : 0)
427
428/**
Lloyd Atkinson55987b02016-08-16 16:57:46 -0400429 * sde_connector_get_topology_name - helper accessor to retrieve topology_name
430 * @connector: pointer to drm connector
431 * Returns: value of the CONNECTOR_PROP_TOPOLOGY_NAME property or 0
432 */
433static inline uint64_t sde_connector_get_topology_name(
434 struct drm_connector *connector)
435{
436 if (!connector || !connector->state)
437 return 0;
438 return sde_connector_get_property(connector->state,
439 CONNECTOR_PROP_TOPOLOGY_NAME);
440}
441
442/**
Lloyd Atkinson4ced69e2017-11-03 12:16:09 -0400443 * sde_connector_get_old_topology_name - helper accessor to retrieve
444 * topology_name for the previous mode
445 * @connector: pointer to drm connector state
446 * Returns: cached value of the previous topology, or SDE_RM_TOPOLOGY_NONE
447 */
448static inline enum sde_rm_topology_name sde_connector_get_old_topology_name(
449 struct drm_connector_state *state)
450{
451 struct sde_connector_state *c_state = to_sde_connector_state(state);
452
453 if (!state)
454 return SDE_RM_TOPOLOGY_NONE;
455
456 return c_state->old_topology_name;
457}
458
459/**
460 * sde_connector_set_old_topology_name - helper to cache value of previous
461 * mode's topology
462 * @connector: pointer to drm connector state
463 * Returns: 0 on success, negative errno on failure
464 */
465static inline int sde_connector_set_old_topology_name(
466 struct drm_connector_state *state,
467 enum sde_rm_topology_name top)
468{
469 struct sde_connector_state *c_state = to_sde_connector_state(state);
470
471 if (!state)
472 return -EINVAL;
473
474 c_state->old_topology_name = top;
475
476 return 0;
477}
478
479/**
Clarence Ip89628132017-07-27 13:33:51 -0400480 * sde_connector_get_lp - helper accessor to retrieve LP state
481 * @connector: pointer to drm connector
482 * Returns: value of the CONNECTOR_PROP_LP property or 0
483 */
484static inline uint64_t sde_connector_get_lp(
485 struct drm_connector *connector)
486{
487 if (!connector || !connector->state)
488 return 0;
489 return sde_connector_get_property(connector->state,
490 CONNECTOR_PROP_LP);
491}
492
493/**
Clarence Ipd86f6e42017-08-08 18:31:00 -0400494 * sde_connector_set_property_for_commit - add property set to atomic state
495 * Add a connector state property update for the specified property index
496 * to the atomic state in preparation for a drm_atomic_commit.
497 * @connector: Pointer to drm connector
498 * @atomic_state: Pointer to DRM atomic state structure for commit
499 * @property_idx: Connector property index
500 * @value: Updated property value
501 * Returns: Zero on success
502 */
503int sde_connector_set_property_for_commit(struct drm_connector *connector,
504 struct drm_atomic_state *atomic_state,
505 uint32_t property_idx, uint64_t value);
506
507/**
Clarence Ipdd8021c2016-07-20 16:39:47 -0400508 * sde_connector_init - create drm connector object for a given display
509 * @dev: Pointer to drm device struct
510 * @encoder: Pointer to associated encoder
511 * @panel: Pointer to associated panel, can be NULL
512 * @display: Pointer to associated display object
513 * @ops: Pointer to callback operations function table
514 * @connector_poll: Set to appropriate DRM_CONNECTOR_POLL_ setting
515 * @connector_type: Set to appropriate DRM_MODE_CONNECTOR_ type
516 * Returns: Pointer to newly created drm connector struct
517 */
518struct drm_connector *sde_connector_init(struct drm_device *dev,
519 struct drm_encoder *encoder,
520 struct drm_panel *panel,
521 void *display,
522 const struct sde_connector_ops *ops,
523 int connector_poll,
524 int connector_type);
525
Clarence Ipe59fb3f2016-07-26 13:39:59 -0400526/**
527 * sde_connector_prepare_fence - prepare fence support for current commit
528 * @connector: Pointer to drm connector object
529 */
530void sde_connector_prepare_fence(struct drm_connector *connector);
531
532/**
533 * sde_connector_complete_commit - signal completion of current commit
534 * @connector: Pointer to drm connector object
Veera Sundaram Sankaran675ff622017-06-21 21:44:46 -0700535 * @ts: timestamp to be updated in the fence signalling
Clarence Ipe59fb3f2016-07-26 13:39:59 -0400536 */
Veera Sundaram Sankaran675ff622017-06-21 21:44:46 -0700537void sde_connector_complete_commit(struct drm_connector *connector, ktime_t ts);
Clarence Ipe59fb3f2016-07-26 13:39:59 -0400538
Clarence Ipcb3afd42016-07-15 16:25:34 -0400539/**
Dhaval Patelfd8f7742017-08-10 13:11:22 -0700540 * sde_connector_commit_reset - reset the completion signal
541 * @connector: Pointer to drm connector object
542 * @ts: timestamp to be updated in the fence signalling
543 */
544void sde_connector_commit_reset(struct drm_connector *connector, ktime_t ts);
545
546/**
Clarence Ipcb3afd42016-07-15 16:25:34 -0400547 * sde_connector_get_info - query display specific information
548 * @connector: Pointer to drm connector object
549 * @info: Pointer to msm display information structure
550 * Returns: Zero on success
551 */
552int sde_connector_get_info(struct drm_connector *connector,
553 struct msm_display_info *info);
554
Clarence Ipa18d4832017-03-13 12:35:44 -0700555/**
Veera Sundaram Sankaranbb2bf9a2017-03-29 18:56:47 -0700556 * sde_connector_clk_ctrl - enables/disables the connector clks
557 * @connector: Pointer to drm connector object
558 * @enable: true/false to enable/disable
Alan Kwong1124f1f2017-11-10 18:14:39 -0500559 * Returns: Zero on success
Veera Sundaram Sankaranbb2bf9a2017-03-29 18:56:47 -0700560 */
Alan Kwong1124f1f2017-11-10 18:14:39 -0500561int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable);
Veera Sundaram Sankaranbb2bf9a2017-03-29 18:56:47 -0700562
563/**
Clarence Ip90b282d2017-05-04 10:00:32 -0700564 * sde_connector_get_dpms - query dpms setting
565 * @connector: Pointer to drm connector structure
566 * Returns: Current DPMS setting for connector
567 */
568int sde_connector_get_dpms(struct drm_connector *connector);
569
570/**
Clarence Ipa18d4832017-03-13 12:35:44 -0700571 * sde_connector_trigger_event - indicate that an event has occurred
572 * Any callbacks that have been registered against this event will
573 * be called from the same thread context.
574 * @connector: Pointer to drm connector structure
575 * @event_idx: Index of event to trigger
576 * @instance_idx: Event-specific "instance index" to pass to callback
577 * @data0: Event-specific "data" to pass to callback
578 * @data1: Event-specific "data" to pass to callback
579 * @data2: Event-specific "data" to pass to callback
580 * @data3: Event-specific "data" to pass to callback
581 * Returns: Zero on success
582 */
583int sde_connector_trigger_event(void *drm_connector,
584 uint32_t event_idx, uint32_t instance_idx,
585 uint32_t data0, uint32_t data1,
586 uint32_t data2, uint32_t data3);
587
588/**
589 * sde_connector_register_event - register a callback function for an event
590 * @connector: Pointer to drm connector structure
591 * @event_idx: Index of event to register
592 * @cb_func: Pointer to desired callback function
593 * @usr: User pointer to pass to callback on event trigger
594 * Returns: Zero on success
595 */
596int sde_connector_register_event(struct drm_connector *connector,
597 uint32_t event_idx,
Sandeep Panda11b20d82017-06-19 12:57:27 +0530598 int (*cb_func)(uint32_t event_idx,
Clarence Ipa18d4832017-03-13 12:35:44 -0700599 uint32_t instance_idx, void *usr,
600 uint32_t data0, uint32_t data1,
601 uint32_t data2, uint32_t data3),
602 void *usr);
603
604/**
605 * sde_connector_unregister_event - unregister all callbacks for an event
606 * @connector: Pointer to drm connector structure
607 * @event_idx: Index of event to register
608 */
609void sde_connector_unregister_event(struct drm_connector *connector,
610 uint32_t event_idx);
611
Gopikrishnaiah Anandande2c81b2017-03-15 12:41:29 -0700612/**
613 * sde_connector_register_custom_event - register for async events
614 * @kms: Pointer to sde_kms
615 * @conn_drm: Pointer to drm connector object
616 * @event: Event for which request is being sent
617 * @en: Flag to enable/disable the event
618 * Returns: Zero on success
619 */
620int sde_connector_register_custom_event(struct sde_kms *kms,
621 struct drm_connector *conn_drm, u32 event, bool en);
622
Lloyd Atkinson05d75512017-01-17 14:45:51 -0500623/**
624 * sde_connector_pre_kickoff - trigger kickoff time feature programming
625 * @connector: Pointer to drm connector object
626 * Returns: Zero on success
627 */
628int sde_connector_pre_kickoff(struct drm_connector *connector);
629
Dhaval Patel5cb59be2017-04-20 20:00:56 -0700630/**
631 * sde_connector_needs_offset - adjust the output fence offset based on
632 * display type
633 * @connector: Pointer to drm connector object
634 * Returns: true if offset is required, false for all other cases.
635 */
636static inline bool sde_connector_needs_offset(struct drm_connector *connector)
637{
638 struct sde_connector *c_conn;
639
640 if (!connector)
641 return false;
642
643 c_conn = to_sde_connector(connector);
644 return (c_conn->connector_type != DRM_MODE_CONNECTOR_VIRTUAL);
645}
646
Ping Li8430ee12017-02-24 14:14:44 -0800647/**
648 * sde_connector_get_dither_cfg - get dither property data
649 * @conn: Pointer to drm_connector struct
650 * @state: Pointer to drm_connector_state struct
651 * @cfg: Pointer to pointer to dither cfg
652 * @len: length of the dither data
653 * Returns: Zero on success
654 */
655int sde_connector_get_dither_cfg(struct drm_connector *conn,
656 struct drm_connector_state *state, void **cfg, size_t *len);
Clarence Ipdd8021c2016-07-20 16:39:47 -0400657
Sandeep Panda98d6ab22017-09-05 08:03:16 +0530658/**
Jeykumar Sankaran83ddcb02017-10-27 11:34:50 -0700659 * sde_connector_set_blob_data - set connector blob property data
Jeykumar Sankaran736d79d2017-10-05 17:44:24 -0700660 * @conn: Pointer to drm_connector struct
Jeykumar Sankaran905ba332017-10-19 10:45:02 -0700661 * @state: Pointer to the drm_connector_state struct
Jeykumar Sankaran83ddcb02017-10-27 11:34:50 -0700662 * @prop_id: property id to be populated
Jeykumar Sankaran736d79d2017-10-05 17:44:24 -0700663 * Returns: Zero on success
664 */
Jeykumar Sankaran83ddcb02017-10-27 11:34:50 -0700665int sde_connector_set_blob_data(struct drm_connector *conn,
666 struct drm_connector_state *state,
667 enum msm_mdp_conn_property prop_id);
Jeykumar Sankaran736d79d2017-10-05 17:44:24 -0700668
669/**
670 * sde_connector_roi_v1_check_roi - validate connector ROI
671 * @conn_state: Pointer to drm_connector_state struct
672 * Returns: Zero on success
673 */
674int sde_connector_roi_v1_check_roi(struct drm_connector_state *conn_state);
675
676/**
Sandeep Panda98d6ab22017-09-05 08:03:16 +0530677 * sde_connector_schedule_status_work - manage ESD thread
678 * conn: Pointer to drm_connector struct
679 * @en: flag to start/stop ESD thread
680 */
681void sde_connector_schedule_status_work(struct drm_connector *conn, bool en);
682
Lloyd Atkinsone08229c2017-10-02 17:53:30 -0400683/**
684 * sde_connector_helper_reset_properties - reset properties to default values in
685 * the given DRM connector state object
686 * @connector: Pointer to DRM connector object
687 * @connector_state: Pointer to DRM connector state object
688 * Returns: 0 on success, negative errno on failure
689 */
690int sde_connector_helper_reset_custom_properties(
691 struct drm_connector *connector,
692 struct drm_connector_state *connector_state);
693
Jeykumar Sankaran905ba332017-10-19 10:45:02 -0700694/**
695 * sde_connector_get_mode_info - get information of the current mode in the
696 * given connector state.
697 * conn_state: Pointer to the DRM connector state object
698 * mode_info: Pointer to the mode info structure
699 */
700int sde_connector_get_mode_info(struct drm_connector_state *conn_state,
701 struct msm_mode_info *mode_info);
702
Dhaval Patel2a3c37a2017-10-25 12:30:36 -0700703/**
704 * sde_conn_timeline_status - current buffer timeline status
705 * conn: Pointer to drm_connector struct
706 */
707void sde_conn_timeline_status(struct drm_connector *conn);
Clarence Ip458a5d02017-11-27 18:15:16 -0500708
709/**
710 * sde_connector_helper_bridge_disable - helper function for drm bridge disable
711 * @connector: Pointer to DRM connector object
712 */
713void sde_connector_helper_bridge_disable(struct drm_connector *connector);
714
Ping Li8430ee12017-02-24 14:14:44 -0800715#endif /* _SDE_CONNECTOR_H_ */