pci.c 22.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Support PCI/PCIe on PowerNV platforms
 *
 * 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/irq.h>
#include <linux/io.h>
19
#include <linux/msi.h>
20
#include <linux/iommu.h>
21 22 23 24 25 26

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

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

39 40
/* Delay in usec */
#define PCI_RESET_DELAY_US	3000000
41 42 43 44

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

45
#ifdef CONFIG_PCI_MSI
46
int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
47 48 49 50 51
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
	struct msi_desc *entry;
	struct msi_msg msg;
52 53
	int hwirq;
	unsigned int virq;
54 55
	int rc;

56 57 58
	if (WARN_ON(!phb) || !phb->msi_bmp.bitmap)
		return -ENODEV;

59
	if (pdev->no_64bit_msi && !phb->msi32_support)
60 61
		return -ENODEV;

62
	for_each_pci_msi_entry(entry, pdev) {
63 64 65 66 67
		if (!entry->msi_attrib.is_64 && !phb->msi32_support) {
			pr_warn("%s: Supports only 64-bit MSIs\n",
				pci_name(pdev));
			return -ENXIO;
		}
68 69
		hwirq = msi_bitmap_alloc_hwirqs(&phb->msi_bmp, 1);
		if (hwirq < 0) {
70 71 72 73
			pr_warn("%s: Failed to find a free MSI\n",
				pci_name(pdev));
			return -ENOSPC;
		}
74
		virq = irq_create_mapping(NULL, phb->msi_base + hwirq);
75 76 77
		if (virq == NO_IRQ) {
			pr_warn("%s: Failed to map MSI to linux irq\n",
				pci_name(pdev));
78
			msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, 1);
79 80
			return -ENOMEM;
		}
81
		rc = phb->msi_setup(phb, pdev, phb->msi_base + hwirq,
82
				    virq, entry->msi_attrib.is_64, &msg);
83 84 85
		if (rc) {
			pr_warn("%s: Failed to setup MSI\n", pci_name(pdev));
			irq_dispose_mapping(virq);
86
			msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq, 1);
87 88 89
			return rc;
		}
		irq_set_msi_desc(virq, entry);
90
		pci_write_msi_msg(virq, &msg);
91 92 93 94
	}
	return 0;
}

95
void pnv_teardown_msi_irqs(struct pci_dev *pdev)
96 97 98 99
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
	struct msi_desc *entry;
100
	irq_hw_number_t hwirq;
101 102 103 104

	if (WARN_ON(!phb))
		return;

105
	for_each_pci_msi_entry(entry, pdev) {
106 107
		if (entry->irq == NO_IRQ)
			continue;
108
		hwirq = virq_to_hw(entry->irq);
109 110
		irq_set_msi_desc(entry->irq, NULL);
		irq_dispose_mapping(entry->irq);
111
		msi_bitmap_free_hwirqs(&phb->msi_bmp, hwirq - phb->msi_base, 1);
112 113 114
	}
}
#endif /* CONFIG_PCI_MSI */
115

116 117
static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose,
					 struct OpalIoPhbErrorCommon *common)
118
{
119
	struct OpalIoP7IOCPhbErrorData *data;
120 121
	int i;

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

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

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

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

208 209
static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose,
					struct OpalIoPhbErrorCommon *common)
210
{
211 212 213 214
	struct OpalIoPhb3ErrorData *data;
	int i;

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

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

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

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;
313
	switch (be32_to_cpu(common->ioType)) {
314 315 316 317 318
	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);
319 320
		break;
	default:
321
		pr_warn("%s: Unrecognized ioType %d\n",
322
			__func__, be32_to_cpu(common->ioType));
323 324 325 326 327 328
	}
}

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

	spin_lock_irqsave(&phb->lock, flags);

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

