Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp2102471yba; Fri, 19 Apr 2019 12:10:07 -0700 (PDT) X-Google-Smtp-Source: APXvYqzr03aUveeKsdEWM8Veo+EZSKwgcWksx7j8fjOR0s28T6Ooc8vm2pJoS/sr4Sn9Qc/MdzVc X-Received: by 2002:a63:c746:: with SMTP id v6mr5402033pgg.401.1555701007057; Fri, 19 Apr 2019 12:10:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1555701007; cv=none; d=google.com; s=arc-20160816; b=j2J2KECKwS/L0N4La1lNw6dc49uu1LxLxScAOc/T0R1N0/d/lgpSbdIpyIvfAHV7bJ erUn7OxK0UizTckQz2oTMnyfU0cRikJ+WejQ4J6XmaZPPcpL/G+IMDOmpJT6jzn3iGDU 7yezua9f0MF4tsyDWYw9Ny9P+JymwJmZuA7NhY8mweAxIT5mD4me77eFnlB9uFNmWd3b thKWxK5SxNDBmogVOBM+8C3n9+0cto3hKUOv+cFGwAryjfAnFfllNPe/V7zDJzrRekel v2RIhv6mNDc9L3PWRQwoFj2B6pgAl8slOLjdZaU5eLgAKm3MJ51efFmMpFSBylGckw0v CoHQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:organization:references:in-reply-to:date:cc:to:from :subject:message-id; bh=q5k/BK1ER3B3/fLEBHUGQ/DSzgiQUB2D4AuX9cKCyeE=; b=DLVN53gzFNsDQGTR12Zbp5n2F72KCenSn0TlQ/YlGhbWhkSEOIfw3D5ZQQXqUX5apA 1ESGppy2rRDDSirOYbbGUkZto7IfkmMN722GirQNeTE76MCvn9vgSMfcLsuYytU9Dy5B rnvSeSgB786zKyQ8Wgf0LPb/g4KO2UmlcGJXL1pFgzmuV9Jmy/0SPx83MHfJ4B6I8xZS I9vnogFNI+uTpyAhcGmsbQvqe6kz8h6j0NAR85MCLCS0tP58NK27TLH6JCS6Q5hJMA2Q or0gBZNfa+MmpYFPNx1QFCFXjL+iNEhH7PInRt96duAR7cuCupJ0qpmBqZvvo6OHvjvx bbmA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j5si6057023pfa.63.2019.04.19.12.09.52; Fri, 19 Apr 2019 12:10:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729772AbfDSTI5 (ORCPT + 99 others); Fri, 19 Apr 2019 15:08:57 -0400 Received: from mslow2.mail.gandi.net ([217.70.178.242]:41308 "EHLO mslow2.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729470AbfDSTIx (ORCPT ); Fri, 19 Apr 2019 15:08:53 -0400 Received: from relay9-d.mail.gandi.net (unknown [217.70.183.199]) by mslow2.mail.gandi.net (Postfix) with ESMTP id 7A49D3A41CA for ; Fri, 19 Apr 2019 08:52:30 +0000 (UTC) X-Originating-IP: 90.88.160.238 Received: from aptenodytes (aaubervilliers-681-1-42-238.w90-88.abo.wanadoo.fr [90.88.160.238]) (Authenticated sender: paul.kocialkowski@bootlin.com) by relay9-d.mail.gandi.net (Postfix) with ESMTPSA id 36F7BFF810; Fri, 19 Apr 2019 08:52:28 +0000 (UTC) Message-ID: <8417895942db33dcf7c63b67a4db2786638df79b.camel@bootlin.com> Subject: Re: [PATCH 4/4] drm/v3d: Fix and extend MMU error handling. From: Paul Kocialkowski To: Eric Anholt , dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, Maxime Ripard , david.emett@broadcom.com, thomas.spurden@broadcom.com Date: Fri, 19 Apr 2019 10:52:28 +0200 In-Reply-To: <20190419001014.23579-4-eric@anholt.net> References: <20190419001014.23579-1-eric@anholt.net> <20190419001014.23579-4-eric@anholt.net> Organization: Bootlin Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.32.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On Thu, 2019-04-18 at 17:10 -0700, Eric Anholt wrote: > We were setting the wrong flags to enable PTI errors, so we were > seeing reads to invalid PTEs show up as write errors. Also, we > weren't turning on the interrupts. The AXI IDs we were dumping > included the outstanding write number and so they looked basically > random. And the VIO_ADDR decoding was based on the MMU VA_WIDTH for > the first platform I worked on and was wrong on others. In short, > this was a thorough mess from early HW enabling. > > Tested on V3D 4.1 and 4.2 with intentional L2T, CLE, PTB, and TLB > faults. Didn't check the docs but looks sane too! Reviewed-by: Paul Kocialkowski Cheers, Paul > Signed-off-by: Eric Anholt > --- > drivers/gpu/drm/v3d/v3d_drv.c | 1 + > drivers/gpu/drm/v3d/v3d_drv.h | 2 ++ > drivers/gpu/drm/v3d/v3d_irq.c | 31 +++++++++++++++++++++++++++---- > drivers/gpu/drm/v3d/v3d_mmu.c | 7 +++++-- > drivers/gpu/drm/v3d/v3d_regs.h | 3 ++- > 5 files changed, 37 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c > index 7ab36192e6bc..9ce2e4ef6c2a 100644 > --- a/drivers/gpu/drm/v3d/v3d_drv.c > +++ b/drivers/gpu/drm/v3d/v3d_drv.c > @@ -494,6 +494,7 @@ static int v3d_platform_drm_probe(struct platform_device *pdev) > mmu_debug = V3D_READ(V3D_MMU_DEBUG_INFO); > dev->coherent_dma_mask = > DMA_BIT_MASK(30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_PA_WIDTH)); > + v3d->va_width = 30 + V3D_GET_FIELD(mmu_debug, V3D_MMU_VA_WIDTH); > > ident1 = V3D_READ(V3D_HUB_IDENT1); > v3d->ver = (V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_TVER) * 10 + > diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h > index 6d31a6a5a08e..64682923018d 100644 > --- a/drivers/gpu/drm/v3d/v3d_drv.h > +++ b/drivers/gpu/drm/v3d/v3d_drv.h > @@ -63,6 +63,8 @@ struct v3d_dev { > */ > void *mmu_scratch; > dma_addr_t mmu_scratch_paddr; > + /* virtual address bits from V3D to the MMU. */ > + int va_width; > > /* Number of V3D cores. */ > u32 cores; > diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c > index fac3c542860b..268d8a889ac5 100644 > --- a/drivers/gpu/drm/v3d/v3d_irq.c > +++ b/drivers/gpu/drm/v3d/v3d_irq.c > @@ -162,10 +162,33 @@ v3d_hub_irq(int irq, void *arg) > V3D_HUB_INT_MMU_PTI | > V3D_HUB_INT_MMU_CAP)) { > u32 axi_id = V3D_READ(V3D_MMU_VIO_ID); > - u64 vio_addr = (u64)V3D_READ(V3D_MMU_VIO_ADDR) << 8; > - > - dev_err(v3d->dev, "MMU error from client %d at 0x%08llx%s%s%s\n", > - axi_id, (long long)vio_addr, > + u64 vio_addr = ((u64)V3D_READ(V3D_MMU_VIO_ADDR) << > + (v3d->va_width - 32)); > + static const char *const v3d41_axi_ids[] = { > + "L2T", > + "PTB", > + "PSE", > + "TLB", > + "CLE", > + "TFU", > + "MMU", > + "GMP", > + }; > + const char *client = "?"; > + > + V3D_WRITE(V3D_MMU_CTL, > + V3D_READ(V3D_MMU_CTL) & (V3D_MMU_CTL_CAP_EXCEEDED | > + V3D_MMU_CTL_PT_INVALID | > + V3D_MMU_CTL_WRITE_VIOLATION)); > + > + if (v3d->ver >= 41) { > + axi_id = axi_id >> 5; > + if (axi_id < ARRAY_SIZE(v3d41_axi_ids)) > + client = v3d41_axi_ids[axi_id]; > + } > + > + dev_err(v3d->dev, "MMU error from client %s (%d) at 0x%llx%s%s%s\n", > + client, axi_id, (long long)vio_addr, > ((intsts & V3D_HUB_INT_MMU_WRV) ? > ", write violation" : ""), > ((intsts & V3D_HUB_INT_MMU_PTI) ? > diff --git a/drivers/gpu/drm/v3d/v3d_mmu.c b/drivers/gpu/drm/v3d/v3d_mmu.c > index 7a21f1787ab1..395e81d97163 100644 > --- a/drivers/gpu/drm/v3d/v3d_mmu.c > +++ b/drivers/gpu/drm/v3d/v3d_mmu.c > @@ -69,10 +69,13 @@ int v3d_mmu_set_page_table(struct v3d_dev *v3d) > V3D_WRITE(V3D_MMU_PT_PA_BASE, v3d->pt_paddr >> V3D_MMU_PAGE_SHIFT); > V3D_WRITE(V3D_MMU_CTL, > V3D_MMU_CTL_ENABLE | > - V3D_MMU_CTL_PT_INVALID | > + V3D_MMU_CTL_PT_INVALID_ENABLE | > V3D_MMU_CTL_PT_INVALID_ABORT | > + V3D_MMU_CTL_PT_INVALID_INT | > V3D_MMU_CTL_WRITE_VIOLATION_ABORT | > - V3D_MMU_CTL_CAP_EXCEEDED_ABORT); > + V3D_MMU_CTL_WRITE_VIOLATION_INT | > + V3D_MMU_CTL_CAP_EXCEEDED_ABORT | > + V3D_MMU_CTL_CAP_EXCEEDED_INT); > V3D_WRITE(V3D_MMU_ILLEGAL_ADDR, > (v3d->mmu_scratch_paddr >> V3D_MMU_PAGE_SHIFT) | > V3D_MMU_ILLEGAL_ADDR_ENABLE); > diff --git a/drivers/gpu/drm/v3d/v3d_regs.h b/drivers/gpu/drm/v3d/v3d_regs.h > index eda1e289976f..9bcb57781d31 100644 > --- a/drivers/gpu/drm/v3d/v3d_regs.h > +++ b/drivers/gpu/drm/v3d/v3d_regs.h > @@ -152,7 +152,8 @@ > # define V3D_MMU_CTL_PT_INVALID_ABORT BIT(19) > # define V3D_MMU_CTL_PT_INVALID_INT BIT(18) > # define V3D_MMU_CTL_PT_INVALID_EXCEPTION BIT(17) > -# define V3D_MMU_CTL_WRITE_VIOLATION BIT(16) > +# define V3D_MMU_CTL_PT_INVALID_ENABLE BIT(16) > +# define V3D_MMU_CTL_WRITE_VIOLATION BIT(12) > # define V3D_MMU_CTL_WRITE_VIOLATION_ABORT BIT(11) > # define V3D_MMU_CTL_WRITE_VIOLATION_INT BIT(10) > # define V3D_MMU_CTL_WRITE_VIOLATION_EXCEPTION BIT(9) -- Paul Kocialkowski, Bootlin Embedded Linux and kernel engineering https://bootlin.com