Received: by 2002:a05:6a10:83d0:0:0:0:0 with SMTP id o16csp152261pxh; Thu, 7 Apr 2022 17:06:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzq6GAOoACxBOqNfhS1PCvK0OVaPIf9etciewlnQ8nZNlh8BMkKSoI6z6M8SjjBWUASWrfQ X-Received: by 2002:a63:4142:0:b0:39c:dd63:27a2 with SMTP id o63-20020a634142000000b0039cdd6327a2mr2993280pga.119.1649376400641; Thu, 07 Apr 2022 17:06:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649376400; cv=none; d=google.com; s=arc-20160816; b=aVwqbCZvzKHmq5W6Ba/Z3y6oyCbHy32mn3K3LUSdq8fM/qatQ87hTBV4WgLVyTOJnk +vc6Wx/qjgTl5oHRJYNGcivBxVnRhGvZZ5L4L0I1Tu3i39uCOTsI9IVpLdcP5ghXqeDN eJuiAvdrbrT5DKlTumpsWmjshK+8KQOUibkq7PCrHn7mkp8s0TFTiCRyxeohuCWKPZMF 6W888OzzkyRBRLpH0Z9sPNqSS/57loQ8yNnuhX64HUZRIkSPXmma91WE/krCoIsVcHAT ASa5L8wrcIH1KUIPCd+7wFdBWfKuGMp7Iz0lyf7TxYk3NiIGQQ9Hz7uqUCCai1PwzuR0 lZrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=pz4KD/PvVy3aJckPQcstiGf/5cgrKhrIQB+LQ40VK1U=; b=ix3DKNqZjLaL9Q1umjocWZkxULkXTCkJuF9tJM/pvzO1zh2Hh+dz9riuoBY8+LwtpP Jru4BWNMRzWahdkKsK8/PuFArBa1glDkeCfIOEkixiaz21bz7x2GQVISWGjfeaQGU1EQ 02v2du6sY22tcEG8N6jjyPvL18rozBRCUIaHZwMfyVp4L/ZuWuojg1FFk+z4WNAzECAC wiHa4XGqZoMFKAJfxhvqxL/5Lax1XKxSpwCrXSD31vNIca8cA+BOAmc19MVyRl9VmNzs AbqThWo0clRXtStqG72rYZmGjTt00q9DCY90u+kylXENhwUQbbT2GZaK+hgDRnsTU4k8 SerQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=sgePQ8AP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id b3-20020a637143000000b0039890725054si20352029pgn.711.2022.04.07.17.06.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 Apr 2022 17:06:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=sgePQ8AP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 5BBF614B032; Thu, 7 Apr 2022 16:36:23 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231423AbiDGXiH (ORCPT + 99 others); Thu, 7 Apr 2022 19:38:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59398 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230503AbiDGXiF (ORCPT ); Thu, 7 Apr 2022 19:38:05 -0400 Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D8D631403C9 for ; Thu, 7 Apr 2022 16:36:01 -0700 (PDT) Received: by mail-qk1-x72c.google.com with SMTP id t207so2153997qke.2 for ; Thu, 07 Apr 2022 16:36:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=pz4KD/PvVy3aJckPQcstiGf/5cgrKhrIQB+LQ40VK1U=; b=sgePQ8APzlEcl6PlCk+UG7uIxcsN3bWYyVD+F76a6KY6next7JnstlIa8To6cHlw4I ToMpcYUMhFb3y9dHSUXyg63k/k21n1/AYmeV82yduMrUoG9U2Dm7f9ZGWyP9Irrrs6kN OgOFOC3gdOmAfG0MTeVIrd//szrfX8UbwA2o5mMCZULJY8/OAKSXyJKJOrBmUN+k85Zh J8P6RNAFZb81mag9unPFiDkjwFoBDGPkziWKLfh6h97O5+5sKlZgZg38NgEHgv5dxo71 IQICoC03Qy6fIHXyJs8lKPWRfptnC4goay/mIMv9snhUtwpFEoSVItVvy05WCPByzVQG 0Qrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=pz4KD/PvVy3aJckPQcstiGf/5cgrKhrIQB+LQ40VK1U=; b=QupLRy8/AmtP7DPxwNxtbB+ryj1HNkEWbvfZ97z/wRgOcrF7Ko/YYEFzh2C1hLc8Ca uKjIDG/sj+5pgEi7jV5AanuUqgCRH5Vx1HoR2hPpbHF/6lBV7GlgC09Tm8/KW8wk006C yYXiF0LWM7UPW1l4JZsZkzKVudyptIM7txjnUkXa+wEmUriA7yCBV6p58r387T/Zw3Ez Teb+L5mZkG3Q10SBxCPMLiP/4quIf0LdwV/81EYv4uFxajhf/USc+NHjQqp50sAlZwrI Y9Mf8UapWFrucJC2Sr2X+HKGPXTkKgsnPK2JaDzXafS6eGmYM5N2oJlBzSLEKAEZgq++ UBhA== X-Gm-Message-State: AOAM53167AaNAarYWHmsxPzVq1j4hpTc11NavADMcC4/nX6DPkTJtB9f 6emDbuCmw2iYH/WOV5uGUSOqgGguBLiUGSMi6nEp3A== X-Received: by 2002:a05:620a:170a:b0:67d:be5c:204a with SMTP id az10-20020a05620a170a00b0067dbe5c204amr11278835qkb.593.1649374560237; Thu, 07 Apr 2022 16:36:00 -0700 (PDT) MIME-Version: 1.0 References: <1648656179-10347-1-git-send-email-quic_sbillaka@quicinc.com> <1648656179-10347-2-git-send-email-quic_sbillaka@quicinc.com> <392b933f-760c-3c81-1040-c514045df3da@linaro.org> <3e5fa57f-d636-879a-b98f-77323d07c156@linaro.org> In-Reply-To: From: Dmitry Baryshkov Date: Fri, 8 Apr 2022 02:35:48 +0300 Message-ID: Subject: Re: [PATCH v6 1/8] drm/msm/dp: Add eDP support via aux_bus To: Abhinav Kumar Cc: Doug Anderson , "Sankeerth Billakanti (QUIC)" , quic_kalyant , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , quic_vproddut , David Airlie , linux-arm-msm , "Kuogee Hsieh (QUIC)" , freedreno , dri-devel , "bjorn.andersson@linaro.org" , Sean Paul , "Aravind Venkateswaran (QUIC)" , Stephen Boyd , Sean Paul , LKML Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 7 Apr 2022 at 23:11, Abhinav Kumar wrote: > > Hi Doug and Dmitry > > Sorry, but I caught up on this email just now. > > Some comments below. > > Thanks > > Abhinav > On 4/7/2022 10:07 AM, Doug Anderson wrote: > > Hi, > > > > On Thu, Apr 7, 2022 at 7:19 AM Sankeerth Billakanti (QUIC) > > wrote: > >> > >> Hi Dmitry and Doug, > >> > >>> Hi, > >>> > >>> On Tue, Apr 5, 2022 at 10:36 AM Dmitry Baryshkov > >>> wrote: > >>>> > >>>> On 05/04/2022 20:02, Doug Anderson wrote: > >>>>> Hi, > >>>>> > >>>>> On Tue, Apr 5, 2022 at 5:54 AM Dmitry Baryshkov > >>>>> wrote: > >>>>>>> 3. For DP and eDP HPD means something a little different. > >>>>>>> Essentially there are two concepts: a) is a display physically > >>>>>>> connected and b) is the display powered up and ready. For DP, the > >>>>>>> two are really tied together. From the kernel's point of view you > >>>>>>> never "power down" a DP display and you can't detect that it's > >>>>>>> physically connected until it's ready. Said another way, on you > >>>>>>> tie "is a display there" to the HPD line and the moment a display > >>>>>>> is there it's ready for you to do AUX transfers. For eDP, in the > >>>>>>> lowest power state of a display it _won't_ assert its "HPD" > >>>>>>> signal. However, it's still physically present. For eDP you simply > >>>>>>> have to _assume_ it's present without any actual proof since you > >>>>>>> can't get proof until you power it up. Thus for eDP, you report > >>>>>>> that the display is there as soon as we're asked. We can't _talk_ > >>>>>>> to the display yet, though. So in get_modes() we need to be able > >>>>>>> to power the display on enough to talk over the AUX channel to it. > >>>>>>> As part of this, we wait for the signal named "HPD" which really means > >>> "panel finished powering on" in this context. > >>>>>>> > >>>>>>> NOTE: for aux transfer, we don't have the _display_ pipe and > >>>>>>> clocks running. We only have enough stuff running to do the AUX > >>> transfer. > >>>>>>> We're not clocking out pixels. We haven't fully powered on the > >>>>>>> display. The AUX transfer is designed to be something that can be > >>>>>>> done early _before_ you turn on the display. > >>>>>>> > >>>>>>> > >>>>>>> OK, so basically that was a longwinded way of saying: yes, we > >>>>>>> could avoid the AUX transfer in probe, but we can't wait all the > >>>>>>> way to enable. We have to be able to transfer in get_modes(). If > >>>>>>> you think that's helpful I think it'd be a pretty easy patch to > >>>>>>> write even if it would look a tad bit awkward IMO. Let me know if > >>>>>>> you want me to post it up. > >>>>>> > >>>>>> I think it would be a good idea. At least it will allow us to > >>>>>> judge, which is the more correct way. > >>>>> > >>>>> I'm still happy to prototype this, but the more I think about it the > >>>>> more it feels like a workaround for the Qualcomm driver. The eDP > >>>>> panel driver is actually given a pointer to the AUX bus at probe > >>>>> time. It's really weird to say that we can't do a transfer on it > >>>>> yet... As you said, this is a little sideband bus. It should be able > >>>>> to be used without all the full blown infra of the rest of the driver. > >>>> > >>>> Yes, I have that feeling too. However I also have a feeling that just > >>>> powering up the PHY before the bus probe is ... a hack. There are no > >>>> obvious stopgaps for the driver not to power it down later. > >>> > > Lets go back to why we need to power up the PHY before the bus probe. > > We need to power up PHY before bus probe because panel-eDP tries to read > the EDID in probe() for the panel_id. Not get_modes(). > > So doug, I didnt follow your comment that panel-eDP only does EDID read > in get_modes() > > panel_id = drm_edid_get_panel_id(panel->ddc); > if (!panel_id) { > dev_err(dev, "Couldn't identify panel via EDID\n"); > ret = -EIO; > goto exit; > } > > If we do not need this part, we really dont need to power up the PHY > before the probe(). The hack which dmitry was referring to. > > So this is boiling down to why or how panel-eDP was originally designed. Well, it's not just panel-edp. It boils down to the DP-AUX bus design vs DRM design. However in Doug's defense I should admit that I can not come up with a significantly cleaner solution. Just to emphasise (or to repeat): for all other display panels/bridges, we either do not use a sidechannel bus or the sidechannel bus (i2c, spi, platform) is managed outside of the DRM framework. Thus it's possible to create the source in the drm's driver probe path and then in the component's bind() path check (and return an error) if the sink device wasn't yet probed successfully. The source can then either communicate with the sink using the sidechannel bus provided elsewhere or (e.g. in case of purely DSI panel), defer communication till the moment the display path is fully available (after encoder enablement). For the DP/eDP the sidechannel (DP AUX) bus is closer to the display path. It can not be used separately. For DP we can defer all communication till the moment we know (through the DP/USB-C/etc hotplug mechanism) that the sink is really available and running. The eDP is being caught in between these two approaches: For example sn65dsi86 and tegra have separate dpaux and separate bridge/output devices. Thus dpaux'es probe() methos populates DP AUX bus, then a separate device checks whether the panel/bridge has become available in its own probe() method. The ps8640 driver looks 'working by coincidence'. It calls dp_aux_populate, then immediately after the function returns it checks for the panel. If panel-edp is built as a module, the probe might fail easily. The anx7625 driver has the same kind of issue. The DP AUX bus is populated from the probe() and after some additional work the panel is being checked. This design is fragile and from my quick glance it can break (or be broken) too easy. It reminds me of our drm msm 'probe' loops preventing the device to boot completely if the dsi bridge/panel could not be probed in time. If we talk about DP AUX bus EP drivers, both panel-edp and panel-samsung-atna33xc20 (the only EP drivers present in Linux master) expect that they can access DPCD from the probe method. Now back to Qualcomm DP driver. We do not have a separate dpaux entity. If leave aside the idea of adding a separate 'bus available' callback, I see two possible solutions: - Implement separate lightweight eDP driver sharing source with the DP driver. Make it skip all the DP HPD craziness, init PHY and call devm_of_dp_aux_ep_populate_ep_devices() from the probe method, check in the bind method that the next bridge is available. However this can potentially break ports which can be used either in the DP or in eDP mode. or - Modify existing Qualcomm DP driver to return -EPROBE_DEFER from dp_aux_transfer() if the AUX bus is not available. Make the driver init PHY from probe() if it is running in the eDP mode. Populate DP AUX bus from probe(). Check for the next bridge in dp_bind(). There might be potentially other possibilities, but I think you have my main idea. Create the bus in probe(), check for the bridge in bind(). or - Create a bus at some point in bind. Forbid (and document that) AUX access from EP probe(). Access it only from get_modes(). > > >>> This is why I think we need to move to Runtime PM to manage this. Basically: > >>> > >>> 1. When an AUX transfer happens, you grab a PM runtime reference that > >>> _that_ powers up the PHY. > > This will not be trivial and needs to be scoped out as sankeerth said > but if the above is the only concern, why do we need to do this? There > seems to be an explanation why we are doing this and its not a hack. > > How would Dmitry's rework address this? We need some RFC to conclude on > that first. Just to put things clear: I do not have plans to work on either of my suggestions at least in the next few months. I do not have eDP hardware at hand. > > >>> > >>> 2. At the end of the AUX transfer function, you do a "put_autosuspend". > >>> > >>> Then it becomes not a hack, right? > >>> > >>> > >> > >> pm runtime ops needs to be implemented for both eDP and DP. This change > >> take good amount of planning and code changes as it affects DP also. > >> > >> Because this patch series consist of basic eDP changes for SC7280 bootup, > >> shall we take this pm_runtime implementation in subsequent patch series? > > > > Dmitry is the real decision maker here, but in my opinion it would be > > OK to get something landed first that worked OK and wasn't taking us > > too far in the wrong direction and then we could get a follow up patch > > to move to pm_runtime. > > I would say the discussion changed into a direction of implementing > pm-runtime because the current patch series does what it takes to adhere > to panel-eDP's design along with aux bus requirements of PHY needing to > be on. > > So doug, to answer your questions here: > > "So I guess the net result is maybe we should just keep it where it is. > Long term I'd be interested in knowing if there's a reason why we > can't structure the driver so that AUX transfers can happen with less > intertwining with the rest of the code, but that can happen later. I > would expect that you'd basically just need clocks and regulators on > and maybe your PHY on." > > Yes PHY needs to be absolutely on and configured before aux transfers. > > If we want to change that up to stop reading the panel_id in the panel > probe() and do it later, perhaps some of the changes done here are not > needed. > > It only seems reasonable that we first prototype that in a separate > patch even a RFC perhaps and take this further as these set of changes > are needed for basic display functionality on sc7280 chromebooks. > > Let us know what are the concerns with doing it in a follow up change. > > Thanks > > Abhinav -- With best wishes Dmitry