From patchwork Thu May 14 07:06:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cyril Bur X-Patchwork-Id: 472241 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 1E9CD140284 for ; Thu, 14 May 2015 17:07:56 +1000 (AEST) Received: from ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 0C0361A045F for ; Thu, 14 May 2015 17:07:56 +1000 (AEST) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from e23smtp04.au.ibm.com (e23smtp04.au.ibm.com [202.81.31.146]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id B65451A0017 for ; Thu, 14 May 2015 17:07:48 +1000 (AEST) Received: from /spool/local by e23smtp04.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 14 May 2015 17:07:48 +1000 Received: from d23dlp03.au.ibm.com (202.81.31.214) by e23smtp04.au.ibm.com (202.81.31.210) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 14 May 2015 17:07:46 +1000 Received: from d23relay07.au.ibm.com (d23relay07.au.ibm.com [9.190.26.37]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id C5F78357804F for ; Thu, 14 May 2015 17:07:45 +1000 (EST) Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay07.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t4E77bvW27262986 for ; Thu, 14 May 2015 17:07:45 +1000 Received: from d23av04.au.ibm.com (localhost [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t4E77CE8012851 for ; Thu, 14 May 2015 17:07:13 +1000 Received: from ozlabs.au.ibm.com (ozlabs.au.ibm.com [9.192.253.14]) by d23av04.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t4E77CCH012312; Thu, 14 May 2015 17:07:12 +1000 Received: from cyril.ozlabs.ibm.com (unknown [9.192.254.114]) (using TLSv1.2 with cipher AES128-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.au.ibm.com (Postfix) with ESMTPSA id 49B6BA027E; Thu, 14 May 2015 17:06:48 +1000 (AEST) From: Cyril Bur To: skiboot@lists.ozlabs.org Date: Thu, 14 May 2015 17:06:38 +1000 Message-Id: <1431587199-15473-2-git-send-email-cyril.bur@au1.ibm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1431587199-15473-1-git-send-email-cyril.bur@au1.ibm.com> References: <1431587199-15473-1-git-send-email-cyril.bur@au1.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15051407-0013-0000-0000-000001403F56 Cc: apopple@au1.ibm.com Subject: [Skiboot] [PATCH 1/2] libflash: introduce blocklevel interface 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" libflash core is really good at accessing hardware flash devices. libffs is really good at read FFS partitioned data and has been designed to use libflash to read data. Problems arise when FFS partitioned data exists on something other than flash hardware, or the hardware cannot be accessed directly. This interface should bridge the gap, allowing libffs to be used no matter what the backing is for the data. This should allow for greater flexibility for reading and writing, such as adding support read-only areas at a global level as well as more straight forward usage of libffs for userspace bypassing libflash entirely. Signed-off-by: Cyril Bur Signed-off-by: Alistair Popple Reviewed-by: Alistair Popple --- libflash/Makefile.inc | 2 +- libflash/blocklevel.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ libflash/blocklevel.h | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 libflash/blocklevel.c create mode 100644 libflash/blocklevel.h diff --git a/libflash/Makefile.inc b/libflash/Makefile.inc index 0850b24..4db02a1 100644 --- a/libflash/Makefile.inc +++ b/libflash/Makefile.inc @@ -1,4 +1,4 @@ -LIBFLASH_SRCS = libflash.c libffs.c ecc.c +LIBFLASH_SRCS = libflash.c libffs.c ecc.c blocklevel.c LIBFLASH_OBJS = $(LIBFLASH_SRCS:%.c=%.o) SUBDIRS += libflash diff --git a/libflash/blocklevel.c b/libflash/blocklevel.c new file mode 100644 index 0000000..35b8c8a --- /dev/null +++ b/libflash/blocklevel.c @@ -0,0 +1,51 @@ +/* Copyright 2013-2015 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "blocklevel.h" + +int blocklevel_read(struct blocklevel_device *bl, uint32_t pos, void *buf, uint32_t len) +{ + if (!bl || !bl->read || !buf) + return -1; + + return bl->read(bl, pos, buf, len); +} + +int blocklevel_write(struct blocklevel_device *bl, uint32_t pos, const void *buf, uint32_t len) +{ + if (!bl || !bl->write || !buf) + return -1; + + return bl->write(bl, pos, buf, len); +} + +int blocklevel_erase(struct blocklevel_device *bl, uint32_t pos, uint32_t len) +{ + if (!bl || !bl->erase) + return -1; + + return bl->erase(bl, pos, len); +} + +int blocklevel_get_info(struct blocklevel_device *bl, const char **name, uint32_t *total_size, + uint32_t *erase_granule) +{ + if (!bl || !bl->get_info) + return -1; + + return bl->get_info(bl, name, total_size, erase_granule); +} diff --git a/libflash/blocklevel.h b/libflash/blocklevel.h new file mode 100644 index 0000000..2e8480d --- /dev/null +++ b/libflash/blocklevel.h @@ -0,0 +1,40 @@ +/* Copyright 2013-2015 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __LIBFLASH_BLOCKLEVEL_H +#define __LIBFLASH_BLOCKLEVEL_H + +#include + +/* + * libffs may be used with different backends, all should provide these for + * libflash to get the information it needs + */ +struct blocklevel_device { + void *priv; + int (*read)(struct blocklevel_device *bl, uint32_t pos, void *buf, uint32_t len); + int (*write)(struct blocklevel_device *bl, uint32_t pos, const void *buf, uint32_t len); + int (*erase)(struct blocklevel_device *bl, uint32_t pos, uint32_t len); + int (*get_info)(struct blocklevel_device *bl, const char **name, uint32_t *total_size, + uint32_t *erase_granule); +}; + +int blocklevel_read(struct blocklevel_device *bl, uint32_t pos, void *buf, uint32_t len); +int blocklevel_write(struct blocklevel_device *bl, uint32_t pos, const void *buf, uint32_t len); +int blocklevel_erase(struct blocklevel_device *bl, uint32_t pos, uint32_t len); +int blocklevel_get_info(struct blocklevel_device *bl, const char **name, uint32_t *total_size, + uint32_t *erase_granule); + +#endif /* __LIBFLASH_BLOCKLEVEL_H */