Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp1148541pxv; Fri, 9 Jul 2021 19:33:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy5rYCEKF+Oyq+LkPlRIdjADsOEzceSFbL6aTzn1Gl+AKRXkmDVG/ma4R+aPyjnA8AOsU42 X-Received: by 2002:a17:906:95cb:: with SMTP id n11mr2236789ejy.429.1625884426401; Fri, 09 Jul 2021 19:33:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625884426; cv=none; d=google.com; s=arc-20160816; b=SHqcFEFenZM9Z2SlJd1+C7M3+bmc+b2xmDa3dUr7EMUgEInJfvOV0Ga41JSLNgt/vS iepDjuQJz9U19RNeWGi/KrwUW9T9G6tZ46umxMFSfVac4PufHApxY4Yjse3jxXxKR63J fdcEnB9o13LLt2I+6quLfZIgDFEfmieA+HU5x1Zn0dY/sVfWRBwHYNlSyL9mY75KRTFR +6WUnHhU8meglmrqMxNHE4q1TWRLGEy5L9f+vq5QuI1/dlee3CLbWPF4Iy24+OXG0Qc/ 7TyTr6wf0XoUPZ89TkqPeR9gfC0ARjc2jcNKpV+Z1s/Lr46/xoyt4R+Oup+0ZyC3YFt1 kqdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ql4saU2kRMLbhCFsU1Wi/k3fw8KSr1CYPzE6MW9Qd4U=; b=na4pasm5XMlfWkOeXKoa+0T1ajgRpoR0mgTHspBkwyZ2NZ0A/AC/+PMyq+NfEnOQUw KF6p0g74VFjnmugODQNXPy6gaCuVlh23aLVqvNu/CE62hQQ6Ok+E2PnU5ojuSs0ekk8g 3i95srvmtBQNJW4CwWuHkGC801VLeWWkbggc/IFeC/I3Xy8KNeOVRPmDk6ULBbAxEsDU GMG7A4sJMHh1r0XIocTzQwKC5Fe2edxxCEOKCodJwaybYujYzrhmHLppN+2aTvXZbU6l TzZA1RmtwtKYOJMTixQX9LTu2pHBqvkP9426S9Bvpuxvh3+laLtJhRuZm/AnToWU9SQa JnaQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=WIhColKX; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cw19si8440287ejc.372.2021.07.09.19.33.23; Fri, 09 Jul 2021 19:33:46 -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; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=WIhColKX; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235314AbhGJCen (ORCPT + 99 others); Fri, 9 Jul 2021 22:34:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:42882 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234740AbhGJC3n (ORCPT ); Fri, 9 Jul 2021 22:29:43 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 6BA7F613CC; Sat, 10 Jul 2021 02:26:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1625884019; bh=YrfJ8dKNlutmPddgbdWUgLKsXiT8/9F7vm9xuBCNROM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WIhColKXRJ1rzOppwM8COrPdNrhAV7SMbsZ7r5yPonmAfgrp1n892I6llT31ggzH5 LkLcU2KLwlLzdf+1u9pZNhrzyYtSBWYF3SKZkG4v0Uo13LKNn89J2CZ+zoGRtxLgTq hWtorXsQsbWztNfTDs7HEkqiD5B1FJH+LZIw1ooh2e7M1QSoIrmzjVpAJSZmfbuj9E XuLYFsR0gl5I5hI7CV7zXzgQkJbWJnBhGMJ7CllSsYCujgPRQrUCHT6yl2FYLiIV9o zJGlhLpL1EfEix4+KMULVZEdMwXog+zECfHd/VH9DaBITRhe0MJzUrKYMcagFE3pPe HD+RqNr59lP/Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Alexander Shishkin , Andy Shevchenko , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH AUTOSEL 5.10 89/93] intel_th: Wait until port is in reset before programming it Date: Fri, 9 Jul 2021 22:24:23 -0400 Message-Id: <20210710022428.3169839-89-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210710022428.3169839-1-sashal@kernel.org> References: <20210710022428.3169839-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexander Shishkin [ Upstream commit ab1afed701d2db7eb35c1a2526a29067a38e93d1 ] Some devices don't drain their pipelines if we don't make sure that the corresponding output port is in reset before programming it for a new trace capture, resulting in bits of old trace appearing in the new trace capture. Fix that by explicitly making sure the reset is asserted before programming new trace capture. Reviewed-by: Andy Shevchenko Signed-off-by: Alexander Shishkin Link: https://lore.kernel.org/r/20210621151246.31891-5-alexander.shishkin@linux.intel.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/hwtracing/intel_th/core.c | 17 +++++++++++++++++ drivers/hwtracing/intel_th/gth.c | 16 ++++++++++++++++ drivers/hwtracing/intel_th/intel_th.h | 3 +++ 3 files changed, 36 insertions(+) diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c index c9ac3dc65113..9cb8c7d13d46 100644 --- a/drivers/hwtracing/intel_th/core.c +++ b/drivers/hwtracing/intel_th/core.c @@ -215,6 +215,22 @@ static ssize_t port_show(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR_RO(port); +static void intel_th_trace_prepare(struct intel_th_device *thdev) +{ + struct intel_th_device *hub = to_intel_th_hub(thdev); + struct intel_th_driver *hubdrv = to_intel_th_driver(hub->dev.driver); + + if (hub->type != INTEL_TH_SWITCH) + return; + + if (thdev->type != INTEL_TH_OUTPUT) + return; + + pm_runtime_get_sync(&thdev->dev); + hubdrv->prepare(hub, &thdev->output); + pm_runtime_put(&thdev->dev); +} + static int intel_th_output_activate(struct intel_th_device *thdev) { struct intel_th_driver *thdrv = @@ -235,6 +251,7 @@ static int intel_th_output_activate(struct intel_th_device *thdev) if (ret) goto fail_put; + intel_th_trace_prepare(thdev); if (thdrv->activate) ret = thdrv->activate(thdev); else diff --git a/drivers/hwtracing/intel_th/gth.c b/drivers/hwtracing/intel_th/gth.c index 28509b02a0b5..b3308934a687 100644 --- a/drivers/hwtracing/intel_th/gth.c +++ b/drivers/hwtracing/intel_th/gth.c @@ -564,6 +564,21 @@ static void gth_tscu_resync(struct gth_device *gth) iowrite32(reg, gth->base + REG_TSCU_TSUCTRL); } +static void intel_th_gth_prepare(struct intel_th_device *thdev, + struct intel_th_output *output) +{ + struct gth_device *gth = dev_get_drvdata(&thdev->dev); + int count; + + /* + * Wait until the output port is in reset before we start + * programming it. + */ + for (count = GTH_PLE_WAITLOOP_DEPTH; + count && !(gth_output_get(gth, output->port) & BIT(5)); count--) + cpu_relax(); +} + /** * intel_th_gth_enable() - enable tracing to an output device * @thdev: GTH device @@ -815,6 +830,7 @@ static struct intel_th_driver intel_th_gth_driver = { .assign = intel_th_gth_assign, .unassign = intel_th_gth_unassign, .set_output = intel_th_gth_set_output, + .prepare = intel_th_gth_prepare, .enable = intel_th_gth_enable, .trig_switch = intel_th_gth_switch, .disable = intel_th_gth_disable, diff --git a/drivers/hwtracing/intel_th/intel_th.h b/drivers/hwtracing/intel_th/intel_th.h index 5fe694708b7a..595615b79108 100644 --- a/drivers/hwtracing/intel_th/intel_th.h +++ b/drivers/hwtracing/intel_th/intel_th.h @@ -143,6 +143,7 @@ intel_th_output_assigned(struct intel_th_device *thdev) * @remove: remove method * @assign: match a given output type device against available outputs * @unassign: deassociate an output type device from an output port + * @prepare: prepare output port for tracing * @enable: enable tracing for a given output device * @disable: disable tracing for a given output device * @irq: interrupt callback @@ -164,6 +165,8 @@ struct intel_th_driver { struct intel_th_device *othdev); void (*unassign)(struct intel_th_device *thdev, struct intel_th_device *othdev); + void (*prepare)(struct intel_th_device *thdev, + struct intel_th_output *output); void (*enable)(struct intel_th_device *thdev, struct intel_th_output *output); void (*trig_switch)(struct intel_th_device *thdev, -- 2.30.2