LCOV - code coverage report
Current view: top level - include/drm - drm_modeset_helper_vtables.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 8 0.0 %
Date: 2022-03-28 13:20:08 Functions: 0 0 -
Branches: 0 2 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright © 2006 Keith Packard
       3                 :            :  * Copyright © 2007-2008 Dave Airlie
       4                 :            :  * Copyright © 2007-2008 Intel Corporation
       5                 :            :  *   Jesse Barnes <jesse.barnes@intel.com>
       6                 :            :  * Copyright © 2011-2013 Intel Corporation
       7                 :            :  * Copyright © 2015 Intel Corporation
       8                 :            :  *   Daniel Vetter <daniel.vetter@ffwll.ch>
       9                 :            :  *
      10                 :            :  * Permission is hereby granted, free of charge, to any person obtaining a
      11                 :            :  * copy of this software and associated documentation files (the "Software"),
      12                 :            :  * to deal in the Software without restriction, including without limitation
      13                 :            :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      14                 :            :  * and/or sell copies of the Software, and to permit persons to whom the
      15                 :            :  * Software is furnished to do so, subject to the following conditions:
      16                 :            :  *
      17                 :            :  * The above copyright notice and this permission notice shall be included in
      18                 :            :  * all copies or substantial portions of the Software.
      19                 :            :  *
      20                 :            :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      21                 :            :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      22                 :            :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      23                 :            :  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
      24                 :            :  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
      25                 :            :  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
      26                 :            :  * OTHER DEALINGS IN THE SOFTWARE.
      27                 :            :  */
      28                 :            : 
      29                 :            : #ifndef __DRM_MODESET_HELPER_VTABLES_H__
      30                 :            : #define __DRM_MODESET_HELPER_VTABLES_H__
      31                 :            : 
      32                 :            : #include <drm/drm_crtc.h>
      33                 :            : #include <drm/drm_encoder.h>
      34                 :            : 
      35                 :            : /**
      36                 :            :  * DOC: overview
      37                 :            :  *
      38                 :            :  * The DRM mode setting helper functions are common code for drivers to use if
      39                 :            :  * they wish.  Drivers are not forced to use this code in their
      40                 :            :  * implementations but it would be useful if the code they do use at least
      41                 :            :  * provides a consistent interface and operation to userspace. Therefore it is
      42                 :            :  * highly recommended to use the provided helpers as much as possible.
      43                 :            :  *
      44                 :            :  * Because there is only one pointer per modeset object to hold a vfunc table
      45                 :            :  * for helper libraries they are by necessity shared among the different
      46                 :            :  * helpers.
      47                 :            :  *
      48                 :            :  * To make this clear all the helper vtables are pulled together in this location here.
      49                 :            :  */
      50                 :            : 
      51                 :            : enum mode_set_atomic;
      52                 :            : struct drm_writeback_connector;
      53                 :            : struct drm_writeback_job;
      54                 :            : 
      55                 :            : /**
      56                 :            :  * struct drm_crtc_helper_funcs - helper operations for CRTCs
      57                 :            :  *
      58                 :            :  * These hooks are used by the legacy CRTC helpers, the transitional plane
      59                 :            :  * helpers and the new atomic modesetting helpers.
      60                 :            :  */
      61                 :            : struct drm_crtc_helper_funcs {
      62                 :            :         /**
      63                 :            :          * @dpms:
      64                 :            :          *
      65                 :            :          * Callback to control power levels on the CRTC.  If the mode passed in
      66                 :            :          * is unsupported, the provider must use the next lowest power level.
      67                 :            :          * This is used by the legacy CRTC helpers to implement DPMS
      68                 :            :          * functionality in drm_helper_connector_dpms().
      69                 :            :          *
      70                 :            :          * This callback is also used to disable a CRTC by calling it with
      71                 :            :          * DRM_MODE_DPMS_OFF if the @disable hook isn't used.
      72                 :            :          *
      73                 :            :          * This callback is used by the legacy CRTC helpers.  Atomic helpers
      74                 :            :          * also support using this hook for enabling and disabling a CRTC to
      75                 :            :          * facilitate transitions to atomic, but it is deprecated. Instead
      76                 :            :          * @atomic_enable and @atomic_disable should be used.
      77                 :            :          */
      78                 :            :         void (*dpms)(struct drm_crtc *crtc, int mode);
      79                 :            : 
      80                 :            :         /**
      81                 :            :          * @prepare:
      82                 :            :          *
      83                 :            :          * This callback should prepare the CRTC for a subsequent modeset, which
      84                 :            :          * in practice means the driver should disable the CRTC if it is
      85                 :            :          * running. Most drivers ended up implementing this by calling their
      86                 :            :          * @dpms hook with DRM_MODE_DPMS_OFF.
      87                 :            :          *
      88                 :            :          * This callback is used by the legacy CRTC helpers.  Atomic helpers
      89                 :            :          * also support using this hook for disabling a CRTC to facilitate
      90                 :            :          * transitions to atomic, but it is deprecated. Instead @atomic_disable
      91                 :            :          * should be used.
      92                 :            :          */
      93                 :            :         void (*prepare)(struct drm_crtc *crtc);
      94                 :            : 
      95                 :            :         /**
      96                 :            :          * @commit:
      97                 :            :          *
      98                 :            :          * This callback should commit the new mode on the CRTC after a modeset,
      99                 :            :          * which in practice means the driver should enable the CRTC.  Most
     100                 :            :          * drivers ended up implementing this by calling their @dpms hook with
     101                 :            :          * DRM_MODE_DPMS_ON.
     102                 :            :          *
     103                 :            :          * This callback is used by the legacy CRTC helpers.  Atomic helpers
     104                 :            :          * also support using this hook for enabling a CRTC to facilitate
     105                 :            :          * transitions to atomic, but it is deprecated. Instead @atomic_enable
     106                 :            :          * should be used.
     107                 :            :          */
     108                 :            :         void (*commit)(struct drm_crtc *crtc);
     109                 :            : 
     110                 :            :         /**
     111                 :            :          * @mode_valid:
     112                 :            :          *
     113                 :            :          * This callback is used to check if a specific mode is valid in this
     114                 :            :          * crtc. This should be implemented if the crtc has some sort of
     115                 :            :          * restriction in the modes it can display. For example, a given crtc
     116                 :            :          * may be responsible to set a clock value. If the clock can not
     117                 :            :          * produce all the values for the available modes then this callback
     118                 :            :          * can be used to restrict the number of modes to only the ones that
     119                 :            :          * can be displayed.
     120                 :            :          *
     121                 :            :          * This hook is used by the probe helpers to filter the mode list in
     122                 :            :          * drm_helper_probe_single_connector_modes(), and it is used by the
     123                 :            :          * atomic helpers to validate modes supplied by userspace in
     124                 :            :          * drm_atomic_helper_check_modeset().
     125                 :            :          *
     126                 :            :          * This function is optional.
     127                 :            :          *
     128                 :            :          * NOTE:
     129                 :            :          *
     130                 :            :          * Since this function is both called from the check phase of an atomic
     131                 :            :          * commit, and the mode validation in the probe paths it is not allowed
     132                 :            :          * to look at anything else but the passed-in mode, and validate it
     133                 :            :          * against configuration-invariant hardward constraints. Any further
     134                 :            :          * limits which depend upon the configuration can only be checked in
     135                 :            :          * @mode_fixup or @atomic_check.
     136                 :            :          *
     137                 :            :          * RETURNS:
     138                 :            :          *
     139                 :            :          * drm_mode_status Enum
     140                 :            :          */
     141                 :            :         enum drm_mode_status (*mode_valid)(struct drm_crtc *crtc,
     142                 :            :                                            const struct drm_display_mode *mode);
     143                 :            : 
     144                 :            :         /**
     145                 :            :          * @mode_fixup:
     146                 :            :          *
     147                 :            :          * This callback is used to validate a mode. The parameter mode is the
     148                 :            :          * display mode that userspace requested, adjusted_mode is the mode the
     149                 :            :          * encoders need to be fed with. Note that this is the inverse semantics
     150                 :            :          * of the meaning for the &drm_encoder and &drm_bridge_funcs.mode_fixup
     151                 :            :          * vfunc. If the CRTC cannot support the requested conversion from mode
     152                 :            :          * to adjusted_mode it should reject the modeset. See also
     153                 :            :          * &drm_crtc_state.adjusted_mode for more details.
     154                 :            :          *
     155                 :            :          * This function is used by both legacy CRTC helpers and atomic helpers.
     156                 :            :          * With atomic helpers it is optional.
     157                 :            :          *
     158                 :            :          * NOTE:
     159                 :            :          *
     160                 :            :          * This function is called in the check phase of atomic modesets, which
     161                 :            :          * can be aborted for any reason (including on userspace's request to
     162                 :            :          * just check whether a configuration would be possible). Atomic drivers
     163                 :            :          * MUST NOT touch any persistent state (hardware or software) or data
     164                 :            :          * structures except the passed in adjusted_mode parameter.
     165                 :            :          *
     166                 :            :          * This is in contrast to the legacy CRTC helpers where this was
     167                 :            :          * allowed.
     168                 :            :          *
     169                 :            :          * Atomic drivers which need to inspect and adjust more state should
     170                 :            :          * instead use the @atomic_check callback, but note that they're not
     171                 :            :          * perfectly equivalent: @mode_valid is called from
     172                 :            :          * drm_atomic_helper_check_modeset(), but @atomic_check is called from
     173                 :            :          * drm_atomic_helper_check_planes(), because originally it was meant for
     174                 :            :          * plane update checks only.
     175                 :            :          *
     176                 :            :          * Also beware that userspace can request its own custom modes, neither
     177                 :            :          * core nor helpers filter modes to the list of probe modes reported by
     178                 :            :          * the GETCONNECTOR IOCTL and stored in &drm_connector.modes. To ensure
     179                 :            :          * that modes are filtered consistently put any CRTC constraints and
     180                 :            :          * limits checks into @mode_valid.
     181                 :            :          *
     182                 :            :          * RETURNS:
     183                 :            :          *
     184                 :            :          * True if an acceptable configuration is possible, false if the modeset
     185                 :            :          * operation should be rejected.
     186                 :            :          */
     187                 :            :         bool (*mode_fixup)(struct drm_crtc *crtc,
     188                 :            :                            const struct drm_display_mode *mode,
     189                 :            :                            struct drm_display_mode *adjusted_mode);
     190                 :            : 
     191                 :            :         /**
     192                 :            :          * @mode_set:
     193                 :            :          *
     194                 :            :          * This callback is used by the legacy CRTC helpers to set a new mode,
     195                 :            :          * position and framebuffer. Since it ties the primary plane to every
     196                 :            :          * mode change it is incompatible with universal plane support. And
     197                 :            :          * since it can't update other planes it's incompatible with atomic
     198                 :            :          * modeset support.
     199                 :            :          *
     200                 :            :          * This callback is only used by CRTC helpers and deprecated.
     201                 :            :          *
     202                 :            :          * RETURNS:
     203                 :            :          *
     204                 :            :          * 0 on success or a negative error code on failure.
     205                 :            :          */
     206                 :            :         int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode,
     207                 :            :                         struct drm_display_mode *adjusted_mode, int x, int y,
     208                 :            :                         struct drm_framebuffer *old_fb);
     209                 :            : 
     210                 :            :         /**
     211                 :            :          * @mode_set_nofb:
     212                 :            :          *
     213                 :            :          * This callback is used to update the display mode of a CRTC without
     214                 :            :          * changing anything of the primary plane configuration. This fits the
     215                 :            :          * requirement of atomic and hence is used by the atomic helpers. It is
     216                 :            :          * also used by the transitional plane helpers to implement a
     217                 :            :          * @mode_set hook in drm_helper_crtc_mode_set().
     218                 :            :          *
     219                 :            :          * Note that the display pipe is completely off when this function is
     220                 :            :          * called. Atomic drivers which need hardware to be running before they
     221                 :            :          * program the new display mode (e.g. because they implement runtime PM)
     222                 :            :          * should not use this hook. This is because the helper library calls
     223                 :            :          * this hook only once per mode change and not every time the display
     224                 :            :          * pipeline is suspended using either DPMS or the new "ACTIVE" property.
     225                 :            :          * Which means register values set in this callback might get reset when
     226                 :            :          * the CRTC is suspended, but not restored.  Such drivers should instead
     227                 :            :          * move all their CRTC setup into the @atomic_enable callback.
     228                 :            :          *
     229                 :            :          * This callback is optional.
     230                 :            :          */
     231                 :            :         void (*mode_set_nofb)(struct drm_crtc *crtc);
     232                 :            : 
     233                 :            :         /**
     234                 :            :          * @mode_set_base:
     235                 :            :          *
     236                 :            :          * This callback is used by the legacy CRTC helpers to set a new
     237                 :            :          * framebuffer and scanout position. It is optional and used as an
     238                 :            :          * optimized fast-path instead of a full mode set operation with all the
     239                 :            :          * resulting flickering. If it is not present
     240                 :            :          * drm_crtc_helper_set_config() will fall back to a full modeset, using
     241                 :            :          * the @mode_set callback. Since it can't update other planes it's
     242                 :            :          * incompatible with atomic modeset support.
     243                 :            :          *
     244                 :            :          * This callback is only used by the CRTC helpers and deprecated.
     245                 :            :          *
     246                 :            :          * RETURNS:
     247                 :            :          *
     248                 :            :          * 0 on success or a negative error code on failure.
     249                 :            :          */
     250                 :            :         int (*mode_set_base)(struct drm_crtc *crtc, int x, int y,
     251                 :            :                              struct drm_framebuffer *old_fb);
     252                 :            : 
     253                 :            :         /**
     254                 :            :          * @mode_set_base_atomic:
     255                 :            :          *
     256                 :            :          * This callback is used by the fbdev helpers to set a new framebuffer
     257                 :            :          * and scanout without sleeping, i.e. from an atomic calling context. It
     258                 :            :          * is only used to implement kgdb support.
     259                 :            :          *
     260                 :            :          * This callback is optional and only needed for kgdb support in the fbdev
     261                 :            :          * helpers.
     262                 :            :          *
     263                 :            :          * RETURNS:
     264                 :            :          *
     265                 :            :          * 0 on success or a negative error code on failure.
     266                 :            :          */
     267                 :            :         int (*mode_set_base_atomic)(struct drm_crtc *crtc,
     268                 :            :                                     struct drm_framebuffer *fb, int x, int y,
     269                 :            :                                     enum mode_set_atomic);
     270                 :            : 
     271                 :            :         /**
     272                 :            :          * @disable:
     273                 :            :          *
     274                 :            :          * This callback should be used to disable the CRTC. With the atomic
     275                 :            :          * drivers it is called after all encoders connected to this CRTC have
     276                 :            :          * been shut off already using their own
     277                 :            :          * &drm_encoder_helper_funcs.disable hook. If that sequence is too
     278                 :            :          * simple drivers can just add their own hooks and call it from this
     279                 :            :          * CRTC callback here by looping over all encoders connected to it using
     280                 :            :          * for_each_encoder_on_crtc().
     281                 :            :          *
     282                 :            :          * This hook is used both by legacy CRTC helpers and atomic helpers.
     283                 :            :          * Atomic drivers don't need to implement it if there's no need to
     284                 :            :          * disable anything at the CRTC level. To ensure that runtime PM
     285                 :            :          * handling (using either DPMS or the new "ACTIVE" property) works
     286                 :            :          * @disable must be the inverse of @atomic_enable for atomic drivers.
     287                 :            :          * Atomic drivers should consider to use @atomic_disable instead of
     288                 :            :          * this one.
     289                 :            :          *
     290                 :            :          * NOTE:
     291                 :            :          *
     292                 :            :          * With legacy CRTC helpers there's a big semantic difference between
     293                 :            :          * @disable and other hooks (like @prepare or @dpms) used to shut down a
     294                 :            :          * CRTC: @disable is only called when also logically disabling the
     295                 :            :          * display pipeline and needs to release any resources acquired in
     296                 :            :          * @mode_set (like shared PLLs, or again release pinned framebuffers).
     297                 :            :          *
     298                 :            :          * Therefore @disable must be the inverse of @mode_set plus @commit for
     299                 :            :          * drivers still using legacy CRTC helpers, which is different from the
     300                 :            :          * rules under atomic.
     301                 :            :          */
     302                 :            :         void (*disable)(struct drm_crtc *crtc);
     303                 :            : 
     304                 :            :         /**
     305                 :            :          * @atomic_check:
     306                 :            :          *
     307                 :            :          * Drivers should check plane-update related CRTC constraints in this
     308                 :            :          * hook. They can also check mode related limitations but need to be
     309                 :            :          * aware of the calling order, since this hook is used by
     310                 :            :          * drm_atomic_helper_check_planes() whereas the preparations needed to
     311                 :            :          * check output routing and the display mode is done in
     312                 :            :          * drm_atomic_helper_check_modeset(). Therefore drivers that want to
     313                 :            :          * check output routing and display mode constraints in this callback
     314                 :            :          * must ensure that drm_atomic_helper_check_modeset() has been called
     315                 :            :          * beforehand. This is calling order used by the default helper
     316                 :            :          * implementation in drm_atomic_helper_check().
     317                 :            :          *
     318                 :            :          * When using drm_atomic_helper_check_planes() this hook is called
     319                 :            :          * after the &drm_plane_helper_funcs.atomic_check hook for planes, which
     320                 :            :          * allows drivers to assign shared resources requested by planes in this
     321                 :            :          * callback here. For more complicated dependencies the driver can call
     322                 :            :          * the provided check helpers multiple times until the computed state
     323                 :            :          * has a final configuration and everything has been checked.
     324                 :            :          *
     325                 :            :          * This function is also allowed to inspect any other object's state and
     326                 :            :          * can add more state objects to the atomic commit if needed. Care must
     327                 :            :          * be taken though to ensure that state check and compute functions for
     328                 :            :          * these added states are all called, and derived state in other objects
     329                 :            :          * all updated. Again the recommendation is to just call check helpers
     330                 :            :          * until a maximal configuration is reached.
     331                 :            :          *
     332                 :            :          * This callback is used by the atomic modeset helpers and by the
     333                 :            :          * transitional plane helpers, but it is optional.
     334                 :            :          *
     335                 :            :          * NOTE:
     336                 :            :          *
     337                 :            :          * This function is called in the check phase of an atomic update. The
     338                 :            :          * driver is not allowed to change anything outside of the free-standing
     339                 :            :          * state objects passed-in or assembled in the overall &drm_atomic_state
     340                 :            :          * update tracking structure.
     341                 :            :          *
     342                 :            :          * Also beware that userspace can request its own custom modes, neither
     343                 :            :          * core nor helpers filter modes to the list of probe modes reported by
     344                 :            :          * the GETCONNECTOR IOCTL and stored in &drm_connector.modes. To ensure
     345                 :            :          * that modes are filtered consistently put any CRTC constraints and
     346                 :            :          * limits checks into @mode_valid.
     347                 :            :          *
     348                 :            :          * RETURNS:
     349                 :            :          *
     350                 :            :          * 0 on success, -EINVAL if the state or the transition can't be
     351                 :            :          * supported, -ENOMEM on memory allocation failure and -EDEADLK if an
     352                 :            :          * attempt to obtain another state object ran into a &drm_modeset_lock
     353                 :            :          * deadlock.
     354                 :            :          */
     355                 :            :         int (*atomic_check)(struct drm_crtc *crtc,
     356                 :            :                             struct drm_crtc_state *state);
     357                 :            : 
     358                 :            :         /**
     359                 :            :          * @atomic_begin:
     360                 :            :          *
     361                 :            :          * Drivers should prepare for an atomic update of multiple planes on
     362                 :            :          * a CRTC in this hook. Depending upon hardware this might be vblank
     363                 :            :          * evasion, blocking updates by setting bits or doing preparatory work
     364                 :            :          * for e.g. manual update display.
     365                 :            :          *
     366                 :            :          * This hook is called before any plane commit functions are called.
     367                 :            :          *
     368                 :            :          * Note that the power state of the display pipe when this function is
     369                 :            :          * called depends upon the exact helpers and calling sequence the driver
     370                 :            :          * has picked. See drm_atomic_helper_commit_planes() for a discussion of
     371                 :            :          * the tradeoffs and variants of plane commit helpers.
     372                 :            :          *
     373                 :            :          * This callback is used by the atomic modeset helpers and by the
     374                 :            :          * transitional plane helpers, but it is optional.
     375                 :            :          */
     376                 :            :         void (*atomic_begin)(struct drm_crtc *crtc,
     377                 :            :                              struct drm_crtc_state *old_crtc_state);
     378                 :            :         /**
     379                 :            :          * @atomic_flush:
     380                 :            :          *
     381                 :            :          * Drivers should finalize an atomic update of multiple planes on
     382                 :            :          * a CRTC in this hook. Depending upon hardware this might include
     383                 :            :          * checking that vblank evasion was successful, unblocking updates by
     384                 :            :          * setting bits or setting the GO bit to flush out all updates.
     385                 :            :          *
     386                 :            :          * Simple hardware or hardware with special requirements can commit and
     387                 :            :          * flush out all updates for all planes from this hook and forgo all the
     388                 :            :          * other commit hooks for plane updates.
     389                 :            :          *
     390                 :            :          * This hook is called after any plane commit functions are called.
     391                 :            :          *
     392                 :            :          * Note that the power state of the display pipe when this function is
     393                 :            :          * called depends upon the exact helpers and calling sequence the driver
     394                 :            :          * has picked. See drm_atomic_helper_commit_planes() for a discussion of
     395                 :            :          * the tradeoffs and variants of plane commit helpers.
     396                 :            :          *
     397                 :            :          * This callback is used by the atomic modeset helpers and by the
     398                 :            :          * transitional plane helpers, but it is optional.
     399                 :            :          */
     400                 :            :         void (*atomic_flush)(struct drm_crtc *crtc,
     401                 :            :                              struct drm_crtc_state *old_crtc_state);
     402                 :            : 
     403                 :            :         /**
     404                 :            :          * @atomic_enable:
     405                 :            :          *
     406                 :            :          * This callback should be used to enable the CRTC. With the atomic
     407                 :            :          * drivers it is called before all encoders connected to this CRTC are
     408                 :            :          * enabled through the encoder's own &drm_encoder_helper_funcs.enable
     409                 :            :          * hook.  If that sequence is too simple drivers can just add their own
     410                 :            :          * hooks and call it from this CRTC callback here by looping over all
     411                 :            :          * encoders connected to it using for_each_encoder_on_crtc().
     412                 :            :          *
     413                 :            :          * This hook is used only by atomic helpers, for symmetry with
     414                 :            :          * @atomic_disable. Atomic drivers don't need to implement it if there's
     415                 :            :          * no need to enable anything at the CRTC level. To ensure that runtime
     416                 :            :          * PM handling (using either DPMS or the new "ACTIVE" property) works
     417                 :            :          * @atomic_enable must be the inverse of @atomic_disable for atomic
     418                 :            :          * drivers.
     419                 :            :          *
     420                 :            :          * Drivers can use the @old_crtc_state input parameter if the operations
     421                 :            :          * needed to enable the CRTC don't depend solely on the new state but
     422                 :            :          * also on the transition between the old state and the new state.
     423                 :            :          *
     424                 :            :          * This function is optional.
     425                 :            :          */
     426                 :            :         void (*atomic_enable)(struct drm_crtc *crtc,
     427                 :            :                               struct drm_crtc_state *old_crtc_state);
     428                 :            : 
     429                 :            :         /**
     430                 :            :          * @atomic_disable:
     431                 :            :          *
     432                 :            :          * This callback should be used to disable the CRTC. With the atomic
     433                 :            :          * drivers it is called after all encoders connected to this CRTC have
     434                 :            :          * been shut off already using their own
     435                 :            :          * &drm_encoder_helper_funcs.disable hook. If that sequence is too
     436                 :            :          * simple drivers can just add their own hooks and call it from this
     437                 :            :          * CRTC callback here by looping over all encoders connected to it using
     438                 :            :          * for_each_encoder_on_crtc().
     439                 :            :          *
     440                 :            :          * This hook is used only by atomic helpers. Atomic drivers don't
     441                 :            :          * need to implement it if there's no need to disable anything at the
     442                 :            :          * CRTC level.
     443                 :            :          *
     444                 :            :          * Comparing to @disable, this one provides the additional input
     445                 :            :          * parameter @old_crtc_state which could be used to access the old
     446                 :            :          * state. Atomic drivers should consider to use this one instead
     447                 :            :          * of @disable.
     448                 :            :          *
     449                 :            :          * This function is optional.
     450                 :            :          */
     451                 :            :         void (*atomic_disable)(struct drm_crtc *crtc,
     452                 :            :                                struct drm_crtc_state *old_crtc_state);
     453                 :            : };
     454                 :            : 
     455                 :            : /**
     456                 :            :  * drm_crtc_helper_add - sets the helper vtable for a crtc
     457                 :            :  * @crtc: DRM CRTC
     458                 :            :  * @funcs: helper vtable to set for @crtc
     459                 :            :  */
     460                 :          0 : static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
     461                 :            :                                        const struct drm_crtc_helper_funcs *funcs)
     462                 :            : {
     463                 :          0 :         crtc->helper_private = funcs;
     464                 :            : }
     465                 :            : 
     466                 :            : /**
     467                 :            :  * struct drm_encoder_helper_funcs - helper operations for encoders
     468                 :            :  *
     469                 :            :  * These hooks are used by the legacy CRTC helpers, the transitional plane
     470                 :            :  * helpers and the new atomic modesetting helpers.
     471                 :            :  */
     472                 :            : struct drm_encoder_helper_funcs {
     473                 :            :         /**
     474                 :            :          * @dpms:
     475                 :            :          *
     476                 :            :          * Callback to control power levels on the encoder.  If the mode passed in
     477                 :            :          * is unsupported, the provider must use the next lowest power level.
     478                 :            :          * This is used by the legacy encoder helpers to implement DPMS
     479                 :            :          * functionality in drm_helper_connector_dpms().
     480                 :            :          *
     481                 :            :          * This callback is also used to disable an encoder by calling it with
     482                 :            :          * DRM_MODE_DPMS_OFF if the @disable hook isn't used.
     483                 :            :          *
     484                 :            :          * This callback is used by the legacy CRTC helpers.  Atomic helpers
     485                 :            :          * also support using this hook for enabling and disabling an encoder to
     486                 :            :          * facilitate transitions to atomic, but it is deprecated. Instead
     487                 :            :          * @enable and @disable should be used.
     488                 :            :          */
     489                 :            :         void (*dpms)(struct drm_encoder *encoder, int mode);
     490                 :            : 
     491                 :            :         /**
     492                 :            :          * @mode_valid:
     493                 :            :          *
     494                 :            :          * This callback is used to check if a specific mode is valid in this
     495                 :            :          * encoder. This should be implemented if the encoder has some sort
     496                 :            :          * of restriction in the modes it can display. For example, a given
     497                 :            :          * encoder may be responsible to set a clock value. If the clock can
     498                 :            :          * not produce all the values for the available modes then this callback
     499                 :            :          * can be used to restrict the number of modes to only the ones that
     500                 :            :          * can be displayed.
     501                 :            :          *
     502                 :            :          * This hook is used by the probe helpers to filter the mode list in
     503                 :            :          * drm_helper_probe_single_connector_modes(), and it is used by the
     504                 :            :          * atomic helpers to validate modes supplied by userspace in
     505                 :            :          * drm_atomic_helper_check_modeset().
     506                 :            :          *
     507                 :            :          * This function is optional.
     508                 :            :          *
     509                 :            :          * NOTE:
     510                 :            :          *
     511                 :            :          * Since this function is both called from the check phase of an atomic
     512                 :            :          * commit, and the mode validation in the probe paths it is not allowed
     513                 :            :          * to look at anything else but the passed-in mode, and validate it
     514                 :            :          * against configuration-invariant hardward constraints. Any further
     515                 :            :          * limits which depend upon the configuration can only be checked in
     516                 :            :          * @mode_fixup or @atomic_check.
     517                 :            :          *
     518                 :            :          * RETURNS:
     519                 :            :          *
     520                 :            :          * drm_mode_status Enum
     521                 :            :          */
     522                 :            :         enum drm_mode_status (*mode_valid)(struct drm_encoder *crtc,
     523                 :            :                                            const struct drm_display_mode *mode);
     524                 :            : 
     525                 :            :         /**
     526                 :            :          * @mode_fixup:
     527                 :            :          *
     528                 :            :          * This callback is used to validate and adjust a mode. The parameter
     529                 :            :          * mode is the display mode that should be fed to the next element in
     530                 :            :          * the display chain, either the final &drm_connector or a &drm_bridge.
     531                 :            :          * The parameter adjusted_mode is the input mode the encoder requires. It
     532                 :            :          * can be modified by this callback and does not need to match mode. See
     533                 :            :          * also &drm_crtc_state.adjusted_mode for more details.
     534                 :            :          *
     535                 :            :          * This function is used by both legacy CRTC helpers and atomic helpers.
     536                 :            :          * This hook is optional.
     537                 :            :          *
     538                 :            :          * NOTE:
     539                 :            :          *
     540                 :            :          * This function is called in the check phase of atomic modesets, which
     541                 :            :          * can be aborted for any reason (including on userspace's request to
     542                 :            :          * just check whether a configuration would be possible). Atomic drivers
     543                 :            :          * MUST NOT touch any persistent state (hardware or software) or data
     544                 :            :          * structures except the passed in adjusted_mode parameter.
     545                 :            :          *
     546                 :            :          * This is in contrast to the legacy CRTC helpers where this was
     547                 :            :          * allowed.
     548                 :            :          *
     549                 :            :          * Atomic drivers which need to inspect and adjust more state should
     550                 :            :          * instead use the @atomic_check callback. If @atomic_check is used,
     551                 :            :          * this hook isn't called since @atomic_check allows a strict superset
     552                 :            :          * of the functionality of @mode_fixup.
     553                 :            :          *
     554                 :            :          * Also beware that userspace can request its own custom modes, neither
     555                 :            :          * core nor helpers filter modes to the list of probe modes reported by
     556                 :            :          * the GETCONNECTOR IOCTL and stored in &drm_connector.modes. To ensure
     557                 :            :          * that modes are filtered consistently put any encoder constraints and
     558                 :            :          * limits checks into @mode_valid.
     559                 :            :          *
     560                 :            :          * RETURNS:
     561                 :            :          *
     562                 :            :          * True if an acceptable configuration is possible, false if the modeset
     563                 :            :          * operation should be rejected.
     564                 :            :          */
     565                 :            :         bool (*mode_fixup)(struct drm_encoder *encoder,
     566                 :            :                            const struct drm_display_mode *mode,
     567                 :            :                            struct drm_display_mode *adjusted_mode);
     568                 :            : 
     569                 :            :         /**
     570                 :            :          * @prepare:
     571                 :            :          *
     572                 :            :          * This callback should prepare the encoder for a subsequent modeset,
     573                 :            :          * which in practice means the driver should disable the encoder if it
     574                 :            :          * is running. Most drivers ended up implementing this by calling their
     575                 :            :          * @dpms hook with DRM_MODE_DPMS_OFF.
     576                 :            :          *
     577                 :            :          * This callback is used by the legacy CRTC helpers.  Atomic helpers
     578                 :            :          * also support using this hook for disabling an encoder to facilitate
     579                 :            :          * transitions to atomic, but it is deprecated. Instead @disable should
     580                 :            :          * be used.
     581                 :            :          */
     582                 :            :         void (*prepare)(struct drm_encoder *encoder);
     583                 :            : 
     584                 :            :         /**
     585                 :            :          * @commit:
     586                 :            :          *
     587                 :            :          * This callback should commit the new mode on the encoder after a modeset,
     588                 :            :          * which in practice means the driver should enable the encoder.  Most
     589                 :            :          * drivers ended up implementing this by calling their @dpms hook with
     590                 :            :          * DRM_MODE_DPMS_ON.
     591                 :            :          *
     592                 :            :          * This callback is used by the legacy CRTC helpers.  Atomic helpers
     593                 :            :          * also support using this hook for enabling an encoder to facilitate
     594                 :            :          * transitions to atomic, but it is deprecated. Instead @enable should
     595                 :            :          * be used.
     596                 :            :          */
     597                 :            :         void (*commit)(struct drm_encoder *encoder);
     598                 :            : 
     599                 :            :         /**
     600                 :            :          * @mode_set:
     601                 :            :          *
     602                 :            :          * This callback is used to update the display mode of an encoder.
     603                 :            :          *
     604                 :            :          * Note that the display pipe is completely off when this function is
     605                 :            :          * called. Drivers which need hardware to be running before they program
     606                 :            :          * the new display mode (because they implement runtime PM) should not
     607                 :            :          * use this hook, because the helper library calls it only once and not
     608                 :            :          * every time the display pipeline is suspend using either DPMS or the
     609                 :            :          * new "ACTIVE" property. Such drivers should instead move all their
     610                 :            :          * encoder setup into the @enable callback.
     611                 :            :          *
     612                 :            :          * This callback is used both by the legacy CRTC helpers and the atomic
     613                 :            :          * modeset helpers. It is optional in the atomic helpers.
     614                 :            :          *
     615                 :            :          * NOTE:
     616                 :            :          *
     617                 :            :          * If the driver uses the atomic modeset helpers and needs to inspect
     618                 :            :          * the connector state or connector display info during mode setting,
     619                 :            :          * @atomic_mode_set can be used instead.
     620                 :            :          */
     621                 :            :         void (*mode_set)(struct drm_encoder *encoder,
     622                 :            :                          struct drm_display_mode *mode,
     623                 :            :                          struct drm_display_mode *adjusted_mode);
     624                 :            : 
     625                 :            :         /**
     626                 :            :          * @atomic_mode_set:
     627                 :            :          *
     628                 :            :          * This callback is used to update the display mode of an encoder.
     629                 :            :          *
     630                 :            :          * Note that the display pipe is completely off when this function is
     631                 :            :          * called. Drivers which need hardware to be running before they program
     632                 :            :          * the new display mode (because they implement runtime PM) should not
     633                 :            :          * use this hook, because the helper library calls it only once and not
     634                 :            :          * every time the display pipeline is suspended using either DPMS or the
     635                 :            :          * new "ACTIVE" property. Such drivers should instead move all their
     636                 :            :          * encoder setup into the @enable callback.
     637                 :            :          *
     638                 :            :          * This callback is used by the atomic modeset helpers in place of the
     639                 :            :          * @mode_set callback, if set by the driver. It is optional and should
     640                 :            :          * be used instead of @mode_set if the driver needs to inspect the
     641                 :            :          * connector state or display info, since there is no direct way to
     642                 :            :          * go from the encoder to the current connector.
     643                 :            :          */
     644                 :            :         void (*atomic_mode_set)(struct drm_encoder *encoder,
     645                 :            :                                 struct drm_crtc_state *crtc_state,
     646                 :            :                                 struct drm_connector_state *conn_state);
     647                 :            : 
     648                 :            :         /**
     649                 :            :          * @get_crtc:
     650                 :            :          *
     651                 :            :          * This callback is used by the legacy CRTC helpers to work around
     652                 :            :          * deficiencies in its own book-keeping.
     653                 :            :          *
     654                 :            :          * Do not use, use atomic helpers instead, which get the book keeping
     655                 :            :          * right.
     656                 :            :          *
     657                 :            :          * FIXME:
     658                 :            :          *
     659                 :            :          * Currently only nouveau is using this, and as soon as nouveau is
     660                 :            :          * atomic we can ditch this hook.
     661                 :            :          */
     662                 :            :         struct drm_crtc *(*get_crtc)(struct drm_encoder *encoder);
     663                 :            : 
     664                 :            :         /**
     665                 :            :          * @detect:
     666                 :            :          *
     667                 :            :          * This callback can be used by drivers who want to do detection on the
     668                 :            :          * encoder object instead of in connector functions.
     669                 :            :          *
     670                 :            :          * It is not used by any helper and therefore has purely driver-specific
     671                 :            :          * semantics. New drivers shouldn't use this and instead just implement
     672                 :            :          * their own private callbacks.
     673                 :            :          *
     674                 :            :          * FIXME:
     675                 :            :          *
     676                 :            :          * This should just be converted into a pile of driver vfuncs.
     677                 :            :          * Currently radeon, amdgpu and nouveau are using it.
     678                 :            :          */
     679                 :            :         enum drm_connector_status (*detect)(struct drm_encoder *encoder,
     680                 :            :                                             struct drm_connector *connector);
     681                 :            : 
     682                 :            :         /**
     683                 :            :          * @atomic_disable:
     684                 :            :          *
     685                 :            :          * This callback should be used to disable the encoder. With the atomic
     686                 :            :          * drivers it is called before this encoder's CRTC has been shut off
     687                 :            :          * using their own &drm_crtc_helper_funcs.atomic_disable hook. If that
     688                 :            :          * sequence is too simple drivers can just add their own driver private
     689                 :            :          * encoder hooks and call them from CRTC's callback by looping over all
     690                 :            :          * encoders connected to it using for_each_encoder_on_crtc().
     691                 :            :          *
     692                 :            :          * This callback is a variant of @disable that provides the atomic state
     693                 :            :          * to the driver. If @atomic_disable is implemented, @disable is not
     694                 :            :          * called by the helpers.
     695                 :            :          *
     696                 :            :          * This hook is only used by atomic helpers. Atomic drivers don't need
     697                 :            :          * to implement it if there's no need to disable anything at the encoder
     698                 :            :          * level. To ensure that runtime PM handling (using either DPMS or the
     699                 :            :          * new "ACTIVE" property) works @atomic_disable must be the inverse of
     700                 :            :          * @atomic_enable.
     701                 :            :          */
     702                 :            :         void (*atomic_disable)(struct drm_encoder *encoder,
     703                 :            :                                struct drm_atomic_state *state);
     704                 :            : 
     705                 :            :         /**
     706                 :            :          * @atomic_enable:
     707                 :            :          *
     708                 :            :          * This callback should be used to enable the encoder. It is called
     709                 :            :          * after this encoder's CRTC has been enabled using their own
     710                 :            :          * &drm_crtc_helper_funcs.atomic_enable hook. If that sequence is
     711                 :            :          * too simple drivers can just add their own driver private encoder
     712                 :            :          * hooks and call them from CRTC's callback by looping over all encoders
     713                 :            :          * connected to it using for_each_encoder_on_crtc().
     714                 :            :          *
     715                 :            :          * This callback is a variant of @enable that provides the atomic state
     716                 :            :          * to the driver. If @atomic_enable is implemented, @enable is not
     717                 :            :          * called by the helpers.
     718                 :            :          *
     719                 :            :          * This hook is only used by atomic helpers, it is the opposite of
     720                 :            :          * @atomic_disable. Atomic drivers don't need to implement it if there's
     721                 :            :          * no need to enable anything at the encoder level. To ensure that
     722                 :            :          * runtime PM handling works @atomic_enable must be the inverse of
     723                 :            :          * @atomic_disable.
     724                 :            :          */
     725                 :            :         void (*atomic_enable)(struct drm_encoder *encoder,
     726                 :            :                               struct drm_atomic_state *state);
     727                 :            : 
     728                 :            :         /**
     729                 :            :          * @disable:
     730                 :            :          *
     731                 :            :          * This callback should be used to disable the encoder. With the atomic
     732                 :            :          * drivers it is called before this encoder's CRTC has been shut off
     733                 :            :          * using their own &drm_crtc_helper_funcs.disable hook.  If that
     734                 :            :          * sequence is too simple drivers can just add their own driver private
     735                 :            :          * encoder hooks and call them from CRTC's callback by looping over all
     736                 :            :          * encoders connected to it using for_each_encoder_on_crtc().
     737                 :            :          *
     738                 :            :          * This hook is used both by legacy CRTC helpers and atomic helpers.
     739                 :            :          * Atomic drivers don't need to implement it if there's no need to
     740                 :            :          * disable anything at the encoder level. To ensure that runtime PM
     741                 :            :          * handling (using either DPMS or the new "ACTIVE" property) works
     742                 :            :          * @disable must be the inverse of @enable for atomic drivers.
     743                 :            :          *
     744                 :            :          * For atomic drivers also consider @atomic_disable and save yourself
     745                 :            :          * from having to read the NOTE below!
     746                 :            :          *
     747                 :            :          * NOTE:
     748                 :            :          *
     749                 :            :          * With legacy CRTC helpers there's a big semantic difference between
     750                 :            :          * @disable and other hooks (like @prepare or @dpms) used to shut down a
     751                 :            :          * encoder: @disable is only called when also logically disabling the
     752                 :            :          * display pipeline and needs to release any resources acquired in
     753                 :            :          * @mode_set (like shared PLLs, or again release pinned framebuffers).
     754                 :            :          *
     755                 :            :          * Therefore @disable must be the inverse of @mode_set plus @commit for
     756                 :            :          * drivers still using legacy CRTC helpers, which is different from the
     757                 :            :          * rules under atomic.
     758                 :            :          */
     759                 :            :         void (*disable)(struct drm_encoder *encoder);
     760                 :            : 
     761                 :            :         /**
     762                 :            :          * @enable:
     763                 :            :          *
     764                 :            :          * This callback should be used to enable the encoder. With the atomic
     765                 :            :          * drivers it is called after this encoder's CRTC has been enabled using
     766                 :            :          * their own &drm_crtc_helper_funcs.enable hook.  If that sequence is
     767                 :            :          * too simple drivers can just add their own driver private encoder
     768                 :            :          * hooks and call them from CRTC's callback by looping over all encoders
     769                 :            :          * connected to it using for_each_encoder_on_crtc().
     770                 :            :          *
     771                 :            :          * This hook is only used by atomic helpers, it is the opposite of
     772                 :            :          * @disable. Atomic drivers don't need to implement it if there's no
     773                 :            :          * need to enable anything at the encoder level. To ensure that
     774                 :            :          * runtime PM handling (using either DPMS or the new "ACTIVE" property)
     775                 :            :          * works @enable must be the inverse of @disable for atomic drivers.
     776                 :            :          */
     777                 :            :         void (*enable)(struct drm_encoder *encoder);
     778                 :            : 
     779                 :            :         /**
     780                 :            :          * @atomic_check:
     781                 :            :          *
     782                 :            :          * This callback is used to validate encoder state for atomic drivers.
     783                 :            :          * Since the encoder is the object connecting the CRTC and connector it
     784                 :            :          * gets passed both states, to be able to validate interactions and
     785                 :            :          * update the CRTC to match what the encoder needs for the requested
     786                 :            :          * connector.
     787                 :            :          *
     788                 :            :          * Since this provides a strict superset of the functionality of
     789                 :            :          * @mode_fixup (the requested and adjusted modes are both available
     790                 :            :          * through the passed in &struct drm_crtc_state) @mode_fixup is not
     791                 :            :          * called when @atomic_check is implemented.
     792                 :            :          *
     793                 :            :          * This function is used by the atomic helpers, but it is optional.
     794                 :            :          *
     795                 :            :          * NOTE:
     796                 :            :          *
     797                 :            :          * This function is called in the check phase of an atomic update. The
     798                 :            :          * driver is not allowed to change anything outside of the free-standing
     799                 :            :          * state objects passed-in or assembled in the overall &drm_atomic_state
     800                 :            :          * update tracking structure.
     801                 :            :          *
     802                 :            :          * Also beware that userspace can request its own custom modes, neither
     803                 :            :          * core nor helpers filter modes to the list of probe modes reported by
     804                 :            :          * the GETCONNECTOR IOCTL and stored in &drm_connector.modes. To ensure
     805                 :            :          * that modes are filtered consistently put any encoder constraints and
     806                 :            :          * limits checks into @mode_valid.
     807                 :            :          *
     808                 :            :          * RETURNS:
     809                 :            :          *
     810                 :            :          * 0 on success, -EINVAL if the state or the transition can't be
     811                 :            :          * supported, -ENOMEM on memory allocation failure and -EDEADLK if an
     812                 :            :          * attempt to obtain another state object ran into a &drm_modeset_lock
     813                 :            :          * deadlock.
     814                 :            :          */
     815                 :            :         int (*atomic_check)(struct drm_encoder *encoder,
     816                 :            :                             struct drm_crtc_state *crtc_state,
     817                 :            :                             struct drm_connector_state *conn_state);
     818                 :            : };
     819                 :            : 
     820                 :            : /**
     821                 :            :  * drm_encoder_helper_add - sets the helper vtable for an encoder
     822                 :            :  * @encoder: DRM encoder
     823                 :            :  * @funcs: helper vtable to set for @encoder
     824                 :            :  */
     825                 :          0 : static inline void drm_encoder_helper_add(struct drm_encoder *encoder,
     826                 :            :                                           const struct drm_encoder_helper_funcs *funcs)
     827                 :            : {
     828                 :          0 :         encoder->helper_private = funcs;
     829                 :            : }
     830                 :            : 
     831                 :            : /**
     832                 :            :  * struct drm_connector_helper_funcs - helper operations for connectors
     833                 :            :  *
     834                 :            :  * These functions are used by the atomic and legacy modeset helpers and by the
     835                 :            :  * probe helpers.
     836                 :            :  */
     837                 :            : struct drm_connector_helper_funcs {
     838                 :            :         /**
     839                 :            :          * @get_modes:
     840                 :            :          *
     841                 :            :          * This function should fill in all modes currently valid for the sink
     842                 :            :          * into the &drm_connector.probed_modes list. It should also update the
     843                 :            :          * EDID property by calling drm_connector_update_edid_property().
     844                 :            :          *
     845                 :            :          * The usual way to implement this is to cache the EDID retrieved in the
     846                 :            :          * probe callback somewhere in the driver-private connector structure.
     847                 :            :          * In this function drivers then parse the modes in the EDID and add
     848                 :            :          * them by calling drm_add_edid_modes(). But connectors that driver a
     849                 :            :          * fixed panel can also manually add specific modes using
     850                 :            :          * drm_mode_probed_add(). Drivers which manually add modes should also
     851                 :            :          * make sure that the &drm_connector.display_info,
     852                 :            :          * &drm_connector.width_mm and &drm_connector.height_mm fields are
     853                 :            :          * filled in.
     854                 :            :          *
     855                 :            :          * Virtual drivers that just want some standard VESA mode with a given
     856                 :            :          * resolution can call drm_add_modes_noedid(), and mark the preferred
     857                 :            :          * one using drm_set_preferred_mode().
     858                 :            :          *
     859                 :            :          * This function is only called after the @detect hook has indicated
     860                 :            :          * that a sink is connected and when the EDID isn't overridden through
     861                 :            :          * sysfs or the kernel commandline.
     862                 :            :          *
     863                 :            :          * This callback is used by the probe helpers in e.g.
     864                 :            :          * drm_helper_probe_single_connector_modes().
     865                 :            :          *
     866                 :            :          * To avoid races with concurrent connector state updates, the helper
     867                 :            :          * libraries always call this with the &drm_mode_config.connection_mutex
     868                 :            :          * held. Because of this it's safe to inspect &drm_connector->state.
     869                 :            :          *
     870                 :            :          * RETURNS:
     871                 :            :          *
     872                 :            :          * The number of modes added by calling drm_mode_probed_add().
     873                 :            :          */
     874                 :            :         int (*get_modes)(struct drm_connector *connector);
     875                 :            : 
     876                 :            :         /**
     877                 :            :          * @detect_ctx:
     878                 :            :          *
     879                 :            :          * Check to see if anything is attached to the connector. The parameter
     880                 :            :          * force is set to false whilst polling, true when checking the
     881                 :            :          * connector due to a user request. force can be used by the driver to
     882                 :            :          * avoid expensive, destructive operations during automated probing.
     883                 :            :          *
     884                 :            :          * This callback is optional, if not implemented the connector will be
     885                 :            :          * considered as always being attached.
     886                 :            :          *
     887                 :            :          * This is the atomic version of &drm_connector_funcs.detect.
     888                 :            :          *
     889                 :            :          * To avoid races against concurrent connector state updates, the
     890                 :            :          * helper libraries always call this with ctx set to a valid context,
     891                 :            :          * and &drm_mode_config.connection_mutex will always be locked with
     892                 :            :          * the ctx parameter set to this ctx. This allows taking additional
     893                 :            :          * locks as required.
     894                 :            :          *
     895                 :            :          * RETURNS:
     896                 :            :          *
     897                 :            :          * &drm_connector_status indicating the connector's status,
     898                 :            :          * or the error code returned by drm_modeset_lock(), -EDEADLK.
     899                 :            :          */
     900                 :            :         int (*detect_ctx)(struct drm_connector *connector,
     901                 :            :                           struct drm_modeset_acquire_ctx *ctx,
     902                 :            :                           bool force);
     903                 :            : 
     904                 :            :         /**
     905                 :            :          * @mode_valid:
     906                 :            :          *
     907                 :            :          * Callback to validate a mode for a connector, irrespective of the
     908                 :            :          * specific display configuration.
     909                 :            :          *
     910                 :            :          * This callback is used by the probe helpers to filter the mode list
     911                 :            :          * (which is usually derived from the EDID data block from the sink).
     912                 :            :          * See e.g. drm_helper_probe_single_connector_modes().
     913                 :            :          *
     914                 :            :          * This function is optional.
     915                 :            :          *
     916                 :            :          * NOTE:
     917                 :            :          *
     918                 :            :          * This only filters the mode list supplied to userspace in the
     919                 :            :          * GETCONNECTOR IOCTL. Compared to &drm_encoder_helper_funcs.mode_valid,
     920                 :            :          * &drm_crtc_helper_funcs.mode_valid and &drm_bridge_funcs.mode_valid,
     921                 :            :          * which are also called by the atomic helpers from
     922                 :            :          * drm_atomic_helper_check_modeset(). This allows userspace to force and
     923                 :            :          * ignore sink constraint (like the pixel clock limits in the screen's
     924                 :            :          * EDID), which is useful for e.g. testing, or working around a broken
     925                 :            :          * EDID. Any source hardware constraint (which always need to be
     926                 :            :          * enforced) therefore should be checked in one of the above callbacks,
     927                 :            :          * and not this one here.
     928                 :            :          *
     929                 :            :          * To avoid races with concurrent connector state updates, the helper
     930                 :            :          * libraries always call this with the &drm_mode_config.connection_mutex
     931                 :            :          * held. Because of this it's safe to inspect &drm_connector->state.
     932                 :            :          *
     933                 :            :          * RETURNS:
     934                 :            :          *
     935                 :            :          * Either &drm_mode_status.MODE_OK or one of the failure reasons in &enum
     936                 :            :          * drm_mode_status.
     937                 :            :          */
     938                 :            :         enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
     939                 :            :                                            struct drm_display_mode *mode);
     940                 :            :         /**
     941                 :            :          * @best_encoder:
     942                 :            :          *
     943                 :            :          * This function should select the best encoder for the given connector.
     944                 :            :          *
     945                 :            :          * This function is used by both the atomic helpers (in the
     946                 :            :          * drm_atomic_helper_check_modeset() function) and in the legacy CRTC
     947                 :            :          * helpers.
     948                 :            :          *
     949                 :            :          * NOTE:
     950                 :            :          *
     951                 :            :          * In atomic drivers this function is called in the check phase of an
     952                 :            :          * atomic update. The driver is not allowed to change or inspect
     953                 :            :          * anything outside of arguments passed-in. Atomic drivers which need to
     954                 :            :          * inspect dynamic configuration state should instead use
     955                 :            :          * @atomic_best_encoder.
     956                 :            :          *
     957                 :            :          * You can leave this function to NULL if the connector is only
     958                 :            :          * attached to a single encoder. In this case, the core will call
     959                 :            :          * drm_connector_get_single_encoder() for you.
     960                 :            :          *
     961                 :            :          * RETURNS:
     962                 :            :          *
     963                 :            :          * Encoder that should be used for the given connector and connector
     964                 :            :          * state, or NULL if no suitable encoder exists. Note that the helpers
     965                 :            :          * will ensure that encoders aren't used twice, drivers should not check
     966                 :            :          * for this.
     967                 :            :          */
     968                 :            :         struct drm_encoder *(*best_encoder)(struct drm_connector *connector);
     969                 :            : 
     970                 :            :         /**
     971                 :            :          * @atomic_best_encoder:
     972                 :            :          *
     973                 :            :          * This is the atomic version of @best_encoder for atomic drivers which
     974                 :            :          * need to select the best encoder depending upon the desired
     975                 :            :          * configuration and can't select it statically.
     976                 :            :          *
     977                 :            :          * This function is used by drm_atomic_helper_check_modeset().
     978                 :            :          * If it is not implemented, the core will fallback to @best_encoder
     979                 :            :          * (or drm_connector_get_single_encoder() if @best_encoder is NULL).
     980                 :            :          *
     981                 :            :          * NOTE:
     982                 :            :          *
     983                 :            :          * This function is called in the check phase of an atomic update. The
     984                 :            :          * driver is not allowed to change anything outside of the free-standing
     985                 :            :          * state objects passed-in or assembled in the overall &drm_atomic_state
     986                 :            :          * update tracking structure.
     987                 :            :          *
     988                 :            :          * RETURNS:
     989                 :            :          *
     990                 :            :          * Encoder that should be used for the given connector and connector
     991                 :            :          * state, or NULL if no suitable encoder exists. Note that the helpers
     992                 :            :          * will ensure that encoders aren't used twice, drivers should not check
     993                 :            :          * for this.
     994                 :            :          */
     995                 :            :         struct drm_encoder *(*atomic_best_encoder)(struct drm_connector *connector,
     996                 :            :                                                    struct drm_connector_state *connector_state);
     997                 :            : 
     998                 :            :         /**
     999                 :            :          * @atomic_check:
    1000                 :            :          *
    1001                 :            :          * This hook is used to validate connector state. This function is
    1002                 :            :          * called from &drm_atomic_helper_check_modeset, and is called when
    1003                 :            :          * a connector property is set, or a modeset on the crtc is forced.
    1004                 :            :          *
    1005                 :            :          * Because &drm_atomic_helper_check_modeset may be called multiple times,
    1006                 :            :          * this function should handle being called multiple times as well.
    1007                 :            :          *
    1008                 :            :          * This function is also allowed to inspect any other object's state and
    1009                 :            :          * can add more state objects to the atomic commit if needed. Care must
    1010                 :            :          * be taken though to ensure that state check and compute functions for
    1011                 :            :          * these added states are all called, and derived state in other objects
    1012                 :            :          * all updated. Again the recommendation is to just call check helpers
    1013                 :            :          * until a maximal configuration is reached.
    1014                 :            :          *
    1015                 :            :          * NOTE:
    1016                 :            :          *
    1017                 :            :          * This function is called in the check phase of an atomic update. The
    1018                 :            :          * driver is not allowed to change anything outside of the free-standing
    1019                 :            :          * state objects passed-in or assembled in the overall &drm_atomic_state
    1020                 :            :          * update tracking structure.
    1021                 :            :          *
    1022                 :            :          * RETURNS:
    1023                 :            :          *
    1024                 :            :          * 0 on success, -EINVAL if the state or the transition can't be
    1025                 :            :          * supported, -ENOMEM on memory allocation failure and -EDEADLK if an
    1026                 :            :          * attempt to obtain another state object ran into a &drm_modeset_lock
    1027                 :            :          * deadlock.
    1028                 :            :          */
    1029                 :            :         int (*atomic_check)(struct drm_connector *connector,
    1030                 :            :                             struct drm_atomic_state *state);
    1031                 :            : 
    1032                 :            :         /**
    1033                 :            :          * @atomic_commit:
    1034                 :            :          *
    1035                 :            :          * This hook is to be used by drivers implementing writeback connectors
    1036                 :            :          * that need a point when to commit the writeback job to the hardware.
    1037                 :            :          * The writeback_job to commit is available in
    1038                 :            :          * &drm_connector_state.writeback_job.
    1039                 :            :          *
    1040                 :            :          * This hook is optional.
    1041                 :            :          *
    1042                 :            :          * This callback is used by the atomic modeset helpers.
    1043                 :            :          */
    1044                 :            :         void (*atomic_commit)(struct drm_connector *connector,
    1045                 :            :                               struct drm_connector_state *state);
    1046                 :            : 
    1047                 :            :         int (*prepare_writeback_job)(struct drm_writeback_connector *connector,
    1048                 :            :                                      struct drm_writeback_job *job);
    1049                 :            :         void (*cleanup_writeback_job)(struct drm_writeback_connector *connector,
    1050                 :            :                                       struct drm_writeback_job *job);
    1051                 :            : };
    1052                 :            : 
    1053                 :            : /**
    1054                 :            :  * drm_connector_helper_add - sets the helper vtable for a connector
    1055                 :            :  * @connector: DRM connector
    1056                 :            :  * @funcs: helper vtable to set for @connector
    1057                 :            :  */
    1058                 :          0 : static inline void drm_connector_helper_add(struct drm_connector *connector,
    1059                 :            :                                             const struct drm_connector_helper_funcs *funcs)
    1060                 :            : {
    1061         [ #  # ]:          0 :         connector->helper_private = funcs;
    1062                 :            : }
    1063                 :            : 
    1064                 :            : /**
    1065                 :            :  * struct drm_plane_helper_funcs - helper operations for planes
    1066                 :            :  *
    1067                 :            :  * These functions are used by the atomic helpers and by the transitional plane
    1068                 :            :  * helpers.
    1069                 :            :  */
    1070                 :            : struct drm_plane_helper_funcs {
    1071                 :            :         /**
    1072                 :            :          * @prepare_fb:
    1073                 :            :          *
    1074                 :            :          * This hook is to prepare a framebuffer for scanout by e.g. pinning
    1075                 :            :          * its backing storage or relocating it into a contiguous block of
    1076                 :            :          * VRAM. Other possible preparatory work includes flushing caches.
    1077                 :            :          *
    1078                 :            :          * This function must not block for outstanding rendering, since it is
    1079                 :            :          * called in the context of the atomic IOCTL even for async commits to
    1080                 :            :          * be able to return any errors to userspace. Instead the recommended
    1081                 :            :          * way is to fill out the &drm_plane_state.fence of the passed-in
    1082                 :            :          * &drm_plane_state. If the driver doesn't support native fences then
    1083                 :            :          * equivalent functionality should be implemented through private
    1084                 :            :          * members in the plane structure.
    1085                 :            :          *
    1086                 :            :          * Drivers which always have their buffers pinned should use
    1087                 :            :          * drm_gem_fb_prepare_fb() for this hook.
    1088                 :            :          *
    1089                 :            :          * The helpers will call @cleanup_fb with matching arguments for every
    1090                 :            :          * successful call to this hook.
    1091                 :            :          *
    1092                 :            :          * This callback is used by the atomic modeset helpers and by the
    1093                 :            :          * transitional plane helpers, but it is optional.
    1094                 :            :          *
    1095                 :            :          * RETURNS:
    1096                 :            :          *
    1097                 :            :          * 0 on success or one of the following negative error codes allowed by
    1098                 :            :          * the &drm_mode_config_funcs.atomic_commit vfunc. When using helpers
    1099                 :            :          * this callback is the only one which can fail an atomic commit,
    1100                 :            :          * everything else must complete successfully.
    1101                 :            :          */
    1102                 :            :         int (*prepare_fb)(struct drm_plane *plane,
    1103                 :            :                           struct drm_plane_state *new_state);
    1104                 :            :         /**
    1105                 :            :          * @cleanup_fb:
    1106                 :            :          *
    1107                 :            :          * This hook is called to clean up any resources allocated for the given
    1108                 :            :          * framebuffer and plane configuration in @prepare_fb.
    1109                 :            :          *
    1110                 :            :          * This callback is used by the atomic modeset helpers and by the
    1111                 :            :          * transitional plane helpers, but it is optional.
    1112                 :            :          */
    1113                 :            :         void (*cleanup_fb)(struct drm_plane *plane,
    1114                 :            :                            struct drm_plane_state *old_state);
    1115                 :            : 
    1116                 :            :         /**
    1117                 :            :          * @atomic_check:
    1118                 :            :          *
    1119                 :            :          * Drivers should check plane specific constraints in this hook.
    1120                 :            :          *
    1121                 :            :          * When using drm_atomic_helper_check_planes() plane's @atomic_check
    1122                 :            :          * hooks are called before the ones for CRTCs, which allows drivers to
    1123                 :            :          * request shared resources that the CRTC controls here. For more
    1124                 :            :          * complicated dependencies the driver can call the provided check helpers
    1125                 :            :          * multiple times until the computed state has a final configuration and
    1126                 :            :          * everything has been checked.
    1127                 :            :          *
    1128                 :            :          * This function is also allowed to inspect any other object's state and
    1129                 :            :          * can add more state objects to the atomic commit if needed. Care must
    1130                 :            :          * be taken though to ensure that state check and compute functions for
    1131                 :            :          * these added states are all called, and derived state in other objects
    1132                 :            :          * all updated. Again the recommendation is to just call check helpers
    1133                 :            :          * until a maximal configuration is reached.
    1134                 :            :          *
    1135                 :            :          * This callback is used by the atomic modeset helpers and by the
    1136                 :            :          * transitional plane helpers, but it is optional.
    1137                 :            :          *
    1138                 :            :          * NOTE:
    1139                 :            :          *
    1140                 :            :          * This function is called in the check phase of an atomic update. The
    1141                 :            :          * driver is not allowed to change anything outside of the free-standing
    1142                 :            :          * state objects passed-in or assembled in the overall &drm_atomic_state
    1143                 :            :          * update tracking structure.
    1144                 :            :          *
    1145                 :            :          * RETURNS:
    1146                 :            :          *
    1147                 :            :          * 0 on success, -EINVAL if the state or the transition can't be
    1148                 :            :          * supported, -ENOMEM on memory allocation failure and -EDEADLK if an
    1149                 :            :          * attempt to obtain another state object ran into a &drm_modeset_lock
    1150                 :            :          * deadlock.
    1151                 :            :          */
    1152                 :            :         int (*atomic_check)(struct drm_plane *plane,
    1153                 :            :                             struct drm_plane_state *state);
    1154                 :            : 
    1155                 :            :         /**
    1156                 :            :          * @atomic_update:
    1157                 :            :          *
    1158                 :            :          * Drivers should use this function to update the plane state.  This
    1159                 :            :          * hook is called in-between the &drm_crtc_helper_funcs.atomic_begin and
    1160                 :            :          * drm_crtc_helper_funcs.atomic_flush callbacks.
    1161                 :            :          *
    1162                 :            :          * Note that the power state of the display pipe when this function is
    1163                 :            :          * called depends upon the exact helpers and calling sequence the driver
    1164                 :            :          * has picked. See drm_atomic_helper_commit_planes() for a discussion of
    1165                 :            :          * the tradeoffs and variants of plane commit helpers.
    1166                 :            :          *
    1167                 :            :          * This callback is used by the atomic modeset helpers and by the
    1168                 :            :          * transitional plane helpers, but it is optional.
    1169                 :            :          */
    1170                 :            :         void (*atomic_update)(struct drm_plane *plane,
    1171                 :            :                               struct drm_plane_state *old_state);
    1172                 :            :         /**
    1173                 :            :          * @atomic_disable:
    1174                 :            :          *
    1175                 :            :          * Drivers should use this function to unconditionally disable a plane.
    1176                 :            :          * This hook is called in-between the
    1177                 :            :          * &drm_crtc_helper_funcs.atomic_begin and
    1178                 :            :          * drm_crtc_helper_funcs.atomic_flush callbacks. It is an alternative to
    1179                 :            :          * @atomic_update, which will be called for disabling planes, too, if
    1180                 :            :          * the @atomic_disable hook isn't implemented.
    1181                 :            :          *
    1182                 :            :          * This hook is also useful to disable planes in preparation of a modeset,
    1183                 :            :          * by calling drm_atomic_helper_disable_planes_on_crtc() from the
    1184                 :            :          * &drm_crtc_helper_funcs.disable hook.
    1185                 :            :          *
    1186                 :            :          * Note that the power state of the display pipe when this function is
    1187                 :            :          * called depends upon the exact helpers and calling sequence the driver
    1188                 :            :          * has picked. See drm_atomic_helper_commit_planes() for a discussion of
    1189                 :            :          * the tradeoffs and variants of plane commit helpers.
    1190                 :            :          *
    1191                 :            :          * This callback is used by the atomic modeset helpers and by the
    1192                 :            :          * transitional plane helpers, but it is optional.
    1193                 :            :          */
    1194                 :            :         void (*atomic_disable)(struct drm_plane *plane,
    1195                 :            :                                struct drm_plane_state *old_state);
    1196                 :            : 
    1197                 :            :         /**
    1198                 :            :          * @atomic_async_check:
    1199                 :            :          *
    1200                 :            :          * Drivers should set this function pointer to check if the plane state
    1201                 :            :          * can be updated in a async fashion. Here async means "not vblank
    1202                 :            :          * synchronized".
    1203                 :            :          *
    1204                 :            :          * This hook is called by drm_atomic_async_check() to establish if a
    1205                 :            :          * given update can be committed asynchronously, that is, if it can
    1206                 :            :          * jump ahead of the state currently queued for update.
    1207                 :            :          *
    1208                 :            :          * RETURNS:
    1209                 :            :          *
    1210                 :            :          * Return 0 on success and any error returned indicates that the update
    1211                 :            :          * can not be applied in asynchronous manner.
    1212                 :            :          */
    1213                 :            :         int (*atomic_async_check)(struct drm_plane *plane,
    1214                 :            :                                   struct drm_plane_state *state);
    1215                 :            : 
    1216                 :            :         /**
    1217                 :            :          * @atomic_async_update:
    1218                 :            :          *
    1219                 :            :          * Drivers should set this function pointer to perform asynchronous
    1220                 :            :          * updates of planes, that is, jump ahead of the currently queued
    1221                 :            :          * state and update the plane. Here async means "not vblank
    1222                 :            :          * synchronized".
    1223                 :            :          *
    1224                 :            :          * This hook is called by drm_atomic_helper_async_commit().
    1225                 :            :          *
    1226                 :            :          * An async update will happen on legacy cursor updates. An async
    1227                 :            :          * update won't happen if there is an outstanding commit modifying
    1228                 :            :          * the same plane.
    1229                 :            :          *
    1230                 :            :          * Note that unlike &drm_plane_helper_funcs.atomic_update this hook
    1231                 :            :          * takes the new &drm_plane_state as parameter. When doing async_update
    1232                 :            :          * drivers shouldn't replace the &drm_plane_state but update the
    1233                 :            :          * current one with the new plane configurations in the new
    1234                 :            :          * plane_state.
    1235                 :            :          *
    1236                 :            :          * Drivers should also swap the framebuffers between current plane
    1237                 :            :          * state (&drm_plane.state) and new_state.
    1238                 :            :          * This is required since cleanup for async commits is performed on
    1239                 :            :          * the new state, rather than old state like for traditional commits.
    1240                 :            :          * Since we want to give up the reference on the current (old) fb
    1241                 :            :          * instead of our brand new one, swap them in the driver during the
    1242                 :            :          * async commit.
    1243                 :            :          *
    1244                 :            :          * FIXME:
    1245                 :            :          *  - It only works for single plane updates
    1246                 :            :          *  - Async Pageflips are not supported yet
    1247                 :            :          *  - Some hw might still scan out the old buffer until the next
    1248                 :            :          *    vblank, however we let go of the fb references as soon as
    1249                 :            :          *    we run this hook. For now drivers must implement their own workers
    1250                 :            :          *    for deferring if needed, until a common solution is created.
    1251                 :            :          */
    1252                 :            :         void (*atomic_async_update)(struct drm_plane *plane,
    1253                 :            :                                     struct drm_plane_state *new_state);
    1254                 :            : };
    1255                 :            : 
    1256                 :            : /**
    1257                 :            :  * drm_plane_helper_add - sets the helper vtable for a plane
    1258                 :            :  * @plane: DRM plane
    1259                 :            :  * @funcs: helper vtable to set for @plane
    1260                 :            :  */
    1261                 :          0 : static inline void drm_plane_helper_add(struct drm_plane *plane,
    1262                 :            :                                         const struct drm_plane_helper_funcs *funcs)
    1263                 :            : {
    1264                 :          0 :         plane->helper_private = funcs;
    1265                 :            : }
    1266                 :            : 
    1267                 :            : /**
    1268                 :            :  * struct drm_mode_config_helper_funcs - global modeset helper operations
    1269                 :            :  *
    1270                 :            :  * These helper functions are used by the atomic helpers.
    1271                 :            :  */
    1272                 :            : struct drm_mode_config_helper_funcs {
    1273                 :            :         /**
    1274                 :            :          * @atomic_commit_tail:
    1275                 :            :          *
    1276                 :            :          * This hook is used by the default atomic_commit() hook implemented in
    1277                 :            :          * drm_atomic_helper_commit() together with the nonblocking commit
    1278                 :            :          * helpers (see drm_atomic_helper_setup_commit() for a starting point)
    1279                 :            :          * to implement blocking and nonblocking commits easily. It is not used
    1280                 :            :          * by the atomic helpers
    1281                 :            :          *
    1282                 :            :          * This function is called when the new atomic state has already been
    1283                 :            :          * swapped into the various state pointers. The passed in state
    1284                 :            :          * therefore contains copies of the old/previous state. This hook should
    1285                 :            :          * commit the new state into hardware. Note that the helpers have
    1286                 :            :          * already waited for preceeding atomic commits and fences, but drivers
    1287                 :            :          * can add more waiting calls at the start of their implementation, e.g.
    1288                 :            :          * to wait for driver-internal request for implicit syncing, before
    1289                 :            :          * starting to commit the update to the hardware.
    1290                 :            :          *
    1291                 :            :          * After the atomic update is committed to the hardware this hook needs
    1292                 :            :          * to call drm_atomic_helper_commit_hw_done(). Then wait for the upate
    1293                 :            :          * to be executed by the hardware, for example using
    1294                 :            :          * drm_atomic_helper_wait_for_vblanks() or
    1295                 :            :          * drm_atomic_helper_wait_for_flip_done(), and then clean up the old
    1296                 :            :          * framebuffers using drm_atomic_helper_cleanup_planes().
    1297                 :            :          *
    1298                 :            :          * When disabling a CRTC this hook _must_ stall for the commit to
    1299                 :            :          * complete. Vblank waits don't work on disabled CRTC, hence the core
    1300                 :            :          * can't take care of this. And it also can't rely on the vblank event,
    1301                 :            :          * since that can be signalled already when the screen shows black,
    1302                 :            :          * which can happen much earlier than the last hardware access needed to
    1303                 :            :          * shut off the display pipeline completely.
    1304                 :            :          *
    1305                 :            :          * This hook is optional, the default implementation is
    1306                 :            :          * drm_atomic_helper_commit_tail().
    1307                 :            :          */
    1308                 :            :         void (*atomic_commit_tail)(struct drm_atomic_state *state);
    1309                 :            : };
    1310                 :            : 
    1311                 :            : #endif

Generated by: LCOV version 1.14