[PATCH v5 00/10] MediaTek DisplayPort: support eDP and aux-bus

AngeloGioacchino Del Regno angelogioacchino.delregno at collabora.com
Thu Jul 13 02:57:52 PDT 2023


Il 13/07/23 11:54, Chen-Yu Tsai ha scritto:
> On Thu, Jul 13, 2023 at 5:01 PM AngeloGioacchino Del Regno
> <angelogioacchino.delregno at collabora.com> wrote:
>>
>> Changes in v5:
>>   - Added .wait_hpd_asserted() callback for aux-bus
>>   - Avoid enabling and registering HPD interrupt + handlers for
>>     eDP case only (keeps HPD interrupts enabled for full DP case)
>>   - Support not always-on eDP panels (boot with regulator off,
>>     suspend with regulator off) for power saving in PM suspend.
> 
> This still doesn't work when the DRM driver is builtin, and the panel
> driver is a module. This is still with regulator-always-on.
> 
>  From what I can tell from the kernel logs, the DRM driver is not waiting
> for eDP panel to probe (which sort of makes sense?), and simply uses
> the default EDID. When the panel does probe, nothing triggers the DRM
> driver to update its connector.
> 
> [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:eDP-1]
> [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:eDP-1]
> status updated from unknown to connected
> [drm:drm_mode_debug_printmodeline] Modeline "640x480": 60 25175 640
> 656 752 800 480 490 492 525 0x40 0xa
> [drm:drm_mode_prune_invalid] Not using 640x480 mode: CLOCK_HIGH
> [drm:drm_mode_debug_printmodeline] Modeline "800x600": 56 36000 800
> 824 896 1024 600 601 603 625 0x40 0x5
> [drm:drm_mode_prune_invalid] Not using 800x600 mode: CLOCK_HIGH
> [drm:drm_mode_debug_printmodeline] Modeline "800x600": 60 40000 800
> 840 968 1056 600 601 605 628 0x40 0x5
> [drm:drm_mode_prune_invalid] Not using 800x600 mode: CLOCK_HIGH
> [drm:drm_mode_debug_printmodeline] Modeline "848x480": 60 33750 848
> 864 976 1088 480 486 494 517 0x40 0x5
> [drm:drm_mode_prune_invalid] Not using 848x480 mode: CLOCK_HIGH
> [drm:drm_mode_debug_printmodeline] Modeline "1024x768": 60 65000 1024
> 1048 1184 1344 768 771 777 806 0x40 0xa
> [drm:drm_mode_prune_invalid] Not using 1024x768 mode: CLOCK_HIGH
> [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:34:DP-1]
> [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:34:DP-1]
> status updated from unknown to disconnected
> [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:34:DP-1] disconnected
> [drm:drm_client_modeset_probe] No connectors reported connected with modes
> [drm:drm_client_modeset_probe] connector 32 enabled? yes
> [drm:drm_client_modeset_probe] connector 34 enabled? no
> [drm:drm_client_firmware_config.constprop.0.isra.0] Not using firmware
> configuration
> [drm:drm_client_modeset_probe] looking for cmdline mode on connector 32
> [drm:drm_client_modeset_probe] looking for preferred mode on connector 32 0
> [drm:drm_client_modeset_probe] found mode none
> [drm:drm_client_modeset_probe] picking CRTCs for 4096x4096 config
> mediatek-drm mediatek-drm.12.auto:
> [drm:__drm_fb_helper_initial_config_and_unlock] test CRTC 0 primary
> plane
> mediatek-drm mediatek-drm.12.auto: [drm] Cannot find any crtc or sizes
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_dpcd_probe] aux_mtk_dp:
> 0x00000 AUX -> (ret=  1) 14
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_dpcd_read] aux_mtk_dp:
> 0x00000 AUX -> (ret= 15) 14 0a 84 41 00 00 01 80 02 00 00 00 0f 09 80
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_dpcd_probe] aux_mtk_dp:
> 0x00000 AUX -> (ret=  1) 14
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_dpcd_read] aux_mtk_dp:
> 0x02200 AUX -> (ret= 15) 14 0a 84 41 00 00 01 80 02 00 00 00 0f 01 80
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_read_dpcd_caps]
> aux_mtk_dp: Base DPCD: 14 0a 84 41 00 00 01 80 02 00 00 00 0f 09 80
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_read_dpcd_caps]
> aux_mtk_dp: DPCD: 14 0a 84 41 00 00 01 80 02 00 00 00 0f 01 80
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_dpcd_probe] aux_mtk_dp:
> 0x00000 AUX -> (ret=  1) 14
> mediatek-drm mediatek-drm.12.auto: [drm:drm_dp_dpcd_read] aux_mtk_dp:
> 0x00021 AUX -> (ret=  1) 00
> panel-simple-dp-aux aux-1c500000.edp-tx: Detected BOE NE135FBM-N41 v8.1 (0x095f)
> 
> If the panel is also built-in, then the eDP panel probe happens between
> the drm driver adding components and binding to them, and everything seems
> to work OK.
> 

Argh. I actually forgot to test that case. Sorry about that.

Anyway, you don't need regulator-always-on anymore, nor regulator-boot-on...
...I'll recheck with panel-edp as module and fix.

Cheers,
Angelo

