irq_64.c 25.8 KB
Newer Older
1
/* irq.c: UltraSparc IRQ handling/init/registry.
L
Linus Torvalds 已提交
2
 *
3
 * Copyright (C) 1997, 2007, 2008 David S. Miller (davem@davemloft.net)
L
Linus Torvalds 已提交
4 5 6 7 8 9
 * Copyright (C) 1998  Eddie C. Dost    (ecd@skynet.be)
 * Copyright (C) 1998  Jakub Jelinek    (jj@ultra.linux.cz)
 */

#include <linux/module.h>
#include <linux/sched.h>
10
#include <linux/linkage.h>
L
Linus Torvalds 已提交
11 12 13 14 15 16 17 18 19 20 21 22
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/kernel_stat.h>
#include <linux/signal.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/random.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
23
#include <linux/ftrace.h>
24
#include <linux/irq.h>
25
#include <linux/kmemleak.h>
L
Linus Torvalds 已提交
26 27 28 29 30 31

#include <asm/ptrace.h>
#include <asm/processor.h>
#include <asm/atomic.h>
#include <asm/system.h>
#include <asm/irq.h>
32
#include <asm/io.h>
L
Linus Torvalds 已提交
33 34 35
#include <asm/iommu.h>
#include <asm/upa.h>
#include <asm/oplib.h>
36
#include <asm/prom.h>
L
Linus Torvalds 已提交
37 38 39 40 41 42
#include <asm/timer.h>
#include <asm/smp.h>
#include <asm/starfire.h>
#include <asm/uaccess.h>
#include <asm/cache.h>
#include <asm/cpudata.h>
43
#include <asm/auxio.h>
44
#include <asm/head.h>
45
#include <asm/hypervisor.h>
46
#include <asm/cacheflush.h>
L
Linus Torvalds 已提交
47

48
#include "entry.h"
49
#include "cpumap.h"
50
#include "kstack.h"
51 52

#define NUM_IVECS	(IMAP_INR + 1)
53

54
struct ino_bucket *ivector_table;
55
unsigned long ivector_table_pa;
L
Linus Torvalds 已提交
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
/* On several sun4u processors, it is illegal to mix bypass and
 * non-bypass accesses.  Therefore we access all INO buckets
 * using bypass accesses only.
 */
static unsigned long bucket_get_chain_pa(unsigned long bucket_pa)
{
	unsigned long ret;

	__asm__ __volatile__("ldxa	[%1] %2, %0"
			     : "=&r" (ret)
			     : "r" (bucket_pa +
				    offsetof(struct ino_bucket,
					     __irq_chain_pa)),
			       "i" (ASI_PHYS_USE_EC));

	return ret;
}

static void bucket_clear_chain_pa(unsigned long bucket_pa)
{
	__asm__ __volatile__("stxa	%%g0, [%0] %1"
			     : /* no outputs */
			     : "r" (bucket_pa +
				    offsetof(struct ino_bucket,
					     __irq_chain_pa)),
			       "i" (ASI_PHYS_USE_EC));
}

static unsigned int bucket_get_virt_irq(unsigned long bucket_pa)
{
	unsigned int ret;

	__asm__ __volatile__("lduwa	[%1] %2, %0"
			     : "=&r" (ret)
			     : "r" (bucket_pa +
				    offsetof(struct ino_bucket,
					     __virt_irq)),
			       "i" (ASI_PHYS_USE_EC));

	return ret;
}

static void bucket_set_virt_irq(unsigned long bucket_pa,
				unsigned int virt_irq)
{
	__asm__ __volatile__("stwa	%0, [%1] %2"
			     : /* no outputs */
			     : "r" (virt_irq),
			       "r" (bucket_pa +
				    offsetof(struct ino_bucket,
					     __virt_irq)),
			       "i" (ASI_PHYS_USE_EC));
}

111
#define irq_work_pa(__cpu)	&(trap_block[(__cpu)].irq_worklist_pa)
L
Linus Torvalds 已提交
112

113 114 115
static struct {
	unsigned int dev_handle;
	unsigned int dev_ino;
116
	unsigned int in_use;
117
} virt_irq_table[NR_IRQS];
118
static DEFINE_SPINLOCK(virt_irq_alloc_lock);
119

120
unsigned char virt_irq_alloc(unsigned int dev_handle,
121
			     unsigned int dev_ino)
122
{
123
	unsigned long flags;
124 125 126 127
	unsigned char ent;

	BUILD_BUG_ON(NR_IRQS >= 256);

128 129
	spin_lock_irqsave(&virt_irq_alloc_lock, flags);

130
	for (ent = 1; ent < NR_IRQS; ent++) {
131
		if (!virt_irq_table[ent].in_use)
132 133
			break;
	}
134 135
	if (ent >= NR_IRQS) {
		printk(KERN_ERR "IRQ: Out of virtual IRQs.\n");
136 137
		ent = 0;
	} else {
138 139 140
		virt_irq_table[ent].dev_handle = dev_handle;
		virt_irq_table[ent].dev_ino = dev_ino;
		virt_irq_table[ent].in_use = 1;
141 142
	}

143
	spin_unlock_irqrestore(&virt_irq_alloc_lock, flags);
144 145 146 147

	return ent;
}

