mbox series

[v4,00/78] drm/vc4: Support BCM2711 Display Pipeline

Message ID cover.7a1aa1784976093af26cb31fd283cf5b3ed568bb.1594230107.git-series.maxime@cerno.tech (mailing list archive)
Headers show
Series drm/vc4: Support BCM2711 Display Pipeline | expand

Message

Maxime Ripard July 8, 2020, 5:41 p.m. UTC
Hi everyone,

Here's a (pretty long) series to introduce support in the VC4 DRM driver
for the display pipeline found in the BCM2711 (and thus the RaspberryPi 4).

The main differences are that there's two HDMI controllers and that there's
more pixelvalve now. Those pixelvalve come with a mux in the HVS that still
have only 3 FIFOs. Both of those differences are breaking a bunch of
expectations in the driver, so we first need a good bunch of cleanup and
reworks to introduce support for the new controllers.

Similarly, the HDMI controller has all its registers shuffled and split in
multiple controllers now, so we need a bunch of changes to support this as
well.

Only the HDMI support is enabled for now (even though the DPI and DSI
outputs have been tested too).

Let me know if you have any comments
Maxime

Cc: bcm-kernel-feedback-list@broadcom.com
Cc: devicetree@vger.kernel.org
Cc: Kamal Dasu <kdasu.kdev@gmail.com>
Cc: linux-clk@vger.kernel.org
Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Philipp Zabel <p.zabel@pengutronix.de>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Stephen Boyd <sboyd@kernel.org>

Changes from v3:
  - Rebased on top of next-20200708
  - Added a name to the HDMI audio codec component
  - Only disable the BCM2711 HDMI pixelvalves at boot
  - Fixed an error in the HVS binding
  - Fix a framebuffer size condition that was inverted
  - Changed the channel allocation algorithm using Eric's suggestion
  - Always write the muxing values instead of updating if needed
  - Improved a bit the hvs_available_channels comment in the structure
  - Change atomic_complete_commit code to use for_each_new_crtc_in_state
  - Change the muxing code to take into account disparities between the
    BCM2711 and previous SoCs.
  - Only change the clock rate on BCM2711 during a modeset
  - Fix a crash at atomic_disable
  - Use clk_set_min_rate for the core clock too
  - Add a few defines, and simplify the FIFO level stuff
  - Reordered the patches according to Eric's reviews
  - Fixed a regression with VID_CTL setting on RPI3

