cio.c 25.2 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2 3 4
/*
 *   S/390 common I/O routines -- low level i/o calls
 *
5
 *    Copyright IBM Corp. 1999, 2008
L
Linus Torvalds 已提交
6
 *    Author(s): Ingo Adlung (adlung@de.ibm.com)
7
 *		 Cornelia Huck (cornelia.huck@de.ibm.com)
L
Linus Torvalds 已提交
8 9 10 11
 *		 Arnd Bergmann (arndb@de.ibm.com)
 *		 Martin Schwidefsky (schwidefsky@de.ibm.com)
 */

12 13 14
#define KMSG_COMPONENT "cio"
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt

15
#include <linux/ftrace.h>
L
Linus Torvalds 已提交
16 17 18 19 20 21
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/kernel_stat.h>
#include <linux/interrupt.h>
22
#include <linux/irq.h>
L
Linus Torvalds 已提交
23 24 25
#include <asm/cio.h>
#include <asm/delay.h>
#include <asm/irq.h>
H
Heiko Carstens 已提交
26
#include <asm/irq_regs.h>
27
#include <asm/setup.h>
28
#include <asm/reset.h>
M
Michael Holzheu 已提交
29
#include <asm/ipl.h>
30
#include <asm/chpid.h>
31
#include <asm/airq.h>
32
#include <asm/isc.h>
33
#include <linux/sched/cputime.h>
34
#include <asm/fcx.h>
35 36
#include <asm/nmi.h>
#include <asm/crw.h>
L
Linus Torvalds 已提交
37 38 39 40
#include "cio.h"
#include "css.h"
#include "chsc.h"
#include "ioasm.h"
41
#include "io_sch.h"
L
Linus Torvalds 已提交
42 43
#include "blacklist.h"
#include "cio_debug.h"
44
#include "chp.h"
45
#include "trace.h"
L
Linus Torvalds 已提交
46 47 48 49 50

debug_info_t *cio_debug_msg_id;
debug_info_t *cio_debug_trace_id;
debug_info_t *cio_debug_crw_id;

51 52 53
DEFINE_PER_CPU_ALIGNED(struct irb, cio_irb);
EXPORT_PER_CPU_SYMBOL(cio_irb);

L
Linus Torvalds 已提交
54 55
/*
 * Function: cio_debug_init
56 57
 * Initializes three debug logs for common I/O:
 * - cio_msg logs generic cio messages
L
Linus Torvalds 已提交
58
 * - cio_trace logs the calling of different functions
59
 * - cio_crw logs machine check related cio messages
L
Linus Torvalds 已提交
60
 */
61
static int __init cio_debug_init(void)
L
Linus Torvalds 已提交
62
{
63
	cio_debug_msg_id = debug_register("cio_msg", 16, 1, 11 * sizeof(long));
L
Linus Torvalds 已提交
64 65
	if (!cio_debug_msg_id)
		goto out_unregister;
66 67
	debug_register_view(cio_debug_msg_id, &debug_sprintf_view);
	debug_set_level(cio_debug_msg_id, 2);
68
	cio_debug_trace_id = debug_register("cio_trace", 16, 1, 16);
L
Linus Torvalds 已提交
69 70
	if (!cio_debug_trace_id)
		goto out_unregister;
71 72
	debug_register_view(cio_debug_trace_id, &debug_hex_ascii_view);
	debug_set_level(cio_debug_trace_id, 2);
73
	cio_debug_crw_id = debug_register("cio_crw", 8, 1, 8 * sizeof(long));
L
Linus Torvalds 已提交
74 75
	if (!cio_debug_crw_id)
		goto out_unregister;
76 77
	debug_register_view(cio_debug_crw_id, &debug_sprintf_view);
	debug_set_level(cio_debug_crw_id, 4);
L
Linus Torvalds 已提交
78 79 80
	return 0;

out_unregister:
81 82 83
	debug_unregister(cio_debug_msg_id);
	debug_unregister(cio_debug_trace_id);
	debug_unregister(cio_debug_crw_id);
L
Linus Torvalds 已提交
84 85 86 87 88
	return -1;
}

arch_initcall (cio_debug_init);

89
int cio_set_options(struct subchannel *sch, int flags)
L
Linus Torvalds 已提交
90
{
91
	struct io_subchannel_private *priv = to_io_private(sch);
L
Linus Torvalds 已提交
92

93 94 95 96
	priv->options.suspend = (flags & DOIO_ALLOW_SUSPEND) != 0;
	priv->options.prefetch = (flags & DOIO_DENY_PREFETCH) != 0;
	priv->options.inter = (flags & DOIO_SUPPRESS_INTER) != 0;
	return 0;
L
Linus Torvalds 已提交
97 98
}

99
static int
L
Linus Torvalds 已提交
100 101 102 103 104 105 106 107 108
cio_start_handle_notoper(struct subchannel *sch, __u8 lpm)
{
	char dbf_text[15];

	if (lpm != 0)
		sch->lpm &= ~lpm;
	else
		sch->lpm = 0;

109
	CIO_MSG_EVENT(2, "cio_start: 'not oper' status for "
110 111
		      "subchannel 0.%x.%04x!\n", sch->schid.ssid,
		      sch->schid.sch_no);
112 113 114 115

	if (cio_update_schib(sch))
		return -ENODEV;

116
	sprintf(dbf_text, "no%s", dev_name(&sch->dev));
L
Linus Torvalds 已提交
117 118 119 120 121 122 123 124 125 126 127 128
	CIO_TRACE_EVENT(0, dbf_text);
	CIO_HEX_EVENT(0, &sch->schib, sizeof (struct schib));

	return (sch->lpm ? -EACCES : -ENODEV);
}

