mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
soc: qcom: llcc: Fix dis_cap_alloc and retain_on_pc configuration
Commitc14e64b469
("soc: qcom: llcc: Support chipsets that can write to llcc") add the support for chipset where capacity based allocation and retention through power collapse can be programmed based on content of SCT table mentioned in the llcc driver where the target like sdm845 where the entire programming related to it is controlled in firmware. However, the commit introduces a bug where capacity/retention register get overwritten each time it gets programmed for each slice and that results in misconfiguration of the register based on SCT table and that is not expected behaviour instead it should be read modify write to retain the configuration of other slices. This issue is totally caught from code review and programming test and not through any power/perf numbers so, it is not known what impact this could make if we don't have this change however, this feature are for these targets and they should have been programmed accordingly as per their configuration mentioned in SCT table like others bits information. This change brings one difference where it keeps capacity/retention bits of the slices that are not mentioned in SCT table in unknown state where as earlier it was initialized to zero. Fixes:c14e64b469
("soc: qcom: llcc: Support chipsets that can write to llcc") Signed-off-by: Atul Dhudase <quic_adhudase@quicinc.com> Signed-off-by: Mukesh Ojha <quic_mojha@quicinc.com> Reviewed-by: Douglas Anderson <dianders@chromium.org> Link: https://lore.kernel.org/r/1701876771-10695-1-git-send-email-quic_mojha@quicinc.com Signed-off-by: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
parent
fbfd1f55ad
commit
eed6e57e9f
@ -1034,15 +1034,15 @@ static int _qcom_llcc_cfg_program(const struct llcc_slice_config *config,
|
||||
u32 disable_cap_alloc, retain_pc;
|
||||
|
||||
disable_cap_alloc = config->dis_cap_alloc << config->slice_id;
|
||||
ret = regmap_write(drv_data->bcast_regmap,
|
||||
LLCC_TRP_SCID_DIS_CAP_ALLOC, disable_cap_alloc);
|
||||
ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_SCID_DIS_CAP_ALLOC,
|
||||
BIT(config->slice_id), disable_cap_alloc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (drv_data->version < LLCC_VERSION_4_1_0_0) {
|
||||
retain_pc = config->retain_on_pc << config->slice_id;
|
||||
ret = regmap_write(drv_data->bcast_regmap,
|
||||
LLCC_TRP_PCB_ACT, retain_pc);
|
||||
ret = regmap_update_bits(drv_data->bcast_regmap, LLCC_TRP_PCB_ACT,
|
||||
BIT(config->slice_id), retain_pc);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user