148
#ifdef CONFIG_PCI_MSI
149
void virt_irq_free(unsigned int virt_irq)
150
{
151
	unsigned long flags;
152

153 154 155
	if (virt_irq >= NR_IRQS)
		return;

156 157
	spin_lock_irqsave(&virt_irq_alloc_lock, flags);

158
	virt_irq_table[virt_irq].in_use = 0;
159

160
	spin_unlock_irqrestore(&virt_irq_alloc_lock, flags);
161
}
162
#endif
163

L
Linus Torvalds 已提交
164
/*
165
 * /proc/interrupts printing:
L
Linus Torvalds 已提交
166 167 168 169
 */

int show_interrupts(struct seq_file *p, void *v)
{
170 171
	int i = *(loff_t *) v, j;
	struct irqaction * action;
L
Linus Torvalds 已提交
172 173
	unsigned long flags;

174 175 176 177 178 179 180 181
	if (i == 0) {
		seq_printf(p, "           ");
		for_each_online_cpu(j)
			seq_printf(p, "CPU%d       ",j);
		seq_putc(p, '\n');
	}

	if (i < NR_IRQS) {
182
		raw_spin_lock_irqsave(&irq_desc[i].lock, flags);
183 184 185 186
		action = irq_desc[i].action;
		if (!action)
			goto skip;
		seq_printf(p, "%3d: ",i);
L
Linus Torvalds 已提交
187 188 189
#ifndef CONFIG_SMP
		seq_printf(p, "%10u ", kstat_irqs(i));
#else
190
		for_each_online_cpu(j)
191
			seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
L
Linus Torvalds 已提交
192
#endif
193
		seq_printf(p, " %9s", irq_desc[i].irq_data.chip->name);
194 195 196
		seq_printf(p, "  %s", action->name);

		for (action=action->next; action; action = action->next)
197
			seq_printf(p, ", %s", action->name);
198

L
Linus Torvalds 已提交
199
		seq_putc(p, '\n');
200
skip:
201
		raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags);
202 203 204 205 206
	} else if (i == NR_IRQS) {
		seq_printf(p, "NMI: ");
		for_each_online_cpu(j)
			seq_printf(p, "%10u ", cpu_data(j).__nmi_count);
		seq_printf(p, "     Non-maskable interrupts\n");
L
Linus Torvalds 已提交
207 208 209 210
	}
	return 0;
}

211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
static unsigned int sun4u_compute_tid(unsigned long imap, unsigned long cpuid)
{
	unsigned int tid;

	if (this_is_starfire) {
		tid = starfire_translate(imap, cpuid);
		tid <<= IMAP_TID_SHIFT;
		tid &= IMAP_TID_UPA;
	} else {
		if (tlb_type == cheetah || tlb_type == cheetah_plus) {
			unsigned long ver;

			__asm__ ("rdpr %%ver, %0" : "=r" (ver));
			if ((ver >> 32UL) == __JALAPENO_ID ||
			    (ver >> 32UL) == __SERRANO_ID) {
				tid = cpuid << IMAP_TID_SHIFT;
				tid &= IMAP_TID_JBUS;
			} else {
				unsigned int a = cpuid & 0x1f;
				unsigned int n = (cpuid >> 5) & 0x1f;

				tid = ((a << IMAP_AID_SHIFT) |
				       (n << IMAP_NID_SHIFT));
				tid &= (IMAP_AID_SAFARI |
235
					IMAP_NID_SAFARI);
236 237 238 239 240 241 242 243 244 245
			}
		} else {
			tid = cpuid << IMAP_TID_SHIFT;
			tid &= IMAP_TID_UPA;
		}
	}

	return tid;
}

246 247 248
struct irq_handler_data {
	unsigned long	iclr;
	unsigned long	imap;
249

250
	void		(*pre_handler)(unsigned int, void *, void *);
251 252
	void		*arg1;
	void		*arg2;
253
};
L
Linus Torvalds 已提交
254

255
#ifdef CONFIG_SMP
256
static int irq_choose_cpu(unsigned int virt_irq, const struct cpumask *affinity)
257
{
258
	cpumask_t mask;
259
	int cpuid;
260

261
	cpumask_copy(&mask, affinity);
262 263
	if (cpus_equal(mask, cpu_online_map)) {
		cpuid = map_to_cpu(virt_irq);
264 265
	} else {
		cpumask_t tmp;
266

267
		cpus_and(tmp, cpu_online_map, mask);
268
		cpuid = cpus_empty(tmp) ? map_to_cpu(virt_irq) : first_cpu(tmp);
L
Linus Torvalds 已提交
269
	}
270

271 272 273
	return cpuid;
}
#else
D
David S. Miller 已提交
274 275
#define irq_choose_cpu(virt_irq, affinity)	\
	real_hard_smp_processor_id()
276
#endif
L
Linus Torvalds 已提交
277

