pci.c 23.9 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * Support PCI/PCIe on PowerNV platforms
 *
 * Currently supports only P5IOC2
 *
 * Copyright 2011 Benjamin Herrenschmidt, IBM Corp.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/bootmem.h>
#include <linux/irq.h>
#include <linux/io.h>
22
#include <linux/msi.h>
23
#include <linux/iommu.h>
24
25
26
27
28
29

#include <asm/sections.h>
#include <asm/io.h>
#include <asm/prom.h>
#include <asm/pci-bridge.h>
#include <asm/machdep.h>
30
#include <asm/msi_bitmap.h>
31
32
33
34
#include <asm/ppc-pci.h>
#include <asm/opal.h>
#include <asm/iommu.h>
#include <asm/tce.h>
35
#include <asm/firmware.h>
36
37
#include <asm/eeh_event.h>
#include <asm/eeh.h>
38
39
40
41

#include "powernv.h"
#include "pci.h"

42
43
/* Delay in usec */
#define PCI_RESET_DELAY_US	3000000
44
45
46
47

#define cfg_dbg(fmt...)	do { } while(0)
//#define cfg_dbg(fmt...)	printk(fmt)

48
49
50
51
52
#ifdef CONFIG_PCI_MSI
static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
53
	struct pci_dn *pdn = pci_get_pdn(pdev);
54
55
	struct msi_desc *entry;
	struct msi_msg msg;
56
57
	int hwirq;
	unsigned int virq;
58
59
	int rc;

60
61
62
63
	if (WARN_ON(!phb) || !phb->msi_bmp.bitmap)
		return -ENODEV;

	if (pdn && pdn->force_32bit_msi && !phb->msi32_support)
64
65
66
67
68
69
70
71
		return -ENODEV;

	list_for_each_entry(entry, &pdev->msi_list, list) {
		if (!entry->msi_attrib.is_64 && !phb->msi32_support) {
			pr_warn("%s: Supports only 64-bit MSIs\n",
				pci_name(pdev));
			return -ENXIO;
		}
72
73
		hwirq = msi_bitmap_alloc_hwirqs(&phb->msi_bmp, 1);
		if (hwirq < 0) {
74
75
76
77
			pr_warn("%s: Failed to find a free MSI\n",
				pci_name(pdev));
			return -ENOSPC;
		}
78
		virq = irq_create_mapping(NULL, phb->msi_base + hwirq);
79
80
81
		if (virq == NO_IRQ) {
			pr_warn("%s: Failed to map MSI to linux irq\n",
				pci_name(pdev));
82
			msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, 1);
83
84
			return -ENOMEM;
		}
85
		rc = phb->msi_setup(phb, pdev, phb->msi_base + hwirq,
86
				    virq, entry->msi_attrib.is_64, &msg);
87
88
89
		if (rc) {
			pr_warn("%s: Failed to setup MSI\n", pci_name(pdev));
			irq_dispose_mapping(virq);
90
			msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, 1);
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
			return rc;
		}
		irq_set_msi_desc(virq, entry);
		write_msi_msg(virq, &msg);
	}
	return 0;
}

static void pnv_teardown_msi_irqs(struct pci_dev *pdev)
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
	struct msi_desc *entry;

	if (WARN_ON(!phb))
		return;

	list_for_each_entry(entry, &pdev->msi_list, list) {
		if (entry->irq == NO_IRQ)
			continue;
		irq_set_msi_desc(entry->irq, NULL);
112
113
		msi_bitmap_free_hwirqs(&phb->msi_bmp,
			virq_to_hw(entry->irq) - phb->msi_base, 1);
114
115
116
117
		irq_dispose_mapping(entry->irq);
	}
}
#endif /* CONFIG_PCI_MSI */
118

119
120
static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose,
					 struct OpalIoPhbErrorCommon *common)
121
{
122
	struct OpalIoP7IOCPhbErrorData *data;
123
124
	int i;

125
	data = (struct OpalIoP7IOCPhbErrorData *)common;
126
	pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n",
127
		hose->global_number, be32_to_cpu(common->version));
128

129
	if (data->brdgCtl)
130
		pr_info("brdgCtl:     %08x\n",
131
			be32_to_cpu(data->brdgCtl));
132
133
	if (data->portStatusReg || data->rootCmplxStatus ||
	    data->busAgentStatus)
134
		pr_info("UtlSts:      %08x %08x %08x\n",
135
136
137
			be32_to_cpu(data->portStatusReg),
			be32_to_cpu(data->rootCmplxStatus),
			be32_to_cpu(data->busAgentStatus));
