[Skiboot] [PATCH 1/2] libflash: introduce blocklevel interface
Alistair Popple
alistair at popple.id.au
Thu May 21 11:44:25 AEST 2015
Looks good to me (one minor comment below).
Signed-off-by: Alistair Popple <alistair at popple.id.au>
Reviewed-by: Alistair Popple <alistair at 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 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
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 */
More information about the Skiboot
mailing list