68 lines
1.9 KiB
C
68 lines
1.9 KiB
C
|
/* SPDX-License-Identifier: BSD-3-Clause */
|
||
|
/*
|
||
|
* Copyright (c) 2020, MIPI Alliance, Inc.
|
||
|
*
|
||
|
* Author: Nicolas Pitre <npitre@baylibre.com>
|
||
|
*
|
||
|
* Common command/response related stuff
|
||
|
*/
|
||
|
|
||
|
#ifndef CMD_H
|
||
|
#define CMD_H
|
||
|
|
||
|
/*
|
||
|
* Those bits are common to all descriptor formats and
|
||
|
* may be manipulated by the core code.
|
||
|
*/
|
||
|
#define CMD_0_TOC W0_BIT_(31)
|
||
|
#define CMD_0_ROC W0_BIT_(30)
|
||
|
#define CMD_0_ATTR W0_MASK(2, 0)
|
||
|
|
||
|
/*
|
||
|
* Response Descriptor Structure
|
||
|
*/
|
||
|
#define RESP_STATUS(resp) FIELD_GET(GENMASK(31, 28), resp)
|
||
|
#define RESP_TID(resp) FIELD_GET(GENMASK(27, 24), resp)
|
||
|
#define RESP_DATA_LENGTH(resp) FIELD_GET(GENMASK(21, 0), resp)
|
||
|
|
||
|
#define RESP_ERR_FIELD GENMASK(31, 28)
|
||
|
|
||
|
enum hci_resp_err {
|
||
|
RESP_SUCCESS = 0x0,
|
||
|
RESP_ERR_CRC = 0x1,
|
||
|
RESP_ERR_PARITY = 0x2,
|
||
|
RESP_ERR_FRAME = 0x3,
|
||
|
RESP_ERR_ADDR_HEADER = 0x4,
|
||
|
RESP_ERR_BCAST_NACK_7E = 0x4,
|
||
|
RESP_ERR_NACK = 0x5,
|
||
|
RESP_ERR_OVL = 0x6,
|
||
|
RESP_ERR_I3C_SHORT_READ = 0x7,
|
||
|
RESP_ERR_HC_TERMINATED = 0x8,
|
||
|
RESP_ERR_I2C_WR_DATA_NACK = 0x9,
|
||
|
RESP_ERR_BUS_XFER_ABORTED = 0x9,
|
||
|
RESP_ERR_NOT_SUPPORTED = 0xa,
|
||
|
RESP_ERR_ABORTED_WITH_CRC = 0xb,
|
||
|
/* 0xc to 0xf are reserved for transfer specific errors */
|
||
|
};
|
||
|
|
||
|
/* TID generation (4 bits wide in all cases) */
|
||
|
#define hci_get_tid(bits) \
|
||
|
(atomic_inc_return_relaxed(&hci->next_cmd_tid) % (1U << 4))
|
||
|
|
||
|
/* This abstracts operations with our command descriptor formats */
|
||
|
struct hci_cmd_ops {
|
||
|
int (*prep_ccc)(struct i3c_hci *hci, struct hci_xfer *xfer,
|
||
|
u8 ccc_addr, u8 ccc_cmd, bool raw);
|
||
|
void (*prep_i3c_xfer)(struct i3c_hci *hci, struct i3c_dev_desc *dev,
|
||
|
struct hci_xfer *xfer);
|
||
|
void (*prep_i2c_xfer)(struct i3c_hci *hci, struct i2c_dev_desc *dev,
|
||
|
struct hci_xfer *xfer);
|
||
|
int (*perform_daa)(struct i3c_hci *hci);
|
||
|
};
|
||
|
|
||
|
/* Our various instances */
|
||
|
extern const struct hci_cmd_ops mipi_i3c_hci_cmd_v1;
|
||
|
extern const struct hci_cmd_ops mipi_i3c_hci_cmd_v2;
|
||
|
|
||
|
#endif
|