> 
> ChenYu
> 
>> Changes in v4:
>>   - Set data lanes to idle to prevent stalls if bootloader didn't
>>     properly close the eDP port
>>   - Now using the .done_probing() callback for AUX bus to prevent
>>     probe deferral loops in case the panel-edp driver is a module
>>     as previously seen with another bridge driver (ANX7625) on
>>     some other SoCs (MT8192 and others)
>>   - Rebased over next-20230706
>>   - Dropped Chen-Yu's T-b tag on last patch as some logic changed
>>     (before, I wasn't using the .done_probing() callback).
>>
>> Changes in v3:
>>   - Added DPTX AUX block initialization before trying to communicate
>>     to stop relying on the bootloader keeping it initialized before
>>     booting Linux.
>>   - Fixed commit description for patch [09/09] and removed commented
>>     out code (that slipped from dev phase.. sorry!).
>>
>> This series adds "real" support for eDP in the mtk-dp DisplayPort driver.
>>
>> Explaining the "real":
>> Before this change, the DisplayPort driver did support eDP to some
>> extent, but it was treating it entirely like a regular DP interface
>> which is partially fine, after all, embedded DisplayPort *is* actually
>> DisplayPort, but there might be some differences to account for... and
>> this is for both small performance improvements and, more importantly,
>> for correct functionality in some systems.
>>
>> Functionality first:
>>
>> One of the common differences found in various boards implementing eDP
>> and machines using an eDP panel is that many times the HPD line is not
>> connected. This *must* be accounted for: at startup, this specific IP
>> will raise a HPD interrupt (which should maybe be ignored... as it does
>> not appear to be a "real" event...) that will make the eDP panel to be
>> detected and to actually work but, after a suspend-resume cycle, there
>> will be no HPD interrupt (as there's no HPD line in my case!) producing
>> a functionality issue - specifically, the DP Link Training fails because
>> the panel doesn't get powered up, then it stays black and won't work
>> until rebooting the machine (or removing and reinserting the module I
>> think, but I haven't tried that).
>>
>> Now for.. both:
>> eDP panels are *e*DP because they are *not* removable (in the sense that
>> you can't unplug the cable without disassembling the machine, in which
>> case, the machine shall be powered down..!): this (correct) assumption
>> makes us able to solve some issues and to also gain a little performance
>> during PM operations.
>>
>> What was done here is:
>>   - Caching the EDID if the panel is eDP: we're always going to read the
>>     same data everytime, so we can just cache that (as it's small enough)
>>     shortening PM resume times for the eDP driver instance;
>>   - Always return connector_status_connected if it's eDP: non-removable
>>     means connector_status_disconnected can't happen during runtime...
>>     this also saves us some time and even power, as we won't have to
>>     perform yet another power cycle of the HW;
>>   - Added aux-bus support!
>>     This makes us able to rely on panel autodetection from the EDID,
>>     avoiding to add more and more panel timings to panel-edp and, even
>>     better, allowing to use one panel node in devicetrees for multiple
>>     variants of the same machine since, at that point, it's not important
>>     to "preventively know" what panel we have (eh, it's autodetected...!).
>>
>> This was tested on a MT8195 Cherry Tomato Chromebook (panel-edp on aux-bus)
>>
>>
>> P.S.: For your own testing commodity, here's a reference devicetree:
>>
>> pp3300_disp_x: regulator-pp3300-disp-x {
>>          compatible = "regulator-fixed";
>>          regulator-name = "pp3300_disp_x";
>>          regulator-min-microvolt = <3300000>;
>>          regulator-max-microvolt = <3300000>;
>>          enable-active-high;
>>          gpio = <&pio 55 GPIO_ACTIVE_HIGH>;
>>          pinctrl-names = "default";
>>          pinctrl-0 = <&panel_fixed_pins>;
>> };
>>
>> &edp_tx {
>>          status = "okay";
>>
>>          pinctrl-names = "default";
>>          pinctrl-0 = <&edptx_pins_default>;
>>
>>          ports {
>>                  #address-cells = <1>;
>>                  #size-cells = <0>;
>>
>>                  port at 0 {
>>                          reg = <0>;
>>                          edp_in: endpoint {
>>                                  remote-endpoint = <&dp_intf0_out>;
>>                          };
>>                  };
>>
>>                  port at 1 {
>>                          reg = <1>;
>>                          edp_out: endpoint {
>>                                  data-lanes = <0 1 2 3>;
>>                                  remote-endpoint = <&panel_in>;
>>                          };
>>                  };
>>          };
>>
>>          aux-bus {
>>                  panel: panel {
>>                          compatible = "edp-panel";
>>                          power-supply = <&pp3300_disp_x>;
>>                          backlight = <&backlight_lcd0>;
>>                          port {
>>                                  panel_in: endpoint {
>>                                          remote-endpoint = <&edp_out>;
>>                                  };
>>                          };
>>                  };
>>          };
>> };
>>
>> AngeloGioacchino Del Regno (10):
>>    drm/mediatek: dp: Move AUX and panel poweron/off sequence to function
>>    drm/mediatek: dp: Change logging to dev for mtk_dp_aux_transfer()
>>    drm/mediatek: dp: Use devm variant of drm_bridge_add()
>>    drm/mediatek: dp: Move AUX_P0 setting to
>>      mtk_dp_initialize_aux_settings()
>>    drm/mediatek: dp: Enable event interrupt only when bridge attached
>>    drm/mediatek: dp: Avoid mutex locks if audio is not supported/enabled
>>    drm/mediatek: dp: Move PHY registration to new function
>>    drm/mediatek: dp: Add support for embedded DisplayPort aux-bus
>>    drm/mediatek: dp: Add .wait_hpd_asserted() for AUX bus
>>    drm/mediatek: dp: Don't register HPD interrupt handler for eDP case
>>
>>   drivers/gpu/drm/mediatek/Kconfig  |   1 +
>>   drivers/gpu/drm/mediatek/mtk_dp.c | 335 ++++++++++++++++++++----------
>>   2 files changed, 224 insertions(+), 112 deletions(-)
>>
>> --
>> 2.40.1
>>
> 




More information about the linux-arm-kernel mailing list