Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright © 2006 Keith Packard
0003  * Copyright © 2007-2008 Dave Airlie
0004  * Copyright © 2007-2008 Intel Corporation
0005  *   Jesse Barnes <jesse.barnes@intel.com>
0006  *
0007  * Permission is hereby granted, free of charge, to any person obtaining a
0008  * copy of this software and associated documentation files (the "Software"),
0009  * to deal in the Software without restriction, including without limitation
0010  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0011  * and/or sell copies of the Software, and to permit persons to whom the
0012  * Software is furnished to do so, subject to the following conditions:
0013  *
0014  * The above copyright notice and this permission notice shall be included in
0015  * all copies or substantial portions of the Software.
0016  *
0017  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0018  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0019  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0020  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0021  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0022  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0023  * OTHER DEALINGS IN THE SOFTWARE.
0024  */
0025 #ifndef __DRM_CRTC_H__
0026 #define __DRM_CRTC_H__
0027 
0028 #include <linux/spinlock.h>
0029 #include <linux/types.h>
0030 #include <drm/drm_modeset_lock.h>
0031 #include <drm/drm_mode_object.h>
0032 #include <drm/drm_modes.h>
0033 #include <drm/drm_device.h>
0034 #include <drm/drm_plane.h>
0035 #include <drm/drm_debugfs_crc.h>
0036 #include <drm/drm_mode_config.h>
0037 
0038 struct drm_connector;
0039 struct drm_device;
0040 struct drm_framebuffer;
0041 struct drm_mode_set;
0042 struct drm_file;
0043 struct drm_printer;
0044 struct drm_self_refresh_data;
0045 struct device_node;
0046 struct edid;
0047 
0048 static inline int64_t U642I64(uint64_t val)
0049 {
0050     return (int64_t)*((int64_t *)&val);
0051 }
0052 static inline uint64_t I642U64(int64_t val)
0053 {
0054     return (uint64_t)*((uint64_t *)&val);
0055 }
0056 
0057 struct drm_crtc;
0058 struct drm_pending_vblank_event;
0059 struct drm_plane;
0060 struct drm_bridge;
0061 struct drm_atomic_state;
0062 
0063 struct drm_crtc_helper_funcs;
0064 struct drm_plane_helper_funcs;
0065 
0066 /**
0067  * struct drm_crtc_state - mutable CRTC state
0068  *
0069  * Note that the distinction between @enable and @active is rather subtle:
0070  * Flipping @active while @enable is set without changing anything else may
0071  * never return in a failure from the &drm_mode_config_funcs.atomic_check
0072  * callback. Userspace assumes that a DPMS On will always succeed. In other
0073  * words: @enable controls resource assignment, @active controls the actual
0074  * hardware state.
0075  *
0076  * The three booleans active_changed, connectors_changed and mode_changed are
0077  * intended to indicate whether a full modeset is needed, rather than strictly
0078  * describing what has changed in a commit. See also:
0079  * drm_atomic_crtc_needs_modeset()
0080  *
0081  * WARNING: Transitional helpers (like drm_helper_crtc_mode_set() or
0082  * drm_helper_crtc_mode_set_base()) do not maintain many of the derived control
0083  * state like @plane_mask so drivers not converted over to atomic helpers should
0084  * not rely on these being accurate!
0085  */
0086 struct drm_crtc_state {
0087     /** @crtc: backpointer to the CRTC */
0088     struct drm_crtc *crtc;
0089 
0090     /**
0091      * @enable: Whether the CRTC should be enabled, gates all other state.
0092      * This controls reservations of shared resources. Actual hardware state
0093      * is controlled by @active.
0094      */
0095     bool enable;
0096 
0097     /**
0098      * @active: Whether the CRTC is actively displaying (used for DPMS).
0099      * Implies that @enable is set. The driver must not release any shared
0100      * resources if @active is set to false but @enable still true, because
0101      * userspace expects that a DPMS ON always succeeds.
0102      *
0103      * Hence drivers must not consult @active in their various
0104      * &drm_mode_config_funcs.atomic_check callback to reject an atomic
0105      * commit. They can consult it to aid in the computation of derived
0106      * hardware state, since even in the DPMS OFF state the display hardware
0107      * should be as much powered down as when the CRTC is completely
0108      * disabled through setting @enable to false.
0109      */
0110     bool active;
0111 
0112     /**
0113      * @planes_changed: Planes on this crtc are updated. Used by the atomic
0114      * helpers and drivers to steer the atomic commit control flow.
0115      */
0116     bool planes_changed : 1;
0117 
0118     /**
0119      * @mode_changed: @mode or @enable has been changed. Used by the atomic
0120      * helpers and drivers to steer the atomic commit control flow. See also
0121      * drm_atomic_crtc_needs_modeset().
0122      *
0123      * Drivers are supposed to set this for any CRTC state changes that
0124      * require a full modeset. They can also reset it to false if e.g. a
0125      * @mode change can be done without a full modeset by only changing
0126      * scaler settings.
0127      */
0128     bool mode_changed : 1;
0129 
0130     /**
0131      * @active_changed: @active has been toggled. Used by the atomic
0132      * helpers and drivers to steer the atomic commit control flow. See also
0133      * drm_atomic_crtc_needs_modeset().
0134      */
0135     bool active_changed : 1;
0136 
0137     /**
0138      * @connectors_changed: Connectors to this crtc have been updated,
0139      * either in their state or routing. Used by the atomic
0140      * helpers and drivers to steer the atomic commit control flow. See also
0141      * drm_atomic_crtc_needs_modeset().
0142      *
0143      * Drivers are supposed to set this as-needed from their own atomic
0144      * check code, e.g. from &drm_encoder_helper_funcs.atomic_check
0145      */
0146     bool connectors_changed : 1;
0147     /**
0148      * @zpos_changed: zpos values of planes on this crtc have been updated.
0149      * Used by the atomic helpers and drivers to steer the atomic commit
0150      * control flow.
0151      */
0152     bool zpos_changed : 1;
0153     /**
0154      * @color_mgmt_changed: Color management properties have changed
0155      * (@gamma_lut, @degamma_lut or @ctm). Used by the atomic helpers and
0156      * drivers to steer the atomic commit control flow.
0157      */
0158     bool color_mgmt_changed : 1;
0159 
0160     /**
0161      * @no_vblank:
0162      *
0163      * Reflects the ability of a CRTC to send VBLANK events. This state
0164      * usually depends on the pipeline configuration. If set to true, DRM
0165      * atomic helpers will send out a fake VBLANK event during display
0166      * updates after all hardware changes have been committed. This is
0167      * implemented in drm_atomic_helper_fake_vblank().
0168      *
0169      * One usage is for drivers and/or hardware without support for VBLANK
0170      * interrupts. Such drivers typically do not initialize vblanking
0171      * (i.e., call drm_vblank_init() with the number of CRTCs). For CRTCs
0172      * without initialized vblanking, this field is set to true in
0173      * drm_atomic_helper_check_modeset(), and a fake VBLANK event will be
0174      * send out on each update of the display pipeline by
0175      * drm_atomic_helper_fake_vblank().
0176      *
0177      * Another usage is CRTCs feeding a writeback connector operating in
0178      * oneshot mode. In this case the fake VBLANK event is only generated
0179      * when a job is queued to the writeback connector, and we want the
0180      * core to fake VBLANK events when this part of the pipeline hasn't
0181      * changed but others had or when the CRTC and connectors are being
0182      * disabled.
0183      *
0184      * __drm_atomic_helper_crtc_duplicate_state() will not reset the value
0185      * from the current state, the CRTC driver is then responsible for
0186      * updating this field when needed.
0187      *
0188      * Note that the combination of &drm_crtc_state.event == NULL and
0189      * &drm_crtc_state.no_blank == true is valid and usually used when the
0190      * writeback connector attached to the CRTC has a new job queued. In
0191      * this case the driver will send the VBLANK event on its own when the
0192      * writeback job is complete.
0193      */
0194     bool no_vblank : 1;
0195 
0196     /**
0197      * @plane_mask: Bitmask of drm_plane_mask(plane) of planes attached to
0198      * this CRTC.
0199      */
0200     u32 plane_mask;
0201 
0202     /**
0203      * @connector_mask: Bitmask of drm_connector_mask(connector) of
0204      * connectors attached to this CRTC.
0205      */
0206     u32 connector_mask;
0207 
0208     /**
0209      * @encoder_mask: Bitmask of drm_encoder_mask(encoder) of encoders
0210      * attached to this CRTC.
0211      */
0212     u32 encoder_mask;
0213 
0214     /**
0215      * @adjusted_mode:
0216      *
0217      * Internal display timings which can be used by the driver to handle
0218      * differences between the mode requested by userspace in @mode and what
0219      * is actually programmed into the hardware.
0220      *
0221      * For drivers using &drm_bridge, this stores hardware display timings
0222      * used between the CRTC and the first bridge. For other drivers, the
0223      * meaning of the adjusted_mode field is purely driver implementation
0224      * defined information, and will usually be used to store the hardware
0225      * display timings used between the CRTC and encoder blocks.
0226      */
0227     struct drm_display_mode adjusted_mode;
0228 
0229     /**
0230      * @mode:
0231      *
0232      * Display timings requested by userspace. The driver should try to
0233      * match the refresh rate as close as possible (but note that it's
0234      * undefined what exactly is close enough, e.g. some of the HDMI modes
0235      * only differ in less than 1% of the refresh rate). The active width
0236      * and height as observed by userspace for positioning planes must match
0237      * exactly.
0238      *
0239      * For external connectors where the sink isn't fixed (like with a
0240      * built-in panel), this mode here should match the physical mode on the
0241      * wire to the last details (i.e. including sync polarities and
0242      * everything).
0243      */
0244     struct drm_display_mode mode;
0245 
0246     /**
0247      * @mode_blob: &drm_property_blob for @mode, for exposing the mode to
0248      * atomic userspace.
0249      */
0250     struct drm_property_blob *mode_blob;
0251 
0252     /**
0253      * @degamma_lut:
0254      *
0255      * Lookup table for converting framebuffer pixel data before apply the
0256      * color conversion matrix @ctm. See drm_crtc_enable_color_mgmt(). The
0257      * blob (if not NULL) is an array of &struct drm_color_lut.
0258      */
0259     struct drm_property_blob *degamma_lut;
0260 
0261     /**
0262      * @ctm:
0263      *
0264      * Color transformation matrix. See drm_crtc_enable_color_mgmt(). The
0265      * blob (if not NULL) is a &struct drm_color_ctm.
0266      */
0267     struct drm_property_blob *ctm;
0268 
0269     /**
0270      * @gamma_lut:
0271      *
0272      * Lookup table for converting pixel data after the color conversion
0273      * matrix @ctm.  See drm_crtc_enable_color_mgmt(). The blob (if not
0274      * NULL) is an array of &struct drm_color_lut.
0275      *
0276      * Note that for mostly historical reasons stemming from Xorg heritage,
0277      * this is also used to store the color map (also sometimes color lut,
0278      * CLUT or color palette) for indexed formats like DRM_FORMAT_C8.
0279      */
0280     struct drm_property_blob *gamma_lut;
0281 
0282     /**
0283      * @target_vblank:
0284      *
0285      * Target vertical blank period when a page flip
0286      * should take effect.
0287      */
0288     u32 target_vblank;
0289 
0290     /**
0291      * @async_flip:
0292      *
0293      * This is set when DRM_MODE_PAGE_FLIP_ASYNC is set in the legacy
0294      * PAGE_FLIP IOCTL. It's not wired up for the atomic IOCTL itself yet.
0295      */
0296     bool async_flip;
0297 
0298     /**
0299      * @vrr_enabled:
0300      *
0301      * Indicates if variable refresh rate should be enabled for the CRTC.
0302      * Support for the requested vrr state will depend on driver and
0303      * hardware capabiltiy - lacking support is not treated as failure.
0304      */
0305     bool vrr_enabled;
0306 
0307     /**
0308      * @self_refresh_active:
0309      *
0310      * Used by the self refresh helpers to denote when a self refresh
0311      * transition is occurring. This will be set on enable/disable callbacks
0312      * when self refresh is being enabled or disabled. In some cases, it may
0313      * not be desirable to fully shut off the crtc during self refresh.
0314      * CRTC's can inspect this flag and determine the best course of action.
0315      */
0316     bool self_refresh_active;
0317 
0318     /**
0319      * @scaling_filter:
0320      *
0321      * Scaling filter to be applied
0322      */
0323     enum drm_scaling_filter scaling_filter;
0324 
0325     /**
0326      * @event:
0327      *
0328      * Optional pointer to a DRM event to signal upon completion of the
0329      * state update. The driver must send out the event when the atomic
0330      * commit operation completes. There are two cases:
0331      *
0332      *  - The event is for a CRTC which is being disabled through this
0333      *    atomic commit. In that case the event can be send out any time
0334      *    after the hardware has stopped scanning out the current
0335      *    framebuffers. It should contain the timestamp and counter for the
0336      *    last vblank before the display pipeline was shut off. The simplest
0337      *    way to achieve that is calling drm_crtc_send_vblank_event()
0338      *    somewhen after drm_crtc_vblank_off() has been called.
0339      *
0340      *  - For a CRTC which is enabled at the end of the commit (even when it
0341      *    undergoes an full modeset) the vblank timestamp and counter must
0342      *    be for the vblank right before the first frame that scans out the
0343      *    new set of buffers. Again the event can only be sent out after the
0344      *    hardware has stopped scanning out the old buffers.
0345      *
0346      *  - Events for disabled CRTCs are not allowed, and drivers can ignore
0347      *    that case.
0348      *
0349      * For very simple hardware without VBLANK interrupt, enabling
0350      * &struct drm_crtc_state.no_vblank makes DRM's atomic commit helpers
0351      * send a fake VBLANK event at the end of the display update after all
0352      * hardware changes have been applied. See
0353      * drm_atomic_helper_fake_vblank().
0354      *
0355      * For more complex hardware this
0356      * can be handled by the drm_crtc_send_vblank_event() function,
0357      * which the driver should call on the provided event upon completion of
0358      * the atomic commit. Note that if the driver supports vblank signalling
0359      * and timestamping the vblank counters and timestamps must agree with
0360      * the ones returned from page flip events. With the current vblank
0361      * helper infrastructure this can be achieved by holding a vblank
0362      * reference while the page flip is pending, acquired through
0363      * drm_crtc_vblank_get() and released with drm_crtc_vblank_put().
0364      * Drivers are free to implement their own vblank counter and timestamp
0365      * tracking though, e.g. if they have accurate timestamp registers in
0366      * hardware.
0367      *
0368      * For hardware which supports some means to synchronize vblank
0369      * interrupt delivery with committing display state there's also
0370      * drm_crtc_arm_vblank_event(). See the documentation of that function
0371      * for a detailed discussion of the constraints it needs to be used
0372      * safely.
0373      *
0374      * If the device can't notify of flip completion in a race-free way
0375      * at all, then the event should be armed just after the page flip is
0376      * committed. In the worst case the driver will send the event to
0377      * userspace one frame too late. This doesn't allow for a real atomic
0378      * update, but it should avoid tearing.
0379      */
0380     struct drm_pending_vblank_event *event;
0381 
0382     /**
0383      * @commit:
0384      *
0385      * This tracks how the commit for this update proceeds through the
0386      * various phases. This is never cleared, except when we destroy the
0387      * state, so that subsequent commits can synchronize with previous ones.
0388      */
0389     struct drm_crtc_commit *commit;
0390 
0391     /** @state: backpointer to global drm_atomic_state */
0392     struct drm_atomic_state *state;
0393 };
0394 
0395 /**
0396  * struct drm_crtc_funcs - control CRTCs for a given device
0397  *
0398  * The drm_crtc_funcs structure is the central CRTC management structure
0399  * in the DRM.  Each CRTC controls one or more connectors (note that the name
0400  * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc.
0401  * connectors, not just CRTs).
0402  *
0403  * Each driver is responsible for filling out this structure at startup time,
0404  * in addition to providing other modesetting features, like i2c and DDC
0405  * bus accessors.
0406  */
0407 struct drm_crtc_funcs {
0408     /**
0409      * @reset:
0410      *
0411      * Reset CRTC hardware and software state to off. This function isn't
0412      * called by the core directly, only through drm_mode_config_reset().
0413      * It's not a helper hook only for historical reasons.
0414      *
0415      * Atomic drivers can use drm_atomic_helper_crtc_reset() to reset
0416      * atomic state using this hook.
0417      */
0418     void (*reset)(struct drm_crtc *crtc);
0419 
0420     /**
0421      * @cursor_set:
0422      *
0423      * Update the cursor image. The cursor position is relative to the CRTC
0424      * and can be partially or fully outside of the visible area.
0425      *
0426      * Note that contrary to all other KMS functions the legacy cursor entry
0427      * points don't take a framebuffer object, but instead take directly a
0428      * raw buffer object id from the driver's buffer manager (which is
0429      * either GEM or TTM for current drivers).
0430      *
0431      * This entry point is deprecated, drivers should instead implement
0432      * universal plane support and register a proper cursor plane using
0433      * drm_crtc_init_with_planes().
0434      *
0435      * This callback is optional
0436      *
0437      * RETURNS:
0438      *
0439      * 0 on success or a negative error code on failure.
0440      */
0441     int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
0442               uint32_t handle, uint32_t width, uint32_t height);
0443 
0444     /**
0445      * @cursor_set2:
0446      *
0447      * Update the cursor image, including hotspot information. The hotspot
0448      * must not affect the cursor position in CRTC coordinates, but is only
0449      * meant as a hint for virtualized display hardware to coordinate the
0450      * guests and hosts cursor position. The cursor hotspot is relative to
0451      * the cursor image. Otherwise this works exactly like @cursor_set.
0452      *
0453      * This entry point is deprecated, drivers should instead implement
0454      * universal plane support and register a proper cursor plane using
0455      * drm_crtc_init_with_planes().
0456      *
0457      * This callback is optional.
0458      *
0459      * RETURNS:
0460      *
0461      * 0 on success or a negative error code on failure.
0462      */
0463     int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
0464                uint32_t handle, uint32_t width, uint32_t height,
0465                int32_t hot_x, int32_t hot_y);
0466 
0467     /**
0468      * @cursor_move:
0469      *
0470      * Update the cursor position. The cursor does not need to be visible
0471      * when this hook is called.
0472      *
0473      * This entry point is deprecated, drivers should instead implement
0474      * universal plane support and register a proper cursor plane using
0475      * drm_crtc_init_with_planes().
0476      *
0477      * This callback is optional.
0478      *
0479      * RETURNS:
0480      *
0481      * 0 on success or a negative error code on failure.
0482      */
0483     int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
0484 
0485     /**
0486      * @gamma_set:
0487      *
0488      * Set gamma on the CRTC.
0489      *
0490      * This callback is optional.
0491      *
0492      * Atomic drivers who want to support gamma tables should implement the
0493      * atomic color management support, enabled by calling
0494      * drm_crtc_enable_color_mgmt(), which then supports the legacy gamma
0495      * interface through the drm_atomic_helper_legacy_gamma_set()
0496      * compatibility implementation.
0497      */
0498     int (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
0499              uint32_t size,
0500              struct drm_modeset_acquire_ctx *ctx);
0501 
0502     /**
0503      * @destroy:
0504      *
0505      * Clean up CRTC resources. This is only called at driver unload time
0506      * through drm_mode_config_cleanup() since a CRTC cannot be hotplugged
0507      * in DRM.
0508      */
0509     void (*destroy)(struct drm_crtc *crtc);
0510 
0511     /**
0512      * @set_config:
0513      *
0514      * This is the main legacy entry point to change the modeset state on a
0515      * CRTC. All the details of the desired configuration are passed in a
0516      * &struct drm_mode_set - see there for details.
0517      *
0518      * Drivers implementing atomic modeset should use
0519      * drm_atomic_helper_set_config() to implement this hook.
0520      *
0521      * RETURNS:
0522      *
0523      * 0 on success or a negative error code on failure.
0524      */
0525     int (*set_config)(struct drm_mode_set *set,
0526               struct drm_modeset_acquire_ctx *ctx);
0527 
0528     /**
0529      * @page_flip:
0530      *
0531      * Legacy entry point to schedule a flip to the given framebuffer.
0532      *
0533      * Page flipping is a synchronization mechanism that replaces the frame
0534      * buffer being scanned out by the CRTC with a new frame buffer during
0535      * vertical blanking, avoiding tearing (except when requested otherwise
0536      * through the DRM_MODE_PAGE_FLIP_ASYNC flag). When an application
0537      * requests a page flip the DRM core verifies that the new frame buffer
0538      * is large enough to be scanned out by the CRTC in the currently
0539      * configured mode and then calls this hook with a pointer to the new
0540      * frame buffer.
0541      *
0542      * The driver must wait for any pending rendering to the new framebuffer
0543      * to complete before executing the flip. It should also wait for any
0544      * pending rendering from other drivers if the underlying buffer is a
0545      * shared dma-buf.
0546      *
0547      * An application can request to be notified when the page flip has
0548      * completed. The drm core will supply a &struct drm_event in the event
0549      * parameter in this case. This can be handled by the
0550      * drm_crtc_send_vblank_event() function, which the driver should call on
0551      * the provided event upon completion of the flip. Note that if
0552      * the driver supports vblank signalling and timestamping the vblank
0553      * counters and timestamps must agree with the ones returned from page
0554      * flip events. With the current vblank helper infrastructure this can
0555      * be achieved by holding a vblank reference while the page flip is
0556      * pending, acquired through drm_crtc_vblank_get() and released with
0557      * drm_crtc_vblank_put(). Drivers are free to implement their own vblank
0558      * counter and timestamp tracking though, e.g. if they have accurate
0559      * timestamp registers in hardware.
0560      *
0561      * This callback is optional.
0562      *
0563      * NOTE:
0564      *
0565      * Very early versions of the KMS ABI mandated that the driver must
0566      * block (but not reject) any rendering to the old framebuffer until the
0567      * flip operation has completed and the old framebuffer is no longer
0568      * visible. This requirement has been lifted, and userspace is instead
0569      * expected to request delivery of an event and wait with recycling old
0570      * buffers until such has been received.
0571      *
0572      * RETURNS:
0573      *
0574      * 0 on success or a negative error code on failure. Note that if a
0575      * page flip operation is already pending the callback should return
0576      * -EBUSY. Pageflips on a disabled CRTC (either by setting a NULL mode
0577      * or just runtime disabled through DPMS respectively the new atomic
0578      * "ACTIVE" state) should result in an -EINVAL error code. Note that
0579      * drm_atomic_helper_page_flip() checks this already for atomic drivers.
0580      */
0581     int (*page_flip)(struct drm_crtc *crtc,
0582              struct drm_framebuffer *fb,
0583              struct drm_pending_vblank_event *event,
0584              uint32_t flags,
0585              struct drm_modeset_acquire_ctx *ctx);
0586 
0587     /**
0588      * @page_flip_target:
0589      *
0590      * Same as @page_flip but with an additional parameter specifying the
0591      * absolute target vertical blank period (as reported by
0592      * drm_crtc_vblank_count()) when the flip should take effect.
0593      *
0594      * Note that the core code calls drm_crtc_vblank_get before this entry
0595      * point, and will call drm_crtc_vblank_put if this entry point returns
0596      * any non-0 error code. It's the driver's responsibility to call
0597      * drm_crtc_vblank_put after this entry point returns 0, typically when
0598      * the flip completes.
0599      */
0600     int (*page_flip_target)(struct drm_crtc *crtc,
0601                 struct drm_framebuffer *fb,
0602                 struct drm_pending_vblank_event *event,
0603                 uint32_t flags, uint32_t target,
0604                 struct drm_modeset_acquire_ctx *ctx);
0605 
0606     /**
0607      * @set_property:
0608      *
0609      * This is the legacy entry point to update a property attached to the
0610      * CRTC.
0611      *
0612      * This callback is optional if the driver does not support any legacy
0613      * driver-private properties. For atomic drivers it is not used because
0614      * property handling is done entirely in the DRM core.
0615      *
0616      * RETURNS:
0617      *
0618      * 0 on success or a negative error code on failure.
0619      */
0620     int (*set_property)(struct drm_crtc *crtc,
0621                 struct drm_property *property, uint64_t val);
0622 
0623     /**
0624      * @atomic_duplicate_state:
0625      *
0626      * Duplicate the current atomic state for this CRTC and return it.
0627      * The core and helpers guarantee that any atomic state duplicated with
0628      * this hook and still owned by the caller (i.e. not transferred to the
0629      * driver by calling &drm_mode_config_funcs.atomic_commit) will be
0630      * cleaned up by calling the @atomic_destroy_state hook in this
0631      * structure.
0632      *
0633      * This callback is mandatory for atomic drivers.
0634      *
0635      * Atomic drivers which don't subclass &struct drm_crtc_state should use
0636      * drm_atomic_helper_crtc_duplicate_state(). Drivers that subclass the
0637      * state structure to extend it with driver-private state should use
0638      * __drm_atomic_helper_crtc_duplicate_state() to make sure shared state is
0639      * duplicated in a consistent fashion across drivers.
0640      *
0641      * It is an error to call this hook before &drm_crtc.state has been
0642      * initialized correctly.
0643      *
0644      * NOTE:
0645      *
0646      * If the duplicate state references refcounted resources this hook must
0647      * acquire a reference for each of them. The driver must release these
0648      * references again in @atomic_destroy_state.
0649      *
0650      * RETURNS:
0651      *
0652      * Duplicated atomic state or NULL when the allocation failed.
0653      */
0654     struct drm_crtc_state *(*atomic_duplicate_state)(struct drm_crtc *crtc);
0655 
0656     /**
0657      * @atomic_destroy_state:
0658      *
0659      * Destroy a state duplicated with @atomic_duplicate_state and release
0660      * or unreference all resources it references
0661      *
0662      * This callback is mandatory for atomic drivers.
0663      */
0664     void (*atomic_destroy_state)(struct drm_crtc *crtc,
0665                      struct drm_crtc_state *state);
0666 
0667     /**
0668      * @atomic_set_property:
0669      *
0670      * Decode a driver-private property value and store the decoded value
0671      * into the passed-in state structure. Since the atomic core decodes all
0672      * standardized properties (even for extensions beyond the core set of
0673      * properties which might not be implemented by all drivers) this
0674      * requires drivers to subclass the state structure.
0675      *
0676      * Such driver-private properties should really only be implemented for
0677      * truly hardware/vendor specific state. Instead it is preferred to
0678      * standardize atomic extension and decode the properties used to expose
0679      * such an extension in the core.
0680      *
0681      * Do not call this function directly, use
0682      * drm_atomic_crtc_set_property() instead.
0683      *
0684      * This callback is optional if the driver does not support any
0685      * driver-private atomic properties.
0686      *
0687      * NOTE:
0688      *
0689      * This function is called in the state assembly phase of atomic
0690      * modesets, which can be aborted for any reason (including on
0691      * userspace's request to just check whether a configuration would be
0692      * possible). Drivers MUST NOT touch any persistent state (hardware or
0693      * software) or data structures except the passed in @state parameter.
0694      *
0695      * Also since userspace controls in which order properties are set this
0696      * function must not do any input validation (since the state update is
0697      * incomplete and hence likely inconsistent). Instead any such input
0698      * validation must be done in the various atomic_check callbacks.
0699      *
0700      * RETURNS:
0701      *
0702      * 0 if the property has been found, -EINVAL if the property isn't
0703      * implemented by the driver (which should never happen, the core only
0704      * asks for properties attached to this CRTC). No other validation is
0705      * allowed by the driver. The core already checks that the property
0706      * value is within the range (integer, valid enum value, ...) the driver
0707      * set when registering the property.
0708      */
0709     int (*atomic_set_property)(struct drm_crtc *crtc,
0710                    struct drm_crtc_state *state,
0711                    struct drm_property *property,
0712                    uint64_t val);
0713     /**
0714      * @atomic_get_property:
0715      *
0716      * Reads out the decoded driver-private property. This is used to
0717      * implement the GETCRTC IOCTL.
0718      *
0719      * Do not call this function directly, use
0720      * drm_atomic_crtc_get_property() instead.
0721      *
0722      * This callback is optional if the driver does not support any
0723      * driver-private atomic properties.
0724      *
0725      * RETURNS:
0726      *
0727      * 0 on success, -EINVAL if the property isn't implemented by the
0728      * driver (which should never happen, the core only asks for
0729      * properties attached to this CRTC).
0730      */
0731     int (*atomic_get_property)(struct drm_crtc *crtc,
0732                    const struct drm_crtc_state *state,
0733                    struct drm_property *property,
0734                    uint64_t *val);
0735 
0736     /**
0737      * @late_register:
0738      *
0739      * This optional hook can be used to register additional userspace
0740      * interfaces attached to the crtc like debugfs interfaces.
0741      * It is called late in the driver load sequence from drm_dev_register().
0742      * Everything added from this callback should be unregistered in
0743      * the early_unregister callback.
0744      *
0745      * Returns:
0746      *
0747      * 0 on success, or a negative error code on failure.
0748      */
0749     int (*late_register)(struct drm_crtc *crtc);
0750 
0751     /**
0752      * @early_unregister:
0753      *
0754      * This optional hook should be used to unregister the additional
0755      * userspace interfaces attached to the crtc from
0756      * @late_register. It is called from drm_dev_unregister(),
0757      * early in the driver unload sequence to disable userspace access
0758      * before data structures are torndown.
0759      */
0760     void (*early_unregister)(struct drm_crtc *crtc);
0761 
0762     /**
0763      * @set_crc_source:
0764      *
0765      * Changes the source of CRC checksums of frames at the request of
0766      * userspace, typically for testing purposes. The sources available are
0767      * specific of each driver and a %NULL value indicates that CRC
0768      * generation is to be switched off.
0769      *
0770      * When CRC generation is enabled, the driver should call
0771      * drm_crtc_add_crc_entry() at each frame, providing any information
0772      * that characterizes the frame contents in the crcN arguments, as
0773      * provided from the configured source. Drivers must accept an "auto"
0774      * source name that will select a default source for this CRTC.
0775      *
0776      * This may trigger an atomic modeset commit if necessary, to enable CRC
0777      * generation.
0778      *
0779      * Note that "auto" can depend upon the current modeset configuration,
0780      * e.g. it could pick an encoder or output specific CRC sampling point.
0781      *
0782      * This callback is optional if the driver does not support any CRC
0783      * generation functionality.
0784      *
0785      * RETURNS:
0786      *
0787      * 0 on success or a negative error code on failure.
0788      */
0789     int (*set_crc_source)(struct drm_crtc *crtc, const char *source);
0790 
0791     /**
0792      * @verify_crc_source:
0793      *
0794      * verifies the source of CRC checksums of frames before setting the
0795      * source for CRC and during crc open. Source parameter can be NULL
0796      * while disabling crc source.
0797      *
0798      * This callback is optional if the driver does not support any CRC
0799      * generation functionality.
0800      *
0801      * RETURNS:
0802      *
0803      * 0 on success or a negative error code on failure.
0804      */
0805     int (*verify_crc_source)(struct drm_crtc *crtc, const char *source,
0806                  size_t *values_cnt);
0807     /**
0808      * @get_crc_sources:
0809      *
0810      * Driver callback for getting a list of all the available sources for
0811      * CRC generation. This callback depends upon verify_crc_source, So
0812      * verify_crc_source callback should be implemented before implementing
0813      * this. Driver can pass full list of available crc sources, this
0814      * callback does the verification on each crc-source before passing it
0815      * to userspace.
0816      *
0817      * This callback is optional if the driver does not support exporting of
0818      * possible CRC sources list.
0819      *
0820      * RETURNS:
0821      *
0822      * a constant character pointer to the list of all the available CRC
0823      * sources. On failure driver should return NULL. count should be
0824      * updated with number of sources in list. if zero we don't process any
0825      * source from the list.
0826      */
0827     const char *const *(*get_crc_sources)(struct drm_crtc *crtc,
0828                           size_t *count);
0829 
0830     /**
0831      * @atomic_print_state:
0832      *
0833      * If driver subclasses &struct drm_crtc_state, it should implement
0834      * this optional hook for printing additional driver specific state.
0835      *
0836      * Do not call this directly, use drm_atomic_crtc_print_state()
0837      * instead.
0838      */
0839     void (*atomic_print_state)(struct drm_printer *p,
0840                    const struct drm_crtc_state *state);
0841 
0842     /**
0843      * @get_vblank_counter:
0844      *
0845      * Driver callback for fetching a raw hardware vblank counter for the
0846      * CRTC. It's meant to be used by new drivers as the replacement of
0847      * &drm_driver.get_vblank_counter hook.
0848      *
0849      * This callback is optional. If a device doesn't have a hardware
0850      * counter, the driver can simply leave the hook as NULL. The DRM core
0851      * will account for missed vblank events while interrupts where disabled
0852      * based on system timestamps.
0853      *
0854      * Wraparound handling and loss of events due to modesetting is dealt
0855      * with in the DRM core code, as long as drivers call
0856      * drm_crtc_vblank_off() and drm_crtc_vblank_on() when disabling or
0857      * enabling a CRTC.
0858      *
0859      * See also &drm_device.vblank_disable_immediate and
0860      * &drm_device.max_vblank_count.
0861      *
0862      * Returns:
0863      *
0864      * Raw vblank counter value.
0865      */
0866     u32 (*get_vblank_counter)(struct drm_crtc *crtc);
0867 
0868     /**
0869      * @enable_vblank:
0870      *
0871      * Enable vblank interrupts for the CRTC. It's meant to be used by
0872      * new drivers as the replacement of &drm_driver.enable_vblank hook.
0873      *
0874      * Returns:
0875      *
0876      * Zero on success, appropriate errno if the vblank interrupt cannot
0877      * be enabled.
0878      */
0879     int (*enable_vblank)(struct drm_crtc *crtc);
0880 
0881     /**
0882      * @disable_vblank:
0883      *
0884      * Disable vblank interrupts for the CRTC. It's meant to be used by
0885      * new drivers as the replacement of &drm_driver.disable_vblank hook.
0886      */
0887     void (*disable_vblank)(struct drm_crtc *crtc);
0888 
0889     /**
0890      * @get_vblank_timestamp:
0891      *
0892      * Called by drm_get_last_vbltimestamp(). Should return a precise
0893      * timestamp when the most recent vblank interval ended or will end.
0894      *
0895      * Specifically, the timestamp in @vblank_time should correspond as
0896      * closely as possible to the time when the first video scanline of
0897      * the video frame after the end of vblank will start scanning out,
0898      * the time immediately after end of the vblank interval. If the
0899      * @crtc is currently inside vblank, this will be a time in the future.
0900      * If the @crtc is currently scanning out a frame, this will be the
0901      * past start time of the current scanout. This is meant to adhere
0902      * to the OpenML OML_sync_control extension specification.
0903      *
0904      * Parameters:
0905      *
0906      * crtc:
0907      *     CRTC for which timestamp should be returned.
0908      * max_error:
0909      *     Maximum allowable timestamp error in nanoseconds.
0910      *     Implementation should strive to provide timestamp
0911      *     with an error of at most max_error nanoseconds.
0912      *     Returns true upper bound on error for timestamp.
0913      * vblank_time:
0914      *     Target location for returned vblank timestamp.
0915      * in_vblank_irq:
0916      *     True when called from drm_crtc_handle_vblank().  Some drivers
0917      *     need to apply some workarounds for gpu-specific vblank irq quirks
0918      *     if flag is set.
0919      *
0920      * Returns:
0921      *
0922      * True on success, false on failure, which means the core should
0923      * fallback to a simple timestamp taken in drm_crtc_handle_vblank().
0924      */
0925     bool (*get_vblank_timestamp)(struct drm_crtc *crtc,
0926                      int *max_error,
0927                      ktime_t *vblank_time,
0928                      bool in_vblank_irq);
0929 };
0930 
0931 /**
0932  * struct drm_crtc - central CRTC control structure
0933  *
0934  * Each CRTC may have one or more connectors associated with it.  This structure
0935  * allows the CRTC to be controlled.
0936  */
0937 struct drm_crtc {
0938     /** @dev: parent DRM device */
0939     struct drm_device *dev;
0940     /** @port: OF node used by drm_of_find_possible_crtcs(). */
0941     struct device_node *port;
0942     /**
0943      * @head:
0944      *
0945      * List of all CRTCs on @dev, linked from &drm_mode_config.crtc_list.
0946      * Invariant over the lifetime of @dev and therefore does not need
0947      * locking.
0948      */
0949     struct list_head head;
0950 
0951     /** @name: human readable name, can be overwritten by the driver */
0952     char *name;
0953 
0954     /**
0955      * @mutex:
0956      *
0957      * This provides a read lock for the overall CRTC state (mode, dpms
0958      * state, ...) and a write lock for everything which can be update
0959      * without a full modeset (fb, cursor data, CRTC properties ...). A full
0960      * modeset also need to grab &drm_mode_config.connection_mutex.
0961      *
0962      * For atomic drivers specifically this protects @state.
0963      */
0964     struct drm_modeset_lock mutex;
0965 
0966     /** @base: base KMS object for ID tracking etc. */
0967     struct drm_mode_object base;
0968 
0969     /**
0970      * @primary:
0971      * Primary plane for this CRTC. Note that this is only
0972      * relevant for legacy IOCTL, it specifies the plane implicitly used by
0973      * the SETCRTC and PAGE_FLIP IOCTLs. It does not have any significance
0974      * beyond that.
0975      */
0976     struct drm_plane *primary;
0977 
0978     /**
0979      * @cursor:
0980      * Cursor plane for this CRTC. Note that this is only relevant for
0981      * legacy IOCTL, it specifies the plane implicitly used by the SETCURSOR
0982      * and SETCURSOR2 IOCTLs. It does not have any significance
0983      * beyond that.
0984      */
0985     struct drm_plane *cursor;
0986 
0987     /**
0988      * @index: Position inside the mode_config.list, can be used as an array
0989      * index. It is invariant over the lifetime of the CRTC.
0990      */
0991     unsigned index;
0992 
0993     /**
0994      * @cursor_x: Current x position of the cursor, used for universal
0995      * cursor planes because the SETCURSOR IOCTL only can update the
0996      * framebuffer without supplying the coordinates. Drivers should not use
0997      * this directly, atomic drivers should look at &drm_plane_state.crtc_x
0998      * of the cursor plane instead.
0999      */
1000     int cursor_x;
1001     /**
1002      * @cursor_y: Current y position of the cursor, used for universal
1003      * cursor planes because the SETCURSOR IOCTL only can update the
1004      * framebuffer without supplying the coordinates. Drivers should not use
1005      * this directly, atomic drivers should look at &drm_plane_state.crtc_y
1006      * of the cursor plane instead.
1007      */
1008     int cursor_y;
1009 
1010     /**
1011      * @enabled:
1012      *
1013      * Is this CRTC enabled? Should only be used by legacy drivers, atomic
1014      * drivers should instead consult &drm_crtc_state.enable and
1015      * &drm_crtc_state.active. Atomic drivers can update this by calling
1016      * drm_atomic_helper_update_legacy_modeset_state().
1017      */
1018     bool enabled;
1019 
1020     /**
1021      * @mode:
1022      *
1023      * Current mode timings. Should only be used by legacy drivers, atomic
1024      * drivers should instead consult &drm_crtc_state.mode. Atomic drivers
1025      * can update this by calling
1026      * drm_atomic_helper_update_legacy_modeset_state().
1027      */
1028     struct drm_display_mode mode;
1029 
1030     /**
1031      * @hwmode:
1032      *
1033      * Programmed mode in hw, after adjustments for encoders, crtc, panel
1034      * scaling etc. Should only be used by legacy drivers, for high
1035      * precision vblank timestamps in
1036      * drm_crtc_vblank_helper_get_vblank_timestamp().
1037      *
1038      * Note that atomic drivers should not use this, but instead use
1039      * &drm_crtc_state.adjusted_mode. And for high-precision timestamps
1040      * drm_crtc_vblank_helper_get_vblank_timestamp() used
1041      * &drm_vblank_crtc.hwmode,
1042      * which is filled out by calling drm_calc_timestamping_constants().
1043      */
1044     struct drm_display_mode hwmode;
1045 
1046     /**
1047      * @x:
1048      * x position on screen. Should only be used by legacy drivers, atomic
1049      * drivers should look at &drm_plane_state.crtc_x of the primary plane
1050      * instead. Updated by calling
1051      * drm_atomic_helper_update_legacy_modeset_state().
1052      */
1053     int x;
1054     /**
1055      * @y:
1056      * y position on screen. Should only be used by legacy drivers, atomic
1057      * drivers should look at &drm_plane_state.crtc_y of the primary plane
1058      * instead. Updated by calling
1059      * drm_atomic_helper_update_legacy_modeset_state().
1060      */
1061     int y;
1062 
1063     /** @funcs: CRTC control functions */
1064     const struct drm_crtc_funcs *funcs;
1065 
1066     /**
1067      * @gamma_size: Size of legacy gamma ramp reported to userspace. Set up
1068      * by calling drm_mode_crtc_set_gamma_size().
1069      *
1070      * Note that atomic drivers need to instead use
1071      * &drm_crtc_state.gamma_lut. See drm_crtc_enable_color_mgmt().
1072      */
1073     uint32_t gamma_size;
1074 
1075     /**
1076      * @gamma_store: Gamma ramp values used by the legacy SETGAMMA and
1077      * GETGAMMA IOCTls. Set up by calling drm_mode_crtc_set_gamma_size().
1078      *
1079      * Note that atomic drivers need to instead use
1080      * &drm_crtc_state.gamma_lut. See drm_crtc_enable_color_mgmt().
1081      */
1082     uint16_t *gamma_store;
1083 
1084     /** @helper_private: mid-layer private data */
1085     const struct drm_crtc_helper_funcs *helper_private;
1086 
1087     /** @properties: property tracking for this CRTC */
1088     struct drm_object_properties properties;
1089 
1090     /**
1091      * @scaling_filter_property: property to apply a particular filter while
1092      * scaling.
1093      */
1094     struct drm_property *scaling_filter_property;
1095 
1096     /**
1097      * @state:
1098      *
1099      * Current atomic state for this CRTC.
1100      *
1101      * This is protected by @mutex. Note that nonblocking atomic commits
1102      * access the current CRTC state without taking locks. Either by going
1103      * through the &struct drm_atomic_state pointers, see
1104      * for_each_oldnew_crtc_in_state(), for_each_old_crtc_in_state() and
1105      * for_each_new_crtc_in_state(). Or through careful ordering of atomic
1106      * commit operations as implemented in the atomic helpers, see
1107      * &struct drm_crtc_commit.
1108      */
1109     struct drm_crtc_state *state;
1110 
1111     /**
1112      * @commit_list:
1113      *
1114      * List of &drm_crtc_commit structures tracking pending commits.
1115      * Protected by @commit_lock. This list holds its own full reference,
1116      * as does the ongoing commit.
1117      *
1118      * "Note that the commit for a state change is also tracked in
1119      * &drm_crtc_state.commit. For accessing the immediately preceding
1120      * commit in an atomic update it is recommended to just use that
1121      * pointer in the old CRTC state, since accessing that doesn't need
1122      * any locking or list-walking. @commit_list should only be used to
1123      * stall for framebuffer cleanup that's signalled through
1124      * &drm_crtc_commit.cleanup_done."
1125      */
1126     struct list_head commit_list;
1127 
1128     /**
1129      * @commit_lock:
1130      *
1131      * Spinlock to protect @commit_list.
1132      */
1133     spinlock_t commit_lock;
1134 
1135     /**
1136      * @debugfs_entry:
1137      *
1138      * Debugfs directory for this CRTC.
1139      */
1140     struct dentry *debugfs_entry;
1141 
1142     /**
1143      * @crc:
1144      *
1145      * Configuration settings of CRC capture.
1146      */
1147     struct drm_crtc_crc crc;
1148 
1149     /**
1150      * @fence_context:
1151      *
1152      * timeline context used for fence operations.
1153      */
1154     unsigned int fence_context;
1155 
1156     /**
1157      * @fence_lock:
1158      *
1159      * spinlock to protect the fences in the fence_context.
1160      */
1161     spinlock_t fence_lock;
1162     /**
1163      * @fence_seqno:
1164      *
1165      * Seqno variable used as monotonic counter for the fences
1166      * created on the CRTC's timeline.
1167      */
1168     unsigned long fence_seqno;
1169 
1170     /**
1171      * @timeline_name:
1172      *
1173      * The name of the CRTC's fence timeline.
1174      */
1175     char timeline_name[32];
1176 
1177     /**
1178      * @self_refresh_data: Holds the state for the self refresh helpers
1179      *
1180      * Initialized via drm_self_refresh_helper_init().
1181      */
1182     struct drm_self_refresh_data *self_refresh_data;
1183 };
1184 
1185 /**
1186  * struct drm_mode_set - new values for a CRTC config change
1187  * @fb: framebuffer to use for new config
1188  * @crtc: CRTC whose configuration we're about to change
1189  * @mode: mode timings to use
1190  * @x: position of this CRTC relative to @fb
1191  * @y: position of this CRTC relative to @fb
1192  * @connectors: array of connectors to drive with this CRTC if possible
1193  * @num_connectors: size of @connectors array
1194  *
1195  * This represents a modeset configuration for the legacy SETCRTC ioctl and is
1196  * also used internally. Atomic drivers instead use &drm_atomic_state.
1197  */
1198 struct drm_mode_set {
1199     struct drm_framebuffer *fb;
1200     struct drm_crtc *crtc;
1201     struct drm_display_mode *mode;
1202 
1203     uint32_t x;
1204     uint32_t y;
1205 
1206     struct drm_connector **connectors;
1207     size_t num_connectors;
1208 };
1209 
1210 #define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
1211 
1212 __printf(6, 7)
1213 int drm_crtc_init_with_planes(struct drm_device *dev,
1214                   struct drm_crtc *crtc,
1215                   struct drm_plane *primary,
1216                   struct drm_plane *cursor,
1217                   const struct drm_crtc_funcs *funcs,
1218                   const char *name, ...);
1219 void drm_crtc_cleanup(struct drm_crtc *crtc);
1220 
1221 __printf(7, 8)
1222 void *__drmm_crtc_alloc_with_planes(struct drm_device *dev,
1223                     size_t size, size_t offset,
1224                     struct drm_plane *primary,
1225                     struct drm_plane *cursor,
1226                     const struct drm_crtc_funcs *funcs,
1227                     const char *name, ...);
1228 
1229 /**
1230  * drmm_crtc_alloc_with_planes - Allocate and initialize a new CRTC object with
1231  *    specified primary and cursor planes.
1232  * @dev: DRM device
1233  * @type: the type of the struct which contains struct &drm_crtc
1234  * @member: the name of the &drm_crtc within @type.
1235  * @primary: Primary plane for CRTC
1236  * @cursor: Cursor plane for CRTC
1237  * @funcs: callbacks for the new CRTC
1238  * @name: printf style format string for the CRTC name, or NULL for default name
1239  *
1240  * Allocates and initializes a new crtc object. Cleanup is automatically
1241  * handled through registering drmm_crtc_cleanup() with drmm_add_action().
1242  *
1243  * The @drm_crtc_funcs.destroy hook must be NULL.
1244  *
1245  * Returns:
1246  * Pointer to new crtc, or ERR_PTR on failure.
1247  */
1248 #define drmm_crtc_alloc_with_planes(dev, type, member, primary, cursor, funcs, name, ...) \
1249     ((type *)__drmm_crtc_alloc_with_planes(dev, sizeof(type), \
1250                            offsetof(type, member), \
1251                            primary, cursor, funcs, \
1252                            name, ##__VA_ARGS__))
1253 
1254 /**
1255  * drm_crtc_index - find the index of a registered CRTC
1256  * @crtc: CRTC to find index for
1257  *
1258  * Given a registered CRTC, return the index of that CRTC within a DRM
1259  * device's list of CRTCs.
1260  */
1261 static inline unsigned int drm_crtc_index(const struct drm_crtc *crtc)
1262 {
1263     return crtc->index;
1264 }
1265 
1266 /**
1267  * drm_crtc_mask - find the mask of a registered CRTC
1268  * @crtc: CRTC to find mask for
1269  *
1270  * Given a registered CRTC, return the mask bit of that CRTC for the
1271  * &drm_encoder.possible_crtcs and &drm_plane.possible_crtcs fields.
1272  */
1273 static inline uint32_t drm_crtc_mask(const struct drm_crtc *crtc)
1274 {
1275     return 1 << drm_crtc_index(crtc);
1276 }
1277 
1278 int drm_mode_set_config_internal(struct drm_mode_set *set);
1279 struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx);
1280 
1281 /**
1282  * drm_crtc_find - look up a CRTC object from its ID
1283  * @dev: DRM device
1284  * @file_priv: drm file to check for lease against.
1285  * @id: &drm_mode_object ID
1286  *
1287  * This can be used to look up a CRTC from its userspace ID. Only used by
1288  * drivers for legacy IOCTLs and interface, nowadays extensions to the KMS
1289  * userspace interface should be done using &drm_property.
1290  */
1291 static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
1292         struct drm_file *file_priv,
1293         uint32_t id)
1294 {
1295     struct drm_mode_object *mo;
1296     mo = drm_mode_object_find(dev, file_priv, id, DRM_MODE_OBJECT_CRTC);
1297     return mo ? obj_to_crtc(mo) : NULL;
1298 }
1299 
1300 /**
1301  * drm_for_each_crtc - iterate over all CRTCs
1302  * @crtc: a &struct drm_crtc as the loop cursor
1303  * @dev: the &struct drm_device
1304  *
1305  * Iterate over all CRTCs of @dev.
1306  */
1307 #define drm_for_each_crtc(crtc, dev) \
1308     list_for_each_entry(crtc, &(dev)->mode_config.crtc_list, head)
1309 
1310 /**
1311  * drm_for_each_crtc_reverse - iterate over all CRTCs in reverse order
1312  * @crtc: a &struct drm_crtc as the loop cursor
1313  * @dev: the &struct drm_device
1314  *
1315  * Iterate over all CRTCs of @dev.
1316  */
1317 #define drm_for_each_crtc_reverse(crtc, dev) \
1318     list_for_each_entry_reverse(crtc, &(dev)->mode_config.crtc_list, head)
1319 
1320 int drm_crtc_create_scaling_filter_property(struct drm_crtc *crtc,
1321                         unsigned int supported_filters);
1322 
1323 #endif /* __DRM_CRTC_H__ */