From patchwork Sun Feb 1 22:18:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Stanley X-Patchwork-Id: 435307 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 6B8411401B1 for ; Mon, 2 Feb 2015 09:18:45 +1100 (AEDT) Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by lists.ozlabs.org (Postfix) with ESMTP id 5B4F21A0D6F for ; Mon, 2 Feb 2015 09:18:45 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from mail-pa0-x230.google.com (mail-pa0-x230.google.com [IPv6:2607:f8b0:400e:c03::230]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 82EA61A075A for ; Mon, 2 Feb 2015 09:18:41 +1100 (AEDT) Received: by mail-pa0-f48.google.com with SMTP id ey11so74349145pad.7 for ; Sun, 01 Feb 2015 14:18:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jms.id.au; s=google; h=from:to:subject:date:message-id; bh=s3+ue5m8TQXQjf1eJMMFVHeJNaPBLEHwrLgEIi8+RvM=; b=Y7UUpMx/yvgLuMr3a45qdZ/YuuyGXeWQTBOtugtLCTEiK8gtUCf3UO8qNggZid8KOu 2NdkvkIBRQeoM2P42NZCGoDQ/5LrykJ/g1BSRZ3F6gxfN/YHlvqDXrppKKqlzuQempXw eiDr47DVnBVryWhNzPRUmg8tBxHoup1VlsBuA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=s3+ue5m8TQXQjf1eJMMFVHeJNaPBLEHwrLgEIi8+RvM=; b=HnBan8doqRMmclok6SL0MI2VNFI3pJ/vtjfYLz03oqzXHy1mlS5GUbQIq2PFou1qTK VtmvmdMVjxtOsXWJpJYnuf/qzqlZYT2KRrVOAUjMiNJIXME/mJndxNMXmpY8qbZc1VV/ uY1iMGM/NLE4zLxBtjNgrI43L9ta/NRVuAeWQgqnSiGJzFZt7Bd1mGB8WJzhmv0pusEj AC4tw+Q7OrmTQeyp2bhp1i2Rv6b+QzuWO9U4w/HZincf3QZC5IdoYmpyWoR3PONDbj/7 EcOkEWRmP99Soq8TvDhRlYvi3lUmyJbSr7iUa7crTunOvj5/w1AHnVHntaVbSliaYbk6 NUtw== X-Gm-Message-State: ALoCoQkfzveIXDMHTsI7sADAzNIrL4uOZHpE8wXqzFS4SoEAfIB1Nnh0O+MjaM2a9Mf/PH6s25AF X-Received: by 10.66.118.198 with SMTP id ko6mr24576466pab.96.1422829118591; Sun, 01 Feb 2015 14:18:38 -0800 (PST) Received: from icarus.jms.id.au ([118.211.49.23]) by mx.google.com with ESMTPSA id fl2sm17035593pab.2.2015.02.01.14.18.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 01 Feb 2015 14:18:37 -0800 (PST) Received: by icarus.jms.id.au (Postfix, from userid 1000) id 67471101076; Mon, 2 Feb 2015 08:48:28 +1030 (ACDT) From: Joel Stanley To: skiboot@lists.ozlabs.org Date: Mon, 2 Feb 2015 08:48:26 +1030 Message-Id: <1422829106-14518-1-git-send-email-joel@jms.id.au> X-Mailer: git-send-email 2.1.4 Subject: [Skiboot] [PATCH] astbmc: Allow loading of separate payload from flash X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" To date BMC platforms have had their payload built in to the skiboot binary. This patch adds the option of loading from a flash partition instead. If the partition named SKIROOT cannot be found, the core loading logic will fall back to using the built-in payload. In this case, the user gets the following messages: [2214557191,3] PLAT: No SKIROOT partition in PNOR. [2220486159,5] INIT: platform kernel load failed. [2221293286,5] Using built-in kernel. [2265861935,5] INIT: Kernel loaded, size: 14706638 bytes (0 = unknown preload). Signed-off-by: Joel Stanley --- platforms/astbmc/astbmc.h | 2 ++ platforms/astbmc/common.c | 9 +++++++++ platforms/astbmc/habanero.c | 1 + platforms/astbmc/palmetto.c | 1 + platforms/astbmc/pnor.c | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 50 insertions(+) diff --git a/platforms/astbmc/astbmc.h b/platforms/astbmc/astbmc.h index cee475a..5a8248d 100644 --- a/platforms/astbmc/astbmc.h +++ b/platforms/astbmc/astbmc.h @@ -24,5 +24,7 @@ extern int64_t astbmc_ipmi_power_down(uint64_t request); extern void astbmc_init(void); extern void astbmc_ext_irq(unsigned int chip_id); extern int pnor_init(void); +extern int pnor_load_part(const char *name, void *addr, size_t *len); +extern bool astbmc_load_resource(enum resource_id id, void *buf, size_t *len); #endif /* __ASTBMC_H */ diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c index f9c988d..3145b9f 100644 --- a/platforms/astbmc/common.c +++ b/platforms/astbmc/common.c @@ -337,3 +337,12 @@ void astbmc_early_init(void) /* Setup UART and use it as console with interrupts */ uart_init(true); } + +bool astbmc_load_resource(enum resource_id id, void *buf, size_t *len) +{ + if (id != RESOURCE_ID_KERNEL) + /* Initramfs provided with the kernel image */ + return false; + + return pnor_load_part("SKIROOT", buf, len) == OPAL_SUCCESS; +} diff --git a/platforms/astbmc/habanero.c b/platforms/astbmc/habanero.c index d442d1f..66681e6 100644 --- a/platforms/astbmc/habanero.c +++ b/platforms/astbmc/habanero.c @@ -49,4 +49,5 @@ DECLARE_PLATFORM(habanero) = { .external_irq = astbmc_ext_irq, .cec_power_down = astbmc_ipmi_power_down, .cec_reboot = astbmc_ipmi_reboot, + .load_resource = astbmc_load_resource, }; diff --git a/platforms/astbmc/palmetto.c b/platforms/astbmc/palmetto.c index a0030e8..402c714 100644 --- a/platforms/astbmc/palmetto.c +++ b/platforms/astbmc/palmetto.c @@ -51,4 +51,5 @@ DECLARE_PLATFORM(palmetto) = { .cec_power_down = astbmc_ipmi_power_down, .cec_reboot = astbmc_ipmi_reboot, .elog_commit = ipmi_elog_commit, + .load_resource = astbmc_load_resource, }; diff --git a/platforms/astbmc/pnor.c b/platforms/astbmc/pnor.c index f6e7a5d..87dd4f3 100644 --- a/platforms/astbmc/pnor.c +++ b/platforms/astbmc/pnor.c @@ -85,3 +85,40 @@ int pnor_init(void) return rc; } +int pnor_load_part(const char *name, void *dst, size_t *len) +{ + int rc, part_num, part_size, part_start; + + if (!pnor_ffs || !pnor_chip) { + prerror("PLAT: PNOR not initialized\n"); + return OPAL_HARDWARE; + } + + rc = ffs_lookup_part(pnor_ffs, name, &part_num); + if (rc) { + prerror("PLAT: No %s partition in PNOR\n", name); + return OPAL_HARDWARE; + } + rc = ffs_part_info(pnor_ffs, part_num, NULL, + &part_start, &part_size, NULL); + if (rc) { + prerror("PLAT: Failed to get %s partition info\n", name); + return OPAL_HARDWARE; + } + + if (part_size > *len) { + prerror("PLAT: %s image too large (%d > %zd)\n", name, + part_size, *len); + return OPAL_HARDWARE; + } + + rc = flash_read(pnor_chip, part_start, dst, part_size); + if (rc) { + prerror("PLAT: failed to read %s partition\n", name); + return OPAL_HARDWARE; + } + + *len = part_size; + + return OPAL_SUCCESS; +}