[Gta04-owner] Fighting DRM

H. Nikolaus Schaller hns at goldelico.com
Sun Jun 24 18:12:46 CEST 2018


Hi Josua,

> Am 24.06.2018 um 17:42 schrieb Josua Mayer <josua.mayer97 at gmail.com>:
> 
> By updating drm_hwcomposer to the last version that did *not* use the
> Composer API version 2, thus requiring an update at least to
> libhardware, and by cherry-picking two commits I have gotten rid of the
> error message about not getting the connector.
> Turns out that a really small, and hidden change made the difference:
> drm_hwcomposer was siltering all connectors by their type for internal
> or external. This worked by listing specific types as internal, and all
> others are regarded external.
> Because the connector is of type uknown for omapdss->dispc, it was
> skipped by drm_hwcomposer.

Ok, it is as usual a tiny bit of change which breaks everything :)

> 
> But after solving this problem, yet another one appears.
> First, a promising log:
> 06-24 15:18:01.580  1953  1953 D libEGL  : Emulator without GPU support
> detected. Fallback to software renderer.
> 06-24 15:18:01.587  1953  1953 D libEGL  : loaded
> /system/lib/egl/libGLES_android.so
> 06-24 15:18:01.779  1953  1953 E gralloc : failed to put fb info
> 06-24 15:18:01.779  1953  1953 W gralloc : page flipping not supported
> (yres_virtual=640, requested=1280)
> 06-24 15:18:01.779  1953  1953 I gralloc : using (fd=12)
> 06-24 15:18:01.779  1953  1953 I gralloc : id           = omapdrm
> 06-24 15:18:01.779  1953  1953 I gralloc : xres         = 480 px
> 06-24 15:18:01.779  1953  1953 I gralloc : yres         = 640 px
> 06-24 15:18:01.779  1953  1953 I gralloc : r            = 16:8
> 06-24 15:18:01.779  1953  1953 I gralloc : g            =  8:8
> 06-24 15:18:01.779  1953  1953 I gralloc : b            =  0:8
> 06-24 15:18:01.779  1953  1953 I gralloc : width        = 76 mm
> (160.421051 dpi)
> 06-24 15:18:01.779  1953  1953 I gralloc : height       = 102 mm
> (159.372543 dpi)
> 06-24 15:18:01.779  1953  1953 I gralloc : refresh rate = 60.00 Hz
> 06-24 15:18:01.788  1953  1953 E hwc-drm-plane: Could not get rotation
> property
> 06-24 15:18:01.789  1953  1953 I hwc-drm-plane: Could not get alpha property
> 06-24 15:18:01.791  1953  1953 E hwc-drm-plane: Could not get rotation
> property
> 06-24 15:18:01.791  1953  1953 I hwc-drm-plane: Could not get alpha property
> 06-24 15:18:01.793  1953  1953 E hwc-drm-plane: Could not get rotation
> property
> 06-24 15:18:01.793  1953  1953 I hwc-drm-plane: Could not get alpha property
> 06-24 15:18:01.796  1953  1953 F libc    : Fatal signal 11 (SIGSEGV),
> code 1, fault addr 0xc in tid 1953 (surfaceflinger)
> 06-24 15:18:01.799  1953  1987 E cutils-trace: Error opening trace file:
> Permission denied (13)
> 06-24 15:18:01.799  1953  1987 W hwc-gl-worker:
> EGL_ANDROID_native_fence_sync extension not supported
> 06-24 15:18:01.800  1953  1987 E libEGL  : eglMakeCurrent:813 error 3009
> (EGL_BAD_MATCH)
> 06-24 15:18:01.800  1953  1987 E hwc-gl-worker: Failed to make the
> OpenGL ES Context current: EGL_BAD_MATCH
> 06-24 15:18:01.800  1953  1987 E hwc-drm-display-compositor: Failed to
> initialize OpenGL compositor 1
> 06-24 15:18:01.800  1953  1987 E hwc-drm-compositor-worker: Failed to
> composite! 1
> 06-24 15:18:01.898  1550  1550 F DEBUG   : *** *** *** *** *** *** ***
> *** *** *** *** *** *** *** *** ***
> 06-24 15:18:01.899  1550  1550 F DEBUG   : Replicant Version:
> 'replicant-6.0'
> 06-24 15:18:01.899  1550  1550 F DEBUG   : Build fingerprint:
> 'replicant_gta04:6.0.1/MOI10E/eng.root.20180623.123530:eng/debug,test-keys'
> 06-24 15:18:01.899  1550  1550 F DEBUG   : Revision: '0'
> 06-24 15:18:01.899  1550  1550 F DEBUG   : ABI: 'arm'
> 06-24 15:18:01.899  1550  1550 F DEBUG   : pid: 1953, tid: 1953, name:
> surfaceflinger  >>> /system/bin/surfaceflinger <<<
> 06-24 15:18:01.899  1550  1550 F DEBUG   : signal 11 (SIGSEGV), code 1
> (SEGV_MAPERR), fault addr 0xc
> 06-24 15:18:01.905  1550  1550 F DEBUG   :     r0 b6648518  r1 bec49810 
> r2 00000000  r3 b6b060a8
> 06-24 15:18:01.905  1550  1550 F DEBUG   :     r4 b6648518  r5 b6b0e268 
> r6 b6648200  r7 bec49810
> 06-24 15:18:01.905  1550  1550 F DEBUG   :     r8 b6648210  r9 bec49810 
> sl bec4980c  fp 00000000
> 06-24 15:18:01.905  1550  1550 F DEBUG   :     ip b6314984  sp bec497d8 
> lr b62ff66b  pc b63046f0  cpsr 60070030
> 06-24 15:18:01.937  1550  1550 F DEBUG   :
> 06-24 15:18:01.937  1550  1550 F DEBUG   : backtrace:
> 06-24 15:18:01.937  1550  1550 F DEBUG   :     #00 pc 000166f0 
> /system/lib/hw/hwcomposer.drm.so
> (_ZN7android20DrmDisplayCompositor16QueueCompositionENSt3__110unique_ptrINS_21DrmDisplayCompositionENS1_14default_deleteIS3_EEEE+7)
> 06-24 15:18:01.937  1550  1550 F DEBUG   :     #01 pc 00011667 
> /system/lib/hw/hwcomposer.drm.so
> (_ZN7android13DrmCompositor16QueueCompositionENSt3__110unique_ptrINS_14DrmCompositionENS1_14default_deleteIS3_EEEE+114)
> 06-24 15:18:01.937  1550  1550 F DEBUG   :     #02 pc 0001089b 
> /system/lib/hw/hwcomposer.drm.so
> (_ZN7android12DrmResources20SetDisplayActiveModeEiRKNS_7DrmModeE+110)
> 06-24 15:18:01.937  1550  1550 F DEBUG   :     #03 pc 0001b161 
> /system/lib/hw/hwcomposer.drm.so
> (_ZN7androidL21hwc_set_active_configEP21hwc_composer_device_1ii+276)
> 06-24 15:18:01.938  1550  1550 F DEBUG   :     #04 pc 0001c303 
> /system/lib/hw/hwcomposer.drm.so
> (_ZN7androidL15hwc_device_openEPK11hw_module_tPKcPP11hw_device_t+366)
> 06-24 15:18:01.938  1550  1550 F DEBUG   :     #05 pc 00027941 
> /system/lib/libsurfaceflinger.so
> (_ZN7android10HWComposer13loadHwcModuleEv+64)
> 06-24 15:18:01.938  1550  1550 F DEBUG   :     #06 pc 0002763d 
> /system/lib/libsurfaceflinger.so
> (_ZN7android10HWComposerC1ERKNS_2spINS_14SurfaceFlingerEEERNS0_12EventHandlerE+228)
> 06-24 15:18:01.938  1550  1550 F DEBUG   :     #07 pc 0001bc29 
> /system/lib/libsurfaceflinger.so (_ZN7android14SurfaceFlinger4initEv+208)
> 06-24 15:18:01.938  1550  1550 F DEBUG   :     #08 pc 00000ed5 
> /system/bin/surfaceflinger
> 06-24 15:18:01.938  1550  1550 F DEBUG   :     #09 pc 000173d9 
> /system/lib/libc.so (__libc_init+44)
> 06-24 15:18:01.938  1550  1550 F DEBUG   :     #10 pc 00000d90 
> /system/bin/surfaceflinger
> 
> So now we arrived at the core of drm_hwcompositor. It wants to use
> OpenGL, and can't!
> I do not believe investigating this any further is useful, read this
> patch description:
> https://patchwork.kernel.org/patch/10381461/
> "... was only ever well tested on closed stacks. It also only supports
> GLES3.x ..."
> 
> I don't know what is required to have maybe llvmpipe based OpenGL
> available. If it is easy to get, we can try enabling this feature.
> In the meantime we should fall back to the framebuffer based default.

