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

Commit 5e7a1d01 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'topic/drm-misc-2016-08-31' of git://anongit.freedesktop.org/drm-intel into drm-next

More -misc stuff
- moar drm_crtc.c split up&documentation
- some fixes for the simple kms helpers (Andrea)
- I included all the dri1 patches from David - we're not removing any code
  or drivers, and it seems to have worked as a wake-up call to motivate a
  few more people to upstream kms conversions for these. Feel free to
  revert if you disagree strongly.
- a few other single patches

* tag 'topic/drm-misc-2016-08-31' of git://anongit.freedesktop.org/drm-intel: (24 commits)
  drm: drm_probe_helper: Fix output_poll_work scheduling
  drm: bridge/dw-hdmi: Fix colorspace and scan information registers values
  drm/doc: Polish docs for drm_property&drm_property_blob
  drm: Unify handling of blob and object properties
  drm: Extract drm_property.[hc]
  drm: move drm_mode_legacy_fb_format to drm_fourcc.c
  drm/doc: Polish docs for drm_mode_object
  drm: Remove drm_mode_object->atomic_count
  drm: Extract drm_mode_object.[hc]
  drm/doc: Polish kerneldoc for encoders
  drm: Extract drm_encoder.[hc]
  drm/fb-helper: don't call remove_conflicting_framebuffers for FB=m && DRM=y
  drm/atomic-helper: Add NO_DISABLE_AFTER_MODESET flag support for plane commit
  drm/atomic-helper: Disable appropriate planes in disable_planes_on_crtc()
  drm/atomic-helper: Add atomic_disable CRTC helper callback
  drm: simple_kms_helper: add support for bridges
  drm: simple_kms_helper: make connector optional at init time
  drm/bridge: introduce bridge detaching mechanism
  drm/simple-helpers: Always add planes to the state update
  drm: reduce GETCLIENT to a minimum
  ...
parents e9c3ddee 339fd362
Loading
Loading
Loading
Loading
+35 −124
Original line number Diff line number Diff line
@@ -15,6 +15,15 @@ be setup by initializing the following fields.
-  struct drm_mode_config_funcs \*funcs;
   Mode setting functions.

Modeset Base Object Abstraction
===============================

.. kernel-doc:: include/drm/drm_mode_object.h
   :internal:

.. kernel-doc:: drivers/gpu/drm/drm_mode_object.c
   :export:

KMS Data Structures
===================

@@ -125,6 +134,21 @@ Connector Functions Reference
.. kernel-doc:: drivers/gpu/drm/drm_connector.c
   :export:

Encoder Abstraction
===================

.. kernel-doc:: drivers/gpu/drm/drm_encoder.c
   :doc: overview

Encoder Functions Reference
---------------------------

.. kernel-doc:: include/drm/drm_encoder.h
   :internal:

.. kernel-doc:: drivers/gpu/drm/drm_encoder.c
   :export:

KMS Initialization and Cleanup
==============================

@@ -198,46 +222,6 @@ future); drivers that do not wish to provide special handling for
primary planes may make use of the helper functions described in ? to
create and register a primary plane with standard capabilities.

Encoders (:c:type:`struct drm_encoder <drm_encoder>`)
-----------------------------------------------------

An encoder takes pixel data from a CRTC and converts it to a format
suitable for any attached connectors. On some devices, it may be
possible to have a CRTC send data to more than one encoder. In that
case, both encoders would receive data from the same scanout buffer,
resulting in a "cloned" display configuration across the connectors
attached to each encoder.

Encoder Initialization
~~~~~~~~~~~~~~~~~~~~~~

As for CRTCs, a KMS driver must create, initialize and register at least
one :c:type:`struct drm_encoder <drm_encoder>` instance. The
instance is allocated and zeroed by the driver, possibly as part of a
larger structure.

Drivers must initialize the :c:type:`struct drm_encoder
<drm_encoder>` possible_crtcs and possible_clones fields before
registering the encoder. Both fields are bitmasks of respectively the
CRTCs that the encoder can be connected to, and sibling encoders
candidate for cloning.

After being initialized, the encoder must be registered with a call to
:c:func:`drm_encoder_init()`. The function takes a pointer to the
encoder functions and an encoder type. Supported types are

-  DRM_MODE_ENCODER_DAC for VGA and analog on DVI-I/DVI-A
-  DRM_MODE_ENCODER_TMDS for DVI, HDMI and (embedded) DisplayPort
-  DRM_MODE_ENCODER_LVDS for display panels
-  DRM_MODE_ENCODER_TVDAC for TV output (Composite, S-Video,
   Component, SCART)
-  DRM_MODE_ENCODER_VIRTUAL for virtual machine displays

Encoders must be attached to a CRTC to be used. DRM drivers leave
encoders unattached at initialization time. Applications (or the fbdev
compatibility layer when implemented) are responsible for attaching the
encoders they want to use to a CRTC.

Cleanup
-------

@@ -320,90 +304,17 @@ KMS Locking
KMS Properties
==============

