[Intel-gfx] [PATCH v6 03/10] drm/i915/dsb: single register write function for DSB.

Sharma, Shashank shashank.sharma at intel.com
Thu Sep 12 13:20:14 UTC 2019


On 9/12/2019 6:37 PM, Animesh Manna wrote:
>
>
> On 9/12/2019 6:30 PM, Sharma, Shashank wrote:
>>
>> On 9/12/2019 6:21 PM, Jani Nikula wrote:
>>> On Thu, 12 Sep 2019, "Sharma, Shashank" <shashank.sharma at intel.com> 
>>> wrote:
>>>> On 9/12/2019 12:41 AM, Animesh Manna wrote:
>>>>> DSB support single register write through opcode 0x1. Generic
>>>>> api created which accumulate all single register write in a batch
>>>>> buffer and once DSB is triggered, it will program all the registers
>>>>> at the same time.
>>>>>
>>>>> v1: Initial version.
>>>>> v2: Unused macro removed and cosmetic changes done. (Shashank)
>>>>> v3: set free_pos to zero in dsb-put() instead dsb-get() and
>>>>> a cosmetic change. (Shashank)
>>>>>
>>>>> Cc: Jani Nikula <jani.nikula at intel.com>
>>>>> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
>>>>> Cc: Shashank Sharma <shashank.sharma at intel.com>
>>>>> Signed-off-by: Animesh Manna <animesh.manna at intel.com>
>>>>> ---
>>>>>    drivers/gpu/drm/i915/display/intel_dsb.c | 30 
>>>>> ++++++++++++++++++++++++
>>>>>    drivers/gpu/drm/i915/display/intel_dsb.h |  9 +++++++
>>>>>    2 files changed, 39 insertions(+)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c 
>>>>> b/drivers/gpu/drm/i915/display/intel_dsb.c
>>>>> index 7c1b1574788c..e2c383352145 100644
>>>>> --- a/drivers/gpu/drm/i915/display/intel_dsb.c
>>>>> +++ b/drivers/gpu/drm/i915/display/intel_dsb.c
>>>>> @@ -9,6 +9,13 @@
>>>>>       #define DSB_BUF_SIZE    (2 * PAGE_SIZE)
>>>>>    +/* DSB opcodes. */
>>>>> +#define DSB_OPCODE_SHIFT        24
>>>>> +#define DSB_OPCODE_MMIO_WRITE        0x1
>>>>> +#define DSB_OPCODE_INDEXED_WRITE    0x9
>>>> We are not using this macro here, this should go to the Batch
>>>> /INDEXED_WRITE patch.
>>>>> +#define DSB_BYTE_EN            0xF
>>>>> +#define DSB_BYTE_EN_SHIFT        20
>>>>> +
>>>>>    struct intel_dsb *
>>>>>    intel_dsb_get(struct intel_crtc *crtc)
>>>>>    {
>>>>> @@ -66,5 +73,28 @@ void intel_dsb_put(struct intel_dsb *dsb)
>>>>>            i915_vma_unpin_and_release(&dsb->vma, 0);
>>>>>            mutex_unlock(&i915->drm.struct_mutex);
>>>>>            dsb->cmd_buf = NULL;
>>>>> +        dsb->free_pos = 0;
>>>>> +    }
>>>>> +}
>>>>> +
>>>> I hope this addition of braces are due to diff's adjustment.
>>>>> +void intel_dsb_reg_write(struct intel_dsb *dsb, i915_reg_t reg, 
>>>>> u32 val)
>>>>> +{
>>>>> +    struct intel_crtc *crtc = container_of(dsb, typeof(*crtc), dsb);
>>>>> +    struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>>>>> +    u32 *buf = dsb->cmd_buf;
>>>>> +
>>>>> +    if (!buf) {
>>>>> +        I915_WRITE(reg, val);
>>>>> +        return;
>>>>> +    }
>>>>> +
>>>>> +    if (WARN_ON(dsb->free_pos >= DSB_BUF_SIZE)) {
>>>>> +        DRM_DEBUG_KMS("DSB buffer overflow\n");
>>>> why shouldn't we do a I915_WRITE(reg, val) here too? This is single
>>>> register write, and we can handle this.
>>> That would assume it's okay to directly mmio write this and the
>>> subsequent values, and write the batch already stored in the buffer
>>> afterwards.
>>
>> This is single write API, so I won't expect this to be called in an 
>> indexed context, also, we have exceeded the buffer size already, so 
>> no subsequent DSB write would be possible anyways. But I can still 
>> see it would be some kind of mess only, so doesn't really matter if 
>> we do this I915_write or not :).
>
> Adding I915_WRITE can be done, but I feel better to break the 
> functionality where we have buffer overflow and based on that we can 
> fine tune the buffer size.
> If a set of register is targetted to write through DSB then some 
> writing through MMIO and and rest writing though DSB may not a nice 
> thing.
> So added only debug log to capture the issue.
>
> Regards,
> Animesh

Yeah, broken this way or other, better to warn as soon as possible.

With the above macro comment fixed,

Please feel free to use Reviewed-by: Shashank Sharma 
<shashank.sharma at intel.com>

- Shashank

>
>>
>> - Shashank
>>
>>> BR,
>>> Jani.
>>>
>>>>> +        return;
>>>>>        }
>>>>> +
>>>>> +    buf[dsb->free_pos++] = val;
>>>>> +    buf[dsb->free_pos++] = (DSB_OPCODE_MMIO_WRITE << 
>>>>> DSB_OPCODE_SHIFT) |
>>>>> +                   (DSB_BYTE_EN << DSB_BYTE_EN_SHIFT) |
>>>>> +                   i915_mmio_reg_offset(reg);
>>>>>    }
>>>>> diff --git a/drivers/gpu/drm/i915/display/intel_dsb.h 
>>>>> b/drivers/gpu/drm/i915/display/intel_dsb.h
>>>>> index 27eb68eb5392..31b87dcfe160 100644
>>>>> --- a/drivers/gpu/drm/i915/display/intel_dsb.h
>>>>> +++ b/drivers/gpu/drm/i915/display/intel_dsb.h
>>>>> @@ -6,6 +6,8 @@
>>>>>    #ifndef _INTEL_DSB_H
>>>>>    #define _INTEL_DSB_H
>>>>>    +#include "i915_reg.h"
>>>>> +
>>>>>    struct intel_crtc;
>>>>>    struct i915_vma;
>>>>>    @@ -21,10 +23,17 @@ struct intel_dsb {
>>>>>        enum dsb_id id;
>>>>>        u32 *cmd_buf;
>>>>>        struct i915_vma *vma;
>>>>> +
>>>>> +    /*
>>>>> +     * free_pos will point the first free entry position
>>>>> +     * and help in calculating tail of command buffer.
>>>>> +     */
>>>>> +    int free_pos;
>>>>>    };
>>>>>       struct intel_dsb *
>>>>>    intel_dsb_get(struct intel_crtc *crtc);
>>>>>    void intel_dsb_put(struct intel_dsb *dsb);
>>>>> +void intel_dsb_reg_write(struct intel_dsb *dsb, i915_reg_t reg, 
>>>>> u32 val);
>>>>>       #endif
>


More information about the Intel-gfx mailing list