mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
drm/i915/dsb: Documentation for DSB.
Added docbook info regarding Display State Buffer(DSB) which is added from gen12 onwards to batch submit display HW programming. v1: Initial version as RFC. Cc: Jani Nikula <jani.nikula@intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Cc: Shashank Sharma <shashank.sharma@intel.com> Reviewed-by: Shashank Sharma <shashank.sharma@intel.com> Signed-off-by: Animesh Manna <animesh.manna@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190920115930.27829-11-animesh.manna@intel.com
This commit is contained in:
parent
dfaa6f285b
commit
5dd85e72bc
@ -246,6 +246,15 @@ Display PLLs
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dpll_mgr.h
|
||||
:internal:
|
||||
|
||||
Display State Buffer
|
||||
--------------------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dsb.c
|
||||
:doc: DSB
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dsb.c
|
||||
:internal:
|
||||
|
||||
Memory Management and Command Submission
|
||||
========================================
|
||||
|
||||
|
@ -9,6 +9,23 @@
|
||||
|
||||
#define DSB_BUF_SIZE (2 * PAGE_SIZE)
|
||||
|
||||
/**
|
||||
* DOC: DSB
|
||||
*
|
||||
* A DSB (Display State Buffer) is a queue of MMIO instructions in the memory
|
||||
* which can be offloaded to DSB HW in Display Controller. DSB HW is a DMA
|
||||
* engine that can be programmed to download the DSB from memory.
|
||||
* It allows driver to batch submit display HW programming. This helps to
|
||||
* reduce loading time and CPU activity, thereby making the context switch
|
||||
* faster. DSB Support added from Gen12 Intel graphics based platform.
|
||||
*
|
||||
* DSB's can access only the pipe, plane, and transcoder Data Island Packet
|
||||
* registers.
|
||||
*
|
||||
* DSB HW can support only register writes (both indexed and direct MMIO
|
||||
* writes). There are no registers reads possible with DSB HW engine.
|
||||
*/
|
||||
|
||||
/* DSB opcodes. */
|
||||
#define DSB_OPCODE_SHIFT 24
|
||||
#define DSB_OPCODE_MMIO_WRITE 0x1
|
||||
@ -66,6 +83,17 @@ static inline bool intel_dsb_disable_engine(struct intel_dsb *dsb)
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dsb_get() - Allocate DSB context and return a DSB instance.
|
||||
* @crtc: intel_crtc structure to get pipe info.
|
||||
*
|
||||
* This function provides handle of a DSB instance, for the further DSB
|
||||
* operations.
|
||||
*
|
||||
* Returns: address of Intel_dsb instance requested for.
|
||||
* Failure: Returns the same DSB instance, but without a command buffer.
|
||||
*/
|
||||
|
||||
struct intel_dsb *
|
||||
intel_dsb_get(struct intel_crtc *crtc)
|
||||
{
|
||||
@ -116,6 +144,14 @@ err:
|
||||
return dsb;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dsb_put() - To destroy DSB context.
|
||||
* @dsb: intel_dsb structure.
|
||||
*
|
||||
* This function destroys the DSB context allocated by a dsb_get(), by
|
||||
* unpinning and releasing the VMA object associated with it.
|
||||
*/
|
||||
|
||||
void intel_dsb_put(struct intel_dsb *dsb)
|
||||
{
|
||||
struct intel_crtc *crtc = container_of(dsb, typeof(*crtc), dsb);
|
||||
@ -138,6 +174,19 @@ void intel_dsb_put(struct intel_dsb *dsb)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dsb_indexed_reg_write() -Write to the DSB context for auto
|
||||
* increment register.
|
||||
* @dsb: intel_dsb structure.
|
||||
* @reg: register address.
|
||||
* @val: value.
|
||||
*
|
||||
* This function is used for writing register-value pair in command
|
||||
* buffer of DSB for auto-increment register. During command buffer overflow,
|
||||
* a warning is thrown and rest all erroneous condition register programming
|
||||
* is done through mmio write.
|
||||
*/
|
||||
|
||||
void intel_dsb_indexed_reg_write(struct intel_dsb *dsb, i915_reg_t reg,
|
||||
u32 val)
|
||||
{
|
||||
@ -202,6 +251,18 @@ void intel_dsb_indexed_reg_write(struct intel_dsb *dsb, i915_reg_t reg,
|
||||
buf[dsb->free_pos] = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dsb_reg_write() -Write to the DSB context for normal
|
||||
* register.
|
||||
* @dsb: intel_dsb structure.
|
||||
* @reg: register address.
|
||||
* @val: value.
|
||||
*
|
||||
* This function is used for writing register-value pair in command
|
||||
* buffer of DSB. During command buffer overflow, a warning is thrown
|
||||
* and rest all erroneous condition register programming is done
|
||||
* through mmio write.
|
||||
*/
|
||||
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);
|
||||
@ -225,6 +286,13 @@ void intel_dsb_reg_write(struct intel_dsb *dsb, i915_reg_t reg, u32 val)
|
||||
i915_mmio_reg_offset(reg);
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dsb_commit() - Trigger workload execution of DSB.
|
||||
* @dsb: intel_dsb structure.
|
||||
*
|
||||
* This function is used to do actual write to hardware using DSB.
|
||||
* On errors, fall back to MMIO. Also this function help to reset the context.
|
||||
*/
|
||||
void intel_dsb_commit(struct intel_dsb *dsb)
|
||||
{
|
||||
struct intel_crtc *crtc = container_of(dsb, typeof(*crtc), dsb);
|
||||
|
Loading…
Reference in New Issue
Block a user