From 0c5085d2307373712f4418b035f40a1b8d373ceb Mon Sep 17 00:00:00 2001 From: Murali Nalajala Date: Mon, 20 Jul 2020 00:11:33 -0700 Subject: [PATCH] haven: ctrl: add nohypuart commandline parameter Add kernel commandline parameter capability to disable hypervisor UART in debug builds. Customers are capable of selecting a different instance of UART for console instead a standard console. In this case hypervisor touching the UART instance which does not have clocks enabled. This lead to NOC errors. Change-Id: I655b68870923194b65119b00b4d300dccf12057c Signed-off-by: Murali Nalajala --- drivers/virt/haven/hh_ctrl.c | 42 ++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/drivers/virt/haven/hh_ctrl.c b/drivers/virt/haven/hh_ctrl.c index 62c6cee60633..c019bf411282 100644 --- a/drivers/virt/haven/hh_ctrl.c +++ b/drivers/virt/haven/hh_ctrl.c @@ -48,14 +48,27 @@ static bool qc_hyp_calls; static struct hh_hcall_hyp_identify_resp haven_api; +static bool disable_uart; + +#if !defined(CONFIG_HH_DISABLE_UART) +static int __init setup_nohyp_uart(char *arg) +{ + disable_uart = true; + return 0; +} +early_param("nohyp_uart", setup_nohyp_uart); +#endif -#if defined(CONFIG_HH_DISABLE_UART) static void hh_disable_uart(void) { - if (qc_hyp_calls) - arm_smccc_1_1_smc(QC_HYP_SMCCC_UART_DISABLE, NULL); -} +#if defined(CONFIG_HH_DISABLE_UART) + disable_uart = true; #endif + if (disable_uart) { + pr_info("Haven: disabling HYP UART\n"); + arm_smccc_1_1_smc(QC_HYP_SMCCC_UART_DISABLE, NULL); + } +} static ssize_t type_show(struct kobject *kobj, struct kobj_attribute *attr, char *buffer) @@ -190,17 +203,18 @@ static int __init hh_ctrl_init(void) (res.a2 == QC_HYP_UID2) && (res.a3 == QC_HYP_UID3)) qc_hyp_calls = true; -#if defined(CONFIG_HH_DISABLE_UART) - hh_disable_uart(); -#endif + if (qc_hyp_calls) { + hh_disable_uart(); + ret = hh_sysfs_register(); + if (ret) + return ret; - ret = hh_sysfs_register(); - if (ret) - return ret; - - ret = hh_dbgfs_register(); - if (ret) - pr_warn("failed to register dbgfs: %d\n", ret); + ret = hh_dbgfs_register(); + if (ret) + pr_warn("failed to register dbgfs: %d\n", ret); + } else { + pr_info("Haven: no QC HYP interface detected\n"); + } return 0; }