blob: dba34391c687c1a7276acb8a3b9c5f0b5a92b965 [file] [log] [blame]
Narendra Muppalla37098532019-04-02 14:23:55 -07001/* SPDX-License-Identifier: GPL-2.0-only */
2/*
Narendra Muppalla2dca0352020-02-13 23:14:18 +08003 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
Narendra Muppalla37098532019-04-02 14:23:55 -07004 */
5
6#ifndef _SDE_CONNECTOR_H_
7#define _SDE_CONNECTOR_H_
8
9#include <uapi/drm/msm_drm_pp.h>
10#include <drm/drmP.h>
11#include <drm/drm_atomic.h>
12#include <drm/drm_panel.h>
13
14#include "msm_drv.h"
15#include "msm_prop.h"
16#include "sde_kms.h"
17#include "sde_fence.h"
18
19#define SDE_CONNECTOR_NAME_SIZE 16
20#define SDE_CONNECTOR_DHDR_MEMPOOL_MAX_SIZE SZ_32
21
22struct sde_connector;
23struct sde_connector_state;
24
25/**
26 * struct sde_connector_ops - callback functions for generic sde connector
27 * Individual callbacks documented below.
28 */
29struct sde_connector_ops {
30 /**
31 * post_init - perform additional initialization steps
32 * @connector: Pointer to drm connector structure
33 * @display: Pointer to private display handle
34 * Returns: Zero on success
35 */
36 int (*post_init)(struct drm_connector *connector,
37 void *display);
38
39 /**
40 * set_info_blob - initialize given info blob
41 * @connector: Pointer to drm connector structure
42 * @info: Pointer to sde connector info structure
43 * @display: Pointer to private display handle
44 * @mode_info: Pointer to mode info structure
45 * Returns: Zero on success
46 */
47 int (*set_info_blob)(struct drm_connector *connector,
48 void *info,
49 void *display,
50 struct msm_mode_info *mode_info);
51
52 /**
53 * detect - determine if connector is connected
54 * @connector: Pointer to drm connector structure
55 * @force: Force detect setting from drm framework
56 * @display: Pointer to private display handle
57 * Returns: Connector 'is connected' status
58 */
59 enum drm_connector_status (*detect)(struct drm_connector *connector,
60 bool force,
61 void *display);
62
63 /**
64 * get_modes - add drm modes via drm_mode_probed_add()
65 * @connector: Pointer to drm connector structure
66 * @display: Pointer to private display handle
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -040067 * @avail_res: Pointer with current available resources
Narendra Muppalla37098532019-04-02 14:23:55 -070068 * Returns: Number of modes added
69 */
70 int (*get_modes)(struct drm_connector *connector,
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -040071 void *display,
72 const struct msm_resource_caps_info *avail_res);
Narendra Muppalla37098532019-04-02 14:23:55 -070073
74 /**
75 * update_pps - update pps command for the display panel
76 * @connector: Pointer to drm connector structure
77 * @pps_cmd: Pointer to pps command
78 * @display: Pointer to private display handle
79 * Returns: Zero on success
80 */
81 int (*update_pps)(struct drm_connector *connector,
82 char *pps_cmd, void *display);
83
84 /**
85 * mode_valid - determine if specified mode is valid
86 * @connector: Pointer to drm connector structure
87 * @mode: Pointer to drm mode structure
88 * @display: Pointer to private display handle
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -040089 * @avail_res: Pointer with curr available resources
Narendra Muppalla37098532019-04-02 14:23:55 -070090 * Returns: Validity status for specified mode
91 */
92 enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
93 struct drm_display_mode *mode,
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -040094 void *display,
95 const struct msm_resource_caps_info *avail_res);
Narendra Muppalla37098532019-04-02 14:23:55 -070096
97 /**
98 * set_property - set property value
99 * @connector: Pointer to drm connector structure
100 * @state: Pointer to drm connector state structure
101 * @property_index: DRM property index
102 * @value: Incoming property value
103 * @display: Pointer to private display structure
104 * Returns: Zero on success
105 */
106 int (*set_property)(struct drm_connector *connector,
107 struct drm_connector_state *state,
108 int property_index,
109 uint64_t value,
110 void *display);
111
112 /**
113 * get_property - get property value
114 * @connector: Pointer to drm connector structure
115 * @state: Pointer to drm connector state structure
116 * @property_index: DRM property index
117 * @value: Pointer to variable for accepting property value
118 * @display: Pointer to private display structure
119 * Returns: Zero on success
120 */
121 int (*get_property)(struct drm_connector *connector,
122 struct drm_connector_state *state,
123 int property_index,
124 uint64_t *value,
125 void *display);
126
127 /**
128 * get_info - get display information
129 * @connector: Pointer to drm connector structure
130 * @info: Pointer to msm display info structure
131 * @display: Pointer to private display structure
132 * Returns: Zero on success
133 */
134 int (*get_info)(struct drm_connector *connector,
135 struct msm_display_info *info, void *display);
136
137 /**
138 * get_mode_info - retrieve mode information
139 * @connector: Pointer to drm connector structure
140 * @drm_mode: Display mode set for the display
141 * @mode_info: Out parameter. information of the display mode
Narendra Muppalla37098532019-04-02 14:23:55 -0700142 * @display: Pointer to private display structure
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -0400143 * @avail_res: Pointer with curr available resources
Narendra Muppalla37098532019-04-02 14:23:55 -0700144 * Returns: Zero on success
145 */
146 int (*get_mode_info)(struct drm_connector *connector,
147 const struct drm_display_mode *drm_mode,
148 struct msm_mode_info *mode_info,
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -0400149 void *display,
150 const struct msm_resource_caps_info *avail_res);
Narendra Muppalla37098532019-04-02 14:23:55 -0700151
152 /**
153 * enable_event - notify display of event registration/unregistration
154 * @connector: Pointer to drm connector structure
155 * @event_idx: SDE connector event index
156 * @enable: Whether the event is being enabled/disabled
157 * @display: Pointer to private display structure
158 */
159 void (*enable_event)(struct drm_connector *connector,
160 uint32_t event_idx, bool enable, void *display);
161
162 /**
Abhinav Kumar14e02e42019-06-07 19:13:41 -0700163 * set_colorspace - set colorspace for connector
164 * @connector: Pointer to drm connector structure
165 * @display: Pointer to private display structure
166 */
167 int (*set_colorspace)(struct drm_connector *connector,
168 void *display);
169
170 /**
Narendra Muppalla37098532019-04-02 14:23:55 -0700171 * soft_reset - perform a soft reset on the connector
172 * @display: Pointer to private display structure
173 * Return: Zero on success, -ERROR otherwise
174 */
175 int (*soft_reset)(void *display);
176
177 /**
178 * pre_kickoff - trigger display to program kickoff-time features
179 * @connector: Pointer to drm connector structure
180 * @display: Pointer to private display structure
181 * @params: Parameter bundle of connector-stored information for
182 * kickoff-time programming into the display
183 * Returns: Zero on success
184 */
185 int (*pre_kickoff)(struct drm_connector *connector,
186 void *display,
187 struct msm_display_kickoff_params *params);
188
189 /**
190 * clk_ctrl - perform clk enable/disable on the connector
191 * @handle: Pointer to clk handle
192 * @type: Type of clks
193 * @enable: State of clks
194 */
195 int (*clk_ctrl)(void *handle, u32 type, u32 state);
196
197 /**
198 * set_power - update dpms setting
199 * @connector: Pointer to drm connector structure
200 * @power_mode: One of the following,
201 * SDE_MODE_DPMS_ON
202 * SDE_MODE_DPMS_LP1
203 * SDE_MODE_DPMS_LP2
204 * SDE_MODE_DPMS_OFF
205 * @display: Pointer to private display structure
206 * Returns: Zero on success
207 */
208 int (*set_power)(struct drm_connector *connector,
209 int power_mode, void *display);
210
211 /**
212 * get_dst_format - get dst_format from display
213 * @connector: Pointer to drm connector structure
214 * @display: Pointer to private display handle
215 * Returns: dst_format of display
216 */
217 enum dsi_pixel_format (*get_dst_format)(struct drm_connector *connector,
218 void *display);
219
220 /**
221 * post_kickoff - display to program post kickoff-time features
222 * @connector: Pointer to drm connector structure
Jayaprakash985ffdd2019-09-26 11:55:26 +0530223 * @params: Parameter bundle of connector-stored information for
224 * post kickoff programming into the display
Narendra Muppalla37098532019-04-02 14:23:55 -0700225 * Returns: Zero on success
226 */
Jayaprakash985ffdd2019-09-26 11:55:26 +0530227 int (*post_kickoff)(struct drm_connector *connector,
Jayaprakashaad3dd42019-09-26 12:17:07 +0530228 struct msm_display_conn_params *params);
Narendra Muppalla37098532019-04-02 14:23:55 -0700229
230 /**
231 * post_open - calls connector to process post open functionalities
232 * @display: Pointer to private display structure
233 */
234 void (*post_open)(struct drm_connector *connector, void *display);
235
236 /**
237 * check_status - check status of connected display panel
238 * @connector: Pointer to drm connector structure
239 * @display: Pointer to private display handle
240 * @te_check_override: Whether check TE from panel or default check
241 * Returns: positive value for success, negetive or zero for failure
242 */
243 int (*check_status)(struct drm_connector *connector, void *display,
244 bool te_check_override);
245
246 /**
247 * cmd_transfer - Transfer command to the connected display panel
248 * @connector: Pointer to drm connector structure
249 * @display: Pointer to private display handle
250 * @cmd_buf: Command buffer
251 * @cmd_buf_len: Command buffer length in bytes
252 * Returns: Zero for success, negetive for failure
253 */
254 int (*cmd_transfer)(struct drm_connector *connector,
255 void *display, const char *cmd_buf,
256 u32 cmd_buf_len);
257
258 /**
259 * config_hdr - configure HDR
260 * @connector: Pointer to drm connector structure
261 * @display: Pointer to private display handle
262 * @c_state: Pointer to connector state
263 * Returns: Zero on success, negative error code for failures
264 */
265 int (*config_hdr)(struct drm_connector *connector, void *display,
266 struct sde_connector_state *c_state);
267
268 /**
269 * atomic_best_encoder - atomic best encoder selection for connector
270 * @connector: Pointer to drm connector structure
271 * @display: Pointer to private display handle
272 * @c_state: Pointer to connector state
273 * Returns: valid drm_encoder for success
274 */
275 struct drm_encoder *(*atomic_best_encoder)(
276 struct drm_connector *connector,
277 void *display,
278 struct drm_connector_state *c_state);
279
280 /**
281 * atomic_check - atomic check handling for connector
282 * @connector: Pointer to drm connector structure
283 * @display: Pointer to private display handle
284 * @c_state: Pointer to connector state
285 * Returns: valid drm_encoder for success
286 */
287 int (*atomic_check)(struct drm_connector *connector,
288 void *display,
289 struct drm_connector_state *c_state);
290
291 /**
292 * pre_destroy - handle pre destroy operations for the connector
293 * @connector: Pointer to drm connector structure
294 * @display: Pointer to private display handle
295 * Returns: Zero on success, negative error code for failures
296 */
297 void (*pre_destroy)(struct drm_connector *connector, void *display);
298
299 /**
300 * cont_splash_config - initialize splash resources
301 * @display: Pointer to private display handle
302 * Returns: zero for success, negetive for failure
303 */
304 int (*cont_splash_config)(void *display);
305
306 /**
307 * get_panel_vfp - returns original panel vfp
308 * @display: Pointer to private display handle
309 * @h_active: width
310 * @v_active: height
311 * Returns: v_front_porch on success error-code on failure
312 */
313 int (*get_panel_vfp)(void *display, int h_active, int v_active);
314
315 /**
316 * get_default_lm - returns default number of lm
317 * @display: Pointer to private display handle
318 * @num_lm: Pointer to number of lms to be populated
319 * Returns: zero for success, negetive for failure
320 */
321 int (*get_default_lms)(void *display, u32 *num_lm);
Jayaprakashaad3dd42019-09-26 12:17:07 +0530322
323 /**
324 * prepare_commit - trigger display to program pre-commit time features
325 * @display: Pointer to private display structure
326 * @params: Parameter bundle of connector-stored information for
327 * pre commit time programming into the display
328 * Returns: Zero on success
329 */
330 int (*prepare_commit)(void *display,
331 struct msm_display_conn_params *params);
Ken Huangb62d60a2019-12-20 11:15:57 +0800332
333 /**
334 * set_idle_hint - gives hint to display whether display is idle
335 * @display: Pointer to private display handle
336 * @is_idle: true if display is idle, false otherwise
337 */
338 void (*set_idle_hint)(void *display, bool is_idle);
JohnnLeee471ed42021-03-29 13:43:53 +0800339
340 /**
Krishna Manikandan72944c52020-11-18 13:14:24 +0530341 * get_qsync_min_fps - Get qsync min fps from qsync-min-fps-list
342 * @display: Pointer to private display structure
343 * @mode_fps: Fps value in dfps list
344 * Returns: Qsync min fps value on success
345 */
346 int (*get_qsync_min_fps)(void *display, u32 mode_fps);
Narendra Muppalla37098532019-04-02 14:23:55 -0700347};
348
349/**
Nilaan Gunabalachandran52855c72019-05-02 12:06:25 -0400350 * enum sde_connector_display_type - list of display types
351 */
352enum sde_connector_display {
353 SDE_CONNECTOR_UNDEFINED,
354 SDE_CONNECTOR_PRIMARY,
355 SDE_CONNECTOR_SECONDARY,
356 SDE_CONNECTOR_MAX
357};
358
359/**
Narendra Muppalla37098532019-04-02 14:23:55 -0700360 * enum sde_connector_events - list of recognized connector events
361 */
362enum sde_connector_events {
363 SDE_CONN_EVENT_VID_DONE, /* video mode frame done */
364 SDE_CONN_EVENT_CMD_DONE, /* command mode frame done */
365 SDE_CONN_EVENT_VID_FIFO_OVERFLOW, /* dsi fifo overflow error */
366 SDE_CONN_EVENT_CMD_FIFO_UNDERFLOW, /* dsi fifo underflow error */
367 SDE_CONN_EVENT_COUNT,
368};
369
370/**
371 * struct sde_connector_evt - local event registration entry structure
372 * @cb_func: Pointer to desired callback function
373 * @usr: User pointer to pass to callback on event trigger
374 * Returns: Zero success, negetive for failure
375 */
376struct sde_connector_evt {
377 int (*cb_func)(uint32_t event_idx,
378 uint32_t instance_idx, void *usr,
379 uint32_t data0, uint32_t data1,
380 uint32_t data2, uint32_t data3);
381 void *usr;
382};
383
384struct sde_connector_dyn_hdr_metadata {
385 u8 dynamic_hdr_payload[SDE_CONNECTOR_DHDR_MEMPOOL_MAX_SIZE];
386 int dynamic_hdr_payload_size;
387 bool dynamic_hdr_update;
388};
389
390/**
391 * struct sde_connector - local sde connector structure
392 * @base: Base drm connector structure
393 * @connector_type: Set to one of DRM_MODE_CONNECTOR_ types
394 * @encoder: Pointer to preferred drm encoder
395 * @panel: Pointer to drm panel, if present
396 * @display: Pointer to private display data structure
397 * @drv_panel: Pointer to interface driver's panel module, if present
398 * @mst_port: Pointer to mst port, if present
399 * @mmu_secure: MMU id for secure buffers
400 * @mmu_unsecure: MMU id for unsecure buffers
401 * @name: ASCII name of connector
402 * @lock: Mutex lock object for this structure
403 * @retire_fence: Retire fence context reference
404 * @ops: Local callback function pointer table
405 * @dpms_mode: DPMS property setting from user space
406 * @lp_mode: LP property setting from user space
407 * @last_panel_power_mode: Last consolidated dpms/lp mode setting
408 * @property_info: Private structure for generic property handling
409 * @property_data: Array of private data for generic property handling
410 * @blob_caps: Pointer to blob structure for 'capabilities' property
411 * @blob_hdr: Pointer to blob structure for 'hdr_properties' property
412 * @blob_ext_hdr: Pointer to blob structure for 'ext_hdr_properties' property
413 * @blob_dither: Pointer to blob structure for default dither config
414 * @blob_mode_info: Pointer to blob structure for mode info
415 * @fb_kmap: true if kernel mapping of framebuffer is requested
416 * @event_table: Array of registered events
417 * @event_lock: Lock object for event_table
418 * @bl_device: backlight device node
419 * @status_work: work object to perform status checks
420 * @esd_status_interval: variable to change ESD check interval in millisec
421 * @panel_dead: Flag to indicate if panel has gone bad
422 * @esd_status_check: Flag to indicate if ESD thread is scheduled or not
423 * @bl_scale_dirty: Flag to indicate PP BL scale value(s) is changed
424 * @bl_scale: BL scale value for ABA feature
425 * @bl_scale_sv: BL scale value for sunlight visibility feature
426 * @unset_bl_level: BL level that needs to be set later
427 * @allow_bl_update: Flag to indicate if BL update is allowed currently or not
428 * @qsync_mode: Cached Qsync mode, 0=disabled, 1=continuous mode
429 * @qsync_updated: Qsync settings were updated
Abhinav Kumar14e02e42019-06-07 19:13:41 -0700430 * @colorspace_updated: Colorspace property was updated
Narendra Muppalla37098532019-04-02 14:23:55 -0700431 * last_cmd_tx_sts: status of the last command transfer
432 * @hdr_capable: external hdr support present
433 * @core_clk_rate: MDP core clk rate used for dynamic HDR packet calculation
434 */
435struct sde_connector {
436 struct drm_connector base;
437
438 int connector_type;
439
440 struct drm_encoder *encoder;
Narendra Muppalla37098532019-04-02 14:23:55 -0700441 void *display;
442 void *drv_panel;
443 void *mst_port;
444
445 struct msm_gem_address_space *aspace[SDE_IOMMU_DOMAIN_MAX];
446
447 char name[SDE_CONNECTOR_NAME_SIZE];
448
449 struct mutex lock;
450 struct sde_fence_context *retire_fence;
451 struct sde_connector_ops ops;
452 int dpms_mode;
453 int lp_mode;
454 int last_panel_power_mode;
455
456 struct msm_property_info property_info;
457 struct msm_property_data property_data[CONNECTOR_PROP_COUNT];
458 struct drm_property_blob *blob_caps;
459 struct drm_property_blob *blob_hdr;
460 struct drm_property_blob *blob_ext_hdr;
461 struct drm_property_blob *blob_dither;
462 struct drm_property_blob *blob_mode_info;
463
464 bool fb_kmap;
465 struct sde_connector_evt event_table[SDE_CONN_EVENT_COUNT];
466 spinlock_t event_lock;
467
468 struct backlight_device *bl_device;
469 struct delayed_work status_work;
470 u32 esd_status_interval;
471 bool panel_dead;
472 bool esd_status_check;
473
474 bool bl_scale_dirty;
475 u32 bl_scale;
476 u32 bl_scale_sv;
Narendra Muppalla37098532019-04-02 14:23:55 -0700477
478 u32 qsync_mode;
479 bool qsync_updated;
480
Abhinav Kumar14e02e42019-06-07 19:13:41 -0700481 bool colorspace_updated;
482
Narendra Muppalla37098532019-04-02 14:23:55 -0700483 bool last_cmd_tx_sts;
484 bool hdr_capable;
485};
486
487/**
488 * to_sde_connector - convert drm_connector pointer to sde connector pointer
489 * @X: Pointer to drm_connector structure
490 * Returns: Pointer to sde_connector structure
491 */
492#define to_sde_connector(x) container_of((x), struct sde_connector, base)
493
494/**
495 * sde_connector_get_display - get sde connector's private display pointer
496 * @C: Pointer to drm connector structure
497 * Returns: Pointer to associated private display structure
498 */
499#define sde_connector_get_display(C) \
500 ((C) ? to_sde_connector((C))->display : NULL)
501
502/**
Narendra Muppalla37098532019-04-02 14:23:55 -0700503 * sde_connector_get_encoder - get sde connector's private encoder pointer
504 * @C: Pointer to drm connector structure
505 * Returns: Pointer to associated private encoder structure
506 */
507#define sde_connector_get_encoder(C) \
508 ((C) ? to_sde_connector((C))->encoder : NULL)
509
510/**
511 * sde_connector_qsync_updated - indicates if connector updated qsync
512 * @C: Pointer to drm connector structure
513 * Returns: True if qsync is updated; false otherwise
514 */
515#define sde_connector_is_qsync_updated(C) \
516 ((C) ? to_sde_connector((C))->qsync_updated : 0)
517
518/**
519 * sde_connector_get_qsync_mode - get sde connector's qsync_mode
520 * @C: Pointer to drm connector structure
521 * Returns: Current cached qsync_mode for given connector
522 */
523#define sde_connector_get_qsync_mode(C) \
524 ((C) ? to_sde_connector((C))->qsync_mode : 0)
525
526/**
527 * sde_connector_get_propinfo - get sde connector's property info pointer
528 * @C: Pointer to drm connector structure
529 * Returns: Pointer to associated private property info structure
530 */
531#define sde_connector_get_propinfo(C) \
532 ((C) ? &to_sde_connector((C))->property_info : NULL)
533
534/**
535 * struct sde_connector_state - private connector status structure
536 * @base: Base drm connector structure
537 * @out_fb: Pointer to output frame buffer, if applicable
538 * @property_state: Local storage for msm_prop properties
539 * @property_values: Local cache of current connector property values
540 * @rois: Regions of interest structure for mapping CRTC to Connector output
541 * @property_blobs: blob properties
542 * @mode_info: local copy of msm_mode_info struct
543 * @hdr_meta: HDR metadata info passed from userspace
544 * @dyn_hdr_meta: Dynamic HDR metadata payload and state tracking
545 * @old_topology_name: topology of previous atomic state. remove this in later
546 * kernel versions which provide drm_atomic_state old_state pointers
547 */
548struct sde_connector_state {
549 struct drm_connector_state base;
550 struct drm_framebuffer *out_fb;
551 struct msm_property_state property_state;
552 struct msm_property_value property_values[CONNECTOR_PROP_COUNT];
553
554 struct msm_roi_list rois;
555 struct drm_property_blob *property_blobs[CONNECTOR_PROP_BLOBCOUNT];
556 struct msm_mode_info mode_info;
557 struct drm_msm_ext_hdr_metadata hdr_meta;
558 struct sde_connector_dyn_hdr_metadata dyn_hdr_meta;
559 enum sde_rm_topology_name old_topology_name;
560};
561
562/**
563 * to_sde_connector_state - convert drm_connector_state pointer to
564 * sde connector state pointer
565 * @X: Pointer to drm_connector_state structure
566 * Returns: Pointer to sde_connector_state structure
567 */
568#define to_sde_connector_state(x) \
569 container_of((x), struct sde_connector_state, base)
570
571/**
572 * sde_connector_get_property - query integer value of connector property
573 * @S: Pointer to drm connector state
574 * @X: Property index, from enum msm_mdp_connector_property
575 * Returns: Integer value of requested property
576 */
577#define sde_connector_get_property(S, X) \
578 ((S) && ((X) < CONNECTOR_PROP_COUNT) ? \
579 (to_sde_connector_state((S))->property_values[(X)].value) : 0)
580
581/**
582 * sde_connector_get_property_state - retrieve property state cache
583 * @S: Pointer to drm connector state
584 * Returns: Pointer to local property state structure
585 */
586#define sde_connector_get_property_state(S) \
587 ((S) ? (&to_sde_connector_state((S))->property_state) : NULL)
588
589/**
590 * sde_connector_get_out_fb - query out_fb value from sde connector state
591 * @S: Pointer to drm connector state
592 * Returns: Output fb associated with specified connector state
593 */
594#define sde_connector_get_out_fb(S) \
595 ((S) ? to_sde_connector_state((S))->out_fb : 0)
596
597/**
598 * sde_connector_get_topology_name - helper accessor to retrieve topology_name
599 * @connector: pointer to drm connector
600 * Returns: value of the CONNECTOR_PROP_TOPOLOGY_NAME property or 0
601 */
602static inline uint64_t sde_connector_get_topology_name(
603 struct drm_connector *connector)
604{
605 if (!connector || !connector->state)
606 return 0;
607 return sde_connector_get_property(connector->state,
608 CONNECTOR_PROP_TOPOLOGY_NAME);
609}
610
611/**
612 * sde_connector_get_old_topology_name - helper accessor to retrieve
613 * topology_name for the previous mode
614 * @connector: pointer to drm connector state
615 * Returns: cached value of the previous topology, or SDE_RM_TOPOLOGY_NONE
616 */
617static inline enum sde_rm_topology_name sde_connector_get_old_topology_name(
618 struct drm_connector_state *state)
619{
620 struct sde_connector_state *c_state = to_sde_connector_state(state);
621
622 if (!state)
623 return SDE_RM_TOPOLOGY_NONE;
624
625 return c_state->old_topology_name;
626}
627
628/**
629 * sde_connector_set_old_topology_name - helper to cache value of previous
630 * mode's topology
631 * @connector: pointer to drm connector state
632 * Returns: 0 on success, negative errno on failure
633 */
634static inline int sde_connector_set_old_topology_name(
635 struct drm_connector_state *state,
636 enum sde_rm_topology_name top)
637{
638 struct sde_connector_state *c_state = to_sde_connector_state(state);
639
640 if (!state)
641 return -EINVAL;
642
643 c_state->old_topology_name = top;
644
645 return 0;
646}
647
648/**
649 * sde_connector_get_lp - helper accessor to retrieve LP state
650 * @connector: pointer to drm connector
651 * Returns: value of the CONNECTOR_PROP_LP property or 0
652 */
653static inline uint64_t sde_connector_get_lp(
654 struct drm_connector *connector)
655{
656 if (!connector || !connector->state)
657 return 0;
658 return sde_connector_get_property(connector->state,
659 CONNECTOR_PROP_LP);
660}
661
662/**
663 * sde_connector_set_property_for_commit - add property set to atomic state
664 * Add a connector state property update for the specified property index
665 * to the atomic state in preparation for a drm_atomic_commit.
666 * @connector: Pointer to drm connector
667 * @atomic_state: Pointer to DRM atomic state structure for commit
668 * @property_idx: Connector property index
669 * @value: Updated property value
670 * Returns: Zero on success
671 */
672int sde_connector_set_property_for_commit(struct drm_connector *connector,
673 struct drm_atomic_state *atomic_state,
674 uint32_t property_idx, uint64_t value);
675
676/**
677 * sde_connector_init - create drm connector object for a given display
678 * @dev: Pointer to drm device struct
679 * @encoder: Pointer to associated encoder
680 * @panel: Pointer to associated panel, can be NULL
681 * @display: Pointer to associated display object
682 * @ops: Pointer to callback operations function table
683 * @connector_poll: Set to appropriate DRM_CONNECTOR_POLL_ setting
684 * @connector_type: Set to appropriate DRM_MODE_CONNECTOR_ type
685 * Returns: Pointer to newly created drm connector struct
686 */
687struct drm_connector *sde_connector_init(struct drm_device *dev,
688 struct drm_encoder *encoder,
689 struct drm_panel *panel,
690 void *display,
691 const struct sde_connector_ops *ops,
692 int connector_poll,
693 int connector_type);
694
695/**
696 * sde_connector_prepare_fence - prepare fence support for current commit
697 * @connector: Pointer to drm connector object
698 */
699void sde_connector_prepare_fence(struct drm_connector *connector);
700
701/**
702 * sde_connector_complete_commit - signal completion of current commit
703 * @connector: Pointer to drm connector object
704 * @ts: timestamp to be updated in the fence signalling
705 * @fence_event: enum value to indicate nature of fence event
706 */
707void sde_connector_complete_commit(struct drm_connector *connector,
708 ktime_t ts, enum sde_fence_event fence_event);
709
710/**
711 * sde_connector_commit_reset - reset the completion signal
712 * @connector: Pointer to drm connector object
713 * @ts: timestamp to be updated in the fence signalling
714 */
715void sde_connector_commit_reset(struct drm_connector *connector, ktime_t ts);
716
717/**
718 * sde_connector_get_info - query display specific information
719 * @connector: Pointer to drm connector object
720 * @info: Pointer to msm display information structure
721 * Returns: Zero on success
722 */
723int sde_connector_get_info(struct drm_connector *connector,
724 struct msm_display_info *info);
725
726/**
727 * sde_connector_clk_ctrl - enables/disables the connector clks
728 * @connector: Pointer to drm connector object
729 * @enable: true/false to enable/disable
730 * Returns: Zero on success
731 */
732int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable);
733
734/**
735 * sde_connector_get_dpms - query dpms setting
736 * @connector: Pointer to drm connector structure
737 * Returns: Current DPMS setting for connector
738 */
739int sde_connector_get_dpms(struct drm_connector *connector);
740
741/**
742 * sde_connector_set_qsync_params - set status of qsync_updated for current
743 * frame and update the cached qsync_mode
744 * @connector: pointer to drm connector
745 *
746 * This must be called after the connector set_property values are applied,
747 * and before sde_connector's qsync_updated or qsync_mode fields are accessed.
748 * It must only be called once per frame update for the given connector.
749 */
750void sde_connector_set_qsync_params(struct drm_connector *connector);
751
752/**
Jayaprakash985ffdd2019-09-26 11:55:26 +0530753 * sde_connector_complete_qsync_commit - callback signalling completion
754 * of qsync, if modified for the current commit
755 * @conn - Pointer to drm connector object
756 * @params - Parameter bundle of connector-stored information for
757 * post kickoff programming into the display
758 */
759void sde_connector_complete_qsync_commit(struct drm_connector *conn,
Jayaprakashaad3dd42019-09-26 12:17:07 +0530760 struct msm_display_conn_params *params);
Jayaprakash985ffdd2019-09-26 11:55:26 +0530761
762/**
Narendra Muppalla37098532019-04-02 14:23:55 -0700763* sde_connector_get_dyn_hdr_meta - returns pointer to connector state's dynamic
764* HDR metadata info
765* @connector: pointer to drm connector
766*/
767
768struct sde_connector_dyn_hdr_metadata *sde_connector_get_dyn_hdr_meta(
769 struct drm_connector *connector);
770
771/**
772 * sde_connector_trigger_event - indicate that an event has occurred
773 * Any callbacks that have been registered against this event will
774 * be called from the same thread context.
775 * @connector: Pointer to drm connector structure
776 * @event_idx: Index of event to trigger
777 * @instance_idx: Event-specific "instance index" to pass to callback
778 * @data0: Event-specific "data" to pass to callback
779 * @data1: Event-specific "data" to pass to callback
780 * @data2: Event-specific "data" to pass to callback
781 * @data3: Event-specific "data" to pass to callback
782 * Returns: Zero on success
783 */
784int sde_connector_trigger_event(void *drm_connector,
785 uint32_t event_idx, uint32_t instance_idx,
786 uint32_t data0, uint32_t data1,
787 uint32_t data2, uint32_t data3);
788
789/**
790 * sde_connector_register_event - register a callback function for an event
791 * @connector: Pointer to drm connector structure
792 * @event_idx: Index of event to register
793 * @cb_func: Pointer to desired callback function
794 * @usr: User pointer to pass to callback on event trigger
795 * Returns: Zero on success
796 */
797int sde_connector_register_event(struct drm_connector *connector,
798 uint32_t event_idx,
799 int (*cb_func)(uint32_t event_idx,
800 uint32_t instance_idx, void *usr,
801 uint32_t data0, uint32_t data1,
802 uint32_t data2, uint32_t data3),
803 void *usr);
804
805/**
806 * sde_connector_unregister_event - unregister all callbacks for an event
807 * @connector: Pointer to drm connector structure
808 * @event_idx: Index of event to register
809 */
810void sde_connector_unregister_event(struct drm_connector *connector,
811 uint32_t event_idx);
812
813/**
814 * sde_connector_register_custom_event - register for async events
815 * @kms: Pointer to sde_kms
816 * @conn_drm: Pointer to drm connector object
817 * @event: Event for which request is being sent
818 * @en: Flag to enable/disable the event
819 * Returns: Zero on success
820 */
821int sde_connector_register_custom_event(struct sde_kms *kms,
822 struct drm_connector *conn_drm, u32 event, bool en);
823
824/**
825 * sde_connector_pre_kickoff - trigger kickoff time feature programming
826 * @connector: Pointer to drm connector object
827 * Returns: Zero on success
828 */
829int sde_connector_pre_kickoff(struct drm_connector *connector);
830
831/**
Jayaprakashaad3dd42019-09-26 12:17:07 +0530832 * sde_connector_prepare_commit - trigger commit time feature programming
833 * @connector: Pointer to drm connector object
834 * Returns: Zero on success
835 */
836int sde_connector_prepare_commit(struct drm_connector *connector);
837
838/**
Narendra Muppalla37098532019-04-02 14:23:55 -0700839 * sde_connector_needs_offset - adjust the output fence offset based on
840 * display type
841 * @connector: Pointer to drm connector object
842 * Returns: true if offset is required, false for all other cases.
843 */
844static inline bool sde_connector_needs_offset(struct drm_connector *connector)
845{
846 struct sde_connector *c_conn;
847
848 if (!connector)
849 return false;
850
851 c_conn = to_sde_connector(connector);
852 return (c_conn->connector_type != DRM_MODE_CONNECTOR_VIRTUAL);
853}
854
855/**
856 * sde_connector_get_dither_cfg - get dither property data
857 * @conn: Pointer to drm_connector struct
858 * @state: Pointer to drm_connector_state struct
859 * @cfg: Pointer to pointer to dither cfg
860 * @len: length of the dither data
Narendra Muppalla2dca0352020-02-13 23:14:18 +0800861 * @idle_pc: flag to indicate idle_pc_restore happened
Narendra Muppalla37098532019-04-02 14:23:55 -0700862 * Returns: Zero on success
863 */
864int sde_connector_get_dither_cfg(struct drm_connector *conn,
Narendra Muppalla2dca0352020-02-13 23:14:18 +0800865 struct drm_connector_state *state, void **cfg,
866 size_t *len, bool idle_pc);
Narendra Muppalla37098532019-04-02 14:23:55 -0700867
868/**
869 * sde_connector_set_blob_data - set connector blob property data
870 * @conn: Pointer to drm_connector struct
871 * @state: Pointer to the drm_connector_state struct
872 * @prop_id: property id to be populated
873 * Returns: Zero on success
874 */
875int sde_connector_set_blob_data(struct drm_connector *conn,
876 struct drm_connector_state *state,
877 enum msm_mdp_conn_property prop_id);
878
879/**
880 * sde_connector_roi_v1_check_roi - validate connector ROI
881 * @conn_state: Pointer to drm_connector_state struct
882 * Returns: Zero on success
883 */
884int sde_connector_roi_v1_check_roi(struct drm_connector_state *conn_state);
885
886/**
887 * sde_connector_schedule_status_work - manage ESD thread
888 * conn: Pointer to drm_connector struct
889 * @en: flag to start/stop ESD thread
890 */
891void sde_connector_schedule_status_work(struct drm_connector *conn, bool en);
892
893/**
894 * sde_connector_helper_reset_properties - reset properties to default values in
895 * the given DRM connector state object
896 * @connector: Pointer to DRM connector object
897 * @connector_state: Pointer to DRM connector state object
898 * Returns: 0 on success, negative errno on failure
899 */
900int sde_connector_helper_reset_custom_properties(
901 struct drm_connector *connector,
902 struct drm_connector_state *connector_state);
903
904/**
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -0400905 * sde_connector_state_get_mode_info - get information of the current mode
906 * in the given connector state.
Narendra Muppalla37098532019-04-02 14:23:55 -0700907 * conn_state: Pointer to the DRM connector state object
908 * mode_info: Pointer to the mode info structure
909 */
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -0400910int sde_connector_state_get_mode_info(struct drm_connector_state *conn_state,
Narendra Muppalla37098532019-04-02 14:23:55 -0700911 struct msm_mode_info *mode_info);
912
913/**
Nilaan Gunabalachandrand92000c2019-05-22 15:13:44 -0400914* sde_connector_get_mode_info - retrieve mode info for given mode
915* @connector: Pointer to drm connector structure
916* @drm_mode: Display mode set for the display
917* @mode_info: Out parameter. information of the display mode
918* Returns: Zero on success
919*/
920int sde_connector_get_mode_info(struct drm_connector *conn,
921 const struct drm_display_mode *drm_mode,
922 struct msm_mode_info *mode_info);
923
924/**
Narendra Muppalla37098532019-04-02 14:23:55 -0700925 * sde_conn_timeline_status - current buffer timeline status
926 * conn: Pointer to drm_connector struct
927 */
928void sde_conn_timeline_status(struct drm_connector *conn);
929
930/**
931 * sde_connector_helper_bridge_disable - helper function for drm bridge disable
932 * @connector: Pointer to DRM connector object
933 */
934void sde_connector_helper_bridge_disable(struct drm_connector *connector);
935
936/**
937 * sde_connector_destroy - destroy drm connector object
938 * @connector: Pointer to DRM connector object
939 */
940void sde_connector_destroy(struct drm_connector *connector);
941
942/**
943 * sde_connector_event_notify - signal hw recovery event to client
944 * @connector: pointer to connector
945 * @type: event type
946 * @len: length of the value of the event
947 * @val: value
948 */
949int sde_connector_event_notify(struct drm_connector *connector, uint32_t type,
950 uint32_t len, uint32_t val);
951/**
Weizhung Ding8cf11b92018-12-21 17:10:52 +0800952 * sde_connector_helper_bridge_pre_enable - helper function for drm bridge
953 * pre enable
Narendra Muppalla37098532019-04-02 14:23:55 -0700954 * @connector: Pointer to DRM connector object
955 */
Weizhung Ding8cf11b92018-12-21 17:10:52 +0800956void sde_connector_helper_bridge_pre_enable(struct drm_connector *connector);
957
958/**
959 * sde_connector_helper_bridge_post_enable - helper function for drm bridge
960 * post enable
961 * @connector: Pointer to DRM connector object
962 */
963void sde_connector_helper_bridge_post_enable(struct drm_connector *connector);
Narendra Muppalla37098532019-04-02 14:23:55 -0700964
965/**
966 * sde_connector_get_panel_vfp - helper to get panel vfp
967 * @connector: pointer to drm connector
968 * @h_active: panel width
969 * @v_active: panel heigth
970 * Returns: v_front_porch on success error-code on failure
971 */
972int sde_connector_get_panel_vfp(struct drm_connector *connector,
973 struct drm_display_mode *mode);
Ken Huangb62d60a2019-12-20 11:15:57 +0800974
975/**
976 * sde_connector_set_idle_hint - helper to give idle hint to connector
977 * @connector: pointer to drm connector
978 * @is_idle: true on idle, false on wake up from idle
979 */
980void sde_connector_set_idle_hint(struct drm_connector *connector, bool is_idle);
981
Narendra Muppalla37098532019-04-02 14:23:55 -0700982/**
983 * sde_connector_esd_status - helper function to check te status
984 * @connector: Pointer to DRM connector object
985 */
986int sde_connector_esd_status(struct drm_connector *connector);
987
988#endif /* _SDE_CONNECTOR_H_ */