138
139
140
	if (data->deviceStatus || data->slotStatus   ||
	    data->linkStatus   || data->devCmdStatus ||
	    data->devSecStatus)
141
		pr_info("RootSts:     %08x %08x %08x %08x %08x\n",
142
143
144
145
146
			be32_to_cpu(data->deviceStatus),
			be32_to_cpu(data->slotStatus),
			be32_to_cpu(data->linkStatus),
			be32_to_cpu(data->devCmdStatus),
			be32_to_cpu(data->devSecStatus));
147
148
	if (data->rootErrorStatus   || data->uncorrErrorStatus ||
	    data->corrErrorStatus)
149
		pr_info("RootErrSts:  %08x %08x %08x\n",
150
151
152
			be32_to_cpu(data->rootErrorStatus),
			be32_to_cpu(data->uncorrErrorStatus),
			be32_to_cpu(data->corrErrorStatus));
153
154
	if (data->tlpHdr1 || data->tlpHdr2 ||
	    data->tlpHdr3 || data->tlpHdr4)
155
		pr_info("RootErrLog:  %08x %08x %08x %08x\n",
156
157
158
159
			be32_to_cpu(data->tlpHdr1),
			be32_to_cpu(data->tlpHdr2),
			be32_to_cpu(data->tlpHdr3),
			be32_to_cpu(data->tlpHdr4));
160
161
	if (data->sourceId || data->errorClass ||
	    data->correlator)
162
		pr_info("RootErrLog1: %08x %016llx %016llx\n",
163
164
165
			be32_to_cpu(data->sourceId),
			be64_to_cpu(data->errorClass),
			be64_to_cpu(data->correlator));
166
	if (data->p7iocPlssr || data->p7iocCsr)
167
		pr_info("PhbSts:      %016llx %016llx\n",
168
169
			be64_to_cpu(data->p7iocPlssr),
			be64_to_cpu(data->p7iocCsr));
170
171
	if (data->lemFir)
		pr_info("Lem:         %016llx %016llx %016llx\n",
172
173
174
			be64_to_cpu(data->lemFir),
			be64_to_cpu(data->lemErrorMask),
			be64_to_cpu(data->lemWOF));
175
176
	if (data->phbErrorStatus)
		pr_info("PhbErr:      %016llx %016llx %016llx %016llx\n",
177
178
179
180
			be64_to_cpu(data->phbErrorStatus),
			be64_to_cpu(data->phbFirstErrorStatus),
			be64_to_cpu(data->phbErrorLog0),
			be64_to_cpu(data->phbErrorLog1));
181
182
	if (data->mmioErrorStatus)
		pr_info("OutErr:      %016llx %016llx %016llx %016llx\n",
183
184
185
186
			be64_to_cpu(data->mmioErrorStatus),
			be64_to_cpu(data->mmioFirstErrorStatus),
			be64_to_cpu(data->mmioErrorLog0),
			be64_to_cpu(data->mmioErrorLog1));
187
188
	if (data->dma0ErrorStatus)
		pr_info("InAErr:      %016llx %016llx %016llx %016llx\n",
189
190
191
192
			be64_to_cpu(data->dma0ErrorStatus),
			be64_to_cpu(data->dma0FirstErrorStatus),
			be64_to_cpu(data->dma0ErrorLog0),
			be64_to_cpu(data->dma0ErrorLog1));
193
194
	if (data->dma1ErrorStatus)
		pr_info("InBErr:      %016llx %016llx %016llx %016llx\n",
195
196
197
198
			be64_to_cpu(data->dma1ErrorStatus),
			be64_to_cpu(data->dma1FirstErrorStatus),
			be64_to_cpu(data->dma1ErrorLog0),
			be64_to_cpu(data->dma1ErrorLog1));
199
200
201
202
203

	for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) {
		if ((data->pestA[i] >> 63) == 0 &&
		    (data->pestB[i] >> 63) == 0)
			continue;
204

205
		pr_info("PE[%3d] A/B: %016llx %016llx\n",
206
207
			i, be64_to_cpu(data->pestA[i]),
			be64_to_cpu(data->pestB[i]));
208
209
210
	}
}

211
212
static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose,
					struct OpalIoPhbErrorCommon *common)
213
{
214
215
216
217
	struct OpalIoPhb3ErrorData *data;
	int i;

	data = (struct OpalIoPhb3ErrorData*)common;
218
	pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n",
219
		hose->global_number, be32_to_cpu(common->version));
220
	if (data->brdgCtl)
221
		pr_info("brdgCtl:     %08x\n",
222
			be32_to_cpu(data->brdgCtl));
