drivers/gpu/drm/amd/display/dc/dml2_0/dml_frl_cap_chk.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/dml2_0/dml_frl_cap_chk.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/display/dc/dml2_0/dml_frl_cap_chk.c
Extension
.c
Size
13944 bytes
Lines
414
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

#include "dml_frl_cap_chk.h"
#include "display_mode_util.h"
#include "lib_frl_cap_check.h"

#define frl_dump_var(fmt, var) {}
#define frl_print(fmt, ...) {}
#include "dcn_calc_math.h"
#define fabs(var) dcn_bw_fabs(var)
#define floor(var) dcn_bw_floor(var)
#define ceil(var) dcn_bw_ceil(var)

#if !defined(TB_BORROWED_MAX)
#define TB_BORROWED_MAX 400
#endif

static const double   EPSILON               = 0.01;
static const double   DBL_EPSILON           = 2.2204460492503131e-16;
static const int      C_FRL_CB              = 510;
static const double   OVERHEAD_M            = 0.003;  /* %   */
static const double   TOLERANCE_PIXEL_CLOCK = 0.005;  /* %   */
static const double   TOLERANCE_AUDIO_CLOCK = 1000;   /* ppm */
static const int      TOLERANCE_FRL_BIT     = 300;    /* ppm */
static const int      ACR_RATE_MAX          = 1500;

static frl_cap_chk_result frl_cap_chk_common(frl_cap_chk_intermediates *inter, frl_cap_chk_params *params)
{
	double   audio_bw_reserve = (params->compressed ? 192000.0 : 0.0);
/*
	if (getenv("DEBUG_FRL_CAP_CHK"))
	{
		printf("frl_cap_chk inputs:\n");
		printf("-------------------\n");
		frl_dump_var("%i", params->lanes);
		frl_dump_var("%le", params->f_pixel_clock_nominal);
		frl_dump_var("%le", params->r_bit_nominal);
		frl_dump_var("%i", params->audio_packet_type);
		frl_dump_var("%le", params->f_audio);
		frl_dump_var("%i", params->h_active);
		frl_dump_var("%i", params->h_blank);
		frl_dump_var("%i", params->bpc);
		frl_dump_var("%i", params->pixel_encoding);
		frl_dump_var("%i", params->compressed);
		frl_dump_var("%i", params->slices);
		frl_dump_var("%i", params->slice_width);
		frl_dump_var("%le", params->bpp_target);
		frl_dump_var("%i", params->layout);
		frl_dump_var("%i", params->acat);
		printf("frl_cap_chk outputs:\n");
		printf("---------------------\n");
	}
*/
	inter->c_frl_sb = 4 * C_FRL_CB + params->lanes;
	inter->overhead_sb = (double) params->lanes / inter->c_frl_sb;
	inter->overhead_rs = 8.0 * 4.0 / inter->c_frl_sb;
	inter->overhead_map = 2.5 / inter->c_frl_sb;
	inter->overhead_min = inter->overhead_sb + inter->overhead_rs + inter->overhead_map;
	inter->overhead_max = inter->overhead_min + OVERHEAD_M;
	inter->f_pixel_clock_max = params->f_pixel_clock_nominal * (1.0 + TOLERANCE_PIXEL_CLOCK);
	inter->t_line = (params->h_active + params->h_blank) / inter->f_pixel_clock_max;
	inter->r_bit_min = params->r_bit_nominal * (1.0 - TOLERANCE_FRL_BIT / 1000000.0);
	inter->r_frl_char_min = inter->r_bit_min / 18.0;
	inter->c_frl_line = floor(inter->t_line * inter->r_frl_char_min * params->lanes);
/*
	if (getenv("DEBUG_FRL_CAP_CHK"))
	{
		frl_dump_var("%i", inter->c_frl_sb);
		frl_dump_var("%le", inter->overhead_sb);
		frl_dump_var("%le", inter->overhead_rs);
		frl_dump_var("%le", inter->overhead_map);
		frl_dump_var("%le", inter->overhead_min);
		frl_dump_var("%le", inter->overhead_max);
		frl_dump_var("%le", inter->f_pixel_clock_max);
		frl_dump_var("%le", inter->t_line);
		frl_dump_var("%le", inter->r_bit_min);
		frl_dump_var("%le", inter->r_frl_char_min);
		frl_dump_var("%le", inter->c_frl_line);
	}
*/
	switch (params->audio_packet_type) {
	case 0x02:
		/* unsupported
	case 0x07:
		*/
		if (params->layout == 0)
			inter->ap = 0.25;
		else if (params->layout == 1)
			inter->ap = 1.0;
		break;
	case 0x08:
		inter->ap = 0.25;

Annotation

Implementation Notes