Whats missing in my new FB DRM driver in ARC... waiting for console_lock to return
Carlos Palminha
CARLOS.PALMINHA at synopsys.com
Thu Jan 21 10:30:37 PST 2016
hi...
i just found that its blocking waiting for console_lock...
@vineet, alexey: i think that console_lock is architecture dependent right? Do you know any issue with console_lock for ARC?
On 21-01-2016 18:09, Carlos Palminha wrote:
> i made some progress in identifying the issue...
> When my driver calls drm_fb_helper_initial_config it seems DRM blocks waiting for register_framebuffer to return.
> The sequence is drm_fb_helper_initial_config->drm_fb_helper_single_fb_probe->register_framebuffer.
>
> Its strange because register_framebuffer function is just a mutex around do_register_framebuffer.
>
> Any clue?!
>
> On 20-01-2016 01:24, Xinliang Liu wrote:
>> On 20 January 2016 at 00:52, Carlos Palminha
>> <CARLOS.PALMINHA at synopsys.com> wrote:
>>> when i boot the kernel and connect the HDMI cable after booting i can retrieve 4 modes... :)
>>>
>>> if i boot linux with the HDMI cable inserted the kernel hangs.
>>
>> What's the hang kernel log. Is it a oops?
>>
>>> Possible relation with HPD?
>>
>> Yes, I think there might be something wrong with the HPD interrupt or
>> the EDID ready interrupt.
>> I do meet the similar issue before when I using the upstream adv7511
>> driver to enable adv7533.
>> I found that the HPD and EDID interrupt is not reliable.
>> In order to get modes stably, I have to add some delay like bellow:
>> --
>> --- a/drivers/gpu/drm/i2c/adv7511.c
>> +++ b/drivers/gpu/drm/i2c/adv7511.c
>> @@ -657,6 +657,8 @@ static int adv7511_get_modes(struct adv7511 *adv7511,
>> regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
>> ADV7511_POWER_POWER_DOWN, 0);
>> adv7511->current_edid_segment = -1;
>> + /* wait some time for edid is ready */
>> + msleep(200);
>> }
>>
>> edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511);
>> --
>>
>> Best,
>> -xinliang
>>
>>>
>>> Regards,
>>> C.Palminha
>>>
>>> # modetest -M drm-arcpgu -c
>>> Connectors:
>>> id encoder status type size (mm) modes encoders
>>> 21 0 connected HDMI-A 0x0 4 20
>>> modes:
>>> name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)
>>> 800x600 60 800 840 968 1056 600 601 605 628 flags: phsync, pvsync; type: driver
>>> 800x600 56 800 824 896 1024 600 601 603 625 flags: phsync, pvsync; type: driver
>>> 848x480 60 848 864 976 1088 480 486 494 517 flags: phsync, pvsync; type: driver
>>> 640x480 60 640 656 752 800 480 490 492 525 flags: nhsync, nvsync; type: driver
>>> props:
>>> 1 EDID:
>>> flags: immutable blob
>>> blobs:
>>>
>>> value:
>>> 2 DPMS:
>>> flags: enum
>>> enums: On=0 Standby=1 Suspend=2 Off=3
>>> value: 0
>>>
>>> #
>>>
>>> On 19-01-2016 16:03, Carlos Palminha wrote:
>>>> Hi Xiang,
>>>>
>>>> Its returning 0 modes... :(
>>>>
>>>> Regards,
>>>> C.Palminha
>>>>
>>>> # modetest -M drm-arcpgu -c
>>>> Connectors:
>>>> id encoder status type size (mm) modes encoders
>>>> 21 0 disconnected HDMI-A 0x0 0 20
>>>> props:
>>>> 1 EDID:
>>>> flags: immutable blob
>>>> blobs:
>>>>
>>>> value:
>>>> 2 DPMS:
>>>> flags: enum
>>>> enums: On=0 Standby=1 Suspend=2 Off=3
>>>> value: 0
>>>>
>>>> #
>>>>
>>>> On 19-01-2016 03:38, Xinliang Liu wrote:
>>>>> On 18 January 2016 at 22:45, Carlos Palminha <CARLOS.PALMINHA at synopsys.com>
>>>>> wrote:
>>>>>
>>>>>> I'm also getting a message from DRM saying can't find any crtc or
>>>>>> sizes...i'm really missing something here.
>>>>>> :(
>>>>>>
>>>>>> -- log --
>>>>>> [drm] Initialized drm 1.1.0 20060810
>>>>>> drm-arcpgu e0017000.pgu: No connectors reported connected with modes
>>>>>> [drm] Cannot find any crtc or sizes - going 1024x768
>>>>>> Console: switching to colour frame buffer device 128x48
>>>>>> drm-arcpgu e0017000.pgu: fb0: frame buffer device
>>>>>> [drm] Initialized drm-arcpgu 1.0.0 20151127 on minor 0
>>>>>> -- log ---
>>>>>>
>>>>>> Any help?
>>>>>>
>>>>>> Regards,
>>>>>> C.Palminha
>>>>>>
>>>>>>
>>>>>> On 18-01-2016 14:32, Carlos Palminha wrote:
>>>>>>> Hi Xinliang,
>>>>>>>
>>>>>>> My get_modes seems to be implemented as the rcar driver...
>>>>>>> Probably still missing some init step?
>>>>>>>
>>>>>>> Regards,
>>>>>>> C.Palminha
>>>>>>>
>>>>>>>
>>>>>>> static int arcpgu_drm_connector_get_modes(struct drm_connector
>>>>>> *connector)
>>>>>>> {
>>>>>>> struct drm_encoder_slave *slave;
>>>>>>> const struct drm_encoder_slave_funcs *sfuncs;
>>>>>>> struct arcpgu_drm_connector * con =
>>>>>>> container_of(connector, struct arcpgu_drm_connector, connector);
>>>>>>>
>>>>>>> slave = con->encoder_slave;
>>>>>>> if(slave == NULL) {
>>>>>>> dev_err(connector->dev->dev,
>>>>>>> "connector_get_modes: cannot find slave encoder for connector\n");
>>>>>>> return 0;
>>>>>>> }
>>>>>>>
>>>>>>> sfuncs = slave->slave_funcs;
>>>>>>> if(sfuncs->get_modes == NULL){
>>>>>>> return 0;
>>>>>>> }
>>>>>>>
>>>>>>> return sfuncs->
>>>>>>
>>>>>> get_modes(&slave->base,connector);
>>>>>>> }
>>>>>>>
>>>>>>
>>>>>
>>>>> so, this will call adv7511 driver's
>>>>>
>>>>> get_modes call back.
>>>>> I wonder if the system boot up, it can get modes or not.
>>>>> You can test it with the modetest. i.e. $ modetest -M DRM_DRIVER_NAME -c
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>> On 31-12-2015 02:19, Xinliang Liu wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 31 December 2015 at 02:46, Carlos Palminha
>>>>>>>> <CARLOS.PALMINHA at synopsys.com <mailto:CARLOS.PALMINHA at synopsys.com>>
>>>>>> wrote:
>>>>>>>>
>>>>>>>> Hi guys,
>>>>>>>>
>>>>>>>> I'm writing a DRM driver for a framebuffer embedded hardware that
>>>>>>>> uses an i2c encoder (adv7511), following the basic steps suggested
>>>>>>>> by Laurent in "anatomy of an embedded KMS driver":
>>>>>>>> https://www.youtube.com/watch?v=Ja8fM7rTae4
>>>>>>>>
>>>>>>>> After initiliazing all kms, crtc, encoder, i2c, connector functions
>>>>>>>> and structures i'm calling drm_fbdev_cma_init to create a fbdev.
>>>>>>>>
>>>>>>>> When booting i'm getting an error message saying "No connectors
>>>>>>>> reported connected with modes", but the driver init is ok and i can
>>>>>>>> find the /dev/dri/* and /dev/fb0 devices.
>>>>>>>>
>>>>>>>> Any clue what i might be missing during the driver load?
>>>>>>>>
>>>>>>>>
>>>>>>>> I think you should check on the 'get_modes' call back of adv7511
>>>>>>>> driver. (Or, if possible show us the code.)
>>>>>>>>
>>>>>>>> Best,
>>>>>>>> -xinliang
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks...
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> C.Palminha
>>>>>>>>
>>>>>>>> --- boot log snippet ---
>>>>>>>> [drm] Initialized drm 1.1.0 20060810
>>>>>>>> drm-arcpgu e0017000.pgu: No connectors reported connected with modes
>>>>>>>> [drm] Cannot find any crtc or sizes - going 1024x768
>>>>>>>> Console: switching to colour frame buffer device 128x48
>>>>>>>> drm-arcpgu e0017000.pgu: fb0: frame buffer device
>>>>>>>> [drm] Initialized drm-arcpgu 1.0.0 20151127 on minor 0
>>>>>>>> --- boot log snippet ---
>>>>>>>> --
>>>>>>>> To unsubscribe from this list: send the line "unsubscribe
>>>>>>>> linux-fbdev" in
>>>>>>>> the body of a message to majordomo at vger.kernel.org
>>>>>>>> <mailto:majordomo at vger.kernel.org>
>>>>>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>
More information about the dri-devel
mailing list