278
static void sun4u_irq_enable(struct irq_data *data)
279
{
280
	struct irq_handler_data *handler_data = data->handler_data;
281

282
	if (likely(handler_data)) {
283
		unsigned long cpuid, imap, val;
284
		unsigned int tid;
285

286
		cpuid = irq_choose_cpu(data->irq, data->affinity);
287
		imap = handler_data->imap;
288

289
		tid = sun4u_compute_tid(imap, cpuid);
290

291 292 293 294 295
		val = upa_readq(imap);
		val &= ~(IMAP_TID_UPA | IMAP_TID_JBUS |
			 IMAP_AID_SAFARI | IMAP_NID_SAFARI);
		val |= tid | IMAP_VALID;
		upa_writeq(val, imap);
296
		upa_writeq(ICLR_IDLE, handler_data->iclr);
297 298 299
	}
}

300 301
static int sun4u_set_affinity(struct irq_data *data,
			       const struct cpumask *mask, bool force)
302
{
303
	struct irq_handler_data *handler_data = data->handler_data;
304

305
	if (likely(handler_data)) {
306 307 308
		unsigned long cpuid, imap, val;
		unsigned int tid;

309
		cpuid = irq_choose_cpu(data->irq, mask);
310
		imap = handler_data->imap;
311 312 313 314 315 316 317 318

		tid = sun4u_compute_tid(imap, cpuid);

		val = upa_readq(imap);
		val &= ~(IMAP_TID_UPA | IMAP_TID_JBUS |
			 IMAP_AID_SAFARI | IMAP_NID_SAFARI);
		val |= tid | IMAP_VALID;
		upa_writeq(val, imap);
319
		upa_writeq(ICLR_IDLE, handler_data->iclr);
320
	}
321 322

	return 0;
323 324
}

325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
/* Don't do anything.  The desc->status check for IRQ_DISABLED in
 * handler_irq() will skip the handler call and that will leave the
 * interrupt in the sent state.  The next ->enable() call will hit the
 * ICLR register to reset the state machine.
 *
 * This scheme is necessary, instead of clearing the Valid bit in the
 * IMAP register, to handle the case of IMAP registers being shared by
 * multiple INOs (and thus ICLR registers).  Since we use a different
 * virtual IRQ for each shared IMAP instance, the generic code thinks
 * there is only one user so it prematurely calls ->disable() on
 * free_irq().
 *
 * We have to provide an explicit ->disable() method instead of using
 * NULL to get the default.  The reason is that if the generic code
 * sees that, it also hooks up a default ->shutdown method which
 * invokes ->mask() which we do not want.  See irq_chip_set_defaults().
 */
342
static void sun4u_irq_disable(struct irq_data *data)
L
Linus Torvalds 已提交
343
{
344 345
}

346
static void sun4u_irq_eoi(struct irq_data *data)
347
{
348 349
	struct irq_handler_data *handler_data = data->handler_data;
	struct irq_desc *desc = irq_desc + data->irq;
350 351 352

	if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
		return;
353

354 355
	if (likely(handler_data))
		upa_writeq(ICLR_IDLE, handler_data->iclr);
356 357
}

358
static void sun4v_irq_enable(struct irq_data *data)
359
{
360 361
	unsigned int ino = virt_irq_table[data->irq].dev_ino;
	unsigned long cpuid = irq_choose_cpu(data->irq, data->affinity);
362 363 364 365 366 367 368 369 370 371 372 373 374 375
	int err;

	err = sun4v_intr_settarget(ino, cpuid);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): "
		       "err(%d)\n", ino, cpuid, err);
	err = sun4v_intr_setstate(ino, HV_INTR_STATE_IDLE);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_intr_setstate(%x): "
		       "err(%d)\n", ino, err);
	err = sun4v_intr_setenabled(ino, HV_INTR_ENABLED);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_intr_setenabled(%x): err(%d)\n",
		       ino, err);
376 377
}

378 379
static int sun4v_set_affinity(struct irq_data *data,
			       const struct cpumask *mask, bool force)
380
{
381 382
	unsigned int ino = virt_irq_table[data->irq].dev_ino;
	unsigned long cpuid = irq_choose_cpu(data->irq, mask);
383 384 385 386 387 388
	int err;

	err = sun4v_intr_settarget(ino, cpuid);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): "
		       "err(%d)\n", ino, cpuid, err);
389 390

	return 0;
391 392
}

393
static void sun4v_irq_disable(struct irq_data *data)
L
Linus Torvalds 已提交
394
{
395
	unsigned int ino = virt_irq_table[data->irq].dev_ino;
396
	int err;
L
Linus Torvalds 已提交
397

398 399 400 401
	err = sun4v_intr_setenabled(ino, HV_INTR_DISABLED);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_intr_setenabled(%x): "
		       "err(%d)\n", ino, err);
402
}
L
Linus Torvalds 已提交
403

