soc: qcom: llcc: Do not create EDAC platform device on SDM845
authorManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Tue, 14 Mar 2023 08:04:43 +0000 (13:34 +0530)
committerBjorn Andersson <andersson@kernel.org>
Wed, 15 Mar 2023 22:17:08 +0000 (15:17 -0700)
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
drivers/soc/qcom/llcc-qcom.c

index 7b7c5a38bac69f315007e7f086e9109241738756..a5140f19f200cb474a0713092cad9040432b9c9e 100644 (file)
@@ -120,10 +120,11 @@ struct llcc_slice_config {
 
 struct qcom_llcc_config {
        const struct llcc_slice_config *sct_data;
-       int size;
-       bool need_llcc_cfg;
        const u32 *reg_offset;
        const struct llcc_edac_reg_offset *edac_reg_offset;
+       int size;
+       bool need_llcc_cfg;
+       bool no_edac;
 };
 
 enum llcc_reg_offset {
@@ -452,6 +453,7 @@ static const struct qcom_llcc_config sdm845_cfg = {
        .need_llcc_cfg  = false,
        .reg_offset     = llcc_v1_reg_offset,
        .edac_reg_offset = &llcc_v1_edac_reg_offset,
+       .no_edac        = true,
 };
 
 static const struct qcom_llcc_config sm6350_cfg = {
@@ -1012,11 +1014,19 @@ static int qcom_llcc_probe(struct platform_device *pdev)
 
        drv_data->ecc_irq = platform_get_irq_optional(pdev, 0);
 
-       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");
+       /*
+        * On some platforms, the access to EDAC registers will be locked by
+        * the bootloader. So probing the EDAC driver will result in a crash.
+        * Hence, disable the creation of EDAC platform device for the
+        * 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;
 err: