| Message ID | 20221110183853.3678209-10-jagan@amarulasolutions.com |
|---|---|
| State | New |
| Headers |
Return-Path: <linux-amarula+bncBD7MFH7A7EEBBUELWWNQMGQE2ZE3PTQ@amarulasolutions.com> X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id A92C23F039 for <linux-amarula@patchwork.amarulasolutions.com>; Thu, 10 Nov 2022 19:41:21 +0100 (CET) Received: by mail-pj1-f71.google.com with SMTP id my9-20020a17090b4c8900b002130d29fd7csf3894070pjb.7 for <linux-amarula@patchwork.amarulasolutions.com>; Thu, 10 Nov 2022 10:41:21 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1668105680; cv=pass; d=google.com; s=arc-20160816; b=unWeXu1Aqh72a8C3gyHXsDwnABNkQSj7RTXoICMUbYD6ZAt6nvb+KdAAQel+0WKYsU Jd/+KGLIi35MIvI6oETSHySTE+F5RRfJFAhBf4drAZHJI0ynsGahpmcKUwU54MEboNfI iR6wN6rwxnc22ylIPTsVUYqgiG0AyO6frjcY6bqX8ZX0yfFjYkh6AtO+Jjd0UnRRvQr+ wSWQqcFtiwiE3n/vDs7Fot++lffvnOpUgIYLVCYqD9/zovPjbxXOmuUDXURIDeLoVpOm UVOmK4xxjouFS68crDET+n3rw7vYxeZCX8f7G1HMcS8x8iXF1D3hM7L+uvibRpZrCKq5 Cb8g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=6n+KGK9YTzfrDBs9XJXs8YrVdcRo3os0ty9oaTj0dPw=; b=Mb+VFwzL0vH0/KLqU2ae/5YjZ6QUDQSS2wAwuh0ROCE9lpxGSokQOTaqWuu0ZXOeik yIEgHg7gg9ubOcZNCk1tNU5fhAc2SpseQbTLctEvI86EMEZKa2RlNKWkUZnkY3at9Zlb RYVQ5PRfOPHbUET+LzPcwe7hQjDfl5hmUL61qL+6bbQwBxeJ/dO2XwWpVRBzgn7eBRt0 F4dEmB52lAuJ7S9bYCim5NO248dL6QEK/5UTdpeqR6cGLaac02Xs4KNdCAwnIgboMFaO knBAKam0cUpCx4m1twgZ0GrGFy/B0Ub3jt7FDzS92ojPFFnNKhUkBsRz94FtbtdJI/1Z RtUA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=VXDFnV+e; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=6n+KGK9YTzfrDBs9XJXs8YrVdcRo3os0ty9oaTj0dPw=; b=Mjgqjd07aR3iZsvKm/Q8s/sk7rJRPaK3EyXkb+fJszmA9rsqYIW5r5lTOkfFFIQDM2 pWohqguE7V7MxavX0TPJSBHIyJbinnZcviir9ssaktoauR1CpXTiYoRhlbe1sf7anams uyLplI90sWFOEORohKRbOrxkgeYg8TiFMQhWM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=list-unsubscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=6n+KGK9YTzfrDBs9XJXs8YrVdcRo3os0ty9oaTj0dPw=; b=qBSFUKhcqY52o1MHP7btxLnJsCXM4MQLHPXKHOzjzNElI9tgYkzmh/vfw2eJfi7oaS pFbPOz+L2YKWeOmROkyiPGA8PQFcePV1G+6FQz3sE1c9ahVtUKt4hwruzZQd+0H502yd xRdnkvCmSlUQdWZoekJp0c1qMy/+AYUEEaIkInx8kc9w2ZuoeLOwoB5/nDscEPTk8tr4 2XMMmLYPVOccaEvb/5CQu4TlBJ99bJFWXffVF0HP5MtQAgRYOZWj3oy46vvmOqx9h4mh ZRSwaqiXyE9KsJgUT2z5Ga074NLGfeaFSLEyK1pmChmwKBe4R3LD4Yu2PXSyos9LBlA3 olXw== X-Gm-Message-State: ACrzQf12LbIJ164F9azZ8Sq0Vj66cYJJg1am2RCabVZnc9w0f4oWh0Yt SDvTaFfJwHgPUOp7Q8DiU6R+wEkU X-Google-Smtp-Source: AMsMyM6oqWFjThl3yz35Gaw6ghPLKmxcycQTWQ3VLxT8iwkA1vXnQMlIqUfr7iR+cbOewaITEQIcig== X-Received: by 2002:a17:902:e810:b0:186:e9ff:4ec2 with SMTP id u16-20020a170902e81000b00186e9ff4ec2mr62832053plg.26.1668105680497; Thu, 10 Nov 2022 10:41:20 -0800 (PST) X-BeenThere: linux-amarula@amarulasolutions.com Received: by 2002:a17:902:f68f:b0:186:9fc5:6c01 with SMTP id l15-20020a170902f68f00b001869fc56c01ls1648908plg.6.-pod-prod-gmail; Thu, 10 Nov 2022 10:41:19 -0800 (PST) X-Received: by 2002:a17:903:22cb:b0:186:a8ae:d107 with SMTP id y11-20020a17090322cb00b00186a8aed107mr49530810plg.119.1668105679523; Thu, 10 Nov 2022 10:41:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668105679; cv=none; d=google.com; s=arc-20160816; b=H85zIRlMZHEVx4AncyKiJz5q1rgzMLoIfkDQ1oDvTOE6l3tWvdO9ljH4f/Pp/8mgFH iX5oX3DaOcnLY2/3QVCnQC1ZbqhosfDz83//nP6LfFLlRSUlDEzdtA71ryOB6xRRfBU+ tkbgGvCB4dhIjYf0fAsQ5muPQVOGrXGA1410EyUp6VLwHeGbXOsbe76hJuMSnI7TNPLi KhjKcUz+/1jlVdXjVHNB4wXxIOtWLEdO6enCVeuQBIFFmgx+kwUpLqXpSHe/UhE10OAP REsUfO9TxjbrY+Ly2fyoFJbeoQBhGFP58O5zAqiGzFbxN7l8OYKgat1bK3HZW3vQPCWV SJlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=ahKEBxaNtaA33OFl+eyGOGbGztMU8PeqwlZcki2k/x4=; b=tMduRCPGH0YuL4Cx+bPJdSHBaBAreq3X6/YHhsEJeumT0O97IOJXIwYD7rM5SbtcuM w5zp9awKZRO51lewQFDC6TwZcF9eTFH7Q2VLA/vkq3KyJbzop57yMn6LKN2mc6OhaBWg UoNnVmPVXClLjb3MDfg2Plbr5Kk1KLf91/7KBsooSSWZvUMhyECHyDgavBjbT0Ws7ufR LG4qaBbTAW07tgrb/LNiauMTOx9+uIburfK8p8c3RXbJWhvQsWKgH5QpKq8qwj7nx7mV OJg7g4awsfdATLMrhdNe2THIhC/paCaAS3GDEP1l5AP401hvoVyWQ4jvgwpbNoH27sTr k6Xg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=VXDFnV+e; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id y20-20020a170902ed5400b00184e333125bsor20623plb.103.2022.11.10.10.41.19 for <linux-amarula@amarulasolutions.com> (Google Transport Security); Thu, 10 Nov 2022 10:41:19 -0800 (PST) Received-SPF: pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; X-Received: by 2002:a17:903:240a:b0:183:6555:7a89 with SMTP id e10-20020a170903240a00b0018365557a89mr64973897plo.68.1668105679220; Thu, 10 Nov 2022 10:41:19 -0800 (PST) Received: from localhost.localdomain ([2405:201:c00a:a809:b5a4:486a:f07:f67e]) by smtp.gmail.com with ESMTPSA id c2-20020a170903234200b001869efb722csm11635627plh.215.2022.11.10.10.41.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Nov 2022 10:41:18 -0800 (PST) From: Jagan Teki <jagan@amarulasolutions.com> To: Andrzej Hajda <andrzej.hajda@intel.com>, Inki Dae <inki.dae@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, Joonyoung Shim <jy0922.shim@samsung.com>, Seung-Woo Kim <sw0312.kim@samsung.com>, Kyungmin Park <kyungmin.park@samsung.com>, Frieder Schrempf <frieder.schrempf@kontron.de>, Fancy Fang <chen.fang@nxp.com>, Tim Harvey <tharvey@gateworks.com>, Michael Nazzareno Trimarchi <michael@amarulasolutions.com>, Adam Ford <aford173@gmail.com>, Neil Armstrong <narmstrong@linaro.org>, Robert Foss <robert.foss@linaro.org>, Laurent Pinchart <Laurent.pinchart@ideasonboard.com>, Tommaso Merciai <tommaso.merciai@amarulasolutions.com>, Marek Vasut <marex@denx.de> Cc: Matteo Lisi <matteo.lisi@engicam.com>, dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team <linux-imx@nxp.com>, linux-amarula <linux-amarula@amarulasolutions.com>, Jagan Teki <jagan@amarulasolutions.com> Subject: [PATCH v8 09/14] drm: bridge: samsung-dsim: Add atomic_get_input_bus_fmts Date: Fri, 11 Nov 2022 00:08:48 +0530 Message-Id: <20221110183853.3678209-10-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221110183853.3678209-1-jagan@amarulasolutions.com> References: <20221110183853.3678209-1-jagan@amarulasolutions.com> MIME-Version: 1.0 X-Original-Sender: jagan@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=VXDFnV+e; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: <linux-amarula.amarulasolutions.com> X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: <https://groups.google.com/a/amarulasolutions.com/group/linux-amarula/post>, <mailto:linux-amarula@amarulasolutions.com> List-Help: <https://support.google.com/a/amarulasolutions.com/bin/topic.py?topic=25838>, <mailto:linux-amarula+help@amarulasolutions.com> List-Archive: <https://groups.google.com/a/amarulasolutions.com/group/linux-amarula/> List-Unsubscribe: <mailto:googlegroups-manage+476853432473+unsubscribe@googlegroups.com>, <https://groups.google.com/a/amarulasolutions.com/group/linux-amarula/subscribe> |
| Series |
drm: bridge: Add Samsung MIPI DSIM bridge
|
|
Commit Message
Jagan Teki
Nov. 10, 2022, 6:38 p.m. UTC
Finding the right input bus format throughout the pipeline is hard
so add atomic_get_input_bus_fmts callback and initialize with the
proper input format from list of supported output formats.
This format can be used in pipeline for negotiating bus format between
the DSI-end of this bridge and the other component closer to pipeline
components.
List of Pixel formats are taken from,
AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
3.7.4 Pixel formats
Table 14. DSI pixel packing formats
v8:
* added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2
v7, v6, v5, v4:
* none
v3:
* include media-bus-format.h
v2:
* none
v1:
* new patch
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
Comments
On 11/10/22 19:38, Jagan Teki wrote: > Finding the right input bus format throughout the pipeline is hard > so add atomic_get_input_bus_fmts callback and initialize with the > proper input format from list of supported output formats. > > This format can be used in pipeline for negotiating bus format between > the DSI-end of this bridge and the other component closer to pipeline > components. > > List of Pixel formats are taken from, > AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > 3.7.4 Pixel formats > Table 14. DSI pixel packing formats > > v8: > * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 > > v7, v6, v5, v4: > * none > > v3: > * include media-bus-format.h > > v2: > * none > > v1: > * new patch > > Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> > --- > drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ > 1 file changed, 53 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c > index 0fe153b29e4f..33e5ae9c865f 100644 > --- a/drivers/gpu/drm/bridge/samsung-dsim.c > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > @@ -15,6 +15,7 @@ > #include <linux/clk.h> > #include <linux/delay.h> > #include <linux/irq.h> > +#include <linux/media-bus-format.h> > #include <linux/of_device.h> > #include <linux/phy/phy.h> > > @@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, > pm_runtime_put_sync(dsi->dev); > } > > +/* > + * This pixel output formats list referenced from, > + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > + * 3.7.4 Pixel formats > + * Table 14. DSI pixel packing formats > + */ > +static const u32 samsung_dsim_pixel_output_fmts[] = { You can also add : MEDIA_BUS_FMT_YUYV10_1X20 MEDIA_BUS_FMT_YUYV12_1X24 > + MEDIA_BUS_FMT_UYVY8_1X16, > + MEDIA_BUS_FMT_RGB101010_1X30, > + MEDIA_BUS_FMT_RGB121212_1X36, > + MEDIA_BUS_FMT_RGB565_1X16, > + MEDIA_BUS_FMT_RGB666_1X18, > + MEDIA_BUS_FMT_RGB888_1X24, > +}; > + > +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) > +{ > + int i; > + > + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { > + if (samsung_dsim_pixel_output_fmts[i] == fmt) > + return true; > + } > + > + return false; > +} > + > +static u32 * > +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, > + struct drm_bridge_state *bridge_state, > + struct drm_crtc_state *crtc_state, > + struct drm_connector_state *conn_state, > + u32 output_fmt, > + unsigned int *num_input_fmts) > +{ > + u32 *input_fmts; > + > + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) > + return NULL; > + > + *num_input_fmts = 1; Shouldn't this be 6 ? > + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); > + if (!input_fmts) > + return NULL; > + > + input_fmts[0] = output_fmt; Shouldn't this be a list of all 6 supported pixel formats ? (replace 6 with 8 with the two new YUYV10/YUYV12 pixel formats above)
On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut <marex@denx.de> wrote: > > On 11/10/22 19:38, Jagan Teki wrote: > > Finding the right input bus format throughout the pipeline is hard > > so add atomic_get_input_bus_fmts callback and initialize with the > > proper input format from list of supported output formats. > > > > This format can be used in pipeline for negotiating bus format between > > the DSI-end of this bridge and the other component closer to pipeline > > components. > > > > List of Pixel formats are taken from, > > AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > > 3.7.4 Pixel formats > > Table 14. DSI pixel packing formats > > > > v8: > > * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 > > > > v7, v6, v5, v4: > > * none > > > > v3: > > * include media-bus-format.h > > > > v2: > > * none > > > > v1: > > * new patch > > > > Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> > > --- > > drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ > > 1 file changed, 53 insertions(+) > > > > diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c > > index 0fe153b29e4f..33e5ae9c865f 100644 > > --- a/drivers/gpu/drm/bridge/samsung-dsim.c > > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > > @@ -15,6 +15,7 @@ > > #include <linux/clk.h> > > #include <linux/delay.h> > > #include <linux/irq.h> > > +#include <linux/media-bus-format.h> > > #include <linux/of_device.h> > > #include <linux/phy/phy.h> > > > > @@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, > > pm_runtime_put_sync(dsi->dev); > > } > > > > +/* > > + * This pixel output formats list referenced from, > > + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > > + * 3.7.4 Pixel formats > > + * Table 14. DSI pixel packing formats > > + */ > > +static const u32 samsung_dsim_pixel_output_fmts[] = { > > You can also add : > > MEDIA_BUS_FMT_YUYV10_1X20 > > MEDIA_BUS_FMT_YUYV12_1X24 Are these for the below formats? "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2 Packed Pixel Stream, 24-bit YCbCr, 4:2:2" > > > + MEDIA_BUS_FMT_UYVY8_1X16, > > + MEDIA_BUS_FMT_RGB101010_1X30, > > + MEDIA_BUS_FMT_RGB121212_1X36, > > + MEDIA_BUS_FMT_RGB565_1X16, > > + MEDIA_BUS_FMT_RGB666_1X18, > > + MEDIA_BUS_FMT_RGB888_1X24, > > +}; > > + > > +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) > > +{ > > + int i; > > + > > + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { > > + if (samsung_dsim_pixel_output_fmts[i] == fmt) > > + return true; > > + } > > + > > + return false; > > +} > > + > > +static u32 * > > +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, > > + struct drm_bridge_state *bridge_state, > > + struct drm_crtc_state *crtc_state, > > + struct drm_connector_state *conn_state, > > + u32 output_fmt, > > + unsigned int *num_input_fmts) > > +{ > > + u32 *input_fmts; > > + > > + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) > > + return NULL; > > + > > + *num_input_fmts = 1; > > Shouldn't this be 6 ? > > > + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); > > + if (!input_fmts) > > + return NULL; > > + > > + input_fmts[0] = output_fmt; > > Shouldn't this be a list of all 6 supported pixel formats ? Negotiation would settle to return one input_fmt from the list of supporting output_fmts. so the num_input_fmts would be 1 rather than the number of fmts in the supporting list. This is what I understood from the atomic_get_input_bus_fmts API. let me know if I miss something here. Jagan.
On 10.11.2022 19:38, Jagan Teki wrote: > Finding the right input bus format throughout the pipeline is hard > so add atomic_get_input_bus_fmts callback and initialize with the > proper input format from list of supported output formats. > > This format can be used in pipeline for negotiating bus format between > the DSI-end of this bridge and the other component closer to pipeline > components. > > List of Pixel formats are taken from, > AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > 3.7.4 Pixel formats > Table 14. DSI pixel packing formats > > v8: > * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 > > v7, v6, v5, v4: > * none > > v3: > * include media-bus-format.h > > v2: > * none > > v1: > * new patch > > Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> > --- > drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ > 1 file changed, 53 insertions(+) > > diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c > index 0fe153b29e4f..33e5ae9c865f 100644 > --- a/drivers/gpu/drm/bridge/samsung-dsim.c > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > @@ -15,6 +15,7 @@ > #include <linux/clk.h> > #include <linux/delay.h> > #include <linux/irq.h> > +#include <linux/media-bus-format.h> > #include <linux/of_device.h> > #include <linux/phy/phy.h> > > @@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, > pm_runtime_put_sync(dsi->dev); > } > > +/* > + * This pixel output formats list referenced from, > + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > + * 3.7.4 Pixel formats > + * Table 14. DSI pixel packing formats > + */ > +static const u32 samsung_dsim_pixel_output_fmts[] = { > + MEDIA_BUS_FMT_UYVY8_1X16, > + MEDIA_BUS_FMT_RGB101010_1X30, > + MEDIA_BUS_FMT_RGB121212_1X36, > + MEDIA_BUS_FMT_RGB565_1X16, > + MEDIA_BUS_FMT_RGB666_1X18, > + MEDIA_BUS_FMT_RGB888_1X24, > +}; > + > +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) > +{ > + int i; > + > + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { > + if (samsung_dsim_pixel_output_fmts[i] == fmt) > + return true; > + } > + > + return false; > +} > + > +static u32 * > +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, > + struct drm_bridge_state *bridge_state, > + struct drm_crtc_state *crtc_state, > + struct drm_connector_state *conn_state, > + u32 output_fmt, > + unsigned int *num_input_fmts) > +{ > + u32 *input_fmts; > + > + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) > + return NULL; Please add support for MEDIA_BUS_FMT_FIXED and maybe default to MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched. Otherwise the above check breaks all current clients of the Samsung DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all DSI panels requests such format on my test systems... > + > + *num_input_fmts = 1; > + > + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); > + if (!input_fmts) > + return NULL; > + > + input_fmts[0] = output_fmt; > + > + return input_fmts; > +} > + > static int samsung_dsim_atomic_check(struct drm_bridge *bridge, > struct drm_bridge_state *bridge_state, > struct drm_crtc_state *crtc_state, > @@ -1385,6 +1437,7 @@ static const struct drm_bridge_funcs samsung_dsim_bridge_funcs = { > .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, > .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, > .atomic_reset = drm_atomic_helper_bridge_reset, > + .atomic_get_input_bus_fmts = samsung_dsim_atomic_get_input_bus_fmts, > .atomic_check = samsung_dsim_atomic_check, > .atomic_pre_enable = samsung_dsim_atomic_pre_enable, > .atomic_enable = samsung_dsim_atomic_enable, Best regards
On 14.11.2022 11:57, Marek Szyprowski wrote: > On 10.11.2022 19:38, Jagan Teki wrote: >> Finding the right input bus format throughout the pipeline is hard >> so add atomic_get_input_bus_fmts callback and initialize with the >> proper input format from list of supported output formats. >> >> This format can be used in pipeline for negotiating bus format between >> the DSI-end of this bridge and the other component closer to pipeline >> components. >> >> List of Pixel formats are taken from, >> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >> 3.7.4 Pixel formats >> Table 14. DSI pixel packing formats >> >> v8: >> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 >> >> v7, v6, v5, v4: >> * none >> >> v3: >> * include media-bus-format.h >> >> v2: >> * none >> >> v1: >> * new patch >> >> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >> --- >> drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ >> 1 file changed, 53 insertions(+) >> >> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >> b/drivers/gpu/drm/bridge/samsung-dsim.c >> index 0fe153b29e4f..33e5ae9c865f 100644 >> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >> @@ -15,6 +15,7 @@ >> #include <linux/clk.h> >> #include <linux/delay.h> >> #include <linux/irq.h> >> +#include <linux/media-bus-format.h> >> #include <linux/of_device.h> >> #include <linux/phy/phy.h> >> @@ -1321,6 +1322,57 @@ static void >> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >> pm_runtime_put_sync(dsi->dev); >> } >> +/* >> + * This pixel output formats list referenced from, >> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >> + * 3.7.4 Pixel formats >> + * Table 14. DSI pixel packing formats >> + */ >> +static const u32 samsung_dsim_pixel_output_fmts[] = { >> + MEDIA_BUS_FMT_UYVY8_1X16, >> + MEDIA_BUS_FMT_RGB101010_1X30, >> + MEDIA_BUS_FMT_RGB121212_1X36, >> + MEDIA_BUS_FMT_RGB565_1X16, >> + MEDIA_BUS_FMT_RGB666_1X18, >> + MEDIA_BUS_FMT_RGB888_1X24, >> +}; >> + >> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >> +{ >> + int i; >> + >> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { >> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >> + return true; >> + } >> + >> + return false; >> +} >> + >> +static u32 * >> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >> + struct drm_bridge_state *bridge_state, >> + struct drm_crtc_state *crtc_state, >> + struct drm_connector_state *conn_state, >> + u32 output_fmt, >> + unsigned int *num_input_fmts) >> +{ >> + u32 *input_fmts; >> + >> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >> + return NULL; > > > Please add support for MEDIA_BUS_FMT_FIXED and maybe default to > MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched. > > Otherwise the above check breaks all current clients of the Samsung > DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all > DSI panels requests such format on my test systems... I've checked a bit more the bus format related code and it looks that there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_* formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for them. On Arndale board with Toshiba tc358764 bridge the MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel, but this doesn't look like a format really needed on that bridge). A bit more logic seems to be needed there to make it working properly. I suggest to move all this bus format related changes into a separate patchset and adjust other bridges/panels/etc as needed in it. > >> + >> + *num_input_fmts = 1; >> + >> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); >> + if (!input_fmts) >> + return NULL; >> + >> + input_fmts[0] = output_fmt; >> + >> + return input_fmts; >> +} >> + >> static int samsung_dsim_atomic_check(struct drm_bridge *bridge, >> struct drm_bridge_state *bridge_state, >> struct drm_crtc_state *crtc_state, >> @@ -1385,6 +1437,7 @@ static const struct drm_bridge_funcs >> samsung_dsim_bridge_funcs = { >> .atomic_duplicate_state = >> drm_atomic_helper_bridge_duplicate_state, >> .atomic_destroy_state = >> drm_atomic_helper_bridge_destroy_state, >> .atomic_reset = drm_atomic_helper_bridge_reset, >> + .atomic_get_input_bus_fmts = >> samsung_dsim_atomic_get_input_bus_fmts, >> .atomic_check = samsung_dsim_atomic_check, >> .atomic_pre_enable = samsung_dsim_atomic_pre_enable, >> .atomic_enable = samsung_dsim_atomic_enable, > > Best regards Best regards
On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski <m.szyprowski@samsung.com> wrote: > > On 14.11.2022 11:57, Marek Szyprowski wrote: > > On 10.11.2022 19:38, Jagan Teki wrote: > >> Finding the right input bus format throughout the pipeline is hard > >> so add atomic_get_input_bus_fmts callback and initialize with the > >> proper input format from list of supported output formats. > >> > >> This format can be used in pipeline for negotiating bus format between > >> the DSI-end of this bridge and the other component closer to pipeline > >> components. > >> > >> List of Pixel formats are taken from, > >> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > >> 3.7.4 Pixel formats > >> Table 14. DSI pixel packing formats > >> > >> v8: > >> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 > >> > >> v7, v6, v5, v4: > >> * none > >> > >> v3: > >> * include media-bus-format.h > >> > >> v2: > >> * none > >> > >> v1: > >> * new patch > >> > >> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> > >> --- > >> drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ > >> 1 file changed, 53 insertions(+) > >> > >> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c > >> b/drivers/gpu/drm/bridge/samsung-dsim.c > >> index 0fe153b29e4f..33e5ae9c865f 100644 > >> --- a/drivers/gpu/drm/bridge/samsung-dsim.c > >> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > >> @@ -15,6 +15,7 @@ > >> #include <linux/clk.h> > >> #include <linux/delay.h> > >> #include <linux/irq.h> > >> +#include <linux/media-bus-format.h> > >> #include <linux/of_device.h> > >> #include <linux/phy/phy.h> > >> @@ -1321,6 +1322,57 @@ static void > >> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, > >> pm_runtime_put_sync(dsi->dev); > >> } > >> +/* > >> + * This pixel output formats list referenced from, > >> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > >> + * 3.7.4 Pixel formats > >> + * Table 14. DSI pixel packing formats > >> + */ > >> +static const u32 samsung_dsim_pixel_output_fmts[] = { > >> + MEDIA_BUS_FMT_UYVY8_1X16, > >> + MEDIA_BUS_FMT_RGB101010_1X30, > >> + MEDIA_BUS_FMT_RGB121212_1X36, > >> + MEDIA_BUS_FMT_RGB565_1X16, > >> + MEDIA_BUS_FMT_RGB666_1X18, > >> + MEDIA_BUS_FMT_RGB888_1X24, > >> +}; > >> + > >> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) > >> +{ > >> + int i; > >> + > >> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { > >> + if (samsung_dsim_pixel_output_fmts[i] == fmt) > >> + return true; > >> + } > >> + > >> + return false; > >> +} > >> + > >> +static u32 * > >> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, > >> + struct drm_bridge_state *bridge_state, > >> + struct drm_crtc_state *crtc_state, > >> + struct drm_connector_state *conn_state, > >> + u32 output_fmt, > >> + unsigned int *num_input_fmts) > >> +{ > >> + u32 *input_fmts; > >> + > >> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) > >> + return NULL; > > > > > > Please add support for MEDIA_BUS_FMT_FIXED and maybe default to > > MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched. > > > > Otherwise the above check breaks all current clients of the Samsung > > DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all > > DSI panels requests such format on my test systems... > > I've checked a bit more the bus format related code and it looks that > there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_* > formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for > them. On Arndale board with Toshiba tc358764 bridge the > MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in > samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel, dsim => tc358764 => panel-simple If I understand the bridge format negotiation correctly - If atomic_get_input_bus_fmts is not implemented in tc358764 then MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats. from include/drm/drm_bridge.h: * This method is called on all elements of the bridge chain as part of * the bus format negotiation process that happens in * drm_atomic_bridge_chain_select_bus_fmts(). * This method is optional. When not implemented, the core will bypass * bus format negotiation on this element of the bridge without * failing, and the previous element in the chain will be passed * MEDIA_BUS_FMT_FIXED as its output bus format. As I can see tc358764 is not implemented either atomic_get_input_bus_fmts or atomic API, so I think dsim gets the MEDIA_BUS_FMT_FIXED bridge pipeline. I have tested sn65dsi without atomic_get_input_bus_fmts I can see the dsim is getting MEDIA_BUS_FMT_FIXED. Can you check the same from your side? On the other side, MEDIA_BUS_FMT_RGB888_1X7X4_SPWG is 24-bit samples transferred over an LVDS bus with four differential data pairs, serialized into 7-time slots using SPWG which indeed a MEDIA_BUS_FMT_RGB888_1X24 input_fmt for the bridge. so handling in the supported list and reassigning the RGB888_1X24 would be the proper way to handle this format. Jagan.
Hi Jagan, On 14.11.2022 18:07, Jagan Teki wrote: > On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski > <m.szyprowski@samsung.com> wrote: >> On 14.11.2022 11:57, Marek Szyprowski wrote: >>> On 10.11.2022 19:38, Jagan Teki wrote: >>>> Finding the right input bus format throughout the pipeline is hard >>>> so add atomic_get_input_bus_fmts callback and initialize with the >>>> proper input format from list of supported output formats. >>>> >>>> This format can be used in pipeline for negotiating bus format between >>>> the DSI-end of this bridge and the other component closer to pipeline >>>> components. >>>> >>>> List of Pixel formats are taken from, >>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>> 3.7.4 Pixel formats >>>> Table 14. DSI pixel packing formats >>>> >>>> v8: >>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 >>>> >>>> v7, v6, v5, v4: >>>> * none >>>> >>>> v3: >>>> * include media-bus-format.h >>>> >>>> v2: >>>> * none >>>> >>>> v1: >>>> * new patch >>>> >>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >>>> --- >>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ >>>> 1 file changed, 53 insertions(+) >>>> >>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>>> index 0fe153b29e4f..33e5ae9c865f 100644 >>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>>> @@ -15,6 +15,7 @@ >>>> #include <linux/clk.h> >>>> #include <linux/delay.h> >>>> #include <linux/irq.h> >>>> +#include <linux/media-bus-format.h> >>>> #include <linux/of_device.h> >>>> #include <linux/phy/phy.h> >>>> @@ -1321,6 +1322,57 @@ static void >>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >>>> pm_runtime_put_sync(dsi->dev); >>>> } >>>> +/* >>>> + * This pixel output formats list referenced from, >>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>> + * 3.7.4 Pixel formats >>>> + * Table 14. DSI pixel packing formats >>>> + */ >>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { >>>> + MEDIA_BUS_FMT_UYVY8_1X16, >>>> + MEDIA_BUS_FMT_RGB101010_1X30, >>>> + MEDIA_BUS_FMT_RGB121212_1X36, >>>> + MEDIA_BUS_FMT_RGB565_1X16, >>>> + MEDIA_BUS_FMT_RGB666_1X18, >>>> + MEDIA_BUS_FMT_RGB888_1X24, >>>> +}; >>>> + >>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >>>> +{ >>>> + int i; >>>> + >>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { >>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >>>> + return true; >>>> + } >>>> + >>>> + return false; >>>> +} >>>> + >>>> +static u32 * >>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >>>> + struct drm_bridge_state *bridge_state, >>>> + struct drm_crtc_state *crtc_state, >>>> + struct drm_connector_state *conn_state, >>>> + u32 output_fmt, >>>> + unsigned int *num_input_fmts) >>>> +{ >>>> + u32 *input_fmts; >>>> + >>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >>>> + return NULL; >>> >>> Please add support for MEDIA_BUS_FMT_FIXED and maybe default to >>> MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched. >>> >>> Otherwise the above check breaks all current clients of the Samsung >>> DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all >>> DSI panels requests such format on my test systems... >> I've checked a bit more the bus format related code and it looks that >> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_* >> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for >> them. On Arndale board with Toshiba tc358764 bridge the >> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in >> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel, > dsim => tc358764 => panel-simple > > If I understand the bridge format negotiation correctly - If > atomic_get_input_bus_fmts is not implemented in tc358764 then > MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign > MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats. > > from include/drm/drm_bridge.h: > > * This method is called on all elements of the bridge chain as part of > * the bus format negotiation process that happens in > * drm_atomic_bridge_chain_select_bus_fmts(). > * This method is optional. When not implemented, the core will bypass > * bus format negotiation on this element of the bridge without > * failing, and the previous element in the chain will be passed > * MEDIA_BUS_FMT_FIXED as its output bus format. > > As I can see tc358764 is not implemented either > atomic_get_input_bus_fmts or atomic API, so I think dsim gets the > MEDIA_BUS_FMT_FIXED bridge pipeline. I have tested sn65dsi without > atomic_get_input_bus_fmts I can see the dsim is getting > MEDIA_BUS_FMT_FIXED. > > Can you check the same from your side? Here in case of Arndale 5250 with the following pipeline: dsim => tc358764 => panel-simple (boe,hv070wsa-100 panel) the DRM core requests MEDIA_BUS_FMT_RGB888_1X7X4_SPWG format, taken from the boe_hv070wsa panel (see from drivers/gpu/drm/panel/panel-simple.c). Please note that in case of Exynos, the reversed bridge chain order is used for dsim, so this is another nasty consequence of that hack. :/ Maybe if no compatible bus format is found, the driver should force MEDIA_BUS_FMT_RGB888_1X24 until a proper format negotiation is implemented and hacks removed? Best regards
On 15.11.22 09:09, Marek Szyprowski wrote: > Hi Jagan, > > On 14.11.2022 18:07, Jagan Teki wrote: >> On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski >> <m.szyprowski@samsung.com> wrote: >>> On 14.11.2022 11:57, Marek Szyprowski wrote: >>>> On 10.11.2022 19:38, Jagan Teki wrote: >>>>> Finding the right input bus format throughout the pipeline is hard >>>>> so add atomic_get_input_bus_fmts callback and initialize with the >>>>> proper input format from list of supported output formats. >>>>> >>>>> This format can be used in pipeline for negotiating bus format between >>>>> the DSI-end of this bridge and the other component closer to pipeline >>>>> components. >>>>> >>>>> List of Pixel formats are taken from, >>>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>> 3.7.4 Pixel formats >>>>> Table 14. DSI pixel packing formats >>>>> >>>>> v8: >>>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 >>>>> >>>>> v7, v6, v5, v4: >>>>> * none >>>>> >>>>> v3: >>>>> * include media-bus-format.h >>>>> >>>>> v2: >>>>> * none >>>>> >>>>> v1: >>>>> * new patch >>>>> >>>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >>>>> --- >>>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ >>>>> 1 file changed, 53 insertions(+) >>>>> >>>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> index 0fe153b29e4f..33e5ae9c865f 100644 >>>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> @@ -15,6 +15,7 @@ >>>>> #include <linux/clk.h> >>>>> #include <linux/delay.h> >>>>> #include <linux/irq.h> >>>>> +#include <linux/media-bus-format.h> >>>>> #include <linux/of_device.h> >>>>> #include <linux/phy/phy.h> >>>>> @@ -1321,6 +1322,57 @@ static void >>>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >>>>> pm_runtime_put_sync(dsi->dev); >>>>> } >>>>> +/* >>>>> + * This pixel output formats list referenced from, >>>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>> + * 3.7.4 Pixel formats >>>>> + * Table 14. DSI pixel packing formats >>>>> + */ >>>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { >>>>> + MEDIA_BUS_FMT_UYVY8_1X16, >>>>> + MEDIA_BUS_FMT_RGB101010_1X30, >>>>> + MEDIA_BUS_FMT_RGB121212_1X36, >>>>> + MEDIA_BUS_FMT_RGB565_1X16, >>>>> + MEDIA_BUS_FMT_RGB666_1X18, >>>>> + MEDIA_BUS_FMT_RGB888_1X24, >>>>> +}; >>>>> + >>>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >>>>> +{ >>>>> + int i; >>>>> + >>>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { >>>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >>>>> + return true; >>>>> + } >>>>> + >>>>> + return false; >>>>> +} >>>>> + >>>>> +static u32 * >>>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >>>>> + struct drm_bridge_state *bridge_state, >>>>> + struct drm_crtc_state *crtc_state, >>>>> + struct drm_connector_state *conn_state, >>>>> + u32 output_fmt, >>>>> + unsigned int *num_input_fmts) >>>>> +{ >>>>> + u32 *input_fmts; >>>>> + >>>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >>>>> + return NULL; >>>> >>>> Please add support for MEDIA_BUS_FMT_FIXED and maybe default to >>>> MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched. >>>> >>>> Otherwise the above check breaks all current clients of the Samsung >>>> DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all >>>> DSI panels requests such format on my test systems... >>> I've checked a bit more the bus format related code and it looks that >>> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_* >>> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for >>> them. On Arndale board with Toshiba tc358764 bridge the >>> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in >>> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel, >> dsim => tc358764 => panel-simple >> >> If I understand the bridge format negotiation correctly - If >> atomic_get_input_bus_fmts is not implemented in tc358764 then >> MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign >> MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats. >> >> from include/drm/drm_bridge.h: >> >> * This method is called on all elements of the bridge chain as part of >> * the bus format negotiation process that happens in >> * drm_atomic_bridge_chain_select_bus_fmts(). >> * This method is optional. When not implemented, the core will bypass >> * bus format negotiation on this element of the bridge without >> * failing, and the previous element in the chain will be passed >> * MEDIA_BUS_FMT_FIXED as its output bus format. >> >> As I can see tc358764 is not implemented either >> atomic_get_input_bus_fmts or atomic API, so I think dsim gets the >> MEDIA_BUS_FMT_FIXED bridge pipeline. I have tested sn65dsi without >> atomic_get_input_bus_fmts I can see the dsim is getting >> MEDIA_BUS_FMT_FIXED. >> >> Can you check the same from your side? > > Here in case of Arndale 5250 with the following pipeline: > > dsim => tc358764 => panel-simple (boe,hv070wsa-100 panel) > > the DRM core requests MEDIA_BUS_FMT_RGB888_1X7X4_SPWG format, taken from the boe_hv070wsa panel (see from drivers/gpu/drm/panel/panel-simple.c). Please note that in case of Exynos, the reversed bridge chain order is used for dsim, so this is another nasty consequence of that hack. :/ > > Maybe if no compatible bus format is found, the driver should force > MEDIA_BUS_FMT_RGB888_1X24 until a proper format negotiation is > implemented and hacks removed? For this specific case, wouldn't it be better to just fix the format negotiation for tc358764 using atomic_get_input_bus_fmts()? It should probably do the same as sn65dsi83 and request MEDIA_BUS_FMT_RGB888_1X24 from the DSI. Forwarding the LVDS-specific format to the input is obviously the wrong thing for the tc358764 driver to do. But I agree, if there are other problematic pipelines with other bridge/display drivers that don't pass a correct format, we should accept them for now and fall back to a sane default (MEDIA_BUS_FMT_RGB888_1X24) and fix the other drivers afterwards. Let's not delay this series any further and better work on how to get it merged before we miss another merge window.
On Tue, Nov 15, 2022 at 2:18 PM Frieder Schrempf <frieder.schrempf@kontron.de> wrote: > > On 15.11.22 09:09, Marek Szyprowski wrote: > > Hi Jagan, > > > > On 14.11.2022 18:07, Jagan Teki wrote: > >> On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski > >> <m.szyprowski@samsung.com> wrote: > >>> On 14.11.2022 11:57, Marek Szyprowski wrote: > >>>> On 10.11.2022 19:38, Jagan Teki wrote: > >>>>> Finding the right input bus format throughout the pipeline is hard > >>>>> so add atomic_get_input_bus_fmts callback and initialize with the > >>>>> proper input format from list of supported output formats. > >>>>> > >>>>> This format can be used in pipeline for negotiating bus format between > >>>>> the DSI-end of this bridge and the other component closer to pipeline > >>>>> components. > >>>>> > >>>>> List of Pixel formats are taken from, > >>>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > >>>>> 3.7.4 Pixel formats > >>>>> Table 14. DSI pixel packing formats > >>>>> > >>>>> v8: > >>>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 > >>>>> > >>>>> v7, v6, v5, v4: > >>>>> * none > >>>>> > >>>>> v3: > >>>>> * include media-bus-format.h > >>>>> > >>>>> v2: > >>>>> * none > >>>>> > >>>>> v1: > >>>>> * new patch > >>>>> > >>>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> > >>>>> --- > >>>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ > >>>>> 1 file changed, 53 insertions(+) > >>>>> > >>>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>> b/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>> index 0fe153b29e4f..33e5ae9c865f 100644 > >>>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>> @@ -15,6 +15,7 @@ > >>>>> #include <linux/clk.h> > >>>>> #include <linux/delay.h> > >>>>> #include <linux/irq.h> > >>>>> +#include <linux/media-bus-format.h> > >>>>> #include <linux/of_device.h> > >>>>> #include <linux/phy/phy.h> > >>>>> @@ -1321,6 +1322,57 @@ static void > >>>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, > >>>>> pm_runtime_put_sync(dsi->dev); > >>>>> } > >>>>> +/* > >>>>> + * This pixel output formats list referenced from, > >>>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > >>>>> + * 3.7.4 Pixel formats > >>>>> + * Table 14. DSI pixel packing formats > >>>>> + */ > >>>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { > >>>>> + MEDIA_BUS_FMT_UYVY8_1X16, > >>>>> + MEDIA_BUS_FMT_RGB101010_1X30, > >>>>> + MEDIA_BUS_FMT_RGB121212_1X36, > >>>>> + MEDIA_BUS_FMT_RGB565_1X16, > >>>>> + MEDIA_BUS_FMT_RGB666_1X18, > >>>>> + MEDIA_BUS_FMT_RGB888_1X24, > >>>>> +}; > >>>>> + > >>>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) > >>>>> +{ > >>>>> + int i; > >>>>> + > >>>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { > >>>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) > >>>>> + return true; > >>>>> + } > >>>>> + > >>>>> + return false; > >>>>> +} > >>>>> + > >>>>> +static u32 * > >>>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, > >>>>> + struct drm_bridge_state *bridge_state, > >>>>> + struct drm_crtc_state *crtc_state, > >>>>> + struct drm_connector_state *conn_state, > >>>>> + u32 output_fmt, > >>>>> + unsigned int *num_input_fmts) > >>>>> +{ > >>>>> + u32 *input_fmts; > >>>>> + > >>>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) > >>>>> + return NULL; > >>>> > >>>> Please add support for MEDIA_BUS_FMT_FIXED and maybe default to > >>>> MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched. > >>>> > >>>> Otherwise the above check breaks all current clients of the Samsung > >>>> DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all > >>>> DSI panels requests such format on my test systems... > >>> I've checked a bit more the bus format related code and it looks that > >>> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_* > >>> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for > >>> them. On Arndale board with Toshiba tc358764 bridge the > >>> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in > >>> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel, > >> dsim => tc358764 => panel-simple > >> > >> If I understand the bridge format negotiation correctly - If > >> atomic_get_input_bus_fmts is not implemented in tc358764 then > >> MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign > >> MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats. > >> > >> from include/drm/drm_bridge.h: > >> > >> * This method is called on all elements of the bridge chain as part of > >> * the bus format negotiation process that happens in > >> * drm_atomic_bridge_chain_select_bus_fmts(). > >> * This method is optional. When not implemented, the core will bypass > >> * bus format negotiation on this element of the bridge without > >> * failing, and the previous element in the chain will be passed > >> * MEDIA_BUS_FMT_FIXED as its output bus format. > >> > >> As I can see tc358764 is not implemented either > >> atomic_get_input_bus_fmts or atomic API, so I think dsim gets the > >> MEDIA_BUS_FMT_FIXED bridge pipeline. I have tested sn65dsi without > >> atomic_get_input_bus_fmts I can see the dsim is getting > >> MEDIA_BUS_FMT_FIXED. > >> > >> Can you check the same from your side? > > > > Here in case of Arndale 5250 with the following pipeline: > > > > dsim => tc358764 => panel-simple (boe,hv070wsa-100 panel) > > > > the DRM core requests MEDIA_BUS_FMT_RGB888_1X7X4_SPWG format, taken from the boe_hv070wsa panel (see from drivers/gpu/drm/panel/panel-simple.c). Please note that in case of Exynos, the reversed bridge chain order is used for dsim, so this is another nasty consequence of that hack. :/ > > > > Maybe if no compatible bus format is found, the driver should force > > MEDIA_BUS_FMT_RGB888_1X24 until a proper format negotiation is > > implemented and hacks removed? > > For this specific case, wouldn't it be better to just fix the format > negotiation for tc358764 using atomic_get_input_bus_fmts()? It should > probably do the same as sn65dsi83 and request MEDIA_BUS_FMT_RGB888_1X24 > from the DSI. > > Forwarding the LVDS-specific format to the input is obviously the wrong > thing for the tc358764 driver to do. > > But I agree, if there are other problematic pipelines with other > bridge/display drivers that don't pass a correct format, we should > accept them for now and fall back to a sane default > (MEDIA_BUS_FMT_RGB888_1X24) and fix the other drivers afterwards. > > Let's not delay this series any further and better work on how to get it > merged before we miss another merge window. Agreed this point, here is the updated diff (on top of this patch) for falling back to the default format for those. +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -1387,6 +1387,8 @@ static const u32 samsung_dsim_pixel_output_fmts[] = { MEDIA_BUS_FMT_RGB565_1X16, MEDIA_BUS_FMT_RGB666_1X18, MEDIA_BUS_FMT_RGB888_1X24, + + MEDIA_BUS_FMT_FIXED, }; static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) @@ -1412,7 +1414,13 @@ samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, u32 *input_fmts; if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) - return NULL; + /* + * Some bridge/display drivers are still not able to pass + * the correct format, so handle those pipelines by falling + * back to the default format till the supported format list + * gets finalized. + */ + output_fmt = MEDIA_BUS_FMT_RGB888_1X24; *num_input_fmts = 1; @@ -1420,7 +1428,14 @@ samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, if (!input_fmts) return NULL; - input_fmts[0] = output_fmt; + switch (output_fmt) { + case MEDIA_BUS_FMT_FIXED: + input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; + break; + default: + input_fmts[0] = output_fmt; + break; + } return input_fmts; If all is okay, I will send v9 which would probably test it for the final version to merge. Thanks, Jagan.
On 11/14/22 08:49, Jagan Teki wrote: > On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut <marex@denx.de> wrote: >> >> On 11/10/22 19:38, Jagan Teki wrote: >>> Finding the right input bus format throughout the pipeline is hard >>> so add atomic_get_input_bus_fmts callback and initialize with the >>> proper input format from list of supported output formats. >>> >>> This format can be used in pipeline for negotiating bus format between >>> the DSI-end of this bridge and the other component closer to pipeline >>> components. >>> >>> List of Pixel formats are taken from, >>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>> 3.7.4 Pixel formats >>> Table 14. DSI pixel packing formats >>> >>> v8: >>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 >>> >>> v7, v6, v5, v4: >>> * none >>> >>> v3: >>> * include media-bus-format.h >>> >>> v2: >>> * none >>> >>> v1: >>> * new patch >>> >>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >>> --- >>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ >>> 1 file changed, 53 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c >>> index 0fe153b29e4f..33e5ae9c865f 100644 >>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>> @@ -15,6 +15,7 @@ >>> #include <linux/clk.h> >>> #include <linux/delay.h> >>> #include <linux/irq.h> >>> +#include <linux/media-bus-format.h> >>> #include <linux/of_device.h> >>> #include <linux/phy/phy.h> >>> >>> @@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >>> pm_runtime_put_sync(dsi->dev); >>> } >>> >>> +/* >>> + * This pixel output formats list referenced from, >>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>> + * 3.7.4 Pixel formats >>> + * Table 14. DSI pixel packing formats >>> + */ >>> +static const u32 samsung_dsim_pixel_output_fmts[] = { >> >> You can also add : >> >> MEDIA_BUS_FMT_YUYV10_1X20 >> >> MEDIA_BUS_FMT_YUYV12_1X24 > > Are these for the below formats? > > "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2 > Packed Pixel Stream, 24-bit YCbCr, 4:2:2" >> >>> + MEDIA_BUS_FMT_UYVY8_1X16, >>> + MEDIA_BUS_FMT_RGB101010_1X30, >>> + MEDIA_BUS_FMT_RGB121212_1X36, >>> + MEDIA_BUS_FMT_RGB565_1X16, >>> + MEDIA_BUS_FMT_RGB666_1X18, >>> + MEDIA_BUS_FMT_RGB888_1X24, >>> +}; >>> + >>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >>> +{ >>> + int i; >>> + >>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { >>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >>> + return true; >>> + } >>> + >>> + return false; >>> +} >>> + >>> +static u32 * >>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >>> + struct drm_bridge_state *bridge_state, >>> + struct drm_crtc_state *crtc_state, >>> + struct drm_connector_state *conn_state, >>> + u32 output_fmt, >>> + unsigned int *num_input_fmts) >>> +{ >>> + u32 *input_fmts; >>> + >>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >>> + return NULL; >>> + >>> + *num_input_fmts = 1; >> >> Shouldn't this be 6 ? >> >>> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); >>> + if (!input_fmts) >>> + return NULL; >>> + >>> + input_fmts[0] = output_fmt; >> >> Shouldn't this be a list of all 6 supported pixel formats ? > > Negotiation would settle to return one input_fmt from the list of > supporting output_fmts. so the num_input_fmts would be 1 rather than > the number of fmts in the supporting list. This is what I understood > from the atomic_get_input_bus_fmts API. let me know if I miss > something here. How does the negotiation work for this kind of pipeline: LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector where all elements (LCDIFv3, DSIM, HDMI bridge) can support either RGB888 or packed YUV422 ? Who decides the format used by such pipeline ? Why should it be the DSIM bridge and not e.g. the HDMI bridge or the LCDIFv3 ?
Hi Jagan, On 15.11.2022 10:20, Jagan Teki wrote: > On Tue, Nov 15, 2022 at 2:18 PM Frieder Schrempf > <frieder.schrempf@kontron.de> wrote: >> On 15.11.22 09:09, Marek Szyprowski wrote: >>> On 14.11.2022 18:07, Jagan Teki wrote: >>>> On Mon, Nov 14, 2022 at 8:10 PM Marek Szyprowski >>>> <m.szyprowski@samsung.com> wrote: >>>>> On 14.11.2022 11:57, Marek Szyprowski wrote: >>>>>> On 10.11.2022 19:38, Jagan Teki wrote: >>>>>>> Finding the right input bus format throughout the pipeline is hard >>>>>>> so add atomic_get_input_bus_fmts callback and initialize with the >>>>>>> proper input format from list of supported output formats. >>>>>>> >>>>>>> This format can be used in pipeline for negotiating bus format between >>>>>>> the DSI-end of this bridge and the other component closer to pipeline >>>>>>> components. >>>>>>> >>>>>>> List of Pixel formats are taken from, >>>>>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>>>> 3.7.4 Pixel formats >>>>>>> Table 14. DSI pixel packing formats >>>>>>> >>>>>>> v8: >>>>>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI DSI/CSI-2 >>>>>>> >>>>>>> v7, v6, v5, v4: >>>>>>> * none >>>>>>> >>>>>>> v3: >>>>>>> * include media-bus-format.h >>>>>>> >>>>>>> v2: >>>>>>> * none >>>>>>> >>>>>>> v1: >>>>>>> * new patch >>>>>>> >>>>>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >>>>>>> --- >>>>>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 +++++++++++++++++++++++++++ >>>>>>> 1 file changed, 53 insertions(+) >>>>>>> >>>>>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>>> index 0fe153b29e4f..33e5ae9c865f 100644 >>>>>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>>> @@ -15,6 +15,7 @@ >>>>>>> #include <linux/clk.h> >>>>>>> #include <linux/delay.h> >>>>>>> #include <linux/irq.h> >>>>>>> +#include <linux/media-bus-format.h> >>>>>>> #include <linux/of_device.h> >>>>>>> #include <linux/phy/phy.h> >>>>>>> @@ -1321,6 +1322,57 @@ static void >>>>>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >>>>>>> pm_runtime_put_sync(dsi->dev); >>>>>>> } >>>>>>> +/* >>>>>>> + * This pixel output formats list referenced from, >>>>>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>>>> + * 3.7.4 Pixel formats >>>>>>> + * Table 14. DSI pixel packing formats >>>>>>> + */ >>>>>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { >>>>>>> + MEDIA_BUS_FMT_UYVY8_1X16, >>>>>>> + MEDIA_BUS_FMT_RGB101010_1X30, >>>>>>> + MEDIA_BUS_FMT_RGB121212_1X36, >>>>>>> + MEDIA_BUS_FMT_RGB565_1X16, >>>>>>> + MEDIA_BUS_FMT_RGB666_1X18, >>>>>>> + MEDIA_BUS_FMT_RGB888_1X24, >>>>>>> +}; >>>>>>> + >>>>>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >>>>>>> +{ >>>>>>> + int i; >>>>>>> + >>>>>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { >>>>>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >>>>>>> + return true; >>>>>>> + } >>>>>>> + >>>>>>> + return false; >>>>>>> +} >>>>>>> + >>>>>>> +static u32 * >>>>>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >>>>>>> + struct drm_bridge_state *bridge_state, >>>>>>> + struct drm_crtc_state *crtc_state, >>>>>>> + struct drm_connector_state *conn_state, >>>>>>> + u32 output_fmt, >>>>>>> + unsigned int *num_input_fmts) >>>>>>> +{ >>>>>>> + u32 *input_fmts; >>>>>>> + >>>>>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >>>>>>> + return NULL; >>>>>> Please add support for MEDIA_BUS_FMT_FIXED and maybe default to >>>>>> MEDIA_BUS_FMT_RGB888_1X24 if requested format is not matched. >>>>>> >>>>>> Otherwise the above check breaks all current clients of the Samsung >>>>>> DSIM/Exynos DSI. I didn't dig into the bus matching code yet, but all >>>>>> DSI panels requests such format on my test systems... >>>>> I've checked a bit more the bus format related code and it looks that >>>>> there are more issues. The DSI panels don't use the MEDIA_BUS_FMT_* >>>>> formats thus the bridge negotiation code selects MEDIA_BUS_FMT_FIXED for >>>>> them. On Arndale board with Toshiba tc358764 bridge the >>>>> MEDIA_BUS_FMT_RGB888_1X7X4_SPWG output_fmt is requested in >>>>> samsung_dsim_atomic_get_input_bus_fmts() (forwarded from the LVDS panel, >>>> dsim => tc358764 => panel-simple >>>> >>>> If I understand the bridge format negotiation correctly - If >>>> atomic_get_input_bus_fmts is not implemented in tc358764 then >>>> MEDIA_BUS_FMT_FIXED will be the output_fmt for dsim so we can assign >>>> MEDIA_BUS_FMT_RGB888_1X24 for FIXED formats. >>>> >>>> from include/drm/drm_bridge.h: >>>> >>>> * This method is called on all elements of the bridge chain as part of >>>> * the bus format negotiation process that happens in >>>> * drm_atomic_bridge_chain_select_bus_fmts(). >>>> * This method is optional. When not implemented, the core will bypass >>>> * bus format negotiation on this element of the bridge without >>>> * failing, and the previous element in the chain will be passed >>>> * MEDIA_BUS_FMT_FIXED as its output bus format. >>>> >>>> As I can see tc358764 is not implemented either >>>> atomic_get_input_bus_fmts or atomic API, so I think dsim gets the >>>> MEDIA_BUS_FMT_FIXED bridge pipeline. I have tested sn65dsi without >>>> atomic_get_input_bus_fmts I can see the dsim is getting >>>> MEDIA_BUS_FMT_FIXED. >>>> >>>> Can you check the same from your side? >>> Here in case of Arndale 5250 with the following pipeline: >>> >>> dsim => tc358764 => panel-simple (boe,hv070wsa-100 panel) >>> >>> the DRM core requests MEDIA_BUS_FMT_RGB888_1X7X4_SPWG format, taken from the boe_hv070wsa panel (see from drivers/gpu/drm/panel/panel-simple.c). Please note that in case of Exynos, the reversed bridge chain order is used for dsim, so this is another nasty consequence of that hack. :/ >>> >>> Maybe if no compatible bus format is found, the driver should force >>> MEDIA_BUS_FMT_RGB888_1X24 until a proper format negotiation is >>> implemented and hacks removed? >> For this specific case, wouldn't it be better to just fix the format >> negotiation for tc358764 using atomic_get_input_bus_fmts()? It should >> probably do the same as sn65dsi83 and request MEDIA_BUS_FMT_RGB888_1X24 >> from the DSI. >> >> Forwarding the LVDS-specific format to the input is obviously the wrong >> thing for the tc358764 driver to do. >> >> But I agree, if there are other problematic pipelines with other >> bridge/display drivers that don't pass a correct format, we should >> accept them for now and fall back to a sane default >> (MEDIA_BUS_FMT_RGB888_1X24) and fix the other drivers afterwards. >> >> Let's not delay this series any further and better work on how to get it >> merged before we miss another merge window. > Agreed this point, here is the updated diff (on top of this patch) for > falling back to the default format for those. > > +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > @@ -1387,6 +1387,8 @@ static const u32 samsung_dsim_pixel_output_fmts[] = { > MEDIA_BUS_FMT_RGB565_1X16, > MEDIA_BUS_FMT_RGB666_1X18, > MEDIA_BUS_FMT_RGB888_1X24, > + > + MEDIA_BUS_FMT_FIXED, > }; > > static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) > @@ -1412,7 +1414,13 @@ samsung_dsim_atomic_get_input_bus_fmts(struct > drm_bridge *bridge, > u32 *input_fmts; > > if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) > - return NULL; > + /* > + * Some bridge/display drivers are still not able to pass > + * the correct format, so handle those pipelines by falling > + * back to the default format till the supported format list > + * gets finalized. > + */ > + output_fmt = MEDIA_BUS_FMT_RGB888_1X24; > > *num_input_fmts = 1; > > @@ -1420,7 +1428,14 @@ samsung_dsim_atomic_get_input_bus_fmts(struct > drm_bridge *bridge, > if (!input_fmts) > return NULL; > > - input_fmts[0] = output_fmt; > + switch (output_fmt) { > + case MEDIA_BUS_FMT_FIXED: > + input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; > + break; > + default: > + input_fmts[0] = output_fmt; > + break; > + } > > return input_fmts; > > If all is okay, I will send v9 which would probably test it for the > final version to merge. This works for me (I've manually applied the above changes, due to malformed diff). Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Best regards
On 15.11.2022 13:00, Marek Vasut wrote: > On 11/14/22 08:49, Jagan Teki wrote: >> On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut <marex@denx.de> wrote: >>> >>> On 11/10/22 19:38, Jagan Teki wrote: >>>> Finding the right input bus format throughout the pipeline is hard >>>> so add atomic_get_input_bus_fmts callback and initialize with the >>>> proper input format from list of supported output formats. >>>> >>>> This format can be used in pipeline for negotiating bus format between >>>> the DSI-end of this bridge and the other component closer to pipeline >>>> components. >>>> >>>> List of Pixel formats are taken from, >>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>> 3.7.4 Pixel formats >>>> Table 14. DSI pixel packing formats >>>> >>>> v8: >>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI >>>> DSI/CSI-2 >>>> >>>> v7, v6, v5, v4: >>>> * none >>>> >>>> v3: >>>> * include media-bus-format.h >>>> >>>> v2: >>>> * none >>>> >>>> v1: >>>> * new patch >>>> >>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >>>> --- >>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 >>>> +++++++++++++++++++++++++++ >>>> 1 file changed, 53 insertions(+) >>>> >>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>>> index 0fe153b29e4f..33e5ae9c865f 100644 >>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>>> @@ -15,6 +15,7 @@ >>>> #include <linux/clk.h> >>>> #include <linux/delay.h> >>>> #include <linux/irq.h> >>>> +#include <linux/media-bus-format.h> >>>> #include <linux/of_device.h> >>>> #include <linux/phy/phy.h> >>>> >>>> @@ -1321,6 +1322,57 @@ static void >>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >>>> pm_runtime_put_sync(dsi->dev); >>>> } >>>> >>>> +/* >>>> + * This pixel output formats list referenced from, >>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>> + * 3.7.4 Pixel formats >>>> + * Table 14. DSI pixel packing formats >>>> + */ >>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { >>> >>> You can also add : >>> >>> MEDIA_BUS_FMT_YUYV10_1X20 >>> >>> MEDIA_BUS_FMT_YUYV12_1X24 >> >> Are these for the below formats? >> >> "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2 >> Packed Pixel Stream, 24-bit YCbCr, 4:2:2" >>> >>>> + MEDIA_BUS_FMT_UYVY8_1X16, >>>> + MEDIA_BUS_FMT_RGB101010_1X30, >>>> + MEDIA_BUS_FMT_RGB121212_1X36, >>>> + MEDIA_BUS_FMT_RGB565_1X16, >>>> + MEDIA_BUS_FMT_RGB666_1X18, >>>> + MEDIA_BUS_FMT_RGB888_1X24, >>>> +}; >>>> + >>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >>>> +{ >>>> + int i; >>>> + >>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); >>>> i++) { >>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >>>> + return true; >>>> + } >>>> + >>>> + return false; >>>> +} >>>> + >>>> +static u32 * >>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >>>> + struct drm_bridge_state >>>> *bridge_state, >>>> + struct drm_crtc_state >>>> *crtc_state, >>>> + struct drm_connector_state >>>> *conn_state, >>>> + u32 output_fmt, >>>> + unsigned int *num_input_fmts) >>>> +{ >>>> + u32 *input_fmts; >>>> + >>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >>>> + return NULL; >>>> + >>>> + *num_input_fmts = 1; >>> >>> Shouldn't this be 6 ? >>> >>>> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); >>>> + if (!input_fmts) >>>> + return NULL; >>>> + >>>> + input_fmts[0] = output_fmt; >>> >>> Shouldn't this be a list of all 6 supported pixel formats ? >> >> Negotiation would settle to return one input_fmt from the list of >> supporting output_fmts. so the num_input_fmts would be 1 rather than >> the number of fmts in the supporting list. This is what I understood >> from the atomic_get_input_bus_fmts API. let me know if I miss >> something here. > > How does the negotiation work for this kind of pipeline: > > LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector > > where all elements (LCDIFv3, DSIM, HDMI bridge) can support either > RGB888 or packed YUV422 ? > > Who decides the format used by such pipeline ? > > Why should it be the DSIM bridge and not e.g. the HDMI bridge or the > LCDIFv3 ? If I got it right, the drivers reports their preference for the returned formats. The format that is first in the reported array is the most preferred one. This probably means that in your case the HDMI bridge decides by reporting RGB or YUV first (if all elements supports both). Best regards
On 11/16/22 09:07, Marek Szyprowski wrote: > On 15.11.2022 13:00, Marek Vasut wrote: >> On 11/14/22 08:49, Jagan Teki wrote: >>> On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut <marex@denx.de> wrote: >>>> >>>> On 11/10/22 19:38, Jagan Teki wrote: >>>>> Finding the right input bus format throughout the pipeline is hard >>>>> so add atomic_get_input_bus_fmts callback and initialize with the >>>>> proper input format from list of supported output formats. >>>>> >>>>> This format can be used in pipeline for negotiating bus format between >>>>> the DSI-end of this bridge and the other component closer to pipeline >>>>> components. >>>>> >>>>> List of Pixel formats are taken from, >>>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>> 3.7.4 Pixel formats >>>>> Table 14. DSI pixel packing formats >>>>> >>>>> v8: >>>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI >>>>> DSI/CSI-2 >>>>> >>>>> v7, v6, v5, v4: >>>>> * none >>>>> >>>>> v3: >>>>> * include media-bus-format.h >>>>> >>>>> v2: >>>>> * none >>>>> >>>>> v1: >>>>> * new patch >>>>> >>>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >>>>> --- >>>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 >>>>> +++++++++++++++++++++++++++ >>>>> 1 file changed, 53 insertions(+) >>>>> >>>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> index 0fe153b29e4f..33e5ae9c865f 100644 >>>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>> @@ -15,6 +15,7 @@ >>>>> #include <linux/clk.h> >>>>> #include <linux/delay.h> >>>>> #include <linux/irq.h> >>>>> +#include <linux/media-bus-format.h> >>>>> #include <linux/of_device.h> >>>>> #include <linux/phy/phy.h> >>>>> >>>>> @@ -1321,6 +1322,57 @@ static void >>>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >>>>> pm_runtime_put_sync(dsi->dev); >>>>> } >>>>> >>>>> +/* >>>>> + * This pixel output formats list referenced from, >>>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>> + * 3.7.4 Pixel formats >>>>> + * Table 14. DSI pixel packing formats >>>>> + */ >>>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { >>>> >>>> You can also add : >>>> >>>> MEDIA_BUS_FMT_YUYV10_1X20 >>>> >>>> MEDIA_BUS_FMT_YUYV12_1X24 >>> >>> Are these for the below formats? >>> >>> "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2 >>> Packed Pixel Stream, 24-bit YCbCr, 4:2:2" >>>> >>>>> + MEDIA_BUS_FMT_UYVY8_1X16, >>>>> + MEDIA_BUS_FMT_RGB101010_1X30, >>>>> + MEDIA_BUS_FMT_RGB121212_1X36, >>>>> + MEDIA_BUS_FMT_RGB565_1X16, >>>>> + MEDIA_BUS_FMT_RGB666_1X18, >>>>> + MEDIA_BUS_FMT_RGB888_1X24, >>>>> +}; >>>>> + >>>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >>>>> +{ >>>>> + int i; >>>>> + >>>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); >>>>> i++) { >>>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >>>>> + return true; >>>>> + } >>>>> + >>>>> + return false; >>>>> +} >>>>> + >>>>> +static u32 * >>>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >>>>> + struct drm_bridge_state >>>>> *bridge_state, >>>>> + struct drm_crtc_state >>>>> *crtc_state, >>>>> + struct drm_connector_state >>>>> *conn_state, >>>>> + u32 output_fmt, >>>>> + unsigned int *num_input_fmts) >>>>> +{ >>>>> + u32 *input_fmts; >>>>> + >>>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >>>>> + return NULL; >>>>> + >>>>> + *num_input_fmts = 1; >>>> >>>> Shouldn't this be 6 ? >>>> >>>>> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); >>>>> + if (!input_fmts) >>>>> + return NULL; >>>>> + >>>>> + input_fmts[0] = output_fmt; >>>> >>>> Shouldn't this be a list of all 6 supported pixel formats ? >>> >>> Negotiation would settle to return one input_fmt from the list of >>> supporting output_fmts. so the num_input_fmts would be 1 rather than >>> the number of fmts in the supporting list. This is what I understood >>> from the atomic_get_input_bus_fmts API. let me know if I miss >>> something here. >> >> How does the negotiation work for this kind of pipeline: >> >> LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector >> >> where all elements (LCDIFv3, DSIM, HDMI bridge) can support either >> RGB888 or packed YUV422 ? >> >> Who decides the format used by such pipeline ? >> >> Why should it be the DSIM bridge and not e.g. the HDMI bridge or the >> LCDIFv3 ? > > > If I got it right, the drivers reports their preference for the returned > formats. The format that is first in the reported array is the most > preferred one. This probably means that in your case the HDMI bridge > decides by reporting RGB or YUV first (if all elements supports both). But in that case, we need to list input_fmts[0]...input_fmts[n-1] in samsung_dsim_atomic_get_input_bus_fmts() and also set *num_input_fmts = n, correct ?
On 16.11.2022 11:49, Marek Vasut wrote: > On 11/16/22 09:07, Marek Szyprowski wrote: >> On 15.11.2022 13:00, Marek Vasut wrote: >>> On 11/14/22 08:49, Jagan Teki wrote: >>>> On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut <marex@denx.de> wrote: >>>>> >>>>> On 11/10/22 19:38, Jagan Teki wrote: >>>>>> Finding the right input bus format throughout the pipeline is hard >>>>>> so add atomic_get_input_bus_fmts callback and initialize with the >>>>>> proper input format from list of supported output formats. >>>>>> >>>>>> This format can be used in pipeline for negotiating bus format >>>>>> between >>>>>> the DSI-end of this bridge and the other component closer to >>>>>> pipeline >>>>>> components. >>>>>> >>>>>> List of Pixel formats are taken from, >>>>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>>> 3.7.4 Pixel formats >>>>>> Table 14. DSI pixel packing formats >>>>>> >>>>>> v8: >>>>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI >>>>>> DSI/CSI-2 >>>>>> >>>>>> v7, v6, v5, v4: >>>>>> * none >>>>>> >>>>>> v3: >>>>>> * include media-bus-format.h >>>>>> >>>>>> v2: >>>>>> * none >>>>>> >>>>>> v1: >>>>>> * new patch >>>>>> >>>>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> >>>>>> --- >>>>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 >>>>>> +++++++++++++++++++++++++++ >>>>>> 1 file changed, 53 insertions(+) >>>>>> >>>>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>> index 0fe153b29e4f..33e5ae9c865f 100644 >>>>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>>>>> @@ -15,6 +15,7 @@ >>>>>> #include <linux/clk.h> >>>>>> #include <linux/delay.h> >>>>>> #include <linux/irq.h> >>>>>> +#include <linux/media-bus-format.h> >>>>>> #include <linux/of_device.h> >>>>>> #include <linux/phy/phy.h> >>>>>> >>>>>> @@ -1321,6 +1322,57 @@ static void >>>>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, >>>>>> pm_runtime_put_sync(dsi->dev); >>>>>> } >>>>>> >>>>>> +/* >>>>>> + * This pixel output formats list referenced from, >>>>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 >>>>>> + * 3.7.4 Pixel formats >>>>>> + * Table 14. DSI pixel packing formats >>>>>> + */ >>>>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { >>>>> >>>>> You can also add : >>>>> >>>>> MEDIA_BUS_FMT_YUYV10_1X20 >>>>> >>>>> MEDIA_BUS_FMT_YUYV12_1X24 >>>> >>>> Are these for the below formats? >>>> >>>> "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2 >>>> Packed Pixel Stream, 24-bit YCbCr, 4:2:2" >>>>> >>>>>> + MEDIA_BUS_FMT_UYVY8_1X16, >>>>>> + MEDIA_BUS_FMT_RGB101010_1X30, >>>>>> + MEDIA_BUS_FMT_RGB121212_1X36, >>>>>> + MEDIA_BUS_FMT_RGB565_1X16, >>>>>> + MEDIA_BUS_FMT_RGB666_1X18, >>>>>> + MEDIA_BUS_FMT_RGB888_1X24, >>>>>> +}; >>>>>> + >>>>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) >>>>>> +{ >>>>>> + int i; >>>>>> + >>>>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); >>>>>> i++) { >>>>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) >>>>>> + return true; >>>>>> + } >>>>>> + >>>>>> + return false; >>>>>> +} >>>>>> + >>>>>> +static u32 * >>>>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, >>>>>> + struct drm_bridge_state >>>>>> *bridge_state, >>>>>> + struct drm_crtc_state >>>>>> *crtc_state, >>>>>> + struct drm_connector_state >>>>>> *conn_state, >>>>>> + u32 output_fmt, >>>>>> + unsigned int *num_input_fmts) >>>>>> +{ >>>>>> + u32 *input_fmts; >>>>>> + >>>>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) >>>>>> + return NULL; >>>>>> + >>>>>> + *num_input_fmts = 1; >>>>> >>>>> Shouldn't this be 6 ? >>>>> >>>>>> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); >>>>>> + if (!input_fmts) >>>>>> + return NULL; >>>>>> + >>>>>> + input_fmts[0] = output_fmt; >>>>> >>>>> Shouldn't this be a list of all 6 supported pixel formats ? >>>> >>>> Negotiation would settle to return one input_fmt from the list of >>>> supporting output_fmts. so the num_input_fmts would be 1 rather than >>>> the number of fmts in the supporting list. This is what I understood >>>> from the atomic_get_input_bus_fmts API. let me know if I miss >>>> something here. >>> >>> How does the negotiation work for this kind of pipeline: >>> >>> LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector >>> >>> where all elements (LCDIFv3, DSIM, HDMI bridge) can support either >>> RGB888 or packed YUV422 ? >>> >>> Who decides the format used by such pipeline ? >>> >>> Why should it be the DSIM bridge and not e.g. the HDMI bridge or the >>> LCDIFv3 ? >> >> >> If I got it right, the drivers reports their preference for the returned >> formats. The format that is first in the reported array is the most >> preferred one. This probably means that in your case the HDMI bridge >> decides by reporting RGB or YUV first (if all elements supports both). > > But in that case, we need to list input_fmts[0]...input_fmts[n-1] in > samsung_dsim_atomic_get_input_bus_fmts() and also set *num_input_fmts > = n, correct ? > Yes, if I got the bus format negotiation code right, but I didn't check the details. Best regards
On Wed, Nov 16, 2022 at 4:37 PM Marek Szyprowski <m.szyprowski@samsung.com> wrote: > > On 16.11.2022 11:49, Marek Vasut wrote: > > On 11/16/22 09:07, Marek Szyprowski wrote: > >> On 15.11.2022 13:00, Marek Vasut wrote: > >>> On 11/14/22 08:49, Jagan Teki wrote: > >>>> On Sun, Nov 13, 2022 at 5:51 AM Marek Vasut <marex@denx.de> wrote: > >>>>> > >>>>> On 11/10/22 19:38, Jagan Teki wrote: > >>>>>> Finding the right input bus format throughout the pipeline is hard > >>>>>> so add atomic_get_input_bus_fmts callback and initialize with the > >>>>>> proper input format from list of supported output formats. > >>>>>> > >>>>>> This format can be used in pipeline for negotiating bus format > >>>>>> between > >>>>>> the DSI-end of this bridge and the other component closer to > >>>>>> pipeline > >>>>>> components. > >>>>>> > >>>>>> List of Pixel formats are taken from, > >>>>>> AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > >>>>>> 3.7.4 Pixel formats > >>>>>> Table 14. DSI pixel packing formats > >>>>>> > >>>>>> v8: > >>>>>> * added pixel formats supported by NXP AN13573 i.MX 8/RT MIPI > >>>>>> DSI/CSI-2 > >>>>>> > >>>>>> v7, v6, v5, v4: > >>>>>> * none > >>>>>> > >>>>>> v3: > >>>>>> * include media-bus-format.h > >>>>>> > >>>>>> v2: > >>>>>> * none > >>>>>> > >>>>>> v1: > >>>>>> * new patch > >>>>>> > >>>>>> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> > >>>>>> --- > >>>>>> drivers/gpu/drm/bridge/samsung-dsim.c | 53 > >>>>>> +++++++++++++++++++++++++++ > >>>>>> 1 file changed, 53 insertions(+) > >>>>>> > >>>>>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>>> b/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>>> index 0fe153b29e4f..33e5ae9c865f 100644 > >>>>>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c > >>>>>> @@ -15,6 +15,7 @@ > >>>>>> #include <linux/clk.h> > >>>>>> #include <linux/delay.h> > >>>>>> #include <linux/irq.h> > >>>>>> +#include <linux/media-bus-format.h> > >>>>>> #include <linux/of_device.h> > >>>>>> #include <linux/phy/phy.h> > >>>>>> > >>>>>> @@ -1321,6 +1322,57 @@ static void > >>>>>> samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, > >>>>>> pm_runtime_put_sync(dsi->dev); > >>>>>> } > >>>>>> > >>>>>> +/* > >>>>>> + * This pixel output formats list referenced from, > >>>>>> + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 > >>>>>> + * 3.7.4 Pixel formats > >>>>>> + * Table 14. DSI pixel packing formats > >>>>>> + */ > >>>>>> +static const u32 samsung_dsim_pixel_output_fmts[] = { > >>>>> > >>>>> You can also add : > >>>>> > >>>>> MEDIA_BUS_FMT_YUYV10_1X20 > >>>>> > >>>>> MEDIA_BUS_FMT_YUYV12_1X24 > >>>> > >>>> Are these for the below formats? > >>>> > >>>> "Loosely Packed Pixel Stream, 20-bit YCbCr, 4:2:2 > >>>> Packed Pixel Stream, 24-bit YCbCr, 4:2:2" > >>>>> > >>>>>> + MEDIA_BUS_FMT_UYVY8_1X16, > >>>>>> + MEDIA_BUS_FMT_RGB101010_1X30, > >>>>>> + MEDIA_BUS_FMT_RGB121212_1X36, > >>>>>> + MEDIA_BUS_FMT_RGB565_1X16, > >>>>>> + MEDIA_BUS_FMT_RGB666_1X18, > >>>>>> + MEDIA_BUS_FMT_RGB888_1X24, > >>>>>> +}; > >>>>>> + > >>>>>> +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) > >>>>>> +{ > >>>>>> + int i; > >>>>>> + > >>>>>> + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); > >>>>>> i++) { > >>>>>> + if (samsung_dsim_pixel_output_fmts[i] == fmt) > >>>>>> + return true; > >>>>>> + } > >>>>>> + > >>>>>> + return false; > >>>>>> +} > >>>>>> + > >>>>>> +static u32 * > >>>>>> +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, > >>>>>> + struct drm_bridge_state > >>>>>> *bridge_state, > >>>>>> + struct drm_crtc_state > >>>>>> *crtc_state, > >>>>>> + struct drm_connector_state > >>>>>> *conn_state, > >>>>>> + u32 output_fmt, > >>>>>> + unsigned int *num_input_fmts) > >>>>>> +{ > >>>>>> + u32 *input_fmts; > >>>>>> + > >>>>>> + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) > >>>>>> + return NULL; > >>>>>> + > >>>>>> + *num_input_fmts = 1; > >>>>> > >>>>> Shouldn't this be 6 ? > >>>>> > >>>>>> + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); > >>>>>> + if (!input_fmts) > >>>>>> + return NULL; > >>>>>> + > >>>>>> + input_fmts[0] = output_fmt; > >>>>> > >>>>> Shouldn't this be a list of all 6 supported pixel formats ? > >>>> > >>>> Negotiation would settle to return one input_fmt from the list of > >>>> supporting output_fmts. so the num_input_fmts would be 1 rather than > >>>> the number of fmts in the supporting list. This is what I understood > >>>> from the atomic_get_input_bus_fmts API. let me know if I miss > >>>> something here. > >>> > >>> How does the negotiation work for this kind of pipeline: > >>> > >>> LCDIFv3<->DSIM<->HDMI bridge<->HDMI connector > >>> > >>> where all elements (LCDIFv3, DSIM, HDMI bridge) can support either > >>> RGB888 or packed YUV422 ? > >>> > >>> Who decides the format used by such pipeline ? > >>> > >>> Why should it be the DSIM bridge and not e.g. the HDMI bridge or the > >>> LCDIFv3 ? > >> > >> > >> If I got it right, the drivers reports their preference for the returned > >> formats. The format that is first in the reported array is the most > >> preferred one. This probably means that in your case the HDMI bridge > >> decides by reporting RGB or YUV first (if all elements supports both). > > > > But in that case, we need to list input_fmts[0]...input_fmts[n-1] in > > samsung_dsim_atomic_get_input_bus_fmts() and also set *num_input_fmts > > = n, correct ? > > > Yes, if I got the bus format negotiation code right, but I didn't check > the details. It Looks like if the number of formats returned by the array is more than 1, then the input_fmts array needs to return by listing formats in decreasing preference order so that the bridge core will try all formats until it finds one that works. But the question here is how much is the array number, how to decide? I can see dw-hdmi return a maximum of 3 possible input formats for an output format so the array seems to be 3 here, but the rest of drivers like imx8qxp-pixel-link do return 1 from the list of supported - dsim doing the same here. If we are sure dsim can support or feature 2 then order RGB888 and YUV422 decreasing preference and return them otherwise stick with a single return of checking supported list and return desired one. Jagan.
diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c b/drivers/gpu/drm/bridge/samsung-dsim.c index 0fe153b29e4f..33e5ae9c865f 100644 --- a/drivers/gpu/drm/bridge/samsung-dsim.c +++ b/drivers/gpu/drm/bridge/samsung-dsim.c @@ -15,6 +15,7 @@ #include <linux/clk.h> #include <linux/delay.h> #include <linux/irq.h> +#include <linux/media-bus-format.h> #include <linux/of_device.h> #include <linux/phy/phy.h> @@ -1321,6 +1322,57 @@ static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge, pm_runtime_put_sync(dsi->dev); } +/* + * This pixel output formats list referenced from, + * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022 + * 3.7.4 Pixel formats + * Table 14. DSI pixel packing formats + */ +static const u32 samsung_dsim_pixel_output_fmts[] = { + MEDIA_BUS_FMT_UYVY8_1X16, + MEDIA_BUS_FMT_RGB101010_1X30, + MEDIA_BUS_FMT_RGB121212_1X36, + MEDIA_BUS_FMT_RGB565_1X16, + MEDIA_BUS_FMT_RGB666_1X18, + MEDIA_BUS_FMT_RGB888_1X24, +}; + +static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) { + if (samsung_dsim_pixel_output_fmts[i] == fmt) + return true; + } + + return false; +} + +static u32 * +samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state, + u32 output_fmt, + unsigned int *num_input_fmts) +{ + u32 *input_fmts; + + if (!samsung_dsim_pixel_output_fmt_supported(output_fmt)) + return NULL; + + *num_input_fmts = 1; + + input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); + if (!input_fmts) + return NULL; + + input_fmts[0] = output_fmt; + + return input_fmts; +} + static int samsung_dsim_atomic_check(struct drm_bridge *bridge, struct drm_bridge_state *bridge_state, struct drm_crtc_state *crtc_state, @@ -1385,6 +1437,7 @@ static const struct drm_bridge_funcs samsung_dsim_bridge_funcs = { .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, .atomic_reset = drm_atomic_helper_bridge_reset, + .atomic_get_input_bus_fmts = samsung_dsim_atomic_get_input_bus_fmts, .atomic_check = samsung_dsim_atomic_check, .atomic_pre_enable = samsung_dsim_atomic_pre_enable, .atomic_enable = samsung_dsim_atomic_enable,