Changes from v2:
  - Rebased on top of next-20200526
  - Split the firmware clock series away
  - Removed the stuck pixel (with all the subsequent pixels being shifted
    by one
  - Fixed the writeback issue too.
  - Fix the dual output
  - Fixed the return value of phy_get_cp_current
  - Enhanced the comment on the reset delay
  - Increase the max width and height
  - Made a proper Kconfig option for the DVP clock driver
  - Fixed the alsa card name collision

Changes from v1:
  - Rebased on top of 5.7-rc1
  - Run checkpatch
  - Added audio support
  - Fixed some HDMI timeouts
  - Swiched to clk_hw_register_gate_parent_data
  - Reorder Kconfig symbols in drivers/i2c/busses
  - Make the firmware clocks a child of the firmware node
  - Switch DVP clock driver to clk_hw interface
  - constify raspberrypi_clk_data in raspberrypi_clock_property
  - Don't mark firmware clocks as IGNORE_UNUSED
  - Change from reset_ms to reset_us in reset-simple, and add a bit more
    comments
  - Remove generic clk patch to test if a NULL pointer is returned
  - Removed misleading message in the is_prepared renaming patch commit
    message
  - Constify HDMI controller variants
  - Fix a bug in the allocation size of the clk data array
  - Added a mention in the DT binding conversion patches about the breakage
  - Merged a few fixes from kbuild
  - Fixed a few bisection and CEC build issues
  - Collected Acked-by and Reviewed-by
  - Change Dave email address to raspberrypi.com

Dave Stevenson (7):
  drm/vc4: Add support for the BCM2711 HVS5
  drm/vc4: plane: Change LBM alignment constraint on LBM
  drm/vc4: plane: Optimize the LBM allocation size
  drm/vc4: hdmi: Use reg-names to retrieve the HDMI audio registers
  drm/vc4: hdmi: Reset audio infoframe on encoder_enable if previously streaming
  drm/vc4: hdmi: Set the b-frame marker to the match ALSA's default.
  drm/vc4: hdmi: Add audio-related callbacks

Maxime Ripard (71):
  dt-bindings: display: Add support for the BCM2711 HVS
  drm/vc4: hvs: Boost the core clock during modeset
  drm/vc4: plane: Create more planes
  drm/vc4: crtc: Deal with different number of pixel per clock
  drm/vc4: crtc: Use a shared interrupt
  drm/vc4: crtc: Move the cob allocation outside of bind
  drm/vc4: crtc: Rename HVS channel to output
  drm/vc4: crtc: Use local chan variable
  drm/vc4: crtc: Enable and disable the PV in atomic_enable / disable
  drm/vc4: kms: Convert to for_each_new_crtc_state
  drm/vc4: crtc: Assign output to channel automatically
  drm/vc4: crtc: Add FIFO depth to vc4_crtc_data
  drm/vc4: crtc: Add function to compute FIFO level bits
  drm/vc4: crtc: Rename HDMI encoder type to HDMI0
  drm/vc4: crtc: Add HDMI1 encoder type
  drm/vc4: crtc: Disable color management for HVS5
  drm/vc4: crtc: Turn pixelvalve reset into a function
  drm/vc4: crtc: Move PV dump to config_pv
  drm/vc4: crtc: Move HVS init and close to a function
  drm/vc4: crtc: Move the HVS gamma LUT setup to our init function
  drm/vc4: hvs: Make sure our channel is reset
  drm/vc4: crtc: Remove mode_set_nofb
  drm/vc4: crtc: Remove redundant pixelvalve reset
  drm/vc4: crtc: Move HVS channel init before the PV initialisation
  drm/vc4: encoder: Add finer-grained encoder callbacks
  drm/vc4: crtc: Add a delay after disabling the PixelValve output
  drm/vc4: crtc: Clear the PixelValve FIFO on disable
  drm/vc4: crtc: Clear the PixelValve FIFO during configuration
  drm/vc4: hvs: Make the stop_channel function public
  drm/vc4: hvs: Introduce a function to get the assigned FIFO
  drm/vc4: crtc: Move the CRTC disable out
  drm/vc4: drv: Disable the CRTC at boot time
  dt-bindings: display: vc4: pv: Add BCM2711 pixel valves
  drm/vc4: crtc: Add BCM2711 pixelvalves
  drm/vc4: hdmi: Use debugfs private field
  drm/vc4: hdmi: Move structure to header
  drm/vc4: hdmi: rework connectors and encoders
  drm/vc4: hdmi: Remove DDC argument to connector_init
  drm/vc4: hdmi: Rename hdmi to vc4_hdmi
  drm/vc4: hdmi: Move accessors to vc4_hdmi
  drm/vc4: hdmi: Use local vc4_hdmi directly
  drm/vc4: hdmi: Add container_of macros for encoders and connectors
  drm/vc4: hdmi: Pass vc4_hdmi to CEC code
  drm/vc4: hdmi: Retrieve the vc4_hdmi at unbind using our device
  drm/vc4: hdmi: Remove vc4_dev hdmi pointer
  drm/vc4: hdmi: Remove vc4_hdmi_connector
  drm/vc4: hdmi: Introduce resource init and variant
  drm/vc4: hdmi: Implement a register layout abstraction
  drm/vc4: hdmi: Add reset callback
  drm/vc4: hdmi: Add PHY init and disable function
  drm/vc4: hdmi: Add PHY RNG enable / disable function
  drm/vc4: hdmi: Add a CSC setup callback
  drm/vc4: hdmi: Store the encoder type in the variant structure
  drm/vc4: hdmi: Deal with multiple debugfs files
  drm/vc4: hdmi: Move CEC init to its own function
  drm/vc4: hdmi: Add CEC support flag
  drm/vc4: hdmi: Remove unused CEC_CLOCK_DIV define
  drm/vc4: hdmi: Rename drm_encoder pointer in mode_valid
  drm/vc4: hdmi: Adjust HSM clock rate depending on pixel rate
  drm/vc4: hdmi: Use clk_set_min_rate instead
  drm/vc4: hdmi: Deal with multiple ALSA cards
  drm/vc4: hdmi: Remove register dumps in enable
  drm/vc4: hdmi: Always recenter the HDMI FIFO
  drm/vc4: hdmi: Implement finer-grained hooks
  drm/vc4: hdmi: Do the VID_CTL configuration at once
  drm/vc4: hdmi: Switch to blank pixels when disabled
  drm/vc4: hdmi: Support the BCM2711 HDMI controllers
  dt-bindings: display: vc4: hdmi: Add BCM2711 HDMI controllers bindings
  dt-bindings: display: vc4: Document BCM2711 VC5
  drm/vc4: drv: Support BCM2711
  ARM: dts: bcm2711: Enable the display pipeline

 Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml        |  109 +++++-
 Documentation/devicetree/bindings/display/brcm,bcm2835-hvs.yaml         |   18 +-
 Documentation/devicetree/bindings/display/brcm,bcm2835-pixelvalve0.yaml |    5 +-
 Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml         |    1 +-
 arch/arm/boot/dts/bcm2711-rpi-4-b.dts                                   |   46 ++-
 arch/arm/boot/dts/bcm2711.dtsi                                          |  115 ++++-
 drivers/gpu/drm/vc4/Makefile                                            |    1 +-
 drivers/gpu/drm/vc4/vc4_crtc.c                                          |  338 +++++++++++----
 drivers/gpu/drm/vc4/vc4_drv.c                                           |    5 +-
 drivers/gpu/drm/vc4/vc4_drv.h                                           |   43 +-
 drivers/gpu/drm/vc4/vc4_hdmi.c                                          | 1625 +++++++++++++++++++++++++++++++++++++++++++-----------------------------
 drivers/gpu/drm/vc4/vc4_hdmi.h                                          |  183 ++++++++-
 drivers/gpu/drm/vc4/vc4_hdmi_phy.c                                      |  520 +++++++++++++++++++++++-
 drivers/gpu/drm/vc4/vc4_hdmi_regs.h                                     |  442 ++++++++++++++++++++-
 drivers/gpu/drm/vc4/vc4_hvs.c                                           |  260 +++++++-----
 drivers/gpu/drm/vc4/vc4_kms.c                                           |  225 +++++++++-
 drivers/gpu/drm/vc4/vc4_plane.c                                         |  222 +++++++---
 drivers/gpu/drm/vc4/vc4_regs.h                                          |  177 +++-----
 drivers/gpu/drm/vc4/vc4_txp.c                                           |    4 +-
 19 files changed, 3331 insertions(+), 1008 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml
 create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi.h
 create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi_phy.c
 create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi_regs.h

base-commit: 5bdd2824d705fb8d339d6f96e464b907c9a1553d

Comments

Jian-Hong Pan July 10, 2020, 7:37 a.m. UTC | #1
Hi Maxime,

Thanks for your version 4 patch again.
I took the patches and applied them upon next-20200708.

I make system cold reboot to multi-user target and the text console shows on the
screen. Then, I simply hot re-plug the HDMI cable on HDMI0 port, I not only lose
the text console on the screen (the display shows blank, backlight is off), but
also kernel does not probe modes for the HDMI connector again.

But HDMI1 does probe modes again for hot re-plugging. So, HDMI1 does not hit the
issue like HDMI0.

* System probes modes only once for HDMI0 port (HDMI-A-1), even hot re-plug HDMI
  cable to the same port:

[   15.611072] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:HDMI-A-1] probed modes :
[   15.611079] [drm:drm_mode_debug_printmodeline] Modeline "1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x48 0x5
[   15.611085] [drm:drm_mode_debug_printmodeline] Modeline "1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x40 0x5
...
[   15.611298] [drm:drm_mode_debug_printmodeline] Modeline "720x400": 70 28320 720 738 846 900 400 412 414 449 0x40 0x6
[   15.611303] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:38:HDMI-A-2]
[   15.612184] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:38:HDMI-A-2] disconnected
[   15.612191] [drm:drm_client_modeset_probe] connector 32 enabled? yes
[   15.612194] [drm:drm_client_modeset_probe] connector 38 enabled? no
[   15.612206] [drm:drm_client_modeset_probe] Not using firmware configuration
[   15.612213] [drm:drm_client_modeset_probe] looking for cmdline mode on connector 32
[   15.612218] [drm:drm_client_modeset_probe] looking for preferred mode on connector 32 0
[   15.612221] [drm:drm_client_modeset_probe] found mode 1920x1080
...
[  108.263384] [drm:output_poll_execute] [CONNECTOR:32:HDMI-A-1] status updated from disconnected to connected
[  108.264307] vc4-drm gpu: [drm:drm_fb_helper_hotplug_event.part.0] 
[  108.264312] [drm:drm_client_modeset_probe] 
[  108.264321] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:HDMI-A-1]
[  109.303379] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:38:HDMI-A-2]
[  109.304258] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:38:HDMI-A-2] disconnected
[  109.304266] [drm:drm_client_modeset_probe] No connectors reported connected with modes

