Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: mvebu: Add PCI Express root complex capability block

Add a PCI Express root complex capability block so the PCI layer identifies
the bridge as a PCI Express device.

We expose this as a version 1 PCIe capability block, with slot support. We
disable the clock power management capability as this depends on boards
wiring the CLKREQ# signal.

Tested-by: Willy Tarreau <w@1wt.eu> (Iomega iConnect Kirkwood, MiraBox Armada 370)
Tested-by: Andrew Lunn <andrew@lunn.ch> (D-Link DIR664 Kirkwood)
Tested-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> (Armada XP GP)
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>

authored by

Russell King and committed by
Bjorn Helgaas
dc0352ab d609a8d8

+133 -4
+133 -4
drivers/pci/host/pci-mvebu.c
··· 30 30 #define PCIE_DEV_REV_OFF 0x0008 31 31 #define PCIE_BAR_LO_OFF(n) (0x0010 + ((n) << 3)) 32 32 #define PCIE_BAR_HI_OFF(n) (0x0014 + ((n) << 3)) 33 + #define PCIE_CAP_PCIEXP 0x0060 33 34 #define PCIE_HEADER_LOG_4_OFF 0x0128 34 35 #define PCIE_BAR_CTRL_OFF(n) (0x1804 + (((n) - 1) * 4)) 35 36 #define PCIE_WIN04_CTRL_OFF(n) (0x1820 + ((n) << 4)) ··· 58 57 #define PCIE_STAT_BUS 0xff00 59 58 #define PCIE_STAT_DEV 0x1f0000 60 59 #define PCIE_STAT_LINK_DOWN BIT(0) 60 + #define PCIE_RC_RTSTA 0x1a14 61 61 #define PCIE_DEBUG_CTRL 0x1a60 62 62 #define PCIE_DEBUG_SOFT_RESET BIT(20) 63 + 64 + enum { 65 + PCISWCAP = PCI_BRIDGE_CONTROL + 2, 66 + PCISWCAP_EXP_LIST_ID = PCISWCAP + PCI_CAP_LIST_ID, 67 + PCISWCAP_EXP_DEVCAP = PCISWCAP + PCI_EXP_DEVCAP, 68 + PCISWCAP_EXP_DEVCTL = PCISWCAP + PCI_EXP_DEVCTL, 69 + PCISWCAP_EXP_LNKCAP = PCISWCAP + PCI_EXP_LNKCAP, 70 + PCISWCAP_EXP_LNKCTL = PCISWCAP + PCI_EXP_LNKCTL, 71 + PCISWCAP_EXP_SLTCAP = PCISWCAP + PCI_EXP_SLTCAP, 72 + PCISWCAP_EXP_SLTCTL = PCISWCAP + PCI_EXP_SLTCTL, 73 + PCISWCAP_EXP_RTCTL = PCISWCAP + PCI_EXP_RTCTL, 74 + PCISWCAP_EXP_RTSTA = PCISWCAP + PCI_EXP_RTSTA, 75 + PCISWCAP_EXP_DEVCAP2 = PCISWCAP + PCI_EXP_DEVCAP2, 76 + PCISWCAP_EXP_DEVCTL2 = PCISWCAP + PCI_EXP_DEVCTL2, 77 + PCISWCAP_EXP_LNKCAP2 = PCISWCAP + PCI_EXP_LNKCAP2, 78 + PCISWCAP_EXP_LNKCTL2 = PCISWCAP + PCI_EXP_LNKCTL2, 79 + PCISWCAP_EXP_SLTCAP2 = PCISWCAP + PCI_EXP_SLTCAP2, 80 + PCISWCAP_EXP_SLTCTL2 = PCISWCAP + PCI_EXP_SLTCTL2, 81 + }; 63 82 64 83 /* PCI configuration space of a PCI-to-PCI bridge */ 65 84 struct mvebu_sw_pci_bridge { 66 85 u16 vendor; 67 86 u16 device; 68 87 u16 command; 88 + u16 status; 69 89 u16 class; 70 90 u8 interface; 71 91 u8 revision; ··· 106 84 u16 memlimit; 107 85 u16 iobaseupper; 108 86 u16 iolimitupper; 109 - u8 cappointer; 110 - u8 reserved1; 111 - u16 reserved2; 112 87 u32 romaddr; 113 88 u8 intline; 114 89 u8 intpin; 115 90 u16 bridgectrl; 91 + 92 + /* PCI express capability */ 93 + u32 pcie_sltcap; 94 + u16 pcie_devctl; 95 + u16 pcie_rtctl; 116 96 }; 117 97 118 98 struct mvebu_pcie_port; ··· 475 451 /* We support 32 bits I/O addressing */ 476 452 bridge->iobase = PCI_IO_RANGE_TYPE_32; 477 453 bridge->iolimit = PCI_IO_RANGE_TYPE_32; 454 + 455 + /* Add capabilities */ 456 + bridge->status = PCI_STATUS_CAP_LIST; 478 457 } 479 458 480 459 /* ··· 495 468 break; 496 469 497 470 case PCI_COMMAND: 498 - *value = bridge->command; 471 + *value = bridge->command | bridge->status << 16; 499 472 break; 500 473 501 474 case PCI_CLASS_REVISION: ··· 540 513 *value = (bridge->iolimitupper << 16 | bridge->iobaseupper); 541 514 break; 542 515 516 + case PCI_CAPABILITY_LIST: 517 + *value = PCISWCAP; 518 + break; 519 + 543 520 case PCI_ROM_ADDRESS1: 544 521 *value = 0; 545 522 break; ··· 553 522 *value = 0; 554 523 break; 555 524 525 + case PCISWCAP_EXP_LIST_ID: 526 + /* Set PCIe v2, root port, slot support */ 527 + *value = (PCI_EXP_TYPE_ROOT_PORT << 4 | 2 | 528 + PCI_EXP_FLAGS_SLOT) << 16 | PCI_CAP_ID_EXP; 529 + break; 530 + 531 + case PCISWCAP_EXP_DEVCAP: 532 + *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_DEVCAP); 533 + break; 534 + 535 + case PCISWCAP_EXP_DEVCTL: 536 + *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_DEVCTL) & 537 + ~(PCI_EXP_DEVCTL_URRE | PCI_EXP_DEVCTL_FERE | 538 + PCI_EXP_DEVCTL_NFERE | PCI_EXP_DEVCTL_CERE); 539 + *value |= bridge->pcie_devctl; 540 + break; 541 + 542 + case PCISWCAP_EXP_LNKCAP: 543 + /* 544 + * PCIe requires the clock power management capability to be 545 + * hard-wired to zero for downstream ports 546 + */ 547 + *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCAP) & 548 + ~PCI_EXP_LNKCAP_CLKPM; 549 + break; 550 + 551 + case PCISWCAP_EXP_LNKCTL: 552 + *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); 553 + break; 554 + 555 + case PCISWCAP_EXP_SLTCAP: 556 + *value = bridge->pcie_sltcap; 557 + break; 558 + 559 + case PCISWCAP_EXP_SLTCTL: 560 + *value = PCI_EXP_SLTSTA_PDS << 16; 561 + break; 562 + 563 + case PCISWCAP_EXP_RTCTL: 564 + *value = bridge->pcie_rtctl; 565 + break; 566 + 567 + case PCISWCAP_EXP_RTSTA: 568 + *value = mvebu_readl(port, PCIE_RC_RTSTA); 569 + break; 570 + 571 + /* PCIe requires the v2 fields to be hard-wired to zero */ 572 + case PCISWCAP_EXP_DEVCAP2: 573 + case PCISWCAP_EXP_DEVCTL2: 574 + case PCISWCAP_EXP_LNKCAP2: 575 + case PCISWCAP_EXP_LNKCTL2: 576 + case PCISWCAP_EXP_SLTCAP2: 577 + case PCISWCAP_EXP_SLTCTL2: 556 578 default: 557 579 /* 558 580 * PCI defines configuration read accesses to reserved or ··· 696 612 bridge->subordinate_bus = (value >> 16) & 0xff; 697 613 bridge->secondary_latency_timer = (value >> 24) & 0xff; 698 614 mvebu_pcie_set_local_bus_nr(port, bridge->secondary_bus); 615 + break; 616 + 617 + case PCISWCAP_EXP_DEVCTL: 618 + /* 619 + * Armada370 data says these bits must always 620 + * be zero when in root complex mode. 621 + */ 622 + value &= ~(PCI_EXP_DEVCTL_URRE | PCI_EXP_DEVCTL_FERE | 623 + PCI_EXP_DEVCTL_NFERE | PCI_EXP_DEVCTL_CERE); 624 + 625 + /* 626 + * If the mask is 0xffff0000, then we only want to write 627 + * the device control register, rather than clearing the 628 + * RW1C bits in the device status register. Mask out the 629 + * status register bits. 630 + */ 631 + if (mask == 0xffff0000) 632 + value &= 0xffff; 633 + 634 + mvebu_writel(port, value, PCIE_CAP_PCIEXP + PCI_EXP_DEVCTL); 635 + break; 636 + 637 + case PCISWCAP_EXP_LNKCTL: 638 + /* 639 + * If we don't support CLKREQ, we must ensure that the 640 + * CLKREQ enable bit always reads zero. Since we haven't 641 + * had this capability, and it's dependent on board wiring, 642 + * disable it for the time being. 643 + */ 644 + value &= ~PCI_EXP_LNKCTL_CLKREQ_EN; 645 + 646 + /* 647 + * If the mask is 0xffff0000, then we only want to write 648 + * the link control register, rather than clearing the 649 + * RW1C bits in the link status register. Mask out the 650 + * status register bits. 651 + */ 652 + if (mask == 0xffff0000) 653 + value &= 0xffff; 654 + 655 + mvebu_writel(port, value, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); 656 + break; 657 + 658 + case PCISWCAP_EXP_RTSTA: 659 + mvebu_writel(port, value, PCIE_RC_RTSTA); 699 660 break; 700 661 701 662 default: