cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pcie-mediatek-gen3.c (27518B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * MediaTek PCIe host controller driver.
      4 *
      5 * Copyright (c) 2020 MediaTek Inc.
      6 * Author: Jianjun Wang <jianjun.wang@mediatek.com>
      7 */
      8
      9#include <linux/clk.h>
     10#include <linux/delay.h>
     11#include <linux/iopoll.h>
     12#include <linux/irq.h>
     13#include <linux/irqchip/chained_irq.h>
     14#include <linux/irqdomain.h>
     15#include <linux/kernel.h>
     16#include <linux/module.h>
     17#include <linux/msi.h>
     18#include <linux/pci.h>
     19#include <linux/phy/phy.h>
     20#include <linux/platform_device.h>
     21#include <linux/pm_domain.h>
     22#include <linux/pm_runtime.h>
     23#include <linux/reset.h>
     24
     25#include "../pci.h"
     26
     27#define PCIE_SETTING_REG		0x80
     28#define PCIE_PCI_IDS_1			0x9c
     29#define PCI_CLASS(class)		(class << 8)
     30#define PCIE_RC_MODE			BIT(0)
     31
     32#define PCIE_CFGNUM_REG			0x140
     33#define PCIE_CFG_DEVFN(devfn)		((devfn) & GENMASK(7, 0))
     34#define PCIE_CFG_BUS(bus)		(((bus) << 8) & GENMASK(15, 8))
     35#define PCIE_CFG_BYTE_EN(bytes)		(((bytes) << 16) & GENMASK(19, 16))
     36#define PCIE_CFG_FORCE_BYTE_EN		BIT(20)
     37#define PCIE_CFG_OFFSET_ADDR		0x1000
     38#define PCIE_CFG_HEADER(bus, devfn) \
     39	(PCIE_CFG_BUS(bus) | PCIE_CFG_DEVFN(devfn))
     40
     41#define PCIE_RST_CTRL_REG		0x148
     42#define PCIE_MAC_RSTB			BIT(0)
     43#define PCIE_PHY_RSTB			BIT(1)
     44#define PCIE_BRG_RSTB			BIT(2)
     45#define PCIE_PE_RSTB			BIT(3)
     46
     47#define PCIE_LTSSM_STATUS_REG		0x150
     48#define PCIE_LTSSM_STATE_MASK		GENMASK(28, 24)
     49#define PCIE_LTSSM_STATE(val)		((val & PCIE_LTSSM_STATE_MASK) >> 24)
     50#define PCIE_LTSSM_STATE_L2_IDLE	0x14
     51
     52#define PCIE_LINK_STATUS_REG		0x154
     53#define PCIE_PORT_LINKUP		BIT(8)
     54
     55#define PCIE_MSI_SET_NUM		8
     56#define PCIE_MSI_IRQS_PER_SET		32
     57#define PCIE_MSI_IRQS_NUM \
     58	(PCIE_MSI_IRQS_PER_SET * PCIE_MSI_SET_NUM)
     59
     60#define PCIE_INT_ENABLE_REG		0x180
     61#define PCIE_MSI_ENABLE			GENMASK(PCIE_MSI_SET_NUM + 8 - 1, 8)
     62#define PCIE_MSI_SHIFT			8
     63#define PCIE_INTX_SHIFT			24
     64#define PCIE_INTX_ENABLE \
     65	GENMASK(PCIE_INTX_SHIFT + PCI_NUM_INTX - 1, PCIE_INTX_SHIFT)
     66
     67#define PCIE_INT_STATUS_REG		0x184
     68#define PCIE_MSI_SET_ENABLE_REG		0x190
     69#define PCIE_MSI_SET_ENABLE		GENMASK(PCIE_MSI_SET_NUM - 1, 0)
     70
     71#define PCIE_MSI_SET_BASE_REG		0xc00
     72#define PCIE_MSI_SET_OFFSET		0x10
     73#define PCIE_MSI_SET_STATUS_OFFSET	0x04
     74#define PCIE_MSI_SET_ENABLE_OFFSET	0x08
     75
     76#define PCIE_MSI_SET_ADDR_HI_BASE	0xc80
     77#define PCIE_MSI_SET_ADDR_HI_OFFSET	0x04
     78
     79#define PCIE_ICMD_PM_REG		0x198
     80#define PCIE_TURN_OFF_LINK		BIT(4)
     81
     82#define PCIE_MISC_CTRL_REG		0x348
     83#define PCIE_DISABLE_DVFSRC_VLT_REQ	BIT(1)
     84
     85#define PCIE_TRANS_TABLE_BASE_REG	0x800
     86#define PCIE_ATR_SRC_ADDR_MSB_OFFSET	0x4
     87#define PCIE_ATR_TRSL_ADDR_LSB_OFFSET	0x8
     88#define PCIE_ATR_TRSL_ADDR_MSB_OFFSET	0xc
     89#define PCIE_ATR_TRSL_PARAM_OFFSET	0x10
     90#define PCIE_ATR_TLB_SET_OFFSET		0x20
     91
     92#define PCIE_MAX_TRANS_TABLES		8
     93#define PCIE_ATR_EN			BIT(0)
     94#define PCIE_ATR_SIZE(size) \
     95	(((((size) - 1) << 1) & GENMASK(6, 1)) | PCIE_ATR_EN)
     96#define PCIE_ATR_ID(id)			((id) & GENMASK(3, 0))
     97#define PCIE_ATR_TYPE_MEM		PCIE_ATR_ID(0)
     98#define PCIE_ATR_TYPE_IO		PCIE_ATR_ID(1)
     99#define PCIE_ATR_TLP_TYPE(type)		(((type) << 16) & GENMASK(18, 16))
    100#define PCIE_ATR_TLP_TYPE_MEM		PCIE_ATR_TLP_TYPE(0)
    101#define PCIE_ATR_TLP_TYPE_IO		PCIE_ATR_TLP_TYPE(2)
    102
    103/**
    104 * struct mtk_msi_set - MSI information for each set
    105 * @base: IO mapped register base
    106 * @msg_addr: MSI message address
    107 * @saved_irq_state: IRQ enable state saved at suspend time
    108 */
    109struct mtk_msi_set {
    110	void __iomem *base;
    111	phys_addr_t msg_addr;
    112	u32 saved_irq_state;
    113};
    114
    115/**
    116 * struct mtk_gen3_pcie - PCIe port information
    117 * @dev: pointer to PCIe device
    118 * @base: IO mapped register base
    119 * @reg_base: physical register base
    120 * @mac_reset: MAC reset control
    121 * @phy_reset: PHY reset control
    122 * @phy: PHY controller block
    123 * @clks: PCIe clocks
    124 * @num_clks: PCIe clocks count for this port
    125 * @irq: PCIe controller interrupt number
    126 * @saved_irq_state: IRQ enable state saved at suspend time
    127 * @irq_lock: lock protecting IRQ register access
    128 * @intx_domain: legacy INTx IRQ domain
    129 * @msi_domain: MSI IRQ domain
    130 * @msi_bottom_domain: MSI IRQ bottom domain
    131 * @msi_sets: MSI sets information
    132 * @lock: lock protecting IRQ bit map
    133 * @msi_irq_in_use: bit map for assigned MSI IRQ
    134 */
    135struct mtk_gen3_pcie {
    136	struct device *dev;
    137	void __iomem *base;
    138	phys_addr_t reg_base;
    139	struct reset_control *mac_reset;
    140	struct reset_control *phy_reset;
    141	struct phy *phy;
    142	struct clk_bulk_data *clks;
    143	int num_clks;
    144
    145	int irq;
    146	u32 saved_irq_state;
    147	raw_spinlock_t irq_lock;
    148	struct irq_domain *intx_domain;
    149	struct irq_domain *msi_domain;
    150	struct irq_domain *msi_bottom_domain;
    151	struct mtk_msi_set msi_sets[PCIE_MSI_SET_NUM];
    152	struct mutex lock;
    153	DECLARE_BITMAP(msi_irq_in_use, PCIE_MSI_IRQS_NUM);
    154};
    155
    156/**
    157 * mtk_pcie_config_tlp_header() - Configure a configuration TLP header
    158 * @bus: PCI bus to query
    159 * @devfn: device/function number
    160 * @where: offset in config space
    161 * @size: data size in TLP header
    162 *
    163 * Set byte enable field and device information in configuration TLP header.
    164 */
    165static void mtk_pcie_config_tlp_header(struct pci_bus *bus, unsigned int devfn,
    166					int where, int size)
    167{
    168	struct mtk_gen3_pcie *pcie = bus->sysdata;
    169	int bytes;
    170	u32 val;
    171
    172	bytes = (GENMASK(size - 1, 0) & 0xf) << (where & 0x3);
    173
    174	val = PCIE_CFG_FORCE_BYTE_EN | PCIE_CFG_BYTE_EN(bytes) |
    175	      PCIE_CFG_HEADER(bus->number, devfn);
    176
    177	writel_relaxed(val, pcie->base + PCIE_CFGNUM_REG);
    178}
    179
    180static void __iomem *mtk_pcie_map_bus(struct pci_bus *bus, unsigned int devfn,
    181				      int where)
    182{
    183	struct mtk_gen3_pcie *pcie = bus->sysdata;
    184
    185	return pcie->base + PCIE_CFG_OFFSET_ADDR + where;
    186}
    187
    188static int mtk_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
    189				int where, int size, u32 *val)
    190{
    191	mtk_pcie_config_tlp_header(bus, devfn, where, size);
    192
    193	return pci_generic_config_read32(bus, devfn, where, size, val);
    194}
    195
    196static int mtk_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
    197				 int where, int size, u32 val)
    198{
    199	mtk_pcie_config_tlp_header(bus, devfn, where, size);
    200
    201	if (size <= 2)
    202		val <<= (where & 0x3) * 8;
    203
    204	return pci_generic_config_write32(bus, devfn, where, 4, val);
    205}
    206
    207static struct pci_ops mtk_pcie_ops = {
    208	.map_bus = mtk_pcie_map_bus,
    209	.read  = mtk_pcie_config_read,
    210	.write = mtk_pcie_config_write,
    211};
    212
    213static int mtk_pcie_set_trans_table(struct mtk_gen3_pcie *pcie,
    214				    resource_size_t cpu_addr,
    215				    resource_size_t pci_addr,
    216				    resource_size_t size,
    217				    unsigned long type, int num)
    218{
    219	void __iomem *table;
    220	u32 val;
    221
    222	if (num >= PCIE_MAX_TRANS_TABLES) {
    223		dev_err(pcie->dev, "not enough translate table for addr: %#llx, limited to [%d]\n",
    224			(unsigned long long)cpu_addr, PCIE_MAX_TRANS_TABLES);
    225		return -ENODEV;
    226	}
    227
    228	table = pcie->base + PCIE_TRANS_TABLE_BASE_REG +
    229		num * PCIE_ATR_TLB_SET_OFFSET;
    230
    231	writel_relaxed(lower_32_bits(cpu_addr) | PCIE_ATR_SIZE(fls(size) - 1),
    232		       table);
    233	writel_relaxed(upper_32_bits(cpu_addr),
    234		       table + PCIE_ATR_SRC_ADDR_MSB_OFFSET);
    235	writel_relaxed(lower_32_bits(pci_addr),
    236		       table + PCIE_ATR_TRSL_ADDR_LSB_OFFSET);
    237	writel_relaxed(upper_32_bits(pci_addr),
    238		       table + PCIE_ATR_TRSL_ADDR_MSB_OFFSET);
    239
    240	if (type == IORESOURCE_IO)
    241		val = PCIE_ATR_TYPE_IO | PCIE_ATR_TLP_TYPE_IO;
    242	else
    243		val = PCIE_ATR_TYPE_MEM | PCIE_ATR_TLP_TYPE_MEM;
    244
    245	writel_relaxed(val, table + PCIE_ATR_TRSL_PARAM_OFFSET);
    246
    247	return 0;
    248}
    249
    250static void mtk_pcie_enable_msi(struct mtk_gen3_pcie *pcie)
    251{
    252	int i;
    253	u32 val;
    254
    255	for (i = 0; i < PCIE_MSI_SET_NUM; i++) {
    256		struct mtk_msi_set *msi_set = &pcie->msi_sets[i];
    257
    258		msi_set->base = pcie->base + PCIE_MSI_SET_BASE_REG +
    259				i * PCIE_MSI_SET_OFFSET;
    260		msi_set->msg_addr = pcie->reg_base + PCIE_MSI_SET_BASE_REG +
    261				    i * PCIE_MSI_SET_OFFSET;
    262
    263		/* Configure the MSI capture address */
    264		writel_relaxed(lower_32_bits(msi_set->msg_addr), msi_set->base);
    265		writel_relaxed(upper_32_bits(msi_set->msg_addr),
    266			       pcie->base + PCIE_MSI_SET_ADDR_HI_BASE +
    267			       i * PCIE_MSI_SET_ADDR_HI_OFFSET);
    268	}
    269
    270	val = readl_relaxed(pcie->base + PCIE_MSI_SET_ENABLE_REG);
    271	val |= PCIE_MSI_SET_ENABLE;
    272	writel_relaxed(val, pcie->base + PCIE_MSI_SET_ENABLE_REG);
    273
    274	val = readl_relaxed(pcie->base + PCIE_INT_ENABLE_REG);
    275	val |= PCIE_MSI_ENABLE;
    276	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
    277}
    278
    279static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
    280{
    281	struct resource_entry *entry;
    282	struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
    283	unsigned int table_index = 0;
    284	int err;
    285	u32 val;
    286
    287	/* Set as RC mode */
    288	val = readl_relaxed(pcie->base + PCIE_SETTING_REG);
    289	val |= PCIE_RC_MODE;
    290	writel_relaxed(val, pcie->base + PCIE_SETTING_REG);
    291
    292	/* Set class code */
    293	val = readl_relaxed(pcie->base + PCIE_PCI_IDS_1);
    294	val &= ~GENMASK(31, 8);
    295	val |= PCI_CLASS(PCI_CLASS_BRIDGE_PCI_NORMAL);
    296	writel_relaxed(val, pcie->base + PCIE_PCI_IDS_1);
    297
    298	/* Mask all INTx interrupts */
    299	val = readl_relaxed(pcie->base + PCIE_INT_ENABLE_REG);
    300	val &= ~PCIE_INTX_ENABLE;
    301	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
    302
    303	/* Disable DVFSRC voltage request */
    304	val = readl_relaxed(pcie->base + PCIE_MISC_CTRL_REG);
    305	val |= PCIE_DISABLE_DVFSRC_VLT_REQ;
    306	writel_relaxed(val, pcie->base + PCIE_MISC_CTRL_REG);
    307
    308	/* Assert all reset signals */
    309	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
    310	val |= PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB;
    311	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
    312
    313	/*
    314	 * Described in PCIe CEM specification sections 2.2 (PERST# Signal)
    315	 * and 2.2.1 (Initial Power-Up (G3 to S0)).
    316	 * The deassertion of PERST# should be delayed 100ms (TPVPERL)
    317	 * for the power and clock to become stable.
    318	 */
    319	msleep(100);
    320
    321	/* De-assert reset signals */
    322	val &= ~(PCIE_MAC_RSTB | PCIE_PHY_RSTB | PCIE_BRG_RSTB | PCIE_PE_RSTB);
    323	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
    324
    325	/* Check if the link is up or not */
    326	err = readl_poll_timeout(pcie->base + PCIE_LINK_STATUS_REG, val,
    327				 !!(val & PCIE_PORT_LINKUP), 20,
    328				 PCI_PM_D3COLD_WAIT * USEC_PER_MSEC);
    329	if (err) {
    330		val = readl_relaxed(pcie->base + PCIE_LTSSM_STATUS_REG);
    331		dev_err(pcie->dev, "PCIe link down, ltssm reg val: %#x\n", val);
    332		return err;
    333	}
    334
    335	mtk_pcie_enable_msi(pcie);
    336
    337	/* Set PCIe translation windows */
    338	resource_list_for_each_entry(entry, &host->windows) {
    339		struct resource *res = entry->res;
    340		unsigned long type = resource_type(res);
    341		resource_size_t cpu_addr;
    342		resource_size_t pci_addr;
    343		resource_size_t size;
    344		const char *range_type;
    345
    346		if (type == IORESOURCE_IO) {
    347			cpu_addr = pci_pio_to_address(res->start);
    348			range_type = "IO";
    349		} else if (type == IORESOURCE_MEM) {
    350			cpu_addr = res->start;
    351			range_type = "MEM";
    352		} else {
    353			continue;
    354		}
    355
    356		pci_addr = res->start - entry->offset;
    357		size = resource_size(res);
    358		err = mtk_pcie_set_trans_table(pcie, cpu_addr, pci_addr, size,
    359					       type, table_index);
    360		if (err)
    361			return err;
    362
    363		dev_dbg(pcie->dev, "set %s trans window[%d]: cpu_addr = %#llx, pci_addr = %#llx, size = %#llx\n",
    364			range_type, table_index, (unsigned long long)cpu_addr,
    365			(unsigned long long)pci_addr, (unsigned long long)size);
    366
    367		table_index++;
    368	}
    369
    370	return 0;
    371}
    372
    373static int mtk_pcie_set_affinity(struct irq_data *data,
    374				 const struct cpumask *mask, bool force)
    375{
    376	return -EINVAL;
    377}
    378
    379static void mtk_pcie_msi_irq_mask(struct irq_data *data)
    380{
    381	pci_msi_mask_irq(data);
    382	irq_chip_mask_parent(data);
    383}
    384
    385static void mtk_pcie_msi_irq_unmask(struct irq_data *data)
    386{
    387	pci_msi_unmask_irq(data);
    388	irq_chip_unmask_parent(data);
    389}
    390
    391static struct irq_chip mtk_msi_irq_chip = {
    392	.irq_ack = irq_chip_ack_parent,
    393	.irq_mask = mtk_pcie_msi_irq_mask,
    394	.irq_unmask = mtk_pcie_msi_irq_unmask,
    395	.name = "MSI",
    396};
    397
    398static struct msi_domain_info mtk_msi_domain_info = {
    399	.flags	= (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS |
    400		   MSI_FLAG_PCI_MSIX | MSI_FLAG_MULTI_PCI_MSI),
    401	.chip	= &mtk_msi_irq_chip,
    402};
    403
    404static void mtk_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
    405{
    406	struct mtk_msi_set *msi_set = irq_data_get_irq_chip_data(data);
    407	struct mtk_gen3_pcie *pcie = data->domain->host_data;
    408	unsigned long hwirq;
    409
    410	hwirq =	data->hwirq % PCIE_MSI_IRQS_PER_SET;
    411
    412	msg->address_hi = upper_32_bits(msi_set->msg_addr);
    413	msg->address_lo = lower_32_bits(msi_set->msg_addr);
    414	msg->data = hwirq;
    415	dev_dbg(pcie->dev, "msi#%#lx address_hi %#x address_lo %#x data %d\n",
    416		hwirq, msg->address_hi, msg->address_lo, msg->data);
    417}
    418
    419static void mtk_msi_bottom_irq_ack(struct irq_data *data)
    420{
    421	struct mtk_msi_set *msi_set = irq_data_get_irq_chip_data(data);
    422	unsigned long hwirq;
    423
    424	hwirq =	data->hwirq % PCIE_MSI_IRQS_PER_SET;
    425
    426	writel_relaxed(BIT(hwirq), msi_set->base + PCIE_MSI_SET_STATUS_OFFSET);
    427}
    428
    429static void mtk_msi_bottom_irq_mask(struct irq_data *data)
    430{
    431	struct mtk_msi_set *msi_set = irq_data_get_irq_chip_data(data);
    432	struct mtk_gen3_pcie *pcie = data->domain->host_data;
    433	unsigned long hwirq, flags;
    434	u32 val;
    435
    436	hwirq =	data->hwirq % PCIE_MSI_IRQS_PER_SET;
    437
    438	raw_spin_lock_irqsave(&pcie->irq_lock, flags);
    439	val = readl_relaxed(msi_set->base + PCIE_MSI_SET_ENABLE_OFFSET);
    440	val &= ~BIT(hwirq);
    441	writel_relaxed(val, msi_set->base + PCIE_MSI_SET_ENABLE_OFFSET);
    442	raw_spin_unlock_irqrestore(&pcie->irq_lock, flags);
    443}
    444
    445static void mtk_msi_bottom_irq_unmask(struct irq_data *data)
    446{
    447	struct mtk_msi_set *msi_set = irq_data_get_irq_chip_data(data);
    448	struct mtk_gen3_pcie *pcie = data->domain->host_data;
    449	unsigned long hwirq, flags;
    450	u32 val;
    451
    452	hwirq =	data->hwirq % PCIE_MSI_IRQS_PER_SET;
    453
    454	raw_spin_lock_irqsave(&pcie->irq_lock, flags);
    455	val = readl_relaxed(msi_set->base + PCIE_MSI_SET_ENABLE_OFFSET);
    456	val |= BIT(hwirq);
    457	writel_relaxed(val, msi_set->base + PCIE_MSI_SET_ENABLE_OFFSET);
    458	raw_spin_unlock_irqrestore(&pcie->irq_lock, flags);
    459}
    460
    461static struct irq_chip mtk_msi_bottom_irq_chip = {
    462	.irq_ack		= mtk_msi_bottom_irq_ack,
    463	.irq_mask		= mtk_msi_bottom_irq_mask,
    464	.irq_unmask		= mtk_msi_bottom_irq_unmask,
    465	.irq_compose_msi_msg	= mtk_compose_msi_msg,
    466	.irq_set_affinity	= mtk_pcie_set_affinity,
    467	.name			= "MSI",
    468};
    469
    470static int mtk_msi_bottom_domain_alloc(struct irq_domain *domain,
    471				       unsigned int virq, unsigned int nr_irqs,
    472				       void *arg)
    473{
    474	struct mtk_gen3_pcie *pcie = domain->host_data;
    475	struct mtk_msi_set *msi_set;
    476	int i, hwirq, set_idx;
    477
    478	mutex_lock(&pcie->lock);
    479
    480	hwirq = bitmap_find_free_region(pcie->msi_irq_in_use, PCIE_MSI_IRQS_NUM,
    481					order_base_2(nr_irqs));
    482
    483	mutex_unlock(&pcie->lock);
    484
    485	if (hwirq < 0)
    486		return -ENOSPC;
    487
    488	set_idx = hwirq / PCIE_MSI_IRQS_PER_SET;
    489	msi_set = &pcie->msi_sets[set_idx];
    490
    491	for (i = 0; i < nr_irqs; i++)
    492		irq_domain_set_info(domain, virq + i, hwirq + i,
    493				    &mtk_msi_bottom_irq_chip, msi_set,
    494				    handle_edge_irq, NULL, NULL);
    495
    496	return 0;
    497}
    498
    499static void mtk_msi_bottom_domain_free(struct irq_domain *domain,
    500				       unsigned int virq, unsigned int nr_irqs)
    501{
    502	struct mtk_gen3_pcie *pcie = domain->host_data;
    503	struct irq_data *data = irq_domain_get_irq_data(domain, virq);
    504
    505	mutex_lock(&pcie->lock);
    506
    507	bitmap_release_region(pcie->msi_irq_in_use, data->hwirq,
    508			      order_base_2(nr_irqs));
    509
    510	mutex_unlock(&pcie->lock);
    511
    512	irq_domain_free_irqs_common(domain, virq, nr_irqs);
    513}
    514
    515static const struct irq_domain_ops mtk_msi_bottom_domain_ops = {
    516	.alloc = mtk_msi_bottom_domain_alloc,
    517	.free = mtk_msi_bottom_domain_free,
    518};
    519
    520static void mtk_intx_mask(struct irq_data *data)
    521{
    522	struct mtk_gen3_pcie *pcie = irq_data_get_irq_chip_data(data);
    523	unsigned long flags;
    524	u32 val;
    525
    526	raw_spin_lock_irqsave(&pcie->irq_lock, flags);
    527	val = readl_relaxed(pcie->base + PCIE_INT_ENABLE_REG);
    528	val &= ~BIT(data->hwirq + PCIE_INTX_SHIFT);
    529	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
    530	raw_spin_unlock_irqrestore(&pcie->irq_lock, flags);
    531}
    532
    533static void mtk_intx_unmask(struct irq_data *data)
    534{
    535	struct mtk_gen3_pcie *pcie = irq_data_get_irq_chip_data(data);
    536	unsigned long flags;
    537	u32 val;
    538
    539	raw_spin_lock_irqsave(&pcie->irq_lock, flags);
    540	val = readl_relaxed(pcie->base + PCIE_INT_ENABLE_REG);
    541	val |= BIT(data->hwirq + PCIE_INTX_SHIFT);
    542	writel_relaxed(val, pcie->base + PCIE_INT_ENABLE_REG);
    543	raw_spin_unlock_irqrestore(&pcie->irq_lock, flags);
    544}
    545
    546/**
    547 * mtk_intx_eoi() - Clear INTx IRQ status at the end of interrupt
    548 * @data: pointer to chip specific data
    549 *
    550 * As an emulated level IRQ, its interrupt status will remain
    551 * until the corresponding de-assert message is received; hence that
    552 * the status can only be cleared when the interrupt has been serviced.
    553 */
    554static void mtk_intx_eoi(struct irq_data *data)
    555{
    556	struct mtk_gen3_pcie *pcie = irq_data_get_irq_chip_data(data);
    557	unsigned long hwirq;
    558
    559	hwirq = data->hwirq + PCIE_INTX_SHIFT;
    560	writel_relaxed(BIT(hwirq), pcie->base + PCIE_INT_STATUS_REG);
    561}
    562
    563static struct irq_chip mtk_intx_irq_chip = {
    564	.irq_mask		= mtk_intx_mask,
    565	.irq_unmask		= mtk_intx_unmask,
    566	.irq_eoi		= mtk_intx_eoi,
    567	.irq_set_affinity	= mtk_pcie_set_affinity,
    568	.name			= "INTx",
    569};
    570
    571static int mtk_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
    572			     irq_hw_number_t hwirq)
    573{
    574	irq_set_chip_data(irq, domain->host_data);
    575	irq_set_chip_and_handler_name(irq, &mtk_intx_irq_chip,
    576				      handle_fasteoi_irq, "INTx");
    577	return 0;
    578}
    579
    580static const struct irq_domain_ops intx_domain_ops = {
    581	.map = mtk_pcie_intx_map,
    582};
    583
    584static int mtk_pcie_init_irq_domains(struct mtk_gen3_pcie *pcie)
    585{
    586	struct device *dev = pcie->dev;
    587	struct device_node *intc_node, *node = dev->of_node;
    588	int ret;
    589
    590	raw_spin_lock_init(&pcie->irq_lock);
    591
    592	/* Setup INTx */
    593	intc_node = of_get_child_by_name(node, "interrupt-controller");
    594	if (!intc_node) {
    595		dev_err(dev, "missing interrupt-controller node\n");
    596		return -ENODEV;
    597	}
    598
    599	pcie->intx_domain = irq_domain_add_linear(intc_node, PCI_NUM_INTX,
    600						  &intx_domain_ops, pcie);
    601	if (!pcie->intx_domain) {
    602		dev_err(dev, "failed to create INTx IRQ domain\n");
    603		return -ENODEV;
    604	}
    605
    606	/* Setup MSI */
    607	mutex_init(&pcie->lock);
    608
    609	pcie->msi_bottom_domain = irq_domain_add_linear(node, PCIE_MSI_IRQS_NUM,
    610				  &mtk_msi_bottom_domain_ops, pcie);
    611	if (!pcie->msi_bottom_domain) {
    612		dev_err(dev, "failed to create MSI bottom domain\n");
    613		ret = -ENODEV;
    614		goto err_msi_bottom_domain;
    615	}
    616
    617	pcie->msi_domain = pci_msi_create_irq_domain(dev->fwnode,
    618						     &mtk_msi_domain_info,
    619						     pcie->msi_bottom_domain);
    620	if (!pcie->msi_domain) {
    621		dev_err(dev, "failed to create MSI domain\n");
    622		ret = -ENODEV;
    623		goto err_msi_domain;
    624	}
    625
    626	return 0;
    627
    628err_msi_domain:
    629	irq_domain_remove(pcie->msi_bottom_domain);
    630err_msi_bottom_domain:
    631	irq_domain_remove(pcie->intx_domain);
    632
    633	return ret;
    634}
    635
    636static void mtk_pcie_irq_teardown(struct mtk_gen3_pcie *pcie)
    637{
    638	irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
    639
    640	if (pcie->intx_domain)
    641		irq_domain_remove(pcie->intx_domain);
    642
    643	if (pcie->msi_domain)
    644		irq_domain_remove(pcie->msi_domain);
    645
    646	if (pcie->msi_bottom_domain)
    647		irq_domain_remove(pcie->msi_bottom_domain);
    648
    649	irq_dispose_mapping(pcie->irq);
    650}
    651
    652static void mtk_pcie_msi_handler(struct mtk_gen3_pcie *pcie, int set_idx)
    653{
    654	struct mtk_msi_set *msi_set = &pcie->msi_sets[set_idx];
    655	unsigned long msi_enable, msi_status;
    656	irq_hw_number_t bit, hwirq;
    657
    658	msi_enable = readl_relaxed(msi_set->base + PCIE_MSI_SET_ENABLE_OFFSET);
    659
    660	do {
    661		msi_status = readl_relaxed(msi_set->base +
    662					   PCIE_MSI_SET_STATUS_OFFSET);
    663		msi_status &= msi_enable;
    664		if (!msi_status)
    665			break;
    666
    667		for_each_set_bit(bit, &msi_status, PCIE_MSI_IRQS_PER_SET) {
    668			hwirq = bit + set_idx * PCIE_MSI_IRQS_PER_SET;
    669			generic_handle_domain_irq(pcie->msi_bottom_domain, hwirq);
    670		}
    671	} while (true);
    672}
    673
    674static void mtk_pcie_irq_handler(struct irq_desc *desc)
    675{
    676	struct mtk_gen3_pcie *pcie = irq_desc_get_handler_data(desc);
    677	struct irq_chip *irqchip = irq_desc_get_chip(desc);
    678	unsigned long status;
    679	irq_hw_number_t irq_bit = PCIE_INTX_SHIFT;
    680
    681	chained_irq_enter(irqchip, desc);
    682
    683	status = readl_relaxed(pcie->base + PCIE_INT_STATUS_REG);
    684	for_each_set_bit_from(irq_bit, &status, PCI_NUM_INTX +
    685			      PCIE_INTX_SHIFT)
    686		generic_handle_domain_irq(pcie->intx_domain,
    687					  irq_bit - PCIE_INTX_SHIFT);
    688
    689	irq_bit = PCIE_MSI_SHIFT;
    690	for_each_set_bit_from(irq_bit, &status, PCIE_MSI_SET_NUM +
    691			      PCIE_MSI_SHIFT) {
    692		mtk_pcie_msi_handler(pcie, irq_bit - PCIE_MSI_SHIFT);
    693
    694		writel_relaxed(BIT(irq_bit), pcie->base + PCIE_INT_STATUS_REG);
    695	}
    696
    697	chained_irq_exit(irqchip, desc);
    698}
    699
    700static int mtk_pcie_setup_irq(struct mtk_gen3_pcie *pcie)
    701{
    702	struct device *dev = pcie->dev;
    703	struct platform_device *pdev = to_platform_device(dev);
    704	int err;
    705
    706	err = mtk_pcie_init_irq_domains(pcie);
    707	if (err)
    708		return err;
    709
    710	pcie->irq = platform_get_irq(pdev, 0);
    711	if (pcie->irq < 0)
    712		return pcie->irq;
    713
    714	irq_set_chained_handler_and_data(pcie->irq, mtk_pcie_irq_handler, pcie);
    715
    716	return 0;
    717}
    718
    719static int mtk_pcie_parse_port(struct mtk_gen3_pcie *pcie)
    720{
    721	struct device *dev = pcie->dev;
    722	struct platform_device *pdev = to_platform_device(dev);
    723	struct resource *regs;
    724	int ret;
    725
    726	regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcie-mac");
    727	if (!regs)
    728		return -EINVAL;
    729	pcie->base = devm_ioremap_resource(dev, regs);
    730	if (IS_ERR(pcie->base)) {
    731		dev_err(dev, "failed to map register base\n");
    732		return PTR_ERR(pcie->base);
    733	}
    734
    735	pcie->reg_base = regs->start;
    736
    737	pcie->phy_reset = devm_reset_control_get_optional_exclusive(dev, "phy");
    738	if (IS_ERR(pcie->phy_reset)) {
    739		ret = PTR_ERR(pcie->phy_reset);
    740		if (ret != -EPROBE_DEFER)
    741			dev_err(dev, "failed to get PHY reset\n");
    742
    743		return ret;
    744	}
    745
    746	pcie->mac_reset = devm_reset_control_get_optional_exclusive(dev, "mac");
    747	if (IS_ERR(pcie->mac_reset)) {
    748		ret = PTR_ERR(pcie->mac_reset);
    749		if (ret != -EPROBE_DEFER)
    750			dev_err(dev, "failed to get MAC reset\n");
    751
    752		return ret;
    753	}
    754
    755	pcie->phy = devm_phy_optional_get(dev, "pcie-phy");
    756	if (IS_ERR(pcie->phy)) {
    757		ret = PTR_ERR(pcie->phy);
    758		if (ret != -EPROBE_DEFER)
    759			dev_err(dev, "failed to get PHY\n");
    760
    761		return ret;
    762	}
    763
    764	pcie->num_clks = devm_clk_bulk_get_all(dev, &pcie->clks);
    765	if (pcie->num_clks < 0) {
    766		dev_err(dev, "failed to get clocks\n");
    767		return pcie->num_clks;
    768	}
    769
    770	return 0;
    771}
    772
    773static int mtk_pcie_power_up(struct mtk_gen3_pcie *pcie)
    774{
    775	struct device *dev = pcie->dev;
    776	int err;
    777
    778	/* PHY power on and enable pipe clock */
    779	reset_control_deassert(pcie->phy_reset);
    780
    781	err = phy_init(pcie->phy);
    782	if (err) {
    783		dev_err(dev, "failed to initialize PHY\n");
    784		goto err_phy_init;
    785	}
    786
    787	err = phy_power_on(pcie->phy);
    788	if (err) {
    789		dev_err(dev, "failed to power on PHY\n");
    790		goto err_phy_on;
    791	}
    792
    793	/* MAC power on and enable transaction layer clocks */
    794	reset_control_deassert(pcie->mac_reset);
    795
    796	pm_runtime_enable(dev);
    797	pm_runtime_get_sync(dev);
    798
    799	err = clk_bulk_prepare_enable(pcie->num_clks, pcie->clks);
    800	if (err) {
    801		dev_err(dev, "failed to enable clocks\n");
    802		goto err_clk_init;
    803	}
    804
    805	return 0;
    806
    807err_clk_init:
    808	pm_runtime_put_sync(dev);
    809	pm_runtime_disable(dev);
    810	reset_control_assert(pcie->mac_reset);
    811	phy_power_off(pcie->phy);
    812err_phy_on:
    813	phy_exit(pcie->phy);
    814err_phy_init:
    815	reset_control_assert(pcie->phy_reset);
    816
    817	return err;
    818}
    819
    820static void mtk_pcie_power_down(struct mtk_gen3_pcie *pcie)
    821{
    822	clk_bulk_disable_unprepare(pcie->num_clks, pcie->clks);
    823
    824	pm_runtime_put_sync(pcie->dev);
    825	pm_runtime_disable(pcie->dev);
    826	reset_control_assert(pcie->mac_reset);
    827
    828	phy_power_off(pcie->phy);
    829	phy_exit(pcie->phy);
    830	reset_control_assert(pcie->phy_reset);
    831}
    832
    833static int mtk_pcie_setup(struct mtk_gen3_pcie *pcie)
    834{
    835	int err;
    836
    837	err = mtk_pcie_parse_port(pcie);
    838	if (err)
    839		return err;
    840
    841	/*
    842	 * The controller may have been left out of reset by the bootloader
    843	 * so make sure that we get a clean start by asserting resets here.
    844	 */
    845	reset_control_assert(pcie->phy_reset);
    846	reset_control_assert(pcie->mac_reset);
    847	usleep_range(10, 20);
    848
    849	/* Don't touch the hardware registers before power up */
    850	err = mtk_pcie_power_up(pcie);
    851	if (err)
    852		return err;
    853
    854	/* Try link up */
    855	err = mtk_pcie_startup_port(pcie);
    856	if (err)
    857		goto err_setup;
    858
    859	err = mtk_pcie_setup_irq(pcie);
    860	if (err)
    861		goto err_setup;
    862
    863	return 0;
    864
    865err_setup:
    866	mtk_pcie_power_down(pcie);
    867
    868	return err;
    869}
    870
    871static int mtk_pcie_probe(struct platform_device *pdev)
    872{
    873	struct device *dev = &pdev->dev;
    874	struct mtk_gen3_pcie *pcie;
    875	struct pci_host_bridge *host;
    876	int err;
    877
    878	host = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
    879	if (!host)
    880		return -ENOMEM;
    881
    882	pcie = pci_host_bridge_priv(host);
    883
    884	pcie->dev = dev;
    885	platform_set_drvdata(pdev, pcie);
    886
    887	err = mtk_pcie_setup(pcie);
    888	if (err)
    889		return err;
    890
    891	host->ops = &mtk_pcie_ops;
    892	host->sysdata = pcie;
    893
    894	err = pci_host_probe(host);
    895	if (err) {
    896		mtk_pcie_irq_teardown(pcie);
    897		mtk_pcie_power_down(pcie);
    898		return err;
    899	}
    900
    901	return 0;
    902}
    903
    904static int mtk_pcie_remove(struct platform_device *pdev)
    905{
    906	struct mtk_gen3_pcie *pcie = platform_get_drvdata(pdev);
    907	struct pci_host_bridge *host = pci_host_bridge_from_priv(pcie);
    908
    909	pci_lock_rescan_remove();
    910	pci_stop_root_bus(host->bus);
    911	pci_remove_root_bus(host->bus);
    912	pci_unlock_rescan_remove();
    913
    914	mtk_pcie_irq_teardown(pcie);
    915	mtk_pcie_power_down(pcie);
    916
    917	return 0;
    918}
    919
    920static void __maybe_unused mtk_pcie_irq_save(struct mtk_gen3_pcie *pcie)
    921{
    922	int i;
    923
    924	raw_spin_lock(&pcie->irq_lock);
    925
    926	pcie->saved_irq_state = readl_relaxed(pcie->base + PCIE_INT_ENABLE_REG);
    927
    928	for (i = 0; i < PCIE_MSI_SET_NUM; i++) {
    929		struct mtk_msi_set *msi_set = &pcie->msi_sets[i];
    930
    931		msi_set->saved_irq_state = readl_relaxed(msi_set->base +
    932					   PCIE_MSI_SET_ENABLE_OFFSET);
    933	}
    934
    935	raw_spin_unlock(&pcie->irq_lock);
    936}
    937
    938static void __maybe_unused mtk_pcie_irq_restore(struct mtk_gen3_pcie *pcie)
    939{
    940	int i;
    941
    942	raw_spin_lock(&pcie->irq_lock);
    943
    944	writel_relaxed(pcie->saved_irq_state, pcie->base + PCIE_INT_ENABLE_REG);
    945
    946	for (i = 0; i < PCIE_MSI_SET_NUM; i++) {
    947		struct mtk_msi_set *msi_set = &pcie->msi_sets[i];
    948
    949		writel_relaxed(msi_set->saved_irq_state,
    950			       msi_set->base + PCIE_MSI_SET_ENABLE_OFFSET);
    951	}
    952
    953	raw_spin_unlock(&pcie->irq_lock);
    954}
    955
    956static int __maybe_unused mtk_pcie_turn_off_link(struct mtk_gen3_pcie *pcie)
    957{
    958	u32 val;
    959
    960	val = readl_relaxed(pcie->base + PCIE_ICMD_PM_REG);
    961	val |= PCIE_TURN_OFF_LINK;
    962	writel_relaxed(val, pcie->base + PCIE_ICMD_PM_REG);
    963
    964	/* Check the link is L2 */
    965	return readl_poll_timeout(pcie->base + PCIE_LTSSM_STATUS_REG, val,
    966				  (PCIE_LTSSM_STATE(val) ==
    967				   PCIE_LTSSM_STATE_L2_IDLE), 20,
    968				   50 * USEC_PER_MSEC);
    969}
    970
    971static int __maybe_unused mtk_pcie_suspend_noirq(struct device *dev)
    972{
    973	struct mtk_gen3_pcie *pcie = dev_get_drvdata(dev);
    974	int err;
    975	u32 val;
    976
    977	/* Trigger link to L2 state */
    978	err = mtk_pcie_turn_off_link(pcie);
    979	if (err) {
    980		dev_err(pcie->dev, "cannot enter L2 state\n");
    981		return err;
    982	}
    983
    984	/* Pull down the PERST# pin */
    985	val = readl_relaxed(pcie->base + PCIE_RST_CTRL_REG);
    986	val |= PCIE_PE_RSTB;
    987	writel_relaxed(val, pcie->base + PCIE_RST_CTRL_REG);
    988
    989	dev_dbg(pcie->dev, "entered L2 states successfully");
    990
    991	mtk_pcie_irq_save(pcie);
    992	mtk_pcie_power_down(pcie);
    993
    994	return 0;
    995}
    996
    997static int __maybe_unused mtk_pcie_resume_noirq(struct device *dev)
    998{
    999	struct mtk_gen3_pcie *pcie = dev_get_drvdata(dev);
   1000	int err;
   1001
   1002	err = mtk_pcie_power_up(pcie);
   1003	if (err)
   1004		return err;
   1005
   1006	err = mtk_pcie_startup_port(pcie);
   1007	if (err) {
   1008		mtk_pcie_power_down(pcie);
   1009		return err;
   1010	}
   1011
   1012	mtk_pcie_irq_restore(pcie);
   1013
   1014	return 0;
   1015}
   1016
   1017static const struct dev_pm_ops mtk_pcie_pm_ops = {
   1018	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(mtk_pcie_suspend_noirq,
   1019				      mtk_pcie_resume_noirq)
   1020};
   1021
   1022static const struct of_device_id mtk_pcie_of_match[] = {
   1023	{ .compatible = "mediatek,mt8192-pcie" },
   1024	{},
   1025};
   1026MODULE_DEVICE_TABLE(of, mtk_pcie_of_match);
   1027
   1028static struct platform_driver mtk_pcie_driver = {
   1029	.probe = mtk_pcie_probe,
   1030	.remove = mtk_pcie_remove,
   1031	.driver = {
   1032		.name = "mtk-pcie",
   1033		.of_match_table = mtk_pcie_of_match,
   1034		.pm = &mtk_pcie_pm_ops,
   1035	},
   1036};
   1037
   1038module_platform_driver(mtk_pcie_driver);
   1039MODULE_LICENSE("GPL v2");