int
cio_start_key (struct subchannel *sch,	/* subchannel structure */
	       struct ccw1 * cpa,	/* logical channel prog addr */
	       __u8 lpm,		/* logical path mask */
	       __u8 key)                /* storage key */
{
129 130
	struct io_subchannel_private *priv = to_io_private(sch);
	union orb *orb = &priv->orb;
L
Linus Torvalds 已提交
131 132
	int ccode;

S
Sebastian Ott 已提交
133 134
	CIO_TRACE_EVENT(5, "stIO");
	CIO_TRACE_EVENT(5, dev_name(&sch->dev));
L
Linus Torvalds 已提交
135

136
	memset(orb, 0, sizeof(union orb));
L
Linus Torvalds 已提交
137
	/* sch is always under 2G. */
138 139
	orb->cmd.intparm = (u32)(addr_t)sch;
	orb->cmd.fmt = 1;
L
Linus Torvalds 已提交
140

141 142 143
	orb->cmd.pfch = priv->options.prefetch == 0;
	orb->cmd.spnd = priv->options.suspend;
	orb->cmd.ssic = priv->options.suspend && priv->options.inter;
144
	orb->cmd.lpm = (lpm != 0) ? lpm : sch->lpm;
L
Linus Torvalds 已提交
145 146 147
	/*
	 * for 64 bit we always support 64 bit IDAWs with 4k page size only
	 */
148 149 150
	orb->cmd.c64 = 1;
	orb->cmd.i2k = 0;
	orb->cmd.key = key >> 4;
L
Linus Torvalds 已提交
151
	/* issue "Start Subchannel" */
152
	orb->cmd.cpa = (__u32) __pa(cpa);
153
	ccode = ssch(sch->schid, orb);
L
Linus Torvalds 已提交
154 155

	/* process condition code */
S
Sebastian Ott 已提交
156
	CIO_HEX_EVENT(5, &ccode, sizeof(ccode));
L
Linus Torvalds 已提交
157 158 159 160 161 162

	switch (ccode) {
	case 0:
		/*
		 * initialize device status information
		 */
163
		sch->schib.scsw.cmd.actl |= SCSW_ACTL_START_PEND;
L
Linus Torvalds 已提交
164 165 166 167
		return 0;
	case 1:		/* status pending */
	case 2:		/* busy */
		return -EBUSY;
168
	case 3:		/* device/path not operational */
L
Linus Torvalds 已提交
169
		return cio_start_handle_notoper(sch, lpm);
170 171
	default:
		return ccode;
L
Linus Torvalds 已提交
172 173
	}
}
D
Dong Jia Shi 已提交
174
EXPORT_SYMBOL_GPL(cio_start_key);
L
Linus Torvalds 已提交
175 176 177 178

int
cio_start (struct subchannel *sch, struct ccw1 *cpa, __u8 lpm)
{
179
	return cio_start_key(sch, cpa, lpm, PAGE_DEFAULT_KEY);
L
Linus Torvalds 已提交
180
}
D
Dong Jia Shi 已提交
181
EXPORT_SYMBOL_GPL(cio_start);
L
Linus Torvalds 已提交
182 183 184 185 186 187 188 189 190

/*
 * resume suspended I/O operation
 */
int
cio_resume (struct subchannel *sch)
{
	int ccode;

S
Sebastian Ott 已提交
191
	CIO_TRACE_EVENT(4, "resIO");
192
	CIO_TRACE_EVENT(4, dev_name(&sch->dev));
L
Linus Torvalds 已提交
193

194
	ccode = rsch (sch->schid);
L
Linus Torvalds 已提交
195

S
Sebastian Ott 已提交
196
	CIO_HEX_EVENT(4, &ccode, sizeof(ccode));
L
Linus Torvalds 已提交
197 198 199

	switch (ccode) {
	case 0:
200
		sch->schib.scsw.cmd.actl |= SCSW_ACTL_RESUME_PEND;
L
Linus Torvalds 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213
		return 0;
	case 1:
		return -EBUSY;
	case 2:
		return -EINVAL;
	default:
		/*
		 * useless to wait for request completion
		 *  as device is no longer operational !
		 */
		return -ENODEV;
	}
}
D
Dong Jia Shi 已提交
214
EXPORT_SYMBOL_GPL(cio_resume);
L
Linus Torvalds 已提交
215 216 217 218 219 220 221 222 223 224 225 226

/*
 * halt I/O operation
 */
int
cio_halt(struct subchannel *sch)
{
	int ccode;

	if (!sch)
		return -ENODEV;

S
Sebastian Ott 已提交
227
	CIO_TRACE_EVENT(2, "haltIO");
228
	CIO_TRACE_EVENT(2, dev_name(&sch->dev));
L
Linus Torvalds 已提交
229 230 231 232

	/*
	 * Issue "Halt subchannel" and process condition code
	 */
233
	ccode = hsch (sch->schid);
L
Linus Torvalds 已提交
234

S
Sebastian Ott 已提交
235
	CIO_HEX_EVENT(2, &ccode, sizeof(ccode));
L
Linus Torvalds 已提交
236 237 238

	switch (ccode) {
	case 0:
239
		sch->schib.scsw.cmd.actl |= SCSW_ACTL_HALT_PEND;
L
Linus Torvalds 已提交
240 241 242 243 244 245 246 247
		return 0;
	case 1:		/* status pending */
	case 2:		/* busy */
		return -EBUSY;
	default:		/* device not operational */
		return -ENODEV;
	}
}
D
Dong Jia Shi 已提交
248
EXPORT_SYMBOL_GPL(cio_halt);
L
Linus Torvalds 已提交
249 250 251 252 253 254 255 256 257 258 259 260