223
224
	if (data->portStatusReg || data->rootCmplxStatus ||
	    data->busAgentStatus)
225
		pr_info("UtlSts:      %08x %08x %08x\n",
226
227
228
			be32_to_cpu(data->portStatusReg),
			be32_to_cpu(data->rootCmplxStatus),
			be32_to_cpu(data->busAgentStatus));
229
230
231
	if (data->deviceStatus || data->slotStatus   ||
	    data->linkStatus   || data->devCmdStatus ||
	    data->devSecStatus)
232
		pr_info("RootSts:     %08x %08x %08x %08x %08x\n",
233
234
235
236
237
			be32_to_cpu(data->deviceStatus),
			be32_to_cpu(data->slotStatus),
			be32_to_cpu(data->linkStatus),
			be32_to_cpu(data->devCmdStatus),
			be32_to_cpu(data->devSecStatus));
238
239
	if (data->rootErrorStatus || data->uncorrErrorStatus ||
	    data->corrErrorStatus)
240
		pr_info("RootErrSts:  %08x %08x %08x\n",
241
242
243
			be32_to_cpu(data->rootErrorStatus),
			be32_to_cpu(data->uncorrErrorStatus),
			be32_to_cpu(data->corrErrorStatus));
244
245
	if (data->tlpHdr1 || data->tlpHdr2 ||
	    data->tlpHdr3 || data->tlpHdr4)
246
		pr_info("RootErrLog:  %08x %08x %08x %08x\n",
247
248
249
250
			be32_to_cpu(data->tlpHdr1),
			be32_to_cpu(data->tlpHdr2),
			be32_to_cpu(data->tlpHdr3),
			be32_to_cpu(data->tlpHdr4));
251
252
	if (data->sourceId || data->errorClass ||
	    data->correlator)
253
		pr_info("RootErrLog1: %08x %016llx %016llx\n",
254
255
256
			be32_to_cpu(data->sourceId),
			be64_to_cpu(data->errorClass),
			be64_to_cpu(data->correlator));
257
258
	if (data->nFir)
		pr_info("nFir:        %016llx %016llx %016llx\n",
259
260
261
			be64_to_cpu(data->nFir),
			be64_to_cpu(data->nFirMask),
			be64_to_cpu(data->nFirWOF));
262
	if (data->phbPlssr || data->phbCsr)
263
		pr_info("PhbSts:      %016llx %016llx\n",
264
265
			be64_to_cpu(data->phbPlssr),
			be64_to_cpu(data->phbCsr));
266
267
	if (data->lemFir)
		pr_info("Lem:         %016llx %016llx %016llx\n",
268
269
270
			be64_to_cpu(data->lemFir),
			be64_to_cpu(data->lemErrorMask),
			be64_to_cpu(data->lemWOF));
271
272
	if (data->phbErrorStatus)
		pr_info("PhbErr:      %016llx %016llx %016llx %016llx\n",
273
274
275
276
			be64_to_cpu(data->phbErrorStatus),
			be64_to_cpu(data->phbFirstErrorStatus),
			be64_to_cpu(data->phbErrorLog0),
			be64_to_cpu(data->phbErrorLog1));
277
278
	if (data->mmioErrorStatus)
		pr_info("OutErr:      %016llx %016llx %016llx %016llx\n",
279
280
281
282
			be64_to_cpu(data->mmioErrorStatus),
			be64_to_cpu(data->mmioFirstErrorStatus),
			be64_to_cpu(data->mmioErrorLog0),
			be64_to_cpu(data->mmioErrorLog1));
283
284
	if (data->dma0ErrorStatus)
		pr_info("InAErr:      %016llx %016llx %016llx %016llx\n",
285
286
287
288
			be64_to_cpu(data->dma0ErrorStatus),
			be64_to_cpu(data->dma0FirstErrorStatus),
			be64_to_cpu(data->dma0ErrorLog0),
			be64_to_cpu(data->dma0ErrorLog1));
289
290
	if (data->dma1ErrorStatus)
		pr_info("InBErr:      %016llx %016llx %016llx %016llx\n",
291
292
293
294
			be64_to_cpu(data->dma1ErrorStatus),
			be64_to_cpu(data->dma1FirstErrorStatus),
			be64_to_cpu(data->dma1ErrorLog0),
			be64_to_cpu(data->dma1ErrorLog1));
295
296

	for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) {
297
298
		if ((be64_to_cpu(data->pestA[i]) >> 63) == 0 &&
		    (be64_to_cpu(data->pestB[i]) >> 63) == 0)
299
300
			continue;

301
		pr_info("PE[%3d] A/B: %016llx %016llx\n",
302
303
				i, be64_to_cpu(data->pestA[i]),
				be64_to_cpu(data->pestB[i]));
304
305
306
307
308
309
310
311
312
313
314
315
	}
}