* System probes modes again for HDMI1 port (HDMI-A-2), whenever hot re-plug the
  HDMI cable:

[  797.974649] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:38:HDMI-A-2] probed modes :
[  797.974656] [drm:drm_mode_debug_printmodeline] Modeline "1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x48 0x5
[  797.974662] [drm:drm_mode_debug_printmodeline] Modeline "1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x40 0x5
...
[  797.974874] [drm:drm_mode_debug_printmodeline] Modeline "720x400": 70 28320 720 738 846 900 400 412 414 449 0x40 0x6
[  797.974880] [drm:drm_client_modeset_probe] connector 32 enabled? no
[  797.974883] [drm:drm_client_modeset_probe] connector 38 enabled? yes
[  797.974895] [drm:drm_client_modeset_probe] Not using firmware configuration
[  797.974901] [drm:drm_client_modeset_probe] looking for cmdline mode on connector 38
[  797.974905] [drm:drm_client_modeset_probe] looking for preferred mode on connector 38 0
[  797.974908] [drm:drm_client_modeset_probe] found mode 1920x1080
...
[  852.242615] vc4-drm gpu: [drm:drm_client_dev_hotplug] fbdev: ret=0
[  873.718277] [drm:output_poll_execute] [CONNECTOR:38:HDMI-A-2] status updated from disconnected to connected
[  873.718332] vc4-drm gpu: [drm:drm_fb_helper_hotplug_event.part.0] 
[  873.718338] [drm:drm_client_modeset_probe]
...
[  874.264013] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:38:HDMI-A-2] probed modes :
[  874.264020] [drm:drm_mode_debug_printmodeline] Modeline "1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x48 0x5
[  874.264026] [drm:drm_mode_debug_printmodeline] Modeline "1920x1080": 60 148500 1920 2008 2052 2200 1080 1084 1089 1125 0x40 0x5
...
[  874.264239] [drm:drm_mode_debug_printmodeline] Modeline "720x400": 70 28320 720 738 846 900 400 412 414 449 0x40 0x6
[  874.264244] [drm:drm_client_modeset_probe] connector 32 enabled? no
[  874.264247] [drm:drm_client_modeset_probe] connector 38 enabled? yes
[  874.264259] [drm:drm_client_modeset_probe] Not using firmware configuration
[  874.264264] [drm:drm_client_modeset_probe] looking for cmdline mode on connector 38
[  874.264268] [drm:drm_client_modeset_probe] looking for preferred mode on connector 38 0
[  874.264272] [drm:drm_client_modeset_probe] found mode 1920x1080

Here is the full dmesg: https://gist.github.com/starnight/5ffb86af552fedb9b6e5741d0540a878#file-dmesg-v4-log
Stefan Wahren July 10, 2020, 9:58 a.m. UTC | #2
Hi Maxime,