/*
 * Clear I/O operation
 */
int
cio_clear(struct subchannel *sch)
{
	int ccode;

	if (!sch)
		return -ENODEV;

S
Sebastian Ott 已提交
261
	CIO_TRACE_EVENT(2, "clearIO");
262
	CIO_TRACE_EVENT(2, dev_name(&sch->dev));
L
Linus Torvalds 已提交
263 264 265 266

	/*
	 * Issue "Clear subchannel" and process condition code
	 */
267
	ccode = csch (sch->schid);
L
Linus Torvalds 已提交
268

S
Sebastian Ott 已提交
269
	CIO_HEX_EVENT(2, &ccode, sizeof(ccode));
L
Linus Torvalds 已提交
270 271 272

	switch (ccode) {
	case 0:
273
		sch->schib.scsw.cmd.actl |= SCSW_ACTL_CLEAR_PEND;
L
Linus Torvalds 已提交
274 275 276 277 278
		return 0;
	default:		/* device not operational */
		return -ENODEV;
	}
}
D
Dong Jia Shi 已提交
279
EXPORT_SYMBOL_GPL(cio_clear);
L
Linus Torvalds 已提交
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295

/*
 * Function: cio_cancel
 * Issues a "Cancel Subchannel" on the specified subchannel
 * Note: We don't need any fancy intparms and flags here
 *	 since xsch is executed synchronously.
 * Only for common I/O internal use as for now.
 */
int
cio_cancel (struct subchannel *sch)
{
	int ccode;

	if (!sch)
		return -ENODEV;

S
Sebastian Ott 已提交
296
	CIO_TRACE_EVENT(2, "cancelIO");
297
	CIO_TRACE_EVENT(2, dev_name(&sch->dev));
L
Linus Torvalds 已提交
298

299
	ccode = xsch (sch->schid);
L
Linus Torvalds 已提交
300

S
Sebastian Ott 已提交
301
	CIO_HEX_EVENT(2, &ccode, sizeof(ccode));
L
Linus Torvalds 已提交
302 303 304 305

	switch (ccode) {
	case 0:		/* success */
		/* Update information in scsw. */
306 307
		if (cio_update_schib(sch))
			return -ENODEV;
L
Linus Torvalds 已提交
308 309 310 311 312 313 314 315 316
		return 0;
	case 1:		/* status pending */
		return -EBUSY;
	case 2:		/* not applicable */
		return -EINVAL;
	default:	/* not oper */
		return -ENODEV;
	}
}
D
Dong Jia Shi 已提交
317
EXPORT_SYMBOL_GPL(cio_cancel);
L
Linus Torvalds 已提交
318

319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
/**
 * cio_cancel_halt_clear - Cancel running I/O by performing cancel, halt
 * and clear ordinally if subchannel is valid.
 * @sch: subchannel on which to perform the cancel_halt_clear operation
 * @iretry: the number of the times remained to retry the next operation
 *
 * This should be called repeatedly since halt/clear are asynchronous
 * operations. We do one try with cio_cancel, three tries with cio_halt,
 * 255 tries with cio_clear. The caller should initialize @iretry with
 * the value 255 for its first call to this, and keep using the same
 * @iretry in the subsequent calls until it gets a non -EBUSY return.
 *
 * Returns 0 if device now idle, -ENODEV for device not operational,
 * -EBUSY if an interrupt is expected (either from halt/clear or from a
 * status pending), and -EIO if out of retries.
 */
int cio_cancel_halt_clear(struct subchannel *sch, int *iretry)
{
	int ret;

	if (cio_update_schib(sch))
		return -ENODEV;
	if (!sch->schib.pmcw.ena)
		/* Not operational -> done. */
		return 0;
	/* Stage 1: cancel io. */
	if (!(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_HALT_PEND) &&
	    !(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_CLEAR_PEND)) {
		if (!scsw_is_tm(&sch->schib.scsw)) {
			ret = cio_cancel(sch);
			if (ret != -EINVAL)
				return ret;
		}
		/*
		 * Cancel io unsuccessful or not applicable (transport mode).
		 * Continue with asynchronous instructions.
		 */
		*iretry = 3;	/* 3 halt retries. */
	}
	/* Stage 2: halt io. */
	if (!(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_CLEAR_PEND)) {
		if (*iretry) {
			*iretry -= 1;
			ret = cio_halt(sch);
			if (ret != -EBUSY)
				return (ret == 0) ? -EBUSY : ret;
		}
		/* Halt io unsuccessful. */
		*iretry = 255;	/* 255 clear retries. */
	}
	/* Stage 3: clear io. */
	if (*iretry) {
		*iretry -= 1;
		ret = cio_clear(sch);
		return (ret == 0) ? -EBUSY : ret;
	}
	/* Function was unsuccessful */
	return -EIO;
}
D
Dong Jia Shi 已提交
378
EXPORT_SYMBOL_GPL(cio_cancel_halt_clear);
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406

static void cio_apply_config(struct subchannel *sch, struct schib *schib)
{
	schib->pmcw.intparm = sch->config.intparm;
	schib->pmcw.mbi = sch->config.mbi;
	schib->pmcw.isc = sch->config.isc;
	schib->pmcw.ena = sch->config.ena;
	schib->pmcw.mme = sch->config.mme;
	schib->pmcw.mp = sch->config.mp;
	schib->pmcw.csense = sch->config.csense;
	schib->pmcw.mbfc = sch->config.mbfc;
	if (sch->config.mbfc)
		schib->mba = sch->config.mba;
}

