Commit 2119aa17 authored by David Francis's avatar David Francis Committed by Alex Deucher

drm/amd/display: Start documentation of DC

[Why]
There are a lot of unintuitive parts of the dm-dc interface.
It would help us if these were documented to provide
a common understanding of what they are supposed to do

[How]
Most of this documentation is stubs, to be filled out more
thoroughly by the experts

Not every dm-accessible function and struct is mentioned.
Simple functions like getters, setters, retain, release,
create, destroy can be left unadorned.
Signed-off-by: default avatarDavid Francis <David.Francis@amd.com>
Reviewed-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Acked-by: default avatarLeo Li <sunpeng.li@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c452de15
...@@ -62,6 +62,55 @@ ...@@ -62,6 +62,55 @@
const static char DC_BUILD_ID[] = "production-build"; const static char DC_BUILD_ID[] = "production-build";
/**
* DOC: Overview
*
* DC is the OS-agnostic component of the amdgpu DC driver.
*
* DC maintains and validates a set of structs representing the state of the
* driver and writes that state to AMD hardware
*
* Main DC HW structs:
*
* struct dc - The central struct. One per driver. Created on driver load,
* destroyed on driver unload.
*
* struct dc_context - One per driver.
* Used as a backpointer by most other structs in dc.
*
* struct dc_link - One per connector (the physical DP, HDMI, miniDP, or eDP
* plugpoints). Created on driver load, destroyed on driver unload.
*
* struct dc_sink - One per display. Created on boot or hotplug.
* Destroyed on shutdown or hotunplug. A dc_link can have a local sink
* (the display directly attached). It may also have one or more remote
* sinks (in the Multi-Stream Transport case)
*
* struct resource_pool - One per driver. Represents the hw blocks not in the
* main pipeline. Not directly accessible by dm.
*
* Main dc state structs:
*
* These structs can be created and destroyed as needed. There is a full set of
* these structs in dc->current_state representing the currently programmed state.
*
* struct dc_state - The global DC state to track global state information,
* such as bandwidth values.
*
* struct dc_stream_state - Represents the hw configuration for the pipeline from
* a framebuffer to a display. Maps one-to-one with dc_sink.
*
* struct dc_plane_state - Represents a framebuffer. Each stream has at least one,
* and may have more in the Multi-Plane Overlay case.
*
* struct resource_context - Represents the programmable state of everything in
* the resource_pool. Not directly accessible by dm.
*
* struct pipe_ctx - A member of struct resource_context. Represents the
* internal hardware pipeline components. Each dc_plane_state has either
* one or two (in the pipe-split case).
*/
/******************************************************************************* /*******************************************************************************
* Private functions * Private functions
******************************************************************************/ ******************************************************************************/
...@@ -240,7 +289,7 @@ bool dc_stream_get_crtc_position(struct dc *dc, ...@@ -240,7 +289,7 @@ bool dc_stream_get_crtc_position(struct dc *dc,
} }
/** /**
* dc_stream_configure_crc: Configure CRC capture for the given stream. * dc_stream_configure_crc() - Configure CRC capture for the given stream.
* @dc: DC Object * @dc: DC Object
* @stream: The stream to configure CRC on. * @stream: The stream to configure CRC on.
* @enable: Enable CRC if true, disable otherwise. * @enable: Enable CRC if true, disable otherwise.
...@@ -292,7 +341,7 @@ bool dc_stream_configure_crc(struct dc *dc, struct dc_stream_state *stream, ...@@ -292,7 +341,7 @@ bool dc_stream_configure_crc(struct dc *dc, struct dc_stream_state *stream,
} }
/** /**
* dc_stream_get_crc: Get CRC values for the given stream. * dc_stream_get_crc() - Get CRC values for the given stream.
* @dc: DC object * @dc: DC object
* @stream: The DC stream state of the stream to get CRCs from. * @stream: The DC stream state of the stream to get CRCs from.
* @r_cr, g_y, b_cb: CRC values for the three channels are stored here. * @r_cr, g_y, b_cb: CRC values for the three channels are stored here.
...@@ -1329,6 +1378,11 @@ static enum surface_update_type check_update_surfaces_for_stream( ...@@ -1329,6 +1378,11 @@ static enum surface_update_type check_update_surfaces_for_stream(
return overall_type; return overall_type;
} }
/**
* dc_check_update_surfaces_for_stream() - Determine update type (fast, med, or full)
*
* See :c:type:`enum surface_update_type <surface_update_type>` for explanation of update types
*/
enum surface_update_type dc_check_update_surfaces_for_stream( enum surface_update_type dc_check_update_surfaces_for_stream(
struct dc *dc, struct dc *dc,
struct dc_surface_update *updates, struct dc_surface_update *updates,
...@@ -1631,6 +1685,9 @@ enum dc_irq_source dc_interrupt_to_irq_source( ...@@ -1631,6 +1685,9 @@ enum dc_irq_source dc_interrupt_to_irq_source(
return dal_irq_service_to_irq_source(dc->res_pool->irqs, src_id, ext_id); return dal_irq_service_to_irq_source(dc->res_pool->irqs, src_id, ext_id);
} }
/**
* dc_interrupt_set() - Enable/disable an AMD hw interrupt source
*/
bool dc_interrupt_set(struct dc *dc, enum dc_irq_source src, bool enable) bool dc_interrupt_set(struct dc *dc, enum dc_irq_source src, bool enable)
{ {
...@@ -1724,6 +1781,11 @@ static bool link_add_remote_sink_helper(struct dc_link *dc_link, struct dc_sink ...@@ -1724,6 +1781,11 @@ static bool link_add_remote_sink_helper(struct dc_link *dc_link, struct dc_sink
return true; return true;
} }
/**
* dc_link_add_remote_sink() - Create a sink and attach it to an existing link
*
* EDID length is in bytes
*/
struct dc_sink *dc_link_add_remote_sink( struct dc_sink *dc_link_add_remote_sink(
struct dc_link *link, struct dc_link *link,
const uint8_t *edid, const uint8_t *edid,
...@@ -1782,6 +1844,12 @@ struct dc_sink *dc_link_add_remote_sink( ...@@ -1782,6 +1844,12 @@ struct dc_sink *dc_link_add_remote_sink(
return NULL; return NULL;
} }
/**
* dc_link_remove_remote_sink() - Remove a remote sink from a dc_link
*
* Note that this just removes the struct dc_sink - it doesn't
* program hardware or alter other members of dc_link
*/
void dc_link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink) void dc_link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink)
{ {
int i; int i;
......
...@@ -198,6 +198,13 @@ static bool program_hpd_filter( ...@@ -198,6 +198,13 @@ static bool program_hpd_filter(
return result; return result;
} }
/**
* dc_link_detect_sink() - Determine if there is a sink connected
*
* @type: Returned connection type
* Does not detect downstream devices, such as MST sinks
* or display connected through active dongles
*/
bool dc_link_detect_sink(struct dc_link *link, enum dc_connection_type *type) bool dc_link_detect_sink(struct dc_link *link, enum dc_connection_type *type)
{ {
uint32_t is_hpd_high = 0; uint32_t is_hpd_high = 0;
...@@ -324,9 +331,9 @@ static enum signal_type get_basic_signal_type( ...@@ -324,9 +331,9 @@ static enum signal_type get_basic_signal_type(
return SIGNAL_TYPE_NONE; return SIGNAL_TYPE_NONE;
} }
/* /**
* @brief * dc_link_is_dp_sink_present() - Check if there is a native DP
* Check whether there is a dongle on DP connector * or passive DP-HDMI dongle connected
*/ */
bool dc_link_is_dp_sink_present(struct dc_link *link) bool dc_link_is_dp_sink_present(struct dc_link *link)
{ {
...@@ -593,6 +600,14 @@ static bool is_same_edid(struct dc_edid *old_edid, struct dc_edid *new_edid) ...@@ -593,6 +600,14 @@ static bool is_same_edid(struct dc_edid *old_edid, struct dc_edid *new_edid)
return (memcmp(old_edid->raw_edid, new_edid->raw_edid, new_edid->length) == 0); return (memcmp(old_edid->raw_edid, new_edid->raw_edid, new_edid->length) == 0);
} }
/**
* dc_link_detect() - Detect if a sink is attached to a given link
*
* link->local_sink is created or destroyed as needed.
*
* This does not create remote sinks but will trigger DM
* to start MST detection if a branch is detected.
*/
bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
{ {
struct dc_sink_init_data sink_init_data = { 0 }; struct dc_sink_init_data sink_init_data = { 0 };
......
...@@ -1447,6 +1447,14 @@ static bool are_stream_backends_same( ...@@ -1447,6 +1447,14 @@ static bool are_stream_backends_same(
return true; return true;
} }
/**
* dc_is_stream_unchanged() - Compare two stream states for equivalence.
*
* Checks if there a difference between the two states
* that would require a mode change.
*
* Does not compare cursor position or attributes.
*/
bool dc_is_stream_unchanged( bool dc_is_stream_unchanged(
struct dc_stream_state *old_stream, struct dc_stream_state *stream) struct dc_stream_state *old_stream, struct dc_stream_state *stream)
{ {
...@@ -1457,6 +1465,9 @@ bool dc_is_stream_unchanged( ...@@ -1457,6 +1465,9 @@ bool dc_is_stream_unchanged(
return true; return true;
} }
/**
* dc_is_stream_scaling_unchanged() - Compare scaling rectangles of two streams.
*/
bool dc_is_stream_scaling_unchanged( bool dc_is_stream_scaling_unchanged(
struct dc_stream_state *old_stream, struct dc_stream_state *stream) struct dc_stream_state *old_stream, struct dc_stream_state *stream)
{ {
...@@ -1616,6 +1627,9 @@ bool resource_is_stream_unchanged( ...@@ -1616,6 +1627,9 @@ bool resource_is_stream_unchanged(
return false; return false;
} }
/**
* dc_add_stream_to_ctx() - Add a new dc_stream_state to a dc_state.
*/
enum dc_status dc_add_stream_to_ctx( enum dc_status dc_add_stream_to_ctx(
struct dc *dc, struct dc *dc,
struct dc_state *new_ctx, struct dc_state *new_ctx,
...@@ -1640,6 +1654,9 @@ enum dc_status dc_add_stream_to_ctx( ...@@ -1640,6 +1654,9 @@ enum dc_status dc_add_stream_to_ctx(
return res; return res;
} }
/**
* dc_remove_stream_from_ctx() - Remove a stream from a dc_state.
*/
enum dc_status dc_remove_stream_from_ctx( enum dc_status dc_remove_stream_from_ctx(
struct dc *dc, struct dc *dc,
struct dc_state *new_ctx, struct dc_state *new_ctx,
...@@ -1860,6 +1877,12 @@ enum dc_status resource_map_pool_resources( ...@@ -1860,6 +1877,12 @@ enum dc_status resource_map_pool_resources(
return DC_ERROR_UNEXPECTED; return DC_ERROR_UNEXPECTED;
} }
/**
* dc_resource_state_copy_construct_current() - Creates a new dc_state from existing state
* Is a shallow copy. Increments refcounts on existing streams and planes.
* @dc: copy out of dc->current_state
* @dst_ctx: copy into this
*/
void dc_resource_state_copy_construct_current( void dc_resource_state_copy_construct_current(
const struct dc *dc, const struct dc *dc,
struct dc_state *dst_ctx) struct dc_state *dst_ctx)
...@@ -1875,6 +1898,14 @@ void dc_resource_state_construct( ...@@ -1875,6 +1898,14 @@ void dc_resource_state_construct(
dst_ctx->dccg = dc->res_pool->clk_mgr; dst_ctx->dccg = dc->res_pool->clk_mgr;
} }
/**
* dc_validate_global_state() - Determine if HW can support a given state
* Checks HW resource availability and bandwidth requirement.
* @dc: dc struct for this driver
* @new_ctx: state to be validated
*
* Return: DC_OK if the result can be programmed. Otherwise, an error code.
*/
enum dc_status dc_validate_global_state( enum dc_status dc_validate_global_state(
struct dc *dc, struct dc *dc,
struct dc_state *new_ctx) struct dc_state *new_ctx)
...@@ -2364,10 +2395,6 @@ void dc_resource_state_destruct(struct dc_state *context) ...@@ -2364,10 +2395,6 @@ void dc_resource_state_destruct(struct dc_state *context)
} }
} }
/*
* Copy src_ctx into dst_ctx and retain all surfaces and streams referenced
* by the src_ctx
*/
void dc_resource_state_copy_construct( void dc_resource_state_copy_construct(
const struct dc_state *src_ctx, const struct dc_state *src_ctx,
struct dc_state *dst_ctx) struct dc_state *dst_ctx)
......
...@@ -170,7 +170,7 @@ struct dc_stream_status *dc_stream_get_status( ...@@ -170,7 +170,7 @@ struct dc_stream_status *dc_stream_get_status(
} }
/** /**
* Update the cursor attributes and set cursor surface address * dc_stream_set_cursor_attributes() - Update cursor attributes and set cursor surface address
*/ */
bool dc_stream_set_cursor_attributes( bool dc_stream_set_cursor_attributes(
struct dc_stream_state *stream, struct dc_stream_state *stream,
......
...@@ -128,8 +128,10 @@ struct dc_link { ...@@ -128,8 +128,10 @@ struct dc_link {
const struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link); const struct dc_link_status *dc_link_get_status(const struct dc_link *dc_link);
/* /**
* Return an enumerated dc_link. dc_link order is constant and determined at * dc_get_link_at_index() - Return an enumerated dc_link.
*
* dc_link order is constant and determined at
* boot time. They cannot be created or destroyed. * boot time. They cannot be created or destroyed.
* Use dc_get_caps() to get number of links. * Use dc_get_caps() to get number of links.
*/ */
......
...@@ -272,6 +272,17 @@ union bw_context { ...@@ -272,6 +272,17 @@ union bw_context {
struct dce_bw_output dce; struct dce_bw_output dce;
}; };
/**
* struct dc_state - The full description of a state requested by a user
*
* @streams: Stream properties
* @stream_status: The planes on a given stream
* @res_ctx: Persistent state of resources
* @bw: The output from bandwidth and watermark calculations
* @pp_display_cfg: PowerPlay clocks and settings
* @dcn_bw_vars: non-stack memory to support bandwidth calculations
*
*/
struct dc_state { struct dc_state {
struct dc_stream_state *streams[MAX_PIPES]; struct dc_stream_state *streams[MAX_PIPES];
struct dc_stream_status stream_status[MAX_PIPES]; struct dc_stream_status stream_status[MAX_PIPES];
...@@ -279,7 +290,6 @@ struct dc_state { ...@@ -279,7 +290,6 @@ struct dc_state {
struct resource_context res_ctx; struct resource_context res_ctx;
/* The output from BW and WM calculations. */
union bw_context bw; union bw_context bw;
/* Note: these are big structures, do *not* put on stack! */ /* Note: these are big structures, do *not* put on stack! */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment