LCOV - code coverage report
Current view: top level - dev/pci/drm - drm_crtc.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 36 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 12 0.0 %
Legend: Lines: hit not hit

          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             :  *
       7             :  * Permission is hereby granted, free of charge, to any person obtaining a
       8             :  * copy of this software and associated documentation files (the "Software"),
       9             :  * to deal in the Software without restriction, including without limitation
      10             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      11             :  * and/or sell copies of the Software, and to permit persons to whom the
      12             :  * Software is furnished to do so, subject to the following conditions:
      13             :  *
      14             :  * The above copyright notice and this permission notice shall be included in
      15             :  * all copies or substantial portions of the Software.
      16             :  *
      17             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      18             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      19             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      20             :  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
      21             :  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
      22             :  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
      23             :  * OTHER DEALINGS IN THE SOFTWARE.
      24             :  */
      25             : #ifndef __DRM_CRTC_H__
      26             : #define __DRM_CRTC_H__
      27             : 
      28             : #ifdef __linux__
      29             : #include <linux/i2c.h>
      30             : #include <linux/spinlock.h>
      31             : #include <linux/types.h>
      32             : #include <linux/idr.h>
      33             : #include <linux/fb.h>
      34             : #include <linux/hdmi.h>
      35             : #include <linux/media-bus-format.h>
      36             : #include <uapi/drm/drm_mode.h>
      37             : #include <uapi/drm/drm_fourcc.h>
      38             : #else
      39             : #include <dev/pci/drm/linux_hdmi.h>
      40             : #include <dev/pci/drm/drm_mode.h>
      41             : #include <dev/pci/drm/drm_fourcc.h>
      42             : #endif
      43             : #include <dev/pci/drm/drm_linux.h>
      44             : #include <dev/pci/drm/drm_modeset_lock.h>
      45             : 
      46             : struct drm_device;
      47             : struct drm_mode_set;
      48             : struct drm_framebuffer;
      49             : struct drm_object_properties;
      50             : struct drm_file;
      51             : struct drm_clip_rect;
      52             : struct device_node;
      53             : struct fence;
      54             : 
      55             : #define DRM_MODE_OBJECT_CRTC 0xcccccccc
      56             : #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
      57             : #define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
      58             : #define DRM_MODE_OBJECT_MODE 0xdededede
      59             : #define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
      60             : #define DRM_MODE_OBJECT_FB 0xfbfbfbfb
      61             : #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
      62             : #define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
      63             : #define DRM_MODE_OBJECT_ANY 0
      64             : 
      65             : struct drm_mode_object {
      66             :         uint32_t id;
      67             :         uint32_t type;
      68             :         struct drm_object_properties *properties;
      69             : };
      70             : 
      71             : #define DRM_OBJECT_MAX_PROPERTY 24
      72             : struct drm_object_properties {
      73             :         int count, atomic_count;
      74             :         /* NOTE: if we ever start dynamically destroying properties (ie.
      75             :          * not at drm_mode_config_cleanup() time), then we'd have to do
      76             :          * a better job of detaching property from mode objects to avoid
      77             :          * dangling property pointers:
      78             :          */
      79             :         struct drm_property *properties[DRM_OBJECT_MAX_PROPERTY];
      80             :         /* do not read/write values directly, but use drm_object_property_get_value()
      81             :          * and drm_object_property_set_value():
      82             :          */
      83             :         uint64_t values[DRM_OBJECT_MAX_PROPERTY];
      84             : };
      85             : 
      86           0 : static inline int64_t U642I64(uint64_t val)
      87             : {
      88           0 :         return (int64_t)*((int64_t *)&val);
      89             : }
      90           0 : static inline uint64_t I642U64(int64_t val)
      91             : {
      92           0 :         return (uint64_t)*((uint64_t *)&val);
      93             : }
      94             : 
      95             : /* rotation property bits */
      96             : #define DRM_ROTATE_MASK 0x0f
      97             : #define DRM_ROTATE_0    0
      98             : #define DRM_ROTATE_90   1
      99             : #define DRM_ROTATE_180  2
     100             : #define DRM_ROTATE_270  3
     101             : #define DRM_REFLECT_MASK (~DRM_ROTATE_MASK)
     102             : #define DRM_REFLECT_X   4
     103             : #define DRM_REFLECT_Y   5
     104             : 
     105             : enum drm_connector_force {
     106             :         DRM_FORCE_UNSPECIFIED,
     107             :         DRM_FORCE_OFF,
     108             :         DRM_FORCE_ON,         /* force on analog part normally */
     109             :         DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
     110             : };
     111             : 
     112             : #include <dev/pci/drm/drm_modes.h>
     113             : 
     114             : enum drm_connector_status {
     115             :         connector_status_connected = 1,
     116             :         connector_status_disconnected = 2,
     117             :         connector_status_unknown = 3,
     118             : };
     119             : 
     120             : enum subpixel_order {
     121             :         SubPixelUnknown = 0,
     122             :         SubPixelHorizontalRGB,
     123             :         SubPixelHorizontalBGR,
     124             :         SubPixelVerticalRGB,
     125             :         SubPixelVerticalBGR,
     126             :         SubPixelNone,
     127             : };
     128             : 
     129             : #define DRM_COLOR_FORMAT_RGB444         (1<<0)
     130             : #define DRM_COLOR_FORMAT_YCRCB444       (1<<1)
     131             : #define DRM_COLOR_FORMAT_YCRCB422       (1<<2)
     132             : /*
     133             :  * Describes a given display (e.g. CRT or flat panel) and its limitations.
     134             :  */
     135             : struct drm_display_info {
     136             :         char name[DRM_DISPLAY_INFO_LEN];
     137             : 
     138             :         /* Physical size */
     139             :         unsigned int width_mm;
     140             :         unsigned int height_mm;
     141             : 
     142             :         /* Clock limits FIXME: storage format */
     143             :         unsigned int min_vfreq, max_vfreq;
     144             :         unsigned int min_hfreq, max_hfreq;
     145             :         unsigned int pixel_clock;
     146             :         unsigned int bpc;
     147             : 
     148             :         enum subpixel_order subpixel_order;
     149             :         u32 color_formats;
     150             : 
     151             :         const u32 *bus_formats;
     152             :         unsigned int num_bus_formats;
     153             : 
     154             :         /* Mask of supported hdmi deep color modes */
     155             :         u8 edid_hdmi_dc_modes;
     156             : 
     157             :         u8 cea_rev;
     158             : };
     159             : 
     160             : /* data corresponds to displayid vend/prod/serial */
     161             : struct drm_tile_group {
     162             :         struct kref refcount;
     163             :         struct drm_device *dev;
     164             :         int id;
     165             :         u8 group_data[8];
     166             : };
     167             : 
     168             : struct drm_framebuffer_funcs {
     169             :         /* note: use drm_framebuffer_remove() */
     170             :         void (*destroy)(struct drm_framebuffer *framebuffer);
     171             :         int (*create_handle)(struct drm_framebuffer *fb,
     172             :                              struct drm_file *file_priv,
     173             :                              unsigned int *handle);
     174             :         /*
     175             :          * Optional callback for the dirty fb ioctl.
     176             :          *
     177             :          * Userspace can notify the driver via this callback
     178             :          * that a area of the framebuffer has changed and should
     179             :          * be flushed to the display hardware.
     180             :          *
     181             :          * See documentation in drm_mode.h for the struct
     182             :          * drm_mode_fb_dirty_cmd for more information as all
     183             :          * the semantics and arguments have a one to one mapping
     184             :          * on this function.
     185             :          */
     186             :         int (*dirty)(struct drm_framebuffer *framebuffer,
     187             :                      struct drm_file *file_priv, unsigned flags,
     188             :                      unsigned color, struct drm_clip_rect *clips,
     189             :                      unsigned num_clips);
     190             : };
     191             : 
     192             : struct drm_framebuffer {
     193             :         struct drm_device *dev;
     194             :         /*
     195             :          * Note that the fb is refcounted for the benefit of driver internals,
     196             :          * for example some hw, disabling a CRTC/plane is asynchronous, and
     197             :          * scanout does not actually complete until the next vblank.  So some
     198             :          * cleanup (like releasing the reference(s) on the backing GEM bo(s))
     199             :          * should be deferred.  In cases like this, the driver would like to
     200             :          * hold a ref to the fb even though it has already been removed from
     201             :          * userspace perspective.
     202             :          */
     203             :         struct kref refcount;
     204             :         /*
     205             :          * Place on the dev->mode_config.fb_list, access protected by
     206             :          * dev->mode_config.fb_lock.
     207             :          */
     208             :         struct list_head head;
     209             :         struct drm_mode_object base;
     210             :         const struct drm_framebuffer_funcs *funcs;
     211             :         unsigned int pitches[4];
     212             :         unsigned int offsets[4];
     213             :         uint64_t modifier[4];
     214             :         unsigned int width;
     215             :         unsigned int height;
     216             :         /* depth can be 15 or 16 */
     217             :         unsigned int depth;
     218             :         int bits_per_pixel;
     219             :         int flags;
     220             :         uint32_t pixel_format; /* fourcc format */
     221             :         struct list_head filp_head;
     222             : };
     223             : 
     224             : struct drm_property_blob {
     225             :         struct drm_mode_object base;
     226             :         struct drm_device *dev;
     227             :         struct kref refcount;
     228             :         struct list_head head_global;
     229             :         struct list_head head_file;
     230             :         size_t length;
     231             :         unsigned char data[];
     232             : };
     233             : 
     234             : struct drm_property_enum {
     235             :         uint64_t value;
     236             :         struct list_head head;
     237             :         char name[DRM_PROP_NAME_LEN];
     238             : };
     239             : 
     240             : struct drm_property {
     241             :         struct list_head head;
     242             :         struct drm_mode_object base;
     243             :         uint32_t flags;
     244             :         char name[DRM_PROP_NAME_LEN];
     245             :         uint32_t num_values;
     246             :         uint64_t *values;
     247             :         struct drm_device *dev;
     248             : 
     249             :         struct list_head enum_list;
     250             : };
     251             : 
     252             : struct drm_crtc;
     253             : struct drm_connector;
     254             : struct drm_encoder;
     255             : struct drm_pending_vblank_event;
     256             : struct drm_plane;
     257             : struct drm_bridge;
     258             : struct drm_atomic_state;
     259             : 
     260             : /**
     261             :  * struct drm_crtc_state - mutable CRTC state
     262             :  * @crtc: backpointer to the CRTC
     263             :  * @enable: whether the CRTC should be enabled, gates all other state
     264             :  * @active: whether the CRTC is actively displaying (used for DPMS)
     265             :  * @planes_changed: planes on this crtc are updated
     266             :  * @mode_changed: crtc_state->mode or crtc_state->enable has been changed
     267             :  * @active_changed: crtc_state->active has been toggled.
     268             :  * @connectors_changed: connectors to this crtc have been updated
     269             :  * @plane_mask: bitmask of (1 << drm_plane_index(plane)) of attached planes
     270             :  * @last_vblank_count: for helpers and drivers to capture the vblank of the
     271             :  *      update to ensure framebuffer cleanup isn't done too early
     272             :  * @adjusted_mode: for use by helpers and drivers to compute adjusted mode timings
     273             :  * @mode: current mode timings
     274             :  * @event: optional pointer to a DRM event to signal upon completion of the
     275             :  *      state update
     276             :  * @state: backpointer to global drm_atomic_state
     277             :  *
     278             :  * Note that the distinction between @enable and @active is rather subtile:
     279             :  * Flipping @active while @enable is set without changing anything else may
     280             :  * never return in a failure from the ->atomic_check callback. Userspace assumes
     281             :  * that a DPMS On will always succeed. In other words: @enable controls resource
     282             :  * assignment, @active controls the actual hardware state.
     283             :  */
     284             : struct drm_crtc_state {
     285             :         struct drm_crtc *crtc;
     286             : 
     287             :         bool enable;
     288             :         bool active;
     289             : 
     290             :         /* computed state bits used by helpers and drivers */
     291             :         bool planes_changed : 1;
     292             :         bool mode_changed : 1;
     293             :         bool active_changed : 1;
     294             :         bool connectors_changed : 1;
     295             : 
     296             :         /* attached planes bitmask:
     297             :          * WARNING: transitional helpers do not maintain plane_mask so
     298             :          * drivers not converted over to atomic helpers should not rely
     299             :          * on plane_mask being accurate!
     300             :          */
     301             :         u32 plane_mask;
     302             : 
     303             :         /* last_vblank_count: for vblank waits before cleanup */
     304             :         u32 last_vblank_count;
     305             : 
     306             :         /* adjusted_mode: for use by helpers and drivers */
     307             :         struct drm_display_mode adjusted_mode;
     308             : 
     309             :         struct drm_display_mode mode;
     310             : 
     311             :         /* blob property to expose current mode to atomic userspace */
     312             :         struct drm_property_blob *mode_blob;
     313             : 
     314             :         struct drm_pending_vblank_event *event;
     315             : 
     316             :         struct drm_atomic_state *state;
     317             : };
     318             : 
     319             : /**
     320             :  * struct drm_crtc_funcs - control CRTCs for a given device
     321             :  * @save: save CRTC state
     322             :  * @restore: restore CRTC state
     323             :  * @reset: reset CRTC after state has been invalidated (e.g. resume)
     324             :  * @cursor_set: setup the cursor
     325             :  * @cursor_set2: setup the cursor with hotspot, superseeds @cursor_set if set
     326             :  * @cursor_move: move the cursor
     327             :  * @gamma_set: specify color ramp for CRTC
     328             :  * @destroy: deinit and free object
     329             :  * @set_property: called when a property is changed
     330             :  * @set_config: apply a new CRTC configuration
     331             :  * @page_flip: initiate a page flip
     332             :  * @atomic_duplicate_state: duplicate the atomic state for this CRTC
     333             :  * @atomic_destroy_state: destroy an atomic state for this CRTC
     334             :  * @atomic_set_property: set a property on an atomic state for this CRTC
     335             :  *    (do not call directly, use drm_atomic_crtc_set_property())
     336             :  * @atomic_get_property: get a property on an atomic state for this CRTC
     337             :  *    (do not call directly, use drm_atomic_crtc_get_property())
     338             :  *
     339             :  * The drm_crtc_funcs structure is the central CRTC management structure
     340             :  * in the DRM.  Each CRTC controls one or more connectors (note that the name
     341             :  * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc.
     342             :  * connectors, not just CRTs).
     343             :  *
     344             :  * Each driver is responsible for filling out this structure at startup time,
     345             :  * in addition to providing other modesetting features, like i2c and DDC
     346             :  * bus accessors.
     347             :  */
     348             : struct drm_crtc_funcs {
     349             :         /* Save CRTC state */
     350             :         void (*save)(struct drm_crtc *crtc); /* suspend? */
     351             :         /* Restore CRTC state */
     352             :         void (*restore)(struct drm_crtc *crtc); /* resume? */
     353             :         /* Reset CRTC state */
     354             :         void (*reset)(struct drm_crtc *crtc);
     355             : 
     356             :         /* cursor controls */
     357             :         int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
     358             :                           uint32_t handle, uint32_t width, uint32_t height);
     359             :         int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
     360             :                            uint32_t handle, uint32_t width, uint32_t height,
     361             :                            int32_t hot_x, int32_t hot_y);
     362             :         int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
     363             : 
     364             :         /* Set gamma on the CRTC */
     365             :         void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
     366             :                           uint32_t start, uint32_t size);
     367             :         /* Object destroy routine */
     368             :         void (*destroy)(struct drm_crtc *crtc);
     369             : 
     370             :         int (*set_config)(struct drm_mode_set *set);
     371             : 
     372             :         /*
     373             :          * Flip to the given framebuffer.  This implements the page
     374             :          * flip ioctl described in drm_mode.h, specifically, the
     375             :          * implementation must return immediately and block all
     376             :          * rendering to the current fb until the flip has completed.
     377             :          * If userspace set the event flag in the ioctl, the event
     378             :          * argument will point to an event to send back when the flip
     379             :          * completes, otherwise it will be NULL.
     380             :          */
     381             :         int (*page_flip)(struct drm_crtc *crtc,
     382             :                          struct drm_framebuffer *fb,
     383             :                          struct drm_pending_vblank_event *event,
     384             :                          uint32_t flags);
     385             : 
     386             :         int (*set_property)(struct drm_crtc *crtc,
     387             :                             struct drm_property *property, uint64_t val);
     388             : 
     389             :         /* atomic update handling */
     390             :         struct drm_crtc_state *(*atomic_duplicate_state)(struct drm_crtc *crtc);
     391             :         void (*atomic_destroy_state)(struct drm_crtc *crtc,
     392             :                                      struct drm_crtc_state *state);
     393             :         int (*atomic_set_property)(struct drm_crtc *crtc,
     394             :                                    struct drm_crtc_state *state,
     395             :                                    struct drm_property *property,
     396             :                                    uint64_t val);
     397             :         int (*atomic_get_property)(struct drm_crtc *crtc,
     398             :                                    const struct drm_crtc_state *state,
     399             :                                    struct drm_property *property,
     400             :                                    uint64_t *val);
     401             : };
     402             : 
     403             : /**
     404             :  * struct drm_crtc - central CRTC control structure
     405             :  * @dev: parent DRM device
     406             :  * @port: OF node used by drm_of_find_possible_crtcs()
     407             :  * @head: list management
     408             :  * @mutex: per-CRTC locking
     409             :  * @base: base KMS object for ID tracking etc.
     410             :  * @primary: primary plane for this CRTC
     411             :  * @cursor: cursor plane for this CRTC
     412             :  * @cursor_x: current x position of the cursor, used for universal cursor planes
     413             :  * @cursor_y: current y position of the cursor, used for universal cursor planes
     414             :  * @enabled: is this CRTC enabled?
     415             :  * @mode: current mode timings
     416             :  * @hwmode: mode timings as programmed to hw regs
     417             :  * @x: x position on screen
     418             :  * @y: y position on screen
     419             :  * @funcs: CRTC control functions
     420             :  * @gamma_size: size of gamma ramp
     421             :  * @gamma_store: gamma ramp values
     422             :  * @helper_private: mid-layer private data
     423             :  * @properties: property tracking for this CRTC
     424             :  * @state: current atomic state for this CRTC
     425             :  * @acquire_ctx: per-CRTC implicit acquire context used by atomic drivers for
     426             :  *      legacy ioctls
     427             :  *
     428             :  * Each CRTC may have one or more connectors associated with it.  This structure
     429             :  * allows the CRTC to be controlled.
     430             :  */
     431             : struct drm_crtc {
     432             :         struct drm_device *dev;
     433             :         struct device_node *port;
     434             :         struct list_head head;
     435             : 
     436             :         /*
     437             :          * crtc mutex
     438             :          *
     439             :          * This provides a read lock for the overall crtc state (mode, dpms
     440             :          * state, ...) and a write lock for everything which can be update
     441             :          * without a full modeset (fb, cursor data, ...)
     442             :          */
     443             :         struct drm_modeset_lock mutex;
     444             : 
     445             :         struct drm_mode_object base;
     446             : 
     447             :         /* primary and cursor planes for CRTC */
     448             :         struct drm_plane *primary;
     449             :         struct drm_plane *cursor;
     450             : 
     451             :         /* position of cursor plane on crtc */
     452             :         int cursor_x;
     453             :         int cursor_y;
     454             : 
     455             :         bool enabled;
     456             : 
     457             :         /* Requested mode from modesetting. */
     458             :         struct drm_display_mode mode;
     459             : 
     460             :         /* Programmed mode in hw, after adjustments for encoders,
     461             :          * crtc, panel scaling etc. Needed for timestamping etc.
     462             :          */
     463             :         struct drm_display_mode hwmode;
     464             : 
     465             :         int x, y;
     466             :         const struct drm_crtc_funcs *funcs;
     467             : 
     468             :         /* CRTC gamma size for reporting to userspace */
     469             :         uint32_t gamma_size;
     470             :         uint16_t *gamma_store;
     471             : 
     472             :         /* if you are using the helper */
     473             :         const void *helper_private;
     474             : 
     475             :         struct drm_object_properties properties;
     476             : 
     477             :         struct drm_crtc_state *state;
     478             : 
     479             :         /*
     480             :          * For legacy crtc ioctls so that atomic drivers can get at the locking
     481             :          * acquire context.
     482             :          */
     483             :         struct drm_modeset_acquire_ctx *acquire_ctx;
     484             : };
     485             : 
     486             : /**
     487             :  * struct drm_connector_state - mutable connector state
     488             :  * @connector: backpointer to the connector
     489             :  * @crtc: CRTC to connect connector to, NULL if disabled
     490             :  * @best_encoder: can be used by helpers and drivers to select the encoder
     491             :  * @state: backpointer to global drm_atomic_state
     492             :  */
     493             : struct drm_connector_state {
     494             :         struct drm_connector *connector;
     495             : 
     496             :         struct drm_crtc *crtc;  /* do not write directly, use drm_atomic_set_crtc_for_connector() */
     497             : 
     498             :         struct drm_encoder *best_encoder;
     499             : 
     500             :         struct drm_atomic_state *state;
     501             : };
     502             : 
     503             : /**
     504             :  * struct drm_connector_funcs - control connectors on a given device
     505             :  * @dpms: set power state
     506             :  * @save: save connector state
     507             :  * @restore: restore connector state
     508             :  * @reset: reset connector after state has been invalidated (e.g. resume)
     509             :  * @detect: is this connector active?
     510             :  * @fill_modes: fill mode list for this connector
     511             :  * @set_property: property for this connector may need an update
     512             :  * @destroy: make object go away
     513             :  * @force: notify the driver that the connector is forced on
     514             :  * @atomic_duplicate_state: duplicate the atomic state for this connector
     515             :  * @atomic_destroy_state: destroy an atomic state for this connector
     516             :  * @atomic_set_property: set a property on an atomic state for this connector
     517             :  *    (do not call directly, use drm_atomic_connector_set_property())
     518             :  * @atomic_get_property: get a property on an atomic state for this connector
     519             :  *    (do not call directly, use drm_atomic_connector_get_property())
     520             :  *
     521             :  * Each CRTC may have one or more connectors attached to it.  The functions
     522             :  * below allow the core DRM code to control connectors, enumerate available modes,
     523             :  * etc.
     524             :  */
     525             : struct drm_connector_funcs {
     526             :         int (*dpms)(struct drm_connector *connector, int mode);
     527             :         void (*save)(struct drm_connector *connector);
     528             :         void (*restore)(struct drm_connector *connector);
     529             :         void (*reset)(struct drm_connector *connector);
     530             : 
     531             :         /* Check to see if anything is attached to the connector.
     532             :          * @force is set to false whilst polling, true when checking the
     533             :          * connector due to user request. @force can be used by the driver
     534             :          * to avoid expensive, destructive operations during automated
     535             :          * probing.
     536             :          */
     537             :         enum drm_connector_status (*detect)(struct drm_connector *connector,
     538             :                                             bool force);
     539             :         int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
     540             :         int (*set_property)(struct drm_connector *connector, struct drm_property *property,
     541             :                              uint64_t val);
     542             :         void (*destroy)(struct drm_connector *connector);
     543             :         void (*force)(struct drm_connector *connector);
     544             : 
     545             :         /* atomic update handling */
     546             :         struct drm_connector_state *(*atomic_duplicate_state)(struct drm_connector *connector);
     547             :         void (*atomic_destroy_state)(struct drm_connector *connector,
     548             :                                      struct drm_connector_state *state);
     549             :         int (*atomic_set_property)(struct drm_connector *connector,
     550             :                                    struct drm_connector_state *state,
     551             :                                    struct drm_property *property,
     552             :                                    uint64_t val);
     553             :         int (*atomic_get_property)(struct drm_connector *connector,
     554             :                                    const struct drm_connector_state *state,
     555             :                                    struct drm_property *property,
     556             :                                    uint64_t *val);
     557             : };
     558             : 
     559             : /**
     560             :  * struct drm_encoder_funcs - encoder controls
     561             :  * @reset: reset state (e.g. at init or resume time)
     562             :  * @destroy: cleanup and free associated data
     563             :  *
     564             :  * Encoders sit between CRTCs and connectors.
     565             :  */
     566             : struct drm_encoder_funcs {
     567             :         void (*reset)(struct drm_encoder *encoder);
     568             :         void (*destroy)(struct drm_encoder *encoder);
     569             : };
     570             : 
     571             : #define DRM_CONNECTOR_MAX_ENCODER 3
     572             : 
     573             : /**
     574             :  * struct drm_encoder - central DRM encoder structure
     575             :  * @dev: parent DRM device
     576             :  * @head: list management
     577             :  * @base: base KMS object
     578             :  * @name: encoder name
     579             :  * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h
     580             :  * @possible_crtcs: bitmask of potential CRTC bindings
     581             :  * @possible_clones: bitmask of potential sibling encoders for cloning
     582             :  * @crtc: currently bound CRTC
     583             :  * @bridge: bridge associated to the encoder
     584             :  * @funcs: control functions
     585             :  * @helper_private: mid-layer private data
     586             :  *
     587             :  * CRTCs drive pixels to encoders, which convert them into signals
     588             :  * appropriate for a given connector or set of connectors.
     589             :  */
     590             : struct drm_encoder {
     591             :         struct drm_device *dev;
     592             :         struct list_head head;
     593             : 
     594             :         struct drm_mode_object base;
     595             :         char *name;
     596             :         int encoder_type;
     597             :         uint32_t possible_crtcs;
     598             :         uint32_t possible_clones;
     599             : 
     600             :         struct drm_crtc *crtc;
     601             :         struct drm_bridge *bridge;
     602             :         const struct drm_encoder_funcs *funcs;
     603             :         const void *helper_private;
     604             : };
     605             : 
     606             : /* should we poll this connector for connects and disconnects */
     607             : /* hot plug detectable */
     608             : #define DRM_CONNECTOR_POLL_HPD (1 << 0)
     609             : /* poll for connections */
     610             : #define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
     611             : /* can cleanly poll for disconnections without flickering the screen */
     612             : /* DACs should rarely do this without a lot of testing */
     613             : #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
     614             : 
     615             : #define MAX_ELD_BYTES   128
     616             : 
     617             : /**
     618             :  * struct drm_connector - central DRM connector control structure
     619             :  * @dev: parent DRM device
     620             :  * @kdev: kernel device for sysfs attributes
     621             :  * @attr: sysfs attributes
     622             :  * @head: list management
     623             :  * @base: base KMS object
     624             :  * @name: connector name
     625             :  * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h
     626             :  * @connector_type_id: index into connector type enum
     627             :  * @interlace_allowed: can this connector handle interlaced modes?
     628             :  * @doublescan_allowed: can this connector handle doublescan?
     629             :  * @stereo_allowed: can this connector handle stereo modes?
     630             :  * @modes: modes available on this connector (from fill_modes() + user)
     631             :  * @status: one of the drm_connector_status enums (connected, not, or unknown)
     632             :  * @probed_modes: list of modes derived directly from the display
     633             :  * @display_info: information about attached display (e.g. from EDID)
     634             :  * @funcs: connector control functions
     635             :  * @edid_blob_ptr: DRM property containing EDID if present
     636             :  * @properties: property tracking for this connector
     637             :  * @path_blob_ptr: DRM blob property data for the DP MST path property
     638             :  * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling
     639             :  * @dpms: current dpms state
     640             :  * @helper_private: mid-layer private data
     641             :  * @cmdline_mode: mode line parsed from the kernel cmdline for this connector
     642             :  * @force: a %DRM_FORCE_<foo> state for forced mode sets
     643             :  * @override_edid: has the EDID been overwritten through debugfs for testing?
     644             :  * @encoder_ids: valid encoders for this connector
     645             :  * @encoder: encoder driving this connector, if any
     646             :  * @eld: EDID-like data, if present
     647             :  * @dvi_dual: dual link DVI, if found
     648             :  * @max_tmds_clock: max clock rate, if found
     649             :  * @latency_present: AV delay info from ELD, if found
     650             :  * @video_latency: video latency info from ELD, if found
     651             :  * @audio_latency: audio latency info from ELD, if found
     652             :  * @null_edid_counter: track sinks that give us all zeros for the EDID
     653             :  * @bad_edid_counter: track sinks that give us an EDID with invalid checksum
     654             :  * @edid_corrupt: indicates whether the last read EDID was corrupt
     655             :  * @debugfs_entry: debugfs directory for this connector
     656             :  * @state: current atomic state for this connector
     657             :  * @has_tile: is this connector connected to a tiled monitor
     658             :  * @tile_group: tile group for the connected monitor
     659             :  * @tile_is_single_monitor: whether the tile is one monitor housing
     660             :  * @num_h_tile: number of horizontal tiles in the tile group
     661             :  * @num_v_tile: number of vertical tiles in the tile group
     662             :  * @tile_h_loc: horizontal location of this tile
     663             :  * @tile_v_loc: vertical location of this tile
     664             :  * @tile_h_size: horizontal size of this tile.
     665             :  * @tile_v_size: vertical size of this tile.
     666             :  *
     667             :  * Each connector may be connected to one or more CRTCs, or may be clonable by
     668             :  * another connector if they can share a CRTC.  Each connector also has a specific
     669             :  * position in the broader display (referred to as a 'screen' though it could
     670             :  * span multiple monitors).
     671             :  */
     672             : struct drm_connector {
     673             :         struct drm_device *dev;
     674             :         struct device *kdev;
     675             :         struct device_attribute *attr;
     676             :         struct list_head head;
     677             : 
     678             :         struct drm_mode_object base;
     679             : 
     680             :         char *name;
     681             :         int connector_type;
     682             :         int connector_type_id;
     683             :         bool interlace_allowed;
     684             :         bool doublescan_allowed;
     685             :         bool stereo_allowed;
     686             :         struct list_head modes; /* list of modes on this connector */
     687             : 
     688             :         enum drm_connector_status status;
     689             : 
     690             :         /* these are modes added by probing with DDC or the BIOS */
     691             :         struct list_head probed_modes;
     692             : 
     693             :         struct drm_display_info display_info;
     694             :         const struct drm_connector_funcs *funcs;
     695             : 
     696             :         struct drm_property_blob *edid_blob_ptr;
     697             :         struct drm_object_properties properties;
     698             : 
     699             :         struct drm_property_blob *path_blob_ptr;
     700             : 
     701             :         struct drm_property_blob *tile_blob_ptr;
     702             : 
     703             :         uint8_t polled; /* DRM_CONNECTOR_POLL_* */
     704             : 
     705             :         /* requested DPMS state */
     706             :         int dpms;
     707             : 
     708             :         const void *helper_private;
     709             : 
     710             :         /* forced on connector */
     711             :         struct drm_cmdline_mode cmdline_mode;
     712             :         enum drm_connector_force force;
     713             :         bool override_edid;
     714             :         uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
     715             :         struct drm_encoder *encoder; /* currently active encoder */
     716             : 
     717             :         /* EDID bits */
     718             :         uint8_t eld[MAX_ELD_BYTES];
     719             :         bool dvi_dual;
     720             :         int max_tmds_clock;     /* in MHz */
     721             :         bool latency_present[2];
     722             :         int video_latency[2];   /* [0]: progressive, [1]: interlaced */
     723             :         int audio_latency[2];
     724             :         int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
     725             :         unsigned bad_edid_counter;
     726             : 
     727             :         /* Flag for raw EDID header corruption - used in Displayport
     728             :          * compliance testing - * Displayport Link CTS Core 1.2 rev1.1 4.2.2.6
     729             :          */
     730             :         bool edid_corrupt;
     731             : 
     732             :         struct dentry *debugfs_entry;
     733             : 
     734             :         struct drm_connector_state *state;
     735             : 
     736             :         /* DisplayID bits */
     737             :         bool has_tile;
     738             :         struct drm_tile_group *tile_group;
     739             :         bool tile_is_single_monitor;
     740             : 
     741             :         uint8_t num_h_tile, num_v_tile;
     742             :         uint8_t tile_h_loc, tile_v_loc;
     743             :         uint16_t tile_h_size, tile_v_size;
     744             : 
     745             : #ifdef __OpenBSD__
     746             :         struct backlight_device *backlight_device;
     747             :         struct drm_property *backlight_property;
     748             : #endif
     749             : };
     750             : 
     751             : /**
     752             :  * struct drm_plane_state - mutable plane state
     753             :  * @plane: backpointer to the plane
     754             :  * @crtc: currently bound CRTC, NULL if disabled
     755             :  * @fb: currently bound framebuffer
     756             :  * @fence: optional fence to wait for before scanning out @fb
     757             :  * @crtc_x: left position of visible portion of plane on crtc
     758             :  * @crtc_y: upper position of visible portion of plane on crtc
     759             :  * @crtc_w: width of visible portion of plane on crtc
     760             :  * @crtc_h: height of visible portion of plane on crtc
     761             :  * @src_x: left position of visible portion of plane within
     762             :  *      plane (in 16.16)
     763             :  * @src_y: upper position of visible portion of plane within
     764             :  *      plane (in 16.16)
     765             :  * @src_w: width of visible portion of plane (in 16.16)
     766             :  * @src_h: height of visible portion of plane (in 16.16)
     767             :  * @state: backpointer to global drm_atomic_state
     768             :  */
     769             : struct drm_plane_state {
     770             :         struct drm_plane *plane;
     771             : 
     772             :         struct drm_crtc *crtc;   /* do not write directly, use drm_atomic_set_crtc_for_plane() */
     773             :         struct drm_framebuffer *fb;  /* do not write directly, use drm_atomic_set_fb_for_plane() */
     774             :         struct fence *fence;
     775             : 
     776             :         /* Signed dest location allows it to be partially off screen */
     777             :         int32_t crtc_x, crtc_y;
     778             :         uint32_t crtc_w, crtc_h;
     779             : 
     780             :         /* Source values are 16.16 fixed point */
     781             :         uint32_t src_x, src_y;
     782             :         uint32_t src_h, src_w;
     783             : 
     784             :         /* Plane rotation */
     785             :         unsigned int rotation;
     786             : 
     787             :         struct drm_atomic_state *state;
     788             : };
     789             : 
     790             : 
     791             : /**
     792             :  * struct drm_plane_funcs - driver plane control functions
     793             :  * @update_plane: update the plane configuration
     794             :  * @disable_plane: shut down the plane
     795             :  * @destroy: clean up plane resources
     796             :  * @reset: reset plane after state has been invalidated (e.g. resume)
     797             :  * @set_property: called when a property is changed
     798             :  * @atomic_duplicate_state: duplicate the atomic state for this plane
     799             :  * @atomic_destroy_state: destroy an atomic state for this plane
     800             :  * @atomic_set_property: set a property on an atomic state for this plane
     801             :  *    (do not call directly, use drm_atomic_plane_set_property())
     802             :  * @atomic_get_property: get a property on an atomic state for this plane
     803             :  *    (do not call directly, use drm_atomic_plane_get_property())
     804             :  */
     805             : struct drm_plane_funcs {
     806             :         int (*update_plane)(struct drm_plane *plane,
     807             :                             struct drm_crtc *crtc, struct drm_framebuffer *fb,
     808             :                             int crtc_x, int crtc_y,
     809             :                             unsigned int crtc_w, unsigned int crtc_h,
     810             :                             uint32_t src_x, uint32_t src_y,
     811             :                             uint32_t src_w, uint32_t src_h);
     812             :         int (*disable_plane)(struct drm_plane *plane);
     813             :         void (*destroy)(struct drm_plane *plane);
     814             :         void (*reset)(struct drm_plane *plane);
     815             : 
     816             :         int (*set_property)(struct drm_plane *plane,
     817             :                             struct drm_property *property, uint64_t val);
     818             : 
     819             :         /* atomic update handling */
     820             :         struct drm_plane_state *(*atomic_duplicate_state)(struct drm_plane *plane);
     821             :         void (*atomic_destroy_state)(struct drm_plane *plane,
     822             :                                      struct drm_plane_state *state);
     823             :         int (*atomic_set_property)(struct drm_plane *plane,
     824             :                                    struct drm_plane_state *state,
     825             :                                    struct drm_property *property,
     826             :                                    uint64_t val);
     827             :         int (*atomic_get_property)(struct drm_plane *plane,
     828             :                                    const struct drm_plane_state *state,
     829             :                                    struct drm_property *property,
     830             :                                    uint64_t *val);
     831             : };
     832             : 
     833             : enum drm_plane_type {
     834             :         DRM_PLANE_TYPE_OVERLAY,
     835             :         DRM_PLANE_TYPE_PRIMARY,
     836             :         DRM_PLANE_TYPE_CURSOR,
     837             : };
     838             : 
     839             : /**
     840             :  * struct drm_plane - central DRM plane control structure
     841             :  * @dev: DRM device this plane belongs to
     842             :  * @head: for list management
     843             :  * @base: base mode object
     844             :  * @possible_crtcs: pipes this plane can be bound to
     845             :  * @format_types: array of formats supported by this plane
     846             :  * @format_count: number of formats supported
     847             :  * @format_default: driver hasn't supplied supported formats for the plane
     848             :  * @crtc: currently bound CRTC
     849             :  * @fb: currently bound fb
     850             :  * @old_fb: Temporary tracking of the old fb while a modeset is ongoing. Used by
     851             :  *      drm_mode_set_config_internal() to implement correct refcounting.
     852             :  * @funcs: helper functions
     853             :  * @properties: property tracking for this plane
     854             :  * @type: type of plane (overlay, primary, cursor)
     855             :  * @state: current atomic state for this plane
     856             :  */
     857             : struct drm_plane {
     858             :         struct drm_device *dev;
     859             :         struct list_head head;
     860             : 
     861             :         struct drm_modeset_lock mutex;
     862             : 
     863             :         struct drm_mode_object base;
     864             : 
     865             :         uint32_t possible_crtcs;
     866             :         uint32_t *format_types;
     867             :         unsigned int format_count;
     868             :         bool format_default;
     869             : 
     870             :         struct drm_crtc *crtc;
     871             :         struct drm_framebuffer *fb;
     872             : 
     873             :         struct drm_framebuffer *old_fb;
     874             : 
     875             :         const struct drm_plane_funcs *funcs;
     876             : 
     877             :         struct drm_object_properties properties;
     878             : 
     879             :         enum drm_plane_type type;
     880             : 
     881             :         const void *helper_private;
     882             : 
     883             :         struct drm_plane_state *state;
     884             : };
     885             : 
     886             : /**
     887             :  * struct drm_bridge_funcs - drm_bridge control functions
     888             :  * @attach: Called during drm_bridge_attach
     889             :  * @mode_fixup: Try to fixup (or reject entirely) proposed mode for this bridge
     890             :  * @disable: Called right before encoder prepare, disables the bridge
     891             :  * @post_disable: Called right after encoder prepare, for lockstepped disable
     892             :  * @mode_set: Set this mode to the bridge
     893             :  * @pre_enable: Called right before encoder commit, for lockstepped commit
     894             :  * @enable: Called right after encoder commit, enables the bridge
     895             :  */
     896             : struct drm_bridge_funcs {
     897             :         int (*attach)(struct drm_bridge *bridge);
     898             :         bool (*mode_fixup)(struct drm_bridge *bridge,
     899             :                            const struct drm_display_mode *mode,
     900             :                            struct drm_display_mode *adjusted_mode);
     901             :         void (*disable)(struct drm_bridge *bridge);
     902             :         void (*post_disable)(struct drm_bridge *bridge);
     903             :         void (*mode_set)(struct drm_bridge *bridge,
     904             :                          struct drm_display_mode *mode,
     905             :                          struct drm_display_mode *adjusted_mode);
     906             :         void (*pre_enable)(struct drm_bridge *bridge);
     907             :         void (*enable)(struct drm_bridge *bridge);
     908             : };
     909             : 
     910             : /**
     911             :  * struct drm_bridge - central DRM bridge control structure
     912             :  * @dev: DRM device this bridge belongs to
     913             :  * @encoder: encoder to which this bridge is connected
     914             :  * @next: the next bridge in the encoder chain
     915             :  * @of_node: device node pointer to the bridge
     916             :  * @list: to keep track of all added bridges
     917             :  * @funcs: control functions
     918             :  * @driver_private: pointer to the bridge driver's internal context
     919             :  */
     920             : struct drm_bridge {
     921             :         struct drm_device *dev;
     922             :         struct drm_encoder *encoder;
     923             :         struct drm_bridge *next;
     924             : #ifdef CONFIG_OF
     925             :         struct device_node *of_node;
     926             : #endif
     927             :         struct list_head list;
     928             : 
     929             :         const struct drm_bridge_funcs *funcs;
     930             :         void *driver_private;
     931             : };
     932             : 
     933             : /**
     934             :  * struct drm_atomic_state - the global state object for atomic updates
     935             :  * @dev: parent DRM device
     936             :  * @allow_modeset: allow full modeset
     937             :  * @legacy_cursor_update: hint to enforce legacy cursor ioctl semantics
     938             :  * @planes: pointer to array of plane pointers
     939             :  * @plane_states: pointer to array of plane states pointers
     940             :  * @crtcs: pointer to array of CRTC pointers
     941             :  * @crtc_states: pointer to array of CRTC states pointers
     942             :  * @num_connector: size of the @connectors and @connector_states arrays
     943             :  * @connectors: pointer to array of connector pointers
     944             :  * @connector_states: pointer to array of connector states pointers
     945             :  * @acquire_ctx: acquire context for this atomic modeset state update
     946             :  */
     947             : struct drm_atomic_state {
     948             :         struct drm_device *dev;
     949             :         bool allow_modeset : 1;
     950             :         bool legacy_cursor_update : 1;
     951             :         struct drm_plane **planes;
     952             :         struct drm_plane_state **plane_states;
     953             :         struct drm_crtc **crtcs;
     954             :         struct drm_crtc_state **crtc_states;
     955             :         int num_connector;
     956             :         struct drm_connector **connectors;
     957             :         struct drm_connector_state **connector_states;
     958             : 
     959             :         struct drm_modeset_acquire_ctx *acquire_ctx;
     960             : };
     961             : 
     962             : 
     963             : /**
     964             :  * struct drm_mode_set - new values for a CRTC config change
     965             :  * @fb: framebuffer to use for new config
     966             :  * @crtc: CRTC whose configuration we're about to change
     967             :  * @mode: mode timings to use
     968             :  * @x: position of this CRTC relative to @fb
     969             :  * @y: position of this CRTC relative to @fb
     970             :  * @connectors: array of connectors to drive with this CRTC if possible
     971             :  * @num_connectors: size of @connectors array
     972             :  *
     973             :  * Represents a single crtc the connectors that it drives with what mode
     974             :  * and from which framebuffer it scans out from.
     975             :  *
     976             :  * This is used to set modes.
     977             :  */
     978             : struct drm_mode_set {
     979             :         struct drm_framebuffer *fb;
     980             :         struct drm_crtc *crtc;
     981             :         struct drm_display_mode *mode;
     982             : 
     983             :         uint32_t x;
     984             :         uint32_t y;
     985             : 
     986             :         struct drm_connector **connectors;
     987             :         size_t num_connectors;
     988             : };
     989             : 
     990             : /**
     991             :  * struct drm_mode_config_funcs - basic driver provided mode setting functions
     992             :  * @fb_create: create a new framebuffer object
     993             :  * @output_poll_changed: function to handle output configuration changes
     994             :  * @atomic_check: check whether a given atomic state update is possible
     995             :  * @atomic_commit: commit an atomic state update previously verified with
     996             :  *      atomic_check()
     997             :  * @atomic_state_alloc: allocate a new atomic state
     998             :  * @atomic_state_clear: clear the atomic state
     999             :  * @atomic_state_free: free the atomic state
    1000             :  *
    1001             :  * Some global (i.e. not per-CRTC, connector, etc) mode setting functions that
    1002             :  * involve drivers.
    1003             :  */
    1004             : struct drm_mode_config_funcs {
    1005             :         struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
    1006             :                                              struct drm_file *file_priv,
    1007             :                                              struct drm_mode_fb_cmd2 *mode_cmd);
    1008             :         void (*output_poll_changed)(struct drm_device *dev);
    1009             : 
    1010             :         int (*atomic_check)(struct drm_device *dev,
    1011             :                             struct drm_atomic_state *a);
    1012             :         int (*atomic_commit)(struct drm_device *dev,
    1013             :                              struct drm_atomic_state *a,
    1014             :                              bool async);
    1015             :         struct drm_atomic_state *(*atomic_state_alloc)(struct drm_device *dev);
    1016             :         void (*atomic_state_clear)(struct drm_atomic_state *state);
    1017             :         void (*atomic_state_free)(struct drm_atomic_state *state);
    1018             : };
    1019             : 
    1020             : /**
    1021             :  * struct drm_mode_config - Mode configuration control structure
    1022             :  * @mutex: mutex protecting KMS related lists and structures
    1023             :  * @connection_mutex: ww mutex protecting connector state and routing
    1024             :  * @acquire_ctx: global implicit acquire context used by atomic drivers for
    1025             :  *      legacy ioctls
    1026             :  * @idr_mutex: mutex for KMS ID allocation and management
    1027             :  * @crtc_idr: main KMS ID tracking object
    1028             :  * @fb_lock: mutex to protect fb state and lists
    1029             :  * @num_fb: number of fbs available
    1030             :  * @fb_list: list of framebuffers available
    1031             :  * @num_connector: number of connectors on this device
    1032             :  * @connector_list: list of connector objects
    1033             :  * @num_encoder: number of encoders on this device
    1034             :  * @encoder_list: list of encoder objects
    1035             :  * @num_overlay_plane: number of overlay planes on this device
    1036             :  * @num_total_plane: number of universal (i.e. with primary/curso) planes on this device
    1037             :  * @plane_list: list of plane objects
    1038             :  * @num_crtc: number of CRTCs on this device
    1039             :  * @crtc_list: list of CRTC objects
    1040             :  * @property_list: list of property objects
    1041             :  * @min_width: minimum pixel width on this device
    1042             :  * @min_height: minimum pixel height on this device
    1043             :  * @max_width: maximum pixel width on this device
    1044             :  * @max_height: maximum pixel height on this device
    1045             :  * @funcs: core driver provided mode setting functions
    1046             :  * @fb_base: base address of the framebuffer
    1047             :  * @poll_enabled: track polling support for this device
    1048             :  * @poll_running: track polling status for this device
    1049             :  * @output_poll_work: delayed work for polling in process context
    1050             :  * @property_blob_list: list of all the blob property objects
    1051             :  * @blob_lock: mutex for blob property allocation and management
    1052             :  * @*_property: core property tracking
    1053             :  * @preferred_depth: preferred RBG pixel depth, used by fb helpers
    1054             :  * @prefer_shadow: hint to userspace to prefer shadow-fb rendering
    1055             :  * @async_page_flip: does this device support async flips on the primary plane?
    1056             :  * @cursor_width: hint to userspace for max cursor width
    1057             :  * @cursor_height: hint to userspace for max cursor height
    1058             :  *
    1059             :  * Core mode resource tracking structure.  All CRTC, encoders, and connectors
    1060             :  * enumerated by the driver are added here, as are global properties.  Some
    1061             :  * global restrictions are also here, e.g. dimension restrictions.
    1062             :  */
    1063             : struct drm_mode_config {
    1064             :         struct rwlock mutex; /* protects configuration (mode lists etc.) */
    1065             :         struct drm_modeset_lock connection_mutex; /* protects connector->encoder and encoder->crtc links */
    1066             :         struct drm_modeset_acquire_ctx *acquire_ctx; /* for legacy _lock_all() / _unlock_all() */
    1067             :         struct rwlock idr_mutex; /* for IDR management */
    1068             :         struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
    1069             :         struct idr tile_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
    1070             :         /* this is limited to one for now */
    1071             : 
    1072             :         struct rwlock fb_lock; /* proctects global and per-file fb lists */
    1073             :         int num_fb;
    1074             :         struct list_head fb_list;
    1075             : 
    1076             :         int num_connector;
    1077             :         struct list_head connector_list;
    1078             :         int num_encoder;
    1079             :         struct list_head encoder_list;
    1080             : 
    1081             :         /*
    1082             :          * Track # of overlay planes separately from # of total planes.  By
    1083             :          * default we only advertise overlay planes to userspace; if userspace
    1084             :          * sets the "universal plane" capability bit, we'll go ahead and
    1085             :          * expose all planes.
    1086             :          */
    1087             :         int num_overlay_plane;
    1088             :         int num_total_plane;
    1089             :         struct list_head plane_list;
    1090             : 
    1091             :         int num_crtc;
    1092             :         struct list_head crtc_list;
    1093             : 
    1094             :         struct list_head property_list;
    1095             : 
    1096             :         int min_width, min_height;
    1097             :         int max_width, max_height;
    1098             :         const struct drm_mode_config_funcs *funcs;
    1099             :         resource_size_t fb_base;
    1100             : 
    1101             :         /* output poll support */
    1102             :         bool poll_enabled;
    1103             :         bool poll_running;
    1104             :         bool delayed_event;
    1105             :         struct delayed_work output_poll_work;
    1106             : 
    1107             :         struct rwlock blob_lock;
    1108             : 
    1109             :         /* pointers to standard properties */
    1110             :         struct list_head property_blob_list;
    1111             :         struct drm_property *edid_property;
    1112             :         struct drm_property *dpms_property;
    1113             :         struct drm_property *path_property;
    1114             :         struct drm_property *tile_property;
    1115             :         struct drm_property *plane_type_property;
    1116             :         struct drm_property *rotation_property;
    1117             :         struct drm_property *prop_src_x;
    1118             :         struct drm_property *prop_src_y;
    1119             :         struct drm_property *prop_src_w;
    1120             :         struct drm_property *prop_src_h;
    1121             :         struct drm_property *prop_crtc_x;
    1122             :         struct drm_property *prop_crtc_y;
    1123             :         struct drm_property *prop_crtc_w;
    1124             :         struct drm_property *prop_crtc_h;
    1125             :         struct drm_property *prop_fb_id;
    1126             :         struct drm_property *prop_crtc_id;
    1127             :         struct drm_property *prop_active;
    1128             :         struct drm_property *prop_mode_id;
    1129             : 
    1130             :         /* DVI-I properties */
    1131             :         struct drm_property *dvi_i_subconnector_property;
    1132             :         struct drm_property *dvi_i_select_subconnector_property;
    1133             : 
    1134             :         /* TV properties */
    1135             :         struct drm_property *tv_subconnector_property;
    1136             :         struct drm_property *tv_select_subconnector_property;
    1137             :         struct drm_property *tv_mode_property;
    1138             :         struct drm_property *tv_left_margin_property;
    1139             :         struct drm_property *tv_right_margin_property;
    1140             :         struct drm_property *tv_top_margin_property;
    1141             :         struct drm_property *tv_bottom_margin_property;
    1142             :         struct drm_property *tv_brightness_property;
    1143             :         struct drm_property *tv_contrast_property;
    1144             :         struct drm_property *tv_flicker_reduction_property;
    1145             :         struct drm_property *tv_overscan_property;
    1146             :         struct drm_property *tv_saturation_property;
    1147             :         struct drm_property *tv_hue_property;
    1148             : 
    1149             :         /* Optional properties */
    1150             :         struct drm_property *scaling_mode_property;
    1151             :         struct drm_property *aspect_ratio_property;
    1152             :         struct drm_property *dirty_info_property;
    1153             : 
    1154             :         /* properties for virtual machine layout */
    1155             :         struct drm_property *suggested_x_property;
    1156             :         struct drm_property *suggested_y_property;
    1157             : 
    1158             :         /* dumb ioctl parameters */
    1159             :         uint32_t preferred_depth, prefer_shadow;
    1160             : 
    1161             :         /* whether async page flip is supported or not */
    1162             :         bool async_page_flip;
    1163             : 
    1164             :         /* whether the driver supports fb modifiers */
    1165             :         bool allow_fb_modifiers;
    1166             : 
    1167             :         /* cursor size */
    1168             :         uint32_t cursor_width, cursor_height;
    1169             : };
    1170             : 
    1171             : /**
    1172             :  * drm_for_each_plane_mask - iterate over planes specified by bitmask
    1173             :  * @plane: the loop cursor
    1174             :  * @dev: the DRM device
    1175             :  * @plane_mask: bitmask of plane indices
    1176             :  *
    1177             :  * Iterate over all planes specified by bitmask.
    1178             :  */
    1179             : #define drm_for_each_plane_mask(plane, dev, plane_mask) \
    1180             :         list_for_each_entry((plane), &(dev)->mode_config.plane_list, head) \
    1181             :                 if ((plane_mask) & (1 << drm_plane_index(plane)))
    1182             : 
    1183             : 
    1184             : #define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
    1185             : #define obj_to_connector(x) container_of(x, struct drm_connector, base)
    1186             : #define obj_to_encoder(x) container_of(x, struct drm_encoder, base)
    1187             : #define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
    1188             : #define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
    1189             : #define obj_to_property(x) container_of(x, struct drm_property, base)
    1190             : #define obj_to_blob(x) container_of(x, struct drm_property_blob, base)
    1191             : #define obj_to_plane(x) container_of(x, struct drm_plane, base)
    1192             : 
    1193             : struct drm_prop_enum_list {
    1194             :         int type;
    1195             :         char *name;
    1196             : };
    1197             : 
    1198             : extern int drm_crtc_init_with_planes(struct drm_device *dev,
    1199             :                                      struct drm_crtc *crtc,
    1200             :                                      struct drm_plane *primary,
    1201             :                                      struct drm_plane *cursor,
    1202             :                                      const struct drm_crtc_funcs *funcs);
    1203             : extern void drm_crtc_cleanup(struct drm_crtc *crtc);
    1204             : extern unsigned int drm_crtc_index(struct drm_crtc *crtc);
    1205             : 
    1206             : /**
    1207             :  * drm_crtc_mask - find the mask of a registered CRTC
    1208             :  * @crtc: CRTC to find mask for
    1209             :  *
    1210             :  * Given a registered CRTC, return the mask bit of that CRTC for an
    1211             :  * encoder's possible_crtcs field.
    1212             :  */
    1213           0 : static inline uint32_t drm_crtc_mask(struct drm_crtc *crtc)
    1214             : {
    1215           0 :         return 1 << drm_crtc_index(crtc);
    1216             : }
    1217             : 
    1218             : extern void drm_connector_ida_init(void);
    1219             : extern void drm_connector_ida_destroy(void);
    1220             : extern int drm_connector_init(struct drm_device *dev,
    1221             :                               struct drm_connector *connector,
    1222             :                               const struct drm_connector_funcs *funcs,
    1223             :                               int connector_type);
    1224             : int drm_connector_register(struct drm_connector *connector);
    1225             : void drm_connector_unregister(struct drm_connector *connector);
    1226             : 
    1227             : extern void drm_connector_cleanup(struct drm_connector *connector);
    1228             : extern unsigned int drm_connector_index(struct drm_connector *connector);
    1229             : /* helper to unplug all connectors from sysfs for device */
    1230             : extern void drm_connector_unplug_all(struct drm_device *dev);
    1231             : 
    1232             : extern int drm_bridge_add(struct drm_bridge *bridge);
    1233             : extern void drm_bridge_remove(struct drm_bridge *bridge);
    1234             : extern struct drm_bridge *of_drm_find_bridge(struct device_node *np);
    1235             : extern int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge);
    1236             : 
    1237             : bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
    1238             :                         const struct drm_display_mode *mode,
    1239             :                         struct drm_display_mode *adjusted_mode);
    1240             : void drm_bridge_disable(struct drm_bridge *bridge);
    1241             : void drm_bridge_post_disable(struct drm_bridge *bridge);
    1242             : void drm_bridge_mode_set(struct drm_bridge *bridge,
    1243             :                         struct drm_display_mode *mode,
    1244             :                         struct drm_display_mode *adjusted_mode);
    1245             : void drm_bridge_pre_enable(struct drm_bridge *bridge);
    1246             : void drm_bridge_enable(struct drm_bridge *bridge);
    1247             : 
    1248             : extern int drm_encoder_init(struct drm_device *dev,
    1249             :                             struct drm_encoder *encoder,
    1250             :                             const struct drm_encoder_funcs *funcs,
    1251             :                             int encoder_type);
    1252             : 
    1253             : /**
    1254             :  * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
    1255             :  * @encoder: encoder to test
    1256             :  * @crtc: crtc to test
    1257             :  *
    1258             :  * Return false if @encoder can't be driven by @crtc, true otherwise.
    1259             :  */
    1260           0 : static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
    1261             :                                        struct drm_crtc *crtc)
    1262             : {
    1263           0 :         return !!(encoder->possible_crtcs & drm_crtc_mask(crtc));
    1264             : }
    1265             : 
    1266             : extern int drm_universal_plane_init(struct drm_device *dev,
    1267             :                                     struct drm_plane *plane,
    1268             :                                     unsigned long possible_crtcs,
    1269             :                                     const struct drm_plane_funcs *funcs,
    1270             :                                     const uint32_t *formats,
    1271             :                                     unsigned int format_count,
    1272             :                                     enum drm_plane_type type);
    1273             : extern int drm_plane_init(struct drm_device *dev,
    1274             :                           struct drm_plane *plane,
    1275             :                           unsigned long possible_crtcs,
    1276             :                           const struct drm_plane_funcs *funcs,
    1277             :                           const uint32_t *formats, unsigned int format_count,
    1278             :                           bool is_primary);
    1279             : extern void drm_plane_cleanup(struct drm_plane *plane);
    1280             : extern unsigned int drm_plane_index(struct drm_plane *plane);
    1281             : extern struct drm_plane * drm_plane_from_index(struct drm_device *dev, int idx);
    1282             : extern void drm_plane_force_disable(struct drm_plane *plane);
    1283             : extern int drm_plane_check_pixel_format(const struct drm_plane *plane,
    1284             :                                         u32 format);
    1285             : extern void drm_crtc_get_hv_timing(const struct drm_display_mode *mode,
    1286             :                                    int *hdisplay, int *vdisplay);
    1287             : extern int drm_crtc_check_viewport(const struct drm_crtc *crtc,
    1288             :                                    int x, int y,
    1289             :                                    const struct drm_display_mode *mode,
    1290             :                                    const struct drm_framebuffer *fb);
    1291             : 
    1292             : extern void drm_encoder_cleanup(struct drm_encoder *encoder);
    1293             : 
    1294             : extern const char *drm_get_connector_status_name(enum drm_connector_status status);
    1295             : extern const char *drm_get_subpixel_order_name(enum subpixel_order order);
    1296             : extern const char *drm_get_dpms_name(int val);
    1297             : extern const char *drm_get_dvi_i_subconnector_name(int val);
    1298             : extern const char *drm_get_dvi_i_select_name(int val);
    1299             : extern const char *drm_get_tv_subconnector_name(int val);
    1300             : extern const char *drm_get_tv_select_name(int val);
    1301             : extern void drm_fb_release(struct drm_file *file_priv);
    1302             : extern void drm_property_destroy_user_blobs(struct drm_device *dev,
    1303             :                                             struct drm_file *file_priv);
    1304             : extern bool drm_probe_ddc(struct i2c_adapter *adapter);
    1305             : extern struct edid *drm_get_edid(struct drm_connector *connector,
    1306             :                                  struct i2c_adapter *adapter);
    1307             : extern struct edid *drm_edid_duplicate(const struct edid *edid);
    1308             : extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
    1309             : extern void drm_mode_config_init(struct drm_device *dev);
    1310             : extern void drm_mode_config_reset(struct drm_device *dev);
    1311             : extern void drm_mode_config_cleanup(struct drm_device *dev);
    1312             : 
    1313             : extern int drm_mode_connector_set_path_property(struct drm_connector *connector,
    1314             :                                                 const char *path);
    1315             : int drm_mode_connector_set_tile_property(struct drm_connector *connector);
    1316             : extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
    1317             :                                                    const struct edid *edid);
    1318             : 
    1319             : extern int drm_display_info_set_bus_formats(struct drm_display_info *info,
    1320             :                                             const u32 *formats,
    1321             :                                             unsigned int num_formats);
    1322             : 
    1323           0 : static inline bool drm_property_type_is(struct drm_property *property,
    1324             :                 uint32_t type)
    1325             : {
    1326             :         /* instanceof for props.. handles extended type vs original types: */
    1327           0 :         if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
    1328           0 :                 return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type;
    1329           0 :         return property->flags & type;
    1330           0 : }
    1331             : 
    1332           0 : static inline bool drm_property_type_valid(struct drm_property *property)
    1333             : {
    1334           0 :         if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
    1335           0 :                 return !(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
    1336           0 :         return !!(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
    1337           0 : }
    1338             : 
    1339             : extern int drm_object_property_set_value(struct drm_mode_object *obj,
    1340             :                                          struct drm_property *property,
    1341             :                                          uint64_t val);
    1342             : extern int drm_object_property_get_value(struct drm_mode_object *obj,
    1343             :                                          struct drm_property *property,
    1344             :                                          uint64_t *value);
    1345             : extern int drm_framebuffer_init(struct drm_device *dev,
    1346             :                                 struct drm_framebuffer *fb,
    1347             :                                 const struct drm_framebuffer_funcs *funcs);
    1348             : extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
    1349             :                                                       uint32_t id);
    1350             : extern void drm_framebuffer_unreference(struct drm_framebuffer *fb);
    1351             : extern void drm_framebuffer_reference(struct drm_framebuffer *fb);
    1352             : extern void drm_framebuffer_remove(struct drm_framebuffer *fb);
    1353             : extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
    1354             : extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
    1355             : 
    1356             : extern void drm_object_attach_property(struct drm_mode_object *obj,
    1357             :                                        struct drm_property *property,
    1358             :                                        uint64_t init_val);
    1359             : extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
    1360             :                                                 const char *name, int num_values);
    1361             : extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
    1362             :                                          const char *name,
    1363             :                                          const struct drm_prop_enum_list *props,
    1364             :                                          int num_values);
    1365             : struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
    1366             :                                          int flags, const char *name,
    1367             :                                          const struct drm_prop_enum_list *props,
    1368             :                                          int num_props,
    1369             :                                          uint64_t supported_bits);
    1370             : struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
    1371             :                                          const char *name,
    1372             :                                          uint64_t min, uint64_t max);
    1373             : struct drm_property *drm_property_create_signed_range(struct drm_device *dev,
    1374             :                                          int flags, const char *name,
    1375             :                                          int64_t min, int64_t max);
    1376             : struct drm_property *drm_property_create_object(struct drm_device *dev,
    1377             :                                          int flags, const char *name, uint32_t type);
    1378             : struct drm_property *drm_property_create_bool(struct drm_device *dev, int flags,
    1379             :                                          const char *name);
    1380             : struct drm_property_blob *drm_property_create_blob(struct drm_device *dev,
    1381             :                                                    size_t length,
    1382             :                                                    const void *data);
    1383             : struct drm_property_blob *drm_property_lookup_blob(struct drm_device *dev,
    1384             :                                                    uint32_t id);
    1385             : struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob);
    1386             : void drm_property_unreference_blob(struct drm_property_blob *blob);
    1387             : extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
    1388             : extern int drm_property_add_enum(struct drm_property *property, int index,
    1389             :                                  uint64_t value, const char *name);
    1390             : extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
    1391             : extern int drm_mode_create_tv_properties(struct drm_device *dev,
    1392             :                                          unsigned int num_modes,
    1393             :                                          const char * const modes[]);
    1394             : extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
    1395             : extern int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
    1396             : extern int drm_mode_create_dirty_info_property(struct drm_device *dev);
    1397             : extern int drm_mode_create_suggested_offset_properties(struct drm_device *dev);
    1398             : extern bool drm_property_change_valid_get(struct drm_property *property,
    1399             :                                          uint64_t value, struct drm_mode_object **ref);
    1400             : extern void drm_property_change_valid_put(struct drm_property *property,
    1401             :                 struct drm_mode_object *ref);
    1402             : 
    1403             : extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
    1404             :                                              struct drm_encoder *encoder);
    1405             : extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
    1406             :                                          int gamma_size);
    1407             : extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
    1408             :                 uint32_t id, uint32_t type);
    1409             : 
    1410             : /* IOCTLs */
    1411             : extern int drm_mode_getresources(struct drm_device *dev,
    1412             :                                  void *data, struct drm_file *file_priv);
    1413             : extern int drm_mode_getplane_res(struct drm_device *dev, void *data,
    1414             :                                    struct drm_file *file_priv);
    1415             : extern int drm_mode_getcrtc(struct drm_device *dev,
    1416             :                             void *data, struct drm_file *file_priv);
    1417             : extern int drm_mode_getconnector(struct drm_device *dev,
    1418             :                               void *data, struct drm_file *file_priv);
    1419             : extern int drm_mode_set_config_internal(struct drm_mode_set *set);
    1420             : extern int drm_mode_setcrtc(struct drm_device *dev,
    1421             :                             void *data, struct drm_file *file_priv);
    1422             : extern int drm_mode_getplane(struct drm_device *dev,
    1423             :                                void *data, struct drm_file *file_priv);
    1424             : extern int drm_mode_setplane(struct drm_device *dev,
    1425             :                                void *data, struct drm_file *file_priv);
    1426             : extern int drm_mode_cursor_ioctl(struct drm_device *dev,
    1427             :                                 void *data, struct drm_file *file_priv);
    1428             : extern int drm_mode_cursor2_ioctl(struct drm_device *dev,
    1429             :                                 void *data, struct drm_file *file_priv);
    1430             : extern int drm_mode_addfb(struct drm_device *dev,
    1431             :                           void *data, struct drm_file *file_priv);
    1432             : extern int drm_mode_addfb2(struct drm_device *dev,
    1433             :                            void *data, struct drm_file *file_priv);
    1434             : extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
    1435             : extern int drm_mode_rmfb(struct drm_device *dev,
    1436             :                          void *data, struct drm_file *file_priv);
    1437             : extern int drm_mode_getfb(struct drm_device *dev,
    1438             :                           void *data, struct drm_file *file_priv);
    1439             : extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
    1440             :                                   void *data, struct drm_file *file_priv);
    1441             : 
    1442             : extern int drm_mode_getproperty_ioctl(struct drm_device *dev,
    1443             :                                       void *data, struct drm_file *file_priv);
    1444             : extern int drm_mode_getblob_ioctl(struct drm_device *dev,
    1445             :                                   void *data, struct drm_file *file_priv);
    1446             : extern int drm_mode_createblob_ioctl(struct drm_device *dev,
    1447             :                                      void *data, struct drm_file *file_priv);
    1448             : extern int drm_mode_destroyblob_ioctl(struct drm_device *dev,
    1449             :                                       void *data, struct drm_file *file_priv);
    1450             : extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
    1451             :                                               void *data, struct drm_file *file_priv);
    1452             : extern int drm_mode_getencoder(struct drm_device *dev,
    1453             :                                void *data, struct drm_file *file_priv);
    1454             : extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
    1455             :                                     void *data, struct drm_file *file_priv);
    1456             : extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
    1457             :                                     void *data, struct drm_file *file_priv);
    1458             : extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
    1459             : extern enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);
    1460             : extern bool drm_detect_hdmi_monitor(struct edid *edid);
    1461             : extern bool drm_detect_monitor_audio(struct edid *edid);
    1462             : extern bool drm_rgb_quant_range_selectable(struct edid *edid);
    1463             : extern int drm_mode_page_flip_ioctl(struct drm_device *dev,
    1464             :                                     void *data, struct drm_file *file_priv);
    1465             : extern int drm_add_modes_noedid(struct drm_connector *connector,
    1466             :                                 int hdisplay, int vdisplay);
    1467             : extern void drm_set_preferred_mode(struct drm_connector *connector,
    1468             :                                    int hpref, int vpref);
    1469             : 
    1470             : extern int drm_edid_header_is_valid(const u8 *raw_edid);
    1471             : extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
    1472             :                                  bool *edid_corrupt);
    1473             : extern bool drm_edid_is_valid(struct edid *edid);
    1474             : 
    1475             : extern struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
    1476             :                                                          char topology[8]);
    1477             : extern struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
    1478             :                                                char topology[8]);
    1479             : extern void drm_mode_put_tile_group(struct drm_device *dev,
    1480             :                                    struct drm_tile_group *tg);
    1481             : struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
    1482             :                                            int hsize, int vsize, int fresh,
    1483             :                                            bool rb);
    1484             : 
    1485             : extern int drm_mode_create_dumb_ioctl(struct drm_device *dev,
    1486             :                                       void *data, struct drm_file *file_priv);
    1487             : extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
    1488             :                                     void *data, struct drm_file *file_priv);
    1489             : extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
    1490             :                                       void *data, struct drm_file *file_priv);
    1491             : extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
    1492             :                                              struct drm_file *file_priv);
    1493             : extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
    1494             :                                            struct drm_file *file_priv);
    1495             : extern int drm_mode_plane_set_obj_prop(struct drm_plane *plane,
    1496             :                                        struct drm_property *property,
    1497             :                                        uint64_t value);
    1498             : extern int drm_mode_atomic_ioctl(struct drm_device *dev,
    1499             :                                  void *data, struct drm_file *file_priv);
    1500             : 
    1501             : extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
    1502             :                                  int *bpp);
    1503             : extern int drm_format_num_planes(uint32_t format);
    1504             : extern int drm_format_plane_cpp(uint32_t format, int plane);
    1505             : extern int drm_format_horz_chroma_subsampling(uint32_t format);
    1506             : extern int drm_format_vert_chroma_subsampling(uint32_t format);
    1507             : extern const char *drm_get_format_name(uint32_t format);
    1508             : extern struct drm_property *drm_mode_create_rotation_property(struct drm_device *dev,
    1509             :                                                               unsigned int supported_rotations);
    1510             : extern unsigned int drm_rotation_simplify(unsigned int rotation,
    1511             :                                           unsigned int supported_rotations);
    1512             : 
    1513             : /* Helpers */
    1514             : 
    1515           0 : static inline struct drm_plane *drm_plane_find(struct drm_device *dev,
    1516             :                 uint32_t id)
    1517             : {
    1518             :         struct drm_mode_object *mo;
    1519           0 :         mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PLANE);
    1520           0 :         return mo ? obj_to_plane(mo) : NULL;
    1521             : }
    1522             : 
    1523           0 : static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
    1524             :         uint32_t id)
    1525             : {
    1526             :         struct drm_mode_object *mo;
    1527           0 :         mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC);
    1528           0 :         return mo ? obj_to_crtc(mo) : NULL;
    1529             : }
    1530             : 
    1531           0 : static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
    1532             :         uint32_t id)
    1533             : {
    1534             :         struct drm_mode_object *mo;
    1535           0 :         mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
    1536           0 :         return mo ? obj_to_encoder(mo) : NULL;
    1537             : }
    1538             : 
    1539           0 : static inline struct drm_connector *drm_connector_find(struct drm_device *dev,
    1540             :                 uint32_t id)
    1541             : {
    1542             :         struct drm_mode_object *mo;
    1543           0 :         mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CONNECTOR);
    1544           0 :         return mo ? obj_to_connector(mo) : NULL;
    1545             : }
    1546             : 
    1547           0 : static inline struct drm_property *drm_property_find(struct drm_device *dev,
    1548             :                 uint32_t id)
    1549             : {
    1550             :         struct drm_mode_object *mo;
    1551           0 :         mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PROPERTY);
    1552           0 :         return mo ? obj_to_property(mo) : NULL;
    1553             : }
    1554             : 
    1555             : /* Plane list iterator for legacy (overlay only) planes. */
    1556             : #define drm_for_each_legacy_plane(plane, dev) \
    1557             :         list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) \
    1558             :                 if (plane->type == DRM_PLANE_TYPE_OVERLAY)
    1559             : 
    1560             : #define drm_for_each_plane(plane, dev) \
    1561             :         list_for_each_entry(plane, &(dev)->mode_config.plane_list, head)
    1562             : 
    1563             : #define drm_for_each_crtc(crtc, dev) \
    1564             :         list_for_each_entry(crtc, &(dev)->mode_config.crtc_list, head)
    1565             : 
    1566             : static inline void
    1567           0 : assert_drm_connector_list_read_locked(struct drm_mode_config *mode_config)
    1568             : {
    1569             :         /*
    1570             :          * The connector hotadd/remove code currently grabs both locks when
    1571             :          * updating lists. Hence readers need only hold either of them to be
    1572             :          * safe and the check amounts to
    1573             :          *
    1574             :          * WARN_ON(not_holding(A) && not_holding(B)).
    1575             :          */
    1576           0 :         WARN_ON(!mutex_is_locked(&mode_config->mutex) &&
    1577             :                 !drm_modeset_is_locked(&mode_config->connection_mutex));
    1578           0 : }
    1579             : 
    1580             : #define drm_for_each_connector(connector, dev) \
    1581             :         for (assert_drm_connector_list_read_locked(&(dev)->mode_config), \
    1582             :              connector = list_first_entry(&(dev)->mode_config.connector_list,    \
    1583             :                                           struct drm_connector, head);          \
    1584             :              &connector->head != (&(dev)->mode_config.connector_list);            \
    1585             :              connector = list_next_entry(connector, head))
    1586             : 
    1587             : #define drm_for_each_encoder(encoder, dev) \
    1588             :         list_for_each_entry(encoder, &(dev)->mode_config.encoder_list, head)
    1589             : 
    1590             : #define drm_for_each_fb(fb, dev) \
    1591             :         for (WARN_ON(!mutex_is_locked(&(dev)->mode_config.fb_lock)),             \
    1592             :              fb = list_first_entry(&(dev)->mode_config.fb_list,  \
    1593             :                                           struct drm_framebuffer, head);        \
    1594             :              &fb->head != (&(dev)->mode_config.fb_list);                  \
    1595             :              fb = list_next_entry(fb, head))
    1596             : 
    1597             : #endif /* __DRM_CRTC_H__ */

Generated by: LCOV version 1.13