Received: by 10.213.65.68 with SMTP id h4csp500367imn; Wed, 4 Apr 2018 02:08:33 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/OWoPGrbPzYWtW44qFbBNsSZu/zv+lxRvapuIxfxKpRMkM+2Vl1atxbn4OLNcfcYdi6g3r X-Received: by 2002:a17:902:7785:: with SMTP id o5-v6mr16005904pll.356.1522832913506; Wed, 04 Apr 2018 02:08:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522832913; cv=none; d=google.com; s=arc-20160816; b=Yir0uFcPU9fV/Uz7j1vACOCGTz0NW9zkhl4h4tTPxwGC7ZT7dWmMvrDCplyE274N9t y4y85eaB2TLlq90LKn2Polb4HAHLvnn7kwer7O+qbasdPus8sBVUbcGvC1Moys/siINT 5pjOySa4WqU+7SjrG6nSd93W9RjZ63MQr+fsNrXPqiHytzcRY1JNz4XYkRJhxQgjNtop Ls+t3Mk3Df9F2/M5zK+WPAHrH5TQOYY+oPGyKkD1DBc7oFaICE6FG8jFuX1JQH+4fliC 9KxMQObTzUfGlUsagA8O6ssrC3gNM7Gi6acbvsgLMFjKl8BNLWAqk2ez0WQYmCxGhv2a +K6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:organization:message-id:date:subject:cc:to :from:dkim-signature:arc-authentication-results; bh=I7+8XCTV4vkozMLZOQAyMwCfudlHn/Mh9scQjnsSK0o=; b=v8nzb05eMUccHTmhfknGlbRQ+NyuucrfbPc2y9RCbnwyyFaJNpVnEqCnmEp1Z/jbWI qScShHkL5swhmnt67N564+uwn17f6tSdeOKsdMY9/iSnvesDJaTboCBl/9qGVBPuzE8x bDBKQINjibKXRk0mL3DXAkn5/vyFQJYFPfQKR/ISyyRTOcWJb63Lr88NPR/aO8pGw6S0 TEIG1G8NM19bJLZrpKSq8qMwQLBctOAZz3GmfhDkIrkFvLjuTCAZmBQvtRyTGLe3hSoF Vhu9dDOEvEHXURCfWGSPMbB0FCs3jMMjN8qZv60PWLeVw0R5lZgEdtQ6cSLWpQKVCsFk L6aw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=dTxv/pWe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x1si3254910pgc.27.2018.04.04.02.08.19; Wed, 04 Apr 2018 02:08:33 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=dTxv/pWe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751708AbeDDJHJ (ORCPT + 99 others); Wed, 4 Apr 2018 05:07:09 -0400 Received: from galahad.ideasonboard.com ([185.26.127.97]:45350 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751251AbeDDJHI (ORCPT ); Wed, 4 Apr 2018 05:07:08 -0400 Received: from avalon.localnet (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804]) by galahad.ideasonboard.com (Postfix) with ESMTPSA id 1BE8F200AD; Wed, 4 Apr 2018 11:04:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1522832675; bh=T+cC0hqumY2bk+dUJ2AxzATSY52sHo+0ataqysMox0Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dTxv/pWeOE9pKzGNsJ5C8epSe9ZtkJ8MNy/0hr2DGjQrb/EvnUQuQsYLBjCEQoZHC 9RuiWIE8/GaY2+Nh5/e60CwYJRS6dIPsSSL1ApGUbY56AlUDBygmBt17nbt6ScVemy cH2WjW3k/qxhidkq6ETPyNuuhzkN3wPxO2u70PHE= From: Laurent Pinchart To: Daniel Vetter Cc: Peter Rosin , Linux Kernel Mailing List , Mark Rutland , Boris Brezillon , Alexandre Belloni , devicetree@vger.kernel.org, David Airlie , Nicolas Ferre , dri-devel , Rob Herring , Jacopo Mondi , Daniel Vetter , Linux ARM Subject: Re: [PATCH v2 0/5] allow override of bus format in bridges Date: Wed, 04 Apr 2018 12:07:15 +0300 Message-ID: <1563250.XEJxFDuW0h@avalon> Organization: Ideas on Board Oy In-Reply-To: References: <20180326212447.7380-1-peda@axentia.se> <2233231.my6BbD3pcT@avalon> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Daniel, On Wednesday, 4 April 2018 09:34:41 EEST Daniel Vetter wrote: > On Wed, Apr 4, 2018 at 12:28 AM, Laurent Pinchart wrote: > > On Wednesday, 28 March 2018 10:08:26 EEST Daniel Vetter wrote: > >> On Mon, Mar 26, 2018 at 11:24:42PM +0200, Peter Rosin wrote: > >>> Hi! > >>> > >>> [I got to v2 sooner than expected] > >>> > >>> I have an Atmel sama5d31 hooked up to an lvds encoder and then > >>> on to an lvds panel. Which seems like something that has been > >>> done one or two times before... > >>> > >>> The problem is that the bus_format of the SoC and the panel do > >>> not agree. The SoC driver (atmel-hlcdc) can handle the > >>> rgb444, rgb565, rgb666 and rgb888 bus formats. The hardware is > >>> wired for the rgb565 case. The lvds encoder supports rgb888 on > >>> its input side with the LSB wires for each color simply pulled > >>> down internally in the encoder in my case which means that the > >>> rgb565 bus_format is the format that works best. And the panel > >>> is expecting lvds (vesa-24), which is what the encoder outputs. > >>> > >>> The reason I "blame" the bus_format of the drm_connector is that > >>> with the below DT snippet, things do not work *exactly* due to > >>> that. At least, it starts to work if I hack the panel-lvds driver > >>> to report the rgb565 bus_format instead of vesa-24. > >>> > >>> panel: panel { > >>> compatible = "panel-lvds"; > >>> > >>> width-mm = <304>; > >>> height-mm = <228; > >>> > >>> data-mapping = "vesa-24"; > >>> > >>> panel-timing { > >>> // 1024x768 @ 60Hz (typical) > >>> clock-frequency = <52140000 65000000 71100000>; > >>> hactive = <1024>; > >>> vactive = <768>; > >>> hfront-porch = <48 88 88>; > >>> hback-porch = <96 168 168>; > >>> hsync-len = <32 64 64>; > >>> vfront-porch = <8 13 14>; > >>> vback-porch = <8 13 14>; > >>> vsync-len = <8 12 14>; > >>> }; > >>> > >>> port { > >>> panel_input: endpoint { > >>> remote-endpoint = <&lvds_encoder_output>; > >>> }; > >>> }; > >>> }; > >>> > >>> lvds-encoder { > >>> compatible = "ti,ds90c185", "lvds-encoder"; > >>> > >>> ports { > >>> #address-cells = <1>; > >>> #size-cells = <0>; > >>> > >>> port@0 { > >>> reg = <0>; > >>> > >>> lvds_encoder_input: endpoint { > >>> remote-endpoint = <&hlcdc_output>; > >>> }; > >>> }; > >>> > >>> port@1 { > >>> reg = <1>; > >>> > >>> lvds_encoder_output: endpoint { > >>> remote-endpoint = <&panel_input>; > >>> }; > >>> }; > >>> }; > >>> }; > >>> > >>> But, instead of perverting the panel-lvds driver with support > >>> for a totally fake non-lvds bus_format, I intruduce an API that allows > >>> display controller drivers to query the required bus_format of any > >>> intermediate bridges, and match up with that instead of the formats > >>> given by the drm_connector. I trigger this with this addition to the > >>> > >>> lvds-encoder DT node: > >>> interface-pix-fmt = "rgb565"; > >>> > >>> Naming is hard though, so I'm not sure if that's good? > >>> > >>> I threw in the first patch, since that is the actual lvds encoder > >>> I have in this case. > >>> > >>> Suggestions welcome. > >> > >> Took a quick look, feels rather un-atomic. And there's beend discussing > >> for other bridge related state that we might want to track (like the full > >> adjusted_mode that might need to be adjusted at each stage in the chain). > >> So here's my suggestions: > >> > >> - Add an optional per-bridge internal state struct using the support in > >> https://dri.freedesktop.org/docs/drm/gpu/drm-kms.html#handling-driver-> >> private-state > >> > >> Yes it says "driver private", but since bridge is just helper stuff > >> that's all included. "driver private" == "not exposed as uapi" here. > >> Include all the usual convenience wrappers to get at the state for a > >> bridge. > >> > >> - Then stuff your bus_format into that new drm_bridge_state struct. > >> > >> - Add a new bridge callback atomic_check, which gets that bridge state as > >> parameter (similar to all the other atomic_check functions). > >> > >> This way we can even handle the bus_format dynamically, through the > >> atomic framework your bridge's atomic_check callback can look at the > >> entire atomic state (both up and down the chain if needed), it all neatly > >> fits into atomic overall and it's much easier to extend. > > > > While I think we'll eventually need bridge states, I don't think that's > > need yet. The bus formats reported by this patch series are static. We're > > not talking about the currently configured format for a bridge, but about > > the list of supported formats. This is similar to the bus_formats field > > present in the drm_display_info structure. There is thus in my opinion no > > need to interface this with atomic until we need to track the current > > format (and I think that will indeed happen at some point, but I don't > > think Peter needs this feature for now). That's why I've told Peter that > > I would like a bridge API to report the information and haven't requested > > a state-based implementation. > > If it's static, why a dynamic callback? Just add it to struct > drm_bridge, require it's filled out before registering the bridge, > done. If I remember correctly I mentioned both options in my initial proposal, without a personal preference. A new field in struct drm_bridge would certainly work for me. > >> Please also cc Laurent Pinchart on this. > >> > >>> Changes since v1 https://lkml.org/lkml/2018/3/17/221 > >>> - Add a proper bridge API to query the bus_format instead of abusing > >>> the ->get_modes part of the code. This is cleaner but requires > >>> changes to all display controller drivers wishing to participate. > >>> - Add patch to adjust the atmel-hlcdc driver according to the above. > >>> - Hook the new info into the bridge local to the lvds-encoder instead > >>> of messing about with new interfaces for the panel-bridge driver. > >>> - Add patch with a DT parsing function of bus_formats in a central > >>> place. > >>> - Rephrase the addition of ti,ds90c185 to the lvds-transmitter binding. > >>> > >>> Peter Rosin (5): > >>> dt-bindings: display: bridge: lvds-transmitter: add ti,ds90c185 > >>> drm: bridge: add API to query the expected input formats of bridges > >>> drm: of: add display bus-format parser > >>> drm: bridge: lvds-encoder: allow specifying the input bus format > >>> drm/atmel-hlcdc: take bridges into account when selecting output > >>> format > >>> > >>> .../bindings/display/bridge/lvds-transmitter.txt | 14 ++++- > >>> .../devicetree/bindings/display/bus-format.txt | 35 +++++++++++++ > >>> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 49 +++++++++++++-- > >>> drivers/gpu/drm/bridge/lvds-encoder.c | 25 +++++++++ > >>> drivers/gpu/drm/drm_bridge.c | 32 ++++++++++++ > >>> drivers/gpu/drm/drm_of.c | 59 +++++++++++++++ > >>> include/drm/drm_bridge.h | 18 +++++++ > >>> include/drm/drm_of.h | 9 ++++ > >>> 8 files changed, 237 insertions(+), 4 deletions(-) > >>> create mode 100644 > >>> Documentation/devicetree/bindings/display/bus-format.txt -- Regards, Laurent Pinchart