static int cio_check_config(struct subchannel *sch, struct schib *schib)
{
	return (schib->pmcw.intparm == sch->config.intparm) &&
		(schib->pmcw.mbi == sch->config.mbi) &&
		(schib->pmcw.isc == sch->config.isc) &&
		(schib->pmcw.ena == sch->config.ena) &&
		(schib->pmcw.mme == sch->config.mme) &&
		(schib->pmcw.mp == sch->config.mp) &&
		(schib->pmcw.csense == sch->config.csense) &&
		(schib->pmcw.mbfc == sch->config.mbfc) &&
		(!sch->config.mbfc || (schib->mba == sch->config.mba));
}

L
Linus Torvalds 已提交
407
/*
408
 * cio_commit_config - apply configuration to the subchannel
L
Linus Torvalds 已提交
409
 */
410
int cio_commit_config(struct subchannel *sch)
L
Linus Torvalds 已提交
411
{
412
	int ccode, retry, ret = 0;
413 414
	struct schib schib;
	struct irb irb;
415

416
	if (stsch(sch->schid, &schib) || !css_sch_is_valid(&schib))
417
		return -ENODEV;
L
Linus Torvalds 已提交
418 419

	for (retry = 0; retry < 5; retry++) {
420 421
		/* copy desired changes to local schib */
		cio_apply_config(sch, &schib);
422
		ccode = msch(sch->schid, &schib);
423
		if (ccode < 0) /* -EIO if msch gets a program check. */
L
Linus Torvalds 已提交
424 425
			return ccode;
		switch (ccode) {
C
Coly Li 已提交
426
		case 0: /* successful */
427
			if (stsch(sch->schid, &schib) ||
428 429 430 431 432 433 434 435 436 437
			    !css_sch_is_valid(&schib))
				return -ENODEV;
			if (cio_check_config(sch, &schib)) {
				/* commit changes from local schib */
				memcpy(&sch->schib, &schib, sizeof(schib));
				return 0;
			}
			ret = -EAGAIN;
			break;
		case 1: /* status pending */
438 439 440 441
			ret = -EBUSY;
			if (tsch(sch->schid, &irb))
				return ret;
			break;
442 443
		case 2: /* busy */
			udelay(100); /* allow for recovery */
L
Linus Torvalds 已提交
444 445
			ret = -EBUSY;
			break;
446
		case 3: /* not operational */
L
Linus Torvalds 已提交
447 448 449 450 451
			return -ENODEV;
		}
	}
	return ret;
}
D
Dong Jia Shi 已提交
452
EXPORT_SYMBOL_GPL(cio_commit_config);
L
Linus Torvalds 已提交
453

454 455 456 457 458 459 460 461 462
/**
 * cio_update_schib - Perform stsch and update schib if subchannel is valid.
 * @sch: subchannel on which to perform stsch
 * Return zero on success, -ENODEV otherwise.
 */
int cio_update_schib(struct subchannel *sch)
{
	struct schib schib;

463
	if (stsch(sch->schid, &schib) || !css_sch_is_valid(&schib))
464 465 466 467 468 469 470
		return -ENODEV;

	memcpy(&sch->schib, &schib, sizeof(schib));
	return 0;
}
EXPORT_SYMBOL_GPL(cio_update_schib);

471 472 473 474
/**
 * cio_enable_subchannel - enable a subchannel.
 * @sch: subchannel to be enabled
 * @intparm: interruption parameter to set
L
Linus Torvalds 已提交
475
 */
476
int cio_enable_subchannel(struct subchannel *sch, u32 intparm)
L
Linus Torvalds 已提交
477 478 479
{
	int ret;

S
Sebastian Ott 已提交
480
	CIO_TRACE_EVENT(2, "ensch");
481
	CIO_TRACE_EVENT(2, dev_name(&sch->dev));
L
Linus Torvalds 已提交
482

483 484
	if (sch_is_pseudo_sch(sch))
		return -EINVAL;
485
	if (cio_update_schib(sch))
L
Linus Torvalds 已提交
486 487
		return -ENODEV;

488 489 490 491
	sch->config.ena = 1;
	sch->config.isc = sch->isc;
	sch->config.intparm = intparm;

492 493 494 495 496 497 498
	ret = cio_commit_config(sch);
	if (ret == -EIO) {
		/*
		 * Got a program check in msch. Try without
		 * the concurrent sense bit the next time.
		 */
		sch->config.csense = 0;
499
		ret = cio_commit_config(sch);
L
Linus Torvalds 已提交
500
	}
S
Sebastian Ott 已提交
501
	CIO_HEX_EVENT(2, &ret, sizeof(ret));
L
Linus Torvalds 已提交
502 503
	return ret;
}
504
EXPORT_SYMBOL_GPL(cio_enable_subchannel);
L
Linus Torvalds 已提交
505

506 507 508
/**
 * cio_disable_subchannel - disable a subchannel.
 * @sch: subchannel to disable
L
Linus Torvalds 已提交
509
 */