void pnv_pci_dump_phb_diag_data(struct pci_controller *hose,
				unsigned char *log_buff)
{
	struct OpalIoPhbErrorCommon *common;

	if (!hose || !log_buff)
		return;

	common = (struct OpalIoPhbErrorCommon *)log_buff;
316
	switch (be32_to_cpu(common->ioType)) {
317
318
319
320
321
	case OPAL_PHB_ERROR_DATA_TYPE_P7IOC:
		pnv_pci_dump_p7ioc_diag_data(hose, common);
		break;
	case OPAL_PHB_ERROR_DATA_TYPE_PHB3:
		pnv_pci_dump_phb3_diag_data(hose, common);
322
323
		break;
	default:
324
		pr_warn("%s: Unrecognized ioType %d\n",
325
			__func__, be32_to_cpu(common->ioType));
326
327
328
329
330
331
	}
}

static void pnv_pci_handle_eeh_config(struct pnv_phb *phb, u32 pe_no)
{
	unsigned long flags, rc;
332
	int has_diag, ret = 0;
333
334
335

	spin_lock_irqsave(&phb->lock, flags);

336
	/* Fetch PHB diag-data */
337
338
	rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob,
					 PNV_PCI_DIAG_BUF_SIZE);
339
340
	has_diag = (rc == OPAL_SUCCESS);

341
342
343
344
	/* If PHB supports compound PE, to handle it */
	if (phb->unfreeze_pe) {
		ret = phb->unfreeze_pe(phb,
				       pe_no,
345
				       OPAL_EEH_ACTION_CLEAR_FREEZE_ALL);
346
347
348
349
350
351
352
353
354
355
356
	} else {
		rc = opal_pci_eeh_freeze_clear(phb->opal_id,
					     pe_no,
					     OPAL_EEH_ACTION_CLEAR_FREEZE_ALL);
		if (rc) {
			pr_warn("%s: Failure %ld clearing frozen "
				"PHB#%x-PE#%x\n",
				__func__, rc, phb->hose->global_number,
				pe_no);
			ret = -EIO;
		}
357
358
	}

359
360
361
362
363
364
365
366
367
	/*
	 * For now, let's only display the diag buffer when we fail to clear
	 * the EEH status. We'll do more sensible things later when we have
	 * proper EEH support. We need to make sure we don't pollute ourselves
	 * with the normal errors generated when probing empty slots
	 */
	if (has_diag && ret)
		pnv_pci_dump_phb_diag_data(phb->hose, phb->diag.blob);

368
369
370
	spin_unlock_irqrestore(&phb->lock, flags);
}

371
372
static void pnv_pci_config_check_eeh(struct pnv_phb *phb,
				     struct device_node *dn)
373
374
{
	u8	fstate;
375
	__be16	pcierr;
376
377
	int	pe_no;
	s64	rc;
378

379
380
381
	/*
	 * Get the PE#. During the PCI probe stage, we might not
	 * setup that yet. So all ER errors should be mapped to
382
	 * reserved PE.
383
384
	 */
	pe_no = PCI_DN(dn)->pe_number;
385
386
387
388
389
390
	if (pe_no == IODA_INVALID_PE) {
		if (phb->type == PNV_PHB_P5IOC2)
			pe_no = 0;
		else
			pe_no = phb->ioda.reserved_pe;
	}
391

392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
	/*
	 * Fetch frozen state. If the PHB support compound PE,
	 * we need handle that case.
	 */
	if (phb->get_pe_state) {
		fstate = phb->get_pe_state(phb, pe_no);
	} else {
		rc = opal_pci_eeh_freeze_status(phb->opal_id,
						pe_no,
						&fstate,
						&pcierr,
						NULL);
		if (rc) {
			pr_warn("%s: Failure %lld getting PHB#%x-PE#%x state\n",
				__func__, rc, phb->hose->global_number, pe_no);
			return;
		}
409
	}
410

411
412
413
	cfg_dbg(" -> EEH check, bdfn=%04x PE#%d fstate=%x\n",
		(PCI_DN(dn)->busno << 8) | (PCI_DN(dn)->devfn),
		pe_no, fstate);
414
415
416
417
418
419
420
421
422
423
424
425

	/* Clear the frozen state if applicable */
	if (fstate == OPAL_EEH_STOPPED_MMIO_FREEZE ||
	    fstate == OPAL_EEH_STOPPED_DMA_FREEZE  ||
	    fstate == OPAL_EEH_STOPPED_MMIO_DMA_FREEZE) {
		/*
		 * If PHB supports compound PE, freeze it for
		 * consistency.
		 */
		if (phb->freeze_pe)
			phb->freeze_pe(phb, pe_no);

426
		pnv_pci_handle_eeh_config(phb, pe_no);
427
	}
428
429
}

