cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nci_core.h (13183B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 *  The NFC Controller Interface is the communication protocol between an
      4 *  NFC Controller (NFCC) and a Device Host (DH).
      5 *
      6 *  Copyright (C) 2011 Texas Instruments, Inc.
      7 *  Copyright (C) 2013 Intel Corporation. All rights reserved.
      8 *  Copyright (C) 2014 Marvell International Ltd.
      9 *
     10 *  Written by Ilan Elias <ilane@ti.com>
     11 *
     12 *  Acknowledgements:
     13 *  This file is based on hci_core.h, which was written
     14 *  by Maxim Krasnyansky.
     15 */
     16
     17#ifndef __NCI_CORE_H
     18#define __NCI_CORE_H
     19
     20#include <linux/interrupt.h>
     21#include <linux/skbuff.h>
     22#include <linux/tty.h>
     23
     24#include <net/nfc/nfc.h>
     25#include <net/nfc/nci.h>
     26
     27/* NCI device flags */
     28enum nci_flag {
     29	NCI_INIT,
     30	NCI_UP,
     31	NCI_DATA_EXCHANGE,
     32	NCI_DATA_EXCHANGE_TO,
     33	NCI_UNREG,
     34};
     35
     36/* NCI device states */
     37enum nci_state {
     38	NCI_IDLE,
     39	NCI_DISCOVERY,
     40	NCI_W4_ALL_DISCOVERIES,
     41	NCI_W4_HOST_SELECT,
     42	NCI_POLL_ACTIVE,
     43	NCI_LISTEN_ACTIVE,
     44	NCI_LISTEN_SLEEP,
     45};
     46
     47/* NCI timeouts */
     48#define NCI_RESET_TIMEOUT			5000
     49#define NCI_INIT_TIMEOUT			5000
     50#define NCI_SET_CONFIG_TIMEOUT			5000
     51#define NCI_RF_DISC_TIMEOUT			5000
     52#define NCI_RF_DISC_SELECT_TIMEOUT		5000
     53#define NCI_RF_DEACTIVATE_TIMEOUT		30000
     54#define NCI_CMD_TIMEOUT				5000
     55#define NCI_DATA_TIMEOUT			700
     56
     57struct nci_dev;
     58
     59struct nci_driver_ops {
     60	__u16 opcode;
     61	int (*rsp)(struct nci_dev *dev, struct sk_buff *skb);
     62	int (*ntf)(struct nci_dev *dev, struct sk_buff *skb);
     63};
     64
     65struct nci_ops {
     66	int   (*init)(struct nci_dev *ndev);
     67	int   (*open)(struct nci_dev *ndev);
     68	int   (*close)(struct nci_dev *ndev);
     69	int   (*send)(struct nci_dev *ndev, struct sk_buff *skb);
     70	int   (*setup)(struct nci_dev *ndev);
     71	int   (*post_setup)(struct nci_dev *ndev);
     72	int   (*fw_download)(struct nci_dev *ndev, const char *firmware_name);
     73	__u32 (*get_rfprotocol)(struct nci_dev *ndev, __u8 rf_protocol);
     74	int   (*discover_se)(struct nci_dev *ndev);
     75	int   (*disable_se)(struct nci_dev *ndev, u32 se_idx);
     76	int   (*enable_se)(struct nci_dev *ndev, u32 se_idx);
     77	int   (*se_io)(struct nci_dev *ndev, u32 se_idx,
     78				u8 *apdu, size_t apdu_length,
     79				se_io_cb_t cb, void *cb_context);
     80	int   (*hci_load_session)(struct nci_dev *ndev);
     81	void  (*hci_event_received)(struct nci_dev *ndev, u8 pipe, u8 event,
     82				    struct sk_buff *skb);
     83	void  (*hci_cmd_received)(struct nci_dev *ndev, u8 pipe, u8 cmd,
     84				  struct sk_buff *skb);
     85
     86	const struct nci_driver_ops *prop_ops;
     87	size_t n_prop_ops;
     88
     89	const struct nci_driver_ops *core_ops;
     90	size_t n_core_ops;
     91};
     92
     93#define NCI_MAX_SUPPORTED_RF_INTERFACES		4
     94#define NCI_MAX_DISCOVERED_TARGETS		10
     95#define NCI_MAX_NUM_NFCEE   255
     96#define NCI_MAX_CONN_ID		7
     97#define NCI_MAX_PROPRIETARY_CMD 64
     98
     99struct nci_conn_info {
    100	struct list_head list;
    101	/* NCI specification 4.4.2 Connection Creation
    102	 * The combination of destination type and destination specific
    103	 * parameters shall uniquely identify a single destination for the
    104	 * Logical Connection
    105	 */
    106	struct dest_spec_params *dest_params;
    107	__u8	dest_type;
    108	__u8	conn_id;
    109	__u8	max_pkt_payload_len;
    110
    111	atomic_t credits_cnt;
    112	__u8	 initial_num_credits;
    113
    114	data_exchange_cb_t	data_exchange_cb;
    115	void *data_exchange_cb_context;
    116
    117	struct sk_buff *rx_skb;
    118};
    119
    120#define NCI_INVALID_CONN_ID 0x80
    121
    122#define NCI_HCI_ANY_OPEN_PIPE      0x03
    123
    124/* Gates */
    125#define NCI_HCI_ADMIN_GATE         0x00
    126#define NCI_HCI_LOOPBACK_GATE	   0x04
    127#define NCI_HCI_IDENTITY_MGMT_GATE 0x05
    128#define NCI_HCI_LINK_MGMT_GATE     0x06
    129
    130/* Pipes */
    131#define NCI_HCI_LINK_MGMT_PIPE             0x00
    132#define NCI_HCI_ADMIN_PIPE                 0x01
    133
    134/* Generic responses */
    135#define NCI_HCI_ANY_OK                     0x00
    136#define NCI_HCI_ANY_E_NOT_CONNECTED        0x01
    137#define NCI_HCI_ANY_E_CMD_PAR_UNKNOWN      0x02
    138#define NCI_HCI_ANY_E_NOK                  0x03
    139#define NCI_HCI_ANY_E_PIPES_FULL           0x04
    140#define NCI_HCI_ANY_E_REG_PAR_UNKNOWN      0x05
    141#define NCI_HCI_ANY_E_PIPE_NOT_OPENED      0x06
    142#define NCI_HCI_ANY_E_CMD_NOT_SUPPORTED    0x07
    143#define NCI_HCI_ANY_E_INHIBITED            0x08
    144#define NCI_HCI_ANY_E_TIMEOUT              0x09
    145#define NCI_HCI_ANY_E_REG_ACCESS_DENIED    0x0a
    146#define NCI_HCI_ANY_E_PIPE_ACCESS_DENIED   0x0b
    147
    148#define NCI_HCI_DO_NOT_OPEN_PIPE           0x81
    149#define NCI_HCI_INVALID_PIPE               0x80
    150#define NCI_HCI_INVALID_GATE               0xFF
    151#define NCI_HCI_INVALID_HOST               0x80
    152
    153#define NCI_HCI_MAX_CUSTOM_GATES   50
    154/*
    155 * According to specification 102 622 chapter 4.4 Pipes,
    156 * the pipe identifier is 7 bits long.
    157 */
    158#define NCI_HCI_MAX_PIPES          128
    159
    160struct nci_hci_gate {
    161	u8 gate;
    162	u8 pipe;
    163	u8 dest_host;
    164} __packed;
    165
    166struct nci_hci_pipe {
    167	u8 gate;
    168	u8 host;
    169} __packed;
    170
    171struct nci_hci_init_data {
    172	u8 gate_count;
    173	struct nci_hci_gate gates[NCI_HCI_MAX_CUSTOM_GATES];
    174	char session_id[9];
    175};
    176
    177#define NCI_HCI_MAX_GATES          256
    178
    179struct nci_hci_dev {
    180	u8 nfcee_id;
    181	struct nci_dev *ndev;
    182	struct nci_conn_info *conn_info;
    183
    184	struct nci_hci_init_data init_data;
    185	struct nci_hci_pipe pipes[NCI_HCI_MAX_PIPES];
    186	u8 gate2pipe[NCI_HCI_MAX_GATES];
    187	int expected_pipes;
    188	int count_pipes;
    189
    190	struct sk_buff_head rx_hcp_frags;
    191	struct work_struct msg_rx_work;
    192	struct sk_buff_head msg_rx_queue;
    193};
    194
    195/* NCI Core structures */
    196struct nci_dev {
    197	struct nfc_dev		*nfc_dev;
    198	const struct nci_ops	*ops;
    199	struct nci_hci_dev	*hci_dev;
    200
    201	int			tx_headroom;
    202	int			tx_tailroom;
    203
    204	atomic_t		state;
    205	unsigned long		flags;
    206
    207	atomic_t		cmd_cnt;
    208	__u8			cur_conn_id;
    209
    210	struct list_head	conn_info_list;
    211	struct nci_conn_info	*rf_conn_info;
    212
    213	struct timer_list	cmd_timer;
    214	struct timer_list	data_timer;
    215
    216	struct workqueue_struct	*cmd_wq;
    217	struct work_struct	cmd_work;
    218
    219	struct workqueue_struct	*rx_wq;
    220	struct work_struct	rx_work;
    221
    222	struct workqueue_struct	*tx_wq;
    223	struct work_struct	tx_work;
    224
    225	struct sk_buff_head	cmd_q;
    226	struct sk_buff_head	rx_q;
    227	struct sk_buff_head	tx_q;
    228
    229	struct mutex		req_lock;
    230	struct completion	req_completion;
    231	__u32			req_status;
    232	__u32			req_result;
    233
    234	void			*driver_data;
    235
    236	__u32			poll_prots;
    237	__u32			target_active_prot;
    238
    239	struct nfc_target	targets[NCI_MAX_DISCOVERED_TARGETS];
    240	int			n_targets;
    241
    242	/* received during NCI_OP_CORE_RESET_RSP */
    243	__u8			nci_ver;
    244
    245	/* received during NCI_OP_CORE_INIT_RSP */
    246	__u32			nfcc_features;
    247	__u8			num_supported_rf_interfaces;
    248	__u8			supported_rf_interfaces
    249				[NCI_MAX_SUPPORTED_RF_INTERFACES];
    250	__u8			max_logical_connections;
    251	__u16			max_routing_table_size;
    252	__u8			max_ctrl_pkt_payload_len;
    253	__u16			max_size_for_large_params;
    254	__u8			manufact_id;
    255	__u32			manufact_specific_info;
    256
    257	/* Save RF Discovery ID or NFCEE ID under conn_create */
    258	struct dest_spec_params cur_params;
    259	/* Save destination type under conn_create */
    260	__u8			cur_dest_type;
    261
    262	/* stored during nci_data_exchange */
    263	struct sk_buff		*rx_data_reassembly;
    264
    265	/* stored during intf_activated_ntf */
    266	__u8 remote_gb[NFC_MAX_GT_LEN];
    267	__u8 remote_gb_len;
    268};
    269
    270/* ----- NCI Devices ----- */
    271struct nci_dev *nci_allocate_device(const struct nci_ops *ops,
    272				    __u32 supported_protocols,
    273				    int tx_headroom,
    274				    int tx_tailroom);
    275void nci_free_device(struct nci_dev *ndev);
    276int nci_register_device(struct nci_dev *ndev);
    277void nci_unregister_device(struct nci_dev *ndev);
    278int nci_request(struct nci_dev *ndev,
    279		void (*req)(struct nci_dev *ndev,
    280			    const void *opt),
    281		const void *opt, __u32 timeout);
    282int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len,
    283		 const __u8 *payload);
    284int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len,
    285		 const __u8 *payload);
    286int nci_core_reset(struct nci_dev *ndev);
    287int nci_core_init(struct nci_dev *ndev);
    288
    289int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb);
    290int nci_send_frame(struct nci_dev *ndev, struct sk_buff *skb);
    291int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, const __u8 *val);
    292
    293int nci_nfcee_discover(struct nci_dev *ndev, u8 action);
    294int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode);
    295int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
    296			 u8 number_destination_params,
    297			 size_t params_len,
    298			 const struct core_conn_create_dest_spec_params *params);
    299int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id);
    300int nci_nfcc_loopback(struct nci_dev *ndev, const void *data, size_t data_len,
    301		      struct sk_buff **resp);
    302
    303struct nci_hci_dev *nci_hci_allocate(struct nci_dev *ndev);
    304void nci_hci_deallocate(struct nci_dev *ndev);
    305int nci_hci_send_event(struct nci_dev *ndev, u8 gate, u8 event,
    306		       const u8 *param, size_t param_len);
    307int nci_hci_send_cmd(struct nci_dev *ndev, u8 gate,
    308		     u8 cmd, const u8 *param, size_t param_len,
    309		     struct sk_buff **skb);
    310int nci_hci_open_pipe(struct nci_dev *ndev, u8 pipe);
    311int nci_hci_connect_gate(struct nci_dev *ndev, u8 dest_host,
    312			 u8 dest_gate, u8 pipe);
    313int nci_hci_set_param(struct nci_dev *ndev, u8 gate, u8 idx,
    314		      const u8 *param, size_t param_len);
    315int nci_hci_get_param(struct nci_dev *ndev, u8 gate, u8 idx,
    316		      struct sk_buff **skb);
    317int nci_hci_clear_all_pipes(struct nci_dev *ndev);
    318int nci_hci_dev_session_init(struct nci_dev *ndev);
    319
    320static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev,
    321					    unsigned int len,
    322					    gfp_t how)
    323{
    324	struct sk_buff *skb;
    325
    326	skb = alloc_skb(len + ndev->tx_headroom + ndev->tx_tailroom, how);
    327	if (skb)
    328		skb_reserve(skb, ndev->tx_headroom);
    329
    330	return skb;
    331}
    332
    333static inline void nci_set_parent_dev(struct nci_dev *ndev, struct device *dev)
    334{
    335	nfc_set_parent_dev(ndev->nfc_dev, dev);
    336}
    337
    338static inline void nci_set_drvdata(struct nci_dev *ndev, void *data)
    339{
    340	ndev->driver_data = data;
    341}
    342
    343static inline void *nci_get_drvdata(struct nci_dev *ndev)
    344{
    345	return ndev->driver_data;
    346}
    347
    348static inline int nci_set_vendor_cmds(struct nci_dev *ndev,
    349				      const struct nfc_vendor_cmd *cmds,
    350				      int n_cmds)
    351{
    352	return nfc_set_vendor_cmds(ndev->nfc_dev, cmds, n_cmds);
    353}
    354
    355void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb);
    356void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb);
    357int nci_prop_rsp_packet(struct nci_dev *ndev, __u16 opcode,
    358			struct sk_buff *skb);
    359int nci_prop_ntf_packet(struct nci_dev *ndev, __u16 opcode,
    360			struct sk_buff *skb);
    361int nci_core_rsp_packet(struct nci_dev *ndev, __u16 opcode,
    362			struct sk_buff *skb);
    363int nci_core_ntf_packet(struct nci_dev *ndev, __u16 opcode,
    364			struct sk_buff *skb);
    365void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb);
    366int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, const void *payload);
    367int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb);
    368int nci_conn_max_data_pkt_payload_size(struct nci_dev *ndev, __u8 conn_id);
    369void nci_data_exchange_complete(struct nci_dev *ndev, struct sk_buff *skb,
    370				__u8 conn_id, int err);
    371void nci_hci_data_received_cb(void *context, struct sk_buff *skb, int err);
    372
    373void nci_clear_target_list(struct nci_dev *ndev);
    374
    375/* ----- NCI requests ----- */
    376#define NCI_REQ_DONE		0
    377#define NCI_REQ_PEND		1
    378#define NCI_REQ_CANCELED	2
    379
    380void nci_req_complete(struct nci_dev *ndev, int result);
    381struct nci_conn_info *nci_get_conn_info_by_conn_id(struct nci_dev *ndev,
    382						   int conn_id);
    383int nci_get_conn_info_by_dest_type_params(struct nci_dev *ndev, u8 dest_type,
    384					  const struct dest_spec_params *params);
    385
    386/* ----- NCI status code ----- */
    387int nci_to_errno(__u8 code);
    388
    389/* ----- NCI over SPI acknowledge modes ----- */
    390#define NCI_SPI_CRC_DISABLED	0x00
    391#define NCI_SPI_CRC_ENABLED	0x01
    392
    393/* ----- NCI SPI structures ----- */
    394struct nci_spi {
    395	struct nci_dev		*ndev;
    396	struct spi_device	*spi;
    397
    398	unsigned int		xfer_udelay;	/* microseconds delay between
    399						  transactions */
    400
    401	unsigned int		xfer_speed_hz; /*
    402						* SPI clock frequency
    403						* 0 => default clock
    404						*/
    405
    406	u8			acknowledge_mode;
    407
    408	struct completion	req_completion;
    409	u8			req_result;
    410};
    411
    412/* ----- NCI SPI ----- */
    413struct nci_spi *nci_spi_allocate_spi(struct spi_device *spi,
    414				     u8 acknowledge_mode, unsigned int delay,
    415				     struct nci_dev *ndev);
    416int nci_spi_send(struct nci_spi *nspi,
    417		 struct completion *write_handshake_completion,
    418		 struct sk_buff *skb);
    419struct sk_buff *nci_spi_read(struct nci_spi *nspi);
    420
    421/* ----- NCI UART ---- */
    422
    423/* Ioctl */
    424#define NCIUARTSETDRIVER	_IOW('U', 0, char *)
    425
    426enum nci_uart_driver {
    427	NCI_UART_DRIVER_MARVELL = 0,
    428	NCI_UART_DRIVER_MAX
    429};
    430
    431struct nci_uart;
    432
    433struct nci_uart_ops {
    434	int (*open)(struct nci_uart *nci_uart);
    435	void (*close)(struct nci_uart *nci_uart);
    436	int (*recv)(struct nci_uart *nci_uart, struct sk_buff *skb);
    437	int (*send)(struct nci_uart *nci_uart, struct sk_buff *skb);
    438	void (*tx_start)(struct nci_uart *nci_uart);
    439	void (*tx_done)(struct nci_uart *nci_uart);
    440};
    441
    442struct nci_uart {
    443	struct module		*owner;
    444	struct nci_uart_ops	ops;
    445	const char		*name;
    446	enum nci_uart_driver	driver;
    447
    448	/* Dynamic data */
    449	struct nci_dev		*ndev;
    450	spinlock_t		rx_lock;
    451	struct work_struct	write_work;
    452	struct tty_struct	*tty;
    453	unsigned long		tx_state;
    454	struct sk_buff_head	tx_q;
    455	struct sk_buff		*tx_skb;
    456	struct sk_buff		*rx_skb;
    457	int			rx_packet_len;
    458	void			*drv_data;
    459};
    460
    461int nci_uart_register(struct nci_uart *nu);
    462void nci_uart_unregister(struct nci_uart *nu);
    463void nci_uart_set_config(struct nci_uart *nu, int baudrate, int flow_ctrl);
    464
    465#endif /* __NCI_CORE_H */