510
int cio_disable_subchannel(struct subchannel *sch)
L
Linus Torvalds 已提交
511 512 513
{
	int ret;

S
Sebastian Ott 已提交
514
	CIO_TRACE_EVENT(2, "dissch");
515
	CIO_TRACE_EVENT(2, dev_name(&sch->dev));
L
Linus Torvalds 已提交
516

517 518
	if (sch_is_pseudo_sch(sch))
		return 0;
519
	if (cio_update_schib(sch))
L
Linus Torvalds 已提交
520 521
		return -ENODEV;

522
	sch->config.ena = 0;
523
	ret = cio_commit_config(sch);
524

S
Sebastian Ott 已提交
525
	CIO_HEX_EVENT(2, &ret, sizeof(ret));
L
Linus Torvalds 已提交
526 527
	return ret;
}
528
EXPORT_SYMBOL_GPL(cio_disable_subchannel);
L
Linus Torvalds 已提交
529

530
static int cio_check_devno_blacklisted(struct subchannel *sch)
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
{
	if (is_blacklisted(sch->schid.ssid, sch->schib.pmcw.dev)) {
		/*
		 * This device must not be known to Linux. So we simply
		 * say that there is no device and return ENODEV.
		 */
		CIO_MSG_EVENT(6, "Blacklisted device detected "
			      "at devno %04X, subchannel set %x\n",
			      sch->schib.pmcw.dev, sch->schid.ssid);
		return -ENODEV;
	}
	return 0;
}

/**
 * cio_validate_subchannel - basic validation of subchannel
 * @sch: subchannel structure to be filled out
 * @schid: subchannel id
L
Linus Torvalds 已提交
549 550 551
 *
 * Find out subchannel type and initialize struct subchannel.
 * Return codes:
552
 *   0 on success
L
Linus Torvalds 已提交
553
 *   -ENXIO for non-defined subchannels
554 555
 *   -ENODEV for invalid subchannels or blacklisted devices
 *   -EIO for subchannels in an invalid subchannel set
L
Linus Torvalds 已提交
556
 */
557
int cio_validate_subchannel(struct subchannel *sch, struct subchannel_id schid)
L
Linus Torvalds 已提交
558 559 560
{
	char dbf_txt[15];
	int ccode;
C
Cornelia Huck 已提交
561
	int err;
L
Linus Torvalds 已提交
562

563 564
	sprintf(dbf_txt, "valsch%x", schid.sch_no);
	CIO_TRACE_EVENT(4, dbf_txt);
L
Linus Torvalds 已提交
565 566 567

	/*
	 * The first subchannel that is not-operational (ccode==3)
568
	 * indicates that there aren't any more devices available.
569
	 * If stsch gets an exception, it means the current subchannel set
570
	 * is not valid.
L
Linus Torvalds 已提交
571
	 */
572
	ccode = stsch(schid, &sch->schib);
C
Cornelia Huck 已提交
573 574 575 576
	if (ccode) {
		err = (ccode == 3) ? -ENXIO : ccode;
		goto out;
	}
L
Linus Torvalds 已提交
577
	sch->st = sch->schib.pmcw.st;
578
	sch->schid = schid;
C
Cornelia Huck 已提交
579

580 581
	switch (sch->st) {
	case SUBCHANNEL_TYPE_IO:
582
	case SUBCHANNEL_TYPE_MSG:
583 584 585 586
		if (!css_sch_is_valid(&sch->schib))
			err = -ENODEV;
		else
			err = cio_check_devno_blacklisted(sch);
587
		break;
588 589
	default:
		err = 0;
L
Linus Torvalds 已提交
590
	}
591
	if (err)
592 593
		goto out;

594 595
	CIO_MSG_EVENT(4, "Subchannel 0.%x.%04x reports subchannel type %04X\n",
		      sch->schid.ssid, sch->schid.sch_no, sch->st);
C
Cornelia Huck 已提交
596 597
out:
	return err;
L
Linus Torvalds 已提交
598 599 600
}

/*
601
 * do_cio_interrupt() handles all normal I/O device IRQ's
L
Linus Torvalds 已提交
602
 */
603
static irqreturn_t do_cio_interrupt(int irq, void *dummy)
L
Linus Torvalds 已提交
604
{
605
	struct tpi_info *tpi_info;
L
Linus Torvalds 已提交
606 607 608
	struct subchannel *sch;
	struct irb *irb;

609
	set_cpu_flag(CIF_NOHZ_DELAY);
610
	tpi_info = (struct tpi_info *) &get_irq_regs()->int_code;
611
	trace_s390_cio_interrupt(tpi_info);
612
	irb = this_cpu_ptr(&cio_irb);
613 614 615 616 617
	sch = (struct subchannel *)(unsigned long) tpi_info->intparm;
	if (!sch) {
		/* Clear pending interrupt condition. */
		inc_irq_stat(IRQIO_CIO);
		tsch(tpi_info->schid, irb);
618
		return IRQ_HANDLED;
619 620 621 622 623 624 625 626 627 628
	}
	spin_lock(sch->lock);
	/* Store interrupt response block to lowcore. */
	if (tsch(tpi_info->schid, irb) == 0) {
		/* Keep subchannel information word up to date. */
		memcpy (&sch->schib.scsw, &irb->scsw, sizeof (irb->scsw));
		/* Call interrupt handler if there is one. */
		if (sch->driver && sch->driver->irq)
			sch->driver->irq(sch);
		else
629
			inc_irq_stat(IRQIO_CIO);
630 631 632
	} else
		inc_irq_stat(IRQIO_CIO);
	spin_unlock(sch->lock);
633 634 635 636 637 638 639 640 641 642 643 644 645 646

	return IRQ_HANDLED;
}

static struct irqaction io_interrupt = {
	.name	 = "IO",
	.handler = do_cio_interrupt,
};