404
static void sun4v_irq_eoi(struct irq_data *data)
405
{
406 407
	unsigned int ino = virt_irq_table[data->irq].dev_ino;
	struct irq_desc *desc = irq_desc + data->irq;
408
	int err;
409 410 411

	if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
		return;
L
Linus Torvalds 已提交
412

413 414 415 416
	err = sun4v_intr_setstate(ino, HV_INTR_STATE_IDLE);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_intr_setstate(%x): "
		       "err(%d)\n", ino, err);
L
Linus Torvalds 已提交
417 418
}

419
static void sun4v_virq_enable(struct irq_data *data)
420
{
421 422 423
	unsigned long cpuid, dev_handle, dev_ino;
	int err;

424
	cpuid = irq_choose_cpu(data->irq, data->affinity);
425

426 427
	dev_handle = virt_irq_table[data->irq].dev_handle;
	dev_ino = virt_irq_table[data->irq].dev_ino;
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445

	err = sun4v_vintr_set_target(dev_handle, dev_ino, cpuid);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_vintr_set_target(%lx,%lx,%lu): "
		       "err(%d)\n",
		       dev_handle, dev_ino, cpuid, err);
	err = sun4v_vintr_set_state(dev_handle, dev_ino,
				    HV_INTR_STATE_IDLE);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
		       "HV_INTR_STATE_IDLE): err(%d)\n",
		       dev_handle, dev_ino, err);
	err = sun4v_vintr_set_valid(dev_handle, dev_ino,
				    HV_INTR_ENABLED);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
		       "HV_INTR_ENABLED): err(%d)\n",
		       dev_handle, dev_ino, err);
446 447
}

448 449
static int sun4v_virt_set_affinity(struct irq_data *data,
				    const struct cpumask *mask, bool force)
450
{
451 452
	unsigned long cpuid, dev_handle, dev_ino;
	int err;
453

454
	cpuid = irq_choose_cpu(data->irq, mask);
455

456 457
	dev_handle = virt_irq_table[data->irq].dev_handle;
	dev_ino = virt_irq_table[data->irq].dev_ino;
458

459 460 461 462 463
	err = sun4v_vintr_set_target(dev_handle, dev_ino, cpuid);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_vintr_set_target(%lx,%lx,%lu): "
		       "err(%d)\n",
		       dev_handle, dev_ino, cpuid, err);
464 465

	return 0;
466 467
}

468
static void sun4v_virq_disable(struct irq_data *data)
469
{
470 471 472
	unsigned long dev_handle, dev_ino;
	int err;

473 474
	dev_handle = virt_irq_table[data->irq].dev_handle;
	dev_ino = virt_irq_table[data->irq].dev_ino;
475 476 477 478 479 480 481

	err = sun4v_vintr_set_valid(dev_handle, dev_ino,
				    HV_INTR_DISABLED);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
		       "HV_INTR_DISABLED): err(%d)\n",
		       dev_handle, dev_ino, err);
482 483
}

484
static void sun4v_virq_eoi(struct irq_data *data)
485
{
486
	struct irq_desc *desc = irq_desc + data->irq;
487 488
	unsigned long dev_handle, dev_ino;
	int err;
489 490 491

	if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
		return;
492

493 494
	dev_handle = virt_irq_table[data->irq].dev_handle;
	dev_ino = virt_irq_table[data->irq].dev_ino;
495

496 497 498 499 500 501
	err = sun4v_vintr_set_state(dev_handle, dev_ino,
				    HV_INTR_STATE_IDLE);
	if (err != HV_EOK)
		printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
		       "HV_INTR_STATE_IDLE): err(%d)\n",
		       dev_handle, dev_ino, err);
502 503
}

504
static struct irq_chip sun4u_irq = {
505 506 507 508 509
	.name			= "sun4u",
	.irq_enable		= sun4u_irq_enable,
	.irq_disable		= sun4u_irq_disable,
	.irq_eoi		= sun4u_irq_eoi,
	.irq_set_affinity	= sun4u_set_affinity,
510
};
511

512
static struct irq_chip sun4v_irq = {
513 514 515 516 517
	.name			= "sun4v",
	.irq_enable		= sun4v_irq_enable,
	.irq_disable		= sun4v_irq_disable,
	.irq_eoi		= sun4v_irq_eoi,
	.irq_set_affinity	= sun4v_set_affinity,
518
};
L
Linus Torvalds 已提交
519

520
static struct irq_chip sun4v_virq = {
521 522 523 524 525
	.name			= "vsun4v",
	.irq_enable		= sun4v_virq_enable,
	.irq_disable		= sun4v_virq_disable,
	.irq_eoi		= sun4v_virq_eoi,
	.irq_set_affinity	= sun4v_virt_set_affinity,
526 527
};

528
static void pre_flow_handler(unsigned int virt_irq,
529 530
				      struct irq_desc *desc)
{
531
	struct irq_handler_data *handler_data = get_irq_data(virt_irq);
532 533
	unsigned int ino = virt_irq_table[virt_irq].dev_ino;

534
	handler_data->pre_handler(ino, handler_data->arg1, handler_data->arg2);
535 536 537 538

	handle_fasteoi_irq(virt_irq, desc);
}

539 540 541 542
void irq_install_pre_handler(int virt_irq,
			     void (*func)(unsigned int, void *, void *),
			     void *arg1, void *arg2)
{
543
	struct irq_handler_data *handler_data = get_irq_data(virt_irq);
544
	struct irq_desc *desc = irq_desc + virt_irq;
545

546 547 548
	handler_data->pre_handler = func;
	handler_data->arg1 = arg1;
	handler_data->arg2 = arg2;
549

550
	desc->handle_irq = pre_flow_handler;
551
}
L
Linus Torvalds 已提交
552

553 554 555
unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap)
{
	struct ino_bucket *bucket;
556
	struct irq_handler_data *handler_data;
557
	unsigned int virt_irq;
558
	int ino;
L
Linus Torvalds 已提交
559

560
	BUG_ON(tlb_type == hypervisor);
561

562
	ino = (upa_readq(imap) & (IMAP_IGN | IMAP_INO)) + inofixup;
563
	bucket = &ivector_table[ino];
564 565
	virt_irq = bucket_get_virt_irq(__pa(bucket));
	if (!virt_irq) {
566
		virt_irq = virt_irq_alloc(0, ino);
567
		bucket_set_virt_irq(__pa(bucket), virt_irq);
568 569 570 571
		set_irq_chip_and_handler_name(virt_irq,
					      &sun4u_irq,
					      handle_fasteoi_irq,
					      "IVEC");
572
	}
L
Linus Torvalds 已提交
573

574
	handler_data = get_irq_data(virt_irq);
575
	if (unlikely(handler_data))
576
		goto out;
577

578 579
	handler_data = kzalloc(sizeof(struct irq_handler_data), GFP_ATOMIC);
	if (unlikely(!handler_data)) {
580 581
		prom_printf("IRQ: kzalloc(irq_handler_data) failed.\n");
		prom_halt();
L
Linus Torvalds 已提交
582
	}
583
	set_irq_data(virt_irq, handler_data);
L
Linus Torvalds 已提交
584

585 586
	handler_data->imap  = imap;
	handler_data->iclr  = iclr;
L
Linus Torvalds 已提交
587

588
out:
589
	return virt_irq;
590
}
L
Linus Torvalds 已提交
591

592 593
static unsigned int sun4v_build_common(unsigned long sysino,
				       struct irq_chip *chip)
L
Linus Torvalds 已提交
594
{
595
	struct ino_bucket *bucket;
596
	struct irq_handler_data *handler_data;
597
	unsigned int virt_irq;
598

599
	BUG_ON(tlb_type != hypervisor);
L
Linus Torvalds 已提交
600

601
	bucket = &ivector_table[sysino];
602 603
	virt_irq = bucket_get_virt_irq(__pa(bucket));
	if (!virt_irq) {
604
		virt_irq = virt_irq_alloc(0, sysino);
605
		bucket_set_virt_irq(__pa(bucket), virt_irq);
606 607 608
		set_irq_chip_and_handler_name(virt_irq, chip,
					      handle_fasteoi_irq,
					      "IVEC");
L
Linus Torvalds 已提交
609 610
	}

611
	handler_data = get_irq_data(virt_irq);
612
	if (unlikely(handler_data))
L
Linus Torvalds 已提交
613 614
		goto out;

615 616
	handler_data = kzalloc(sizeof(struct irq_handler_data), GFP_ATOMIC);
	if (unlikely(!handler_data)) {
617 618 619
		prom_printf("IRQ: kzalloc(irq_handler_data) failed.\n");
		prom_halt();
	}
620
	set_irq_data(virt_irq, handler_data);
L
Linus Torvalds 已提交
621

622 623 624 625
	/* Catch accidental accesses to these things.  IMAP/ICLR handling
	 * is done by hypervisor calls on sun4v platforms, not by direct
	 * register accesses.
	 */
626 627
	handler_data->imap = ~0UL;
	handler_data->iclr = ~0UL;
L
Linus Torvalds 已提交
628

629
out:
630
	return virt_irq;
631
}
L
Linus Torvalds 已提交
632

633 634 635 636 637 638 639 640 641
unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino)
{
	unsigned long sysino = sun4v_devino_to_sysino(devhandle, devino);

	return sun4v_build_common(sysino, &sun4v_irq);
}

unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino)
{
642
	struct irq_handler_data *handler_data;
643
	unsigned long hv_err, cookie;
644 645
	struct ino_bucket *bucket;
	struct irq_desc *desc;
646
	unsigned int virt_irq;
647 648 649 650

	bucket = kzalloc(sizeof(struct ino_bucket), GFP_ATOMIC);
	if (unlikely(!bucket))
		return 0;
651 652 653 654 655 656 657 658

	/* The only reference we store to the IRQ bucket is
	 * by physical address which kmemleak can't see, tell
	 * it that this object explicitly is not a leak and
	 * should be scanned.
	 */
	kmemleak_not_leak(bucket);

659 660 661
	__flush_dcache_range((unsigned long) bucket,
			     ((unsigned long) bucket +
			      sizeof(struct ino_bucket)));
662

663
	virt_irq = virt_irq_alloc(devhandle, devino);
664
	bucket_set_virt_irq(__pa(bucket), virt_irq);
665 666 667 668

	set_irq_chip_and_handler_name(virt_irq, &sun4v_virq,
				      handle_fasteoi_irq,
				      "IVEC");
669

670 671
	handler_data = kzalloc(sizeof(struct irq_handler_data), GFP_ATOMIC);
	if (unlikely(!handler_data))
672
		return 0;
673

674 675 676 677 678 679 680
	/* In order to make the LDC channel startup sequence easier,
	 * especially wrt. locking, we do not let request_irq() enable
	 * the interrupt.
	 */
	desc = irq_desc + virt_irq;
	desc->status |= IRQ_NOAUTOEN;

681
	set_irq_data(virt_irq, handler_data);
682

683 684 685 686
	/* Catch accidental accesses to these things.  IMAP/ICLR handling
	 * is done by hypervisor calls on sun4v platforms, not by direct
	 * register accesses.
	 */
687 688
	handler_data->imap = ~0UL;
	handler_data->iclr = ~0UL;
689 690 691

	cookie = ~__pa(bucket);
	hv_err = sun4v_vintr_set_cookie(devhandle, devino, cookie);
692 693 694 695 696 697
	if (hv_err) {
		prom_printf("IRQ: Fatal, cannot set cookie for [%x:%x] "
			    "err=%lu\n", devhandle, devino, hv_err);
		prom_halt();
	}

698
	return virt_irq;
699 700
}

701 702
void ack_bad_irq(unsigned int virt_irq)
{
703
	unsigned int ino = virt_irq_table[virt_irq].dev_ino;
704

705 706
	if (!ino)
		ino = 0xdeadbeef;
707

708 709
	printk(KERN_CRIT "Unexpected IRQ from ino[%x] virt_irq[%u]\n",
	       ino, virt_irq);
L
Linus Torvalds 已提交
710 711
}

D
David S. Miller 已提交
712 713 714
void *hardirq_stack[NR_CPUS];
void *softirq_stack[NR_CPUS];

715
void __irq_entry handler_irq(int pil, struct pt_regs *regs)
L
Linus Torvalds 已提交
716
{
717
	unsigned long pstate, bucket_pa;
A
Al Viro 已提交
718
	struct pt_regs *old_regs;
D
David S. Miller 已提交
719
	void *orig_sp;
L
Linus Torvalds 已提交
720

721
	clear_softint(1 << pil);
L
Linus Torvalds 已提交
722

A
Al Viro 已提交
723
	old_regs = set_irq_regs(regs);
L
Linus Torvalds 已提交
724 725
	irq_enter();

726 727 728 729 730 731
	/* Grab an atomic snapshot of the pending IVECs.  */
	__asm__ __volatile__("rdpr	%%pstate, %0\n\t"
			     "wrpr	%0, %3, %%pstate\n\t"
			     "ldx	[%2], %1\n\t"
			     "stx	%%g0, [%2]\n\t"
			     "wrpr	%0, 0x0, %%pstate\n\t"
732 733
			     : "=&r" (pstate), "=&r" (bucket_pa)
			     : "r" (irq_work_pa(smp_processor_id())),
734 735 736
			       "i" (PSTATE_IE)
			     : "memory");

D
David S. Miller 已提交
737 738
	orig_sp = set_hardirq_stack();

739
	while (bucket_pa) {
740
		struct irq_desc *desc;
741 742
		unsigned long next_pa;
		unsigned int virt_irq;
L
Linus Torvalds 已提交
743

744 745 746
		next_pa = bucket_get_chain_pa(bucket_pa);
		virt_irq = bucket_get_virt_irq(bucket_pa);
		bucket_clear_chain_pa(bucket_pa);
747

748 749
		desc = irq_desc + virt_irq;

750 751
		if (!(desc->status & IRQ_DISABLED))
			desc->handle_irq(virt_irq, desc);
752 753

		bucket_pa = next_pa;
L
Linus Torvalds 已提交
754
	}
755

D
David S. Miller 已提交
756 757
	restore_hardirq_stack(orig_sp);

L
Linus Torvalds 已提交
758
	irq_exit();
A
Al Viro 已提交
759
	set_irq_regs(old_regs);
L
Linus Torvalds 已提交
760 761
}

D
David S. Miller 已提交
762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
void do_softirq(void)
{
	unsigned long flags;

	if (in_interrupt())
		return;

	local_irq_save(flags);

	if (local_softirq_pending()) {
		void *orig_sp, *sp = softirq_stack[smp_processor_id()];

		sp += THREAD_SIZE - 192 - STACK_BIAS;

		__asm__ __volatile__("mov %%sp, %0\n\t"
				     "mov %1, %%sp"
				     : "=&r" (orig_sp)
				     : "r" (sp));
		__do_softirq();
		__asm__ __volatile__("mov %0, %%sp"
				     : : "r" (orig_sp));
	}

	local_irq_restore(flags);
}

