[Intel-gfx] [PATCH v6 03/10] drm/i915/dsb: single register write function for DSB.
Animesh Manna
animesh.manna at intel.com
Thu Sep 12 13:07:40 UTC 2019
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
>
> - 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