From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 953C33F39EA for ; Wed, 17 Jun 2026 10:31:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781692261; cv=none; b=d5GKtEjygt1+5WDakk/CbS8dp/OpyE9zftnDEc2koLqGXN/c/LdW5cxCX8Ku9aRlUEqOfczYxu22yUTEW6oiOT0unhzhWtiJTYBW3tN1J+urSkXIHN/tiJwCwXD+Cl3S0GDBa+ljIJYN9NsZLOZz/vON1dBb59fLdcQieEFdE5M= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781692261; c=relaxed/simple; bh=VFLn1X/FbV6WyAJSv1mK1wQhaEOpXkrcXFv80dKxP10=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=UdKuE6bwbmuFDIDIB7XnaM/2s+6fkSPBjajK9sZwSO5ggsQxp3IISwXRHtvMXDgZPxvHQS3+1mu2iwjgAd6mcT7BJUBGsTXAtwqO6/hnf/3kcXQQPB5jiSVPIc8CMhWOmsW3o/nQ4f3JcBG68h5veYvAHssgbhpgxRGFk3lbU6I= 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=dMlS76J1; arc=none smtp.client-ip=209.85.215.178 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="dMlS76J1" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-c889ade5287so39194a12.1 for ; Wed, 17 Jun 2026 03:31:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781692260; x=1782297060; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=afZH9eP+KoE3Ta3oJntXN/TPimtdYin4QgRicypPySg=; b=dMlS76J1soPUHTZfZQpMu19qpieaKR1nTUQtRH2TxYH//x/uHQhnbhtsKuC3BLzEVN 6Nblp5pF1jpRf3OX3of6PaFCvufZDa5clGaVrnhtpiHfYyJNF0/GEgmVNJC5f0uu+u2T ZtUzK4NI2AYAdA/hvVMrQc3T6G0lde2+nfiZ6WQiXlvwn85EaMrXWzaV6bW/D6NUkOEF HLKR3MplsP6/5QDkQykgQz+CDGYk4v9XU+mbnEqo1YhLrKGOVjmnJyQ7TkihL1+1epU3 mAYKNLgJHcXidjzzx9gw7aW6AXauGeQhpqv8SZtk/hZDEnAgiYD5Fjo/ygzMZalW/pj0 oKUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781692260; x=1782297060; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=afZH9eP+KoE3Ta3oJntXN/TPimtdYin4QgRicypPySg=; b=GpW4Pf1cokYyKyKFYNP+AwRRZPrKu11e1o+sBF8H6PTjNV2dvdhbXVsyJg/iCBg+Iu H66VlVK3F5brcp4wAwwpTWWTYBvNY71r0BieKCPagkni/JMdAq/w3q1SMpDpVgrHXZ34 FfONlPTch8Pl/irWEm5+TWMSvCct8Ztl/i561Sczo1Y43GfbCz4aQxuYDN6fgyE6w811 ftojA72Ggazv1dP0Sz0Lzvjucs9Zo4ryVDrFKMpY/80B8xqXd246d9zYJCNK8uhY4VpH 5PutuOEIMNSLrZhg3HeIGAXu3iruhIeCRd5tBlRuhIbYAHw5kw/8DHTQ/NTN2qfd0z+f mEAg== X-Forwarded-Encrypted: i=1; AFNElJ8prScbJBPbhYjNeECllJW94VyvrW47bKffNKquonAtEyx82o0D2y8vBXrbFNpOZ2aHcwxkTs51p3Sz9o4=@vger.kernel.org X-Gm-Message-State: AOJu0Yxqe9UNup1tl3TR2aNvuUbUi9j/vZuQ/CWY6u+/1bnThWlmd/Aj EVDzq6rmUlQOfMHMisV+eRHjFDJ+2nMnqnMvx4rdtY7M2E81R+TGkh9i X-Gm-Gg: AfdE7ckZJy1Vq4oznGkcgrfWIPhnqH1/F+ls89pDAQfujhno5X9XeZ/l29Rn8f7ULe9 0RUREZ1oWMqR+9SMA9ZtAGCxJWbgVWeu8Z4BWLC7QeuwhYK8Z3KXhtTAaUVeXzA/hTGmHtHeXEt rSheKBmnNuHo1MKgPJAs94Gj13KYYipcEZDqIub/1JP64v5oGrAPLcmN5UQ8TFDBucZ9bcpqEw2 PiT3SbXIduDbXOucBHyz6Cc34W7nIPlMybq0xrxWg7/wXcEvb1J9N+NQNKHOWkzqsfAQl+1hEoS n0f0/T793ltF2ShBGu3JAyxvLZ+iWBxMDlYFkl/BIUbKqOlFQfb5iy5+9IkEnSgHxrxcpCciq6H AxpHtIJAN2K7whP3YjNtMseZNdjuhMulvoAvERynudzTDEp2cEZt1Gw2J7Ris8Aw066jMNNZ/GY KxNkYXd+NOJ1VRUFcBfCUDZegiLkCFbb06ib2G6FvxiwJmqdC8SWwnsKv6edGiBixXaA== X-Received: by 2002:a17:902:ce91:b0:2bc:b80f:677e with SMTP id d9443c01a7336-2c6bc23de79mr28853095ad.25.1781692259833; Wed, 17 Jun 2026 03:30:59 -0700 (PDT) Received: from [192.168.0.100] (60-250-196-139.hinet-ip.hinet.net. [60.250.196.139]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2c4328a47f8sm150830775ad.47.2026.06.17.03.30.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 17 Jun 2026 03:30:59 -0700 (PDT) Message-ID: <4414042f-56e2-495a-81c3-0040c8e1b01f@gmail.com> Date: Wed, 17 Jun 2026 18:30:56 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 3/6] drm/verisilicon: introduce per-variant hardware ops table To: Icenowy Zheng , maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: ychuang3@nuvoton.com, schung@nuvoton.com, yclu4@nuvoton.com, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20260615065003.76661-1-a0987203069@gmail.com> <20260615065003.76661-4-a0987203069@gmail.com> <38d07e3b3c841d380c987800d8ef85065be94e79.camel@iscas.ac.cn> Content-Language: en-US From: Joey Lu In-Reply-To: <38d07e3b3c841d380c987800d8ef85065be94e79.camel@iscas.ac.cn> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 6/15/2026 4:37 PM, Icenowy Zheng wrote: > 在 2026-06-15一的 14:50 +0800,Joey Lu写道: > >> + >>   drm_crtc_vblank_on(crtc); >>  } >> >> @@ -119,7 +148,8 @@ static bool vs_crtc_mode_fixup(struct drm_crtc >> *crtc, >>  } >> >>  static const struct drm_crtc_helper_funcs vs_crtc_helper_funcs = { >> - .atomic_flush = drm_crtc_vblank_atomic_flush, >> + .atomic_begin = vs_crtc_atomic_begin, >> + .atomic_flush = vs_crtc_atomic_flush, >>   .atomic_enable = vs_crtc_atomic_enable, >>   .atomic_disable = vs_crtc_atomic_disable, >>   .mode_set_nofb = vs_crtc_mode_set_nofb, >> @@ -132,7 +162,7 @@ static int vs_crtc_enable_vblank(struct drm_crtc >> *crtc) >>   struct vs_crtc *vcrtc = drm_crtc_to_vs_crtc(crtc); >>   struct vs_dc *dc = vcrtc->dc; >> >> - regmap_set_bits(dc->regs, VSDC_TOP_IRQ_EN, >> VSDC_TOP_IRQ_VSYNC(vcrtc->id)); >> + dc->funcs->enable_vblank(dc, vcrtc->id); >> >>   return 0; >>  } >> @@ -142,7 +172,7 @@ static void vs_crtc_disable_vblank(struct >> drm_crtc *crtc) >>   struct vs_crtc *vcrtc = drm_crtc_to_vs_crtc(crtc); >>   struct vs_dc *dc = vcrtc->dc; >> >> - regmap_clear_bits(dc->regs, VSDC_TOP_IRQ_EN, >> VSDC_TOP_IRQ_VSYNC(vcrtc->id)); >> + dc->funcs->disable_vblank(dc, vcrtc->id); >>  } >> >>  static const struct drm_crtc_funcs vs_crtc_funcs = { >> diff --git a/drivers/gpu/drm/verisilicon/vs_dc.c >> b/drivers/gpu/drm/verisilicon/vs_dc.c >> index dad9967bc10b..9729b693d360 100644 >> --- a/drivers/gpu/drm/verisilicon/vs_dc.c >> +++ b/drivers/gpu/drm/verisilicon/vs_dc.c >> @@ -8,9 +8,7 @@ >>  #include >>  #include >> >> -#include "vs_crtc.h" >>  #include "vs_dc.h" >> -#include "vs_dc_top_regs.h" >>  #include "vs_drm.h" >>  #include "vs_hwdb.h" >> >> @@ -33,7 +31,7 @@ static irqreturn_t vs_dc_irq_handler(int irq, void >> *private) >>   struct vs_dc *dc = private; >>   u32 irqs; >> >> - regmap_read(dc->regs, VSDC_TOP_IRQ_ACK, &irqs); >> + irqs = dc->funcs->irq_ack(dc); > The definition of bits in 0x0010 seems to be different to ones in > 0x147C, although the first 2 bits are the same. (e.g. `BIT(2)` is > "cursor interrupt" in DC8000 0x147C but "secure reset done" in DC8200 > 0x0010). > > Should some kind of translation be done in `irq_ack` ? (and add a > unified interrupt definition that aims to be the translation target). > > Thanks, > Icenowy I will add a set of unified IRQ bit definitions (e.g. `VSDC_IRQ_VSYNC(n)`) in a shared header. Each `irq_ack` implementation will translate its hardware-specific register bits into those unified bits before returning, so `vs_drm_handle_irq` can use the unified definitions without knowing which register layout was used. Currently the VSYNC bits (BIT(0)/BIT(1)) coincide between DC8200 0x0010 and DC8000 0x147C, so the translation is trivial; this change will prevent future confusion from diverging bit meanings (such as BIT(2)). >> >>   vs_drm_handle_irq(dc, irqs); >> >> @@ -136,6 +134,8 @@ static int vs_dc_probe(struct platform_device >> *pdev) >>   dev_info(dev, "Found DC%x rev %x customer %x\n", dc- >>> identity.model, >>   dc->identity.revision, dc->identity.customer_id); >> >> + dc->funcs = &vs_dc8200_funcs; >> + >>   if (port_count > dc->identity.display_count) { >>   dev_err(dev, "too many downstream ports than HW >> capability\n"); >>   ret = -EINVAL; >> diff --git a/drivers/gpu/drm/verisilicon/vs_dc.h >> b/drivers/gpu/drm/verisilicon/vs_dc.h >> index ed1016f18758..544e1a37065b 100644 >> --- a/drivers/gpu/drm/verisilicon/vs_dc.h >> +++ b/drivers/gpu/drm/verisilicon/vs_dc.h >> @@ -14,6 +14,7 @@ >>  #include >> >>  #include >> +#include >> >>  #include "vs_hwdb.h" >> >> @@ -22,6 +23,34 @@ >> >>  struct vs_drm_dev; >>  struct vs_crtc; >> +struct vs_dc; >> + >> +struct vs_dc_funcs { >> + /* Bridge: atomic_enable, atomic_disable */ >> + void (*panel_enable_ex)(struct vs_dc *dc, unsigned int >> output); >> + void (*panel_disable_ex)(struct vs_dc *dc, unsigned int >> output); >> + >> + /* CRTC: atomic_begin, atomic_flush */ >> + void (*crtc_begin)(struct vs_dc *dc, unsigned int output); >> + void (*crtc_flush)(struct vs_dc *dc, unsigned int output); >> + >> + /* CRTC: atomic_enable, atomic_disable */ >> + void (*crtc_enable)(struct vs_dc *dc, unsigned int output); >> + void (*crtc_disable)(struct vs_dc *dc, unsigned int output); >> + >> + /* CRTC: enable_vblank, disable_vblank */ >> + void (*enable_vblank)(struct vs_dc *dc, unsigned int >> output); >> + void (*disable_vblank)(struct vs_dc *dc, unsigned int >> output); >> + >> + /* Primary plane: atomic_enable, atomic_disable, >> atomic_update */ >> + void (*primary_plane_enable_ex)(struct vs_dc *dc, unsigned >> int output); >> + void (*primary_plane_disable_ex)(struct vs_dc *dc, unsigned >> int output); >> + void (*primary_plane_update_ex)(struct vs_dc *dc, unsigned >> int output, >> + struct drm_plane_state >> *state); >> + >> + /* IRQ acknowledge */ >> + u32 (*irq_ack)(struct vs_dc *dc); >> +}; >> >>  struct vs_dc { >>   struct regmap *regs; >> @@ -33,6 +62,9 @@ struct vs_dc { >> >>   struct vs_drm_dev *drm_dev; >>   struct vs_chip_identity identity; >> + const struct vs_dc_funcs *funcs; >>  }; >> >> +extern const struct vs_dc_funcs vs_dc8200_funcs; >> + >>  #endif /* _VS_DC_H_ */ >> >>