Am 08.07.20 um 19:41 schrieb Maxime Ripard:
> Hi everyone,
>
> Here's a (pretty long) series to introduce support in the VC4 DRM driver
> for the display pipeline found in the BCM2711 (and thus the RaspberryPi 4).
>
> The main differences are that there's two HDMI controllers and that there's
> more pixelvalve now. Those pixelvalve come with a mux in the HVS that still
> have only 3 FIFOs. Both of those differences are breaking a bunch of
> expectations in the driver, so we first need a good bunch of cleanup and
> reworks to introduce support for the new controllers.
>
> Similarly, the HDMI controller has all its registers shuffled and split in
> multiple controllers now, so we need a bunch of changes to support this as
> well.
>
> Only the HDMI support is enabled for now (even though the DPI and DSI
> outputs have been tested too).
>
> Let me know if you have any comments
> Maxime
>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: devicetree@vger.kernel.org
> Cc: Kamal Dasu <kdasu.kdev@gmail.com>
> Cc: linux-clk@vger.kernel.org
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Philipp Zabel <p.zabel@pengutronix.de>
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: Stephen Boyd <sboyd@kernel.org>
>
> Changes from v3:
>   - Rebased on top of next-20200708
>   - Added a name to the HDMI audio codec component
>   - Only disable the BCM2711 HDMI pixelvalves at boot
>   - Fixed an error in the HVS binding
>   - Fix a framebuffer size condition that was inverted
>   - Changed the channel allocation algorithm using Eric's suggestion
>   - Always write the muxing values instead of updating if needed
>   - Improved a bit the hvs_available_channels comment in the structure
>   - Change atomic_complete_commit code to use for_each_new_crtc_in_state
>   - Change the muxing code to take into account disparities between the
>     BCM2711 and previous SoCs.
>   - Only change the clock rate on BCM2711 during a modeset
>   - Fix a crash at atomic_disable
>   - Use clk_set_min_rate for the core clock too
>   - Add a few defines, and simplify the FIFO level stuff
>   - Reordered the patches according to Eric's reviews
>   - Fixed a regression with VID_CTL setting on RPI3
>
i additionally applied "drm/vc4/vc4_hdmi: fill ASoC card owner" on top
of your series (potential merge conflict).

I didn't see any issues with a RPI 3B or RPI 4B.

So this whole series is

Tested-by: Stefan Wahren <stefan.wahren@i2se.com>

Regards
Stefan
Hoegeun Kwon Aug. 21, 2020, 7:18 a.m. UTC | #3
Hi Maxime,

Thank you for your version 4 patch.
I tested all 78 patches based on the next-20200708.


Dual HDMI opearation does not work normally.
flip_done timed out occurs and doesn't work.
Could you check please it.

[  105.694541] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
[CRTC:64:crtc-3] flip_done timed out
[  115.934994] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
[CONNECTOR:32:HDMI-A-1] flip_done timed out
[  126.174545] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
[PLANE:60:plane-3] flip_done timed out


And there is a problem with 4k UDH not outputting...
So this problem worked as I fixed it like patches[1].

[1] [PATCH 0/3] drm/vc4: Support HDMI QHD or higher output


"[PATCH v4 00/78] drm/vc4: Support BCM2711 Display Pipeline" all patches.

Tested-by: Hoegeun Kwon <hoegeun.kwon@samsung.com>

Best regards,
Hoegeun

