Merge "disp: msm: sde: update qos cpu mask to avoid defective cores"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
002c8e6f63
@@ -4573,12 +4573,44 @@ static void _sde_perf_parse_dt_cfg_populate(struct sde_mdss_cfg *cfg,
|
|||||||
DEFAULT_AXI_BUS_WIDTH;
|
DEFAULT_AXI_BUS_WIDTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _sde_set_possible_cpu_mask - checks defective cores in qos mask and update the
|
||||||
|
* mask to avoid defective cores and add next possible cores for pm qos vote.
|
||||||
|
* @qos_mask: qos_mask set from DT
|
||||||
|
*/
|
||||||
|
static int _sde_set_possible_cpu_mask(unsigned long qos_mask)
|
||||||
|
{
|
||||||
|
int cpu = 0, defective_cores_count = 0;
|
||||||
|
struct cpumask *cpu_qos_mask = to_cpumask(&qos_mask);
|
||||||
|
unsigned long cpu_p_mask = cpu_possible_mask->bits[0];
|
||||||
|
unsigned long cpu_defective_qos = qos_mask & (~cpu_p_mask);
|
||||||
|
|
||||||
|
/* Count all the defective cores in cpu_defective_qos */
|
||||||
|
defective_cores_count = cpumask_weight(to_cpumask(&cpu_defective_qos));
|
||||||
|
|
||||||
|
for_each_cpu(cpu, cpu_all_mask) {
|
||||||
|
if (cpu_possible(cpu) && !cpumask_test_cpu(cpu, cpu_qos_mask) &&
|
||||||
|
defective_cores_count > 0) {
|
||||||
|
/* Set next possible cpu */
|
||||||
|
cpumask_set_cpu(cpu, cpu_qos_mask);
|
||||||
|
defective_cores_count--;
|
||||||
|
} else if (cpumask_test_cpu(cpu, cpu_qos_mask) && !cpu_possible(cpu)) {
|
||||||
|
/* Unset the defective core from qos mask */
|
||||||
|
cpumask_clear_cpu(cpu, cpu_qos_mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qos_mask = cpu_qos_mask->bits[0];
|
||||||
|
return qos_mask;
|
||||||
|
}
|
||||||
|
|
||||||
static int _sde_perf_parse_dt_cfg(struct device_node *np,
|
static int _sde_perf_parse_dt_cfg(struct device_node *np,
|
||||||
struct sde_mdss_cfg *cfg, int *prop_count,
|
struct sde_mdss_cfg *cfg, int *prop_count,
|
||||||
struct sde_prop_value *prop_value, bool *prop_exists)
|
struct sde_prop_value *prop_value, bool *prop_exists)
|
||||||
{
|
{
|
||||||
int rc, j;
|
int rc, j;
|
||||||
const char *str = NULL;
|
const char *str = NULL;
|
||||||
|
unsigned long qos_mask = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following performance parameters (e.g. core_ib_ff) are
|
* The following performance parameters (e.g. core_ib_ff) are
|
||||||
@@ -4622,14 +4654,16 @@ static int _sde_perf_parse_dt_cfg(struct device_node *np,
|
|||||||
set_bit(SDE_FEATURE_CDP, cfg->features);
|
set_bit(SDE_FEATURE_CDP, cfg->features);
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg->perf.cpu_mask =
|
qos_mask = prop_exists[PERF_CPU_MASK] ?
|
||||||
prop_exists[PERF_CPU_MASK] ?
|
|
||||||
PROP_VALUE_ACCESS(prop_value, PERF_CPU_MASK, 0) :
|
PROP_VALUE_ACCESS(prop_value, PERF_CPU_MASK, 0) :
|
||||||
DEFAULT_CPU_MASK;
|
DEFAULT_CPU_MASK;
|
||||||
cfg->perf.cpu_mask_perf =
|
cfg->perf.cpu_mask = _sde_set_possible_cpu_mask(qos_mask);
|
||||||
prop_exists[CPU_MASK_PERF] ?
|
|
||||||
|
qos_mask = prop_exists[CPU_MASK_PERF] ?
|
||||||
PROP_VALUE_ACCESS(prop_value, CPU_MASK_PERF, 0) :
|
PROP_VALUE_ACCESS(prop_value, CPU_MASK_PERF, 0) :
|
||||||
DEFAULT_CPU_MASK;
|
DEFAULT_CPU_MASK;
|
||||||
|
cfg->perf.cpu_mask_perf = _sde_set_possible_cpu_mask(qos_mask);
|
||||||
|
|
||||||
cfg->perf.cpu_dma_latency =
|
cfg->perf.cpu_dma_latency =
|
||||||
prop_exists[PERF_CPU_DMA_LATENCY] ?
|
prop_exists[PERF_CPU_DMA_LATENCY] ?
|
||||||
PROP_VALUE_ACCESS(prop_value, PERF_CPU_DMA_LATENCY, 0) :
|
PROP_VALUE_ACCESS(prop_value, PERF_CPU_DMA_LATENCY, 0) :
|
||||||
|
Reference in New Issue
Block a user