788 789 790 791 792 793 794 795
#ifdef CONFIG_HOTPLUG_CPU
void fixup_irqs(void)
{
	unsigned int irq;

	for (irq = 0; irq < NR_IRQS; irq++) {
		unsigned long flags;

796
		raw_spin_lock_irqsave(&irq_desc[irq].lock, flags);
797 798
		if (irq_desc[irq].action &&
		    !(irq_desc[irq].status & IRQ_PER_CPU)) {
799 800 801 802 803 804
			struct irq_data *data = irq_get_irq_data(irq);

			if (data->chip->irq_set_affinity)
				data->chip->irq_set_affinity(data,
				                             data->affinity,
				                             false);
805
		}
806
		raw_spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
807
	}
808 809

	tick_ops->disable_irq();
810 811 812
}
#endif

813 814 815 816 817 818
struct sun5_timer {
	u64	count0;
	u64	limit0;
	u64	count1;
	u64	limit1;
};
L
Linus Torvalds 已提交
819

820
static struct sun5_timer *prom_timers;
L
Linus Torvalds 已提交
821 822 823 824
static u64 prom_limit0, prom_limit1;

static void map_prom_timers(void)
{
825
	struct device_node *dp;
826
	const unsigned int *addr;
L
Linus Torvalds 已提交
827 828

	/* PROM timer node hangs out in the top level of device siblings... */
829 830 831 832 833 834 835
	dp = of_find_node_by_path("/");
	dp = dp->child;
	while (dp) {
		if (!strcmp(dp->name, "counter-timer"))
			break;
		dp = dp->sibling;
	}
L
Linus Torvalds 已提交
836 837 838 839

	/* Assume if node is not present, PROM uses different tick mechanism
	 * which we should not care about.
	 */
840
	if (!dp) {
L
Linus Torvalds 已提交
841 842 843 844 845
		prom_timers = (struct sun5_timer *) 0;
		return;
	}

	/* If PROM is really using this, it must be mapped by him. */
846 847
	addr = of_get_property(dp, "address", NULL);
	if (!addr) {
L
Linus Torvalds 已提交
848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881
		prom_printf("PROM does not have timer mapped, trying to continue.\n");
		prom_timers = (struct sun5_timer *) 0;
		return;
	}
	prom_timers = (struct sun5_timer *) ((unsigned long)addr[0]);
}

static void kill_prom_timer(void)
{
	if (!prom_timers)
		return;

	/* Save them away for later. */
	prom_limit0 = prom_timers->limit0;
	prom_limit1 = prom_timers->limit1;

	/* Just as in sun4c/sun4m PROM uses timer which ticks at IRQ 14.
	 * We turn both off here just to be paranoid.
	 */
	prom_timers->limit0 = 0;
	prom_timers->limit1 = 0;

	/* Wheee, eat the interrupt packet too... */
	__asm__ __volatile__(
"	mov	0x40, %%g2\n"
"	ldxa	[%%g0] %0, %%g1\n"
"	ldxa	[%%g2] %1, %%g1\n"
"	stxa	%%g0, [%%g0] %0\n"
"	membar	#Sync\n"
	: /* no outputs */
	: "i" (ASI_INTR_RECEIVE), "i" (ASI_INTR_R)
	: "g1", "g2");
}

882
void notrace init_irqwork_curcpu(void)
L
Linus Torvalds 已提交
883 884 885
{
	int cpu = hard_smp_processor_id();

886
	trap_block[cpu].irq_worklist_pa = 0UL;
L
Linus Torvalds 已提交
887 888
}

889 890 891 892 893 894 895 896 897 898 899
/* Please be very careful with register_one_mondo() and
 * sun4v_register_mondo_queues().
 *
 * On SMP this gets invoked from the CPU trampoline before
 * the cpu has fully taken over the trap table from OBP,
 * and it's kernel stack + %g6 thread register state is
 * not fully cooked yet.
 *
 * Therefore you cannot make any OBP calls, not even prom_printf,
 * from these two routines.
 */
900
static void __cpuinit notrace register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask)
901
{
902
	unsigned long num_entries = (qmask + 1) / 64;
903 904 905 906 907 908
	unsigned long status;

	status = sun4v_cpu_qconf(type, paddr, num_entries);
	if (status != HV_EOK) {
		prom_printf("SUN4V: sun4v_cpu_qconf(%lu:%lx:%lu) failed, "
			    "err %lu\n", type, paddr, num_entries, status);
909 910 911 912
		prom_halt();
	}
}

913
void __cpuinit notrace sun4v_register_mondo_queues(int this_cpu)
914
{
915 916
	struct trap_per_cpu *tb = &trap_block[this_cpu];

917 918 919 920 921 922 923 924
	register_one_mondo(tb->cpu_mondo_pa, HV_CPU_QUEUE_CPU_MONDO,
			   tb->cpu_mondo_qmask);
	register_one_mondo(tb->dev_mondo_pa, HV_CPU_QUEUE_DEVICE_MONDO,
			   tb->dev_mondo_qmask);
	register_one_mondo(tb->resum_mondo_pa, HV_CPU_QUEUE_RES_ERROR,
			   tb->resum_qmask);
	register_one_mondo(tb->nonresum_mondo_pa, HV_CPU_QUEUE_NONRES_ERROR,
			   tb->nonresum_qmask);
925 926
}

