<div dir="ltr">Hi Daniel, all<div><br></div><div>I spent the last days on my GSoC 2015 proposal, I've submited it to the google-melange site. Now I post it here for you to review, hope you can spare some time to give it a look and give me some advices. </div><div>Any comments and criticism is welcomed.</div><div><br></div><div><h1 id="project-page-title" style="margin:0px;font-family:Arial,'Helvetica Neue',Helvetica,sans-serif;line-height:1.5em;color:rgb(35,139,210)"><font>Convert the BOCHS and CIRRUS drivers to atomic mode-setting</font></h1><h2 id="project-page-student-name" style="font-family:Arial,'Helvetica Neue',Helvetica,sans-serif;font-weight:normal;line-height:1.3em;color:rgb(35,139,210);margin:0px 0px 1em"><font size="1">Zhao Junwang</font></h2><div class="" style="border:1px solid rgb(235,235,235);padding:15px;color:rgb(0,0,0);font-family:Arial,'Helvetica Neue',Helvetica,sans-serif;font-size:13px;line-height:19.5px;background-image:initial;background-repeat:initial"><p class="" style="margin:0px;line-height:1.6em;font-size:12px"><strong>Organization:</strong> X.Org Foundation</p><p class="" style="margin:0px;line-height:1.6em;font-size:12px"><strong>Abstract:</strong> Atomic mode-setting has been discussed and designed for literally years, now it's finally there, it is not only necessary but allows a bunch of nice and long overdue cleanup and unification. There are a lot ongoing atomic mode-setting conversions and some already committed to drm-next ones, while there still are some subsystems haven't started the work, as far as I know, radeon, udl, bochs and cirrus are some optional drivers. I will take DRM_BOCHS and DRM_CIRRUS_QEMU as my converting goals.</p></div><div class="" style="padding:15px 15px 0px;color:rgb(0,0,0);font-family:Arial,'Helvetica Neue',Helvetica,sans-serif;font-size:13px;line-height:19.5px"><div><span style="font-size:12pt"><strong>Introduction to the Project</strong></span></div><div> </div><div><span style="font-size:10pt">This project aims to convert two existing KMS drivers to atomic mode-setting, DRM_BOCHS and DRM_CIRRUS_QEMU.</span></div><div><span style="font-size:10pt"><span style="color:rgb(34,34,34);font-family:arial,sans-serif">BOCHS stands for </span>standard VGA card with Bochs VBE extensions, we can emulate it in qemu <span style="color:rgb(34,34,34);font-family:arial,sans-serif"><span>by adding the </span></span><span style="color:rgb(34,34,34);font-family:arial,sans-serif">option '-vga std'. W</span>hile CIRRUS is the default Video card that QEMU emulated. </span></div><div><div><span style="font-size:10pt">For these two drivers used by KVM/QEMU, they are still in the Renaissace era of KMS, something not perfect:</span></div><ul style="margin:0px 0px 1.5em;line-height:1.5em"><li><div><span style="font-size:10pt">mode sets fail too late, if the mode-setting fails, there's no way to rollback</span></div></li><li><div><span style="font-size:10pt">KMS does not guarantee that a configuration is applied in totality for the next frame</span></div></li><li><div><span style="font-size:10pt">no VBLANK-synchronized page-flips for planes</span></div></li><li><div><span style="font-size:10pt">not perfect frames</span></div></li></ul><div><span style="font-size:10pt">As we all know the weaknesses in the legacy KMS drivers now, we should overcome them by convert the drivers into Atomic Mode-Setting. The Atomic Mode-Setting</span></div><ul style="margin:0px 0px 1.5em;line-height:1.5em"><li><div><span style="font-size:10pt">allows an output configuration to be validated before it is applied:</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">no hardware is touched before the driver acknowleges that the configuration is valid and can be applied</span></div></li><li><div><span style="font-size:10pt">no need for rollback</span></div></li></ul></li><li><div><span style="font-size:10pt">allows atomic updates of an output configuration:</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">multiple planes updated at the same time</span></div></li><li><div><span style="font-size:10pt">we got perfect frames show at the same time</span></div></li></ul></li><li><div><span style="font-size:10pt">allows for unification and simplification of drivers</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">legacy code can be removed from drivers</span></div></li><li><div><span style="font-size:10pt">much of the handling moves into helpers (core DRM)</span></div></li></ul></li></ul><hr style="height:0px;margin-top:20px;margin-bottom:20px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-style:solid;border-color:rgb(204,204,204);clear:both"><p style="margin:0px 0px 10px;line-height:1.6em;font-size:12px"><span style="font-size:12pt"><strong>Project Goals</strong></span></p></div><div><span style="font-size:10pt">The project shall complete two legacy KMS drivers conversion individually:</span></div><ol style="margin:0px 0px 1.5em;line-height:1.5em"><li><div><span style="font-size:10pt">convert DRM_BOCHS driver into Atomic Mode-Setting driver</span></div></li><li><div><span style="font-size:10pt">convert DRM_CIRRUS_QEMU driver into Atomic Mode-Setting driver</span></div></li></ol><div><span style="font-size:10pt">Since Daniel did most of the Transtional and atomic helpers work, so the conversion is surprisingly painless.</span></div><div><hr style="height:0px;margin-top:20px;margin-bottom:20px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-style:solid;border-color:rgb(204,204,204);clear:both"></div><div><div><span style="font-size:12pt"><strong>Quantifiable Results for the DRI Community</strong></span></div></div><div><div><ul style="margin:0px 0px 1.5em;line-height:1.5em"><li><span style="font-size:10pt"><span style="color:rgb(34,34,34);font-family:arial,sans-serif">Make it a more complete</span> ecosystem for the atomic mode-setting</span></li><li><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">Use unified helpers will make it more concise for the subsystem, less code</span></li></ul></div></div><div><hr style="height:0px;margin-top:20px;margin-bottom:20px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-style:solid;border-color:rgb(204,204,204);clear:both"></div><div><div><span style="font-size:12pt"><strong>Project Details</strong></span></div></div><div><div><span style="font-size:12pt"> </span></div><div><span style="font-size:10pt">Since radeon support about 18 years of asics and 8 generations of display hardwares, the conversion will be a huge amout of work and there is a huge potential regressions, so I choose two drivers used by kvm/qeum, which are a lot simpler than mordern GPUs.</span></div><div><span style="font-size:10pt">The following specified what needs to be done to support atomic modeset updates using Daniel's new helper libraries.</span></div></div><div><div><span style="font-size:10pt"> </span></div><div><div><strong><span style="font-size:10pt">Phase 1 - Reworking the Driver Backend Functions for Planes</span></strong></div><div><span style="font-size:10pt">There are two big mismatches between the new atomic semantics and the legacy ioctl interfaces:</span></div><div><span style="font-size:10pt">    1) The primary plane is no longer tied to CRTC.</span></div><div><span style="font-size:10pt">    2) Atomic updates of multiple planes isn't supported at all.</span></div><div><span style="font-size:10pt">Both issuse are addressed by adding new driver backend callbacks. So we should implement legacy entry points in term of new atomic callbacks.</span></div><div><span style="font-size:10pt">The first step is to rework the ->disable/update_plane hooks using the transitional helper implementations drm_plane_helper_update/disable. The following new driver callbacks are needed:</span></div><ul style="margin:0px 0px 1.5em;line-height:1.5em"><li><strong><span style="font-size:10pt">CRTCs</span></strong></li><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">->atomic_check()      - validate state</span></div></li><li><div><span style="font-size:10pt">->atomic_begin()      - prepare for updates</span></div></li><li><div><span style="font-size:10pt">->atomic_flush()       - apply updates atomically</span></div></li><li><div><span style="font-size:10pt">->atomic_set_nofb    - apply CRTC timings, this callback must be implement</span></div></li></ul><li><strong><span style="font-size:10pt">planes</span></strong><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">->prepare_fb()          - setup the framebuffers, e.g. pin backing storage into memory and setup any needed hardware resources</span></div></li><li><div><span style="font-size:10pt">->cleanup_fb()          - e.g. unpi backing storage</span></div></li><li><div><span style="font-size:10pt">->atomic_check()      - validate state</span></div></li><li><div><span style="font-size:10pt">->atomic_update()     - per-plane update, like setting up the new viewport or the new base address of the framebuffer for each plane</span></div></li><li><div><span style="font-size:10pt">->atomic_disable()     - disable plane</span></div></li></ul></li></ul><p style="margin:0px 0px 10px;line-height:1.6em;font-size:12px"><span style="font-size:10pt">The provided helpers functions drm_helper_crtc_mode_set and drm_helper_crtc_mode_set_base then implement the callbacks required by the CRTC helpers in terms of new ->mode_set_nofb callback and the the above newly implmented plane helper callbacks.</span></p></div></div><div><div><strong><span style="font-size:10pt">Phase 2 - Wire up the Atomic State Object Scaffolding</span></strong></div><div><span style="font-size:10pt">The goal of this phase is to get all the state object handing needed for atomic updates into place.</span></div><ul style="margin:0px 0px 1.5em;line-height:1.5em"><li><div><span style="font-size:10pt">wire up state callbacks for planes, CRTCs and connectors:</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">->reset()</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">drm_atomic_helper_*_reset()</span></div></li></ul></li><li><div><span style="font-size:10pt">->atomic_duplicate_state()</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">drm_atomic_helper_*_duplicate_state()</span></div></li></ul></li><li><div><span style="font-size:10pt">->atomic_destroy_state()</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">drm_atomic_helper_*_destroy_state()</span></div></li></ul></li></ul></li><li><div><span style="font-size:10pt">patching up the state objects in legacy code paths</span></div><ul style="margin:0px;line-height:1.5em"><li><span style="font-size:13.3333330154419px">make sure that we can partially transition to atomic updates.</span></li><li><span style="font-size:13.3333330154419px">drm_atomic_set_fb_for_plane</span><ul style="margin:0px;line-height:1.5em"><li><span style="font-size:13.3333330154419px">usually the only place this is need to be manually added is the ->page_flip callback.</span></li></ul></li></ul></li><li><span style="font-size:13.3333330154419px">all ->mode_fixup callbacks need to be audited</span><ul style="margin:0px;line-height:1.5em"><li><span style="font-size:13.3333330154419px">not depend upon any state which is only set in the various CRTC helpers.</span></li><li><span style="font-size:13.3333330154419px">not tracked by the atomic state objects.</span></li></ul></li></ul><div style="font-size:12pt"><strong><span style="font-size:10pt">Phase 3 - Rolling out Atomic Support</span></strong></div><div style="font-size:12pt"><span style="font-size:10pt">Replace all the legacy entry pointers with the corresponding functions from the atomic helper library to implement them in terms of atomic.</span></div><ul style="margin:0px 0px 1.5em;line-height:1.5em;font-size:12pt"><li><div><span style="font-size:10pt">switch to atomic helpers internally (after this Drivers uses only atomic interfaces internally):</span></div><ul style="margin:0px;line-height:1.5em"><li><span style="font-size:10pt">Planes:</span><ul style="margin:0px;line-height:1.5em"><li><span style="font-size:10pt">drm_atomic_helper_update_plane()</span></li><li><span style="font-size:10pt">drm_atomic_helper_disable_plane()</span></li></ul></li><li><span style="font-size:10pt">Drivers</span><ul style="margin:0px;line-height:1.5em"><li><span style="font-size:10pt">drm_atomic_helper_check()</span></li><li><span style="font-size:10pt">drm_atomic_helper_commit()</span></li></ul></li></ul></li><li><div><span style="font-size:10pt">switch to atomic helpers for userspace IOCTLs (after this Drivers is fully atomic):</span></div><ul style="margin:0px;line-height:1.5em"><li><div><span style="font-size:10pt">drm_atomic_helper_set_config(): DRM_MODE_IOCTL_SET_CRTC</span></div></li><li><span style="font-size:10pt">provide a customer ->atomic_commit() implementation to support asynchronous commits, required for page-flipping</span></li><li><span style="font-size:10pt">drm_atomic_helper_page_flip(): DRM_MODE_IOCTL_PAGE_FLIP</span></li></ul></li></ul><div style="font-size:12pt"><strong><span style="font-size:10pt">Rip out Cruft</span></strong></div><div style="font-size:12pt"><span style="font-size:10pt">There is quite a bit of cleanup work possible afterwards.</span></div><ul style="margin:0px 0px 1.5em;line-height:1.5em"><li><span style="font-size:10pt">->mode_set() and ->mode_set_base() are no longer used, ->mode_set_nofb() does what is necessary to set a mode.</span></li><li><span style="font-size:10pt">atomic DPMS, DPMS standby and suspend are no more, ->disable() and ->enable() callbacks are used now, atomic DPMS is a full off or on cycle</span></li></ul><hr style="height:0px;margin-top:20px;margin-bottom:20px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-style:solid;border-color:rgb(204,204,204);clear:both"><p style="margin:0px 0px 10px;line-height:1.6em;font-size:12px"><span style="font-size:12pt"><strong>References</strong></span></p><div><div><span style="font-size:10pt">[1]<a href="http://blog.ffwll.ch/2014/11/atomic-modeset-support-for-kms-drivers.html" style="color:rgb(0,83,139);background-color:transparent">http://blog.ffwll.ch/2014/11/atomic-modeset-support-for-kms-drivers.html</a></span></div><div><span style="font-size:10pt">[2]<a href="http://blog.ffwll.ch/2015/01/update-for-atomic-display-updates.html" style="color:rgb(0,83,139);background-color:transparent">http://blog.ffwll.ch/2015/01/update-for-atomic-display-updates.html</a></span></div><div><span style="font-size:10pt">[3]<a href="http://article.gmane.org/gmane.comp.video.dri.devel/117376" style="color:rgb(0,83,139);background-color:transparent">http://article.gmane.org/gmane.comp.video.dri.devel/117376</a></span></div><div><span style="font-size:10pt">[4]<a href="https://fosdem.org/2015/schedule/event/kms_atomic/" style="color:rgb(0,83,139);background-color:transparent">https://fosdem.org/2015/schedule/event/kms_atomic/</a></span></div><div><div><span style="font-size:10pt">[5]<a href="http://lists.freedesktop.org/archives/dri-devel/2015-February/077118.html" style="color:rgb(0,83,139);background-color:transparent">http://lists.freedesktop.org/archives/dri-devel/2015-February/077118.html</a></span></div><div><hr style="height:0px;margin-top:20px;margin-bottom:20px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-style:solid;border-color:rgb(204,204,204);clear:both"></div></div></div></div><div><div><span style="font-size:12pt"><strong>Approximative Schedule</strong></span></div></div><div><div> </div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">(now - 15 April)</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">     - get familiar with the Atomic Modeset Support for KMS Drivers</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">     - take a look at the ongoing atomic mode-setting conversations and those already committed to drm-next</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">     - discuss with the mentor about some confusing details on the code</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">(16 April - 27 April )</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">     - get to know more about the DRM_BOCHS and DRM_CIRRUS_QEMU subsystem driver code</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:10pt">     - setup the kvm/qemu environment for further test</span></div><div><div><span style="font-size:10pt">(28 April - 18 May)</span></div></div><div><span style="font-size:10pt">     - code: write my<strong> first </strong>version of the atomic mode-setting conversion for DRM_BOCHS driver</span></div><div><span style="font-size:10pt">     - discuss with the mentor about the conversion if the patches meet the demand</span></div><div><span style="font-size:10pt">(19 May - 15 June)</span></div><div><span style="font-size:10pt">     - code: write my<strong> second </strong>version of the atomic mode-setting conversion for DRM_BOCHS driver</span></div><div><span style="font-size:10pt">     - test: test the new converted Bochs driver on qemu, using the '-vga std' option</span></div><div><span style="font-size:10pt">(16 June - 25 June)</span></div><div><span style="font-size:10pt">     - submit patches to the <a href="mailto:dri-devel@lists.freedesktop.org" style="color:rgb(0,83,139);background-color:transparent">dri-devel@lists.freedesktop.org</a>, if anything wrong, modify it</span></div><div><span style="font-size:10pt">     - get to know more about the DRM_CIRRUS_QEMU subsystem</span></div><div><span style="font-size:10pt">(26 June - 30 June)</span></div><div><span style="font-size:10pt">     - arrange documentations for mid-term evaluations</span></div><div><span style="font-size:10pt">(1 July - 3 July)</span></div><div><span style="font-size:10pt">     - submit mid-term evaluations</span></div><div><span style="font-size:10pt">(4 July - 17 August)</span></div><div><span style="font-size:10pt">     - code: write the atomic mode-setting conversion for DRM_CIRRUS_QEMU (same schedule with DRM_BOCHS)</span></div><div><span style="font-size:10pt">     - do more test to assure the correctness and check the code.</span></div><div><span style="font-size:10pt">(18 August - 21 August)</span></div><div><span style="font-size:10pt">     - arrange documets for reports, scub code, write tests, improve documentation, etc.</span></div><div><span style="font-size:10pt">(22 August - 27 August)</span></div><div><span style="font-size:10pt">     - submit final evaluations.</span></div><div><span style="font-size:10pt">(28 August - 30 August)</span></div><div><span style="font-size:10pt">     - submit required code samples to Google.</span></div><div><span style="font-size:10pt"> </span></div><div><span style="font-size:10pt">(after GSoC)</span></div><div><span style="font-size:10pt">     - as Alex Deucher suggest, in additon to the two virtual drivers I am going to convert, udl (KMS driver</span></div><div><span style="font-size:10pt">        for the USB displaylink video adapters) is another choice for me, as I am still not that skilled in</span></div><div><span style="font-size:10pt">        Atomic Modeset Support for KMS Drivers, I will give it a shot after GSoC. </span></div><div><span style="font-size:10pt">     - as for the Radeon, since Alex said the community have no immediate plans to convert it to atomic, I</span></div><div><span style="font-size:10pt">        hope when it is on the agenda in the future, I can do something helpful.</span></div><div><hr style="height:0px;margin-top:20px;margin-bottom:20px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-style:solid;border-color:rgb(204,204,204);clear:both"></div></div><div><div><span style="font-size:12pt"><strong>About me</strong></span></div></div><div> </div><div><div><div><span style="font-size:10pt">I am studying for my Master Degree in Peking University, where I am majoring in Computer Architecture. </span></div><div><span style="font-size:10pt">In the last semester, my lab mentor arrange me to look into the DRM ecosystem, so I can write a Geode</span></div><div><span style="font-size:10pt">LX drm driver later on. I am not sure whether this is significant, but this GSoC project will definitely helps</span></div><div><span style="font-size:10pt">me a lot on understanding the whole ecosystem.</span></div><div><span style="font-size:10pt"> </span></div><div><span style="font-size:10pt">Thank you for reading. Have a nice day.</span></div><div><hr style="height:0px;margin-top:20px;margin-bottom:20px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-style:solid;border-color:rgb(204,204,204);clear:both"></div></div></div><div> </div></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>Best regards<br></div><div>Junwang Zhao</div><div>Microprocessor Research and Develop Center</div><div>Department of Computer Science &Technology</div><div>Peking University</div><div>Beijing, 100871, PRC</div></div></div>
</div></div>