Hi Dave, Daniel, others,
The goal with DAL is to provide a unified, full featured display stack to service all of our Linux offerings. This driver will have to support our full feature set beyond what's supported by amdgpu, e.g.
- synchronzied timings across different displays
- freesync
- solid support of 6 displays in any configuration (HDMI, DVI, DP, DP MST, etc)
- solid support of 4k@60 timings on APUs
- power features, such as
- clock-accurate bandwidth formulas
- improved interaction with powerplay to maximize power savings
- Improved audio and other infoframe related features
- Improved stability with powerplay since display hw is involved in the SMC hw interactions and improper programming sequences can lead to GPU hangs, etc.
The current amdgpu display stack grew somewhat organically and as such is not well suited to handling all of the hardware dependencies involved especially in areas like audio. The drm abstractions used by the old code map less and less well to new hw pipelines. Atomic helps, but if we are going to convert, it seemed like a good time to start fresh.
Our DC (Display Core in dc.h, etc.) is the framework to allow us to well represent current and future HW architectures. These don't always map one-to-one to DRM interfaces. For one we can't make the assumption that surfaces map one-to-one to pipes.
The DAL internal abstractions were used since they match the abstractions used by our drivers for other OSes, pre and post silicon validation tools and HW team programming models. Keeping it as close to that as possible makes it easier to debug and validate and provides the most likely change of success in complex display configurations.
Please see the attached DC.png for an overview of the DAL design.
For an atomic sequence you might want to look at
- enable/disable displays or change display config -> dc_commit_targets
(in dc/core/dc.c, called from amdgpu_dm_atomic_commit in amdgpu_dm/amdgpu_dm_types.c)
- commit planes -> dc_commit_surfaces_to_targets
(in dc/core/dc_target.c, called from dm_dc_surface_commit in amdgpu_dm/amdgpu_dm_types.c)
- validate -> dc_validate_resources
(in dc/core/dc.c, called from amdgpu_dm_atomic_check in amdgpu_dm/amdgpu_dm_types.c)
There's still a bunch of legacy stuff in these patches that's on our list of things to refactor. Some of that is
- dc/adapter
- dc/asic_capability
- dc/audio
- dc/bios
- dc/gpio
We should be able to cut the size of this code to about 1/3 of what it is now.
As for the LOC we have about
22k for HW programming
30k legacy stuff
6k dc/calcs - autogenerated from formulas provided by HW team
15k includes
6k amdgpu_dm
8k dc/core
About 14k of those are blank lines (we have a habit of leaving lots of blank space) and 16k are comments.
Cheers,
Harry
________________________________________
From: Daniel Vetter <daniel.vetter@xxxxxxxx> on behalf of Daniel Vetter <daniel@xxxxxxxx>
Sent: Friday, February 12, 2016 12:34 AM
To: Dave Airlie
Cc: Wentland, Harry; dri-devel
Subject: Re: [PATCH 00/29] Enabling new DAL display driver for amdgpu on Carrizo and Tonga
On Thu, Feb 11, 2016 at 10:06:14PM +0100, Daniel Vetter wrote:
On Thu, Feb 11, 2016 at 9:52 PM, Dave Airlie <airlied@xxxxxxxxx> wrote:
On 12 February 2016 at 03:19, Harry Wentland <harry.wentland@xxxxxxx> wrote:
This set of patches enables the new DAL display driver for amdgpu on Carrizo
Tonga, and Fiji ASICs. This driver will allow us going forward to bring
display features on the open amdgpu driver (mostly) on par with the Catalyst
driver.
This driver adds support for
- Atomic KMS API
- MST
- HDMI 2.0
- Better powerplay integration
- Support of HW bandwidth formula on Carrizo
- Better multi-display support and handling of co-functionality
- Broader support of display dongles
- Timing synchronization between DP and HDMI
This patch series is based on Alex Deucher's drm-next-4.6-wip tree.
So the first minor criticism is this patch doesn't explain WHY.
Why does the Linux kernel need 93k lines of code to run the displays
when whole drivers don't even come close.
We've spent a lot of time ripping abstraction layers out of drivers (exynos
being the major one), what benefits does this major change bring to the
Linux kernel and the AMDGPU driver over and above a leaner, more focused
work.
If were even to consider merging this it would be at a guess considered
staging level material which would require a TODO list of major cleanups.
I do realise you've put a lot of work into this, but I think you are going to
get a lot of review pushback in the next few days and without knowing the
reasons this path was chosen it is going to be hard to take.
Yeah agreed, we need to figure out the why/how first. Assembling a
de-staging TODO is imo a second step. And the problem with that is
that before we can do a full TODO we need to remove all the os and drm
abstractions. I found delayed_work, timer, memory handling, pixel
formats (in multiple copies), the i2c stuff Rob noticed and there's
more I'm sure. With all that I just can't even see how the main DAL
structures connect and how that would sensibly map to drm concepts.
Which is most likely needed to make DAL properly atomic.
More stuff plain duplicated I spotted:
- some edid handling (probably because of the duplicated i2c, but probably
also because dal).
- has it's own infoframe encoding it seems
- home-grown logging. Yes, DRM_DEBUG isn't the most awesome, but dynamic
prinkt is pretty neat from what I understand and we should just move
DRM_DEBUG over to that if you need more flexibility.
Cheers, Daniel
So de-staging DAL (if we decided this is the right approach) would be
multi-stage, with removal of the abstractions not needed first, then
taking a 2nd look and figuring out how to untangle the actual
concepts.
Aside: If all this abstraction is to make dal run in userspace for
testing or whatever - nouveau does this, we (Intel) want to do this
too for unit-testing, so there's definitely room for sharing the
tools. But the right approach imo is to just implement kernel services
(like timers) in userspace.
Another thing is that some of the features in here (hdmi 2.0, improved
dongle support) really should be in shared helpers. If we have that
hidden behind the dal abstraction it'll be pretty much impossible
(with major work, which is unreasonable to ask of other people trying
to get their own driver in) to extract&share it. And for sink handling
having multiple copies of the same code just doesn't make sense.
Anyway that's my quick thoughts from 2h of reading this. One wishlist:
Some design overview or diagram how dal structures connect would be
awesome as a reading aid.
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch