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

efct_scsi.h (6302B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
      4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
      5 */
      6
      7#if !defined(__EFCT_SCSI_H__)
      8#define __EFCT_SCSI_H__
      9#include <scsi/scsi_host.h>
     10#include <scsi/scsi_transport_fc.h>
     11
     12/* efct_scsi_rcv_cmd() efct_scsi_rcv_tmf() flags */
     13#define EFCT_SCSI_CMD_DIR_IN		(1 << 0)
     14#define EFCT_SCSI_CMD_DIR_OUT		(1 << 1)
     15#define EFCT_SCSI_CMD_SIMPLE		(1 << 2)
     16#define EFCT_SCSI_CMD_HEAD_OF_QUEUE	(1 << 3)
     17#define EFCT_SCSI_CMD_ORDERED		(1 << 4)
     18#define EFCT_SCSI_CMD_UNTAGGED		(1 << 5)
     19#define EFCT_SCSI_CMD_ACA		(1 << 6)
     20#define EFCT_SCSI_FIRST_BURST_ERR	(1 << 7)
     21#define EFCT_SCSI_FIRST_BURST_ABORTED	(1 << 8)
     22
     23/* efct_scsi_send_rd_data/recv_wr_data/send_resp flags */
     24#define EFCT_SCSI_LAST_DATAPHASE	(1 << 0)
     25#define EFCT_SCSI_NO_AUTO_RESPONSE	(1 << 1)
     26#define EFCT_SCSI_LOW_LATENCY		(1 << 2)
     27
     28#define EFCT_SCSI_SNS_BUF_VALID(sense)	((sense) && \
     29			(0x70 == (((const u8 *)(sense))[0] & 0x70)))
     30
     31#define EFCT_SCSI_WQ_STEERING_SHIFT	16
     32#define EFCT_SCSI_WQ_STEERING_MASK	(0xf << EFCT_SCSI_WQ_STEERING_SHIFT)
     33#define EFCT_SCSI_WQ_STEERING_CLASS	(0 << EFCT_SCSI_WQ_STEERING_SHIFT)
     34#define EFCT_SCSI_WQ_STEERING_REQUEST	(1 << EFCT_SCSI_WQ_STEERING_SHIFT)
     35#define EFCT_SCSI_WQ_STEERING_CPU	(2 << EFCT_SCSI_WQ_STEERING_SHIFT)
     36
     37#define EFCT_SCSI_WQ_CLASS_SHIFT		(20)
     38#define EFCT_SCSI_WQ_CLASS_MASK		(0xf << EFCT_SCSI_WQ_CLASS_SHIFT)
     39#define EFCT_SCSI_WQ_CLASS(x)		((x & EFCT_SCSI_WQ_CLASS_MASK) << \
     40						EFCT_SCSI_WQ_CLASS_SHIFT)
     41
     42#define EFCT_SCSI_WQ_CLASS_LOW_LATENCY	1
     43
     44struct efct_scsi_cmd_resp {
     45	u8 scsi_status;
     46	u16 scsi_status_qualifier;
     47	u8 *response_data;
     48	u32 response_data_length;
     49	u8 *sense_data;
     50	u32 sense_data_length;
     51	int residual;
     52	u32 response_wire_length;
     53};
     54
     55struct efct_vport {
     56	struct efct		*efct;
     57	bool			is_vport;
     58	struct fc_host_statistics fc_host_stats;
     59	struct Scsi_Host	*shost;
     60	struct fc_vport		*fc_vport;
     61	u64			npiv_wwpn;
     62	u64			npiv_wwnn;
     63};
     64
     65/* Status values returned by IO callbacks */
     66enum efct_scsi_io_status {
     67	EFCT_SCSI_STATUS_GOOD = 0,
     68	EFCT_SCSI_STATUS_ABORTED,
     69	EFCT_SCSI_STATUS_ERROR,
     70	EFCT_SCSI_STATUS_DIF_GUARD_ERR,
     71	EFCT_SCSI_STATUS_DIF_REF_TAG_ERROR,
     72	EFCT_SCSI_STATUS_DIF_APP_TAG_ERROR,
     73	EFCT_SCSI_STATUS_DIF_UNKNOWN_ERROR,
     74	EFCT_SCSI_STATUS_PROTOCOL_CRC_ERROR,
     75	EFCT_SCSI_STATUS_NO_IO,
     76	EFCT_SCSI_STATUS_ABORT_IN_PROGRESS,
     77	EFCT_SCSI_STATUS_CHECK_RESPONSE,
     78	EFCT_SCSI_STATUS_COMMAND_TIMEOUT,
     79	EFCT_SCSI_STATUS_TIMEDOUT_AND_ABORTED,
     80	EFCT_SCSI_STATUS_SHUTDOWN,
     81	EFCT_SCSI_STATUS_NEXUS_LOST,
     82};
     83
     84struct efct_node;
     85struct efct_io;
     86struct efc_node;
     87struct efc_nport;
     88
     89/* Callback used by send_rd_data(), recv_wr_data(), send_resp() */
     90typedef int (*efct_scsi_io_cb_t)(struct efct_io *io,
     91				    enum efct_scsi_io_status status,
     92				    u32 flags, void *arg);
     93
     94/* Callback used by send_rd_io(), send_wr_io() */
     95typedef int (*efct_scsi_rsp_io_cb_t)(struct efct_io *io,
     96			enum efct_scsi_io_status status,
     97			struct efct_scsi_cmd_resp *rsp,
     98			u32 flags, void *arg);
     99
    100/* efct_scsi_cb_t flags */
    101#define EFCT_SCSI_IO_CMPL		(1 << 0)
    102/* IO completed, response sent */
    103#define EFCT_SCSI_IO_CMPL_RSP_SENT	(1 << 1)
    104#define EFCT_SCSI_IO_ABORTED		(1 << 2)
    105
    106/* efct_scsi_recv_tmf() request values */
    107enum efct_scsi_tmf_cmd {
    108	EFCT_SCSI_TMF_ABORT_TASK = 1,
    109	EFCT_SCSI_TMF_QUERY_TASK_SET,
    110	EFCT_SCSI_TMF_ABORT_TASK_SET,
    111	EFCT_SCSI_TMF_CLEAR_TASK_SET,
    112	EFCT_SCSI_TMF_QUERY_ASYNCHRONOUS_EVENT,
    113	EFCT_SCSI_TMF_LOGICAL_UNIT_RESET,
    114	EFCT_SCSI_TMF_CLEAR_ACA,
    115	EFCT_SCSI_TMF_TARGET_RESET,
    116};
    117
    118/* efct_scsi_send_tmf_resp() response values */
    119enum efct_scsi_tmf_resp {
    120	EFCT_SCSI_TMF_FUNCTION_COMPLETE = 1,
    121	EFCT_SCSI_TMF_FUNCTION_SUCCEEDED,
    122	EFCT_SCSI_TMF_FUNCTION_IO_NOT_FOUND,
    123	EFCT_SCSI_TMF_FUNCTION_REJECTED,
    124	EFCT_SCSI_TMF_INCORRECT_LOGICAL_UNIT_NUMBER,
    125	EFCT_SCSI_TMF_SERVICE_DELIVERY,
    126};
    127
    128struct efct_scsi_sgl {
    129	uintptr_t	addr;
    130	uintptr_t	dif_addr;
    131	size_t		len;
    132};
    133
    134enum efct_scsi_io_role {
    135	EFCT_SCSI_IO_ROLE_ORIGINATOR,
    136	EFCT_SCSI_IO_ROLE_RESPONDER,
    137};
    138
    139struct efct_io *
    140efct_scsi_io_alloc(struct efct_node *node);
    141void efct_scsi_io_free(struct efct_io *io);
    142struct efct_io *efct_io_get_instance(struct efct *efct, u32 index);
    143
    144int efct_scsi_tgt_driver_init(void);
    145int efct_scsi_tgt_driver_exit(void);
    146int efct_scsi_tgt_new_device(struct efct *efct);
    147int efct_scsi_tgt_del_device(struct efct *efct);
    148int
    149efct_scsi_tgt_new_nport(struct efc *efc, struct efc_nport *nport);
    150void
    151efct_scsi_tgt_del_nport(struct efc *efc, struct efc_nport *nport);
    152
    153int
    154efct_scsi_new_initiator(struct efc *efc, struct efc_node *node);
    155
    156enum efct_scsi_del_initiator_reason {
    157	EFCT_SCSI_INITIATOR_DELETED,
    158	EFCT_SCSI_INITIATOR_MISSING,
    159};
    160
    161int
    162efct_scsi_del_initiator(struct efc *efc, struct efc_node *node,	int reason);
    163void
    164efct_scsi_recv_cmd(struct efct_io *io, uint64_t lun, u8 *cdb, u32 cdb_len,
    165		   u32 flags);
    166int
    167efct_scsi_recv_tmf(struct efct_io *tmfio, u32 lun, enum efct_scsi_tmf_cmd cmd,
    168		   struct efct_io *abortio, u32 flags);
    169int
    170efct_scsi_send_rd_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,
    171		u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);
    172int
    173efct_scsi_recv_wr_data(struct efct_io *io, u32 flags, struct efct_scsi_sgl *sgl,
    174		u32 sgl_count, u64 wire_len, efct_scsi_io_cb_t cb, void *arg);
    175int
    176efct_scsi_send_resp(struct efct_io *io, u32 flags,
    177		struct efct_scsi_cmd_resp *rsp, efct_scsi_io_cb_t cb, void *arg);
    178int
    179efct_scsi_send_tmf_resp(struct efct_io *io, enum efct_scsi_tmf_resp rspcode,
    180			u8 addl_rsp_info[3], efct_scsi_io_cb_t cb, void *arg);
    181int
    182efct_scsi_tgt_abort_io(struct efct_io *io, efct_scsi_io_cb_t cb, void *arg);
    183
    184void efct_scsi_io_complete(struct efct_io *io);
    185
    186int efct_scsi_reg_fc_transport(void);
    187void efct_scsi_release_fc_transport(void);
    188int efct_scsi_new_device(struct efct *efct);
    189void efct_scsi_del_device(struct efct *efct);
    190void _efct_scsi_io_free(struct kref *arg);
    191
    192int
    193efct_scsi_del_vport(struct efct *efct, struct Scsi_Host *shost);
    194struct efct_vport *
    195efct_scsi_new_vport(struct efct *efct, struct device *dev);
    196
    197int efct_scsi_io_dispatch(struct efct_io *io, void *cb);
    198int efct_scsi_io_dispatch_abort(struct efct_io *io, void *cb);
    199void efct_scsi_check_pending(struct efct *efct);
    200struct efct_io *
    201efct_bls_send_rjt(struct efct_io *io, struct fc_frame_header *hdr);
    202
    203#endif /* __EFCT_SCSI_H__ */