338 339 340 341
	/* If PHB supports compound PE, to handle it */
	if (phb->unfreeze_pe) {
		ret = phb->unfreeze_pe(phb,
				       pe_no,
342
				       OPAL_EEH_ACTION_CLEAR_FREEZE_ALL);
343 344 345 346 347 348 349 350 351 352 353
	} 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;
		}
354 355
	}

356 357 358 359 360 361 362 363 364
	/*
	 * 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);

365 366 367
	spin_unlock_irqrestore(&phb->lock, flags);
}

368
static void pnv_pci_config_check_eeh(struct pci_dn *pdn)
369
{
370
	struct pnv_phb *phb = pdn->phb->private_data;
371
	u8	fstate;
372
	__be16	pcierr;
373 374
	int	pe_no;
	s64	rc;
375

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

389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
	/*
	 * 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;
		}
406
	}
407

408
	cfg_dbg(" -> EEH check, bdfn=%04x PE#%d fstate=%x\n",
409
		(pdn->busno << 8) | (pdn->devfn), pe_no, fstate);
410 411 412 413 414 415 416 417 418 419 420 421

	/* 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);

422
		pnv_pci_handle_eeh_config(phb, pe_no);
423
	}
424 425
}

426
int pnv_pci_cfg_read(struct pci_dn *pdn,
427
		     int where, int size, u32 *val)
428
{
429 430
	struct pnv_phb *phb = pdn->phb->private_data;
	u32 bdfn = (pdn->busno << 8) | pdn->devfn;
431 432 433 434 435 436 437 438 439 440
	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: {
441
		__be16 v16;
442 443
		rc = opal_pci_config_read_half_word(phb->opal_id, bdfn, where,
						   &v16);
444
		*val = (rc == OPAL_SUCCESS) ? be16_to_cpu(v16) : 0xffff;
445 446 447
		break;
	}
	case 4: {
448
		__be32 v32;
449
		rc = opal_pci_config_read_word(phb->opal_id, bdfn, where, &v32);
450
		*val = (rc == OPAL_SUCCESS) ? be32_to_cpu(v32) : 0xffffffff;
451 452 453 454 455
		break;
	}
	default:
		return PCIBIOS_FUNC_NOT_SUPPORTED;
	}
456

457 458
	cfg_dbg("%s: bus: %x devfn: %x +%x/%x -> %08x\n",
		__func__, pdn->busno, pdn->devfn, where, size, *val);
459 460 461
	return PCIBIOS_SUCCESSFUL;
}

462
int pnv_pci_cfg_write(struct pci_dn *pdn,
463
		      int where, int size, u32 val)
464
{
465 466
	struct pnv_phb *phb = pdn->phb->private_data;
	u32 bdfn = (pdn->busno << 8) | pdn->devfn;
467

468 469
	cfg_dbg("%s: bus: %x devfn: %x +%x/%x -> %08x\n",
		pdn->busno, pdn->devfn, where, size, val);
470 471 472 473 474 475 476 477 478 479 480 481 482
	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;
	}
483

484 485 486 487
	return PCIBIOS_SUCCESSFUL;
}

#if CONFIG_EEH
488
static bool pnv_pci_cfg_check(struct pci_dn *pdn)
489 490
{
	struct eeh_dev *edev = NULL;
491
	struct pnv_phb *phb = pdn->phb->private_data;
492 493

	/* EEH not enabled ? */
494
	if (!(phb->flags & PNV_PHB_FLAG_EEH))
495
		return true;
496

497
	/* PE reset or device removed ? */
498
	edev = pdn->edev;
499 500
	if (edev) {
		if (edev->pe &&
501
		    (edev->pe->state & EEH_PE_CFG_BLOCKED))
502 503 504 505 506
			return false;

		if (edev->mode & EEH_DEV_REMOVED)
			return false;
	}
507 508 509 510

	return true;
}
#else
511
static inline pnv_pci_cfg_check(struct pci_dn *pdn)
512 513
{
	return true;
514
}
515
#endif /* CONFIG_EEH */
516