void __init init_cio_interrupts(void)
{
	irq_set_chip_and_handler(IO_INTERRUPT,
				 &dummy_irq_chip, handle_percpu_irq);
	setup_irq(IO_INTERRUPT, &io_interrupt);
L
Linus Torvalds 已提交
647 648 649
}

#ifdef CONFIG_CCW_CONSOLE
650
static struct subchannel *console_sch;
651
static struct lock_class_key console_sch_key;
L
Linus Torvalds 已提交
652

653
/*
654
 * Use cio_tsch to update the subchannel status and call the interrupt handler
655
 * if status had been pending. Called with the subchannel's lock held.
656
 */
657
void cio_tsch(struct subchannel *sch)
658 659 660 661
{
	struct irb *irb;
	int irq_context;

662
	irb = this_cpu_ptr(&cio_irb);
663
	/* Store interrupt response block to lowcore. */
664
	if (tsch(sch->schid, irb) != 0)
665
		/* Not status pending or not operational. */
666 667 668
		return;
	memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw));
	/* Call interrupt handler with updated status. */
669
	irq_context = in_interrupt();
670
	if (!irq_context) {
671
		local_bh_disable();
672 673
		irq_enter();
	}
674
	kstat_incr_irq_this_cpu(IO_INTERRUPT);
675 676
	if (sch->driver && sch->driver->irq)
		sch->driver->irq(sch);
677
	else
678
		inc_irq_stat(IRQIO_CIO);
679 680
	if (!irq_context) {
		irq_exit();
681
		_local_bh_enable();
682
	}
683 684
}

685
static int cio_test_for_console(struct subchannel_id schid, void *data)
686
{
687
	struct schib schib;
688

689
	if (stsch(schid, &schib) != 0)
690
		return -ENXIO;
691 692
	if ((schib.pmcw.st == SUBCHANNEL_TYPE_IO) && schib.pmcw.dnv &&
	    (schib.pmcw.dev == console_devno)) {
693 694 695 696 697 698
		console_irq = schid.sch_no;
		return 1; /* found */
	}
	return 0;
}

699
static int cio_get_console_sch_no(void)
L
Linus Torvalds 已提交
700
{
701
	struct subchannel_id schid;
702 703
	struct schib schib;

704
	init_subchannel_id(&schid);
L
Linus Torvalds 已提交
705 706
	if (console_irq != -1) {
		/* VM provided us with the irq number of the console. */
707
		schid.sch_no = console_irq;
708
		if (stsch(schid, &schib) != 0 ||
709
		    (schib.pmcw.st != SUBCHANNEL_TYPE_IO) || !schib.pmcw.dnv)
L
Linus Torvalds 已提交
710
			return -1;
711
		console_devno = schib.pmcw.dev;
L
Linus Torvalds 已提交
712 713
	} else if (console_devno != -1) {
		/* At least the console device number is known. */
714
		for_each_subchannel(cio_test_for_console, NULL);
L
Linus Torvalds 已提交
715 716 717 718
	}
	return console_irq;
}

719
struct subchannel *cio_probe_console(void)
L
Linus Torvalds 已提交
720
{
721
	struct subchannel_id schid;
722 723
	struct subchannel *sch;
	int sch_no, ret;
L
Linus Torvalds 已提交
724

725 726
	sch_no = cio_get_console_sch_no();
	if (sch_no == -1) {
727
		pr_warn("No CCW console was found\n");
L
Linus Torvalds 已提交
728 729
		return ERR_PTR(-ENODEV);
	}
730
	init_subchannel_id(&schid);
731
	schid.sch_no = sch_no;
732 733 734
	sch = css_alloc_subchannel(schid);
	if (IS_ERR(sch))
		return sch;
L
Linus Torvalds 已提交
735

736
	lockdep_set_class(sch->lock, &console_sch_key);
737
	isc_register(CONSOLE_ISC);
738 739 740
	sch->config.isc = CONSOLE_ISC;
	sch->config.intparm = (u32)(addr_t)sch;
	ret = cio_commit_config(sch);
L
Linus Torvalds 已提交
741
	if (ret) {
742
		isc_unregister(CONSOLE_ISC);
743
		put_device(&sch->dev);
L
Linus Torvalds 已提交
744 745
		return ERR_PTR(ret);
	}
746 747
	console_sch = sch;
	return sch;
L
Linus Torvalds 已提交
748 749
}

750
int cio_is_console(struct subchannel_id schid)
L
Linus Torvalds 已提交
751
{
752
	if (!console_sch)
L
Linus Torvalds 已提交
753
		return 0;
754
	return schid_equal(&schid, &console_sch->schid);
L
Linus Torvalds 已提交
755 756
}

757
void cio_register_early_subchannels(void)
L
Linus Torvalds 已提交
758
{
759 760 761 762 763 764 765 766
	int ret;

	if (!console_sch)
		return;

	ret = css_register_subchannel(console_sch);
	if (ret)
		put_device(&console_sch->dev);
L
Linus Torvalds 已提交
767
}
768
#endif /* CONFIG_CCW_CONSOLE */
L
Linus Torvalds 已提交
769

770
static int
771
__disable_subchannel_easy(struct subchannel_id schid, struct schib *schib)
L
Linus Torvalds 已提交
772 773 774 775 776 777
{
	int retry, cc;

	cc = 0;
	for (retry=0;retry<3;retry++) {
		schib->pmcw.ena = 0;
778
		cc = msch(schid, schib);
L
Linus Torvalds 已提交
779 780
		if (cc)
			return (cc==3?-ENODEV:-EBUSY);
781
		if (stsch(schid, schib) || !css_sch_is_valid(schib))
782
			return -ENODEV;
L
Linus Torvalds 已提交
783 784 785 786 787 788
		if (!schib->pmcw.ena)
			return 0;
	}
	return -EBUSY; /* uhm... */
}