> Hi everyone,
>
> Here's a (pretty long) series to introduce support in the VC4 DRM driver
> for the display pipeline found in the BCM2711 (and thus the RaspberryPi 4).
>
> The main differences are that there's two HDMI controllers and that there's
> more pixelvalve now. Those pixelvalve come with a mux in the HVS that still
> have only 3 FIFOs. Both of those differences are breaking a bunch of
> expectations in the driver, so we first need a good bunch of cleanup and
> reworks to introduce support for the new controllers.
>
> Similarly, the HDMI controller has all its registers shuffled and split in
> multiple controllers now, so we need a bunch of changes to support this as
> well.
>
> Only the HDMI support is enabled for now (even though the DPI and DSI
> outputs have been tested too).
>
> Let me know if you have any comments
> Maxime
>
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: devicetree@vger.kernel.org
> Cc: Kamal Dasu <kdasu.kdev@gmail.com>
> Cc: linux-clk@vger.kernel.org
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Philipp Zabel <p.zabel@pengutronix.de>
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: Stephen Boyd <sboyd@kernel.org>
>
> Changes from v3:
>    - Rebased on top of next-20200708
>    - Added a name to the HDMI audio codec component
>    - Only disable the BCM2711 HDMI pixelvalves at boot
>    - Fixed an error in the HVS binding
>    - Fix a framebuffer size condition that was inverted
>    - Changed the channel allocation algorithm using Eric's suggestion
>    - Always write the muxing values instead of updating if needed
>    - Improved a bit the hvs_available_channels comment in the structure
>    - Change atomic_complete_commit code to use for_each_new_crtc_in_state
>    - Change the muxing code to take into account disparities between the
>      BCM2711 and previous SoCs.
>    - Only change the clock rate on BCM2711 during a modeset
>    - Fix a crash at atomic_disable
>    - Use clk_set_min_rate for the core clock too
>    - Add a few defines, and simplify the FIFO level stuff
>    - Reordered the patches according to Eric's reviews
>    - Fixed a regression with VID_CTL setting on RPI3
>
> Changes from v2:
>    - Rebased on top of next-20200526
>    - Split the firmware clock series away
>    - Removed the stuck pixel (with all the subsequent pixels being shifted
>      by one
>    - Fixed the writeback issue too.
>    - Fix the dual output
>    - Fixed the return value of phy_get_cp_current
>    - Enhanced the comment on the reset delay
>    - Increase the max width and height
>    - Made a proper Kconfig option for the DVP clock driver
>    - Fixed the alsa card name collision
>
> Changes from v1:
>    - Rebased on top of 5.7-rc1
>    - Run checkpatch
>    - Added audio support
>    - Fixed some HDMI timeouts
>    - Swiched to clk_hw_register_gate_parent_data
>    - Reorder Kconfig symbols in drivers/i2c/busses
>    - Make the firmware clocks a child of the firmware node
>    - Switch DVP clock driver to clk_hw interface
>    - constify raspberrypi_clk_data in raspberrypi_clock_property
>    - Don't mark firmware clocks as IGNORE_UNUSED
>    - Change from reset_ms to reset_us in reset-simple, and add a bit more
>      comments
>    - Remove generic clk patch to test if a NULL pointer is returned
>    - Removed misleading message in the is_prepared renaming patch commit
>      message
>    - Constify HDMI controller variants
>    - Fix a bug in the allocation size of the clk data array
>    - Added a mention in the DT binding conversion patches about the breakage
>    - Merged a few fixes from kbuild
>    - Fixed a few bisection and CEC build issues
>    - Collected Acked-by and Reviewed-by
>    - Change Dave email address to raspberrypi.com
>
> Dave Stevenson (7):
>    drm/vc4: Add support for the BCM2711 HVS5
>    drm/vc4: plane: Change LBM alignment constraint on LBM
>    drm/vc4: plane: Optimize the LBM allocation size
>    drm/vc4: hdmi: Use reg-names to retrieve the HDMI audio registers
>    drm/vc4: hdmi: Reset audio infoframe on encoder_enable if previously streaming
>    drm/vc4: hdmi: Set the b-frame marker to the match ALSA's default.
>    drm/vc4: hdmi: Add audio-related callbacks
>
> Maxime Ripard (71):
>    dt-bindings: display: Add support for the BCM2711 HVS
>    drm/vc4: hvs: Boost the core clock during modeset
>    drm/vc4: plane: Create more planes
>    drm/vc4: crtc: Deal with different number of pixel per clock
>    drm/vc4: crtc: Use a shared interrupt
>    drm/vc4: crtc: Move the cob allocation outside of bind
>    drm/vc4: crtc: Rename HVS channel to output
>    drm/vc4: crtc: Use local chan variable
>    drm/vc4: crtc: Enable and disable the PV in atomic_enable / disable
>    drm/vc4: kms: Convert to for_each_new_crtc_state
>    drm/vc4: crtc: Assign output to channel automatically
>    drm/vc4: crtc: Add FIFO depth to vc4_crtc_data
>    drm/vc4: crtc: Add function to compute FIFO level bits
>    drm/vc4: crtc: Rename HDMI encoder type to HDMI0
>    drm/vc4: crtc: Add HDMI1 encoder type
>    drm/vc4: crtc: Disable color management for HVS5
>    drm/vc4: crtc: Turn pixelvalve reset into a function
>    drm/vc4: crtc: Move PV dump to config_pv
>    drm/vc4: crtc: Move HVS init and close to a function
>    drm/vc4: crtc: Move the HVS gamma LUT setup to our init function
>    drm/vc4: hvs: Make sure our channel is reset
>    drm/vc4: crtc: Remove mode_set_nofb
>    drm/vc4: crtc: Remove redundant pixelvalve reset
>    drm/vc4: crtc: Move HVS channel init before the PV initialisation
>    drm/vc4: encoder: Add finer-grained encoder callbacks
>    drm/vc4: crtc: Add a delay after disabling the PixelValve output
>    drm/vc4: crtc: Clear the PixelValve FIFO on disable
>    drm/vc4: crtc: Clear the PixelValve FIFO during configuration
>    drm/vc4: hvs: Make the stop_channel function public
>    drm/vc4: hvs: Introduce a function to get the assigned FIFO
>    drm/vc4: crtc: Move the CRTC disable out
>    drm/vc4: drv: Disable the CRTC at boot time
>    dt-bindings: display: vc4: pv: Add BCM2711 pixel valves
>    drm/vc4: crtc: Add BCM2711 pixelvalves
>    drm/vc4: hdmi: Use debugfs private field
>    drm/vc4: hdmi: Move structure to header
>    drm/vc4: hdmi: rework connectors and encoders
>    drm/vc4: hdmi: Remove DDC argument to connector_init
>    drm/vc4: hdmi: Rename hdmi to vc4_hdmi
>    drm/vc4: hdmi: Move accessors to vc4_hdmi
>    drm/vc4: hdmi: Use local vc4_hdmi directly
>    drm/vc4: hdmi: Add container_of macros for encoders and connectors
>    drm/vc4: hdmi: Pass vc4_hdmi to CEC code
>    drm/vc4: hdmi: Retrieve the vc4_hdmi at unbind using our device
>    drm/vc4: hdmi: Remove vc4_dev hdmi pointer
>    drm/vc4: hdmi: Remove vc4_hdmi_connector
>    drm/vc4: hdmi: Introduce resource init and variant
>    drm/vc4: hdmi: Implement a register layout abstraction
>    drm/vc4: hdmi: Add reset callback
>    drm/vc4: hdmi: Add PHY init and disable function
>    drm/vc4: hdmi: Add PHY RNG enable / disable function
>    drm/vc4: hdmi: Add a CSC setup callback
>    drm/vc4: hdmi: Store the encoder type in the variant structure
>    drm/vc4: hdmi: Deal with multiple debugfs files
>    drm/vc4: hdmi: Move CEC init to its own function
>    drm/vc4: hdmi: Add CEC support flag
>    drm/vc4: hdmi: Remove unused CEC_CLOCK_DIV define
>    drm/vc4: hdmi: Rename drm_encoder pointer in mode_valid
>    drm/vc4: hdmi: Adjust HSM clock rate depending on pixel rate
>    drm/vc4: hdmi: Use clk_set_min_rate instead
>    drm/vc4: hdmi: Deal with multiple ALSA cards
>    drm/vc4: hdmi: Remove register dumps in enable
>    drm/vc4: hdmi: Always recenter the HDMI FIFO
>    drm/vc4: hdmi: Implement finer-grained hooks
>    drm/vc4: hdmi: Do the VID_CTL configuration at once
>    drm/vc4: hdmi: Switch to blank pixels when disabled
>    drm/vc4: hdmi: Support the BCM2711 HDMI controllers
>    dt-bindings: display: vc4: hdmi: Add BCM2711 HDMI controllers bindings
>    dt-bindings: display: vc4: Document BCM2711 VC5
>    drm/vc4: drv: Support BCM2711
>    ARM: dts: bcm2711: Enable the display pipeline
>
>   Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml        |  109 +++++-
>   Documentation/devicetree/bindings/display/brcm,bcm2835-hvs.yaml         |   18 +-
>   Documentation/devicetree/bindings/display/brcm,bcm2835-pixelvalve0.yaml |    5 +-
>   Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml         |    1 +-
>   arch/arm/boot/dts/bcm2711-rpi-4-b.dts                                   |   46 ++-
>   arch/arm/boot/dts/bcm2711.dtsi                                          |  115 ++++-
>   drivers/gpu/drm/vc4/Makefile                                            |    1 +-
>   drivers/gpu/drm/vc4/vc4_crtc.c                                          |  338 +++++++++++----
>   drivers/gpu/drm/vc4/vc4_drv.c                                           |    5 +-
>   drivers/gpu/drm/vc4/vc4_drv.h                                           |   43 +-
>   drivers/gpu/drm/vc4/vc4_hdmi.c                                          | 1625 +++++++++++++++++++++++++++++++++++++++++++-----------------------------
>   drivers/gpu/drm/vc4/vc4_hdmi.h                                          |  183 ++++++++-
>   drivers/gpu/drm/vc4/vc4_hdmi_phy.c                                      |  520 +++++++++++++++++++++++-
>   drivers/gpu/drm/vc4/vc4_hdmi_regs.h                                     |  442 ++++++++++++++++++++-
>   drivers/gpu/drm/vc4/vc4_hvs.c                                           |  260 +++++++-----
>   drivers/gpu/drm/vc4/vc4_kms.c                                           |  225 +++++++++-
>   drivers/gpu/drm/vc4/vc4_plane.c                                         |  222 +++++++---
>   drivers/gpu/drm/vc4/vc4_regs.h                                          |  177 +++-----
>   drivers/gpu/drm/vc4/vc4_txp.c                                           |    4 +-
>   19 files changed, 3331 insertions(+), 1008 deletions(-)
>   create mode 100644 Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml
>   create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi.h
>   create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi_phy.c
>   create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi_regs.h
>
> base-commit: 5bdd2824d705fb8d339d6f96e464b907c9a1553d
Chanwoo Choi Aug. 31, 2020, 2:36 a.m. UTC | #4
Hi Maxime,

On 7/9/20 2:41 AM, Maxime Ripard wrote:
> Hi everyone,
> 
> Here's a (pretty long) series to introduce support in the VC4 DRM driver
> for the display pipeline found in the BCM2711 (and thus the RaspberryPi 4).
> 
> The main differences are that there's two HDMI controllers and that there's
> more pixelvalve now. Those pixelvalve come with a mux in the HVS that still
> have only 3 FIFOs. Both of those differences are breaking a bunch of
> expectations in the driver, so we first need a good bunch of cleanup and
> reworks to introduce support for the new controllers.
> 
> Similarly, the HDMI controller has all its registers shuffled and split in
> multiple controllers now, so we need a bunch of changes to support this as
> well.
> 
> Only the HDMI support is enabled for now (even though the DPI and DSI
> outputs have been tested too).
> 
> Let me know if you have any comments
> Maxime
> 
> Cc: bcm-kernel-feedback-list@broadcom.com
> Cc: devicetree@vger.kernel.org
> Cc: Kamal Dasu <kdasu.kdev@gmail.com>
> Cc: linux-clk@vger.kernel.org
> Cc: Michael Turquette <mturquette@baylibre.com>
> Cc: Philipp Zabel <p.zabel@pengutronix.de>
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: Stephen Boyd <sboyd@kernel.org>
> 
> Changes from v3:
>   - Rebased on top of next-20200708
>   - Added a name to the HDMI audio codec component
>   - Only disable the BCM2711 HDMI pixelvalves at boot
>   - Fixed an error in the HVS binding
>   - Fix a framebuffer size condition that was inverted
>   - Changed the channel allocation algorithm using Eric's suggestion
>   - Always write the muxing values instead of updating if needed
>   - Improved a bit the hvs_available_channels comment in the structure
>   - Change atomic_complete_commit code to use for_each_new_crtc_in_state
>   - Change the muxing code to take into account disparities between the
>     BCM2711 and previous SoCs.
>   - Only change the clock rate on BCM2711 during a modeset
>   - Fix a crash at atomic_disable
>   - Use clk_set_min_rate for the core clock too
>   - Add a few defines, and simplify the FIFO level stuff
>   - Reordered the patches according to Eric's reviews
>   - Fixed a regression with VID_CTL setting on RPI3
> 
> Changes from v2:
>   - Rebased on top of next-20200526
>   - Split the firmware clock series away
>   - Removed the stuck pixel (with all the subsequent pixels being shifted
>     by one
>   - Fixed the writeback issue too.
>   - Fix the dual output
>   - Fixed the return value of phy_get_cp_current
>   - Enhanced the comment on the reset delay
>   - Increase the max width and height
>   - Made a proper Kconfig option for the DVP clock driver
>   - Fixed the alsa card name collision
> 
> Changes from v1:
>   - Rebased on top of 5.7-rc1
>   - Run checkpatch
>   - Added audio support
>   - Fixed some HDMI timeouts
>   - Swiched to clk_hw_register_gate_parent_data
>   - Reorder Kconfig symbols in drivers/i2c/busses
>   - Make the firmware clocks a child of the firmware node
>   - Switch DVP clock driver to clk_hw interface
>   - constify raspberrypi_clk_data in raspberrypi_clock_property
>   - Don't mark firmware clocks as IGNORE_UNUSED
>   - Change from reset_ms to reset_us in reset-simple, and add a bit more
>     comments
>   - Remove generic clk patch to test if a NULL pointer is returned
>   - Removed misleading message in the is_prepared renaming patch commit
>     message
>   - Constify HDMI controller variants
>   - Fix a bug in the allocation size of the clk data array
>   - Added a mention in the DT binding conversion patches about the breakage
>   - Merged a few fixes from kbuild
>   - Fixed a few bisection and CEC build issues
>   - Collected Acked-by and Reviewed-by
>   - Change Dave email address to raspberrypi.com
> 
> Dave Stevenson (7):
>   drm/vc4: Add support for the BCM2711 HVS5
>   drm/vc4: plane: Change LBM alignment constraint on LBM
>   drm/vc4: plane: Optimize the LBM allocation size
>   drm/vc4: hdmi: Use reg-names to retrieve the HDMI audio registers
>   drm/vc4: hdmi: Reset audio infoframe on encoder_enable if previously streaming
>   drm/vc4: hdmi: Set the b-frame marker to the match ALSA's default.
>   drm/vc4: hdmi: Add audio-related callbacks
> 
> Maxime Ripard (71):
>   dt-bindings: display: Add support for the BCM2711 HVS
>   drm/vc4: hvs: Boost the core clock during modeset
>   drm/vc4: plane: Create more planes
>   drm/vc4: crtc: Deal with different number of pixel per clock
>   drm/vc4: crtc: Use a shared interrupt
>   drm/vc4: crtc: Move the cob allocation outside of bind
>   drm/vc4: crtc: Rename HVS channel to output
>   drm/vc4: crtc: Use local chan variable
>   drm/vc4: crtc: Enable and disable the PV in atomic_enable / disable
>   drm/vc4: kms: Convert to for_each_new_crtc_state
>   drm/vc4: crtc: Assign output to channel automatically
>   drm/vc4: crtc: Add FIFO depth to vc4_crtc_data
>   drm/vc4: crtc: Add function to compute FIFO level bits
>   drm/vc4: crtc: Rename HDMI encoder type to HDMI0
>   drm/vc4: crtc: Add HDMI1 encoder type
>   drm/vc4: crtc: Disable color management for HVS5
>   drm/vc4: crtc: Turn pixelvalve reset into a function
>   drm/vc4: crtc: Move PV dump to config_pv
>   drm/vc4: crtc: Move HVS init and close to a function
>   drm/vc4: crtc: Move the HVS gamma LUT setup to our init function
>   drm/vc4: hvs: Make sure our channel is reset
>   drm/vc4: crtc: Remove mode_set_nofb
>   drm/vc4: crtc: Remove redundant pixelvalve reset
>   drm/vc4: crtc: Move HVS channel init before the PV initialisation
>   drm/vc4: encoder: Add finer-grained encoder callbacks
>   drm/vc4: crtc: Add a delay after disabling the PixelValve output
>   drm/vc4: crtc: Clear the PixelValve FIFO on disable
>   drm/vc4: crtc: Clear the PixelValve FIFO during configuration
>   drm/vc4: hvs: Make the stop_channel function public
>   drm/vc4: hvs: Introduce a function to get the assigned FIFO
>   drm/vc4: crtc: Move the CRTC disable out
>   drm/vc4: drv: Disable the CRTC at boot time
>   dt-bindings: display: vc4: pv: Add BCM2711 pixel valves
>   drm/vc4: crtc: Add BCM2711 pixelvalves
>   drm/vc4: hdmi: Use debugfs private field
>   drm/vc4: hdmi: Move structure to header
>   drm/vc4: hdmi: rework connectors and encoders
>   drm/vc4: hdmi: Remove DDC argument to connector_init
>   drm/vc4: hdmi: Rename hdmi to vc4_hdmi
>   drm/vc4: hdmi: Move accessors to vc4_hdmi
>   drm/vc4: hdmi: Use local vc4_hdmi directly
>   drm/vc4: hdmi: Add container_of macros for encoders and connectors
>   drm/vc4: hdmi: Pass vc4_hdmi to CEC code
>   drm/vc4: hdmi: Retrieve the vc4_hdmi at unbind using our device
>   drm/vc4: hdmi: Remove vc4_dev hdmi pointer
>   drm/vc4: hdmi: Remove vc4_hdmi_connector
>   drm/vc4: hdmi: Introduce resource init and variant
>   drm/vc4: hdmi: Implement a register layout abstraction
>   drm/vc4: hdmi: Add reset callback
>   drm/vc4: hdmi: Add PHY init and disable function
>   drm/vc4: hdmi: Add PHY RNG enable / disable function
>   drm/vc4: hdmi: Add a CSC setup callback
>   drm/vc4: hdmi: Store the encoder type in the variant structure
>   drm/vc4: hdmi: Deal with multiple debugfs files
>   drm/vc4: hdmi: Move CEC init to its own function
>   drm/vc4: hdmi: Add CEC support flag
>   drm/vc4: hdmi: Remove unused CEC_CLOCK_DIV define
>   drm/vc4: hdmi: Rename drm_encoder pointer in mode_valid
>   drm/vc4: hdmi: Adjust HSM clock rate depending on pixel rate
>   drm/vc4: hdmi: Use clk_set_min_rate instead
>   drm/vc4: hdmi: Deal with multiple ALSA cards
>   drm/vc4: hdmi: Remove register dumps in enable
>   drm/vc4: hdmi: Always recenter the HDMI FIFO
>   drm/vc4: hdmi: Implement finer-grained hooks
>   drm/vc4: hdmi: Do the VID_CTL configuration at once
>   drm/vc4: hdmi: Switch to blank pixels when disabled
>   drm/vc4: hdmi: Support the BCM2711 HDMI controllers
>   dt-bindings: display: vc4: hdmi: Add BCM2711 HDMI controllers bindings
>   dt-bindings: display: vc4: Document BCM2711 VC5
>   drm/vc4: drv: Support BCM2711
>   ARM: dts: bcm2711: Enable the display pipeline
> 
>  Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml        |  109 +++++-
>  Documentation/devicetree/bindings/display/brcm,bcm2835-hvs.yaml         |   18 +-
>  Documentation/devicetree/bindings/display/brcm,bcm2835-pixelvalve0.yaml |    5 +-
>  Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml         |    1 +-
>  arch/arm/boot/dts/bcm2711-rpi-4-b.dts                                   |   46 ++-
>  arch/arm/boot/dts/bcm2711.dtsi                                          |  115 ++++-
>  drivers/gpu/drm/vc4/Makefile                                            |    1 +-
>  drivers/gpu/drm/vc4/vc4_crtc.c                                          |  338 +++++++++++----
>  drivers/gpu/drm/vc4/vc4_drv.c                                           |    5 +-
>  drivers/gpu/drm/vc4/vc4_drv.h                                           |   43 +-
>  drivers/gpu/drm/vc4/vc4_hdmi.c                                          | 1625 +++++++++++++++++++++++++++++++++++++++++++-----------------------------
>  drivers/gpu/drm/vc4/vc4_hdmi.h                                          |  183 ++++++++-
>  drivers/gpu/drm/vc4/vc4_hdmi_phy.c                                      |  520 +++++++++++++++++++++++-
>  drivers/gpu/drm/vc4/vc4_hdmi_regs.h                                     |  442 ++++++++++++++++++++-
>  drivers/gpu/drm/vc4/vc4_hvs.c                                           |  260 +++++++-----
>  drivers/gpu/drm/vc4/vc4_kms.c                                           |  225 +++++++++-
>  drivers/gpu/drm/vc4/vc4_plane.c                                         |  222 +++++++---
>  drivers/gpu/drm/vc4/vc4_regs.h                                          |  177 +++-----
>  drivers/gpu/drm/vc4/vc4_txp.c                                           |    4 +-
>  19 files changed, 3331 insertions(+), 1008 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml
>  create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi.h
>  create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi_phy.c
>  create mode 100644 drivers/gpu/drm/vc4/vc4_hdmi_regs.h
> 
> base-commit: 5bdd2824d705fb8d339d6f96e464b907c9a1553d
> 

I tested it for stress test with reboot command repetitively
for verifying this patchset. It is well working.

Tested-by: Chanwoo Choi <cw00.choi@samsung.com>
Maxime Ripard Sept. 2, 2020, 1:32 p.m. UTC | #5
Hi Hoegeun

On Fri, Aug 21, 2020 at 04:18:34PM +0900, Hoegeun Kwon wrote:
> Hi Maxime,
> 
> Thank you for your version 4 patch.
> I tested all 78 patches based on the next-20200708.
> 
> 
> Dual HDMI opearation does not work normally.
> flip_done timed out occurs and doesn't work.
> Could you check please it.
> 
> [  105.694541] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
> [CRTC:64:crtc-3] flip_done timed out
> [  115.934994] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
> [CONNECTOR:32:HDMI-A-1] flip_done timed out
> [  126.174545] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
> [PLANE:60:plane-3] flip_done timed out

Thanks for testing and reporting this. I've been looking into it, and it
seems that it's not just the dual output that's broken, but HDMI1
entirely (so even a single display connected to HDMI1 doesn't work).

Is it happening for you as well?

Maxime
Maxime Ripard Sept. 2, 2020, 1:52 p.m. UTC | #6
On Wed, Sep 02, 2020 at 03:32:20PM +0200, Maxime Ripard wrote:
> Hi Hoegeun
> 
> On Fri, Aug 21, 2020 at 04:18:34PM +0900, Hoegeun Kwon wrote:
> > Hi Maxime,
> > 
> > Thank you for your version 4 patch.
> > I tested all 78 patches based on the next-20200708.
> > 
> > 
> > Dual HDMI opearation does not work normally.
> > flip_done timed out occurs and doesn't work.
> > Could you check please it.
> > 
> > [  105.694541] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
> > [CRTC:64:crtc-3] flip_done timed out
> > [  115.934994] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
> > [CONNECTOR:32:HDMI-A-1] flip_done timed out
> > [  126.174545] [drm:drm_atomic_helper_wait_for_dependencies] *ERROR* 
> > [PLANE:60:plane-3] flip_done timed out
> 
> Thanks for testing and reporting this. I've been looking into it, and it
> seems that it's not just the dual output that's broken, but HDMI1
> entirely (so even a single display connected to HDMI1 doesn't work).
> 
> Is it happening for you as well?

Nevermind, I had the DSI panel connected and it was interfering

Maxime