Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 144ecb97 authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm: Add atomic driver interface definitions for objects



Heavily based upon Rob Clark's atomic series.
- Dropped the connector state from the crtc state, instead opting for a
  full-blown connector state. The only thing it has is the desired
  crtc, but drivers which have connector properties have now a
  data-structure to subclass.

- Rename create_state to duplicate_state. Especially for legacy ioctls
  we want updates on top of existing state, so we need a way to get at
  the current state. We need to be careful to clear the backpointers
  to the global state correctly though.

- Drop property values. Drivers with properties simply need to
  subclass the datastructures and track the decoded values in there. I
  also think that common properties (like rotation) should be decoded
  and stored in the core structures.

- Create a new set of ->atomic_set_prop functions, for smoother
  transitions from legacy to atomic operations.

- Pass the ->atomic_set_prop ioctl the right structure to avoid
  chasing pointers in drivers.

- Drop temporary boolean state for now until we resurrect them with
  the helper functions.

- Drop invert_dimensions. For now we don't need any checking since
  that's done by the higher-level legacy ioctls. But even then we
  should also add rotation/flip tracking to the core drm_crtc_state,
  not just whether the dimensions are inverted.

- Track crtc state with an enable/disable. That's equivalent to
  mode_valid, but a bit clearer that it means the entire crtc.

The global interface will follow in subsequent patches.

v2: We need to allow drivers to somehow set up the initial state and
clear it on resume. So add a plane->reset callback for that. Helpers
will be provided with default behaviour for all these.

v3: Split out the plane->reset into a separate patch.

v4: Improve kerneldoc in drm_crtc.h

v5: Remove unused inline functions for handling state objects, those
callbacks are now mandatory for full atomic support.

v6: Fix commit message nit Sean noticed.

Reviewed-by: default avatarSean Paul <seanpaul@chromium.org>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent b7a1aafd
Loading
Loading
Loading
Loading
+107 −0
Original line number Original line Diff line number Diff line
@@ -224,6 +224,25 @@ struct drm_encoder;
struct drm_pending_vblank_event;
struct drm_pending_vblank_event;
struct drm_plane;
struct drm_plane;
struct drm_bridge;
struct drm_bridge;
struct drm_atomic_state;

/**
 * struct drm_crtc_state - mutable crtc state
 * @enable: whether the CRTC should be enabled, gates all other state
 * @mode: current mode timings
 * @event: optional pointer to a DRM event to signal upon completion of the
 * 	state update
 * @state: backpointer to global drm_atomic_state
 */
struct drm_crtc_state {
	bool enable        : 1;

	struct drm_display_mode mode;

	struct drm_pending_vblank_event *event;

	struct drm_atomic_state *state;
};


/**
/**
 * struct drm_crtc_funcs - control CRTCs for a given device
 * struct drm_crtc_funcs - control CRTCs for a given device
@@ -238,6 +257,9 @@ struct drm_bridge;
 * @set_property: called when a property is changed
 * @set_property: called when a property is changed
 * @set_config: apply a new CRTC configuration
 * @set_config: apply a new CRTC configuration
 * @page_flip: initiate a page flip
 * @page_flip: initiate a page flip
 * @atomic_duplicate_state: duplicate the atomic state for this CRTC
 * @atomic_destroy_state: destroy an atomic state for this CRTC
 * @atomic_set_property: set a property on an atomic state for this CRTC
 *
 *
 * The drm_crtc_funcs structure is the central CRTC management structure
 * The drm_crtc_funcs structure is the central CRTC management structure
 * in the DRM.  Each CRTC controls one or more connectors (note that the name
 * in the DRM.  Each CRTC controls one or more connectors (note that the name
@@ -288,6 +310,15 @@ struct drm_crtc_funcs {


	int (*set_property)(struct drm_crtc *crtc,
	int (*set_property)(struct drm_crtc *crtc,
			    struct drm_property *property, uint64_t val);
			    struct drm_property *property, uint64_t val);

	/* atomic update handling */
	struct drm_crtc_state *(*atomic_duplicate_state)(struct drm_crtc *crtc);
	void (*atomic_destroy_state)(struct drm_crtc *crtc,
				     struct drm_crtc_state *cstate);
	int (*atomic_set_property)(struct drm_crtc *crtc,
				   struct drm_crtc_state *state,
				   struct drm_property *property,
				   uint64_t val);
};
};


