Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp2141142pxy; Sun, 2 May 2021 12:51:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz56ISrjLEzDsZbWQZ3GdAJrcMTuN8cnLRNwXZrNUkT5mWN94E9IR8TC/E1seocN8a9V3PC X-Received: by 2002:a17:907:3f1c:: with SMTP id hq28mr11818916ejc.349.1619985080652; Sun, 02 May 2021 12:51:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619985080; cv=none; d=google.com; s=arc-20160816; b=iQOxd4oZ7C+lwy6AurBVTzRzull4TAgv+Q/B9APS0nUcHtcTLy99/74fI8/O6+xSAZ 1hxP6lGXOXvkZSl6i5VMhMi45hZaYMYwcHie0H9RzG1Evt7me4mqAiegZcj55wvhLV6z TYp1diMx6Cr0ZwW4YFLgXyAWg+01J1E0URl/mqZuLGWcn+c20/KbMPnLIcTAjfeEOaNk VeHtRqftm4HXE3gWTvu/QGF+VnEBS4cLi9BW0u2+ENk0IRfQismKUCCs2FipyCoy/srJ 9tHcHKONUAwwn00njQWmdq9SlEZqzQ1vnla/LWVpwK0UxZE2hdpwiHtLuNbI9I+bOnDz /RFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:mail-followup-to:message-id:subject:cc:to:from:date :dkim-signature; bh=LJl1rWi+H/YWnHh7uuzQa/Bps0BJvOfQAeiB4qm7bUE=; b=co4zN77qunHSymc9eUASJYBa+eR/oaNLEFurPPkoW6XgocMUmZRGhFf/HxPEpFFHnu y9LavkiK8A1IOUqluIpkk+GtSH0gN6ac3T9m/z+FXV1ChR+6AW0zGCIMxk7mUqiics8S 9Faymf+tGiGGp7OjJIYxjyr6QurfIUozHHr3HDJAfdR0CGOIdj1WS/Ljrgjdmfhusndk AzFpoB9FuWYC8EfYU5lLcN1hnRNEWBy0l34kwLUtjVubRhefT1hpGawaXCGqs/gLFj9T G+iS36Cu9RS+jjA7y5dPfXtL9l1FjwIzMO1fpd3erWaQ8mSCquzbSudPYDExgoz85qv3 I2jg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cosmicpenguin-net.20150623.gappssmtp.com header.s=20150623 header.b=DwSDCQo3; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i2si10134175ejp.181.2021.05.02.12.50.44; Sun, 02 May 2021 12:51:20 -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=@cosmicpenguin-net.20150623.gappssmtp.com header.s=20150623 header.b=DwSDCQo3; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232330AbhEBTr5 (ORCPT + 99 others); Sun, 2 May 2021 15:47:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59148 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230036AbhEBTr4 (ORCPT ); Sun, 2 May 2021 15:47:56 -0400 Received: from mail-io1-xd2b.google.com (mail-io1-xd2b.google.com [IPv6:2607:f8b0:4864:20::d2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 48515C06138B for ; Sun, 2 May 2021 12:47:04 -0700 (PDT) Received: by mail-io1-xd2b.google.com with SMTP id n10so123910ion.8 for ; Sun, 02 May 2021 12:47:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cosmicpenguin-net.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-disposition:in-reply-to; bh=LJl1rWi+H/YWnHh7uuzQa/Bps0BJvOfQAeiB4qm7bUE=; b=DwSDCQo3ZRKnYl3dEjBzvLVuy8s2Jdv9ranzBfHg0+tyyYLvONlP0r122FyurmPW4f caSD6pUJM1AIU2qhi2x2dF0+RO5jsVHA0FiF6JDljwvwBjyAbYjyHrirz0ymiwyvSvJD SMwOqzmvwN04RaO5atGz/xHmtVjygrMFaknqZD96mNF09kgNRJWYWMHEUrjE9IFEgUjr tn+68xsAM5El2dNIr6G8cDnT1oggiJCxRMe/BaofOZ2ZwPWpxJGnI2kpBIQxrnlf4lZy oM+3Ke873KeEJHOAzduc2Qor84mlAk+JzL5r1T1cBNmAjSbrdR7l8+Bzlv21vDrGogrr Undg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to; bh=LJl1rWi+H/YWnHh7uuzQa/Bps0BJvOfQAeiB4qm7bUE=; b=aHlNN0LzJvs/5oGXTGft2X5MfPKMAlLMU99MRhkR8KsbGcqBs/BQQqyXalxwP38w9D 13RY9sOdyt63QxPbfjReQJ4AuaV+GiA9xuSZPiSeBcBkehGUobWTQIAVG3NhccAcjjO9 NkcRPCkSe2vET2Yfzsxz23ITUTJPealVHyZcCKh2sSfwsShypJ8oKw1A0caZibdMVXb7 mZ1Gr4DwQCaeGBwEanbuFBqQSblQBc9QQR9L7/XDP6QWp1yFrF5I/teJR7Yzkj0FtcHk iMqv2ZR2eav+JcmuXbph//I1gj+7XlZVlxs9wXM0CNDMtWxK6v7GE4LWFAS2NJHv8cLJ Z9Iw== X-Gm-Message-State: AOAM533DrtP/KqULNKSSJGhL1KcC67wXSgYO41BqLU97dtP8nFCJXgKf /FyYFo6ef/tILeOLzQ20LbQPQQ== X-Received: by 2002:a02:a512:: with SMTP id e18mr8229261jam.130.1619984823577; Sun, 02 May 2021 12:47:03 -0700 (PDT) Received: from cosmicpenguin.net (c-71-237-100-236.hsd1.co.comcast.net. [71.237.100.236]) by smtp.gmail.com with ESMTPSA id g26sm4433791iom.14.2021.05.02.12.47.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 May 2021 12:47:02 -0700 (PDT) Date: Sun, 2 May 2021 13:47:00 -0600 From: Jordan Crouse To: Rob Clark Cc: dri-devel@lists.freedesktop.org, Rob Clark , Sean Paul , David Airlie , Daniel Vetter , AngeloGioacchino Del Regno , Konrad Dybcio , "Kristian H. Kristensen" , Marijn Suijten , Jonathan Marek , Sai Prakash Ranjan , Akhil P Oommen , Eric Anholt , Sharat Masetty , Douglas Anderson , "open list:DRM DRIVER FOR MSM ADRENO GPU" , "open list:DRM DRIVER FOR MSM ADRENO GPU" , open list Subject: Re: [PATCH 2/2] drm/msm: Periodically update RPTR shadow Message-ID: <20210502194700.si5jysge2gftjdpw@cosmicpenguin.net> Mail-Followup-To: Rob Clark , dri-devel@lists.freedesktop.org, Rob Clark , Sean Paul , David Airlie , Daniel Vetter , AngeloGioacchino Del Regno , Konrad Dybcio , "Kristian H. Kristensen" , Marijn Suijten , Jonathan Marek , Sai Prakash Ranjan , Akhil P Oommen , Eric Anholt , Sharat Masetty , Douglas Anderson , "open list:DRM DRIVER FOR MSM ADRENO GPU" , "open list:DRM DRIVER FOR MSM ADRENO GPU" , open list References: <20210428193654.1498482-1-robdclark@gmail.com> <20210428193654.1498482-3-robdclark@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210428193654.1498482-3-robdclark@gmail.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Apr 28, 2021 at 12:36:49PM -0700, Rob Clark wrote: > From: Rob Clark > > On a5xx and a6xx devices that are using CP_WHERE_AM_I to update a > ringbuffer read-ptr shadow value, periodically emit a CP_WHERE_AM_I > every 32 commands, so that a later submit waiting for ringbuffer > space to become available sees partial progress, rather than not > seeing rptr advance at all until the GPU gets to the end of the > submit that it is currently chewing on. Acked-by: Jordan Crouse > Signed-off-by: Rob Clark > --- > drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 29 ++++++++++++++++++++++----- > drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 27 +++++++++++++++++++------ > 2 files changed, 45 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c > index 0c8faad3b328..5202f1498a48 100644 > --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c > +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c > @@ -18,6 +18,18 @@ static void a5xx_dump(struct msm_gpu *gpu); > > #define GPU_PAS_ID 13 > > +static void update_shadow_rptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring) > +{ > + struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); > + struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu); > + > + if (a5xx_gpu->has_whereami) { > + OUT_PKT7(ring, CP_WHERE_AM_I, 2); > + OUT_RING(ring, lower_32_bits(shadowptr(a5xx_gpu, ring))); > + OUT_RING(ring, upper_32_bits(shadowptr(a5xx_gpu, ring))); > + } > +} > + > void a5xx_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring, > bool sync) > { > @@ -30,11 +42,8 @@ void a5xx_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring, > * Most flush operations need to issue a WHERE_AM_I opcode to sync up > * the rptr shadow > */ > - if (a5xx_gpu->has_whereami && sync) { > - OUT_PKT7(ring, CP_WHERE_AM_I, 2); > - OUT_RING(ring, lower_32_bits(shadowptr(a5xx_gpu, ring))); > - OUT_RING(ring, upper_32_bits(shadowptr(a5xx_gpu, ring))); > - } > + if (sync) > + update_shadow_rptr(gpu, ring); > > if (unlikely(ring->overflow)) > return; > @@ -171,6 +180,16 @@ static void a5xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit) > ibs++; > break; > } > + > + /* > + * Periodically update shadow-wptr if needed, so that we > + * can see partial progress of submits with large # of > + * cmds.. otherwise we could needlessly stall waiting for > + * ringbuffer state, simply due to looking at a shadow > + * rptr value that has not been updated > + */ > + if ((ibs % 32) == 0) > + update_shadow_rptr(gpu, ring); > } > > /* > diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c > index 4a4728a774c0..2986e36ffd8d 100644 > --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c > +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c > @@ -52,21 +52,25 @@ static bool a6xx_idle(struct msm_gpu *gpu, struct msm_ringbuffer *ring) > return true; > } > > -static void a6xx_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring) > +static void update_shadow_rptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring) > { > struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); > struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); > - uint32_t wptr; > - unsigned long flags; > > /* Expanded APRIV doesn't need to issue the WHERE_AM_I opcode */ > if (a6xx_gpu->has_whereami && !adreno_gpu->base.hw_apriv) { > - struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); > - > OUT_PKT7(ring, CP_WHERE_AM_I, 2); > OUT_RING(ring, lower_32_bits(shadowptr(a6xx_gpu, ring))); > OUT_RING(ring, upper_32_bits(shadowptr(a6xx_gpu, ring))); > } > +} > + > +static void a6xx_flush(struct msm_gpu *gpu, struct msm_ringbuffer *ring) > +{ > + uint32_t wptr; > + unsigned long flags; > + > + update_shadow_rptr(gpu, ring); > > if (unlikely(ring->overflow)) > return; > @@ -148,7 +152,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit) > struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); > struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); > struct msm_ringbuffer *ring = submit->ring; > - unsigned int i; > + unsigned int i, ibs = 0; > > a6xx_set_pagetable(a6xx_gpu, ring, submit->queue->ctx); > > @@ -184,8 +188,19 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit) > OUT_RING(ring, lower_32_bits(submit->cmd[i].iova)); > OUT_RING(ring, upper_32_bits(submit->cmd[i].iova)); > OUT_RING(ring, submit->cmd[i].size); > + ibs++; > break; > } > + > + /* > + * Periodically update shadow-wptr if needed, so that we > + * can see partial progress of submits with large # of > + * cmds.. otherwise we could needlessly stall waiting for > + * ringbuffer state, simply due to looking at a shadow > + * rptr value that has not been updated > + */ > + if ((ibs % 32) == 0) > + update_shadow_rptr(gpu, ring); > } > > get_stats_counter(ring, REG_A6XX_RBBM_PERFCTR_CP_0_LO, > -- > 2.30.2 >