summaryrefslogtreecommitdiff
path: root/src/soc/mediatek/common
diff options
context:
space:
mode:
authorJianjun Wang <jianjun.wang@mediatek.com>2022-03-14 20:38:18 +0800
committerFelix Held <felix-coreboot@felixheld.de>2022-03-16 16:55:26 +0000
commitc0808b64978056e72514525733e290b495cc0777 (patch)
tree6e2b3524085e84450e445adb108d1f6aa03d484c /src/soc/mediatek/common
parentd59b3dd08540b7cf42dc98d68da42b2a4305f6ee (diff)
soc/mediatek: Add chip config for setting PCIe config
Add chip config for setting PCIe config. TEST=Build pass and boot up to kernel successfully via SSD on Dojo board, here is the SSD information in boot log: == NVME IDENTIFY CONTROLLER DATA == PCI VID : 0x15b7 PCI SSVID : 0x15b7 SN : 21517J440114 MN : WDC PC SN530 SDBPTPZ-256G-1006 RAB : 0x4 AERL : 0x7 SQES : 0x66 CQES : 0x44 NN : 0x1 Identified NVMe model WDC PC SN530 SDBPTPZ-256G-1006 BUG=b:178565024 Signed-off-by: Jianjun Wang <jianjun.wang@mediatek.com> Change-Id: Icff83f2a9f76862065987a74cfcc7e511be80a20 Reviewed-on: https://review.coreboot.org/c/coreboot/+/62791 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com>
Diffstat (limited to 'src/soc/mediatek/common')
-rw-r--r--src/soc/mediatek/common/include/soc/pcie_common.h8
-rw-r--r--src/soc/mediatek/common/pcie.c111
2 files changed, 53 insertions, 66 deletions
diff --git a/src/soc/mediatek/common/include/soc/pcie_common.h b/src/soc/mediatek/common/include/soc/pcie_common.h
index d737c9dd9b..0f02ab7a90 100644
--- a/src/soc/mediatek/common/include/soc/pcie_common.h
+++ b/src/soc/mediatek/common/include/soc/pcie_common.h
@@ -13,12 +13,10 @@ struct mtk_pcie_mmio_res {
unsigned long type;
};
-struct mtk_pcie_controller {
+struct mtk_pcie_config {
uintptr_t base; /* MAC physical address */
- int (*phy_init)(void);
- void (*reset)(uintptr_t base, bool enable);
- const struct mtk_pcie_mmio_res *mmio_res_io;
- const struct mtk_pcie_mmio_res *mmio_res_mem;
+ const struct mtk_pcie_mmio_res mmio_res_io;
+ const struct mtk_pcie_mmio_res mmio_res_mem;
};
void mtk_pcie_domain_read_resources(struct device *dev);
diff --git a/src/soc/mediatek/common/pcie.c b/src/soc/mediatek/common/pcie.c
index c05db8cca9..4ed8b93b25 100644
--- a/src/soc/mediatek/common/pcie.c
+++ b/src/soc/mediatek/common/pcie.c
@@ -13,6 +13,7 @@
#include <soc/addressmap.h>
#include <soc/pcie.h>
#include <soc/pcie_common.h>
+#include <soc/soc_chip.h>
#include <stdlib.h>
#include <types.h>
@@ -64,7 +65,7 @@
#define PCIE_ATR_TLP_TYPE_MEM PCIE_ATR_TLP_TYPE(0)
#define PCIE_ATR_TLP_TYPE_IO PCIE_ATR_TLP_TYPE(2)
-static struct mtk_pcie_controller pcie_ctrl;
+static const struct mtk_pcie_config *pcie_ctrl;
/* LTSSM state in PCIE_LTSSM_STATUS_REG bit[28:24] */
static const char *const ltssm_str[] = {
@@ -105,56 +106,9 @@ volatile union pci_bank *pci_map_bus(pci_devfn_t dev)
bus = PCI_DEV2SEGBUS(dev);
val = PCIE_CFG_HEADER(bus, devfn);
- write32p(pcie_ctrl.base + PCIE_CFGNUM_REG, val);
+ write32p(pcie_ctrl->base + PCIE_CFGNUM_REG, val);
- return (void *)(pcie_ctrl.base + PCIE_CFG_OFFSET_ADDR);
-}
-
-static int mtk_pcie_startup_port(struct mtk_pcie_controller *ctrl)
-{
- uint32_t val;
- size_t tries = 0;
- const char *ltssm_state;
-
- /* Set as RC mode */
- val = read32p(ctrl->base + PCIE_SETTING_REG);
- val |= PCIE_RC_MODE;
- write32p(ctrl->base + PCIE_SETTING_REG, val);
-
- /* Set class code */
- val = read32p(ctrl->base + PCIE_PCI_IDS_1);
- val &= ~GENMASK(31, 8);
- val |= PCI_CLASS(PCI_CLASS_BRIDGE_PCI << 8);
- write32p(ctrl->base + PCIE_PCI_IDS_1, val);
-
- /* Mask all INTx interrupts */
- val = read32p(ctrl->base + PCIE_INT_ENABLE_REG);
- val &= ~PCIE_INTX_ENABLE;
- write32p(ctrl->base + PCIE_INT_ENABLE_REG, val);
-
- if (!ctrl->reset) {
- printk(BIOS_ERR, "%s: Missing reset function\n", __func__);
- return -1;
- }
-
- /* De-assert reset signals */
- ctrl->reset(ctrl->base + PCIE_RST_CTRL_REG, false);
-
- if (!retry(100,
- (tries++, read32p(ctrl->base + PCIE_LINK_STATUS_REG) &
- PCIE_CTRL_LINKUP), mdelay(1))) {
- val = read32p(ctrl->base + PCIE_LTSSM_STATUS_REG);
- ltssm_state = PCIE_LTSSM_STATE(val) >= ARRAY_SIZE(ltssm_str) ?
- "Unknown state" : ltssm_str[PCIE_LTSSM_STATE(val)];
- printk(BIOS_ERR, "%s: PCIe link down, current ltssm state: %s\n",
- __func__, ltssm_state);
- return -1;
- }
-
- printk(BIOS_INFO, "%s: PCIe link up success (%ld tries)\n", __func__,
- tries);
-
- return 0;
+ return (void *)(pcie_ctrl->base + PCIE_CFG_OFFSET_ADDR);
}
static int mtk_pcie_set_trans_window(struct device *dev, uintptr_t table,
@@ -210,29 +164,31 @@ static void mtk_pcie_domain_new_res(struct device *dev, unsigned int index,
void mtk_pcie_domain_read_resources(struct device *dev)
{
- struct mtk_pcie_controller *ctrl = dev->chip_info;
+ const mtk_soc_config_t *config = config_of(dev);
+ const struct mtk_pcie_config *conf = &config->pcie_config;
mtk_pcie_domain_new_res(dev, IOINDEX_SUBTRACTIVE(0, 0),
- ctrl->mmio_res_io);
+ &conf->mmio_res_io);
mtk_pcie_domain_new_res(dev, IOINDEX_SUBTRACTIVE(1, 0),
- ctrl->mmio_res_mem);
+ &conf->mmio_res_mem);
}
void mtk_pcie_domain_set_resources(struct device *dev)
{
- struct mtk_pcie_controller *ctrl = dev->chip_info;
+ const mtk_soc_config_t *config = config_of(dev);
+ const struct mtk_pcie_config *conf = &config->pcie_config;
uintptr_t table;
/* Initialize I/O space constraints. */
- table = ctrl->base + PCIE_TRANS_TABLE_BASE_REG;
- if (mtk_pcie_set_trans_window(dev, table, ctrl->mmio_res_io) < 0)
+ table = conf->base + PCIE_TRANS_TABLE_BASE_REG;
+ if (mtk_pcie_set_trans_window(dev, table, &conf->mmio_res_io) < 0)
printk(BIOS_ERR, "%s: Failed to set IO window\n", __func__);
/* Initialize memory resources constraints. */
- table = ctrl->base + PCIE_TRANS_TABLE_BASE_REG +
+ table = conf->base + PCIE_TRANS_TABLE_BASE_REG +
PCIE_ATR_TLB_SET_OFFSET;
- if (mtk_pcie_set_trans_window(dev, table, ctrl->mmio_res_mem) < 0)
+ if (mtk_pcie_set_trans_window(dev, table, &conf->mmio_res_mem) < 0)
printk(BIOS_ERR, "%s: Failed to set MEM window\n", __func__);
pci_domain_set_resources(dev);
@@ -240,10 +196,43 @@ void mtk_pcie_domain_set_resources(struct device *dev)
void mtk_pcie_domain_enable(struct device *dev)
{
- mtk_pcie_get_hw_info(&pcie_ctrl);
+ const mtk_soc_config_t *config = config_of(dev);
+ const char *ltssm_state;
+ size_t tries = 0;
+ uint32_t val;
+
+ pcie_ctrl = &config->pcie_config;
+
+ /* Set as RC mode */
+ val = read32p(pcie_ctrl->base + PCIE_SETTING_REG);
+ val |= PCIE_RC_MODE;
+ write32p(pcie_ctrl->base + PCIE_SETTING_REG, val);
+
+ /* Set class code */
+ val = read32p(pcie_ctrl->base + PCIE_PCI_IDS_1);
+ val &= ~GENMASK(31, 8);
+ val |= PCI_CLASS(PCI_CLASS_BRIDGE_PCI << 8);
+ write32p(pcie_ctrl->base + PCIE_PCI_IDS_1, val);
+
+ /* Mask all INTx interrupts */
+ val = read32p(pcie_ctrl->base + PCIE_INT_ENABLE_REG);
+ val &= ~PCIE_INTX_ENABLE;
+ write32p(pcie_ctrl->base + PCIE_INT_ENABLE_REG, val);
- if (mtk_pcie_startup_port(&pcie_ctrl) < 0)
+ /* De-assert reset signals */
+ mtk_pcie_reset(pcie_ctrl->base + PCIE_RST_CTRL_REG, false);
+
+ if (!retry(100,
+ (tries++, read32p(pcie_ctrl->base + PCIE_LINK_STATUS_REG) &
+ PCIE_CTRL_LINKUP), mdelay(1))) {
+ val = read32p(pcie_ctrl->base + PCIE_LTSSM_STATUS_REG);
+ ltssm_state = PCIE_LTSSM_STATE(val) >= ARRAY_SIZE(ltssm_str) ?
+ "Unknown state" : ltssm_str[PCIE_LTSSM_STATE(val)];
+ printk(BIOS_ERR, "%s: PCIe link down, current ltssm state: %s\n",
+ __func__, ltssm_state);
return;
+ }
- dev->chip_info = &pcie_ctrl;
+ printk(BIOS_INFO, "%s: PCIe link up success (%ld tries)\n", __func__,
+ tries);
}