Hi,
I would like to better understand DisplayPort support on the iMX8 product family.
The imx-yocto-L4.14.98_2.0.0_ga release documentation i.MX Linux Reference Manual present HDMI Support for i.MX 8M Quad and i.MX 8QuadMax as "HDMI 2.0/Display Port 1.3 on chip".
Is there a difference between the iMX8M and iMX8 series HDMI/DisplayPort subsystem ?
When building the boot firmware for iMX8M, I notice reference to HDMI / DisplayPort :
- ./mkimage_imx8 -fit -signed_hdmi signed_dp_imx8m.bin
- ./mkimage_imx8 -fit -signed_hdmi signed_dp_imx8m.bin
Are those firmware and initialization specific to the iMX8M (Mscale) ?
The iMX8QuadMax imx-mkimage has reference to hdmitxfw.bin and hdmirxfw.bin. The firmware-imx bundle has hdmitxfw.bin, hdmirxfw.bin and dpfw.bin. The dpfw.bin is not referenced by imx-mkimage.
Is a firmware required to enabled displayport on iMX8QM ?
Is dpfw.bin required to enable displayport on iMX8QuadMax (iMX8QM) ?
Is the difference in firmware due to a difference in HDMI/DisplayPort subsystem ?
Is the difference in firmware due to a difference in the SoC family ( iMX8M (MSCALE) vs iMX8 ) ?
Regards,
Stan
The displayport on iMX8QM has been integrated. Firmware was updated as a result of different investigation. iMX8QM DisplayPort was functional and stable on the custom system.
I don't have any link to a release version or NXP release notes about firmware change, I should try to find some.
@julien_jayat Thanks for the support. If you have any pointer to the latest firmware release version, could you add the links ?
Hi Stanislas,
The latest Display Port firmware and driver have been integrated in "Linux 5.4.70_2.3.0"
BSP can be found here:
https://www.nxp.com/design/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-applicat...
Best Regards,
Julien Jayat
Hello all,
@gsa Did you find the correct dtb for imx8mq? and what about lane mapping values?
I have problem with DP port, I used signed_dp .... firmware. here is a piece of my dmesg. Could someone help me please?
i2c i2c-4: of_i2c: modalias failure on /hdmi@32c00000/port@0
[ 0.317142] i2c i2c-4: Failed to create I2C device for /hdmi@32c00000/port@0
[ 0.317151] [drm] Failed to get HDCP config - using HDCP 2.2 only
[ 0.317212] [drm] Failed to initialize HDCP
[ 0.318608] [drm] hdmi-audio-codec driver bound to HDMI
[ 0.318622] imx-drm display-subsystem: bound 32c00000.hdmi (ops imx_hdp_imx_ops)
[ 0.329369] [drm] dp_get_edid_block (ret = 0) block 0
[ 0.340012] [drm] dp_get_edid_block (ret = 0) block 0
[ 0.350656] [drm] dp_get_edid_block (ret = 0) block 0
[ 0.361294] [drm] dp_get_edid_block (ret = 0) block 0
[ 0.361302] imx-drm display-subsystem: DP-1: EDID is invalid:
[ 0.361310] [00] BAD 00 20 00 00 00 10 74 00 00 00 00 00 00 00 00 00
[ 0.361315] [00] BAD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 0.361319] [00] BAD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 0.361324] [00] BAD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 0.361328] [00] BAD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 0.361332] [00] BAD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 0.361337] [00] BAD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 0.361342] [00] BAD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 0.361349] i.mx8-hdp 32c00000.hdmi: failed to get edid, use default video modes
[ 0.381101] [drm] asserted HDP PHY reset
[ 0.381169] [drm] pixel engine reset
[ 0.381186] [drm] CDN_*_Write_Register_blocking ... setting LANES_CONFIG c6
[ 0.381242] Wait for A3 ACK
[ 0.383649] [drm] AFE_init
[ 0.383652] [drm] deasserted HDP PHY reset
[ 0.383740] Wait until PHY_HDP_CLK_CTL[bit 1] != 0
[ 0.384261] Wait for A2 ACK
[ 0.405877] [drm] AFE_power exit
[ 0.405887] [drm] CDN_API_DPTX_SetVideo_blocking (ret = 0)
[ 0.405889] [drm] dp_mode_set()
[ 0.405895] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.411835] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.417766] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.423699] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.429633] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.435566] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.441500] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.447436] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.453368] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.459302] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.465238] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.471169] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.477103] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.483037] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.488971] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.494905] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.500841] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.506774] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.512711] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.518640] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.524578] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.530508] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.536445] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.542376] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.548313] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.554245] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.560179] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.566112] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.572046] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.577980] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.583912] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.589848] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 0.595170] [drm] Failed to Get DP link ID: -71
This is an update to I2C operation over Aux for the iMX8 native displayport.
For imx8qm, the firmware needs to be updated to version 26098 or 32955.
[ 1.900048] [drm] CDN_API_General_getCurVersion - ver 26098 verlib 20691
[ 1.899414] [drm] CDN_API_General_getCurVersion - ver 32955 verlib 20691
Once updated, the patch attached can enable I2C communication over Aux.
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x50 0x7 r1
[ 118.995256] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 119.001750] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 119.008431] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 119.014887] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1
[ 119.021539] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
0x00
root@quicksilver:~# i2ctransfer -y imx_dp_aux r1@0x50
[ 122.594930] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 122.601465] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1
[ 122.608123] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
0x10
However, I2C read failure leads to unrecoverable error.
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x52 0x7 r1
[ 136.786266] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 136.792797] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 136.799384] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
Error: Sending messages failed: Remote I/O error
root@quicksilver:~# i2ctransfer -y imx_dp_aux r1@0x52
[ 143.729652] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 143.736195] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1
[ 145.241401] i.mx8-hdp 56268000.hdmi: CDN_API_DPTX_I2C_Read_blocking status 1
[ 145.248455] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
[ 146.753117] i.mx8-hdp 56268000.hdmi: CDN_API_DPTX_I2C_Read_blocking status 1
Error: Sending messages failed: Input/output error
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x50 0x7 r1
[ 159.587205] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 161.090864] i.mx8-hdp 56268000.hdmi: CDN_API_DPTX_I2C_Write_blocking status 1
[ 161.098008] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
[ 162.602655] i.mx8-hdp 56268000.hdmi: CDN_API_DPTX_I2C_Write_blocking status 1
Error: Sending messages failed: Input/output error
root@quicksilver:~# i2ctransfer -y imx_dp_aux r1@0x50
[ 167.434005] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 168.937859] i.mx8-hdp 56268000.hdmi: CDN_API_DPTX_I2C_Read_blocking status 1
[ 168.944914] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
[ 170.449676] i.mx8-hdp 56268000.hdmi: CDN_API_DPTX_I2C_Read_blocking status 1
Error: Sending messages failed: Input/output error
I2C write on an invalid address reports correct failure.
I2C read on an invalid address lead to the whole CDN_API_DPTX API enter a BUSY status. It is unknown how to recover from it.
Follow-up questions julienjayat
- What is the expected DPTX_I2C_Write_response format ? Should size field be int or uint16_t ?
During the testing, the size return was 0xFFFF0004 and 0xFFFF00002 for write of 4 and 2 bytes. Linux uses 32-bit but the DPTX seems to use 16-bit.
- What is the expected response from CDN_API_DPTX_GetLastI2cStatus ?
- How can we recover from a failed i2c read ? Most driver will try to read data during probe, this should not lock the whole displayport interface.
Thanks,
Stan
Hi Stan,
The size return was 0xFFFF0004 and 0xFFFF00002 for write of 4 and 2 bytes. Linux uses 32-bit but the DPTX seems to use 16-bit.
=> I also noticed that . Even if the API is declaring an int, it looks like only 16bits are actually used.
----
About, CDN_API_DPTX_GetLastI2cStatus, I confirm that it is always returning "0 - I2C_ACK", even when the Display Port is not connected to a screen.
-----
I haven't reproduced the unrecoverable issue, using your patches and the same command:
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x52 0x7 r1
[954.636144] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[954.642554] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[954.649072] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
Error: Sending messages failed: Remote I/O error
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux r1@0x52
[961.837311] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[961.843721] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1
[961.850227] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
Error: Sending messages failed: Remote I/O error
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux r1@0x50
[996.973140] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[996.979547] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1
[996.986148] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
0x00
I will report the issues to the firmware provider.
Best regards,
Julien,
Hello
I've been trying to get the same function working on imx8mq-evk
(Linux imx8mqevk 4.19.35-ge4452f445) plus the patches to add AUX function
I see the following on boot
[ 0.962064] imx-dcss-crtc imx-dcss-crtc.0: DMA mask not set
[ 0.968106] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 0.974745] [drm] No driver support for vblank timestamp query.
[ 0.980808] imx-drm display-subsystem: bound imx-dcss-crtc.0 (ops dcss_crtc_ops)
[ 0.988352] i.mx8-hdp 32c00000.hdmi: Proof of update
[ 0.993332] i.mx8-hdp 32c00000.hdmi: IS dp, is edp 0 0
[ 0.998623] [drm] CDN_API_General_Test_Echo_Ext_blocking - APB(ret = 0 echo_resp = echo test)
[ 1.007163] [drm] CDN_API_General_getCurVersion - ver 26098 verlib 20691
[ 1.013930] [drm] Pixel clock frequency: 594000 KHz, character clock frequency: 594000, color depth is 8-bit.
[ 1.023860] [drm] Pixel clock frequency (594000 KHz) is supported in this color depth (8-bit). Settings found in row 27
[ 1.034659] [drm] VCO frequency is 5940000
[ 1.038769] [drm] VCO frequency (5940000 KHz) is supported. Settings found in row 14
[ 1.071010] [drm] CDN_API_General_Write_Register_blocking LANES_CONFIG ret = 0
[ 1.078262] [drm] Failed to get HDCP config - using HDCP 2.2 only
[ 1.084500] [drm] Failed to initialize HDCP
[ 1.089486] [drm] hdmi-audio-codec driver bound to HDMI
[ 1.094738] imx-drm display-subsystem: bound 32c00000.hdmi (ops imx_hdp_imx_ops)
[ 1.102201] [drm] Cannot find any crtc or sizes
[ 1.107041] [drm] Initialized imx-drm 1.0.0 20120507 for display-subsystem on minor 0
My issue is that when I try to run any i2c command (i2ctransfer -y imx_dp_aux w1@0x50 0x7 r1)
I see this
Error: I2C bus name doesn't match any bus present!
It seems that the connection type passed to the driver is not DP/eDP (I added some debug to this part of the driver code) so the DP AUX never gets initialized
I have tried applying fsl-imx8mq-evk-dp.dtb / fsl-imx8mq-evk-edp.dtb (one or both in every combo)
but there's no change.
I've used a HDMI->DP cable to my dell monitor (doesn't work) and this adapter (with recommended hardware mod) https://community.nxp.com/t5/i-MX-Processors/i-MX8-Display-Port-Interface/m-p/809824
Did you or @sbertrand see this early on?
Should I be changing a higher level dts/dtsi too ?
I'm new to this kernel/driver world so hopefully I'm missing something obvious.
Thanks!
Hi,
Your mention of the HDMI -> DP cable is a dead give away that you are missing important facts here.
I used a custom NXP imx8mq-evk with DisplayPort. Boards that have HDMI connectors are not suitable for DisplayPort.
Despite the hardware limitation, support for DisplayPort requires a change of firmware for the HDMI/DisplayPort IP bloc inside the iMX8. See the NXP documentation about the iMX8 boot image and the system setup performed by U-Boot.
Reach out to your NXP contact for support or documentation.
In any case :
i2cdetect -l
i2c-3 i2c 5a800000.i2c I2C adapter
i2c-6 i2c imx_dp_aux I2C adapter
i2c-4 i2c 58226000.i2c I2C adapter
i2c-2 i2c 57226000.i2c I2C adapter
i2c-5 i2c TC358767 AUX i2c adapter I2C adapter
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux r1@0x52
[961.837311] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[961.843721] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1
[961.850227] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
Error: Sending messages failed: Remote I/O error
This suggest that CDN_API_DPTX_GetLastI2cStatus reports an error for the read operation.
There seems to be a difference in behavior for the write. Are we using the same code ? same firmware ?
NXP Test:
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x52 0x7 r1
[954.636144] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[954.642554] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[954.649072] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
Error: Sending messages failed: Remote I/O error
Benq Display :
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x52 0x7 r1
[ 715.685649] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 715.692166] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
Error: Sending messages failed: Remote I/O error
Custom Display :
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x52 0x7 r1
[ 822.661576] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 822.668037] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 822.674607] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
Error: Sending messages failed: Remote I/O error
This suggest that CDN_API_DPTX_GetLastI2cStatus reports errors differently depending on the display.
Hi Stan,
Firmware: dptx_hdcp_1_0_61_rc2_imx8qm.bin
I tested with different screens and had different results (there is additional debug in my driver see the included patches (based on your implementation)):
#DQ980 (display port Analyser)
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x50 0x0 r8
[ 2020.162078] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 2020.168491] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2020.175780] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 2020.183970] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2020.190956] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 2020.197374] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2020.204257] [drm] 0x00000050:
[ 2020.207224] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x8
[ 2020.215199] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2020.222085] [drm] 0x00000050: 00 ff ff ff ff ff ff 00
[ 2020.227148] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
[ 2020.233554] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2020.240439] [drm] 0x00000050:
0x00 0xff 0xff 0xff 0xff 0xff 0xff 0x00
root@imx8qmmek:~#
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x52 0x0 r8
[ 2020.952821] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 2020.959233] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2020.966228] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 2020.972755] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 1
[ 2020.979754] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
[ 2020.986159] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
Error: Sending messages failed: Remote I/O error
#DELL 4K
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x50 0x0 r8
[ 2164.508878] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 2164.516097] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.523088] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 2164.529512] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.536488] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 2164.542890] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.549779] [drm] 0x00000050:
[ 2164.552757] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x8
[ 2164.559255] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.566189] [drm] 0x00000050: 00 ff ff ff ff ff ff 00
[ 2164.571328] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
[ 2164.577763] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.584668] [drm] 0x00000050:
0x00 0xff 0xff 0xff 0xff 0xff 0xff 0x00
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x52 0x0 r8
[ 2164.641777] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 2164.648536] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.655512] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 2164.663847] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.670841] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 2164.677580] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.684461] [drm] 0x00000052:
[ 2164.687429] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x8
[ 2164.694260] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.701144] [drm] 0x00000052: 00 00 00 00 00 00 00 00
[ 2164.706204] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
[ 2164.712938] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2164.719820] [drm] 0x00000052:
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00Phillips:
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x50 0x0 r8
[ 2361.648471] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 2361.655133] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2361.662120] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 2361.668781] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2361.675758] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 2361.682417] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2361.689301] [drm] 0x00000050:
[ 2361.692278] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x8
[ 2361.698932] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 1
[ 2361.705813] [drm] 0x00000050:
[ 2361.708786] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
[ 2361.715433] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 2361.722320] [drm] 0x00000050:
Error: Sending messages failed: Remote I/O error
root@imx8qmmek:~# i2ctransfer -y imx_dp_aux w1@0x52 0x0 r8
[ 2361.780689] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 2361.788300] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 1
[ 2361.795312] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0
[ 2361.801988] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 1
Error: Sending messages failed: Remote I/O error
Included are the logs of the i2c-over-aux captured by the "Passive aux IN" input from the Display port analyzer.
It shows that when CDN_API_DPTX_GetLastI2cStatus_blocking returns i2c_status=1 (NACK), there is actually a NACK occurring on the i2c-over-aux.
Julien
Hi
Comparison between Native and Bridge I2C operation on the BENQ monitor.
root@quicksilver:~# i2ctransfer -y "TC358767 AUX i2c adapter" w1@0x50 0x7 r1 [ 126.100689] [drm] tc_aux_transfer() msg->request 0x4 msg->size 0x0 [ 126.109849] [drm] Write I2C Status 0 [ 126.114270] [drm] tc_aux_transfer() msg->request 0x4 msg->size 0x1 [ 126.124083] [drm] Write I2C Status 0 [ 126.128477] [drm] tc_aux_transfer() msg->request 0x5 msg->size 0x0 [ 126.137645] [drm] Read I2C Status 0 [ 126.141959] [drm] tc_aux_transfer() msg->request 0x5 msg->size 0x1 [ 126.151117] [drm] Read I2C Status 0 [ 126.156181] [drm] tc_aux_transfer() msg->request 0x1 msg->size 0x0 [ 126.165797] [drm] Read I2C Status 0 0x00 root@quicksilver:~# i2ctransfer -y "TC358767 AUX i2c adapter" r1@0x50 [ 140.547985] [drm] tc_aux_transfer() msg->request 0x5 msg->size 0x0 [ 140.557183] [drm] Read I2C Status 0 [ 140.561488] [drm] tc_aux_transfer() msg->request 0x5 msg->size 0x1 [ 140.570630] [drm] Read I2C Status 0 [ 140.575738] [drm] tc_aux_transfer() msg->request 0x1 msg->size 0x0 [ 140.584892] [drm] Read I2C Status 0 0x09 root@quicksilver:~# i2ctransfer -y "TC358767 AUX i2c adapter" w1@0x52 0x7 r1 [ 168.232598] [drm] tc_aux_transfer() msg->request 0x4 msg->size 0x0 [ 168.241828] [drm] Write I2C Status 1 [ 168.246222] [drm] tc_aux_transfer() msg->request 0x0 msg->size 0x0 [ 168.255366] [drm] Write I2C Status 0 Error: Sending messages failed: Remote I/O error root@quicksilver:~# i2ctransfer -y "TC358767 AUX i2c adapter" r1@0x52 [ 174.124053] [drm] tc_aux_transfer() msg->request 0x5 msg->size 0x0 [ 174.133237] [drm] Read I2C Status 1 [ 174.137543] [drm] tc_aux_transfer() msg->request 0x1 msg->size 0x0 [ 174.146931] [drm] Read I2C Status 0 Error: Sending messages failed: Remote I/O error |
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x50 0x7 r1 [ 32.942263] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0 [ 32.948789] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 32.954051] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1 [ 32.960581] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 32.965853] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0 [ 32.972293] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 32.977473] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1 [ 32.984257] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 32.989404] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0 [ 32.995871] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 0x07 root@quicksilver:~# i2ctransfer -y imx_dp_aux r1@0x50 [ 50.567033] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0 [ 50.573476] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 50.578646] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1 [ 50.585173] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 50.590395] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0 [ 50.596847] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 0xd1 root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x52 0x7 r1 [ 55.230784] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0 [ 55.237320] [drm] Write CDN_API_DPTX_GetLastI2cStatus 1 [ 55.242591] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0 [ 55.249081] [drm] Write CDN_API_DPTX_GetLastI2cStatus 1 Error: Sending messages failed: Remote I/O error root@quicksilver:~# i2ctransfer -y imx_dp_aux r1@0x52 [ 65.710820] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0 [ 65.717307] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 65.722498] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1 [ 65.729245] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 65.734419] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0 [ 65.740921] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 0x00 |
The behavior is not the same. Furthermore the returned data is invalid / inconsistant.
root@quicksilver:~# hexdump -C /sys/ class /drm/card0-DP-1/edid 00000000 00 ff ff ff ff ff ff 00 09 d1 1b 80 45 54 00 00 |............ET..| 00000010 13 1b 01 04 a5 35 1e 78 3a 0c d5 a9 55 4c a1 25 |.....5.x:...UL.%| 00000020 0d 50 54 a5 6b 80 d1 c0 b3 00 a9 c0 81 80 81 00 |.PT.k...........| 00000030 81 c0 01 01 01 01 56 5e 00 a0 a0 a0 29 50 30 20 |......V^....)P0 | 00000040 35 00 0f 28 21 00 00 1a 00 00 00 ff 00 43 35 48 |5..(!........C5H| 00000050 30 37 35 34 38 30 31 39 0a 20 00 00 00 fd 00 32 |07548019. .....2| 00000060 4c 1e 59 1b 04 11 00 f0 f8 38 f0 3c 00 00 00 fc |L.Y......8.<....| 00000070 00 42 65 6e 51 20 4c 43 44 0a 20 20 20 20 01 98 |.BenQ LCD. ..| 00000080 02 03 22 71 4f 90 1f 05 14 04 13 03 12 02 11 01 |.."qO...........| 00000090 07 16 15 06 23 09 17 07 83 01 00 00 65 6e 0c 00 |....#.......en..| 000000a0 10 00 8c 0a d0 8a 20 e0 2d 10 10 3e 96 00 0f 28 |...... .-..>...(| 000000b0 21 00 00 18 01 1d 00 72 51 d0 1e 20 6e 28 55 00 |!......rQ.. n(U.| 000000c0 0f 28 21 00 00 1e 01 1d 00 bc 52 d0 1e 20 b8 28 |.(!.......R.. .(| 000000d0 55 40 0f 28 21 00 00 1e 8c 0a d0 90 20 40 31 20 |U@.(!....... @1 | 000000e0 0c 40 55 00 0f 28 21 00 00 18 00 00 00 00 00 00 |.@U..(!.........| 000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6e |...............n| |
Read 7th byte : 7 is returned instead of the data.
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x50 0x7 r5 [ 996.774755] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0 [ 996.781290] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 996.786565] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1 [ 996.793086] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 996.798347] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0 [ 996.804847] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 996.810018] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x5 [ 996.819025] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 996.824175] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0 [ 996.831077] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 0x07 0x07 0x07 0x07 0x07 |
Read 8th byte : 8 is returned instead of the data
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x50 0x8 r5 [ 992.966794] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0 [ 992.973310] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 992.978572] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1 [ 992.985101] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 992.990366] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0 [ 992.996876] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 993.002049] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x5 [ 993.011056] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 993.016209] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0 [ 993.023122] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 0x08 0x08 0x08 0x08 0x08 |
Read 6th byte : Ok
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x50 0x6 r5 [ 1036.226694] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0 [ 1036.233264] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 1036.238524] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1 [ 1036.245042] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 [ 1036.250297] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0 [ 1036.256790] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 1036.261968] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x5 [ 1036.269170] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 [ 1036.274330] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0 [ 1036.281232] [drm] Read CDN_API_DPTX_GetLastI2cStatus 0 0xff 0x00 0x09 0xd1 0x1b |
But also fails
root@quicksilver:~# i2ctransfer -y imx_dp_aux w1@0x50 0x6 r5 [ 1034.587042] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0 [ 1034.593542] [drm] Write CDN_API_DPTX_GetLastI2cStatus 1 [ 1034.598804] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0 [ 1034.605316] [drm] Write CDN_API_DPTX_GetLastI2cStatus 0 Error: Sending messages failed: Remote I/O error |
Hi Stan,
When using imx8QM to read the first byte of the Phillips Brillance 240B screen using i2c_over-aux:
i2ctransfer -y 9 w1@0x50 0x0 r0
[ 188.970564] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0
[ 188.976809] [drm] msg->request = DP_AUX_I2C_WRITE, msg->size = 0, msg->buffer = 0 , MOT= 1
[ 188.985728] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 188.992724] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1
[ 188.998921] [drm] msg->request = DP_AUX_I2C_WRITE, msg->size = 1, msg->buffer = F3751A00 , MOT= 1
[ 189.008446] [drm] Write CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 189.015414] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 189.021671] [drm] msg->request = DP_AUX_I2C_READ, msg->size = 0, msg->buffer = 0 , MOT= 1
[ 189.030666] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 0
[ 189.037584] dp_aux_transfer()
[ 189.040558] [drm] 0x00000050:
[ 189.043552] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
[ 189.049758] [drm] msg->request = DP_AUX_I2C_READ, msg->size = 0, msg->buffer = 0 , MOT= 0
[ 189.058580] [drm] Read CDN_API_DPTX_GetLastI2cStatus_blocking i2c_status 1
[ 189.065472] dp_aux_transfer()
[ 189.068440] [drm] 0x00000050:
With a laptop with native display port and running Ubuntu.
=> the same i2c command is successful.
I logged both i2c-over-aux using the passive Auxiliary Channel Analyzer.
Attached are both logs, and an html presenting the side by side comparison.
Issue have been reported to firmware provider.
Julien,
Hi,
I am using kernel 4.14.98 for my testing.
Can you provide the kernel version used and the hdp firmware version used for your testing ?
I haven't reproduced the unrecoverable issue, using your patches and the same command:
You testing seems to show that CDN_API_DPTX_GetLastI2cStatus correctly returns when performing a read. Which does not on my side.
Thanks,
Stan
Hi,
While looking to solve our link training issue. We are testing accessing the I2C bus via the Aux channel on the DisplayPort Link.
The IMX HDP driver does not seems to support I2C access.
root@quicksilver:~# i2cget -y -a imx_dp_aux 0x50
[ 315.523510] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0
[ 315.529758] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1
[ 315.535998] dp_aux_transfer: only native messages supported
[ 315.541610] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0
Error: Read failed
How can we get I2C bus access via the Aux Channel ?
Are the CDN_API_DPTX_I2C_Read and CDN_API_DPTX_I2C_Write API functional ?
Regards,
Stan
root@imx8mqevk:~# i2cget -y imx_dp_aux 0x50[ 297.683583] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 297.689952] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 297.697107] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00x6eroot@imx8mqevk:~# i2cget -y imx_dp_aux 0x50[ 317.555734] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 317.562023] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 317.569181] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00x00root@imx8mqevk:~# hexdump -C /sys/class/drm/card0-DP-1/edid00000000 00 ff ff ff ff ff ff 00 09 d1 1b 80 45 54 00 00 |............ET..|00000010 13 1b 01 04 a5 35 1e 78 3a 0c d5 a9 55 4c a1 25 |.....5.x:...UL.%|00000020 0d 50 54 a5 6b 80 d1 c0 b3 00 a9 c0 81 80 81 00 |.PT.k...........|00000030 81 c0 01 01 01 01 56 5e 00 a0 a0 a0 29 50 30 20 |......V^....)P0 |00000040 35 00 0f 28 21 00 00 1a 00 00 00 ff 00 43 35 48 |5..(!........C5H|00000050 30 37 35 34 38 30 31 39 0a 20 00 00 00 fd 00 32 |07548019. .....2|00000060 4c 1e 59 1b 04 11 00 f0 f8 38 f0 3c 00 00 00 fc |L.Y......8.<....|00000070 00 42 65 6e 51 20 4c 43 44 0a 20 20 20 20 01 98 |.BenQ LCD. ..|00000080 02 03 22 71 4f 90 1f 05 14 04 13 03 12 02 11 01 |.."qO...........|00000090 07 16 15 06 23 09 17 07 83 01 00 00 65 6e 0c 00 |....#.......en..|000000a0 10 00 8c 0a d0 8a 20 e0 2d 10 10 3e 96 00 0f 28 |...... .-..>...(|000000b0 21 00 00 18 01 1d 00 72 51 d0 1e 20 6e 28 55 00 |!......rQ.. n(U.|000000c0 0f 28 21 00 00 1e 01 1d 00 bc 52 d0 1e 20 b8 28 |.(!.......R.. .(|000000d0 55 40 0f 28 21 00 00 1e 8c 0a d0 90 20 40 31 20 |U@.(!....... @1 |000000e0 0c 40 55 00 0f 28 21 00 00 18 00 00 00 00 00 00 |.@U..(!.........|000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6e |...............n|root@imx8mqevk:~# i2cget -y imx_dp_aux 0x50 0[ 28.073775] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0[ 28.080288] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1[ 28.086891] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0Error: Read failedroot@imx8mqevk:~# i2cget -y imx_dp_aux 0x50[ 30.982125] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 30.988583] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 30.995156] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00x01root@imx8mqevk:~# i2cget -y imx_dp_aux 0x50[ 32.526129] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 32.532776] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 32.539351] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00xff
root@imx8mqevk:~#root@imx8mqevk:~# i2cget -y imx_dp_aux 0x50 0[ 366.399798] [drm] dp_aux_transfer() r.resp 80 0[ 381.038852] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0[ 381.050299] [drm] dp_aux_transfer() w.resp 80 0[ 381.050304] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1[ 381.061604] [drm] dp_aux_transfer() w.resp 80 1[ 381.061609] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 381.072757] [drm] dp_aux_transfer() r.resp 80 0[ 381.072761] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 381.083942] [drm] dp_aux_transfer() r.resp 80 1[ 381.083946] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00x01root@imx8mqevk:~# i2cget -y imx_dp_aux 0x50 0[ 381.095223] [drm] dp_aux_transfer() r.resp 80 0m[ 382.487058] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0[ 382.498498] [drm] dp_aux_transfer() w.resp 80 0m[ 382.498503] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1[ 382.509901] [drm] dp_aux_transfer() w.resp 80 1m[ 382.509905] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 382.521176] [drm] dp_aux_transfer() r.resp 80 0m[ 382.521179] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 382.532416] [drm] dp_aux_transfer() r.resp 80 1m[ 382.532419] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00x01root@imx8mqevk:~# i2cget -y imx_dp_aux 0x50 7[ 382.543666] [drm] dp_aux_transfer() r.resp 80 0m[ 385.649929] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0[ 385.661136] [drm] dp_aux_transfer() w.resp 80 0m[ 385.661141] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1[ 385.672369] [drm] dp_aux_transfer() w.resp 80 1m[ 385.672372] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 385.683601] [drm] dp_aux_transfer() r.resp 80 0m[ 385.683605] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 385.694798] [drm] dp_aux_transfer() r.resp 80 1m[ 385.694802] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00x01root@imx8mqevk:~# i2cget -y imx_dp_aux 0x50 8[ 385.706000] [drm] dp_aux_transfer() r.resp 80 0m[ 387.761930] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0[ 387.773195] [drm] dp_aux_transfer() w.resp 80 0m[ 387.773199] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x1[ 387.784482] [drm] dp_aux_transfer() w.resp 80 1m[ 387.784486] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 387.795696] [drm] dp_aux_transfer() r.resp 80 0m[ 387.795699] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x1[ 387.806997] [drm] dp_aux_transfer() r.resp 80 1m[ 387.807001] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x00x13
root@quicksilver:~#root@quicksilver:~# i2cget -y imx_dp_aux 0x50 0[ 60.808203] [drm] dp_aux_transfer() msg->request 0x4 msg->size 0x0[ 62.311442] [drm] dp_aux_transfer() msg->request 0x0 msg->size 0x0Error: Read failedroot@quicksilver:~# i2cget -y imx_dp_aux 0x50[ 65.223561] [drm] dp_aux_transfer() msg->request 0x5 msg->size 0x0[ 66.727439] [drm] dp_aux_transfer() msg->request 0x1 msg->size 0x0Error: Read failedroot@quicksilver:~# dd if=/dev/drm_dp_aux1 bs=1 skip=$((0x202)) count=1 status=none | od -An -d[ 91.148286] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 92.652054] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 94.156050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 95.660051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 103.180050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 104.684051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 106.188050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 107.692049] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 109.196049] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 110.700051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 112.204051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 113.708049] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 115.212050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 116.716051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 118.220049] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 119.724050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 121.228051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 122.732051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 124.236050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 125.740050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 127.244050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 128.748049] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 130.252049] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 131.756051] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 133.260052] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 134.764050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 136.268050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1[ 137.772050] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1dd: error reading '/dev/drm_dp_aux1': Input/output error
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX 10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX 20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
for imx8qm, I don't know how you change the source code and what display you use, if you just want to change the lane, maybe you can try the dts file, for imx8M, maybe you can try to use“ i2cset -f -y 2 0x0b 0x44 0x02 0x00 sp”
Hi,
Our goal is to use the iMX8 DisplayPort but using only a single lane.
We have performed initial testing on the iMX8MQ EVK board.
Connection to a display was successful using all 4 lanes. When using a single lane ( adapter were used to only have AUX and 1 link lane ), the link training failed.
The driver was patch as to support using only a limited number of lanes ( the number of lanes was reduces and the display mode were filtered to only those supported by the number of lanes selected ).
On the iMX8MQ EVK, the above was functional. The 2K display was only using 1280x800 resolution and audio was playing.
On the iMX8QM, using the same modification to the driver, the system fails to establish link training.
[ 7.082689] [drm] CDN_API_General_Write_* ... setting LANES_CONFIG C6
[ 7.091756] [drm] AFE_init
[ 7.094489] [drm] deasserted reset
[ 7.098168] PHY_PMA_CMN_CTRL2 = 1
[ 7.101551] PHY_PMA_CMN_CTRL1 = 3b
[ 7.137349] TX_ANA_CTRL_REG_1 ffff)
[ 7.140901] TX_ANA_CTRL_REG_2 30f)
[ 7.144369] TX_ANA_CTRL_REG_3 0)
[ 7.147661] TX_ANA_CTRL_REG_4 1001)
[ 7.151216] TX_ANA_CTRL_REG_5 0)
[ 7.154452] [drm] AFE_power exit
[ 7.157694] [drm] CDN_API_DPTX_SetVideo_blocking (ret = 0)
[ 7.163451] i2c i2c-6: of_i2c: modalias failure on /hdmi@56268000/port@0
[ 7.170162] i2c i2c-6: Failed to create I2C device for /hdmi@56268000/port@0
[ 7.177231] [drm] Failed to get HDCP config - using HDCP 2.2 only
[ 7.183346] [drm] Failed to initialize HDCP
[ 7.187906] [drm] hdmi-audio-codec driver bound to HDMI
[ 7.193147] imx-drm display-subsystem: bound 56268000.hdmi (ops imx_hdp_imx_ops)
[ 7.200818] nwl-mipi-dsi 57228000.mipi_dsi_bridge: [drm:nwl_dsi_host_attach] lanes=4, format=0x0 flags=0x801
[ 7.210673] imx-drm display-subsystem: bound mipi_dsi@57228000 (ops imx_nwl_dsi_component_ops)
[ 7.219395] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 7.227250] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x3
[ 7.233681] [drm] DP link revision: 0x12
[ 7.237607] [drm] DP link rate: 2700 Mbps
[ 7.241626] [drm] DP link number of lanes: 4
[ 7.245901] [drm] DP link capabilities: 0x1
[ 7.250095] [drm] DP link lanes limited to 1
[ 7.278948] [drm] dp_get_edid_block (ret = 0) block 0
[ 7.308571] [drm] dp_get_edid_block (ret = 0) block 1
[ 7.313636] i.mx8-hdp 56268000.hdmi: 0,ff,ff,ff,ff,ff,ff,0
[ 7.327250] [drm] AFE_init
[ 7.327269] [drm] deasserted reset
[ 7.327663] PHY_PMA_CMN_CTRL2 = 1
[ 7.327727] PHY_PMA_CMN_CTRL1 = 3b
[ 7.349830] TX_ANA_CTRL_REG_1 ffff)
[ 7.349892] TX_ANA_CTRL_REG_2 30f)
[ 7.349954] TX_ANA_CTRL_REG_3 0)
[ 7.350018] TX_ANA_CTRL_REG_4 1001)
[ 7.350080] TX_ANA_CTRL_REG_5 0)
[ 7.350082] [drm] AFE_power exit
[ 7.350098] [drm] CDN_API_DPTX_SetVideo_blocking (ret = 0)
[ 7.350099] [drm] dp_mode_set()
[ 7.350104] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 7.350319] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x6
[ 7.350587] [drm] DP link id: , 0x0 0x0 0x0 0x0 0x0 0x0
[ 7.350589] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x1
[ 7.350802] [drm] dp_aux_transfer() msg->request 0x9 msg->size 0x3
[ 7.351039] [drm] DP revision: 0x12
[ 7.351042] [drm] DP rate: 2700 Mbps
[ 7.351043] [drm] DP number of lanes: 4
[ 7.351045] [drm] DP capabilities: 0x1
[ 7.351046] [drm] DP actual number of lanes: 1
[ 7.351049] [drm] DP actual link rate: 0xa
[ 7.353646] [drm] AFE_init
[ 7.353668] [drm] deasserted reset
[ 7.354176] PHY_PMA_CMN_CTRL2 = 1
[ 7.354239] PHY_PMA_CMN_CTRL1 = 3b
[ 7.376328] TX_ANA_CTRL_REG_1 ffff)
[ 7.376391] TX_ANA_CTRL_REG_2 30f)
[ 7.376455] TX_ANA_CTRL_REG_3 0)
[ 7.376518] TX_ANA_CTRL_REG_4 1001)
[ 7.376581] TX_ANA_CTRL_REG_5 0)
[ 7.376583] [drm] AFE_power exit
[ 7.376596] [drm] CDN_API_DPTX_SetVideo_blocking (ret = 0)
[ 7.376629] [drm] CDN_API_DPTX_SetHostCap_blocking (ret = 0)
[ 7.377834] [drm] CDN_API_DPTX_Set_VIC_blocking (ret = 0)
[ 7.377851] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) start
[ 7.379642] [drm] INFO: Full link training started
[ 7.383713] [drm] INFO: Full link training started
[ 7.385396] [drm] ERROR: Clock recovery phase failed
[ 7.385411] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) stop
[ 7.395425] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) start
[ 7.397212] [drm] INFO: Full link training started
[ 7.401370] [drm] INFO: Full link training started
[ 7.403049] [drm] ERROR: Clock recovery phase failed
[ 7.403064] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) stop
[ 7.413078] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) start
[ 7.414951] [drm] INFO: Full link training started
[ 7.418945] [drm] INFO: Full link training started
[ 7.420628] [drm] ERROR: Clock recovery phase failed
[ 7.420642] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) stop
[ 7.429177] [drm] HDMI/DP Cable Plug In
[ 7.430658] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) start
[ 7.432445] [drm] INFO: Full link training started
[ 7.436437] [drm] INFO: Full link training started
[ 7.438117] [drm] ERROR: Clock recovery phase failed
[ 7.438132] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) stop
[ 7.448146] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) start
[ 7.449927] [drm] INFO: Full link training started
[ 7.454002] [drm] INFO: Full link training started
[ 7.455686] [drm] ERROR: Clock recovery phase failed
[ 7.455701] [drm] CDN_API_DPTX_TrainingControl_* (ret = 0) stop
[ 7.466968] [drm] link status 0x00 0x00 0x00 0x00 0x03 0x00
[ 7.466972] [drm] Link is bad - need to restart training
What should be the lanes mapping configuration for the iMX8QM ? Where is the lanes mapping configuration documented ?