430
431
int pnv_pci_cfg_read(struct device_node *dn,
		     int where, int size, u32 *val)
432
{
433
434
435
	struct pci_dn *pdn = PCI_DN(dn);
	struct pnv_phb *phb = pdn->phb->private_data;
	u32 bdfn = (pdn->busno << 8) | pdn->devfn;
436
437
438
439
440
441
442
443
444
445
	s64 rc;

	switch (size) {
	case 1: {
		u8 v8;
		rc = opal_pci_config_read_byte(phb->opal_id, bdfn, where, &v8);
		*val = (rc == OPAL_SUCCESS) ? v8 : 0xff;
		break;
	}
	case 2: {
446
		__be16 v16;
447
448
		rc = opal_pci_config_read_half_word(phb->opal_id, bdfn, where,
						   &v16);
449
		*val = (rc == OPAL_SUCCESS) ? be16_to_cpu(v16) : 0xffff;
450
451
452
		break;
	}
	case 4: {
453
		__be32 v32;
454
		rc = opal_pci_config_read_word(phb->opal_id, bdfn, where, &v32);
455
		*val = (rc == OPAL_SUCCESS) ? be32_to_cpu(v32) : 0xffffffff;
456
457
458
459
460
		break;
	}
	default:
		return PCIBIOS_FUNC_NOT_SUPPORTED;
	}
461

462
463
	cfg_dbg("%s: bus: %x devfn: %x +%x/%x -> %08x\n",
		__func__, pdn->busno, pdn->devfn, where, size, *val);
464
465
466
	return PCIBIOS_SUCCESSFUL;
}

467
468
int pnv_pci_cfg_write(struct device_node *dn,
		      int where, int size, u32 val)
469
{
470
471
472
	struct pci_dn *pdn = PCI_DN(dn);
	struct pnv_phb *phb = pdn->phb->private_data;
	u32 bdfn = (pdn->busno << 8) | pdn->devfn;
473

474
475
	cfg_dbg("%s: bus: %x devfn: %x +%x/%x -> %08x\n",
		pdn->busno, pdn->devfn, where, size, val);
476
477
478
479
480
481
482
483
484
485
486
487
488
	switch (size) {
	case 1:
		opal_pci_config_write_byte(phb->opal_id, bdfn, where, val);
		break;
	case 2:
		opal_pci_config_write_half_word(phb->opal_id, bdfn, where, val);
		break;
	case 4:
		opal_pci_config_write_word(phb->opal_id, bdfn, where, val);
		break;
	default:
		return PCIBIOS_FUNC_NOT_SUPPORTED;
	}
489

490
491
492
493
494
495
496
497
498
499
500
	return PCIBIOS_SUCCESSFUL;
}

#if CONFIG_EEH
static bool pnv_pci_cfg_check(struct pci_controller *hose,
			      struct device_node *dn)
{
	struct eeh_dev *edev = NULL;
	struct pnv_phb *phb = hose->private_data;

	/* EEH not enabled ? */
501
	if (!(phb->flags & PNV_PHB_FLAG_EEH))
502
		return true;
503

504
	/* PE reset or device removed ? */
505
	edev = of_node_to_eeh_dev(dn);
506
507
508
509
510
511
512
513
	if (edev) {
		if (edev->pe &&
		    (edev->pe->state & EEH_PE_RESET))
			return false;

		if (edev->mode & EEH_DEV_REMOVED)
			return false;
	}
514
515
516
517
518
519
520
521

	return true;
}
#else
static inline pnv_pci_cfg_check(struct pci_controller *hose,
				struct device_node *dn)
{
	return true;
522
}
523
#endif /* CONFIG_EEH */
524

