aboutsummaryrefslogtreecommitdiff
path: root/libflash
diff options
context:
space:
mode:
authorCyril Bur <cyril.bur@au1.ibm.com>2015-06-02 10:51:01 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-06-09 16:37:33 +1000
commit1fd9d5afc6aff3870695110c74a4a9daa88e5c81 (patch)
tree67f1c64d8b67ee3298deb5b03c7563780b39146d /libflash
parentd21a0c4952dfe08870f07eeeb43158dd31cab6a9 (diff)
downloadskiboot-1fd9d5afc6aff3870695110c74a4a9daa88e5c81.zip
skiboot-1fd9d5afc6aff3870695110c74a4a9daa88e5c81.tar.gz
skiboot-1fd9d5afc6aff3870695110c74a4a9daa88e5c81.tar.bz2
libflash: introduce blocklevel interface
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@au1.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'libflash')
-rw-r--r--libflash/Makefile.inc2
-rw-r--r--libflash/blocklevel.c51
-rw-r--r--libflash/blocklevel.h40
3 files changed, 92 insertions, 1 deletions
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 */