Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3791698pxv; Mon, 19 Jul 2021 08:51:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyf5YfJeBcZFOuBmMAhCElC8CC/DXd3DDK9J4A+MDXAuBxkZ+9kVTVLHDI9KMAu8gc6DRy6 X-Received: by 2002:a17:906:fa8e:: with SMTP id lt14mr27393835ejb.21.1626709868720; Mon, 19 Jul 2021 08:51:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626709868; cv=none; d=google.com; s=arc-20160816; b=m3PZZL8mLSigTf31aSpsn4T1ljpFHxSQPy1vDIEY/yn971Fd92qtsoom++IMPxFL0v 9ErgwlGRQAWd9ck3cHeKl5dwOx688ZwfZLex6IKiL/gVVRni1y492/4hrgOKd/Wc9ofD 1rOjoGdSO2oIuY1Vaf/knkCpal2iwJVwzKyyPtENOrO7TiD7DOV7QvtTM2Cn3jxW1HB2 t9//tZj/REoZkvGNU8n9MLOXMhy3BNgVe7pLgCYjUsiaNLg2dJTmX6oubjHVAWrfCRSi vTcEs5hDFAnLip4lfOSyAVSVw2I+a+H3VJUSMDrp7/Q5wiEJpqruozhMW4TRacMd+Sqy Wx7g== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=8CGz9OWKU8fXXVz5vYtkl+ic+A/j55NwtxY/v4cckcM=; b=NiPIH6Od8n5/jgxjfrtWs+8/uHab1JIp6txkQOtu9uLyfw3Az5HQWpp4aDOMAPcWfg TA2pxzNYMWhN6uaa9xclK0c7MRBpkfY4144QQ2b3tSZOpVqXUz7HDotMwDeFGxouy6Fu jcpG6smUlZDxbwk5n3/C38sfz83830YW7OIXcdOqFI4WEK6vvAhlBBfvPsD2XpA/SiHr d8sdob0wUyIpZ0sl7bSdJ+dWo/ExPFlZNj/QZQ5TeVCjJ3HSXHtErRe3GEJvObocv24A jN5yMPRRsh5jrDKhxciiQFuZE9GYHO8IPK3nxCdbAfE1PRKkDKrLXiegW5uttKE1IhJ9 OrFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=NSTCVyIm; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f18si21382542ejx.521.2021.07.19.08.50.45; Mon, 19 Jul 2021 08:51:08 -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=@linuxfoundation.org header.s=korg header.b=NSTCVyIm; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345848AbhGSPFE (ORCPT + 99 others); Mon, 19 Jul 2021 11:05:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:40462 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343914AbhGSOsg (ORCPT ); Mon, 19 Jul 2021 10:48:36 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 91A5160241; Mon, 19 Jul 2021 15:25:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626708312; bh=1DNtzbH+tgS8PpZCnsvBYH72S49zNDnHKw0QlEjJDkg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NSTCVyImJUW4hwWq1IEbUjKZhHGXlPgyTW39XY6HsWK0qPFnbYSalwUlDypxhuD3J AJCGR0FgiUxKtkek9i2wodzOrFC4DAtni1EVJS2uQsP2RjjKRLPNwgkZd4plyErHqt CWJU3AVoyJMh+Nvgf+2mtMRi5OVEZZOOFy4tyzWA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Andy Shevchenko , Alexander Shishkin , Sasha Levin Subject: [PATCH 4.14 263/315] intel_th: Wait until port is in reset before programming it Date: Mon, 19 Jul 2021 16:52:32 +0200 Message-Id: <20210719144952.062229266@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144942.861561397@linuxfoundation.org> References: <20210719144942.861561397@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 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 6a451b4fc04d..4b270ed7f27b 100644 --- a/drivers/hwtracing/intel_th/core.c +++ b/drivers/hwtracing/intel_th/core.c @@ -223,6 +223,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 = @@ -243,6 +259,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 79473ba48d0c..4edc54448f31 100644 --- a/drivers/hwtracing/intel_th/gth.c +++ b/drivers/hwtracing/intel_th/gth.c @@ -521,6 +521,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 @@ -742,6 +757,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, .disable = intel_th_gth_disable, .driver = { diff --git a/drivers/hwtracing/intel_th/intel_th.h b/drivers/hwtracing/intel_th/intel_th.h index 99ad563fc40d..093a89e29ce6 100644 --- a/drivers/hwtracing/intel_th/intel_th.h +++ b/drivers/hwtracing/intel_th/intel_th.h @@ -140,6 +140,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 @@ -161,6 +162,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 (*disable)(struct intel_th_device *thdev, -- 2.30.2