789
static int
790
__clear_io_subchannel_easy(struct subchannel_id schid)
L
Linus Torvalds 已提交
791 792 793 794 795 796 797 798 799
{
	int retry;

	if (csch(schid))
		return -ENODEV;
	for (retry=0;retry<20;retry++) {
		struct tpi_info ti;

		if (tpi(&ti)) {
800
			tsch(ti.schid, this_cpu_ptr(&cio_irb));
801
			if (schid_equal(&ti.schid, &schid))
802
				return 0;
L
Linus Torvalds 已提交
803
		}
804
		udelay_simple(100);
L
Linus Torvalds 已提交
805 806 807 808
	}
	return -EBUSY;
}

809 810 811
static void __clear_chsc_subchannel_easy(void)
{
	/* It seems we can only wait for a bit here :/ */
812
	udelay_simple(100);
813 814
}

M
Michael Holzheu 已提交
815 816 817 818 819 820 821
static int pgm_check_occured;

static void cio_reset_pgm_check_handler(void)
{
	pgm_check_occured = 1;
}

822
static int stsch_reset(struct subchannel_id schid, struct schib *addr)
M
Michael Holzheu 已提交
823 824 825 826
{
	int rc;

	pgm_check_occured = 0;
827
	s390_base_pgm_handler_fn = cio_reset_pgm_check_handler;
828
	rc = stsch(schid, addr);
829
	s390_base_pgm_handler_fn = NULL;
M
Michael Holzheu 已提交
830

831
	/* The program check handler could have changed pgm_check_occured. */
832
	barrier();
M
Michael Holzheu 已提交
833

M
Michael Holzheu 已提交
834 835 836 837 838 839
	if (pgm_check_occured)
		return -EIO;
	else
		return rc;
}

840
static int __shutdown_subchannel_easy(struct subchannel_id schid, void *data)
841 842 843
{
	struct schib schib;

M
Michael Holzheu 已提交
844
	if (stsch_reset(schid, &schib))
845 846 847 848 849 850 851 852
		return -ENXIO;
	if (!schib.pmcw.ena)
		return 0;
	switch(__disable_subchannel_easy(schid, &schib)) {
	case 0:
	case -ENODEV:
		break;
	default: /* -EBUSY */
853 854 855 856 857
		switch (schib.pmcw.st) {
		case SUBCHANNEL_TYPE_IO:
			if (__clear_io_subchannel_easy(schid))
				goto out; /* give up... */
			break;
858 859 860
		case SUBCHANNEL_TYPE_CHSC:
			__clear_chsc_subchannel_easy();
			break;
861 862 863 864
		default:
			/* No default clear strategy */
			break;
		}
865
		stsch(schid, &schib);
866 867
		__disable_subchannel_easy(schid, &schib);
	}
868
out:
869 870
	return 0;
}
L
Linus Torvalds 已提交
871

872 873 874 875 876
static atomic_t chpid_reset_count;

static void s390_reset_chpids_mcck_handler(void)
{
	struct crw crw;
H
Heiko Carstens 已提交
877
	union mci mci;
878 879

	/* Check for pending channel report word. */
H
Heiko Carstens 已提交
880 881
	mci.val = S390_lowcore.mcck_interruption_code;
	if (!mci.cp)
882 883 884 885 886 887 888 889 890 891 892 893 894 895
		return;
	/* Process channel report words. */
	while (stcrw(&crw) == 0) {
		/* Check for responses to RCHP. */
		if (crw.slct && crw.rsc == CRW_RSC_CPATH)
			atomic_dec(&chpid_reset_count);
	}
}

#define RCHP_TIMEOUT (30 * USEC_PER_SEC)
static void css_reset(void)
{
	int i, ret;
	unsigned long long timeout;
896
	struct chp_id chpid;
897 898 899 900

	/* Reset subchannels. */
	for_each_subchannel(__shutdown_subchannel_easy,  NULL);
	/* Reset channel paths. */
901
	s390_base_mcck_handler_fn = s390_reset_chpids_mcck_handler;
902 903 904 905
	/* Enable channel report machine checks. */
	__ctl_set_bit(14, 28);
	/* Temporarily reenable machine checks. */
	local_mcck_enable();
906
	chp_id_init(&chpid);
907
	for (i = 0; i <= __MAX_CHPID; i++) {
908 909
		chpid.id = i;
		ret = rchp(chpid);
910 911 912 913 914 915 916 917
		if ((ret == 0) || (ret == 2))
			/*
			 * rchp either succeeded, or another rchp is already
			 * in progress. In either case, we'll get a crw.
			 */
			atomic_inc(&chpid_reset_count);
	}
	/* Wait for machine check for all channel paths. */
918
	timeout = get_tod_clock_fast() + (RCHP_TIMEOUT << 12);
919
	while (atomic_read(&chpid_reset_count) != 0) {
920
		if (get_tod_clock_fast() > timeout)
921 922 923 924 925 926 927
			break;
		cpu_relax();
	}
	/* Disable machine checks again. */
	local_mcck_disable();
	/* Disable channel report machine checks. */
	__ctl_clear_bit(14, 28);
928
	s390_base_mcck_handler_fn = NULL;
929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
}

static struct reset_call css_reset_call = {
	.fn = css_reset,
};

