From patchwork Fri Feb 6 11:09:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Kerr X-Patchwork-Id: 437143 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 5D708140271 for ; Fri, 6 Feb 2015 22:09:29 +1100 (AEDT) Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by lists.ozlabs.org (Postfix) with ESMTP id 33F841A0B85 for ; Fri, 6 Feb 2015 22:09:29 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from ozlabs.org (ozlabs.org [103.22.144.67]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 5A3861A0A5F for ; Fri, 6 Feb 2015 22:09:25 +1100 (AEDT) Received: by ozlabs.org (Postfix, from userid 1023) id 3D8C7140216; Fri, 6 Feb 2015 22:09:25 +1100 (AEDT) MIME-Version: 1.0 Message-Id: <1423220959.396473.157387982409.2.gpush@pablo> In-Reply-To: <1423220959.396253.252628446422.1.gpush@pablo> To: skiboot@lists.ozlabs.org From: Jeremy Kerr Date: Fri, 06 Feb 2015 19:09:19 +0800 Subject: [Skiboot] [RFC, PATCH 2/3] core/flash: port pnor_load_resource to flash code 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: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Since we have a flash device registered as the system flash, use this as a generic load_resource backend. Signed-off-by: Jeremy Kerr Reviewed-by: Joel Stanley --- core/flash.c | 78 ++++++++++++++++++++++++++++++++++++ platforms/astbmc/astbmc.h | 1 platforms/astbmc/habanero.c | 2 platforms/astbmc/palmetto.c | 2 platforms/astbmc/pnor.c | 54 ------------------------ 5 files changed, 80 insertions(+), 57 deletions(-) diff --git a/core/flash.c b/core/flash.c index 4a4198d..e68b41e 100644 --- a/core/flash.c +++ b/core/flash.c @@ -218,3 +218,81 @@ static int64_t opal_flash_erase(uint64_t id, uint64_t offset, uint64_t size, opal_call(OPAL_FLASH_READ, opal_flash_read, 5); opal_call(OPAL_FLASH_WRITE, opal_flash_write, 5); opal_call(OPAL_FLASH_WRITE, opal_flash_erase, 4); + +/* flash resource API */ + +static const struct { + enum resource_id id; + char name[PART_NAME_MAX+1]; +} part_name_map[] = { + { RESOURCE_ID_KERNEL, "KERNEL" }, + { RESOURCE_ID_INITRAMFS, "ROOTFS" }, +}; + +bool flash_load_resource(enum resource_id id, void *buf, size_t *len) +{ + int i, rc, part_num, part_size, part_start; + struct ffs_handle *ffs; + struct flash *flash; + const char *name; + bool status; + + status = false; + + lock(&flash_lock); + + if (!system_flash) + goto out_unlock; + + flash = system_flash; + + for (i = 0, name = NULL; i < ARRAY_SIZE(part_name_map); i++) { + if (part_name_map[i].id == id) { + name = part_name_map[i].name; + break; + } + } + if (!name) { + prerror("FLASH: Couldn't find partition for id %d\n", id); + goto out_unlock; + } + + rc = ffs_open_flash(flash->chip, 0, flash->size, &ffs); + if (rc) { + prerror("FLASH: Can't open ffs handle\n"); + goto out_unlock; + } + + rc = ffs_lookup_part(ffs, name, &part_num); + if (rc) { + prerror("FLASH: No %s partition\n", name); + goto out_free_ffs; + } + rc = ffs_part_info(ffs, part_num, NULL, + &part_start, &part_size, NULL); + if (rc) { + prerror("FLASH: Failed to get %s partition info\n", name); + goto out_free_ffs; + } + + if (part_size > *len) { + prerror("FLASH: %s image too large (%d > %zd)\n", name, + part_size, *len); + goto out_free_ffs; + } + + rc = flash_read(flash->chip, part_start, buf, part_size); + if (rc) { + prerror("FLASH: failed to read %s partition\n", name); + goto out_free_ffs; + } + + *len = part_size; + status = true; + +out_free_ffs: + ffs_close(ffs); +out_unlock: + unlock(&flash_lock); + return status; +} diff --git a/platforms/astbmc/astbmc.h b/platforms/astbmc/astbmc.h index 7e33f61..cee475a 100644 --- a/platforms/astbmc/astbmc.h +++ b/platforms/astbmc/astbmc.h @@ -24,6 +24,5 @@ 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 bool pnor_load_resource(enum resource_id id, void *buf, size_t *len); #endif /* __ASTBMC_H */ diff --git a/platforms/astbmc/habanero.c b/platforms/astbmc/habanero.c index a19aafd..0ec867f 100644 --- a/platforms/astbmc/habanero.c +++ b/platforms/astbmc/habanero.c @@ -49,5 +49,5 @@ DECLARE_PLATFORM(habanero) = { .external_irq = astbmc_ext_irq, .cec_power_down = astbmc_ipmi_power_down, .cec_reboot = astbmc_ipmi_reboot, - .load_resource = pnor_load_resource, + .load_resource = flash_load_resource, }; diff --git a/platforms/astbmc/palmetto.c b/platforms/astbmc/palmetto.c index cfa7236..ff8d8ec 100644 --- a/platforms/astbmc/palmetto.c +++ b/platforms/astbmc/palmetto.c @@ -51,5 +51,5 @@ DECLARE_PLATFORM(palmetto) = { .cec_power_down = astbmc_ipmi_power_down, .cec_reboot = astbmc_ipmi_reboot, .elog_commit = ipmi_elog_commit, - .load_resource = pnor_load_resource, + .load_resource = flash_load_resource, }; diff --git a/platforms/astbmc/pnor.c b/platforms/astbmc/pnor.c index 2cdb29b..c56ac63 100644 --- a/platforms/astbmc/pnor.c +++ b/platforms/astbmc/pnor.c @@ -84,58 +84,4 @@ int pnor_init(void) return rc; } -static const struct { - enum resource_id id; - char name[PART_NAME_MAX+1]; -} part_name_map[] = { - { RESOURCE_ID_KERNEL, "KERNEL" }, - { RESOURCE_ID_INITRAMFS, "ROOTFS" }, -}; -bool pnor_load_resource(enum resource_id id, void *buf, size_t *len) -{ - int i, rc, part_num, part_size, part_start; - const char *name; - - if (!pnor_ffs || !pnor_chip) - return false; - - for (i = 0, name = NULL; i < ARRAY_SIZE(part_name_map); i++) { - if (part_name_map[i].id == id) { - name = part_name_map[i].name; - break; - } - } - if (!name) { - prerror("PLAT: Couldn't find partition for id %d\n", id); - return false; - } - - rc = ffs_lookup_part(pnor_ffs, name, &part_num); - if (rc) { - prerror("PLAT: No %s partition in PNOR\n", name); - return false; - } - 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 false; - } - - if (part_size > *len) { - prerror("PLAT: %s image too large (%d > %zd)\n", name, - part_size, *len); - return false; - } - - rc = flash_read(pnor_chip, part_start, buf, part_size); - if (rc) { - prerror("PLAT: failed to read %s partition\n", name); - return false; - } - - *len = part_size; - - return true; -}