Received: by 2002:a05:6a10:7420:0:0:0:0 with SMTP id hk32csp4430337pxb; Mon, 21 Feb 2022 21:22:54 -0800 (PST) X-Google-Smtp-Source: ABdhPJxMIhgp0kXpbAyCX8q9vvJpMTDkxGv2kfOpd0chW1qd3eTOfHkEGv0g00Zee8sx0K1saAm4 X-Received: by 2002:a17:902:ea11:b0:14d:938e:a897 with SMTP id s17-20020a170902ea1100b0014d938ea897mr21426300plg.129.1645507373936; Mon, 21 Feb 2022 21:22:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645507373; cv=none; d=google.com; s=arc-20160816; b=fzratNfZkB7MguryReBTmv3/U90BSXwxUN6RECXFQAE5VZCTZpM4Ti9NFITwHk9NvW mZ/eJ/HmiTQNA9nZHwrFyC+OEDBlPHdtRp7cKVDvoWi6scD68LOxWLU1gAw9wmoNxGrU TgukW43O/I+zm/Nq+9tnRY7BXAWjFRcEQMWcU0fpTBmttPTrLRGYMgMljsJ6BPHg+UEG U4IDvdZEVmM3aIcsIFSEtVnzvgK1H5RqNNAq3rUsspmPumjoj7eca//IUfU82fWPwun7 7/++Go3KsN2gKdWJuCX0LwdIBUhaAxV0OaLt1jAd/WWYO81WshRl1L0ZOW2YdRNBaIu0 Mt1A== 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=zkwjd5lOCa4cW4bL7/bpFQz6lcs6TRUmGFz5ovEfIkI=; b=M1fdewuckaQ+JoByGT3Y35sReHn9P0DzkIgr0oDwjVrpuf5nw9krAqhSe3a4Xk/dtC +FRrjp/cGYEUw4ssKkP1VenE96+onB99+exoU1GYWRCytnen93yvZUh3LcK04ZUj6jxo zGhVYuwVuRrq0GM9XGNcUgQXWvurksuMEbbkzDy+tZuBr7hfkgPDvpRyh9A2Xh553hIh mmWeeAuKPp0HPENfPI17ZDQJW1eW9f7gkDUppJ7znJ52Zghtcp93wuZqY/3nIY3VRMEY mGtyqgqyuMuHORid7xygqE/yPuXdIDl7npaKRqRFAIz2YpLJtrY4XGnQQHcuqiWwLvBF t1YA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="c44ekn4/"; 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 s16si11938719pfk.133.2022.02.21.21.22.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Feb 2022 21:22:53 -0800 (PST) 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="c44ekn4/"; 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 5A970FA235; Mon, 21 Feb 2022 20:53:50 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239584AbiBVDMh (ORCPT + 99 others); Mon, 21 Feb 2022 22:12:37 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:50698 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239518AbiBVDMc (ORCPT ); Mon, 21 Feb 2022 22:12:32 -0500 Received: from mail-qv1-xf31.google.com (mail-qv1-xf31.google.com [IPv6:2607:f8b0:4864:20::f31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7597B5FAA for ; Mon, 21 Feb 2022 19:12:07 -0800 (PST) Received: by mail-qv1-xf31.google.com with SMTP id h9so37663728qvm.0 for ; Mon, 21 Feb 2022 19:12:07 -0800 (PST) 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=zkwjd5lOCa4cW4bL7/bpFQz6lcs6TRUmGFz5ovEfIkI=; b=c44ekn4/IgS3rUVu5zK97aGkGy/pVUY15T9fOLA2rQRooU1G8n1E4RfFT9KviA/a9Z BMaDNrEo5/d9hev7YZOvWU2YIc2gQKdhu04+tQRv7akPW4Qfmj6jmZM+OeaMIYYe171Q pbzAwyM+OxVnxJm/JMWDog3eD9MOFbACk7UgoVgVpFMTGFltpq3LNc0bW/EEYNHDCnjH hM2j2+uxTXg+LezEZctFxp0hpxQ+9amsQxofAhOTrqJ33VFO2wKOAb2vb5kZNWq8a6re KLB4vWnO0UdIDrDumARfsMkrlPyX8NPqqupnsfMVkrnNPM6yUlguk3qPHWlE5lGne05X CHEA== 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=zkwjd5lOCa4cW4bL7/bpFQz6lcs6TRUmGFz5ovEfIkI=; b=LYMe3bO7y5PBEj5Sse47GoiSCbHWw1yOcBkm4U7yS8vfl5GOY8jgzskEEfImK7IYzM FL7bZm/lkL768v368k5gu5NCNjf5YAsDMUK1urQPIJRhNkhq2NaRUabZaWAyAugxlVCn l2WC4BlVLCCbycqi8yLp3fShe1/IIoN2nc/mozcgJSeoQOXwZmYf/aG7BNGsj7llpdoB ASyaMZbQKYf50UnYYiT10u/OCYPCGIa/+vdNdSP438auSYxRywDdBF7yCm+/8hNnR8bp 3DVoVBeSxYCLjWL082dGOl7YUQ++F9fVAwrbCsW6OI1e97CJDjmZJ0WtEBQ+SlhWdaUy MPQQ== X-Gm-Message-State: AOAM532FDiC9AvWIcte9USTV72UaXpdaTJsaRtJnbKmVUTH2iAx/kejF nA70WzVhbnB4pblrOFT8PdaEdjy2EGdeDBit7Mdoiw== X-Received: by 2002:ac8:5ccf:0:b0:2dd:a371:68f4 with SMTP id s15-20020ac85ccf000000b002dda37168f4mr16140333qta.370.1645499526032; Mon, 21 Feb 2022 19:12:06 -0800 (PST) MIME-Version: 1.0 References: <1645455086-9359-1-git-send-email-quic_vpolimer@quicinc.com> <1645455086-9359-3-git-send-email-quic_vpolimer@quicinc.com> In-Reply-To: <1645455086-9359-3-git-send-email-quic_vpolimer@quicinc.com> From: Dmitry Baryshkov Date: Tue, 22 Feb 2022 05:30:30 +0300 Message-ID: Subject: Re: [PATCH v2 2/4] drm/bridge: use atomic enable/disable for bridge callbacks To: Vinod Polimera Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, agross@kernel.org, bjorn.andersson@linaro.org, robh+dt@kernel.org, robdclark@gmail.com, seanpaul@chromium.org, swboyd@chromium.org, dianders@chromium.org, krzysztof.kozlowski@canonical.com, thierry.reding@gmail.com, sam@ravnborg.org, airlied@linux.ie, daniel@ffwll.ch, quic_kalyant@quicinc.com, quic_sbillaka@quicinc.com, quic_vproddut@quicinc.com 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 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 Mon, 21 Feb 2022 at 17:52, Vinod Polimera wrote: > > Use atomic enable/disable for bridge callbacks to access certain > states like self-refresh. > > This change avoids panel prepare/unprepare based on self-refresh > state. Please split this into two patches: - change to atomic_* callbacks - introduction of PSR support. > > Signed-off-by: Sankeerth Billakanti > Signed-off-by: Kalyan Thota > Signed-off-by: Vinod Polimera > > Changes in V2: > - As per review suggestion by Dmitry. > --- > drivers/gpu/drm/bridge/panel.c | 102 +++++++++++++++++++++++++++++++++++++---- > 1 file changed, 94 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c > index b32295a..5c7dc82 100644 > --- a/drivers/gpu/drm/bridge/panel.c > +++ b/drivers/gpu/drm/bridge/panel.c > @@ -41,6 +41,40 @@ static int panel_bridge_connector_get_modes(struct drm_connector *connector) > return drm_panel_get_modes(panel_bridge->panel, connector); > } > > +static struct drm_crtc *bridge_drm_get_old_connector_crtc(struct drm_encoder *encoder, > + struct drm_atomic_state *state) > +{ > + struct drm_connector *connector; > + struct drm_connector_state *conn_state; > + > + connector = drm_atomic_get_old_connector_for_encoder(state, encoder); > + if (!connector) > + return NULL; > + > + conn_state = drm_atomic_get_old_connector_state(state, connector); > + if (!conn_state) > + return NULL; > + > + return conn_state->crtc; > +} > + > +static struct drm_crtc *bridge_drm_get_new_connector_crtc(struct drm_encoder *encoder, > + struct drm_atomic_state *state) > +{ > + struct drm_connector *connector; > + struct drm_connector_state *conn_state; > + > + connector = drm_atomic_get_new_connector_for_encoder(state, encoder); > + if (!connector) > + return NULL; > + > + conn_state = drm_atomic_get_new_connector_state(state, connector); > + if (!conn_state) > + return NULL; > + > + return conn_state->crtc; > +} > + > static const struct drm_connector_helper_funcs > panel_bridge_connector_helper_funcs = { > .get_modes = panel_bridge_connector_get_modes, > @@ -102,30 +136,82 @@ static void panel_bridge_detach(struct drm_bridge *bridge) > drm_connector_cleanup(connector); > } > > -static void panel_bridge_pre_enable(struct drm_bridge *bridge) > +static void panel_bridge_pre_enable(struct drm_bridge *bridge, > + struct drm_bridge_state *old_bridge_state) > { > struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > + struct drm_atomic_state *old_state = old_bridge_state->base.state; > + struct drm_encoder *encoder = bridge->encoder; > + struct drm_crtc *crtc; > + struct drm_crtc_state *old_crtc_state; > + > + crtc = bridge_drm_get_new_connector_crtc(encoder, old_state); > + if (!crtc) > + return; > + > + old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc); > + if (old_crtc_state && old_crtc_state->self_refresh_active) > + return; > > drm_panel_prepare(panel_bridge->panel); > } > > -static void panel_bridge_enable(struct drm_bridge *bridge) > +static void panel_bridge_enable(struct drm_bridge *bridge, > + struct drm_bridge_state *old_bridge_state) > { > struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > + struct drm_atomic_state *old_state = old_bridge_state->base.state; > + struct drm_encoder *encoder = bridge->encoder; > + struct drm_crtc *crtc; > + struct drm_crtc_state *old_crtc_state; > + > + crtc = bridge_drm_get_new_connector_crtc(encoder, old_state); > + if (!crtc) > + return; > + > + old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc); > + if (old_crtc_state && old_crtc_state->self_refresh_active) > + return; > > drm_panel_enable(panel_bridge->panel); > } > > -static void panel_bridge_disable(struct drm_bridge *bridge) > +static void panel_bridge_disable(struct drm_bridge *bridge, > + struct drm_bridge_state *old_bridge_state) > { > struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > + struct drm_atomic_state *old_state = old_bridge_state->base.state; > + struct drm_encoder *encoder = bridge->encoder; > + struct drm_crtc *crtc; > + struct drm_crtc_state *new_crtc_state; > + > + crtc = bridge_drm_get_old_connector_crtc(encoder, old_state); > + if (!crtc) > + return; > + > + new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc); > + if (new_crtc_state && new_crtc_state->self_refresh_active) > + return; > > drm_panel_disable(panel_bridge->panel); > } > > -static void panel_bridge_post_disable(struct drm_bridge *bridge) > +static void panel_bridge_post_disable(struct drm_bridge *bridge, > + struct drm_bridge_state *old_bridge_state) > { > struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge); > + struct drm_atomic_state *old_state = old_bridge_state->base.state; > + struct drm_encoder *encoder = bridge->encoder; > + struct drm_crtc *crtc; > + struct drm_crtc_state *new_crtc_state; > + > + crtc = bridge_drm_get_old_connector_crtc(encoder, old_state); > + if (!crtc) > + return; > + > + new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc); > + if (new_crtc_state && new_crtc_state->self_refresh_active) > + return; > > drm_panel_unprepare(panel_bridge->panel); > } > @@ -141,10 +227,10 @@ static int panel_bridge_get_modes(struct drm_bridge *bridge, > static const struct drm_bridge_funcs panel_bridge_bridge_funcs = { > .attach = panel_bridge_attach, > .detach = panel_bridge_detach, > - .pre_enable = panel_bridge_pre_enable, > - .enable = panel_bridge_enable, > - .disable = panel_bridge_disable, > - .post_disable = panel_bridge_post_disable, > + .atomic_pre_enable = panel_bridge_pre_enable, > + .atomic_enable = panel_bridge_enable, > + .atomic_disable = panel_bridge_disable, > + .atomic_post_disable = panel_bridge_post_disable, Please change callback names to reflect that we are using atomic_ interfaces. > .get_modes = panel_bridge_get_modes, > .atomic_reset = drm_atomic_helper_bridge_reset, > .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, > -- > 2.7.4 > -- With best wishes Dmitry