linux/drivers/pci/controller/dwc/pcie-rcar-gen4.c

// SPDX-License-Identifier: GPL-2.0-only
/*
 * PCIe controller driver for Renesas R-Car Gen4 Series SoCs
 * Copyright (C) 2022-2023 Renesas Electronics Corporation
 *
 * The r8a779g0 (R-Car V4H) controller requires a specific firmware to be
 * provided, to initialize the PHY. Otherwise, the PCIe controller will not
 * work.
 */

#include <linux/delay.h>
#include <linux/firmware.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>

#include "../../pci.h"
#include "pcie-designware.h"

/* Renesas-specific */
/* PCIe Mode Setting Register 0 */
#define PCIEMSR0
#define APP_SRIS_MODE
#define DEVICE_TYPE_EP
#define DEVICE_TYPE_RC
#define BIFUR_MOD_SET_ON

/* PCIe Interrupt Status 0 */
#define PCIEINTSTS0

/* PCIe Interrupt Status 0 Enable */
#define PCIEINTSTS0EN
#define MSI_CTRL_INT
#define SMLH_LINK_UP
#define RDLH_LINK_UP

/* PCIe DMA Interrupt Status Enable */
#define PCIEDMAINTSTSEN
#define PCIEDMAINTSTSEN_INIT

/* Port Logic Registers 89 */
#define PRTLGC89

/* Port Logic Registers 90 */
#define PRTLGC90

/* PCIe Reset Control Register 1 */
#define PCIERSTCTRL1
#define APP_HOLD_PHY_RST
#define APP_LTSSM_ENABLE

/* PCIe Power Management Control */
#define PCIEPWRMNGCTRL
#define APP_CLK_REQ_N
#define APP_CLK_PM_EN

#define RCAR_NUM_SPEED_CHANGE_RETRIES
#define RCAR_MAX_LINK_SPEED

#define RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET
#define RCAR_GEN4_PCIE_EP_FUNC_DBI2_OFFSET

#define RCAR_GEN4_PCIE_FIRMWARE_NAME
#define RCAR_GEN4_PCIE_FIRMWARE_BASE_ADDR
MODULE_FIRMWARE();

struct rcar_gen4_pcie;
struct rcar_gen4_pcie_drvdata {};

struct rcar_gen4_pcie {};
#define to_rcar_gen4_pcie(_dw)

/* Common */
static int rcar_gen4_pcie_link_up(struct dw_pcie *dw)
{}

/*
 * Manually initiate the speed change. Return 0 if change succeeded; otherwise
 * -ETIMEDOUT.
 */
static int rcar_gen4_pcie_speed_change(struct dw_pcie *dw)
{}

/*
 * Enable LTSSM of this controller and manually initiate the speed change.
 * Always return 0.
 */
static int rcar_gen4_pcie_start_link(struct dw_pcie *dw)
{}

static void rcar_gen4_pcie_stop_link(struct dw_pcie *dw)
{}

static int rcar_gen4_pcie_common_init(struct rcar_gen4_pcie *rcar)
{}

static void rcar_gen4_pcie_common_deinit(struct rcar_gen4_pcie *rcar)
{}

static int rcar_gen4_pcie_prepare(struct rcar_gen4_pcie *rcar)
{}

static void rcar_gen4_pcie_unprepare(struct rcar_gen4_pcie *rcar)
{}

static int rcar_gen4_pcie_get_resources(struct rcar_gen4_pcie *rcar)
{}

static const struct dw_pcie_ops dw_pcie_ops =;

static struct rcar_gen4_pcie *rcar_gen4_pcie_alloc(struct platform_device *pdev)
{}

/* Host mode */
static int rcar_gen4_pcie_host_init(struct dw_pcie_rp *pp)
{}

static void rcar_gen4_pcie_host_deinit(struct dw_pcie_rp *pp)
{}

static const struct dw_pcie_host_ops rcar_gen4_pcie_host_ops =;

static int rcar_gen4_add_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
{}

static void rcar_gen4_remove_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
{}

/* Endpoint mode */
static void rcar_gen4_pcie_ep_pre_init(struct dw_pcie_ep *ep)
{}

static void rcar_gen4_pcie_ep_init(struct dw_pcie_ep *ep)
{}

static void rcar_gen4_pcie_ep_deinit(struct rcar_gen4_pcie *rcar)
{}

static int rcar_gen4_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
				       unsigned int type, u16 interrupt_num)
{}

static const struct pci_epc_features rcar_gen4_pcie_epc_features =;

static const struct pci_epc_features*
rcar_gen4_pcie_ep_get_features(struct dw_pcie_ep *ep)
{}

static unsigned int rcar_gen4_pcie_ep_get_dbi_offset(struct dw_pcie_ep *ep,
						       u8 func_no)
{}

static unsigned int rcar_gen4_pcie_ep_get_dbi2_offset(struct dw_pcie_ep *ep,
						      u8 func_no)
{}

static const struct dw_pcie_ep_ops pcie_ep_ops =;

static int rcar_gen4_add_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
{}

static void rcar_gen4_remove_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
{}

/* Common */
static int rcar_gen4_add_dw_pcie(struct rcar_gen4_pcie *rcar)
{}

static int rcar_gen4_pcie_probe(struct platform_device *pdev)
{}

static void rcar_gen4_remove_dw_pcie(struct rcar_gen4_pcie *rcar)
{}

static void rcar_gen4_pcie_remove(struct platform_device *pdev)
{}

static int r8a779f0_pcie_ltssm_control(struct rcar_gen4_pcie *rcar, bool enable)
{}

static void rcar_gen4_pcie_additional_common_init(struct rcar_gen4_pcie *rcar)
{}

static void rcar_gen4_pcie_phy_reg_update_bits(struct rcar_gen4_pcie *rcar,
					       u32 offset, u32 mask, u32 val)
{}

/*
 * SoC datasheet suggests checking port logic register bits during firmware
 * write. If read returns non-zero value, then this function returns -EAGAIN
 * indicating that the write needs to be done again. If read returns zero,
 * then return 0 to indicate success.
 */
static int rcar_gen4_pcie_reg_test_bit(struct rcar_gen4_pcie *rcar,
				       u32 offset, u32 mask)
{}

static int rcar_gen4_pcie_download_phy_firmware(struct rcar_gen4_pcie *rcar)
{}

static int rcar_gen4_pcie_ltssm_control(struct rcar_gen4_pcie *rcar, bool enable)
{}

static struct rcar_gen4_pcie_drvdata drvdata_r8a779f0_pcie =;

static struct rcar_gen4_pcie_drvdata drvdata_r8a779f0_pcie_ep =;

static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie =;

static struct rcar_gen4_pcie_drvdata drvdata_rcar_gen4_pcie_ep =;

static const struct of_device_id rcar_gen4_pcie_of_match[] =;
MODULE_DEVICE_TABLE(of, rcar_gen4_pcie_of_match);

static struct platform_driver rcar_gen4_pcie_driver =;
module_platform_driver();

MODULE_DESCRIPTION();
MODULE_LICENSE();