[PATCH] feature_list: a way to pass hardware info to the kernel
Sascha Hauer
s.hauer at pengutronix.de
Wed Jan 23 15:51:22 EST 2013
On Sat, Jan 19, 2013 at 06:23:27PM +0100, Vicente Bergas wrote:
> Hi Sascha,
> I've made the changes you suggested in this resent patch.
>
> Everything related to custom ATAGs has been moved to the board
> directory.
>
> The generic code does not make any references to feature lists or
> bootloader versions.
>
> About the setup_feature_list prototype:
> it has been renamed to atag_appender
> it's not a function, it's a pointer to a function. Can it have a
> prototype other than it's own declaration?
>
> All non-related changes has been dropped. They were checkpatch.pl
> warnings unrelated to this patch.
>
Applied, some days ago already.
Sascha
> Regards,
> Vicente.
>
> Signed-off-by: Vicente Bergas <vicencb at gmail.com>
> ---
> arch/arm/Kconfig | 7 +
> arch/arm/boards/archosg9/Makefile | 1 +
> arch/arm/boards/archosg9/archos_features.c | 225 ++++++++++++++++++
> arch/arm/boards/archosg9/archos_features.h | 22 ++
> arch/arm/boards/archosg9/board.c | 2 +
> arch/arm/boards/archosg9/feature_list.h | 352 +++++++++++++++++++++++++++++
> arch/arm/configs/archosg9_defconfig | 1 +
> arch/arm/include/asm/armlinux.h | 9 +
> arch/arm/lib/armlinux.c | 12 +
> 9 files changed, 631 insertions(+)
> create mode 100644 arch/arm/boards/archosg9/archos_features.c
> create mode 100644 arch/arm/boards/archosg9/archos_features.h
> create mode 100644 arch/arm/boards/archosg9/feature_list.h
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index f567531..6f7a71f 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -152,6 +152,13 @@ config THUMB2_BAREBOX
> your board lowlevel init code may break in thumb-2 mode. You have been
> warned.
>
> +config ARM_BOARD_APPEND_ATAG
> + bool "Let board specific code to add ATAGs to be passed to the kernel"
> + depends on ARM_LINUX
> + help
> + This option is purely to start some vendor provided kernels.
> + ** DO NOT USE FOR YOUR OWN DESIGNS! **
> +
> endmenu
>
> menu "Arm specific settings"
> diff --git a/arch/arm/boards/archosg9/Makefile b/arch/arm/boards/archosg9/Makefile
> index 256eaf6..450c03f 100644
> --- a/arch/arm/boards/archosg9/Makefile
> +++ b/arch/arm/boards/archosg9/Makefile
> @@ -1,3 +1,4 @@
> obj-y += board.o
> +obj-$(CONFIG_ARM_BOARD_APPEND_ATAG) += archos_features.o
> obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel.o mux.o
> pbl-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel.o mux.o
> diff --git a/arch/arm/boards/archosg9/archos_features.c b/arch/arm/boards/archosg9/archos_features.c
> new file mode 100644
> index 0000000..cd20984
> --- /dev/null
> +++ b/arch/arm/boards/archosg9/archos_features.c
> @@ -0,0 +1,225 @@
> +/*
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <boot.h>
> +#include <asm/setup.h>
> +#include "archos_features.h"
> +#include "feature_list.h"
> +
> +static inline void *atag_data(struct tag *t)
> +{
> + return ((void *)t) + sizeof(struct tag_header);
> +}
> +
> +static struct feature_tag *features;
> +
> +static void setup_feature_core(void)
> +{
> + features->hdr.tag = FTAG_CORE;
> + features->hdr.size = feature_tag_size(feature_tag_core);
> +
> + features->u.core.magic = FEATURE_LIST_MAGIC;
> + features->u.core.list_revision = FEATURE_LIST_REV;
> + features->u.core.flags = 0;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_product_name(void)
> +{
> + features->hdr.tag = FTAG_PRODUCT_NAME;
> + features->hdr.size = feature_tag_size(feature_tag_product_name);
> +
> + memset(features->u.product_name.name, 0,
> + sizeof(features->u.product_name.name));
> + sprintf(features->u.product_name.name, "A80S");
> + features->u.product_name.id = 0x13A8;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_product_serial_number(void)
> +{
> + features->hdr.tag = FTAG_PRODUCT_SERIAL_NUMBER;
> + features->hdr.size = feature_tag_size(feature_tag_product_serial);
> +
> + features->u.product_serial.serial[0] = 0;
> + features->u.product_serial.serial[1] = 0;
> + features->u.product_serial.serial[2] = 0;
> + features->u.product_serial.serial[3] = 0;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_product_mac_address(void)
> +{
> + features->hdr.tag = FTAG_PRODUCT_MAC_ADDRESS;
> + features->hdr.size = feature_tag_size(feature_tag_product_mac_address);
> +
> + features->u.mac_address.addr[0] = 0;
> + features->u.mac_address.addr[1] = 0;
> + features->u.mac_address.addr[2] = 0;
> + features->u.mac_address.addr[3] = 0;
> + features->u.mac_address.addr[4] = 0;
> + features->u.mac_address.addr[5] = 0;
> + features->u.mac_address.reserved1 = 0;
> + features->u.mac_address.reserved2 = 0;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_board_pcb_revision(void)
> +{
> + features->hdr.tag = FTAG_BOARD_PCB_REVISION;
> + features->hdr.size = feature_tag_size(feature_tag_board_revision);
> +
> + features->u.board_revision.revision = 5;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_sdram(void)
> +{
> + features->hdr.tag = FTAG_SDRAM;
> + features->hdr.size = feature_tag_size(feature_tag_sdram);
> +
> + memset(features->u.sdram.vendor, 0, sizeof(features->u.sdram.vendor));
> + memset(features->u.sdram.product, 0,
> + sizeof(features->u.sdram.product));
> + sprintf(features->u.sdram.vendor , "elpida");
> + sprintf(features->u.sdram.product, "EDB8064B1PB"/*"EDB4064B2PB"*/);
> + features->u.sdram.type = 0;
> + features->u.sdram.revision = 0;
> + features->u.sdram.flags = 0;
> + features->u.sdram.clock = 400;
> + features->u.sdram.param_0 = 0;
> + features->u.sdram.param_1 = 0;
> + features->u.sdram.param_2 = 0;
> + features->u.sdram.param_3 = 0;
> + features->u.sdram.param_4 = 0;
> + features->u.sdram.param_5 = 0;
> + features->u.sdram.param_6 = 0;
> + features->u.sdram.param_7 = 0;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_pmic(void)
> +{
> + features->hdr.tag = FTAG_PMIC;
> + features->hdr.size = feature_tag_size(feature_tag_pmic);
> +
> + features->u.pmic.flags = FTAG_PMIC_TPS62361;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_serial_port(void)
> +{
> + features->hdr.tag = FTAG_SERIAL_PORT;
> + features->hdr.size = feature_tag_size(feature_tag_serial_port);
> +
> + features->u.serial_port.uart_id = 1;
> + features->u.serial_port.speed = 115200;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_has_gpio_volume_keys(void)
> +{
> + features->hdr.tag = FTAG_HAS_GPIO_VOLUME_KEYS;
> + features->hdr.size = feature_tag_size(feature_tag_gpio_volume_keys);
> +
> + features->u.gpio_volume_keys.gpio_vol_up = 0x2B;
> + features->u.gpio_volume_keys.gpio_vol_down = 0x2C;
> + features->u.gpio_volume_keys.flags = 0;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_screen(void)
> +{
> + features->hdr.tag = FTAG_SCREEN;
> + features->hdr.size = feature_tag_size(feature_tag_screen);
> +
> + memset(features->u.screen.vendor, 0,
> + sizeof(features->u.screen.vendor));
> + sprintf(features->u.screen.vendor, "CMI");
> + features->u.screen.type = 0;
> + features->u.screen.revision = 0;
> + features->u.screen.vcom = 0;
> + features->u.screen.backlight = 0xC8;
> + features->u.screen.reserved[0] = 0;
> + features->u.screen.reserved[1] = 0;
> + features->u.screen.reserved[2] = 0;
> + features->u.screen.reserved[3] = 0;
> + features->u.screen.reserved[4] = 0;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_turbo(void)
> +{
> + features->hdr.tag = FTAG_TURBO;
> + features->hdr.size = feature_tag_size(feature_tag_turbo);
> +
> + features->u.turbo.flag = 1;
> +
> + features = feature_tag_next(features);
> +}
> +static void setup_feature_none(void)
> +{
> + features->hdr.tag = FTAG_NONE;
> + features->hdr.size = sizeof(struct feature_tag_header) >> 2;
> +
> + features = feature_tag_next(features);
> +}
> +static struct tag *setup_feature_list(struct tag * params)
> +{
> + struct tag_feature_list *fl;
> +
> + fl = atag_data(params);
> + features = (struct feature_tag *)fl->data;
> +
> + setup_feature_core();
> + setup_feature_product_name();
> + setup_feature_product_serial_number();
> + setup_feature_product_mac_address();
> + setup_feature_board_pcb_revision();
> + setup_feature_sdram();
> + setup_feature_pmic();
> + setup_feature_serial_port();
> + setup_feature_has_gpio_volume_keys();
> + setup_feature_screen();
> + setup_feature_turbo();
> + setup_feature_none();
> +
> + fl->size = ((u32)features) - ((u32)(fl->data));
> +
> + params->hdr.tag = ATAG_FEATURE_LIST;
> + params->hdr.size = (sizeof(struct tag_feature_list) + fl->size) >> 2;
> +
> + return tag_next(params);
> +}
> +
> +static struct tag *setup_boot_version(struct tag *params)
> +{
> + struct tag_boot_version *bv;
> +
> + bv = atag_data(params);
> +
> + params->hdr.tag = ATAG_BOOT_VERSION;
> + params->hdr.size = tag_size(tag_boot_version);
> +
> + bv->major = 5;
> + bv->minor = 5;
> + bv->extra = 3;
> +
> + return tag_next(params);
> +}
> +
> +struct tag *archos_append_atags(struct tag *params)
> +{
> + params = setup_feature_list(params);
> + params = setup_boot_version(params);
> + return params;
> +}
> diff --git a/arch/arm/boards/archosg9/archos_features.h b/arch/arm/boards/archosg9/archos_features.h
> new file mode 100644
> index 0000000..5769c6c
> --- /dev/null
> +++ b/arch/arm/boards/archosg9/archos_features.h
> @@ -0,0 +1,22 @@
> +#ifndef __ARCHOS_FEATURES_H
> +#define __ARCHOS_FEATURES_H
> +
> +/* bootloader version */
> +#define ATAG_BOOT_VERSION 0x5441000A
> +
> +struct tag_boot_version {
> + u32 major;
> + u32 minor;
> + u32 extra;
> +};
> +
> +#define ATAG_FEATURE_LIST 0x5441000B
> +
> +struct tag_feature_list {
> + u32 size;
> + u8 data[0];
> +};
> +
> +struct tag *archos_append_atags(struct tag * params);
> +
> +#endif /* __ARCHOS_FEATURES_H */
> diff --git a/arch/arm/boards/archosg9/board.c b/arch/arm/boards/archosg9/board.c
> index 200fe92..8366cca 100644
> --- a/arch/arm/boards/archosg9/board.c
> +++ b/arch/arm/boards/archosg9/board.c
> @@ -20,6 +20,7 @@
> #include <sizes.h>
> #include <i2c/i2c.h>
> #include <gpio.h>
> +#include "archos_features.h"
>
> static int archosg9_console_init(void){
> if (IS_ENABLED(CONFIG_DRIVER_SERIAL_OMAP4_USBBOOT))
> @@ -59,6 +60,7 @@ static int archosg9_devices_init(void){
> */
> armlinux_set_architecture(5032);
> armlinux_set_revision(5);
> + armlinux_set_atag_appender(archos_append_atags);
>
> return 0;
> }
> diff --git a/arch/arm/boards/archosg9/feature_list.h b/arch/arm/boards/archosg9/feature_list.h
> new file mode 100644
> index 0000000..51f33ab
> --- /dev/null
> +++ b/arch/arm/boards/archosg9/feature_list.h
> @@ -0,0 +1,352 @@
> +#ifndef _FEATURE_LIST_H
> +#define _FEATURE_LIST_H
> +
> +/*
> + This file comes from:
> + http://gitorious.org/archos/archos-gpl-gen9-kernel-ics/blobs/raw/master/
> + arch/arm/include/asm/feature_list.h
> +*/
> +
> +#define FEATURE_LIST_MAGIC 0xFEA01234
> +
> +#define FEATURE_LIST_REV 0x00000001
> +
> +struct feature_tag_header {
> + u32 size;
> + u32 tag;
> +};
> +
> +struct feature_tag_generic {
> + u32 vendor;
> + u32 product;
> + u32 type;
> + u32 revision;
> + u32 flags;
> +};
> +
> +#define FTAG_NONE 0x00000000
> +
> +#define FTAG_CORE 0x00000001
> +struct feature_tag_core {
> + u32 magic;
> + u32 list_revision;
> + u32 flags;
> +};
> +
> +/* product specific */
> +#define FTAG_PRODUCT_NAME 0x00000002
> +struct feature_tag_product_name {
> + char name[64];
> + u32 id;
> +};
> +#define FTAG_PRODUCT_SERIAL_NUMBER 0x00000003
> +struct feature_tag_product_serial {
> + u32 serial[4];
> +};
> +
> +#define FTAG_PRODUCT_MAC_ADDRESS 0x00000004
> +struct feature_tag_product_mac_address {
> + u8 addr[6];
> + u8 reserved1;
> + u8 reserved2;
> +};
> +
> +#define FTAG_PRODUCT_OEM 0x00000005
> +struct feature_tag_product_oem {
> + char name[16];
> + u32 id;
> +};
> +
> +#define FTAG_PRODUCT_ZONE 0x00000006
> +struct feature_tag_product_zone {
> + char name[16];
> + u32 id;
> +};
> +
> +/* board pcb specific */
> +#define FTAG_BOARD_PCB_REVISION 0x00000010
> +struct feature_tag_board_revision {
> + u32 revision;
> +};
> +
> +/* clock and ram setup */
> +#define FTAG_CLOCK 0x00000011
> +struct feature_tag_clock {
> + u32 clock;
> +};
> +
> +#define FTAG_SDRAM 0x00000012
> +struct feature_tag_sdram {
> + char vendor[16];
> + char product[32];
> + u32 type;
> + u32 revision;
> + u32 flags;
> + u32 clock;
> + /* custom params */
> + u32 param_0;
> + u32 param_1;
> + u32 param_2;
> + u32 param_3;
> + u32 param_4;
> + u32 param_5;
> + u32 param_6;
> + u32 param_7;
> +};
> +
> +/* PMIC */
> +#define FTAG_PMIC 0x00000013
> +#define FTAG_PMIC_TPS62361 0x00000001
> +struct feature_tag_pmic {
> + u32 flags;
> +};
> +
> +/* serial port */
> +#define FTAG_SERIAL_PORT 0x00000020
> +struct feature_tag_serial_port {
> + u32 uart_id;
> + u32 speed;
> +};
> +
> +/* turbo bit */
> +#define FTAG_TURBO 0x00000014
> +struct feature_tag_turbo {
> + u32 flag;
> +};
> +
> +/*** features ****/
> +#define FTAG_HAS_GPIO_VOLUME_KEYS 0x00010001
> +struct feature_tag_gpio_volume_keys {
> + u32 gpio_vol_up;
> + u32 gpio_vol_down;
> + u32 flags;
> +};
> +
> +#define FTAG_HAS_ELECTRICAL_SHORTCUT 0x00010002
> +#define FTAG_HAS_DCIN 0x00010003
> +struct feature_tag_dcin {
> + u32 autodetect;
> +};
> +
> +/* external screen support */
> +#define FTAG_HAS_EXT_SCREEN 0x00010004
> +
> +#define EXT_SCREEN_TYPE_TVOUT 0x00000001
> +#define EXT_SCREEN_TYPE_HDMI 0x00000002
> +#define EXT_SCREEN_TYPE_VGA 0x00000004
> +struct feature_tag_ext_screen {
> + u32 type;
> + u32 revision;
> +};
> +
> +/* wireless lan */
> +#define FTAG_HAS_WIFI 0x00010005
> +
> +#define WIFI_TYPE_TIWLAN 0x00000001
> +struct feature_tag_wifi {
> + u32 vendor;
> + u32 product;
> + u32 type;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* bluetooth */
> +#define FTAG_HAS_BLUETOOTH 0x00010006
> +
> +#define BLUETOOTH_TYPE_TIWLAN 0x00000001
> +struct feature_tag_bluetooth {
> + u32 vendor;
> + u32 product;
> + u32 type;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* accelerometer */
> +#define FTAG_HAS_ACCELEROMETER 0x00010007
> +struct feature_tag_accelerometer {
> + u32 vendor;
> + u32 product;
> + u32 type;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* gyroscope */
> +#define FTAG_HAS_GYROSCOPE 0x00010008
> +
> +/* compass */
> +#define FTAG_HAS_COMPASS 0x00010009
> +
> +/* gps */
> +#define FTAG_HAS_GPS 0x0001000a
> +#define GPS_FLAG_DISABLED 0x00000001
> +struct feature_tag_gps {
> + u32 vendor;
> + u32 product;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* camera */
> +#define FTAG_HAS_CAMERA 0x0001000b
> +
> +/* harddisk controller */
> +#define FTAG_HAS_HARDDISK_CONTROLLER 0x0001000c
> +#define HDCONTROLLER_TYPE_SATA 0x00000001
> +struct feature_tag_harddisk_controller {
> + u32 vendor;
> + u32 product;
> + u32 type;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* harddisk */
> +#define FTAG_HAS_HARDDISK 0x0001000d
> +
> +#define HARDDISK_TYPE_SATA 0x00000001
> +#define HARDDISK_TYPE_PATA 0x00000002
> +struct feature_tag_harddisk {
> + u32 vendor;
> + u32 product;
> + u32 type;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* touchscreen */
> +#define FTAG_HAS_TOUCHSCREEN 0x0001000e
> +
> +#define TOUCHSCREEN_TYPE_CAPACITIVE 0x00000001
> +#define TOUCHSCREEN_TYPE_RESISTIVE 0x00000002
> +
> +#define TOUCHSCREEN_FLAG_MULTITOUCH 0x00000001
> +struct feature_tag_touchscreen {
> + u32 vendor;
> + u32 product;
> + u32 type;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* microphone */
> +#define FTAG_HAS_MICROPHONE 0x0001000f
> +
> +/* external SDMMC slot */
> +#define FTAG_HAS_EXT_MMCSD_SLOT 0x00010010
> +#define MMCSD_FLAG_CARDDETECT 0x00000001
> +#define MMCSD_FLAG_CARDPREDETECT 0x00000002
> +
> +struct feature_tag_mmcsd {
> + u32 width;
> + u32 voltagemask;
> + u32 revision;
> + u32 flags;
> +};
> +
> +/* ambient light sensor */
> +#define FTAG_HAS_AMBIENT_LIGHT_SENSOR 0x00010011
> +
> +/* proximity sensor */
> +#define FTAG_HAS_PROXIMITY_SENSOR 0x00010012
> +
> +/* gps */
> +#define FTAG_HAS_GSM 0x00010013
> +
> +/* dect */
> +#define FTAG_HAS_DECT 0x00010014
> +
> +/* hsdpa data modem */
> +#define FTAG_HAS_HSDPA 0x00010015
> +
> +/* near field communication */
> +#define FTAG_HAS_NFC 0x00010016
> +
> +#define FTAG_GPIO_KEYS 0x00010017
> +struct feature_tag_gpio_keys {
> +#define GPIO_KEYS_LONG_PRESS 0x00010000
> + u32 vol_up;
> + u32 vol_down;
> + u32 ok;
> + u32 reserved[5];
> +};
> +
> +#define FTAG_SCREEN 0x00010018
> +struct feature_tag_screen {
> + char vendor[16];
> + u32 type;
> + u32 revision;
> + u32 vcom;
> + u32 backlight;
> + u32 reserved[5];
> +};
> +
> +#define FTAG_WIFI_PA 0x00010019
> +struct feature_tag_wifi_pa {
> + char vendor[16];
> + u32 type;
> +};
> +
> +/* loudspeaker */
> +#define FTAG_HAS_SPEAKER 0x0001001a
> +
> +#define SPEAKER_FLAG_STEREO 0x00000001
> +#define SPEAKER_FLAG_OWN_VOLCTRL 0x00000002
> +struct feature_tag_speaker {
> + u32 flags;
> +};
> +
> +#define FTAG_BATTERY 0x0001001b
> +struct feature_tag_battery {
> + u32 type;
> +};
> +#define BATTERY_TYPE_HIGHRS 0x00000000
> +#define BATTERY_TYPE_LOWRS 0x00000001
> +
> +
> +#define feature_tag_next(t) \
> + ((struct feature_tag *)((u32 *)(t) + (t)->hdr.size))
> +#define feature_tag_size(type) \
> + ((sizeof(struct feature_tag_header) + sizeof(struct type)) >> 2)
> +#define for_each_feature_tag(t, base) \
> + for (t = base; t->hdr.size; t = feature_tag_next(t))
> +
> +
> +struct feature_tag {
> + struct feature_tag_header hdr;
> + union {
> + struct feature_tag_core core;
> + struct feature_tag_generic generic;
> + struct feature_tag_product_name product_name;
> + struct feature_tag_product_serial product_serial;
> + struct feature_tag_product_oem product_oem;
> + struct feature_tag_product_zone product_zone;
> + struct feature_tag_product_mac_address mac_address;
> + struct feature_tag_board_revision board_revision;
> + struct feature_tag_clock clock;
> + struct feature_tag_sdram sdram;
> + struct feature_tag_pmic pmic;
> + struct feature_tag_turbo turbo;
> + struct feature_tag_serial_port serial_port;
> + struct feature_tag_gpio_volume_keys gpio_volume_keys;
> + struct feature_tag_dcin dcin;
> + struct feature_tag_ext_screen ext_screen;
> + struct feature_tag_wifi wifi;
> + struct feature_tag_bluetooth bluetooth;
> + struct feature_tag_accelerometer accelerometer;
> + struct feature_tag_harddisk_controller harddisk_controller;
> + struct feature_tag_harddisk harddisk;
> + struct feature_tag_touchscreen touchscreen;
> + struct feature_tag_gps gps;
> + struct feature_tag_speaker speaker;
> + struct feature_tag_mmcsd mmcsd;
> + struct feature_tag_gpio_keys gpio_keys;
> + struct feature_tag_screen screen;
> + struct feature_tag_wifi_pa wifi_pa;
> + struct feature_tag_battery battery;
> + } u;
> +};
> +
> +#endif /* _FEATURE_LIST_H */
> diff --git a/arch/arm/configs/archosg9_defconfig b/arch/arm/configs/archosg9_defconfig
> index 2a20dd7..1f3d105 100644
> --- a/arch/arm/configs/archosg9_defconfig
> +++ b/arch/arm/configs/archosg9_defconfig
> @@ -11,6 +11,7 @@ CONFIG_TEXT_BASE=0xa0000000
> CONFIG_MALLOC_BASE=0x90000000
> CONFIG_MALLOC_SIZE=0x10000000
> CONFIG_KALLSYMS=y
> +CONFIG_ARM_BOARD_APPEND_ATAG=y
> CONFIG_PROMPT="barebox> "
> CONFIG_LONGHELP=y
> CONFIG_GLOB=y
> diff --git a/arch/arm/include/asm/armlinux.h b/arch/arm/include/asm/armlinux.h
> index 8ec8c4d..07479fb 100644
> --- a/arch/arm/include/asm/armlinux.h
> +++ b/arch/arm/include/asm/armlinux.h
> @@ -2,6 +2,7 @@
> #define __ARCH_ARMLINUX_H
>
> #include <asm/memory.h>
> +#include <asm/setup.h>
>
> #if defined CONFIG_ARM_LINUX
> void armlinux_set_bootparams(void *params);
> @@ -26,6 +27,14 @@ static inline void armlinux_set_serial(u64 serial)
> }
> #endif
>
> +#if defined CONFIG_ARM_BOARD_APPEND_ATAG
> +void armlinux_set_atag_appender(struct tag *(*)(struct tag *));
> +#else
> +static inline void armlinux_set_atag_appender(struct tag *(*func)(struct tag *))
> +{
> +}
> +#endif
> +
> struct image_data;
>
> void start_linux(void *adr, int swap, unsigned long initrd_address,
> diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
> index 9c134ed..40a63ea 100644
> --- a/arch/arm/lib/armlinux.c
> +++ b/arch/arm/lib/armlinux.c
> @@ -106,6 +106,14 @@ u64 armlinux_get_serial(void)
> #endif
> }
>
> +#ifdef CONFIG_ARM_BOARD_APPEND_ATAG
> +static struct tag *(*atag_appender)(struct tag *);
> +void armlinux_set_atag_appender(struct tag *(*func)(struct tag *))
> +{
> + atag_appender = func;
> +}
> +#endif
> +
> static void setup_start_tag(void)
> {
> params = (struct tag *)armlinux_bootparams;
> @@ -233,6 +241,10 @@ static void setup_tags(unsigned long initrd_address,
>
> setup_revision_tag();
> setup_serial_tag();
> +#ifdef CONFIG_ARM_BOARD_APPEND_ATAG
> + if (atag_appender != NULL)
> + params = atag_appender(params);
> +#endif
> setup_end_tag();
>
> printf("commandline: %s\n"
> --
> 1.8.1.1
>
>
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list