From nobody Sun Feb 8 09:11:07 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 EDFD0137E for ; Fri, 25 Apr 2025 06:33:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745562789; cv=none; b=fR8NQYsfFYqsBfkTgBNFb0y9+69MmThqbhVqRzaUPnm+igRtSgssLHIFRIK0UuD8KGiqOgrztkQYhf9e2OsMriOSN+oO2RQnHNS/Btr1tCHlF9MzTZ8XVEBoZ5xmgjw9oCew8P9Dcri3nUt91LmtQ1TDd6tBzo7zzCYhvc7Mh7I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745562789; c=relaxed/simple; bh=56tCywcZKP0beJQf8hFoLiJGx5c54ZdK/gUAtsVWx6o=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=ueupxL/EmsjBngOGeXHHi9+pDk+5wiohxc4avVMwgfSB63UWL0aeLuaRnVcBw81m7C4zrzbaQb8aWz741xTCQ+KvfZ4jpFn+4MWAn/bY+MVAWeXmE//ma648SwEeq974HUJjVp6fN89Ej8m0mQFXmFZNp9A6aCWaE+WRwTiZr9Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=gI5KQpLF; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="gI5KQpLF" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1745562785; 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; bh=d285x5hlvi/CsClG0dx/mghTairCHhYodtu6zCS6z7I=; b=gI5KQpLF3sEj6VQF3Avblm6K6D0SRoizeuKZr+9BVkz0/H/US4gVGrk6/A88VS+phBxaaV 9eb7o5cD4fX5r6EDBu7yjgB7xYFdd62UD0hrVEYLKF7/5s2YGM0ul8DiaQNAxHQLj/UxTs MTD4fb33FamhtW0u3tKMMAP3yql4IDE= Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-219-I6qXgIZRNTelRiHR5LGnLA-1; Fri, 25 Apr 2025 02:33:04 -0400 X-MC-Unique: I6qXgIZRNTelRiHR5LGnLA-1 X-Mimecast-MFC-AGG-ID: I6qXgIZRNTelRiHR5LGnLA_1745562783 Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-7369b559169so1182546b3a.1 for ; Thu, 24 Apr 2025 23:33:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745562783; x=1746167583; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=d285x5hlvi/CsClG0dx/mghTairCHhYodtu6zCS6z7I=; b=XQJLtoJOimJQiBylrvD5AIH3FbpbNiZKjQ0wKW7+IQZ/mLQp5qVcR0A0M3ZHOORsJE GR08ogxFjbtaiDzj50cPlDVD8wKrpDnjQeyyrAcpdXr/2nFLaM1KEEiQRZ1l5x4v6KBs qoHCVXz21fgH2YDvHNN5HQRa4GKc+jdwx4cwDcK3Aoc/Cd/BuQVgpDymZICs4XaHTyiZ lWJIZp4gtUMvCuFFpvZ0re5DdmjOlaLaKJWuaG93xbfZd3T12HXSCdlcJb56Wqt71eln CeWhdNukgQrqD38Z1maimxT0gQK1SGnl0/8ahFV+BLbNBkxMEKs1YvN9TnXz5OSdVZcf Fwpw== X-Forwarded-Encrypted: i=1; AJvYcCXxU9tv0PASIkfidI0xg77T1TLodORKRxXPJQY49B7eykq1vu9Al7ZuG7w0QsNf5F4nZsZ3Yz7Bi88r4mc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2ObvQBQOxhqfahLCDgldF/LXiNIV2o6XZrl3zXnWm871EiDbO 2j5fUlyNc2yRopVjV5GmQtSZ86+uxIiotJkfCQfC82v5NOn9sMIRahMDnZNk4rxm2KVzOA+95n2 kCzJK4R1Bh4UIq7uL38tu+EtucuF+YaYuDQ0piXiDBs56cmLlxWh0UYSyN9M9Pw== X-Gm-Gg: ASbGnctDQr0/ymeivsO6lQpZ8eb+j/0cP+0FO6HJdrBnVUUnQlqH2hOofUwRnXofeq8 2LWhKaw+4+jtmsvFRNXOG/jWp7XMMumtHJSGjf2pX/2EJ8lsm8WdB+bShgEDXWckSQI15O07sYw g++lG2fkP6PoZTFG+at5yQkMr87s0Pp8TRfTJ7J3SERYdDHtia1P9rucral1/wzAXcX+6E4PhnL S2EIk0ePEs01460SpSSOQrfQsCXsf1wtYTs3PsTxuuvCzK76PFWjbgjQohj7Vvh+Dgm25xLPcSc ZTlPoTI9Z0Xa X-Received: by 2002:a05:6a20:3d8d:b0:1f5:8de8:3b1a with SMTP id adf61e73a8af0-2045b6e73dfmr1500695637.13.1745562782839; Thu, 24 Apr 2025 23:33:02 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHF5L5iQamY7B+V8Yg2guhT+fTSVr2uNb9/ZqVN6Z1cZ1CgRQloJBDOC8O5wm3k/XZJI+f1Gw== X-Received: by 2002:a05:6a20:3d8d:b0:1f5:8de8:3b1a with SMTP id adf61e73a8af0-2045b6e73dfmr1500658637.13.1745562782456; Thu, 24 Apr 2025 23:33:02 -0700 (PDT) Received: from zeus.elecom ([240b:10:83a2:bd00:6e35:f2f5:2e21:ae3a]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b15f8597f5csm2211261a12.43.2025.04.24.23.32.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Apr 2025 23:33:01 -0700 (PDT) From: Ryosuke Yasuoka To: drawat.floss@gmail.com, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, jfalempe@redhat.com Cc: Ryosuke Yasuoka , linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: [PATCH drm-next v2] drm/hyperv: Replace simple-KMS with regular atomic helpers Date: Fri, 25 Apr 2025 15:32:32 +0900 Message-ID: <20250425063234.757344-1-ryasuoka@redhat.com> X-Mailer: git-send-email 2.49.0 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 Content-Type: text/plain; charset="utf-8" Drop simple-KMS in favor of regular atomic helpers to make the code more modular. The simple-KMS helper mix up plane and CRTC state, so it is obsolete and should go away [1]. Since it just split the simple-pipe functions into per-plane and per-CRTC, no functional changes is expected. [1] https://lore.kernel.org/lkml/dae5089d-e214-4518-b927-5c4149babad8@suse.= de/ Signed-off-by: Ryosuke Yasuoka Acked-by: Javier Martinez Canillas --- v2: - Remove hyperv_crtc_helper_mode_valid - Remove hyperv_format_mod_supported - Call helper_add after {plane,crtc}_init - Move drm_plane_enable_fb_damage_clips to a place close to plane init - Move hyperv_conn_init() into hyperv_pipe_init - Remove hyperv_blit_to_vram_fullscreen - Remove format check - Replace hyperv_crtc_helper_atomic_check to drm_crtc_helper_atomic_check v1: https://lore.kernel.org/all/20250420121945.573915-1-ryasuoka@redhat.com/ drivers/gpu/drm/hyperv/hyperv_drm.h | 4 +- drivers/gpu/drm/hyperv/hyperv_drm_modeset.c | 159 +++++++++++++------- 2 files changed, 107 insertions(+), 56 deletions(-) diff --git a/drivers/gpu/drm/hyperv/hyperv_drm.h b/drivers/gpu/drm/hyperv/h= yperv_drm.h index d2d8582b36df..9e776112c03e 100644 --- a/drivers/gpu/drm/hyperv/hyperv_drm.h +++ b/drivers/gpu/drm/hyperv/hyperv_drm.h @@ -11,7 +11,9 @@ struct hyperv_drm_device { /* drm */ struct drm_device dev; - struct drm_simple_display_pipe pipe; + struct drm_plane plane; + struct drm_crtc crtc; + struct drm_encoder encoder; struct drm_connector connector; =20 /* mode */ diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_modeset.c b/drivers/gpu/drm/= hyperv/hyperv_drm_modeset.c index 6c6b57298797..374f8464f5bc 100644 --- a/drivers/gpu/drm/hyperv/hyperv_drm_modeset.c +++ b/drivers/gpu/drm/hyperv/hyperv_drm_modeset.c @@ -5,6 +5,8 @@ =20 #include =20 +#include +#include #include #include #include @@ -15,7 +17,7 @@ #include #include #include -#include +#include =20 #include "hyperv_drm.h" =20 @@ -38,18 +40,6 @@ static int hyperv_blit_to_vram_rect(struct drm_framebuff= er *fb, return 0; } =20 -static int hyperv_blit_to_vram_fullscreen(struct drm_framebuffer *fb, - const struct iosys_map *map) -{ - struct drm_rect fullscreen =3D { - .x1 =3D 0, - .x2 =3D fb->width, - .y1 =3D 0, - .y2 =3D fb->height, - }; - return hyperv_blit_to_vram_rect(fb, map, &fullscreen); -} - static int hyperv_connector_get_modes(struct drm_connector *connector) { struct hyperv_drm_device *hv =3D to_hv(connector->dev); @@ -98,30 +88,71 @@ static int hyperv_check_size(struct hyperv_drm_device *= hv, int w, int h, return 0; } =20 -static void hyperv_pipe_enable(struct drm_simple_display_pipe *pipe, - struct drm_crtc_state *crtc_state, - struct drm_plane_state *plane_state) +static const uint32_t hyperv_formats[] =3D { + DRM_FORMAT_XRGB8888, +}; + +static const uint64_t hyperv_modifiers[] =3D { + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID +}; + +static void hyperv_crtc_helper_atomic_enable(struct drm_crtc *crtc, + struct drm_atomic_state *state) { - struct hyperv_drm_device *hv =3D to_hv(pipe->crtc.dev); - struct drm_shadow_plane_state *shadow_plane_state =3D to_drm_shadow_plane= _state(plane_state); + struct hyperv_drm_device *hv =3D to_hv(crtc->dev); + struct drm_plane *plane =3D &hv->plane; + struct drm_plane_state *plane_state =3D plane->state; + struct drm_crtc_state *crtc_state =3D crtc->state; =20 hyperv_hide_hw_ptr(hv->hdev); hyperv_update_situation(hv->hdev, 1, hv->screen_depth, crtc_state->mode.hdisplay, crtc_state->mode.vdisplay, plane_state->fb->pitches[0]); - hyperv_blit_to_vram_fullscreen(plane_state->fb, &shadow_plane_state->data= [0]); } =20 -static int hyperv_pipe_check(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *plane_state, - struct drm_crtc_state *crtc_state) +static void hyperv_crtc_helper_atomic_disable(struct drm_crtc *crtc, + struct drm_atomic_state *state) +{ } + +static const struct drm_crtc_helper_funcs hyperv_crtc_helper_funcs =3D { + .atomic_check =3D drm_crtc_helper_atomic_check, + .atomic_enable =3D hyperv_crtc_helper_atomic_enable, + .atomic_disable =3D hyperv_crtc_helper_atomic_disable, +}; + +static const struct drm_crtc_funcs hyperv_crtc_funcs =3D { + .reset =3D drm_atomic_helper_crtc_reset, + .destroy =3D drm_crtc_cleanup, + .set_config =3D drm_atomic_helper_set_config, + .page_flip =3D drm_atomic_helper_page_flip, + .atomic_duplicate_state =3D drm_atomic_helper_crtc_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_crtc_destroy_state, +}; + +static int hyperv_plane_atomic_check(struct drm_plane *plane, + struct drm_atomic_state *state) { - struct hyperv_drm_device *hv =3D to_hv(pipe->crtc.dev); + struct drm_plane_state *plane_state =3D drm_atomic_get_new_plane_state(st= ate, plane); + struct hyperv_drm_device *hv =3D to_hv(plane->dev); struct drm_framebuffer *fb =3D plane_state->fb; + struct drm_crtc *crtc =3D plane_state->crtc; + struct drm_crtc_state *crtc_state =3D NULL; + int ret; =20 - if (fb->format->format !=3D DRM_FORMAT_XRGB8888) - return -EINVAL; + if (crtc) + crtc_state =3D drm_atomic_get_new_crtc_state(state, crtc); + + ret =3D drm_atomic_helper_check_plane_state(plane_state, crtc_state, + DRM_PLANE_NO_SCALING, + DRM_PLANE_NO_SCALING, + false, false); + if (ret) + return ret; + + if (!plane_state->visible) + return 0; =20 if (fb->pitches[0] * fb->height > hv->fb_size) { drm_err(&hv->dev, "fb size requested by %s for %dX%d (pitch %d) greater = than %ld\n", @@ -132,53 +163,77 @@ static int hyperv_pipe_check(struct drm_simple_displa= y_pipe *pipe, return 0; } =20 -static void hyperv_pipe_update(struct drm_simple_display_pipe *pipe, - struct drm_plane_state *old_state) +static void hyperv_plane_atomic_update(struct drm_plane *plane, + struct drm_atomic_state *old_state) { - struct hyperv_drm_device *hv =3D to_hv(pipe->crtc.dev); - struct drm_plane_state *state =3D pipe->plane.state; + struct drm_plane_state *old_pstate =3D drm_atomic_get_old_plane_state(old= _state, plane); + struct hyperv_drm_device *hv =3D to_hv(plane->dev); + struct drm_plane_state *state =3D plane->state; struct drm_shadow_plane_state *shadow_plane_state =3D to_drm_shadow_plane= _state(state); struct drm_rect rect; =20 - if (drm_atomic_helper_damage_merged(old_state, state, &rect)) { + if (drm_atomic_helper_damage_merged(old_pstate, state, &rect)) { hyperv_blit_to_vram_rect(state->fb, &shadow_plane_state->data[0], &rect); hyperv_update_dirt(hv->hdev, &rect); } } =20 -static const struct drm_simple_display_pipe_funcs hyperv_pipe_funcs =3D { - .enable =3D hyperv_pipe_enable, - .check =3D hyperv_pipe_check, - .update =3D hyperv_pipe_update, - DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS, +static const struct drm_plane_helper_funcs hyperv_plane_helper_funcs =3D { + DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, + .atomic_check =3D hyperv_plane_atomic_check, + .atomic_update =3D hyperv_plane_atomic_update, }; =20 -static const uint32_t hyperv_formats[] =3D { - DRM_FORMAT_XRGB8888, +static const struct drm_plane_funcs hyperv_plane_funcs =3D { + .update_plane =3D drm_atomic_helper_update_plane, + .disable_plane =3D drm_atomic_helper_disable_plane, + .destroy =3D drm_plane_cleanup, + DRM_GEM_SHADOW_PLANE_FUNCS, }; =20 -static const uint64_t hyperv_modifiers[] =3D { - DRM_FORMAT_MOD_LINEAR, - DRM_FORMAT_MOD_INVALID +static const struct drm_encoder_funcs hyperv_drm_simple_encoder_funcs_clea= nup =3D { + .destroy =3D drm_encoder_cleanup, }; =20 static inline int hyperv_pipe_init(struct hyperv_drm_device *hv) { + struct drm_device *dev =3D &hv->dev; + struct drm_encoder *encoder =3D &hv->encoder; + struct drm_plane *plane =3D &hv->plane; + struct drm_crtc *crtc =3D &hv->crtc; + struct drm_connector *connector =3D &hv->connector; int ret; =20 - ret =3D drm_simple_display_pipe_init(&hv->dev, - &hv->pipe, - &hyperv_pipe_funcs, - hyperv_formats, - ARRAY_SIZE(hyperv_formats), - hyperv_modifiers, - &hv->connector); + ret =3D drm_universal_plane_init(dev, plane, 0, + &hyperv_plane_funcs, + hyperv_formats, ARRAY_SIZE(hyperv_formats), + hyperv_modifiers, + DRM_PLANE_TYPE_PRIMARY, NULL); + if (ret) + return ret; + drm_plane_helper_add(plane, &hyperv_plane_helper_funcs); + drm_plane_enable_fb_damage_clips(plane); + + ret =3D drm_crtc_init_with_planes(dev, crtc, plane, NULL, + &hyperv_crtc_funcs, NULL); if (ret) return ret; + drm_crtc_helper_add(crtc, &hyperv_crtc_helper_funcs); =20 - drm_plane_enable_fb_damage_clips(&hv->pipe.plane); + encoder->possible_crtcs =3D drm_crtc_mask(crtc); + ret =3D drm_encoder_init(dev, encoder, + &hyperv_drm_simple_encoder_funcs_cleanup, + DRM_MODE_ENCODER_NONE, NULL); + if (ret) + return ret; =20 - return 0; + ret =3D hyperv_conn_init(hv); + if (ret) { + drm_err(dev, "Failed to initialized connector.\n"); + return ret; + } + + return drm_connector_attach_encoder(connector, encoder); } =20 static enum drm_mode_status @@ -221,12 +276,6 @@ int hyperv_mode_config_init(struct hyperv_drm_device *= hv) =20 dev->mode_config.funcs =3D &hyperv_mode_config_funcs; =20 - ret =3D hyperv_conn_init(hv); - if (ret) { - drm_err(dev, "Failed to initialized connector.\n"); - return ret; - } - ret =3D hyperv_pipe_init(hv); if (ret) { drm_err(dev, "Failed to initialized pipe.\n"); base-commit: b60301774a8fe6c30b14a95104ec099290a2e904 --=20 2.49.0