[Skiboot] [PATCH REBASE 1/2] libflash: introduce blocklevel interface

Cyril Bur cyril.bur at au1.ibm.com
Tue Jun 2 10:51:01 AEST 2015


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 <cyril.bur at au1.ibm.com>
---
 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 <unistd.h>
+#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 <stdint.h>
+
+/*
+ * 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 */
-- 
1.9.1



More information about the Skiboot mailing list