From nobody Sun Jul 26 01:57:16 2026 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (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 A1F3513AA2F for ; Fri, 10 Jul 2026 09:00:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783674055; cv=none; b=V8Ci1eJIyQncVfVngiiCv6gcZc8pIWiuDLTQggpJcb97cUn8I8FUX8+tjFigWZ6Wg5RJwiAdS7hscj2lB+laqIcP1uMR8rwrydYI0K2PVLyhXI0MERsQvd/G8atfe1CMHU/wM/nmEFDC+smoANidHAABur32UlaPZUkYEyrsdgI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783674055; c=relaxed/simple; bh=JATrW61bRY9dGDHzPhc5noQeaPHurL2NgwKCX7yU2wA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eT5dBvBQConiISX9U2dJzP00smWJwml0wEpRUiY8H6cqHr9dBtJIOLKxWGG1S2laaUG2zdYKGBmNIiUockvjptJuOXRl5fF8ivWXZM3tYfTPqgve+fz9Rgnl62pW/tUm6LFf+gVX2UghDgljF4CcL7nlzPZWVIEqoCQ3RLYy33g= 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=reyhHQLV; arc=none smtp.client-ip=209.85.221.43 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="reyhHQLV" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-47122683cf3so410795f8f.0 for ; Fri, 10 Jul 2026 02:00:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783674052; x=1784278852; 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=reyhHQLVLP00oTp7ApSCNSqKk5I2WQzeU9jZ9/vkqtOzK8v8KQ9y2yp3AV73bAwgUU SEvjY6+2/5VJi6+jKOgSOQnJJDhTWuARfsEEWCHAQnOSwX70iYb590WtNwSsCPq3o4cV 9NtgvszaDwr3kaY03Za9B/HEG0wjf1SXq9NExJzhuejm3BahpwgE0RoQfIae0Sh3EtIs tii6XNh8EFtg5HIk/ydlj8Ox3FpfSNzs4/XCX6sxloTEZcH1FLodRS/aD2kV8dpNRaYD nwnvMvixKQ+0d2tmgcN754ecK8xynpPshEVBg504xbkclnyW0tvXCNgrrajzBUO2zMPK Uhyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783674052; x=1784278852; 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=YYkHa8oxnor2RnBTNvHbfXgiRP5Lou29Tai9GbKkb1lvgp8860CCzRDio8y3/NB++H saKrR4wXh8qxX02er6qHypVkX72/wSxI1ma7k8irPw5frnxjMPtL+Tq36xjcFWXUaRqA WqPhPg/HccgJRnVjl6Ckgahu5wwBi3T2RGRji6K3rircqdhwy5YeVJ1NvySqampel1Hx 3VZfVhK55oRbbHl+FA6WRVjVX1MSywYrrKgmLbZTCPraA62EwPsEQCf688uLj+Y/OG5N U5dJX22SJigSYsAPC4h9s1ETHCo4QZG7Y77DmYXS5brMVZel9XoyrejPsZDZ42276ELJ Yq3g== X-Forwarded-Encrypted: i=1; AHgh+Ropy3tQImyi1mHoKpARGRG25MgCnrmcEK5wWJgtODNFwcxpEBPMqdFBECNZ7Ttp3Y30T+kaxdOeY1pf6kM=@vger.kernel.org X-Gm-Message-State: AOJu0YwcXpzEGkUbLJsddOXgd5MlKhPSxLvhjMp9Ce5nTWoenvLkOHKV g1lFpqZrmGCbxBD7PIx7mr2nG4iQVu4cmQhx1n2mofDQXBDBweCOztsP X-Gm-Gg: AfdE7cmMCoC/KyXdwFwM6Kipeq7G0BxA1Py9N0Gdli4VtktGGjKht2RzprtRkgi0WNI mMpinVwU70QqX6voZA8hTembgW+Rg8uOr1PSxbrw4e7MOR/1pugZiGNlpXnZ1MCCt+rHZ4qCPb+ swBnDUH/48OBICt+t2EFcRGRA38kexZmXRkPnQSnYXlfydH8XoejGKOJBvKI8QaqFzbZ7xk15Jw UXNujz6F/sNR38cZk+XMM4ncUkBuopyfv053eFStNiONB9wWgBBG+FQP5Kn+XRj3gtzIfaVqL89 hEp/5pjZUk+YUXWgeUGiSdc2n64KZ5SB+0yoERt8k+Au+kYFKir222MjwmMd27QFJwISUkx+QKc oTx87VtKxlXjvnfghXzHjJNUcMPwiCc4BhUs0uMY79KOwZUzTdUdrv+/P7uQLS7JI0Yz3dOc3Ig Lauhn0kmhnqBQNx5cbK91/WZdTJHx2S9j67FJYkvaqlz89XbYTjQknNk1gzD/o1CS6QlA8tLWeT EeTm4FFSR3bTAG7Lt47cS+MGmnH3jirtA== X-Received: by 2002:a05:6000:41fe:b0:47d:efd0:c026 with SMTP id ffacd0b85a97d-47df071e085mr11361324f8f.11.1783674051647; Fri, 10 Jul 2026 02:00:51 -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-47aa039b0cesm59386076f8f.22.2026.07.10.02.00.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 02:00:50 -0700 (PDT) From: Christian Gmeiner Date: Fri, 10 Jul 2026 11:00:46 +0200 Subject: [PATCH v2 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-v2-1-90cfebcf22a2@igalia.com> References: <20260710-etnaviv-reset-notification-v2-0-90cfebcf22a2@igalia.com> In-Reply-To: <20260710-etnaviv-reset-notification-v2-0-90cfebcf22a2@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 --- 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:57:16 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 A485F3D1702 for ; Fri, 10 Jul 2026 09:00:55 +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=1783674057; cv=none; b=oUQCufOZyFAtTqfkFoSjfPKkYF4yeEec2y2zSHrV5kPTbo8DHyRkdBYm8INmR5X/jUhqzOmf/HxVw63q6blwrigpFLS33FxsrOvbekw0t9c/rMpdk1jPN0BTrO/K8nwTaSsSW9TnyH5vUkKHWL8cP+Ezm/FJ6GctG9WCh6yF6WA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783674057; c=relaxed/simple; bh=9GjDGRlnQuohGkegzX1+ROksUj9qJIEf3c2UejIO06E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=W7JiaLekYtIz/IoscATYG5cm6lpLRdSJ+PrnhqSUEG51pmyCnlLD7qSbxHI1KDHpDFFt1FO9EEcgf68ptGDCoC8bJR4wTMU5xr0av6ruxhp63IQtabQz7T4ufc2IkF1O/kjjG6uMvWmsxIC7t7O6CLjNvLuDvJ2Suy5IuxRJ6FY= 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=W/rJf6iF; 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="W/rJf6iF" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-47d70879764so434627f8f.2 for ; Fri, 10 Jul 2026 02:00:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783674054; x=1784278854; 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=d88mOIKGx152JzuQ0UteO0AFL78iVyam0iMSZwLmwFs=; b=W/rJf6iFJaQStKGTnSnm4Zafxzfl95BsAMNxo9gVwUgdfqO3HkOCuOy3/wu7L+hiEE YbkL6xOAQWg8d7qgK54JHXojseu0wdyfb3pIyLNS3gtIIqJDRXajIbB3Dr8E9f77GDY2 hQ2Qm6tcqNpv/I0O1kRUhTReamr7PFebKNU3Pb/iNY5O3vycWh70X/FAUc3YpLPueac2 SZGcog4retBnxIj3ZuLrYZ/Az7MN/nmBTre8ioGNnvIF7kl7Yl1FxA4RzlvKkbGIH7pf nXeup5mFwy6UnyWKLmrz5MPbP7sTaA4O4yD7/ngLR4HpxfDQyiLo25RWlVCCNyS9fqwt 25tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783674054; x=1784278854; 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=d88mOIKGx152JzuQ0UteO0AFL78iVyam0iMSZwLmwFs=; b=T5WC2lHuOTI/1ZYZnPeGCqMPLmFyk+DexFsJ78oJtxj+vzR4h3wfIpCmBPSAUsb2JN 8c3pC0CMpO97nbj71VwafpxaaiYoC+4Qwq0fU8+8UDwM3m0Bl2wa27D2iMZNZQ73vp6t r8+0O2d0UL45JekFlQmZKfJovNai+anmEKjW0n4jq85IOFhCPsocUeEviv6HUXsFxqop 2MZCAMLqoWY4ePvZBqpwD+QozY6O5GcFikkbDRia8ZDt5at0Tzpi3081zDyNXVdl5jcR /xSmQAXiC2fZLBmEVwTCsx97Ff3a9CvbvgGpjb5R+veV9hYXqKrntsd8S95sMvczRIMc ozCw== X-Forwarded-Encrypted: i=1; AHgh+RoZ2z4NgEKT8pZ5wUllBXrg+DjGLsEqYrO/j16raDM4g3blN4ADNK9xKECqzyvEhlqShNAHkC88GWAmHzU=@vger.kernel.org X-Gm-Message-State: AOJu0YzC1l18vf9VYKlBkSVDPFRDO8eqY+n/Hn1i4B22YObQFOzCyvSR Uj8m3WAcglStktyF0WY2jw7he6mnZXzKpg/smloIcya9B/egjl9M/00a X-Gm-Gg: AfdE7ckbvqYCAiKxAp7Ok048zNldSU6Hi1nW8lU6g6+PtleryWTdjNSl3xuEpyVrLte II63NtAUVn9RpoYHuC24i390p0B+ehXHATPNHvbpNMy/Ap1iws8nSADp34PjjZGwDi/S0qJPo0Z Ven1lsWmbQ7kXdSZXxKe+V1dt/jjmdtDWMvK+zIR9YH9E4HqRhFG2KF2PxTKcsmUxMXvHv0h8ke Hubm7ZIDUcQUovM40bzdVNVCfMRsZF3z/WqjsTo+iO+R3pm4YA8+6k7+6VTVnd2hKn15Y3IPwHR Lkzj7DkQXYDuvmY/rSPhl078LQKzjg+LavyBRVJz8L5YMB0Uaxym6awic9vDd4tl66xlWJbFAr9 fJVTpQmfLVl2z/ky1sqrLLFXQf78tQokfUdfX4ne4n3B5YMJLHrm/1EI6G9+ycnhWAWpOVaDuAf uXo+B8itkCF74HCTutKmNuQGPVcCHOjK5i4LX9oM5G14IiWhuCZR8/alw+hq7m4Y2PAMnKtrI2b qIXsCO9pt/4iqSx/Yrm+QyxjQ5wCNmTGw== X-Received: by 2002:a5d:5f89:0:b0:475:e3fe:8ac3 with SMTP id ffacd0b85a97d-47df07a9573mr10109183f8f.8.1783674053704; Fri, 10 Jul 2026 02:00:53 -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-47aa039b0cesm59386076f8f.22.2026.07.10.02.00.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2026 02:00:52 -0700 (PDT) From: Christian Gmeiner Date: Fri, 10 Jul 2026 11:00:47 +0200 Subject: [PATCH v2 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-v2-2-90cfebcf22a2@igalia.com> References: <20260710-etnaviv-reset-notification-v2-0-90cfebcf22a2@igalia.com> In-Reply-To: <20260710-etnaviv-reset-notification-v2-0-90cfebcf22a2@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. Bump the driver minor version so userspace can detect the feature. Signed-off-by: Christian Gmeiner --- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 27 ++++++++++++++++++++++++++- drivers/gpu/drm/etnaviv/etnaviv_drv.h | 1 + drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 2 ++ drivers/gpu/drm/etnaviv/etnaviv_sched.c | 3 +++ include/uapi/drm/etnaviv_drm.h | 19 ++++++++++++++++++- 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnavi= v/etnaviv_drv.c index a27ed014fb4e..a48698463fc1 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c @@ -296,6 +296,30 @@ 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; + + args->global_reset_counter =3D gpu->reset_counter; + args->context_reset_counter =3D ctx->reset_counter; + + return 0; +} + static int etnaviv_ioctl_gem_new(struct drm_device *dev, void *data, struct drm_file *file) { @@ -502,6 +526,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 +555,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..bd1335a17f46 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c @@ -79,6 +79,9 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job= (struct drm_sched_job if(sched_job) drm_sched_increase_karma(sched_job); =20 + gpu->reset_counter++; + submit->ctx->reset_counter++; + /* 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