/**
/**
@@ -317,6 +348,7 @@ struct drm_crtc_funcs {
 * @pixeldur_ns: precise pixel timing
 * @pixeldur_ns: precise pixel timing
 * @helper_private: mid-layer private data
 * @helper_private: mid-layer private data
 * @properties: property tracking for this CRTC
 * @properties: property tracking for this CRTC
 * @state: current atomic state for this CRTC
 * @acquire_ctx: per-CRTC implicit acquire context used by atomic drivers for
 * @acquire_ctx: per-CRTC implicit acquire context used by atomic drivers for
 * 	legacy ioctls
 * 	legacy ioctls
 *
 *
@@ -374,6 +406,8 @@ struct drm_crtc {


	struct drm_object_properties properties;
	struct drm_object_properties properties;


	struct drm_crtc_state *state;

	/*
	/*
	 * For legacy crtc ioctls so that atomic drivers can get at the locking
	 * For legacy crtc ioctls so that atomic drivers can get at the locking
	 * acquire context.
	 * acquire context.
@@ -381,6 +415,16 @@ struct drm_crtc {
	struct drm_modeset_acquire_ctx *acquire_ctx;
	struct drm_modeset_acquire_ctx *acquire_ctx;
};
};


/**
 * struct drm_connector_state - mutable connector state
 * @crtc: crtc to connect connector to, NULL if disabled
 * @state: backpointer to global drm_atomic_state
 */
struct drm_connector_state {
	struct drm_crtc *crtc;

	struct drm_atomic_state *state;
};


/**
/**
 * struct drm_connector_funcs - control connectors on a given device
 * struct drm_connector_funcs - control connectors on a given device
@@ -393,6 +437,10 @@ struct drm_crtc {
 * @set_property: property for this connector may need an update
 * @set_property: property for this connector may need an update
 * @destroy: make object go away
 * @destroy: make object go away
 * @force: notify the driver that the connector is forced on
 * @force: notify the driver that the connector is forced on
 * @atomic_duplicate_state: duplicate the atomic state for this connector
 * @atomic_destroy_state: destroy an atomic state for this connector
 * @atomic_set_property: set a property on an atomic state for this connector
 *
 *
 *
 * Each CRTC may have one or more connectors attached to it.  The functions
 * Each CRTC may have one or more connectors attached to it.  The functions
 * below allow the core DRM code to control connectors, enumerate available modes,
 * below allow the core DRM code to control connectors, enumerate available modes,
@@ -417,6 +465,15 @@ struct drm_connector_funcs {
			     uint64_t val);
			     uint64_t val);
	void (*destroy)(struct drm_connector *connector);
	void (*destroy)(struct drm_connector *connector);
	void (*force)(struct drm_connector *connector);
	void (*force)(struct drm_connector *connector);

	/* atomic update handling */
	struct drm_connector_state *(*atomic_duplicate_state)(struct drm_connector *connector);
	void (*atomic_destroy_state)(struct drm_connector *connector,
				     struct drm_connector_state *cstate);
	int (*atomic_set_property)(struct drm_connector *connector,
				   struct drm_connector_state *state,
				   struct drm_property *property,
				   uint64_t val);
};
};


