Re: [PATCH v2 19/46] mtd: nandsim: UAPI v1

From: Boris Brezillon
Date: Sun Nov 20 2016 - 05:13:50 EST


Daniel, Richard,

On Wed, 21 Sep 2016 11:50:45 +0200
Daniel Walter <dwalter@xxxxxxxxxxxxx> wrote:

> From: Richard Weinberger <richard@xxxxxx>
>
> Expose nandsim creation and delete functions
> to user-space

Did you consider using configfs for nandsim dev creation/removal. The
main benefit I see in using configfs is that you can extend the
parameters without breaking the ABI.

Here is an example of what I have in mind:

mtdsim subsystem:

<configfs-mountpoint>/mtdsim

nand backend:

<configfs-mountpoint>/mtdsim/nand

create and configure a new nandsim device:

mkdir <configfs-mountpoint>/mtdsim/nand/<dev-name>
echo xxx > <configfs-mountpoint>/mtdsim/nand/<dev-name>/pagesize
echo xxx > <configfs-mountpoint>/mtdsim/nand/<dev-name>/oobsize
...

create and configure a partitition:

mkdir <configfs-mountpoint>/mtdsim/nand/<dev-name>/<part-name>
echo xxx > <configfs-mountpoint>/mtdsim/nand/<dev-name>/<part-name>/offset
echo xxx > <configfs-mountpoint>/mtdsim/nand/<dev-name>/<part-name>/size

Once your done with the configuration of your nandsim device, you
can register it by doing:

echo 1 > <configfs-mountpoint>/mtdsim/nand/<dev-name>/enable

and unregister it with:

echo 0 > <configfs-mountpoint>/mtdsim/nand/<dev-name>/enable

This way, each time you need to add a new feature (bitflips emulation,
paired pages emulation, ...) or a new property, you can just add an
extra attribute to the configfs interface without breaking the previous
ABI.

I'd really prefer this solution over the nandsim_ctrl dev exposed in
/dev/.

What do you think.

>
> Signed-off-by: Richard Weinberger <richard@xxxxxx>
> ---
> include/uapi/mtd/nandsim-user.h | 102 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 102 insertions(+)
> create mode 100644 include/uapi/mtd/nandsim-user.h
>
> diff --git a/include/uapi/mtd/nandsim-user.h b/include/uapi/mtd/nandsim-user.h
> new file mode 100644
> index 0000000..b52d620
> --- /dev/null
> +++ b/include/uapi/mtd/nandsim-user.h
> @@ -0,0 +1,102 @@
> +#ifndef __NANDSIM_USER_H__
> +#define __NANDSIM_USER_H__
> +
> +#include <linux/types.h>
> +
> +#define NANDSIM_IOC_MAGIC 'n'
> +
> +#define NANDSIM_IOC_NEW_INSTANCE _IOW(NANDSIM_IOC_MAGIC, 0, struct ns_new_instance_req)
> +#define NANDSIM_IOC_DESTROY_INSTANCE _IOW(NANDSIM_IOC_MAGIC, 1, struct ns_destroy_instance_req)
> +
> +#define NANDSIM_MAX_DEVICES 32
> +#define NANDSIM_MAX_PARTS 32
> +
> +enum ns_backend_type {
> + NANDSIM_BACKEND_RAM = 0,
> + NANDSIM_BACKEND_CACHEFILE = 1,
> + NANDSIM_BACKEND_FILE = 2,
> + NANDSIM_BACKEND_MAX,
> +};
> +
> +/**
> + * struct ns_new_instance_req - Create a new nandsim instance.
> + *
> + * @id_bytes: NAND ID of the simulated NAND chip
> + * @bus_width: bus width to emulate, either 8 or 16
> + * @bbt_mode: bad block table mode, 0 OOB, 1 BBT with marker in OOB,
> + * 2 BBT with marker in data area
> + * @no_oob: backing file contains no OOB data
> + * @bch_strength: instead of hamming ECC use BCH with given strength
> + * @parts_num: number of MTD partitions to create
> + * @parts: partition sizes in physical erase blocks, used then @parts_num > 0
> + * @backend: backend type, see @ns_backend_type
> + * @file_fd: file describtor of backend, only for @NANDSIM_BACKEND_CACHEFILE
> + * and @NANDSIM_BACKEND_FILE.
> + * @bitflips: maximum number of random bit flips per page
> + * @overridesize: specifies the NAND size overriding the ID bytes
> + * @access_delay: initial page access delay (microseconds)
> + * @program_delay: page program delay (microseconds)
> + * @erase_delay: sector erase delay (milliseconds)
> + * @output_cycle: word output, from flash, time (nanoseconds)
> + * @input_cycle: word input, to flash, time (nanoseconds)
> + * @simelem_num: number of simulation elements appened to this
> + * data structure. see @ns_simelement_prop
> + *
> + * This struct is used with the @NANDSIM_IOC_NEW_INSTANCE ioctl command.
> + * It creates a new nandsim instance from the given parameter.
> + * The ioctl command returns in case of success the nandsim id of the new
> + * instance, in case of error a negative value.
> + *
> + * Not all fields in the struct have to be filled, if nandsim should
> + * use a default ignore the value, fill with 0.
> + * The only mandatory fields are @id_bytes and @bus_width.
> + * When @no_oob is non-zero @bch_strength cannot be used since
> + * @no_oob implies that no ECC is used.
> + */
> +struct ns_new_instance_req {
> + __s8 id_bytes[8];
> +
> + __s8 bus_width;
> + __s8 bbt_mode;
> + __s8 no_oob;
> + __s32 bch_strength;
> +
> + __s8 parts_num;
> + __s32 parts[NANDSIM_MAX_PARTS];
> +
> + __s8 backend;
> + __s32 file_fd;
> +
> + __s32 bitflips;
> + __s32 overridesize;
> + __s32 access_delay;
> + __s32 program_delay;
> + __s32 erase_delay;
> + __s32 output_cycle;
> + __s32 input_cycle;
> +
> + __s32 padding[4];
> +
> + __s32 simelem_num;
> +} __packed;
> +
> +enum {
> + NANDSIM_SIMELEM_BADBLOCK = 0,
> + NANDSIM_SIMELEM_WEAKBLOCK,
> + NANDSIM_SIMELEM_WEAKPAGE,
> + NANDSIM_SIMELEM_GRAVEPAGE,
> +};
> +
> +struct ns_simelement_prop {
> + __s8 elem_type;
> + __s32 elem_id;
> + __s32 elem_attr;
> + __s8 padding[7];
> +} __packed;
> +
> +struct ns_destroy_instance_req {
> + __s8 id;
> + __s8 padding[7];
> +} __packed;
> +
> +#endif /* __NANDSIM_USER_H__ */