2
0

004-v6.7-firmware-qcom_scm-disable-SDI-if-required.patch 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. From ff4aa3bc98258a240b9bbab53fd8d2fb8184c485 Mon Sep 17 00:00:00 2001
  2. From: Robert Marko <[email protected]>
  3. Date: Wed, 16 Aug 2023 18:45:39 +0200
  4. Subject: [PATCH] firmware: qcom_scm: disable SDI if required
  5. IPQ5018 has SDI (Secure Debug Image) enabled by TZ by default, and that
  6. means that WDT being asserted or just trying to reboot will hang the board
  7. in the debug mode and only pulling the power and repowering will help.
  8. Some IPQ4019 boards like Google WiFI have it enabled as well.
  9. Luckily, SDI can be disabled via an SCM call.
  10. So, lets use the boolean DT property to identify boards that have SDI
  11. enabled by default and use the SCM call to disable SDI during SCM probe.
  12. It is important to disable it as soon as possible as we might have a WDT
  13. assertion at any time which would then leave the board in debug mode,
  14. thus disabling it during SCM removal is not enough.
  15. Signed-off-by: Robert Marko <[email protected]>
  16. Reviewed-by: Guru Das Srinagesh <[email protected]>
  17. Link: https://lore.kernel.org/r/[email protected]
  18. Signed-off-by: Bjorn Andersson <[email protected]>
  19. ---
  20. drivers/firmware/qcom_scm.c | 30 ++++++++++++++++++++++++++++++
  21. drivers/firmware/qcom_scm.h | 1 +
  22. 2 files changed, 31 insertions(+)
  23. --- a/drivers/firmware/qcom_scm.c
  24. +++ b/drivers/firmware/qcom_scm.c
  25. @@ -407,6 +407,29 @@ int qcom_scm_set_remote_state(u32 state,
  26. }
  27. EXPORT_SYMBOL(qcom_scm_set_remote_state);
  28. +static int qcom_scm_disable_sdi(void)
  29. +{
  30. + int ret;
  31. + struct qcom_scm_desc desc = {
  32. + .svc = QCOM_SCM_SVC_BOOT,
  33. + .cmd = QCOM_SCM_BOOT_SDI_CONFIG,
  34. + .args[0] = 1, /* Disable watchdog debug */
  35. + .args[1] = 0, /* Disable SDI */
  36. + .arginfo = QCOM_SCM_ARGS(2),
  37. + .owner = ARM_SMCCC_OWNER_SIP,
  38. + };
  39. + struct qcom_scm_res res;
  40. +
  41. + ret = qcom_scm_clk_enable();
  42. + if (ret)
  43. + return ret;
  44. + ret = qcom_scm_call(__scm->dev, &desc, &res);
  45. +
  46. + qcom_scm_clk_disable();
  47. +
  48. + return ret ? : res.result[0];
  49. +}
  50. +
  51. static int __qcom_scm_set_dload_mode(struct device *dev, bool enable)
  52. {
  53. struct qcom_scm_desc desc = {
  54. @@ -1411,6 +1434,13 @@ static int qcom_scm_probe(struct platfor
  55. __get_convention();
  56. +
  57. + /*
  58. + * Disable SDI if indicated by DT that it is enabled by default.
  59. + */
  60. + if (of_property_read_bool(pdev->dev.of_node, "qcom,sdi-enabled"))
  61. + qcom_scm_disable_sdi();
  62. +
  63. /*
  64. * If requested enable "download mode", from this point on warmboot
  65. * will cause the boot stages to enter download mode, unless
  66. --- a/drivers/firmware/qcom_scm.h
  67. +++ b/drivers/firmware/qcom_scm.h
  68. @@ -77,6 +77,7 @@ extern int scm_legacy_call(struct device
  69. #define QCOM_SCM_SVC_BOOT 0x01
  70. #define QCOM_SCM_BOOT_SET_ADDR 0x01
  71. #define QCOM_SCM_BOOT_TERMINATE_PC 0x02
  72. +#define QCOM_SCM_BOOT_SDI_CONFIG 0x09
  73. #define QCOM_SCM_BOOT_SET_DLOAD_MODE 0x10
  74. #define QCOM_SCM_BOOT_SET_ADDR_MC 0x11
  75. #define QCOM_SCM_BOOT_SET_REMOTE_STATE 0x0a