xref: /kernel/linux/linux-6.6/drivers/s390/cio/qdio.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright IBM Corp. 2000, 2009
462306a36Sopenharmony_ci * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
562306a36Sopenharmony_ci *	      Jan Glauber <jang@linux.vnet.ibm.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#ifndef _CIO_QDIO_H
862306a36Sopenharmony_ci#define _CIO_QDIO_H
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <asm/page.h>
1162306a36Sopenharmony_ci#include <asm/schid.h>
1262306a36Sopenharmony_ci#include <asm/debug.h>
1362306a36Sopenharmony_ci#include "chsc.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define QDIO_BUSY_BIT_PATIENCE		(100 << 12)	/* 100 microseconds */
1662306a36Sopenharmony_ci#define QDIO_BUSY_BIT_RETRY_DELAY	10		/* 10 milliseconds */
1762306a36Sopenharmony_ci#define QDIO_BUSY_BIT_RETRIES		1000		/* = 10s retry time */
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cienum qdio_irq_states {
2062306a36Sopenharmony_ci	QDIO_IRQ_STATE_INACTIVE,
2162306a36Sopenharmony_ci	QDIO_IRQ_STATE_ESTABLISHED,
2262306a36Sopenharmony_ci	QDIO_IRQ_STATE_ACTIVE,
2362306a36Sopenharmony_ci	QDIO_IRQ_STATE_STOPPED,
2462306a36Sopenharmony_ci	QDIO_IRQ_STATE_CLEANUP,
2562306a36Sopenharmony_ci	QDIO_IRQ_STATE_ERR,
2662306a36Sopenharmony_ci	NR_QDIO_IRQ_STATES,
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* used as intparm in do_IO */
3062306a36Sopenharmony_ci#define QDIO_DOING_ESTABLISH	1
3162306a36Sopenharmony_ci#define QDIO_DOING_ACTIVATE	2
3262306a36Sopenharmony_ci#define QDIO_DOING_CLEANUP	3
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define SLSB_STATE_NOT_INIT	0x0
3562306a36Sopenharmony_ci#define SLSB_STATE_EMPTY	0x1
3662306a36Sopenharmony_ci#define SLSB_STATE_PRIMED	0x2
3762306a36Sopenharmony_ci#define SLSB_STATE_PENDING	0x3
3862306a36Sopenharmony_ci#define SLSB_STATE_HALTED	0xe
3962306a36Sopenharmony_ci#define SLSB_STATE_ERROR	0xf
4062306a36Sopenharmony_ci#define SLSB_TYPE_INPUT		0x0
4162306a36Sopenharmony_ci#define SLSB_TYPE_OUTPUT	0x20
4262306a36Sopenharmony_ci#define SLSB_OWNER_PROG		0x80
4362306a36Sopenharmony_ci#define SLSB_OWNER_CU		0x40
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#define SLSB_P_INPUT_NOT_INIT	\
4662306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_INPUT | SLSB_STATE_NOT_INIT)  /* 0x80 */
4762306a36Sopenharmony_ci#define SLSB_P_INPUT_ACK	\
4862306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_INPUT | SLSB_STATE_EMPTY)	   /* 0x81 */
4962306a36Sopenharmony_ci#define SLSB_CU_INPUT_EMPTY	\
5062306a36Sopenharmony_ci	(SLSB_OWNER_CU | SLSB_TYPE_INPUT | SLSB_STATE_EMPTY)	   /* 0x41 */
5162306a36Sopenharmony_ci#define SLSB_P_INPUT_PRIMED	\
5262306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_INPUT | SLSB_STATE_PRIMED)	   /* 0x82 */
5362306a36Sopenharmony_ci#define SLSB_P_INPUT_HALTED	\
5462306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_INPUT | SLSB_STATE_HALTED)	   /* 0x8e */
5562306a36Sopenharmony_ci#define SLSB_P_INPUT_ERROR	\
5662306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_INPUT | SLSB_STATE_ERROR)	   /* 0x8f */
5762306a36Sopenharmony_ci#define SLSB_P_OUTPUT_NOT_INIT	\
5862306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_OUTPUT | SLSB_STATE_NOT_INIT) /* 0xa0 */
5962306a36Sopenharmony_ci#define SLSB_P_OUTPUT_EMPTY	\
6062306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_OUTPUT | SLSB_STATE_EMPTY)	   /* 0xa1 */
6162306a36Sopenharmony_ci#define SLSB_P_OUTPUT_PENDING \
6262306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_OUTPUT | SLSB_STATE_PENDING)  /* 0xa3 */
6362306a36Sopenharmony_ci#define SLSB_CU_OUTPUT_PRIMED	\
6462306a36Sopenharmony_ci	(SLSB_OWNER_CU | SLSB_TYPE_OUTPUT | SLSB_STATE_PRIMED)	   /* 0x62 */
6562306a36Sopenharmony_ci#define SLSB_P_OUTPUT_HALTED	\
6662306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_OUTPUT | SLSB_STATE_HALTED)   /* 0xae */
6762306a36Sopenharmony_ci#define SLSB_P_OUTPUT_ERROR	\
6862306a36Sopenharmony_ci	(SLSB_OWNER_PROG | SLSB_TYPE_OUTPUT | SLSB_STATE_ERROR)	   /* 0xaf */
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define SLSB_ERROR_DURING_LOOKUP  0xff
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/* additional CIWs returned by extended Sense-ID */
7362306a36Sopenharmony_ci#define CIW_TYPE_EQUEUE			0x3 /* establish QDIO queues */
7462306a36Sopenharmony_ci#define CIW_TYPE_AQUEUE			0x4 /* activate QDIO queues */
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* flags for st qdio sch data */
7762306a36Sopenharmony_ci#define CHSC_FLAG_QDIO_CAPABILITY	0x80
7862306a36Sopenharmony_ci#define CHSC_FLAG_VALIDITY		0x40
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/* SIGA flags */
8162306a36Sopenharmony_ci#define QDIO_SIGA_WRITE		0x00
8262306a36Sopenharmony_ci#define QDIO_SIGA_READ		0x01
8362306a36Sopenharmony_ci#define QDIO_SIGA_SYNC		0x02
8462306a36Sopenharmony_ci#define QDIO_SIGA_WRITEM	0x03
8562306a36Sopenharmony_ci#define QDIO_SIGA_WRITEQ	0x04
8662306a36Sopenharmony_ci#define QDIO_SIGA_QEBSM_FLAG	0x80
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic inline int do_sqbs(u64 token, unsigned char state, int queue,
8962306a36Sopenharmony_ci			  int *start, int *count)
9062306a36Sopenharmony_ci{
9162306a36Sopenharmony_ci	unsigned long _queuestart = ((unsigned long)queue << 32) | *start;
9262306a36Sopenharmony_ci	unsigned long _ccq = *count;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	asm volatile(
9562306a36Sopenharmony_ci		"	lgr	1,%[token]\n"
9662306a36Sopenharmony_ci		"	.insn	rsy,0xeb000000008a,%[qs],%[ccq],0(%[state])"
9762306a36Sopenharmony_ci		: [ccq] "+&d" (_ccq), [qs] "+&d" (_queuestart)
9862306a36Sopenharmony_ci		: [state] "a" ((unsigned long)state), [token] "d" (token)
9962306a36Sopenharmony_ci		: "memory", "cc", "1");
10062306a36Sopenharmony_ci	*count = _ccq & 0xff;
10162306a36Sopenharmony_ci	*start = _queuestart & 0xff;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	return (_ccq >> 32) & 0xff;
10462306a36Sopenharmony_ci}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_cistatic inline int do_eqbs(u64 token, unsigned char *state, int queue,
10762306a36Sopenharmony_ci			  int *start, int *count, int ack)
10862306a36Sopenharmony_ci{
10962306a36Sopenharmony_ci	unsigned long _queuestart = ((unsigned long)queue << 32) | *start;
11062306a36Sopenharmony_ci	unsigned long _state = (unsigned long)ack << 63;
11162306a36Sopenharmony_ci	unsigned long _ccq = *count;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	asm volatile(
11462306a36Sopenharmony_ci		"	lgr	1,%[token]\n"
11562306a36Sopenharmony_ci		"	.insn	rrf,0xb99c0000,%[qs],%[state],%[ccq],0"
11662306a36Sopenharmony_ci		: [ccq] "+&d" (_ccq), [qs] "+&d" (_queuestart),
11762306a36Sopenharmony_ci		  [state] "+&d" (_state)
11862306a36Sopenharmony_ci		: [token] "d" (token)
11962306a36Sopenharmony_ci		: "memory", "cc", "1");
12062306a36Sopenharmony_ci	*count = _ccq & 0xff;
12162306a36Sopenharmony_ci	*start = _queuestart & 0xff;
12262306a36Sopenharmony_ci	*state = _state & 0xff;
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	return (_ccq >> 32) & 0xff;
12562306a36Sopenharmony_ci}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cistruct qdio_irq;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cistruct qdio_dev_perf_stat {
13062306a36Sopenharmony_ci	unsigned int adapter_int;
13162306a36Sopenharmony_ci	unsigned int qdio_int;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	unsigned int siga_read;
13462306a36Sopenharmony_ci	unsigned int siga_write;
13562306a36Sopenharmony_ci	unsigned int siga_sync;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	unsigned int inbound_call;
13862306a36Sopenharmony_ci	unsigned int stop_polling;
13962306a36Sopenharmony_ci	unsigned int inbound_queue_full;
14062306a36Sopenharmony_ci	unsigned int outbound_call;
14162306a36Sopenharmony_ci	unsigned int outbound_queue_full;
14262306a36Sopenharmony_ci	unsigned int fast_requeue;
14362306a36Sopenharmony_ci	unsigned int target_full;
14462306a36Sopenharmony_ci	unsigned int eqbs;
14562306a36Sopenharmony_ci	unsigned int eqbs_partial;
14662306a36Sopenharmony_ci	unsigned int sqbs;
14762306a36Sopenharmony_ci	unsigned int sqbs_partial;
14862306a36Sopenharmony_ci	unsigned int int_discarded;
14962306a36Sopenharmony_ci} ____cacheline_aligned;
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cistruct qdio_queue_perf_stat {
15262306a36Sopenharmony_ci	/* Sorted into order-2 buckets: 1, 2-3, 4-7, ... 64-127, 128. */
15362306a36Sopenharmony_ci	unsigned int nr_sbals[8];
15462306a36Sopenharmony_ci	unsigned int nr_sbal_error;
15562306a36Sopenharmony_ci	unsigned int nr_sbal_nop;
15662306a36Sopenharmony_ci	unsigned int nr_sbal_total;
15762306a36Sopenharmony_ci};
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cienum qdio_irq_poll_states {
16062306a36Sopenharmony_ci	QDIO_IRQ_DISABLED,
16162306a36Sopenharmony_ci};
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_cistruct qdio_input_q {
16462306a36Sopenharmony_ci	/* Batch of SBALs that we processed while polling the queue: */
16562306a36Sopenharmony_ci	unsigned int batch_start;
16662306a36Sopenharmony_ci	unsigned int batch_count;
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistruct qdio_output_q {
17062306a36Sopenharmony_ci};
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/*
17362306a36Sopenharmony_ci * Note on cache alignment: grouped slsb and write mostly data at the beginning
17462306a36Sopenharmony_ci * sbal[] is read-only and starts on a new cacheline followed by read mostly.
17562306a36Sopenharmony_ci */
17662306a36Sopenharmony_cistruct qdio_q {
17762306a36Sopenharmony_ci	struct slsb slsb;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	union {
18062306a36Sopenharmony_ci		struct qdio_input_q in;
18162306a36Sopenharmony_ci		struct qdio_output_q out;
18262306a36Sopenharmony_ci	} u;
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	/*
18562306a36Sopenharmony_ci	 * inbound: next buffer the program should check for
18662306a36Sopenharmony_ci	 * outbound: next buffer to check if adapter processed it
18762306a36Sopenharmony_ci	 */
18862306a36Sopenharmony_ci	int first_to_check;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	/* number of buffers in use by the adapter */
19162306a36Sopenharmony_ci	atomic_t nr_buf_used;
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	/* last scan of the queue */
19462306a36Sopenharmony_ci	u64 timestamp;
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	struct qdio_queue_perf_stat q_stats;
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q] ____cacheline_aligned;
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	/* queue number */
20162306a36Sopenharmony_ci	int nr;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	/* bitmask of queue number */
20462306a36Sopenharmony_ci	int mask;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	/* input or output queue */
20762306a36Sopenharmony_ci	int is_input_q;
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci	/* upper-layer program handler */
21062306a36Sopenharmony_ci	qdio_handler_t (*handler);
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	struct qdio_irq *irq_ptr;
21362306a36Sopenharmony_ci	struct sl *sl;
21462306a36Sopenharmony_ci	/*
21562306a36Sopenharmony_ci	 * A page is allocated under this pointer and used for slib and sl.
21662306a36Sopenharmony_ci	 * slib is 2048 bytes big and sl points to offset PAGE_SIZE / 2.
21762306a36Sopenharmony_ci	 */
21862306a36Sopenharmony_ci	struct slib *slib;
21962306a36Sopenharmony_ci} __attribute__ ((aligned(256)));
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistruct qdio_irq {
22262306a36Sopenharmony_ci	struct qib qib;
22362306a36Sopenharmony_ci	u32 *dsci;		/* address of device state change indicator */
22462306a36Sopenharmony_ci	struct ccw_device *cdev;
22562306a36Sopenharmony_ci	struct list_head entry;		/* list of thinint devices */
22662306a36Sopenharmony_ci	struct dentry *debugfs_dev;
22762306a36Sopenharmony_ci	u64 last_data_irq_time;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	unsigned long int_parm;
23062306a36Sopenharmony_ci	struct subchannel_id schid;
23162306a36Sopenharmony_ci	unsigned long sch_token;	/* QEBSM facility */
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	enum qdio_irq_states state;
23462306a36Sopenharmony_ci	u8 qdioac1;
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	int nr_input_qs;
23762306a36Sopenharmony_ci	int nr_output_qs;
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	struct ccw1 *ccw;
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	struct qdio_ssqd_desc ssqd_desc;
24262306a36Sopenharmony_ci	void (*orig_handler) (struct ccw_device *, unsigned long, struct irb *);
24362306a36Sopenharmony_ci	qdio_handler_t (*error_handler);
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	int perf_stat_enabled;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	struct qdr *qdr;
24862306a36Sopenharmony_ci	unsigned long chsc_page;
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	struct qdio_q *input_qs[QDIO_MAX_QUEUES_PER_IRQ];
25162306a36Sopenharmony_ci	struct qdio_q *output_qs[QDIO_MAX_QUEUES_PER_IRQ];
25262306a36Sopenharmony_ci	unsigned int max_input_qs;
25362306a36Sopenharmony_ci	unsigned int max_output_qs;
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	void (*irq_poll)(struct ccw_device *cdev, unsigned long data);
25662306a36Sopenharmony_ci	unsigned long poll_state;
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	debug_info_t *debug_area;
25962306a36Sopenharmony_ci	struct mutex setup_mutex;
26062306a36Sopenharmony_ci	struct qdio_dev_perf_stat perf_stat;
26162306a36Sopenharmony_ci};
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci/* helper functions */
26462306a36Sopenharmony_ci#define queue_type(q)	q->irq_ptr->qib.qfmt
26562306a36Sopenharmony_ci#define SCH_NO(q)	(q->irq_ptr->schid.sch_no)
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci#define is_thinint_irq(irq) \
26862306a36Sopenharmony_ci	(irq->qib.qfmt == QDIO_IQDIO_QFMT || \
26962306a36Sopenharmony_ci	 css_general_characteristics.aif_osa)
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci#define qperf(__qdev, __attr)	((__qdev)->perf_stat.(__attr))
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci#define QDIO_PERF_STAT_INC(__irq, __attr)				\
27462306a36Sopenharmony_ci({									\
27562306a36Sopenharmony_ci	struct qdio_irq *qdev = __irq;					\
27662306a36Sopenharmony_ci	if (qdev->perf_stat_enabled)					\
27762306a36Sopenharmony_ci		(qdev->perf_stat.__attr)++;				\
27862306a36Sopenharmony_ci})
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci#define qperf_inc(__q, __attr)	QDIO_PERF_STAT_INC((__q)->irq_ptr, __attr)
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistatic inline void account_sbals_error(struct qdio_q *q, int count)
28362306a36Sopenharmony_ci{
28462306a36Sopenharmony_ci	q->q_stats.nr_sbal_error += count;
28562306a36Sopenharmony_ci	q->q_stats.nr_sbal_total += count;
28662306a36Sopenharmony_ci}
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci/* the highest iqdio queue is used for multicast */
28962306a36Sopenharmony_cistatic inline int multicast_outbound(struct qdio_q *q)
29062306a36Sopenharmony_ci{
29162306a36Sopenharmony_ci	return (q->irq_ptr->nr_output_qs > 1) &&
29262306a36Sopenharmony_ci	       (q->nr == q->irq_ptr->nr_output_qs - 1);
29362306a36Sopenharmony_ci}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_cistatic inline void qdio_deliver_irq(struct qdio_irq *irq)
29662306a36Sopenharmony_ci{
29762306a36Sopenharmony_ci	if (!test_and_set_bit(QDIO_IRQ_DISABLED, &irq->poll_state))
29862306a36Sopenharmony_ci		irq->irq_poll(irq->cdev, irq->int_parm);
29962306a36Sopenharmony_ci	else
30062306a36Sopenharmony_ci		QDIO_PERF_STAT_INC(irq, int_discarded);
30162306a36Sopenharmony_ci}
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci#define pci_out_supported(irq) ((irq)->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED)
30462306a36Sopenharmony_ci#define is_qebsm(q)			(q->irq_ptr->sch_token != 0)
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci#define qdio_need_siga_in(irq)		((irq)->qdioac1 & AC1_SIGA_INPUT_NEEDED)
30762306a36Sopenharmony_ci#define qdio_need_siga_out(irq)		((irq)->qdioac1 & AC1_SIGA_OUTPUT_NEEDED)
30862306a36Sopenharmony_ci#define qdio_need_siga_sync(irq)	(unlikely((irq)->qdioac1 & AC1_SIGA_SYNC_NEEDED))
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci#define for_each_input_queue(irq_ptr, q, i)		\
31162306a36Sopenharmony_ci	for (i = 0; i < irq_ptr->nr_input_qs &&		\
31262306a36Sopenharmony_ci		({ q = irq_ptr->input_qs[i]; 1; }); i++)
31362306a36Sopenharmony_ci#define for_each_output_queue(irq_ptr, q, i)		\
31462306a36Sopenharmony_ci	for (i = 0; i < irq_ptr->nr_output_qs &&	\
31562306a36Sopenharmony_ci		({ q = irq_ptr->output_qs[i]; 1; }); i++)
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci#define add_buf(bufnr, inc)	QDIO_BUFNR((bufnr) + (inc))
31862306a36Sopenharmony_ci#define next_buf(bufnr)		add_buf(bufnr, 1)
31962306a36Sopenharmony_ci#define sub_buf(bufnr, dec)	QDIO_BUFNR((bufnr) - (dec))
32062306a36Sopenharmony_ci#define prev_buf(bufnr)		sub_buf(bufnr, 1)
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ciextern u64 last_ai_time;
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci/* prototypes for thin interrupt */
32562306a36Sopenharmony_ciint qdio_establish_thinint(struct qdio_irq *irq_ptr);
32662306a36Sopenharmony_civoid qdio_shutdown_thinint(struct qdio_irq *irq_ptr);
32762306a36Sopenharmony_ciint qdio_thinint_init(void);
32862306a36Sopenharmony_civoid qdio_thinint_exit(void);
32962306a36Sopenharmony_ciint test_nonshared_ind(struct qdio_irq *);
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci/* prototypes for setup */
33262306a36Sopenharmony_civoid qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,
33362306a36Sopenharmony_ci		      struct irb *irb);
33462306a36Sopenharmony_ciint qdio_allocate_qs(struct qdio_irq *irq_ptr, int nr_input_qs,
33562306a36Sopenharmony_ci		     int nr_output_qs);
33662306a36Sopenharmony_civoid qdio_setup_ssqd_info(struct qdio_irq *irq_ptr);
33762306a36Sopenharmony_ciint qdio_setup_get_ssqd(struct qdio_irq *irq_ptr,
33862306a36Sopenharmony_ci			struct subchannel_id *schid,
33962306a36Sopenharmony_ci			struct qdio_ssqd_desc *data);
34062306a36Sopenharmony_civoid qdio_setup_irq(struct qdio_irq *irq_ptr, struct qdio_initialize *init_data);
34162306a36Sopenharmony_civoid qdio_shutdown_irq(struct qdio_irq *irq);
34262306a36Sopenharmony_civoid qdio_print_subchannel_info(struct qdio_irq *irq_ptr);
34362306a36Sopenharmony_civoid qdio_free_queues(struct qdio_irq *irq_ptr);
34462306a36Sopenharmony_ciint qdio_setup_init(void);
34562306a36Sopenharmony_civoid qdio_setup_exit(void);
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ciint debug_get_buf_state(struct qdio_q *q, unsigned int bufnr,
34862306a36Sopenharmony_ci			unsigned char *state);
34962306a36Sopenharmony_ci#endif /* _CIO_QDIO_H */
350