From nobody Sun Jul 26 01:50:07 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3C183C4B9A for ; Fri, 10 Jul 2026 12:03:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783685030; cv=none; b=AWSnfmG5DiHQb0KYk4yBC+SuT4dM9haKGlQVNlG0QxSEyk2mwBs+cha6CD9EJEjvQ5NBw6F7ndGPN8uupDPjpRN6kyeq+p4kEaLMhEMar8BhsOmE2rSBERWguwj64z/WwiaaPXo0yP6W8iuKP5RTiLolL7v8w+H6Jq0sS2xZbwY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783685030; c=relaxed/simple; bh=JATrW61bRY9dGDHzPhc5noQeaPHurL2NgwKCX7yU2wA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d/KMgEt5tAqny/SBVGdkPpZBafYCk61oW/+YYVZbusWo1iFD3OOp9gfk+MBSQFasfsp/GcHp2LmmML+Cc2tBKNROBWLGdIQKEF9Hpa1VtunuQ/0ejt58NXSh4Nee7wbLIGL4ecAHOvBp7dkHhOMPqRWXnM4ZDjb8kGgANq93Rd0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PQt88hLI; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PQt88hLI" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-472326ca506so659716f8f.2 for ; Fri, 10 Jul 2026 05:03:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783685027; x=1784289827; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=yd1dFdW3DE1YeT+fprMXo0jAXkdXd9jG5OHl8Qzt964=; b=PQt88hLIr1lJE9tDVo4RjaN7oUo8FUG6M6T+EqKko5SWLDCkshWuunM2CFHsWvUHVT crtVplkk2hUtJRH3/FIUFNs1ct+NW3xu/j/nBl23ErqnDEkpMekEh/URtKvfTa6bPo60 U3QVCyd0DX7Os1HwAsrInSJ5TYLa8A0+77A0vk44Wamwt15cHhAZXUPB8E6fTR6wYVCH MphA4Bg8Rog8u2XGs3NEGk1Mx1+9oQYrolkrKdhHw80ZnhCzi/ppG0B1JEsMy1NRB3Fr o5ZsuLJ/eh5g8+d2cEx49jwJPbSQL5RqT88PO77n6IyVDpmi/VcERM44FIMuBRfl/lH6 4hNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783685027; x=1784289827; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=yd1dFdW3DE1YeT+fprMXo0jAXkdXd9jG5OHl8Qzt964=; b=P1wAt03p8ij4zgrYnkNYVINulXodkpDqeHCWabglzDxtwL3ZS2n3FvAW7aBYLfJoHE rTB1zNe9ZZtyzKRaZy+NRXsZ0a3GJIxQwzbAGVlhgWhMp8sOqQDI/6+b/iqXoDd2Gydr GjE8w1nWDyit5zXagbjBpBGDouQrJ0UbwDbzGAw+yIvJYhd/q2wo/qpXrMb8ofvVBEZD a3y+wCYu66VOzAzksdnI08wwI8X/R9LD2/I+S/4/TCXbc0MACyfsjPpgfENV3vls23uA +gd9R/thp0Y5h6N5eZgDZG19vLNg30pgK8+NsjSXmyqgfk2b4LSMy9wx8xOk8ExRcnJh Wb5g== X-Forwarded-Encrypted: i=1; AHgh+Ro/7XlmBC5kym5C7M1CoruZPSb3r0ttOH/U54S0ZHtRgAUajyB2kPXSEGjMsDCDYL1QI92PNExBnEm7EVo=@vger.kernel.org X-Gm-Message-State: AOJu0Ywu3uL708To6aFSge3pBU0X05hJsgoBM9pzGk9JklM4bGtNp8Oa aSZhzI7Zu2QCkU3FVd5Ic3/eIOqqK1pxGQrjsu4S1iy+zOMuw5V7vyqykqY+yn92 X-Gm-Gg: AfdE7cnFfMexgsiRyeF4pT/Yg1UiHHfpAa5RzooaHTBWsU7zBm6tfmUvTmf7Lg5wHLn c72k7cJJZ3sn2lvpbM245SwRRmS21QK127EXJgbYcieCa5dDel/CTG+xjSBTFizTnQgFbrzovDJ KZxYKCaWDtk183ysG3QW76E13ZHs0veFAda4lfKIySgEAExuk1FyjAQllOZAhgsa/Rb3RqeaZXF 6zMWftnq1cXL5aUyekU4lFPz+OZ5MByYreBlmYnQTnj6G1SyATgAx0A6tYhJQVs1zfUoeyvxfb7 8DIKoXYIvQzXr4ibCZrYnpzoZuHHMHHq3BeIkCq03pKXIsHCI7g5PM4ozBcuJK7Nz3OR86egzd5 GTOgA+yr9eq0dUjAdRliEwYPyCH3EOUrFutCZdnWVQl/X7szDD2PUzty94WchQziQl+bf4x3Z+j VQuGwOc56mJa06gcpi5zuPDIFKRmbdFgDXOOUmMbNzuBTk5sMe8BmNoOQujfUwkVJoileIjgx6V X/f2czC592TI29CRVy6VAKsWCTStyMiJw== X-Received: by 2002:a05:6000:41ee:b0:46e:6210:ad4a with SMTP id ffacd0b85a97d-47df071e518mr11370482f8f.5.1783685026628; Fri, 10 Jul 2026 05:03:46 -0700 (PDT) Received: from localhost.localdomain (62-178-82-42.cable.dynamic.surfer.at. [62.178.82.42]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47a9e4d83bdsm59637487f8f.13.2026.07.10.05.03.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 05:03:46 -0700 (PDT) From: Christian Gmeiner Date: Fri, 10 Jul 2026 14:03:42 +0200 Subject: [PATCH v3 1/2] drm/etnaviv: Reference count struct etnaviv_file_private Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-etnaviv-reset-notification-v3-1-7a145c8a1d01@igalia.com> References: <20260710-etnaviv-reset-notification-v3-0-7a145c8a1d01@igalia.com> In-Reply-To: <20260710-etnaviv-reset-notification-v3-0-7a145c8a1d01@igalia.com> To: Lucas Stach , Russell King , Christian Gmeiner , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel-dev@igalia.com, Christian Gmeiner X-Mailer: b4 0.14.3 From: Christian Gmeiner The next commit updates per-context data from the GPU reset path, which runs in the scheduler timeout worker. This can race with closing the DRM file: drm_sched_entity_flush() only waits until the entity queue is empty, it does not wait for jobs still running on the hardware. So the context can already be freed while the reset path still needs it. Reference count the context and let every submit hold a reference, the same way a submit already keeps its mmu context and pid alive. No functional change. Signed-off-by: Christian Gmeiner Reviewed-by: Lucas Stach --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 17 ++++++++++++++++- drivers/gpu/drm/etnaviv/etnaviv_drv.h | 11 +++++++++++ drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 5 ++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnavi= v/etnaviv_drv.c index 08aca9035fc1..a27ed014fb4e 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -60,6 +60,19 @@ static void load_gpu(struct drm_device *dev) } } =20 +static void etnaviv_file_private_release(struct kref *kref) +{ + struct etnaviv_file_private *ctx =3D + container_of(kref, struct etnaviv_file_private, refcount); + + kfree(ctx); +} + +void etnaviv_file_private_put(struct etnaviv_file_private *ctx) +{ + kref_put(&ctx->refcount, etnaviv_file_private_release); +} + static int etnaviv_open(struct drm_device *dev, struct drm_file *file) { struct etnaviv_drm_private *priv =3D dev->dev_private; @@ -70,6 +83,8 @@ static int etnaviv_open(struct drm_device *dev, struct dr= m_file *file) if (!ctx) return -ENOMEM; =20 + kref_init(&ctx->refcount); + ret =3D xa_alloc_cyclic(&priv->active_contexts, &ctx->id, ctx, xa_limit_32b, &priv->next_context_id, GFP_KERNEL); if (ret < 0) @@ -120,7 +135,7 @@ static void etnaviv_postclose(struct drm_device *dev, s= truct drm_file *file) =20 xa_erase(&priv->active_contexts, ctx->id); =20 - kfree(ctx); + etnaviv_file_private_put(ctx); } =20 /* diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnavi= v/etnaviv_drv.h index 55a9e745604d..cba4323ae589 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h @@ -7,6 +7,7 @@ #define __ETNAVIV_DRV_H__ =20 #include +#include #include #include #include @@ -29,6 +30,7 @@ struct etnaviv_iommu_global; #define ETNAVIV_SOFTPIN_START_ADDRESS SZ_4M /* must be >=3D SUBALLOC_SIZE = */ =20 struct etnaviv_file_private { + struct kref refcount; int id; struct etnaviv_iommu_context *mmu; struct drm_sched_entity sched_entity[ETNA_MAX_PIPES]; @@ -53,6 +55,15 @@ struct etnaviv_drm_private { struct etnaviv_cmdbuf *flop_reset_data_ppu; }; =20 +void etnaviv_file_private_put(struct etnaviv_file_private *ctx); + +static inline struct etnaviv_file_private * +etnaviv_file_private_get(struct etnaviv_file_private *ctx) +{ + kref_get(&ctx->refcount); + return ctx; +} + int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, struct drm_file *file); =20 diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm= /etnaviv/etnaviv_gem_submit.c index 1a77a09b3377..98f1f59a8b05 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c @@ -398,6 +398,9 @@ static void submit_cleanup(struct kref *kref) =20 put_pid(submit->pid); =20 + if (submit->ctx) + etnaviv_file_private_put(submit->ctx); + kfree(submit->pmrs); kfree(submit); } @@ -526,7 +529,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, vo= id *data, if (ret) goto err_submit_put; =20 - submit->ctx =3D file->driver_priv; + submit->ctx =3D etnaviv_file_private_get(file->driver_priv); submit->mmu_context =3D etnaviv_iommu_context_get(submit->ctx->mmu); submit->exec_state =3D args->exec_state; submit->flags =3D args->flags; --=20 2.54.0 From nobody Sun Jul 26 01:50:07 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B94E43F7869 for ; Fri, 10 Jul 2026 12:03:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783685031; cv=none; b=TZ449noEFxLpq9bIMattDzH2uvAx6Lh+q62UzS7NElLYw5uYjXFrM98FbiuR8wHbCd0oZrRL1F7z13LXqYE3thPEQyTI4CjuvkFumcHJZN/4kmJf8NG5iI3n5+YlcHNC2iuwDey9Nhbg25XneAoA3BsJD0dIzeJTsVxBclRGjC8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783685031; c=relaxed/simple; bh=LSyYu++y0o52Z5jSZME2ozryxW4K4Esr/mj+qlp5Llw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TqXwYeQP60Qgb8fAQiprZtoMjpMAvKG171SOOisGnbNWyTCvxnuZCP3f3wS5rIo90hMA+kyGNVWXDoyKBE7Ql/6+KqWIknPWbTIOBjcYAdY6/5Ukbc38upcyYj09DWPVLhoomw8NPleeWZz5Qm5dz1TTiXAin6iMMcjN1prU8qk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=K4hxFSdY; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="K4hxFSdY" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-475881b9a4bso834919f8f.3 for ; Fri, 10 Jul 2026 05:03:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783685028; x=1784289828; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=CDXfk8heR8E8obrxXeseruKu7LCdsmZqgLzu+ejBn3M=; b=K4hxFSdYgUWrVoi5jb9JSmby+43ndrwSXRVJsVV2/c4QLskk4jgMPSK4OA0+vFUaVf oR7pvsuszAiz7ez6AdoPPDqcC8tHAY/eThlpVk4073n3OZZnuDWdDKOgT8Zh+oXMSdaA 0zlgv8JgHbHsv1YP43FVH7JYKR2/0M89d3i8KEHdJF8UeiISnBN0b4xfnPRbXwq9T+q+ kMDqYrSnccLftL9eH91W1MUd7/SaQDZNJrmNqT3tQErDow05nbswrbzGWvg9AN2qPEa5 racrTGIEsoGY2DumqlKDJLq7YanPUVEyvese7ZO+gcX/RGcGiw0uuaQmYrIkTaUihCgs qJ1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783685028; x=1784289828; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=CDXfk8heR8E8obrxXeseruKu7LCdsmZqgLzu+ejBn3M=; b=kjFPTWxITA/r/EOQ5oRLGjsbIsJT+Y0OoSf3QyaXKa9PLV4AvLc9tsEFIWIDjGmUxp E4wWsi4oDQ7pEgDDe+GSXmpZnQd75xCIIgbDifPf8pjluCm9oavX3EV2Qts2FdeuIg2f wmXRkxerntnYKswg+DRKjw5mHjFTbXdHrm9cl3i8DgQC4eIz7fKfMJsbEbLhLikOnJ3N Aq1WZxMpAIAg6lgQAHdH8CALnuqute32mxZ5HUD3HWJVk0F8eG9zPtV5XCC1FoYX5IP/ 0Clzhr71V26y6xPm9C7qIlSdRbCpQVvNIqMpZ1EsDVbjfOG7WSSkY5cajzuEH9yR97po iXKA== X-Forwarded-Encrypted: i=1; AHgh+RopeZ+fKIQJrVQpma8/Ic4NV0CqtI3XzveEGqVDdH1F/d+6pg2jNP5gS9hKkRG4tCL+q2FuQipNh2iwH5Q=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8W4FvmH4Pd8UyMpfubWdGXPN/sBLj2AMOUz5gxaciYeqxUzYG h6XBnQHKOYo1TmBRdkoaKdQFOs8MXEwckai4E2UWTduBf/3zN4SYrx4+6Poh635q X-Gm-Gg: AfdE7clwc58vr7GOQSn+ayKyNYewjONCaG0p2SswqLSpTKa3QXgw+QrYlL9+fiNSXpE dMxC+W+205fqkSnRBwO/lYbUy2WRh1SdFc9IGaFrgvvzLe3xAI9/XAka62qUOv0bXB68tCk/2eV 4DA9EvhYEXfiIgp7ySeaHEYv2lU8GZqv6+aFK68O1D4BF1Lo9QG7uol8zkCeR2XMLjSJvsJ0/A9 AOIQHadC6Q82sztcnL+QLhFzimFhGfZe1HNp2MGZ/bRH1HI0BsrHJ3PU9kkUD0j3WmJzsZn3+Oa nmoSyZQ5LVIlFEKaiD2i9XVw58sUUmMK5GGpdFMQp9XQlZ3s7PziAWOs5kMcQsczGMCg6pYd2SW G13Q4Dk6L3sWviD+8BOoZS9UwY0ezeRHyhrq+ROsde/B2dVf+szw++dfYcBIu2OGiygRLRCoMzB IAe9wQzJ1wufJobbMLkciJgqnUUuLZ+iur+mvUsXC3oc8xDHCbIXyI9LISQ1Uojk3/SPJAY9h5X 5bycUjWLkyur7rOYjvD0qIqWKQwutyZSQ== X-Received: by 2002:a05:6000:400f:b0:460:6a13:9131 with SMTP id ffacd0b85a97d-47df07238f9mr12877850f8f.19.1783685028028; Fri, 10 Jul 2026 05:03:48 -0700 (PDT) Received: from localhost.localdomain (62-178-82-42.cable.dynamic.surfer.at. [62.178.82.42]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47a9e4d83bdsm59637487f8f.13.2026.07.10.05.03.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 05:03:47 -0700 (PDT) From: Christian Gmeiner Date: Fri, 10 Jul 2026 14:03:43 +0200 Subject: [PATCH v3 2/2] drm/etnaviv: Add GPU reset counters Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260710-etnaviv-reset-notification-v3-2-7a145c8a1d01@igalia.com> References: <20260710-etnaviv-reset-notification-v3-0-7a145c8a1d01@igalia.com> In-Reply-To: <20260710-etnaviv-reset-notification-v3-0-7a145c8a1d01@igalia.com> To: Lucas Stach , Russell King , Christian Gmeiner , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel-dev@igalia.com, Christian Gmeiner X-Mailer: b4 0.14.3 From: Christian Gmeiner The OpenGL and Vulkan robustness extensions let an application detect a GPU reset and check if its own context caused it, so the application can drop the broken context and build a new one. The kernel knows both facts, but etnaviv has no way to report them to userspace. Add two counters and a RESET_QUERY ioctl that returns both in one call: a per-GPU counter that counts every reset of that GPU, and a per-context counter that only counts the resets this context was guilty of. Userspace compares the counters with saved values: if the context counter moved the context was guilty, if only the GPU counter moved the context was an innocent victim. The GPU counter is per GPU core and not per device, so a hang on one pipe does not look like an innocent reset to contexts that only use another pipe. The timeout handler updates both counters and the ioctl reads both under the GPU lock. Without the lock the query could run between the two updates, see only the GPU counter move and report an innocent reset to the guilty context. Bump the driver minor version so userspace can detect the feature. Signed-off-by: Christian Gmeiner Reviewed-by: Lucas Stach --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 29 ++++++++++++++++++++++++++++- drivers/gpu/drm/etnaviv/etnaviv_drv.h | 1 + drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 2 ++ drivers/gpu/drm/etnaviv/etnaviv_sched.c | 5 +++++ include/uapi/drm/etnaviv_drm.h | 19 ++++++++++++++++++- 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnavi= v/etnaviv_drv.c index a27ed014fb4e..5c50e5a24408 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -296,6 +296,32 @@ static int etnaviv_ioctl_get_param(struct drm_device *= dev, void *data, return etnaviv_gpu_get_param(gpu, args->param, &args->value); } =20 +static int etnaviv_ioctl_reset_query(struct drm_device *dev, void *data, + struct drm_file *file) +{ + struct etnaviv_drm_private *priv =3D dev->dev_private; + struct etnaviv_file_private *ctx =3D file->driver_priv; + struct drm_etnaviv_reset_query *args =3D data; + struct etnaviv_gpu *gpu; + + if (args->flags) + return -EINVAL; + + if (args->pipe >=3D ETNA_MAX_PIPES) + return -EINVAL; + + gpu =3D priv->gpu[args->pipe]; + if (!gpu) + return -ENXIO; + + mutex_lock(&gpu->lock); + args->global_reset_counter =3D gpu->reset_counter; + args->context_reset_counter =3D ctx->reset_counter; + mutex_unlock(&gpu->lock); + + return 0; +} + static int etnaviv_ioctl_gem_new(struct drm_device *dev, void *data, struct drm_file *file) { @@ -502,6 +528,7 @@ static const struct drm_ioctl_desc etnaviv_ioctls[] =3D= { ETNA_IOCTL(GEM_WAIT, gem_wait, DRM_RENDER_ALLOW), ETNA_IOCTL(PM_QUERY_DOM, pm_query_dom, DRM_RENDER_ALLOW), ETNA_IOCTL(PM_QUERY_SIG, pm_query_sig, DRM_RENDER_ALLOW), + ETNA_IOCTL(RESET_QUERY, reset_query, DRM_RENDER_ALLOW), }; =20 static void etnaviv_show_fdinfo(struct drm_printer *p, struct drm_file *fi= le) @@ -530,7 +557,7 @@ static const struct drm_driver etnaviv_drm_driver =3D { .name =3D "etnaviv", .desc =3D "etnaviv DRM", .major =3D 1, - .minor =3D 4, + .minor =3D 5, }; =20 /* diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnavi= v/etnaviv_drv.h index cba4323ae589..9c348aa7f8d3 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h @@ -34,6 +34,7 @@ struct etnaviv_file_private { int id; struct etnaviv_iommu_context *mmu; struct drm_sched_entity sched_entity[ETNA_MAX_PIPES]; + u32 reset_counter; }; =20 struct etnaviv_drm_private { diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h b/drivers/gpu/drm/etnavi= v/etnaviv_gpu.h index 5cb46c84e03a..a97780131426 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.h +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.h @@ -148,6 +148,8 @@ struct etnaviv_gpu { u32 hangcheck_primid; u32 hangcheck_fence; =20 + u32 reset_counter; + void __iomem *mmio; int irq; =20 diff --git a/drivers/gpu/drm/etnaviv/etnaviv_sched.c b/drivers/gpu/drm/etna= viv/etnaviv_sched.c index 139e6e38784b..6e9b677122e3 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c @@ -79,6 +79,11 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_jo= b(struct drm_sched_job if(sched_job) drm_sched_increase_karma(sched_job); =20 + mutex_lock(&gpu->lock); + gpu->reset_counter++; + submit->ctx->reset_counter++; + mutex_unlock(&gpu->lock); + /* get the GPU back into the init state */ etnaviv_core_dump(submit); etnaviv_gpu_recover_hang(submit); diff --git a/include/uapi/drm/etnaviv_drm.h b/include/uapi/drm/etnaviv_drm.h index af024d90453d..b50a3a0799e6 100644 --- a/include/uapi/drm/etnaviv_drm.h +++ b/include/uapi/drm/etnaviv_drm.h @@ -265,6 +265,21 @@ struct drm_etnaviv_pm_signal { char name[64]; /* out, name of domain */ }; =20 +/* + * Reset status query: + * + * Both counters start at zero and only ever increase. Userspace saves + * both values and compares them on a later query: if the context + * counter moved this context caused a reset, if only the global + * counter moved the GPU was reset on behalf of another context. + */ +struct drm_etnaviv_reset_query { + __u32 pipe; /* in */ + __u32 flags; /* in, must be 0 */ + __u32 global_reset_counter; /* out, all resets of this GPU core */ + __u32 context_reset_counter; /* out, resets caused by this context */ +}; + #define DRM_ETNAVIV_GET_PARAM 0x00 /* placeholder: #define DRM_ETNAVIV_SET_PARAM 0x01 @@ -279,7 +294,8 @@ struct drm_etnaviv_pm_signal { #define DRM_ETNAVIV_GEM_WAIT 0x09 #define DRM_ETNAVIV_PM_QUERY_DOM 0x0a #define DRM_ETNAVIV_PM_QUERY_SIG 0x0b -#define DRM_ETNAVIV_NUM_IOCTLS 0x0c +#define DRM_ETNAVIV_RESET_QUERY 0x0c +#define DRM_ETNAVIV_NUM_IOCTLS 0x0d =20 #define DRM_IOCTL_ETNAVIV_GET_PARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_ETN= AVIV_GET_PARAM, struct drm_etnaviv_param) #define DRM_IOCTL_ETNAVIV_GEM_NEW DRM_IOWR(DRM_COMMAND_BASE + DRM_ETN= AVIV_GEM_NEW, struct drm_etnaviv_gem_new) @@ -292,6 +308,7 @@ struct drm_etnaviv_pm_signal { #define DRM_IOCTL_ETNAVIV_GEM_WAIT DRM_IOW(DRM_COMMAND_BASE + DRM_ETNA= VIV_GEM_WAIT, struct drm_etnaviv_gem_wait) #define DRM_IOCTL_ETNAVIV_PM_QUERY_DOM DRM_IOWR(DRM_COMMAND_BASE + DRM_ETN= AVIV_PM_QUERY_DOM, struct drm_etnaviv_pm_domain) #define DRM_IOCTL_ETNAVIV_PM_QUERY_SIG DRM_IOWR(DRM_COMMAND_BASE + DRM_ETN= AVIV_PM_QUERY_SIG, struct drm_etnaviv_pm_signal) +#define DRM_IOCTL_ETNAVIV_RESET_QUERY DRM_IOWR(DRM_COMMAND_BASE + DRM_ETN= AVIV_RESET_QUERY, struct drm_etnaviv_reset_query) =20 #if defined(__cplusplus) } --=20 2.54.0