static int __init init_css_reset_call(void)
{
	atomic_set(&chpid_reset_count, 0);
	register_reset_call(&css_reset_call);
	return 0;
}

arch_initcall(init_css_reset_call);

struct sch_match_id {
	struct subchannel_id schid;
	struct ccw_dev_id devid;
	int rc;
};

static int __reipl_subchannel_match(struct subchannel_id schid, void *data)
{
	struct schib schib;
	struct sch_match_id *match_id = data;

M
Michael Holzheu 已提交
955
	if (stsch_reset(schid, &schib))
956
		return -ENXIO;
957
	if ((schib.pmcw.st == SUBCHANNEL_TYPE_IO) && schib.pmcw.dnv &&
958 959 960 961 962 963 964 965 966 967 968
	    (schib.pmcw.dev == match_id->devid.devno) &&
	    (schid.ssid == match_id->devid.ssid)) {
		match_id->schid = schid;
		match_id->rc = 0;
		return 1;
	}
	return 0;
}

static int reipl_find_schid(struct ccw_dev_id *devid,
			    struct subchannel_id *schid)
L
Linus Torvalds 已提交
969
{
M
Michael Holzheu 已提交
970 971 972 973
	struct sch_match_id match_id;

	match_id.devid = *devid;
	match_id.rc = -ENODEV;
974
	for_each_subchannel(__reipl_subchannel_match, &match_id);
M
Michael Holzheu 已提交
975 976 977
	if (match_id.rc == 0)
		*schid = match_id.schid;
	return match_id.rc;
L
Linus Torvalds 已提交
978 979
}

M
Michael Holzheu 已提交
980 981
extern void do_reipl_asm(__u32 schid);

L
Linus Torvalds 已提交
982
/* Make sure all subchannels are quiet before we re-ipl an lpar. */
M
Michael Holzheu 已提交
983
void reipl_ccw_dev(struct ccw_dev_id *devid)
L
Linus Torvalds 已提交
984
{
985
	struct subchannel_id uninitialized_var(schid);
M
Michael Holzheu 已提交
986

987
	s390_reset_system();
988
	if (reipl_find_schid(devid, &schid) != 0)
M
Michael Holzheu 已提交
989 990
		panic("IPL Device not found\n");
	do_reipl_asm(*((__u32*)&schid));
L
Linus Torvalds 已提交
991
}
992

993
int __init cio_get_iplinfo(struct cio_iplinfo *iplinfo)
994
{
995
	static struct chsc_sda_area sda_area __initdata;
996
	struct subchannel_id schid;
997
	struct schib schib;
998

999
	schid = *(struct subchannel_id *)&S390_lowcore.subchannel_id;
1000
	if (!schid.one)
1001
		return -ENODEV;
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012

	if (schid.ssid) {
		/*
		 * Firmware should have already enabled MSS but whoever started
		 * the kernel might have initiated a channel subsystem reset.
		 * Ensure that MSS is enabled.
		 */
		memset(&sda_area, 0, sizeof(sda_area));
		if (__chsc_enable_facility(&sda_area, CHSC_SDA_OC_MSS))
			return -ENODEV;
	}
1013
	if (stsch(schid, &schib))
1014
		return -ENODEV;
1015 1016
	if (schib.pmcw.st != SUBCHANNEL_TYPE_IO)
		return -ENODEV;
1017 1018
	if (!schib.pmcw.dnv)
		return -ENODEV;
1019 1020

	iplinfo->ssid = schid.ssid;
1021 1022 1023
	iplinfo->devno = schib.pmcw.dev;
	iplinfo->is_qdio = schib.pmcw.qf;
	return 0;
1024
}
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057

/**
 * cio_tm_start_key - perform start function
 * @sch: subchannel on which to perform the start function
 * @tcw: transport-command word to be started
 * @lpm: mask of paths to use
 * @key: storage key to use for storage access
 *
 * Start the tcw on the given subchannel. Return zero on success, non-zero
 * otherwise.
 */
int cio_tm_start_key(struct subchannel *sch, struct tcw *tcw, u8 lpm, u8 key)
{
	int cc;
	union orb *orb = &to_io_private(sch)->orb;

	memset(orb, 0, sizeof(union orb));
	orb->tm.intparm = (u32) (addr_t) sch;
	orb->tm.key = key >> 4;
	orb->tm.b = 1;
	orb->tm.lpm = lpm ? lpm : sch->lpm;
	orb->tm.tcw = (u32) (addr_t) tcw;
	cc = ssch(sch->schid, orb);
	switch (cc) {
	case 0:
		return 0;
	case 1:
	case 2:
		return -EBUSY;
	default:
		return cio_start_handle_notoper(sch, lpm);
	}
}
D
Dong Jia Shi 已提交
1058
EXPORT_SYMBOL_GPL(cio_tm_start_key);
1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083

/**
 * cio_tm_intrg - perform interrogate function
 * @sch - subchannel on which to perform the interrogate function
 *
 * If the specified subchannel is running in transport-mode, perform the
 * interrogate function. Return zero on success, non-zero otherwie.
 */
int cio_tm_intrg(struct subchannel *sch)
{
	int cc;

	if (!to_io_private(sch)->orb.tm.b)
		return -EINVAL;
	cc = xsch(sch->schid);
	switch (cc) {
	case 0:
	case 2:
		return 0;
	case 1:
		return -EBUSY;
	default:
		return -ENODEV;
	}
}
D
Dong Jia Shi 已提交
1084
EXPORT_SYMBOL_GPL(cio_tm_intrg);