Drivers may need to expose additional parameters to applications than
those described in the previous sections. KMS supports attaching
properties to CRTCs, connectors and planes and offers a userspace API to
list, get and set the property values.

Properties are identified by a name that uniquely defines the property
purpose, and store an associated value. For all property types except
blob properties the value is a 64-bit unsigned integer.

KMS differentiates between properties and property instances. Drivers
first create properties and then create and associate individual
instances of those properties to objects. A property can be instantiated
multiple times and associated with different objects. Values are stored
in property instances, and all other property information are stored in
the property and shared between all instances of the property.

Every property is created with a type that influences how the KMS core
handles the property. Supported property types are

DRM_MODE_PROP_RANGE
    Range properties report their minimum and maximum admissible values.
    The KMS core verifies that values set by application fit in that
    range.

DRM_MODE_PROP_ENUM
    Enumerated properties take a numerical value that ranges from 0 to
    the number of enumerated values defined by the property minus one,
    and associate a free-formed string name to each value. Applications
    can retrieve the list of defined value-name pairs and use the
    numerical value to get and set property instance values.

DRM_MODE_PROP_BITMASK
    Bitmask properties are enumeration properties that additionally
    restrict all enumerated values to the 0..63 range. Bitmask property
    instance values combine one or more of the enumerated bits defined
    by the property.

DRM_MODE_PROP_BLOB
    Blob properties store a binary blob without any format restriction.
    The binary blobs are created as KMS standalone objects, and blob
    property instance values store the ID of their associated blob
    object.

    Blob properties are only used for the connector EDID property and
    cannot be created by drivers.

To create a property drivers call one of the following functions
depending on the property type. All property creation functions take
property flags and name, as well as type-specific arguments.

-  struct drm_property \*drm_property_create_range(struct
   drm_device \*dev, int flags, const char \*name, uint64_t min,
   uint64_t max);
   Create a range property with the given minimum and maximum values.

-  struct drm_property \*drm_property_create_enum(struct drm_device
   \*dev, int flags, const char \*name, const struct
   drm_prop_enum_list \*props, int num_values);
   Create an enumerated property. The ``props`` argument points to an
   array of ``num_values`` value-name pairs.

-  struct drm_property \*drm_property_create_bitmask(struct
   drm_device \*dev, int flags, const char \*name, const struct
   drm_prop_enum_list \*props, int num_values);
   Create a bitmask property. The ``props`` argument points to an array
   of ``num_values`` value-name pairs.

Properties can additionally be created as immutable, in which case they
will be read-only for applications but can be modified by the driver. To
create an immutable property drivers must set the
DRM_MODE_PROP_IMMUTABLE flag at property creation time.

When no array of value-name pairs is readily available at property
creation time for enumerated or range properties, drivers can create the
property using the :c:func:`drm_property_create()` function and
manually add enumeration value-name pairs by calling the
:c:func:`drm_property_add_enum()` function. Care must be taken to
properly specify the property type through the ``flags`` argument.

After creating properties drivers can attach property instances to CRTC,
connector and plane objects by calling the
:c:func:`drm_object_attach_property()`. The function takes a
pointer to the target object, a pointer to the previously created
property and an initial instance value.
Property Types and Blob Property Support
----------------------------------------

.. kernel-doc:: drivers/gpu/drm/drm_property.c
   :doc: overview

.. kernel-doc:: include/drm/drm_property.h
   :internal:

.. kernel-doc:: drivers/gpu/drm/drm_property.c
   :export:

Blending and Z-Position properties
----------------------------------
+2 −0
Original line number Diff line number Diff line
.. _vga_switcheroo:

==============
VGA Switcheroo
==============
+79 −57
Original line number Diff line number Diff line
@@ -108,24 +108,8 @@ config DRM_KMS_CMA_HELPER

source "drivers/gpu/drm/i2c/Kconfig"

config DRM_TDFX
	tristate "3dfx Banshee/Voodoo3+"
	depends on DRM && PCI
	help
	  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
	  graphics card.  If M is selected, the module will be called tdfx.

source "drivers/gpu/drm/arm/Kconfig"

config DRM_R128
	tristate "ATI Rage 128"
	depends on DRM && PCI
	select FW_LOADER
	help
	  Choose this option if you have an ATI Rage 128 graphics card.  If M
	  is selected, the module will be called r128.  AGP support for
	  this card is strongly suggested (unless you have a PCI version).

config DRM_RADEON
	tristate "ATI Radeon"
	depends on DRM && PCI
@@ -166,49 +150,8 @@ source "drivers/gpu/drm/amd/amdgpu/Kconfig"

source "drivers/gpu/drm/nouveau/Kconfig"

config DRM_I810
	tristate "Intel I810"
	# !PREEMPT because of missing ioctl locking
	depends on DRM && AGP && AGP_INTEL && (!PREEMPT || BROKEN)
	help
	  Choose this option if you have an Intel I810 graphics card.  If M is
	  selected, the module will be called i810.  AGP support is required
	  for this driver to work.

