On 3/21/19 11:38 AM, Wentland, Harry wrote:
> 
> 
> On 2019-03-21 5:39 a.m., Mario Kleiner wrote:
>> On Wed, Mar 20, 2019 at 1:53 PM Kazlauskas, Nicholas
>> <nicholas.kazlaus...@amd.com> wrote:
>>>
>>> On 3/20/19 3:51 AM, Mario Kleiner wrote:
>>>> Ok, fixed all the style issues and ran checkpatch over the patches. Thanks.
>>>>
>>>> On Tue, Mar 19, 2019 at 2:32 PM Kazlauskas, Nicholas
>>>> <nicholas.kazlaus...@amd.com> wrote:
>>>>>
>>>>> On 3/19/19 9:23 AM, Kazlauskas, Nicholas wrote:
>>>>>> On 3/18/19 1:19 PM, Mario Kleiner wrote:
> 
> ...snip...
> 
>>>>>>> diff --git 
>>>>>>> a/drivers/gpu/drm/amd/display/dc/irq/dcn10/irq_service_dcn10.c 
>>>>>>> b/drivers/gpu/drm/amd/display/dc/irq/dcn10/irq_service_dcn10.c
>>>>>>> index e04ae49..10ac6de 100644
>>>>>>> --- a/drivers/gpu/drm/amd/display/dc/irq/dcn10/irq_service_dcn10.c
>>>>>>> +++ b/drivers/gpu/drm/amd/display/dc/irq/dcn10/irq_service_dcn10.c
>>>>>>> @@ -56,6 +56,18 @@ enum dc_irq_source to_dal_irq_source_dcn10(
>>>>>>>                return DC_IRQ_SOURCE_VBLANK5;
>>>>>>>        case DCN_1_0__SRCID__DC_D6_OTG_VSTARTUP:
>>>>>>>                return DC_IRQ_SOURCE_VBLANK6;
>>>>>>> +    case DCN_1_0__SRCID__OTG0_IHC_V_UPDATE_NO_LOCK_INTERRUPT:
>>>>>>> +            return DC_IRQ_SOURCE_VUPDATE1;
>>>>>>> +    case DCN_1_0__SRCID__OTG1_IHC_V_UPDATE_NO_LOCK_INTERRUPT:
>>>>>>> +            return DC_IRQ_SOURCE_VUPDATE2;
>>>>>>> +    case DCN_1_0__SRCID__OTG2_IHC_V_UPDATE_NO_LOCK_INTERRUPT:
>>>>>>> +            return DC_IRQ_SOURCE_VUPDATE3;
>>>>>>> +    case DCN_1_0__SRCID__OTG3_IHC_V_UPDATE_NO_LOCK_INTERRUPT:
>>>>>>> +            return DC_IRQ_SOURCE_VUPDATE4;
>>>>>>> +    case DCN_1_0__SRCID__OTG4_IHC_V_UPDATE_NO_LOCK_INTERRUPT:
>>>>>>> +            return DC_IRQ_SOURCE_VUPDATE5;
>>>>>>> +    case DCN_1_0__SRCID__OTG5_IHC_V_UPDATE_NO_LOCK_INTERRUPT:
>>>>>>> +            return DC_IRQ_SOURCE_VUPDATE6;
>>>>>
>>>>> I'm not sure we necessarily want to reuse the same
>>>>> DC_IRQ_SOURCE_VUPDATE1...6 definitions here again when it's really
>>>>> V_UPDATE_NO_LOCK.
>>>>>
>>>>
>>>> Hm. The problem is that if we use different ones for DCE and DCN we
>>>> need special-case handling in amdgpu_dm.c, e.g., in
>>>> amdgpu_dm_set_vupdate_irq_state() and dm_set_vupdate_irq() to detect
>>>> if it is caling DCE or DCN (how to detect this?) to select different
>>>> irq sources IRQ_TYPE_VUPDATE vs IRQ_TYPE_VUPDATE_NO_LOCK and such?
>>>> And definitions like "struct amdgpu_irq_src vupdate_irq;" should then
>>>> also exist twice as vupdate_irq and vupdate_irq_no_lock for correct
>>>> naming?
>>>>
>>>> Or we'd name the IRQ source and all relevant data structures and
>>>> functions something like DC_IRQ_SOURCE_VBLANK_END1..6 to describe what
>>>> it signals instead of to what it corresponds in hardware? That would
>>>> be what was done with the regular DC_IRQ_SOURCE_VBLANK1..6. It signals
>>>> start of vblank, but the underlying hw interrupts are actually a
>>>> properly programmed VLINE0 irq on DCE and a VSTARTUP irq on DCN.
>>>
>>>
>>> Ah, I see what you mean. Maybe this is for the better to share the same
>>> names then. I'll defer this to Harry.
>>>
> 
> I'd tend to agree with Mario. I think it's best to keep the same semantic for 
> VUPDATE.
> 
> The regular VUPDATE has some interaction with the master lock. I imagine we 
> want something that fires independently of it, which looks to be the _NO_LOCK 
> version.
> 
> That said, both VSTARTUP and VUPDATE can occur before VSYNC on DCN. With most 
> timings this probably won't occur but if our back porch is really small we'd 
> see that happening. If we need to guarantee that this interrupt occurs no 
> sooner than vline 0 we will need to register a vline IRQ.
> 
> As for VSTARTUP and VUPDATE, VSTARTUP is the IRQ that has an impact on the 
> behavior of render clients as it's the deadline for frame submissions. After 
> VSTARTUP any new framebuffer address update is postponed to the next frame 
> (unless we do immediate flip).
> 
> So for now VUPDATE_NO_LOCK is probably fine and will improve our situation 
> except for VRR displays with a really short back porch. Not sure those even 
> exist.
Mapping the DC_IRQ_SOURCE_VUPDATE1...6 to the _NO_LOCK interrupt seems 
fine to me then.

FWIW on the few displays I tested on Raven the event was usually sent 
out rather late - near or after the end of the back porch. I don't think 
we have to necessarily worry that it'll happen before vline 0 at least.

It's more about it happening too late I suppose. A vline 0 IRQ would 
probably be ideal here I think, but this works for now.

> 
>>>>
>>>> Of course this all assumes we need to use the NO_LOCK variant on DCN?
>>>> We haven't tested what the regular VUPDATE_IRQ does, because i don't
>>>> have a suitable test machine, and my use of the NO_LOCK variant was
>>>> just based on my interpretation of this little comment in the DCN
>>>> header file:
>>>>
>>>> #define DCN_1_0__SRCID__OTG0_IHC_V_UPDATE_NO_LOCK_INTERRUPT 0x57 //
>>>> "OTG0 VUPDATE event without lock interrupt, VUPDATE is update event
>>>> for double buffered registers"
>>>>
>>>> and the absence of any explanatory comment in the define of regular 
>>>> V_UPDATE:
>>>>
>>>> #define DCN_1_0__SRCID__DC_D1_OTG_V_UPDATE 0x18 // D1 : OTG V_update
>>>> OTG1_IHC_V_UPDATE_INTERRUPT
>>>>
>>>> I assumed the NO_LOCK means not affected by the state of any of the hw
>>>> locks, so regular V_UPDATE might be affected by them. You agreed with
>>>> that, but we never tested what regular V_UPDATE would do on DCN. Do we
>>>> actually know for sure from hw specs that it would not work, ie. not
>>>> unconditionally fire the IRQ at every end of VBLANK, as we need?
>>>
>>> FWIW, I did try your original patches with V_UPDATE. I don't know off
>>> the top of my head what specifically V_UPDATE does that V_UPDATE_NO_LOCK
>>> doesn't, but at the very least the HW won't be flipping anything to the
>>> screen if you're using the former. You'll end up with a static screen
>>> that looks like a system hang.
>>>
>>
>> Yes, but that was because that iteration of the patch had a bug, where
>> i defined the irq sources / irq hw sources as _NO_LOCK variants as i
>> intended, but forgot to adapt the irq en/disable register macros. You
>> fixed my bug during your testing and so we know the _NO_LOCK variant
>> works perfectly for our purpose. But we never tesed if the standard
>> variant would have worked just as well.
>>
>> I will test this later today, because since today i'm the proud owner
>> of a PC with Ryzen 5 2400G with Vega11 Raven / DCN-1.0 :). So i'll
>> give it a try. Would be good though if you could have a look at the
>> hardware docs i assume you have internally to verify what the V_UPDATE
>> irq hw source actually does?
>>
> 
> I couldn't find much regarding the _NO_LOCK part in the HW docs, 
> unfortunately. The other stuff is in my blurb up top.
> 
> I think this change is fine. With the comments from Nick and Paul addressed 
> this is
> Acked-by: Harry Wentland <harry.wentl...@amd.com>
> 
> I recommend trying the VLINE IRQ, though. Nick can you create a task for us 
> to look into that?
> 
> Harry
Sure.