525
526
527
528
529
530
static int pnv_pci_read_config(struct pci_bus *bus,
			       unsigned int devfn,
			       int where, int size, u32 *val)
{
	struct device_node *dn, *busdn = pci_bus_to_OF_node(bus);
	struct pci_dn *pdn;
531
532
533
	struct pnv_phb *phb;
	bool found = false;
	int ret;
534

535
	*val = 0xFFFFFFFF;
536
537
	for (dn = busdn->child; dn; dn = dn->sibling) {
		pdn = PCI_DN(dn);
538
539
540
541
542
		if (pdn && pdn->devfn == devfn) {
			phb = pdn->phb->private_data;
			found = true;
			break;
		}
543
544
	}

545
546
547
548
549
550
551
552
553
554
555
	if (!found || !pnv_pci_cfg_check(pdn->phb, dn))
		return PCIBIOS_DEVICE_NOT_FOUND;

	ret = pnv_pci_cfg_read(dn, where, size, val);
	if (phb->flags & PNV_PHB_FLAG_EEH) {
		if (*val == EEH_IO_ERROR_VALUE(size) &&
		    eeh_dev_check_failure(of_node_to_eeh_dev(dn)))
                        return PCIBIOS_DEVICE_NOT_FOUND;
	} else {
		pnv_pci_config_check_eeh(phb, dn);
	}
556

557
	return ret;
558
559
560
561
562
563
564
565
}

static int pnv_pci_write_config(struct pci_bus *bus,
				unsigned int devfn,
				int where, int size, u32 val)
{
	struct device_node *dn, *busdn = pci_bus_to_OF_node(bus);
	struct pci_dn *pdn;
566
567
568
	struct pnv_phb *phb;
	bool found = false;
	int ret;
569
570
571

	for (dn = busdn->child; dn; dn = dn->sibling) {
		pdn = PCI_DN(dn);
572
573
574
575
576
		if (pdn && pdn->devfn == devfn) {
			phb = pdn->phb->private_data;
			found = true;
			break;
		}
577
578
	}

579
580
581
582
583
584
585
586
	if (!found || !pnv_pci_cfg_check(pdn->phb, dn))
		return PCIBIOS_DEVICE_NOT_FOUND;

	ret = pnv_pci_cfg_write(dn, where, size, val);
	if (!(phb->flags & PNV_PHB_FLAG_EEH))
		pnv_pci_config_check_eeh(phb, dn);

	return ret;
587
588
}

589
struct pci_ops pnv_pci_ops = {
590
	.read  = pnv_pci_read_config,
591
592
593
594
595
	.write = pnv_pci_write_config,
};

static int pnv_tce_build(struct iommu_table *tbl, long index, long npages,
			 unsigned long uaddr, enum dma_data_direction direction,
596
			 struct dma_attrs *attrs, bool rm)
597
598
{
	u64 proto_tce;
599
	__be64 *tcep, *tces;
600
601
602
603
604
605
606
	u64 rpn;

	proto_tce = TCE_PCI_READ; // Read allowed

	if (direction != DMA_TO_DEVICE)
		proto_tce |= TCE_PCI_WRITE;

607
	tces = tcep = ((__be64 *)tbl->it_base) + index - tbl->it_offset;
608
	rpn = __pa(uaddr) >> tbl->it_page_shift;
609

610
	while (npages--)
611
612
		*(tcep++) = cpu_to_be64(proto_tce |
				(rpn++ << tbl->it_page_shift));
613
614
615
616
617
618

	/* Some implementations won't cache invalid TCEs and thus may not
	 * need that flush. We'll probably turn it_type into a bit mask
	 * of flags if that becomes the case
	 */
	if (tbl->it_type & TCE_PCI_SWINV_CREATE)
619
		pnv_pci_ioda_tce_invalidate(tbl, tces, tcep - 1, rm);
620
621
622
623

	return 0;
}

624
625
626
627
628
629
630
631
632
633
634
static int pnv_tce_build_vm(struct iommu_table *tbl, long index, long npages,
			    unsigned long uaddr,
			    enum dma_data_direction direction,
			    struct dma_attrs *attrs)
{
	return pnv_tce_build(tbl, index, npages, uaddr, direction, attrs,
			false);
}

static void pnv_tce_free(struct iommu_table *tbl, long index, long npages,
		bool rm)
635
{
636
	__be64 *tcep, *tces;
637

638
	tces = tcep = ((__be64 *)tbl->it_base) + index - tbl->it_offset;
639
640

	while (npages--)
641
		*(tcep++) = cpu_to_be64(0);
642

643
	if (tbl->it_type & TCE_PCI_SWINV_FREE)
644
645
646
647
648
649
		pnv_pci_ioda_tce_invalidate(tbl, tces, tcep - 1, rm);
}

static void pnv_tce_free_vm(struct iommu_table *tbl, long index, long npages)
{
	pnv_tce_free(tbl, index, npages, false);
650
651
}

652
653
654
655
656
static unsigned long pnv_tce_get(struct iommu_table *tbl, long index)
{
	return ((u64 *)tbl->it_base)[index - tbl->it_offset];
}