/**
/**
@@ -515,6 +572,7 @@ struct drm_encoder {
 * @null_edid_counter: track sinks that give us all zeros for the EDID
 * @null_edid_counter: track sinks that give us all zeros for the EDID
 * @bad_edid_counter: track sinks that give us an EDID with invalid checksum
 * @bad_edid_counter: track sinks that give us an EDID with invalid checksum
 * @debugfs_entry: debugfs directory for this connector
 * @debugfs_entry: debugfs directory for this connector
 * @state: current atomic state for this connector
 *
 *
 * Each connector may be connected to one or more CRTCs, or may be clonable by
 * Each connector may be connected to one or more CRTCs, or may be clonable by
 * another connector if they can share a CRTC.  Each connector also has a specific
 * another connector if they can share a CRTC.  Each connector also has a specific
@@ -575,8 +633,42 @@ struct drm_connector {
	unsigned bad_edid_counter;
	unsigned bad_edid_counter;


	struct dentry *debugfs_entry;
	struct dentry *debugfs_entry;

	struct drm_connector_state *state;
};
};


/**
 * struct drm_plane_state - mutable plane state
 * @crtc: currently bound CRTC, NULL if disabled
 * @fb: currently bound fb
 * @crtc_x: left position of visible portion of plane on crtc
 * @crtc_y: upper position of visible portion of plane on crtc
 * @crtc_w: width of visible portion of plane on crtc
 * @crtc_h: height of visible portion of plane on crtc
 * @src_x: left position of visible portion of plane within
 *	plane (in 16.16)
 * @src_y: upper position of visible portion of plane within
 *	plane (in 16.16)
 * @src_w: width of visible portion of plane (in 16.16)
 * @src_h: height of visible portion of plane (in 16.16)
 * @state: backpointer to global drm_atomic_state
 */
struct drm_plane_state {
	struct drm_crtc *crtc;
	struct drm_framebuffer *fb;

	/* Signed dest location allows it to be partially off screen */
	int32_t crtc_x, crtc_y;
	uint32_t crtc_w, crtc_h;

	/* Source values are 16.16 fixed point */
	uint32_t src_x, src_y;
	uint32_t src_h, src_w;

	struct drm_atomic_state *state;
};


/**
/**
 * struct drm_plane_funcs - driver plane control functions
 * struct drm_plane_funcs - driver plane control functions
 * @update_plane: update the plane configuration
 * @update_plane: update the plane configuration
@@ -584,6 +676,9 @@ struct drm_connector {
 * @destroy: clean up plane resources
 * @destroy: clean up plane resources
 * @reset: reset plane after state has been invalidated (e.g. resume)
 * @reset: reset plane after state has been invalidated (e.g. resume)
 * @set_property: called when a property is changed
 * @set_property: called when a property is changed
 * @atomic_duplicate_state: duplicate the atomic state for this plane
 * @atomic_destroy_state: destroy an atomic state for this plane
 * @atomic_set_property: set a property on an atomic state for this plane
 */
 */
struct drm_plane_funcs {
struct drm_plane_funcs {
	int (*update_plane)(struct drm_plane *plane,
	int (*update_plane)(struct drm_plane *plane,
@@ -598,6 +693,15 @@ struct drm_plane_funcs {


	int (*set_property)(struct drm_plane *plane,
	int (*set_property)(struct drm_plane *plane,
			    struct drm_property *property, uint64_t val);
			    struct drm_property *property, uint64_t val);

	/* atomic update handling */
	struct drm_plane_state *(*atomic_duplicate_state)(struct drm_plane *plane);
	void (*atomic_destroy_state)(struct drm_plane *plane,
				     struct drm_plane_state *cstate);
	int (*atomic_set_property)(struct drm_plane *plane,
				   struct drm_plane_state *state,
				   struct drm_property *property,
				   uint64_t val);
};
};


enum drm_plane_type {
enum drm_plane_type {
@@ -621,6 +725,7 @@ enum drm_plane_type {
 * @funcs: helper functions
 * @funcs: helper functions
 * @properties: property tracking for this plane
 * @properties: property tracking for this plane
 * @type: type of plane (overlay, primary, cursor)
 * @type: type of plane (overlay, primary, cursor)
 * @state: current atomic state for this plane
 */
 */
struct drm_plane {
struct drm_plane {
	struct drm_device *dev;
	struct drm_device *dev;
@@ -642,6 +747,8 @@ struct drm_plane {
	struct drm_object_properties properties;
	struct drm_object_properties properties;


	enum drm_plane_type type;
	enum drm_plane_type type;

	struct drm_plane_state *state;
};
};


/**
/**