1*4882a593Smuzhiyun========================= 2*4882a593SmuzhiyunKernel Mode Setting (KMS) 3*4882a593Smuzhiyun========================= 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunDrivers must initialize the mode setting core by calling 6*4882a593Smuzhiyundrmm_mode_config_init() on the DRM device. The function 7*4882a593Smuzhiyuninitializes the :c:type:`struct drm_device <drm_device>` 8*4882a593Smuzhiyunmode_config field and never fails. Once done, mode configuration must 9*4882a593Smuzhiyunbe setup by initializing the following fields. 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun- int min_width, min_height; int max_width, max_height; 12*4882a593Smuzhiyun Minimum and maximum width and height of the frame buffers in pixel 13*4882a593Smuzhiyun units. 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun- struct drm_mode_config_funcs \*funcs; 16*4882a593Smuzhiyun Mode setting functions. 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunOverview 19*4882a593Smuzhiyun======== 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun.. kernel-render:: DOT 22*4882a593Smuzhiyun :alt: KMS Display Pipeline 23*4882a593Smuzhiyun :caption: KMS Display Pipeline Overview 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun digraph "KMS" { 26*4882a593Smuzhiyun node [shape=box] 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun subgraph cluster_static { 29*4882a593Smuzhiyun style=dashed 30*4882a593Smuzhiyun label="Static Objects" 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun node [bgcolor=grey style=filled] 33*4882a593Smuzhiyun "drm_plane A" -> "drm_crtc" 34*4882a593Smuzhiyun "drm_plane B" -> "drm_crtc" 35*4882a593Smuzhiyun "drm_crtc" -> "drm_encoder A" 36*4882a593Smuzhiyun "drm_crtc" -> "drm_encoder B" 37*4882a593Smuzhiyun } 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun subgraph cluster_user_created { 40*4882a593Smuzhiyun style=dashed 41*4882a593Smuzhiyun label="Userspace-Created" 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun node [shape=oval] 44*4882a593Smuzhiyun "drm_framebuffer 1" -> "drm_plane A" 45*4882a593Smuzhiyun "drm_framebuffer 2" -> "drm_plane B" 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun subgraph cluster_connector { 49*4882a593Smuzhiyun style=dashed 50*4882a593Smuzhiyun label="Hotpluggable" 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun "drm_encoder A" -> "drm_connector A" 53*4882a593Smuzhiyun "drm_encoder B" -> "drm_connector B" 54*4882a593Smuzhiyun } 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun 57*4882a593SmuzhiyunThe basic object structure KMS presents to userspace is fairly simple. 58*4882a593SmuzhiyunFramebuffers (represented by :c:type:`struct drm_framebuffer <drm_framebuffer>`, 59*4882a593Smuzhiyunsee `Frame Buffer Abstraction`_) feed into planes. Planes are represented by 60*4882a593Smuzhiyun:c:type:`struct drm_plane <drm_plane>`, see `Plane Abstraction`_ for more 61*4882a593Smuzhiyundetails. One or more (or even no) planes feed their pixel data into a CRTC 62*4882a593Smuzhiyun(represented by :c:type:`struct drm_crtc <drm_crtc>`, see `CRTC Abstraction`_) 63*4882a593Smuzhiyunfor blending. The precise blending step is explained in more detail in `Plane 64*4882a593SmuzhiyunComposition Properties`_ and related chapters. 65*4882a593Smuzhiyun 66*4882a593SmuzhiyunFor the output routing the first step is encoders (represented by 67*4882a593Smuzhiyun:c:type:`struct drm_encoder <drm_encoder>`, see `Encoder Abstraction`_). Those 68*4882a593Smuzhiyunare really just internal artifacts of the helper libraries used to implement KMS 69*4882a593Smuzhiyundrivers. Besides that they make it unecessarily more complicated for userspace 70*4882a593Smuzhiyunto figure out which connections between a CRTC and a connector are possible, and 71*4882a593Smuzhiyunwhat kind of cloning is supported, they serve no purpose in the userspace API. 72*4882a593SmuzhiyunUnfortunately encoders have been exposed to userspace, hence can't remove them 73*4882a593Smuzhiyunat this point. Futhermore the exposed restrictions are often wrongly set by 74*4882a593Smuzhiyundrivers, and in many cases not powerful enough to express the real restrictions. 75*4882a593SmuzhiyunA CRTC can be connected to multiple encoders, and for an active CRTC there must 76*4882a593Smuzhiyunbe at least one encoder. 77*4882a593Smuzhiyun 78*4882a593SmuzhiyunThe final, and real, endpoint in the display chain is the connector (represented 79*4882a593Smuzhiyunby :c:type:`struct drm_connector <drm_connector>`, see `Connector 80*4882a593SmuzhiyunAbstraction`_). Connectors can have different possible encoders, but the kernel 81*4882a593Smuzhiyundriver selects which encoder to use for each connector. The use case is DVI, 82*4882a593Smuzhiyunwhich could switch between an analog and a digital encoder. Encoders can also 83*4882a593Smuzhiyundrive multiple different connectors. There is exactly one active connector for 84*4882a593Smuzhiyunevery active encoder. 85*4882a593Smuzhiyun 86*4882a593SmuzhiyunInternally the output pipeline is a bit more complex and matches today's 87*4882a593Smuzhiyunhardware more closely: 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun.. kernel-render:: DOT 90*4882a593Smuzhiyun :alt: KMS Output Pipeline 91*4882a593Smuzhiyun :caption: KMS Output Pipeline 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun digraph "Output Pipeline" { 94*4882a593Smuzhiyun node [shape=box] 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun subgraph { 97*4882a593Smuzhiyun "drm_crtc" [bgcolor=grey style=filled] 98*4882a593Smuzhiyun } 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun subgraph cluster_internal { 101*4882a593Smuzhiyun style=dashed 102*4882a593Smuzhiyun label="Internal Pipeline" 103*4882a593Smuzhiyun { 104*4882a593Smuzhiyun node [bgcolor=grey style=filled] 105*4882a593Smuzhiyun "drm_encoder A"; 106*4882a593Smuzhiyun "drm_encoder B"; 107*4882a593Smuzhiyun "drm_encoder C"; 108*4882a593Smuzhiyun } 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun { 111*4882a593Smuzhiyun node [bgcolor=grey style=filled] 112*4882a593Smuzhiyun "drm_encoder B" -> "drm_bridge B" 113*4882a593Smuzhiyun "drm_encoder C" -> "drm_bridge C1" 114*4882a593Smuzhiyun "drm_bridge C1" -> "drm_bridge C2"; 115*4882a593Smuzhiyun } 116*4882a593Smuzhiyun } 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun "drm_crtc" -> "drm_encoder A" 119*4882a593Smuzhiyun "drm_crtc" -> "drm_encoder B" 120*4882a593Smuzhiyun "drm_crtc" -> "drm_encoder C" 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun subgraph cluster_output { 124*4882a593Smuzhiyun style=dashed 125*4882a593Smuzhiyun label="Outputs" 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun "drm_encoder A" -> "drm_connector A"; 128*4882a593Smuzhiyun "drm_bridge B" -> "drm_connector B"; 129*4882a593Smuzhiyun "drm_bridge C2" -> "drm_connector C"; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun "drm_panel" 132*4882a593Smuzhiyun } 133*4882a593Smuzhiyun } 134*4882a593Smuzhiyun 135*4882a593SmuzhiyunInternally two additional helper objects come into play. First, to be able to 136*4882a593Smuzhiyunshare code for encoders (sometimes on the same SoC, sometimes off-chip) one or 137*4882a593Smuzhiyunmore :ref:`drm_bridges` (represented by :c:type:`struct drm_bridge 138*4882a593Smuzhiyun<drm_bridge>`) can be linked to an encoder. This link is static and cannot be 139*4882a593Smuzhiyunchanged, which means the cross-bar (if there is any) needs to be mapped between 140*4882a593Smuzhiyunthe CRTC and any encoders. Often for drivers with bridges there's no code left 141*4882a593Smuzhiyunat the encoder level. Atomic drivers can leave out all the encoder callbacks to 142*4882a593Smuzhiyunessentially only leave a dummy routing object behind, which is needed for 143*4882a593Smuzhiyunbackwards compatibility since encoders are exposed to userspace. 144*4882a593Smuzhiyun 145*4882a593SmuzhiyunThe second object is for panels, represented by :c:type:`struct drm_panel 146*4882a593Smuzhiyun<drm_panel>`, see :ref:`drm_panel_helper`. Panels do not have a fixed binding 147*4882a593Smuzhiyunpoint, but are generally linked to the driver private structure that embeds 148*4882a593Smuzhiyun:c:type:`struct drm_connector <drm_connector>`. 149*4882a593Smuzhiyun 150*4882a593SmuzhiyunNote that currently the bridge chaining and interactions with connectors and 151*4882a593Smuzhiyunpanels are still in-flux and not really fully sorted out yet. 152*4882a593Smuzhiyun 153*4882a593SmuzhiyunKMS Core Structures and Functions 154*4882a593Smuzhiyun================================= 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_mode_config.h 157*4882a593Smuzhiyun :internal: 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_mode_config.c 160*4882a593Smuzhiyun :export: 161*4882a593Smuzhiyun 162*4882a593SmuzhiyunModeset Base Object Abstraction 163*4882a593Smuzhiyun=============================== 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun.. kernel-render:: DOT 166*4882a593Smuzhiyun :alt: Mode Objects and Properties 167*4882a593Smuzhiyun :caption: Mode Objects and Properties 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun digraph { 170*4882a593Smuzhiyun node [shape=box] 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun "drm_property A" -> "drm_mode_object A" 173*4882a593Smuzhiyun "drm_property A" -> "drm_mode_object B" 174*4882a593Smuzhiyun "drm_property B" -> "drm_mode_object A" 175*4882a593Smuzhiyun } 176*4882a593Smuzhiyun 177*4882a593SmuzhiyunThe base structure for all KMS objects is :c:type:`struct drm_mode_object 178*4882a593Smuzhiyun<drm_mode_object>`. One of the base services it provides is tracking properties, 179*4882a593Smuzhiyunwhich are especially important for the atomic IOCTL (see `Atomic Mode 180*4882a593SmuzhiyunSetting`_). The somewhat surprising part here is that properties are not 181*4882a593Smuzhiyundirectly instantiated on each object, but free-standing mode objects themselves, 182*4882a593Smuzhiyunrepresented by :c:type:`struct drm_property <drm_property>`, which only specify 183*4882a593Smuzhiyunthe type and value range of a property. Any given property can be attached 184*4882a593Smuzhiyunmultiple times to different objects using drm_object_attach_property(). 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_mode_object.h 187*4882a593Smuzhiyun :internal: 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_mode_object.c 190*4882a593Smuzhiyun :export: 191*4882a593Smuzhiyun 192*4882a593SmuzhiyunAtomic Mode Setting 193*4882a593Smuzhiyun=================== 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun.. kernel-render:: DOT 197*4882a593Smuzhiyun :alt: Mode Objects and Properties 198*4882a593Smuzhiyun :caption: Mode Objects and Properties 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun digraph { 201*4882a593Smuzhiyun node [shape=box] 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun subgraph cluster_state { 204*4882a593Smuzhiyun style=dashed 205*4882a593Smuzhiyun label="Free-standing state" 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun "drm_atomic_state" -> "duplicated drm_plane_state A" 208*4882a593Smuzhiyun "drm_atomic_state" -> "duplicated drm_plane_state B" 209*4882a593Smuzhiyun "drm_atomic_state" -> "duplicated drm_crtc_state" 210*4882a593Smuzhiyun "drm_atomic_state" -> "duplicated drm_connector_state" 211*4882a593Smuzhiyun "drm_atomic_state" -> "duplicated driver private state" 212*4882a593Smuzhiyun } 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun subgraph cluster_current { 215*4882a593Smuzhiyun style=dashed 216*4882a593Smuzhiyun label="Current state" 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun "drm_device" -> "drm_plane A" 219*4882a593Smuzhiyun "drm_device" -> "drm_plane B" 220*4882a593Smuzhiyun "drm_device" -> "drm_crtc" 221*4882a593Smuzhiyun "drm_device" -> "drm_connector" 222*4882a593Smuzhiyun "drm_device" -> "driver private object" 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun "drm_plane A" -> "drm_plane_state A" 225*4882a593Smuzhiyun "drm_plane B" -> "drm_plane_state B" 226*4882a593Smuzhiyun "drm_crtc" -> "drm_crtc_state" 227*4882a593Smuzhiyun "drm_connector" -> "drm_connector_state" 228*4882a593Smuzhiyun "driver private object" -> "driver private state" 229*4882a593Smuzhiyun } 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun "drm_atomic_state" -> "drm_device" [label="atomic_commit"] 232*4882a593Smuzhiyun "duplicated drm_plane_state A" -> "drm_device"[style=invis] 233*4882a593Smuzhiyun } 234*4882a593Smuzhiyun 235*4882a593SmuzhiyunAtomic provides transactional modeset (including planes) updates, but a 236*4882a593Smuzhiyunbit differently from the usual transactional approach of try-commit and 237*4882a593Smuzhiyunrollback: 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun- Firstly, no hardware changes are allowed when the commit would fail. This 240*4882a593Smuzhiyun allows us to implement the DRM_MODE_ATOMIC_TEST_ONLY mode, which allows 241*4882a593Smuzhiyun userspace to explore whether certain configurations would work or not. 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun- This would still allow setting and rollback of just the software state, 244*4882a593Smuzhiyun simplifying conversion of existing drivers. But auditing drivers for 245*4882a593Smuzhiyun correctness of the atomic_check code becomes really hard with that: Rolling 246*4882a593Smuzhiyun back changes in data structures all over the place is hard to get right. 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun- Lastly, for backwards compatibility and to support all use-cases, atomic 249*4882a593Smuzhiyun updates need to be incremental and be able to execute in parallel. Hardware 250*4882a593Smuzhiyun doesn't always allow it, but where possible plane updates on different CRTCs 251*4882a593Smuzhiyun should not interfere, and not get stalled due to output routing changing on 252*4882a593Smuzhiyun different CRTCs. 253*4882a593Smuzhiyun 254*4882a593SmuzhiyunTaken all together there's two consequences for the atomic design: 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun- The overall state is split up into per-object state structures: 257*4882a593Smuzhiyun :c:type:`struct drm_plane_state <drm_plane_state>` for planes, :c:type:`struct 258*4882a593Smuzhiyun drm_crtc_state <drm_crtc_state>` for CRTCs and :c:type:`struct 259*4882a593Smuzhiyun drm_connector_state <drm_connector_state>` for connectors. These are the only 260*4882a593Smuzhiyun objects with userspace-visible and settable state. For internal state drivers 261*4882a593Smuzhiyun can subclass these structures through embeddeding, or add entirely new state 262*4882a593Smuzhiyun structures for their globally shared hardware functions, see :c:type:`struct 263*4882a593Smuzhiyun drm_private_state<drm_private_state>`. 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun- An atomic update is assembled and validated as an entirely free-standing pile 266*4882a593Smuzhiyun of structures within the :c:type:`drm_atomic_state <drm_atomic_state>` 267*4882a593Smuzhiyun container. Driver private state structures are also tracked in the same 268*4882a593Smuzhiyun structure; see the next chapter. Only when a state is committed is it applied 269*4882a593Smuzhiyun to the driver and modeset objects. This way rolling back an update boils down 270*4882a593Smuzhiyun to releasing memory and unreferencing objects like framebuffers. 271*4882a593Smuzhiyun 272*4882a593SmuzhiyunLocking of atomic state structures is internally using :c:type:`struct 273*4882a593Smuzhiyundrm_modeset_lock <drm_modeset_lock>`. As a general rule the locking shouldn't be 274*4882a593Smuzhiyunexposed to drivers, instead the right locks should be automatically acquired by 275*4882a593Smuzhiyunany function that duplicates or peeks into a state, like e.g. 276*4882a593Smuzhiyundrm_atomic_get_crtc_state(). Locking only protects the software data 277*4882a593Smuzhiyunstructure, ordering of committing state changes to hardware is sequenced using 278*4882a593Smuzhiyun:c:type:`struct drm_crtc_commit <drm_crtc_commit>`. 279*4882a593Smuzhiyun 280*4882a593SmuzhiyunRead on in this chapter, and also in :ref:`drm_atomic_helper` for more detailed 281*4882a593Smuzhiyuncoverage of specific topics. 282*4882a593Smuzhiyun 283*4882a593SmuzhiyunHandling Driver Private State 284*4882a593Smuzhiyun----------------------------- 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic.c 287*4882a593Smuzhiyun :doc: handling driver private state 288*4882a593Smuzhiyun 289*4882a593SmuzhiyunAtomic Mode Setting Function Reference 290*4882a593Smuzhiyun-------------------------------------- 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_atomic.h 293*4882a593Smuzhiyun :internal: 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic.c 296*4882a593Smuzhiyun :export: 297*4882a593Smuzhiyun 298*4882a593SmuzhiyunAtomic Mode Setting IOCTL and UAPI Functions 299*4882a593Smuzhiyun-------------------------------------------- 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic_uapi.c 302*4882a593Smuzhiyun :doc: overview 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic_uapi.c 305*4882a593Smuzhiyun :export: 306*4882a593Smuzhiyun 307*4882a593SmuzhiyunCRTC Abstraction 308*4882a593Smuzhiyun================ 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_crtc.c 311*4882a593Smuzhiyun :doc: overview 312*4882a593Smuzhiyun 313*4882a593SmuzhiyunCRTC Functions Reference 314*4882a593Smuzhiyun-------------------------------- 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_crtc.h 317*4882a593Smuzhiyun :internal: 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_crtc.c 320*4882a593Smuzhiyun :export: 321*4882a593Smuzhiyun 322*4882a593SmuzhiyunFrame Buffer Abstraction 323*4882a593Smuzhiyun======================== 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c 326*4882a593Smuzhiyun :doc: overview 327*4882a593Smuzhiyun 328*4882a593SmuzhiyunFrame Buffer Functions Reference 329*4882a593Smuzhiyun-------------------------------- 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_framebuffer.h 332*4882a593Smuzhiyun :internal: 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c 335*4882a593Smuzhiyun :export: 336*4882a593Smuzhiyun 337*4882a593SmuzhiyunDRM Format Handling 338*4882a593Smuzhiyun=================== 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun.. kernel-doc:: include/uapi/drm/drm_fourcc.h 341*4882a593Smuzhiyun :doc: overview 342*4882a593Smuzhiyun 343*4882a593SmuzhiyunFormat Functions Reference 344*4882a593Smuzhiyun-------------------------- 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_fourcc.h 347*4882a593Smuzhiyun :internal: 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_fourcc.c 350*4882a593Smuzhiyun :export: 351*4882a593Smuzhiyun 352*4882a593SmuzhiyunDumb Buffer Objects 353*4882a593Smuzhiyun=================== 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_dumb_buffers.c 356*4882a593Smuzhiyun :doc: overview 357*4882a593Smuzhiyun 358*4882a593SmuzhiyunPlane Abstraction 359*4882a593Smuzhiyun================= 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_plane.c 362*4882a593Smuzhiyun :doc: overview 363*4882a593Smuzhiyun 364*4882a593SmuzhiyunPlane Functions Reference 365*4882a593Smuzhiyun------------------------- 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_plane.h 368*4882a593Smuzhiyun :internal: 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_plane.c 371*4882a593Smuzhiyun :export: 372*4882a593Smuzhiyun 373*4882a593SmuzhiyunDisplay Modes Function Reference 374*4882a593Smuzhiyun================================ 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_modes.h 377*4882a593Smuzhiyun :internal: 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_modes.c 380*4882a593Smuzhiyun :export: 381*4882a593Smuzhiyun 382*4882a593SmuzhiyunConnector Abstraction 383*4882a593Smuzhiyun===================== 384*4882a593Smuzhiyun 385*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c 386*4882a593Smuzhiyun :doc: overview 387*4882a593Smuzhiyun 388*4882a593SmuzhiyunConnector Functions Reference 389*4882a593Smuzhiyun----------------------------- 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_connector.h 392*4882a593Smuzhiyun :internal: 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c 395*4882a593Smuzhiyun :export: 396*4882a593Smuzhiyun 397*4882a593SmuzhiyunWriteback Connectors 398*4882a593Smuzhiyun-------------------- 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_writeback.h 401*4882a593Smuzhiyun :internal: 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_writeback.c 404*4882a593Smuzhiyun :doc: overview 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_writeback.c 407*4882a593Smuzhiyun :export: 408*4882a593Smuzhiyun 409*4882a593SmuzhiyunEncoder Abstraction 410*4882a593Smuzhiyun=================== 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_encoder.c 413*4882a593Smuzhiyun :doc: overview 414*4882a593Smuzhiyun 415*4882a593SmuzhiyunEncoder Functions Reference 416*4882a593Smuzhiyun--------------------------- 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_encoder.h 419*4882a593Smuzhiyun :internal: 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_encoder.c 422*4882a593Smuzhiyun :export: 423*4882a593Smuzhiyun 424*4882a593SmuzhiyunKMS Locking 425*4882a593Smuzhiyun=========== 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c 428*4882a593Smuzhiyun :doc: kms locking 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_modeset_lock.h 431*4882a593Smuzhiyun :internal: 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c 434*4882a593Smuzhiyun :export: 435*4882a593Smuzhiyun 436*4882a593SmuzhiyunKMS Properties 437*4882a593Smuzhiyun============== 438*4882a593Smuzhiyun 439*4882a593SmuzhiyunProperty Types and Blob Property Support 440*4882a593Smuzhiyun---------------------------------------- 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_property.c 443*4882a593Smuzhiyun :doc: overview 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_property.h 446*4882a593Smuzhiyun :internal: 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_property.c 449*4882a593Smuzhiyun :export: 450*4882a593Smuzhiyun 451*4882a593SmuzhiyunStandard Connector Properties 452*4882a593Smuzhiyun----------------------------- 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c 455*4882a593Smuzhiyun :doc: standard connector properties 456*4882a593Smuzhiyun 457*4882a593SmuzhiyunHDMI Specific Connector Properties 458*4882a593Smuzhiyun---------------------------------- 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c 461*4882a593Smuzhiyun :doc: HDMI connector properties 462*4882a593Smuzhiyun 463*4882a593SmuzhiyunStandard CRTC Properties 464*4882a593Smuzhiyun------------------------ 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_crtc.c 467*4882a593Smuzhiyun :doc: standard CRTC properties 468*4882a593Smuzhiyun 469*4882a593SmuzhiyunPlane Composition Properties 470*4882a593Smuzhiyun---------------------------- 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_blend.c 473*4882a593Smuzhiyun :doc: overview 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_blend.c 476*4882a593Smuzhiyun :export: 477*4882a593Smuzhiyun 478*4882a593SmuzhiyunFB_DAMAGE_CLIPS 479*4882a593Smuzhiyun~~~~~~~~~~~~~~~ 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_damage_helper.c 482*4882a593Smuzhiyun :doc: overview 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_damage_helper.c 485*4882a593Smuzhiyun :export: 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_damage_helper.h 488*4882a593Smuzhiyun :internal: 489*4882a593Smuzhiyun 490*4882a593SmuzhiyunColor Management Properties 491*4882a593Smuzhiyun--------------------------- 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c 494*4882a593Smuzhiyun :doc: overview 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c 497*4882a593Smuzhiyun :export: 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_color_mgmt.h 500*4882a593Smuzhiyun :internal: 501*4882a593Smuzhiyun 502*4882a593SmuzhiyunTile Group Property 503*4882a593Smuzhiyun------------------- 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c 506*4882a593Smuzhiyun :doc: Tile group 507*4882a593Smuzhiyun 508*4882a593SmuzhiyunExplicit Fencing Properties 509*4882a593Smuzhiyun--------------------------- 510*4882a593Smuzhiyun 511*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic_uapi.c 512*4882a593Smuzhiyun :doc: explicit fencing properties 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun 515*4882a593SmuzhiyunVariable Refresh Properties 516*4882a593Smuzhiyun--------------------------- 517*4882a593Smuzhiyun 518*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c 519*4882a593Smuzhiyun :doc: Variable refresh properties 520*4882a593Smuzhiyun 521*4882a593SmuzhiyunExisting KMS Properties 522*4882a593Smuzhiyun----------------------- 523*4882a593Smuzhiyun 524*4882a593SmuzhiyunThe following table gives description of drm properties exposed by various 525*4882a593Smuzhiyunmodules/drivers. Because this table is very unwieldy, do not add any new 526*4882a593Smuzhiyunproperties here. Instead document them in a section above. 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun.. csv-table:: 529*4882a593Smuzhiyun :header-rows: 1 530*4882a593Smuzhiyun :file: kms-properties.csv 531*4882a593Smuzhiyun 532*4882a593SmuzhiyunVertical Blanking 533*4882a593Smuzhiyun================= 534*4882a593Smuzhiyun 535*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank.c 536*4882a593Smuzhiyun :doc: vblank handling 537*4882a593Smuzhiyun 538*4882a593SmuzhiyunVertical Blanking and Interrupt Handling Functions Reference 539*4882a593Smuzhiyun------------------------------------------------------------ 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_vblank.h 542*4882a593Smuzhiyun :internal: 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank.c 545*4882a593Smuzhiyun :export: 546*4882a593Smuzhiyun 547*4882a593SmuzhiyunVertical Blank Work 548*4882a593Smuzhiyun=================== 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank_work.c 551*4882a593Smuzhiyun :doc: vblank works 552*4882a593Smuzhiyun 553*4882a593SmuzhiyunVertical Blank Work Functions Reference 554*4882a593Smuzhiyun--------------------------------------- 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_vblank_work.h 557*4882a593Smuzhiyun :internal: 558*4882a593Smuzhiyun 559*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank_work.c 560*4882a593Smuzhiyun :export: 561