source "drivers/gpu/drm/i915/Kconfig"

config DRM_MGA
	tristate "Matrox g200/g400"
	depends on DRM && PCI
	select FW_LOADER
	help
	  Choose this option if you have a Matrox G200, G400 or G450 graphics
	  card.  If M is selected, the module will be called mga.  AGP
	  support is required for this driver to work.

config DRM_SIS
	tristate "SiS video cards"
	depends on DRM && AGP
	depends on FB_SIS || FB_SIS=n
	help
	  Choose this option if you have a SiS 630 or compatible video
          chipset. If M is selected the module will be called sis. AGP
          support is required for this driver to work.

config DRM_VIA
	tristate "Via unichrome video cards"
	depends on DRM && PCI
	help
	  Choose this option if you have a Via unichrome or compatible video
	  chipset. If M is selected the module will be called via.

config DRM_SAVAGE
	tristate "Savage video cards"
	depends on DRM && PCI
	help
	  Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister
	  chipset. If M is selected the module will be called savage.

config DRM_VGEM
	tristate "Virtual GEM provider"
	depends on DRM
@@ -279,3 +222,82 @@ source "drivers/gpu/drm/arc/Kconfig"
source "drivers/gpu/drm/hisilicon/Kconfig"

source "drivers/gpu/drm/mediatek/Kconfig"

# Keep legacy drivers last

menuconfig DRM_LEGACY
	bool "Enable legacy drivers (DANGEROUS)"
	depends on DRM
	depends on BROKEN
	help
	  Enable legacy DRI1 drivers. Those drivers expose unsafe and dangerous
	  APIs to user-space, which can be used to circumvent access
	  restrictions and other security measures. For backwards compatibility
	  those drivers are still available, but their use is highly
	  inadvisable and might harm your system.

	  You are recommended to use the safe modeset-only drivers instead, and
	  perform 3D emulation in user-space.

	  Unless you have strong reasons to go rogue, say "N".

if DRM_LEGACY

config DRM_TDFX
	tristate "3dfx Banshee/Voodoo3+"
	depends on DRM && PCI
	help
	  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
	  graphics card.  If M is selected, the module will be called tdfx.

config DRM_R128
	tristate "ATI Rage 128"
	depends on DRM && PCI
	select FW_LOADER
	help
	  Choose this option if you have an ATI Rage 128 graphics card.  If M
	  is selected, the module will be called r128.  AGP support for
	  this card is strongly suggested (unless you have a PCI version).

config DRM_I810
	tristate "Intel I810"
	# !PREEMPT because of missing ioctl locking
	depends on DRM && AGP && AGP_INTEL && (!PREEMPT || BROKEN)
	help
	  Choose this option if you have an Intel I810 graphics card.  If M is
	  selected, the module will be called i810.  AGP support is required
	  for this driver to work.

config DRM_MGA
	tristate "Matrox g200/g400"
	depends on DRM && PCI
	select FW_LOADER
	help
	  Choose this option if you have a Matrox G200, G400 or G450 graphics
	  card.  If M is selected, the module will be called mga.  AGP
	  support is required for this driver to work.

config DRM_SIS
	tristate "SiS video cards"
	depends on DRM && AGP
	depends on FB_SIS || FB_SIS=n
	help
	  Choose this option if you have a SiS 630 or compatible video
	  chipset. If M is selected the module will be called sis. AGP
	  support is required for this driver to work.

config DRM_VIA
	tristate "Via unichrome video cards"
	depends on DRM && PCI
	help
	  Choose this option if you have a Via unichrome or compatible video
	  chipset. If M is selected the module will be called via.

config DRM_SAVAGE
	tristate "Savage video cards"
	depends on DRM && PCI
	help
	  Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister
	  chipset. If M is selected the module will be called savage.

endif # DRM_LEGACY
+2 −1
Original line number Diff line number Diff line
@@ -13,7 +13,8 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \
		drm_trace_points.o drm_global.o drm_prime.o \
		drm_rect.o drm_vma_manager.o drm_flip_work.o \
		drm_modeset_lock.o drm_atomic.o drm_bridge.o \
		drm_framebuffer.o drm_connector.o drm_blend.o
		drm_framebuffer.o drm_connector.o drm_blend.o \
		drm_encoder.o drm_mode_object.o drm_property.o

drm-$(CONFIG_COMPAT) += drm_ioc32.o
drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
+2 −1
Original line number Diff line number Diff line
@@ -91,7 +91,8 @@ static void malidp_atomic_commit_tail(struct drm_atomic_state *state)

	drm_atomic_helper_commit_modeset_disables(drm, state);
	drm_atomic_helper_commit_modeset_enables(drm, state);
	drm_atomic_helper_commit_planes(drm, state, true);
	drm_atomic_helper_commit_planes(drm, state,
					DRM_PLANE_COMMIT_ACTIVE_ONLY);

	malidp_atomic_commit_hw_done(state);

Loading