From patchwork Wed Jul 9 03:37:59 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 368070 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 392CC140087 for ; Wed, 9 Jul 2014 13:41:48 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 51E61AB625; Wed, 9 Jul 2014 05:41:15 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id m5rAB9Tg8SsU; Wed, 9 Jul 2014 05:41:15 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 10BECAB62B; Wed, 9 Jul 2014 05:39:28 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 7ADDFAB5B9 for ; Wed, 9 Jul 2014 05:39:19 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TL7yMJc+MQTo for ; Wed, 9 Jul 2014 05:39:18 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-ob0-f202.google.com (mail-ob0-f202.google.com [209.85.214.202]) by theia.denx.de (Postfix) with ESMTPS id 1A2F0AB5EA for ; Wed, 9 Jul 2014 05:38:57 +0200 (CEST) Received: by mail-ob0-f202.google.com with SMTP id va2so1480618obc.5 for ; Tue, 08 Jul 2014 20:38:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=67MFRSWEEt3s2B5CDcTE4Tok1zZuk/0tarN3+ycrdZg=; b=SzFIN4yifXDEd9W5CZnTeuFXFYPll0rYTVAU+MO18D06A9Y6KDX8qYoO2U121NAU55 U5pLyBTOFb+OpJ4eSfOchGNr7kakM345iYU8WiXZJw6vVjia6iJ+Pe7SCzIaDhNfWyvf 4CLkmccwvCwl2455Or5pbA2XNKMWgLSMxGS4+I8PXY8M5zZyf+hRVpaikXzoyNyxEZ7h r9N7df26Bj+UvE7Vf27sOg1J7JLgCmmnN84tjE2tZWD/c9CwMh50qpWcuovC+X73rkqv rh1UpIj65eaONLfwVwMH+45wXYQirTuszDqT0SWfUPcLBLPp4CkbyhJNcWrItVeVQjVG iK4g== X-Gm-Message-State: ALoCoQlKjSWouuU0PmHAzqTXF0qs2IE9qrQVUT4dbEKP/r/23JWxpxHKnMbHozu4Z16j4uPQMxRi X-Received: by 10.50.98.69 with SMTP id eg5mr3448910igb.7.1404877136328; Tue, 08 Jul 2014 20:38:56 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id j5si2683051yhi.1.2014.07.08.20.38.56 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 08 Jul 2014 20:38:56 -0700 (PDT) Received: from kaki.bld.corp.google.com (kaki.bld.corp.google.com [172.29.216.32]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id 0FF9D5A4AF3; Tue, 8 Jul 2014 20:38:56 -0700 (PDT) Received: by kaki.bld.corp.google.com (Postfix, from userid 121222) id 5D6D6220C56; Tue, 8 Jul 2014 21:38:55 -0600 (MDT) From: Simon Glass To: U-Boot Mailing List Date: Tue, 8 Jul 2014 21:37:59 -0600 Message-Id: <1404877099-7314-10-git-send-email-sjg@chromium.org> X-Mailer: git-send-email 2.0.0.526.g5318336 In-Reply-To: <1404877099-7314-1-git-send-email-sjg@chromium.org> References: <1404877099-7314-1-git-send-email-sjg@chromium.org> Subject: [U-Boot] [PATCH v2 09/29] dm: Support driver model prior to relocation X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Initialise devices marked 'pre-reloc' and make them available prior to relocation. Note that this requires pre-reloc malloc() to be available. Signed-off-by: Simon Glass --- Changes in v2: - Minor reword to comment for dm_init_and_scan() common/board_f.c | 16 ++++++++++++++++ common/board_r.c | 25 ++++--------------------- drivers/core/root.c | 25 +++++++++++++++++++++++++ include/asm-generic/global_data.h | 3 ++- include/dm/root.h | 13 +++++++++++++ 5 files changed, 60 insertions(+), 22 deletions(-) diff --git a/common/board_f.c b/common/board_f.c index b5e2031..8782c43 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #if defined(CONFIG_CMD_IDE) @@ -52,6 +53,7 @@ #ifdef CONFIG_SANDBOX #include #endif +#include #include /* @@ -787,6 +789,19 @@ static int initf_malloc(void) return 0; } +static int initf_dm(void) +{ +#if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN) + int ret; + + ret = dm_init_and_scan(true); + if (ret) + return ret; +#endif + + return 0; +} + static init_fnc_t init_sequence_f[] = { #ifdef CONFIG_SANDBOX setup_ram_buf, @@ -845,6 +860,7 @@ static init_fnc_t init_sequence_f[] = { init_timebase, #endif initf_malloc, + initf_dm, init_baud_rate, /* initialze baudrate settings */ serial_init, /* serial communications setup */ console_init_f, /* stage 1 init of console */ diff --git a/common/board_r.c b/common/board_r.c index e43a318..a35ffa5 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -273,27 +273,10 @@ static int initr_malloc(void) #ifdef CONFIG_DM static int initr_dm(void) { - int ret; - - ret = dm_init(); - if (ret) { - debug("dm_init() failed: %d\n", ret); - return ret; - } - ret = dm_scan_platdata(false); - if (ret) { - debug("dm_scan_platdata() failed: %d\n", ret); - return ret; - } -#ifdef CONFIG_OF_CONTROL - ret = dm_scan_fdt(gd->fdt_blob, false); - if (ret) { - debug("dm_scan_fdt() failed: %d\n", ret); - return ret; - } -#endif - - return 0; + /* Save the pre-reloc driver model and start a new one */ + gd->dm_root_f = gd->dm_root; + gd->dm_root = NULL; + return dm_init_and_scan(false); } #endif diff --git a/drivers/core/root.c b/drivers/core/root.c index c75b60f..9a7df11 100644 --- a/drivers/core/root.c +++ b/drivers/core/root.c @@ -104,6 +104,31 @@ int dm_scan_fdt(const void *blob, bool pre_reloc_only) } #endif +int dm_init_and_scan(bool pre_reloc_only) +{ + int ret; + + ret = dm_init(); + if (ret) { + debug("dm_init() failed: %d\n", ret); + return ret; + } + ret = dm_scan_platdata(pre_reloc_only); + if (ret) { + debug("dm_scan_platdata() failed: %d\n", ret); + return ret; + } +#ifdef CONFIG_OF_CONTROL + ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only); + if (ret) { + debug("dm_scan_fdt() failed: %d\n", ret); + return ret; + } +#endif + + return 0; +} + /* This is the root driver - all drivers are children of this */ U_BOOT_DRIVER(root_driver) = { .name = "root_driver", diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index f6a2a20..edde9d7 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -65,7 +65,8 @@ typedef struct global_data { struct global_data *new_gd; /* relocated global data */ #ifdef CONFIG_DM - struct udevice *dm_root;/* Root instance for Driver Model */ + struct udevice *dm_root; /* Root instance for Driver Model */ + struct udevice *dm_root_f; /* Pre-relocation root instance */ struct list_head uclass_root; /* Head of core tree */ #endif diff --git a/include/dm/root.h b/include/dm/root.h index d37b452..09f9303 100644 --- a/include/dm/root.h +++ b/include/dm/root.h @@ -45,6 +45,19 @@ int dm_scan_platdata(bool pre_reloc_only); int dm_scan_fdt(const void *blob, bool pre_reloc_only); /** + * dm_init_and_scan() - Initialise Driver Model structures and scan for devices + * + * This function initialises the roots of the driver tree and uclass trees, + * then scans and binds available devices from platform data and the FDT. + * This calls dm_init() to set up Driver Model structures. + * + * @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC + * flag. If false bind all drivers. + * @return 0 if OK, -ve on error + */ +int dm_init_and_scan(bool pre_reloc_only); + +/** * dm_init() - Initialise Driver Model structures * * This function will initialize roots of driver tree and class tree.