[PATCH] arm64: Add support to pass earlyprintk argument via device tree

Pranavkumar Sawargaonkar pranavkumar at linaro.org
Thu Jun 13 02:25:20 EDT 2013


Hi Grant,

On 12 June 2013 18:58, Grant Likely <grant.likely at secretlab.ca> wrote:
> On Mon,  3 Jun 2013 21:21:11 +0530, Pranavkumar Sawargaonkar <pranavkumar at linaro.org> 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 <pranavkumar at linaro.org>
>> Signed-off-by: Anup Patel <anup.patel at linaro.org>
>
> 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 at 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.



More information about the linux-arm-kernel mailing list