| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Elliot Berman <eberman@codeaurora.org> |
| Date: Tue, 6 Oct 2020 17:38:05 -0700 |
| Subject: ANDROID: tty: hvc_dcc: Add parameter to enable DCC |
| |
| On cuttlefish device, DCC registers are unavailable and cause kernel to |
| crash if those registers are probed. Introduce a module parameter |
| ("hvc_dcc.enable") to enable DCC at the kernel commandline. |
| |
| [CPNOTE: 19/07/21] Lee: Possible candidate for upstreaming (and other (bug) related items) |
| |
| Bug: 169129589 |
| Change-Id: I0218d9e64443c881d163e484712edf18e42975fd |
| Signed-off-by: Elliot Berman <eberman@codeaurora.org> |
| Signed-off-by: Lee Jones <joneslee@google.com> |
| --- |
| Documentation/admin-guide/kernel-parameters.txt | 4 ++++ |
| drivers/tty/hvc/hvc_dcc.c | 12 ++++++++++-- |
| 2 files changed, 14 insertions(+), 2 deletions(-) |
| |
| diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt |
| --- a/Documentation/admin-guide/kernel-parameters.txt |
| +++ b/Documentation/admin-guide/kernel-parameters.txt |
| @@ -1782,6 +1782,10 @@ |
| If specified, z/VM IUCV HVC accepts connections |
| from listed z/VM user IDs only. |
| |
| + hvc_dcc.enable= [ARM,ARM64] Enable DCC driver at runtime. For GKI, |
| + disabled at runtime by default to prevent |
| + crashes in devices which do not support DCC. |
| + |
| hv_nopvspin [X86,HYPER_V] Disables the paravirt spinlock optimizations |
| which allow the hypervisor to 'idle' the |
| guest on lock contention. |
| diff --git a/drivers/tty/hvc/hvc_dcc.c b/drivers/tty/hvc/hvc_dcc.c |
| --- a/drivers/tty/hvc/hvc_dcc.c |
| +++ b/drivers/tty/hvc/hvc_dcc.c |
| @@ -6,6 +6,7 @@ |
| #include <linux/cpumask.h> |
| #include <linux/init.h> |
| #include <linux/kfifo.h> |
| +#include <linux/moduleparam.h> |
| #include <linux/serial.h> |
| #include <linux/serial_core.h> |
| #include <linux/smp.h> |
| @@ -16,6 +17,13 @@ |
| |
| #include "hvc_console.h" |
| |
| +/* |
| + * Disable DCC driver at runtime. Want driver enabled for GKI, but some devices |
| + * do not support the registers and crash when driver pokes the registers |
| + */ |
| +static bool enable; |
| +module_param(enable, bool, 0444); |
| + |
| /* DCC Status Bits */ |
| #define DCC_STATUS_RX (1 << 30) |
| #define DCC_STATUS_TX (1 << 29) |
| @@ -257,7 +265,7 @@ static int __init hvc_dcc_console_init(void) |
| { |
| int ret; |
| |
| - if (!hvc_dcc_check()) |
| + if (!enable || !hvc_dcc_check()) |
| return -ENODEV; |
| |
| /* Returns -1 if error */ |
| @@ -271,7 +279,7 @@ static int __init hvc_dcc_init(void) |
| { |
| struct hvc_struct *p; |
| |
| - if (!hvc_dcc_check()) |
| + if (!enable || !hvc_dcc_check()) |
| return -ENODEV; |
| |
| if (IS_ENABLED(CONFIG_HVC_DCC_SERIALIZE_SMP)) { |