-----邮件原件----- 发件人: Scott Bambrough [mailto:scott.bambrough@linaro.org] 发送时间: 2015年3月27日 7:07 收件人: Benjamin Gaignard; dev@lists.96boards.org 抄送: Tom Gall; Guodong Xu; Lars-Peter Clausen; George Grey; Dan zhao 主题: Re: [Dev] X fails to load on current alip image....
On Thu, Mar 26, 2015 at 3:03 PM, Benjamin Gaignard benjamin.gaignard@linaro.org wrote:
It could be simple call to an i2c adapter. For example it is done like this in sti drm/kms driver: https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/tree/ drivers/gpu/drm/sti/sti_hdmi.c?id=refs/tags/next-20150326#n695
Benjamin
Le jeudi 26 mars 2015, Scott Bambrough scott.bambrough@linaro.org a écrit :
We have no hdmi ddc client in the kernel. I suspect this is the patches that HiSilicon needs to give us Guodong.
Scott
On Thu, Mar 26, 2015 at 1:58 PM, Tom Gall tgall@gentoo.org wrote:
FYI
Advise from Benjamin.
Begin forwarded message:
Date: March 26, 2015 at 8:57:34 AM PDT Subject: Re: [Dev] X fails to load on current alip image.... From: Benjamin Gaignard benjamin.gaignard@linaro.org To: Tom Gall tgall@gentoo.org
Hi,
not sound familiar but I think that the hdmi ddc client isn't set on the correct i2c bus so EDID can't be retrieved.
I suggest to check if the hdmi ddc is set on the correct i2c bus and if the dispaly is well connected.
Regards, Benjamin
2015-03-26 16:12 GMT+01:00 Tom Gall tgall@gentoo.org:
Hi Benjamin,
Does the drm error below look familiar?
[ 2.412661] [drm:hisi_dsi_probe] *ERROR* failed to find slave encoder i2c client
Is that a real error or is there something else to look at?
Thanks! Tom
Begin forwarded message:
From: Scott Bambrough scott.bambrough@linaro.org Subject: [Dev] X fails to load on current alip image.... To: dev@lists.96boards.org Date: March 26, 2015 at 7:21:51 AM PDT
I had a look at this failure, debugged this a bit...
Started with latest snapshot (135), X fails to load.
Rebuild kernel with the latest git, hikey-mali branch Rebuild boot and system images using latest kernel, setup networking via eth0 by default so I can ssh in. Flash boot and system partitions using rebuilt images. Reboot (1)
Looking into Xorg.0.log see the following error:
[ 60.310] (==) RandR enabled [ 60.333] (II) SELinux: Disabled on system [ 60.336] (II) AIGLX: Screen 0 is not DRI2 capable [ 60.336] (EE) AIGLX: reverting to software rendering [ 60.336] (EE) AIGLX error: dlopen of /usr/lib/aarch64-linux-gnu/dri/swrast_dri.so failed (/usr/lib/aarch64-linux-gnu/dri/swrast_dri.so: cannot open shared object file: No such file or directory) [ 60.336] (EE) GLX: could not load software renderer [ 60.336] (II) GLX: no usable GL providers found for screen 0 [ 60.426] (II) config/udev: Adding drm device (/dev/dri/card0) [ 60.426] (II) xfree86: Adding drm device (/dev/dri/card0) [ 60.429] (EE) /dev/dri/card0: failed to set DRM interface version 1.4: Invalid argument [ 60.590] (EE) Server terminated successfully (0). Closing log file.
Solve that error by installing the following package: # apt-get install libgl1-mesa-dri
Reboot (2) Missing shared library is found.
[ 43.500] (==) RandR enabled [ 43.523] (II) SELinux: Disabled on system [ 43.526] (II) AIGLX: Screen 0 is not DRI2 capable [ 43.526] (EE) AIGLX: reverting to software rendering [ 44.621] (II) AIGLX: Loaded and initialized swrast [ 44.621] (II) GLX: Initialized DRISWRAST GL provider for screen 0 [ 44.970] (II) config/udev: Adding drm device (/dev/dri/card0) [ 44.971] (II) xfree86: Adding drm device (/dev/dri/card0) [ 44.973] (EE) /dev/dri/card0: failed to set DRM interface version 1.4: Invalid argument
Why the error "/dev/dri/card0: failed to set DRM interface version 1.4: Invalid argument"? dmesg output has the following error
[ 44.985050] ------------[ cut here ]------------ [ 44.985082] WARNING: CPU: 1 PID: 1453 at /media/scottb/linaro/hikey/source/linux/drivers/gpu/drm/drm_ioctl.c :143 drm_setversion+0x168/0x16c() [ 44.985095] No drm_driver.set_busid() implementation provided by hisi_drm_driver. Use drm_dev_set_unique() to set the unique name explicitly. [ 44.985100] Modules linked in: [ 44.985106] btwilink bluetooth st_drv mali wl18xx wlcore mac80211 cfg80211 rfkill wlcore_sdio [ 44.985136] CPU: 1 PID: 1453 Comm: Xorg Tainted: G W 3.18.0linaro-hikey+ #3 [ 44.985141] Call trace: [ 44.987598] [<ffffffc000088538>] dump_backtrace+0x0/0x124 [ 44.987606] [<ffffffc00008866c>] show_stack+0x10/0x1c [ 44.987616] [<ffffffc000806bfc>] dump_stack+0x74/0xb8 [ 44.987625] [<ffffffc0000afdb4>] warn_slowpath_common+0x90/0xb8 [ 44.987631] [<ffffffc0000afe28>] warn_slowpath_fmt+0x4c/0x58 [ 44.987639] [<ffffffc0004eaec4>] drm_setversion+0x164/0x16c [ 44.987646] [<ffffffc0004eaaa0>] drm_ioctl+0x254/0x4d0 [ 44.987656] [<ffffffc0001d216c>] do_vfs_ioctl+0x368/0x5b0 [ 44.987663] [<ffffffc0001d2434>] SyS_ioctl+0x80/0x98 [ 44.987669] ---[ end trace bf426acc001551e5 ]---
Solve that error by applying the following patch:
diff --git a/drivers/gpu/drm/hisilicon/hisi_drm_drv.c b/drivers/gpu/drm/hisilicon/hisi_drm_drv.c index 987c530..b646bab 100644 --- a/drivers/gpu/drm/hisilicon/hisi_drm_drv.c +++ b/drivers/gpu/drm/hisilicon/hisi_drm_drv.c @@ -147,6 +147,7 @@ static struct drm_driver hisi_drm_driver = { | DRIVER_PRIME, .load = hisi_drm_load, .unload = hisi_drm_unload,
- .set_busid = drm_platform_set_busid, .fops = &hisi_drm_fops, .name = "hisi-drm", .desc = "Hisilicon Terminal SoCs DRM Driver",
Rebuild kernel Rebuild boot partition image with latest kernel and flash to the boot partition of the HiKey Reboot (3)
dmesg has the following messages from DRM:
linaro@linaro-alip:~/sdcard/xwork/3$ grep drm dmesg.txt [ 2.410636] calling drm_core_init+0x0/0x12c @ 1 [ 2.410705] [drm] Initialized drm 1.1.0 20060810 [ 2.410720] initcall drm_core_init+0x0/0x12c returned 0 after 69 usecs [ 2.410742] calling hisi_drm_platform_driver_init+0x0/0x20 @ 1 [ 2.411790] [drm] Initialized hisi-drm 1.0.0 20141224 on minor 0 [ 2.411893] initcall hisi_drm_platform_driver_init+0x0/0x20 returned 0 after 1108 usecs [ 2.412661] [drm:hisi_dsi_probe] *ERROR* failed to find slave encoder i2c client [ 3.546316] [drm] HDMI: new_status=1,old_status=2,hpd=1,dpms=3 [ 3.602363] hisi-drm smb:display-subsystem: DSI-1: EDID block 0 invalid. [ 3.602469] [drm] HDMI: mode=0,format_422=0,format_ycbcr=0 [ 3.603762] [drm] May has one empty edid block! [ 3.624268] [drm] mipi_init,pixcel_clk=75,dphy_freq=641,hsa=42,hbp=117,hline=1760 [ 3.624270] [drm] mipi_init , exit success! [ 3.654185] hisi-drm smb:display-subsystem: fb0: frame buffer
device
[ 3.654192] hisi-drm smb:display-subsystem: registered panic notifier [ 43.134240] [drm] phystopstateclklane is not ready. [ 43.134350] [drm] mipi_init,pixcel_clk=75,dphy_freq=641,hsa=42,hbp=117,hline=1760 [ 43.134350] [drm] mipi_init , exit success!
Xorg.0.log error setting DRM version is gone.
[ 43.134] (==) RandR enabled [ 43.158] (II) SELinux: Disabled on system [ 43.161] (II) AIGLX: Screen 0 is not DRI2 capable [ 43.161] (EE) AIGLX: reverting to software rendering [ 43.173] (II) AIGLX: Loaded and initialized swrast [ 43.173] (II) GLX: Initialized DRISWRAST GL provider for screen 0
Why do these errors occur? [ 2.412661] [drm:hisi_dsi_probe] *ERROR* failed to find slave encoder i2c client [ 3.602363] hisi-drm smb:display-subsystem: DSI-1: EDID block 0 invalid. [ 43.134240] [drm] phystopstateclklane is not ready.
Out of my depth here, punting to HiSilicon engineers. Guodong can you take up these errors with HiSilicon please.
Attached logs (dmesg, Xorg.0.log) from after every reboot. In text above you will see: Reboot (x) -- logs are in directory x if the tarball
Also attached script (build.sh) I use to rebuild the images for flashing. It will need some rework as it is pretty custom to my system.
Scott
-- Scott Bambrough Technical Director, Member Services Linaro
-- Benjamin Gaignard
Graphic Working Group
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
-- Scott Bambrough Technical Director, Member Services Linaro
--
Benjamin Gaignard
Graphic Working Group
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
Yeah, I realized that afterwards. Seems like the Analog Device code in drivers/gpu/drm/i2c/adv7533.c drivers/media/i2c/adv7533.c registers one.
See: static int adv7533_probe(struct i2c_client *i2c, const struct i2c_device_id *id) adv7533->i2c_main = i2c; adv7533->i2c_edid = i2c_new_dummy(i2c->adapter, edid_i2c_addr >> 1); if (!adv7533->i2c_edid) return -ENOMEM;
If I grep through the dmesg output:
scottb@eagle:~/tmp/logs/3$ grep "adv7533|drm" dmesg.txt [ 2.410636] calling drm_core_init+0x0/0x12c @ 1 [ 2.410705] [drm] Initialized drm 1.1.0 20060810 [ 2.410720] initcall drm_core_init+0x0/0x12c returned 0 after 69 usecs [ 2.410742] calling hisi_drm_platform_driver_init+0x0/0x20 @ 1 [ 2.411790] [drm] Initialized hisi-drm 1.0.0 20141224 on minor 0 [ 2.411893] initcall hisi_drm_platform_driver_init+0x0/0x20 returned 0 after 1108 usecs [ 2.412661] [drm:hisi_dsi_probe] *ERROR* failed to find slave encoder i2c client [ 2.420194] calling adv7533_init+0x0/0x24 @ 1 [ 2.420254] initcall adv7533_init+0x0/0x24 returned 0 after 44 usecs [ 3.546316] [drm] HDMI: new_status=1,old_status=2,hpd=1,dpms=3 [ 3.602363] hisi-drm smb:display-subsystem: DSI-1: EDID block 0 invalid. [ 3.602469] [drm] HDMI: mode=0,format_422=0,format_ycbcr=0 [ 3.603762] [drm] May has one empty edid block! [ 3.624268] [drm] mipi_init,pixcel_clk=75,dphy_freq=641,hsa=42,hbp=117,hline=1760 [ 3.624270] [drm] mipi_init , exit success! [ 3.654185] hisi-drm smb:display-subsystem: fb0: frame buffer device [ 3.654192] hisi-drm smb:display-subsystem: registered panic notifier [ 43.134240] [drm] phystopstateclklane is not ready. [ 43.134350] [drm] mipi_init,pixcel_clk=75,dphy_freq=641,hsa=42,hbp=117,hline=1760 [ 43.134350] [drm] mipi_init , exit success!
It appears the HiSilicon DRM driver is initialized, then the ADV7533. Could it just be the init order is wrong?
[ 2.412661] [drm:hisi_dsi_probe] *ERROR* failed to find slave encoder i2c client The above error occurs before the ADV7533 driver is initialized.
[ 3.602363] hisi-drm smb:display-subsystem: DSI-1: EDID block 0 invalid. [ 3.602469] [drm] HDMI: mode=0,format_422=0,format_ycbcr=0 [ 3.603762] [drm] May has one empty edid block!
The above errors stem from a call to: static int adv7533_get_modes(struct drm_encoder *encoder, struct drm_connector *connector)
[ 3.654185] hisi-drm smb:display-subsystem: fb0: frame buffer device [ 3.654192] hisi-drm smb:display-subsystem: registered panic notifier
These indicate the framebuffer is being created. These stem from a call to: static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, int preferred_bpp)
which is called from: bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
which is called from: static struct hisi_drm_fbdev *hisi_drm_fbdev_create(struct drm_device *dev, unsigned int preferred_bpp, unsigned int num_crtc, unsigned int max_conn_count)
Another thing I found odd is mipi_init seems to be called twice: Why?
[ 3.624268] [drm] mipi_init,pixcel_clk=75,dphy_freq=641,hsa=42,hbp=117,hline=1760 [ 3.624270] [drm] mipi_init , exit success!
[ 43.134350] [drm] mipi_init,pixcel_clk=75,dphy_freq=641,hsa=42,hbp=117,hline=1760 [ 43.134350] [drm] mipi_init , exit success!
mipi_init is called from: static int hisi_dsi_init(struct hisi_dsi *dsi)
which is called from: static int hisi_dsi_enable(struct hisi_dsi *dsi)
which is called from: static void hisi_drm_encoder_dpms(struct drm_encoder *encoder, int mode) when mode = DRM_MODE_DPMS_ON
There is a corresponding static int hisi_dsi_disable(struct hisi_dsi *dsi) called when mode is one of DRM_MODE_DPMS_STANDBY, DRM_MODE_DPMS_SUSPEND, DRM_MODE_DPMS_OFF
It does nothing however:
static int hisi_dsi_disable(struct hisi_dsi *dsi) { DRM_DEBUG_DRIVER("enter.\n"); DRM_DEBUG_DRIVER("exit success.\n"); return 0; }
[ 43.134240] [drm] phystopstateclklane is not ready. This error is from mipi_init. The first time through mipi_init it doesn't occur, it does on the second time though. Seems to indicate a problem with the clocks for the mipi dsi data lanes.
I really think we need to sort this out.
Scott
-- Scott Bambrough Technical Director, Member Services Linaro