517 518 519 520 521
static int pnv_pci_read_config(struct pci_bus *bus,
			       unsigned int devfn,
			       int where, int size, u32 *val)
{
	struct pci_dn *pdn;
522 523
	struct pnv_phb *phb;
	int ret;
524

525
	*val = 0xFFFFFFFF;
526 527 528
	pdn = pci_get_pdn_by_devfn(bus, devfn);
	if (!pdn)
		return PCIBIOS_DEVICE_NOT_FOUND;
529

530
	if (!pnv_pci_cfg_check(pdn))
531 532
		return PCIBIOS_DEVICE_NOT_FOUND;

533 534 535
	ret = pnv_pci_cfg_read(pdn, where, size, val);
	phb = pdn->phb->private_data;
	if (phb->flags & PNV_PHB_FLAG_EEH && pdn->edev) {
536
		if (*val == EEH_IO_ERROR_VALUE(size) &&
537
		    eeh_dev_check_failure(pdn->edev))
538 539
                        return PCIBIOS_DEVICE_NOT_FOUND;
	} else {
540
		pnv_pci_config_check_eeh(pdn);
541
	}
542

543
	return ret;
544 545 546 547 548 549 550
}

static int pnv_pci_write_config(struct pci_bus *bus,
				unsigned int devfn,
				int where, int size, u32 val)
{
	struct pci_dn *pdn;
551 552
	struct pnv_phb *phb;
	int ret;
553

554 555 556
	pdn = pci_get_pdn_by_devfn(bus, devfn);
	if (!pdn)
		return PCIBIOS_DEVICE_NOT_FOUND;
557

558
	if (!pnv_pci_cfg_check(pdn))
559 560
		return PCIBIOS_DEVICE_NOT_FOUND;

561 562
	ret = pnv_pci_cfg_write(pdn, where, size, val);
	phb = pdn->phb->private_data;
563
	if (!(phb->flags & PNV_PHB_FLAG_EEH))
564
		pnv_pci_config_check_eeh(pdn);
565 566

	return ret;
567 568
}

569
struct pci_ops pnv_pci_ops = {
570
	.read  = pnv_pci_read_config,
571 572 573
	.write = pnv_pci_write_config,
};

574 575 576
static __be64 *pnv_tce(struct iommu_table *tbl, long idx)
{
	__be64 *tmp = ((__be64 *)tbl->it_base);
577 578 579 580 581 582 583 584 585 586 587 588 589
	int  level = tbl->it_indirect_levels;
	const long shift = ilog2(tbl->it_level_size);
	unsigned long mask = (tbl->it_level_size - 1) << (level * shift);

	while (level) {
		int n = (idx & mask) >> (level * shift);
		unsigned long tce = be64_to_cpu(tmp[n]);

		tmp = __va(tce & ~(TCE_PCI_READ | TCE_PCI_WRITE));
		idx &= ~mask;
		mask >>= shift;
		--level;
	}
590 591 592 593

	return tmp + idx;
}

594 595 596
int pnv_tce_build(struct iommu_table *tbl, long index, long npages,
		unsigned long uaddr, enum dma_data_direction direction,
		struct dma_attrs *attrs)
597
{
598
	u64 proto_tce = iommu_direction_to_tce_perm(direction);
599 600
	u64 rpn = __pa(uaddr) >> tbl->it_page_shift;
	long i;
601

602 603 604
	if (proto_tce & TCE_PCI_WRITE)
		proto_tce |= TCE_PCI_READ;

605 606 607 608
	for (i = 0; i < npages; i++) {
		unsigned long newtce = proto_tce |
			((rpn + i) << tbl->it_page_shift);
		unsigned long idx = index - tbl->it_offset + i;
609

610 611
		*(pnv_tce(tbl, idx)) = cpu_to_be64(newtce);
	}
612 613 614 615

	return 0;
}

