On Fri, Jan 08, 2016 at 09:49:22AM -0700, Jonathan Corbet wrote:
Well, it's built around the asciidoc patch, which isn't in the mainline at this point. Should things go a different direction, that could force some changes here;
If/when that happens, I'll be happy to fixup the documentation as needed. In fact I originally wrote this in markdown in November, then converted it to asciidoc in December and that really wasn't a big deal.
The need for asciidoc arises from the desire to not clutter up the prose text with URLs. To achieve this, asciidoc allows defining so-called "attribute entries" which may then be referenced in the text: http://asciidoc.org/userguide.html#X62
Markdown has a similar feature called "reference style links", the difference being that they can be defined anywhere in the document, whereas asciidoc's "attribute entries" must precede their usage in the text: https://daringfireball.net/projects/markdown/syntax#link
Here's a v2, the only change is Bruno Pr�mont's addition to the commit message.
@Daniel Vetter: Could you pick this up for topic/drm-misc please?
An ack for drivers/platform/x86 was kindly provided by Darren Hart with: Message-ID: 20160104203150.GA4219@malice.jf.intel.com Link: http://lists.freedesktop.org/archives/dri-devel/2016-January/097918.html
Thanks everyone!
Lukas Wunner (1): apple-gmux: Add initial documentation
Documentation/DocBook/gpu.tmpl | 22 ++++++++ drivers/platform/x86/apple-gmux.c | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+)
Document what I've learned so far about the gmux so that we can collaboratively reverse-engineer its remaining unknown bits without everyone having to start from scratch.
The DOC sections are bound together in the gpu.tmpl DocBook under a new vga_switcheroo "Handlers" chapter. Eventually this should be amended with documentation about the four other handlers that exist so far (nouveau v1 DSM, nouveau Optimus DSM, radeon ATPX, amdgpu ATPX).
Requires kernel-doc with asciidoc support.
The EFI variable was reverse-engineered by Bruno Bierbaumer bruno@bierbaumer.net and Andreas Heider andreas@meetr.de.
Some of the remaining open questions:
* How are vblank intervals synchronized on retinas to achieve seamless switching? Is the DP mux capable of this? It's not mentioned in the data sheets. Or is it done at the OS level, i.e. do we have to synchronize vblank intervals between DRM drivers? There's a signal coming from the panel connector and going into gmux, could this be the vblank signal as received by the panel to properly time the switch?
* On retinas there's an I2C bus between gmux and the connector of the right I/O board, apparently leading to the Parade PS8401A HDMI repeater. What is this for, is it controlled via gmux registers? Data sheet: http://www.paradetech.com/products/jitter-cleaning-repeaters/ps8401/
* On retinas there's an I2C bus between gmux and the LED driver. Pre-retinas connected the LED driver to SMBUS. Are there additional gmux registers on retinas to control it?
* The MacPro6,1 2013 also has a gmux, the same Renesas R4F2113 as the retina MacBook Pro. The Mac Pro doesn't have a built-in display, so what is its purpose? Power control of the dual FirePro GPUs? Switching of the external DP/Thunderbolt ports? The iFixit teardown clearly shows one TI HD3SS212 DisplayPort mux on the logic board next to one of the three Thunderbolt controllers. However six muxes would be necessary to switch all six ports between GPUs. The mux is probably necessary for one of the display configurations allowed by Apple, but which one? https://www.ifixit.com/Teardown/Mac+Pro+Late+2013+Teardown/20778 https://d3nevzfk7ii3be.cloudfront.net/igi/fELBTnt31QhnDsqq.huge https://support.apple.com/en-us/HT202801
* Registers we haven't decoded yet: 0x700 32 Bit configmap? 0x708 32 Bit power sequence? 0x712 8 Bit status of clock from panel on retinas? 0x713 8 Bit dito? 0x724 16 Bit backlight, raw value? 0x760 32 Bit backlight 0x764 32 Bit backlight 0x768 8 Bit backlight 0x76a 16 Bit backlight 0x76c 16 Bit backlight 0x76e 16 Bit backlight 0x77f edp/dp/hdmi probe? retina only.
* Addition by Bruno Prémont bonbons@linux-vserver.org: "Missing is also precise knowledge as to what the gmux depends on. From behavioral reports, it is somehow sensitive to VGA IO/MEM routing (it apparently needs the routing to go to integrated GPU, not discrete GPU). When the routing is inappropriate backlight control IO just reads back as 0xFF (and eventually gmux IO in general does so)."
Signed-off-by: Lukas Wunner lukas@wunner.de Acked-by: Darren Hart dvhart@linux.intel.com Acked-by: Daniel Vetter daniel.vetter@ffwll.ch --- Documentation/DocBook/gpu.tmpl | 22 ++++++++ drivers/platform/x86/apple-gmux.c | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+)
diff --git a/Documentation/DocBook/gpu.tmpl b/Documentation/DocBook/gpu.tmpl index faa5e0d..a866933 100644 --- a/Documentation/DocBook/gpu.tmpl +++ b/Documentation/DocBook/gpu.tmpl @@ -3470,8 +3470,30 @@ int num_ioctls;</synopsis> </sect1> </chapter>
+ <chapter id="handlers"> + <title>Handlers</title> + <sect1> + <title>apple-gmux Handler</title> +!Pdrivers/platform/x86/apple-gmux.c Overview +!Pdrivers/platform/x86/apple-gmux.c Interrupt + <sect2> + <title>Graphics mux</title> +!Pdrivers/platform/x86/apple-gmux.c Graphics mux + </sect2> + <sect2> + <title>Power control</title> +!Pdrivers/platform/x86/apple-gmux.c Power control + </sect2> + <sect2> + <title>Backlight control</title> +!Pdrivers/platform/x86/apple-gmux.c Backlight control + </sect2> + </sect1> + </chapter> + !Cdrivers/gpu/vga/vga_switcheroo.c !Cinclude/linux/vga_switcheroo.h +!Cdrivers/platform/x86/apple-gmux.c </part>
</book> diff --git a/drivers/platform/x86/apple-gmux.c b/drivers/platform/x86/apple-gmux.c index 976efeb..2b921de 100644 --- a/drivers/platform/x86/apple-gmux.c +++ b/drivers/platform/x86/apple-gmux.c @@ -3,6 +3,7 @@ * * Copyright (C) Canonical Ltd. seth.forshee@canonical.com * Copyright (C) 2010-2012 Andreas Heider andreas@meetr.de + * Copyright (C) 2015 Lukas Wunner lukas@wunner.de * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -26,6 +27,24 @@ #include <acpi/video.h> #include <asm/io.h>
+/** + * DOC: Overview + * + * :1: http://www.latticesemi.com/en/Products/FPGAandCPLD/LatticeXP2.aspx + * :2: http://www.renesas.com/products/mpumcu/h8s/h8s2100/h8s2113/index.jsp + * + * gmux is a microcontroller built into the MacBook Pro to support dual GPUs: + * A {1}[Lattice XP2] on pre-retinas, a {2}[Renesas R4F2113] on retinas. + * + * (The MacPro6,1 2013 also has a gmux, however it is unclear why since it has + * dual GPUs but no built-in display.) + * + * gmux is connected to the LPC bus of the southbridge. Its I/O ports are + * accessed differently depending on the microcontroller: Driver functions + * to access a pre-retina gmux are infixed `_pio_`, those for a retina gmux + * are infixed `_index_`. + */ + struct apple_gmux_data { unsigned long iostart; unsigned long iolen; @@ -247,6 +266,20 @@ static bool gmux_is_indexed(struct apple_gmux_data *gmux_data) return false; }
+/** + * DOC: Backlight control + * + * :3: http://www.ti.com/lit/ds/symlink/lp8543.pdf + * :4: http://www.ti.com/lit/ds/symlink/lp8545.pdf + * + * On single GPU MacBooks, the PWM signal for the backlight is generated by + * the GPU. On dual GPU MacBook Pros by contrast, either GPU may be suspended + * to conserve energy. Hence the PWM signal needs to be generated by a separate + * backlight driver which is controlled by gmux. The earliest generation + * MBP5 2008/09 uses a {3}[TI LP8543] backlight driver. All newer models + * use a {4}[TI LP8545]. + */ + static int gmux_get_brightness(struct backlight_device *bd) { struct apple_gmux_data *gmux_data = bl_get_data(bd); @@ -273,6 +306,68 @@ static const struct backlight_ops gmux_bl_ops = { .update_status = gmux_update_status, };
+/** + * DOC: Graphics mux + * + * :5: http://pimg-fpiw.uspto.gov/fdd/07/870/086/0.pdf + * :6: http://www.nxp.com/documents/data_sheet/CBTL06141.pdf + * :7: http://www.ti.com/lit/ds/symlink/hd3ss212.pdf + * :8: https://www.pericom.com/assets/Datasheets/PI3VDP12412.pdf + * :9: http://www.ti.com/lit/ds/symlink/sn74lv4066a.pdf + * :10: http://pdf.datasheetarchive.com/indexerfiles/Datasheets-SW16/DSASW00308511.p... + * :11: http://www.ti.com/lit/ds/symlink/ts3ds10224.pdf + * + * On pre-retinas, the LVDS outputs of both GPUs feed into gmux which muxes + * either of them to the panel. One of the tricks gmux has up its sleeve is + * to lengthen the blanking interval of its output during a switch to + * synchronize it with the GPU switched to. This allows for a flicker-free + * switch that is imperceptible by the user ({5}[US 8,687,007 B2]). + * + * On retinas, muxing is no longer done by gmux itself, but by a separate + * chip which is controlled by gmux. The chip is triple sourced, it is + * either an {6}[NXP CBTL06142], {7}[TI HD3SS212] or {8}[Pericom PI3VDP12412]. + * The panel is driven with eDP instead of LVDS since the pixel clock + * required for retina resolution exceeds LVDS' limits. + * + * Pre-retinas are able to switch the panel's DDC pins separately. + * This is handled by a {9}[TI SN74LV4066A] which is controlled by gmux. + * The inactive GPU can thus probe the panel's EDID without switching over + * the entire panel. Retinas lack this functionality as the chips used for + * eDP muxing are incapable of switching the AUX channel separately (see + * the linked data sheets, Pericom would be capable but this is unused). + * However the retina panel has the NO_AUX_HANDSHAKE_LINK_TRAINING bit set + * in its DPCD, allowing the inactive GPU to skip the AUX handshake and + * set up the output with link parameters pre-calibrated by the active GPU. + * + * The external DP port is only fully switchable on the first two unibody + * MacBook Pro generations, MBP5 2008/09 and MBP6 2010. This is done by an + * {6}[NXP CBTL06141] which is controlled by gmux. It's the predecessor of the + * eDP mux on retinas, the difference being support for 2.7 versus 5.4 Gbit/s. + * + * The following MacBook Pro generations replaced the external DP port with a + * combined DP/Thunderbolt port and lost the ability to switch it between GPUs, + * connecting it either to the discrete GPU or the Thunderbolt controller. + * Oddly enough, while the full port is no longer switchable, AUX and HPD + * are still switchable by way of an {10}[NXP CBTL03062] (on pre-retinas + * MBP8 2011 and MBP9 2012) or two {11}[TI TS3DS10224] (on retinas) under the + * control of gmux. Since the integrated GPU is missing the main link, + * external displays appear to it as phantoms which fail to link-train. + * + * gmux receives the HPD signal of all display connectors and sends an + * interrupt on hotplug. On generations which cannot switch external ports, + * the discrete GPU can then be woken to drive the newly connected display. + * The ability to switch AUX on these generations could be used to improve + * reliability of hotplug detection by having the integrated GPU poll the + * ports while the discrete GPU is asleep, but currently we do not make use + * of this feature. + * + * gmux' initial switch state on bootup is user configurable via the EFI + * variable `gpu-power-prefs-fa4ce28d-b62f-4c99-9cc3-6815686e30f9` (5th byte, + * 1 = IGD, 0 = DIS). Based on this setting, the EFI firmware tells gmux to + * switch the panel and the external DP connector and allocates a framebuffer + * for the selected GPU. + */ + static int gmux_switchto(enum vga_switcheroo_client_id id) { if (id == VGA_SWITCHEROO_IGD) { @@ -288,6 +383,14 @@ static int gmux_switchto(enum vga_switcheroo_client_id id) return 0; }
+/** + * DOC: Power control + * + * gmux is able to cut power to the discrete GPU. It automatically takes care + * of the correct sequence to tear down and bring up the power rails for + * core voltage, VRAM and PCIe. + */ + static int gmux_set_discrete_state(struct apple_gmux_data *gmux_data, enum vga_switcheroo_state state) { @@ -352,6 +455,16 @@ static const struct vga_switcheroo_handler gmux_handler = { .get_client_id = gmux_get_client_id, };
+/** + * DOC: Interrupt + * + * gmux is also connected to a GPIO pin of the southbridge and thereby is able + * to trigger an ACPI GPE. On the MBP5 2008/09 it's GPIO pin 22 of the Nvidia + * MCP79, on all following generations it's GPIO pin 6 of the Intel PCH. + * The GPE merely signals that an interrupt occurred, the actual type of event + * is identified by reading a gmux register. + */ + static inline void gmux_disable_interrupts(struct apple_gmux_data *gmux_data) { gmux_write8(gmux_data, GMUX_PORT_INTERRUPT_ENABLE,
On Mon, Jan 11, 2016 at 12:08:35AM +0100, Lukas Wunner wrote:
On Fri, Jan 08, 2016 at 09:49:22AM -0700, Jonathan Corbet wrote:
Well, it's built around the asciidoc patch, which isn't in the mainline at this point. Should things go a different direction, that could force some changes here;
If/when that happens, I'll be happy to fixup the documentation as needed. In fact I originally wrote this in markdown in November, then converted it to asciidoc in December and that really wasn't a big deal.
The need for asciidoc arises from the desire to not clutter up the prose text with URLs. To achieve this, asciidoc allows defining so-called "attribute entries" which may then be referenced in the text: http://asciidoc.org/userguide.html#X62
Markdown has a similar feature called "reference style links", the difference being that they can be defined anywhere in the document, whereas asciidoc's "attribute entries" must precede their usage in the text: https://daringfireball.net/projects/markdown/syntax#link
Here's a v2, the only change is Bruno Pr?mont's addition to the commit message.
@Daniel Vetter: Could you pick this up for topic/drm-misc please?
I think it makes more sense to pull this in through Darren's tree, and I acked that on the last round already. -Daniel
An ack for drivers/platform/x86 was kindly provided by Darren Hart with: Message-ID: 20160104203150.GA4219@malice.jf.intel.com Link: http://lists.freedesktop.org/archives/dri-devel/2016-January/097918.html
Thanks everyone!
Lukas Wunner (1): apple-gmux: Add initial documentation
Documentation/DocBook/gpu.tmpl | 22 ++++++++ drivers/platform/x86/apple-gmux.c | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+)
-- 1.8.5.2 (Apple Git-48)
Hi Daniel,
On Mon, Jan 11, 2016 at 08:03:18AM +0100, Daniel Vetter wrote:
On Mon, Jan 11, 2016 at 12:08:35AM +0100, Lukas Wunner wrote:
Here's a v2, the only change is Bruno Pr?mont's addition to the commit message.
@Daniel Vetter: Could you pick this up for topic/drm-misc please?
I think it makes more sense to pull this in through Darren's tree, and I acked that on the last round already.
As I've written in the cover letter of v1, this will provoke merge conflicts going forward since I'll post a new version of my GPU switching patches for the MacBook Pro this week which also touch apple-gmux and are based on this docs patch.
I guess alternatively the patches touching vga_switcheroo and the DRM drivers could go in via pdx86, I'll cross-post to both lists to keep this option open, though I expect this might also lead to merge conflicts if relevant portions of the DRM drivers are changed in drm-next for 4.6.
I still believe merging this via drm-next or drm-intel/topic/drm-misc would be the option least prone to merge conflicts.
Thanks,
Lukas
On Mon, Jan 11, 2016 at 02:07:15PM +0100, Lukas Wunner wrote:
Hi Daniel,
On Mon, Jan 11, 2016 at 08:03:18AM +0100, Daniel Vetter wrote:
On Mon, Jan 11, 2016 at 12:08:35AM +0100, Lukas Wunner wrote:
Here's a v2, the only change is Bruno Pr?mont's addition to the commit message.
@Daniel Vetter: Could you pick this up for topic/drm-misc please?
I think it makes more sense to pull this in through Darren's tree, and I acked that on the last round already.
As I've written in the cover letter of v1, this will provoke merge conflicts going forward since I'll post a new version of my GPU switching patches for the MacBook Pro this week which also touch apple-gmux and are based on this docs patch.
I guess alternatively the patches touching vga_switcheroo and the DRM drivers could go in via pdx86, I'll cross-post to both lists to keep this option open, though I expect this might also lead to merge conflicts if relevant portions of the DRM drivers are changed in drm-next for 4.6.
I still believe merging this via drm-next or drm-intel/topic/drm-misc would be the option least prone to merge conflicts.
Ah sorry, forgot about that again. Indeed that makes sense if other stuff is pending, so applied to drm-misc for 4.6.
Cheers, Daniel
On Mon, Jan 11, 2016 at 08:03:18AM +0100, Daniel Vetter wrote:
On Mon, Jan 11, 2016 at 12:08:35AM +0100, Lukas Wunner wrote:
On Fri, Jan 08, 2016 at 09:49:22AM -0700, Jonathan Corbet wrote:
Well, it's built around the asciidoc patch, which isn't in the mainline at this point. Should things go a different direction, that could force some changes here;
If/when that happens, I'll be happy to fixup the documentation as needed. In fact I originally wrote this in markdown in November, then converted it to asciidoc in December and that really wasn't a big deal.
The need for asciidoc arises from the desire to not clutter up the prose text with URLs. To achieve this, asciidoc allows defining so-called "attribute entries" which may then be referenced in the text: http://asciidoc.org/userguide.html#X62
Markdown has a similar feature called "reference style links", the difference being that they can be defined anywhere in the document, whereas asciidoc's "attribute entries" must precede their usage in the text: https://daringfireball.net/projects/markdown/syntax#link
Here's a v2, the only change is Bruno Pr?mont's addition to the commit message.
@Daniel Vetter: Could you pick this up for topic/drm-misc please?
I think it makes more sense to pull this in through Darren's tree, and I acked that on the last round already.
OK, I'm happy to take it. Lukas, this doesn't apply cleanly to my 4.4-rc* based for-next branch or Linus's 4.4 from yesterday. I can manually apply it:
$ patch -p1 < ~/incoming/PATCH_v2_1-1_apple-gmux_Add_initial_documentation.mbox patching file Documentation/DocBook/gpu.tmpl Hunk #1 succeeded at 4279 with fuzz 1 (offset 809 lines). patching file drivers/platform/x86/apple-gmux.c
But that is one hell of an offset. What are you developing against and can you send me something that applies cleanly?
Hi Darren,
On Mon, Jan 11, 2016 at 09:45:25AM -0800, Darren Hart wrote:
On Mon, Jan 11, 2016 at 08:03:18AM +0100, Daniel Vetter wrote:
On Mon, Jan 11, 2016 at 12:08:35AM +0100, Lukas Wunner wrote:
On Fri, Jan 08, 2016 at 09:49:22AM -0700, Jonathan Corbet wrote:
Well, it's built around the asciidoc patch, which isn't in the mainline at this point. Should things go a different direction, that could force some changes here;
If/when that happens, I'll be happy to fixup the documentation as needed. In fact I originally wrote this in markdown in November, then converted it to asciidoc in December and that really wasn't a big deal.
The need for asciidoc arises from the desire to not clutter up the prose text with URLs. To achieve this, asciidoc allows defining so-called "attribute entries" which may then be referenced in the text: http://asciidoc.org/userguide.html#X62
Markdown has a similar feature called "reference style links", the difference being that they can be defined anywhere in the document, whereas asciidoc's "attribute entries" must precede their usage in the text: https://daringfireball.net/projects/markdown/syntax#link
Here's a v2, the only change is Bruno Pr?mont's addition to the commit message.
@Daniel Vetter: Could you pick this up for topic/drm-misc please?
I think it makes more sense to pull this in through Darren's tree, and I acked that on the last round already.
OK, I'm happy to take it. Lukas, this doesn't apply cleanly to my 4.4-rc* based for-next branch or Linus's 4.4 from yesterday. I can manually apply it:
$ patch -p1 < ~/incoming/PATCH_v2_1-1_apple-gmux_Add_initial_documentation.mbox patching file Documentation/DocBook/gpu.tmpl Hunk #1 succeeded at 4279 with fuzz 1 (offset 809 lines). patching file drivers/platform/x86/apple-gmux.c
But that is one hell of an offset. What are you developing against and can you send me something that applies cleanly?
I'm developing against drm-next and/or drm-intel-nightly. Looks like gpu.tmpl is touched very frequently. :-)
As for the apple-gmux documentation, Daniel picked it up this afternoon: http://cgit.freedesktop.org/drm-intel/commit/?h=topic/drm-misc&id=3d7b75...
So, everything's fine. Thanks a lot though for being such a responsive and speedy maintainer, much appreciated!
Best regards,
Lukas
On Mon, Jan 11, 2016 at 08:19:54PM +0100, Lukas Wunner wrote:
Hi Darren,
On Mon, Jan 11, 2016 at 09:45:25AM -0800, Darren Hart wrote:
On Mon, Jan 11, 2016 at 08:03:18AM +0100, Daniel Vetter wrote:
On Mon, Jan 11, 2016 at 12:08:35AM +0100, Lukas Wunner wrote:
On Fri, Jan 08, 2016 at 09:49:22AM -0700, Jonathan Corbet wrote:
Well, it's built around the asciidoc patch, which isn't in the mainline at this point. Should things go a different direction, that could force some changes here;
If/when that happens, I'll be happy to fixup the documentation as needed. In fact I originally wrote this in markdown in November, then converted it to asciidoc in December and that really wasn't a big deal.
The need for asciidoc arises from the desire to not clutter up the prose text with URLs. To achieve this, asciidoc allows defining so-called "attribute entries" which may then be referenced in the text: http://asciidoc.org/userguide.html#X62
Markdown has a similar feature called "reference style links", the difference being that they can be defined anywhere in the document, whereas asciidoc's "attribute entries" must precede their usage in the text: https://daringfireball.net/projects/markdown/syntax#link
Here's a v2, the only change is Bruno Pr?mont's addition to the commit message.
@Daniel Vetter: Could you pick this up for topic/drm-misc please?
I think it makes more sense to pull this in through Darren's tree, and I acked that on the last round already.
OK, I'm happy to take it. Lukas, this doesn't apply cleanly to my 4.4-rc* based for-next branch or Linus's 4.4 from yesterday. I can manually apply it:
$ patch -p1 < ~/incoming/PATCH_v2_1-1_apple-gmux_Add_initial_documentation.mbox patching file Documentation/DocBook/gpu.tmpl Hunk #1 succeeded at 4279 with fuzz 1 (offset 809 lines). patching file drivers/platform/x86/apple-gmux.c
But that is one hell of an offset. What are you developing against and can you send me something that applies cleanly?
I'm developing against drm-next and/or drm-intel-nightly. Looks like gpu.tmpl is touched very frequently. :-)
As for the apple-gmux documentation, Daniel picked it up this afternoon: http://cgit.freedesktop.org/drm-intel/commit/?h=topic/drm-misc&id=3d7b75...
So, everything's fine. Thanks a lot though for being such a responsive and speedy maintainer, much appreciated!
Hah, and here I am beating myself up over letting things stagnate. Thanks :-)
dri-devel@lists.freedesktop.org