From nobody Fri Dec 27 06:27:19 2024 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7FC85149E17 for ; Fri, 29 Nov 2024 16:23:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732897397; cv=none; b=em1a+o5Iyx5YWuZhRCzX3wA5Ej3RHjSaMSE5TtFRjTnMYHAh2H3XEkvgzAHJWZXP3kkqLzA3E5XASx/npGFEmgd8ONEJd0/2wp2Tfe8GYP23jZNlrzeTuksaEh8sYVvyxbydd0EF/oUJpubf+m6yEi4dCNm23ya+UN9HPRWQtoo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1732897397; c=relaxed/simple; bh=3nbdfgDykodulr5SgnRd7VYy2zrtu0I+l6icChGdNK0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ry5UsMHP6xqpwHrTKeU0Yr1R4J8zTBgefIc4xEWbeCOwlH3WPoKg08NOe3hhQGgIiv2lnIevlAItHXK4qu5iz0qKYp/Zg1vUSKmV12GbO/JWcp+P27rvuHDZEFwc+VplJKGrrVsgZnRVSuiBQ4vg9oMj0yFKJG+RlvJfodnTRVo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=A4giokAI; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="A4giokAI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1732897394; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VJlxlZmTa08VOsuEjaOxWp0N1N2M/sWSw22y2ruZ4u0=; b=A4giokAIyMZjoNP0+UCZW+upuA4QfyJZIL3ijyRKi0Ozpba13cS7Ra+ss84faGgk+BNMUb IICTeH3ByNlfkFchgUtfAc21WiVg6UuP1qjxpguZiew/aZ4vxK6TyiCz/R1YNbTXIhHKRX 128nxTpsq8X3U3J0VFnMCDPbjIaSB3M= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-262-3T72GyoROBCxh-SBJwwstA-1; Fri, 29 Nov 2024 11:23:11 -0500 X-MC-Unique: 3T72GyoROBCxh-SBJwwstA-1 X-Mimecast-MFC-AGG-ID: 3T72GyoROBCxh-SBJwwstA Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 48FA21944DDC; Fri, 29 Nov 2024 16:23:09 +0000 (UTC) Received: from hydra.redhat.com (unknown [10.39.192.13]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5140D1955F41; Fri, 29 Nov 2024 16:23:06 +0000 (UTC) From: Jocelyn Falempe To: Jani Nikula , Rodrigo Vivi , Joonas Lahtinen , Tvrtko Ursulin , David Airlie , Simona Vetter , intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Jocelyn Falempe Subject: [PATCH 5/5] drm/i915: Add drm_panic support Date: Fri, 29 Nov 2024 17:20:30 +0100 Message-ID: <20241129162232.7594-6-jfalempe@redhat.com> In-Reply-To: <20241129162232.7594-1-jfalempe@redhat.com> References: <20241129162232.7594-1-jfalempe@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" This adds drm_panic support for a wide range of Intel GPU. I've tested it only on 3 laptops, haswell (with 128MB of eDRAM), cometlake and alderlake. * DPT: if I disable tiling on a framebuffer using DPT, then it displays some other memory location. As DPT is enabled only for tiled framebuffer, there might be some hardware limitations. * fbdev: On my haswell laptop, the fbdev framebuffer is configured with tiling enabled, but really it's linear, because fbcon don't know about tiling, and the panic screen is perfect when it's drawn as linear. Signed-off-by: Jocelyn Falempe --- .../gpu/drm/i915/display/intel_atomic_plane.c | 98 ++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_atomic_plane.c b/drivers/gp= u/drm/i915/display/intel_atomic_plane.c index b7e462075ded3..43dac5538a648 100644 --- a/drivers/gpu/drm/i915/display/intel_atomic_plane.c +++ b/drivers/gpu/drm/i915/display/intel_atomic_plane.c @@ -33,13 +33,17 @@ =20 #include #include +#include =20 #include #include +#include #include #include #include +#include =20 +#include "gem/i915_gem_object.h" #include "i915_config.h" #include "i9xx_plane_regs.h" #include "intel_atomic_plane.h" @@ -50,6 +54,7 @@ #include "intel_display_types.h" #include "intel_fb.h" #include "intel_fb_pin.h" +#include "intel_fbdev.h" #include "skl_scaler.h" #include "skl_watermark.h" =20 @@ -1198,14 +1203,105 @@ intel_cleanup_plane_fb(struct drm_plane *plane, intel_plane_unpin_fb(old_plane_state); } =20 +/* Only used by drm_panic get_scanout_buffer() and panic_flush(), so it is + * protected by the drm panic spinlock + */ +static struct iosys_map panic_map; + +static void intel_panic_flush(struct drm_plane *plane) +{ + struct intel_plane_state *plane_state =3D to_intel_plane_state(plane->sta= te); + struct drm_i915_private *dev_priv =3D to_i915(plane->dev); + struct drm_framebuffer *fb =3D plane_state->hw.fb; + struct intel_plane *iplane =3D to_intel_plane(plane); + + /* Force a cache flush, otherwise the new pixels won't show up */ + drm_clflush_virt_range(panic_map.vaddr, fb->height * fb->pitches[0]); + + /* Don't disable tiling if it's the fbdev framebuffer.*/ + if (to_intel_framebuffer(fb) =3D=3D intel_fbdev_framebuffer(dev_priv->dis= play.fbdev.fbdev)) + return; + + if (fb->modifier && iplane->disable_tiling) + iplane->disable_tiling(iplane); +} + +static int intel_get_scanout_buffer(struct drm_plane *plane, + struct drm_scanout_buffer *sb) +{ + struct intel_plane_state *plane_state; + struct drm_gem_object *gem_obj; + struct drm_i915_gem_object *obj; + struct drm_framebuffer *fb; + struct drm_i915_private *dev_priv =3D to_i915(plane->dev); + void *ptr; + enum i915_map_type has_type; + + if (!plane->state || !plane->state->fb || !plane->state->visible) + return -ENODEV; + + plane_state =3D to_intel_plane_state(plane->state); + fb =3D plane_state->hw.fb; + gem_obj =3D intel_fb_bo(fb); + if (!gem_obj) + return -ENODEV; + + obj =3D to_intel_bo(gem_obj); + + if (to_intel_framebuffer(fb) =3D=3D intel_fbdev_framebuffer(dev_priv->dis= play.fbdev.fbdev)) { + ptr =3D intel_fbdev_getvaddr(dev_priv->display.fbdev.fbdev); + if (!ptr) + return -ENOMEM; + } else { + /* can't disable tiling if DPT is in use */ + if (fb->modifier && HAS_DPT(dev_priv)) + return -EOPNOTSUPP; + + /* Taken from i915_gem_object_pin_map() */ + ptr =3D page_unpack_bits(obj->mm.mapping, &has_type); + if (!ptr) { + if (i915_gem_object_has_struct_page(obj)) + ptr =3D i915_gem_object_map_page(obj, I915_MAP_WB); + else + ptr =3D i915_gem_object_map_pfn(obj, I915_MAP_WB); + if (IS_ERR(ptr)) + return -ENOMEM; + } + } + + if (i915_gem_object_has_iomem(obj)) + iosys_map_set_vaddr_iomem(&panic_map, ptr); + else + iosys_map_set_vaddr(&panic_map, ptr); + + sb->map[0] =3D panic_map; + sb->width =3D fb->width; + sb->height =3D fb->height; + sb->format =3D fb->format; + sb->pitch[0] =3D fb->pitches[0]; + + return 0; +} + static const struct drm_plane_helper_funcs intel_plane_helper_funcs =3D { .prepare_fb =3D intel_prepare_plane_fb, .cleanup_fb =3D intel_cleanup_plane_fb, }; =20 + +static const struct drm_plane_helper_funcs intel_primary_plane_helper_func= s =3D { + .prepare_fb =3D intel_prepare_plane_fb, + .cleanup_fb =3D intel_cleanup_plane_fb, + .get_scanout_buffer =3D intel_get_scanout_buffer, + .panic_flush =3D intel_panic_flush, +}; + void intel_plane_helper_add(struct intel_plane *plane) { - drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs); + if (plane->base.type =3D=3D DRM_PLANE_TYPE_PRIMARY) + drm_plane_helper_add(&plane->base, &intel_primary_plane_helper_funcs); + else + drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs); } =20 void intel_plane_init_cursor_vblank_work(struct intel_plane_state *old_pla= ne_state, --=20 2.47.0