|
27 | 27 | /* PCIe core registers */ |
28 | 28 | #define PCIE_CORE_DEV_ID_REG 0x0 |
29 | 29 | #define PCIE_CORE_CMD_STATUS_REG 0x4 |
30 | | -#define PCIE_CORE_CMD_IO_ACCESS_EN BIT(0) |
31 | | -#define PCIE_CORE_CMD_MEM_ACCESS_EN BIT(1) |
32 | | -#define PCIE_CORE_CMD_MEM_IO_REQ_EN BIT(2) |
33 | 30 | #define PCIE_CORE_DEV_REV_REG 0x8 |
34 | 31 | #define PCIE_CORE_PCIEXP_CAP 0xc0 |
35 | 32 | #define PCIE_CORE_ERR_CAPCTL_REG 0x118 |
@@ -505,6 +502,11 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) |
505 | 502 | reg = (PCI_VENDOR_ID_MARVELL << 16) | PCI_VENDOR_ID_MARVELL; |
506 | 503 | advk_writel(pcie, reg, VENDOR_ID_REG); |
507 | 504 |
|
| 505 | + /* Disable Root Bridge I/O space, memory space and bus mastering */ |
| 506 | + reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG); |
| 507 | + reg &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); |
| 508 | + advk_writel(pcie, reg, PCIE_CORE_CMD_STATUS_REG); |
| 509 | + |
508 | 510 | /* Set Advanced Error Capabilities and Control PF0 register */ |
509 | 511 | reg = PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX | |
510 | 512 | PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX_EN | |
@@ -603,12 +605,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) |
603 | 605 | advk_pcie_disable_ob_win(pcie, i); |
604 | 606 |
|
605 | 607 | advk_pcie_train_link(pcie); |
606 | | - |
607 | | - reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG); |
608 | | - reg |= PCIE_CORE_CMD_MEM_ACCESS_EN | |
609 | | - PCIE_CORE_CMD_IO_ACCESS_EN | |
610 | | - PCIE_CORE_CMD_MEM_IO_REQ_EN; |
611 | | - advk_writel(pcie, reg, PCIE_CORE_CMD_STATUS_REG); |
612 | 608 | } |
613 | 609 |
|
614 | 610 | static int advk_pcie_check_pio_status(struct advk_pcie *pcie, bool allow_crs, u32 *val) |
@@ -737,6 +733,37 @@ static int advk_pcie_wait_pio(struct advk_pcie *pcie) |
737 | 733 | return -ETIMEDOUT; |
738 | 734 | } |
739 | 735 |
|
| 736 | +static pci_bridge_emul_read_status_t |
| 737 | +advk_pci_bridge_emul_base_conf_read(struct pci_bridge_emul *bridge, |
| 738 | + int reg, u32 *value) |
| 739 | +{ |
| 740 | + struct advk_pcie *pcie = bridge->data; |
| 741 | + |
| 742 | + switch (reg) { |
| 743 | + case PCI_COMMAND: |
| 744 | + *value = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG); |
| 745 | + return PCI_BRIDGE_EMUL_HANDLED; |
| 746 | + |
| 747 | + default: |
| 748 | + return PCI_BRIDGE_EMUL_NOT_HANDLED; |
| 749 | + } |
| 750 | +} |
| 751 | + |
| 752 | +static void |
| 753 | +advk_pci_bridge_emul_base_conf_write(struct pci_bridge_emul *bridge, |
| 754 | + int reg, u32 old, u32 new, u32 mask) |
| 755 | +{ |
| 756 | + struct advk_pcie *pcie = bridge->data; |
| 757 | + |
| 758 | + switch (reg) { |
| 759 | + case PCI_COMMAND: |
| 760 | + advk_writel(pcie, new, PCIE_CORE_CMD_STATUS_REG); |
| 761 | + break; |
| 762 | + |
| 763 | + default: |
| 764 | + break; |
| 765 | + } |
| 766 | +} |
740 | 767 |
|
741 | 768 | static pci_bridge_emul_read_status_t |
742 | 769 | advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, |
@@ -838,6 +865,8 @@ advk_pci_bridge_emul_pcie_conf_write(struct pci_bridge_emul *bridge, |
838 | 865 | } |
839 | 866 |
|
840 | 867 | static struct pci_bridge_emul_ops advk_pci_bridge_emul_ops = { |
| 868 | + .read_base = advk_pci_bridge_emul_base_conf_read, |
| 869 | + .write_base = advk_pci_bridge_emul_base_conf_write, |
841 | 870 | .read_pcie = advk_pci_bridge_emul_pcie_conf_read, |
842 | 871 | .write_pcie = advk_pci_bridge_emul_pcie_conf_write, |
843 | 872 | }; |
|
0 commit comments