Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp161632pxa; Tue, 18 Aug 2020 19:46:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxQhn6rGLPtgpAQ1Dvdz8IbFpOIm5fQNwOCDCmyIBRPYqwNSUooYa1H9SjvO6iZym7CngTv X-Received: by 2002:a17:907:42cc:: with SMTP id nz20mr23636357ejb.429.1597805209298; Tue, 18 Aug 2020 19:46:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597805209; cv=none; d=google.com; s=arc-20160816; b=llb8vj378Vb+0MJVYFxfik189eZFts3nPPYzNe08ijBpLz/XmcA9prVKvypgTb7QlE +qguUtH81XXXP6gnx6bz+cYCgfARplKsF+JcMUZh4NMdt3j6v8S+UtbeUhCupWu3HB3f zkVYnujxcXb7Tu0/qsjUQ3LKdHjmLxEFcNpLCh/d+bH1+eYDSNL4CEA6NvQ0jdOKC62D zLW9CpuvCCPbnbhVXkKFsQrYF7pOxTKQq4Yp0360fh0PEgQOOBc2GjgVOyw6VLfdKZ4g CtYCE1y3Gt82tmKEcDeviQF9zo0OiwtD0TaMC2zY2VpoWf/QGCK8tBpoS6HUnacH3LJW loqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:ironport-sdr:ironport-sdr; bh=vEOwmgKbeA6aLuihptoRY/xDGrYM1ZOCyMi8PLja6AY=; b=CeZmLjOLVYnWcU6zdgB8WBpm8jJai6qFnEAvY8QjxESR7IVVjZvodFSmtZ24Br3m+Y 99qrfX+dP0eLYNxFmgvWLHdwZDTz8DsZh+oMwi0grNcHbs593jO51+2IkPStgU1/aV17 BZM4ebwPNM2Uil2FwB54QLik4M+j2YmX+fkUWLIPNMJZfR9yxXIABJ0Wj6Yglc8Me6WU mvTUz6fq61YvL3gPMOiMuIimpdYulh0iHV8gxasL+Zf7E7G+59BYiDqSA1At9xyw0WP8 GjhJGzyEs9lCh5FifQx3hsbG6/ARO1Uh+0ZAFMIPWTUlOY9n/NP+WbHVDPDLHWdJaepg VsDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id pk27si14824354ejb.130.2020.08.18.19.46.26; Tue, 18 Aug 2020 19:46:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727966AbgHSCBO (ORCPT + 99 others); Tue, 18 Aug 2020 22:01:14 -0400 Received: from mga04.intel.com ([192.55.52.120]:3722 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727955AbgHSCBN (ORCPT ); Tue, 18 Aug 2020 22:01:13 -0400 IronPort-SDR: 8zYBZzskS/Ot5NjkAyuYCDhNnV9OuVd1dPHmozI+aLtVc4wVsqckI+dOlRFC/ASmsunkd63pfV 9g8RIDtBiPNw== X-IronPort-AV: E=McAfee;i="6000,8403,9717"; a="152449482" X-IronPort-AV: E=Sophos;i="5.76,329,1592895600"; d="scan'208";a="152449482" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Aug 2020 19:01:11 -0700 IronPort-SDR: cbTXgFi0nB8A2DPi3bkjFIXT+6zFCsja9KX6mMfSBfrimipQ6eJD8pc/iDNIqKIsDVOmNhPsCl gvUMODvkDJqg== X-IronPort-AV: E=Sophos;i="5.76,329,1592895600"; d="scan'208";a="279565148" Received: from bard-ubuntu.sh.intel.com ([10.239.13.33]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Aug 2020 19:01:07 -0700 From: Bard Liao To: alsa-devel@alsa-project.org, vkoul@kernel.org Cc: vinod.koul@linaro.org, linux-kernel@vger.kernel.org, tiwai@suse.de, broonie@kernel.org, gregkh@linuxfoundation.org, jank@cadence.com, srinivas.kandagatla@linaro.org, rander.wang@linux.intel.com, ranjani.sridharan@linux.intel.com, hui.wang@canonical.com, pierre-louis.bossart@linux.intel.com, sanyog.r.kale@intel.com, mengdong.lin@intel.com, bard.liao@intel.com Subject: [PATCH 7/7] soundwire: cadence: add parity error injection through debugfs Date: Tue, 18 Aug 2020 22:06:56 +0800 Message-Id: <20200818140656.29014-8-yung-chuan.liao@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200818140656.29014-1-yung-chuan.liao@linux.intel.com> References: <20200818140656.29014-1-yung-chuan.liao@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pierre-Louis Bossart The Cadence IP can inject errors, let's make use of this capability to test Slave parity error checks. See e.g. example log where both the master and slave detect the parity error injected on a dummy read command. cd /sys/kernel/debug/soundwire/master-1/intel-sdw/ echo 1 > cdns-parity-error-injection [ 44.756249] intel-master sdw-master-1: Parity error [ 44.756313] intel-master sdw-master-1: Msg NACK received [ 44.756366] intel-master sdw-master-1: Msg NACKed for Slave 15 [ 44.756375] intel-master sdw-master-1: trf on Slave 15 failed:-5 [ 44.756382] intel-master sdw-master-1: parity error injection, read: -5 [ 44.756649] rt1308 sdw:1:25d:1308:0: Parity error detected The code makes sure the Master device is resumed, hence the clock restarted, before sending a parity error. Signed-off-by: Pierre-Louis Bossart Reviewed-by: Kai Vehmanen Reviewed-by: Guennadi Liakhovetski Signed-off-by: Bard Liao --- drivers/soundwire/cadence_master.c | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c index 24eafe0aa1c3..807d70b82455 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,9 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask"); #define CDNS_MCP_CONTROL_BLOCK_WAKEUP BIT(0) #define CDNS_MCP_CMDCTRL 0x8 + +#define CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR BIT(2) + #define CDNS_MCP_SSPSTAT 0xC #define CDNS_MCP_FRAME_SHAPE 0x10 #define CDNS_MCP_FRAME_SHAPE_INIT 0x14 @@ -367,6 +371,85 @@ static int cdns_hw_reset(void *data, u64 value) DEFINE_DEBUGFS_ATTRIBUTE(cdns_hw_reset_fops, NULL, cdns_hw_reset, "%llu\n"); +static int cdns_parity_error_injection(void *data, u64 value) +{ + struct sdw_cdns *cdns = data; + struct sdw_bus *bus; + int ret; + + if (value != 1) + return -EINVAL; + + bus = &cdns->bus; + + /* + * Resume Master device. If this results in a bus reset, the + * Slave devices will re-attach and be re-enumerated. + */ + ret = pm_runtime_get_sync(bus->dev); + if (ret < 0 && ret != -EACCES) { + dev_err_ratelimited(cdns->dev, + "pm_runtime_get_sync failed in %s, ret %d\n", + __func__, ret); + pm_runtime_put_noidle(bus->dev); + return ret; + } + + /* + * wait long enough for Slave(s) to be in steady state. This + * does not need to be super precise. + */ + msleep(200); + + /* + * Take the bus lock here to make sure that any bus transactions + * will be queued while we inject a parity error on a dummy read + */ + mutex_lock(&bus->bus_lock); + + /* program hardware to inject parity error */ + cdns_updatel(cdns, CDNS_MCP_CMDCTRL, + CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR, + CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR); + + /* commit changes */ + cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE, + CDNS_MCP_CONFIG_UPDATE_BIT, + CDNS_MCP_CONFIG_UPDATE_BIT); + + /* do a broadcast dummy read to avoid bus clashes */ + ret = sdw_bread_no_pm_unlocked(&cdns->bus, 0xf, SDW_SCP_DEVID_0); + dev_info(cdns->dev, "parity error injection, read: %d\n", ret); + + /* program hardware to disable parity error */ + cdns_updatel(cdns, CDNS_MCP_CMDCTRL, + CDNS_MCP_CMDCTRL_INSERT_PARITY_ERR, + 0); + + /* commit changes */ + cdns_updatel(cdns, CDNS_MCP_CONFIG_UPDATE, + CDNS_MCP_CONFIG_UPDATE_BIT, + CDNS_MCP_CONFIG_UPDATE_BIT); + + /* Continue bus operation with parity error injection disabled */ + mutex_unlock(&bus->bus_lock); + + /* Userspace changed the hardware state behind the kernel's back */ + add_taint(TAINT_USER, LOCKDEP_STILL_OK); + + /* + * allow Master device to enter pm_runtime suspend. This may + * also result in Slave devices suspending. + */ + pm_runtime_mark_last_busy(bus->dev); + pm_runtime_put_autosuspend(bus->dev); + + return 0; +} + +DEFINE_DEBUGFS_ATTRIBUTE(cdns_parity_error_fops, NULL, + cdns_parity_error_injection, "%llu\n"); + /** * sdw_cdns_debugfs_init() - Cadence debugfs init * @cdns: Cadence instance @@ -378,6 +461,9 @@ void sdw_cdns_debugfs_init(struct sdw_cdns *cdns, struct dentry *root) debugfs_create_file("cdns-hw-reset", 0200, root, cdns, &cdns_hw_reset_fops); + + debugfs_create_file("cdns-parity-error-injection", 0200, root, cdns, + &cdns_parity_error_fops); } EXPORT_SYMBOL_GPL(sdw_cdns_debugfs_init); -- 2.17.1