diff mbox

[1/2] libflash: introduce blocklevel interface

Message ID 1431587199-15473-2-git-send-email-cyril.bur@au1.ibm.com
State Changes Requested
Headers show

Commit Message

Cyril Bur May 14, 2015, 7:06 a.m. UTC
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>
---
 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

Comments

Alistair Popple May 21, 2015, 1:44 a.m. UTC | #1
Looks good to me (one minor comment below).

Signed-off-by: Alistair Popple <alistair@popple.id.au>
Reviewed-by: Alistair Popple <alistair@popple.id.au>

On Thu, 14 May 2015 17:06:38 Cyril Bur wrote:
> 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>
> ---
>  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

You mean s/libflash/libffs/ right?

> + */
> +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 */
diff mbox

Patch

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 */