/*
 * Copyright (c) 2020, Mediatek Inc. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef UFS_CMNDS_H_
#define UFS_CMNDS_H_

#include "options.h"
#include <asm/types.h>


enum field_width {
	BYTE	= (1 << 0),
	WORD	= (1 << 1),
	DWORD	= (1 << 2),
	DDWORD	= (1 << 3)
};

struct desc_field_offset {
	char *name;
	int offset;
	enum field_width width_in_bytes;
};

enum acc_mode {
	READ_NRML =	(1 << 0),
	READ_ONLY =	(1 << 1),
	WRITE_ONLY =	(1 << 2),
	WRITE_ONCE =	(1 << 3),
	WRITE_PRSIST =	(1 << 4),
	WRITE_VLT =	(1 << 5),
	SET_ONLY =	(1 << 6),
	WRITE_PWR =	(1 << 7),
	MODE_INVALID =	(1 << 8)
};

enum attr_level {
	DEV =		(1 << 0),
	ARRAY =		(1 << 1),
	LEVEL_INVALID =	(1 << 2)
};

enum access_type {
	URD =		(1 << 0),
	UWRT =		(1 << 1),
	ACC_INVALID =	(1 << 2)
};

struct attr_fields {
	char *name;
	enum field_width width_in_bytes;
	enum access_type acc_type;
	enum acc_mode acc_mode;
	enum attr_level device_level;
};

struct flag_fields {
	char *name;
	enum access_type acc_type;
	enum acc_mode acc_mode;
	enum attr_level device_level;
};

int do_desc(struct tool_options *opt);
int do_attributes(struct tool_options *opt);
int do_flags(struct tool_options *opt);
void print_command_help (char *prgname, int config_type);
int do_device_desc(int fd, __u8 *desc_buff);
void desc_help(char *tool_name);
void attribute_help(char *tool_name);
void flag_help(char *tool_name);
#endif /* UFS_CMNDS_H_ */
