162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2020, MIPI Alliance, Inc.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Nicolas Pitre <npitre@baylibre.com>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Common command/response related stuff
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef CMD_H
1162306a36Sopenharmony_ci#define CMD_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci * Those bits are common to all descriptor formats and
1562306a36Sopenharmony_ci * may be manipulated by the core code.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci#define CMD_0_TOC			W0_BIT_(31)
1862306a36Sopenharmony_ci#define CMD_0_ROC			W0_BIT_(30)
1962306a36Sopenharmony_ci#define CMD_0_ATTR			W0_MASK(2, 0)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/*
2262306a36Sopenharmony_ci * Response Descriptor Structure
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci#define RESP_STATUS(resp)		FIELD_GET(GENMASK(31, 28), resp)
2562306a36Sopenharmony_ci#define RESP_TID(resp)			FIELD_GET(GENMASK(27, 24), resp)
2662306a36Sopenharmony_ci#define RESP_DATA_LENGTH(resp)		FIELD_GET(GENMASK(21,  0), resp)
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define RESP_ERR_FIELD			GENMASK(31, 28)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cienum hci_resp_err {
3162306a36Sopenharmony_ci	RESP_SUCCESS			= 0x0,
3262306a36Sopenharmony_ci	RESP_ERR_CRC			= 0x1,
3362306a36Sopenharmony_ci	RESP_ERR_PARITY			= 0x2,
3462306a36Sopenharmony_ci	RESP_ERR_FRAME			= 0x3,
3562306a36Sopenharmony_ci	RESP_ERR_ADDR_HEADER		= 0x4,
3662306a36Sopenharmony_ci	RESP_ERR_BCAST_NACK_7E		= 0x4,
3762306a36Sopenharmony_ci	RESP_ERR_NACK			= 0x5,
3862306a36Sopenharmony_ci	RESP_ERR_OVL			= 0x6,
3962306a36Sopenharmony_ci	RESP_ERR_I3C_SHORT_READ		= 0x7,
4062306a36Sopenharmony_ci	RESP_ERR_HC_TERMINATED		= 0x8,
4162306a36Sopenharmony_ci	RESP_ERR_I2C_WR_DATA_NACK	= 0x9,
4262306a36Sopenharmony_ci	RESP_ERR_BUS_XFER_ABORTED	= 0x9,
4362306a36Sopenharmony_ci	RESP_ERR_NOT_SUPPORTED		= 0xa,
4462306a36Sopenharmony_ci	RESP_ERR_ABORTED_WITH_CRC	= 0xb,
4562306a36Sopenharmony_ci	/* 0xc to 0xf are reserved for transfer specific errors */
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* TID generation (4 bits wide in all cases) */
4962306a36Sopenharmony_ci#define hci_get_tid(bits) \
5062306a36Sopenharmony_ci	(atomic_inc_return_relaxed(&hci->next_cmd_tid) % (1U << 4))
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* This abstracts operations with our command descriptor formats */
5362306a36Sopenharmony_cistruct hci_cmd_ops {
5462306a36Sopenharmony_ci	int (*prep_ccc)(struct i3c_hci *hci, struct hci_xfer *xfer,
5562306a36Sopenharmony_ci			u8 ccc_addr, u8 ccc_cmd, bool raw);
5662306a36Sopenharmony_ci	void (*prep_i3c_xfer)(struct i3c_hci *hci, struct i3c_dev_desc *dev,
5762306a36Sopenharmony_ci			      struct hci_xfer *xfer);
5862306a36Sopenharmony_ci	void (*prep_i2c_xfer)(struct i3c_hci *hci, struct i2c_dev_desc *dev,
5962306a36Sopenharmony_ci			      struct hci_xfer *xfer);
6062306a36Sopenharmony_ci	int (*perform_daa)(struct i3c_hci *hci);
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* Our various instances */
6462306a36Sopenharmony_ciextern const struct hci_cmd_ops mipi_i3c_hci_cmd_v1;
6562306a36Sopenharmony_ciextern const struct hci_cmd_ops mipi_i3c_hci_cmd_v2;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#endif
68