cregit-Linux how code gets into the kernel

Release 4.11 drivers/pci/dwc/pcie-designware.c

Directory: drivers/pci/dwc
/*
 * Synopsys Designware PCIe host controller driver
 *
 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
 *              http://www.samsung.com
 *
 * Author: Jingoo Han <jg1.han@samsung.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/delay.h>
#include <linux/of.h>
#include <linux/types.h>

#include "pcie-designware.h"

/* PCIe Port Logic registers */

#define PLR_OFFSET			0x700

#define PCIE_PHY_DEBUG_R1		(PLR_OFFSET + 0x2c)

#define PCIE_PHY_DEBUG_R1_LINK_UP	(0x1 << 4)

#define PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING	(0x1 << 29)


int dw_pcie_read(void __iomem *addr, int size, u32 *val) { if ((uintptr_t)addr & (size - 1)) { *val = 0; return PCIBIOS_BAD_REGISTER_NUMBER; } if (size == 4) { *val = readl(addr); } else if (size == 2) { *val = readw(addr); } else if (size == 1) { *val = readb(addr); } else { *val = 0; return PCIBIOS_BAD_REGISTER_NUMBER; } return PCIBIOS_SUCCESSFUL; }

Contributors

PersonTokensPropCommitsCommitProp
Jingoo Han4947.12%233.33%
Gabriele Paoloni4846.15%233.33%
Kishon Vijay Abraham I76.73%233.33%
Total104100.00%6100.00%


int dw_pcie_write(void __iomem *addr, int size, u32 val) { if ((uintptr_t)addr & (size - 1)) return PCIBIOS_BAD_REGISTER_NUMBER; if (size == 4) writel(val, addr); else if (size == 2) writew(val, addr); else if (size == 1) writeb(val, addr); else return PCIBIOS_BAD_REGISTER_NUMBER; return PCIBIOS_SUCCESSFUL; }

Contributors

PersonTokensPropCommitsCommitProp
Jingoo Han6378.75%250.00%
Gabriele Paoloni1620.00%125.00%
Kishon Vijay Abraham I11.25%125.00%
Total80100.00%4100.00%


u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg) { if (pci->ops->readl_dbi) return pci->ops->readl_dbi(pci, reg); return readl(pci->dbi_base + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Jingoo Han2251.16%240.00%
Kishon Vijay Abraham I920.93%120.00%
Seungwon Jeon716.28%120.00%
Björn Helgaas511.63%120.00%
Total43100.00%5100.00%


void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val) { if (pci->ops->writel_dbi) pci->ops->writel_dbi(pci, reg, val); else writel(val, pci->dbi_base + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Jingoo Han3061.22%240.00%
Kishon Vijay Abraham I918.37%120.00%
Seungwon Jeon612.24%120.00%
Björn Helgaas48.16%120.00%
Total49100.00%5100.00%


static u32 dw_pcie_readl_unroll(struct dw_pcie *pci, u32 index, u32 reg) { u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); return dw_pcie_readl_dbi(pci, offset + reg); }

Contributors

PersonTokensPropCommitsCommitProp
Joao Pinto2880.00%125.00%
Kishon Vijay Abraham I411.43%125.00%
Jingoo Han25.71%125.00%
Seungwon Jeon12.86%125.00%
Total35100.00%4100.00%


static void dw_pcie_writel_unroll(struct dw_pcie *pci, u32 index, u32 reg, u32 val) { u32 offset = PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(index); dw_pcie_writel_dbi(pci, offset + reg, val); }

Contributors

PersonTokensPropCommitsCommitProp
Jingoo Han1538.46%228.57%
Joao Pinto1435.90%114.29%
Kishon Vijay Abraham I410.26%114.29%
Björn Helgaas410.26%228.57%
Seungwon Jeon25.13%114.29%
Total39100.00%7100.00%


void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index, int type, u64 cpu_addr, u64 pci_addr, u32 size) { u32 retries, val; if (pci->iatu_unroll_enabled) { dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_LOWER_BASE, lower_32_bits(cpu_addr)); dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_UPPER_BASE, upper_32_bits(cpu_addr)); dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_LIMIT, lower_32_bits(cpu_addr + size - 1)); dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_LOWER_TARGET, lower_32_bits(pci_addr)); dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_UPPER_TARGET, upper_32_bits(pci_addr)); dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL1, type); dw_pcie_writel_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL2, PCIE_ATU_ENABLE); } else { dw_pcie_writel_dbi(pci, PCIE_ATU_VIEWPORT, PCIE_ATU_REGION_OUTBOUND | index); dw_pcie_writel_dbi(pci, PCIE_ATU_LOWER_BASE, lower_32_bits(cpu_addr)); dw_pcie_writel_dbi(pci, PCIE_ATU_UPPER_BASE, upper_32_bits(cpu_addr)); dw_pcie_writel_dbi(pci, PCIE_ATU_LIMIT, lower_32_bits(cpu_addr + size - 1)); dw_pcie_writel_dbi(pci, PCIE_ATU_LOWER_TARGET, lower_32_bits(pci_addr)); dw_pcie_writel_dbi(pci, PCIE_ATU_UPPER_TARGET, upper_32_bits(pci_addr)); dw_pcie_writel_dbi(pci, PCIE_ATU_CR1, type); dw_pcie_writel_dbi(pci, PCIE_ATU_CR2, PCIE_ATU_ENABLE); } /* * Make sure ATU enable takes effect before any subsequent config * and I/O accesses. */ for (retries = 0; retries < LINK_WAIT_MAX_IATU_RETRIES; retries++) { if (pci->iatu_unroll_enabled) val = dw_pcie_readl_unroll(pci, index, PCIE_ATU_UNR_REGION_CTRL2); else val = dw_pcie_readl_dbi(pci, PCIE_ATU_CR2); if (val == PCIE_ATU_ENABLE) return; usleep_range(LINK_WAIT_IATU_MIN, LINK_WAIT_IATU_MAX); } dev_err(pci->dev, "iATU is not being enabled\n"); }

