Merge branch 'drm-next-4.18' of git://people.freedesktop.org/~agd5f/linux into drm-next
Last feature request for 4.18. Mostly vega20 support. - Vega20 support - clock and powergating for VCN - misc bug fixes Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180524152427.32713-1-alexander.deucher@amd.com
This commit is contained in:
@@ -34,10 +34,4 @@ config DEBUG_KERNEL_DC
|
||||
if you want to hit
|
||||
kdgb_break in assert.
|
||||
|
||||
config DRM_AMD_DC_VEGAM
|
||||
bool "VEGAM support"
|
||||
depends on DRM_AMD_DC
|
||||
help
|
||||
Choose this option if you want to have
|
||||
VEGAM support for display engine
|
||||
endmenu
|
||||
|
@@ -911,6 +911,7 @@ amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector)
|
||||
drm_mode_connector_update_edid_property(connector, NULL);
|
||||
aconnector->num_modes = 0;
|
||||
aconnector->dc_sink = NULL;
|
||||
aconnector->edid = NULL;
|
||||
}
|
||||
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
@@ -1115,6 +1116,7 @@ static int dce110_register_irq_handlers(struct amdgpu_device *adev)
|
||||
|
||||
if (adev->asic_type == CHIP_VEGA10 ||
|
||||
adev->asic_type == CHIP_VEGA12 ||
|
||||
adev->asic_type == CHIP_VEGA20 ||
|
||||
adev->asic_type == CHIP_RAVEN)
|
||||
client_id = SOC15_IH_CLIENTID_DCE;
|
||||
|
||||
@@ -1513,11 +1515,10 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS10:
|
||||
case CHIP_POLARIS12:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case CHIP_VEGAM:
|
||||
#endif
|
||||
case CHIP_VEGA10:
|
||||
case CHIP_VEGA12:
|
||||
case CHIP_VEGA20:
|
||||
if (dce110_register_irq_handlers(dm->adev)) {
|
||||
DRM_ERROR("DM: Failed to initialize IRQ\n");
|
||||
goto fail;
|
||||
@@ -1708,9 +1709,7 @@ static int dm_early_init(void *handle)
|
||||
adev->mode_info.plane_type = dm_plane_type_default;
|
||||
break;
|
||||
case CHIP_POLARIS10:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case CHIP_VEGAM:
|
||||
#endif
|
||||
adev->mode_info.num_crtc = 6;
|
||||
adev->mode_info.num_hpd = 6;
|
||||
adev->mode_info.num_dig = 6;
|
||||
@@ -1718,6 +1717,7 @@ static int dm_early_init(void *handle)
|
||||
break;
|
||||
case CHIP_VEGA10:
|
||||
case CHIP_VEGA12:
|
||||
case CHIP_VEGA20:
|
||||
adev->mode_info.num_crtc = 6;
|
||||
adev->mode_info.num_hpd = 6;
|
||||
adev->mode_info.num_dig = 6;
|
||||
@@ -1966,6 +1966,7 @@ static int fill_plane_attributes_from_fb(struct amdgpu_device *adev,
|
||||
|
||||
if (adev->asic_type == CHIP_VEGA10 ||
|
||||
adev->asic_type == CHIP_VEGA12 ||
|
||||
adev->asic_type == CHIP_VEGA20 ||
|
||||
adev->asic_type == CHIP_RAVEN) {
|
||||
/* Fill GFX9 params */
|
||||
plane_state->tiling_info.gfx9.num_pipes =
|
||||
|
@@ -88,9 +88,9 @@ static void __drm_lut_to_dc_gamma(struct drm_color_lut *lut,
|
||||
g = drm_color_lut_extract(lut[i].green, 16);
|
||||
b = drm_color_lut_extract(lut[i].blue, 16);
|
||||
|
||||
gamma->entries.red[i] = dal_fixed31_32_from_int(r);
|
||||
gamma->entries.green[i] = dal_fixed31_32_from_int(g);
|
||||
gamma->entries.blue[i] = dal_fixed31_32_from_int(b);
|
||||
gamma->entries.red[i] = dc_fixpt_from_int(r);
|
||||
gamma->entries.green[i] = dc_fixpt_from_int(g);
|
||||
gamma->entries.blue[i] = dc_fixpt_from_int(b);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -101,9 +101,9 @@ static void __drm_lut_to_dc_gamma(struct drm_color_lut *lut,
|
||||
g = drm_color_lut_extract(lut[i].green, 16);
|
||||
b = drm_color_lut_extract(lut[i].blue, 16);
|
||||
|
||||
gamma->entries.red[i] = dal_fixed31_32_from_fraction(r, MAX_DRM_LUT_VALUE);
|
||||
gamma->entries.green[i] = dal_fixed31_32_from_fraction(g, MAX_DRM_LUT_VALUE);
|
||||
gamma->entries.blue[i] = dal_fixed31_32_from_fraction(b, MAX_DRM_LUT_VALUE);
|
||||
gamma->entries.red[i] = dc_fixpt_from_fraction(r, MAX_DRM_LUT_VALUE);
|
||||
gamma->entries.green[i] = dc_fixpt_from_fraction(g, MAX_DRM_LUT_VALUE);
|
||||
gamma->entries.blue[i] = dc_fixpt_from_fraction(b, MAX_DRM_LUT_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,7 +208,7 @@ void amdgpu_dm_set_ctm(struct dm_crtc_state *crtc)
|
||||
for (i = 0; i < 12; i++) {
|
||||
/* Skip 4th element */
|
||||
if (i % 4 == 3) {
|
||||
stream->gamut_remap_matrix.matrix[i] = dal_fixed31_32_zero;
|
||||
stream->gamut_remap_matrix.matrix[i] = dc_fixpt_zero;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@@ -330,11 +330,6 @@ bool dm_helpers_dp_mst_send_payload_allocation(
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dm_helpers_dc_conn_log(struct dc_context *ctx, struct log_entry *entry, enum dc_log_type event)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void dm_dtn_log_begin(struct dc_context *ctx)
|
||||
{}
|
||||
|
||||
|
@@ -24,7 +24,7 @@
|
||||
# It provides the general basic services required by other DAL
|
||||
# subcomponents.
|
||||
|
||||
BASICS = conversion.o fixpt31_32.o fixpt32_32.o \
|
||||
BASICS = conversion.o fixpt31_32.o \
|
||||
logger.o log_helpers.o vector.o
|
||||
|
||||
AMD_DAL_BASICS = $(addprefix $(AMDDALPATH)/dc/basics/,$(BASICS))
|
||||
|
@@ -41,22 +41,22 @@ uint16_t fixed_point_to_int_frac(
|
||||
|
||||
uint16_t result;
|
||||
|
||||
uint16_t d = (uint16_t)dal_fixed31_32_floor(
|
||||
dal_fixed31_32_abs(
|
||||
uint16_t d = (uint16_t)dc_fixpt_floor(
|
||||
dc_fixpt_abs(
|
||||
arg));
|
||||
|
||||
if (d <= (uint16_t)(1 << integer_bits) - (1 / (uint16_t)divisor))
|
||||
numerator = (uint16_t)dal_fixed31_32_round(
|
||||
dal_fixed31_32_mul_int(
|
||||
numerator = (uint16_t)dc_fixpt_round(
|
||||
dc_fixpt_mul_int(
|
||||
arg,
|
||||
divisor));
|
||||
else {
|
||||
numerator = dal_fixed31_32_floor(
|
||||
dal_fixed31_32_sub(
|
||||
dal_fixed31_32_from_int(
|
||||
numerator = dc_fixpt_floor(
|
||||
dc_fixpt_sub(
|
||||
dc_fixpt_from_int(
|
||||
1LL << integer_bits),
|
||||
dal_fixed31_32_recip(
|
||||
dal_fixed31_32_from_int(
|
||||
dc_fixpt_recip(
|
||||
dc_fixpt_from_int(
|
||||
divisor))));
|
||||
}
|
||||
|
||||
@@ -66,8 +66,8 @@ uint16_t fixed_point_to_int_frac(
|
||||
result = (uint16_t)(
|
||||
(1 << (integer_bits + fractional_bits + 1)) + numerator);
|
||||
|
||||
if ((result != 0) && dal_fixed31_32_lt(
|
||||
arg, dal_fixed31_32_zero))
|
||||
if ((result != 0) && dc_fixpt_lt(
|
||||
arg, dc_fixpt_zero))
|
||||
result |= 1 << (integer_bits + fractional_bits);
|
||||
|
||||
return result;
|
||||
@@ -84,15 +84,15 @@ void convert_float_matrix(
|
||||
uint32_t buffer_size)
|
||||
{
|
||||
const struct fixed31_32 min_2_13 =
|
||||
dal_fixed31_32_from_fraction(S2D13_MIN, DIVIDER);
|
||||
dc_fixpt_from_fraction(S2D13_MIN, DIVIDER);
|
||||
const struct fixed31_32 max_2_13 =
|
||||
dal_fixed31_32_from_fraction(S2D13_MAX, DIVIDER);
|
||||
dc_fixpt_from_fraction(S2D13_MAX, DIVIDER);
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < buffer_size; ++i) {
|
||||
uint32_t reg_value =
|
||||
fixed_point_to_int_frac(
|
||||
dal_fixed31_32_clamp(
|
||||
dc_fixpt_clamp(
|
||||
flt[i],
|
||||
min_2_13,
|
||||
max_2_13),
|
||||
|
@@ -64,9 +64,7 @@ static inline unsigned long long complete_integer_division_u64(
|
||||
#define GET_FRACTIONAL_PART(x) \
|
||||
(FRACTIONAL_PART_MASK & (x))
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_from_fraction(
|
||||
long long numerator,
|
||||
long long denominator)
|
||||
struct fixed31_32 dc_fixpt_from_fraction(long long numerator, long long denominator)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
@@ -118,63 +116,7 @@ struct fixed31_32 dal_fixed31_32_from_fraction(
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_from_int_nonconst(
|
||||
long long arg)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
ASSERT((LONG_MIN <= arg) && (arg <= LONG_MAX));
|
||||
|
||||
res.value = arg << FIXED31_32_BITS_PER_FRACTIONAL_PART;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_shl(
|
||||
struct fixed31_32 arg,
|
||||
unsigned char shift)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
ASSERT(((arg.value >= 0) && (arg.value <= LLONG_MAX >> shift)) ||
|
||||
((arg.value < 0) && (arg.value >= LLONG_MIN >> shift)));
|
||||
|
||||
res.value = arg.value << shift;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_add(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
ASSERT(((arg1.value >= 0) && (LLONG_MAX - arg1.value >= arg2.value)) ||
|
||||
((arg1.value < 0) && (LLONG_MIN - arg1.value <= arg2.value)));
|
||||
|
||||
res.value = arg1.value + arg2.value;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_sub(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
ASSERT(((arg2.value >= 0) && (LLONG_MIN + arg2.value <= arg1.value)) ||
|
||||
((arg2.value < 0) && (LLONG_MAX + arg2.value >= arg1.value)));
|
||||
|
||||
res.value = arg1.value - arg2.value;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_mul(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
struct fixed31_32 dc_fixpt_mul(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
@@ -213,7 +155,7 @@ struct fixed31_32 dal_fixed31_32_mul(
|
||||
tmp = arg1_fra * arg2_fra;
|
||||
|
||||
tmp = (tmp >> FIXED31_32_BITS_PER_FRACTIONAL_PART) +
|
||||
(tmp >= (unsigned long long)dal_fixed31_32_half.value);
|
||||
(tmp >= (unsigned long long)dc_fixpt_half.value);
|
||||
|
||||
ASSERT(tmp <= (unsigned long long)(LLONG_MAX - res.value));
|
||||
|
||||
@@ -225,8 +167,7 @@ struct fixed31_32 dal_fixed31_32_mul(
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_sqr(
|
||||
struct fixed31_32 arg)
|
||||
struct fixed31_32 dc_fixpt_sqr(struct fixed31_32 arg)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
@@ -257,7 +198,7 @@ struct fixed31_32 dal_fixed31_32_sqr(
|
||||
tmp = arg_fra * arg_fra;
|
||||
|
||||
tmp = (tmp >> FIXED31_32_BITS_PER_FRACTIONAL_PART) +
|
||||
(tmp >= (unsigned long long)dal_fixed31_32_half.value);
|
||||
(tmp >= (unsigned long long)dc_fixpt_half.value);
|
||||
|
||||
ASSERT(tmp <= (unsigned long long)(LLONG_MAX - res.value));
|
||||
|
||||
@@ -266,8 +207,7 @@ struct fixed31_32 dal_fixed31_32_sqr(
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_recip(
|
||||
struct fixed31_32 arg)
|
||||
struct fixed31_32 dc_fixpt_recip(struct fixed31_32 arg)
|
||||
{
|
||||
/*
|
||||
* @note
|
||||
@@ -276,41 +216,40 @@ struct fixed31_32 dal_fixed31_32_recip(
|
||||
|
||||
ASSERT(arg.value);
|
||||
|
||||
return dal_fixed31_32_from_fraction(
|
||||
dal_fixed31_32_one.value,
|
||||
return dc_fixpt_from_fraction(
|
||||
dc_fixpt_one.value,
|
||||
arg.value);
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_sinc(
|
||||
struct fixed31_32 arg)
|
||||
struct fixed31_32 dc_fixpt_sinc(struct fixed31_32 arg)
|
||||
{
|
||||
struct fixed31_32 square;
|
||||
|
||||
struct fixed31_32 res = dal_fixed31_32_one;
|
||||
struct fixed31_32 res = dc_fixpt_one;
|
||||
|
||||
int n = 27;
|
||||
|
||||
struct fixed31_32 arg_norm = arg;
|
||||
|
||||
if (dal_fixed31_32_le(
|
||||
dal_fixed31_32_two_pi,
|
||||
dal_fixed31_32_abs(arg))) {
|
||||
arg_norm = dal_fixed31_32_sub(
|
||||
if (dc_fixpt_le(
|
||||
dc_fixpt_two_pi,
|
||||
dc_fixpt_abs(arg))) {
|
||||
arg_norm = dc_fixpt_sub(
|
||||
arg_norm,
|
||||
dal_fixed31_32_mul_int(
|
||||
dal_fixed31_32_two_pi,
|
||||
dc_fixpt_mul_int(
|
||||
dc_fixpt_two_pi,
|
||||
(int)div64_s64(
|
||||
arg_norm.value,
|
||||
dal_fixed31_32_two_pi.value)));
|
||||
dc_fixpt_two_pi.value)));
|
||||
}
|
||||
|
||||
square = dal_fixed31_32_sqr(arg_norm);
|
||||
square = dc_fixpt_sqr(arg_norm);
|
||||
|
||||
do {
|
||||
res = dal_fixed31_32_sub(
|
||||
dal_fixed31_32_one,
|
||||
dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_mul(
|
||||
res = dc_fixpt_sub(
|
||||
dc_fixpt_one,
|
||||
dc_fixpt_div_int(
|
||||
dc_fixpt_mul(
|
||||
square,
|
||||
res),
|
||||
n * (n - 1)));
|
||||
@@ -319,37 +258,35 @@ struct fixed31_32 dal_fixed31_32_sinc(
|
||||
} while (n > 2);
|
||||
|
||||
if (arg.value != arg_norm.value)
|
||||
res = dal_fixed31_32_div(
|
||||
dal_fixed31_32_mul(res, arg_norm),
|
||||
res = dc_fixpt_div(
|
||||
dc_fixpt_mul(res, arg_norm),
|
||||
arg);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_sin(
|
||||
struct fixed31_32 arg)
|
||||
struct fixed31_32 dc_fixpt_sin(struct fixed31_32 arg)
|
||||
{
|
||||
return dal_fixed31_32_mul(
|
||||
return dc_fixpt_mul(
|
||||
arg,
|
||||
dal_fixed31_32_sinc(arg));
|
||||
dc_fixpt_sinc(arg));
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_cos(
|
||||
struct fixed31_32 arg)
|
||||
struct fixed31_32 dc_fixpt_cos(struct fixed31_32 arg)
|
||||
{
|
||||
/* TODO implement argument normalization */
|
||||
|
||||
const struct fixed31_32 square = dal_fixed31_32_sqr(arg);
|
||||
const struct fixed31_32 square = dc_fixpt_sqr(arg);
|
||||
|
||||
struct fixed31_32 res = dal_fixed31_32_one;
|
||||
struct fixed31_32 res = dc_fixpt_one;
|
||||
|
||||
int n = 26;
|
||||
|
||||
do {
|
||||
res = dal_fixed31_32_sub(
|
||||
dal_fixed31_32_one,
|
||||
dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_mul(
|
||||
res = dc_fixpt_sub(
|
||||
dc_fixpt_one,
|
||||
dc_fixpt_div_int(
|
||||
dc_fixpt_mul(
|
||||
square,
|
||||
res),
|
||||
n * (n - 1)));
|
||||
@@ -367,37 +304,35 @@ struct fixed31_32 dal_fixed31_32_cos(
|
||||
*
|
||||
* Calculated as Taylor series.
|
||||
*/
|
||||
static struct fixed31_32 fixed31_32_exp_from_taylor_series(
|
||||
struct fixed31_32 arg)
|
||||
static struct fixed31_32 fixed31_32_exp_from_taylor_series(struct fixed31_32 arg)
|
||||
{
|
||||
unsigned int n = 9;
|
||||
|
||||
struct fixed31_32 res = dal_fixed31_32_from_fraction(
|
||||
struct fixed31_32 res = dc_fixpt_from_fraction(
|
||||
n + 2,
|
||||
n + 1);
|
||||
/* TODO find correct res */
|
||||
|
||||
ASSERT(dal_fixed31_32_lt(arg, dal_fixed31_32_one));
|
||||
ASSERT(dc_fixpt_lt(arg, dc_fixpt_one));
|
||||
|
||||
do
|
||||
res = dal_fixed31_32_add(
|
||||
dal_fixed31_32_one,
|
||||
dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_mul(
|
||||
res = dc_fixpt_add(
|
||||
dc_fixpt_one,
|
||||
dc_fixpt_div_int(
|
||||
dc_fixpt_mul(
|
||||
arg,
|
||||
res),
|
||||
n));
|
||||
while (--n != 1);
|
||||
|
||||
return dal_fixed31_32_add(
|
||||
dal_fixed31_32_one,
|
||||
dal_fixed31_32_mul(
|
||||
return dc_fixpt_add(
|
||||
dc_fixpt_one,
|
||||
dc_fixpt_mul(
|
||||
arg,
|
||||
res));
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_exp(
|
||||
struct fixed31_32 arg)
|
||||
struct fixed31_32 dc_fixpt_exp(struct fixed31_32 arg)
|
||||
{
|
||||
/*
|
||||
* @brief
|
||||
@@ -406,44 +341,43 @@ struct fixed31_32 dal_fixed31_32_exp(
|
||||
* where m = round(x / ln(2)), r = x - m * ln(2)
|
||||
*/
|
||||
|
||||
if (dal_fixed31_32_le(
|
||||
dal_fixed31_32_ln2_div_2,
|
||||
dal_fixed31_32_abs(arg))) {
|
||||
int m = dal_fixed31_32_round(
|
||||
dal_fixed31_32_div(
|
||||
if (dc_fixpt_le(
|
||||
dc_fixpt_ln2_div_2,
|
||||
dc_fixpt_abs(arg))) {
|
||||
int m = dc_fixpt_round(
|
||||
dc_fixpt_div(
|
||||
arg,
|
||||
dal_fixed31_32_ln2));
|
||||
dc_fixpt_ln2));
|
||||
|
||||
struct fixed31_32 r = dal_fixed31_32_sub(
|
||||
struct fixed31_32 r = dc_fixpt_sub(
|
||||
arg,
|
||||
dal_fixed31_32_mul_int(
|
||||
dal_fixed31_32_ln2,
|
||||
dc_fixpt_mul_int(
|
||||
dc_fixpt_ln2,
|
||||
m));
|
||||
|
||||
ASSERT(m != 0);
|
||||
|
||||
ASSERT(dal_fixed31_32_lt(
|
||||
dal_fixed31_32_abs(r),
|
||||
dal_fixed31_32_one));
|
||||
ASSERT(dc_fixpt_lt(
|
||||
dc_fixpt_abs(r),
|
||||
dc_fixpt_one));
|
||||
|
||||
if (m > 0)
|
||||
return dal_fixed31_32_shl(
|
||||
return dc_fixpt_shl(
|
||||
fixed31_32_exp_from_taylor_series(r),
|
||||
(unsigned char)m);
|
||||
else
|
||||
return dal_fixed31_32_div_int(
|
||||
return dc_fixpt_div_int(
|
||||
fixed31_32_exp_from_taylor_series(r),
|
||||
1LL << -m);
|
||||
} else if (arg.value != 0)
|
||||
return fixed31_32_exp_from_taylor_series(arg);
|
||||
else
|
||||
return dal_fixed31_32_one;
|
||||
return dc_fixpt_one;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_log(
|
||||
struct fixed31_32 arg)
|
||||
struct fixed31_32 dc_fixpt_log(struct fixed31_32 arg)
|
||||
{
|
||||
struct fixed31_32 res = dal_fixed31_32_neg(dal_fixed31_32_one);
|
||||
struct fixed31_32 res = dc_fixpt_neg(dc_fixpt_one);
|
||||
/* TODO improve 1st estimation */
|
||||
|
||||
struct fixed31_32 error;
|
||||
@@ -453,15 +387,15 @@ struct fixed31_32 dal_fixed31_32_log(
|
||||
/* TODO if arg is zero, return -INF */
|
||||
|
||||
do {
|
||||
struct fixed31_32 res1 = dal_fixed31_32_add(
|
||||
dal_fixed31_32_sub(
|
||||
struct fixed31_32 res1 = dc_fixpt_add(
|
||||
dc_fixpt_sub(
|
||||
res,
|
||||
dal_fixed31_32_one),
|
||||
dal_fixed31_32_div(
|
||||
dc_fixpt_one),
|
||||
dc_fixpt_div(
|
||||
arg,
|
||||
dal_fixed31_32_exp(res)));
|
||||
dc_fixpt_exp(res)));
|
||||
|
||||
error = dal_fixed31_32_sub(
|
||||
error = dc_fixpt_sub(
|
||||
res,
|
||||
res1);
|
||||
|
||||
@@ -472,66 +406,11 @@ struct fixed31_32 dal_fixed31_32_log(
|
||||
return res;
|
||||
}
|
||||
|
||||
struct fixed31_32 dal_fixed31_32_pow(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
{
|
||||
return dal_fixed31_32_exp(
|
||||
dal_fixed31_32_mul(
|
||||
dal_fixed31_32_log(arg1),
|
||||
arg2));
|
||||
}
|
||||
|
||||
int dal_fixed31_32_floor(
|
||||
struct fixed31_32 arg)
|
||||
{
|
||||
unsigned long long arg_value = abs_i64(arg.value);
|
||||
|
||||
if (arg.value >= 0)
|
||||
return (int)GET_INTEGER_PART(arg_value);
|
||||
else
|
||||
return -(int)GET_INTEGER_PART(arg_value);
|
||||
}
|
||||
|
||||
int dal_fixed31_32_round(
|
||||
struct fixed31_32 arg)
|
||||
{
|
||||
unsigned long long arg_value = abs_i64(arg.value);
|
||||
|
||||
const long long summand = dal_fixed31_32_half.value;
|
||||
|
||||
ASSERT(LLONG_MAX - (long long)arg_value >= summand);
|
||||
|
||||
arg_value += summand;
|
||||
|
||||
if (arg.value >= 0)
|
||||
return (int)GET_INTEGER_PART(arg_value);
|
||||
else
|
||||
return -(int)GET_INTEGER_PART(arg_value);
|
||||
}
|
||||
|
||||
int dal_fixed31_32_ceil(
|
||||
struct fixed31_32 arg)
|
||||
{
|
||||
unsigned long long arg_value = abs_i64(arg.value);
|
||||
|
||||
const long long summand = dal_fixed31_32_one.value -
|
||||
dal_fixed31_32_epsilon.value;
|
||||
|
||||
ASSERT(LLONG_MAX - (long long)arg_value >= summand);
|
||||
|
||||
arg_value += summand;
|
||||
|
||||
if (arg.value >= 0)
|
||||
return (int)GET_INTEGER_PART(arg_value);
|
||||
else
|
||||
return -(int)GET_INTEGER_PART(arg_value);
|
||||
}
|
||||
|
||||
/* this function is a generic helper to translate fixed point value to
|
||||
* specified integer format that will consist of integer_bits integer part and
|
||||
* fractional_bits fractional part. For example it is used in
|
||||
* dal_fixed31_32_u2d19 to receive 2 bits integer part and 19 bits fractional
|
||||
* dc_fixpt_u2d19 to receive 2 bits integer part and 19 bits fractional
|
||||
* part in 32 bits. It is used in hw programming (scaler)
|
||||
*/
|
||||
|
||||
@@ -570,35 +449,30 @@ static inline unsigned int clamp_ux_dy(
|
||||
return min_clamp;
|
||||
}
|
||||
|
||||
unsigned int dal_fixed31_32_u2d19(
|
||||
struct fixed31_32 arg)
|
||||
unsigned int dc_fixpt_u2d19(struct fixed31_32 arg)
|
||||
{
|
||||
return ux_dy(arg.value, 2, 19);
|
||||
}
|
||||
|
||||
unsigned int dal_fixed31_32_u0d19(
|
||||
struct fixed31_32 arg)
|
||||
unsigned int dc_fixpt_u0d19(struct fixed31_32 arg)
|
||||
{
|
||||
return ux_dy(arg.value, 0, 19);
|
||||
}
|
||||
|
||||
unsigned int dal_fixed31_32_clamp_u0d14(
|
||||
struct fixed31_32 arg)
|
||||
unsigned int dc_fixpt_clamp_u0d14(struct fixed31_32 arg)
|
||||
{
|
||||
return clamp_ux_dy(arg.value, 0, 14, 1);
|
||||
}
|
||||
|
||||
unsigned int dal_fixed31_32_clamp_u0d10(
|
||||
struct fixed31_32 arg)
|
||||
unsigned int dc_fixpt_clamp_u0d10(struct fixed31_32 arg)
|
||||
{
|
||||
return clamp_ux_dy(arg.value, 0, 10, 1);
|
||||
}
|
||||
|
||||
int dal_fixed31_32_s4d19(
|
||||
struct fixed31_32 arg)
|
||||
int dc_fixpt_s4d19(struct fixed31_32 arg)
|
||||
{
|
||||
if (arg.value < 0)
|
||||
return -(int)ux_dy(dal_fixed31_32_abs(arg).value, 4, 19);
|
||||
return -(int)ux_dy(dc_fixpt_abs(arg).value, 4, 19);
|
||||
else
|
||||
return ux_dy(arg.value, 4, 19);
|
||||
}
|
||||
|
@@ -1,161 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-15 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: AMD
|
||||
*
|
||||
*/
|
||||
|
||||
#include "dm_services.h"
|
||||
#include "include/fixed32_32.h"
|
||||
|
||||
static uint64_t u64_div(uint64_t n, uint64_t d)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
uint64_t r;
|
||||
uint64_t q = div64_u64_rem(n, d, &r);
|
||||
|
||||
for (i = 0; i < 32; ++i) {
|
||||
uint64_t sbit = q & (1ULL<<63);
|
||||
|
||||
r <<= 1;
|
||||
r |= sbit ? 1 : 0;
|
||||
q <<= 1;
|
||||
if (r >= d) {
|
||||
r -= d;
|
||||
q |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (2*r >= d)
|
||||
q += 1;
|
||||
return q;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_from_fraction(uint32_t n, uint32_t d)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
|
||||
fx.value = u64_div((uint64_t)n << 32, (uint64_t)d << 32);
|
||||
return fx;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_add(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs)
|
||||
{
|
||||
struct fixed32_32 fx = {lhs.value + rhs.value};
|
||||
|
||||
ASSERT(fx.value >= rhs.value);
|
||||
return fx;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_add_int(struct fixed32_32 lhs, uint32_t rhs)
|
||||
{
|
||||
struct fixed32_32 fx = {lhs.value + ((uint64_t)rhs << 32)};
|
||||
|
||||
ASSERT(fx.value >= (uint64_t)rhs << 32);
|
||||
return fx;
|
||||
|
||||
}
|
||||
struct fixed32_32 dal_fixed32_32_sub(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
|
||||
ASSERT(lhs.value >= rhs.value);
|
||||
fx.value = lhs.value - rhs.value;
|
||||
return fx;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_sub_int(struct fixed32_32 lhs, uint32_t rhs)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
|
||||
ASSERT(lhs.value >= ((uint64_t)rhs<<32));
|
||||
fx.value = lhs.value - ((uint64_t)rhs<<32);
|
||||
return fx;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_mul(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
uint64_t lhs_int = lhs.value>>32;
|
||||
uint64_t lhs_frac = (uint32_t)lhs.value;
|
||||
uint64_t rhs_int = rhs.value>>32;
|
||||
uint64_t rhs_frac = (uint32_t)rhs.value;
|
||||
uint64_t ahbh = lhs_int * rhs_int;
|
||||
uint64_t ahbl = lhs_int * rhs_frac;
|
||||
uint64_t albh = lhs_frac * rhs_int;
|
||||
uint64_t albl = lhs_frac * rhs_frac;
|
||||
|
||||
ASSERT((ahbh>>32) == 0);
|
||||
|
||||
fx.value = (ahbh<<32) + ahbl + albh + (albl>>32);
|
||||
return fx;
|
||||
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_mul_int(struct fixed32_32 lhs, uint32_t rhs)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
uint64_t lhsi = (lhs.value>>32) * (uint64_t)rhs;
|
||||
uint64_t lhsf;
|
||||
|
||||
ASSERT((lhsi>>32) == 0);
|
||||
lhsf = ((uint32_t)lhs.value) * (uint64_t)rhs;
|
||||
ASSERT((lhsi<<32) + lhsf >= lhsf);
|
||||
fx.value = (lhsi<<32) + lhsf;
|
||||
return fx;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_div(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
|
||||
fx.value = u64_div(lhs.value, rhs.value);
|
||||
return fx;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_div_int(struct fixed32_32 lhs, uint32_t rhs)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
|
||||
fx.value = u64_div(lhs.value, (uint64_t)rhs << 32);
|
||||
return fx;
|
||||
}
|
||||
|
||||
uint32_t dal_fixed32_32_ceil(struct fixed32_32 v)
|
||||
{
|
||||
ASSERT((uint32_t)v.value ? (v.value >> 32) + 1 >= 1 : true);
|
||||
return (v.value>>32) + ((uint32_t)v.value ? 1 : 0);
|
||||
}
|
||||
|
||||
uint32_t dal_fixed32_32_round(struct fixed32_32 v)
|
||||
{
|
||||
ASSERT(v.value + (1ULL<<31) >= (1ULL<<31));
|
||||
return (v.value + (1ULL<<31))>>32;
|
||||
}
|
||||
|
@@ -94,7 +94,6 @@ void dc_conn_log(struct dc_context *ctx,
|
||||
dm_logger_append(&entry, "%2.2X ", hex_data[i]);
|
||||
|
||||
dm_logger_append(&entry, "^\n");
|
||||
dm_helpers_dc_conn_log(ctx, &entry, event);
|
||||
|
||||
fail:
|
||||
dm_logger_close(&entry);
|
||||
|
@@ -61,7 +61,7 @@ static const struct dc_log_type_info log_type_info_tbl[] = {
|
||||
{LOG_EVENT_UNDERFLOW, "Underflow"},
|
||||
{LOG_IF_TRACE, "InterfaceTrace"},
|
||||
{LOG_DTN, "DTN"},
|
||||
{LOG_PROFILING, "Profiling"}
|
||||
{LOG_DISPLAYSTATS, "DisplayStats"}
|
||||
};
|
||||
|
||||
|
||||
@@ -402,3 +402,4 @@ cleanup:
|
||||
entry->max_buf_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1330,6 +1330,9 @@ static enum bp_result bios_parser_get_firmware_info(
|
||||
case 2:
|
||||
result = get_firmware_info_v3_2(bp, info);
|
||||
break;
|
||||
case 3:
|
||||
result = get_firmware_info_v3_2(bp, info);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@@ -51,9 +51,7 @@ bool dal_bios_parser_init_cmd_tbl_helper(
|
||||
return true;
|
||||
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
*h = dal_cmd_tbl_helper_dce112_get_table();
|
||||
return true;
|
||||
|
||||
|
@@ -52,9 +52,7 @@ bool dal_bios_parser_init_cmd_tbl_helper2(
|
||||
return true;
|
||||
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
*h = dal_cmd_tbl_helper_dce112_get_table2();
|
||||
return true;
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
|
||||
|
@@ -36,41 +36,41 @@ static bool build_custom_float(
|
||||
uint32_t exp_offset = (1 << (format->exponenta_bits - 1)) - 1;
|
||||
|
||||
const struct fixed31_32 mantissa_constant_plus_max_fraction =
|
||||
dal_fixed31_32_from_fraction(
|
||||
dc_fixpt_from_fraction(
|
||||
(1LL << (format->mantissa_bits + 1)) - 1,
|
||||
1LL << format->mantissa_bits);
|
||||
|
||||
struct fixed31_32 mantiss;
|
||||
|
||||
if (dal_fixed31_32_eq(
|
||||
if (dc_fixpt_eq(
|
||||
value,
|
||||
dal_fixed31_32_zero)) {
|
||||
dc_fixpt_zero)) {
|
||||
*negative = false;
|
||||
*mantissa = 0;
|
||||
*exponenta = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dal_fixed31_32_lt(
|
||||
if (dc_fixpt_lt(
|
||||
value,
|
||||
dal_fixed31_32_zero)) {
|
||||
dc_fixpt_zero)) {
|
||||
*negative = format->sign;
|
||||
value = dal_fixed31_32_neg(value);
|
||||
value = dc_fixpt_neg(value);
|
||||
} else {
|
||||
*negative = false;
|
||||
}
|
||||
|
||||
if (dal_fixed31_32_lt(
|
||||
if (dc_fixpt_lt(
|
||||
value,
|
||||
dal_fixed31_32_one)) {
|
||||
dc_fixpt_one)) {
|
||||
uint32_t i = 1;
|
||||
|
||||
do {
|
||||
value = dal_fixed31_32_shl(value, 1);
|
||||
value = dc_fixpt_shl(value, 1);
|
||||
++i;
|
||||
} while (dal_fixed31_32_lt(
|
||||
} while (dc_fixpt_lt(
|
||||
value,
|
||||
dal_fixed31_32_one));
|
||||
dc_fixpt_one));
|
||||
|
||||
--i;
|
||||
|
||||
@@ -81,15 +81,15 @@ static bool build_custom_float(
|
||||
}
|
||||
|
||||
*exponenta = exp_offset - i;
|
||||
} else if (dal_fixed31_32_le(
|
||||
} else if (dc_fixpt_le(
|
||||
mantissa_constant_plus_max_fraction,
|
||||
value)) {
|
||||
uint32_t i = 1;
|
||||
|
||||
do {
|
||||
value = dal_fixed31_32_shr(value, 1);
|
||||
value = dc_fixpt_shr(value, 1);
|
||||
++i;
|
||||
} while (dal_fixed31_32_lt(
|
||||
} while (dc_fixpt_lt(
|
||||
mantissa_constant_plus_max_fraction,
|
||||
value));
|
||||
|
||||
@@ -98,23 +98,23 @@ static bool build_custom_float(
|
||||
*exponenta = exp_offset;
|
||||
}
|
||||
|
||||
mantiss = dal_fixed31_32_sub(
|
||||
mantiss = dc_fixpt_sub(
|
||||
value,
|
||||
dal_fixed31_32_one);
|
||||
dc_fixpt_one);
|
||||
|
||||
if (dal_fixed31_32_lt(
|
||||
if (dc_fixpt_lt(
|
||||
mantiss,
|
||||
dal_fixed31_32_zero) ||
|
||||
dal_fixed31_32_lt(
|
||||
dal_fixed31_32_one,
|
||||
dc_fixpt_zero) ||
|
||||
dc_fixpt_lt(
|
||||
dc_fixpt_one,
|
||||
mantiss))
|
||||
mantiss = dal_fixed31_32_zero;
|
||||
mantiss = dc_fixpt_zero;
|
||||
else
|
||||
mantiss = dal_fixed31_32_shl(
|
||||
mantiss = dc_fixpt_shl(
|
||||
mantiss,
|
||||
format->mantissa_bits);
|
||||
|
||||
*mantissa = dal_fixed31_32_floor(mantiss);
|
||||
*mantissa = dc_fixpt_floor(mantiss);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@@ -59,10 +59,8 @@ static enum bw_calcs_version bw_calcs_version_from_asic_id(struct hw_asic_id asi
|
||||
return BW_CALCS_VERSION_POLARIS10;
|
||||
if (ASIC_REV_IS_POLARIS11_M(asic_id.hw_internal_rev))
|
||||
return BW_CALCS_VERSION_POLARIS11;
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
if (ASIC_REV_IS_VEGAM(asic_id.hw_internal_rev))
|
||||
return BW_CALCS_VERSION_VEGAM;
|
||||
#endif
|
||||
return BW_CALCS_VERSION_INVALID;
|
||||
|
||||
case FAMILY_AI:
|
||||
@@ -2151,11 +2149,9 @@ void bw_calcs_init(struct bw_calcs_dceip *bw_dceip,
|
||||
dceip.mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0); /* todo: this is a bug*/
|
||||
break;
|
||||
case BW_CALCS_VERSION_POLARIS10:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
/* TODO: Treat VEGAM the same as P10 for now
|
||||
* Need to tune the para for VEGAM if needed */
|
||||
case BW_CALCS_VERSION_VEGAM:
|
||||
#endif
|
||||
vbios.memory_type = bw_def_gddr5;
|
||||
vbios.dram_channel_width_in_bits = 32;
|
||||
vbios.number_of_dram_channels = asic_id.vram_width / vbios.dram_channel_width_in_bits;
|
||||
|
@@ -873,14 +873,14 @@ bool dcn_validate_bandwidth(
|
||||
}
|
||||
|
||||
if (pipe->plane_state->rotation % 2 == 0) {
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.horz.value != dal_fixed31_32_one.value
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.horz.value != dc_fixpt_one.value
|
||||
|| v->scaler_rec_out_width[input_idx] == v->viewport_width[input_idx]);
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.vert.value != dal_fixed31_32_one.value
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.vert.value != dc_fixpt_one.value
|
||||
|| v->scaler_recout_height[input_idx] == v->viewport_height[input_idx]);
|
||||
} else {
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.horz.value != dal_fixed31_32_one.value
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.horz.value != dc_fixpt_one.value
|
||||
|| v->scaler_recout_height[input_idx] == v->viewport_width[input_idx]);
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.vert.value != dal_fixed31_32_one.value
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.vert.value != dc_fixpt_one.value
|
||||
|| v->scaler_rec_out_width[input_idx] == v->viewport_height[input_idx]);
|
||||
}
|
||||
v->dcc_enable[input_idx] = pipe->plane_state->dcc.enable ? dcn_bw_yes : dcn_bw_no;
|
||||
|
@@ -469,6 +469,13 @@ static void link_disconnect_sink(struct dc_link *link)
|
||||
link->dpcd_sink_count = 0;
|
||||
}
|
||||
|
||||
static void link_disconnect_remap(struct dc_sink *prev_sink, struct dc_link *link)
|
||||
{
|
||||
dc_sink_release(link->local_sink);
|
||||
link->local_sink = prev_sink;
|
||||
}
|
||||
|
||||
|
||||
static bool detect_dp(
|
||||
struct dc_link *link,
|
||||
struct display_sink_capability *sink_caps,
|
||||
@@ -551,6 +558,17 @@ static bool detect_dp(
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool is_same_edid(struct dc_edid *old_edid, struct dc_edid *new_edid)
|
||||
{
|
||||
if (old_edid->length != new_edid->length)
|
||||
return false;
|
||||
|
||||
if (new_edid->length == 0)
|
||||
return false;
|
||||
|
||||
return (memcmp(old_edid->raw_edid, new_edid->raw_edid, new_edid->length) == 0);
|
||||
}
|
||||
|
||||
bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
{
|
||||
struct dc_sink_init_data sink_init_data = { 0 };
|
||||
@@ -558,9 +576,13 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
uint8_t i;
|
||||
bool converter_disable_audio = false;
|
||||
struct audio_support *aud_support = &link->dc->res_pool->audio_support;
|
||||
bool same_edid = false;
|
||||
enum dc_edid_status edid_status;
|
||||
struct dc_context *dc_ctx = link->ctx;
|
||||
struct dc_sink *sink = NULL;
|
||||
struct dc_sink *prev_sink = NULL;
|
||||
struct dpcd_caps prev_dpcd_caps;
|
||||
bool same_dpcd = true;
|
||||
enum dc_connection_type new_connection_type = dc_connection_none;
|
||||
DC_LOGGER_INIT(link->ctx->logger);
|
||||
if (link->connector_signal == SIGNAL_TYPE_VIRTUAL)
|
||||
@@ -575,6 +597,11 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
link->local_sink)
|
||||
return true;
|
||||
|
||||
prev_sink = link->local_sink;
|
||||
if (prev_sink != NULL) {
|
||||
dc_sink_retain(prev_sink);
|
||||
memcpy(&prev_dpcd_caps, &link->dpcd_caps, sizeof(struct dpcd_caps));
|
||||
}
|
||||
link_disconnect_sink(link);
|
||||
|
||||
if (new_connection_type != dc_connection_none) {
|
||||
@@ -616,14 +643,25 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
link,
|
||||
&sink_caps,
|
||||
&converter_disable_audio,
|
||||
aud_support, reason))
|
||||
aud_support, reason)) {
|
||||
if (prev_sink != NULL)
|
||||
dc_sink_release(prev_sink);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if dpcp block is the same
|
||||
if (prev_sink != NULL) {
|
||||
if (memcmp(&link->dpcd_caps, &prev_dpcd_caps, sizeof(struct dpcd_caps)))
|
||||
same_dpcd = false;
|
||||
}
|
||||
/* Active dongle downstream unplug */
|
||||
if (link->type == dc_connection_active_dongle
|
||||
&& link->dpcd_caps.sink_count.
|
||||
bits.SINK_COUNT == 0)
|
||||
bits.SINK_COUNT == 0) {
|
||||
if (prev_sink != NULL)
|
||||
dc_sink_release(prev_sink);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (link->type == dc_connection_mst_branch) {
|
||||
LINK_INFO("link=%d, mst branch is now Connected\n",
|
||||
@@ -631,9 +669,11 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
/* Need to setup mst link_cap struct here
|
||||
* otherwise dc_link_detect() will leave mst link_cap
|
||||
* empty which leads to allocate_mst_payload() has "0"
|
||||
* pbn_per_slot value leading to exception on dal_fixed31_32_div()
|
||||
* pbn_per_slot value leading to exception on dc_fixpt_div()
|
||||
*/
|
||||
link->verified_link_cap = link->reported_link_cap;
|
||||
if (prev_sink != NULL)
|
||||
dc_sink_release(prev_sink);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -643,6 +683,8 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
default:
|
||||
DC_ERROR("Invalid connector type! signal:%d\n",
|
||||
link->connector_signal);
|
||||
if (prev_sink != NULL)
|
||||
dc_sink_release(prev_sink);
|
||||
return false;
|
||||
} /* switch() */
|
||||
|
||||
@@ -665,6 +707,8 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
sink = dc_sink_create(&sink_init_data);
|
||||
if (!sink) {
|
||||
DC_ERROR("Failed to create sink!\n");
|
||||
if (prev_sink != NULL)
|
||||
dc_sink_release(prev_sink);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -688,23 +732,34 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
break;
|
||||
}
|
||||
|
||||
if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
|
||||
sink_caps.transaction_type ==
|
||||
DDC_TRANSACTION_TYPE_I2C_OVER_AUX) {
|
||||
/*
|
||||
* TODO debug why Dell 2413 doesn't like
|
||||
* two link trainings
|
||||
*/
|
||||
// Check if edid is the same
|
||||
if ((prev_sink != NULL) && ((edid_status == EDID_THE_SAME) || (edid_status == EDID_OK)))
|
||||
same_edid = is_same_edid(&prev_sink->dc_edid, &sink->dc_edid);
|
||||
|
||||
/* deal with non-mst cases */
|
||||
dp_hbr_verify_link_cap(link, &link->reported_link_cap);
|
||||
// If both edid and dpcd are the same, then discard new sink and revert back to original sink
|
||||
if ((same_edid) && (same_dpcd)) {
|
||||
link_disconnect_remap(prev_sink, link);
|
||||
sink = prev_sink;
|
||||
prev_sink = NULL;
|
||||
} else {
|
||||
if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
|
||||
sink_caps.transaction_type ==
|
||||
DDC_TRANSACTION_TYPE_I2C_OVER_AUX) {
|
||||
/*
|
||||
* TODO debug why Dell 2413 doesn't like
|
||||
* two link trainings
|
||||
*/
|
||||
|
||||
/* deal with non-mst cases */
|
||||
dp_hbr_verify_link_cap(link, &link->reported_link_cap);
|
||||
}
|
||||
|
||||
/* HDMI-DVI Dongle */
|
||||
if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
|
||||
!sink->edid_caps.edid_hdmi)
|
||||
sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
|
||||
}
|
||||
|
||||
/* HDMI-DVI Dongle */
|
||||
if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
|
||||
!sink->edid_caps.edid_hdmi)
|
||||
sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
|
||||
|
||||
/* Connectivity log: detection */
|
||||
for (i = 0; i < sink->dc_edid.length / EDID_BLOCK_SIZE; i++) {
|
||||
CONN_DATA_DETECT(link,
|
||||
@@ -762,10 +817,14 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
sink_caps.signal = SIGNAL_TYPE_NONE;
|
||||
}
|
||||
|
||||
LINK_INFO("link=%d, dc_sink_in=%p is now %s\n",
|
||||
LINK_INFO("link=%d, dc_sink_in=%p is now %s prev_sink=%p dpcd same=%d edid same=%d\n",
|
||||
link->link_index, sink,
|
||||
(sink_caps.signal == SIGNAL_TYPE_NONE ?
|
||||
"Disconnected":"Connected"));
|
||||
"Disconnected":"Connected"), prev_sink,
|
||||
same_dpcd, same_edid);
|
||||
|
||||
if (prev_sink != NULL)
|
||||
dc_sink_release(prev_sink);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -2059,10 +2118,10 @@ static struct fixed31_32 get_pbn_per_slot(struct dc_stream_state *stream)
|
||||
&stream->sink->link->cur_link_settings;
|
||||
uint32_t link_rate_in_mbps =
|
||||
link_settings->link_rate * LINK_RATE_REF_FREQ_IN_MHZ;
|
||||
struct fixed31_32 mbps = dal_fixed31_32_from_int(
|
||||
struct fixed31_32 mbps = dc_fixpt_from_int(
|
||||
link_rate_in_mbps * link_settings->lane_count);
|
||||
|
||||
return dal_fixed31_32_div_int(mbps, 54);
|
||||
return dc_fixpt_div_int(mbps, 54);
|
||||
}
|
||||
|
||||
static int get_color_depth(enum dc_color_depth color_depth)
|
||||
@@ -2103,7 +2162,7 @@ static struct fixed31_32 get_pbn_from_timing(struct pipe_ctx *pipe_ctx)
|
||||
numerator = 64 * PEAK_FACTOR_X1000;
|
||||
denominator = 54 * 8 * 1000 * 1000;
|
||||
kbps *= numerator;
|
||||
peak_kbps = dal_fixed31_32_from_fraction(kbps, denominator);
|
||||
peak_kbps = dc_fixpt_from_fraction(kbps, denominator);
|
||||
|
||||
return peak_kbps;
|
||||
}
|
||||
@@ -2230,7 +2289,7 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx)
|
||||
/* slot X.Y for only current stream */
|
||||
pbn_per_slot = get_pbn_per_slot(stream);
|
||||
pbn = get_pbn_from_timing(pipe_ctx);
|
||||
avg_time_slots_per_mtp = dal_fixed31_32_div(pbn, pbn_per_slot);
|
||||
avg_time_slots_per_mtp = dc_fixpt_div(pbn, pbn_per_slot);
|
||||
|
||||
stream_encoder->funcs->set_mst_bandwidth(
|
||||
stream_encoder,
|
||||
@@ -2247,7 +2306,7 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
|
||||
struct link_encoder *link_encoder = link->link_enc;
|
||||
struct stream_encoder *stream_encoder = pipe_ctx->stream_res.stream_enc;
|
||||
struct dp_mst_stream_allocation_table proposed_table = {0};
|
||||
struct fixed31_32 avg_time_slots_per_mtp = dal_fixed31_32_from_int(0);
|
||||
struct fixed31_32 avg_time_slots_per_mtp = dc_fixpt_from_int(0);
|
||||
uint8_t i;
|
||||
bool mst_mode = (link->type == dc_connection_mst_branch);
|
||||
DC_LOGGER_INIT(link->ctx->logger);
|
||||
|
@@ -11,8 +11,6 @@
|
||||
#include "dc_link_dp.h"
|
||||
#include "dc_link_ddc.h"
|
||||
#include "dm_helpers.h"
|
||||
#include "dce/dce_link_encoder.h"
|
||||
#include "dce/dce_stream_encoder.h"
|
||||
#include "dpcd_defs.h"
|
||||
|
||||
enum dc_status core_link_read_dpcd(
|
||||
|
@@ -79,10 +79,8 @@ enum dce_version resource_parse_asic_id(struct hw_asic_id asic_id)
|
||||
ASIC_REV_IS_POLARIS12_V(asic_id.hw_internal_rev)) {
|
||||
dc_version = DCE_VERSION_11_2;
|
||||
}
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
if (ASIC_REV_IS_VEGAM(asic_id.hw_internal_rev))
|
||||
dc_version = DCE_VERSION_11_22;
|
||||
#endif
|
||||
break;
|
||||
case FAMILY_AI:
|
||||
dc_version = DCE_VERSION_12_0;
|
||||
@@ -129,9 +127,7 @@ struct resource_pool *dc_create_resource_pool(
|
||||
num_virtual_links, dc, asic_id);
|
||||
break;
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
res_pool = dce112_create_resource_pool(
|
||||
num_virtual_links, dc);
|
||||
break;
|
||||
@@ -500,9 +496,9 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
|
||||
data->viewport_c.x = data->viewport.x / vpc_div;
|
||||
data->viewport_c.y = data->viewport.y / vpc_div;
|
||||
data->inits.h_c = (data->viewport.x % vpc_div) != 0 ?
|
||||
dal_fixed31_32_half : dal_fixed31_32_zero;
|
||||
dc_fixpt_half : dc_fixpt_zero;
|
||||
data->inits.v_c = (data->viewport.y % vpc_div) != 0 ?
|
||||
dal_fixed31_32_half : dal_fixed31_32_zero;
|
||||
dc_fixpt_half : dc_fixpt_zero;
|
||||
/* Round up, assume original video size always even dimensions */
|
||||
data->viewport_c.width = (data->viewport.width + vpc_div - 1) / vpc_div;
|
||||
data->viewport_c.height = (data->viewport.height + vpc_div - 1) / vpc_div;
|
||||
@@ -631,10 +627,10 @@ static void calculate_scaling_ratios(struct pipe_ctx *pipe_ctx)
|
||||
pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270)
|
||||
rect_swap_helper(&surf_src);
|
||||
|
||||
pipe_ctx->plane_res.scl_data.ratios.horz = dal_fixed31_32_from_fraction(
|
||||
pipe_ctx->plane_res.scl_data.ratios.horz = dc_fixpt_from_fraction(
|
||||
surf_src.width,
|
||||
plane_state->dst_rect.width);
|
||||
pipe_ctx->plane_res.scl_data.ratios.vert = dal_fixed31_32_from_fraction(
|
||||
pipe_ctx->plane_res.scl_data.ratios.vert = dc_fixpt_from_fraction(
|
||||
surf_src.height,
|
||||
plane_state->dst_rect.height);
|
||||
|
||||
@@ -656,6 +652,14 @@ static void calculate_scaling_ratios(struct pipe_ctx *pipe_ctx)
|
||||
pipe_ctx->plane_res.scl_data.ratios.horz_c.value /= 2;
|
||||
pipe_ctx->plane_res.scl_data.ratios.vert_c.value /= 2;
|
||||
}
|
||||
pipe_ctx->plane_res.scl_data.ratios.horz = dc_fixpt_truncate(
|
||||
pipe_ctx->plane_res.scl_data.ratios.horz, 19);
|
||||
pipe_ctx->plane_res.scl_data.ratios.vert = dc_fixpt_truncate(
|
||||
pipe_ctx->plane_res.scl_data.ratios.vert, 19);
|
||||
pipe_ctx->plane_res.scl_data.ratios.horz_c = dc_fixpt_truncate(
|
||||
pipe_ctx->plane_res.scl_data.ratios.horz_c, 19);
|
||||
pipe_ctx->plane_res.scl_data.ratios.vert_c = dc_fixpt_truncate(
|
||||
pipe_ctx->plane_res.scl_data.ratios.vert_c, 19);
|
||||
}
|
||||
|
||||
static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *recout_skip)
|
||||
@@ -692,32 +696,33 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
* init_bot = init + scaling_ratio
|
||||
* init_c = init + truncated_vp_c_offset(from calculate viewport)
|
||||
*/
|
||||
data->inits.h = dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_add_int(data->ratios.horz, data->taps.h_taps + 1), 2);
|
||||
data->inits.h = dc_fixpt_truncate(dc_fixpt_div_int(
|
||||
dc_fixpt_add_int(data->ratios.horz, data->taps.h_taps + 1), 2), 19);
|
||||
|
||||
data->inits.h_c = dal_fixed31_32_add(data->inits.h_c, dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_add_int(data->ratios.horz_c, data->taps.h_taps_c + 1), 2));
|
||||
data->inits.h_c = dc_fixpt_truncate(dc_fixpt_add(data->inits.h_c, dc_fixpt_div_int(
|
||||
dc_fixpt_add_int(data->ratios.horz_c, data->taps.h_taps_c + 1), 2)), 19);
|
||||
|
||||
data->inits.v = dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_add_int(data->ratios.vert, data->taps.v_taps + 1), 2);
|
||||
data->inits.v = dc_fixpt_truncate(dc_fixpt_div_int(
|
||||
dc_fixpt_add_int(data->ratios.vert, data->taps.v_taps + 1), 2), 19);
|
||||
|
||||
data->inits.v_c = dc_fixpt_truncate(dc_fixpt_add(data->inits.v_c, dc_fixpt_div_int(
|
||||
dc_fixpt_add_int(data->ratios.vert_c, data->taps.v_taps_c + 1), 2)), 19);
|
||||
|
||||
data->inits.v_c = dal_fixed31_32_add(data->inits.v_c, dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_add_int(data->ratios.vert_c, data->taps.v_taps_c + 1), 2));
|
||||
|
||||
|
||||
/* Adjust for viewport end clip-off */
|
||||
if ((data->viewport.x + data->viewport.width) < (src.x + src.width) && !flip_horz_scan_dir) {
|
||||
int vp_clip = src.x + src.width - data->viewport.width - data->viewport.x;
|
||||
int int_part = dal_fixed31_32_floor(
|
||||
dal_fixed31_32_sub(data->inits.h, data->ratios.horz));
|
||||
int int_part = dc_fixpt_floor(
|
||||
dc_fixpt_sub(data->inits.h, data->ratios.horz));
|
||||
|
||||
int_part = int_part > 0 ? int_part : 0;
|
||||
data->viewport.width += int_part < vp_clip ? int_part : vp_clip;
|
||||
}
|
||||
if ((data->viewport.y + data->viewport.height) < (src.y + src.height) && !flip_vert_scan_dir) {
|
||||
int vp_clip = src.y + src.height - data->viewport.height - data->viewport.y;
|
||||
int int_part = dal_fixed31_32_floor(
|
||||
dal_fixed31_32_sub(data->inits.v, data->ratios.vert));
|
||||
int int_part = dc_fixpt_floor(
|
||||
dc_fixpt_sub(data->inits.v, data->ratios.vert));
|
||||
|
||||
int_part = int_part > 0 ? int_part : 0;
|
||||
data->viewport.height += int_part < vp_clip ? int_part : vp_clip;
|
||||
@@ -725,8 +730,8 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
if ((data->viewport_c.x + data->viewport_c.width) < (src.x + src.width) / vpc_div && !flip_horz_scan_dir) {
|
||||
int vp_clip = (src.x + src.width) / vpc_div -
|
||||
data->viewport_c.width - data->viewport_c.x;
|
||||
int int_part = dal_fixed31_32_floor(
|
||||
dal_fixed31_32_sub(data->inits.h_c, data->ratios.horz_c));
|
||||
int int_part = dc_fixpt_floor(
|
||||
dc_fixpt_sub(data->inits.h_c, data->ratios.horz_c));
|
||||
|
||||
int_part = int_part > 0 ? int_part : 0;
|
||||
data->viewport_c.width += int_part < vp_clip ? int_part : vp_clip;
|
||||
@@ -734,8 +739,8 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
if ((data->viewport_c.y + data->viewport_c.height) < (src.y + src.height) / vpc_div && !flip_vert_scan_dir) {
|
||||
int vp_clip = (src.y + src.height) / vpc_div -
|
||||
data->viewport_c.height - data->viewport_c.y;
|
||||
int int_part = dal_fixed31_32_floor(
|
||||
dal_fixed31_32_sub(data->inits.v_c, data->ratios.vert_c));
|
||||
int int_part = dc_fixpt_floor(
|
||||
dc_fixpt_sub(data->inits.v_c, data->ratios.vert_c));
|
||||
|
||||
int_part = int_part > 0 ? int_part : 0;
|
||||
data->viewport_c.height += int_part < vp_clip ? int_part : vp_clip;
|
||||
@@ -745,9 +750,9 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
if (data->viewport.x && !flip_horz_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.h = dal_fixed31_32_add(data->inits.h, dal_fixed31_32_mul_int(
|
||||
data->inits.h = dc_fixpt_add(data->inits.h, dc_fixpt_mul_int(
|
||||
data->ratios.horz, recout_skip->width));
|
||||
int_part = dal_fixed31_32_floor(data->inits.h) - data->viewport.x;
|
||||
int_part = dc_fixpt_floor(data->inits.h) - data->viewport.x;
|
||||
if (int_part < data->taps.h_taps) {
|
||||
int int_adj = data->viewport.x >= (data->taps.h_taps - int_part) ?
|
||||
(data->taps.h_taps - int_part) : data->viewport.x;
|
||||
@@ -760,15 +765,15 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
int_part = data->taps.h_taps;
|
||||
}
|
||||
data->inits.h.value &= 0xffffffff;
|
||||
data->inits.h = dal_fixed31_32_add_int(data->inits.h, int_part);
|
||||
data->inits.h = dc_fixpt_add_int(data->inits.h, int_part);
|
||||
}
|
||||
|
||||
if (data->viewport_c.x && !flip_horz_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.h_c = dal_fixed31_32_add(data->inits.h_c, dal_fixed31_32_mul_int(
|
||||
data->inits.h_c = dc_fixpt_add(data->inits.h_c, dc_fixpt_mul_int(
|
||||
data->ratios.horz_c, recout_skip->width));
|
||||
int_part = dal_fixed31_32_floor(data->inits.h_c) - data->viewport_c.x;
|
||||
int_part = dc_fixpt_floor(data->inits.h_c) - data->viewport_c.x;
|
||||
if (int_part < data->taps.h_taps_c) {
|
||||
int int_adj = data->viewport_c.x >= (data->taps.h_taps_c - int_part) ?
|
||||
(data->taps.h_taps_c - int_part) : data->viewport_c.x;
|
||||
@@ -781,15 +786,15 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
int_part = data->taps.h_taps_c;
|
||||
}
|
||||
data->inits.h_c.value &= 0xffffffff;
|
||||
data->inits.h_c = dal_fixed31_32_add_int(data->inits.h_c, int_part);
|
||||
data->inits.h_c = dc_fixpt_add_int(data->inits.h_c, int_part);
|
||||
}
|
||||
|
||||
if (data->viewport.y && !flip_vert_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.v = dal_fixed31_32_add(data->inits.v, dal_fixed31_32_mul_int(
|
||||
data->inits.v = dc_fixpt_add(data->inits.v, dc_fixpt_mul_int(
|
||||
data->ratios.vert, recout_skip->height));
|
||||
int_part = dal_fixed31_32_floor(data->inits.v) - data->viewport.y;
|
||||
int_part = dc_fixpt_floor(data->inits.v) - data->viewport.y;
|
||||
if (int_part < data->taps.v_taps) {
|
||||
int int_adj = data->viewport.y >= (data->taps.v_taps - int_part) ?
|
||||
(data->taps.v_taps - int_part) : data->viewport.y;
|
||||
@@ -802,15 +807,15 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
int_part = data->taps.v_taps;
|
||||
}
|
||||
data->inits.v.value &= 0xffffffff;
|
||||
data->inits.v = dal_fixed31_32_add_int(data->inits.v, int_part);
|
||||
data->inits.v = dc_fixpt_add_int(data->inits.v, int_part);
|
||||
}
|
||||
|
||||
if (data->viewport_c.y && !flip_vert_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.v_c = dal_fixed31_32_add(data->inits.v_c, dal_fixed31_32_mul_int(
|
||||
data->inits.v_c = dc_fixpt_add(data->inits.v_c, dc_fixpt_mul_int(
|
||||
data->ratios.vert_c, recout_skip->height));
|
||||
int_part = dal_fixed31_32_floor(data->inits.v_c) - data->viewport_c.y;
|
||||
int_part = dc_fixpt_floor(data->inits.v_c) - data->viewport_c.y;
|
||||
if (int_part < data->taps.v_taps_c) {
|
||||
int int_adj = data->viewport_c.y >= (data->taps.v_taps_c - int_part) ?
|
||||
(data->taps.v_taps_c - int_part) : data->viewport_c.y;
|
||||
@@ -823,12 +828,12 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
int_part = data->taps.v_taps_c;
|
||||
}
|
||||
data->inits.v_c.value &= 0xffffffff;
|
||||
data->inits.v_c = dal_fixed31_32_add_int(data->inits.v_c, int_part);
|
||||
data->inits.v_c = dc_fixpt_add_int(data->inits.v_c, int_part);
|
||||
}
|
||||
|
||||
/* Interlaced inits based on final vert inits */
|
||||
data->inits.v_bot = dal_fixed31_32_add(data->inits.v, data->ratios.vert);
|
||||
data->inits.v_c_bot = dal_fixed31_32_add(data->inits.v_c, data->ratios.vert_c);
|
||||
data->inits.v_bot = dc_fixpt_add(data->inits.v, data->ratios.vert);
|
||||
data->inits.v_c_bot = dc_fixpt_add(data->inits.v_c, data->ratios.vert_c);
|
||||
|
||||
if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 ||
|
||||
pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) {
|
||||
|
@@ -75,6 +75,7 @@ struct dc_caps {
|
||||
bool dynamic_audio;
|
||||
bool is_apu;
|
||||
bool dual_link_dvi;
|
||||
bool post_blend_color_processing;
|
||||
};
|
||||
|
||||
struct dc_dcc_surface_param {
|
||||
@@ -203,6 +204,7 @@ struct dc_debug {
|
||||
bool clock_trace;
|
||||
bool validation_trace;
|
||||
bool bandwidth_calcs_trace;
|
||||
int max_downscale_src_width;
|
||||
|
||||
/* stutter efficiency related */
|
||||
bool disable_stutter;
|
||||
@@ -239,6 +241,8 @@ struct dc_debug {
|
||||
bool az_endpoint_mute_only;
|
||||
bool always_use_regamma;
|
||||
bool p010_mpo_support;
|
||||
bool recovery_enabled;
|
||||
|
||||
};
|
||||
struct dc_state;
|
||||
struct resource_pool;
|
||||
@@ -499,18 +503,18 @@ struct dc_surface_update {
|
||||
struct dc_plane_state *surface;
|
||||
|
||||
/* isr safe update parameters. null means no updates */
|
||||
struct dc_flip_addrs *flip_addr;
|
||||
struct dc_plane_info *plane_info;
|
||||
struct dc_scaling_info *scaling_info;
|
||||
const struct dc_flip_addrs *flip_addr;
|
||||
const struct dc_plane_info *plane_info;
|
||||
const struct dc_scaling_info *scaling_info;
|
||||
|
||||
/* following updates require alloc/sleep/spin that is not isr safe,
|
||||
* null means no updates
|
||||
*/
|
||||
struct dc_gamma *gamma;
|
||||
struct dc_transfer_func *in_transfer_func;
|
||||
const struct dc_gamma *gamma;
|
||||
const struct dc_transfer_func *in_transfer_func;
|
||||
|
||||
struct dc_csc_transform *input_csc_color_matrix;
|
||||
struct fixed31_32 *coeff_reduction_factor;
|
||||
const struct dc_csc_transform *input_csc_color_matrix;
|
||||
const struct fixed31_32 *coeff_reduction_factor;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -26,6 +26,8 @@
|
||||
#ifndef DC_DP_TYPES_H
|
||||
#define DC_DP_TYPES_H
|
||||
|
||||
#include "os_types.h"
|
||||
|
||||
enum dc_lane_count {
|
||||
LANE_COUNT_UNKNOWN = 0,
|
||||
LANE_COUNT_ONE = 1,
|
||||
|
@@ -25,7 +25,7 @@
|
||||
#ifndef DC_TYPES_H_
|
||||
#define DC_TYPES_H_
|
||||
|
||||
#include "fixed32_32.h"
|
||||
#include "os_types.h"
|
||||
#include "fixed31_32.h"
|
||||
#include "irq_types.h"
|
||||
#include "dc_dp_types.h"
|
||||
|
@@ -26,7 +26,7 @@
|
||||
#include "dce_abm.h"
|
||||
#include "dm_services.h"
|
||||
#include "reg_helper.h"
|
||||
#include "fixed32_32.h"
|
||||
#include "fixed31_32.h"
|
||||
#include "dc.h"
|
||||
|
||||
#include "atom.h"
|
||||
|
@@ -590,9 +590,7 @@ static uint32_t dce110_get_pix_clk_dividers(
|
||||
pll_settings, pix_clk_params);
|
||||
break;
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
case DCE_VERSION_12_0:
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
|
||||
case DCN_VERSION_1_0:
|
||||
@@ -659,12 +657,12 @@ static uint32_t dce110_get_d_to_pixel_rate_in_hz(
|
||||
return 0;
|
||||
}
|
||||
|
||||
pix_rate = dal_fixed31_32_from_int(clk_src->ref_freq_khz);
|
||||
pix_rate = dal_fixed31_32_mul_int(pix_rate, 1000);
|
||||
pix_rate = dal_fixed31_32_mul_int(pix_rate, phase);
|
||||
pix_rate = dal_fixed31_32_div_int(pix_rate, modulo);
|
||||
pix_rate = dc_fixpt_from_int(clk_src->ref_freq_khz);
|
||||
pix_rate = dc_fixpt_mul_int(pix_rate, 1000);
|
||||
pix_rate = dc_fixpt_mul_int(pix_rate, phase);
|
||||
pix_rate = dc_fixpt_div_int(pix_rate, modulo);
|
||||
|
||||
return dal_fixed31_32_round(pix_rate);
|
||||
return dc_fixpt_round(pix_rate);
|
||||
} else {
|
||||
return dce110_get_dp_pixel_rate_from_combo_phy_pll(cs, pix_clk_params, pll_settings);
|
||||
}
|
||||
@@ -713,12 +711,12 @@ static bool calculate_ss(
|
||||
const struct spread_spectrum_data *ss_data,
|
||||
struct delta_sigma_data *ds_data)
|
||||
{
|
||||
struct fixed32_32 fb_div;
|
||||
struct fixed32_32 ss_amount;
|
||||
struct fixed32_32 ss_nslip_amount;
|
||||
struct fixed32_32 ss_ds_frac_amount;
|
||||
struct fixed32_32 ss_step_size;
|
||||
struct fixed32_32 modulation_time;
|
||||
struct fixed31_32 fb_div;
|
||||
struct fixed31_32 ss_amount;
|
||||
struct fixed31_32 ss_nslip_amount;
|
||||
struct fixed31_32 ss_ds_frac_amount;
|
||||
struct fixed31_32 ss_step_size;
|
||||
struct fixed31_32 modulation_time;
|
||||
|
||||
if (ds_data == NULL)
|
||||
return false;
|
||||
@@ -733,42 +731,42 @@ static bool calculate_ss(
|
||||
|
||||
/* compute SS_AMOUNT_FBDIV & SS_AMOUNT_NFRAC_SLIP & SS_AMOUNT_DSFRAC*/
|
||||
/* 6 decimal point support in fractional feedback divider */
|
||||
fb_div = dal_fixed32_32_from_fraction(
|
||||
fb_div = dc_fixpt_from_fraction(
|
||||
pll_settings->fract_feedback_divider, 1000000);
|
||||
fb_div = dal_fixed32_32_add_int(fb_div, pll_settings->feedback_divider);
|
||||
fb_div = dc_fixpt_add_int(fb_div, pll_settings->feedback_divider);
|
||||
|
||||
ds_data->ds_frac_amount = 0;
|
||||
/*spreadSpectrumPercentage is in the unit of .01%,
|
||||
* so have to divided by 100 * 100*/
|
||||
ss_amount = dal_fixed32_32_mul(
|
||||
fb_div, dal_fixed32_32_from_fraction(ss_data->percentage,
|
||||
ss_amount = dc_fixpt_mul(
|
||||
fb_div, dc_fixpt_from_fraction(ss_data->percentage,
|
||||
100 * ss_data->percentage_divider));
|
||||
ds_data->feedback_amount = dal_fixed32_32_floor(ss_amount);
|
||||
ds_data->feedback_amount = dc_fixpt_floor(ss_amount);
|
||||
|
||||
ss_nslip_amount = dal_fixed32_32_sub(ss_amount,
|
||||
dal_fixed32_32_from_int(ds_data->feedback_amount));
|
||||
ss_nslip_amount = dal_fixed32_32_mul_int(ss_nslip_amount, 10);
|
||||
ds_data->nfrac_amount = dal_fixed32_32_floor(ss_nslip_amount);
|
||||
ss_nslip_amount = dc_fixpt_sub(ss_amount,
|
||||
dc_fixpt_from_int(ds_data->feedback_amount));
|
||||
ss_nslip_amount = dc_fixpt_mul_int(ss_nslip_amount, 10);
|
||||
ds_data->nfrac_amount = dc_fixpt_floor(ss_nslip_amount);
|
||||
|
||||
ss_ds_frac_amount = dal_fixed32_32_sub(ss_nslip_amount,
|
||||
dal_fixed32_32_from_int(ds_data->nfrac_amount));
|
||||
ss_ds_frac_amount = dal_fixed32_32_mul_int(ss_ds_frac_amount, 65536);
|
||||
ds_data->ds_frac_amount = dal_fixed32_32_floor(ss_ds_frac_amount);
|
||||
ss_ds_frac_amount = dc_fixpt_sub(ss_nslip_amount,
|
||||
dc_fixpt_from_int(ds_data->nfrac_amount));
|
||||
ss_ds_frac_amount = dc_fixpt_mul_int(ss_ds_frac_amount, 65536);
|
||||
ds_data->ds_frac_amount = dc_fixpt_floor(ss_ds_frac_amount);
|
||||
|
||||
/* compute SS_STEP_SIZE_DSFRAC */
|
||||
modulation_time = dal_fixed32_32_from_fraction(
|
||||
modulation_time = dc_fixpt_from_fraction(
|
||||
pll_settings->reference_freq * 1000,
|
||||
pll_settings->reference_divider * ss_data->modulation_freq_hz);
|
||||
|
||||
if (ss_data->flags.CENTER_SPREAD)
|
||||
modulation_time = dal_fixed32_32_div_int(modulation_time, 4);
|
||||
modulation_time = dc_fixpt_div_int(modulation_time, 4);
|
||||
else
|
||||
modulation_time = dal_fixed32_32_div_int(modulation_time, 2);
|
||||
modulation_time = dc_fixpt_div_int(modulation_time, 2);
|
||||
|
||||
ss_step_size = dal_fixed32_32_div(ss_amount, modulation_time);
|
||||
ss_step_size = dc_fixpt_div(ss_amount, modulation_time);
|
||||
/* SS_STEP_SIZE_DSFRAC_DEC = Int(SS_STEP_SIZE * 2 ^ 16 * 10)*/
|
||||
ss_step_size = dal_fixed32_32_mul_int(ss_step_size, 65536 * 10);
|
||||
ds_data->ds_frac_size = dal_fixed32_32_floor(ss_step_size);
|
||||
ss_step_size = dc_fixpt_mul_int(ss_step_size, 65536 * 10);
|
||||
ds_data->ds_frac_size = dc_fixpt_floor(ss_step_size);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -982,9 +980,7 @@ static bool dce110_program_pix_clk(
|
||||
|
||||
break;
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
case DCE_VERSION_12_0:
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
|
||||
case DCN_VERSION_1_0:
|
||||
|
@@ -26,7 +26,7 @@
|
||||
#include "dce_clocks.h"
|
||||
#include "dm_services.h"
|
||||
#include "reg_helper.h"
|
||||
#include "fixed32_32.h"
|
||||
#include "fixed31_32.h"
|
||||
#include "bios_parser_interface.h"
|
||||
#include "dc.h"
|
||||
#include "dmcu.h"
|
||||
@@ -35,7 +35,7 @@
|
||||
#endif
|
||||
#include "core_types.h"
|
||||
#include "dc_types.h"
|
||||
|
||||
#include "dal_asic_id.h"
|
||||
|
||||
#define TO_DCE_CLOCKS(clocks)\
|
||||
container_of(clocks, struct dce_disp_clk, base)
|
||||
@@ -228,19 +228,19 @@ static int dce_clocks_get_dp_ref_freq(struct display_clock *clk)
|
||||
generated according to average value (case as with previous ASICs)
|
||||
*/
|
||||
if (clk_dce->ss_on_dprefclk && clk_dce->dprefclk_ss_divider != 0) {
|
||||
struct fixed32_32 ss_percentage = dal_fixed32_32_div_int(
|
||||
dal_fixed32_32_from_fraction(
|
||||
struct fixed31_32 ss_percentage = dc_fixpt_div_int(
|
||||
dc_fixpt_from_fraction(
|
||||
clk_dce->dprefclk_ss_percentage,
|
||||
clk_dce->dprefclk_ss_divider), 200);
|
||||
struct fixed32_32 adj_dp_ref_clk_khz;
|
||||
struct fixed31_32 adj_dp_ref_clk_khz;
|
||||
|
||||
ss_percentage = dal_fixed32_32_sub(dal_fixed32_32_one,
|
||||
ss_percentage = dc_fixpt_sub(dc_fixpt_one,
|
||||
ss_percentage);
|
||||
adj_dp_ref_clk_khz =
|
||||
dal_fixed32_32_mul_int(
|
||||
dc_fixpt_mul_int(
|
||||
ss_percentage,
|
||||
dp_ref_clk_khz);
|
||||
dp_ref_clk_khz = dal_fixed32_32_floor(adj_dp_ref_clk_khz);
|
||||
dp_ref_clk_khz = dc_fixpt_floor(adj_dp_ref_clk_khz);
|
||||
}
|
||||
|
||||
return dp_ref_clk_khz;
|
||||
@@ -256,19 +256,19 @@ static int dce_clocks_get_dp_ref_freq_wrkaround(struct display_clock *clk)
|
||||
int dp_ref_clk_khz = 600000;
|
||||
|
||||
if (clk_dce->ss_on_dprefclk && clk_dce->dprefclk_ss_divider != 0) {
|
||||
struct fixed32_32 ss_percentage = dal_fixed32_32_div_int(
|
||||
dal_fixed32_32_from_fraction(
|
||||
struct fixed31_32 ss_percentage = dc_fixpt_div_int(
|
||||
dc_fixpt_from_fraction(
|
||||
clk_dce->dprefclk_ss_percentage,
|
||||
clk_dce->dprefclk_ss_divider), 200);
|
||||
struct fixed32_32 adj_dp_ref_clk_khz;
|
||||
struct fixed31_32 adj_dp_ref_clk_khz;
|
||||
|
||||
ss_percentage = dal_fixed32_32_sub(dal_fixed32_32_one,
|
||||
ss_percentage = dc_fixpt_sub(dc_fixpt_one,
|
||||
ss_percentage);
|
||||
adj_dp_ref_clk_khz =
|
||||
dal_fixed32_32_mul_int(
|
||||
dc_fixpt_mul_int(
|
||||
ss_percentage,
|
||||
dp_ref_clk_khz);
|
||||
dp_ref_clk_khz = dal_fixed32_32_floor(adj_dp_ref_clk_khz);
|
||||
dp_ref_clk_khz = dc_fixpt_floor(adj_dp_ref_clk_khz);
|
||||
}
|
||||
|
||||
return dp_ref_clk_khz;
|
||||
@@ -413,9 +413,12 @@ static int dce112_set_clock(
|
||||
/*VBIOS will determine DPREFCLK frequency, so we don't set it*/
|
||||
dce_clk_params.target_clock_frequency = 0;
|
||||
dce_clk_params.clock_type = DCECLOCK_TYPE_DPREFCLK;
|
||||
dce_clk_params.flags.USE_GENLOCK_AS_SOURCE_FOR_DPREFCLK =
|
||||
if (!ASICREV_IS_VEGA20_P(clk->ctx->asic_id.hw_internal_rev))
|
||||
dce_clk_params.flags.USE_GENLOCK_AS_SOURCE_FOR_DPREFCLK =
|
||||
(dce_clk_params.pll_id ==
|
||||
CLOCK_SOURCE_COMBO_DISPLAY_PLL0);
|
||||
else
|
||||
dce_clk_params.flags.USE_GENLOCK_AS_SOURCE_FOR_DPREFCLK = false;
|
||||
|
||||
bp->funcs->set_dce_clock(bp, &dce_clk_params);
|
||||
|
||||
|
@@ -28,7 +28,7 @@
|
||||
#include "dce_dmcu.h"
|
||||
#include "dm_services.h"
|
||||
#include "reg_helper.h"
|
||||
#include "fixed32_32.h"
|
||||
#include "fixed31_32.h"
|
||||
#include "dc.h"
|
||||
|
||||
#define TO_DCE_DMCU(dmcu)\
|
||||
|
@@ -195,13 +195,13 @@ static void dce_ipp_program_input_lut(
|
||||
|
||||
for (i = 0; i < gamma->num_entries; i++) {
|
||||
REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
|
||||
dal_fixed31_32_round(
|
||||
dc_fixpt_round(
|
||||
gamma->entries.red[i]));
|
||||
REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
|
||||
dal_fixed31_32_round(
|
||||
dc_fixpt_round(
|
||||
gamma->entries.green[i]));
|
||||
REG_SET(DC_LUT_SEQ_COLOR, 0, DC_LUT_SEQ_COLOR,
|
||||
dal_fixed31_32_round(
|
||||
dc_fixpt_round(
|
||||
gamma->entries.blue[i]));
|
||||
}
|
||||
|
||||
|
@@ -1014,11 +1014,11 @@ static const uint16_t filter_8tap_64p_183[264] = {
|
||||
|
||||
const uint16_t *get_filter_3tap_16p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_3tap_16p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_3tap_16p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_3tap_16p_150;
|
||||
else
|
||||
return filter_3tap_16p_183;
|
||||
@@ -1026,11 +1026,11 @@ const uint16_t *get_filter_3tap_16p(struct fixed31_32 ratio)
|
||||
|
||||
const uint16_t *get_filter_3tap_64p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_3tap_64p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_3tap_64p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_3tap_64p_150;
|
||||
else
|
||||
return filter_3tap_64p_183;
|
||||
@@ -1038,11 +1038,11 @@ const uint16_t *get_filter_3tap_64p(struct fixed31_32 ratio)
|
||||
|
||||
const uint16_t *get_filter_4tap_16p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_4tap_16p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_4tap_16p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_4tap_16p_150;
|
||||
else
|
||||
return filter_4tap_16p_183;
|
||||
@@ -1050,11 +1050,11 @@ const uint16_t *get_filter_4tap_16p(struct fixed31_32 ratio)
|
||||
|
||||
const uint16_t *get_filter_4tap_64p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_4tap_64p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_4tap_64p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_4tap_64p_150;
|
||||
else
|
||||
return filter_4tap_64p_183;
|
||||
@@ -1062,11 +1062,11 @@ const uint16_t *get_filter_4tap_64p(struct fixed31_32 ratio)
|
||||
|
||||
const uint16_t *get_filter_5tap_64p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_5tap_64p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_5tap_64p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_5tap_64p_150;
|
||||
else
|
||||
return filter_5tap_64p_183;
|
||||
@@ -1074,11 +1074,11 @@ const uint16_t *get_filter_5tap_64p(struct fixed31_32 ratio)
|
||||
|
||||
const uint16_t *get_filter_6tap_64p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_6tap_64p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_6tap_64p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_6tap_64p_150;
|
||||
else
|
||||
return filter_6tap_64p_183;
|
||||
@@ -1086,11 +1086,11 @@ const uint16_t *get_filter_6tap_64p(struct fixed31_32 ratio)
|
||||
|
||||
const uint16_t *get_filter_7tap_64p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_7tap_64p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_7tap_64p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_7tap_64p_150;
|
||||
else
|
||||
return filter_7tap_64p_183;
|
||||
@@ -1098,11 +1098,11 @@ const uint16_t *get_filter_7tap_64p(struct fixed31_32 ratio)
|
||||
|
||||
const uint16_t *get_filter_8tap_64p(struct fixed31_32 ratio)
|
||||
{
|
||||
if (ratio.value < dal_fixed31_32_one.value)
|
||||
if (ratio.value < dc_fixpt_one.value)
|
||||
return filter_8tap_64p_upscale;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(4, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(4, 3).value)
|
||||
return filter_8tap_64p_117;
|
||||
else if (ratio.value < dal_fixed31_32_from_fraction(5, 3).value)
|
||||
else if (ratio.value < dc_fixpt_from_fraction(5, 3).value)
|
||||
return filter_8tap_64p_150;
|
||||
else
|
||||
return filter_8tap_64p_183;
|
||||
|
@@ -683,11 +683,11 @@ static void dce110_stream_encoder_set_mst_bandwidth(
|
||||
struct fixed31_32 avg_time_slots_per_mtp)
|
||||
{
|
||||
struct dce110_stream_encoder *enc110 = DCE110STRENC_FROM_STRENC(enc);
|
||||
uint32_t x = dal_fixed31_32_floor(
|
||||
uint32_t x = dc_fixpt_floor(
|
||||
avg_time_slots_per_mtp);
|
||||
uint32_t y = dal_fixed31_32_ceil(
|
||||
dal_fixed31_32_shl(
|
||||
dal_fixed31_32_sub_int(
|
||||
uint32_t y = dc_fixpt_ceil(
|
||||
dc_fixpt_shl(
|
||||
dc_fixpt_sub_int(
|
||||
avg_time_slots_per_mtp,
|
||||
x),
|
||||
26));
|
||||
|
@@ -41,7 +41,7 @@
|
||||
#define DC_LOGGER \
|
||||
xfm_dce->base.ctx->logger
|
||||
|
||||
#define IDENTITY_RATIO(ratio) (dal_fixed31_32_u2d19(ratio) == (1 << 19))
|
||||
#define IDENTITY_RATIO(ratio) (dc_fixpt_u2d19(ratio) == (1 << 19))
|
||||
#define GAMUT_MATRIX_SIZE 12
|
||||
#define SCL_PHASES 16
|
||||
|
||||
@@ -256,27 +256,27 @@ static void calculate_inits(
|
||||
struct fixed31_32 v_init;
|
||||
|
||||
inits->h_int_scale_ratio =
|
||||
dal_fixed31_32_u2d19(data->ratios.horz) << 5;
|
||||
dc_fixpt_u2d19(data->ratios.horz) << 5;
|
||||
inits->v_int_scale_ratio =
|
||||
dal_fixed31_32_u2d19(data->ratios.vert) << 5;
|
||||
dc_fixpt_u2d19(data->ratios.vert) << 5;
|
||||
|
||||
h_init =
|
||||
dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_add(
|
||||
dc_fixpt_div_int(
|
||||
dc_fixpt_add(
|
||||
data->ratios.horz,
|
||||
dal_fixed31_32_from_int(data->taps.h_taps + 1)),
|
||||
dc_fixpt_from_int(data->taps.h_taps + 1)),
|
||||
2);
|
||||
inits->h_init.integer = dal_fixed31_32_floor(h_init);
|
||||
inits->h_init.fraction = dal_fixed31_32_u0d19(h_init) << 5;
|
||||
inits->h_init.integer = dc_fixpt_floor(h_init);
|
||||
inits->h_init.fraction = dc_fixpt_u0d19(h_init) << 5;
|
||||
|
||||
v_init =
|
||||
dal_fixed31_32_div_int(
|
||||
dal_fixed31_32_add(
|
||||
dc_fixpt_div_int(
|
||||
dc_fixpt_add(
|
||||
data->ratios.vert,
|
||||
dal_fixed31_32_from_int(data->taps.v_taps + 1)),
|
||||
dc_fixpt_from_int(data->taps.v_taps + 1)),
|
||||
2);
|
||||
inits->v_init.integer = dal_fixed31_32_floor(v_init);
|
||||
inits->v_init.fraction = dal_fixed31_32_u0d19(v_init) << 5;
|
||||
inits->v_init.integer = dc_fixpt_floor(v_init);
|
||||
inits->v_init.fraction = dc_fixpt_u0d19(v_init) << 5;
|
||||
}
|
||||
|
||||
static void program_scl_ratios_inits(
|
||||
|
@@ -509,19 +509,19 @@ dce110_translate_regamma_to_hw_format(const struct dc_transfer_func *output_tf,
|
||||
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
||||
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
||||
|
||||
arr_points[0].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2),
|
||||
dal_fixed31_32_from_int(region_start));
|
||||
arr_points[1].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2),
|
||||
dal_fixed31_32_from_int(region_end));
|
||||
arr_points[0].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_start));
|
||||
arr_points[1].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_end));
|
||||
|
||||
y_r = rgb_resulted[0].red;
|
||||
y_g = rgb_resulted[0].green;
|
||||
y_b = rgb_resulted[0].blue;
|
||||
|
||||
y1_min = dal_fixed31_32_min(y_r, dal_fixed31_32_min(y_g, y_b));
|
||||
y1_min = dc_fixpt_min(y_r, dc_fixpt_min(y_g, y_b));
|
||||
|
||||
arr_points[0].y = y1_min;
|
||||
arr_points[0].slope = dal_fixed31_32_div(arr_points[0].y,
|
||||
arr_points[0].slope = dc_fixpt_div(arr_points[0].y,
|
||||
arr_points[0].x);
|
||||
|
||||
y_r = rgb_resulted[hw_points - 1].red;
|
||||
@@ -531,21 +531,21 @@ dce110_translate_regamma_to_hw_format(const struct dc_transfer_func *output_tf,
|
||||
/* see comment above, m_arrPoints[1].y should be the Y value for the
|
||||
* region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1)
|
||||
*/
|
||||
y3_max = dal_fixed31_32_max(y_r, dal_fixed31_32_max(y_g, y_b));
|
||||
y3_max = dc_fixpt_max(y_r, dc_fixpt_max(y_g, y_b));
|
||||
|
||||
arr_points[1].y = y3_max;
|
||||
|
||||
arr_points[1].slope = dal_fixed31_32_zero;
|
||||
arr_points[1].slope = dc_fixpt_zero;
|
||||
|
||||
if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
|
||||
/* for PQ, we want to have a straight line from last HW X point,
|
||||
* and the slope to be such that we hit 1.0 at 10000 nits.
|
||||
*/
|
||||
const struct fixed31_32 end_value = dal_fixed31_32_from_int(125);
|
||||
const struct fixed31_32 end_value = dc_fixpt_from_int(125);
|
||||
|
||||
arr_points[1].slope = dal_fixed31_32_div(
|
||||
dal_fixed31_32_sub(dal_fixed31_32_one, arr_points[1].y),
|
||||
dal_fixed31_32_sub(end_value, arr_points[1].x));
|
||||
arr_points[1].slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, arr_points[1].y),
|
||||
dc_fixpt_sub(end_value, arr_points[1].x));
|
||||
}
|
||||
|
||||
regamma_params->hw_points_num = hw_points;
|
||||
@@ -569,16 +569,16 @@ dce110_translate_regamma_to_hw_format(const struct dc_transfer_func *output_tf,
|
||||
i = 1;
|
||||
|
||||
while (i != hw_points + 1) {
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->red, rgb->red))
|
||||
if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
|
||||
rgb_plus_1->red = rgb->red;
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->green, rgb->green))
|
||||
if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
|
||||
rgb_plus_1->green = rgb->green;
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->blue, rgb->blue))
|
||||
if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
|
||||
rgb_plus_1->blue = rgb->blue;
|
||||
|
||||
rgb->delta_red = dal_fixed31_32_sub(rgb_plus_1->red, rgb->red);
|
||||
rgb->delta_green = dal_fixed31_32_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dal_fixed31_32_sub(rgb_plus_1->blue, rgb->blue);
|
||||
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
|
||||
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
||||
|
||||
++rgb_plus_1;
|
||||
++rgb;
|
||||
@@ -2269,74 +2269,6 @@ static void program_gamut_remap(struct pipe_ctx *pipe_ctx)
|
||||
|
||||
pipe_ctx->plane_res.xfm->funcs->transform_set_gamut_remap(pipe_ctx->plane_res.xfm, &adjust);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO REMOVE, USE UPDATE INSTEAD
|
||||
*/
|
||||
static void set_plane_config(
|
||||
const struct dc *dc,
|
||||
struct pipe_ctx *pipe_ctx,
|
||||
struct resource_context *res_ctx)
|
||||
{
|
||||
struct mem_input *mi = pipe_ctx->plane_res.mi;
|
||||
struct dc_plane_state *plane_state = pipe_ctx->plane_state;
|
||||
struct xfm_grph_csc_adjustment adjust;
|
||||
struct out_csc_color_matrix tbl_entry;
|
||||
unsigned int i;
|
||||
|
||||
memset(&adjust, 0, sizeof(adjust));
|
||||
memset(&tbl_entry, 0, sizeof(tbl_entry));
|
||||
adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_BYPASS;
|
||||
|
||||
dce_enable_fe_clock(dc->hwseq, mi->inst, true);
|
||||
|
||||
set_default_colors(pipe_ctx);
|
||||
if (pipe_ctx->stream->csc_color_matrix.enable_adjustment == true) {
|
||||
tbl_entry.color_space =
|
||||
pipe_ctx->stream->output_color_space;
|
||||
|
||||
for (i = 0; i < 12; i++)
|
||||
tbl_entry.regval[i] =
|
||||
pipe_ctx->stream->csc_color_matrix.matrix[i];
|
||||
|
||||
pipe_ctx->plane_res.xfm->funcs->opp_set_csc_adjustment
|
||||
(pipe_ctx->plane_res.xfm, &tbl_entry);
|
||||
}
|
||||
|
||||
if (pipe_ctx->stream->gamut_remap_matrix.enable_remap == true) {
|
||||
adjust.gamut_adjust_type = GRAPHICS_GAMUT_ADJUST_TYPE_SW;
|
||||
|
||||
for (i = 0; i < CSC_TEMPERATURE_MATRIX_SIZE; i++)
|
||||
adjust.temperature_matrix[i] =
|
||||
pipe_ctx->stream->gamut_remap_matrix.matrix[i];
|
||||
}
|
||||
|
||||
pipe_ctx->plane_res.xfm->funcs->transform_set_gamut_remap(pipe_ctx->plane_res.xfm, &adjust);
|
||||
|
||||
pipe_ctx->plane_res.scl_data.lb_params.alpha_en = pipe_ctx->bottom_pipe != 0;
|
||||
program_scaler(dc, pipe_ctx);
|
||||
|
||||
program_surface_visibility(dc, pipe_ctx);
|
||||
|
||||
mi->funcs->mem_input_program_surface_config(
|
||||
mi,
|
||||
plane_state->format,
|
||||
&plane_state->tiling_info,
|
||||
&plane_state->plane_size,
|
||||
plane_state->rotation,
|
||||
NULL,
|
||||
false);
|
||||
if (mi->funcs->set_blank)
|
||||
mi->funcs->set_blank(mi, pipe_ctx->plane_state->visible);
|
||||
|
||||
if (dc->config.gpu_vm_support)
|
||||
mi->funcs->mem_input_program_pte_vm(
|
||||
pipe_ctx->plane_res.mi,
|
||||
plane_state->format,
|
||||
&plane_state->tiling_info,
|
||||
plane_state->rotation);
|
||||
}
|
||||
|
||||
static void update_plane_addr(const struct dc *dc,
|
||||
struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
@@ -3023,7 +2955,6 @@ static const struct hw_sequencer_funcs dce110_funcs = {
|
||||
.init_hw = init_hw,
|
||||
.apply_ctx_to_hw = dce110_apply_ctx_to_hw,
|
||||
.apply_ctx_for_surface = dce110_apply_ctx_for_surface,
|
||||
.set_plane_config = set_plane_config,
|
||||
.update_plane_addr = update_plane_addr,
|
||||
.update_pending_status = dce110_update_pending_status,
|
||||
.set_input_transfer_func = dce110_set_input_transfer_func,
|
||||
|
@@ -373,13 +373,13 @@ static void calculate_inits(
|
||||
struct rect *chroma_viewport)
|
||||
{
|
||||
inits->h_int_scale_ratio_luma =
|
||||
dal_fixed31_32_u2d19(data->ratios.horz) << 5;
|
||||
dc_fixpt_u2d19(data->ratios.horz) << 5;
|
||||
inits->v_int_scale_ratio_luma =
|
||||
dal_fixed31_32_u2d19(data->ratios.vert) << 5;
|
||||
dc_fixpt_u2d19(data->ratios.vert) << 5;
|
||||
inits->h_int_scale_ratio_chroma =
|
||||
dal_fixed31_32_u2d19(data->ratios.horz_c) << 5;
|
||||
dc_fixpt_u2d19(data->ratios.horz_c) << 5;
|
||||
inits->v_int_scale_ratio_chroma =
|
||||
dal_fixed31_32_u2d19(data->ratios.vert_c) << 5;
|
||||
dc_fixpt_u2d19(data->ratios.vert_c) << 5;
|
||||
|
||||
inits->h_init_luma.integer = 1;
|
||||
inits->v_init_luma.integer = 1;
|
||||
|
@@ -814,14 +814,25 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
|
||||
dm_pp_notify_wm_clock_changes(dc->ctx, &clk_ranges);
|
||||
}
|
||||
|
||||
static uint32_t read_pipe_fuses(struct dc_context *ctx)
|
||||
{
|
||||
uint32_t value = dm_read_reg_soc15(ctx, mmCC_DC_PIPE_DIS, 0);
|
||||
/* VG20 support max 6 pipes */
|
||||
value = value & 0x3f;
|
||||
return value;
|
||||
}
|
||||
|
||||
static bool construct(
|
||||
uint8_t num_virtual_links,
|
||||
struct dc *dc,
|
||||
struct dce110_resource_pool *pool)
|
||||
{
|
||||
unsigned int i;
|
||||
int j;
|
||||
struct dc_context *ctx = dc->ctx;
|
||||
struct irq_service_init_data irq_init_data;
|
||||
bool harvest_enabled = ASICREV_IS_VEGA20_P(ctx->asic_id.hw_internal_rev);
|
||||
uint32_t pipe_fuses;
|
||||
|
||||
ctx->dc_bios->regs = &bios_regs;
|
||||
|
||||
@@ -915,28 +926,41 @@ static bool construct(
|
||||
if (!pool->base.irqs)
|
||||
goto irqs_create_fail;
|
||||
|
||||
/* retrieve valid pipe fuses */
|
||||
if (harvest_enabled)
|
||||
pipe_fuses = read_pipe_fuses(ctx);
|
||||
|
||||
/* index to valid pipe resource */
|
||||
j = 0;
|
||||
for (i = 0; i < pool->base.pipe_count; i++) {
|
||||
pool->base.timing_generators[i] =
|
||||
if (harvest_enabled) {
|
||||
if ((pipe_fuses & (1 << i)) != 0) {
|
||||
dm_error("DC: skip invalid pipe %d!\n", i);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
pool->base.timing_generators[j] =
|
||||
dce120_timing_generator_create(
|
||||
ctx,
|
||||
i,
|
||||
&dce120_tg_offsets[i]);
|
||||
if (pool->base.timing_generators[i] == NULL) {
|
||||
if (pool->base.timing_generators[j] == NULL) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
dm_error("DC: failed to create tg!\n");
|
||||
goto controller_create_fail;
|
||||
}
|
||||
|
||||
pool->base.mis[i] = dce120_mem_input_create(ctx, i);
|
||||
pool->base.mis[j] = dce120_mem_input_create(ctx, i);
|
||||
|
||||
if (pool->base.mis[i] == NULL) {
|
||||
if (pool->base.mis[j] == NULL) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
dm_error(
|
||||
"DC: failed to create memory input!\n");
|
||||
goto controller_create_fail;
|
||||
}
|
||||
|
||||
pool->base.ipps[i] = dce120_ipp_create(ctx, i);
|
||||
pool->base.ipps[j] = dce120_ipp_create(ctx, i);
|
||||
if (pool->base.ipps[i] == NULL) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
dm_error(
|
||||
@@ -944,7 +968,7 @@ static bool construct(
|
||||
goto controller_create_fail;
|
||||
}
|
||||
|
||||
pool->base.transforms[i] = dce120_transform_create(ctx, i);
|
||||
pool->base.transforms[j] = dce120_transform_create(ctx, i);
|
||||
if (pool->base.transforms[i] == NULL) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
dm_error(
|
||||
@@ -952,16 +976,23 @@ static bool construct(
|
||||
goto res_create_fail;
|
||||
}
|
||||
|
||||
pool->base.opps[i] = dce120_opp_create(
|
||||
pool->base.opps[j] = dce120_opp_create(
|
||||
ctx,
|
||||
i);
|
||||
if (pool->base.opps[i] == NULL) {
|
||||
if (pool->base.opps[j] == NULL) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
dm_error(
|
||||
"DC: failed to create output pixel processor!\n");
|
||||
}
|
||||
|
||||
/* check next valid pipe */
|
||||
j++;
|
||||
}
|
||||
|
||||
/* valid pipe num */
|
||||
pool->base.pipe_count = j;
|
||||
pool->base.timing_generator_count = j;
|
||||
|
||||
if (!resource_construct(num_virtual_links, dc, &pool->base,
|
||||
&res_create_funcs))
|
||||
goto res_create_fail;
|
||||
|
@@ -26,7 +26,7 @@ DCN10 = dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o \
|
||||
dcn10_dpp.o dcn10_opp.o dcn10_optc.o \
|
||||
dcn10_hubp.o dcn10_mpc.o \
|
||||
dcn10_dpp_dscl.o dcn10_dpp_cm.o dcn10_cm_common.o \
|
||||
dcn10_hubbub.o dcn10_stream_encoder.o
|
||||
dcn10_hubbub.o dcn10_stream_encoder.o dcn10_link_encoder.o
|
||||
|
||||
AMD_DAL_DCN10 = $(addprefix $(AMDDALPATH)/dc/dcn10/,$(DCN10))
|
||||
|
||||
|
@@ -169,7 +169,7 @@ bool cm_helper_convert_to_custom_float(
|
||||
}
|
||||
|
||||
if (fixpoint == true)
|
||||
arr_points[1].custom_float_y = dal_fixed31_32_clamp_u0d14(arr_points[1].y);
|
||||
arr_points[1].custom_float_y = dc_fixpt_clamp_u0d14(arr_points[1].y);
|
||||
else if (!convert_to_custom_float_format(arr_points[1].y, &fmt,
|
||||
&arr_points[1].custom_float_y)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
@@ -327,19 +327,19 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
||||
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
||||
|
||||
arr_points[0].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2),
|
||||
dal_fixed31_32_from_int(region_start));
|
||||
arr_points[1].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2),
|
||||
dal_fixed31_32_from_int(region_end));
|
||||
arr_points[0].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_start));
|
||||
arr_points[1].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_end));
|
||||
|
||||
y_r = rgb_resulted[0].red;
|
||||
y_g = rgb_resulted[0].green;
|
||||
y_b = rgb_resulted[0].blue;
|
||||
|
||||
y1_min = dal_fixed31_32_min(y_r, dal_fixed31_32_min(y_g, y_b));
|
||||
y1_min = dc_fixpt_min(y_r, dc_fixpt_min(y_g, y_b));
|
||||
|
||||
arr_points[0].y = y1_min;
|
||||
arr_points[0].slope = dal_fixed31_32_div(arr_points[0].y, arr_points[0].x);
|
||||
arr_points[0].slope = dc_fixpt_div(arr_points[0].y, arr_points[0].x);
|
||||
y_r = rgb_resulted[hw_points - 1].red;
|
||||
y_g = rgb_resulted[hw_points - 1].green;
|
||||
y_b = rgb_resulted[hw_points - 1].blue;
|
||||
@@ -347,22 +347,22 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
/* see comment above, m_arrPoints[1].y should be the Y value for the
|
||||
* region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1)
|
||||
*/
|
||||
y3_max = dal_fixed31_32_max(y_r, dal_fixed31_32_max(y_g, y_b));
|
||||
y3_max = dc_fixpt_max(y_r, dc_fixpt_max(y_g, y_b));
|
||||
|
||||
arr_points[1].y = y3_max;
|
||||
|
||||
arr_points[1].slope = dal_fixed31_32_zero;
|
||||
arr_points[1].slope = dc_fixpt_zero;
|
||||
|
||||
if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
|
||||
/* for PQ, we want to have a straight line from last HW X point,
|
||||
* and the slope to be such that we hit 1.0 at 10000 nits.
|
||||
*/
|
||||
const struct fixed31_32 end_value =
|
||||
dal_fixed31_32_from_int(125);
|
||||
dc_fixpt_from_int(125);
|
||||
|
||||
arr_points[1].slope = dal_fixed31_32_div(
|
||||
dal_fixed31_32_sub(dal_fixed31_32_one, arr_points[1].y),
|
||||
dal_fixed31_32_sub(end_value, arr_points[1].x));
|
||||
arr_points[1].slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, arr_points[1].y),
|
||||
dc_fixpt_sub(end_value, arr_points[1].x));
|
||||
}
|
||||
|
||||
lut_params->hw_points_num = hw_points;
|
||||
@@ -386,24 +386,24 @@ bool cm_helper_translate_curve_to_hw_format(
|
||||
|
||||
i = 1;
|
||||
while (i != hw_points + 1) {
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->red, rgb->red))
|
||||
if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
|
||||
rgb_plus_1->red = rgb->red;
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->green, rgb->green))
|
||||
if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
|
||||
rgb_plus_1->green = rgb->green;
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->blue, rgb->blue))
|
||||
if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
|
||||
rgb_plus_1->blue = rgb->blue;
|
||||
|
||||
rgb->delta_red = dal_fixed31_32_sub(rgb_plus_1->red, rgb->red);
|
||||
rgb->delta_green = dal_fixed31_32_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dal_fixed31_32_sub(rgb_plus_1->blue, rgb->blue);
|
||||
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
|
||||
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
||||
|
||||
if (fixpoint == true) {
|
||||
rgb->delta_red_reg = dal_fixed31_32_clamp_u0d10(rgb->delta_red);
|
||||
rgb->delta_green_reg = dal_fixed31_32_clamp_u0d10(rgb->delta_green);
|
||||
rgb->delta_blue_reg = dal_fixed31_32_clamp_u0d10(rgb->delta_blue);
|
||||
rgb->red_reg = dal_fixed31_32_clamp_u0d14(rgb->red);
|
||||
rgb->green_reg = dal_fixed31_32_clamp_u0d14(rgb->green);
|
||||
rgb->blue_reg = dal_fixed31_32_clamp_u0d14(rgb->blue);
|
||||
rgb->delta_red_reg = dc_fixpt_clamp_u0d10(rgb->delta_red);
|
||||
rgb->delta_green_reg = dc_fixpt_clamp_u0d10(rgb->delta_green);
|
||||
rgb->delta_blue_reg = dc_fixpt_clamp_u0d10(rgb->delta_blue);
|
||||
rgb->red_reg = dc_fixpt_clamp_u0d14(rgb->red);
|
||||
rgb->green_reg = dc_fixpt_clamp_u0d14(rgb->green);
|
||||
rgb->blue_reg = dc_fixpt_clamp_u0d14(rgb->blue);
|
||||
}
|
||||
|
||||
++rgb_plus_1;
|
||||
@@ -489,19 +489,19 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
|
||||
rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
|
||||
|
||||
arr_points[0].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2),
|
||||
dal_fixed31_32_from_int(region_start));
|
||||
arr_points[1].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2),
|
||||
dal_fixed31_32_from_int(region_end));
|
||||
arr_points[0].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_start));
|
||||
arr_points[1].x = dc_fixpt_pow(dc_fixpt_from_int(2),
|
||||
dc_fixpt_from_int(region_end));
|
||||
|
||||
y_r = rgb_resulted[0].red;
|
||||
y_g = rgb_resulted[0].green;
|
||||
y_b = rgb_resulted[0].blue;
|
||||
|
||||
y1_min = dal_fixed31_32_min(y_r, dal_fixed31_32_min(y_g, y_b));
|
||||
y1_min = dc_fixpt_min(y_r, dc_fixpt_min(y_g, y_b));
|
||||
|
||||
arr_points[0].y = y1_min;
|
||||
arr_points[0].slope = dal_fixed31_32_div(arr_points[0].y, arr_points[0].x);
|
||||
arr_points[0].slope = dc_fixpt_div(arr_points[0].y, arr_points[0].x);
|
||||
y_r = rgb_resulted[hw_points - 1].red;
|
||||
y_g = rgb_resulted[hw_points - 1].green;
|
||||
y_b = rgb_resulted[hw_points - 1].blue;
|
||||
@@ -509,22 +509,22 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
/* see comment above, m_arrPoints[1].y should be the Y value for the
|
||||
* region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1)
|
||||
*/
|
||||
y3_max = dal_fixed31_32_max(y_r, dal_fixed31_32_max(y_g, y_b));
|
||||
y3_max = dc_fixpt_max(y_r, dc_fixpt_max(y_g, y_b));
|
||||
|
||||
arr_points[1].y = y3_max;
|
||||
|
||||
arr_points[1].slope = dal_fixed31_32_zero;
|
||||
arr_points[1].slope = dc_fixpt_zero;
|
||||
|
||||
if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
|
||||
/* for PQ, we want to have a straight line from last HW X point,
|
||||
* and the slope to be such that we hit 1.0 at 10000 nits.
|
||||
*/
|
||||
const struct fixed31_32 end_value =
|
||||
dal_fixed31_32_from_int(125);
|
||||
dc_fixpt_from_int(125);
|
||||
|
||||
arr_points[1].slope = dal_fixed31_32_div(
|
||||
dal_fixed31_32_sub(dal_fixed31_32_one, arr_points[1].y),
|
||||
dal_fixed31_32_sub(end_value, arr_points[1].x));
|
||||
arr_points[1].slope = dc_fixpt_div(
|
||||
dc_fixpt_sub(dc_fixpt_one, arr_points[1].y),
|
||||
dc_fixpt_sub(end_value, arr_points[1].x));
|
||||
}
|
||||
|
||||
lut_params->hw_points_num = hw_points;
|
||||
@@ -548,16 +548,16 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
|
||||
|
||||
i = 1;
|
||||
while (i != hw_points + 1) {
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->red, rgb->red))
|
||||
if (dc_fixpt_lt(rgb_plus_1->red, rgb->red))
|
||||
rgb_plus_1->red = rgb->red;
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->green, rgb->green))
|
||||
if (dc_fixpt_lt(rgb_plus_1->green, rgb->green))
|
||||
rgb_plus_1->green = rgb->green;
|
||||
if (dal_fixed31_32_lt(rgb_plus_1->blue, rgb->blue))
|
||||
if (dc_fixpt_lt(rgb_plus_1->blue, rgb->blue))
|
||||
rgb_plus_1->blue = rgb->blue;
|
||||
|
||||
rgb->delta_red = dal_fixed31_32_sub(rgb_plus_1->red, rgb->red);
|
||||
rgb->delta_green = dal_fixed31_32_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dal_fixed31_32_sub(rgb_plus_1->blue, rgb->blue);
|
||||
rgb->delta_red = dc_fixpt_sub(rgb_plus_1->red, rgb->red);
|
||||
rgb->delta_green = dc_fixpt_sub(rgb_plus_1->green, rgb->green);
|
||||
rgb->delta_blue = dc_fixpt_sub(rgb_plus_1->blue, rgb->blue);
|
||||
|
||||
++rgb_plus_1;
|
||||
++rgb;
|
||||
|
@@ -130,7 +130,7 @@ void dpp_set_gamut_remap_bypass(struct dcn10_dpp *dpp)
|
||||
/* Gamut remap in bypass */
|
||||
}
|
||||
|
||||
#define IDENTITY_RATIO(ratio) (dal_fixed31_32_u2d19(ratio) == (1 << 19))
|
||||
#define IDENTITY_RATIO(ratio) (dc_fixpt_u2d19(ratio) == (1 << 19))
|
||||
|
||||
|
||||
bool dpp_get_optimal_number_of_taps(
|
||||
@@ -152,6 +152,11 @@ bool dpp_get_optimal_number_of_taps(
|
||||
scl_data->format == PIXEL_FORMAT_FP16)
|
||||
return false;
|
||||
|
||||
if (scl_data->viewport.width > scl_data->h_active &&
|
||||
dpp->ctx->dc->debug.max_downscale_src_width != 0 &&
|
||||
scl_data->viewport.width > dpp->ctx->dc->debug.max_downscale_src_width)
|
||||
return false;
|
||||
|
||||
/* TODO: add lb check */
|
||||
|
||||
/* No support for programming ratio of 4, drop to 3.99999.. */
|
||||
|
@@ -811,13 +811,13 @@ void dpp1_program_input_lut(
|
||||
REG_UPDATE(CM_IGAM_LUT_RW_INDEX, CM_IGAM_LUT_RW_INDEX, 0);
|
||||
for (i = 0; i < gamma->num_entries; i++) {
|
||||
REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR,
|
||||
dal_fixed31_32_round(
|
||||
dc_fixpt_round(
|
||||
gamma->entries.red[i]));
|
||||
REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR,
|
||||
dal_fixed31_32_round(
|
||||
dc_fixpt_round(
|
||||
gamma->entries.green[i]));
|
||||
REG_SET(CM_IGAM_LUT_SEQ_COLOR, 0, CM_IGAM_LUT_SEQ_COLOR,
|
||||
dal_fixed31_32_round(
|
||||
dc_fixpt_round(
|
||||
gamma->entries.blue[i]));
|
||||
}
|
||||
// Power off LUT memory
|
||||
|
@@ -169,7 +169,7 @@ static enum dscl_mode_sel dpp1_dscl_get_dscl_mode(
|
||||
const struct scaler_data *data,
|
||||
bool dbg_always_scale)
|
||||
{
|
||||
const long long one = dal_fixed31_32_one.value;
|
||||
const long long one = dc_fixpt_one.value;
|
||||
|
||||
if (dpp_base->caps->dscl_data_proc_format == DSCL_DATA_PRCESSING_FIXED_FORMAT) {
|
||||
/* DSCL is processing data in fixed format */
|
||||
@@ -464,8 +464,8 @@ static enum lb_memory_config dpp1_dscl_find_lb_memory_config(struct dcn10_dpp *d
|
||||
int num_part_y, num_part_c;
|
||||
int vtaps = scl_data->taps.v_taps;
|
||||
int vtaps_c = scl_data->taps.v_taps_c;
|
||||
int ceil_vratio = dal_fixed31_32_ceil(scl_data->ratios.vert);
|
||||
int ceil_vratio_c = dal_fixed31_32_ceil(scl_data->ratios.vert_c);
|
||||
int ceil_vratio = dc_fixpt_ceil(scl_data->ratios.vert);
|
||||
int ceil_vratio_c = dc_fixpt_ceil(scl_data->ratios.vert_c);
|
||||
enum lb_memory_config mem_cfg = LB_MEMORY_CONFIG_0;
|
||||
|
||||
if (dpp->base.ctx->dc->debug.use_max_lb)
|
||||
@@ -565,52 +565,52 @@ static void dpp1_dscl_set_manual_ratio_init(
|
||||
uint32_t init_int = 0;
|
||||
|
||||
REG_SET(SCL_HORZ_FILTER_SCALE_RATIO, 0,
|
||||
SCL_H_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.horz) << 5);
|
||||
SCL_H_SCALE_RATIO, dc_fixpt_u2d19(data->ratios.horz) << 5);
|
||||
|
||||
REG_SET(SCL_VERT_FILTER_SCALE_RATIO, 0,
|
||||
SCL_V_SCALE_RATIO, dal_fixed31_32_u2d19(data->ratios.vert) << 5);
|
||||
SCL_V_SCALE_RATIO, dc_fixpt_u2d19(data->ratios.vert) << 5);
|
||||
|
||||
REG_SET(SCL_HORZ_FILTER_SCALE_RATIO_C, 0,
|
||||
SCL_H_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.horz_c) << 5);
|
||||
SCL_H_SCALE_RATIO_C, dc_fixpt_u2d19(data->ratios.horz_c) << 5);
|
||||
|
||||
REG_SET(SCL_VERT_FILTER_SCALE_RATIO_C, 0,
|
||||
SCL_V_SCALE_RATIO_C, dal_fixed31_32_u2d19(data->ratios.vert_c) << 5);
|
||||
SCL_V_SCALE_RATIO_C, dc_fixpt_u2d19(data->ratios.vert_c) << 5);
|
||||
|
||||
/*
|
||||
* 0.24 format for fraction, first five bits zeroed
|
||||
*/
|
||||
init_frac = dal_fixed31_32_u0d19(data->inits.h) << 5;
|
||||
init_int = dal_fixed31_32_floor(data->inits.h);
|
||||
init_frac = dc_fixpt_u0d19(data->inits.h) << 5;
|
||||
init_int = dc_fixpt_floor(data->inits.h);
|
||||
REG_SET_2(SCL_HORZ_FILTER_INIT, 0,
|
||||
SCL_H_INIT_FRAC, init_frac,
|
||||
SCL_H_INIT_INT, init_int);
|
||||
|
||||
init_frac = dal_fixed31_32_u0d19(data->inits.h_c) << 5;
|
||||
init_int = dal_fixed31_32_floor(data->inits.h_c);
|
||||
init_frac = dc_fixpt_u0d19(data->inits.h_c) << 5;
|
||||
init_int = dc_fixpt_floor(data->inits.h_c);
|
||||
REG_SET_2(SCL_HORZ_FILTER_INIT_C, 0,
|
||||
SCL_H_INIT_FRAC_C, init_frac,
|
||||
SCL_H_INIT_INT_C, init_int);
|
||||
|
||||
init_frac = dal_fixed31_32_u0d19(data->inits.v) << 5;
|
||||
init_int = dal_fixed31_32_floor(data->inits.v);
|
||||
init_frac = dc_fixpt_u0d19(data->inits.v) << 5;
|
||||
init_int = dc_fixpt_floor(data->inits.v);
|
||||
REG_SET_2(SCL_VERT_FILTER_INIT, 0,
|
||||
SCL_V_INIT_FRAC, init_frac,
|
||||
SCL_V_INIT_INT, init_int);
|
||||
|
||||
init_frac = dal_fixed31_32_u0d19(data->inits.v_bot) << 5;
|
||||
init_int = dal_fixed31_32_floor(data->inits.v_bot);
|
||||
init_frac = dc_fixpt_u0d19(data->inits.v_bot) << 5;
|
||||
init_int = dc_fixpt_floor(data->inits.v_bot);
|
||||
REG_SET_2(SCL_VERT_FILTER_INIT_BOT, 0,
|
||||
SCL_V_INIT_FRAC_BOT, init_frac,
|
||||
SCL_V_INIT_INT_BOT, init_int);
|
||||
|
||||
init_frac = dal_fixed31_32_u0d19(data->inits.v_c) << 5;
|
||||
init_int = dal_fixed31_32_floor(data->inits.v_c);
|
||||
init_frac = dc_fixpt_u0d19(data->inits.v_c) << 5;
|
||||
init_int = dc_fixpt_floor(data->inits.v_c);
|
||||
REG_SET_2(SCL_VERT_FILTER_INIT_C, 0,
|
||||
SCL_V_INIT_FRAC_C, init_frac,
|
||||
SCL_V_INIT_INT_C, init_int);
|
||||
|
||||
init_frac = dal_fixed31_32_u0d19(data->inits.v_c_bot) << 5;
|
||||
init_int = dal_fixed31_32_floor(data->inits.v_c_bot);
|
||||
init_frac = dc_fixpt_u0d19(data->inits.v_c_bot) << 5;
|
||||
init_int = dc_fixpt_floor(data->inits.v_c_bot);
|
||||
REG_SET_2(SCL_VERT_FILTER_INIT_BOT_C, 0,
|
||||
SCL_V_INIT_FRAC_BOT_C, init_frac,
|
||||
SCL_V_INIT_INT_BOT_C, init_int);
|
||||
|
@@ -476,6 +476,14 @@ void hubbub1_toggle_watermark_change_req(struct hubbub *hubbub)
|
||||
DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, watermark_change_req);
|
||||
}
|
||||
|
||||
void hubbub1_soft_reset(struct hubbub *hubbub, bool reset)
|
||||
{
|
||||
uint32_t reset_en = reset ? 1 : 0;
|
||||
|
||||
REG_UPDATE(DCHUBBUB_SOFT_RESET,
|
||||
DCHUBBUB_GLOBAL_SOFT_RESET, reset_en);
|
||||
}
|
||||
|
||||
static bool hubbub1_dcc_support_swizzle(
|
||||
enum swizzle_mode_values swizzle,
|
||||
unsigned int bytes_per_element,
|
||||
|
@@ -48,7 +48,8 @@
|
||||
SR(DCHUBBUB_ARB_DF_REQ_OUTSTAND),\
|
||||
SR(DCHUBBUB_GLOBAL_TIMER_CNTL), \
|
||||
SR(DCHUBBUB_TEST_DEBUG_INDEX), \
|
||||
SR(DCHUBBUB_TEST_DEBUG_DATA)
|
||||
SR(DCHUBBUB_TEST_DEBUG_DATA),\
|
||||
SR(DCHUBBUB_SOFT_RESET)
|
||||
|
||||
#define HUBBUB_SR_WATERMARK_REG_LIST()\
|
||||
SR(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A),\
|
||||
@@ -105,6 +106,7 @@ struct dcn_hubbub_registers {
|
||||
uint32_t DCHUBBUB_SDPIF_AGP_BOT;
|
||||
uint32_t DCHUBBUB_SDPIF_AGP_TOP;
|
||||
uint32_t DCHUBBUB_CRC_CTRL;
|
||||
uint32_t DCHUBBUB_SOFT_RESET;
|
||||
};
|
||||
|
||||
/* set field name */
|
||||
@@ -114,6 +116,7 @@ struct dcn_hubbub_registers {
|
||||
|
||||
#define HUBBUB_MASK_SH_LIST_DCN(mask_sh)\
|
||||
HUBBUB_SF(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, mask_sh), \
|
||||
HUBBUB_SF(DCHUBBUB_SOFT_RESET, DCHUBBUB_GLOBAL_SOFT_RESET, mask_sh), \
|
||||
HUBBUB_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, mask_sh), \
|
||||
HUBBUB_SF(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL, DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE, mask_sh), \
|
||||
HUBBUB_SF(DCHUBBUB_ARB_DRAM_STATE_CNTL, DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE, mask_sh), \
|
||||
@@ -143,6 +146,7 @@ struct dcn_hubbub_registers {
|
||||
type DCHUBBUB_ARB_SAT_LEVEL;\
|
||||
type DCHUBBUB_ARB_MIN_REQ_OUTSTAND;\
|
||||
type DCHUBBUB_GLOBAL_TIMER_REFDIV;\
|
||||
type DCHUBBUB_GLOBAL_SOFT_RESET; \
|
||||
type SDPIF_FB_TOP;\
|
||||
type SDPIF_FB_BASE;\
|
||||
type SDPIF_FB_OFFSET;\
|
||||
@@ -201,6 +205,7 @@ void hubbub1_toggle_watermark_change_req(
|
||||
void hubbub1_wm_read_state(struct hubbub *hubbub,
|
||||
struct dcn_hubbub_wm *wm);
|
||||
|
||||
void hubbub1_soft_reset(struct hubbub *hubbub, bool reset);
|
||||
void hubbub1_construct(struct hubbub *hubbub,
|
||||
struct dc_context *ctx,
|
||||
const struct dcn_hubbub_registers *hubbub_regs,
|
||||
|
@@ -78,6 +78,27 @@ static void hubp1_disconnect(struct hubp *hubp)
|
||||
CURSOR_ENABLE, 0);
|
||||
}
|
||||
|
||||
static void hubp1_disable_control(struct hubp *hubp, bool disable_hubp)
|
||||
{
|
||||
struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
|
||||
uint32_t disable = disable_hubp ? 1 : 0;
|
||||
|
||||
REG_UPDATE(DCHUBP_CNTL,
|
||||
HUBP_DISABLE, disable);
|
||||
}
|
||||
|
||||
static unsigned int hubp1_get_underflow_status(struct hubp *hubp)
|
||||
{
|
||||
uint32_t hubp_underflow = 0;
|
||||
struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
|
||||
|
||||
REG_GET(DCHUBP_CNTL,
|
||||
HUBP_UNDERFLOW_STATUS,
|
||||
&hubp_underflow);
|
||||
|
||||
return hubp_underflow;
|
||||
}
|
||||
|
||||
static void hubp1_set_hubp_blank_en(struct hubp *hubp, bool blank)
|
||||
{
|
||||
struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
|
||||
@@ -1054,8 +1075,8 @@ void hubp1_cursor_set_position(
|
||||
ASSERT(param->h_scale_ratio.value);
|
||||
|
||||
if (param->h_scale_ratio.value)
|
||||
dst_x_offset = dal_fixed31_32_floor(dal_fixed31_32_div(
|
||||
dal_fixed31_32_from_int(dst_x_offset),
|
||||
dst_x_offset = dc_fixpt_floor(dc_fixpt_div(
|
||||
dc_fixpt_from_int(dst_x_offset),
|
||||
param->h_scale_ratio));
|
||||
|
||||
if (src_x_offset >= (int)param->viewport_width)
|
||||
@@ -1117,6 +1138,9 @@ static struct hubp_funcs dcn10_hubp_funcs = {
|
||||
.hubp_clk_cntl = hubp1_clk_cntl,
|
||||
.hubp_vtg_sel = hubp1_vtg_sel,
|
||||
.hubp_read_state = hubp1_read_state,
|
||||
.hubp_disable_control = hubp1_disable_control,
|
||||
.hubp_get_underflow_status = hubp1_get_underflow_status,
|
||||
|
||||
};
|
||||
|
||||
/*****************************************/
|
||||
|
@@ -253,6 +253,7 @@
|
||||
HUBP_SF(HUBP0_DCHUBP_CNTL, HUBP_UNDERFLOW_STATUS, mask_sh),\
|
||||
HUBP_SF(HUBP0_DCHUBP_CNTL, HUBP_NO_OUTSTANDING_REQ, mask_sh),\
|
||||
HUBP_SF(HUBP0_DCHUBP_CNTL, HUBP_VTG_SEL, mask_sh),\
|
||||
HUBP_SF(HUBP0_DCHUBP_CNTL, HUBP_DISABLE, mask_sh),\
|
||||
HUBP_SF(HUBP0_DCSURF_ADDR_CONFIG, NUM_PIPES, mask_sh),\
|
||||
HUBP_SF(HUBP0_DCSURF_ADDR_CONFIG, NUM_BANKS, mask_sh),\
|
||||
HUBP_SF(HUBP0_DCSURF_ADDR_CONFIG, PIPE_INTERLEAVE, mask_sh),\
|
||||
@@ -421,6 +422,7 @@
|
||||
|
||||
#define DCN_HUBP_REG_FIELD_LIST(type) \
|
||||
type HUBP_BLANK_EN;\
|
||||
type HUBP_DISABLE;\
|
||||
type HUBP_TTU_DISABLE;\
|
||||
type HUBP_NO_OUTSTANDING_REQ;\
|
||||
type HUBP_VTG_SEL;\
|
||||
@@ -723,4 +725,5 @@ void hubp1_read_state(struct hubp *hubp);
|
||||
|
||||
enum cursor_pitch hubp1_get_cursor_pitch(unsigned int pitch);
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -127,24 +127,26 @@ static void dcn10_log_hubp_states(struct dc *dc)
|
||||
|
||||
hubp->funcs->hubp_read_state(hubp);
|
||||
|
||||
DTN_INFO("[%2d]: %5xh %6xh %5d %6d %2xh %2xh %6xh"
|
||||
" %6d %8d %7d %8xh",
|
||||
hubp->inst,
|
||||
s->pixel_format,
|
||||
s->inuse_addr_hi,
|
||||
s->viewport_width,
|
||||
s->viewport_height,
|
||||
s->rotation_angle,
|
||||
s->h_mirror_en,
|
||||
s->sw_mode,
|
||||
s->dcc_en,
|
||||
s->blank_en,
|
||||
s->ttu_disable,
|
||||
s->underflow_status);
|
||||
DTN_INFO_MICRO_SEC(s->min_ttu_vblank);
|
||||
DTN_INFO_MICRO_SEC(s->qos_level_low_wm);
|
||||
DTN_INFO_MICRO_SEC(s->qos_level_high_wm);
|
||||
DTN_INFO("\n");
|
||||
if (!s->blank_en) {
|
||||
DTN_INFO("[%2d]: %5xh %6xh %5d %6d %2xh %2xh %6xh"
|
||||
" %6d %8d %7d %8xh",
|
||||
hubp->inst,
|
||||
s->pixel_format,
|
||||
s->inuse_addr_hi,
|
||||
s->viewport_width,
|
||||
s->viewport_height,
|
||||
s->rotation_angle,
|
||||
s->h_mirror_en,
|
||||
s->sw_mode,
|
||||
s->dcc_en,
|
||||
s->blank_en,
|
||||
s->ttu_disable,
|
||||
s->underflow_status);
|
||||
DTN_INFO_MICRO_SEC(s->min_ttu_vblank);
|
||||
DTN_INFO_MICRO_SEC(s->qos_level_low_wm);
|
||||
DTN_INFO_MICRO_SEC(s->qos_level_high_wm);
|
||||
DTN_INFO("\n");
|
||||
}
|
||||
}
|
||||
|
||||
DTN_INFO("\n=========RQ========\n");
|
||||
@@ -155,16 +157,17 @@ static void dcn10_log_hubp_states(struct dc *dc)
|
||||
struct dcn_hubp_state *s = &(TO_DCN10_HUBP(pool->hubps[i])->state);
|
||||
struct _vcs_dpi_display_rq_regs_st *rq_regs = &s->rq_regs;
|
||||
|
||||
DTN_INFO("[%2d]: %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh\n",
|
||||
i, rq_regs->drq_expansion_mode, rq_regs->prq_expansion_mode, rq_regs->mrq_expansion_mode,
|
||||
rq_regs->crq_expansion_mode, rq_regs->plane1_base_address, rq_regs->rq_regs_l.chunk_size,
|
||||
rq_regs->rq_regs_l.min_chunk_size, rq_regs->rq_regs_l.meta_chunk_size,
|
||||
rq_regs->rq_regs_l.min_meta_chunk_size, rq_regs->rq_regs_l.dpte_group_size,
|
||||
rq_regs->rq_regs_l.mpte_group_size, rq_regs->rq_regs_l.swath_height,
|
||||
rq_regs->rq_regs_l.pte_row_height_linear, rq_regs->rq_regs_c.chunk_size, rq_regs->rq_regs_c.min_chunk_size,
|
||||
rq_regs->rq_regs_c.meta_chunk_size, rq_regs->rq_regs_c.min_meta_chunk_size,
|
||||
rq_regs->rq_regs_c.dpte_group_size, rq_regs->rq_regs_c.mpte_group_size,
|
||||
rq_regs->rq_regs_c.swath_height, rq_regs->rq_regs_c.pte_row_height_linear);
|
||||
if (!s->blank_en)
|
||||
DTN_INFO("[%2d]: %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh\n",
|
||||
pool->hubps[i]->inst, rq_regs->drq_expansion_mode, rq_regs->prq_expansion_mode, rq_regs->mrq_expansion_mode,
|
||||
rq_regs->crq_expansion_mode, rq_regs->plane1_base_address, rq_regs->rq_regs_l.chunk_size,
|
||||
rq_regs->rq_regs_l.min_chunk_size, rq_regs->rq_regs_l.meta_chunk_size,
|
||||
rq_regs->rq_regs_l.min_meta_chunk_size, rq_regs->rq_regs_l.dpte_group_size,
|
||||
rq_regs->rq_regs_l.mpte_group_size, rq_regs->rq_regs_l.swath_height,
|
||||
rq_regs->rq_regs_l.pte_row_height_linear, rq_regs->rq_regs_c.chunk_size, rq_regs->rq_regs_c.min_chunk_size,
|
||||
rq_regs->rq_regs_c.meta_chunk_size, rq_regs->rq_regs_c.min_meta_chunk_size,
|
||||
rq_regs->rq_regs_c.dpte_group_size, rq_regs->rq_regs_c.mpte_group_size,
|
||||
rq_regs->rq_regs_c.swath_height, rq_regs->rq_regs_c.pte_row_height_linear);
|
||||
}
|
||||
|
||||
DTN_INFO("========DLG========\n");
|
||||
@@ -179,27 +182,28 @@ static void dcn10_log_hubp_states(struct dc *dc)
|
||||
struct dcn_hubp_state *s = &(TO_DCN10_HUBP(pool->hubps[i])->state);
|
||||
struct _vcs_dpi_display_dlg_regs_st *dlg_regs = &s->dlg_attr;
|
||||
|
||||
DTN_INFO("[%2d]: %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh"
|
||||
"% 8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh"
|
||||
" %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh\n",
|
||||
i, dlg_regs->refcyc_h_blank_end, dlg_regs->dlg_vblank_end, dlg_regs->min_dst_y_next_start,
|
||||
dlg_regs->refcyc_per_htotal, dlg_regs->refcyc_x_after_scaler, dlg_regs->dst_y_after_scaler,
|
||||
dlg_regs->dst_y_prefetch, dlg_regs->dst_y_per_vm_vblank, dlg_regs->dst_y_per_row_vblank,
|
||||
dlg_regs->dst_y_per_vm_flip, dlg_regs->dst_y_per_row_flip, dlg_regs->ref_freq_to_pix_freq,
|
||||
dlg_regs->vratio_prefetch, dlg_regs->vratio_prefetch_c, dlg_regs->refcyc_per_pte_group_vblank_l,
|
||||
dlg_regs->refcyc_per_pte_group_vblank_c, dlg_regs->refcyc_per_meta_chunk_vblank_l,
|
||||
dlg_regs->refcyc_per_meta_chunk_vblank_c, dlg_regs->refcyc_per_pte_group_flip_l,
|
||||
dlg_regs->refcyc_per_pte_group_flip_c, dlg_regs->refcyc_per_meta_chunk_flip_l,
|
||||
dlg_regs->refcyc_per_meta_chunk_flip_c, dlg_regs->dst_y_per_pte_row_nom_l,
|
||||
dlg_regs->dst_y_per_pte_row_nom_c, dlg_regs->refcyc_per_pte_group_nom_l,
|
||||
dlg_regs->refcyc_per_pte_group_nom_c, dlg_regs->dst_y_per_meta_row_nom_l,
|
||||
dlg_regs->dst_y_per_meta_row_nom_c, dlg_regs->refcyc_per_meta_chunk_nom_l,
|
||||
dlg_regs->refcyc_per_meta_chunk_nom_c, dlg_regs->refcyc_per_line_delivery_pre_l,
|
||||
dlg_regs->refcyc_per_line_delivery_pre_c, dlg_regs->refcyc_per_line_delivery_l,
|
||||
dlg_regs->refcyc_per_line_delivery_c, dlg_regs->chunk_hdl_adjust_cur0, dlg_regs->dst_y_offset_cur1,
|
||||
dlg_regs->chunk_hdl_adjust_cur1, dlg_regs->vready_after_vcount0, dlg_regs->dst_y_delta_drq_limit,
|
||||
dlg_regs->xfc_reg_transfer_delay, dlg_regs->xfc_reg_precharge_delay,
|
||||
dlg_regs->xfc_reg_remote_surface_flip_latency);
|
||||
if (!s->blank_en)
|
||||
DTN_INFO("[%2d]: %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh"
|
||||
"% 8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh"
|
||||
" %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh\n",
|
||||
pool->hubps[i]->inst, dlg_regs->refcyc_h_blank_end, dlg_regs->dlg_vblank_end, dlg_regs->min_dst_y_next_start,
|
||||
dlg_regs->refcyc_per_htotal, dlg_regs->refcyc_x_after_scaler, dlg_regs->dst_y_after_scaler,
|
||||
dlg_regs->dst_y_prefetch, dlg_regs->dst_y_per_vm_vblank, dlg_regs->dst_y_per_row_vblank,
|
||||
dlg_regs->dst_y_per_vm_flip, dlg_regs->dst_y_per_row_flip, dlg_regs->ref_freq_to_pix_freq,
|
||||
dlg_regs->vratio_prefetch, dlg_regs->vratio_prefetch_c, dlg_regs->refcyc_per_pte_group_vblank_l,
|
||||
dlg_regs->refcyc_per_pte_group_vblank_c, dlg_regs->refcyc_per_meta_chunk_vblank_l,
|
||||
dlg_regs->refcyc_per_meta_chunk_vblank_c, dlg_regs->refcyc_per_pte_group_flip_l,
|
||||
dlg_regs->refcyc_per_pte_group_flip_c, dlg_regs->refcyc_per_meta_chunk_flip_l,
|
||||
dlg_regs->refcyc_per_meta_chunk_flip_c, dlg_regs->dst_y_per_pte_row_nom_l,
|
||||
dlg_regs->dst_y_per_pte_row_nom_c, dlg_regs->refcyc_per_pte_group_nom_l,
|
||||
dlg_regs->refcyc_per_pte_group_nom_c, dlg_regs->dst_y_per_meta_row_nom_l,
|
||||
dlg_regs->dst_y_per_meta_row_nom_c, dlg_regs->refcyc_per_meta_chunk_nom_l,
|
||||
dlg_regs->refcyc_per_meta_chunk_nom_c, dlg_regs->refcyc_per_line_delivery_pre_l,
|
||||
dlg_regs->refcyc_per_line_delivery_pre_c, dlg_regs->refcyc_per_line_delivery_l,
|
||||
dlg_regs->refcyc_per_line_delivery_c, dlg_regs->chunk_hdl_adjust_cur0, dlg_regs->dst_y_offset_cur1,
|
||||
dlg_regs->chunk_hdl_adjust_cur1, dlg_regs->vready_after_vcount0, dlg_regs->dst_y_delta_drq_limit,
|
||||
dlg_regs->xfc_reg_transfer_delay, dlg_regs->xfc_reg_precharge_delay,
|
||||
dlg_regs->xfc_reg_remote_surface_flip_latency);
|
||||
}
|
||||
|
||||
DTN_INFO("========TTU========\n");
|
||||
@@ -210,14 +214,15 @@ static void dcn10_log_hubp_states(struct dc *dc)
|
||||
struct dcn_hubp_state *s = &(TO_DCN10_HUBP(pool->hubps[i])->state);
|
||||
struct _vcs_dpi_display_ttu_regs_st *ttu_regs = &s->ttu_attr;
|
||||
|
||||
DTN_INFO("[%2d]: %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh\n",
|
||||
i, ttu_regs->qos_level_low_wm, ttu_regs->qos_level_high_wm, ttu_regs->min_ttu_vblank,
|
||||
ttu_regs->qos_level_flip, ttu_regs->refcyc_per_req_delivery_pre_l, ttu_regs->refcyc_per_req_delivery_l,
|
||||
ttu_regs->refcyc_per_req_delivery_pre_c, ttu_regs->refcyc_per_req_delivery_c, ttu_regs->refcyc_per_req_delivery_cur0,
|
||||
ttu_regs->refcyc_per_req_delivery_pre_cur0, ttu_regs->refcyc_per_req_delivery_cur1,
|
||||
ttu_regs->refcyc_per_req_delivery_pre_cur1, ttu_regs->qos_level_fixed_l, ttu_regs->qos_ramp_disable_l,
|
||||
ttu_regs->qos_level_fixed_c, ttu_regs->qos_ramp_disable_c, ttu_regs->qos_level_fixed_cur0,
|
||||
ttu_regs->qos_ramp_disable_cur0, ttu_regs->qos_level_fixed_cur1, ttu_regs->qos_ramp_disable_cur1);
|
||||
if (!s->blank_en)
|
||||
DTN_INFO("[%2d]: %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh %8xh\n",
|
||||
pool->hubps[i]->inst, ttu_regs->qos_level_low_wm, ttu_regs->qos_level_high_wm, ttu_regs->min_ttu_vblank,
|
||||
ttu_regs->qos_level_flip, ttu_regs->refcyc_per_req_delivery_pre_l, ttu_regs->refcyc_per_req_delivery_l,
|
||||
ttu_regs->refcyc_per_req_delivery_pre_c, ttu_regs->refcyc_per_req_delivery_c, ttu_regs->refcyc_per_req_delivery_cur0,
|
||||
ttu_regs->refcyc_per_req_delivery_pre_cur0, ttu_regs->refcyc_per_req_delivery_cur1,
|
||||
ttu_regs->refcyc_per_req_delivery_pre_cur1, ttu_regs->qos_level_fixed_l, ttu_regs->qos_ramp_disable_l,
|
||||
ttu_regs->qos_level_fixed_c, ttu_regs->qos_ramp_disable_c, ttu_regs->qos_level_fixed_cur0,
|
||||
ttu_regs->qos_ramp_disable_cur0, ttu_regs->qos_level_fixed_cur1, ttu_regs->qos_ramp_disable_cur1);
|
||||
}
|
||||
DTN_INFO("\n");
|
||||
}
|
||||
@@ -321,6 +326,12 @@ void dcn10_log_hw_state(struct dc *dc)
|
||||
s.h_total,
|
||||
s.v_total,
|
||||
s.underflow_occurred_status);
|
||||
|
||||
// Clear underflow for debug purposes
|
||||
// We want to keep underflow sticky bit on for the longevity tests outside of test environment.
|
||||
// This function is called only from Windows or Diags test environment, hence it's safe to clear
|
||||
// it from here without affecting the original intent.
|
||||
tg->funcs->clear_optc_underflow(tg);
|
||||
}
|
||||
DTN_INFO("\n");
|
||||
|
||||
@@ -747,6 +758,90 @@ static void reset_back_end_for_pipe(
|
||||
pipe_ctx->pipe_idx, pipe_ctx->stream_res.tg->inst);
|
||||
}
|
||||
|
||||
static bool dcn10_hw_wa_force_recovery(struct dc *dc)
|
||||
{
|
||||
struct hubp *hubp ;
|
||||
unsigned int i;
|
||||
bool need_recover = true;
|
||||
|
||||
if (!dc->debug.recovery_enabled)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx =
|
||||
&dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx != NULL) {
|
||||
hubp = pipe_ctx->plane_res.hubp;
|
||||
if (hubp != NULL) {
|
||||
if (hubp->funcs->hubp_get_underflow_status(hubp) != 0) {
|
||||
/* one pipe underflow, we will reset all the pipes*/
|
||||
need_recover = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!need_recover)
|
||||
return false;
|
||||
/*
|
||||
DCHUBP_CNTL:HUBP_BLANK_EN=1
|
||||
DCHUBBUB_SOFT_RESET:DCHUBBUB_GLOBAL_SOFT_RESET=1
|
||||
DCHUBP_CNTL:HUBP_DISABLE=1
|
||||
DCHUBP_CNTL:HUBP_DISABLE=0
|
||||
DCHUBBUB_SOFT_RESET:DCHUBBUB_GLOBAL_SOFT_RESET=0
|
||||
DCSURF_PRIMARY_SURFACE_ADDRESS
|
||||
DCHUBP_CNTL:HUBP_BLANK_EN=0
|
||||
*/
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx =
|
||||
&dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx != NULL) {
|
||||
hubp = pipe_ctx->plane_res.hubp;
|
||||
/*DCHUBP_CNTL:HUBP_BLANK_EN=1*/
|
||||
if (hubp != NULL)
|
||||
hubp->funcs->set_hubp_blank_en(hubp, true);
|
||||
}
|
||||
}
|
||||
/*DCHUBBUB_SOFT_RESET:DCHUBBUB_GLOBAL_SOFT_RESET=1*/
|
||||
hubbub1_soft_reset(dc->res_pool->hubbub, true);
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx =
|
||||
&dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx != NULL) {
|
||||
hubp = pipe_ctx->plane_res.hubp;
|
||||
/*DCHUBP_CNTL:HUBP_DISABLE=1*/
|
||||
if (hubp != NULL)
|
||||
hubp->funcs->hubp_disable_control(hubp, true);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx =
|
||||
&dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx != NULL) {
|
||||
hubp = pipe_ctx->plane_res.hubp;
|
||||
/*DCHUBP_CNTL:HUBP_DISABLE=0*/
|
||||
if (hubp != NULL)
|
||||
hubp->funcs->hubp_disable_control(hubp, true);
|
||||
}
|
||||
}
|
||||
/*DCHUBBUB_SOFT_RESET:DCHUBBUB_GLOBAL_SOFT_RESET=0*/
|
||||
hubbub1_soft_reset(dc->res_pool->hubbub, false);
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx =
|
||||
&dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx != NULL) {
|
||||
hubp = pipe_ctx->plane_res.hubp;
|
||||
/*DCHUBP_CNTL:HUBP_BLANK_EN=0*/
|
||||
if (hubp != NULL)
|
||||
hubp->funcs->set_hubp_blank_en(hubp, true);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void dcn10_verify_allow_pstate_change_high(struct dc *dc)
|
||||
{
|
||||
static bool should_log_hw_state; /* prevent hw state log by default */
|
||||
@@ -755,13 +850,17 @@ static void dcn10_verify_allow_pstate_change_high(struct dc *dc)
|
||||
if (should_log_hw_state) {
|
||||
dcn10_log_hw_state(dc);
|
||||
}
|
||||
|
||||
BREAK_TO_DEBUGGER();
|
||||
if (dcn10_hw_wa_force_recovery(dc)) {
|
||||
/*check again*/
|
||||
if (!hubbub1_verify_allow_pstate_change_high(dc->res_pool->hubbub))
|
||||
BREAK_TO_DEBUGGER();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* trigger HW to start disconnect plane from stream on the next vsync */
|
||||
static void plane_atomic_disconnect(struct dc *dc, struct pipe_ctx *pipe_ctx)
|
||||
void hwss1_plane_atomic_disconnect(struct dc *dc, struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct hubp *hubp = pipe_ctx->plane_res.hubp;
|
||||
int dpp_id = pipe_ctx->plane_res.dpp->inst;
|
||||
@@ -944,7 +1043,7 @@ static void dcn10_init_hw(struct dc *dc)
|
||||
dc->res_pool->opps[i]->mpcc_disconnect_pending[pipe_ctx->plane_res.mpcc_inst] = true;
|
||||
pipe_ctx->stream_res.opp = dc->res_pool->opps[i];
|
||||
|
||||
plane_atomic_disconnect(dc, pipe_ctx);
|
||||
hwss1_plane_atomic_disconnect(dc, pipe_ctx);
|
||||
}
|
||||
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
@@ -1685,22 +1784,22 @@ static uint16_t fixed_point_to_int_frac(
|
||||
|
||||
uint16_t result;
|
||||
|
||||
uint16_t d = (uint16_t)dal_fixed31_32_floor(
|
||||
dal_fixed31_32_abs(
|
||||
uint16_t d = (uint16_t)dc_fixpt_floor(
|
||||
dc_fixpt_abs(
|
||||
arg));
|
||||
|
||||
if (d <= (uint16_t)(1 << integer_bits) - (1 / (uint16_t)divisor))
|
||||
numerator = (uint16_t)dal_fixed31_32_floor(
|
||||
dal_fixed31_32_mul_int(
|
||||
numerator = (uint16_t)dc_fixpt_floor(
|
||||
dc_fixpt_mul_int(
|
||||
arg,
|
||||
divisor));
|
||||
else {
|
||||
numerator = dal_fixed31_32_floor(
|
||||
dal_fixed31_32_sub(
|
||||
dal_fixed31_32_from_int(
|
||||
numerator = dc_fixpt_floor(
|
||||
dc_fixpt_sub(
|
||||
dc_fixpt_from_int(
|
||||
1LL << integer_bits),
|
||||
dal_fixed31_32_recip(
|
||||
dal_fixed31_32_from_int(
|
||||
dc_fixpt_recip(
|
||||
dc_fixpt_from_int(
|
||||
divisor))));
|
||||
}
|
||||
|
||||
@@ -1710,8 +1809,8 @@ static uint16_t fixed_point_to_int_frac(
|
||||
result = (uint16_t)(
|
||||
(1 << (integer_bits + fractional_bits + 1)) + numerator);
|
||||
|
||||
if ((result != 0) && dal_fixed31_32_lt(
|
||||
arg, dal_fixed31_32_zero))
|
||||
if ((result != 0) && dc_fixpt_lt(
|
||||
arg, dc_fixpt_zero))
|
||||
result |= 1 << (integer_bits + fractional_bits);
|
||||
|
||||
return result;
|
||||
@@ -1725,8 +1824,8 @@ void build_prescale_params(struct dc_bias_and_scale *bias_and_scale,
|
||||
&& plane_state->input_csc_color_matrix.enable_adjustment
|
||||
&& plane_state->coeff_reduction_factor.value != 0) {
|
||||
bias_and_scale->scale_blue = fixed_point_to_int_frac(
|
||||
dal_fixed31_32_mul(plane_state->coeff_reduction_factor,
|
||||
dal_fixed31_32_from_fraction(256, 255)),
|
||||
dc_fixpt_mul(plane_state->coeff_reduction_factor,
|
||||
dc_fixpt_from_fraction(256, 255)),
|
||||
2,
|
||||
13);
|
||||
bias_and_scale->scale_red = bias_and_scale->scale_blue;
|
||||
@@ -1995,7 +2094,7 @@ static void dcn10_blank_pixel_data(
|
||||
|
||||
static void set_hdr_multiplier(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct fixed31_32 multiplier = dal_fixed31_32_from_fraction(
|
||||
struct fixed31_32 multiplier = dc_fixpt_from_fraction(
|
||||
pipe_ctx->plane_state->sdr_white_level, 80);
|
||||
uint32_t hw_mult = 0x1f000; // 1.0 default multiplier
|
||||
struct custom_float_format fmt;
|
||||
@@ -2179,7 +2278,7 @@ static void dcn10_apply_ctx_for_surface(
|
||||
old_pipe_ctx->plane_state &&
|
||||
old_pipe_ctx->stream_res.tg == tg) {
|
||||
|
||||
plane_atomic_disconnect(dc, old_pipe_ctx);
|
||||
hwss1_plane_atomic_disconnect(dc, old_pipe_ctx);
|
||||
removed_pipe[i] = true;
|
||||
|
||||
DC_LOG_DC(
|
||||
@@ -2487,15 +2586,6 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx,
|
||||
set_static_screen_control(pipe_ctx[i]->stream_res.tg, value);
|
||||
}
|
||||
|
||||
static void set_plane_config(
|
||||
const struct dc *dc,
|
||||
struct pipe_ctx *pipe_ctx,
|
||||
struct resource_context *res_ctx)
|
||||
{
|
||||
/* TODO */
|
||||
program_gamut_remap(pipe_ctx);
|
||||
}
|
||||
|
||||
static void dcn10_config_stereo_parameters(
|
||||
struct dc_stream_state *stream, struct crtc_stereo_flags *flags)
|
||||
{
|
||||
@@ -2673,7 +2763,6 @@ static const struct hw_sequencer_funcs dcn10_funcs = {
|
||||
.init_hw = dcn10_init_hw,
|
||||
.apply_ctx_to_hw = dce110_apply_ctx_to_hw,
|
||||
.apply_ctx_for_surface = dcn10_apply_ctx_for_surface,
|
||||
.set_plane_config = set_plane_config,
|
||||
.update_plane_addr = dcn10_update_plane_addr,
|
||||
.update_dchub = dcn10_update_dchub,
|
||||
.update_pending_status = dcn10_update_pending_status,
|
||||
|
@@ -37,4 +37,6 @@ extern void fill_display_configs(
|
||||
|
||||
bool is_rgb_cspace(enum dc_color_space output_color_space);
|
||||
|
||||
void hwss1_plane_atomic_disconnect(struct dc *dc, struct pipe_ctx *pipe_ctx);
|
||||
|
||||
#endif /* __DC_HWSS_DCN10_H__ */
|
||||
|
1362
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
Normal file
1362
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
Normal file
File diff suppressed because it is too large
Load Diff
330
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
Normal file
330
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
Normal file
@@ -0,0 +1,330 @@
|
||||
/*
|
||||
* Copyright 2012-15 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: AMD
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __DC_LINK_ENCODER__DCN10_H__
|
||||
#define __DC_LINK_ENCODER__DCN10_H__
|
||||
|
||||
#include "link_encoder.h"
|
||||
|
||||
#define TO_DCN10_LINK_ENC(link_encoder)\
|
||||
container_of(link_encoder, struct dcn10_link_encoder, base)
|
||||
|
||||
|
||||
#define AUX_REG_LIST(id)\
|
||||
SRI(AUX_CONTROL, DP_AUX, id), \
|
||||
SRI(AUX_DPHY_RX_CONTROL0, DP_AUX, id)
|
||||
|
||||
#define HPD_REG_LIST(id)\
|
||||
SRI(DC_HPD_CONTROL, HPD, id)
|
||||
|
||||
#define LE_DCN_COMMON_REG_LIST(id) \
|
||||
SRI(DIG_BE_CNTL, DIG, id), \
|
||||
SRI(DIG_BE_EN_CNTL, DIG, id), \
|
||||
SRI(DP_CONFIG, DP, id), \
|
||||
SRI(DP_DPHY_CNTL, DP, id), \
|
||||
SRI(DP_DPHY_PRBS_CNTL, DP, id), \
|
||||
SRI(DP_DPHY_SCRAM_CNTL, DP, id),\
|
||||
SRI(DP_DPHY_SYM0, DP, id), \
|
||||
SRI(DP_DPHY_SYM1, DP, id), \
|
||||
SRI(DP_DPHY_SYM2, DP, id), \
|
||||
SRI(DP_DPHY_TRAINING_PATTERN_SEL, DP, id), \
|
||||
SRI(DP_LINK_CNTL, DP, id), \
|
||||
SRI(DP_LINK_FRAMING_CNTL, DP, id), \
|
||||
SRI(DP_MSE_SAT0, DP, id), \
|
||||
SRI(DP_MSE_SAT1, DP, id), \
|
||||
SRI(DP_MSE_SAT2, DP, id), \
|
||||
SRI(DP_MSE_SAT_UPDATE, DP, id), \
|
||||
SRI(DP_SEC_CNTL, DP, id), \
|
||||
SRI(DP_VID_STREAM_CNTL, DP, id), \
|
||||
SRI(DP_DPHY_FAST_TRAINING, DP, id), \
|
||||
SRI(DP_SEC_CNTL1, DP, id), \
|
||||
SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
|
||||
SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
|
||||
SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id)
|
||||
|
||||
#define LE_DCN10_REG_LIST(id)\
|
||||
LE_DCN_COMMON_REG_LIST(id)
|
||||
|
||||
struct dcn10_link_enc_aux_registers {
|
||||
uint32_t AUX_CONTROL;
|
||||
uint32_t AUX_DPHY_RX_CONTROL0;
|
||||
};
|
||||
|
||||
struct dcn10_link_enc_hpd_registers {
|
||||
uint32_t DC_HPD_CONTROL;
|
||||
};
|
||||
|
||||
struct dcn10_link_enc_registers {
|
||||
uint32_t DIG_BE_CNTL;
|
||||
uint32_t DIG_BE_EN_CNTL;
|
||||
uint32_t DP_CONFIG;
|
||||
uint32_t DP_DPHY_CNTL;
|
||||
uint32_t DP_DPHY_INTERNAL_CTRL;
|
||||
uint32_t DP_DPHY_PRBS_CNTL;
|
||||
uint32_t DP_DPHY_SCRAM_CNTL;
|
||||
uint32_t DP_DPHY_SYM0;
|
||||
uint32_t DP_DPHY_SYM1;
|
||||
uint32_t DP_DPHY_SYM2;
|
||||
uint32_t DP_DPHY_TRAINING_PATTERN_SEL;
|
||||
uint32_t DP_LINK_CNTL;
|
||||
uint32_t DP_LINK_FRAMING_CNTL;
|
||||
uint32_t DP_MSE_SAT0;
|
||||
uint32_t DP_MSE_SAT1;
|
||||
uint32_t DP_MSE_SAT2;
|
||||
uint32_t DP_MSE_SAT_UPDATE;
|
||||
uint32_t DP_SEC_CNTL;
|
||||
uint32_t DP_VID_STREAM_CNTL;
|
||||
uint32_t DP_DPHY_FAST_TRAINING;
|
||||
uint32_t DP_DPHY_BS_SR_SWAP_CNTL;
|
||||
uint32_t DP_DPHY_HBR2_PATTERN_CONTROL;
|
||||
uint32_t DP_SEC_CNTL1;
|
||||
};
|
||||
|
||||
#define LE_SF(reg_name, field_name, post_fix)\
|
||||
.field_name = reg_name ## __ ## field_name ## post_fix
|
||||
|
||||
#define LINK_ENCODER_MASK_SH_LIST_DCN10(mask_sh)\
|
||||
LE_SF(DIG0_DIG_BE_EN_CNTL, DIG_ENABLE, mask_sh),\
|
||||
LE_SF(DIG0_DIG_BE_CNTL, DIG_HPD_SELECT, mask_sh),\
|
||||
LE_SF(DIG0_DIG_BE_CNTL, DIG_MODE, mask_sh),\
|
||||
LE_SF(DIG0_DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_CNTL, DPHY_BYPASS, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE0, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE1, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE2, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE3, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_EN, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_SEL, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM1, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM2, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM3, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM4, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM5, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM6, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM7, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM8, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_BS_COUNT, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_ADVANCE, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_FAST_TRAINING, DPHY_RX_FAST_TRAINING_CAPABLE, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_BS_SR_SWAP_CNTL, DPHY_LOAD_BS_COUNT, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_TRAINING_PATTERN_SEL, DPHY_TRAINING_PATTERN_SEL, mask_sh),\
|
||||
LE_SF(DP0_DP_DPHY_HBR2_PATTERN_CONTROL, DP_DPHY_HBR2_PATTERN_CONTROL, mask_sh),\
|
||||
LE_SF(DP0_DP_LINK_CNTL, DP_LINK_TRAINING_COMPLETE, mask_sh),\
|
||||
LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_IDLE_BS_INTERVAL, mask_sh),\
|
||||
LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VBID_DISABLE, mask_sh),\
|
||||
LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VID_ENHANCED_FRAME_MODE, mask_sh),\
|
||||
LE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
|
||||
LE_SF(DP0_DP_CONFIG, DP_UDI_LANES, mask_sh),\
|
||||
LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_LINE_NUM, mask_sh),\
|
||||
LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_PRIORITY, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC0, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC1, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT0, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT1, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC2, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC3, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT2, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT3, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_SAT_UPDATE, mask_sh),\
|
||||
LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_16_MTP_KEEPOUT, mask_sh),\
|
||||
LE_SF(DP_AUX0_AUX_CONTROL, AUX_HPD_SEL, mask_sh),\
|
||||
LE_SF(DP_AUX0_AUX_CONTROL, AUX_LS_READ_EN, mask_sh),\
|
||||
LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_RECEIVE_WINDOW, mask_sh),\
|
||||
LE_SF(HPD0_DC_HPD_CONTROL, DC_HPD_EN, mask_sh)
|
||||
|
||||
#define DCN_LINK_ENCODER_REG_FIELD_LIST(type) \
|
||||
type DIG_ENABLE;\
|
||||
type DIG_HPD_SELECT;\
|
||||
type DIG_MODE;\
|
||||
type DIG_FE_SOURCE_SELECT;\
|
||||
type DPHY_BYPASS;\
|
||||
type DPHY_ATEST_SEL_LANE0;\
|
||||
type DPHY_ATEST_SEL_LANE1;\
|
||||
type DPHY_ATEST_SEL_LANE2;\
|
||||
type DPHY_ATEST_SEL_LANE3;\
|
||||
type DPHY_PRBS_EN;\
|
||||
type DPHY_PRBS_SEL;\
|
||||
type DPHY_SYM1;\
|
||||
type DPHY_SYM2;\
|
||||
type DPHY_SYM3;\
|
||||
type DPHY_SYM4;\
|
||||
type DPHY_SYM5;\
|
||||
type DPHY_SYM6;\
|
||||
type DPHY_SYM7;\
|
||||
type DPHY_SYM8;\
|
||||
type DPHY_SCRAMBLER_BS_COUNT;\
|
||||
type DPHY_SCRAMBLER_ADVANCE;\
|
||||
type DPHY_RX_FAST_TRAINING_CAPABLE;\
|
||||
type DPHY_LOAD_BS_COUNT;\
|
||||
type DPHY_TRAINING_PATTERN_SEL;\
|
||||
type DP_DPHY_HBR2_PATTERN_CONTROL;\
|
||||
type DP_LINK_TRAINING_COMPLETE;\
|
||||
type DP_IDLE_BS_INTERVAL;\
|
||||
type DP_VBID_DISABLE;\
|
||||
type DP_VID_ENHANCED_FRAME_MODE;\
|
||||
type DP_VID_STREAM_ENABLE;\
|
||||
type DP_UDI_LANES;\
|
||||
type DP_SEC_GSP0_LINE_NUM;\
|
||||
type DP_SEC_GSP0_PRIORITY;\
|
||||
type DP_MSE_SAT_SRC0;\
|
||||
type DP_MSE_SAT_SRC1;\
|
||||
type DP_MSE_SAT_SRC2;\
|
||||
type DP_MSE_SAT_SRC3;\
|
||||
type DP_MSE_SAT_SLOT_COUNT0;\
|
||||
type DP_MSE_SAT_SLOT_COUNT1;\
|
||||
type DP_MSE_SAT_SLOT_COUNT2;\
|
||||
type DP_MSE_SAT_SLOT_COUNT3;\
|
||||
type DP_MSE_SAT_UPDATE;\
|
||||
type DP_MSE_16_MTP_KEEPOUT;\
|
||||
type AUX_HPD_SEL;\
|
||||
type AUX_LS_READ_EN;\
|
||||
type AUX_RX_RECEIVE_WINDOW;\
|
||||
type DC_HPD_EN
|
||||
|
||||
struct dcn10_link_enc_shift {
|
||||
DCN_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
|
||||
};
|
||||
|
||||
struct dcn10_link_enc_mask {
|
||||
DCN_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
|
||||
};
|
||||
|
||||
struct dcn10_link_encoder {
|
||||
struct link_encoder base;
|
||||
const struct dcn10_link_enc_registers *link_regs;
|
||||
const struct dcn10_link_enc_aux_registers *aux_regs;
|
||||
const struct dcn10_link_enc_hpd_registers *hpd_regs;
|
||||
const struct dcn10_link_enc_shift *link_shift;
|
||||
const struct dcn10_link_enc_mask *link_mask;
|
||||
};
|
||||
|
||||
|
||||
void dcn10_link_encoder_construct(
|
||||
struct dcn10_link_encoder *enc10,
|
||||
const struct encoder_init_data *init_data,
|
||||
const struct encoder_feature_support *enc_features,
|
||||
const struct dcn10_link_enc_registers *link_regs,
|
||||
const struct dcn10_link_enc_aux_registers *aux_regs,
|
||||
const struct dcn10_link_enc_hpd_registers *hpd_regs,
|
||||
const struct dcn10_link_enc_shift *link_shift,
|
||||
const struct dcn10_link_enc_mask *link_mask);
|
||||
|
||||
bool dcn10_link_encoder_validate_dvi_output(
|
||||
const struct dcn10_link_encoder *enc10,
|
||||
enum signal_type connector_signal,
|
||||
enum signal_type signal,
|
||||
const struct dc_crtc_timing *crtc_timing);
|
||||
|
||||
bool dcn10_link_encoder_validate_rgb_output(
|
||||
const struct dcn10_link_encoder *enc10,
|
||||
const struct dc_crtc_timing *crtc_timing);
|
||||
|
||||
bool dcn10_link_encoder_validate_dp_output(
|
||||
const struct dcn10_link_encoder *enc10,
|
||||
const struct dc_crtc_timing *crtc_timing);
|
||||
|
||||
bool dcn10_link_encoder_validate_wireless_output(
|
||||
const struct dcn10_link_encoder *enc10,
|
||||
const struct dc_crtc_timing *crtc_timing);
|
||||
|
||||
bool dcn10_link_encoder_validate_output_with_stream(
|
||||
struct link_encoder *enc,
|
||||
const struct dc_stream_state *stream);
|
||||
|
||||
/****************** HW programming ************************/
|
||||
|
||||
/* initialize HW */ /* why do we initialze aux in here? */
|
||||
void dcn10_link_encoder_hw_init(struct link_encoder *enc);
|
||||
|
||||
void dcn10_link_encoder_destroy(struct link_encoder **enc);
|
||||
|
||||
/* program DIG_MODE in DIG_BE */
|
||||
/* TODO can this be combined with enable_output? */
|
||||
void dcn10_link_encoder_setup(
|
||||
struct link_encoder *enc,
|
||||
enum signal_type signal);
|
||||
|
||||
/* enables TMDS PHY output */
|
||||
/* TODO: still need depth or just pass in adjusted pixel clock? */
|
||||
void dcn10_link_encoder_enable_tmds_output(
|
||||
struct link_encoder *enc,
|
||||
enum clock_source_id clock_source,
|
||||
enum dc_color_depth color_depth,
|
||||
enum signal_type signal,
|
||||
uint32_t pixel_clock);
|
||||
|
||||
/* enables DP PHY output */
|
||||
void dcn10_link_encoder_enable_dp_output(
|
||||
struct link_encoder *enc,
|
||||
const struct dc_link_settings *link_settings,
|
||||
enum clock_source_id clock_source);
|
||||
|
||||
/* enables DP PHY output in MST mode */
|
||||
void dcn10_link_encoder_enable_dp_mst_output(
|
||||
struct link_encoder *enc,
|
||||
const struct dc_link_settings *link_settings,
|
||||
enum clock_source_id clock_source);
|
||||
|
||||
/* disable PHY output */
|
||||
void dcn10_link_encoder_disable_output(
|
||||
struct link_encoder *enc,
|
||||
enum signal_type signal);
|
||||
|
||||
/* set DP lane settings */
|
||||
void dcn10_link_encoder_dp_set_lane_settings(
|
||||
struct link_encoder *enc,
|
||||
const struct link_training_settings *link_settings);
|
||||
|
||||
void dcn10_link_encoder_dp_set_phy_pattern(
|
||||
struct link_encoder *enc,
|
||||
const struct encoder_set_dp_phy_pattern_param *param);
|
||||
|
||||
/* programs DP MST VC payload allocation */
|
||||
void dcn10_link_encoder_update_mst_stream_allocation_table(
|
||||
struct link_encoder *enc,
|
||||
const struct link_mst_stream_allocation_table *table);
|
||||
|
||||
void dcn10_link_encoder_connect_dig_be_to_fe(
|
||||
struct link_encoder *enc,
|
||||
enum engine_id engine,
|
||||
bool connect);
|
||||
|
||||
void dcn10_link_encoder_set_dp_phy_pattern_training_pattern(
|
||||
struct link_encoder *enc,
|
||||
uint32_t index);
|
||||
|
||||
void dcn10_link_encoder_enable_hpd(struct link_encoder *enc);
|
||||
|
||||
void dcn10_link_encoder_disable_hpd(struct link_encoder *enc);
|
||||
|
||||
void dcn10_psr_program_dp_dphy_fast_training(struct link_encoder *enc,
|
||||
bool exit_link_training_required);
|
||||
|
||||
void dcn10_psr_program_secondary_packet(struct link_encoder *enc,
|
||||
unsigned int sdp_transmit_line_num_deadline);
|
||||
|
||||
bool dcn10_is_dig_enabled(struct link_encoder *enc);
|
||||
|
||||
#endif /* __DC_LINK_ENCODER__DCN10_H__ */
|
@@ -360,7 +360,7 @@ void optc1_program_timing(
|
||||
|
||||
}
|
||||
|
||||
static void optc1_set_blank_data_double_buffer(struct timing_generator *optc, bool enable)
|
||||
void optc1_set_blank_data_double_buffer(struct timing_generator *optc, bool enable)
|
||||
{
|
||||
struct optc *optc1 = DCN10TG_FROM_TG(optc);
|
||||
|
||||
@@ -1257,20 +1257,20 @@ void optc1_read_otg_state(struct optc *optc1,
|
||||
OPTC_UNDERFLOW_OCCURRED_STATUS, &s->underflow_occurred_status);
|
||||
}
|
||||
|
||||
static void optc1_clear_optc_underflow(struct timing_generator *optc)
|
||||
void optc1_clear_optc_underflow(struct timing_generator *optc)
|
||||
{
|
||||
struct optc *optc1 = DCN10TG_FROM_TG(optc);
|
||||
|
||||
REG_UPDATE(OPTC_INPUT_GLOBAL_CONTROL, OPTC_UNDERFLOW_CLEAR, 1);
|
||||
}
|
||||
|
||||
static void optc1_tg_init(struct timing_generator *optc)
|
||||
void optc1_tg_init(struct timing_generator *optc)
|
||||
{
|
||||
optc1_set_blank_data_double_buffer(optc, true);
|
||||
optc1_clear_optc_underflow(optc);
|
||||
}
|
||||
|
||||
static bool optc1_is_tg_enabled(struct timing_generator *optc)
|
||||
bool optc1_is_tg_enabled(struct timing_generator *optc)
|
||||
{
|
||||
struct optc *optc1 = DCN10TG_FROM_TG(optc);
|
||||
uint32_t otg_enabled = 0;
|
||||
@@ -1281,7 +1281,7 @@ static bool optc1_is_tg_enabled(struct timing_generator *optc)
|
||||
|
||||
}
|
||||
|
||||
static bool optc1_is_optc_underflow_occurred(struct timing_generator *optc)
|
||||
bool optc1_is_optc_underflow_occurred(struct timing_generator *optc)
|
||||
{
|
||||
struct optc *optc1 = DCN10TG_FROM_TG(optc);
|
||||
uint32_t underflow_occurred = 0;
|
||||
|
@@ -497,4 +497,14 @@ void optc1_program_stereo(struct timing_generator *optc,
|
||||
|
||||
bool optc1_is_stereo_left_eye(struct timing_generator *optc);
|
||||
|
||||
void optc1_clear_optc_underflow(struct timing_generator *optc);
|
||||
|
||||
void optc1_tg_init(struct timing_generator *optc);
|
||||
|
||||
bool optc1_is_tg_enabled(struct timing_generator *optc);
|
||||
|
||||
bool optc1_is_optc_underflow_occurred(struct timing_generator *optc);
|
||||
|
||||
void optc1_set_blank_data_double_buffer(struct timing_generator *optc, bool enable);
|
||||
|
||||
#endif /* __DC_TIMING_GENERATOR_DCN10_H__ */
|
||||
|
@@ -38,7 +38,7 @@
|
||||
#include "dcn10/dcn10_hw_sequencer.h"
|
||||
#include "dce110/dce110_hw_sequencer.h"
|
||||
#include "dcn10/dcn10_opp.h"
|
||||
#include "dce/dce_link_encoder.h"
|
||||
#include "dcn10/dcn10_link_encoder.h"
|
||||
#include "dcn10/dcn10_stream_encoder.h"
|
||||
#include "dce/dce_clocks.h"
|
||||
#include "dce/dce_clock_source.h"
|
||||
@@ -214,13 +214,11 @@ static const struct dce_aduio_mask audio_mask = {
|
||||
AUX_REG_LIST(id)\
|
||||
}
|
||||
|
||||
static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
|
||||
static const struct dcn10_link_enc_aux_registers link_enc_aux_regs[] = {
|
||||
aux_regs(0),
|
||||
aux_regs(1),
|
||||
aux_regs(2),
|
||||
aux_regs(3),
|
||||
aux_regs(4),
|
||||
aux_regs(5)
|
||||
aux_regs(3)
|
||||
};
|
||||
|
||||
#define hpd_regs(id)\
|
||||
@@ -228,13 +226,11 @@ static const struct dce110_link_enc_aux_registers link_enc_aux_regs[] = {
|
||||
HPD_REG_LIST(id)\
|
||||
}
|
||||
|
||||
static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
|
||||
static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {
|
||||
hpd_regs(0),
|
||||
hpd_regs(1),
|
||||
hpd_regs(2),
|
||||
hpd_regs(3),
|
||||
hpd_regs(4),
|
||||
hpd_regs(5)
|
||||
hpd_regs(3)
|
||||
};
|
||||
|
||||
#define link_regs(id)\
|
||||
@@ -243,14 +239,19 @@ static const struct dce110_link_enc_hpd_registers link_enc_hpd_regs[] = {
|
||||
SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \
|
||||
}
|
||||
|
||||
static const struct dce110_link_enc_registers link_enc_regs[] = {
|
||||
static const struct dcn10_link_enc_registers link_enc_regs[] = {
|
||||
link_regs(0),
|
||||
link_regs(1),
|
||||
link_regs(2),
|
||||
link_regs(3),
|
||||
link_regs(4),
|
||||
link_regs(5),
|
||||
link_regs(6),
|
||||
link_regs(3)
|
||||
};
|
||||
|
||||
static const struct dcn10_link_enc_shift le_shift = {
|
||||
LINK_ENCODER_MASK_SH_LIST_DCN10(__SHIFT)
|
||||
};
|
||||
|
||||
static const struct dcn10_link_enc_mask le_mask = {
|
||||
LINK_ENCODER_MASK_SH_LIST_DCN10(_MASK)
|
||||
};
|
||||
|
||||
#define ipp_regs(id)\
|
||||
@@ -446,6 +447,8 @@ static const struct dc_debug debug_defaults_drv = {
|
||||
.vsr_support = true,
|
||||
.performance_trace = false,
|
||||
.az_endpoint_mute_only = true,
|
||||
.recovery_enabled = false, /*enable this by default after testing.*/
|
||||
.max_downscale_src_width = 3840,
|
||||
};
|
||||
|
||||
static const struct dc_debug debug_defaults_diags = {
|
||||
@@ -581,20 +584,22 @@ static const struct encoder_feature_support link_enc_feature = {
|
||||
struct link_encoder *dcn10_link_encoder_create(
|
||||
const struct encoder_init_data *enc_init_data)
|
||||
{
|
||||
struct dce110_link_encoder *enc110 =
|
||||
kzalloc(sizeof(struct dce110_link_encoder), GFP_KERNEL);
|
||||
struct dcn10_link_encoder *enc10 =
|
||||
kzalloc(sizeof(struct dcn10_link_encoder), GFP_KERNEL);
|
||||
|
||||
if (!enc110)
|
||||
if (!enc10)
|
||||
return NULL;
|
||||
|
||||
dce110_link_encoder_construct(enc110,
|
||||
dcn10_link_encoder_construct(enc10,
|
||||
enc_init_data,
|
||||
&link_enc_feature,
|
||||
&link_enc_regs[enc_init_data->transmitter],
|
||||
&link_enc_aux_regs[enc_init_data->channel - 1],
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source]);
|
||||
&link_enc_hpd_regs[enc_init_data->hpd_source],
|
||||
&le_shift,
|
||||
&le_mask);
|
||||
|
||||
return &enc110->base;
|
||||
return &enc10->base;
|
||||
}
|
||||
|
||||
struct clock_source *dcn10_clock_source_create(
|
||||
@@ -1021,6 +1026,7 @@ static bool construct(
|
||||
dc->caps.max_cursor_size = 256;
|
||||
dc->caps.max_slave_planes = 1;
|
||||
dc->caps.is_apu = true;
|
||||
dc->caps.post_blend_color_processing = false;
|
||||
|
||||
if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)
|
||||
dc->debug = debug_defaults_drv;
|
||||
|
@@ -603,11 +603,11 @@ void enc1_stream_encoder_set_mst_bandwidth(
|
||||
struct fixed31_32 avg_time_slots_per_mtp)
|
||||
{
|
||||
struct dcn10_stream_encoder *enc1 = DCN10STRENC_FROM_STRENC(enc);
|
||||
uint32_t x = dal_fixed31_32_floor(
|
||||
uint32_t x = dc_fixpt_floor(
|
||||
avg_time_slots_per_mtp);
|
||||
uint32_t y = dal_fixed31_32_ceil(
|
||||
dal_fixed31_32_shl(
|
||||
dal_fixed31_32_sub_int(
|
||||
uint32_t y = dc_fixpt_ceil(
|
||||
dc_fixpt_shl(
|
||||
dc_fixpt_sub_int(
|
||||
avg_time_slots_per_mtp,
|
||||
x),
|
||||
26));
|
||||
|
@@ -355,10 +355,6 @@ void dm_perf_trace_timestamp(const char *func_name, unsigned int line);
|
||||
/*
|
||||
* Debug and verification hooks
|
||||
*/
|
||||
bool dm_helpers_dc_conn_log(
|
||||
struct dc_context *ctx,
|
||||
struct log_entry *entry,
|
||||
enum dc_log_type event);
|
||||
|
||||
void dm_dtn_log_begin(struct dc_context *ctx);
|
||||
void dm_dtn_log_append_v(struct dc_context *ctx, const char *msg, ...);
|
||||
|
@@ -108,4 +108,17 @@ enum output_standard {
|
||||
dm_std_uninitialized = 0, dm_std_cvtr2, dm_std_cvt
|
||||
};
|
||||
|
||||
enum mpc_combine_affinity {
|
||||
dm_mpc_always_when_possible,
|
||||
dm_mpc_reduce_voltage,
|
||||
dm_mpc_reduce_voltage_and_clocks
|
||||
};
|
||||
|
||||
enum self_refresh_affinity {
|
||||
dm_try_to_allow_self_refresh_and_mclk_switch,
|
||||
dm_allow_self_refresh_and_mclk_switch,
|
||||
dm_allow_self_refresh,
|
||||
dm_neither_self_refresh_nor_mclk_switch
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -25,39 +25,39 @@
|
||||
#ifndef __DISPLAY_MODE_STRUCTS_H__
|
||||
#define __DISPLAY_MODE_STRUCTS_H__
|
||||
|
||||
typedef struct _vcs_dpi_voltage_scaling_st voltage_scaling_st;
|
||||
typedef struct _vcs_dpi_soc_bounding_box_st soc_bounding_box_st;
|
||||
typedef struct _vcs_dpi_ip_params_st ip_params_st;
|
||||
typedef struct _vcs_dpi_display_pipe_source_params_st display_pipe_source_params_st;
|
||||
typedef struct _vcs_dpi_display_output_params_st display_output_params_st;
|
||||
typedef struct _vcs_dpi_display_bandwidth_st display_bandwidth_st;
|
||||
typedef struct _vcs_dpi_scaler_ratio_depth_st scaler_ratio_depth_st;
|
||||
typedef struct _vcs_dpi_scaler_taps_st scaler_taps_st;
|
||||
typedef struct _vcs_dpi_display_pipe_dest_params_st display_pipe_dest_params_st;
|
||||
typedef struct _vcs_dpi_display_pipe_params_st display_pipe_params_st;
|
||||
typedef struct _vcs_dpi_display_clocks_and_cfg_st display_clocks_and_cfg_st;
|
||||
typedef struct _vcs_dpi_display_e2e_pipe_params_st display_e2e_pipe_params_st;
|
||||
typedef struct _vcs_dpi_dchub_buffer_sizing_st dchub_buffer_sizing_st;
|
||||
typedef struct _vcs_dpi_watermarks_perf_st watermarks_perf_st;
|
||||
typedef struct _vcs_dpi_cstate_pstate_watermarks_st cstate_pstate_watermarks_st;
|
||||
typedef struct _vcs_dpi_wm_calc_pipe_params_st wm_calc_pipe_params_st;
|
||||
typedef struct _vcs_dpi_vratio_pre_st vratio_pre_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_misc_params_st display_data_rq_misc_params_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_sizing_params_st display_data_rq_sizing_params_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_dlg_params_st display_data_rq_dlg_params_st;
|
||||
typedef struct _vcs_dpi_display_cur_rq_dlg_params_st display_cur_rq_dlg_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_dlg_params_st display_rq_dlg_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_sizing_params_st display_rq_sizing_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_misc_params_st display_rq_misc_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_params_st display_rq_params_st;
|
||||
typedef struct _vcs_dpi_display_dlg_regs_st display_dlg_regs_st;
|
||||
typedef struct _vcs_dpi_display_ttu_regs_st display_ttu_regs_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_regs_st display_data_rq_regs_st;
|
||||
typedef struct _vcs_dpi_display_rq_regs_st display_rq_regs_st;
|
||||
typedef struct _vcs_dpi_display_dlg_sys_params_st display_dlg_sys_params_st;
|
||||
typedef struct _vcs_dpi_display_dlg_prefetch_param_st display_dlg_prefetch_param_st;
|
||||
typedef struct _vcs_dpi_display_pipe_clock_st display_pipe_clock_st;
|
||||
typedef struct _vcs_dpi_display_arb_params_st display_arb_params_st;
|
||||
typedef struct _vcs_dpi_voltage_scaling_st voltage_scaling_st;
|
||||
typedef struct _vcs_dpi_soc_bounding_box_st soc_bounding_box_st;
|
||||
typedef struct _vcs_dpi_ip_params_st ip_params_st;
|
||||
typedef struct _vcs_dpi_display_pipe_source_params_st display_pipe_source_params_st;
|
||||
typedef struct _vcs_dpi_display_output_params_st display_output_params_st;
|
||||
typedef struct _vcs_dpi_display_bandwidth_st display_bandwidth_st;
|
||||
typedef struct _vcs_dpi_scaler_ratio_depth_st scaler_ratio_depth_st;
|
||||
typedef struct _vcs_dpi_scaler_taps_st scaler_taps_st;
|
||||
typedef struct _vcs_dpi_display_pipe_dest_params_st display_pipe_dest_params_st;
|
||||
typedef struct _vcs_dpi_display_pipe_params_st display_pipe_params_st;
|
||||
typedef struct _vcs_dpi_display_clocks_and_cfg_st display_clocks_and_cfg_st;
|
||||
typedef struct _vcs_dpi_display_e2e_pipe_params_st display_e2e_pipe_params_st;
|
||||
typedef struct _vcs_dpi_dchub_buffer_sizing_st dchub_buffer_sizing_st;
|
||||
typedef struct _vcs_dpi_watermarks_perf_st watermarks_perf_st;
|
||||
typedef struct _vcs_dpi_cstate_pstate_watermarks_st cstate_pstate_watermarks_st;
|
||||
typedef struct _vcs_dpi_wm_calc_pipe_params_st wm_calc_pipe_params_st;
|
||||
typedef struct _vcs_dpi_vratio_pre_st vratio_pre_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_misc_params_st display_data_rq_misc_params_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_sizing_params_st display_data_rq_sizing_params_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_dlg_params_st display_data_rq_dlg_params_st;
|
||||
typedef struct _vcs_dpi_display_cur_rq_dlg_params_st display_cur_rq_dlg_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_dlg_params_st display_rq_dlg_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_sizing_params_st display_rq_sizing_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_misc_params_st display_rq_misc_params_st;
|
||||
typedef struct _vcs_dpi_display_rq_params_st display_rq_params_st;
|
||||
typedef struct _vcs_dpi_display_dlg_regs_st display_dlg_regs_st;
|
||||
typedef struct _vcs_dpi_display_ttu_regs_st display_ttu_regs_st;
|
||||
typedef struct _vcs_dpi_display_data_rq_regs_st display_data_rq_regs_st;
|
||||
typedef struct _vcs_dpi_display_rq_regs_st display_rq_regs_st;
|
||||
typedef struct _vcs_dpi_display_dlg_sys_params_st display_dlg_sys_params_st;
|
||||
typedef struct _vcs_dpi_display_dlg_prefetch_param_st display_dlg_prefetch_param_st;
|
||||
typedef struct _vcs_dpi_display_pipe_clock_st display_pipe_clock_st;
|
||||
typedef struct _vcs_dpi_display_arb_params_st display_arb_params_st;
|
||||
|
||||
struct _vcs_dpi_voltage_scaling_st {
|
||||
int state;
|
||||
@@ -72,89 +72,107 @@ struct _vcs_dpi_voltage_scaling_st {
|
||||
double dppclk_mhz;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_soc_bounding_box_st {
|
||||
double sr_exit_time_us;
|
||||
double sr_enter_plus_exit_time_us;
|
||||
double urgent_latency_us;
|
||||
double writeback_latency_us;
|
||||
double ideal_dram_bw_after_urgent_percent;
|
||||
unsigned int max_request_size_bytes;
|
||||
double downspread_percent;
|
||||
double dram_page_open_time_ns;
|
||||
double dram_rw_turnaround_time_ns;
|
||||
double dram_return_buffer_per_channel_bytes;
|
||||
double dram_channel_width_bytes;
|
||||
struct _vcs_dpi_soc_bounding_box_st {
|
||||
double sr_exit_time_us;
|
||||
double sr_enter_plus_exit_time_us;
|
||||
double urgent_latency_us;
|
||||
double urgent_latency_pixel_data_only_us;
|
||||
double urgent_latency_pixel_mixed_with_vm_data_us;
|
||||
double urgent_latency_vm_data_only_us;
|
||||
double writeback_latency_us;
|
||||
double ideal_dram_bw_after_urgent_percent;
|
||||
double pct_ideal_dram_sdp_bw_after_urgent_pixel_only; // PercentOfIdealDRAMFabricAndSDPPortBWReceivedAfterUrgLatencyPixelDataOnly
|
||||
double pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm;
|
||||
double pct_ideal_dram_sdp_bw_after_urgent_vm_only;
|
||||
double max_avg_sdp_bw_use_normal_percent;
|
||||
double max_avg_dram_bw_use_normal_percent;
|
||||
unsigned int max_request_size_bytes;
|
||||
double downspread_percent;
|
||||
double dram_page_open_time_ns;
|
||||
double dram_rw_turnaround_time_ns;
|
||||
double dram_return_buffer_per_channel_bytes;
|
||||
double dram_channel_width_bytes;
|
||||
double fabric_datapath_to_dcn_data_return_bytes;
|
||||
double dcn_downspread_percent;
|
||||
double dispclk_dppclk_vco_speed_mhz;
|
||||
double dfs_vco_period_ps;
|
||||
unsigned int round_trip_ping_latency_dcfclk_cycles;
|
||||
unsigned int urgent_out_of_order_return_per_channel_bytes;
|
||||
unsigned int channel_interleave_bytes;
|
||||
unsigned int num_banks;
|
||||
unsigned int num_chans;
|
||||
unsigned int vmm_page_size_bytes;
|
||||
double dram_clock_change_latency_us;
|
||||
double writeback_dram_clock_change_latency_us;
|
||||
unsigned int return_bus_width_bytes;
|
||||
unsigned int voltage_override;
|
||||
double xfc_bus_transport_time_us;
|
||||
double xfc_xbuf_latency_tolerance_us;
|
||||
unsigned int urgent_out_of_order_return_per_channel_pixel_only_bytes;
|
||||
unsigned int urgent_out_of_order_return_per_channel_pixel_and_vm_bytes;
|
||||
unsigned int urgent_out_of_order_return_per_channel_vm_only_bytes;
|
||||
unsigned int round_trip_ping_latency_dcfclk_cycles;
|
||||
unsigned int urgent_out_of_order_return_per_channel_bytes;
|
||||
unsigned int channel_interleave_bytes;
|
||||
unsigned int num_banks;
|
||||
unsigned int num_chans;
|
||||
unsigned int vmm_page_size_bytes;
|
||||
double dram_clock_change_latency_us;
|
||||
double writeback_dram_clock_change_latency_us;
|
||||
unsigned int return_bus_width_bytes;
|
||||
unsigned int voltage_override;
|
||||
double xfc_bus_transport_time_us;
|
||||
double xfc_xbuf_latency_tolerance_us;
|
||||
int use_urgent_burst_bw;
|
||||
struct _vcs_dpi_voltage_scaling_st clock_limits[7];
|
||||
};
|
||||
|
||||
struct _vcs_dpi_ip_params_st {
|
||||
unsigned int max_inter_dcn_tile_repeaters;
|
||||
unsigned int num_dsc;
|
||||
unsigned int odm_capable;
|
||||
unsigned int rob_buffer_size_kbytes;
|
||||
unsigned int det_buffer_size_kbytes;
|
||||
unsigned int dpte_buffer_size_in_pte_reqs;
|
||||
unsigned int pde_proc_buffer_size_64k_reqs;
|
||||
unsigned int dpp_output_buffer_pixels;
|
||||
unsigned int opp_output_buffer_lines;
|
||||
unsigned int pixel_chunk_size_kbytes;
|
||||
unsigned char pte_enable;
|
||||
unsigned int pte_chunk_size_kbytes;
|
||||
unsigned int meta_chunk_size_kbytes;
|
||||
unsigned int writeback_chunk_size_kbytes;
|
||||
unsigned int line_buffer_size_bits;
|
||||
unsigned int max_line_buffer_lines;
|
||||
unsigned int writeback_luma_buffer_size_kbytes;
|
||||
unsigned int writeback_chroma_buffer_size_kbytes;
|
||||
unsigned int writeback_chroma_line_buffer_width_pixels;
|
||||
unsigned int max_page_table_levels;
|
||||
unsigned int max_num_dpp;
|
||||
unsigned int max_num_otg;
|
||||
unsigned int cursor_chunk_size;
|
||||
unsigned int cursor_buffer_size;
|
||||
unsigned int max_num_wb;
|
||||
unsigned int max_dchub_pscl_bw_pix_per_clk;
|
||||
unsigned int max_pscl_lb_bw_pix_per_clk;
|
||||
unsigned int max_lb_vscl_bw_pix_per_clk;
|
||||
unsigned int max_vscl_hscl_bw_pix_per_clk;
|
||||
double max_hscl_ratio;
|
||||
double max_vscl_ratio;
|
||||
unsigned int hscl_mults;
|
||||
unsigned int vscl_mults;
|
||||
unsigned int max_hscl_taps;
|
||||
unsigned int max_vscl_taps;
|
||||
unsigned int xfc_supported;
|
||||
unsigned int xfc_fill_constant_bytes;
|
||||
double dispclk_ramp_margin_percent;
|
||||
double xfc_fill_bw_overhead_percent;
|
||||
double underscan_factor;
|
||||
unsigned int min_vblank_lines;
|
||||
unsigned int dppclk_delay_subtotal;
|
||||
unsigned int dispclk_delay_subtotal;
|
||||
unsigned int dcfclk_cstate_latency;
|
||||
unsigned int dppclk_delay_scl;
|
||||
unsigned int dppclk_delay_scl_lb_only;
|
||||
unsigned int dppclk_delay_cnvc_formatter;
|
||||
unsigned int dppclk_delay_cnvc_cursor;
|
||||
unsigned int is_line_buffer_bpp_fixed;
|
||||
unsigned int line_buffer_fixed_bpp;
|
||||
unsigned int dcc_supported;
|
||||
struct _vcs_dpi_ip_params_st {
|
||||
bool gpuvm_enable;
|
||||
bool hostvm_enable;
|
||||
unsigned int gpuvm_max_page_table_levels;
|
||||
unsigned int hostvm_max_page_table_levels;
|
||||
unsigned int hostvm_cached_page_table_levels;
|
||||
unsigned int pte_group_size_bytes;
|
||||
unsigned int max_inter_dcn_tile_repeaters;
|
||||
unsigned int num_dsc;
|
||||
unsigned int odm_capable;
|
||||
unsigned int rob_buffer_size_kbytes;
|
||||
unsigned int det_buffer_size_kbytes;
|
||||
unsigned int dpte_buffer_size_in_pte_reqs;
|
||||
unsigned int pde_proc_buffer_size_64k_reqs;
|
||||
unsigned int dpp_output_buffer_pixels;
|
||||
unsigned int opp_output_buffer_lines;
|
||||
unsigned int pixel_chunk_size_kbytes;
|
||||
unsigned char pte_enable;
|
||||
unsigned int pte_chunk_size_kbytes;
|
||||
unsigned int meta_chunk_size_kbytes;
|
||||
unsigned int writeback_chunk_size_kbytes;
|
||||
unsigned int line_buffer_size_bits;
|
||||
unsigned int max_line_buffer_lines;
|
||||
unsigned int writeback_luma_buffer_size_kbytes;
|
||||
unsigned int writeback_chroma_buffer_size_kbytes;
|
||||
unsigned int writeback_chroma_line_buffer_width_pixels;
|
||||
unsigned int max_page_table_levels;
|
||||
unsigned int max_num_dpp;
|
||||
unsigned int max_num_otg;
|
||||
unsigned int cursor_chunk_size;
|
||||
unsigned int cursor_buffer_size;
|
||||
unsigned int max_num_wb;
|
||||
unsigned int max_dchub_pscl_bw_pix_per_clk;
|
||||
unsigned int max_pscl_lb_bw_pix_per_clk;
|
||||
unsigned int max_lb_vscl_bw_pix_per_clk;
|
||||
unsigned int max_vscl_hscl_bw_pix_per_clk;
|
||||
double max_hscl_ratio;
|
||||
double max_vscl_ratio;
|
||||
unsigned int hscl_mults;
|
||||
unsigned int vscl_mults;
|
||||
unsigned int max_hscl_taps;
|
||||
unsigned int max_vscl_taps;
|
||||
unsigned int xfc_supported;
|
||||
unsigned int xfc_fill_constant_bytes;
|
||||
double dispclk_ramp_margin_percent;
|
||||
double xfc_fill_bw_overhead_percent;
|
||||
double underscan_factor;
|
||||
unsigned int min_vblank_lines;
|
||||
unsigned int dppclk_delay_subtotal;
|
||||
unsigned int dispclk_delay_subtotal;
|
||||
unsigned int dcfclk_cstate_latency;
|
||||
unsigned int dppclk_delay_scl;
|
||||
unsigned int dppclk_delay_scl_lb_only;
|
||||
unsigned int dppclk_delay_cnvc_formatter;
|
||||
unsigned int dppclk_delay_cnvc_cursor;
|
||||
unsigned int is_line_buffer_bpp_fixed;
|
||||
unsigned int line_buffer_fixed_bpp;
|
||||
unsigned int dcc_supported;
|
||||
|
||||
unsigned int IsLineBufferBppFixed;
|
||||
unsigned int LineBufferFixedBpp;
|
||||
@@ -169,41 +187,45 @@ struct _vcs_dpi_display_xfc_params_st {
|
||||
int xfc_slv_chunk_size_bytes;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_pipe_source_params_st {
|
||||
int source_format;
|
||||
unsigned char dcc;
|
||||
unsigned int dcc_override;
|
||||
unsigned int dcc_rate;
|
||||
unsigned char dcc_use_global;
|
||||
unsigned char vm;
|
||||
unsigned char vm_levels_force_en;
|
||||
unsigned int vm_levels_force;
|
||||
int source_scan;
|
||||
int sw_mode;
|
||||
int macro_tile_size;
|
||||
unsigned char is_display_sw;
|
||||
unsigned int viewport_width;
|
||||
unsigned int viewport_height;
|
||||
unsigned int viewport_y_y;
|
||||
unsigned int viewport_y_c;
|
||||
unsigned int viewport_width_c;
|
||||
unsigned int viewport_height_c;
|
||||
unsigned int data_pitch;
|
||||
unsigned int data_pitch_c;
|
||||
unsigned int meta_pitch;
|
||||
unsigned int meta_pitch_c;
|
||||
unsigned int cur0_src_width;
|
||||
int cur0_bpp;
|
||||
unsigned int cur1_src_width;
|
||||
int cur1_bpp;
|
||||
int num_cursors;
|
||||
unsigned char is_hsplit;
|
||||
unsigned char dynamic_metadata_enable;
|
||||
unsigned int dynamic_metadata_lines_before_active;
|
||||
unsigned int dynamic_metadata_xmit_bytes;
|
||||
unsigned int hsplit_grp;
|
||||
unsigned char xfc_enable;
|
||||
unsigned char xfc_slave;
|
||||
struct _vcs_dpi_display_pipe_source_params_st {
|
||||
int source_format;
|
||||
unsigned char dcc;
|
||||
unsigned int dcc_override;
|
||||
unsigned int dcc_rate;
|
||||
unsigned char dcc_use_global;
|
||||
unsigned char vm;
|
||||
bool gpuvm; // gpuvm enabled
|
||||
bool hostvm; // hostvm enabled
|
||||
bool gpuvm_levels_force_en;
|
||||
unsigned int gpuvm_levels_force;
|
||||
bool hostvm_levels_force_en;
|
||||
unsigned int hostvm_levels_force;
|
||||
int source_scan;
|
||||
int sw_mode;
|
||||
int macro_tile_size;
|
||||
unsigned char is_display_sw;
|
||||
unsigned int viewport_width;
|
||||
unsigned int viewport_height;
|
||||
unsigned int viewport_y_y;
|
||||
unsigned int viewport_y_c;
|
||||
unsigned int viewport_width_c;
|
||||
unsigned int viewport_height_c;
|
||||
unsigned int data_pitch;
|
||||
unsigned int data_pitch_c;
|
||||
unsigned int meta_pitch;
|
||||
unsigned int meta_pitch_c;
|
||||
unsigned int cur0_src_width;
|
||||
int cur0_bpp;
|
||||
unsigned int cur1_src_width;
|
||||
int cur1_bpp;
|
||||
int num_cursors;
|
||||
unsigned char is_hsplit;
|
||||
unsigned char dynamic_metadata_enable;
|
||||
unsigned int dynamic_metadata_lines_before_active;
|
||||
unsigned int dynamic_metadata_xmit_bytes;
|
||||
unsigned int hsplit_grp;
|
||||
unsigned char xfc_enable;
|
||||
unsigned char xfc_slave;
|
||||
struct _vcs_dpi_display_xfc_params_st xfc_params;
|
||||
};
|
||||
struct writeback_st {
|
||||
@@ -219,335 +241,335 @@ struct writeback_st {
|
||||
double wb_vratio;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_output_params_st {
|
||||
int dp_lanes;
|
||||
int output_bpp;
|
||||
int dsc_enable;
|
||||
int wb_enable;
|
||||
int num_active_wb;
|
||||
int opp_input_bpc;
|
||||
int output_type;
|
||||
int output_format;
|
||||
int output_standard;
|
||||
int dsc_slices;
|
||||
struct _vcs_dpi_display_output_params_st {
|
||||
int dp_lanes;
|
||||
int output_bpp;
|
||||
int dsc_enable;
|
||||
int wb_enable;
|
||||
int num_active_wb;
|
||||
int output_bpc;
|
||||
int output_type;
|
||||
int output_format;
|
||||
int output_standard;
|
||||
int dsc_slices;
|
||||
struct writeback_st wb;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_bandwidth_st {
|
||||
double total_bw_consumed_gbps;
|
||||
double guaranteed_urgent_return_bw_gbps;
|
||||
struct _vcs_dpi_display_bandwidth_st {
|
||||
double total_bw_consumed_gbps;
|
||||
double guaranteed_urgent_return_bw_gbps;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_scaler_ratio_depth_st {
|
||||
double hscl_ratio;
|
||||
double vscl_ratio;
|
||||
double hscl_ratio_c;
|
||||
double vscl_ratio_c;
|
||||
double vinit;
|
||||
double vinit_c;
|
||||
double vinit_bot;
|
||||
double vinit_bot_c;
|
||||
int lb_depth;
|
||||
int scl_enable;
|
||||
struct _vcs_dpi_scaler_ratio_depth_st {
|
||||
double hscl_ratio;
|
||||
double vscl_ratio;
|
||||
double hscl_ratio_c;
|
||||
double vscl_ratio_c;
|
||||
double vinit;
|
||||
double vinit_c;
|
||||
double vinit_bot;
|
||||
double vinit_bot_c;
|
||||
int lb_depth;
|
||||
int scl_enable;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_scaler_taps_st {
|
||||
unsigned int htaps;
|
||||
unsigned int vtaps;
|
||||
unsigned int htaps_c;
|
||||
unsigned int vtaps_c;
|
||||
struct _vcs_dpi_scaler_taps_st {
|
||||
unsigned int htaps;
|
||||
unsigned int vtaps;
|
||||
unsigned int htaps_c;
|
||||
unsigned int vtaps_c;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_pipe_dest_params_st {
|
||||
unsigned int recout_width;
|
||||
unsigned int recout_height;
|
||||
unsigned int full_recout_width;
|
||||
unsigned int full_recout_height;
|
||||
unsigned int hblank_start;
|
||||
unsigned int hblank_end;
|
||||
unsigned int vblank_start;
|
||||
unsigned int vblank_end;
|
||||
unsigned int htotal;
|
||||
unsigned int vtotal;
|
||||
unsigned int vactive;
|
||||
unsigned int hactive;
|
||||
unsigned int vstartup_start;
|
||||
unsigned int vupdate_offset;
|
||||
unsigned int vupdate_width;
|
||||
unsigned int vready_offset;
|
||||
unsigned char interlaced;
|
||||
unsigned char underscan;
|
||||
double pixel_rate_mhz;
|
||||
unsigned char synchronized_vblank_all_planes;
|
||||
unsigned char otg_inst;
|
||||
unsigned char odm_split_cnt;
|
||||
unsigned char odm_combine;
|
||||
struct _vcs_dpi_display_pipe_dest_params_st {
|
||||
unsigned int recout_width;
|
||||
unsigned int recout_height;
|
||||
unsigned int full_recout_width;
|
||||
unsigned int full_recout_height;
|
||||
unsigned int hblank_start;
|
||||
unsigned int hblank_end;
|
||||
unsigned int vblank_start;
|
||||
unsigned int vblank_end;
|
||||
unsigned int htotal;
|
||||
unsigned int vtotal;
|
||||
unsigned int vactive;
|
||||
unsigned int hactive;
|
||||
unsigned int vstartup_start;
|
||||
unsigned int vupdate_offset;
|
||||
unsigned int vupdate_width;
|
||||
unsigned int vready_offset;
|
||||
unsigned char interlaced;
|
||||
unsigned char underscan;
|
||||
double pixel_rate_mhz;
|
||||
unsigned char synchronized_vblank_all_planes;
|
||||
unsigned char otg_inst;
|
||||
unsigned char odm_split_cnt;
|
||||
unsigned char odm_combine;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_pipe_params_st {
|
||||
display_pipe_source_params_st src;
|
||||
display_pipe_dest_params_st dest;
|
||||
scaler_ratio_depth_st scale_ratio_depth;
|
||||
scaler_taps_st scale_taps;
|
||||
struct _vcs_dpi_display_pipe_params_st {
|
||||
display_pipe_source_params_st src;
|
||||
display_pipe_dest_params_st dest;
|
||||
scaler_ratio_depth_st scale_ratio_depth;
|
||||
scaler_taps_st scale_taps;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_clocks_and_cfg_st {
|
||||
int voltage;
|
||||
double dppclk_mhz;
|
||||
double refclk_mhz;
|
||||
double dispclk_mhz;
|
||||
double dcfclk_mhz;
|
||||
double socclk_mhz;
|
||||
struct _vcs_dpi_display_clocks_and_cfg_st {
|
||||
int voltage;
|
||||
double dppclk_mhz;
|
||||
double refclk_mhz;
|
||||
double dispclk_mhz;
|
||||
double dcfclk_mhz;
|
||||
double socclk_mhz;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_e2e_pipe_params_st {
|
||||
display_pipe_params_st pipe;
|
||||
display_output_params_st dout;
|
||||
display_clocks_and_cfg_st clks_cfg;
|
||||
struct _vcs_dpi_display_e2e_pipe_params_st {
|
||||
display_pipe_params_st pipe;
|
||||
display_output_params_st dout;
|
||||
display_clocks_and_cfg_st clks_cfg;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_dchub_buffer_sizing_st {
|
||||
unsigned int swath_width_y;
|
||||
unsigned int swath_height_y;
|
||||
unsigned int swath_height_c;
|
||||
unsigned int detail_buffer_size_y;
|
||||
struct _vcs_dpi_dchub_buffer_sizing_st {
|
||||
unsigned int swath_width_y;
|
||||
unsigned int swath_height_y;
|
||||
unsigned int swath_height_c;
|
||||
unsigned int detail_buffer_size_y;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_watermarks_perf_st {
|
||||
double stutter_eff_in_active_region_percent;
|
||||
double urgent_latency_supported_us;
|
||||
double non_urgent_latency_supported_us;
|
||||
double dram_clock_change_margin_us;
|
||||
double dram_access_eff_percent;
|
||||
struct _vcs_dpi_watermarks_perf_st {
|
||||
double stutter_eff_in_active_region_percent;
|
||||
double urgent_latency_supported_us;
|
||||
double non_urgent_latency_supported_us;
|
||||
double dram_clock_change_margin_us;
|
||||
double dram_access_eff_percent;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_cstate_pstate_watermarks_st {
|
||||
double cstate_exit_us;
|
||||
double cstate_enter_plus_exit_us;
|
||||
double pstate_change_us;
|
||||
struct _vcs_dpi_cstate_pstate_watermarks_st {
|
||||
double cstate_exit_us;
|
||||
double cstate_enter_plus_exit_us;
|
||||
double pstate_change_us;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_wm_calc_pipe_params_st {
|
||||
unsigned int num_dpp;
|
||||
int voltage;
|
||||
int output_type;
|
||||
double dcfclk_mhz;
|
||||
double socclk_mhz;
|
||||
double dppclk_mhz;
|
||||
double pixclk_mhz;
|
||||
unsigned char interlace_en;
|
||||
unsigned char pte_enable;
|
||||
unsigned char dcc_enable;
|
||||
double dcc_rate;
|
||||
double bytes_per_pixel_c;
|
||||
double bytes_per_pixel_y;
|
||||
unsigned int swath_width_y;
|
||||
unsigned int swath_height_y;
|
||||
unsigned int swath_height_c;
|
||||
unsigned int det_buffer_size_y;
|
||||
double h_ratio;
|
||||
double v_ratio;
|
||||
unsigned int h_taps;
|
||||
unsigned int h_total;
|
||||
unsigned int v_total;
|
||||
unsigned int v_active;
|
||||
unsigned int e2e_index;
|
||||
double display_pipe_line_delivery_time;
|
||||
double read_bw;
|
||||
unsigned int lines_in_det_y;
|
||||
unsigned int lines_in_det_y_rounded_down_to_swath;
|
||||
double full_det_buffering_time;
|
||||
double dcfclk_deepsleep_mhz_per_plane;
|
||||
struct _vcs_dpi_wm_calc_pipe_params_st {
|
||||
unsigned int num_dpp;
|
||||
int voltage;
|
||||
int output_type;
|
||||
double dcfclk_mhz;
|
||||
double socclk_mhz;
|
||||
double dppclk_mhz;
|
||||
double pixclk_mhz;
|
||||
unsigned char interlace_en;
|
||||
unsigned char pte_enable;
|
||||
unsigned char dcc_enable;
|
||||
double dcc_rate;
|
||||
double bytes_per_pixel_c;
|
||||
double bytes_per_pixel_y;
|
||||
unsigned int swath_width_y;
|
||||
unsigned int swath_height_y;
|
||||
unsigned int swath_height_c;
|
||||
unsigned int det_buffer_size_y;
|
||||
double h_ratio;
|
||||
double v_ratio;
|
||||
unsigned int h_taps;
|
||||
unsigned int h_total;
|
||||
unsigned int v_total;
|
||||
unsigned int v_active;
|
||||
unsigned int e2e_index;
|
||||
double display_pipe_line_delivery_time;
|
||||
double read_bw;
|
||||
unsigned int lines_in_det_y;
|
||||
unsigned int lines_in_det_y_rounded_down_to_swath;
|
||||
double full_det_buffering_time;
|
||||
double dcfclk_deepsleep_mhz_per_plane;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_vratio_pre_st {
|
||||
double vratio_pre_l;
|
||||
double vratio_pre_c;
|
||||
struct _vcs_dpi_vratio_pre_st {
|
||||
double vratio_pre_l;
|
||||
double vratio_pre_c;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_data_rq_misc_params_st {
|
||||
unsigned int full_swath_bytes;
|
||||
unsigned int stored_swath_bytes;
|
||||
unsigned int blk256_height;
|
||||
unsigned int blk256_width;
|
||||
unsigned int req_height;
|
||||
unsigned int req_width;
|
||||
struct _vcs_dpi_display_data_rq_misc_params_st {
|
||||
unsigned int full_swath_bytes;
|
||||
unsigned int stored_swath_bytes;
|
||||
unsigned int blk256_height;
|
||||
unsigned int blk256_width;
|
||||
unsigned int req_height;
|
||||
unsigned int req_width;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_data_rq_sizing_params_st {
|
||||
unsigned int chunk_bytes;
|
||||
unsigned int min_chunk_bytes;
|
||||
unsigned int meta_chunk_bytes;
|
||||
unsigned int min_meta_chunk_bytes;
|
||||
unsigned int mpte_group_bytes;
|
||||
unsigned int dpte_group_bytes;
|
||||
struct _vcs_dpi_display_data_rq_sizing_params_st {
|
||||
unsigned int chunk_bytes;
|
||||
unsigned int min_chunk_bytes;
|
||||
unsigned int meta_chunk_bytes;
|
||||
unsigned int min_meta_chunk_bytes;
|
||||
unsigned int mpte_group_bytes;
|
||||
unsigned int dpte_group_bytes;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_data_rq_dlg_params_st {
|
||||
unsigned int swath_width_ub;
|
||||
unsigned int swath_height;
|
||||
unsigned int req_per_swath_ub;
|
||||
unsigned int meta_pte_bytes_per_frame_ub;
|
||||
unsigned int dpte_req_per_row_ub;
|
||||
unsigned int dpte_groups_per_row_ub;
|
||||
unsigned int dpte_row_height;
|
||||
unsigned int dpte_bytes_per_row_ub;
|
||||
unsigned int meta_chunks_per_row_ub;
|
||||
unsigned int meta_req_per_row_ub;
|
||||
unsigned int meta_row_height;
|
||||
unsigned int meta_bytes_per_row_ub;
|
||||
struct _vcs_dpi_display_data_rq_dlg_params_st {
|
||||
unsigned int swath_width_ub;
|
||||
unsigned int swath_height;
|
||||
unsigned int req_per_swath_ub;
|
||||
unsigned int meta_pte_bytes_per_frame_ub;
|
||||
unsigned int dpte_req_per_row_ub;
|
||||
unsigned int dpte_groups_per_row_ub;
|
||||
unsigned int dpte_row_height;
|
||||
unsigned int dpte_bytes_per_row_ub;
|
||||
unsigned int meta_chunks_per_row_ub;
|
||||
unsigned int meta_req_per_row_ub;
|
||||
unsigned int meta_row_height;
|
||||
unsigned int meta_bytes_per_row_ub;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_cur_rq_dlg_params_st {
|
||||
unsigned char enable;
|
||||
unsigned int swath_height;
|
||||
unsigned int req_per_line;
|
||||
struct _vcs_dpi_display_cur_rq_dlg_params_st {
|
||||
unsigned char enable;
|
||||
unsigned int swath_height;
|
||||
unsigned int req_per_line;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_rq_dlg_params_st {
|
||||
display_data_rq_dlg_params_st rq_l;
|
||||
display_data_rq_dlg_params_st rq_c;
|
||||
display_cur_rq_dlg_params_st rq_cur0;
|
||||
struct _vcs_dpi_display_rq_dlg_params_st {
|
||||
display_data_rq_dlg_params_st rq_l;
|
||||
display_data_rq_dlg_params_st rq_c;
|
||||
display_cur_rq_dlg_params_st rq_cur0;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_rq_sizing_params_st {
|
||||
display_data_rq_sizing_params_st rq_l;
|
||||
display_data_rq_sizing_params_st rq_c;
|
||||
struct _vcs_dpi_display_rq_sizing_params_st {
|
||||
display_data_rq_sizing_params_st rq_l;
|
||||
display_data_rq_sizing_params_st rq_c;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_rq_misc_params_st {
|
||||
display_data_rq_misc_params_st rq_l;
|
||||
display_data_rq_misc_params_st rq_c;
|
||||
struct _vcs_dpi_display_rq_misc_params_st {
|
||||
display_data_rq_misc_params_st rq_l;
|
||||
display_data_rq_misc_params_st rq_c;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_rq_params_st {
|
||||
unsigned char yuv420;
|
||||
unsigned char yuv420_10bpc;
|
||||
display_rq_misc_params_st misc;
|
||||
display_rq_sizing_params_st sizing;
|
||||
display_rq_dlg_params_st dlg;
|
||||
struct _vcs_dpi_display_rq_params_st {
|
||||
unsigned char yuv420;
|
||||
unsigned char yuv420_10bpc;
|
||||
display_rq_misc_params_st misc;
|
||||
display_rq_sizing_params_st sizing;
|
||||
display_rq_dlg_params_st dlg;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_dlg_regs_st {
|
||||
unsigned int refcyc_h_blank_end;
|
||||
unsigned int dlg_vblank_end;
|
||||
unsigned int min_dst_y_next_start;
|
||||
unsigned int refcyc_per_htotal;
|
||||
unsigned int refcyc_x_after_scaler;
|
||||
unsigned int dst_y_after_scaler;
|
||||
unsigned int dst_y_prefetch;
|
||||
unsigned int dst_y_per_vm_vblank;
|
||||
unsigned int dst_y_per_row_vblank;
|
||||
unsigned int dst_y_per_vm_flip;
|
||||
unsigned int dst_y_per_row_flip;
|
||||
unsigned int ref_freq_to_pix_freq;
|
||||
unsigned int vratio_prefetch;
|
||||
unsigned int vratio_prefetch_c;
|
||||
unsigned int refcyc_per_pte_group_vblank_l;
|
||||
unsigned int refcyc_per_pte_group_vblank_c;
|
||||
unsigned int refcyc_per_meta_chunk_vblank_l;
|
||||
unsigned int refcyc_per_meta_chunk_vblank_c;
|
||||
unsigned int refcyc_per_pte_group_flip_l;
|
||||
unsigned int refcyc_per_pte_group_flip_c;
|
||||
unsigned int refcyc_per_meta_chunk_flip_l;
|
||||
unsigned int refcyc_per_meta_chunk_flip_c;
|
||||
unsigned int dst_y_per_pte_row_nom_l;
|
||||
unsigned int dst_y_per_pte_row_nom_c;
|
||||
unsigned int refcyc_per_pte_group_nom_l;
|
||||
unsigned int refcyc_per_pte_group_nom_c;
|
||||
unsigned int dst_y_per_meta_row_nom_l;
|
||||
unsigned int dst_y_per_meta_row_nom_c;
|
||||
unsigned int refcyc_per_meta_chunk_nom_l;
|
||||
unsigned int refcyc_per_meta_chunk_nom_c;
|
||||
unsigned int refcyc_per_line_delivery_pre_l;
|
||||
unsigned int refcyc_per_line_delivery_pre_c;
|
||||
unsigned int refcyc_per_line_delivery_l;
|
||||
unsigned int refcyc_per_line_delivery_c;
|
||||
unsigned int chunk_hdl_adjust_cur0;
|
||||
unsigned int chunk_hdl_adjust_cur1;
|
||||
unsigned int vready_after_vcount0;
|
||||
unsigned int dst_y_offset_cur0;
|
||||
unsigned int dst_y_offset_cur1;
|
||||
unsigned int xfc_reg_transfer_delay;
|
||||
unsigned int xfc_reg_precharge_delay;
|
||||
unsigned int xfc_reg_remote_surface_flip_latency;
|
||||
unsigned int xfc_reg_prefetch_margin;
|
||||
unsigned int dst_y_delta_drq_limit;
|
||||
struct _vcs_dpi_display_dlg_regs_st {
|
||||
unsigned int refcyc_h_blank_end;
|
||||
unsigned int dlg_vblank_end;
|
||||
unsigned int min_dst_y_next_start;
|
||||
unsigned int refcyc_per_htotal;
|
||||
unsigned int refcyc_x_after_scaler;
|
||||
unsigned int dst_y_after_scaler;
|
||||
unsigned int dst_y_prefetch;
|
||||
unsigned int dst_y_per_vm_vblank;
|
||||
unsigned int dst_y_per_row_vblank;
|
||||
unsigned int dst_y_per_vm_flip;
|
||||
unsigned int dst_y_per_row_flip;
|
||||
unsigned int ref_freq_to_pix_freq;
|
||||
unsigned int vratio_prefetch;
|
||||
unsigned int vratio_prefetch_c;
|
||||
unsigned int refcyc_per_pte_group_vblank_l;
|
||||
unsigned int refcyc_per_pte_group_vblank_c;
|
||||
unsigned int refcyc_per_meta_chunk_vblank_l;
|
||||
unsigned int refcyc_per_meta_chunk_vblank_c;
|
||||
unsigned int refcyc_per_pte_group_flip_l;
|
||||
unsigned int refcyc_per_pte_group_flip_c;
|
||||
unsigned int refcyc_per_meta_chunk_flip_l;
|
||||
unsigned int refcyc_per_meta_chunk_flip_c;
|
||||
unsigned int dst_y_per_pte_row_nom_l;
|
||||
unsigned int dst_y_per_pte_row_nom_c;
|
||||
unsigned int refcyc_per_pte_group_nom_l;
|
||||
unsigned int refcyc_per_pte_group_nom_c;
|
||||
unsigned int dst_y_per_meta_row_nom_l;
|
||||
unsigned int dst_y_per_meta_row_nom_c;
|
||||
unsigned int refcyc_per_meta_chunk_nom_l;
|
||||
unsigned int refcyc_per_meta_chunk_nom_c;
|
||||
unsigned int refcyc_per_line_delivery_pre_l;
|
||||
unsigned int refcyc_per_line_delivery_pre_c;
|
||||
unsigned int refcyc_per_line_delivery_l;
|
||||
unsigned int refcyc_per_line_delivery_c;
|
||||
unsigned int chunk_hdl_adjust_cur0;
|
||||
unsigned int chunk_hdl_adjust_cur1;
|
||||
unsigned int vready_after_vcount0;
|
||||
unsigned int dst_y_offset_cur0;
|
||||
unsigned int dst_y_offset_cur1;
|
||||
unsigned int xfc_reg_transfer_delay;
|
||||
unsigned int xfc_reg_precharge_delay;
|
||||
unsigned int xfc_reg_remote_surface_flip_latency;
|
||||
unsigned int xfc_reg_prefetch_margin;
|
||||
unsigned int dst_y_delta_drq_limit;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_ttu_regs_st {
|
||||
unsigned int qos_level_low_wm;
|
||||
unsigned int qos_level_high_wm;
|
||||
unsigned int min_ttu_vblank;
|
||||
unsigned int qos_level_flip;
|
||||
unsigned int refcyc_per_req_delivery_l;
|
||||
unsigned int refcyc_per_req_delivery_c;
|
||||
unsigned int refcyc_per_req_delivery_cur0;
|
||||
unsigned int refcyc_per_req_delivery_cur1;
|
||||
unsigned int refcyc_per_req_delivery_pre_l;
|
||||
unsigned int refcyc_per_req_delivery_pre_c;
|
||||
unsigned int refcyc_per_req_delivery_pre_cur0;
|
||||
unsigned int refcyc_per_req_delivery_pre_cur1;
|
||||
unsigned int qos_level_fixed_l;
|
||||
unsigned int qos_level_fixed_c;
|
||||
unsigned int qos_level_fixed_cur0;
|
||||
unsigned int qos_level_fixed_cur1;
|
||||
unsigned int qos_ramp_disable_l;
|
||||
unsigned int qos_ramp_disable_c;
|
||||
unsigned int qos_ramp_disable_cur0;
|
||||
unsigned int qos_ramp_disable_cur1;
|
||||
struct _vcs_dpi_display_ttu_regs_st {
|
||||
unsigned int qos_level_low_wm;
|
||||
unsigned int qos_level_high_wm;
|
||||
unsigned int min_ttu_vblank;
|
||||
unsigned int qos_level_flip;
|
||||
unsigned int refcyc_per_req_delivery_l;
|
||||
unsigned int refcyc_per_req_delivery_c;
|
||||
unsigned int refcyc_per_req_delivery_cur0;
|
||||
unsigned int refcyc_per_req_delivery_cur1;
|
||||
unsigned int refcyc_per_req_delivery_pre_l;
|
||||
unsigned int refcyc_per_req_delivery_pre_c;
|
||||
unsigned int refcyc_per_req_delivery_pre_cur0;
|
||||
unsigned int refcyc_per_req_delivery_pre_cur1;
|
||||
unsigned int qos_level_fixed_l;
|
||||
unsigned int qos_level_fixed_c;
|
||||
unsigned int qos_level_fixed_cur0;
|
||||
unsigned int qos_level_fixed_cur1;
|
||||
unsigned int qos_ramp_disable_l;
|
||||
unsigned int qos_ramp_disable_c;
|
||||
unsigned int qos_ramp_disable_cur0;
|
||||
unsigned int qos_ramp_disable_cur1;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_data_rq_regs_st {
|
||||
unsigned int chunk_size;
|
||||
unsigned int min_chunk_size;
|
||||
unsigned int meta_chunk_size;
|
||||
unsigned int min_meta_chunk_size;
|
||||
unsigned int dpte_group_size;
|
||||
unsigned int mpte_group_size;
|
||||
unsigned int swath_height;
|
||||
unsigned int pte_row_height_linear;
|
||||
struct _vcs_dpi_display_data_rq_regs_st {
|
||||
unsigned int chunk_size;
|
||||
unsigned int min_chunk_size;
|
||||
unsigned int meta_chunk_size;
|
||||
unsigned int min_meta_chunk_size;
|
||||
unsigned int dpte_group_size;
|
||||
unsigned int mpte_group_size;
|
||||
unsigned int swath_height;
|
||||
unsigned int pte_row_height_linear;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_rq_regs_st {
|
||||
display_data_rq_regs_st rq_regs_l;
|
||||
display_data_rq_regs_st rq_regs_c;
|
||||
unsigned int drq_expansion_mode;
|
||||
unsigned int prq_expansion_mode;
|
||||
unsigned int mrq_expansion_mode;
|
||||
unsigned int crq_expansion_mode;
|
||||
unsigned int plane1_base_address;
|
||||
struct _vcs_dpi_display_rq_regs_st {
|
||||
display_data_rq_regs_st rq_regs_l;
|
||||
display_data_rq_regs_st rq_regs_c;
|
||||
unsigned int drq_expansion_mode;
|
||||
unsigned int prq_expansion_mode;
|
||||
unsigned int mrq_expansion_mode;
|
||||
unsigned int crq_expansion_mode;
|
||||
unsigned int plane1_base_address;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_dlg_sys_params_st {
|
||||
double t_mclk_wm_us;
|
||||
double t_urg_wm_us;
|
||||
double t_sr_wm_us;
|
||||
double t_extra_us;
|
||||
double mem_trip_us;
|
||||
double t_srx_delay_us;
|
||||
double deepsleep_dcfclk_mhz;
|
||||
double total_flip_bw;
|
||||
unsigned int total_flip_bytes;
|
||||
struct _vcs_dpi_display_dlg_sys_params_st {
|
||||
double t_mclk_wm_us;
|
||||
double t_urg_wm_us;
|
||||
double t_sr_wm_us;
|
||||
double t_extra_us;
|
||||
double mem_trip_us;
|
||||
double t_srx_delay_us;
|
||||
double deepsleep_dcfclk_mhz;
|
||||
double total_flip_bw;
|
||||
unsigned int total_flip_bytes;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_dlg_prefetch_param_st {
|
||||
double prefetch_bw;
|
||||
unsigned int flip_bytes;
|
||||
struct _vcs_dpi_display_dlg_prefetch_param_st {
|
||||
double prefetch_bw;
|
||||
unsigned int flip_bytes;
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_pipe_clock_st {
|
||||
double dcfclk_mhz;
|
||||
double dispclk_mhz;
|
||||
double socclk_mhz;
|
||||
double dscclk_mhz[6];
|
||||
double dppclk_mhz[6];
|
||||
struct _vcs_dpi_display_pipe_clock_st {
|
||||
double dcfclk_mhz;
|
||||
double dispclk_mhz;
|
||||
double socclk_mhz;
|
||||
double dscclk_mhz[6];
|
||||
double dppclk_mhz[6];
|
||||
};
|
||||
|
||||
struct _vcs_dpi_display_arb_params_st {
|
||||
int max_req_outstanding;
|
||||
int min_req_outstanding;
|
||||
int sat_level_us;
|
||||
struct _vcs_dpi_display_arb_params_st {
|
||||
int max_req_outstanding;
|
||||
int min_req_outstanding;
|
||||
int sat_level_us;
|
||||
};
|
||||
|
||||
#endif /*__DISPLAY_MODE_STRUCTS_H__*/
|
||||
|
@@ -35,6 +35,16 @@ static inline double dml_min(double a, double b)
|
||||
return (double) dcn_bw_min2(a, b);
|
||||
}
|
||||
|
||||
static inline double dml_min3(double a, double b, double c)
|
||||
{
|
||||
return dml_min(dml_min(a, b), c);
|
||||
}
|
||||
|
||||
static inline double dml_min4(double a, double b, double c, double d)
|
||||
{
|
||||
return dml_min(dml_min(a, b), dml_min(c, d));
|
||||
}
|
||||
|
||||
static inline double dml_max(double a, double b)
|
||||
{
|
||||
return (double) dcn_bw_max2(a, b);
|
||||
|
@@ -75,9 +75,7 @@ bool dal_hw_factory_init(
|
||||
return true;
|
||||
case DCE_VERSION_11_0:
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
dal_hw_factory_dce110_init(factory);
|
||||
return true;
|
||||
case DCE_VERSION_12_0:
|
||||
|
@@ -72,9 +72,7 @@ bool dal_hw_translate_init(
|
||||
case DCE_VERSION_10_0:
|
||||
case DCE_VERSION_11_0:
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
dal_hw_translate_dce110_init(translate);
|
||||
return true;
|
||||
case DCE_VERSION_12_0:
|
||||
|
@@ -83,9 +83,7 @@ struct i2caux *dal_i2caux_create(
|
||||
case DCE_VERSION_8_3:
|
||||
return dal_i2caux_dce80_create(ctx);
|
||||
case DCE_VERSION_11_2:
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
case DCE_VERSION_11_22:
|
||||
#endif
|
||||
return dal_i2caux_dce112_create(ctx);
|
||||
case DCE_VERSION_11_0:
|
||||
return dal_i2caux_dce110_create(ctx);
|
||||
|
@@ -43,9 +43,7 @@ enum bw_calcs_version {
|
||||
BW_CALCS_VERSION_POLARIS10,
|
||||
BW_CALCS_VERSION_POLARIS11,
|
||||
BW_CALCS_VERSION_POLARIS12,
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
BW_CALCS_VERSION_VEGAM,
|
||||
#endif
|
||||
BW_CALCS_VERSION_STONEY,
|
||||
BW_CALCS_VERSION_VEGA10
|
||||
};
|
||||
|
@@ -121,6 +121,8 @@ struct hubp_funcs {
|
||||
void (*hubp_clk_cntl)(struct hubp *hubp, bool enable);
|
||||
void (*hubp_vtg_sel)(struct hubp *hubp, uint32_t otg_inst);
|
||||
void (*hubp_read_state)(struct hubp *hubp);
|
||||
void (*hubp_disable_control)(struct hubp *hubp, bool disable_hubp);
|
||||
unsigned int (*hubp_get_underflow_status)(struct hubp *hubp);
|
||||
|
||||
};
|
||||
|
||||
|
@@ -83,11 +83,6 @@ struct hw_sequencer_funcs {
|
||||
int num_planes,
|
||||
struct dc_state *context);
|
||||
|
||||
void (*set_plane_config)(
|
||||
const struct dc *dc,
|
||||
struct pipe_ctx *pipe_ctx,
|
||||
struct resource_context *res_ctx);
|
||||
|
||||
void (*program_gamut_remap)(
|
||||
struct pipe_ctx *pipe_ctx);
|
||||
|
||||
|
@@ -26,6 +26,8 @@
|
||||
#ifndef __DAL_IRQ_TYPES_H__
|
||||
#define __DAL_IRQ_TYPES_H__
|
||||
|
||||
#include "os_types.h"
|
||||
|
||||
struct dc_context;
|
||||
|
||||
typedef void (*interrupt_handler)(void *);
|
||||
|
@@ -86,6 +86,7 @@
|
||||
#define VI_POLARIS10_P_A0 80
|
||||
#define VI_POLARIS11_M_A0 90
|
||||
#define VI_POLARIS12_V_A0 100
|
||||
#define VI_VEGAM_A0 110
|
||||
|
||||
#define VI_UNKNOWN 0xFF
|
||||
|
||||
@@ -98,14 +99,9 @@
|
||||
(eChipRev < VI_POLARIS11_M_A0))
|
||||
#define ASIC_REV_IS_POLARIS11_M(eChipRev) ((eChipRev >= VI_POLARIS11_M_A0) && \
|
||||
(eChipRev < VI_POLARIS12_V_A0))
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
#define VI_VEGAM_A0 110
|
||||
#define ASIC_REV_IS_POLARIS12_V(eChipRev) ((eChipRev >= VI_POLARIS12_V_A0) && \
|
||||
(eChipRev < VI_VEGAM_A0))
|
||||
#define ASIC_REV_IS_VEGAM(eChipRev) (eChipRev >= VI_VEGAM_A0)
|
||||
#else
|
||||
#define ASIC_REV_IS_POLARIS12_V(eChipRev) (eChipRev >= VI_POLARIS12_V_A0)
|
||||
#endif
|
||||
|
||||
/* DCE11 */
|
||||
#define CZ_CARRIZO_A0 0x01
|
||||
@@ -117,17 +113,19 @@
|
||||
((rev >= STONEY_A0) && (rev < CZ_UNKNOWN))
|
||||
|
||||
/* DCE12 */
|
||||
#define AI_UNKNOWN 0xFF
|
||||
|
||||
#define AI_GREENLAND_P_A0 1
|
||||
#define AI_GREENLAND_P_A1 2
|
||||
#define AI_UNKNOWN 0xFF
|
||||
|
||||
#define AI_VEGA12_P_A0 20
|
||||
#define AI_VEGA20_P_A0 40
|
||||
#define ASICREV_IS_GREENLAND_M(eChipRev) (eChipRev < AI_VEGA12_P_A0)
|
||||
#define ASICREV_IS_GREENLAND_P(eChipRev) (eChipRev < AI_VEGA12_P_A0)
|
||||
|
||||
#define ASICREV_IS_VEGA12_P(eChipRev) ((eChipRev >= AI_VEGA12_P_A0) && (eChipRev < AI_UNKNOWN))
|
||||
#define ASICREV_IS_VEGA12_p(eChipRev) ((eChipRev >= AI_VEGA12_P_A0) && (eChipRev < AI_UNKNOWN))
|
||||
#define ASICREV_IS_VEGA12_P(eChipRev) ((eChipRev >= AI_VEGA12_P_A0) && (eChipRev < AI_VEGA20_P_A0))
|
||||
#define ASICREV_IS_VEGA20_P(eChipRev) ((eChipRev >= AI_VEGA20_P_A0) && (eChipRev < AI_UNKNOWN))
|
||||
|
||||
/* DCN1_0 */
|
||||
#define INTERNAL_REV_RAVEN_A0 0x00 /* First spin of Raven */
|
||||
|
@@ -40,9 +40,7 @@ enum dce_version {
|
||||
DCE_VERSION_10_0,
|
||||
DCE_VERSION_11_0,
|
||||
DCE_VERSION_11_2,
|
||||
#if defined(CONFIG_DRM_AMD_DC_VEGAM)
|
||||
DCE_VERSION_11_22,
|
||||
#endif
|
||||
DCE_VERSION_12_0,
|
||||
DCE_VERSION_MAX,
|
||||
DCN_VERSION_1_0,
|
||||
|
@@ -27,6 +27,12 @@
|
||||
#define __DAL_FIXED31_32_H__
|
||||
|
||||
#define FIXED31_32_BITS_PER_FRACTIONAL_PART 32
|
||||
#ifndef LLONG_MIN
|
||||
#define LLONG_MIN (1LL<<63)
|
||||
#endif
|
||||
#ifndef LLONG_MAX
|
||||
#define LLONG_MAX (-1LL>>1)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -45,21 +51,22 @@ struct fixed31_32 {
|
||||
long long value;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* Useful constants
|
||||
*/
|
||||
|
||||
static const struct fixed31_32 dal_fixed31_32_zero = { 0 };
|
||||
static const struct fixed31_32 dal_fixed31_32_epsilon = { 1LL };
|
||||
static const struct fixed31_32 dal_fixed31_32_half = { 0x80000000LL };
|
||||
static const struct fixed31_32 dal_fixed31_32_one = { 0x100000000LL };
|
||||
static const struct fixed31_32 dc_fixpt_zero = { 0 };
|
||||
static const struct fixed31_32 dc_fixpt_epsilon = { 1LL };
|
||||
static const struct fixed31_32 dc_fixpt_half = { 0x80000000LL };
|
||||
static const struct fixed31_32 dc_fixpt_one = { 0x100000000LL };
|
||||
|
||||
static const struct fixed31_32 dal_fixed31_32_pi = { 13493037705LL };
|
||||
static const struct fixed31_32 dal_fixed31_32_two_pi = { 26986075409LL };
|
||||
static const struct fixed31_32 dal_fixed31_32_e = { 11674931555LL };
|
||||
static const struct fixed31_32 dal_fixed31_32_ln2 = { 2977044471LL };
|
||||
static const struct fixed31_32 dal_fixed31_32_ln2_div_2 = { 1488522236LL };
|
||||
static const struct fixed31_32 dc_fixpt_pi = { 13493037705LL };
|
||||
static const struct fixed31_32 dc_fixpt_two_pi = { 26986075409LL };
|
||||
static const struct fixed31_32 dc_fixpt_e = { 11674931555LL };
|
||||
static const struct fixed31_32 dc_fixpt_ln2 = { 2977044471LL };
|
||||
static const struct fixed31_32 dc_fixpt_ln2_div_2 = { 1488522236LL };
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -70,24 +77,19 @@ static const struct fixed31_32 dal_fixed31_32_ln2_div_2 = { 1488522236LL };
|
||||
* @brief
|
||||
* result = numerator / denominator
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_from_fraction(
|
||||
long long numerator,
|
||||
long long denominator);
|
||||
struct fixed31_32 dc_fixpt_from_fraction(long long numerator, long long denominator);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_from_int_nonconst(long long arg);
|
||||
static inline struct fixed31_32 dal_fixed31_32_from_int(long long arg)
|
||||
static inline struct fixed31_32 dc_fixpt_from_int(int arg)
|
||||
{
|
||||
if (__builtin_constant_p(arg)) {
|
||||
struct fixed31_32 res;
|
||||
BUILD_BUG_ON((LONG_MIN > arg) || (arg > LONG_MAX));
|
||||
res.value = arg << FIXED31_32_BITS_PER_FRACTIONAL_PART;
|
||||
return res;
|
||||
} else
|
||||
return dal_fixed31_32_from_int_nonconst(arg);
|
||||
struct fixed31_32 res;
|
||||
|
||||
res.value = (long long) arg << FIXED31_32_BITS_PER_FRACTIONAL_PART;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -99,7 +101,7 @@ static inline struct fixed31_32 dal_fixed31_32_from_int(long long arg)
|
||||
* @brief
|
||||
* result = -arg
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_neg(struct fixed31_32 arg)
|
||||
static inline struct fixed31_32 dc_fixpt_neg(struct fixed31_32 arg)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
@@ -112,10 +114,10 @@ static inline struct fixed31_32 dal_fixed31_32_neg(struct fixed31_32 arg)
|
||||
* @brief
|
||||
* result = abs(arg) := (arg >= 0) ? arg : -arg
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_abs(struct fixed31_32 arg)
|
||||
static inline struct fixed31_32 dc_fixpt_abs(struct fixed31_32 arg)
|
||||
{
|
||||
if (arg.value < 0)
|
||||
return dal_fixed31_32_neg(arg);
|
||||
return dc_fixpt_neg(arg);
|
||||
else
|
||||
return arg;
|
||||
}
|
||||
@@ -129,8 +131,7 @@ static inline struct fixed31_32 dal_fixed31_32_abs(struct fixed31_32 arg)
|
||||
* @brief
|
||||
* result = arg1 < arg2
|
||||
*/
|
||||
static inline bool dal_fixed31_32_lt(struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
static inline bool dc_fixpt_lt(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
return arg1.value < arg2.value;
|
||||
}
|
||||
@@ -139,8 +140,7 @@ static inline bool dal_fixed31_32_lt(struct fixed31_32 arg1,
|
||||
* @brief
|
||||
* result = arg1 <= arg2
|
||||
*/
|
||||
static inline bool dal_fixed31_32_le(struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
static inline bool dc_fixpt_le(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
return arg1.value <= arg2.value;
|
||||
}
|
||||
@@ -149,8 +149,7 @@ static inline bool dal_fixed31_32_le(struct fixed31_32 arg1,
|
||||
* @brief
|
||||
* result = arg1 == arg2
|
||||
*/
|
||||
static inline bool dal_fixed31_32_eq(struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
static inline bool dc_fixpt_eq(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
return arg1.value == arg2.value;
|
||||
}
|
||||
@@ -159,8 +158,7 @@ static inline bool dal_fixed31_32_eq(struct fixed31_32 arg1,
|
||||
* @brief
|
||||
* result = min(arg1, arg2) := (arg1 <= arg2) ? arg1 : arg2
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_min(struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
static inline struct fixed31_32 dc_fixpt_min(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
if (arg1.value <= arg2.value)
|
||||
return arg1;
|
||||
@@ -172,8 +170,7 @@ static inline struct fixed31_32 dal_fixed31_32_min(struct fixed31_32 arg1,
|
||||
* @brief
|
||||
* result = max(arg1, arg2) := (arg1 <= arg2) ? arg2 : arg1
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_max(struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
static inline struct fixed31_32 dc_fixpt_max(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
if (arg1.value <= arg2.value)
|
||||
return arg2;
|
||||
@@ -187,14 +184,14 @@ static inline struct fixed31_32 dal_fixed31_32_max(struct fixed31_32 arg1,
|
||||
* result = | arg, when min_value < arg < max_value
|
||||
* | max_value, when arg >= max_value
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_clamp(
|
||||
static inline struct fixed31_32 dc_fixpt_clamp(
|
||||
struct fixed31_32 arg,
|
||||
struct fixed31_32 min_value,
|
||||
struct fixed31_32 max_value)
|
||||
{
|
||||
if (dal_fixed31_32_le(arg, min_value))
|
||||
if (dc_fixpt_le(arg, min_value))
|
||||
return min_value;
|
||||
else if (dal_fixed31_32_le(max_value, arg))
|
||||
else if (dc_fixpt_le(max_value, arg))
|
||||
return max_value;
|
||||
else
|
||||
return arg;
|
||||
@@ -209,21 +206,30 @@ static inline struct fixed31_32 dal_fixed31_32_clamp(
|
||||
* @brief
|
||||
* result = arg << shift
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_shl(
|
||||
struct fixed31_32 arg,
|
||||
unsigned char shift);
|
||||
static inline struct fixed31_32 dc_fixpt_shl(struct fixed31_32 arg, unsigned char shift)
|
||||
{
|
||||
ASSERT(((arg.value >= 0) && (arg.value <= LLONG_MAX >> shift)) ||
|
||||
((arg.value < 0) && (arg.value >= ~(LLONG_MAX >> shift))));
|
||||
|
||||
arg.value = arg.value << shift;
|
||||
|
||||
return arg;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg >> shift
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_shr(
|
||||
struct fixed31_32 arg,
|
||||
unsigned char shift)
|
||||
static inline struct fixed31_32 dc_fixpt_shr(struct fixed31_32 arg, unsigned char shift)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
res.value = arg.value >> shift;
|
||||
return res;
|
||||
bool negative = arg.value < 0;
|
||||
|
||||
if (negative)
|
||||
arg.value = -arg.value;
|
||||
arg.value = arg.value >> shift;
|
||||
if (negative)
|
||||
arg.value = -arg.value;
|
||||
return arg;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -235,38 +241,50 @@ static inline struct fixed31_32 dal_fixed31_32_shr(
|
||||
* @brief
|
||||
* result = arg1 + arg2
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_add(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2);
|
||||
static inline struct fixed31_32 dc_fixpt_add(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
ASSERT(((arg1.value >= 0) && (LLONG_MAX - arg1.value >= arg2.value)) ||
|
||||
((arg1.value < 0) && (LLONG_MIN - arg1.value <= arg2.value)));
|
||||
|
||||
res.value = arg1.value + arg2.value;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg1 + arg2
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_add_int(struct fixed31_32 arg1,
|
||||
int arg2)
|
||||
static inline struct fixed31_32 dc_fixpt_add_int(struct fixed31_32 arg1, int arg2)
|
||||
{
|
||||
return dal_fixed31_32_add(arg1,
|
||||
dal_fixed31_32_from_int(arg2));
|
||||
return dc_fixpt_add(arg1, dc_fixpt_from_int(arg2));
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg1 - arg2
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_sub(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2);
|
||||
static inline struct fixed31_32 dc_fixpt_sub(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
struct fixed31_32 res;
|
||||
|
||||
ASSERT(((arg2.value >= 0) && (LLONG_MIN + arg2.value <= arg1.value)) ||
|
||||
((arg2.value < 0) && (LLONG_MAX + arg2.value >= arg1.value)));
|
||||
|
||||
res.value = arg1.value - arg2.value;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg1 - arg2
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_sub_int(struct fixed31_32 arg1,
|
||||
int arg2)
|
||||
static inline struct fixed31_32 dc_fixpt_sub_int(struct fixed31_32 arg1, int arg2)
|
||||
{
|
||||
return dal_fixed31_32_sub(arg1,
|
||||
dal_fixed31_32_from_int(arg2));
|
||||
return dc_fixpt_sub(arg1, dc_fixpt_from_int(arg2));
|
||||
}
|
||||
|
||||
|
||||
@@ -279,49 +297,40 @@ static inline struct fixed31_32 dal_fixed31_32_sub_int(struct fixed31_32 arg1,
|
||||
* @brief
|
||||
* result = arg1 * arg2
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_mul(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2);
|
||||
struct fixed31_32 dc_fixpt_mul(struct fixed31_32 arg1, struct fixed31_32 arg2);
|
||||
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg1 * arg2
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_mul_int(struct fixed31_32 arg1,
|
||||
int arg2)
|
||||
static inline struct fixed31_32 dc_fixpt_mul_int(struct fixed31_32 arg1, int arg2)
|
||||
{
|
||||
return dal_fixed31_32_mul(arg1,
|
||||
dal_fixed31_32_from_int(arg2));
|
||||
return dc_fixpt_mul(arg1, dc_fixpt_from_int(arg2));
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = square(arg) := arg * arg
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_sqr(
|
||||
struct fixed31_32 arg);
|
||||
struct fixed31_32 dc_fixpt_sqr(struct fixed31_32 arg);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg1 / arg2
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_div_int(struct fixed31_32 arg1,
|
||||
long long arg2)
|
||||
static inline struct fixed31_32 dc_fixpt_div_int(struct fixed31_32 arg1, long long arg2)
|
||||
{
|
||||
return dal_fixed31_32_from_fraction(arg1.value,
|
||||
dal_fixed31_32_from_int(arg2).value);
|
||||
return dc_fixpt_from_fraction(arg1.value, dc_fixpt_from_int(arg2).value);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = arg1 / arg2
|
||||
*/
|
||||
static inline struct fixed31_32 dal_fixed31_32_div(struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2)
|
||||
static inline struct fixed31_32 dc_fixpt_div(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
return dal_fixed31_32_from_fraction(arg1.value,
|
||||
arg2.value);
|
||||
return dc_fixpt_from_fraction(arg1.value, arg2.value);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -336,8 +345,7 @@ static inline struct fixed31_32 dal_fixed31_32_div(struct fixed31_32 arg1,
|
||||
* @note
|
||||
* No special actions taken in case argument is zero.
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_recip(
|
||||
struct fixed31_32 arg);
|
||||
struct fixed31_32 dc_fixpt_recip(struct fixed31_32 arg);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -352,8 +360,7 @@ struct fixed31_32 dal_fixed31_32_recip(
|
||||
* Argument specified in radians,
|
||||
* internally it's normalized to [-2pi...2pi] range.
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_sinc(
|
||||
struct fixed31_32 arg);
|
||||
struct fixed31_32 dc_fixpt_sinc(struct fixed31_32 arg);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -363,8 +370,7 @@ struct fixed31_32 dal_fixed31_32_sinc(
|
||||
* Argument specified in radians,
|
||||
* internally it's normalized to [-2pi...2pi] range.
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_sin(
|
||||
struct fixed31_32 arg);
|
||||
struct fixed31_32 dc_fixpt_sin(struct fixed31_32 arg);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -376,8 +382,7 @@ struct fixed31_32 dal_fixed31_32_sin(
|
||||
* passing arguments outside that range
|
||||
* will cause incorrect result!
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_cos(
|
||||
struct fixed31_32 arg);
|
||||
struct fixed31_32 dc_fixpt_cos(struct fixed31_32 arg);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -391,8 +396,7 @@ struct fixed31_32 dal_fixed31_32_cos(
|
||||
* @note
|
||||
* Currently, function is verified for abs(arg) <= 1.
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_exp(
|
||||
struct fixed31_32 arg);
|
||||
struct fixed31_32 dc_fixpt_exp(struct fixed31_32 arg);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -404,8 +408,7 @@ struct fixed31_32 dal_fixed31_32_exp(
|
||||
* Currently, no special actions taken
|
||||
* in case of invalid argument(s). Take care!
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_log(
|
||||
struct fixed31_32 arg);
|
||||
struct fixed31_32 dc_fixpt_log(struct fixed31_32 arg);
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -419,9 +422,13 @@ struct fixed31_32 dal_fixed31_32_log(
|
||||
* @note
|
||||
* Currently, abs(arg1) should be less than 1. Take care!
|
||||
*/
|
||||
struct fixed31_32 dal_fixed31_32_pow(
|
||||
struct fixed31_32 arg1,
|
||||
struct fixed31_32 arg2);
|
||||
static inline struct fixed31_32 dc_fixpt_pow(struct fixed31_32 arg1, struct fixed31_32 arg2)
|
||||
{
|
||||
return dc_fixpt_exp(
|
||||
dc_fixpt_mul(
|
||||
dc_fixpt_log(arg1),
|
||||
arg2));
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
@@ -432,22 +439,56 @@ struct fixed31_32 dal_fixed31_32_pow(
|
||||
* @brief
|
||||
* result = floor(arg) := greatest integer lower than or equal to arg
|
||||
*/
|
||||
int dal_fixed31_32_floor(
|
||||
struct fixed31_32 arg);
|
||||
static inline int dc_fixpt_floor(struct fixed31_32 arg)
|
||||
{
|
||||
unsigned long long arg_value = arg.value > 0 ? arg.value : -arg.value;
|
||||
|
||||
if (arg.value >= 0)
|
||||
return (int)(arg_value >> FIXED31_32_BITS_PER_FRACTIONAL_PART);
|
||||
else
|
||||
return -(int)(arg_value >> FIXED31_32_BITS_PER_FRACTIONAL_PART);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = round(arg) := integer nearest to arg
|
||||
*/
|
||||
int dal_fixed31_32_round(
|
||||
struct fixed31_32 arg);
|
||||
static inline int dc_fixpt_round(struct fixed31_32 arg)
|
||||
{
|
||||
unsigned long long arg_value = arg.value > 0 ? arg.value : -arg.value;
|
||||
|
||||
const long long summand = dc_fixpt_half.value;
|
||||
|
||||
ASSERT(LLONG_MAX - (long long)arg_value >= summand);
|
||||
|
||||
arg_value += summand;
|
||||
|
||||
if (arg.value >= 0)
|
||||
return (int)(arg_value >> FIXED31_32_BITS_PER_FRACTIONAL_PART);
|
||||
else
|
||||
return -(int)(arg_value >> FIXED31_32_BITS_PER_FRACTIONAL_PART);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief
|
||||
* result = ceil(arg) := lowest integer greater than or equal to arg
|
||||
*/
|
||||
int dal_fixed31_32_ceil(
|
||||
struct fixed31_32 arg);
|
||||
static inline int dc_fixpt_ceil(struct fixed31_32 arg)
|
||||
{
|
||||
unsigned long long arg_value = arg.value > 0 ? arg.value : -arg.value;
|
||||
|
||||
const long long summand = dc_fixpt_one.value -
|
||||
dc_fixpt_epsilon.value;
|
||||
|
||||
ASSERT(LLONG_MAX - (long long)arg_value >= summand);
|
||||
|
||||
arg_value += summand;
|
||||
|
||||
if (arg.value >= 0)
|
||||
return (int)(arg_value >> FIXED31_32_BITS_PER_FRACTIONAL_PART);
|
||||
else
|
||||
return -(int)(arg_value >> FIXED31_32_BITS_PER_FRACTIONAL_PART);
|
||||
}
|
||||
|
||||
/* the following two function are used in scaler hw programming to convert fixed
|
||||
* point value to format 2 bits from integer part and 19 bits from fractional
|
||||
@@ -455,20 +496,31 @@ int dal_fixed31_32_ceil(
|
||||
* fractional
|
||||
*/
|
||||
|
||||
unsigned int dal_fixed31_32_u2d19(
|
||||
struct fixed31_32 arg);
|
||||
unsigned int dc_fixpt_u2d19(struct fixed31_32 arg);
|
||||
|
||||
unsigned int dal_fixed31_32_u0d19(
|
||||
struct fixed31_32 arg);
|
||||
unsigned int dc_fixpt_u0d19(struct fixed31_32 arg);
|
||||
|
||||
unsigned int dc_fixpt_clamp_u0d14(struct fixed31_32 arg);
|
||||
|
||||
unsigned int dal_fixed31_32_clamp_u0d14(
|
||||
struct fixed31_32 arg);
|
||||
unsigned int dc_fixpt_clamp_u0d10(struct fixed31_32 arg);
|
||||
|
||||
unsigned int dal_fixed31_32_clamp_u0d10(
|
||||
struct fixed31_32 arg);
|
||||
int dc_fixpt_s4d19(struct fixed31_32 arg);
|
||||
|
||||
int dal_fixed31_32_s4d19(
|
||||
struct fixed31_32 arg);
|
||||
static inline struct fixed31_32 dc_fixpt_truncate(struct fixed31_32 arg, unsigned int frac_bits)
|
||||
{
|
||||
bool negative = arg.value < 0;
|
||||
|
||||
if (frac_bits >= FIXED31_32_BITS_PER_FRACTIONAL_PART) {
|
||||
ASSERT(frac_bits == FIXED31_32_BITS_PER_FRACTIONAL_PART);
|
||||
return arg;
|
||||
}
|
||||
|
||||
if (negative)
|
||||
arg.value = -arg.value;
|
||||
arg.value &= (~0LL) << (FIXED31_32_BITS_PER_FRACTIONAL_PART - frac_bits);
|
||||
if (negative)
|
||||
arg.value = -arg.value;
|
||||
return arg;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -1,129 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-15 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: AMD
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __DAL_FIXED32_32_H__
|
||||
#define __DAL_FIXED32_32_H__
|
||||
|
||||
#include "os_types.h"
|
||||
|
||||
struct fixed32_32 {
|
||||
uint64_t value;
|
||||
};
|
||||
|
||||
static const struct fixed32_32 dal_fixed32_32_zero = { 0 };
|
||||
static const struct fixed32_32 dal_fixed32_32_one = { 0x100000000LL };
|
||||
static const struct fixed32_32 dal_fixed32_32_half = { 0x80000000LL };
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_from_fraction(uint32_t n, uint32_t d);
|
||||
static inline struct fixed32_32 dal_fixed32_32_from_int(uint32_t value)
|
||||
{
|
||||
struct fixed32_32 fx;
|
||||
|
||||
fx.value = (uint64_t)value<<32;
|
||||
return fx;
|
||||
}
|
||||
|
||||
struct fixed32_32 dal_fixed32_32_add(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs);
|
||||
struct fixed32_32 dal_fixed32_32_add_int(
|
||||
struct fixed32_32 lhs,
|
||||
uint32_t rhs);
|
||||
struct fixed32_32 dal_fixed32_32_sub(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs);
|
||||
struct fixed32_32 dal_fixed32_32_sub_int(
|
||||
struct fixed32_32 lhs,
|
||||
uint32_t rhs);
|
||||
struct fixed32_32 dal_fixed32_32_mul(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs);
|
||||
struct fixed32_32 dal_fixed32_32_mul_int(
|
||||
struct fixed32_32 lhs,
|
||||
uint32_t rhs);
|
||||
struct fixed32_32 dal_fixed32_32_div(
|
||||
struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs);
|
||||
struct fixed32_32 dal_fixed32_32_div_int(
|
||||
struct fixed32_32 lhs,
|
||||
uint32_t rhs);
|
||||
|
||||
static inline struct fixed32_32 dal_fixed32_32_min(struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs)
|
||||
{
|
||||
return (lhs.value < rhs.value) ? lhs : rhs;
|
||||
}
|
||||
|
||||
static inline struct fixed32_32 dal_fixed32_32_max(struct fixed32_32 lhs,
|
||||
struct fixed32_32 rhs)
|
||||
{
|
||||
return (lhs.value > rhs.value) ? lhs : rhs;
|
||||
}
|
||||
|
||||
static inline bool dal_fixed32_32_gt(struct fixed32_32 lhs, struct fixed32_32 rhs)
|
||||
{
|
||||
return lhs.value > rhs.value;
|
||||
}
|
||||
|
||||
static inline bool dal_fixed32_32_gt_int(struct fixed32_32 lhs, uint32_t rhs)
|
||||
{
|
||||
return lhs.value > ((uint64_t)rhs<<32);
|
||||
}
|
||||
|
||||
static inline bool dal_fixed32_32_lt(struct fixed32_32 lhs, struct fixed32_32 rhs)
|
||||
{
|
||||
return lhs.value < rhs.value;
|
||||
}
|
||||
|
||||
static inline bool dal_fixed32_32_lt_int(struct fixed32_32 lhs, uint32_t rhs)
|
||||
{
|
||||
return lhs.value < ((uint64_t)rhs<<32);
|
||||
}
|
||||
|
||||
static inline bool dal_fixed32_32_le(struct fixed32_32 lhs, struct fixed32_32 rhs)
|
||||
{
|
||||
return lhs.value <= rhs.value;
|
||||
}
|
||||
|
||||
static inline bool dal_fixed32_32_le_int(struct fixed32_32 lhs, uint32_t rhs)
|
||||
{
|
||||
return lhs.value <= ((uint64_t)rhs<<32);
|
||||
}
|
||||
|
||||
static inline bool dal_fixed32_32_eq(struct fixed32_32 lhs, struct fixed32_32 rhs)
|
||||
{
|
||||
return lhs.value == rhs.value;
|
||||
}
|
||||
|
||||
uint32_t dal_fixed32_32_ceil(struct fixed32_32 value);
|
||||
static inline uint32_t dal_fixed32_32_floor(struct fixed32_32 value)
|
||||
{
|
||||
return value.value>>32;
|
||||
}
|
||||
|
||||
uint32_t dal_fixed32_32_round(struct fixed32_32 value);
|
||||
|
||||
#endif
|
@@ -190,4 +190,13 @@ void context_clock_trace(
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DISPLAY_STATS_BEGIN(entry) \
|
||||
dm_logger_open(dc->ctx->logger, &entry, LOG_DISPLAYSTATS)
|
||||
|
||||
#define DISPLAY_STATS(msg, ...) \
|
||||
dm_logger_append(&log_entry, msg, ##__VA_ARGS__)
|
||||
|
||||
#define DISPLAY_STATS_END(entry) \
|
||||
dm_logger_close(&entry)
|
||||
|
||||
#endif /* __DAL_LOGGER_INTERFACE_H__ */
|
||||
|
@@ -98,7 +98,7 @@ enum dc_log_type {
|
||||
LOG_EVENT_UNDERFLOW,
|
||||
LOG_IF_TRACE,
|
||||
LOG_PERF_TRACE,
|
||||
LOG_PROFILING,
|
||||
LOG_DISPLAYSTATS,
|
||||
|
||||
LOG_SECTION_TOTAL_COUNT
|
||||
};
|
||||
|
@@ -43,7 +43,7 @@ static bool de_pq_initialized; /* = false; */
|
||||
/* one-time setup of X points */
|
||||
void setup_x_points_distribution(void)
|
||||
{
|
||||
struct fixed31_32 region_size = dal_fixed31_32_from_int(128);
|
||||
struct fixed31_32 region_size = dc_fixpt_from_int(128);
|
||||
int32_t segment;
|
||||
uint32_t seg_offset;
|
||||
uint32_t index;
|
||||
@@ -53,8 +53,8 @@ void setup_x_points_distribution(void)
|
||||
coordinates_x[MAX_HW_POINTS + 1].x = region_size;
|
||||
|
||||
for (segment = 6; segment > (6 - NUM_REGIONS); segment--) {
|
||||
region_size = dal_fixed31_32_div_int(region_size, 2);
|
||||
increment = dal_fixed31_32_div_int(region_size,
|
||||
region_size = dc_fixpt_div_int(region_size, 2);
|
||||
increment = dc_fixpt_div_int(region_size,
|
||||
NUM_PTS_IN_REGION);
|
||||
seg_offset = (segment + (NUM_REGIONS - 7)) * NUM_PTS_IN_REGION;
|
||||
coordinates_x[seg_offset].x = region_size;
|
||||
@@ -62,7 +62,7 @@ void setup_x_points_distribution(void)
|
||||
for (index = seg_offset + 1;
|
||||
index < seg_offset + NUM_PTS_IN_REGION;
|
||||
index++) {
|
||||
coordinates_x[index].x = dal_fixed31_32_add
|
||||
coordinates_x[index].x = dc_fixpt_add
|
||||
(coordinates_x[index-1].x, increment);
|
||||
}
|
||||
}
|
||||
@@ -72,63 +72,63 @@ static void compute_pq(struct fixed31_32 in_x, struct fixed31_32 *out_y)
|
||||
{
|
||||
/* consts for PQ gamma formula. */
|
||||
const struct fixed31_32 m1 =
|
||||
dal_fixed31_32_from_fraction(159301758, 1000000000);
|
||||
dc_fixpt_from_fraction(159301758, 1000000000);
|
||||
const struct fixed31_32 m2 =
|
||||
dal_fixed31_32_from_fraction(7884375, 100000);
|
||||
dc_fixpt_from_fraction(7884375, 100000);
|
||||
const struct fixed31_32 c1 =
|
||||
dal_fixed31_32_from_fraction(8359375, 10000000);
|
||||
dc_fixpt_from_fraction(8359375, 10000000);
|
||||
const struct fixed31_32 c2 =
|
||||
dal_fixed31_32_from_fraction(188515625, 10000000);
|
||||
dc_fixpt_from_fraction(188515625, 10000000);
|
||||
const struct fixed31_32 c3 =
|
||||
dal_fixed31_32_from_fraction(186875, 10000);
|
||||
dc_fixpt_from_fraction(186875, 10000);
|
||||
|
||||
struct fixed31_32 l_pow_m1;
|
||||
struct fixed31_32 base;
|
||||
|
||||
if (dal_fixed31_32_lt(in_x, dal_fixed31_32_zero))
|
||||
in_x = dal_fixed31_32_zero;
|
||||
if (dc_fixpt_lt(in_x, dc_fixpt_zero))
|
||||
in_x = dc_fixpt_zero;
|
||||
|
||||
l_pow_m1 = dal_fixed31_32_pow(in_x, m1);
|
||||
base = dal_fixed31_32_div(
|
||||
dal_fixed31_32_add(c1,
|
||||
(dal_fixed31_32_mul(c2, l_pow_m1))),
|
||||
dal_fixed31_32_add(dal_fixed31_32_one,
|
||||
(dal_fixed31_32_mul(c3, l_pow_m1))));
|
||||
*out_y = dal_fixed31_32_pow(base, m2);
|
||||
l_pow_m1 = dc_fixpt_pow(in_x, m1);
|
||||
base = dc_fixpt_div(
|
||||
dc_fixpt_add(c1,
|
||||
(dc_fixpt_mul(c2, l_pow_m1))),
|
||||
dc_fixpt_add(dc_fixpt_one,
|
||||
(dc_fixpt_mul(c3, l_pow_m1))));
|
||||
*out_y = dc_fixpt_pow(base, m2);
|
||||
}
|
||||
|
||||
static void compute_de_pq(struct fixed31_32 in_x, struct fixed31_32 *out_y)
|
||||
{
|
||||
/* consts for dePQ gamma formula. */
|
||||
const struct fixed31_32 m1 =
|
||||
dal_fixed31_32_from_fraction(159301758, 1000000000);
|
||||
dc_fixpt_from_fraction(159301758, 1000000000);
|
||||
const struct fixed31_32 m2 =
|
||||
dal_fixed31_32_from_fraction(7884375, 100000);
|
||||
dc_fixpt_from_fraction(7884375, 100000);
|
||||
const struct fixed31_32 c1 =
|
||||
dal_fixed31_32_from_fraction(8359375, 10000000);
|
||||
dc_fixpt_from_fraction(8359375, 10000000);
|
||||
const struct fixed31_32 c2 =
|
||||
dal_fixed31_32_from_fraction(188515625, 10000000);
|
||||
dc_fixpt_from_fraction(188515625, 10000000);
|
||||
const struct fixed31_32 c3 =
|
||||
dal_fixed31_32_from_fraction(186875, 10000);
|
||||
dc_fixpt_from_fraction(186875, 10000);
|
||||
|
||||
struct fixed31_32 l_pow_m1;
|
||||
struct fixed31_32 base, div;
|
||||
|
||||
|
||||
if (dal_fixed31_32_lt(in_x, dal_fixed31_32_zero))
|
||||
in_x = dal_fixed31_32_zero;
|
||||
if (dc_fixpt_lt(in_x, dc_fixpt_zero))
|
||||
in_x = dc_fixpt_zero;
|
||||
|
||||
l_pow_m1 = dal_fixed31_32_pow(in_x,
|
||||
dal_fixed31_32_div(dal_fixed31_32_one, m2));
|
||||
base = dal_fixed31_32_sub(l_pow_m1, c1);
|
||||
l_pow_m1 = dc_fixpt_pow(in_x,
|
||||
dc_fixpt_div(dc_fixpt_one, m2));
|
||||
base = dc_fixpt_sub(l_pow_m1, c1);
|
||||
|
||||
if (dal_fixed31_32_lt(base, dal_fixed31_32_zero))
|
||||
base = dal_fixed31_32_zero;
|
||||
if (dc_fixpt_lt(base, dc_fixpt_zero))
|
||||
base = dc_fixpt_zero;
|
||||
|
||||
div = dal_fixed31_32_sub(c2, dal_fixed31_32_mul(c3, l_pow_m1));
|
||||
div = dc_fixpt_sub(c2, dc_fixpt_mul(c3, l_pow_m1));
|
||||
|
||||
*out_y = dal_fixed31_32_pow(dal_fixed31_32_div(base, div),
|
||||
dal_fixed31_32_div(dal_fixed31_32_one, m1));
|
||||
*out_y = dc_fixpt_pow(dc_fixpt_div(base, div),
|
||||
dc_fixpt_div(dc_fixpt_one, m1));
|
||||
|
||||
}
|
||||
/* one-time pre-compute PQ values - only for sdr_white_level 80 */
|
||||
@@ -138,14 +138,14 @@ void precompute_pq(void)
|
||||
struct fixed31_32 x;
|
||||
const struct hw_x_point *coord_x = coordinates_x + 32;
|
||||
struct fixed31_32 scaling_factor =
|
||||
dal_fixed31_32_from_fraction(80, 10000);
|
||||
dc_fixpt_from_fraction(80, 10000);
|
||||
|
||||
/* pow function has problems with arguments too small */
|
||||
for (i = 0; i < 32; i++)
|
||||
pq_table[i] = dal_fixed31_32_zero;
|
||||
pq_table[i] = dc_fixpt_zero;
|
||||
|
||||
for (i = 32; i <= MAX_HW_POINTS; i++) {
|
||||
x = dal_fixed31_32_mul(coord_x->x, scaling_factor);
|
||||
x = dc_fixpt_mul(coord_x->x, scaling_factor);
|
||||
compute_pq(x, &pq_table[i]);
|
||||
++coord_x;
|
||||
}
|
||||
@@ -158,7 +158,7 @@ void precompute_de_pq(void)
|
||||
struct fixed31_32 y;
|
||||
uint32_t begin_index, end_index;
|
||||
|
||||
struct fixed31_32 scaling_factor = dal_fixed31_32_from_int(125);
|
||||
struct fixed31_32 scaling_factor = dc_fixpt_from_int(125);
|
||||
|
||||
/* X points is 2^-25 to 2^7
|
||||
* De-gamma X is 2^-12 to 2^0 – we are skipping first -12-(-25) = 13 regions
|
||||
@@ -167,11 +167,11 @@ void precompute_de_pq(void)
|
||||
end_index = begin_index + 12 * NUM_PTS_IN_REGION;
|
||||
|
||||
for (i = 0; i <= begin_index; i++)
|
||||
de_pq_table[i] = dal_fixed31_32_zero;
|
||||
de_pq_table[i] = dc_fixpt_zero;
|
||||
|
||||
for (; i <= end_index; i++) {
|
||||
compute_de_pq(coordinates_x[i].x, &y);
|
||||
de_pq_table[i] = dal_fixed31_32_mul(y, scaling_factor);
|
||||
de_pq_table[i] = dc_fixpt_mul(y, scaling_factor);
|
||||
}
|
||||
|
||||
for (; i <= MAX_HW_POINTS; i++)
|
||||
@@ -195,15 +195,15 @@ static void build_coefficients(struct gamma_coefficients *coefficients, bool is_
|
||||
uint32_t index = is_2_4 == true ? 0:1;
|
||||
|
||||
do {
|
||||
coefficients->a0[i] = dal_fixed31_32_from_fraction(
|
||||
coefficients->a0[i] = dc_fixpt_from_fraction(
|
||||
numerator01[index], 10000000);
|
||||
coefficients->a1[i] = dal_fixed31_32_from_fraction(
|
||||
coefficients->a1[i] = dc_fixpt_from_fraction(
|
||||
numerator02[index], 1000);
|
||||
coefficients->a2[i] = dal_fixed31_32_from_fraction(
|
||||
coefficients->a2[i] = dc_fixpt_from_fraction(
|
||||
numerator03[index], 1000);
|
||||
coefficients->a3[i] = dal_fixed31_32_from_fraction(
|
||||
coefficients->a3[i] = dc_fixpt_from_fraction(
|
||||
numerator04[index], 1000);
|
||||
coefficients->user_gamma[i] = dal_fixed31_32_from_fraction(
|
||||
coefficients->user_gamma[i] = dc_fixpt_from_fraction(
|
||||
numerator05[index], 1000);
|
||||
|
||||
++i;
|
||||
@@ -218,33 +218,33 @@ static struct fixed31_32 translate_from_linear_space(
|
||||
struct fixed31_32 a3,
|
||||
struct fixed31_32 gamma)
|
||||
{
|
||||
const struct fixed31_32 one = dal_fixed31_32_from_int(1);
|
||||
const struct fixed31_32 one = dc_fixpt_from_int(1);
|
||||
|
||||
if (dal_fixed31_32_lt(one, arg))
|
||||
if (dc_fixpt_lt(one, arg))
|
||||
return one;
|
||||
|
||||
if (dal_fixed31_32_le(arg, dal_fixed31_32_neg(a0)))
|
||||
return dal_fixed31_32_sub(
|
||||
if (dc_fixpt_le(arg, dc_fixpt_neg(a0)))
|
||||
return dc_fixpt_sub(
|
||||
a2,
|
||||
dal_fixed31_32_mul(
|
||||
dal_fixed31_32_add(
|
||||
dc_fixpt_mul(
|
||||
dc_fixpt_add(
|
||||
one,
|
||||
a3),
|
||||
dal_fixed31_32_pow(
|
||||
dal_fixed31_32_neg(arg),
|
||||
dal_fixed31_32_recip(gamma))));
|
||||
else if (dal_fixed31_32_le(a0, arg))
|
||||
return dal_fixed31_32_sub(
|
||||
dal_fixed31_32_mul(
|
||||
dal_fixed31_32_add(
|
||||
dc_fixpt_pow(
|
||||
dc_fixpt_neg(arg),
|
||||
dc_fixpt_recip(gamma))));
|
||||
else if (dc_fixpt_le(a0, arg))
|
||||
return dc_fixpt_sub(
|
||||
dc_fixpt_mul(
|
||||
dc_fixpt_add(
|
||||
one,
|
||||
a3),
|
||||
dal_fixed31_32_pow(
|
||||
dc_fixpt_pow(
|
||||
arg,
|
||||
dal_fixed31_32_recip(gamma))),
|
||||
dc_fixpt_recip(gamma))),
|
||||
a2);
|
||||
else
|
||||
return dal_fixed31_32_mul(
|
||||
return dc_fixpt_mul(
|
||||
arg,
|
||||
a1);
|
||||
}
|
||||
@@ -259,25 +259,25 @@ static struct fixed31_32 translate_to_linear_space(
|
||||
{
|
||||
struct fixed31_32 linear;
|
||||
|
||||
a0 = dal_fixed31_32_mul(a0, a1);
|
||||
if (dal_fixed31_32_le(arg, dal_fixed31_32_neg(a0)))
|
||||
a0 = dc_fixpt_mul(a0, a1);
|
||||
if (dc_fixpt_le(arg, dc_fixpt_neg(a0)))
|
||||
|
||||
linear = dal_fixed31_32_neg(
|
||||
dal_fixed31_32_pow(
|
||||
dal_fixed31_32_div(
|
||||
dal_fixed31_32_sub(a2, arg),
|
||||
dal_fixed31_32_add(
|
||||
dal_fixed31_32_one, a3)), gamma));
|
||||
linear = dc_fixpt_neg(
|
||||
dc_fixpt_pow(
|
||||
dc_fixpt_div(
|
||||
dc_fixpt_sub(a2, arg),
|
||||
dc_fixpt_add(
|
||||
dc_fixpt_one, a3)), gamma));
|
||||
|
||||
else if (dal_fixed31_32_le(dal_fixed31_32_neg(a0), arg) &&
|
||||
dal_fixed31_32_le(arg, a0))
|
||||
linear = dal_fixed31_32_div(arg, a1);
|
||||
else if (dc_fixpt_le(dc_fixpt_neg(a0), arg) &&
|
||||
dc_fixpt_le(arg, a0))
|
||||
linear = dc_fixpt_div(arg, a1);
|
||||
else
|
||||
linear = dal_fixed31_32_pow(
|
||||
dal_fixed31_32_div(
|
||||
dal_fixed31_32_add(a2, arg),
|
||||
dal_fixed31_32_add(
|
||||
dal_fixed31_32_one, a3)), gamma);
|
||||
linear = dc_fixpt_pow(
|
||||
dc_fixpt_div(
|
||||
dc_fixpt_add(a2, arg),
|
||||
dc_fixpt_add(
|
||||
dc_fixpt_one, a3)), gamma);
|
||||
|
||||
return linear;
|
||||
}
|
||||
@@ -352,8 +352,8 @@ static bool find_software_points(
|
||||
right = axis_x[max_number - 1].b;
|
||||
}
|
||||
|
||||
if (dal_fixed31_32_le(left, hw_point) &&
|
||||
dal_fixed31_32_le(hw_point, right)) {
|
||||
if (dc_fixpt_le(left, hw_point) &&
|
||||
dc_fixpt_le(hw_point, right)) {
|
||||
*index_to_start = i;
|
||||
*index_left = i;
|
||||
|
||||
@@ -366,7 +366,7 @@ static bool find_software_points(
|
||||
|
||||
return true;
|
||||
} else if ((i == *index_to_start) &&
|
||||
dal_fixed31_32_le(hw_point, left)) {
|
||||
dc_fixpt_le(hw_point, left)) {
|
||||
*index_to_start = i;
|
||||
*index_left = i;
|
||||
*index_right = i;
|
||||
@@ -375,7 +375,7 @@ static bool find_software_points(
|
||||
|
||||
return true;
|
||||
} else if ((i == max_number - 1) &&
|
||||
dal_fixed31_32_le(right, hw_point)) {
|
||||
dc_fixpt_le(right, hw_point)) {
|
||||
*index_to_start = i;
|
||||
*index_left = i;
|
||||
*index_right = i;
|
||||
@@ -457,17 +457,17 @@ static bool build_custom_gamma_mapping_coefficients_worker(
|
||||
}
|
||||
|
||||
if (hw_pos == HW_POINT_POSITION_MIDDLE)
|
||||
point->coeff = dal_fixed31_32_div(
|
||||
dal_fixed31_32_sub(
|
||||
point->coeff = dc_fixpt_div(
|
||||
dc_fixpt_sub(
|
||||
coord_x,
|
||||
left_pos),
|
||||
dal_fixed31_32_sub(
|
||||
dc_fixpt_sub(
|
||||
right_pos,
|
||||
left_pos));
|
||||
else if (hw_pos == HW_POINT_POSITION_LEFT)
|
||||
point->coeff = dal_fixed31_32_zero;
|
||||
point->coeff = dc_fixpt_zero;
|
||||
else if (hw_pos == HW_POINT_POSITION_RIGHT)
|
||||
point->coeff = dal_fixed31_32_from_int(2);
|
||||
point->coeff = dc_fixpt_from_int(2);
|
||||
else {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return false;
|
||||
@@ -502,45 +502,45 @@ static struct fixed31_32 calculate_mapped_value(
|
||||
|
||||
if ((point->left_index < 0) || (point->left_index > max_index)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return dal_fixed31_32_zero;
|
||||
return dc_fixpt_zero;
|
||||
}
|
||||
|
||||
if ((point->right_index < 0) || (point->right_index > max_index)) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
return dal_fixed31_32_zero;
|
||||
return dc_fixpt_zero;
|
||||
}
|
||||
|
||||
if (point->pos == HW_POINT_POSITION_MIDDLE)
|
||||
if (channel == CHANNEL_NAME_RED)
|
||||
result = dal_fixed31_32_add(
|
||||
dal_fixed31_32_mul(
|
||||
result = dc_fixpt_add(
|
||||
dc_fixpt_mul(
|
||||
point->coeff,
|
||||
dal_fixed31_32_sub(
|
||||
dc_fixpt_sub(
|
||||
rgb[point->right_index].r,
|
||||
rgb[point->left_index].r)),
|
||||
rgb[point->left_index].r);
|
||||
else if (channel == CHANNEL_NAME_GREEN)
|
||||
result = dal_fixed31_32_add(
|
||||
dal_fixed31_32_mul(
|
||||
result = dc_fixpt_add(
|
||||
dc_fixpt_mul(
|
||||
point->coeff,
|
||||
dal_fixed31_32_sub(
|
||||
dc_fixpt_sub(
|
||||
rgb[point->right_index].g,
|
||||
rgb[point->left_index].g)),
|
||||
rgb[point->left_index].g);
|
||||
else
|
||||
result = dal_fixed31_32_add(
|
||||
dal_fixed31_32_mul(
|
||||
result = dc_fixpt_add(
|
||||
dc_fixpt_mul(
|
||||
point->coeff,
|
||||
dal_fixed31_32_sub(
|
||||
dc_fixpt_sub(
|
||||
rgb[point->right_index].b,
|
||||
rgb[point->left_index].b)),
|
||||
rgb[point->left_index].b);
|
||||
else if (point->pos == HW_POINT_POSITION_LEFT) {
|
||||
BREAK_TO_DEBUGGER();
|
||||
result = dal_fixed31_32_zero;
|
||||
result = dc_fixpt_zero;
|
||||
} else {
|
||||
BREAK_TO_DEBUGGER();
|
||||
result = dal_fixed31_32_one;
|
||||
result = dc_fixpt_one;
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -558,7 +558,7 @@ static void build_pq(struct pwl_float_data_ex *rgb_regamma,
|
||||
struct fixed31_32 x;
|
||||
struct fixed31_32 output;
|
||||
struct fixed31_32 scaling_factor =
|
||||
dal_fixed31_32_from_fraction(sdr_white_level, 10000);
|
||||
dc_fixpt_from_fraction(sdr_white_level, 10000);
|
||||
|
||||
if (!pq_initialized && sdr_white_level == 80) {
|
||||
precompute_pq();
|
||||
@@ -579,15 +579,15 @@ static void build_pq(struct pwl_float_data_ex *rgb_regamma,
|
||||
if (sdr_white_level == 80) {
|
||||
output = pq_table[i];
|
||||
} else {
|
||||
x = dal_fixed31_32_mul(coord_x->x, scaling_factor);
|
||||
x = dc_fixpt_mul(coord_x->x, scaling_factor);
|
||||
compute_pq(x, &output);
|
||||
}
|
||||
|
||||
/* should really not happen? */
|
||||
if (dal_fixed31_32_lt(output, dal_fixed31_32_zero))
|
||||
output = dal_fixed31_32_zero;
|
||||
else if (dal_fixed31_32_lt(dal_fixed31_32_one, output))
|
||||
output = dal_fixed31_32_one;
|
||||
if (dc_fixpt_lt(output, dc_fixpt_zero))
|
||||
output = dc_fixpt_zero;
|
||||
else if (dc_fixpt_lt(dc_fixpt_one, output))
|
||||
output = dc_fixpt_one;
|
||||
|
||||
rgb->r = output;
|
||||
rgb->g = output;
|
||||
@@ -605,7 +605,7 @@ static void build_de_pq(struct pwl_float_data_ex *de_pq,
|
||||
uint32_t i;
|
||||
struct fixed31_32 output;
|
||||
|
||||
struct fixed31_32 scaling_factor = dal_fixed31_32_from_int(125);
|
||||
struct fixed31_32 scaling_factor = dc_fixpt_from_int(125);
|
||||
|
||||
if (!de_pq_initialized) {
|
||||
precompute_de_pq();
|
||||
@@ -616,9 +616,9 @@ static void build_de_pq(struct pwl_float_data_ex *de_pq,
|
||||
for (i = 0; i <= hw_points_num; i++) {
|
||||
output = de_pq_table[i];
|
||||
/* should really not happen? */
|
||||
if (dal_fixed31_32_lt(output, dal_fixed31_32_zero))
|
||||
output = dal_fixed31_32_zero;
|
||||
else if (dal_fixed31_32_lt(scaling_factor, output))
|
||||
if (dc_fixpt_lt(output, dc_fixpt_zero))
|
||||
output = dc_fixpt_zero;
|
||||
else if (dc_fixpt_lt(scaling_factor, output))
|
||||
output = scaling_factor;
|
||||
de_pq[i].r = output;
|
||||
de_pq[i].g = output;
|
||||
@@ -670,9 +670,9 @@ static void build_degamma(struct pwl_float_data_ex *curve,
|
||||
end_index = begin_index + 12 * NUM_PTS_IN_REGION;
|
||||
|
||||
while (i != begin_index) {
|
||||
curve[i].r = dal_fixed31_32_zero;
|
||||
curve[i].g = dal_fixed31_32_zero;
|
||||
curve[i].b = dal_fixed31_32_zero;
|
||||
curve[i].r = dc_fixpt_zero;
|
||||
curve[i].g = dc_fixpt_zero;
|
||||
curve[i].b = dc_fixpt_zero;
|
||||
i++;
|
||||
}
|
||||
|
||||
@@ -684,9 +684,9 @@ static void build_degamma(struct pwl_float_data_ex *curve,
|
||||
i++;
|
||||
}
|
||||
while (i != hw_points_num + 1) {
|
||||
curve[i].r = dal_fixed31_32_one;
|
||||
curve[i].g = dal_fixed31_32_one;
|
||||
curve[i].b = dal_fixed31_32_one;
|
||||
curve[i].r = dc_fixpt_one;
|
||||
curve[i].g = dc_fixpt_one;
|
||||
curve[i].b = dc_fixpt_one;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@@ -695,8 +695,8 @@ static void scale_gamma(struct pwl_float_data *pwl_rgb,
|
||||
const struct dc_gamma *ramp,
|
||||
struct dividers dividers)
|
||||
{
|
||||
const struct fixed31_32 max_driver = dal_fixed31_32_from_int(0xFFFF);
|
||||
const struct fixed31_32 max_os = dal_fixed31_32_from_int(0xFF00);
|
||||
const struct fixed31_32 max_driver = dc_fixpt_from_int(0xFFFF);
|
||||
const struct fixed31_32 max_os = dc_fixpt_from_int(0xFF00);
|
||||
struct fixed31_32 scaler = max_os;
|
||||
uint32_t i;
|
||||
struct pwl_float_data *rgb = pwl_rgb;
|
||||
@@ -705,9 +705,9 @@ static void scale_gamma(struct pwl_float_data *pwl_rgb,
|
||||
i = 0;
|
||||
|
||||
do {
|
||||
if (dal_fixed31_32_lt(max_os, ramp->entries.red[i]) ||
|
||||
dal_fixed31_32_lt(max_os, ramp->entries.green[i]) ||
|
||||
dal_fixed31_32_lt(max_os, ramp->entries.blue[i])) {
|
||||
if (dc_fixpt_lt(max_os, ramp->entries.red[i]) ||
|
||||
dc_fixpt_lt(max_os, ramp->entries.green[i]) ||
|
||||
dc_fixpt_lt(max_os, ramp->entries.blue[i])) {
|
||||
scaler = max_driver;
|
||||
break;
|
||||
}
|
||||
@@ -717,40 +717,40 @@ static void scale_gamma(struct pwl_float_data *pwl_rgb,
|
||||
i = 0;
|
||||
|
||||
do {
|
||||
rgb->r = dal_fixed31_32_div(
|
||||
rgb->r = dc_fixpt_div(
|
||||
ramp->entries.red[i], scaler);
|
||||
rgb->g = dal_fixed31_32_div(
|
||||
rgb->g = dc_fixpt_div(
|
||||
ramp->entries.green[i], scaler);
|
||||
rgb->b = dal_fixed31_32_div(
|
||||
rgb->b = dc_fixpt_div(
|
||||
ramp->entries.blue[i], scaler);
|
||||
|
||||
++rgb;
|
||||
++i;
|
||||
} while (i != ramp->num_entries);
|
||||
|
||||
rgb->r = dal_fixed31_32_mul(rgb_last->r,
|
||||
rgb->r = dc_fixpt_mul(rgb_last->r,
|
||||
dividers.divider1);
|
||||
rgb->g = dal_fixed31_32_mul(rgb_last->g,
|
||||
rgb->g = dc_fixpt_mul(rgb_last->g,
|
||||
dividers.divider1);
|
||||
rgb->b = dal_fixed31_32_mul(rgb_last->b,
|
||||
rgb->b = dc_fixpt_mul(rgb_last->b,
|
||||
dividers.divider1);
|
||||
|
||||
++rgb;
|
||||
|
||||
rgb->r = dal_fixed31_32_mul(rgb_last->r,
|
||||
rgb->r = dc_fixpt_mul(rgb_last->r,
|
||||
dividers.divider2);
|
||||
rgb->g = dal_fixed31_32_mul(rgb_last->g,
|
||||
rgb->g = dc_fixpt_mul(rgb_last->g,
|
||||
dividers.divider2);
|
||||
rgb->b = dal_fixed31_32_mul(rgb_last->b,
|
||||
rgb->b = dc_fixpt_mul(rgb_last->b,
|
||||
dividers.divider2);
|
||||
|
||||
++rgb;
|
||||
|
||||
rgb->r = dal_fixed31_32_mul(rgb_last->r,
|
||||
rgb->r = dc_fixpt_mul(rgb_last->r,
|
||||
dividers.divider3);
|
||||
rgb->g = dal_fixed31_32_mul(rgb_last->g,
|
||||
rgb->g = dc_fixpt_mul(rgb_last->g,
|
||||
dividers.divider3);
|
||||
rgb->b = dal_fixed31_32_mul(rgb_last->b,
|
||||
rgb->b = dc_fixpt_mul(rgb_last->b,
|
||||
dividers.divider3);
|
||||
}
|
||||
|
||||
@@ -759,62 +759,62 @@ static void scale_gamma_dx(struct pwl_float_data *pwl_rgb,
|
||||
struct dividers dividers)
|
||||
{
|
||||
uint32_t i;
|
||||
struct fixed31_32 min = dal_fixed31_32_zero;
|
||||
struct fixed31_32 max = dal_fixed31_32_one;
|
||||
struct fixed31_32 min = dc_fixpt_zero;
|
||||
struct fixed31_32 max = dc_fixpt_one;
|
||||
|
||||
struct fixed31_32 delta = dal_fixed31_32_zero;
|
||||
struct fixed31_32 offset = dal_fixed31_32_zero;
|
||||
struct fixed31_32 delta = dc_fixpt_zero;
|
||||
struct fixed31_32 offset = dc_fixpt_zero;
|
||||
|
||||
for (i = 0 ; i < ramp->num_entries; i++) {
|
||||
if (dal_fixed31_32_lt(ramp->entries.red[i], min))
|
||||
if (dc_fixpt_lt(ramp->entries.red[i], min))
|
||||
min = ramp->entries.red[i];
|
||||
|
||||
if (dal_fixed31_32_lt(ramp->entries.green[i], min))
|
||||
if (dc_fixpt_lt(ramp->entries.green[i], min))
|
||||
min = ramp->entries.green[i];
|
||||
|
||||
if (dal_fixed31_32_lt(ramp->entries.blue[i], min))
|
||||
if (dc_fixpt_lt(ramp->entries.blue[i], min))
|
||||
min = ramp->entries.blue[i];
|
||||
|
||||
if (dal_fixed31_32_lt(max, ramp->entries.red[i]))
|
||||
if (dc_fixpt_lt(max, ramp->entries.red[i]))
|
||||
max = ramp->entries.red[i];
|
||||
|
||||
if (dal_fixed31_32_lt(max, ramp->entries.green[i]))
|
||||
if (dc_fixpt_lt(max, ramp->entries.green[i]))
|
||||
max = ramp->entries.green[i];
|
||||
|
||||
if (dal_fixed31_32_lt(max, ramp->entries.blue[i]))
|
||||
if (dc_fixpt_lt(max, ramp->entries.blue[i]))
|
||||
max = ramp->entries.blue[i];
|
||||
}
|
||||
|
||||
if (dal_fixed31_32_lt(min, dal_fixed31_32_zero))
|
||||
delta = dal_fixed31_32_neg(min);
|
||||
if (dc_fixpt_lt(min, dc_fixpt_zero))
|
||||
delta = dc_fixpt_neg(min);
|
||||
|
||||
offset = dal_fixed31_32_add(min, max);
|
||||
offset = dc_fixpt_add(min, max);
|
||||
|
||||
for (i = 0 ; i < ramp->num_entries; i++) {
|
||||
pwl_rgb[i].r = dal_fixed31_32_div(
|
||||
dal_fixed31_32_add(
|
||||
pwl_rgb[i].r = dc_fixpt_div(
|
||||
dc_fixpt_add(
|
||||
ramp->entries.red[i], delta), offset);
|
||||
pwl_rgb[i].g = dal_fixed31_32_div(
|
||||
dal_fixed31_32_add(
|
||||
pwl_rgb[i].g = dc_fixpt_div(
|
||||
dc_fixpt_add(
|
||||
ramp->entries.green[i], delta), offset);
|
||||
pwl_rgb[i].b = dal_fixed31_32_div(
|
||||
dal_fixed31_32_add(
|
||||
pwl_rgb[i].b = dc_fixpt_div(
|
||||
dc_fixpt_add(
|
||||
ramp->entries.blue[i], delta), offset);
|
||||
|
||||
}
|
||||
|
||||
pwl_rgb[i].r = dal_fixed31_32_sub(dal_fixed31_32_mul_int(
|
||||
pwl_rgb[i].r = dc_fixpt_sub(dc_fixpt_mul_int(
|
||||
pwl_rgb[i-1].r, 2), pwl_rgb[i-2].r);
|
||||
pwl_rgb[i].g = dal_fixed31_32_sub(dal_fixed31_32_mul_int(
|
||||
pwl_rgb[i].g = dc_fixpt_sub(dc_fixpt_mul_int(
|
||||
pwl_rgb[i-1].g, 2), pwl_rgb[i-2].g);
|
||||
pwl_rgb[i].b = dal_fixed31_32_sub(dal_fixed31_32_mul_int(
|
||||
pwl_rgb[i].b = dc_fixpt_sub(dc_fixpt_mul_int(
|
||||
pwl_rgb[i-1].b, 2), pwl_rgb[i-2].b);
|
||||
++i;
|
||||
pwl_rgb[i].r = dal_fixed31_32_sub(dal_fixed31_32_mul_int(
|
||||
pwl_rgb[i].r = dc_fixpt_sub(dc_fixpt_mul_int(
|
||||
pwl_rgb[i-1].r, 2), pwl_rgb[i-2].r);
|
||||
pwl_rgb[i].g = dal_fixed31_32_sub(dal_fixed31_32_mul_int(
|
||||
pwl_rgb[i].g = dc_fixpt_sub(dc_fixpt_mul_int(
|
||||
pwl_rgb[i-1].g, 2), pwl_rgb[i-2].g);
|
||||
pwl_rgb[i].b = dal_fixed31_32_sub(dal_fixed31_32_mul_int(
|
||||
pwl_rgb[i].b = dc_fixpt_sub(dc_fixpt_mul_int(
|
||||
pwl_rgb[i-1].b, 2), pwl_rgb[i-2].b);
|
||||
}
|
||||
|
||||
@@ -846,40 +846,40 @@ static void scale_user_regamma_ramp(struct pwl_float_data *pwl_rgb,
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
rgb->r = dal_fixed31_32_from_fraction(
|
||||
rgb->r = dc_fixpt_from_fraction(
|
||||
ramp->gamma[i], scaler);
|
||||
rgb->g = dal_fixed31_32_from_fraction(
|
||||
rgb->g = dc_fixpt_from_fraction(
|
||||
ramp->gamma[i + 256], scaler);
|
||||
rgb->b = dal_fixed31_32_from_fraction(
|
||||
rgb->b = dc_fixpt_from_fraction(
|
||||
ramp->gamma[i + 512], scaler);
|
||||
|
||||
++rgb;
|
||||
++i;
|
||||
} while (i != GAMMA_RGB_256_ENTRIES);
|
||||
|
||||
rgb->r = dal_fixed31_32_mul(rgb_last->r,
|
||||
rgb->r = dc_fixpt_mul(rgb_last->r,
|
||||
dividers.divider1);
|
||||
rgb->g = dal_fixed31_32_mul(rgb_last->g,
|
||||
rgb->g = dc_fixpt_mul(rgb_last->g,
|
||||
dividers.divider1);
|
||||
rgb->b = dal_fixed31_32_mul(rgb_last->b,
|
||||
rgb->b = dc_fixpt_mul(rgb_last->b,
|
||||
dividers.divider1);
|
||||
|
||||
++rgb;
|
||||
|
||||
rgb->r = dal_fixed31_32_mul(rgb_last->r,
|
||||
rgb->r = dc_fixpt_mul(rgb_last->r,
|
||||
dividers.divider2);
|
||||
rgb->g = dal_fixed31_32_mul(rgb_last->g,
|
||||
rgb->g = dc_fixpt_mul(rgb_last->g,
|
||||
dividers.divider2);
|
||||
rgb->b = dal_fixed31_32_mul(rgb_last->b,
|
||||
rgb->b = dc_fixpt_mul(rgb_last->b,
|
||||
dividers.divider2);
|
||||
|
||||
++rgb;
|
||||
|
||||
rgb->r = dal_fixed31_32_mul(rgb_last->r,
|
||||
rgb->r = dc_fixpt_mul(rgb_last->r,
|
||||
dividers.divider3);
|
||||
rgb->g = dal_fixed31_32_mul(rgb_last->g,
|
||||
rgb->g = dc_fixpt_mul(rgb_last->g,
|
||||
dividers.divider3);
|
||||
rgb->b = dal_fixed31_32_mul(rgb_last->b,
|
||||
rgb->b = dc_fixpt_mul(rgb_last->b,
|
||||
dividers.divider3);
|
||||
}
|
||||
|
||||
@@ -913,7 +913,7 @@ static void apply_lut_1d(
|
||||
struct fixed31_32 lut2;
|
||||
const int max_lut_index = 4095;
|
||||
const struct fixed31_32 max_lut_index_f =
|
||||
dal_fixed31_32_from_int_nonconst(max_lut_index);
|
||||
dc_fixpt_from_int(max_lut_index);
|
||||
int32_t index = 0, index_next = 0;
|
||||
struct fixed31_32 index_f;
|
||||
struct fixed31_32 delta_lut;
|
||||
@@ -931,10 +931,10 @@ static void apply_lut_1d(
|
||||
else
|
||||
regamma_y = &tf_pts->blue[i];
|
||||
|
||||
norm_y = dal_fixed31_32_mul(max_lut_index_f,
|
||||
norm_y = dc_fixpt_mul(max_lut_index_f,
|
||||
*regamma_y);
|
||||
index = dal_fixed31_32_floor(norm_y);
|
||||
index_f = dal_fixed31_32_from_int_nonconst(index);
|
||||
index = dc_fixpt_floor(norm_y);
|
||||
index_f = dc_fixpt_from_int(index);
|
||||
|
||||
if (index < 0 || index > max_lut_index)
|
||||
continue;
|
||||
@@ -953,11 +953,11 @@ static void apply_lut_1d(
|
||||
}
|
||||
|
||||
// we have everything now, so interpolate
|
||||
delta_lut = dal_fixed31_32_sub(lut2, lut1);
|
||||
delta_index = dal_fixed31_32_sub(norm_y, index_f);
|
||||
delta_lut = dc_fixpt_sub(lut2, lut1);
|
||||
delta_index = dc_fixpt_sub(norm_y, index_f);
|
||||
|
||||
*regamma_y = dal_fixed31_32_add(lut1,
|
||||
dal_fixed31_32_mul(delta_index, delta_lut));
|
||||
*regamma_y = dc_fixpt_add(lut1,
|
||||
dc_fixpt_mul(delta_index, delta_lut));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -973,7 +973,7 @@ static void build_evenly_distributed_points(
|
||||
uint32_t i = 0;
|
||||
|
||||
do {
|
||||
struct fixed31_32 value = dal_fixed31_32_from_fraction(i,
|
||||
struct fixed31_32 value = dc_fixpt_from_fraction(i,
|
||||
numberof_points - 1);
|
||||
|
||||
p->r = value;
|
||||
@@ -984,21 +984,21 @@ static void build_evenly_distributed_points(
|
||||
++i;
|
||||
} while (i != numberof_points);
|
||||
|
||||
p->r = dal_fixed31_32_div(p_last->r, dividers.divider1);
|
||||
p->g = dal_fixed31_32_div(p_last->g, dividers.divider1);
|
||||
p->b = dal_fixed31_32_div(p_last->b, dividers.divider1);
|
||||
p->r = dc_fixpt_div(p_last->r, dividers.divider1);
|
||||
p->g = dc_fixpt_div(p_last->g, dividers.divider1);
|
||||
p->b = dc_fixpt_div(p_last->b, dividers.divider1);
|
||||
|
||||
++p;
|
||||
|
||||
p->r = dal_fixed31_32_div(p_last->r, dividers.divider2);
|
||||
p->g = dal_fixed31_32_div(p_last->g, dividers.divider2);
|
||||
p->b = dal_fixed31_32_div(p_last->b, dividers.divider2);
|
||||
p->r = dc_fixpt_div(p_last->r, dividers.divider2);
|
||||
p->g = dc_fixpt_div(p_last->g, dividers.divider2);
|
||||
p->b = dc_fixpt_div(p_last->b, dividers.divider2);
|
||||
|
||||
++p;
|
||||
|
||||
p->r = dal_fixed31_32_div(p_last->r, dividers.divider3);
|
||||
p->g = dal_fixed31_32_div(p_last->g, dividers.divider3);
|
||||
p->b = dal_fixed31_32_div(p_last->b, dividers.divider3);
|
||||
p->r = dc_fixpt_div(p_last->r, dividers.divider3);
|
||||
p->g = dc_fixpt_div(p_last->g, dividers.divider3);
|
||||
p->b = dc_fixpt_div(p_last->b, dividers.divider3);
|
||||
}
|
||||
|
||||
static inline void copy_rgb_regamma_to_coordinates_x(
|
||||
@@ -1094,7 +1094,7 @@ static void interpolate_user_regamma(uint32_t hw_points_num,
|
||||
struct fixed31_32 *tf_point;
|
||||
struct fixed31_32 hw_x;
|
||||
struct fixed31_32 norm_factor =
|
||||
dal_fixed31_32_from_int_nonconst(255);
|
||||
dc_fixpt_from_int(255);
|
||||
struct fixed31_32 norm_x;
|
||||
struct fixed31_32 index_f;
|
||||
struct fixed31_32 lut1;
|
||||
@@ -1105,9 +1105,9 @@ static void interpolate_user_regamma(uint32_t hw_points_num,
|
||||
i = 0;
|
||||
/* fixed_pt library has problems handling too small values */
|
||||
while (i != 32) {
|
||||
tf_pts->red[i] = dal_fixed31_32_zero;
|
||||
tf_pts->green[i] = dal_fixed31_32_zero;
|
||||
tf_pts->blue[i] = dal_fixed31_32_zero;
|
||||
tf_pts->red[i] = dc_fixpt_zero;
|
||||
tf_pts->green[i] = dc_fixpt_zero;
|
||||
tf_pts->blue[i] = dc_fixpt_zero;
|
||||
++i;
|
||||
}
|
||||
while (i <= hw_points_num + 1) {
|
||||
@@ -1129,12 +1129,12 @@ static void interpolate_user_regamma(uint32_t hw_points_num,
|
||||
} else
|
||||
hw_x = coordinates_x[i].x;
|
||||
|
||||
norm_x = dal_fixed31_32_mul(norm_factor, hw_x);
|
||||
index = dal_fixed31_32_floor(norm_x);
|
||||
norm_x = dc_fixpt_mul(norm_factor, hw_x);
|
||||
index = dc_fixpt_floor(norm_x);
|
||||
if (index < 0 || index > 255)
|
||||
continue;
|
||||
|
||||
index_f = dal_fixed31_32_from_int_nonconst(index);
|
||||
index_f = dc_fixpt_from_int(index);
|
||||
index_next = (index == 255) ? index : index + 1;
|
||||
|
||||
if (color == 0) {
|
||||
@@ -1149,11 +1149,11 @@ static void interpolate_user_regamma(uint32_t hw_points_num,
|
||||
}
|
||||
|
||||
// we have everything now, so interpolate
|
||||
delta_lut = dal_fixed31_32_sub(lut2, lut1);
|
||||
delta_index = dal_fixed31_32_sub(norm_x, index_f);
|
||||
delta_lut = dc_fixpt_sub(lut2, lut1);
|
||||
delta_index = dc_fixpt_sub(norm_x, index_f);
|
||||
|
||||
*tf_point = dal_fixed31_32_add(lut1,
|
||||
dal_fixed31_32_mul(delta_index, delta_lut));
|
||||
*tf_point = dc_fixpt_add(lut1,
|
||||
dc_fixpt_mul(delta_index, delta_lut));
|
||||
}
|
||||
++i;
|
||||
}
|
||||
@@ -1168,15 +1168,15 @@ static void build_new_custom_resulted_curve(
|
||||
i = 0;
|
||||
|
||||
while (i != hw_points_num + 1) {
|
||||
tf_pts->red[i] = dal_fixed31_32_clamp(
|
||||
tf_pts->red[i], dal_fixed31_32_zero,
|
||||
dal_fixed31_32_one);
|
||||
tf_pts->green[i] = dal_fixed31_32_clamp(
|
||||
tf_pts->green[i], dal_fixed31_32_zero,
|
||||
dal_fixed31_32_one);
|
||||
tf_pts->blue[i] = dal_fixed31_32_clamp(
|
||||
tf_pts->blue[i], dal_fixed31_32_zero,
|
||||
dal_fixed31_32_one);
|
||||
tf_pts->red[i] = dc_fixpt_clamp(
|
||||
tf_pts->red[i], dc_fixpt_zero,
|
||||
dc_fixpt_one);
|
||||
tf_pts->green[i] = dc_fixpt_clamp(
|
||||
tf_pts->green[i], dc_fixpt_zero,
|
||||
dc_fixpt_one);
|
||||
tf_pts->blue[i] = dc_fixpt_clamp(
|
||||
tf_pts->blue[i], dc_fixpt_zero,
|
||||
dc_fixpt_one);
|
||||
|
||||
++i;
|
||||
}
|
||||
@@ -1290,9 +1290,9 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
|
||||
if (!coeff)
|
||||
goto coeff_alloc_fail;
|
||||
|
||||
dividers.divider1 = dal_fixed31_32_from_fraction(3, 2);
|
||||
dividers.divider2 = dal_fixed31_32_from_int(2);
|
||||
dividers.divider3 = dal_fixed31_32_from_fraction(5, 2);
|
||||
dividers.divider1 = dc_fixpt_from_fraction(3, 2);
|
||||
dividers.divider2 = dc_fixpt_from_int(2);
|
||||
dividers.divider3 = dc_fixpt_from_fraction(5, 2);
|
||||
|
||||
tf = output_tf->tf;
|
||||
|
||||
@@ -1357,15 +1357,15 @@ bool calculate_user_regamma_coeff(struct dc_transfer_func *output_tf,
|
||||
uint32_t i = 0;
|
||||
|
||||
do {
|
||||
coeff.a0[i] = dal_fixed31_32_from_fraction(
|
||||
coeff.a0[i] = dc_fixpt_from_fraction(
|
||||
regamma->coeff.A0[i], 10000000);
|
||||
coeff.a1[i] = dal_fixed31_32_from_fraction(
|
||||
coeff.a1[i] = dc_fixpt_from_fraction(
|
||||
regamma->coeff.A1[i], 1000);
|
||||
coeff.a2[i] = dal_fixed31_32_from_fraction(
|
||||
coeff.a2[i] = dc_fixpt_from_fraction(
|
||||
regamma->coeff.A2[i], 1000);
|
||||
coeff.a3[i] = dal_fixed31_32_from_fraction(
|
||||
coeff.a3[i] = dc_fixpt_from_fraction(
|
||||
regamma->coeff.A3[i], 1000);
|
||||
coeff.user_gamma[i] = dal_fixed31_32_from_fraction(
|
||||
coeff.user_gamma[i] = dc_fixpt_from_fraction(
|
||||
regamma->coeff.gamma[i], 1000);
|
||||
|
||||
++i;
|
||||
@@ -1374,9 +1374,9 @@ bool calculate_user_regamma_coeff(struct dc_transfer_func *output_tf,
|
||||
i = 0;
|
||||
/* fixed_pt library has problems handling too small values */
|
||||
while (i != 32) {
|
||||
output_tf->tf_pts.red[i] = dal_fixed31_32_zero;
|
||||
output_tf->tf_pts.green[i] = dal_fixed31_32_zero;
|
||||
output_tf->tf_pts.blue[i] = dal_fixed31_32_zero;
|
||||
output_tf->tf_pts.red[i] = dc_fixpt_zero;
|
||||
output_tf->tf_pts.green[i] = dc_fixpt_zero;
|
||||
output_tf->tf_pts.blue[i] = dc_fixpt_zero;
|
||||
++coord_x;
|
||||
++i;
|
||||
}
|
||||
@@ -1423,9 +1423,9 @@ bool calculate_user_regamma_ramp(struct dc_transfer_func *output_tf,
|
||||
if (!rgb_regamma)
|
||||
goto rgb_regamma_alloc_fail;
|
||||
|
||||
dividers.divider1 = dal_fixed31_32_from_fraction(3, 2);
|
||||
dividers.divider2 = dal_fixed31_32_from_int(2);
|
||||
dividers.divider3 = dal_fixed31_32_from_fraction(5, 2);
|
||||
dividers.divider1 = dc_fixpt_from_fraction(3, 2);
|
||||
dividers.divider2 = dc_fixpt_from_int(2);
|
||||
dividers.divider3 = dc_fixpt_from_fraction(5, 2);
|
||||
|
||||
scale_user_regamma_ramp(rgb_user, ®amma->ramp, dividers);
|
||||
|
||||
@@ -1496,9 +1496,9 @@ bool mod_color_calculate_degamma_params(struct dc_transfer_func *input_tf,
|
||||
if (!coeff)
|
||||
goto coeff_alloc_fail;
|
||||
|
||||
dividers.divider1 = dal_fixed31_32_from_fraction(3, 2);
|
||||
dividers.divider2 = dal_fixed31_32_from_int(2);
|
||||
dividers.divider3 = dal_fixed31_32_from_fraction(5, 2);
|
||||
dividers.divider1 = dc_fixpt_from_fraction(3, 2);
|
||||
dividers.divider2 = dc_fixpt_from_int(2);
|
||||
dividers.divider3 = dc_fixpt_from_fraction(5, 2);
|
||||
|
||||
tf = input_tf->tf;
|
||||
|
||||
|
@@ -46,6 +46,10 @@ void mod_stats_dump(struct mod_stats *mod_stats);
|
||||
|
||||
void mod_stats_reset_data(struct mod_stats *mod_stats);
|
||||
|
||||
void mod_stats_update_event(struct mod_stats *mod_stats,
|
||||
char *event_string,
|
||||
unsigned int length);
|
||||
|
||||
void mod_stats_update_flip(struct mod_stats *mod_stats,
|
||||
unsigned long timestamp_in_ns);
|
||||
|
||||
|
@@ -36,9 +36,14 @@
|
||||
#define DAL_STATS_ENTRIES_REGKEY_DEFAULT 0x00350000
|
||||
#define DAL_STATS_ENTRIES_REGKEY_MAX 0x01000000
|
||||
|
||||
#define DAL_STATS_EVENT_ENTRIES_DEFAULT 0x00000100
|
||||
|
||||
#define MOD_STATS_NUM_VSYNCS 5
|
||||
#define MOD_STATS_EVENT_STRING_MAX 512
|
||||
|
||||
struct stats_time_cache {
|
||||
unsigned int entry_id;
|
||||
|
||||
unsigned long flip_timestamp_in_ns;
|
||||
unsigned long vupdate_timestamp_in_ns;
|
||||
|
||||
@@ -63,15 +68,26 @@ struct stats_time_cache {
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
struct stats_event_cache {
|
||||
unsigned int entry_id;
|
||||
char event_string[MOD_STATS_EVENT_STRING_MAX];
|
||||
};
|
||||
|
||||
struct core_stats {
|
||||
struct mod_stats public;
|
||||
struct dc *dc;
|
||||
|
||||
bool enabled;
|
||||
unsigned int entries;
|
||||
unsigned int event_entries;
|
||||
unsigned int entry_id;
|
||||
|
||||
struct stats_time_cache *time;
|
||||
unsigned int index;
|
||||
|
||||
bool enabled;
|
||||
unsigned int entries;
|
||||
struct stats_event_cache *events;
|
||||
unsigned int event_index;
|
||||
|
||||
};
|
||||
|
||||
#define MOD_STATS_TO_CORE(mod_stats)\
|
||||
@@ -99,12 +115,12 @@ struct mod_stats *mod_stats_create(struct dc *dc)
|
||||
unsigned int reg_data;
|
||||
int i = 0;
|
||||
|
||||
if (dc == NULL)
|
||||
goto fail_construct;
|
||||
|
||||
core_stats = kzalloc(sizeof(struct core_stats), GFP_KERNEL);
|
||||
|
||||
if (core_stats == NULL)
|
||||
goto fail_alloc_context;
|
||||
|
||||
if (dc == NULL)
|
||||
goto fail_construct;
|
||||
|
||||
core_stats->dc = dc;
|
||||
@@ -125,27 +141,45 @@ struct mod_stats *mod_stats_create(struct dc *dc)
|
||||
else
|
||||
core_stats->entries = reg_data;
|
||||
}
|
||||
|
||||
core_stats->time = kzalloc(sizeof(struct stats_time_cache) * core_stats->entries,
|
||||
core_stats->time = kzalloc(
|
||||
sizeof(struct stats_time_cache) *
|
||||
core_stats->entries,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (core_stats->time == NULL)
|
||||
goto fail_construct_time;
|
||||
|
||||
core_stats->event_entries = DAL_STATS_EVENT_ENTRIES_DEFAULT;
|
||||
core_stats->events = kzalloc(
|
||||
sizeof(struct stats_event_cache) *
|
||||
core_stats->event_entries,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (core_stats->events == NULL)
|
||||
goto fail_construct_events;
|
||||
|
||||
} else {
|
||||
core_stats->entries = 0;
|
||||
}
|
||||
|
||||
if (core_stats->time == NULL)
|
||||
goto fail_construct;
|
||||
|
||||
/* Purposely leave index 0 unused so we don't need special logic to
|
||||
* handle calculation cases that depend on previous flip data.
|
||||
*/
|
||||
core_stats->index = 1;
|
||||
core_stats->event_index = 0;
|
||||
|
||||
// Keeps track of ordering within the different stats structures
|
||||
core_stats->entry_id = 0;
|
||||
|
||||
return &core_stats->public;
|
||||
|
||||
fail_construct:
|
||||
fail_construct_events:
|
||||
kfree(core_stats->time);
|
||||
|
||||
fail_construct_time:
|
||||
kfree(core_stats);
|
||||
|
||||
fail_alloc_context:
|
||||
fail_construct:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -157,6 +191,9 @@ void mod_stats_destroy(struct mod_stats *mod_stats)
|
||||
if (core_stats->time != NULL)
|
||||
kfree(core_stats->time);
|
||||
|
||||
if (core_stats->events != NULL)
|
||||
kfree(core_stats->events);
|
||||
|
||||
kfree(core_stats);
|
||||
}
|
||||
}
|
||||
@@ -167,7 +204,11 @@ void mod_stats_dump(struct mod_stats *mod_stats)
|
||||
struct dal_logger *logger = NULL;
|
||||
struct core_stats *core_stats = NULL;
|
||||
struct stats_time_cache *time = NULL;
|
||||
struct stats_event_cache *events = NULL;
|
||||
unsigned int time_index = 1;
|
||||
unsigned int event_index = 0;
|
||||
unsigned int index = 0;
|
||||
struct log_entry log_entry;
|
||||
|
||||
if (mod_stats == NULL)
|
||||
return;
|
||||
@@ -176,45 +217,62 @@ void mod_stats_dump(struct mod_stats *mod_stats)
|
||||
dc = core_stats->dc;
|
||||
logger = dc->ctx->logger;
|
||||
time = core_stats->time;
|
||||
events = core_stats->events;
|
||||
|
||||
//LogEntry* pLog = GetLog()->Open(LogMajor_ISR, LogMinor_ISR_FreeSyncSW);
|
||||
DISPLAY_STATS_BEGIN(log_entry);
|
||||
|
||||
//if (!pLog->IsDummyEntry())
|
||||
{
|
||||
dm_logger_write(logger, LOG_PROFILING, "==Display Caps==\n");
|
||||
dm_logger_write(logger, LOG_PROFILING, "\n");
|
||||
dm_logger_write(logger, LOG_PROFILING, "\n");
|
||||
DISPLAY_STATS("==Display Caps==\n");
|
||||
|
||||
dm_logger_write(logger, LOG_PROFILING, "==Stats==\n");
|
||||
dm_logger_write(logger, LOG_PROFILING,
|
||||
"render avgRender minWindow midPoint maxWindow vsyncToFlip flipToVsync #vsyncBetweenFlip #frame insertDuration vTotalMin vTotalMax eventTrigs vSyncTime1 vSyncTime2 vSyncTime3 vSyncTime4 vSyncTime5 flags\n");
|
||||
DISPLAY_STATS("==Display Stats==\n");
|
||||
|
||||
for (int i = 0; i < core_stats->index && i < core_stats->entries; i++) {
|
||||
dm_logger_write(logger, LOG_PROFILING,
|
||||
"%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
|
||||
time[i].render_time_in_us,
|
||||
time[i].avg_render_time_in_us_last_ten,
|
||||
time[i].min_window,
|
||||
time[i].lfc_mid_point_in_us,
|
||||
time[i].max_window,
|
||||
time[i].vsync_to_flip_time_in_us,
|
||||
time[i].flip_to_vsync_time_in_us,
|
||||
time[i].num_vsync_between_flips,
|
||||
time[i].num_frames_inserted,
|
||||
time[i].inserted_duration_in_us,
|
||||
time[i].v_total_min,
|
||||
time[i].v_total_max,
|
||||
time[i].event_triggers,
|
||||
time[i].v_sync_time_in_us[0],
|
||||
time[i].v_sync_time_in_us[1],
|
||||
time[i].v_sync_time_in_us[2],
|
||||
time[i].v_sync_time_in_us[3],
|
||||
time[i].v_sync_time_in_us[4],
|
||||
time[i].flags);
|
||||
DISPLAY_STATS("%10s %10s %10s %10s %10s"
|
||||
" %11s %11s %17s %10s %14s"
|
||||
" %10s %10s %10s %10s %10s"
|
||||
" %10s %10s %10s %10s\n",
|
||||
"render", "avgRender",
|
||||
"minWindow", "midPoint", "maxWindow",
|
||||
"vsyncToFlip", "flipToVsync", "vsyncsBetweenFlip",
|
||||
"numFrame", "insertDuration",
|
||||
"vTotalMin", "vTotalMax", "eventTrigs",
|
||||
"vSyncTime1", "vSyncTime2", "vSyncTime3",
|
||||
"vSyncTime4", "vSyncTime5", "flags");
|
||||
|
||||
for (int i = 0; i < core_stats->entry_id; i++) {
|
||||
if (event_index < core_stats->event_index &&
|
||||
i == events[event_index].entry_id) {
|
||||
DISPLAY_STATS("%s\n", events[event_index].event_string);
|
||||
event_index++;
|
||||
} else if (time_index < core_stats->index &&
|
||||
i == time[time_index].entry_id) {
|
||||
DISPLAY_STATS("%10u %10u %10u %10u %10u"
|
||||
" %11u %11u %17u %10u %14u"
|
||||
" %10u %10u %10u %10u %10u"
|
||||
" %10u %10u %10u %10u\n",
|
||||
time[time_index].render_time_in_us,
|
||||
time[time_index].avg_render_time_in_us_last_ten,
|
||||
time[time_index].min_window,
|
||||
time[time_index].lfc_mid_point_in_us,
|
||||
time[time_index].max_window,
|
||||
time[time_index].vsync_to_flip_time_in_us,
|
||||
time[time_index].flip_to_vsync_time_in_us,
|
||||
time[time_index].num_vsync_between_flips,
|
||||
time[time_index].num_frames_inserted,
|
||||
time[time_index].inserted_duration_in_us,
|
||||
time[time_index].v_total_min,
|
||||
time[time_index].v_total_max,
|
||||
time[time_index].event_triggers,
|
||||
time[time_index].v_sync_time_in_us[0],
|
||||
time[time_index].v_sync_time_in_us[1],
|
||||
time[time_index].v_sync_time_in_us[2],
|
||||
time[time_index].v_sync_time_in_us[3],
|
||||
time[time_index].v_sync_time_in_us[4],
|
||||
time[time_index].flags);
|
||||
|
||||
time_index++;
|
||||
}
|
||||
}
|
||||
//GetLog()->Close(pLog);
|
||||
//GetLog()->UnSetLogMask(LogMajor_ISR, LogMinor_ISR_FreeSyncSW);
|
||||
|
||||
DISPLAY_STATS_END(log_entry);
|
||||
}
|
||||
|
||||
void mod_stats_reset_data(struct mod_stats *mod_stats)
|
||||
@@ -231,7 +289,46 @@ void mod_stats_reset_data(struct mod_stats *mod_stats)
|
||||
memset(core_stats->time, 0,
|
||||
sizeof(struct stats_time_cache) * core_stats->entries);
|
||||
|
||||
memset(core_stats->events, 0,
|
||||
sizeof(struct stats_event_cache) * core_stats->event_entries);
|
||||
|
||||
core_stats->index = 1;
|
||||
core_stats->event_index = 0;
|
||||
|
||||
// Keeps track of ordering within the different stats structures
|
||||
core_stats->entry_id = 0;
|
||||
}
|
||||
|
||||
void mod_stats_update_event(struct mod_stats *mod_stats,
|
||||
char *event_string,
|
||||
unsigned int length)
|
||||
{
|
||||
struct core_stats *core_stats = NULL;
|
||||
struct stats_event_cache *events = NULL;
|
||||
unsigned int index = 0;
|
||||
unsigned int copy_length = 0;
|
||||
|
||||
if (mod_stats == NULL)
|
||||
return;
|
||||
|
||||
core_stats = MOD_STATS_TO_CORE(mod_stats);
|
||||
|
||||
if (core_stats->event_index >= core_stats->event_entries)
|
||||
return;
|
||||
|
||||
events = core_stats->events;
|
||||
index = core_stats->event_index;
|
||||
|
||||
copy_length = length;
|
||||
if (length > MOD_STATS_EVENT_STRING_MAX)
|
||||
copy_length = MOD_STATS_EVENT_STRING_MAX;
|
||||
|
||||
memcpy(&events[index].event_string, event_string, copy_length);
|
||||
events[index].event_string[copy_length - 1] = '\0';
|
||||
|
||||
events[index].entry_id = core_stats->entry_id;
|
||||
core_stats->event_index++;
|
||||
core_stats->entry_id++;
|
||||
}
|
||||
|
||||
void mod_stats_update_flip(struct mod_stats *mod_stats,
|
||||
@@ -272,7 +369,9 @@ void mod_stats_update_flip(struct mod_stats *mod_stats,
|
||||
(timestamp_in_ns -
|
||||
time[index - 1].vupdate_timestamp_in_ns) / 1000;
|
||||
|
||||
time[index].entry_id = core_stats->entry_id;
|
||||
core_stats->index++;
|
||||
core_stats->entry_id++;
|
||||
}
|
||||
|
||||
void mod_stats_update_vupdate(struct mod_stats *mod_stats,
|
||||
|
Reference in New Issue
Block a user