927 928 929 930 931
/* Each queue region must be a power of 2 multiple of 64 bytes in
 * size.  The base real address must be aligned to the size of the
 * region.  Thus, an 8KB queue must be 8KB aligned, for example.
 */
static void __init alloc_one_queue(unsigned long *pa_ptr, unsigned long qmask)
932
{
933
	unsigned long size = PAGE_ALIGN(qmask + 1);
934 935
	unsigned long order = get_order(size);
	unsigned long p;
936

937
	p = __get_free_pages(GFP_KERNEL, order);
938
	if (!p) {
939
		prom_printf("SUN4V: Error, cannot allocate queue.\n");
940 941 942
		prom_halt();
	}

943
	*pa_ptr = __pa(p);
944 945
}

946
static void __init init_cpu_send_mondo_info(struct trap_per_cpu *tb)
947 948
{
#ifdef CONFIG_SMP
949
	unsigned long page;
950 951 952

	BUILD_BUG_ON((NR_CPUS * sizeof(u16)) > (PAGE_SIZE - 64));

953
	page = get_zeroed_page(GFP_KERNEL);
954 955 956 957 958 959 960 961 962 963
	if (!page) {
		prom_printf("SUN4V: Error, cannot allocate cpu mondo page.\n");
		prom_halt();
	}

	tb->cpu_mondo_block_pa = __pa(page);
	tb->cpu_list_pa = __pa(page + 64);
#endif
}

964 965
/* Allocate mondo and error queues for all possible cpus.  */
static void __init sun4v_init_mondo_queues(void)
966
{
967
	int cpu;
968

969 970
	for_each_possible_cpu(cpu) {
		struct trap_per_cpu *tb = &trap_block[cpu];
971

972 973 974 975 976 977 978
		alloc_one_queue(&tb->cpu_mondo_pa, tb->cpu_mondo_qmask);
		alloc_one_queue(&tb->dev_mondo_pa, tb->dev_mondo_qmask);
		alloc_one_queue(&tb->resum_mondo_pa, tb->resum_qmask);
		alloc_one_queue(&tb->resum_kernel_buf_pa, tb->resum_qmask);
		alloc_one_queue(&tb->nonresum_mondo_pa, tb->nonresum_qmask);
		alloc_one_queue(&tb->nonresum_kernel_buf_pa,
				tb->nonresum_qmask);
979 980 981 982 983 984 985 986 987
	}
}

static void __init init_send_mondo_info(void)
{
	int cpu;

	for_each_possible_cpu(cpu) {
		struct trap_per_cpu *tb = &trap_block[cpu];
988

989
		init_cpu_send_mondo_info(tb);
990
	}
991 992
}

993 994 995 996
static struct irqaction timer_irq_action = {
	.name = "timer",
};

L
Linus Torvalds 已提交
997 998 999
/* Only invoked on boot processor. */
void __init init_IRQ(void)
{
1000 1001
	unsigned long size;

L
Linus Torvalds 已提交
1002 1003 1004
	map_prom_timers();
	kill_prom_timer();

1005
	size = sizeof(struct ino_bucket) * NUM_IVECS;
1006
	ivector_table = kzalloc(size, GFP_KERNEL);
1007 1008 1009 1010
	if (!ivector_table) {
		prom_printf("Fatal error, cannot allocate ivector_table\n");
		prom_halt();
	}
1011 1012
	__flush_dcache_range((unsigned long) ivector_table,
			     ((unsigned long) ivector_table) + size);
1013 1014

	ivector_table_pa = __pa(ivector_table);
1015

1016
	if (tlb_type == hypervisor)
1017
		sun4v_init_mondo_queues();
1018

1019 1020 1021 1022 1023 1024 1025
	init_send_mondo_info();

	if (tlb_type == hypervisor) {
		/* Load up the boot cpu's entries.  */
		sun4v_register_mondo_queues(hard_smp_processor_id());
	}

L
Linus Torvalds 已提交
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
	/* We need to clear any IRQ's pending in the soft interrupt
	 * registers, a spurious one could be left around from the
	 * PROM timer which we just disabled.
	 */
	clear_softint(get_softint());

	/* Now that ivector table is initialized, it is safe
	 * to receive IRQ vector traps.  We will normally take
	 * one or two right now, in case some device PROM used
	 * to boot us wants to speak to us.  We just ignore them.
	 */
	__asm__ __volatile__("rdpr	%%pstate, %%g1\n\t"
			     "or	%%g1, %0, %%g1\n\t"
			     "wrpr	%%g1, 0x0, %%pstate"
			     : /* No outputs */
			     : "i" (PSTATE_IE)
			     : "g1");

1044
	irq_desc[0].action = &timer_irq_action;
L
Linus Torvalds 已提交
1045
}