Contributors

PersonTokensPropCommitsCommitProp
Joao Pinto12843.24%222.22%
JiSheng Zhang8528.72%111.11%
Björn Helgaas3210.81%333.33%
Kishon Vijay Abraham I3110.47%111.11%
Stanimir Varbanov134.39%111.11%
Jingoo Han72.36%111.11%
Total296100.00%9100.00%


int dw_pcie_wait_for_link(struct dw_pcie *pci) { int retries; /* check if the link is up or not */ for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) { if (dw_pcie_link_up(pci)) { dev_info(pci->dev, "link up\n"); return 0; } usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX); } dev_err(pci->dev, "phy link never came up\n"); return -ETIMEDOUT; }

Contributors

PersonTokensPropCommitsCommitProp
Kishon Vijay Abraham I3245.71%120.00%
Jingoo Han3144.29%120.00%
Harro Haan34.29%120.00%
Lucas Stach34.29%120.00%
Pratyush Anand11.43%120.00%
Total70100.00%5100.00%


int dw_pcie_link_up(struct dw_pcie *pci) { u32 val; if (pci->ops->link_up) return pci->ops->link_up(pci); val = readl(pci->dbi_base + PCIE_PHY_DEBUG_R1); return ((val & PCIE_PHY_DEBUG_R1_LINK_UP) && (!(val & PCIE_PHY_DEBUG_R1_LINK_IN_TRAINING))); }

Contributors

PersonTokensPropCommitsCommitProp
Kishon Vijay Abraham I4270.00%120.00%
Jingoo Han1423.33%240.00%
Murali Karicheri23.33%120.00%
Björn Helgaas23.33%120.00%
Total60100.00%5100.00%


void dw_pcie_setup(struct dw_pcie *pci) { int ret; u32 val; u32 lanes; struct device *dev = pci->dev; struct device_node *np = dev->of_node; ret = of_property_read_u32(np, "num-lanes", &lanes); if (ret) lanes = 0; /* set the number of lanes */ val = dw_pcie_readl_dbi(pci, PCIE_PORT_LINK_CONTROL); val &= ~PORT_LINK_MODE_MASK; switch (lanes) { case 1: val |= PORT_LINK_MODE_1_LANES; break; case 2: val |= PORT_LINK_MODE_2_LANES; break; case 4: val |= PORT_LINK_MODE_4_LANES; break; case 8: val |= PORT_LINK_MODE_8_LANES; break; default: dev_err(pci->dev, "num-lanes %u: invalid value\n", lanes); return; } dw_pcie_writel_dbi(pci, PCIE_PORT_LINK_CONTROL, val); /* set link width speed control register */ val = dw_pcie_readl_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL); val &= ~PORT_LOGIC_LINK_WIDTH_MASK; switch (lanes) { case 1: val |= PORT_LOGIC_LINK_WIDTH_1_LANES; break; case 2: val |= PORT_LOGIC_LINK_WIDTH_2_LANES; break; case 4: val |= PORT_LOGIC_LINK_WIDTH_4_LANES; break; case 8: val |= PORT_LOGIC_LINK_WIDTH_8_LANES; break; } dw_pcie_writel_dbi(pci, PCIE_LINK_WIDTH_SPEED_CONTROL, val); }

Contributors

PersonTokensPropCommitsCommitProp
Jingoo Han10051.55%220.00%
Kishon Vijay Abraham I5729.38%330.00%
Zhou Wang168.25%110.00%
Gabriele Paoloni126.19%110.00%
Björn Helgaas84.12%220.00%
Mohit Kumar10.52%110.00%
Total194100.00%10100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Jingoo Han34234.20%310.34%
Kishon Vijay Abraham I20020.00%620.69%
Joao Pinto18218.20%310.34%
JiSheng Zhang909.00%26.90%
Gabriele Paoloni767.60%310.34%
Björn Helgaas555.50%413.79%
Seungwon Jeon161.60%13.45%
Zhou Wang161.60%13.45%
Stanimir Varbanov131.30%13.45%
Harro Haan30.30%13.45%
Lucas Stach30.30%13.45%
Murali Karicheri20.20%13.45%
Pratyush Anand10.10%13.45%
Mohit Kumar10.10%13.45%
Total1000100.00%29100.00%
Directory: drivers/pci/dwc
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.