€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/translations/zh_CN/gpu/todo”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/zh_TW/gpu/todo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/it_IT/gpu/todo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ja_JP/gpu/todo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/ko_KR/gpu/todo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/pt_BR/gpu/todo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ/translations/sp_SP/gpu/todo”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒtarget”“”)�”}”(hŒ .. _todo:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œtodo”uh1hµh´Khhh²hh³Œ6/var/lib/git/docbuild/linux/Documentation/gpu/todo.rst”ubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ TODO list”h]”hŒ TODO list”…”�”}”(hhËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhhÆh²hh³hÃh´KubhŒ paragraph”“”)�”}”(hŒ�This section contains a list of smaller janitorial tasks in the kernel DRM graphics subsystem useful as newbie projects. Or for slow rainy days.”h]”hŒ�This section contains a list of smaller janitorial tasks in the kernel DRM graphics subsystem useful as newbie projects. Or for slow rainy days.”…”�”}”(hhÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KhhÆh²hubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Difficulty”h]”hŒ Difficulty”…”�”}”(hhìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhhéh²hh³hÃh´K ubhÚ)�”}”(hŒ=To make it easier task are categorized into different levels:”h]”hŒ=To make it easier task are categorized into different levels:”…”�”}”(hhúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K hhéh²hubhÚ)�”}”(hŒ:Starter: Good tasks to get started with the DRM subsystem.”h]”hŒ:Starter: Good tasks to get started with the DRM subsystem.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khhéh²hubhÚ)�”}”(hŒòIntermediate: Tasks which need some experience with working in the DRM subsystem, or some specific GPU/display graphics knowledge. For debugging issue it's good to have the relevant hardware (or a virtual driver set up) available for testing.”h]”hŒôIntermediate: Tasks which need some experience with working in the DRM subsystem, or some specific GPU/display graphics knowledge. For debugging issue it’s good to have the relevant hardware (or a virtual driver set up) available for testing.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khhéh²hubhÚ)�”}”(hŒ¦Advanced: Tricky tasks that need fairly good understanding of the DRM subsystem and graphics topics. Generally need the relevant hardware for development and testing.”h]”hŒ¦Advanced: Tricky tasks that need fairly good understanding of the DRM subsystem and graphics topics. Generally need the relevant hardware for development and testing.”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khhéh²hubhÚ)�”}”(hŒƒExpert: Only attempt these if you've successfully completed some tricky refactorings already and are an expert in the specific area”h]”hŒ…Expert: Only attempt these if you’ve successfully completed some tricky refactorings already and are an expert in the specific area”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khhéh²hubhÅ)�”}”(hhh]”hÊ)�”}”(hŒSubsystem-wide refactorings”h]”hŒSubsystem-wide refactorings”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj@h²hh³hÃh´Kubah}”(h]”Œsubsystem-wide-refactorings”ah ]”h"]”Œsubsystem-wide refactorings”ah$]”h&]”uh1hÄhhéh²hh³hÃh´Kubeh}”(h]”Œ difficulty”ah ]”h"]”Œ difficulty”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ#Open-code drm_simple_encoder_init()”h]”hŒ#Open-code drm_simple_encoder_init()”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjah²hh³hÃh´K!ubhÚ)�”}”(hŒ°The helper drm_simple_encoder_init() was supposed to simplify encoder initialization. Instead it only added an intermediate layer between atomic modesetting and the DRM driver.”h]”hŒ°The helper drm_simple_encoder_init() was supposed to simplify encoder initialization. Instead it only added an intermediate layer between atomic modesetting and the DRM driver.”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K#hjah²hubhÚ)�”}”(hŒÆThe task here is to remove drm_simple_encoder_init(). Search for a driver that calls drm_simple_encoder_init() and inline the helper. The driver will also need its own instance of drm_encoder_funcs.”h]”hŒÆThe task here is to remove drm_simple_encoder_init(). Search for a driver that calls drm_simple_encoder_init() and inline the helper. The driver will also need its own instance of drm_encoder_funcs.”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K'hjah²hubhÚ)�”}”(hŒ8Contact: Thomas Zimmermann, respective driver maintainer”h]”hŒ8Contact: Thomas Zimmermann, respective driver maintainer”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K+hjah²hubhÚ)�”}”(hŒ Level: Easy”h]”hŒ Level: Easy”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K-hjah²hubeh}”(h]”Œ!open-code-drm-simple-encoder-init”ah ]”h"]”Œ#open-code drm_simple_encoder_init()”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K!ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒBReplace struct drm_simple_display_pipe with regular atomic helpers”h]”hŒBReplace struct drm_simple_display_pipe with regular atomic helpers”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj²h²hh³hÃh´K0ubhÚ)�”}”(hŒÇThe data type struct drm_simple_display_pipe and its helpers were supposed to simplify driver development. Instead they only added an intermediate layer between atomic modesetting and the DRM driver.”h]”hŒÇThe data type struct drm_simple_display_pipe and its helpers were supposed to simplify driver development. Instead they only added an intermediate layer between atomic modesetting and the DRM driver.”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K2hj²h²hubhÚ)�”}”(hXwThere are still drivers that use drm_simple_display_pipe. The task here is to convert them to use regular atomic helpers. Search for a driver that calls drm_simple_display_pipe_init() and inline all helpers from drm_simple_kms_helper.c into the driver, such that no simple-KMS interfaces are required. Please also rename all inlined functions according to driver conventions.”h]”hXwThere are still drivers that use drm_simple_display_pipe. The task here is to convert them to use regular atomic helpers. Search for a driver that calls drm_simple_display_pipe_init() and inline all helpers from drm_simple_kms_helper.c into the driver, such that no simple-KMS interfaces are required. Please also rename all inlined functions according to driver conventions.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K6hj²h²hubhÚ)�”}”(hŒ8Contact: Thomas Zimmermann, respective driver maintainer”h]”hŒ8Contact: Thomas Zimmermann, respective driver maintainer”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Khj²h²hubeh}”(h]”ŒBreplace-struct-drm-simple-display-pipe-with-regular-atomic-helpers”ah ]”h"]”ŒBreplace struct drm_simple_display_pipe with regular atomic helpers”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K0ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ-Remove custom dumb_map_offset implementations”h]”hŒ-Remove custom dumb_map_offset implementations”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjh²hh³hÃh´KAubhÚ)�”}”(hŒûAll GEM based drivers should be using drm_gem_create_mmap_offset() instead. Audit each individual driver, make sure it'll work with the generic implementation (there's lots of outdated locking leftovers in various implementations), and then remove it.”h]”hŒÿAll GEM based drivers should be using drm_gem_create_mmap_offset() instead. Audit each individual driver, make sure it’ll work with the generic implementation (there’s lots of outdated locking leftovers in various implementations), and then remove it.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KChjh²hubhÚ)�”}”(hŒ5Contact: Simona Vetter, respective driver maintainers”h]”hŒ5Contact: Simona Vetter, respective driver maintainers”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KHhjh²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KJhjh²hubeh}”(h]”Œ-remove-custom-dumb-map-offset-implementations”ah ]”h"]”Œ-remove custom dumb_map_offset implementations”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KAubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ2Convert existing KMS drivers to atomic modesetting”h]”hŒ2Convert existing KMS drivers to atomic modesetting”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjFh²hh³hÃh´KMubhÚ)�”}”(hŒç3.19 has the atomic modeset interfaces and helpers, so drivers can now be converted over. Modern compositors like Wayland or Surfaceflinger on Android really want an atomic modeset interface, so this is all about the bright future.”h]”hŒç3.19 has the atomic modeset interfaces and helpers, so drivers can now be converted over. Modern compositors like Wayland or Surfaceflinger on Android really want an atomic modeset interface, so this is all about the bright future.”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KOhjFh²hubhÚ)�”}”(hŒ½There is a conversion guide for atomic [1]_ and all you need is a GPU for a non-converted driver. The "Atomic mode setting design overview" series [2]_ [3]_ at LWN.net can also be helpful.”h]”(hŒ'There is a conversion guide for atomic ”…”�”}”(hjeh²hh³Nh´NubhŒfootnote_reference”“”)�”}”(hŒ[1]_”h]”hŒ1”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”Œid1”ah ]”h"]”h$]”h&]”hÁŒid4”Œdocname”Œgpu/todo”uh1jmhjeŒresolved”KubhŒm and all you need is a GPU for a non-converted driver. The “Atomic mode setting design overviewâ€� series ”…”�”}”(hjeh²hh³Nh´Nubjn)�”}”(hŒ[2]_”h]”hŒ2”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”Œid2”ah ]”h"]”h$]”h&]”hÁŒid5”jj€uh1jmhjej�KubhŒ ”…”�”}”(hjeh²hh³Nh´Nubjn)�”}”(hŒ[3]_”h]”hŒ3”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”Œid3”ah ]”h"]”h$]”h&]”hÁŒid6”jj€uh1jmhjej�KubhŒ at LWN.net can also be helpful.”…”�”}”(hjeh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KThjFh²hubhÚ)�”}”(hŒ×As part of this drivers also need to convert to universal plane (which means exposing primary & cursor as proper plane objects). But that's much easier to do by directly using the new atomic helper driver callbacks.”h]”hŒÙAs part of this drivers also need to convert to universal plane (which means exposing primary & cursor as proper plane objects). But that’s much easier to do by directly using the new atomic helper driver callbacks.”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KXhjFh²hubhŒ block_quote”“”)�”}”(hŒ¡.. [1] https://blog.ffwll.ch/2014/11/atomic-modeset-support-for-kms-drivers.html .. [2] https://lwn.net/Articles/653071/ .. [3] https://lwn.net/Articles/653466/ ”h]”(hŒfootnote”“”)�”}”(hŒIhttps://blog.ffwll.ch/2014/11/atomic-modeset-support-for-kms-drivers.html”h]”(hŒlabel”“”)�”}”(hŒ1”h]”hŒ1”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÊubhÚ)�”}”(hjÌh]”hŒ reference”“”)�”}”(hjÌh]”hŒIhttps://blog.ffwll.ch/2014/11/atomic-modeset-support-for-kms-drivers.html”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÌuh1jáhjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K\hjÊubeh}”(h]”j~ah ]”h"]”Œ1”ah$]”h&]”jyajj€uh1jÈh³hÃh´K\hjÄj�KubjÉ)�”}”(hŒ https://lwn.net/Articles/653071/”h]”(jÏ)�”}”(hŒ2”h]”hŒ2”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjþubhÚ)�”}”(hjh]”jâ)�”}”(hjh]”hŒ https://lwn.net/Articles/653071/”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jáhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K]hjþubeh}”(h]”j•ah ]”h"]”Œ2”ah$]”h&]”j�ajj€uh1jÈh³hÃh´K]hjÄj�KubjÉ)�”}”(hŒ!https://lwn.net/Articles/653466/ ”h]”(jÏ)�”}”(hŒ3”h]”hŒ3”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj.ubhÚ)�”}”(hŒ https://lwn.net/Articles/653466/”h]”jâ)�”}”(hjBh]”hŒ https://lwn.net/Articles/653466/”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jBuh1jáhj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K^hj.ubeh}”(h]”j©ah ]”h"]”Œ3”ah$]”h&]”j¤ajj€uh1jÈh³hÃh´K^hjÄj�Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÂh³hÃh´K\hjFh²hubhÚ)�”}”(hŒ5Contact: Simona Vetter, respective driver maintainers”h]”hŒ5Contact: Simona Vetter, respective driver maintainers”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K`hjFh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KbhjFh²hubeh}”(h]”Œ2convert-existing-kms-drivers-to-atomic-modesetting”ah ]”h"]”Œ2convert existing kms drivers to atomic modesetting”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KMubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ9Clean up the clipped coordination confusion around planes”h]”hŒ9Clean up the clipped coordination confusion around planes”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj‰h²hh³hÃh´KeubhÚ)�”}”(hX„We have a helper to get this right with drm_plane_helper_check_update(), but it's not consistently used. This should be fixed, preferably in the atomic helpers (and drivers then moved over to clipped coordinates). Probably the helper should also be moved from drm_plane_helper.c to the atomic helpers, to avoid confusion - the other helpers in that file are all deprecated legacy helpers.”h]”hX†We have a helper to get this right with drm_plane_helper_check_update(), but it’s not consistently used. This should be fixed, preferably in the atomic helpers (and drivers then moved over to clipped coordinates). Probably the helper should also be moved from drm_plane_helper.c to the atomic helpers, to avoid confusion - the other helpers in that file are all deprecated legacy helpers.”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kghj‰h²hubhÚ)�”}”(hŒ;Contact: Ville Syrjälä, Simona Vetter, driver maintainers”h]”hŒ;Contact: Ville Syrjälä, Simona Vetter, driver maintainers”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Knhj‰h²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kphj‰h²hubeh}”(h]”Œ9clean-up-the-clipped-coordination-confusion-around-planes”ah ]”h"]”Œ9clean up the clipped coordination confusion around planes”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KeubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ"Improve plane atomic_check helpers”h]”hŒ"Improve plane atomic_check helpers”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÌh²hh³hÃh´KsubhÚ)�”}”(hŒhAside from the clipped coordinates right above there's a few suboptimal things with the current helpers:”h]”hŒjAside from the clipped coordinates right above there’s a few suboptimal things with the current helpers:”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KuhjÌh²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hXhdrm_plane_helper_funcs->atomic_check gets called for enabled or disabled planes. At best this seems to confuse drivers, worst it means they blow up when the plane is disabled without the CRTC. The only special handling is resetting values in the plane state structures, which instead should be moved into the drm_plane_funcs->atomic_duplicate_state functions. ”h]”hÚ)�”}”(hXgdrm_plane_helper_funcs->atomic_check gets called for enabled or disabled planes. At best this seems to confuse drivers, worst it means they blow up when the plane is disabled without the CRTC. The only special handling is resetting values in the plane state structures, which instead should be moved into the drm_plane_funcs->atomic_duplicate_state functions.”h]”hXgdrm_plane_helper_funcs->atomic_check gets called for enabled or disabled planes. At best this seems to confuse drivers, worst it means they blow up when the plane is disabled without the CRTC. The only special handling is resetting values in the plane state structures, which instead should be moved into the drm_plane_funcs->atomic_duplicate_state functions.”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kxhjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjíh²hh³hÃh´Nubjñ)�”}”(hŒQOnce that's done, helpers could stop calling ->atomic_check for disabled planes. ”h]”hÚ)�”}”(hŒPOnce that's done, helpers could stop calling ->atomic_check for disabled planes.”h]”hŒROnce that’s done, helpers could stop calling ->atomic_check for disabled planes.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K~hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjíh²hh³hÃh´Nubjñ)�”}”(hŒ€Then we could go through all the drivers and remove the more-or-less confused checks for plane_state->fb and plane_state->crtc. ”h]”hÚ)�”}”(hŒThen we could go through all the drivers and remove the more-or-less confused checks for plane_state->fb and plane_state->crtc.”h]”hŒThen we could go through all the drivers and remove the more-or-less confused checks for plane_state->fb and plane_state->crtc.”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K�hj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjíh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jëh³hÃh´KxhjÌh²hubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K„hjÌh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K†hjÌh²hubeh}”(h]”Œ"improve-plane-atomic-check-helpers”ah ]”h"]”Œ"improve plane atomic_check helpers”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KsubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ4Convert early atomic drivers to async commit helpers”h]”hŒ4Convert early atomic drivers to async commit helpers”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjfh²hh³hÃh´K‰ubhÚ)�”}”(hXFor the first year the atomic modeset helpers didn't support asynchronous / nonblocking commits, and every driver had to hand-roll them. This is fixed now, but there's still a pile of existing drivers that easily could be converted over to the new infrastructure.”h]”hX For the first year the atomic modeset helpers didn’t support asynchronous / nonblocking commits, and every driver had to hand-roll them. This is fixed now, but there’s still a pile of existing drivers that easily could be converted over to the new infrastructure.”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K‹hjfh²hubhÚ)�”}”(hŒ™One issue with the helpers is that they require that drivers handle completion events for atomic commits correctly. But fixing these bugs is good anyway.”h]”hŒ™One issue with the helpers is that they require that drivers handle completion events for atomic commits correctly. But fixing these bugs is good anyway.”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K�hjfh²hubhÚ)�”}”(hŒ¸Somewhat related is the legacy_cursor_update hack, which should be replaced with the new atomic_async_check/commit functionality in the helpers in drivers that still look at that flag.”h]”hŒ¸Somewhat related is the legacy_cursor_update hack, which should be replaced with the new atomic_async_check/commit functionality in the helpers in drivers that still look at that flag.”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K“hjfh²hubhÚ)�”}”(hŒ5Contact: Simona Vetter, respective driver maintainers”h]”hŒ5Contact: Simona Vetter, respective driver maintainers”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K—hjfh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K™hjfh²hubeh}”(h]”Œ4convert-early-atomic-drivers-to-async-commit-helpers”ah ]”h"]”Œ4convert early atomic drivers to async commit helpers”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´K‰ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒFallout from atomic KMS”h]”hŒFallout from atomic KMS”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÅh²hh³hÃh´KœubhÚ)�”}”(hXL``drm_atomic_helper.c`` provides a batch of functions which implement legacy IOCTLs on top of the new atomic driver interface. Which is really nice for gradual conversion of drivers, but unfortunately the semantic mismatches are a bit too severe. So there's some follow-up work to adjust the function interfaces to fix these issues:”h]”(hŒliteral”“”)�”}”(hŒ``drm_atomic_helper.c``”h]”hŒdrm_atomic_helper.c”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjÖubhX7 provides a batch of functions which implement legacy IOCTLs on top of the new atomic driver interface. Which is really nice for gradual conversion of drivers, but unfortunately the semantic mismatches are a bit too severe. So there’s some follow-up work to adjust the function interfaces to fix these issues:”…”�”}”(hjÖh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KžhjÅh²hubjì)�”}”(hhh]”(jñ)�”}”(hXúatomic needs the lock acquire context. At the moment that's passed around implicitly with some horrible hacks, and it's also allocate with ``GFP_NOFAIL`` behind the scenes. All legacy paths need to start allocating the acquire context explicitly on stack and then also pass it down into drivers explicitly so that the legacy-on-atomic functions can use them. Except for some driver code this is done. This task should be finished by adding WARN_ON(!drm_drv_uses_atomic_modeset) in drm_modeset_lock_all(). ”h]”(hÚ)�”}”(hXfatomic needs the lock acquire context. At the moment that's passed around implicitly with some horrible hacks, and it's also allocate with ``GFP_NOFAIL`` behind the scenes. All legacy paths need to start allocating the acquire context explicitly on stack and then also pass it down into drivers explicitly so that the legacy-on-atomic functions can use them.”h]”(hŒ�atomic needs the lock acquire context. At the moment that’s passed around implicitly with some horrible hacks, and it’s also allocate with ”…”�”}”(hjûh²hh³Nh´NubjÛ)�”}”(hŒ``GFP_NOFAIL``”h]”hŒ GFP_NOFAIL”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjûubhŒÍ behind the scenes. All legacy paths need to start allocating the acquire context explicitly on stack and then also pass it down into drivers explicitly so that the legacy-on-atomic functions can use them.”…”�”}”(hjûh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K¤hj÷ubhÚ)�”}”(hŒ‘Except for some driver code this is done. This task should be finished by adding WARN_ON(!drm_drv_uses_atomic_modeset) in drm_modeset_lock_all().”h]”hŒ‘Except for some driver code this is done. This task should be finished by adding WARN_ON(!drm_drv_uses_atomic_modeset) in drm_modeset_lock_all().”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kªhj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðhjôh²hh³hÃh´Nubjñ)�”}”(hXñA bunch of the vtable hooks are now in the wrong place: DRM has a split between core vfunc tables (named ``drm_foo_funcs``), which are used to implement the userspace ABI. And then there's the optional hooks for the helper libraries (name ``drm_foo_helper_funcs``), which are purely for internal use. Some of these hooks should be move from ``_funcs`` to ``_helper_funcs`` since they are not part of the core ABI. There's a ``FIXME`` comment in the kerneldoc for each such case in ``drm_crtc.h``. ”h]”hÚ)�”}”(hXðA bunch of the vtable hooks are now in the wrong place: DRM has a split between core vfunc tables (named ``drm_foo_funcs``), which are used to implement the userspace ABI. And then there's the optional hooks for the helper libraries (name ``drm_foo_helper_funcs``), which are purely for internal use. Some of these hooks should be move from ``_funcs`` to ``_helper_funcs`` since they are not part of the core ABI. There's a ``FIXME`` comment in the kerneldoc for each such case in ``drm_crtc.h``.”h]”(hŒiA bunch of the vtable hooks are now in the wrong place: DRM has a split between core vfunc tables (named ”…”�”}”(hj3h²hh³Nh´NubjÛ)�”}”(hŒ``drm_foo_funcs``”h]”hŒ drm_foo_funcs”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj3ubhŒw), which are used to implement the userspace ABI. And then there’s the optional hooks for the helper libraries (name ”…”�”}”(hj3h²hh³Nh´NubjÛ)�”}”(hŒ``drm_foo_helper_funcs``”h]”hŒdrm_foo_helper_funcs”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj3ubhŒN), which are purely for internal use. Some of these hooks should be move from ”…”�”}”(hj3h²hh³Nh´NubjÛ)�”}”(hŒ ``_funcs``”h]”hŒ_funcs”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj3ubhŒ to ”…”�”}”(hj3h²hh³Nh´NubjÛ)�”}”(hŒ``_helper_funcs``”h]”hŒ _helper_funcs”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj3ubhŒ6 since they are not part of the core ABI. There’s a ”…”�”}”(hj3h²hh³Nh´NubjÛ)�”}”(hŒ ``FIXME``”h]”hŒFIXME”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj3ubhŒ0 comment in the kerneldoc for each such case in ”…”�”}”(hj3h²hh³Nh´NubjÛ)�”}”(hŒ``drm_crtc.h``”h]”hŒ drm_crtc.h”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj3ubhŒ.”…”�”}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K­hj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjôh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@Œ*”uh1jëh³hÃh´K¤hjÅh²hubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KµhjÅh²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K·hjÅh²hubeh}”(h]”Œfallout-from-atomic-kms”ah ]”h"]”Œfallout from atomic kms”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KœubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ-Move Buffer Object Locking to dma_resv_lock()”h]”hŒ-Move Buffer Object Locking to dma_resv_lock()”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÞh²hh³hÃh´KºubhÚ)�”}”(hŒåMany drivers have their own per-object locking scheme, usually using mutex_lock(). This causes all kinds of trouble for buffer sharing, since depending which driver is the exporter and importer, the locking hierarchy is reversed.”h]”hŒåMany drivers have their own per-object locking scheme, usually using mutex_lock(). This causes all kinds of trouble for buffer sharing, since depending which driver is the exporter and importer, the locking hierarchy is reversed.”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´K¼hjÞh²hubhÚ)�”}”(hXFTo solve this we need one standard per-object locking mechanism, which is dma_resv_lock(). This lock needs to be called as the outermost lock, with all other driver specific per-object locks removed. The problem is that rolling out the actual change to the locking contract is a flag day, due to struct dma_buf buffer sharing.”h]”hXFTo solve this we need one standard per-object locking mechanism, which is dma_resv_lock(). This lock needs to be called as the outermost lock, with all other driver specific per-object locks removed. The problem is that rolling out the actual change to the locking contract is a flag day, due to struct dma_buf buffer sharing.”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÁhjÞh²hubhÚ)�”}”(hŒ Level: Expert”h]”hŒ Level: Expert”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´KÇhjÞh²hubeh}”(h]”Œ+move-buffer-object-locking-to-dma-resv-lock”ah ]”h"]”Œ-move buffer object locking to dma_resv_lock()”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KºubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ, Simona Vetter”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hjÔh²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhjÔubhŒ>, Simona Vetter”…”�”}”(hjÔh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kîhjµh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kðhjµh²hubeh}”(h]”Œ7reimplement-functions-in-drm-fbdev-fb-ops-without-fbdev”ah ]”h"]”Œ7reimplement functions in drm_fbdev_fb_ops without fbdev”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KçubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ>Benchmark and optimize blitting and format-conversion function”h]”hŒ>Benchmark and optimize blitting and format-conversion function”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj h²hh³hÃh´KóubhÚ)�”}”(hŒPDrawing to display memory quickly is crucial for many applications' performance.”h]”hŒRDrawing to display memory quickly is crucial for many applications’ performance.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kõhj h²hubhÚ)�”}”(hX„On at least x86-64, sys_imageblit() is significantly slower than cfb_imageblit(), even though both use the same blitting algorithm and the latter is written for I/O memory. It turns out that cfb_imageblit() uses movl instructions, while sys_imageblit apparently does not. This seems to be a problem with gcc's optimizer. DRM's format-conversion helpers might be subject to similar issues.”h]”hXˆOn at least x86-64, sys_imageblit() is significantly slower than cfb_imageblit(), even though both use the same blitting algorithm and the latter is written for I/O memory. It turns out that cfb_imageblit() uses movl instructions, while sys_imageblit apparently does not. This seems to be a problem with gcc’s optimizer. DRM’s format-conversion helpers might be subject to similar issues.”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Køhj h²hubhÚ)�”}”(hX6Benchmark and optimize fbdev's sys_() helpers and DRM's format-conversion helpers. In cases that can be further optimized, maybe implement a different algorithm. For micro-optimizations, use movl/movq instructions explicitly. That might possibly require architecture-specific helpers (e.g., storel() storeq()).”h]”hX:Benchmark and optimize fbdev’s sys_() helpers and DRM’s format-conversion helpers. In cases that can be further optimized, maybe implement a different algorithm. For micro-optimizations, use movl/movq instructions explicitly. That might possibly require architecture-specific helpers (e.g., storel() storeq()).”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Kÿhj h²hubhÚ)�”}”(hŒ0Contact: Thomas Zimmermann ”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hjGh²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhjGubhŒ>”…”�”}”(hjGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj h²hubeh}”(h]”Œ>benchmark-and-optimize-blitting-and-format-conversion-function”ah ]”h"]”Œ>benchmark and optimize blitting and format-conversion function”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´KóubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒAdrm_framebuffer_funcs and drm_mode_config_funcs.fb_create cleanup”h]”hŒAdrm_framebuffer_funcs and drm_mode_config_funcs.fb_create cleanup”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjh²hh³hÃh´M ubhÚ)�”}”(hŒ_A lot more drivers could be switched over to the drm_gem_framebuffer helpers. Various hold-ups:”h]”hŒ_A lot more drivers could be switched over to the drm_gem_framebuffer helpers. Various hold-ups:”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M hjh²hubjì)�”}”(hhh]”(jñ)�”}”(hŒiNeed to switch over to the generic dirty tracking code using drm_atomic_helper_dirtyfb first (e.g. qxl). ”h]”hÚ)�”}”(hŒhNeed to switch over to the generic dirty tracking code using drm_atomic_helper_dirtyfb first (e.g. qxl).”h]”hŒhNeed to switch over to the generic dirty tracking code using drm_atomic_helper_dirtyfb first (e.g. qxl).”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjžh²hh³hÃh´Nubjñ)�”}”(hŒkNeed to switch to drm_fbdev_generic_setup(), otherwise a lot of the custom fb setup code can't be deleted. ”h]”hÚ)�”}”(hŒjNeed to switch to drm_fbdev_generic_setup(), otherwise a lot of the custom fb setup code can't be deleted.”h]”hŒlNeed to switch to drm_fbdev_generic_setup(), otherwise a lot of the custom fb setup code can’t be deleted.”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjžh²hh³hÃh´Nubjñ)�”}”(hŒoNeed to switch to drm_gem_fb_create(), as now drm_gem_fb_create() checks for valid formats for atomic drivers. ”h]”hÚ)�”}”(hŒnNeed to switch to drm_gem_fb_create(), as now drm_gem_fb_create() checks for valid formats for atomic drivers.”h]”hŒnNeed to switch to drm_gem_fb_create(), as now drm_gem_fb_create() checks for valid formats for atomic drivers.”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjžh²hh³hÃh´Nubjñ)�”}”(hŒ½Many drivers subclass drm_framebuffer, we'd need a embedding compatible version of the varios drm_gem_fb_create functions. Maybe called drm_gem_fb_create/_with_dirty/_with_funcs as needed. ”h]”hÚ)�”}”(hŒ¼Many drivers subclass drm_framebuffer, we'd need a embedding compatible version of the varios drm_gem_fb_create functions. Maybe called drm_gem_fb_create/_with_dirty/_with_funcs as needed.”h]”hŒ¾Many drivers subclass drm_framebuffer, we’d need a embedding compatible version of the varios drm_gem_fb_create functions. Maybe called drm_gem_fb_create/_with_dirty/_with_funcs as needed.”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjéubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjžh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´Mhjh²hubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjh²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjh²hubeh}”(h]”ŒAdrm-framebuffer-funcs-and-drm-mode-config-funcs-fb-create-cleanup”ah ]”h"]”ŒAdrm_framebuffer_funcs and drm_mode_config_funcs.fb_create cleanup”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒGeneric fbdev defio support”h]”hŒGeneric fbdev defio support”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj+h²hh³hÃh´M!ubhÚ)�”}”(hXrThe defio support code in the fbdev core has some very specific requirements, which means drivers need to have a special framebuffer for fbdev. The main issue is that it uses some fields in struct page itself, which breaks shmem gem objects (and other things). To support defio, affected drivers require the use of a shadow buffer, which may add CPU and memory overhead.”h]”hXrThe defio support code in the fbdev core has some very specific requirements, which means drivers need to have a special framebuffer for fbdev. The main issue is that it uses some fields in struct page itself, which breaks shmem gem objects (and other things). To support defio, affected drivers require the use of a shadow buffer, which may add CPU and memory overhead.”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M#hj+h²hubhÚ)�”}”(hŒÖPossible solution would be to write our own defio mmap code in the drm fbdev emulation. It would need to fully wrap the existing mmap ops, forwarding everything after it has done the write-protect/mkwrite trickery:”h]”hŒÖPossible solution would be to write our own defio mmap code in the drm fbdev emulation. It would need to fully wrap the existing mmap ops, forwarding everything after it has done the write-protect/mkwrite trickery:”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M)hj+h²hubjì)�”}”(hhh]”(jñ)�”}”(hŒ½In the drm_fbdev_fb_mmap helper, if we need defio, change the default page prots to write-protected with something like this:: vma->vm_page_prot = pgprot_wrprotect(vma->vm_page_prot); ”h]”(hÚ)�”}”(hŒ~In the drm_fbdev_fb_mmap helper, if we need defio, change the default page prots to write-protected with something like this::”h]”hŒ}In the drm_fbdev_fb_mmap helper, if we need defio, change the default page prots to write-protected with something like this:”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M-hj[ubhŒ literal_block”“”)�”}”(hŒ8vma->vm_page_prot = pgprot_wrprotect(vma->vm_page_prot);”h]”hŒ8vma->vm_page_prot = pgprot_wrprotect(vma->vm_page_prot);”…”�”}”hjosbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jmh³hÃh´M0hj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jðhjXh²hh³hÃh´Nubjñ)�”}”(hXSet the mkwrite and fsync callbacks with similar implementions to the core fbdev defio stuff. These should all work on plain ptes, they don't actually require a struct page. uff. These should all work on plain ptes, they don't actually require a struct page. ”h]”hÚ)�”}”(hXSet the mkwrite and fsync callbacks with similar implementions to the core fbdev defio stuff. These should all work on plain ptes, they don't actually require a struct page. uff. These should all work on plain ptes, they don't actually require a struct page.”h]”hXSet the mkwrite and fsync callbacks with similar implementions to the core fbdev defio stuff. These should all work on plain ptes, they don’t actually require a struct page. uff. These should all work on plain ptes, they don’t actually require a struct page.”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M2hj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjXh²hh³hÃh´Nubjñ)�”}”(hŒ|Track the dirty pages in a separate structure (bitfield with one bit per page should work) to avoid clobbering struct page. ”h]”hÚ)�”}”(hŒ{Track the dirty pages in a separate structure (bitfield with one bit per page should work) to avoid clobbering struct page.”h]”hŒ{Track the dirty pages in a separate structure (bitfield with one bit per page should work) to avoid clobbering struct page.”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M7hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjXh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´M-hj+h²hubhÚ)�”}”(hŒ7Might be good to also have some igt testcases for this.”h]”hŒ7Might be good to also have some igt testcases for this.”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M:hj+h²hubhÚ)�”}”(hŒ&Contact: Simona Vetter, Noralf Tronnes”h]”hŒ&Contact: Simona Vetter, Noralf Tronnes”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M<hj+h²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M>hj+h²hubeh}”(h]”Œgeneric-fbdev-defio-support”ah ]”h"]”Œgeneric fbdev defio support”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M!ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ#connector register/unregister fixes”h]”hŒ#connector register/unregister fixes”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjíh²hh³hÃh´MAubjì)�”}”(hhh]”(jñ)�”}”(hŒ¸For most connectors it's a no-op to call drm_connector_register/unregister directly from driver code, drm_dev_register/unregister take care of this already. We can remove all of them. ”h]”hÚ)�”}”(hŒ·For most connectors it's a no-op to call drm_connector_register/unregister directly from driver code, drm_dev_register/unregister take care of this already. We can remove all of them.”h]”hŒ¹For most connectors it’s a no-op to call drm_connector_register/unregister directly from driver code, drm_dev_register/unregister take care of this already. We can remove all of them.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MChj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjþh²hh³hÃh´Nubjñ)�”}”(hXFor dp drivers it's a bit more a mess, since we need the connector to be registered when calling drm_dp_aux_register. Fix this by instead calling drm_dp_aux_init, and moving the actual registering into a late_register callback as recommended in the kerneldoc. ”h]”hÚ)�”}”(hXFor dp drivers it's a bit more a mess, since we need the connector to be registered when calling drm_dp_aux_register. Fix this by instead calling drm_dp_aux_init, and moving the actual registering into a late_register callback as recommended in the kerneldoc.”h]”hXFor dp drivers it’s a bit more a mess, since we need the connector to be registered when calling drm_dp_aux_register. Fix this by instead calling drm_dp_aux_init, and moving the actual registering into a late_register callback as recommended in the kerneldoc.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MGhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjþh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´MChjíh²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MLhjíh²hubeh}”(h]”Œ#connector-register-unregister-fixes”ah ]”h"]”Œ#connector register/unregister fixes”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MAubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒRemove load/unload callbacks”h]”hŒRemove load/unload callbacks”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjM h²hh³hÃh´MOubhÚ)�”}”(hŒåThe load/unload callbacks in struct &drm_driver are very much midlayers, plus for historical reasons they get the ordering wrong (and we can't fix that) between setting up the &drm_driver structure and calling drm_dev_register().”h]”hŒçThe load/unload callbacks in struct &drm_driver are very much midlayers, plus for historical reasons they get the ordering wrong (and we can’t fix that) between setting up the &drm_driver structure and calling drm_dev_register().”…”�”}”(hj^ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MQhjM h²hubjì)�”}”(hhh]”(jñ)�”}”(hŒ†Rework drivers to no longer use the load/unload callbacks, directly coding the load/unload sequence into the driver's probe function. ”h]”hÚ)�”}”(hŒ…Rework drivers to no longer use the load/unload callbacks, directly coding the load/unload sequence into the driver's probe function.”h]”hŒ‡Rework drivers to no longer use the load/unload callbacks, directly coding the load/unload sequence into the driver’s probe function.”…”�”}”(hjs h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MUhjo ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjl h²hh³hÃh´Nubjñ)�”}”(hŒBOnce all drivers are converted, remove the load/unload callbacks. ”h]”hÚ)�”}”(hŒAOnce all drivers are converted, remove the load/unload callbacks.”h]”hŒAOnce all drivers are converted, remove the load/unload callbacks.”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MXhj‡ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjl h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´MUhjM h²hubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hj¥ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MZhjM h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M\hjM h²hubeh}”(h]”Œremove-load-unload-callbacks”ah ]”h"]”Œremove load/unload callbacks”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MOubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ?Replace drm_detect_hdmi_monitor() with drm_display_info.is_hdmi”h]”hŒ?Replace drm_detect_hdmi_monitor() with drm_display_info.is_hdmi”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÉ h²hh³hÃh´M_ubhÚ)�”}”(hŒÕOnce EDID is parsed, the monitor HDMI support information is available through drm_display_info.is_hdmi. Many drivers still call drm_detect_hdmi_monitor() to retrieve the same information, which is less efficient.”h]”hŒÕOnce EDID is parsed, the monitor HDMI support information is available through drm_display_info.is_hdmi. Many drivers still call drm_detect_hdmi_monitor() to retrieve the same information, which is less efficient.”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MahjÉ h²hubhÚ)�”}”(hŒtAudit each individual driver calling drm_detect_hdmi_monitor() and switch to drm_display_info.is_hdmi if applicable.”h]”hŒtAudit each individual driver calling drm_detect_hdmi_monitor() and switch to drm_display_info.is_hdmi if applicable.”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MehjÉ h²hubhÚ)�”}”(hŒ8Contact: Laurent Pinchart, respective driver maintainers”h]”hŒ8Contact: Laurent Pinchart, respective driver maintainers”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MhhjÉ h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MjhjÉ h²hubeh}”(h]”Œ=replace-drm-detect-hdmi-monitor-with-drm-display-info-is-hdmi”ah ]”h"]”Œ?replace drm_detect_hdmi_monitor() with drm_display_info.is_hdmi”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M_ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ,Consolidate custom driver modeset properties”h]”hŒ,Consolidate custom driver modeset properties”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj h²hh³hÃh´MmubhÚ)�”}”(hŒÂBefore atomic modeset took place, many drivers where creating their own properties. Among other things, atomic brought the requirement that custom, driver specific properties should not be used.”h]”hŒÂBefore atomic modeset took place, many drivers where creating their own properties. Among other things, atomic brought the requirement that custom, driver specific properties should not be used.”…”�”}”(hj+ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mohj h²hubhÚ)�”}”(hŒXFor this task, we aim to introduce core helpers or reuse the existing ones if available:”h]”hŒXFor this task, we aim to introduce core helpers or reuse the existing ones if available:”…”�”}”(hj9 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mshj h²hubhÚ)�”}”(hŒ$A quick, unconfirmed, examples list.”h]”hŒ$A quick, unconfirmed, examples list.”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mvhj h²hubhÚ)�”}”(hX>Introduce core helpers: - audio (amdgpu, intel, gma500, radeon) - brightness, contrast, etc (armada, nouveau) - overlay only (?) - broadcast rgb (gma500, intel) - colorkey (armada, nouveau, rcar) - overlay only (?) - dither (amdgpu, nouveau, radeon) - varies across drivers - underscan family (amdgpu, radeon, nouveau)”h]”hX>Introduce core helpers: - audio (amdgpu, intel, gma500, radeon) - brightness, contrast, etc (armada, nouveau) - overlay only (?) - broadcast rgb (gma500, intel) - colorkey (armada, nouveau, rcar) - overlay only (?) - dither (amdgpu, nouveau, radeon) - varies across drivers - underscan family (amdgpu, radeon, nouveau)”…”�”}”(hjU h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mxhj h²hubhÚ)�”}”(hŒ¦Already in core: - colorspace (sti) - tv format names, enhancements (gma500, intel) - tv overscan, margins, etc. (gma500, intel) - zorder (omapdrm) - same as zpos (?)”h]”hŒ¦Already in core: - colorspace (sti) - tv format names, enhancements (gma500, intel) - tv overscan, margins, etc. (gma500, intel) - zorder (omapdrm) - same as zpos (?)”…”�”}”(hjc h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M€hj h²hubhÚ)�”}”(hŒ4Contact: Emil Velikov, respective driver maintainers”h]”hŒ4Contact: Emil Velikov, respective driver maintainers”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M‡hj h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M‰hj h²hubeh}”(h]”Œ,consolidate-custom-driver-modeset-properties”ah ]”h"]”Œ,consolidate custom driver modeset properties”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MmubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ(Use struct iosys_map throughout codebase”h]”hŒ(Use struct iosys_map throughout codebase”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj• h²hh³hÃh´MŒubhÚ)�”}”(hŒýPointers to shared device memory are stored in struct iosys_map. Each instance knows whether it refers to system or I/O memory. Most of the DRM-wide interface have been converted to use struct iosys_map, but implementations often still use raw pointers.”h]”hŒýPointers to shared device memory are stored in struct iosys_map. Each instance knows whether it refers to system or I/O memory. Most of the DRM-wide interface have been converted to use struct iosys_map, but implementations often still use raw pointers.”…”�”}”(hj¦ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MŽhj• h²hubhÚ)�”}”(hŒ9The task is to use struct iosys_map where it makes sense.”h]”hŒ9The task is to use struct iosys_map where it makes sense.”…”�”}”(hj´ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M“hj• h²hubjì)�”}”(hhh]”(jñ)�”}”(hŒIMemory managers should use struct iosys_map for dma-buf-imported buffers.”h]”hÚ)�”}”(hjÇ h]”hŒIMemory managers should use struct iosys_map for dma-buf-imported buffers.”…”�”}”(hjÉ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M•hjÅ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubjñ)�”}”(hŒ9TTM might benefit from using struct iosys_map internally.”h]”hÚ)�”}”(hjÞ h]”hŒ9TTM might benefit from using struct iosys_map internally.”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M–hjÜ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubjñ)�”}”(hŒMFramebuffer copying and blitting helpers should operate on struct iosys_map. ”h]”hÚ)�”}”(hŒLFramebuffer copying and blitting helpers should operate on struct iosys_map.”h]”hŒLFramebuffer copying and blitting helpers should operate on struct iosys_map.”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M—hjó ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@j¹uh1jëh³hÃh´M•hj• h²hubhÚ)�”}”(hŒQContact: Thomas Zimmermann , Christian König, Simona Vetter”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hj h²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhj ubhŒ">, Christian König, Simona Vetter”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M™hj• h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M›hj• h²hubeh}”(h]”Œ(use-struct-iosys-map-throughout-codebase”ah ]”h"]”Œ(use struct iosys_map throughout codebase”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MŒubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒVReview all drivers for setting struct drm_mode_config.{max_width,max_height} correctly”h]”hŒVReview all drivers for setting struct drm_mode_config.{max_width,max_height} correctly”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjI h²hh³hÃh´MžubhÚ)�”}”(hŒÑThe values in struct drm_mode_config.{max_width,max_height} describe the maximum supported framebuffer size. It's the virtual screen size, but many drivers treat it like limitations of the physical resolution.”h]”hŒÓThe values in struct drm_mode_config.{max_width,max_height} describe the maximum supported framebuffer size. It’s the virtual screen size, but many drivers treat it like limitations of the physical resolution.”…”�”}”(hjZ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M hjI h²hubhÚ)�”}”(hŒÌThe maximum width depends on the hardware's maximum scanline pitch. The maximum height depends on the amount of addressable video memory. Review all drivers to initialize the fields to the correct values.”h]”hŒÎThe maximum width depends on the hardware’s maximum scanline pitch. The maximum height depends on the amount of addressable video memory. Review all drivers to initialize the fields to the correct values.”…”�”}”(hjh h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¤hjI h²hubhÚ)�”}”(hŒ0Contact: Thomas Zimmermann ”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hjv h²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hj~ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhjv ubhŒ>”…”�”}”(hjv h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¨hjI h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MªhjI h²hubeh}”(h]”ŒTreview-all-drivers-for-setting-struct-drm-mode-config-max-width-max-height-correctly”ah ]”h"]”ŒVreview all drivers for setting struct drm_mode_config.{max_width,max_height} correctly”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MžubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ+Request memory regions in all fbdev drivers”h]”hŒ+Request memory regions in all fbdev drivers”…”�”}”(hj± h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj® h²hh³hÃh´M­ubhÚ)�”}”(hX+Old/ancient fbdev drivers do not request their memory properly. Go through these drivers and add code to request the memory regions that the driver uses. This requires adding calls to request_mem_region(), pci_request_region() or similar functions. Use helpers for managed cleanup where possible. Problematic areas include hardware that has exclusive ranges like VGA. VGA16fb does not request the range as it is expected. Drivers are pretty bad at doing this and there used to be conflicts among DRM and fbdev drivers. Still, it's the correct thing to do.”h]”hX-Old/ancient fbdev drivers do not request their memory properly. Go through these drivers and add code to request the memory regions that the driver uses. This requires adding calls to request_mem_region(), pci_request_region() or similar functions. Use helpers for managed cleanup where possible. Problematic areas include hardware that has exclusive ranges like VGA. VGA16fb does not request the range as it is expected. Drivers are pretty bad at doing this and there used to be conflicts among DRM and fbdev drivers. Still, it’s the correct thing to do.”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¯hj® h²hubhÚ)�”}”(hŒ0Contact: Thomas Zimmermann ”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hjÍ h²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhjÍ ubhŒ>”…”�”}”(hjÍ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¸hj® h²hubhÚ)�”}”(hŒLevel: Starter”h]”hŒLevel: Starter”…”�”}”(hjï h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mºhj® h²hubeh}”(h]”Œ+request-memory-regions-in-all-fbdev-drivers”ah ]”h"]”Œ+request memory regions in all fbdev drivers”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M­ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ'Remove driver dependencies on FB_DEVICE”h]”hŒ'Remove driver dependencies on FB_DEVICE”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj h²hh³hÃh´M½ubhÚ)�”}”(hXdA number of fbdev drivers provide attributes via sysfs and therefore depend on CONFIG_FB_DEVICE to be selected. Review each driver and attempt to make any dependencies on CONFIG_FB_DEVICE optional. At the minimum, the respective code in the driver could be conditionalized via ifdef CONFIG_FB_DEVICE. Not all drivers might be able to drop CONFIG_FB_DEVICE.”h]”hXdA number of fbdev drivers provide attributes via sysfs and therefore depend on CONFIG_FB_DEVICE to be selected. Review each driver and attempt to make any dependencies on CONFIG_FB_DEVICE optional. At the minimum, the respective code in the driver could be conditionalized via ifdef CONFIG_FB_DEVICE. Not all drivers might be able to drop CONFIG_FB_DEVICE.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¿hj h²hubhÚ)�”}”(hŒ0Contact: Thomas Zimmermann ”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hj$ h²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hj, h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhj$ ubhŒ>”…”�”}”(hj$ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÅhj h²hubhÚ)�”}”(hŒLevel: Starter”h]”hŒLevel: Starter”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÇhj h²hubeh}”(h]”Œ'remove-driver-dependencies-on-fb-device”ah ]”h"]”Œ'remove driver dependencies on fb_device”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M½ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒIRemove disable/unprepare in remove/shutdown in panel-simple and panel-edp”h]”hŒIRemove disable/unprepare in remove/shutdown in panel-simple and panel-edp”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj\ h²hh³hÃh´MÊubhÚ)�”}”(hXAs of commit d2aacaf07395 ("drm/panel: Check for already prepared/enabled in drm_panel"), we have a check in the drm_panel core to make sure nobody double-calls prepare/enable/disable/unprepare. Eventually that should probably be turned into a WARN_ON() or somehow made louder.”h]”hXAs of commit d2aacaf07395 (“drm/panel: Check for already prepared/enabled in drm_panelâ€�), we have a check in the drm_panel core to make sure nobody double-calls prepare/enable/disable/unprepare. Eventually that should probably be turned into a WARN_ON() or somehow made louder.”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÌhj\ h²hubhÚ)�”}”(hXžAt the moment, we expect that we may still encounter the warnings in the drm_panel core when using panel-simple and panel-edp. Since those panel drivers are used with a lot of different DRM modeset drivers they still make an extra effort to disable/unprepare the panel themsevles at shutdown time. Specifically we could still encounter those warnings if the panel driver gets shutdown() _before_ the DRM modeset driver and the DRM modeset driver properly calls drm_atomic_helper_shutdown() in its own shutdown() callback. Warnings could be avoided in such a case by using something like device links to ensure that the panel gets shutdown() after the DRM modeset driver.”h]”hXžAt the moment, we expect that we may still encounter the warnings in the drm_panel core when using panel-simple and panel-edp. Since those panel drivers are used with a lot of different DRM modeset drivers they still make an extra effort to disable/unprepare the panel themsevles at shutdown time. Specifically we could still encounter those warnings if the panel driver gets shutdown() _before_ the DRM modeset driver and the DRM modeset driver properly calls drm_atomic_helper_shutdown() in its own shutdown() callback. Warnings could be avoided in such a case by using something like device links to ensure that the panel gets shutdown() after the DRM modeset driver.”…”�”}”(hj{ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÑhj\ h²hubhÚ)�”}”(hŒÈOnce all DRM modeset drivers are known to shutdown properly, the extra calls to disable/unprepare in remove/shutdown in panel-simple and panel-edp should be removed and this TODO item marked complete.”h]”hŒÈOnce all DRM modeset drivers are known to shutdown properly, the extra calls to disable/unprepare in remove/shutdown in panel-simple and panel-edp should be removed and this TODO item marked complete.”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÜhj\ h²hubhÚ)�”}”(hŒ1Contact: Douglas Anderson ”h]”(hŒContact: Douglas Anderson <”…”�”}”(hj— h²hh³Nh´Nubjâ)�”}”(hŒdianders@chromium.org”h]”hŒdianders@chromium.org”…”�”}”(hjŸ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:dianders@chromium.org”uh1jáhj— ubhŒ>”…”�”}”(hj— h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Màhj\ h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mâhj\ h²hubeh}”(h]”•ŒIremove-disable-unprepare-in-remove-shutdown-in-panel-simple-and-panel-edp”ah ]”h"]”ŒIremove disable/unprepare in remove/shutdown in panel-simple and panel-edp”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MÊubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ8Transition away from using deprecated MIPI DSI functions”h]”hŒ8Transition away from using deprecated MIPI DSI functions”…”�”}”(hjÒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÏ h²hh³hÃh´MåubhÚ)�”}”(hX‡There are many functions defined in ``drm_mipi_dsi.c`` which have been deprecated. Each deprecated function was deprecated in favor of its `multi` variant (e.g. `mipi_dsi_generic_write()` and `mipi_dsi_generic_write_multi()`). The `multi` variant of a function includes improved error handling and logic which makes it more convenient to make several calls in a row, as most MIPI drivers do.”h]”(hŒ$There are many functions defined in ”…”�”}”(hjà h²hh³Nh´NubjÛ)�”}”(hŒ``drm_mipi_dsi.c``”h]”hŒdrm_mipi_dsi.c”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjà ubhŒU which have been deprecated. Each deprecated function was deprecated in favor of its ”…”�”}”(hjà h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`multi`”h]”hŒmulti”…”�”}”(hjü h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jú hjà ubhŒ variant (e.g. ”…”�”}”(hjà h²hh³Nh´Nubjû )�”}”(hŒ`mipi_dsi_generic_write()`”h]”hŒmipi_dsi_generic_write()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jú hjà ubhŒ and ”…”�”}”(hjà h²hh³Nh´Nubjû )�”}”(hŒ `mipi_dsi_generic_write_multi()`”h]”hŒmipi_dsi_generic_write_multi()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jú hjà ubhŒ). The ”…”�”}”(hjà h²hh³Nh´Nubjû )�”}”(hŒ`multi`”h]”hŒmulti”…”�”}”(hj2 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jú hjà ubhŒ™ variant of a function includes improved error handling and logic which makes it more convenient to make several calls in a row, as most MIPI drivers do.”…”�”}”(hjà h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MçhjÏ h²hubhÚ)�”}”(hŒºDrivers should be updated to use undeprecated functions. Once all usages of the deprecated MIPI DSI functions have been removed, their definitions may be removed from ``drm_mipi_dsi.c``.”h]”(hŒ§Drivers should be updated to use undeprecated functions. Once all usages of the deprecated MIPI DSI functions have been removed, their definitions may be removed from ”…”�”}”(hjJ h²hh³Nh´NubjÛ)�”}”(hŒ``drm_mipi_dsi.c``”h]”hŒdrm_mipi_dsi.c”…”�”}”(hjR h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjJ ubhŒ.”…”�”}”(hjJ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MîhjÏ h²hubhÚ)�”}”(hŒ1Contact: Douglas Anderson ”h]”(hŒContact: Douglas Anderson <”…”�”}”(hjj h²hh³Nh´Nubjâ)�”}”(hŒdianders@chromium.org”h]”hŒdianders@chromium.org”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:dianders@chromium.org”uh1jáhjj ubhŒ>”…”�”}”(hjj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MòhjÏ h²hubhÚ)�”}”(hŒLevel: Starter”h]”hŒLevel: Starter”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MôhjÏ h²hubeh}”(h]”Œ8transition-away-from-using-deprecated-mipi-dsi-functions”ah ]”h"]”Œ8transition away from using deprecated mipi dsi functions”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MåubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒRemove devm_drm_put_bridge()”h]”hŒRemove devm_drm_put_bridge()”…”�”}”(hj¥ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj¢ h²hh³hÃh´M÷ubhÚ)�”}”(hX¤Due to how the panel bridge handles the drm_bridge object lifetime, special care must be taken to dispose of the drm_bridge object when the panel_bridge is removed. This is currently managed using devm_drm_put_bridge(), but that is an unsafe, temporary workaround. To fix that, the DRM panel lifetime needs to be reworked. After the rework is done, remove devm_drm_put_bridge() and the TODO in drm_panel_bridge_remove().”h]”hX¤Due to how the panel bridge handles the drm_bridge object lifetime, special care must be taken to dispose of the drm_bridge object when the panel_bridge is removed. This is currently managed using devm_drm_put_bridge(), but that is an unsafe, temporary workaround. To fix that, the DRM panel lifetime needs to be reworked. After the rework is done, remove devm_drm_put_bridge() and the TODO in drm_panel_bridge_remove().”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mùhj¢ h²hubhŒdefinition_list”“”)�”}”(hhh]”hŒdefinition_list_item”“”)�”}”(hŒWContact: Maxime Ripard , Luca Ceresoli ”h]”(hŒterm”“”)�”}”(hŒ,Contact: Maxime Ripard ,”h]”(hŒContact: Maxime Ripard <”…”�”}”(hjÎ h²hh³Nh´Nubjâ)�”}”(hŒmripard@kernel.org”h]”hŒmripard@kernel.org”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:mripard@kernel.org”uh1jáhjÎ ubhŒ>,”…”�”}”(hjÎ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÌ h³hÃh´MhjÈ ubhŒ definition”“”)�”}”(hhh]”hÚ)�”}”(hŒ)Luca Ceresoli ”h]”(hŒLuca Ceresoli <”…”�”}”(hjõ h²hh³Nh´Nubjâ)�”}”(hŒluca.ceresoli@bootlin.com”h]”hŒluca.ceresoli@bootlin.com”…”�”}”(hjý h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ mailto:luca.ceresoli@bootlin.com”uh1jáhjõ ubhŒ>”…”�”}”(hjõ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjò ubah}”(h]”h ]”h"]”h$]”h&]”uh1jð hjÈ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÆ h³hÃh´Mhjà ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÁ hj¢ h²hh³hÃh´NubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj¢ h²hubeh}”(h]”Œremove-devm-drm-put-bridge”ah ]”h"]”Œremove devm_drm_put_bridge()”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M÷ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒEConvert users of of_drm_find_bridge() to of_drm_find_and_get_bridge()”h]”hŒEConvert users of of_drm_find_bridge() to of_drm_find_and_get_bridge()”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj?h²hh³hÃh´MubhÚ)�”}”(hXÑTaking a struct drm_bridge pointer requires getting a reference and putting it after disposing of the pointer. Most functions returning a struct drm_bridge pointer already call drm_bridge_get() to increment the refcount and their users have been updated to call drm_bridge_put() when appropriate. of_drm_find_bridge() does not get a reference and it has been deprecated in favor of of_drm_find_and_get_bridge() which does, but some users still need to be converted.”h]”hXÑTaking a struct drm_bridge pointer requires getting a reference and putting it after disposing of the pointer. Most functions returning a struct drm_bridge pointer already call drm_bridge_get() to increment the refcount and their users have been updated to call drm_bridge_put() when appropriate. of_drm_find_bridge() does not get a reference and it has been deprecated in favor of of_drm_find_and_get_bridge() which does, but some users still need to be converted.”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M hj?h²hubj )�”}”(hhh]”jÇ )�”}”(hŒWContact: Maxime Ripard , Luca Ceresoli ”h]”(jÍ )�”}”(hŒ,Contact: Maxime Ripard ,”h]”(hŒContact: Maxime Ripard <”…”�”}”(hjeh²hh³Nh´Nubjâ)�”}”(hŒmripard@kernel.org”h]”hŒmripard@kernel.org”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:mripard@kernel.org”uh1jáhjeubhŒ>,”…”�”}”(hjeh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÌ h³hÃh´Mhjaubjñ )�”}”(hhh]”hÚ)�”}”(hŒ)Luca Ceresoli ”h]”(hŒLuca Ceresoli <”…”�”}”(hjŠh²hh³Nh´Nubjâ)�”}”(hŒluca.ceresoli@bootlin.com”h]”hŒluca.ceresoli@bootlin.com”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ mailto:luca.ceresoli@bootlin.com”uh1jáhjŠubhŒ>”…”�”}”(hjŠh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jð hjaubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÆ h³hÃh´Mhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÁ hj?h²hh³hÃh´NubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj?h²hubhÅ)�”}”(hhh]”hÊ)�”}”(hŒCore refactorings”h]”hŒCore refactorings”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÌh²hh³hÃh´Mubah}”(h]”Œcore-refactorings”ah ]”h"]”Œcore refactorings”ah$]”h&]”uh1hÄhj?h²hh³hÃh´Mubeh}”(h]”ŒAconvert-users-of-of-drm-find-bridge-to-of-drm-find-and-get-bridge”ah ]”h"]”ŒEconvert users of of_drm_find_bridge() to of_drm_find_and_get_bridge()”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒMake panic handling work”h]”hŒMake panic handling work”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjíh²hh³hÃh´MubhÚ)�”}”(hŒBThis is a really varied tasks with lots of little bits and pieces:”h]”hŒBThis is a really varied tasks with lots of little bits and pieces:”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjíh²hubjì)�”}”(hhh]”(jñ)�”}”(hX¢The panic path can't be tested currently, leading to constant breaking. The main issue here is that panics can be triggered from hardirq contexts and hence all panic related callback can run in hardirq context. It would be awesome if we could test at least the fbdev helper code and driver code by e.g. trigger calls through drm debugfs files. hardirq context could be achieved by using an IPI to the local processor. ”h]”hÚ)�”}”(hX¡The panic path can't be tested currently, leading to constant breaking. The main issue here is that panics can be triggered from hardirq contexts and hence all panic related callback can run in hardirq context. It would be awesome if we could test at least the fbdev helper code and driver code by e.g. trigger calls through drm debugfs files. hardirq context could be achieved by using an IPI to the local processor.”h]”hX£The panic path can’t be tested currently, leading to constant breaking. The main issue here is that panics can be triggered from hardirq contexts and hence all panic related callback can run in hardirq context. It would be awesome if we could test at least the fbdev helper code and driver code by e.g. trigger calls through drm debugfs files. hardirq context could be achieved by using an IPI to the local processor.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubjñ)�”}”(hXÙThere's a massive confusion of different panic handlers. DRM fbdev emulation helpers had their own (long removed), but on top of that the fbcon code itself also has one. We need to make sure that they stop fighting over each other. This is worked around by checking ``oops_in_progress`` at various entry points into the DRM fbdev emulation helpers. A much cleaner approach here would be to switch fbcon to the `threaded printk support `_. ”h]”hÚ)�”}”(hXØThere's a massive confusion of different panic handlers. DRM fbdev emulation helpers had their own (long removed), but on top of that the fbcon code itself also has one. We need to make sure that they stop fighting over each other. This is worked around by checking ``oops_in_progress`` at various entry points into the DRM fbdev emulation helpers. A much cleaner approach here would be to switch fbcon to the `threaded printk support `_.”h]”(hX There’s a massive confusion of different panic handlers. DRM fbdev emulation helpers had their own (long removed), but on top of that the fbcon code itself also has one. We need to make sure that they stop fighting over each other. This is worked around by checking ”…”�”}”(hj+h²hh³Nh´NubjÛ)�”}”(hŒ``oops_in_progress``”h]”hŒoops_in_progress”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj+ubhŒ| at various entry points into the DRM fbdev emulation helpers. A much cleaner approach here would be to switch fbcon to the ”…”�”}”(hj+h²hh³Nh´Nubjâ)�”}”(hŒ=`threaded printk support `_”h]”hŒthreaded printk support”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œthreaded printk support”Œrefuri”Œ https://lwn.net/Articles/800946/”uh1jáhj+ubh¶)�”}”(hŒ# ”h]”h}”(h]”Œthreaded-printk-support”ah ]”h"]”Œthreaded printk support”ah$]”h&]”Œrefuri”jVuh1hµŒ referenced”Khj+ubhŒ.”…”�”}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M%hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubjñ)�”}”(hŒã``drm_can_sleep()`` is a mess. It hides real bugs in normal operations and isn't a full solution for panic paths. We need to make sure that it only returns true if there's a panic going on for real, and fix up all the fallout. ”h]”hÚ)�”}”(hŒâ``drm_can_sleep()`` is a mess. It hides real bugs in normal operations and isn't a full solution for panic paths. We need to make sure that it only returns true if there's a panic going on for real, and fix up all the fallout.”h]”(jÛ)�”}”(hŒ``drm_can_sleep()``”h]”hŒdrm_can_sleep()”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjyubhŒÓ is a mess. It hides real bugs in normal operations and isn’t a full solution for panic paths. We need to make sure that it only returns true if there’s a panic going on for real, and fix up all the fallout.”…”�”}”(hjyh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M-hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubjñ)�”}”(hXThe panic handler must never sleep, which also means it can't ever ``mutex_lock()``. Also it can't grab any other lock unconditionally, not even spinlocks (because NMI and hardirq can panic too). We need to either make sure to not call such paths, or trylock everything. Really tricky. ”h]”hÚ)�”}”(hXThe panic handler must never sleep, which also means it can't ever ``mutex_lock()``. Also it can't grab any other lock unconditionally, not even spinlocks (because NMI and hardirq can panic too). We need to either make sure to not call such paths, or trylock everything. Really tricky.”h]”(hŒEThe panic handler must never sleep, which also means it can’t ever ”…”�”}”(hjŸh²hh³Nh´NubjÛ)�”}”(hŒ``mutex_lock()``”h]”hŒ mutex_lock()”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjŸubhŒÌ. Also it can’t grab any other lock unconditionally, not even spinlocks (because NMI and hardirq can panic too). We need to either make sure to not call such paths, or trylock everything. Really tricky.”…”�”}”(hjŸh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M2hj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubjñ)�”}”(hŒïA clean solution would be an entirely separate panic output support in KMS, bypassing the current fbcon support. See `[PATCH v2 0/3] drm: Add panic handling `_. ”h]”hÚ)�”}”(hŒîA clean solution would be an entirely separate panic output support in KMS, bypassing the current fbcon support. See `[PATCH v2 0/3] drm: Add panic handling `_.”h]”(hŒuA clean solution would be an entirely separate panic output support in KMS, bypassing the current fbcon support. See ”…”�”}”(hjÉh²hh³Nh´Nubjâ)�”}”(hŒx`[PATCH v2 0/3] drm: Add panic handling `_”h]”hŒ&[PATCH v2 0/3] drm: Add panic handling”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ&[PATCH v2 0/3] drm: Add panic handling”jUŒLhttps://lore.kernel.org/dri-devel/20190311174218.51899-1-noralf@tronnes.org/”uh1jáhjÉubh¶)�”}”(hŒO ”h]”h}”(h]”Œ#patch-v2-0-3-drm-add-panic-handling”ah ]”h"]”Œ&[patch v2 0/3] drm: add panic handling”ah$]”h&]”Œrefuri”jáuh1hµjdKhjÉubhŒ.”…”�”}”(hjÉh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M7hjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubjñ)�”}”(hX<Encoding the actual oops and preceding dmesg in a QR might help with the dread "important stuff scrolled away" problem. See `[RFC][PATCH] Oops messages transfer using QR codes `_ for some example code that could be reused. ”h]”hÚ)�”}”(hX;Encoding the actual oops and preceding dmesg in a QR might help with the dread "important stuff scrolled away" problem. See `[RFC][PATCH] Oops messages transfer using QR codes `_ for some example code that could be reused.”h]”(hŒ€Encoding the actual oops and preceding dmesg in a QR might help with the dread “important stuff scrolled awayâ€� problem. See ”…”�”}”(hjh²hh³Nh´Nubjâ)�”}”(hŒ“`[RFC][PATCH] Oops messages transfer using QR codes `_”h]”hŒ2[RFC][PATCH] Oops messages transfer using QR codes”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ2[RFC][PATCH] Oops messages transfer using QR codes”jUŒ[https://lore.kernel.org/lkml/1446217392-11981-1-git-send-email-alexandru.murtaza@intel.com/”uh1jáhjubh¶)�”}”(hŒ^ ”h]”h}”(h]”Œ/rfc-patch-oops-messages-transfer-using-qr-codes”ah ]”h"]”Œ2[rfc][patch] oops messages transfer using qr codes”ah$]”h&]”Œrefuri”juh1hµjdKhjubhŒ, for some example code that could be reused.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M;hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@j¹uh1jëh³hÃh´Mhjíh²hubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MAhjíh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MChjíh²hubeh}”(h]”Œmake-panic-handling-work”ah ]”h"]”Œmake panic handling work”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒClean up the debugfs support”h]”hŒClean up the debugfs support”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjch²hh³hÃh´MFubhÚ)�”}”(hŒ"There's a bunch of issues with it:”h]”hŒ$There’s a bunch of issues with it:”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MHhjch²hubjì)�”}”(hhh]”(jñ)�”}”(hŒtConvert drivers to support the drm_debugfs_add_files() function instead of the drm_debugfs_create_files() function. ”h]”hÚ)�”}”(hŒsConvert drivers to support the drm_debugfs_add_files() function instead of the drm_debugfs_create_files() function.”h]”hŒsConvert drivers to support the drm_debugfs_add_files() function instead of the drm_debugfs_create_files() function.”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MJhj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj‚h²hh³hÃh´Nubjñ)�”}”(hŒÑImprove late-register debugfs by rolling out the same debugfs pre-register infrastructure for connector and crtc too. That way, the drivers won't need to split their setup code into init and register anymore. ”h]”hÚ)�”}”(hŒÐImprove late-register debugfs by rolling out the same debugfs pre-register infrastructure for connector and crtc too. That way, the drivers won't need to split their setup code into init and register anymore.”h]”hŒÒImprove late-register debugfs by rolling out the same debugfs pre-register infrastructure for connector and crtc too. That way, the drivers won’t need to split their setup code into init and register anymore.”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MMhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj‚h²hh³hÃh´Nubjñ)�”}”(hX6We probably want to have some support for debugfs files on crtc/connectors and maybe other kms objects directly in core. There's even drm_print support in the funcs for these objects to dump kms state, so it's all there. And then the ->show() functions should obviously give you a pointer to the right object. ”h]”hÚ)�”}”(hX5We probably want to have some support for debugfs files on crtc/connectors and maybe other kms objects directly in core. There's even drm_print support in the funcs for these objects to dump kms state, so it's all there. And then the ->show() functions should obviously give you a pointer to the right object.”h]”hX9We probably want to have some support for debugfs files on crtc/connectors and maybe other kms objects directly in core. There’s even drm_print support in the funcs for these objects to dump kms state, so it’s all there. And then the ->show() functions should obviously give you a pointer to the right object.”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MQhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj‚h²hh³hÃh´Nubjñ)�”}”(hXÓThe drm_driver->debugfs_init hooks we have is just an artifact of the old midlayered load sequence. DRM debugfs should work more like sysfs, where you can create properties/files for an object anytime you want, and the core takes care of publishing/unpuplishing all the files at register/unregister time. Drivers shouldn't need to worry about these technicalities, and fixing this (together with the drm_minor->drm_device move) would allow us to remove debugfs_init. ”h]”hÚ)�”}”(hXÒThe drm_driver->debugfs_init hooks we have is just an artifact of the old midlayered load sequence. DRM debugfs should work more like sysfs, where you can create properties/files for an object anytime you want, and the core takes care of publishing/unpuplishing all the files at register/unregister time. Drivers shouldn't need to worry about these technicalities, and fixing this (together with the drm_minor->drm_device move) would allow us to remove debugfs_init.”h]”hXÔThe drm_driver->debugfs_init hooks we have is just an artifact of the old midlayered load sequence. DRM debugfs should work more like sysfs, where you can create properties/files for an object anytime you want, and the core takes care of publishing/unpuplishing all the files at register/unregister time. Drivers shouldn’t need to worry about these technicalities, and fixing this (together with the drm_minor->drm_device move) would allow us to remove debugfs_init.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MVhjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj‚h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´MJhjch²hubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M^hjch²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M`hjch²hubeh}”(h]”Œclean-up-the-debugfs-support”ah ]”h"]”Œclean up the debugfs support”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MFubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒObject lifetime fixes”h]”hŒObject lifetime fixes”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjh²hh³hÃh´McubhÚ)�”}”(hŒThere's two related issues here”h]”hŒ!There’s two related issues here”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mehjh²hubjì)�”}”(hhh]”(jñ)�”}”(hŒVCleanup up the various ->destroy callbacks, which often are all the same simple code. ”h]”hÚ)�”}”(hŒUCleanup up the various ->destroy callbacks, which often are all the same simple code.”h]”hŒUCleanup up the various ->destroy callbacks, which often are all the same simple code.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mghj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj.h²hh³hÃh´Nubjñ)�”}”(hŒöLots of drivers erroneously allocate DRM modeset objects using devm_kzalloc, which results in use-after free issues on driver unload. This can be serious trouble even for drivers for hardware integrated on the SoC due to EPROBE_DEFERRED backoff. ”h]”hÚ)�”}”(hŒõLots of drivers erroneously allocate DRM modeset objects using devm_kzalloc, which results in use-after free issues on driver unload. This can be serious trouble even for drivers for hardware integrated on the SoC due to EPROBE_DEFERRED backoff.”h]”hŒõLots of drivers erroneously allocate DRM modeset objects using devm_kzalloc, which results in use-after free issues on driver unload. This can be serious trouble even for drivers for hardware integrated on the SoC due to EPROBE_DEFERRED backoff.”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MjhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj.h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´Mghjh²hubhÚ)�”}”(hŒÆBoth these problems can be solved by switching over to drmm_kzalloc(), and the various convenience wrappers provided, e.g. drmm_crtc_alloc_with_planes(), drmm_universal_plane_alloc(), ... and so on.”h]”hŒÆBoth these problems can be solved by switching over to drmm_kzalloc(), and the various convenience wrappers provided, e.g. drmm_crtc_alloc_with_planes(), drmm_universal_plane_alloc(), ... and so on.”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mohjh²hubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mshjh²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Muhjh²hubeh}”(h]”Œobject-lifetime-fixes”ah ]”h"]”Œobject lifetime fixes”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´McubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ4Remove automatic page mapping from dma-buf importing”h]”hŒ4Remove automatic page mapping from dma-buf importing”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj™h²hh³hÃh´MxubhÚ)�”}”(hX€When importing dma-bufs, the dma-buf and PRIME frameworks automatically map imported pages into the importer's DMA area. drm_gem_prime_fd_to_handle() and drm_gem_prime_handle_to_fd() require that importers call dma_buf_attach() even if they never do actual device DMA, but only CPU access through dma_buf_vmap(). This is a problem for USB devices, which do not support DMA operations.”h]”hX‚When importing dma-bufs, the dma-buf and PRIME frameworks automatically map imported pages into the importer’s DMA area. drm_gem_prime_fd_to_handle() and drm_gem_prime_handle_to_fd() require that importers call dma_buf_attach() even if they never do actual device DMA, but only CPU access through dma_buf_vmap(). This is a problem for USB devices, which do not support DMA operations.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mzhj™h²hubhÚ)�”}”(hX{To fix the issue, automatic page mappings should be removed from the buffer-sharing code. Fixing this is a bit more involved, since the import/export cache is also tied to &drm_gem_object.import_attach. Meanwhile we paper over this problem for USB devices by fishing out the USB host controller device, as long as that supports DMA. Otherwise importing can still needlessly fail.”h]”hX{To fix the issue, automatic page mappings should be removed from the buffer-sharing code. Fixing this is a bit more involved, since the import/export cache is also tied to &drm_gem_object.import_attach. Meanwhile we paper over this problem for USB devices by fishing out the USB host controller device, as long as that supports DMA. Otherwise importing can still needlessly fail.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M�hj™h²hubhÚ)�”}”(hŒ?Contact: Thomas Zimmermann , Simona Vetter”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hjÆh²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhjÆubhŒ>, Simona Vetter”…”�”}”(hjÆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M‡hj™h²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M‰hj™h²hubeh}”(h]”Œ4remove-automatic-page-mapping-from-dma-buf-importing”ah ]”h"]”Œ4remove automatic page mapping from dma-buf importing”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MxubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ"Implement a new DUMB_CREATE2 ioctl”h]”hŒ"Implement a new DUMB_CREATE2 ioctl”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjþh²hh³hÃh´MŒubhÚ)�”}”(hXûThe current DUMB_CREATE ioctl is not well defined. Instead of a pixel and framebuffer format, it only accepts a color mode of vague semantics. Assuming a linear framebuffer, the color mode gives an idea of the supported pixel format. But userspace effectively has to guess the correct values. It really only works reliably with framebuffers in XRGB8888. Userspace has begun to workaround these limitations by computing arbitrary format's buffer sizes and calculating their sizes in terms of XRGB8888 pixels.”h]”hXýThe current DUMB_CREATE ioctl is not well defined. Instead of a pixel and framebuffer format, it only accepts a color mode of vague semantics. Assuming a linear framebuffer, the color mode gives an idea of the supported pixel format. But userspace effectively has to guess the correct values. It really only works reliably with framebuffers in XRGB8888. Userspace has begun to workaround these limitations by computing arbitrary format’s buffer sizes and calculating their sizes in terms of XRGB8888 pixels.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MŽhjþh²hubhÚ)�”}”(hXOne possible solution is a new ioctl DUMB_CREATE2. It should accept a DRM format and a format modifier to resolve the color mode's ambiguity. As framebuffers can be multi-planar, the new ioctl has to return the buffer size, pitch and GEM handle for each individual color plane.”h]”hXOne possible solution is a new ioctl DUMB_CREATE2. It should accept a DRM format and a format modifier to resolve the color mode’s ambiguity. As framebuffers can be multi-planar, the new ioctl has to return the buffer size, pitch and GEM handle for each individual color plane.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M–hjþh²hubhÚ)�”}”(hŒèIn the first step, the new ioctl can be limited to the current features of the existing DUMB_CREATE. Individual drivers can then be extended to support multi-planar formats. Rockchip might require this and would be a good candidate.”h]”hŒèIn the first step, the new ioctl can be limited to the current features of the existing DUMB_CREATE. Individual drivers can then be extended to support multi-planar formats. Rockchip might require this and would be a good candidate.”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M›hjþh²hubhÚ)�”}”(hXQIt might also be helpful to userspace to query information about the size of a potential buffer, if allocated. Userspace would supply geometry and format; the kernel would return minimal allocation sizes and scanline pitch. There is interest to allocate that memory from another device and provide it to the DRM driver (say via dma-buf).”h]”hXQIt might also be helpful to userspace to query information about the size of a potential buffer, if allocated. Userspace would supply geometry and format; the kernel would return minimal allocation sizes and scanline pitch. There is interest to allocate that memory from another device and provide it to the DRM driver (say via dma-buf).”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MŸhjþh²hubhÚ)�”}”(hŒªAnother requested feature is the ability to allocate a buffer by size, without format. Accelators use this for their buffer allocation and it could likely be generalized.”h]”hŒªAnother requested feature is the ability to allocate a buffer by size, without format. Accelators use this for their buffer allocation and it could likely be generalized.”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¥hjþh²hubhÚ)�”}”(hŒšIn addition to the kernel implementation, there must be user-space support for the new ioctl. There's code in Mesa that might be able to use the new call.”h]”hŒœIn addition to the kernel implementation, there must be user-space support for the new ioctl. There’s code in Mesa that might be able to use the new call.”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M©hjþh²hubhÚ)�”}”(hŒ0Contact: Thomas Zimmermann ”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hjch²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhjcubhŒ>”…”�”}”(hjch²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M­hjþh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¯hjþh²hubhÅ)�”}”(hhh]”hÊ)�”}”(hŒBetter Testing”h]”hŒBetter Testing”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj“h²hh³hÃh´M²ubah}”(h]”Œbetter-testing”ah ]”h"]”Œbetter testing”ah$]”h&]”uh1hÄhjþh²hh³hÃh´M²ubeh}”(h]”Œ"implement-a-new-dumb-create2-ioctl”ah ]”h"]”Œ"implement a new dumb_create2 ioctl”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MŒubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ>Add unit tests using the Kernel Unit Testing (KUnit) framework”h]”hŒ>Add unit tests using the Kernel Unit Testing (KUnit) framework”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj´h²hh³hÃh´MµubhÚ)�”}”(hŒÕThe `KUnit `_ provides a common framework for unit tests within the Linux kernel. Having a test suite would allow to identify regressions earlier.”h]”(hŒThe ”…”�”}”(hjÅh²hh³Nh´Nubjâ)�”}”(hŒL`KUnit `_”h]”hŒKUnit”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒKUnit”jUŒAhttps://www.kernel.org/doc/html/latest/dev-tools/kunit/index.html”uh1jáhjÅubh¶)�”}”(hŒD ”h]”h}”(h]”Œkunit”ah ]”h"]”Œkunit”ah$]”h&]”Œrefuri”jÝuh1hµjdKhjÅubhŒ… provides a common framework for unit tests within the Linux kernel. Having a test suite would allow to identify regressions earlier.”…”�”}”(hjÅh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M·hj´h²hubhÚ)�”}”(hŒgA good candidate for the first unit tests are the format-conversion helpers in ``drm_format_helper.c``.”h]”(hŒOA good candidate for the first unit tests are the format-conversion helpers in ”…”�”}”(hjõh²hh³Nh´NubjÛ)�”}”(hŒ``drm_format_helper.c``”h]”hŒdrm_format_helper.c”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjõubhŒ.”…”�”}”(hjõh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M»hj´h²hubhÚ)�”}”(hŒ6Contact: Javier Martinez Canillas ”h]”(hŒ#Contact: Javier Martinez Canillas <”…”�”}”(hjh²hh³Nh´Nubjâ)�”}”(hŒjavierm@redhat.com”h]”hŒjavierm@redhat.com”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:javierm@redhat.com”uh1jáhjubhŒ>”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¾hj´h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÀhj´h²hubeh}”(h]”Œadd unit tests using the kernel unit testing (kunit) framework”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MµubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ-Clean up and document former selftests suites”h]”hŒ-Clean up and document former selftests suites”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjMh²hh³hÃh´MÃubhÚ)�”}”(hŒûSome KUnit test suites (drm_buddy, drm_cmdline_parser, drm_damage_helper, drm_format, drm_framebuffer, drm_dp_mst_helper, drm_mm, drm_plane_helper and drm_rect) are former selftests suites that have been converted over when KUnit was first introduced.”h]”hŒûSome KUnit test suites (drm_buddy, drm_cmdline_parser, drm_damage_helper, drm_format, drm_framebuffer, drm_dp_mst_helper, drm_mm, drm_plane_helper and drm_rect) are former selftests suites that have been converted over when KUnit was first introduced.”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÅhjMh²hubhÚ)�”}”(hX These suites were fairly undocumented, and with different goals than what unit tests can be. Trying to identify what each test in these suites actually test for, whether that makes sense for a unit test, and either remove it if it doesn't or document it if it does would be of great help.”h]”hX"These suites were fairly undocumented, and with different goals than what unit tests can be. Trying to identify what each test in these suites actually test for, whether that makes sense for a unit test, and either remove it if it doesn’t or document it if it does would be of great help.”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÊhjMh²hubhÚ)�”}”(hŒ+Contact: Maxime Ripard ”h]”(hŒContact: Maxime Ripard <”…”�”}”(hjzh²hh³Nh´Nubjâ)�”}”(hŒmripard@kernel.org”h]”hŒmripard@kernel.org”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:mripard@kernel.org”uh1jáhjzubhŒ>”…”�”}”(hjzh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÏhjMh²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÑhjMh²hubeh}”(h]”Œ-clean-up-and-document-former-selftests-suites”ah ]”h"]”Œ-clean up and document former selftests suites”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MÃubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒEnable trinity for DRM”h]”hŒEnable trinity for DRM”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj²h²hh³hÃh´MÔubhÚ)�”}”(hŒ8And fix up the fallout. Should be really interesting ...”h]”hŒ8And fix up the fallout. Should be really interesting ...”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÖhj²h²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MØhj²h²hubeh}”(h]”Œenable-trinity-for-drm”ah ]”h"]”Œenable trinity for drm”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MÔubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒMake KMS tests in i-g-t generic”h]”hŒMake KMS tests in i-g-t generic”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjçh²hh³hÃh´MÛubhÚ)�”}”(hXThe i915 driver team maintains an extensive testsuite for the i915 DRM driver, including tons of testcases for corner-cases in the modesetting API. It would be awesome if those tests (at least the ones not relying on Intel-specific GEM features) could be made to run on any KMS driver.”h]”hXThe i915 driver team maintains an extensive testsuite for the i915 DRM driver, including tons of testcases for corner-cases in the modesetting API. It would be awesome if those tests (at least the ones not relying on Intel-specific GEM features) could be made to run on any KMS driver.”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÝhjçh²hubhÚ)�”}”(hXBasic work to run i-g-t tests on non-i915 is done, what's now missing is mass- converting things over. For modeset tests we also first need a bit of infrastructure to use dumb buffers for untiled buffers, to be able to run all the non-i915 specific modeset tests.”h]”hX Basic work to run i-g-t tests on non-i915 is done, what’s now missing is mass- converting things over. For modeset tests we also first need a bit of infrastructure to use dumb buffers for untiled buffers, to be able to run all the non-i915 specific modeset tests.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mâhjçh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mçhjçh²hubeh}”(h]”Œmake-kms-tests-in-i-g-t-generic”ah ]”h"]”Œmake kms tests in i-g-t generic”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MÛubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ!Extend virtual test driver (VKMS)”h]”hŒ!Extend virtual test driver (VKMS)”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj*h²hh³hÃh´MêubhÚ)�”}”(hŒ´See the documentation of :ref:`VKMS ` for more details. This is an ideal internship task, since it only requires a virtual machine and can be sized to fit the available time.”h]”(hŒSee the documentation of ”…”�”}”(hj;h²hh³Nh´Nubh)�”}”(hŒ:ref:`VKMS `”h]”hŒinline”“”)�”}”(hjEh]”hŒVKMS”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1jGhjCubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j€Œ refdomain”jTŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œvkms”uh1hh³hÃh´Mìhj;ubhŒ‰ for more details. This is an ideal internship task, since it only requires a virtual machine and can be sized to fit the available time.”…”�”}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mìhj*h²hubhÚ)�”}”(hŒLevel: See details”h]”hŒLevel: See details”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mðhj*h²hubeh}”(h]”Œextend-virtual-test-driver-vkms”ah ]”h"]”Œ!extend virtual test driver (vkms)”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MêubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒBacklight Refactoring”h]”hŒBacklight Refactoring”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj‡h²hh³hÃh´MóubhÚ)�”}”(hŒ`Backlight drivers have a triple enable/disable state, which is a bit overkill. Plan to fix this:”h]”hŒ`Backlight drivers have a triple enable/disable state, which is a bit overkill. Plan to fix this:”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mõhj‡h²hubhŒenumerated_list”“”)�”}”(hhh]”(jñ)�”}”(hŒaRoll out backlight_enable() and backlight_disable() helpers everywhere. This has started already.”h]”hÚ)�”}”(hŒaRoll out backlight_enable() and backlight_disable() helpers everywhere. This has started already.”h]”hŒaRoll out backlight_enable() and backlight_disable() helpers everywhere. This has started already.”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Møhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj¨h²hh³hÃh´Nubjñ)�”}”(hŒKIn all, only look at one of the three status bits set by the above helpers.”h]”hÚ)�”}”(hjÅh]”hŒKIn all, only look at one of the three status bits set by the above helpers.”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MúhjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj¨h²hh³hÃh´Nubjñ)�”}”(hŒ"Remove the other two status bits. ”h]”hÚ)�”}”(hŒ!Remove the other two status bits.”h]”hŒ!Remove the other two status bits.”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MûhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj¨h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1j¦hj‡h²hh³hÃh´MøubhÚ)�”}”(hŒContact: Simona Vetter”h]”hŒContact: Simona Vetter”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mýhj‡h²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mÿhj‡h²hubhÅ)�”}”(hhh]”hÊ)�”}”(hŒDriver Specific”h]”hŒDriver Specific”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjh²hh³hÃh´Mubah}”(h]”Œdriver-specific”ah ]”h"]”Œdriver specific”ah$]”h&]”uh1hÄhj‡h²hh³hÃh´Mubeh}”(h]”Œbacklight-refactoring”ah ]”h"]”Œbacklight refactoring”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MóubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒAMD DC Display Driver”h]”hŒAMD DC Display Driver”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj:h²hh³hÃh´MubhÚ)�”}”(hŒŸAMD DC is the display driver for AMD devices starting with Vega. There has been a bunch of progress cleaning it up but there's still plenty of work to be done.”h]”hŒ¡AMD DC is the display driver for AMD devices starting with Vega. There has been a bunch of progress cleaning it up but there’s still plenty of work to be done.”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj:h²hubhÚ)�”}”(hŒ/See drivers/gpu/drm/amd/display/TODO for tasks.”h]”hŒ/See drivers/gpu/drm/amd/display/TODO for tasks.”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M hj:h²hubhÚ)�”}”(hŒ%Contact: Harry Wentland, Alex Deucher”h]”hŒ%Contact: Harry Wentland, Alex Deucher”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M hj:h²hubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Bootsplash”h]”hŒ Bootsplash”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjuh²hh³hÃh´MubhÚ)�”}”(hŒ¤There is support in place now for writing internal DRM clients making it possible to pick up the bootsplash work that was rejected because it was written for fbdev.”h]”hŒ¤There is support in place now for writing internal DRM clients making it possible to pick up the bootsplash work that was rejected because it was written for fbdev.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjuh²hubjì)�”}”(hhh]”(jñ)�”}”(hŒb[v6,8/8] drm/client: Hack: Add bootsplash example https://patchwork.freedesktop.org/patch/306579/ ”h]”hÚ)�”}”(hŒa[v6,8/8] drm/client: Hack: Add bootsplash example https://patchwork.freedesktop.org/patch/306579/”h]”(hŒ2[v6,8/8] drm/client: Hack: Add bootsplash example ”…”�”}”(hj›h²hh³Nh´Nubjâ)�”}”(hŒ/https://patchwork.freedesktop.org/patch/306579/”h]”hŒ/https://patchwork.freedesktop.org/patch/306579/”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j¥uh1jáhj›ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj—ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj”h²hh³hÃh´Nubjñ)�”}”(hŒm[RFC PATCH v2 00/13] Kernel based bootsplash https://lore.kernel.org/r/20171213194755.3409-1-mstaudt@suse.de ”h]”hÚ)�”}”(hŒl[RFC PATCH v2 00/13] Kernel based bootsplash https://lore.kernel.org/r/20171213194755.3409-1-mstaudt@suse.de”h]”(hŒ-[RFC PATCH v2 00/13] Kernel based bootsplash ”…”�”}”(hjÂh²hh³Nh´Nubjâ)�”}”(hŒ?https://lore.kernel.org/r/20171213194755.3409-1-mstaudt@suse.de”h]”hŒ?https://lore.kernel.org/r/20171213194755.3409-1-mstaudt@suse.de”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÌuh1jáhjÂubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj”h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´Mhjuh²hubhÚ)�”}”(hŒContact: Sam Ravnborg”h]”hŒContact: Sam Ravnborg”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjuh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mhjuh²hubeh}”(h]”Œ bootsplash”ah ]”h"]”Œ bootsplash”ah$]”h&]”uh1hÄhj:h²hh³hÃh´MubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ backlight device mapping ”h]”hÚ)�”}”(hŒ‹video: this does support controlling multiple backlights, but some work will need to be done to get the output <-> backlight device mapping”h]”hŒ‹video: this does support controlling multiple backlights, but some work will need to be done to get the output <-> backlight device mapping”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M4hjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjXh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jøjùjúhjûjüuh1j¦hjh²hh³hÃh´M2ubhÚ)�”}”(hX±The above assumes both panels will require the same backlight interface type. Things will break on systems with multiple panels where the 2 panels need a different type of control. E.g. one panel needs ACPI video backlight control, where as the other is using native backlight control. Currently in this case only one of the 2 required backlight devices will get registered, based on the acpi_video_get_backlight_type() return value.”h]”hX±The above assumes both panels will require the same backlight interface type. Things will break on systems with multiple panels where the 2 panels need a different type of control. E.g. one panel needs ACPI video backlight control, where as the other is using native backlight control. Currently in this case only one of the 2 required backlight devices will get registered, based on the acpi_video_get_backlight_type() return value.”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M7hjh²hubhÚ)�”}”(hŒÛIf this (theoretical) case ever shows up, then supporting this will need some work. A possible solution here would be to pass a device and connector-name to acpi_video_get_backlight_type() so that it can deal with this.”h]”hŒÛIf this (theoretical) case ever shows up, then supporting this will need some work. A possible solution here would be to pass a device and connector-name to acpi_video_get_backlight_type() so that it can deal with this.”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M>hjh²hubhÚ)�”}”(hŒÇNote in a way we already have a case where userspace sees 2 panels, in dual GPU laptop setups with a mux. On those systems we may see either 2 native backlight devices; or 2 native backlight devices.”h]”hŒÇNote in a way we already have a case where userspace sees 2 panels, in dual GPU laptop setups with a mux. On those systems we may see either 2 native backlight devices; or 2 native backlight devices.”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MBhjh²hubhÚ)�”}”(hX;Userspace already has code to deal with this by detecting if the related panel is active (iow which way the mux between the GPU and the panels points) and then uses that backlight device. Userspace here very much assumes a single panel though. It picks only 1 of the 2 backlight devices and then only uses that one.”h]”hX;Userspace already has code to deal with this by detecting if the related panel is active (iow which way the mux between the GPU and the panels points) and then uses that backlight device. Userspace here very much assumes a single panel though. It picks only 1 of the 2 backlight devices and then only uses that one.”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MFhjh²hubhÚ)�”}”(hŒ_Note that all userspace code (that I know off) is currently hardcoded to assume a single panel.”h]”hŒ_Note that all userspace code (that I know off) is currently hardcoded to assume a single panel.”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MLhjh²hubhÚ)�”}”(hŒåBefore the recent changes to not register multiple (e.g. video + native) /sys/class/backlight devices for a single panel (on a single GPU laptop), userspace would see multiple backlight devices all controlling the same backlight.”h]”hŒåBefore the recent changes to not register multiple (e.g. video + native) /sys/class/backlight devices for a single panel (on a single GPU laptop), userspace would see multiple backlight devices all controlling the same backlight.”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MOhjh²hubhÚ)�”}”(hŒÖTo deal with this userspace had to always picks one preferred device under /sys/class/backlight and will ignore the others. So to support brightness control on multiple panels userspace will need to be updated too.”h]”hŒÖTo deal with this userspace had to always picks one preferred device under /sys/class/backlight and will ignore the others. So to support brightness control on multiple panels userspace will need to be updated too.”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MThjh²hubhÚ)�”}”(hX³There are plans to allow brightness control through the KMS API by adding a "display brightness" property to drm_connector objects for panels. This solves a number of issues with the /sys/class/backlight API, including not being able to map a sysfs backlight device to a specific connector. Any userspace changes to add support for brightness control on devices with multiple panels really should build on top of this new KMS property.”h]”hX·There are plans to allow brightness control through the KMS API by adding a “display brightnessâ€� property to drm_connector objects for panels. This solves a number of issues with the /sys/class/backlight API, including not being able to map a sysfs backlight device to a specific connector. Any userspace changes to add support for brightness control on devices with multiple panels really should build on top of this new KMS property.”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MXhjh²hubhÚ)�”}”(hŒContact: Hans de Goede”h]”hŒContact: Hans de Goede”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M_hjh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mahjh²hubeh}”(h]”Œ”h]”(hŒ#Contact: Javier Martinez Canillas <”…”�”}”(hj’h²hh³Nh´Nubjâ)�”}”(hŒjavierm@redhat.com”h]”hŒjavierm@redhat.com”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:javierm@redhat.com”uh1jáhj’ubhŒ>”…”�”}”(hj’h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mvhj%h²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mxhj%h²hubeh}”(h]”ŒCbuffer-age-or-other-damage-accumulation-algorithm-for-buffer-damage”ah ]”h"]”ŒCbuffer age or other damage accumulation algorithm for buffer damage”ah$]”h&]”uh1hÄhj:h²hh³hÃh´MdubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ Querying errors from drm_syncobj”h]”hŒ Querying errors from drm_syncobj”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÊh²hh³hÃh´M{ubhÚ)�”}”(hŒeThe drm_syncobj container can be used by driver independent code to signal complection of submission.”h]”hŒeThe drm_syncobj container can be used by driver independent code to signal complection of submission.”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M}hjÊh²hubhÚ)�”}”(hŒtOne minor feature still missing is a generic DRM IOCTL to query the error status of binary and timeline drm_syncobj.”h]”hŒtOne minor feature still missing is a generic DRM IOCTL to query the error status of binary and timeline drm_syncobj.”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M€hjÊh²hubhÚ)�”}”(hŒ¹This was already improved by implementing the necessary kernel interface (patches are on the dri-devel mailing list) but adding support for that in the userspace stack is still missing.”h]”hŒ¹This was already improved by implementing the necessary kernel interface (patches are on the dri-devel mailing list) but adding support for that in the userspace stack is still missing.”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MƒhjÊh²hubhÚ)�”}”(hŒ)Contact: Christian König, Michel Dänzer”h]”hŒ)Contact: Christian König, Michel Dänzer”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M‡hjÊh²hubhÚ)�”}”(hŒLevel: Starter”h]”hŒLevel: Starter”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M‰hjÊh²hubeh}”(h]”Œ querying-errors-from-drm-syncobj”ah ]”h"]”Œ querying errors from drm_syncobj”ah$]”h&]”uh1hÄhj:h²hh³hÃh´M{ubhÅ)�”}”(hhh]”hÊ)�”}”(hŒDRM GPU Scheduler”h]”hŒDRM GPU Scheduler”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj)h²hh³hÃh´MŒubah}”(h]”Œdrm-gpu-scheduler”ah ]”h"]”Œdrm gpu scheduler”ah$]”h&]”uh1hÄhj:h²hh³hÃh´MŒubeh}”(h]”Œamd-dc-display-driver”ah ]”h"]”Œamd dc display driver”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´MubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ;Provide a universal successor for drm_sched_resubmit_jobs()”h]”hŒ;Provide a universal successor for drm_sched_resubmit_jobs()”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjJh²hh³hÃh´M�ubhÚ)�”}”(hX˜drm_sched_resubmit_jobs() is deprecated. Main reason being that it leads to reinitializing dma_fences. See that function's docu for details. The better approach for valid resubmissions by amdgpu and Xe is (apparently) to figure out which job (and, through association: which entity) caused the hang. Then, the job's buffer data, together with all other jobs' buffer data currently in the same hardware ring, must be invalidated. This can for example be done by overwriting it. amdgpu currently determines which jobs are in the ring and need to be overwritten by keeping copies of the job. Xe obtains that information by directly accessing drm_sched's pending_list.”h]”hX drm_sched_resubmit_jobs() is deprecated. Main reason being that it leads to reinitializing dma_fences. See that function’s docu for details. The better approach for valid resubmissions by amdgpu and Xe is (apparently) to figure out which job (and, through association: which entity) caused the hang. Then, the job’s buffer data, together with all other jobs’ buffer data currently in the same hardware ring, must be invalidated. This can for example be done by overwriting it. amdgpu currently determines which jobs are in the ring and need to be overwritten by keeping copies of the job. Xe obtains that information by directly accessing drm_sched’s pending_list.”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M‘hjJh²hubhÚ)�”}”(hŒTasks:”h]”hŒTasks:”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M›hjJh²hubj§)�”}”(hhh]”(jñ)�”}”(hŒ�implement scheduler functionality through which the driver can obtain the information which *broken* jobs are currently in the hardware ring.”h]”hÚ)�”}”(hŒ�implement scheduler functionality through which the driver can obtain the information which *broken* jobs are currently in the hardware ring.”h]”(hŒ\implement scheduler functionality through which the driver can obtain the information which ”…”�”}”(hj~h²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ*broken*”h]”hŒbroken”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j†hj~ubhŒ) jobs are currently in the hardware ring.”…”�”}”(hj~h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M�hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjwh²hh³hÃh´Nubjñ)�”}”(hŒhSuch infrastructure would then typically be used in drm_sched_backend_ops.timedout_job(). Document that.”h]”hÚ)�”}”(hŒhSuch infrastructure would then typically be used in drm_sched_backend_ops.timedout_job(). Document that.”h]”hŒhSuch infrastructure would then typically be used in drm_sched_backend_ops.timedout_job(). Document that.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MŸhj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjwh²hh³hÃh´Nubjñ)�”}”(hŒPort a driver as first user.”h]”hÚ)�”}”(hjÀh]”hŒPort a driver as first user.”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¡hj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjwh²hh³hÃh´Nubjñ)�”}”(hŒRDocument the new alternative in the docu of deprecated drm_sched_resubmit_jobs(). ”h]”hÚ)�”}”(hŒQDocument the new alternative in the docu of deprecated drm_sched_resubmit_jobs().”h]”hŒQDocument the new alternative in the docu of deprecated drm_sched_resubmit_jobs().”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¢hjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjwh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jøjùjúhjûjüuh1j¦hjJh²hh³hÃh´M�ubj )�”}”(hhh]”jÇ )�”}”(hŒYContact: Christian König Philipp Stanner ”h]”(jÍ )�”}”(hŒ4Contact: Christian König ”h]”(hŒContact: Christian König <”…”�”•ËI}”(hjúh²hh³Nh´Nubjâ)�”}”(hŒchristian.koenig@amd.com”h]”hŒchristian.koenig@amd.com”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:christian.koenig@amd.com”uh1jáhjúubhŒ>”…”�”}”(hjúh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÌ h³hÃh´M¦hjöubjñ )�”}”(hhh]”hÚ)�”}”(hŒ#Philipp Stanner ”h]”(hŒPhilipp Stanner <”…”�”}”(hjh²hh³Nh´Nubjâ)�”}”(hŒphasta@kernel.org”h]”hŒphasta@kernel.org”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:phasta@kernel.org”uh1jáhjubhŒ>”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¦hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jð hjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÆ h³hÃh´M¦hjóubah}”(h]”h ]”h"]”h$]”h&]”uh1jÁ hjJh²hh³hÃh´NubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¨hjJh²hubeh}”(h]”Œ9provide-a-universal-successor-for-drm-sched-resubmit-jobs”ah ]”h"]”Œ;provide a universal successor for drm_sched_resubmit_jobs()”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M�ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒAdd locking for runqueues”h]”hŒAdd locking for runqueues”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjih²hh³hÃh´M«ubhÚ)�”}”(hX“There is an old FIXME by Sima in include/drm/gpu_scheduler.h. It details that struct drm_sched_rq is read at many places without any locks, not even with a READ_ONCE. At XDC 2025 no one could really tell why that is the case, whether locks are needed and whether they could be added. (But for real, that should probably be locked!). Check whether it's possible to add locks everywhere, and do so if yes.”h]”hX•There is an old FIXME by Sima in include/drm/gpu_scheduler.h. It details that struct drm_sched_rq is read at many places without any locks, not even with a READ_ONCE. At XDC 2025 no one could really tell why that is the case, whether locks are needed and whether they could be added. (But for real, that should probably be locked!). Check whether it’s possible to add locks everywhere, and do so if yes.”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M­hjih²hubhÚ)�”}”(hŒ,Contact: Philipp Stanner ”h]”(hŒContact: Philipp Stanner <”…”�”}”(hjˆh²hh³Nh´Nubjâ)�”}”(hŒphasta@kernel.org”h]”hŒphasta@kernel.org”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:phasta@kernel.org”uh1jáhjˆubhŒ>”…”�”}”(hjˆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M´hjih²hubhÚ)�”}”(hŒLevel: Intermediate”h]”hŒLevel: Intermediate”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¶hjih²hubeh}”(h]”Œadd-locking-for-runqueues”ah ]”h"]”Œadd locking for runqueues”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M«ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒ-Replace the lockless queue with a locked list”h]”hŒ-Replace the lockless queue with a locked list”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjÀh²hh³hÃh´M¹ubhÚ)�”}”(hŒqdrm_sched is the only user in the entire kernel of a special lockless queue, the spsc_queue. This queue utilizes:”h]”hŒqdrm_sched is the only user in the entire kernel of a special lockless queue, the spsc_queue. This queue utilizes:”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M»hjÀh²hubjì)�”}”(hhh]”(jñ)�”}”(hŒpreempt_disable()”h]”hÚ)�”}”(hjäh]”hŒpreempt_disable()”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¾hjâubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjßh²hh³hÃh´Nubjñ)�”}”(hŒatomic instructions”h]”hÚ)�”}”(hjûh]”hŒatomic instructions”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´M¿hjùubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjßh²hh³hÃh´Nubjñ)�”}”(hŒmemory barriers”h]”hÚ)�”}”(hjh]”hŒmemory barriers”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÀhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjßh²hh³hÃh´Nubjñ)�”}”(hŒACCESS_ONCE() ”h]”hÚ)�”}”(hŒ ACCESS_ONCE()”h]”hŒ ACCESS_ONCE()”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÁhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjßh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´M¾hjÀh²hubhÚ)�”}”(hŒ)whereas a conventional spinlock utilizes:”h]”hŒ)whereas a conventional spinlock utilizes:”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÃhjÀh²hubjì)�”}”(hhh]”(jñ)�”}”(hŒpreempt_disable()”h]”hÚ)�”}”(hjXh]”hŒpreempt_disable()”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÅhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjSh²hh³hÃh´Nubjñ)�”}”(hŒ41 atomic instruction for taking / releasing the lock”h]”hÚ)�”}”(hjoh]”hŒ41 atomic instruction for taking / releasing the lock”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÆhjmubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjSh²hh³hÃh´Nubjñ)�”}”(hŒmemory barriers ”h]”hÚ)�”}”(hŒmemory barriers”h]”hŒmemory barriers”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÇhj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjSh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´MÅhjÀh²hubhÚ)�”}”(hŒ±Moreover, drm_sched_entity_push_job(), the only user of spsc_queue_push(), has to take a lock in some situations anyways and calls to it are often serialized with a driver lock.”h]”hŒ±Moreover, drm_sched_entity_push_job(), the only user of spsc_queue_push(), has to take a lock in some situations anyways and calls to it are often serialized with a driver lock.”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÉhjÀh²hubhÚ)�”}”(hXIt is, thus, highly questionable whether the lockless queue grants any advantage at all. Considering that its internals are not well documented and its correctness is not formally proven, it seems desirable to replace the queue with a mere list or hlist that is protected by a spinlock.”h]”hXIt is, thus, highly questionable whether the lockless queue grants any advantage at all. Considering that its internals are not well documented and its correctness is not formally proven, it seems desirable to replace the queue with a mere list or hlist that is protected by a spinlock.”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÍhjÀh²hubhÚ)�”}”(hŒTasks:”h]”hŒTasks:”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÒhjÀh²hubjì)�”}”(hhh]”(jñ)�”}”(hŒzReplace the spsc_queue in drm/sched (and those who might access the scheduler's internal queue) with a spinlock + (h)list.”h]”hÚ)�”}”(hŒzReplace the spsc_queue in drm/sched (and those who might access the scheduler's internal queue) with a spinlock + (h)list.”h]”hŒ|Replace the spsc_queue in drm/sched (and those who might access the scheduler’s internal queue) with a spinlock + (h)list.”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÔhjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjÌh²hh³hÃh´Nubjñ)�”}”(hŒ}Ideally, check with some micro benchmarks and real world tests (preferably with amdgpu) for relevant performance regressions.”h]”hÚ)�”}”(hŒ}Ideally, check with some micro benchmarks and real world tests (preferably with amdgpu) for relevant performance regressions.”h]”hŒ}Ideally, check with some micro benchmarks and real world tests (preferably with amdgpu) for relevant performance regressions.”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÖhjçubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjÌh²hh³hÃh´Nubjñ)�”}”(hŒ2Remove the spsc_queue from the kernel altogether. ”h]”hÚ)�”}”(hŒ1Remove the spsc_queue from the kernel altogether.”h]”hŒ1Remove the spsc_queue from the kernel altogether.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MØhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhjÌh²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´MÔhjÀh²hubhÚ)�”}”(hŒContact:”h]”hŒContact:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÚhjÀh²hubjì)�”}”(hhh]”(jñ)�”}”(hŒ#Philipp Stanner ”h]”hÚ)�”}”(hj0h]”(hŒPhilipp Stanner <”…”�”}”(hj2h²hh³Nh´Nubjâ)�”}”(hŒphasta@kernel.org”h]”hŒphasta@kernel.org”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:phasta@kernel.org”uh1jáhj2ubhŒ>”…”�”}”(hj2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÜhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj+h²hh³hÃh´Nubjñ)�”}”(hŒ,Christian König ”h]”hÚ)�”}”(hŒ+Christian König ”h]”(hŒChristian König <”…”�”}”(hj]h²hh³Nh´Nubjâ)�”}”(hŒchristian.koenig@amd.com”h]”hŒchristian.koenig@amd.com”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:christian.koenig@amd.com”uh1jáhj]ubhŒ>”…”�”}”(hj]h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MÝhjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jðhj+h²hh³hÃh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j@jAuh1jëh³hÃh´MÜhjÀh²hubhÚ)�”}”(hŒLevel: Beginner”h]”hŒLevel: Beginner”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´MßhjÀh²hubhÅ)�”}”(hhh]”hÊ)�”}”(hŒ Outside DRM”h]”hŒ Outside DRM”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhj™h²hh³hÃh´Mâubah}”(h]”Œ outside-drm”ah ]”h"]”Œ outside drm”ah$]”h&]”uh1hÄhjÀh²hh³hÃh´Mâubeh}”(h]”Œ-replace-the-lockless-queue-with-a-locked-list”ah ]”h"]”Œ-replace the lockless queue with a locked list”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´M¹ubhÅ)�”}”(hhh]”(hÊ)�”}”(hŒConvert fbdev drivers to DRM”h]”hŒConvert fbdev drivers to DRM”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhjºh²hh³hÃh´MåubhÚ)�”}”(hŒìThere are plenty of fbdev drivers for older hardware. Some hardware has become obsolete, but some still provides good(-enough) framebuffers. The drivers that are still useful should be converted to DRM and afterwards removed from fbdev.”h]”hŒìThere are plenty of fbdev drivers for older hardware. Some hardware has become obsolete, but some still provides good(-enough) framebuffers. The drivers that are still useful should be converted to DRM and afterwards removed from fbdev.”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mçhjºh²hubhÚ)�”}”(hŒéVery simple fbdev drivers can best be converted by starting with a new DRM driver. Simple KMS helpers and SHMEM should be able to handle any existing hardware. The new driver's call-back functions are filled from existing fbdev code.”h]”hŒëVery simple fbdev drivers can best be converted by starting with a new DRM driver. Simple KMS helpers and SHMEM should be able to handle any existing hardware. The new driver’s call-back functions are filled from existing fbdev code.”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mìhjºh²hubhÚ)�”}”(hX"More complex fbdev drivers can be refactored step-by-step into a DRM driver with the help of the DRM fbconv helpers [4]_. These helpers provide the transition layer between the DRM core infrastructure and the fbdev driver interface. Create a new DRM driver on top of the fbconv helpers, copy over the fbdev driver, and hook it up to the DRM code. Examples for several fbdev drivers are available in Thomas Zimmermann's fbconv tree [4]_, as well as a tutorial of this process [5]_. The result is a primitive DRM driver that can run X11 and Weston.”h]”(hŒtMore complex fbdev drivers can be refactored step-by-step into a DRM driver with the help of the DRM fbconv helpers ”…”�”}”(hjçh²hh³Nh´Nubjn)�”}”(hŒ[4]_”h]”hŒ4”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”Œid7”ah ]”h"]”h$]”h&]”hÁŒid10”jj€uh1jmhjçj�KubhX9. These helpers provide the transition layer between the DRM core infrastructure and the fbdev driver interface. Create a new DRM driver on top of the fbconv helpers, copy over the fbdev driver, and hook it up to the DRM code. Examples for several fbdev drivers are available in Thomas Zimmermann’s fbconv tree ”…”�”}”(hjçh²hh³Nh´Nubjn)�”}”(hŒ[4]_”h]”hŒ4”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid8”ah ]”h"]”h$]”h&]”hÁjþjj€uh1jmhjçj�KubhŒ(, as well as a tutorial of this process ”…”�”}”(hjçh²hh³Nh´Nubjn)�”}”(hŒ[5]_”h]”hŒ5”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid9”ah ]”h"]”h$]”h&]”hÁŒid11”jj€uh1jmhjçj�KubhŒC. The result is a primitive DRM driver that can run X11 and Weston.”…”�”}”(hjçh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mñhjºh²hubjÃ)�”}”(hŒ¬.. [4] https://gitlab.freedesktop.org/tzimmermann/linux/tree/fbconv .. [5] https://gitlab.freedesktop.org/tzimmermann/linux/blob/fbconv/drivers/gpu/drm/drm_fbconv_helper.c ”h]”(jÉ)�”}”(hŒ”h]”(hŒContact: Thomas Zimmermann <”…”�”}”(hj›h²hh³Nh´Nubjâ)�”}”(hŒtzimmermann@suse.de”h]”hŒtzimmermann@suse.de”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:tzimmermann@suse.de”uh1jáhj›ubhŒ>”…”�”}”(hj›h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mýhjºh²hubhÚ)�”}”(hŒLevel: Advanced”h]”hŒLevel: Advanced”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÙh³hÃh´Mÿhjºh²hubeh}”(h]”Œconvert-fbdev-drivers-to-drm”ah ]”h"]”Œconvert fbdev drivers to drm”ah$]”h&]”uh1hÄhhÆh²hh³hÃh´Måubeh}”(h]”(Œ todo-list”hÂeh ]”h"]”(Œ todo list”Œtodo”eh$]”h&]”uh1hÄhhh²hh³hÃh´KŒexpect_referenced_by_name”}”jÙh·sŒexpect_referenced_by_id”}”hÂh·subeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÃuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÉNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÃŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”(Œ1”]”joaŒ2”]”j†aŒ3”]”jšaŒ4”]”(jïjeŒ5”]”jauŒrefids”}”hÂ]”h·asŒnameids”}”(jÙhÂjØjÕj^j[jVjSj¯j¬jjýjCj@j†jƒjûj~j+j•j\j©jÉjÆjcj`jÂj¿jÛjØjjjojlj²j¯j jj|jyj(j%jêjçjJ jG jÆ jà j j j’ j� jF jC j« j¨ j jÿ jY jV jÌ jÉ jŸ jœ j<j9jêjçjâjßj`j]j`j]jëjèj%j"j j j–j“jûjøj±j®j©j¦jJjGjçjäj¯j¬jäjáj'j$j„j�j7j4j/j,jGjDj j j"jjÇjÄj&j#j?j<jfjcj½jºj·j´j¯j¬jÐjÍjajþj’j%uŒ nametypes”}”(jÙˆj؉j^‰jV‰j¯‰j‰jC‰j†‰jûˆj+ˆj\ˆjɉjc‰j‰jÛ‰j‰jo‰j²‰j ‰j|‰j(‰jê‰jJ ‰jÆ ‰j ‰j’ ‰jF ‰j« ‰j ‰jY ‰jÌ ‰jŸ ‰j<‰jê‰jâ‰j`‰j`ˆjëˆj%ˆj ‰j–‰jû‰j±‰j©‰jJ‰jçˆj¯‰jä‰j'‰j„‰j7‰j/‰jG‰j ‰j"‰jljj&‰j?‰jf‰j½‰j·‰j¯‰jЉjaˆj’ˆuh}”(hÂhÆjÕhÆj[héjSj@j¬jajýj²j@jjƒjFjyjoj�j†j¤jšj~jÊj•jþj©j.jÆj‰j`jÌj¿jfjØjÅjjÞjlj!j¯jrjjµjyj j%jjçj+jG jíjà jM j jÉ j� j jC j• j¨ jI jÿ j® jV j jÉ j\ jœ jÏ j9j¢ jçj?jßjÌj]jíj]jWjèjâj"jj jcj“jjøj™j®jþj¦j“jGj´jäjÞj¬jMjáj²j$jçj�j*j4j‡j,jjDj:j jujjjÄj%j#jÊj<j)jcjJjºjij´jÀj¬j™jÍjºjùjïj jj jjþj4j%jduŒ footnote_refs”}”(jC]”joajE]”j†ajG]”jšajI]”(jïjejK]”jauŒ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”(jÊjþj.j4jdeŒ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jK s…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)�”}”(hhh]”hÚ)�”}”(hhh]”hŒ*Hyperlink target "todo" is not referenced.”…”�”}”hj|sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÙhjyubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÃŒline”Kuh1jwubaŒ transformer”NŒ include_log”]”Œ decoration”Nh²hub.