616 617 618 619 620 621 622 623 624 625
#ifdef CONFIG_IOMMU_API
int pnv_tce_xchg(struct iommu_table *tbl, long index,
		unsigned long *hpa, enum dma_data_direction *direction)
{
	u64 proto_tce = iommu_direction_to_tce_perm(*direction);
	unsigned long newtce = *hpa | proto_tce, oldtce;
	unsigned long idx = index - tbl->it_offset;

	BUG_ON(*hpa & ~IOMMU_PAGE_MASK(tbl));

626 627 628
	if (newtce & TCE_PCI_WRITE)
		newtce |= TCE_PCI_READ;

629 630 631 632 633 634 635 636
	oldtce = xchg(pnv_tce(tbl, idx), cpu_to_be64(newtce));
	*hpa = be64_to_cpu(oldtce) & ~(TCE_PCI_READ | TCE_PCI_WRITE);
	*direction = iommu_tce_direction(oldtce);

	return 0;
}
#endif

637
void pnv_tce_free(struct iommu_table *tbl, long index, long npages)
638
{
639
	long i;
640

641 642
	for (i = 0; i < npages; i++) {
		unsigned long idx = index - tbl->it_offset + i;
643

644 645
		*(pnv_tce(tbl, idx)) = cpu_to_be64(0);
	}
646 647
}

648
unsigned long pnv_tce_get(struct iommu_table *tbl, long index)
649
{
650
	return *(pnv_tce(tbl, index - tbl->it_offset));
651 652
}

653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727
struct iommu_table *pnv_pci_table_alloc(int nid)
{
	struct iommu_table *tbl;

	tbl = kzalloc_node(sizeof(struct iommu_table), GFP_KERNEL, nid);
	INIT_LIST_HEAD_RCU(&tbl->it_group_list);

	return tbl;
}

long pnv_pci_link_table_and_group(int node, int num,
		struct iommu_table *tbl,
		struct iommu_table_group *table_group)
{
	struct iommu_table_group_link *tgl = NULL;

	if (WARN_ON(!tbl || !table_group))
		return -EINVAL;

	tgl = kzalloc_node(sizeof(struct iommu_table_group_link), GFP_KERNEL,
			node);
	if (!tgl)
		return -ENOMEM;

	tgl->table_group = table_group;
	list_add_rcu(&tgl->next, &tbl->it_group_list);

	table_group->tables[num] = tbl;

	return 0;
}

static void pnv_iommu_table_group_link_free(struct rcu_head *head)
{
	struct iommu_table_group_link *tgl = container_of(head,
			struct iommu_table_group_link, rcu);

	kfree(tgl);
}

void pnv_pci_unlink_table_and_group(struct iommu_table *tbl,
		struct iommu_table_group *table_group)
{
	long i;
	bool found;
	struct iommu_table_group_link *tgl;

	if (!tbl || !table_group)
		return;

	/* Remove link to a group from table's list of attached groups */
	found = false;
	list_for_each_entry_rcu(tgl, &tbl->it_group_list, next) {
		if (tgl->table_group == table_group) {
			list_del_rcu(&tgl->next);
			call_rcu(&tgl->rcu, pnv_iommu_table_group_link_free);
			found = true;
			break;
		}
	}
	if (WARN_ON(!found))
		return;

	/* Clean a pointer to iommu_table in iommu_table_group::tables[] */
	found = false;
	for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
		if (table_group->tables[i] == tbl) {
			table_group->tables[i] = NULL;
			found = true;
			break;
		}
	}
	WARN_ON(!found);
}

728 729
void pnv_pci_setup_iommu_table(struct iommu_table *tbl,
			       void *tce_mem, u64 tce_size,
730
			       u64 dma_offset, unsigned page_shift)
731 732 733
{
	tbl->it_blocksize = 16;
	tbl->it_base = (unsigned long)tce_mem;
734
	tbl->it_page_shift = page_shift;
735
	tbl->it_offset = dma_offset >> tbl->it_page_shift;
736 737 738 739 740 741
	tbl->it_index = 0;
	tbl->it_size = tce_size >> 3;
	tbl->it_busno = 0;
	tbl->it_type = TCE_PCI;
}

