Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755551Ab3FMGZX (ORCPT ); Thu, 13 Jun 2013 02:25:23 -0400 Received: from mail-wg0-f47.google.com ([74.125.82.47]:65200 "EHLO mail-wg0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752381Ab3FMGZV (ORCPT ); Thu, 13 Jun 2013 02:25:21 -0400 MIME-Version: 1.0 In-Reply-To: <20130612132820.992E73E0A56@localhost> References: <1370274671-23812-1-git-send-email-pranavkumar@linaro.org> <20130612132820.992E73E0A56@localhost> Date: Thu, 13 Jun 2013 11:55:20 +0530 Message-ID: Subject: Re: [PATCH] arm64: Add support to pass earlyprintk argument via device tree From: Pranavkumar Sawargaonkar To: Grant Likely Cc: "linux-arm-kernel@lists.infradead.org" , "linaro-kernel@lists.linaro.org" , Patch Tracking , Catalin Marinas , Will Deacon , "linux-kernel@vger.kernel.org" , Anup Patel Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5565 Lines: 160 Hi Grant, On 12 June 2013 18:58, Grant Likely wrote: > On Mon, 3 Jun 2013 21:21:11 +0530, Pranavkumar Sawargaonkar wrote: >> This patch adds support for defining and passing earlyprintk >> related information i.e. device and address information via >> device tree by adding it inside "chosen" node. >> >> This will help user to just specify "earlyprintk" from bootargs >> without actually knowing the address and device to enable >> earlyprintk. >> >> Mechanism: >> >> One can just append earlyprintk=device-type,address (same as we pass >> through command line) in "/chosen" node to notify kernel which is the >> earlyprintk device and what is its address. >> >> Backward Compatibility: >> >> This patch also allows existing method of specifying earlyprintk >> parameter via bootargs. >> >> Existing method i.e. passing via bootargs will still have precedence >> over device tree i.e. if one specifies earlyprintk=device-type,address >> in bootargs then kernel will use information from bootargs instead of >> device tree. >> >> If user just specifies earlyprintk (without =...) then kernel will >> look for device tree earlyprintk parameter. >> >> Signed-off-by: Pranavkumar Sawargaonkar >> Signed-off-by: Anup Patel > > I'm not a big fan of this. It seems to be short-circuiting around > existing properties. Agreed, but intention was to have a simple solution since it is just to be used for early printing/debugging. and also keep that in sync with existing method of specifying earlyprintk from command line. The kernel /should/ be able to use the > linux,stdout-path property to determine what the earlyprintk device to > use is. For this there are two problems: 1. Early printk code gets initialized before un-flattening of a device tree. Hence trying to find out node from stdout-path is tricky as we do not have of_find_node_by_path available. 2. Current compatible strings in arm64 early printk code are not in synced (or different) from actual compatible strings used in drivers - e.g. for PL011 In earlyprintk code match name is just pl011 but in dts it is specified as "arm,pl011" Hence we will need multiple changes to implement it. > > g. Thanks, Pranav > >> --- >> arch/arm64/kernel/early_printk.c | 7 +++++++ >> arch/arm64/kernel/setup.c | 21 ++++++++++++++++++++- >> 2 files changed, 27 insertions(+), 1 deletion(-) >> >> diff --git a/arch/arm64/kernel/early_printk.c b/arch/arm64/kernel/early_printk.c >> index fbb6e18..4e6f845 100644 >> --- a/arch/arm64/kernel/early_printk.c >> +++ b/arch/arm64/kernel/early_printk.c >> @@ -29,6 +29,8 @@ >> static void __iomem *early_base; >> static void (*printch)(char ch); >> >> +extern char *earlyprintk_dt_args; >> + >> /* >> * PL011 single character TX. >> */ >> @@ -116,6 +118,11 @@ static int __init setup_early_printk(char *buf) >> phys_addr_t paddr = 0; >> >> if (!buf) { >> + /* Try to check if Device Tree has this argument or not ? */ >> + buf = earlyprintk_dt_args; >> + } >> + >> + if (!buf) { >> pr_warning("No earlyprintk arguments passed.\n"); >> return 0; >> } >> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c >> index 6a9a532..fb2d56f 100644 >> --- a/arch/arm64/kernel/setup.c >> +++ b/arch/arm64/kernel/setup.c >> @@ -60,6 +60,8 @@ EXPORT_SYMBOL(processor_id); >> unsigned int elf_hwcap __read_mostly; >> EXPORT_SYMBOL_GPL(elf_hwcap); >> >> +char *earlyprintk_dt_args; >> + >> static const char *cpu_name; >> static const char *machine_name; >> phys_addr_t __fdt_pointer __initdata; >> @@ -122,6 +124,23 @@ static void __init setup_processor(void) >> elf_hwcap = 0; >> } >> >> +int __init early_init_dt_scan_chosen_arm64(unsigned long node, >> + const char *uname, >> + int depth, void *data) >> +{ >> + char *prop; >> + >> + /* Check if this is chosen node */ >> + if (early_init_dt_scan_chosen(node, uname, depth, data) == 0) >> + return 0; >> + >> + prop = of_get_flat_dt_prop(node, "earlyprintk", NULL); >> + if (prop) >> + earlyprintk_dt_args = prop; >> + >> + return 1; >> +} >> + >> static void __init setup_machine_fdt(phys_addr_t dt_phys) >> { >> struct boot_param_header *devtree; >> @@ -165,7 +184,7 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys) >> pr_info("Machine: %s\n", machine_name); >> >> /* Retrieve various information from the /chosen node */ >> - of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); >> + of_scan_flat_dt(early_init_dt_scan_chosen_arm64, boot_command_line); >> /* Initialize {size,address}-cells info */ >> of_scan_flat_dt(early_init_dt_scan_root, NULL); >> /* Setup memory, calling early_init_dt_add_memory_arch */ >> -- >> 1.7.9.5 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> Please read the FAQ at http://www.tux.org/lkml/ > > -- > Grant Likely, B.Sc, P.Eng. > Secret Lab Technologies, Ltd. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/