mirror of https://gitee.com/openkylin/linux.git
70 lines
3.0 KiB
Plaintext
70 lines
3.0 KiB
Plaintext
|
NOTES about msm drm/kms driver:
|
||
|
|
||
|
In the current snapdragon SoC's, we have (at least) 3 different
|
||
|
display controller blocks at play:
|
||
|
+ MDP3 - ?? seems to be what is on geeksphone peak device
|
||
|
+ MDP4 - S3 (APQ8060, touchpad), S4-pro (APQ8064, nexus4 & ifc6410)
|
||
|
+ MDSS - snapdragon 800
|
||
|
|
||
|
(I don't have a completely clear picture on which display controller
|
||
|
maps to which part #)
|
||
|
|
||
|
Plus a handful of blocks around them for HDMI/DSI/etc output.
|
||
|
|
||
|
And on gpu side of things:
|
||
|
+ zero, one, or two 2d cores (z180)
|
||
|
+ and either a2xx or a3xx 3d core.
|
||
|
|
||
|
But, HDMI/DSI/etc blocks seem like they can be shared across multiple
|
||
|
display controller blocks. And I for sure don't want to have to deal
|
||
|
with N different kms devices from xf86-video-freedreno. Plus, it
|
||
|
seems like we can do some clever tricks like use GPU to trigger
|
||
|
pageflip after rendering completes (ie. have the kms/crtc code build
|
||
|
up gpu cmdstream to update scanout and write FLUSH register after).
|
||
|
|
||
|
So, the approach is one drm driver, with some modularity. Different
|
||
|
'struct msm_kms' implementations, depending on display controller.
|
||
|
And one or more 'struct msm_gpu' for the various different gpu sub-
|
||
|
modules.
|
||
|
|
||
|
(Second part is not implemented yet. So far this is just basic KMS
|
||
|
driver, and not exposing any custom ioctls to userspace for now.)
|
||
|
|
||
|
The kms module provides the plane, crtc, and encoder objects, and
|
||
|
loads whatever connectors are appropriate.
|
||
|
|
||
|
For MDP4, the mapping is:
|
||
|
|
||
|
plane -> PIPE{RGBn,VGn} \
|
||
|
crtc -> OVLP{n} + DMA{P,S,E} (??) |-> MDP "device"
|
||
|
encoder -> DTV/LCDC/DSI (within MDP4) /
|
||
|
connector -> HDMI/DSI/etc --> other device(s)
|
||
|
|
||
|
Since the irq's that drm core mostly cares about are vblank/framedone,
|
||
|
we'll let msm_mdp4_kms provide the irq install/uninstall/etc functions
|
||
|
and treat the MDP4 block's irq as "the" irq. Even though the connectors
|
||
|
may have their own irqs which they install themselves. For this reason
|
||
|
the display controller is the "master" device.
|
||
|
|
||
|
Each connector probably ends up being a separate device, just for the
|
||
|
logistics of finding/mapping io region, irq, etc. Idealy we would
|
||
|
have a better way than just stashing the platform device in a global
|
||
|
(ie. like DT super-node.. but I don't have any snapdragon hw yet that
|
||
|
is using DT).
|
||
|
|
||
|
Note that so far I've not been able to get any docs on the hw, and it
|
||
|
seems that access to such docs would prevent me from working on the
|
||
|
freedreno gallium driver. So there may be some mistakes in register
|
||
|
names (I had to invent a few, since no sufficient hint was given in
|
||
|
the downstream android fbdev driver), bitfield sizes, etc. My current
|
||
|
state of understanding the registers is given in the envytools rnndb
|
||
|
files at:
|
||
|
|
||
|
https://github.com/freedreno/envytools/tree/master/rnndb
|
||
|
(the mdp4/hdmi/dsi directories)
|
||
|
|
||
|
These files are used both for a parser tool (in the same tree) to
|
||
|
parse logged register reads/writes (both from downstream android fbdev
|
||
|
driver, and this driver with register logging enabled), as well as to
|
||
|
generate the register level headers.
|