742
void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
743 744 745
{
	struct pci_controller *hose = pci_bus_to_host(pdev->bus);
	struct pnv_phb *phb = hose->private_data;
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
#ifdef CONFIG_PCI_IOV
	struct pnv_ioda_pe *pe;
	struct pci_dn *pdn;

	/* Fix the VF pdn PE number */
	if (pdev->is_virtfn) {
		pdn = pci_get_pdn(pdev);
		WARN_ON(pdn->pe_number != IODA_INVALID_PE);
		list_for_each_entry(pe, &phb->ioda.pe_list, list) {
			if (pe->rid == ((pdev->bus->number << 8) |
			    (pdev->devfn & 0xff))) {
				pdn->pe_number = pe->pe_number;
				pe->pdev = pdev;
				break;
			}
		}
	}
#endif /* CONFIG_PCI_IOV */
764 765 766 767 768

	if (phb && phb->dma_dev_setup)
		phb->dma_dev_setup(phb, pdev);
}

769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
void pnv_pci_dma_bus_setup(struct pci_bus *bus)
{
	struct pci_controller *hose = bus->sysdata;
	struct pnv_phb *phb = hose->private_data;
	struct pnv_ioda_pe *pe;

	list_for_each_entry(pe, &phb->ioda.pe_list, list) {
		if (!(pe->flags & (PNV_IODA_PE_BUS | PNV_IODA_PE_BUS_ALL)))
			continue;

		if (!pe->pbus)
			continue;

		if (bus->number == ((pe->rid >> 8) & 0xFF)) {
			pe->pbus = bus;
			break;
		}
	}
}

789 790 791 792
void pnv_pci_shutdown(void)
{
	struct pci_controller *hose;

793 794 795
	list_for_each_entry(hose, &hose_list, list_node)
		if (hose->controller_ops.shutdown)
			hose->controller_ops.shutdown(hose);
796 797
}

G
Gavin Shan 已提交
798
/* Fixup wrong class code in p7ioc and p8 root complex */
799
static void pnv_p7ioc_rc_quirk(struct pci_dev *dev)
800 801 802 803 804
{
	dev->class = PCI_CLASS_BRIDGE_PCI << 8;
}
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_IBM, 0x3b9, pnv_p7ioc_rc_quirk);

805 806 807
void __init pnv_pci_init(void)
{
	struct device_node *np;
808
	bool found_ioda = false;
809

810
	pci_add_flags(PCI_CAN_SKIP_ISA_ALIGN);
811

812 813 814
	/* If we don't have OPAL, eg. in sim, just skip PCI probe */
	if (!firmware_has_feature(FW_FEATURE_OPAL))
		return;
815

816 817 818 819 820 821 822 823
	/* 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 = true;
	}
824

825 826 827 828
	/* Look for p5ioc2 IO-Hubs */
	if (!found_ioda)
		for_each_compatible_node(np, NULL, "ibm,p5ioc2")
			pnv_pci_init_p5ioc2_hub(np);
G
Gavin Shan 已提交
829

830 831 832
	/* Look for ioda2 built-in PHB3's */
	for_each_compatible_node(np, NULL, "ibm,ioda2-phb")
		pnv_pci_init_ioda2_phb(np);
833

834 835 836 837
	/* Look for NPU PHBs */
	for_each_compatible_node(np, NULL, "ibm,ioda2-npu-phb")
		pnv_pci_init_npu_phb(np);

838 839 840 841 842 843
	/* Setup the linkage between OF nodes and PHBs */
	pci_devs_phb_init();

	/* Configure IOMMU DMA hooks */
	set_pci_dma_ops(&dma_iommu_ops);
}
844

845
machine_subsys_initcall_sync(powernv, tce_iommu_bus_notifier_init);