[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