657
658
659
660
661
662
663
664
665
666
667
668
669
static int pnv_tce_build_rm(struct iommu_table *tbl, long index, long npages,
			    unsigned long uaddr,
			    enum dma_data_direction direction,
			    struct dma_attrs *attrs)
{
	return pnv_tce_build(tbl, index, npages, uaddr, direction, attrs, true);
}

static void pnv_tce_free_rm(struct iommu_table *tbl, long index, long npages)
{
	pnv_tce_free(tbl, index, npages, true);
}

670
671
void pnv_pci_setup_iommu_table(struct iommu_table *tbl,
			       void *tce_mem, u64 tce_size,
672
			       u64 dma_offset, unsigned page_shift)
673
674
675
{
	tbl->it_blocksize = 16;
	tbl->it_base = (unsigned long)tce_mem;
676
	tbl->it_page_shift = page_shift;
677
	tbl->it_offset = dma_offset >> tbl->it_page_shift;
678
679
680
681
682
683
	tbl->it_index = 0;
	tbl->it_size = tce_size >> 3;
	tbl->it_busno = 0;
	tbl->it_type = TCE_PCI;
}

684
static struct iommu_table *pnv_pci_setup_bml_iommu(struct pci_controller *hose)
685
686
{
	struct iommu_table *tbl;
687
688
	const __be64 *basep, *swinvp;
	const __be32 *sizep;
689
690
691
692

	basep = of_get_property(hose->dn, "linux,tce-base", NULL);
	sizep = of_get_property(hose->dn, "linux,tce-size", NULL);
	if (basep == NULL || sizep == NULL) {
693
694
		pr_err("PCI: %s has missing tce entries !\n",
		       hose->dn->full_name);
695
696
697
698
699
700
		return NULL;
	}
	tbl = kzalloc_node(sizeof(struct iommu_table), GFP_KERNEL, hose->node);
	if (WARN_ON(!tbl))
		return NULL;
	pnv_pci_setup_iommu_table(tbl, __va(be64_to_cpup(basep)),
701
				  be32_to_cpup(sizep), 0, IOMMU_PAGE_SHIFT_4K);
702
	iommu_init_table(tbl, hose->node);
703
	iommu_register_group(tbl, pci_domain_nr(hose->bus), 0);
704
705
706
707
708

	/* Deal with SW invalidated TCEs when needed (BML way) */
	swinvp = of_get_property(hose->dn, "linux,tce-sw-invalidate-info",
				 NULL);
	if (swinvp) {
709
		tbl->it_busno = be64_to_cpu(swinvp[1]);
710
		tbl->it_index = (unsigned long)ioremap(be64_to_cpup(swinvp), 8);
711
712
		tbl->it_type = TCE_PCI_SWINV_CREATE | TCE_PCI_SWINV_FREE;
	}
713
714
715
	return tbl;
}

716
717
static void pnv_pci_dma_fallback_setup(struct pci_controller *hose,
				       struct pci_dev *pdev)
718
719
720
721
722
723
724
725
726
727
728
{
	struct device_node *np = pci_bus_to_OF_node(hose->bus);
	struct pci_dn *pdn;

	if (np == NULL)
		return;
	pdn = PCI_DN(np);
	if (!pdn->iommu_table)
		pdn->iommu_table = pnv_pci_setup_bml_iommu(hose);
	if (!pdn->iommu_table)
		return;
729
	set_iommu_table_base_and_group(&pdev->dev, pdn->iommu_table);
730
731
}

732
static void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
733
734
735
736
737
738
739
740
741
742
743
744
745
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;

	/* If we have no phb structure, try to setup a fallback based on
	 * the device-tree (RTAS PCI for example)
	 */
	if (phb && phb->dma_dev_setup)
		phb->dma_dev_setup(phb, pdev);
	else
		pnv_pci_dma_fallback_setup(hose, pdev);
}

746
747
748
749
750
751
752
753
754
755
int pnv_pci_dma_set_mask(struct pci_dev *pdev, u64 dma_mask)
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;

	if (phb && phb->dma_set_mask)
		return phb->dma_set_mask(phb, pdev, dma_mask);
	return __dma_set_mask(&pdev->dev, dma_mask);
}

756
757
758
759
760
761
762
763
764
765
766
767
void pnv_pci_shutdown(void)
{
	struct pci_controller *hose;

	list_for_each_entry(hose, &hose_list, list_node) {
		struct pnv_phb *phb = hose->private_data;

		if (phb && phb->shutdown)
			phb->shutdown(phb);
	}
}

