From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B44B4C4338F for ; Tue, 24 Aug 2021 07:54:42 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 113396127B for ; Tue, 24 Aug 2021 07:54:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 113396127B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E8E8489D63; Tue, 24 Aug 2021 07:54:40 +0000 (UTC) Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by gabe.freedesktop.org (Postfix) with ESMTPS id 446A289D53 for ; Tue, 24 Aug 2021 07:54:39 +0000 (UTC) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mIRGW-0001QD-E3; Tue, 24 Aug 2021 09:54:36 +0200 Message-ID: Subject: Re: [PATCH 7/8] drm/etnaviv: reference MMU context when setting up hardware state From: Lucas Stach To: Christian Gmeiner Cc: The etnaviv authors , DRI mailing list , Russell King , Sascha Hauer , patchwork-lst@pengutronix.de Date: Tue, 24 Aug 2021 09:54:35 +0200 In-Reply-To: References: <20210820201830.2005563-1-l.stach@pengutronix.de> <20210820201830.2005563-7-l.stach@pengutronix.de> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.3 (3.40.3-1.fc34) MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Am Dienstag, dem 24.08.2021 um 09:24 +0200 schrieb Christian Gmeiner: > Am Fr., 20. Aug. 2021 um 22:18 Uhr schrieb Lucas Stach : > > > > Move the refcount manipulation of the MMU context to the point where the > > hardware state is programmed. At that point it is also known if a previous > > MMU state is still there, or the state needs to be reprogrammed with a > > potentially different context. > > > > Cc: stable@vger.kernel.org # 5.4 > > Signed-off-by: Lucas Stach > > Tested-by: Michael Walle > > --- > > drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 24 +++++++++++----------- > > drivers/gpu/drm/etnaviv/etnaviv_iommu.c | 4 ++++ > > drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c | 8 ++++++++ > > 3 files changed, 24 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > > index f420c4f14657..1fa98ce870f7 100644 > > --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > > @@ -641,17 +641,19 @@ void etnaviv_gpu_start_fe(struct etnaviv_gpu *gpu, u32 address, u16 prefetch) > > gpu->fe_running = true; > > } > > > > -static void etnaviv_gpu_start_fe_idleloop(struct etnaviv_gpu *gpu) > > +static void etnaviv_gpu_start_fe_idleloop(struct etnaviv_gpu *gpu, > > + struct etnaviv_iommu_context *context) > > { > > - u32 address = etnaviv_cmdbuf_get_va(&gpu->buffer, > > - &gpu->mmu_context->cmdbuf_mapping); > > u16 prefetch; > > + u32 address; > > > > /* setup the MMU */ > > - etnaviv_iommu_restore(gpu, gpu->mmu_context); > > + etnaviv_iommu_restore(gpu, context); > > > > /* Start command processor */ > > prefetch = etnaviv_buffer_init(gpu); > > + address = etnaviv_cmdbuf_get_va(&gpu->buffer, > > + &gpu->mmu_context->cmdbuf_mapping); > > > > etnaviv_gpu_start_fe(gpu, address, prefetch); > > } > > @@ -1369,14 +1371,12 @@ struct dma_fence *etnaviv_gpu_submit(struct etnaviv_gem_submit *submit) > > goto out_unlock; > > } > > > > - if (!gpu->fe_running) { > > - gpu->mmu_context = etnaviv_iommu_context_get(submit->mmu_context); > > - etnaviv_gpu_start_fe_idleloop(gpu); > > - } else { > > - if (submit->prev_mmu_context) > > - etnaviv_iommu_context_put(submit->prev_mmu_context); > > - submit->prev_mmu_context = etnaviv_iommu_context_get(gpu->mmu_context); > > - } > > + if (!gpu->fe_running) > > + etnaviv_gpu_start_fe_idleloop(gpu, submit->mmu_context); > > + > > + if (submit->prev_mmu_context) > > + etnaviv_iommu_context_put(submit->prev_mmu_context); > > + submit->prev_mmu_context = etnaviv_iommu_context_get(gpu->mmu_context); > > > > if (submit->nr_pmrs) { > > gpu->event[event[1]].sync_point = &sync_point_perfmon_sample_pre; > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c > > index 1a7c89a67bea..afe5dd6a9925 100644 > > --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c > > +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c > > @@ -92,6 +92,10 @@ static void etnaviv_iommuv1_restore(struct etnaviv_gpu *gpu, > > struct etnaviv_iommuv1_context *v1_context = to_v1_context(context); > > u32 pgtable; > > > > + if (gpu->mmu_context) > > + etnaviv_iommu_context_put(gpu->mmu_context); > > + gpu->mmu_context = etnaviv_iommu_context_get(context); > > + > > /* set base addresses */ > > gpu_write(gpu, VIVS_MC_MEMORY_BASE_ADDR_RA, context->global->memory_base); > > gpu_write(gpu, VIVS_MC_MEMORY_BASE_ADDR_FE, context->global->memory_base); > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c > > index f8bf488e9d71..d664ae29ae20 100644 > > --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c > > +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c > > @@ -172,6 +172,10 @@ static void etnaviv_iommuv2_restore_nonsec(struct etnaviv_gpu *gpu, > > if (gpu_read(gpu, VIVS_MMUv2_CONTROL) & VIVS_MMUv2_CONTROL_ENABLE) > > return; > > > > + if (gpu->mmu_context) > > + etnaviv_iommu_context_put(gpu->mmu_context); > > + gpu->mmu_context = etnaviv_iommu_context_get(context); > > + > > prefetch = etnaviv_buffer_config_mmuv2(gpu, > > (u32)v2_context->mtlb_dma, > > (u32)context->global->bad_page_dma); > > @@ -192,6 +196,10 @@ static void etnaviv_iommuv2_restore_sec(struct etnaviv_gpu *gpu, > > if (gpu_read(gpu, VIVS_MMUv2_SEC_CONTROL) & VIVS_MMUv2_SEC_CONTROL_ENABLE) > > return; > > > > + if (gpu->mmu_context) > > + etnaviv_iommu_context_put(gpu->mmu_context); > > + gpu->mmu_context = etnaviv_iommu_context_get(context); > > + > > I have seen this pattern now more than two times - maybe put the > assignment of a new mmu context into its own function? > Yea, I thought about having some Gallium style reference handling functions, but that would change the code even more. Since I intend to have this series go into stable I wanted to keep the changes to a minimum for now. I was already on the fence with the first patch in this series, but that one provides very obvious legibility improvements, making it easier to review this series. Would you agree to leave it like that for the stable series and clean it up in a follow up change? Regards, Lucas > > gpu_write(gpu, VIVS_MMUv2_PTA_ADDRESS_LOW, > > lower_32_bits(context->global->v2.pta_dma)); > > gpu_write(gpu, VIVS_MMUv2_PTA_ADDRESS_HIGH, > > -- > > 2.30.2 > > > >