Merge "disp: msm: dp: Ensure peak pxl rate does not exceed maximum supported by sink"

This commit is contained in:
qctecmdr
2019-06-19 05:21:38 -07:00
committed by Gerrit - the friendly Code Review server

View File

@@ -1522,6 +1522,11 @@ struct dp_dsc_slices_per_line {
u8 num_slices; u8 num_slices;
}; };
struct dp_dsc_peak_throughput {
u32 index;
u32 peak_throughput;
};
struct dp_dsc_slices_per_line slice_per_line_tbl[] = { struct dp_dsc_slices_per_line slice_per_line_tbl[] = {
{0, 340, 1 }, {0, 340, 1 },
{340, 680, 2 }, {340, 680, 2 },
@@ -1533,6 +1538,24 @@ struct dp_dsc_slices_per_line slice_per_line_tbl[] = {
{8000, 9600, 24 } {8000, 9600, 24 }
}; };
const struct dp_dsc_peak_throughput peak_throughput_mode_0_tbl[] = {
{0, 0},
{1, 340},
{2, 400},
{3, 450},
{4, 500},
{5, 550},
{6, 600},
{7, 650},
{8, 700},
{9, 750},
{10, 800},
{11, 850},
{12, 900},
{13, 950},
{14, 1000},
};
static int dp_panel_dsc_prepare_basic_params( static int dp_panel_dsc_prepare_basic_params(
struct msm_compression_info *comp_info, struct msm_compression_info *comp_info,
const struct dp_display_mode *dp_mode, const struct dp_display_mode *dp_mode,
@@ -1540,9 +1563,13 @@ static int dp_panel_dsc_prepare_basic_params(
{ {
int i; int i;
struct dp_dsc_slices_per_line *rec; struct dp_dsc_slices_per_line *rec;
int slice_width; const struct dp_dsc_peak_throughput *tput;
u32 slice_width;
u32 ppr = dp_mode->timing.pixel_clk_khz/1000; u32 ppr = dp_mode->timing.pixel_clk_khz/1000;
int max_slice_width; u32 max_slice_width;
u32 ppr_max_index;
u32 peak_throughput;
u32 ppr_per_slice;
comp_info->dsc_info.slice_per_pkt = 0; comp_info->dsc_info.slice_per_pkt = 0;
for (i = 0; i < ARRAY_SIZE(slice_per_line_tbl); i++) { for (i = 0; i < ARRAY_SIZE(slice_per_line_tbl); i++) {
@@ -1557,11 +1584,23 @@ static int dp_panel_dsc_prepare_basic_params(
if (comp_info->dsc_info.slice_per_pkt == 0) if (comp_info->dsc_info.slice_per_pkt == 0)
return -EINVAL; return -EINVAL;
ppr_max_index = dp_panel->dsc_dpcd[11] &= 0xf;
if (!ppr_max_index || ppr_max_index >= 15) {
pr_debug("Throughput mode 0 not supported");
return -EINVAL;
}
tput = &peak_throughput_mode_0_tbl[ppr_max_index];
peak_throughput = tput->peak_throughput;
max_slice_width = dp_panel->dsc_dpcd[12] * 320; max_slice_width = dp_panel->dsc_dpcd[12] * 320;
slice_width = (dp_mode->timing.h_active / slice_width = (dp_mode->timing.h_active /
comp_info->dsc_info.slice_per_pkt); comp_info->dsc_info.slice_per_pkt);
while (slice_width >= max_slice_width) { ppr_per_slice = ppr/comp_info->dsc_info.slice_per_pkt;
while (slice_width >= max_slice_width ||
ppr_per_slice > peak_throughput) {
if (i == ARRAY_SIZE(slice_per_line_tbl)) if (i == ARRAY_SIZE(slice_per_line_tbl))
return -EINVAL; return -EINVAL;
@@ -1569,6 +1608,7 @@ static int dp_panel_dsc_prepare_basic_params(
comp_info->dsc_info.slice_per_pkt = rec->num_slices; comp_info->dsc_info.slice_per_pkt = rec->num_slices;
slice_width = (dp_mode->timing.h_active / slice_width = (dp_mode->timing.h_active /
comp_info->dsc_info.slice_per_pkt); comp_info->dsc_info.slice_per_pkt);
ppr_per_slice = ppr/comp_info->dsc_info.slice_per_pkt;
i++; i++;
} }