Gavin Shan's avatar
Gavin Shan committed
768
/* Fixup wrong class code in p7ioc and p8 root complex */
769
static void pnv_p7ioc_rc_quirk(struct pci_dev *dev)
770
771
772
773
774
{
	dev->class = PCI_CLASS_BRIDGE_PCI << 8;
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_IBM, 0x3b9, pnv_p7ioc_rc_quirk);

775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
static int pnv_pci_probe_mode(struct pci_bus *bus)
{
	struct pci_controller *hose = pci_bus_to_host(bus);
	const __be64 *tstamp;
	u64 now, target;


	/* We hijack this as a way to ensure we have waited long
	 * enough since the reset was lifted on the PCI bus
	 */
	if (bus != hose->bus)
		return PCI_PROBE_NORMAL;
	tstamp = of_get_property(hose->dn, "reset-clear-timestamp", NULL);
	if (!tstamp || !*tstamp)
		return PCI_PROBE_NORMAL;

	now = mftb() / tb_ticks_per_usec;
	target = (be64_to_cpup(tstamp) / tb_ticks_per_usec)
		+ PCI_RESET_DELAY_US;

	pr_devel("pci %04d: Reset target: 0x%llx now: 0x%llx\n",
		 hose->global_number, target, now);

	if (now < target)
		msleep((target - now + 999) / 1000);

	return PCI_PROBE_NORMAL;
}

804
805
806
807
void __init pnv_pci_init(void)
{
	struct device_node *np;

808
	pci_add_flags(PCI_CAN_SKIP_ISA_ALIGN);
809
810
811
812
813
814
815

	/* OPAL absent, try POPAL first then RTAS detection of PHBs */
	if (!firmware_has_feature(FW_FEATURE_OPAL)) {
#ifdef CONFIG_PPC_POWERNV_RTAS
		init_pci_config_tokens();
		find_and_init_phbs();
#endif /* CONFIG_PPC_POWERNV_RTAS */
816
817
818
819
820
821
822
823
824
825
826
827
828
	}
	/* OPAL is here, do our normal stuff */
	else {
		int found_ioda = 0;

		/* Look for IODA IO-Hubs. We don't support mixing IODA
		 * and p5ioc2 due to the need to change some global
		 * probing flags
		 */
		for_each_compatible_node(np, NULL, "ibm,ioda-hub") {
			pnv_pci_init_ioda_hub(np);
			found_ioda = 1;
		}
829
830

		/* Look for p5ioc2 IO-Hubs */
831
832
833
		if (!found_ioda)
			for_each_compatible_node(np, NULL, "ibm,p5ioc2")
				pnv_pci_init_p5ioc2_hub(np);
Gavin Shan's avatar
Gavin Shan committed
834
835
836
837

		/* Look for ioda2 built-in PHB3's */
		for_each_compatible_node(np, NULL, "ibm,ioda2-phb")
			pnv_pci_init_ioda2_phb(np);
838
839
840
841
842
843
844
	}

	/* Setup the linkage between OF nodes and PHBs */
	pci_devs_phb_init();

	/* Configure IOMMU DMA hooks */
	ppc_md.pci_dma_dev_setup = pnv_pci_dma_dev_setup;
845
846
847
848
	ppc_md.tce_build = pnv_tce_build_vm;
	ppc_md.tce_free = pnv_tce_free_vm;
	ppc_md.tce_build_rm = pnv_tce_build_rm;
	ppc_md.tce_free_rm = pnv_tce_free_rm;
849
	ppc_md.tce_get = pnv_tce_get;
850
	ppc_md.pci_probe_mode = pnv_pci_probe_mode;
851
852
	set_pci_dma_ops(&dma_iommu_ops);

853
854
855
856
857
	/* Configure MSIs */
#ifdef CONFIG_PCI_MSI
	ppc_md.setup_msi_irqs = pnv_setup_msi_irqs;
	ppc_md.teardown_msi_irqs = pnv_teardown_msi_irqs;
#endif
858
}
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885

static int tce_iommu_bus_notifier(struct notifier_block *nb,
		unsigned long action, void *data)
{
	struct device *dev = data;

	switch (action) {
	case BUS_NOTIFY_ADD_DEVICE:
		return iommu_add_device(dev);
	case BUS_NOTIFY_DEL_DEVICE:
		if (dev->iommu_group)
			iommu_del_device(dev);
		return 0;
	default:
		return 0;
	}
}

static struct notifier_block tce_iommu_bus_nb = {
	.notifier_call = tce_iommu_bus_notifier,
};

static int __init tce_iommu_bus_notifier_init(void)
{
	bus_register_notifier(&pci_bus_type, &tce_iommu_bus_nb);
	return 0;
}
886
machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init);