Nicholas Kazlauskas

> 
>> -mario
>>
>>> Nicholas Kazlauskas
>>>
>>>>
>>>>
>>>>>>>        case DCN_1_0__SRCID__HUBP0_FLIP_INTERRUPT:
>>>>>>>                return DC_IRQ_SOURCE_PFLIP1;
>>>>>>>        case DCN_1_0__SRCID__HUBP1_FLIP_INTERRUPT:
>>>>>>> @@ -153,6 +165,11 @@ static const struct irq_source_info_funcs 
>>>>>>> vblank_irq_info_funcs = {
>>>>>>>        .ack = NULL
>>>>>>>      };
>>>>>>>
>>>>>>> +static const struct irq_source_info_funcs 
>>>>>>> vupdate_no_lock_irq_info_funcs = {
>>>>>>> +    .set = NULL,
>>>>>>> +    .ack = NULL
>>>>>>> +};
>>>>>>> +
>>>>>>>      #define BASE_INNER(seg) \
>>>>>>>        DCE_BASE__INST0_SEG ## seg
>>>>>>>
>>>>>>> @@ -203,12 +220,15 @@ static const struct irq_source_info_funcs 
>>>>>>> vblank_irq_info_funcs = {
>>>>>>>                .funcs = &pflip_irq_info_funcs\
>>>>>>>        }
>>>>>>>
>>>>>>> -#define vupdate_int_entry(reg_num)\
>>>>>>> +/* vupdate_no_lock_int_entry maps to DC_IRQ_SOURCE_VUPDATEx, to match 
>>>>>>> semantic
>>>>>>> + * of DCE's DC_IRQ_SOURCE_VUPDATEx.
>>>>>>> + */
>>>>>>> +#define vupdate_no_lock_int_entry(reg_num)\
>>>>>>>        [DC_IRQ_SOURCE_VUPDATE1 + reg_num] = {\
>>>>>>>                IRQ_REG_ENTRY(OTG, reg_num,\
>>>>>>> -                    OTG_GLOBAL_SYNC_STATUS, VUPDATE_INT_EN,\
>>>>>>> -                    OTG_GLOBAL_SYNC_STATUS, VUPDATE_EVENT_CLEAR),\
>>>>>>> -            .funcs = &vblank_irq_info_funcs\
>>>>>>> +                    OTG_GLOBAL_SYNC_STATUS, VUPDATE_NO_LOCK_INT_EN,\
>>>>>>> +                    OTG_GLOBAL_SYNC_STATUS, 
>>>>>>> VUPDATE_NO_LOCK_EVENT_CLEAR),\
>>>>>>> +            .funcs = &vupdate_no_lock_irq_info_funcs\
>>>>>>>        }
>>>>>>>
>>>>>>>      #define vblank_int_entry(reg_num)\
>>>>>>> @@ -315,12 +335,12 @@ irq_source_info_dcn10[DAL_IRQ_SOURCES_NUMBER] = {
>>>>>>>        dc_underflow_int_entry(6),
>>>>>>>        [DC_IRQ_SOURCE_DMCU_SCP] = dummy_irq_entry(),
>>>>>>>        [DC_IRQ_SOURCE_VBIOS_SW] = dummy_irq_entry(),
>>>>>>> -    vupdate_int_entry(0),
>>>>>>> -    vupdate_int_entry(1),
>>>>>>> -    vupdate_int_entry(2),
>>>>>>> -    vupdate_int_entry(3),
>>>>>>> -    vupdate_int_entry(4),
>>>>>>> -    vupdate_int_entry(5),
>>>>>
>>>>> I don't think we should be necessarily dropping these, but I guess it
>>>>> could go either way since these IRQs technically aren't defined.
>>>>>
>>>>
>>>> We could keep both definitions around, original vupdate_int_entry +
>>>> the new vupdate_no_lock_int_entry.
>>>>
>>>> -mario
>>>>
>>>>>>> +    vupdate_no_lock_int_entry(0),
>>>>>>> +    vupdate_no_lock_int_entry(1),
>>>>>>> +    vupdate_no_lock_int_entry(2),
>>>>>>> +    vupdate_no_lock_int_entry(3),
>>>>>>> +    vupdate_no_lock_int_entry(4),
>>>>>>> +    vupdate_no_lock_int_entry(5),
>>>>>>>        vblank_int_entry(0),
>>>>>>>        vblank_int_entry(1),
>>>>>>>        vblank_int_entry(2),
>>>>>>>
>>>>>>
>>>>>> Nicholas Kazlauskas
>>>>>> _______________________________________________
>>>>>> amd-gfx mailing list
>>>>>> amd-gfx@lists.freedesktop.org
>>>>>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>>>>>>
>>>>>
>>>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to