From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752895AbcBURXZ (ORCPT ); Sun, 21 Feb 2016 12:23:25 -0500 Received: from mail-bl2on0099.outbound.protection.outlook.com ([65.55.169.99]:7694 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752737AbcBURXQ (ORCPT ); Sun, 21 Feb 2016 12:23:16 -0500 Authentication-Results: linaro.org; dkim=none (message not signed) header.d=none;linaro.org; dmarc=none action=none header.from=caviumnetworks.com; Date: Sun, 21 Feb 2016 12:42:20 +0300 From: Yury Norov To: Aleksey Makarov CC: , Russell King , Graeme Gregory , Greg Kroah-Hartman , "Rafael J . Wysocki" , , Leif Lindholm , Christopher Covington , , Jiri Slaby , Al Stone , , Len Brown Subject: Re: [PATCH v3 2/5] ACPI: parse SPCR and enable matching console Message-ID: <20160221094220.GA3181@yury-N73SV> References: <1455559532-8305-1-git-send-email-aleksey.makarov@linaro.org> <1455559532-8305-3-git-send-email-aleksey.makarov@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1455559532-8305-3-git-send-email-aleksey.makarov@linaro.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Originating-IP: [95.143.213.121] X-ClientProxiedBy: DB5PR02CA0037.eurprd02.prod.outlook.com (25.161.237.47) To DM2PR07MB621.namprd07.prod.outlook.com (10.141.177.140) X-Microsoft-Exchange-Diagnostics: 1;DM2PR07MB621;2:n3CzUcUJTY7YrwGWU70CS5q9CZ3LJeBjoJEMajRTwSTBOt02YjrE8VoeogYcGZUBFPOu3loh7v3jHLdff6MzezqxZucoq+PhZzpqTZiMPz5GgeFWlTm7Tm1OukM/Tv5Zpv5kqbCiSEaz4S84rFvtYA==;3:8ocXwvDKxT41cV/f1sEHGq5mX4172WCyjYnaHYKceIIKGM712Sl7bddNtzXuqqKCThRlVKm5fycj/OD7c/trZt4HP60Gvqs0XjRjN4Rt+hfw6auDJ5bWXpOZ7nThTJd5;25:P5kK27ohpKtYrc0g6RyUP6KEobfXNHQLqBbWsqQBb1brVal+1xFXy2EUK6cFrPaC0D0XQrp0O8fL0JSMn5bWhgI8fDOk38ihQ+T2NUwJvFbtJ/lfBVTEeHPi9athNilMHlFHUtUBB6XTQyi4kBvHfPx5sxt4GESDA6TUPqpK/t/jPPPSDmDti6omGgGI4S4cojOjH9aI9+yhoNZClmrtpno1wB269DckLRdeTNCu+0N1llXypNTxBoeiHUR/tJ74LW+fxuts2ezv8eqjNSjDM5Pqk/PSurhtNEZErO/ZEdQc7+r7Pq4cSsa2xXaTPiV8STlFVT3EbPXiIOWKBqr7TuSHwr/uOIXw0lha1+RM8MY= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR07MB621; X-MS-Office365-Filtering-Correlation-Id: 00017c98-be7a-4283-b760-08d33aa35617 X-Microsoft-Exchange-Diagnostics: 1;DM2PR07MB621;20:mJenoHG4m38K1b8LHKzOp1Ra6StH0MILcOEBCgUZTrI7L3WqXwFXVH6WZC7zEqYi49b49NWArDxg9pAAo3AImrKHY7qqFaF21yPTCvO94AVjf5AaKp/ShG3O2RQcfIXYQ0YnqGDOyEwxhlhL8Y3BiMznFReadZLUhyoiE+X0EvX4kNvF2WrhaxWzpE/XGfb1eucyiak948OtLD1hWv0o3R9Al965K0Q2FopG8DJQpsZqovpRcQ5pr5v0f62wHcu3Lg3QJagyQh7Ox4kOxfBF7Plx9aCmjJjdMUkcMbEnO/f5jBv6mDVLePnbiS0ejptoanr9CFK+2+HsVYFnRJNsjGGQe4rXjyHrSdRrRjGGFF2vUg/zwh4zAkzQX6LGjWBrG+catuTm3B9dnFFO/GVuhxxJLQB6fwvG4OPkeJWIedvKbPvjkg2kk6lF9EY3EkLpid0B65VnEWps7QilL0JzFyvxR3ulNiJrZwzAhRUbItLamHi9wu5374iUkgV1YJM20vgdI6X5dJYveSfwoaS5fCoSXUnIC7vItOFCUeOMU4Jis7b98wRcS+1boRE4C1hlAj53Jy+5oHe6HpS+4N7dMC3DV5o84pMHMtb4AQbaSBM= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046);SRVR:DM2PR07MB621;BCL:0;PCL:0;RULEID:;SRVR:DM2PR07MB621; X-Microsoft-Exchange-Diagnostics: 1;DM2PR07MB621;4:1seNnWWwY+1ynkilquXvfEtb2QToVtsFvieHFfHZFgVFB22DRAo1w/zK9lmxdLMqESmoSxK3mOJZ3LQC6IuLMguJ5uRUbYjAG+KDHD6dAoutHOSRHZcbspCrCtyYGlwST8ltQbwzzy5qPDuYCl/VJh/T+aiMLL7pv91BRP2MXpRqWHM511H7P7OaUUcxeQANeAmx76a+xTOjbMU6TdV8dVaaHcXKS5zNjMmbpmTtSIcoEQB5+mJK0Nm1owLReMLFd+SQcwwpZgyLmqju+RRo7HC5UUl7qh0jDu87UgpSa6UxRpQzvtG/iWBLgq27PomWBQ3OxDU2tAeaahIlRv1gSTDfK1yV6yAgJE375ORnSoOa5CSDGIeh+5WLISLQBhkG X-Forefront-PRVS: 085956473E X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6009001)(6069001)(3905003)(24454002)(40100003)(19580395003)(46406003)(47776003)(33716001)(87976001)(66066001)(97756001)(83506001)(33656002)(42186005)(5001960100002)(110136002)(76506005)(19580405001)(122386002)(575784001)(3846002)(6116002)(50986999)(76176999)(54356999)(23726003)(4001350100001)(189998001)(1076002)(1096002)(50466002)(586003)(2906002)(4326007)(5008740100001)(1720100001)(92566002)(5004730100002)(2950100001)(15975445007)(77096005);DIR:OUT;SFP:1101;SCL:1;SRVR:DM2PR07MB621;H:localhost;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DM2PR07MB621;23:0u/cgNq6HeFWt+XkUPx3qSrHMFsFyjnxHCu1nNAHbx?= =?us-ascii?Q?3eChCPNYGvLryiXOTyXwD+0MvrQZqmTyLuGPyIxl/BA5P+opzpuBn1lBmbGl?= =?us-ascii?Q?sDghojajcIPaac34DxlX8DXCcrhRacsDbvc383mzY3DZK3nY/cRHdLnY28NI?= =?us-ascii?Q?LnuZ8tZg30s8HDZpPECngQCRs5DJyEr1XMiTA9ehZZW9nis3LCN32uvhU+ae?= =?us-ascii?Q?Oj+U8kiseJ0a4llHLfEKy8OFOU7WRlpqqXlIW767wOmRLCqIis63cT/Lu8SS?= =?us-ascii?Q?FV1QTgx/BbQ4N0+zUNizRdMKEJfmoDf7jgs0Sjq18oXiqm67eV5ToSU20kJS?= =?us-ascii?Q?bx6eiu4ONJ7LVAkpoba7x9UbRwsfenOKrTW2+rBy/RU6vzw9+xeRqW3Kdeje?= =?us-ascii?Q?PfxM3DOBx0AamiSgSYHDvCCgwSm0q9YxiZEp2fFMSZNA2327Brh4hf1SIrkJ?= =?us-ascii?Q?kvkldTeW/edSP7ZLva7ne8j+YW4c0znLh00R2nT3tOVMIDpbrpovEAWqmE8o?= =?us-ascii?Q?cBGy7+haAi+7P07ie/bNDcE4AijLSog82qiOSQVHU4s8k/MVacGATzMtoaVc?= =?us-ascii?Q?QWHajcbqMzKqPaoj/Ym8fs60liy658x/RQDHua8FjDXWIA5GPKGicOXU0PD4?= =?us-ascii?Q?amhh3vq4YPj4d7QjNmd+l0RHc8OazKXETR0In2i2N1KeYhXYwNy2SD3UntTl?= =?us-ascii?Q?4smUD735tnrIZa7T5ymp10ntB5QV9olLsriOy1OD+koJ96p8FRTi/UlMVtkC?= =?us-ascii?Q?dSXfxFq9DaRT5aomQl6544pdOMqpcG8uwoKXL4NPuJVGxBGMax8JfZemwO5e?= =?us-ascii?Q?BKy1dNxF7yHZONLLYC7Do8wDlxBLZE874b+1WOu5DzeMWn4sAGQwZodmvhyq?= =?us-ascii?Q?wjGcQzT5G/Z+eycXXIw2O7QtjY0GJ7Q20BTEEKHC1K7xybkE46pDxfsPLNLm?= =?us-ascii?Q?bvZ8Oy+y/g9mFeY1EmU+5IEDfA/EbQk6H0iE/Dz9+zxDsQz3li/V1oY9YmsB?= =?us-ascii?Q?xgNYqwNWaDTCE04TQUpaLK6qadrrTdX/maw2DLNuIJzP0eOR7aIk49GMargG?= =?us-ascii?Q?JwFh3LHf3uhLUFJJFt10FoAz+1X+YsmOXxqdXn8SL8G9wtmy46eFIXyxhinI?= =?us-ascii?Q?vR6b+gpXug+bqnZ4HAh33DQtlsNTNb?= X-Microsoft-Exchange-Diagnostics: 1;DM2PR07MB621;5:S/iTSBlIZKFSm+/nPbBeeQ3d2TqrByDWOoyCFFmGz6yB9UWBrOxGHU4P88jhqjiTn3heQ0tsRRmzbkl5qH+tgC2QqNa/jvaQGat8CR2eZQ1QDR/a3UubyVAAetAU0KH+lzIS6OQjyDX5O8cd8zihLQ==;24:twl1dRjWL7Bclv1ih88S3ed/EsDsnWgkpQftxHOKc5CigeU/Mj4EXAHf6+aOuF6siW3Rowr6Xnci/plCmxhFMcmym+bN864ErjmmgXLyNGw=;23:TKUVnEtHQ6p6RwB5ImkqT6Vp7BFTQWwKozeecfWD72W/9hyk+pO/QQXZlorhOA9nO8YmQBkm7O6SNOVSYu9CZxYFlLxf4axAYAMZ0A8zZAxpWH/W6yhj+c0OyLjmPNtpYNb/5lGnQ2nskixs0wRmxupMp5S/uXM9gs9Au8irQc2gydzK/uM41MjMuFQJ0Fpz SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Feb 2016 09:42:38.3940 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR07MB621 X-Microsoft-Exchange-Diagnostics: 1;DM2PR07MB622;2:/mES5RXkR8Cxaa/lPbI1wD4rAbNP4IOKkWOmLV8oIacRlmt0BeLUA4VP3gm7BfTEQpywpRB8rS3/Q6ezUkb259yvvFGpnUDY7+/tOlQnsXk/hdtm5fnW+qlA+0wFcFHdVj2D7N2q0PEr4KaXas1eRQ==;23:SYQTgl/MWvx3p/kKOrmxwi0sh2AtYC9HrxFV48R5LS/8JElq94WUQ8u/j4Rn37aj0W/OTyitAspTZRkBJ8/nbCoioJ22CrHzGRs2diX89/euMdLU+gZKfyGA9lysr8mGbl+LEBMyxFNwr4iJJkh1u2+Xb1KRY76pIor5fp49EWmHmSkYCpEL4p9asKWh8Jvu X-OriginatorOrg: caviumnetworks.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Feb 15, 2016 at 09:05:26PM +0300, Aleksey Makarov wrote: > 'ARM Server Base Boot Requiremets' [1] mentions SPCR (Serial Port > Console Redirection Table) [2] as a mandatory ACPI table that > specifies the configuration of serial console. > > Parse this table and check if any registered console match the > description. If it does, enable that console. > > Introduce a new function acpi_console_check(). At the uart port > registration, this function checks if the ACPI SPCR table specifies > its argument of type struct uart_port to be a console > and if so calls add_preferred_console(). > > [1] http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0044a/index.html > [2] http://msdn.microsoft.com/en-us/library/windows/hardware/dn639131(v=vs.85).aspx > > Signed-off-by: Aleksey Makarov > --- > drivers/acpi/Kconfig | 3 ++ > drivers/acpi/Makefile | 1 + > drivers/acpi/spcr.c | 97 ++++++++++++++++++++++++++++++++++++++++ > drivers/tty/serial/serial_core.c | 14 +++++- > include/linux/acpi.h | 10 +++++ > 5 files changed, 123 insertions(+), 2 deletions(-) > create mode 100644 drivers/acpi/spcr.c > > diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig > index 65fb483..5611eb6 100644 > --- a/drivers/acpi/Kconfig > +++ b/drivers/acpi/Kconfig > @@ -77,6 +77,9 @@ config ACPI_DEBUGGER_USER > > endif > > +config ACPI_SPCR_TABLE > + bool > + > config ACPI_SLEEP > bool > depends on SUSPEND || HIBERNATION > diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile > index 346101c..708b143 100644 > --- a/drivers/acpi/Makefile > +++ b/drivers/acpi/Makefile > @@ -81,6 +81,7 @@ obj-$(CONFIG_ACPI_EC_DEBUGFS) += ec_sys.o > obj-$(CONFIG_ACPI_CUSTOM_METHOD)+= custom_method.o > obj-$(CONFIG_ACPI_BGRT) += bgrt.o > obj-$(CONFIG_ACPI_CPPC_LIB) += cppc_acpi.o > +obj-$(CONFIG_ACPI_SPCR_TABLE) += spcr.o > obj-$(CONFIG_ACPI_DEBUGGER_USER) += acpi_dbg.o > > # processor has its own "processor." module_param namespace > diff --git a/drivers/acpi/spcr.c b/drivers/acpi/spcr.c > new file mode 100644 > index 0000000..a1eca91 > --- /dev/null > +++ b/drivers/acpi/spcr.c > @@ -0,0 +1,97 @@ > +/* > + * Copyright (c) 2012, Intel Corporation > + * Copyright (c) 2015, Red Hat, Inc. > + * Copyright (c) 2015, 2016 Linaro Ltd. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + * > + */ > + > +#define pr_fmt(fmt) "ACPI: SPCR: " fmt > + > +#include > +#include > +#include > +#include > + > +static int acpi_table_parse_spcr(int (*handler)(struct acpi_table_spcr *table, > + void *data), void *data) > +{ > + struct acpi_table_spcr *table = NULL; Hi Alexey, Few minor comments... Are you sure you need thin initialization? > + acpi_size table_size; > + acpi_status status; > + int err; > + > + status = acpi_get_table_with_size(ACPI_SIG_SPCR, 0, > + (struct acpi_table_header **)&table, > + &table_size); > + > + if (ACPI_FAILURE(status)) > + return -ENODEV; > + > + err = handler(table, data); > + > + early_acpi_os_unmap_memory(table, table_size); > + > + return err; > +} > + > +static int spcr_table_handler_check(struct acpi_table_spcr *table, void *data) The name of function is not clear for me. You're not only checking here, but also adding console. > +{ > + struct uart_port *uport = data; > + char *options; > + > + if (table->header.revision < 2) > + return -EOPNOTSUPP; > + > + switch (table->baud_rate) { You don't need 'options' if your big condition returns false, so you can evaluate it inside conditional block. > + case 3: > + options = "9600"; > + break; > + case 4: > + options = "19200"; > + break; > + case 6: > + options = "57600"; > + break; > + case 7: > + options = "115200"; > + break; > + default: > + options = ""; > + break; 'break' isnot needed here > + } > + > + if ((table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY && Nitpick: just for better readability, I'd split it onto a set of separated checks: foo() { if (!cond1) return 0; if (!cond2) return 0; ... switch () { case 1: ... case 2: ... case 3: ... default: ... } return 1; } > + table->serial_port.address == (u64)uport->mapbase) || > + (table->serial_port.space_id == ACPI_ADR_SPACE_SYSTEM_IO && > + table->serial_port.address == (u64)uport->iobase)) { > + pr_info("adding preferred console [%s%d]\n", uport->cons->name, > + uport->line); > + add_preferred_console(uport->cons->name, uport->line, options); > + return 1; > + > + } > + > + return 0; > +} > + > +/** > + * acpi_console_check - Check if uart matches the console specified by SPCR. > + * > + * @uport: uart port to check > + * > + * This function checks if the ACPI SPCR table specifies @uport to be a console > + * and if so calls add_preferred_console() > + * > + * Return: a non-error value if the console matches. > + */ > +bool acpi_console_check(struct uart_port *uport) > +{ > + if (acpi_disabled || console_set_on_cmdline) > + return false; > + > + return acpi_table_parse_spcr(spcr_table_handler_check, uport) > 0; > +} > diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c > index a126a60..459ab54 100644 > --- a/drivers/tty/serial/serial_core.c > +++ b/drivers/tty/serial/serial_core.c > @@ -34,6 +34,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -2654,8 +2655,17 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport) > spin_lock_init(&uport->lock); > lockdep_set_class(&uport->lock, &port_lock_key); > } > - if (uport->cons && uport->dev) > - of_console_check(uport->dev->of_node, uport->cons->name, uport->line); > + > + /* > + * Support both open FW and ACPI access to console definitions. > + * Both of_console_check() and acpi_console_check() will call > + * add_preferred_console() if a console definition is found. > + */ > + if (uport->cons && uport->dev) { > + if (!acpi_console_check(uport)) > + of_console_check(uport->dev->of_node, uport->cons->name, > + uport->line); > + } > > uart_configure_port(drv, state, uport); > > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > index 06ed7e5..ea0c297 100644 > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -1004,4 +1004,14 @@ static inline struct fwnode_handle *acpi_get_next_subnode(struct device *dev, > #define acpi_probe_device_table(t) ({ int __r = 0; __r;}) > #endif > > +struct uart_port; > +#ifdef CONFIG_ACPI_SPCR_TABLE > +bool acpi_console_check(struct uart_port *uport); > +#else > +static inline bool acpi_console_check(struct uart_port *uport) > +{ > + return FALSE; > +} > +#endif > + > #endif /*_LINUX_ACPI_H*/ > -- > 2.7.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel