soc: qcom: llcc: Do not create EDAC platform device on SDM845
[ Upstream commit cca94f1dd6d0a4c7e5c8190672f5747e3c00ddde ] The platforms based on SDM845 SoC locks the access to EDAC registers in the bootloader. So probing the EDAC driver will result in a crash. Hence, disable the creation of EDAC platform device on all SDM845 devices. The issue has been observed on Lenovo Yoga C630 and DB845c. While at it, also sort the members of `struct qcom_llcc_config` to avoid any holes in-between. Cc: <stable@vger.kernel.org> # 5.10 Reported-by: Steev Klimaszewski <steev@kali.org> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Signed-off-by: Bjorn Andersson <andersson@kernel.org> Link: https://lore.kernel.org/r/20230314080443.64635-15-manivannan.sadhasivam@linaro.org Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
bf9712195f
commit
b12078b67a
@ -101,10 +101,11 @@ struct llcc_slice_config {
|
|||||||
|
|
||||||
struct qcom_llcc_config {
|
struct qcom_llcc_config {
|
||||||
const struct llcc_slice_config *sct_data;
|
const struct llcc_slice_config *sct_data;
|
||||||
int size;
|
|
||||||
bool need_llcc_cfg;
|
|
||||||
const u32 *reg_offset;
|
const u32 *reg_offset;
|
||||||
const struct llcc_edac_reg_offset *edac_reg_offset;
|
const struct llcc_edac_reg_offset *edac_reg_offset;
|
||||||
|
int size;
|
||||||
|
bool need_llcc_cfg;
|
||||||
|
bool no_edac;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum llcc_reg_offset {
|
enum llcc_reg_offset {
|
||||||
@ -401,6 +402,7 @@ static const struct qcom_llcc_config sdm845_cfg = {
|
|||||||
.need_llcc_cfg = false,
|
.need_llcc_cfg = false,
|
||||||
.reg_offset = llcc_v1_reg_offset,
|
.reg_offset = llcc_v1_reg_offset,
|
||||||
.edac_reg_offset = &llcc_v1_edac_reg_offset,
|
.edac_reg_offset = &llcc_v1_edac_reg_offset,
|
||||||
|
.no_edac = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qcom_llcc_config sm6350_cfg = {
|
static const struct qcom_llcc_config sm6350_cfg = {
|
||||||
@ -851,11 +853,19 @@ static int qcom_llcc_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
drv_data->ecc_irq = platform_get_irq_optional(pdev, 0);
|
drv_data->ecc_irq = platform_get_irq_optional(pdev, 0);
|
||||||
|
|
||||||
llcc_edac = platform_device_register_data(&pdev->dev,
|
/*
|
||||||
"qcom_llcc_edac", -1, drv_data,
|
* On some platforms, the access to EDAC registers will be locked by
|
||||||
sizeof(*drv_data));
|
* the bootloader. So probing the EDAC driver will result in a crash.
|
||||||
if (IS_ERR(llcc_edac))
|
* Hence, disable the creation of EDAC platform device for the
|
||||||
dev_err(dev, "Failed to register llcc edac driver\n");
|
* problematic platforms.
|
||||||
|
*/
|
||||||
|
if (!cfg->no_edac) {
|
||||||
|
llcc_edac = platform_device_register_data(&pdev->dev,
|
||||||
|
"qcom_llcc_edac", -1, drv_data,
|
||||||
|
sizeof(*drv_data));
|
||||||
|
if (IS_ERR(llcc_edac))
|
||||||
|
dev_err(dev, "Failed to register llcc edac driver\n");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err:
|
err:
|
||||||
|
Loading…
Reference in New Issue
Block a user