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

mvumi.h (12025B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3  * Marvell UMI head file
      4  *
      5  * Copyright 2011 Marvell. <jyli@marvell.com>
      6 */
      7
      8#ifndef MVUMI_H
      9#define MVUMI_H
     10
     11#define MAX_BASE_ADDRESS	6
     12
     13#define VER_MAJOR		1
     14#define VER_MINOR		1
     15#define VER_OEM			0
     16#define VER_BUILD		1500
     17
     18#define MV_DRIVER_NAME			"mvumi"
     19#define PCI_DEVICE_ID_MARVELL_MV9143	0x9143
     20#define PCI_DEVICE_ID_MARVELL_MV9580	0x9580
     21
     22#define MVUMI_INTERNAL_CMD_WAIT_TIME	45
     23#define MVUMI_INQUIRY_LENGTH		44
     24#define MVUMI_INQUIRY_UUID_OFF		36
     25#define MVUMI_INQUIRY_UUID_LEN		8
     26
     27#define IS_DMA64			(sizeof(dma_addr_t) == 8)
     28
     29enum mvumi_qc_result {
     30	MV_QUEUE_COMMAND_RESULT_SENT = 0,
     31	MV_QUEUE_COMMAND_RESULT_NO_RESOURCE,
     32};
     33
     34struct mvumi_hw_regs {
     35	/* For CPU */
     36	void *main_int_cause_reg;
     37	void *enpointa_mask_reg;
     38	void *enpointb_mask_reg;
     39	void *rstoutn_en_reg;
     40	void *ctrl_sts_reg;
     41	void *rstoutn_mask_reg;
     42	void *sys_soft_rst_reg;
     43
     44	/* For Doorbell */
     45	void *pciea_to_arm_drbl_reg;
     46	void *arm_to_pciea_drbl_reg;
     47	void *arm_to_pciea_mask_reg;
     48	void *pciea_to_arm_msg0;
     49	void *pciea_to_arm_msg1;
     50	void *arm_to_pciea_msg0;
     51	void *arm_to_pciea_msg1;
     52
     53	/* reset register */
     54	void *reset_request;
     55	void *reset_enable;
     56
     57	/* For Message Unit */
     58	void *inb_list_basel;
     59	void *inb_list_baseh;
     60	void *inb_aval_count_basel;
     61	void *inb_aval_count_baseh;
     62	void *inb_write_pointer;
     63	void *inb_read_pointer;
     64	void *outb_list_basel;
     65	void *outb_list_baseh;
     66	void *outb_copy_basel;
     67	void *outb_copy_baseh;
     68	void *outb_copy_pointer;
     69	void *outb_read_pointer;
     70	void *inb_isr_cause;
     71	void *outb_isr_cause;
     72	void *outb_coal_cfg;
     73	void *outb_coal_timeout;
     74
     75	/* Bit setting for HW */
     76	u32 int_comaout;
     77	u32 int_comaerr;
     78	u32 int_dl_cpu2pciea;
     79	u32 int_mu;
     80	u32 int_drbl_int_mask;
     81	u32 int_main_int_mask;
     82	u32 cl_pointer_toggle;
     83	u32 cl_slot_num_mask;
     84	u32 clic_irq;
     85	u32 clic_in_err;
     86	u32 clic_out_err;
     87};
     88
     89struct mvumi_dyn_list_entry {
     90	u32 src_low_addr;
     91	u32 src_high_addr;
     92	u32 if_length;
     93	u32 reserve;
     94};
     95
     96#define SCSI_CMD_MARVELL_SPECIFIC	0xE1
     97#define CDB_CORE_MODULE			0x1
     98#define CDB_CORE_SHUTDOWN		0xB
     99
    100enum {
    101	DRBL_HANDSHAKE			= 1 << 0,
    102	DRBL_SOFT_RESET			= 1 << 1,
    103	DRBL_BUS_CHANGE			= 1 << 2,
    104	DRBL_EVENT_NOTIFY		= 1 << 3,
    105	DRBL_MU_RESET			= 1 << 4,
    106	DRBL_HANDSHAKE_ISR		= DRBL_HANDSHAKE,
    107
    108	/*
    109	* Command flag is the flag for the CDB command itself
    110	*/
    111	/* 1-non data; 0-data command */
    112	CMD_FLAG_NON_DATA		= 1 << 0,
    113	CMD_FLAG_DMA			= 1 << 1,
    114	CMD_FLAG_PIO			= 1 << 2,
    115	/* 1-host read data */
    116	CMD_FLAG_DATA_IN		= 1 << 3,
    117	/* 1-host write data */
    118	CMD_FLAG_DATA_OUT		= 1 << 4,
    119	CMD_FLAG_PRDT_IN_HOST		= 1 << 5,
    120};
    121
    122#define APICDB0_EVENT			0xF4
    123#define APICDB1_EVENT_GETEVENT		0
    124#define APICDB1_HOST_GETEVENT		1
    125#define MAX_EVENTS_RETURNED		6
    126
    127#define DEVICE_OFFLINE	0
    128#define DEVICE_ONLINE	1
    129
    130struct mvumi_hotplug_event {
    131	u16 size;
    132	u8 dummy[2];
    133	u8 bitmap[];
    134};
    135
    136struct mvumi_driver_event {
    137	u32	time_stamp;
    138	u32	sequence_no;
    139	u32	event_id;
    140	u8	severity;
    141	u8	param_count;
    142	u16	device_id;
    143	u32	params[4];
    144	u8	sense_data_length;
    145	u8	Reserved1;
    146	u8	sense_data[30];
    147};
    148
    149struct mvumi_event_req {
    150	unsigned char	count;
    151	unsigned char	reserved[3];
    152	struct mvumi_driver_event  events[MAX_EVENTS_RETURNED];
    153};
    154
    155struct mvumi_events_wq {
    156	struct work_struct work_q;
    157	struct mvumi_hba *mhba;
    158	unsigned int event;
    159	void *param;
    160};
    161
    162#define HS_CAPABILITY_SUPPORT_COMPACT_SG	(1U << 4)
    163#define HS_CAPABILITY_SUPPORT_PRD_HOST		(1U << 5)
    164#define HS_CAPABILITY_SUPPORT_DYN_SRC		(1U << 6)
    165#define HS_CAPABILITY_NEW_PAGE_IO_DEPTH_DEF	(1U << 14)
    166
    167#define MVUMI_MAX_SG_ENTRY	32
    168#define SGD_EOT			(1L << 27)
    169#define SGD_EOT_CP		(1L << 22)
    170
    171struct mvumi_sgl {
    172	u32	baseaddr_l;
    173	u32	baseaddr_h;
    174	u32	flags;
    175	u32	size;
    176};
    177struct mvumi_compact_sgl {
    178	u32	baseaddr_l;
    179	u32	baseaddr_h;
    180	u32	flags;
    181};
    182
    183#define GET_COMPACT_SGD_SIZE(sgd)	\
    184	((((struct mvumi_compact_sgl *)(sgd))->flags) & 0x3FFFFFL)
    185
    186#define SET_COMPACT_SGD_SIZE(sgd, sz) do {			\
    187	(((struct mvumi_compact_sgl *)(sgd))->flags) &= ~0x3FFFFFL;	\
    188	(((struct mvumi_compact_sgl *)(sgd))->flags) |= (sz);		\
    189} while (0)
    190#define sgd_getsz(_mhba, sgd, sz) do {				\
    191	if (_mhba->hba_capability & HS_CAPABILITY_SUPPORT_COMPACT_SG)	\
    192		(sz) = GET_COMPACT_SGD_SIZE(sgd);	\
    193	else \
    194		(sz) = (sgd)->size;			\
    195} while (0)
    196
    197#define sgd_setsz(_mhba, sgd, sz) do {				\
    198	if (_mhba->hba_capability & HS_CAPABILITY_SUPPORT_COMPACT_SG)	\
    199		SET_COMPACT_SGD_SIZE(sgd, sz);		\
    200	else \
    201		(sgd)->size = (sz);			\
    202} while (0)
    203
    204#define sgd_inc(_mhba, sgd) do {	\
    205	if (_mhba->hba_capability & HS_CAPABILITY_SUPPORT_COMPACT_SG)	\
    206		sgd = (struct mvumi_sgl *)(((unsigned char *) (sgd)) + 12); \
    207	else \
    208		sgd = (struct mvumi_sgl *)(((unsigned char *) (sgd)) + 16); \
    209} while (0)
    210
    211struct mvumi_res {
    212	struct list_head entry;
    213	dma_addr_t bus_addr;
    214	void *virt_addr;
    215	unsigned int size;
    216	unsigned short type;	/* enum Resource_Type */
    217};
    218
    219/* Resource type */
    220enum resource_type {
    221	RESOURCE_CACHED_MEMORY = 0,
    222	RESOURCE_UNCACHED_MEMORY
    223};
    224
    225struct mvumi_sense_data {
    226	u8 error_code:7;
    227	u8 valid:1;
    228	u8 segment_number;
    229	u8 sense_key:4;
    230	u8 reserved:1;
    231	u8 incorrect_length:1;
    232	u8 end_of_media:1;
    233	u8 file_mark:1;
    234	u8 information[4];
    235	u8 additional_sense_length;
    236	u8 command_specific_information[4];
    237	u8 additional_sense_code;
    238	u8 additional_sense_code_qualifier;
    239	u8 field_replaceable_unit_code;
    240	u8 sense_key_specific[3];
    241};
    242
    243/* Request initiator must set the status to REQ_STATUS_PENDING. */
    244#define REQ_STATUS_PENDING		0x80
    245
    246struct mvumi_cmd {
    247	struct list_head queue_pointer;
    248	struct mvumi_msg_frame *frame;
    249	dma_addr_t frame_phys;
    250	struct scsi_cmnd *scmd;
    251	atomic_t sync_cmd;
    252	void *data_buf;
    253	unsigned short request_id;
    254	unsigned char cmd_status;
    255};
    256
    257struct mvumi_cmd_priv {
    258	struct mvumi_cmd *cmd_priv;
    259};
    260
    261static inline struct mvumi_cmd_priv *mvumi_priv(struct scsi_cmnd *cmd)
    262{
    263	return scsi_cmd_priv(cmd);
    264}
    265
    266/*
    267 * the function type of the in bound frame
    268 */
    269#define CL_FUN_SCSI_CMD			0x1
    270
    271struct mvumi_msg_frame {
    272	u16 device_id;
    273	u16 tag;
    274	u8 cmd_flag;
    275	u8 req_function;
    276	u8 cdb_length;
    277	u8 sg_counts;
    278	u32 data_transfer_length;
    279	u16 request_id;
    280	u16 reserved1;
    281	u8 cdb[MAX_COMMAND_SIZE];
    282	u32 payload[1];
    283};
    284
    285/*
    286 * the respond flag for data_payload of the out bound frame
    287 */
    288#define CL_RSP_FLAG_NODATA		0x0
    289#define CL_RSP_FLAG_SENSEDATA		0x1
    290
    291struct mvumi_rsp_frame {
    292	u16 device_id;
    293	u16 tag;
    294	u8 req_status;
    295	u8 rsp_flag;	/* Indicates the type of Data_Payload.*/
    296	u16 request_id;
    297	u32 payload[1];
    298};
    299
    300struct mvumi_ob_data {
    301	struct list_head list;
    302	unsigned char data[];
    303};
    304
    305struct version_info {
    306	u32 ver_major;
    307	u32 ver_minor;
    308	u32 ver_oem;
    309	u32 ver_build;
    310};
    311
    312#define FW_MAX_DELAY			30
    313#define MVUMI_FW_BUSY			(1U << 0)
    314#define MVUMI_FW_ATTACH			(1U << 1)
    315#define MVUMI_FW_ALLOC			(1U << 2)
    316
    317/*
    318 * State is the state of the MU
    319 */
    320#define FW_STATE_IDLE			0
    321#define FW_STATE_STARTING		1
    322#define FW_STATE_HANDSHAKING		2
    323#define FW_STATE_STARTED		3
    324#define FW_STATE_ABORT			4
    325
    326#define HANDSHAKE_SIGNATURE		0x5A5A5A5AL
    327#define HANDSHAKE_READYSTATE		0x55AA5AA5L
    328#define HANDSHAKE_DONESTATE		0x55AAA55AL
    329
    330/* HandShake Status definition */
    331#define HS_STATUS_OK			1
    332#define HS_STATUS_ERR			2
    333#define HS_STATUS_INVALID		3
    334
    335/* HandShake State/Cmd definition */
    336#define HS_S_START			1
    337#define HS_S_RESET			2
    338#define HS_S_PAGE_ADDR			3
    339#define HS_S_QUERY_PAGE			4
    340#define HS_S_SEND_PAGE			5
    341#define HS_S_END			6
    342#define HS_S_ABORT			7
    343#define HS_PAGE_VERIFY_SIZE		128
    344
    345#define HS_GET_STATE(a)			(a & 0xFFFF)
    346#define HS_GET_STATUS(a)		((a & 0xFFFF0000) >> 16)
    347#define HS_SET_STATE(a, b)		(a |= (b & 0xFFFF))
    348#define HS_SET_STATUS(a, b)		(a |= ((b & 0xFFFF) << 16))
    349
    350/* handshake frame */
    351struct mvumi_hs_frame {
    352	u16 size;
    353	/* host information */
    354	u8 host_type;
    355	u8 reserved_1[1];
    356	struct version_info host_ver; /* bios or driver version */
    357
    358	/* controller information */
    359	u32 system_io_bus;
    360	u32 slot_number;
    361	u32 intr_level;
    362	u32 intr_vector;
    363
    364	/* communication list configuration */
    365	u32 ib_baseaddr_l;
    366	u32 ib_baseaddr_h;
    367	u32 ob_baseaddr_l;
    368	u32 ob_baseaddr_h;
    369
    370	u8 ib_entry_size;
    371	u8 ob_entry_size;
    372	u8 ob_depth;
    373	u8 ib_depth;
    374
    375	/* system time */
    376	u64 seconds_since1970;
    377};
    378
    379struct mvumi_hs_header {
    380	u8	page_code;
    381	u8	checksum;
    382	u16	frame_length;
    383	u32	frame_content[1];
    384};
    385
    386/*
    387 * the page code type of the handshake header
    388 */
    389#define HS_PAGE_FIRM_CAP	0x1
    390#define HS_PAGE_HOST_INFO	0x2
    391#define HS_PAGE_FIRM_CTL	0x3
    392#define HS_PAGE_CL_INFO		0x4
    393#define HS_PAGE_TOTAL		0x5
    394
    395#define HSP_SIZE(i)	sizeof(struct mvumi_hs_page##i)
    396
    397#define HSP_MAX_SIZE ({					\
    398	int size, m1, m2;				\
    399	m1 = max(HSP_SIZE(1), HSP_SIZE(3));		\
    400	m2 = max(HSP_SIZE(2), HSP_SIZE(4));		\
    401	size = max(m1, m2);				\
    402	size;						\
    403})
    404
    405/* The format of the page code for Firmware capability */
    406struct mvumi_hs_page1 {
    407	u8 pagecode;
    408	u8 checksum;
    409	u16 frame_length;
    410
    411	u16 number_of_ports;
    412	u16 max_devices_support;
    413	u16 max_io_support;
    414	u16 umi_ver;
    415	u32 max_transfer_size;
    416	struct version_info fw_ver;
    417	u8 cl_in_max_entry_size;
    418	u8 cl_out_max_entry_size;
    419	u8 cl_inout_list_depth;
    420	u8 total_pages;
    421	u16 capability;
    422	u16 reserved1;
    423};
    424
    425/* The format of the page code for Host information */
    426struct mvumi_hs_page2 {
    427	u8 pagecode;
    428	u8 checksum;
    429	u16 frame_length;
    430
    431	u8 host_type;
    432	u8 host_cap;
    433	u8 reserved[2];
    434	struct version_info host_ver;
    435	u32 system_io_bus;
    436	u32 slot_number;
    437	u32 intr_level;
    438	u32 intr_vector;
    439	u64 seconds_since1970;
    440};
    441
    442/* The format of the page code for firmware control  */
    443struct mvumi_hs_page3 {
    444	u8	pagecode;
    445	u8	checksum;
    446	u16	frame_length;
    447	u16	control;
    448	u8	reserved[2];
    449	u32	host_bufferaddr_l;
    450	u32	host_bufferaddr_h;
    451	u32	host_eventaddr_l;
    452	u32	host_eventaddr_h;
    453};
    454
    455struct mvumi_hs_page4 {
    456	u8	pagecode;
    457	u8	checksum;
    458	u16	frame_length;
    459	u32	ib_baseaddr_l;
    460	u32	ib_baseaddr_h;
    461	u32	ob_baseaddr_l;
    462	u32	ob_baseaddr_h;
    463	u8	ib_entry_size;
    464	u8	ob_entry_size;
    465	u8	ob_depth;
    466	u8	ib_depth;
    467};
    468
    469struct mvumi_tag {
    470	unsigned short *stack;
    471	unsigned short top;
    472	unsigned short size;
    473};
    474
    475struct mvumi_device {
    476	struct list_head list;
    477	struct scsi_device *sdev;
    478	u64	wwid;
    479	u8	dev_type;
    480	int	id;
    481};
    482
    483struct mvumi_hba {
    484	void *base_addr[MAX_BASE_ADDRESS];
    485	u32 pci_base[MAX_BASE_ADDRESS];
    486	void *mmio;
    487	struct list_head cmd_pool;
    488	struct Scsi_Host *shost;
    489	wait_queue_head_t int_cmd_wait_q;
    490	struct pci_dev *pdev;
    491	unsigned int unique_id;
    492	atomic_t fw_outstanding;
    493	struct mvumi_instance_template *instancet;
    494
    495	void *ib_list;
    496	dma_addr_t ib_list_phys;
    497
    498	void *ib_frame;
    499	dma_addr_t ib_frame_phys;
    500
    501	void *ob_list;
    502	dma_addr_t ob_list_phys;
    503
    504	void *ib_shadow;
    505	dma_addr_t ib_shadow_phys;
    506
    507	void *ob_shadow;
    508	dma_addr_t ob_shadow_phys;
    509
    510	void *handshake_page;
    511	dma_addr_t handshake_page_phys;
    512
    513	unsigned int global_isr;
    514	unsigned int isr_status;
    515
    516	unsigned short max_sge;
    517	unsigned short max_target_id;
    518	unsigned char *target_map;
    519	unsigned int max_io;
    520	unsigned int list_num_io;
    521	unsigned int ib_max_size;
    522	unsigned int ob_max_size;
    523	unsigned int ib_max_size_setting;
    524	unsigned int ob_max_size_setting;
    525	unsigned int max_transfer_size;
    526	unsigned char hba_total_pages;
    527	unsigned char fw_flag;
    528	unsigned char request_id_enabled;
    529	unsigned char eot_flag;
    530	unsigned short hba_capability;
    531	unsigned short io_seq;
    532
    533	unsigned int ib_cur_slot;
    534	unsigned int ob_cur_slot;
    535	unsigned int fw_state;
    536	struct mutex sas_discovery_mutex;
    537
    538	struct list_head ob_data_list;
    539	struct list_head free_ob_list;
    540	struct list_head res_list;
    541	struct list_head waiting_req_list;
    542
    543	struct mvumi_tag tag_pool;
    544	struct mvumi_cmd **tag_cmd;
    545	struct mvumi_hw_regs *regs;
    546	struct mutex device_lock;
    547	struct list_head mhba_dev_list;
    548	struct list_head shost_dev_list;
    549	struct task_struct *dm_thread;
    550	atomic_t pnp_count;
    551};
    552
    553struct mvumi_instance_template {
    554	void (*fire_cmd) (struct mvumi_hba *, struct mvumi_cmd *);
    555	void (*enable_intr) (struct mvumi_hba *);
    556	void (*disable_intr) (struct mvumi_hba *);
    557	int (*clear_intr) (void *);
    558	unsigned int (*read_fw_status_reg) (struct mvumi_hba *);
    559	unsigned int (*check_ib_list) (struct mvumi_hba *);
    560	int (*check_ob_list) (struct mvumi_hba *, unsigned int *,
    561			      unsigned int *);
    562	int (*reset_host) (struct mvumi_hba *);
    563};
    564
    565extern struct timezone sys_tz;
    566#endif