[go: up one dir, main page]

File: cio.h

package info (click to toggle)
s390-tools 2.15.1-2
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 8,216 kB
  • sloc: ansic: 130,144; sh: 9,397; cpp: 8,359; perl: 2,517; makefile: 1,960; asm: 1,016
file content (146 lines) | stat: -rw-r--r-- 4,009 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
 * zipl - zSeries Initial Program Loader tool
 *
 * Common I/O functions
 *
 * Copyright IBM Corp. 2013, 2017
 *
 * s390-tools is free software; you can redistribute it and/or modify
 * it under the terms of the MIT license. See LICENSE for details.
 */
#ifndef CIO_H
#define CIO_H

#include "libc.h"
#include "boot/s390.h"

/* Condition codes */
#define CC_INITIATED		0
#define CC_STATUS_PENDING	1
#define CC_BUSY			2
#define CC_NOT_OPER		3

/* CCW FLAGS */
#define CCW_FLAG_IDA		0x04
#define CCW_FLAG_CC		0x40
#define CCW_FLAG_SLI		0x20

#define FIRST_PATH_MASK		0x80

#define DISABLED		0
#define ENABLED			1

#define MAX_RETRIES		255

struct subchannel_id {
	uint32_t cssid:8;
	uint32_t:4;
	uint32_t m:1;
	uint32_t ssid:2;
	uint32_t one:1;
	uint32_t sch_no:16;
} __packed __aligned(4);

struct ccw1 {
	uint8_t cmd_code;
	uint8_t flags;
	uint16_t count;
	uint32_t cda;
}  __packed __aligned(8);

struct irb {
	uint8_t data[64];
} __packed __aligned(4);

struct orb {
	uint32_t intparm;	/* interruption parameter */
	uint32_t key:4;		/* flags, like key, suspend control, etc. */
	uint32_t spnd:1;	/* suspend control */
	uint32_t res1:1;	/* reserved */
	uint32_t mod:1;		/* modification control */
	uint32_t sync:1;	/* synchronize control */
	uint32_t fmt:1;		/* format control */
	uint32_t pfch:1;	/* prefetch control */
	uint32_t isic:1;	/* initial-status-interruption control */
	uint32_t alcc:1;	/* address-limit-checking control */
	uint32_t ssic:1;	/* suppress-suspended-interr. control */
	uint32_t res2:1;	/* reserved */
	uint32_t c64:1;		/* IDAW/QDIO 64 bit control  */
	uint32_t i2k:1;		/* IDAW 2/4kB block size control */
	uint32_t lpm:8;		/* logical path mask */
	uint32_t ils:1;		/* incorrect length */
	uint32_t zero:6;	/* reserved zeros */
	uint32_t orbx:1;	/* ORB extension control */
	uint32_t cpa;		/* channel program address */
	uint8_t reserved[20];
} __packed __aligned(4);

struct scsw {
	uint32_t key:4;
	uint32_t sctl:1;
	uint32_t eswf:1;
	uint32_t cc:2;
	uint32_t fmt:1;
	uint32_t pfch:1;
	uint32_t isic:1;
	uint32_t alcc:1;
	uint32_t ssi:1;
	uint32_t zcc:1;
	uint32_t ectl:1;
	uint32_t pno:1;
	uint32_t res:1;
	uint32_t fctl:3;
	uint32_t actl:7;
	uint32_t stctl:5;
	uint32_t cpa;
	uint32_t dstat:8;
	uint32_t cstat:8;
	uint32_t count:16;
} __packed;

struct pmcw {
	uint32_t intparm;	/* interruption parameter */
	uint32_t qf:1;
	uint32_t w:1;
	uint32_t isc:3;		/* interruption sublass */
	uint32_t res5:3;	/* reserved zeros */
	uint32_t ena:1;		/* enabled */
	uint32_t lm:2;		/* limit mode */
	uint32_t mme:2;		/* measurement-mode enable */
	uint32_t mp:1;		/* multipath mode */
	uint32_t tf:1;		/* timing facility */
	uint32_t dnv:1;		/* device number valid */
	uint32_t dev:16;	/* device number */
	uint8_t  lpm;		/* logical path mask */
	uint8_t  pnom;		/* path not operational mask */
	uint8_t  lpum;		/* last path used mask */
	uint8_t  pim;		/* path installed mask */
	uint16_t mbi;		/* measurement-block index */
	uint8_t  pom;		/* path operational mask */
	uint8_t  pam;		/* path available mask */
	uint8_t  chpid[8];	/* CHPID 0-7 (if available) */
	uint32_t unused1:8;	/* reserved zeros */
	uint32_t st:3;
	uint32_t unused2:18;	/* reserved zeros */
	uint32_t mbfc:1;	/* measurement block format control */
	uint32_t xmwme:1;	/* extended measurement word mode enable */
	uint32_t csense:1;	/* concurrent sense; can be enabled ...*/
				/*  ... per MSCH, however, if facility */
				/*  ... is not installed, this results */
				/*  ... in an operand exception.       */
} __packed;

struct schib {
	struct pmcw pmcw;	/* path management control word */
	struct scsw scsw;	/* subchannel status word */
	uint64_t mba;		/* measurement block address */
	uint8_t mda[4];		/* model dependent area */
} __packed __aligned(4);

int start_io(struct subchannel_id, struct irb *, struct orb *, int panic);
int store_subchannel(struct subchannel_id, struct schib *);
void io_irq_enable(void);
void io_irq_disable(void);
void set_device(struct subchannel_id, int);

#endif /* CIO_H */