I have no idea here. Since I don't know if Wolfgang is reading this
list actively, I have added him.

BR,
Nkolaus


> 
> For reference: I picked drm_hwcomposer commit
> 9a15678ca61c9707ff7b3955225d65ddd2fa031a,
> and cherry-picked:
> commit 2bb1ec63b8e460f2e559241c37e43c8da585e08a (HEAD ->
> replicant-6.0-gta04)
> Author: Robert Foss <robert.foss at collabora.com>
> Date:   Wed Nov 1 12:50:04 2017 -0500
> 
>     drm_hwcomposer: Add HDMI connector as a valid type
>    
>     Accept DRM_MODE_CONNECTOR_HDMIA connector type.
>    
>     Look for primary DrmConnector amongst external connectors
>     after looking for primary amongst internal ones first.
>    
>     Signed-off-by: Robert Foss <robert.foss at collabora.com>
>     Signed-off-by: Rob Herring <robh at kernel.org>
> 
> commit dc2326fefa128f37ac64d76361eaa7d25bde36be
> Author: Rob Herring <robh at kernel.org>
> Date:   Wed Nov 1 11:21:48 2017 -0500
> 
>     drm_hwcomposer: correct handling of DRM_MODE_ROTATE_0
>    
>     If the rotation property is supported for a plane, then the rotation
>     value must be non-zero. For the case of 0 degree rotation,
>     DRM_MODE_ROTATE_0 needs to be set.
>    
>     Signed-off-by: Rob Herring <robh at kernel.org>
> 
> commit a68d9dab1ad89fdc12a4977a5f4bc4fcc2abe118
> Author: Rob Herring <robh at kernel.org>
> Date:   Fri Oct 6 16:46:48 2017 -0500
> 
>     drm_hwcomposer: use upstream DRM_MODE_{ROTATE, REFLECT} defines
>    
>     The DRM_REFLECT_* and DRM_ROTATE_* defines were not upstream, but now
>     they are. Convert to using the upstream version which are defined as a
>     bit mask rather than a bit position.
>    
>     Signed-off-by: Rob Herring <robh at kernel.org>
>     Reviewed-by: Robert Foss <robert.foss at collabora.com>
> 
> Am 24.06.2018 um 14:58 schrieb Josua Mayer:
>> I have found that the problem is (luckily) not in the kernel. The
>> modeprint test application inside libdrm lists a connector for each
>> display, on both replicant and debian:
>> Starting test
>> Resources
>> 
>> count_connectors : 2
>> count_encoders   : 2
>> count_crtcs      : 2
>> count_fbs        : 0
>> 
>> Connector: 17-1
>>         id             : 30
>>         encoder id     : 29
>>         conn           : connected
>>         size           : 0x0 (mm)
>>         count_modes    : 1
>>         count_props    : 4
>>         props          : 1 2 5 6
>>         count_encoders : 1
>>         encoders       : 29
>> Mode: "480x640" 480x640 66
>> Connector: SVIDEO-1
>>         id             : 35
>>         encoder id     : 0
>>         conn           : unknown
>>         size           : 0x0 (mm)
>>         count_modes    : 1
>>         count_props    : 4
>>         props          : 1 2 5 6
>>         count_encoders : 1
>>         encoders       : 34
>> Mode: "720x574i" 720x574 50
>> ...
>> 
>> 
>> This output comes fomr a statically linked version of that test-case,
>> meaning it does *not* match the version of libdrm used by replicant.
>> So maybe that one is too old? The latest commit in external/libdrm is
>> from September 2015. I will try updating that component.
>> 
>> 
>> Am 23.06.2018 um 23:45 schrieb Josua Mayer:
>>> Greetings once again,
>>> 
>>> I have made some progress with drm_hwcomposer and finally debugged a
>>> crazy crash in surfaceflinger. The crash is related to a DRM connector
>>> that probably does not exist in kernel for the main display of the gta04.
>>> 
>>> So lets start with a log, and some inline comments:
>>> 01-01 09:11:24.354  2122  2122 I SurfaceFlinger: SurfaceFlinger is starting
>>> 01-01 09:11:24.359  2122  2122 I SurfaceFlinger: SurfaceFlinger's main
>>> thread ready to run. Initializing graphics H/W...
>>> 01-01 09:11:24.379  2122  2122 D libEGL  : Emulator without GPU support
>>> detected. Fallback to software renderer.
>>> 01-01 09:11:24.449  2122  2122 D libEGL  : loaded
>>> /system/lib/egl/libGLES_android.so
>>> 01-01 09:11:24.680  2122  2122 E gralloc : failed to put fb info
>>> This is harmless, gralloc tried to set the framebuffer to 480x1280 to
>>> allow for flipping, and failed.
>>> 
>>> 01-01 09:11:24.682  2122  2122 W gralloc : page flipping not supported
>>> (yres_virtual=640, requested=1280)
>>> 01-01 09:11:24.683  2122  2122 I gralloc : using (fd=12)
>>> 01-01 09:11:24.683  2122  2122 I gralloc : id           = omapdrm
>>> 01-01 09:11:24.683  2122  2122 I gralloc : xres         = 480 px
>>> 01-01 09:11:24.683  2122  2122 I gralloc : yres         = 640 px
>>> 01-01 09:11:24.683  2122  2122 I gralloc : xres_virtual = 480 px
>>> 01-01 09:11:24.683  2122  2122 I gralloc : yres_virtual = 640 px
>>> 01-01 09:11:24.683  2122  2122 I gralloc : bpp          = 32
>>> 01-01 09:11:24.683  2122  2122 I gralloc : r            = 16:8
>>> 01-01 09:11:24.683  2122  2122 I gralloc : g            =  8:8
>>> 01-01 09:11:24.683  2122  2122 I gralloc : b            =  0:8
>>> 01-01 09:11:24.683  2122  2122 I gralloc : width        = 76 mm
>>> (160.421051 dpi)
>>> 01-01 09:11:24.683  2122  2122 I gralloc : height       = 102 mm
>>> (159.372543 dpi)
>>> 01-01 09:11:24.683  2122  2122 I gralloc : refresh rate = 60.00 Hz
>>> 01-01 09:11:24.899  2122  2122 E hwc-drm-plane: Could not get rotation
>>> property
>>> 01-01 09:11:24.910  2122  2122 I hwc-drm-plane: Could not get alpha property
>>> 01-01 09:11:25.021  2122  2122 E hwc-drm-plane: Could not get rotation
>>> property
>>> 01-01 09:11:25.030  2122  2122 I hwc-drm-plane: Could not get alpha property
>>> 01-01 09:11:25.152  2122  2122 E hwc-drm-plane: Could not get rotation
>>> property
>>> 01-01 09:11:25.160  2122  2122 I hwc-drm-plane: Could not get alpha property
>>> these are harmless too, no rotation or alpha are assumed.
>>> 
>>> 01-01 09:11:25.207  2122  2140 E cutils-trace: Error opening trace file:
>>> Permission denied (13)
>>> 01-01 09:11:25.207  2122  2140 W hwc-gl-worker:
>>> EGL_ANDROID_native_fence_sync extension not supported
>>> 01-01 09:11:25.207  2122  2140 E libEGL  : eglMakeCurrent:813 error 3009
>>> (EGL_BAD_MATCH)
>>> 01-01 09:11:25.207  2122  2140 E hwc-gl-worker: Failed to make the
>>> OpenGL ES Context current: EGL_BAD_MATCH
>>> 01-01 09:11:25.207  2122  2140 E hwc-drm-display-compositor: Failed to
>>> initialize OpenGL compositor 1
>>> 01-01 09:11:25.207  2122  2140 E hwc-drm-compositor-worker: Failed to
>>> composite! 1
>>> 01-01 09:11:25.212  2122  2142 W hwc-gl-worker:
>>> EGL_ANDROID_native_fence_sync extension not supported
>>> 01-01 09:11:25.212  2122  2142 E libEGL  : eglMakeCurrent:813 error 3009
>>> (EGL_BAD_MATCH)
>>> 01-01 09:11:25.212  2122  2142 E hwc-gl-worker: Failed to make the
>>> OpenGL ES Context current: EGL_BAD_MATCH
>>> 01-01 09:11:25.212  2122  2142 E hwc-drm-display-compositor: Failed to
>>> initialize OpenGL compositor 1
>>> 01-01 09:11:25.212  2122  2142 E hwc-drm-compositor-worker: Failed to
>>> composite! 1
>>> 01-01 09:11:25.214  2122  2122 I SurfaceFlinger: Using composer version 1.4
>>> 01-01 09:11:25.215  2122  2122 E hwcomposer-drm: Failed to get connector
>>> for display 0
>>> Does this hint at a problem?
>>> 
>>> 01-01 09:11:25.216  2122  2122 E SurfaceFlinger: queryDisplayProperties:
>>> Invalid display config! -1
>>> This may be another one
>>> 
>>> 01-01 09:11:25.219  2122  2122 W SurfaceFlinger: no suitable EGLConfig
>>> found, trying a simpler query
>>> 01-01 09:11:25.229  2122  2122 W SurfaceFlinger: EGL_SLOW_CONFIG selected!
>>> 01-01 09:11:25.239  2122  2122 I SurfaceFlinger: EGL information:
>>> 01-01 09:11:25.239  2122  2122 I SurfaceFlinger: vendor    : Android
>>> 01-01 09:11:25.240  2122  2122 I SurfaceFlinger: version   : 1.4 Android
>>> META-EGL
>>> 01-01 09:11:25.240  2122  2122 I SurfaceFlinger: extensions:
>>> EGL_KHR_get_all_proc_addresses EGL_ANDROID_presentation_time
>>> EGL_KHR_swap_buffers_with_damage EGL_KHR_image_base EGL_KHR_fence_sync
>>> EGL_ANDROID_image_native_buffer
>>> 01-01 09:11:25.249  2122  2122 I SurfaceFlinger: Client API: OpenGL_ES
>>> 01-01 09:11:25.249  2122  2122 I SurfaceFlinger: EGLSurface: 8-8-8-8,
>>> config=0x4
>>> 01-01 09:11:25.252  2122  2122 I SurfaceFlinger: OpenGL ES informations:
>>> 01-01 09:11:25.252  2122  2122 I SurfaceFlinger: vendor    : Android
>>> 01-01 09:11:25.253  2122  2122 I SurfaceFlinger: renderer  : Android
>>> PixelFlinger 1.4
>>> 01-01 09:11:25.253  2122  2122 I SurfaceFlinger: version   : OpenGL
>>> ES-CM 1.0
>>> 01-01 09:11:25.254  2122  2122 I SurfaceFlinger: extensions:
>>> GL_EXT_debug_marker GL_OES_byte_coordinates GL_OES_fixed_point
>>> GL_OES_single_precision GL_OES_read_format
>>> GL_OES_compressed_paletted_texture GL_OES_draw_texture GL_OES_matrix_get
>>> GL_OES_query_matrix GL_OES_EGL_image GL_OES_EGL_sync
>>> GL_OES_compressed_ETC1_RGB8_texture GL_ARB_texture_compression
>>> GL_ARB_texture_non_power_of_two GL_ANDROID_user_clip_plane
>>> GL_ANDROID_vertex_buffer_object GL_ANDROID_generate_mipmap
>>> 01-01 09:11:25.254  2122  2122 I SurfaceFlinger: GL_MAX_TEXTURE_SIZE = 4096
>>> 01-01 09:11:25.254  2122  2122 I SurfaceFlinger: GL_MAX_VIEWPORT_DIMS = 4096
>>> 01-01 09:11:25.255  2122  2122 I SurfaceFlinger: Going to initialize
>>> connected, and primary displays.
>>> 01-01 09:11:25.255  2122  2122 I SurfaceFlinger: Initializing connected
>>> or primary display 0.
>>> I inserted these two log messages in SurfaceFlinger.cpp:init(), and then
>>> many markers (redacted in this log)
>>> 01-01 09:11:25.268  2122  2122 I SurfaceFlinger: MARKER 202
>>> And this is the last thing that happens before the crash. This marker is
>>> in HWComposer.cpp: getWidth(). The only thing that can go wrong here is
>>> accessing a pointer at index currentConfig, which is initialized to 0,
>>> and it does :(
>>> The call stack as follows:
>>> SurfaceFlinger.cpp: new FramebufferSurface(*mHwc, i, consumer);
>>> FramebufferSurface.cpp:
>>> mConsumer->setDefaultBufferSize(mHwc.getWidth(disp),  mHwc.getHeight(disp));
>>> HWComposer.cpp: return mDisplayData[disp].configs[currentConfig].width;
>>> 
>>> 01-01 09:11:25.275  2122  2122 F libc    : Fatal signal 11 (SIGSEGV),
>>> code 1, fault addr 0x0 in tid 2122 (surfaceflinger)
>>> 
>>> 
>>> So HWComposer assumes that mDisplayData[disp].configs exists and has at
>>> least 1 entry. But for some reason, in this very case it is a
>>> null-pointer. How can this be? The list of configurations is filled in
>>> HWComposer.cpp: queryDisplayProperties.
>>> We have already received a hint that something might have gone wrong,
>>> however there is still a chance to find a configuration now by asking
>>> the drm_hwcomposer with a call to mHwc->getDisplayAttributes. This call
>>> is done in a for loop, but *only* if we get past a call to
>>> mHwc->getDisplayConfigs.
>>> This one translates to hwc_get_display_configs in drm_hwcomposer>
>>> hwcomposer.cpp.
>>> And there we find a familiar message in the code:
>>> ALOGE("Failed to get connector for display %d", display);
>>> 
>>> So, we found the culprit! For some reason
>>> ctx->drm.GetConnectorForDisplay(display) has failed.
>>> Why? Well, I'd think the answer is in the DRM subsystem of the kernel. I
>>> did a little googling, but couldn't come to any conclusions.
>>> The only related thing I noticed is that every connector has a type, but
>>> it is Unknown for dispc displays in omapdss.
>>> However I was not able to confirm if that would prevent it from being
>>> returned as a connector.
>>> Or maybe there just is no such thing called a connector in this setup?
>>> 
>>> Anyhow this is where I can't continue.
>>> 
>>> Nikolaus, you hinted that some xorg drivers have problems too. With a
>>> little luck the modesetting driver is one of those, and just maybe it
>>> suffers from teh same issue? I think this is worth investigating at some
>>> point.
>>> I will now see if I can hack the hwcomposer library to grab display
>>> properties from the framebuffer device instead. There is already code to
>>> do that, but ggated by an if-clause to prefer calls to drm_hwcomposer.
>>> 
>>> br
>>> Josua Mayer
>>> 
> 
> _______________________________________________
> Gta04-owner mailing list
> Gta04-owner at goldelico.com
> http://lists.goldelico.com/mailman/listinfo.cgi/gta04-owner



More information about the Gta04-owner mailing list