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