Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64e3b730 authored by Siva Kumar Akkireddi's avatar Siva Kumar Akkireddi
Browse files

msm: ep_pcie: Add debugfs option to set the link speed



Add a debugfs option in the EP PCIE driver to set the link speed
to a user-specified value. Link must be retrained for the new setting
to take effect. Also add a log to print the link status register.

Change-Id: Ie4d9069d83fc8978208b03f792cb0e8ba665d395
Signed-off-by: default avatarSiva Kumar Akkireddi <sivaa@codeaurora.org>
parent ef5e807a
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -333,7 +333,8 @@ struct ep_pcie_dev_t {
	u16                          vendor_id;
	u16                          device_id;
	u32                          subsystem_id;
	u32                          link_speed;
	u32                          max_link_speed;
	u32                          curr_link_speed;
	bool                         active_config;
	bool                         aggregated_irq;
	bool                         mhi_a7_irq;
+9 −4
Original line number Diff line number Diff line
@@ -604,7 +604,7 @@ static void ep_pcie_core_init(struct ep_pcie_dev_t *dev, bool configured)
		/* Configure link speed */
		ep_pcie_write_mask(dev->dm_core +
				PCIE20_LINK_CONTROL2_LINK_STATUS2,
				0xf, dev->link_speed);
				0xf, dev->curr_link_speed);
	}

	if (dev->active_config) {
@@ -1597,6 +1597,10 @@ int ep_pcie_core_enable_endpoint(enum ep_pcie_options opt)
		}
	}

	EP_PCIE_DBG(dev, "PCIe V%d: PCIE20_CAP_LINKCTRLSTATUS: 0x%x\n",
		dev->rev,
		readl_relaxed(dev->dm_core + PCIE20_CAP_LINKCTRLSTATUS));

	dev->suspending = false;
	goto out;

@@ -2564,17 +2568,18 @@ static int ep_pcie_probe(struct platform_device *pdev)

	pr_debug("%s\n", __func__);

	ep_pcie_dev.link_speed = 1;
	ep_pcie_dev.max_link_speed = 1;
	ret = of_property_read_u32((&pdev->dev)->of_node,
				"qcom,pcie-link-speed",
				&ep_pcie_dev.link_speed);
				&ep_pcie_dev.max_link_speed);
	if (ret)
		EP_PCIE_DBG(&ep_pcie_dev,
			"PCIe V%d: pcie-link-speed does not exist.\n",
			ep_pcie_dev.rev);
	else
		EP_PCIE_DBG(&ep_pcie_dev, "PCIe V%d: pcie-link-speed:%d.\n",
			ep_pcie_dev.rev, ep_pcie_dev.link_speed);
			ep_pcie_dev.rev, ep_pcie_dev.max_link_speed);
	ep_pcie_dev.curr_link_speed = ep_pcie_dev.max_link_speed;

	ep_pcie_dev.vendor_id = 0xFFFF;
	ret = of_property_read_u16((&pdev->dev)->of_node,
+32 −11
Original line number Diff line number Diff line
/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2017, 2019 The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -23,7 +23,7 @@
#include "ep_pcie_phy.h"

static struct dentry *dent_ep_pcie;
static struct dentry *dfile_case;
static u8 link_speed;
static struct ep_pcie_dev_t *dev;

static void ep_ep_pcie_phy_dump_pcs_debug_bus(struct ep_pcie_dev_t *dev,
@@ -406,6 +406,17 @@ static ssize_t ep_pcie_cmd_debug(struct file *file,
	case 32: /* do not output core registers when D3 hot is set by host*/
		dev->dump_conf = false;
		break;
	case 33: /* Set link speed, takes effect upon next hlos link training */
		if (link_speed > 0 && link_speed <= dev->max_link_speed) {
			EP_PCIE_DBG_FS("Setting link speed to gen %d\n",
					link_speed);
			dev->curr_link_speed = link_speed;
		} else {
			EP_PCIE_DBG_FS(
			"Invalid link speed %d, max supported speed %d\n",
				link_speed, dev->max_link_speed);
		}
		break;
	default:
		EP_PCIE_DBG_FS("PCIe: Invalid testcase: %d.\n", testcase);
		break;
@@ -423,6 +434,8 @@ const struct file_operations ep_pcie_cmd_debug_ops = {

void ep_pcie_debugfs_init(struct ep_pcie_dev_t *ep_dev)
{
	struct dentry *dfile;

	dev = ep_dev;
	dent_ep_pcie = debugfs_create_dir("pcie-ep", 0);
	if (IS_ERR(dent_ep_pcie)) {
@@ -432,14 +445,23 @@ void ep_pcie_debugfs_init(struct ep_pcie_dev_t *ep_dev)
		return;
	}

	dfile_case = debugfs_create_file("case", 0664,
					dent_ep_pcie, 0,
	dfile = debugfs_create_file("case", 0664,
				dent_ep_pcie, NULL,
				&ep_pcie_cmd_debug_ops);
	if (!dfile_case || IS_ERR(dfile_case)) {
	if (!dfile || IS_ERR(dfile)) {
		EP_PCIE_ERR(dev,
			"PCIe V%d: fail to create the file for case.\n",
			dev->rev);
		goto case_error;
		goto file_error;
	}

	dfile = debugfs_create_u8("link_speed", 0664,
				dent_ep_pcie, &link_speed);
	if (!dfile || IS_ERR(dfile)) {
		EP_PCIE_ERR(dev,
			"PCIe V%d: fail to create the file for link speed.\n",
			dev->rev);
		goto file_error;
	}

	EP_PCIE_DBG2(dev,
@@ -448,12 +470,11 @@ void ep_pcie_debugfs_init(struct ep_pcie_dev_t *ep_dev)

	return;

case_error:
	debugfs_remove(dent_ep_pcie);
file_error:
	debugfs_remove_recursive(dent_ep_pcie);
}

void ep_pcie_debugfs_exit(void)
{
	debugfs_remove(dfile_case);
	debugfs_remove(dent_ep_pcie);
	debugfs_remove_recursive(dent_ep_pcie);
}