From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 04BE8C4332F for ; Wed, 14 Dec 2022 13:01:12 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6066810E3F2; Wed, 14 Dec 2022 13:01:08 +0000 (UTC) Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by gabe.freedesktop.org (Postfix) with ESMTPS id 51EB710E3E8 for ; Wed, 14 Dec 2022 13:00:59 +0000 (UTC) Received: by mail-pl1-x630.google.com with SMTP id d15so3246534pls.6 for ; Wed, 14 Dec 2022 05:00:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ykkoMPBFg25R5qn07gjEHjZhs49sxOTu6Me4c71olVs=; b=Jq3ptjESO2wHV5IRcVBWUOvXZwoaahLFW00pQ0FRc+V8/l2sjFasc41foy4Jj1GQGH F4TxJ8fvSdVDdd6958iXl+vVIsRsc1yaUbeayAWDpE2yPvy1NofpjGpxT89SW93tS6/7 Z1Ptpfo+uJsYF+ywld47arX3YBhvlmkmpBe5I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding: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=ykkoMPBFg25R5qn07gjEHjZhs49sxOTu6Me4c71olVs=; b=2UWNfWG8uY70RxJWh1LgkE2LH7rP5IYA3urNRANt7U+Yl7y/yo0PDS+jhF2YFKJ0xP 13P7FNfwovOtrdajqkJnl18iK66/P/P6e0nqdoZ/ard2bqQW63KNFDhhTUuVf4mbUJTr N03XPYrbLjfO+/6OOqH3reKea01QlTYEJ9eH/XMMuchxlB2N1aQR5X5nxqpzNQEYEEa1 84AQM72eF3X5mQcmeL76/d3A9tmMt26ArSnh52PkUksjGc1WsPj3GDDzHjMQqfcYKV5i 9ensCgvax7CrJQLLUU/2p0Pl9AJuqmIzuUq7YGy6gfyv+cLZ7cen3p1Zptn5wTTMVfVW HdHw== X-Gm-Message-State: ANoB5plDUS3Tqt+/Fc7J1UkvuYWKdW0UlFSjreq9mkMv0dA4186Dx34G mhMtrT/OyJhVrPnJ8mqFtvGBpQ== X-Google-Smtp-Source: AA0mqf5vdHVFhRDZ0aWrLvfcHQcDuxG+WEM0vIwFNjrnoP40lrSBAWK+DekgxlvW9/njoJI0O14nWA== X-Received: by 2002:a17:902:7b83:b0:189:b0e7:c5f0 with SMTP id w3-20020a1709027b8300b00189b0e7c5f0mr22677431pll.14.1671022858705; Wed, 14 Dec 2022 05:00:58 -0800 (PST) Received: from localhost.localdomain ([2405:201:c00a:a809:5e03:faf:846e:352d]) by smtp.gmail.com with ESMTPSA id ix17-20020a170902f81100b001895f7c8a71sm1838651plb.97.2022.12.14.05.00.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Dec 2022 05:00:58 -0800 (PST) From: Jagan Teki To: Andrzej Hajda , Inki Dae , Marek Szyprowski , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Frieder Schrempf , Fancy Fang , Tim Harvey , Michael Nazzareno Trimarchi , Adam Ford , Neil Armstrong , Robert Foss , Laurent Pinchart , Tommaso Merciai , Marek Vasut Subject: [PATCH v10 12/18] drm: exynos: dsi: Consolidate component and bridge Date: Wed, 14 Dec 2022 18:29:01 +0530 Message-Id: <20221214125907.376148-13-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221214125907.376148-1-jagan@amarulasolutions.com> References: <20221214125907.376148-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-samsung-soc@vger.kernel.org, Matteo Lisi , dri-devel@lists.freedesktop.org, NXP Linux Team , linux-amarula , linux-arm-kernel@lists.infradead.org, Jagan Teki Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" DSI host registration, attach and detach operations are quite different for the component and bridge-based DRM drivers.  Supporting generic bridge driver to use both component and bridge based DRM drivers can be tricky and would require additional host related operation hooks. Add host operation hooks for registering and unregistering Exynos and generic drivers, where Exynos hooks are used in existing Exynos component based DRM drivers and generic hooks are used in i.MX8M bridge based DRM drivers.  Add host attach and detach operation hooks for Exynos component DRM drivers and those get invoked while DSI core host attach and detach gets called. Signed-off-by: Marek Szyprowski Signed-off-by: Jagan Teki --- Changes for v10: - split from previous series patch "drm: bridge: Generalize Exynos-DSI driver into a Samsung DSIM bridge" drivers/gpu/drm/exynos/exynos_drm_dsi.c | 179 ++++++++++++++++++------ 1 file changed, 140 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index bb3d6a7fa84e..819131a36b96 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c @@ -250,6 +250,8 @@ struct exynos_dsi_transfer { u16 rx_done; }; +struct exynos_dsi; + #define DSIM_STATE_ENABLED BIT(0) #define DSIM_STATE_INITIALIZED BIT(1) #define DSIM_STATE_CMD_LPM BIT(2) @@ -282,12 +284,19 @@ struct exynos_dsi_driver_data { const unsigned int *reg_values; }; +struct exynos_dsim_host_ops { + int (*register_host)(struct exynos_dsi *dsim); + void (*unregister_host)(struct exynos_dsi *dsim); + int (*attach)(struct exynos_dsi *dsim, struct mipi_dsi_device *device); + int (*detach)(struct exynos_dsi *dsim, struct mipi_dsi_device *device); +}; + struct exynos_dsi_plat_data { enum exynos_dsi_type hw_type; + const struct exynos_dsim_host_ops *host_ops; }; struct exynos_dsi { - struct drm_encoder encoder; struct mipi_dsi_host dsi_host; struct drm_bridge bridge; struct drm_bridge *out_bridge; @@ -317,6 +326,12 @@ struct exynos_dsi { const struct exynos_dsi_driver_data *driver_data; const struct exynos_dsi_plat_data *plat_data; + + void *priv; +}; + +struct exynos_dsi_enc { + struct drm_encoder encoder; }; #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host) @@ -1320,10 +1335,11 @@ static irqreturn_t exynos_dsi_irq(int irq, void *dev_id) static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) { - struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; + struct exynos_dsi *dsim = (struct exynos_dsi *)dev_id; + struct exynos_dsi_enc *dsi = dsim->priv; struct drm_encoder *encoder = &dsi->encoder; - if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE) + if (dsim->state & DSIM_STATE_VIDOUT_AVAILABLE) exynos_drm_crtc_te_handler(encoder->crtc); return IRQ_HANDLED; @@ -1597,9 +1613,8 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, struct mipi_dsi_device *device) { struct exynos_dsi *dsi = host_to_dsi(host); + const struct exynos_dsi_plat_data *pdata = dsi->plat_data; struct device *dev = dsi->dev; - struct drm_encoder *encoder = &dsi->encoder; - struct drm_device *drm = encoder->dev; int ret; dsi->out_bridge = devm_drm_of_dsi_get_bridge(dev, dev->of_node, 1, 0); @@ -1613,35 +1628,15 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, drm_bridge_add(&dsi->bridge); - drm_bridge_attach(encoder, &dsi->bridge, - list_first_entry_or_null(&encoder->bridge_chain, - struct drm_bridge, - chain_node), 0); - - /* - * This is a temporary solution and should be made by more generic way. - * - * If attached panel device is for command mode one, dsi should register - * TE interrupt handler. - */ - if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { - ret = exynos_dsi_register_te_irq(dsi, &device->dev); - if (ret) + if (pdata->host_ops && pdata->host_ops->attach) { + ret = pdata->host_ops->attach(dsi, device); + if (ret < 0) return ret; } - mutex_lock(&drm->mode_config.mutex); - dsi->lanes = device->lanes; dsi->format = device->format; dsi->mode_flags = device->mode_flags; - exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode = - !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO); - - mutex_unlock(&drm->mode_config.mutex); - - if (drm->mode_config.poll_enabled) - drm_kms_helper_hotplug_event(drm); return 0; } @@ -1650,12 +1645,14 @@ static int exynos_dsi_host_detach(struct mipi_dsi_host *host, struct mipi_dsi_device *device) { struct exynos_dsi *dsi = host_to_dsi(host); - struct drm_device *drm = dsi->encoder.dev; - - if (drm->mode_config.poll_enabled) - drm_kms_helper_hotplug_event(drm); + const struct exynos_dsi_plat_data *pdata = dsi->plat_data; + int ret; - exynos_dsi_unregister_te_irq(dsi); + if (pdata->host_ops && pdata->host_ops->detach) { + ret = pdata->host_ops->detach(dsi, device); + if (ret < 0) + return ret; + } drm_bridge_remove(&dsi->bridge); @@ -1729,10 +1726,66 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) return 0; } +static int _exynos_dsi_host_attach(struct exynos_dsi *dsim, + struct mipi_dsi_device *device) +{ + struct exynos_dsi_enc *dsi = dsim->priv; + struct drm_encoder *encoder = &dsi->encoder; + struct drm_device *drm = encoder->dev; + int ret; + + drm_bridge_attach(encoder, &dsim->bridge, + list_first_entry_or_null(&encoder->bridge_chain, + struct drm_bridge, + chain_node), 0); + + /* + * This is a temporary solution and should be made by more generic way. + * + * If attached panel device is for command mode one, dsi should register + * TE interrupt handler. + */ + if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { + ret = exynos_dsi_register_te_irq(dsim, &device->dev); + if (ret) + return ret; + } + + mutex_lock(&drm->mode_config.mutex); + + dsim->lanes = device->lanes; + dsim->format = device->format; + dsim->mode_flags = device->mode_flags; + exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode = + !(dsim->mode_flags & MIPI_DSI_MODE_VIDEO); + + mutex_unlock(&drm->mode_config.mutex); + + if (drm->mode_config.poll_enabled) + drm_kms_helper_hotplug_event(drm); + + return 0; +} + +static int _exynos_dsi_host_detach(struct exynos_dsi *dsim, + struct mipi_dsi_device *device) +{ + struct exynos_dsi_enc *dsi = dsim->priv; + struct drm_device *drm = dsi->encoder.dev; + + if (drm->mode_config.poll_enabled) + drm_kms_helper_hotplug_event(drm); + + exynos_dsi_unregister_te_irq(dsim); + + return 0; +} + static int exynos_dsi_bind(struct device *dev, struct device *master, void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct exynos_dsi *dsim = dev_get_drvdata(dev); + struct exynos_dsi_enc *dsi = dsim->priv; struct drm_encoder *encoder = &dsi->encoder; struct drm_device *drm_dev = data; int ret; @@ -1743,17 +1796,17 @@ static int exynos_dsi_bind(struct device *dev, struct device *master, if (ret < 0) return ret; - return mipi_dsi_host_register(&dsi->dsi_host); + return mipi_dsi_host_register(&dsim->dsi_host); } static void exynos_dsi_unbind(struct device *dev, struct device *master, void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct exynos_dsi *dsim = dev_get_drvdata(dev); - exynos_dsi_atomic_disable(&dsi->bridge, NULL); + dsim->bridge.funcs->atomic_disable(&dsim->bridge, NULL); - mipi_dsi_host_unregister(&dsi->dsi_host); + mipi_dsi_host_unregister(&dsim->dsi_host); } static const struct component_ops exynos_dsi_component_ops = { @@ -1761,6 +1814,40 @@ static const struct component_ops exynos_dsi_component_ops = { .unbind = exynos_dsi_unbind, }; +static int exynos_dsi_register_host(struct exynos_dsi *dsim) +{ + struct exynos_dsi_enc *dsi; + + dsi = devm_kzalloc(dsim->dev, sizeof(*dsi), GFP_KERNEL); + if (!dsi) + return -ENOMEM; + + dsim->priv = dsi; + dsim->bridge.pre_enable_prev_first = true; + + return component_add(dsim->dev, &exynos_dsi_component_ops); +} + +static void exynos_dsi_unregister_host(struct exynos_dsi *dsim) +{ + component_del(dsim->dev, &exynos_dsi_component_ops); +} + +static int generic_dsim_register_host(struct exynos_dsi *dsim) +{ + return mipi_dsi_host_register(&dsim->dsi_host); +} + +static void generic_dsim_unregister_host(struct exynos_dsi *dsim) +{ + mipi_dsi_host_unregister(&dsim->dsi_host); +} + +static const struct exynos_dsim_host_ops generic_dsim_host_ops = { + .register_host = generic_dsim_register_host, + .unregister_host = generic_dsim_unregister_host, +}; + static const struct drm_bridge_timings dsim_bridge_timings_de_low = { .input_bus_flags = DRM_BUS_FLAG_DE_LOW, }; @@ -1855,7 +1942,9 @@ static int exynos_dsi_probe(struct platform_device *pdev) if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) dsi->bridge.timings = &dsim_bridge_timings_de_low; - ret = component_add(dev, &exynos_dsi_component_ops); + if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->register_host) + ret = dsi->plat_data->host_ops->register_host(dsi); + if (ret) goto err_disable_runtime; @@ -1946,24 +2035,36 @@ static const struct dev_pm_ops exynos_dsi_pm_ops = { pm_runtime_force_resume) }; +static const struct exynos_dsim_host_ops exynos_dsi_host_ops = { + .register_host = exynos_dsi_register_host, + .unregister_host = exynos_dsi_unregister_host, + .attach = _exynos_dsi_host_attach, + .detach = _exynos_dsi_host_detach, +}; + static const struct exynos_dsi_plat_data exynos3250_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS3250, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos4210_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS4210, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos5410_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS5410, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos5422_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS5422, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos5433_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS5433, + .host_ops = &exynos_dsi_host_ops, }; static const struct of_device_id exynos_dsi_of_match[] = { -- 2.25.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3ECABC001B2 for ; Wed, 14 Dec 2022 13:02:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238316AbiLNNCD (ORCPT ); Wed, 14 Dec 2022 08:02:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60114 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238427AbiLNNBb (ORCPT ); Wed, 14 Dec 2022 08:01:31 -0500 Received: from mail-pl1-x62c.google.com (mail-pl1-x62c.google.com [IPv6:2607:f8b0:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5F18E1E3CF for ; Wed, 14 Dec 2022 05:00:59 -0800 (PST) Received: by mail-pl1-x62c.google.com with SMTP id w23so3213769ply.12 for ; Wed, 14 Dec 2022 05:00:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ykkoMPBFg25R5qn07gjEHjZhs49sxOTu6Me4c71olVs=; b=Jq3ptjESO2wHV5IRcVBWUOvXZwoaahLFW00pQ0FRc+V8/l2sjFasc41foy4Jj1GQGH F4TxJ8fvSdVDdd6958iXl+vVIsRsc1yaUbeayAWDpE2yPvy1NofpjGpxT89SW93tS6/7 Z1Ptpfo+uJsYF+ywld47arX3YBhvlmkmpBe5I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding: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=ykkoMPBFg25R5qn07gjEHjZhs49sxOTu6Me4c71olVs=; b=PGF7h1lZuiLgTx1ar6dVwlA0FkFSwUQgxmZK03C4Yhv7+xz9yQ77M16s2SZYVXK4ED 2ZE/q1QUhep80eBdiASIalCp0AnvxxDuCyCHfgIlm9lIwyPGVTwe1C4ExH//yPFIFmO6 7xrLzDBFn2NvZ4PCxSHrx1YYD4+vuSFGl1hH9L+gmnXKMoH6nh41mZJfOYylS9AYmzH3 r+1ayEDJi6KjKb93R0iMxoZ30UTf2+745iNjhgcu4T2/uKmbOBnOC1djPs1PJ4rQ8jwi LFe5yySG73NRTqSgPgN6AlS0eoRVPFB5yNKvcLh0QsOMC65QsE5FeUOzXAxjmQGeb5yu D7bw== X-Gm-Message-State: ANoB5pksC2dizLvRmKKOoEJsXbvv2pIJPZIp4zQwU8bBd5EhaU5hcQ0x YjAujUJJAeD+zIetzfUQT0Xhtw== X-Google-Smtp-Source: AA0mqf5vdHVFhRDZ0aWrLvfcHQcDuxG+WEM0vIwFNjrnoP40lrSBAWK+DekgxlvW9/njoJI0O14nWA== X-Received: by 2002:a17:902:7b83:b0:189:b0e7:c5f0 with SMTP id w3-20020a1709027b8300b00189b0e7c5f0mr22677431pll.14.1671022858705; Wed, 14 Dec 2022 05:00:58 -0800 (PST) Received: from localhost.localdomain ([2405:201:c00a:a809:5e03:faf:846e:352d]) by smtp.gmail.com with ESMTPSA id ix17-20020a170902f81100b001895f7c8a71sm1838651plb.97.2022.12.14.05.00.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Dec 2022 05:00:58 -0800 (PST) From: Jagan Teki To: Andrzej Hajda , Inki Dae , Marek Szyprowski , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Frieder Schrempf , Fancy Fang , Tim Harvey , Michael Nazzareno Trimarchi , Adam Ford , Neil Armstrong , Robert Foss , Laurent Pinchart , Tommaso Merciai , Marek Vasut Cc: Matteo Lisi , dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team , linux-amarula , Jagan Teki Subject: [PATCH v10 12/18] drm: exynos: dsi: Consolidate component and bridge Date: Wed, 14 Dec 2022 18:29:01 +0530 Message-Id: <20221214125907.376148-13-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221214125907.376148-1-jagan@amarulasolutions.com> References: <20221214125907.376148-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org DSI host registration, attach and detach operations are quite different for the component and bridge-based DRM drivers.  Supporting generic bridge driver to use both component and bridge based DRM drivers can be tricky and would require additional host related operation hooks. Add host operation hooks for registering and unregistering Exynos and generic drivers, where Exynos hooks are used in existing Exynos component based DRM drivers and generic hooks are used in i.MX8M bridge based DRM drivers.  Add host attach and detach operation hooks for Exynos component DRM drivers and those get invoked while DSI core host attach and detach gets called. Signed-off-by: Marek Szyprowski Signed-off-by: Jagan Teki --- Changes for v10: - split from previous series patch "drm: bridge: Generalize Exynos-DSI driver into a Samsung DSIM bridge" drivers/gpu/drm/exynos/exynos_drm_dsi.c | 179 ++++++++++++++++++------ 1 file changed, 140 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c index bb3d6a7fa84e..819131a36b96 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c @@ -250,6 +250,8 @@ struct exynos_dsi_transfer { u16 rx_done; }; +struct exynos_dsi; + #define DSIM_STATE_ENABLED BIT(0) #define DSIM_STATE_INITIALIZED BIT(1) #define DSIM_STATE_CMD_LPM BIT(2) @@ -282,12 +284,19 @@ struct exynos_dsi_driver_data { const unsigned int *reg_values; }; +struct exynos_dsim_host_ops { + int (*register_host)(struct exynos_dsi *dsim); + void (*unregister_host)(struct exynos_dsi *dsim); + int (*attach)(struct exynos_dsi *dsim, struct mipi_dsi_device *device); + int (*detach)(struct exynos_dsi *dsim, struct mipi_dsi_device *device); +}; + struct exynos_dsi_plat_data { enum exynos_dsi_type hw_type; + const struct exynos_dsim_host_ops *host_ops; }; struct exynos_dsi { - struct drm_encoder encoder; struct mipi_dsi_host dsi_host; struct drm_bridge bridge; struct drm_bridge *out_bridge; @@ -317,6 +326,12 @@ struct exynos_dsi { const struct exynos_dsi_driver_data *driver_data; const struct exynos_dsi_plat_data *plat_data; + + void *priv; +}; + +struct exynos_dsi_enc { + struct drm_encoder encoder; }; #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host) @@ -1320,10 +1335,11 @@ static irqreturn_t exynos_dsi_irq(int irq, void *dev_id) static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id) { - struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; + struct exynos_dsi *dsim = (struct exynos_dsi *)dev_id; + struct exynos_dsi_enc *dsi = dsim->priv; struct drm_encoder *encoder = &dsi->encoder; - if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE) + if (dsim->state & DSIM_STATE_VIDOUT_AVAILABLE) exynos_drm_crtc_te_handler(encoder->crtc); return IRQ_HANDLED; @@ -1597,9 +1613,8 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, struct mipi_dsi_device *device) { struct exynos_dsi *dsi = host_to_dsi(host); + const struct exynos_dsi_plat_data *pdata = dsi->plat_data; struct device *dev = dsi->dev; - struct drm_encoder *encoder = &dsi->encoder; - struct drm_device *drm = encoder->dev; int ret; dsi->out_bridge = devm_drm_of_dsi_get_bridge(dev, dev->of_node, 1, 0); @@ -1613,35 +1628,15 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, drm_bridge_add(&dsi->bridge); - drm_bridge_attach(encoder, &dsi->bridge, - list_first_entry_or_null(&encoder->bridge_chain, - struct drm_bridge, - chain_node), 0); - - /* - * This is a temporary solution and should be made by more generic way. - * - * If attached panel device is for command mode one, dsi should register - * TE interrupt handler. - */ - if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { - ret = exynos_dsi_register_te_irq(dsi, &device->dev); - if (ret) + if (pdata->host_ops && pdata->host_ops->attach) { + ret = pdata->host_ops->attach(dsi, device); + if (ret < 0) return ret; } - mutex_lock(&drm->mode_config.mutex); - dsi->lanes = device->lanes; dsi->format = device->format; dsi->mode_flags = device->mode_flags; - exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode = - !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO); - - mutex_unlock(&drm->mode_config.mutex); - - if (drm->mode_config.poll_enabled) - drm_kms_helper_hotplug_event(drm); return 0; } @@ -1650,12 +1645,14 @@ static int exynos_dsi_host_detach(struct mipi_dsi_host *host, struct mipi_dsi_device *device) { struct exynos_dsi *dsi = host_to_dsi(host); - struct drm_device *drm = dsi->encoder.dev; - - if (drm->mode_config.poll_enabled) - drm_kms_helper_hotplug_event(drm); + const struct exynos_dsi_plat_data *pdata = dsi->plat_data; + int ret; - exynos_dsi_unregister_te_irq(dsi); + if (pdata->host_ops && pdata->host_ops->detach) { + ret = pdata->host_ops->detach(dsi, device); + if (ret < 0) + return ret; + } drm_bridge_remove(&dsi->bridge); @@ -1729,10 +1726,66 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) return 0; } +static int _exynos_dsi_host_attach(struct exynos_dsi *dsim, + struct mipi_dsi_device *device) +{ + struct exynos_dsi_enc *dsi = dsim->priv; + struct drm_encoder *encoder = &dsi->encoder; + struct drm_device *drm = encoder->dev; + int ret; + + drm_bridge_attach(encoder, &dsim->bridge, + list_first_entry_or_null(&encoder->bridge_chain, + struct drm_bridge, + chain_node), 0); + + /* + * This is a temporary solution and should be made by more generic way. + * + * If attached panel device is for command mode one, dsi should register + * TE interrupt handler. + */ + if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { + ret = exynos_dsi_register_te_irq(dsim, &device->dev); + if (ret) + return ret; + } + + mutex_lock(&drm->mode_config.mutex); + + dsim->lanes = device->lanes; + dsim->format = device->format; + dsim->mode_flags = device->mode_flags; + exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode = + !(dsim->mode_flags & MIPI_DSI_MODE_VIDEO); + + mutex_unlock(&drm->mode_config.mutex); + + if (drm->mode_config.poll_enabled) + drm_kms_helper_hotplug_event(drm); + + return 0; +} + +static int _exynos_dsi_host_detach(struct exynos_dsi *dsim, + struct mipi_dsi_device *device) +{ + struct exynos_dsi_enc *dsi = dsim->priv; + struct drm_device *drm = dsi->encoder.dev; + + if (drm->mode_config.poll_enabled) + drm_kms_helper_hotplug_event(drm); + + exynos_dsi_unregister_te_irq(dsim); + + return 0; +} + static int exynos_dsi_bind(struct device *dev, struct device *master, void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct exynos_dsi *dsim = dev_get_drvdata(dev); + struct exynos_dsi_enc *dsi = dsim->priv; struct drm_encoder *encoder = &dsi->encoder; struct drm_device *drm_dev = data; int ret; @@ -1743,17 +1796,17 @@ static int exynos_dsi_bind(struct device *dev, struct device *master, if (ret < 0) return ret; - return mipi_dsi_host_register(&dsi->dsi_host); + return mipi_dsi_host_register(&dsim->dsi_host); } static void exynos_dsi_unbind(struct device *dev, struct device *master, void *data) { - struct exynos_dsi *dsi = dev_get_drvdata(dev); + struct exynos_dsi *dsim = dev_get_drvdata(dev); - exynos_dsi_atomic_disable(&dsi->bridge, NULL); + dsim->bridge.funcs->atomic_disable(&dsim->bridge, NULL); - mipi_dsi_host_unregister(&dsi->dsi_host); + mipi_dsi_host_unregister(&dsim->dsi_host); } static const struct component_ops exynos_dsi_component_ops = { @@ -1761,6 +1814,40 @@ static const struct component_ops exynos_dsi_component_ops = { .unbind = exynos_dsi_unbind, }; +static int exynos_dsi_register_host(struct exynos_dsi *dsim) +{ + struct exynos_dsi_enc *dsi; + + dsi = devm_kzalloc(dsim->dev, sizeof(*dsi), GFP_KERNEL); + if (!dsi) + return -ENOMEM; + + dsim->priv = dsi; + dsim->bridge.pre_enable_prev_first = true; + + return component_add(dsim->dev, &exynos_dsi_component_ops); +} + +static void exynos_dsi_unregister_host(struct exynos_dsi *dsim) +{ + component_del(dsim->dev, &exynos_dsi_component_ops); +} + +static int generic_dsim_register_host(struct exynos_dsi *dsim) +{ + return mipi_dsi_host_register(&dsim->dsi_host); +} + +static void generic_dsim_unregister_host(struct exynos_dsi *dsim) +{ + mipi_dsi_host_unregister(&dsim->dsi_host); +} + +static const struct exynos_dsim_host_ops generic_dsim_host_ops = { + .register_host = generic_dsim_register_host, + .unregister_host = generic_dsim_unregister_host, +}; + static const struct drm_bridge_timings dsim_bridge_timings_de_low = { .input_bus_flags = DRM_BUS_FLAG_DE_LOW, }; @@ -1855,7 +1942,9 @@ static int exynos_dsi_probe(struct platform_device *pdev) if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) dsi->bridge.timings = &dsim_bridge_timings_de_low; - ret = component_add(dev, &exynos_dsi_component_ops); + if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->register_host) + ret = dsi->plat_data->host_ops->register_host(dsi); + if (ret) goto err_disable_runtime; @@ -1946,24 +2035,36 @@ static const struct dev_pm_ops exynos_dsi_pm_ops = { pm_runtime_force_resume) }; +static const struct exynos_dsim_host_ops exynos_dsi_host_ops = { + .register_host = exynos_dsi_register_host, + .unregister_host = exynos_dsi_unregister_host, + .attach = _exynos_dsi_host_attach, + .detach = _exynos_dsi_host_detach, +}; + static const struct exynos_dsi_plat_data exynos3250_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS3250, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos4210_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS4210, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos5410_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS5410, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos5422_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS5422, + .host_ops = &exynos_dsi_host_ops, }; static const struct exynos_dsi_plat_data exynos5433_dsi_pdata = { .hw_type = DSIM_TYPE_EXYNOS5433, + .host_ops = &exynos_dsi_host_ops, }; static const struct of_device_id exynos_dsi_of_match[] = { -- 2.25.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8B6E7C4332F for ; Wed, 14 Dec 2022 13:07:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Lrjox524hqZd7qr3kXWHorfKQ5T2xAJ5sf9HquFzKF8=; b=dxAQSrjKiZd9xQ wdYJ2tK3H26/kb9IDj8sYMTskcWV9/uqbZRGBnYrv959BGPfmgXxOxCPXYCtO5jNIuItOTNH2dDtQ wwL+SfHiNL1KLg1WaSmqqQozuSW6ZqeODk83i4iG8gzw5eEQuebmKLGDQle/fqsiwOLifo/d+wkYY bP1EFix1njoOnbUc1m+9CZNKnwOK9xlxIPxfgcc+jIrdvuuqCS5Eq58rcle2ihj1m/WZLgFWPv5Lc SfWG3LMXz9E0h6EjioT34UAbpnaGu/Twn3O9H7jKeMOBb2/yuSuGkUPRri66Wa6mYn9vxqq1S1FLn gzBHrg0xMW4hFY1gsqPQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1p5RSr-00GYzx-J2; Wed, 14 Dec 2022 13:06:25 +0000 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1p5RNc-00GWEX-B6 for linux-arm-kernel@lists.infradead.org; Wed, 14 Dec 2022 13:01:04 +0000 Received: by mail-pl1-x62a.google.com with SMTP id 4so3260206plj.3 for ; Wed, 14 Dec 2022 05:00:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ykkoMPBFg25R5qn07gjEHjZhs49sxOTu6Me4c71olVs=; b=Jq3ptjESO2wHV5IRcVBWUOvXZwoaahLFW00pQ0FRc+V8/l2sjFasc41foy4Jj1GQGH F4TxJ8fvSdVDdd6958iXl+vVIsRsc1yaUbeayAWDpE2yPvy1NofpjGpxT89SW93tS6/7 Z1Ptpfo+uJsYF+ywld47arX3YBhvlmkmpBe5I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding: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=ykkoMPBFg25R5qn07gjEHjZhs49sxOTu6Me4c71olVs=; b=ZCSSpPfTrcNSqwY1eFWAIu3/jUzK4d7OL96DJtTZOrSNCjtd2TdK1m1Mc6gvH69pF3 ezGfRJ3hVW+dubJNSun/2/iN6k04WskFzPCqjdKaTtbXrHOP5n3WL5qFvoY6PWi1U+Jf KvoYW6WM3gxXY70FNTXUaBrkWftGDZ5BTc9DW1Vp5GU1XfVT4Q6qJSuDojzca9TG1xFi cvIGy11idXRVFADxJq/2eKmoMpqSPZ1MUiItY8dz9TydV7/CKnvdScumupw057mymILF Yup6B+VWIDR+b3VbaP40AroF2/fndd1FKK4/wDIGuue1ijPNGYdOaNgGdbzAzs2myxzQ NxsQ== X-Gm-Message-State: ANoB5plxrVf5x12E/Z6F2T7Fx9G6zThImMN5DYLYcvWlSfPVxA7RpysQ QzbcjUUM+jAVh+o0JoQ2g6FYkg== X-Google-Smtp-Source: AA0mqf5vdHVFhRDZ0aWrLvfcHQcDuxG+WEM0vIwFNjrnoP40lrSBAWK+DekgxlvW9/njoJI0O14nWA== X-Received: by 2002:a17:902:7b83:b0:189:b0e7:c5f0 with SMTP id w3-20020a1709027b8300b00189b0e7c5f0mr22677431pll.14.1671022858705; Wed, 14 Dec 2022 05:00:58 -0800 (PST) Received: from localhost.localdomain ([2405:201:c00a:a809:5e03:faf:846e:352d]) by smtp.gmail.com with ESMTPSA id ix17-20020a170902f81100b001895f7c8a71sm1838651plb.97.2022.12.14.05.00.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Dec 2022 05:00:58 -0800 (PST) From: Jagan Teki To: Andrzej Hajda , Inki Dae , Marek Szyprowski , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Frieder Schrempf , Fancy Fang , Tim Harvey , Michael Nazzareno Trimarchi , Adam Ford , Neil Armstrong , Robert Foss , Laurent Pinchart , Tommaso Merciai , Marek Vasut Cc: Matteo Lisi , dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team , linux-amarula , Jagan Teki Subject: [PATCH v10 12/18] drm: exynos: dsi: Consolidate component and bridge Date: Wed, 14 Dec 2022 18:29:01 +0530 Message-Id: <20221214125907.376148-13-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221214125907.376148-1-jagan@amarulasolutions.com> References: <20221214125907.376148-1-jagan@amarulasolutions.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221214_050100_478116_39CE399B X-CRM114-Status: GOOD ( 24.68 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RFNJIGhvc3QgcmVnaXN0cmF0aW9uLCBhdHRhY2ggYW5kIGRldGFjaCBvcGVyYXRpb25zIGFyZSBx dWl0ZQpkaWZmZXJlbnQgZm9yIHRoZSBjb21wb25lbnQgYW5kIGJyaWRnZS1iYXNlZCBEUk0gZHJp dmVycy7CoAoKU3VwcG9ydGluZyBnZW5lcmljIGJyaWRnZSBkcml2ZXIgdG8gdXNlIGJvdGggY29t cG9uZW50wqBhbmQgYnJpZGdlCmJhc2VkIERSTSBkcml2ZXJzIGNhbiBiZSB0cmlja3kgYW5kIHdv dWxkIHJlcXVpcmUgYWRkaXRpb25hbCBob3N0CnJlbGF0ZWQgb3BlcmF0aW9uIGhvb2tzLgoKQWRk IGhvc3Qgb3BlcmF0aW9uIGhvb2tzIGZvciByZWdpc3RlcmluZyBhbmQgdW5yZWdpc3RlcmluZyBF eHlub3MKYW5kIGdlbmVyaWMgZHJpdmVycywgd2hlcmUgRXh5bm9zIGhvb2tzIGFyZSB1c2VkIGlu IGV4aXN0aW5nIEV4eW5vcwpjb21wb25lbnTCoGJhc2VkIERSTSBkcml2ZXJzIGFuZCBnZW5lcmlj IGhvb2tzIGFyZSB1c2VkIGluIGkuTVg4TQpicmlkZ2UgYmFzZWQgRFJNIGRyaXZlcnMuwqAKCkFk ZCBob3N0IGF0dGFjaCBhbmQgZGV0YWNoIG9wZXJhdGlvbiBob29rcyBmb3IgRXh5bm9zIGNvbXBv bmVudApEUk0gZHJpdmVycyBhbmQgdGhvc2UgZ2V0IGludm9rZWQgd2hpbGUgRFNJIGNvcmUgaG9z dCBhdHRhY2ggYW5kCmRldGFjaCBnZXRzIGNhbGxlZC4KClNpZ25lZC1vZmYtYnk6IE1hcmVrIFN6 eXByb3dza2kgPG0uc3p5cHJvd3NraUBzYW1zdW5nLmNvbT4KU2lnbmVkLW9mZi1ieTogSmFnYW4g VGVraSA8amFnYW5AYW1hcnVsYXNvbHV0aW9ucy5jb20+Ci0tLQpDaGFuZ2VzIGZvciB2MTA6Ci0g c3BsaXQgZnJvbSBwcmV2aW91cyBzZXJpZXMgcGF0Y2gKImRybTogYnJpZGdlOiBHZW5lcmFsaXpl IEV4eW5vcy1EU0kgZHJpdmVyIGludG8gYSBTYW1zdW5nIERTSU0gYnJpZGdlIgoKIGRyaXZlcnMv Z3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kc2kuYyB8IDE3OSArKysrKysrKysrKysrKysrKyst LS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNDAgaW5zZXJ0aW9ucygrKSwgMzkgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RzaS5jIGIv ZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RzaS5jCmluZGV4IGJiM2Q2YTdmYTg0 ZS4uODE5MTMxYTM2Yjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5v c19kcm1fZHNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RzaS5j CkBAIC0yNTAsNiArMjUwLDggQEAgc3RydWN0IGV4eW5vc19kc2lfdHJhbnNmZXIgewogCXUxNiBy eF9kb25lOwogfTsKIAorc3RydWN0IGV4eW5vc19kc2k7CisKICNkZWZpbmUgRFNJTV9TVEFURV9F TkFCTEVECQlCSVQoMCkKICNkZWZpbmUgRFNJTV9TVEFURV9JTklUSUFMSVpFRAkJQklUKDEpCiAj ZGVmaW5lIERTSU1fU1RBVEVfQ01EX0xQTQkJQklUKDIpCkBAIC0yODIsMTIgKzI4NCwxOSBAQCBz dHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSB7CiAJY29uc3QgdW5zaWduZWQgaW50ICpyZWdf dmFsdWVzOwogfTsKIAorc3RydWN0IGV4eW5vc19kc2ltX2hvc3Rfb3BzIHsKKwlpbnQgKCpyZWdp c3Rlcl9ob3N0KShzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpbSk7CisJdm9pZCAoKnVucmVnaXN0ZXJf aG9zdCkoc3RydWN0IGV4eW5vc19kc2kgKmRzaW0pOworCWludCAoKmF0dGFjaCkoc3RydWN0IGV4 eW5vc19kc2kgKmRzaW0sIHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRldmljZSk7CisJaW50ICgq ZGV0YWNoKShzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpbSwgc3RydWN0IG1pcGlfZHNpX2RldmljZSAq ZGV2aWNlKTsKK307CisKIHN0cnVjdCBleHlub3NfZHNpX3BsYXRfZGF0YSB7CiAJZW51bSBleHlu b3NfZHNpX3R5cGUgaHdfdHlwZTsKKwljb25zdCBzdHJ1Y3QgZXh5bm9zX2RzaW1faG9zdF9vcHMg Kmhvc3Rfb3BzOwogfTsKIAogc3RydWN0IGV4eW5vc19kc2kgewotCXN0cnVjdCBkcm1fZW5jb2Rl ciBlbmNvZGVyOwogCXN0cnVjdCBtaXBpX2RzaV9ob3N0IGRzaV9ob3N0OwogCXN0cnVjdCBkcm1f YnJpZGdlIGJyaWRnZTsKIAlzdHJ1Y3QgZHJtX2JyaWRnZSAqb3V0X2JyaWRnZTsKQEAgLTMxNyw2 ICszMjYsMTIgQEAgc3RydWN0IGV4eW5vc19kc2kgewogCiAJY29uc3Qgc3RydWN0IGV4eW5vc19k c2lfZHJpdmVyX2RhdGEgKmRyaXZlcl9kYXRhOwogCWNvbnN0IHN0cnVjdCBleHlub3NfZHNpX3Bs YXRfZGF0YSAqcGxhdF9kYXRhOworCisJdm9pZCAqcHJpdjsKK307CisKK3N0cnVjdCBleHlub3Nf ZHNpX2VuYyB7CisJc3RydWN0IGRybV9lbmNvZGVyIGVuY29kZXI7CiB9OwogCiAjZGVmaW5lIGhv c3RfdG9fZHNpKGhvc3QpIGNvbnRhaW5lcl9vZihob3N0LCBzdHJ1Y3QgZXh5bm9zX2RzaSwgZHNp X2hvc3QpCkBAIC0xMzIwLDEwICsxMzM1LDExIEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBleHlub3Nf ZHNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBleHlu b3NfZHNpX3RlX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3Qg ZXh5bm9zX2RzaSAqZHNpID0gKHN0cnVjdCBleHlub3NfZHNpICopZGV2X2lkOworCXN0cnVjdCBl eHlub3NfZHNpICpkc2ltID0gKHN0cnVjdCBleHlub3NfZHNpICopZGV2X2lkOworCXN0cnVjdCBl eHlub3NfZHNpX2VuYyAqZHNpID0gZHNpbS0+cHJpdjsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVu Y29kZXIgPSAmZHNpLT5lbmNvZGVyOwogCi0JaWYgKGRzaS0+c3RhdGUgJiBEU0lNX1NUQVRFX1ZJ RE9VVF9BVkFJTEFCTEUpCisJaWYgKGRzaW0tPnN0YXRlICYgRFNJTV9TVEFURV9WSURPVVRfQVZB SUxBQkxFKQogCQlleHlub3NfZHJtX2NydGNfdGVfaGFuZGxlcihlbmNvZGVyLT5jcnRjKTsKIAog CXJldHVybiBJUlFfSEFORExFRDsKQEAgLTE1OTcsOSArMTYxMyw4IEBAIHN0YXRpYyBpbnQgZXh5 bm9zX2RzaV9ob3N0X2F0dGFjaChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKIAkJCQkgIHN0 cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNp ID0gaG9zdF90b19kc2koaG9zdCk7CisJY29uc3Qgc3RydWN0IGV4eW5vc19kc2lfcGxhdF9kYXRh ICpwZGF0YSA9IGRzaS0+cGxhdF9kYXRhOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRzaS0+ZGV2 OwotCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZkc2ktPmVuY29kZXI7Ci0Jc3RydWN0 IGRybV9kZXZpY2UgKmRybSA9IGVuY29kZXItPmRldjsKIAlpbnQgcmV0OwogCiAJZHNpLT5vdXRf YnJpZGdlID0gZGV2bV9kcm1fb2ZfZHNpX2dldF9icmlkZ2UoZGV2LCBkZXYtPm9mX25vZGUsIDEs IDApOwpAQCAtMTYxMywzNSArMTYyOCwxNSBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfaG9zdF9h dHRhY2goc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCiAKIAlkcm1fYnJpZGdlX2FkZCgmZHNp LT5icmlkZ2UpOwogCi0JZHJtX2JyaWRnZV9hdHRhY2goZW5jb2RlciwgJmRzaS0+YnJpZGdlLAot CQkJICBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVuY29kZXItPmJyaWRnZV9jaGFpbiwKLQkJ CQkJCSAgIHN0cnVjdCBkcm1fYnJpZGdlLAotCQkJCQkJICAgY2hhaW5fbm9kZSksIDApOwotCi0J LyoKLQkgKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIGFuZCBzaG91bGQgYmUgbWFkZSBi eSBtb3JlIGdlbmVyaWMgd2F5LgotCSAqCi0JICogSWYgYXR0YWNoZWQgcGFuZWwgZGV2aWNlIGlz IGZvciBjb21tYW5kIG1vZGUgb25lLCBkc2kgc2hvdWxkIHJlZ2lzdGVyCi0JICogVEUgaW50ZXJy dXB0IGhhbmRsZXIuCi0JICovCi0JaWYgKCEoZGV2aWNlLT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lf TU9ERV9WSURFTykpIHsKLQkJcmV0ID0gZXh5bm9zX2RzaV9yZWdpc3Rlcl90ZV9pcnEoZHNpLCAm ZGV2aWNlLT5kZXYpOwotCQlpZiAocmV0KQorCWlmIChwZGF0YS0+aG9zdF9vcHMgJiYgcGRhdGEt Pmhvc3Rfb3BzLT5hdHRhY2gpIHsKKwkJcmV0ID0gcGRhdGEtPmhvc3Rfb3BzLT5hdHRhY2goZHNp LCBkZXZpY2UpOworCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JbXV0ZXhf bG9jaygmZHJtLT5tb2RlX2NvbmZpZy5tdXRleCk7Ci0KIAlkc2ktPmxhbmVzID0gZGV2aWNlLT5s YW5lczsKIAlkc2ktPmZvcm1hdCA9IGRldmljZS0+Zm9ybWF0OwogCWRzaS0+bW9kZV9mbGFncyA9 IGRldmljZS0+bW9kZV9mbGFnczsKLQlleHlub3NfZHJtX2NydGNfZ2V0X2J5X3R5cGUoZHJtLCBF WFlOT1NfRElTUExBWV9UWVBFX0xDRCktPmk4MF9tb2RlID0KLQkJCSEoZHNpLT5tb2RlX2ZsYWdz ICYgTUlQSV9EU0lfTU9ERV9WSURFTyk7Ci0KLQltdXRleF91bmxvY2soJmRybS0+bW9kZV9jb25m aWcubXV0ZXgpOwotCi0JaWYgKGRybS0+bW9kZV9jb25maWcucG9sbF9lbmFibGVkKQotCQlkcm1f a21zX2hlbHBlcl9ob3RwbHVnX2V2ZW50KGRybSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NTAs MTIgKzE2NDUsMTQgQEAgc3RhdGljIGludCBleHlub3NfZHNpX2hvc3RfZGV0YWNoKHN0cnVjdCBt aXBpX2RzaV9ob3N0ICpob3N0LAogCQkJCSAgc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZGV2aWNl KQogewogCXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBob3N0X3RvX2RzaShob3N0KTsKLQlzdHJ1 Y3QgZHJtX2RldmljZSAqZHJtID0gZHNpLT5lbmNvZGVyLmRldjsKLQotCWlmIChkcm0tPm1vZGVf Y29uZmlnLnBvbGxfZW5hYmxlZCkKLQkJZHJtX2ttc19oZWxwZXJfaG90cGx1Z19ldmVudChkcm0p OworCWNvbnN0IHN0cnVjdCBleHlub3NfZHNpX3BsYXRfZGF0YSAqcGRhdGEgPSBkc2ktPnBsYXRf ZGF0YTsKKwlpbnQgcmV0OwogCi0JZXh5bm9zX2RzaV91bnJlZ2lzdGVyX3RlX2lycShkc2kpOwor CWlmIChwZGF0YS0+aG9zdF9vcHMgJiYgcGRhdGEtPmhvc3Rfb3BzLT5kZXRhY2gpIHsKKwkJcmV0 ID0gcGRhdGEtPmhvc3Rfb3BzLT5kZXRhY2goZHNpLCBkZXZpY2UpOworCQlpZiAocmV0IDwgMCkK KwkJCXJldHVybiByZXQ7CisJfQogCiAJZHJtX2JyaWRnZV9yZW1vdmUoJmRzaS0+YnJpZGdlKTsK IApAQCAtMTcyOSwxMCArMTcyNiw2NiBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfcGFyc2VfZHQo c3RydWN0IGV4eW5vc19kc2kgKmRzaSkKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfZXh5 bm9zX2RzaV9ob3N0X2F0dGFjaChzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpbSwKKwkJCQkgICBzdHJ1 Y3QgbWlwaV9kc2lfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGV4eW5vc19kc2lfZW5jICpk c2kgPSBkc2ltLT5wcml2OworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciA9ICZkc2ktPmVu Y29kZXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGVuY29kZXItPmRldjsKKwlpbnQgcmV0 OworCisJZHJtX2JyaWRnZV9hdHRhY2goZW5jb2RlciwgJmRzaW0tPmJyaWRnZSwKKwkJCSAgbGlz dF9maXJzdF9lbnRyeV9vcl9udWxsKCZlbmNvZGVyLT5icmlkZ2VfY2hhaW4sCisJCQkJCQkgICBz dHJ1Y3QgZHJtX2JyaWRnZSwKKwkJCQkJCSAgIGNoYWluX25vZGUpLCAwKTsKKworCS8qCisJICog VGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiBhbmQgc2hvdWxkIGJlIG1hZGUgYnkgbW9yZSBn ZW5lcmljIHdheS4KKwkgKgorCSAqIElmIGF0dGFjaGVkIHBhbmVsIGRldmljZSBpcyBmb3IgY29t bWFuZCBtb2RlIG9uZSwgZHNpIHNob3VsZCByZWdpc3RlcgorCSAqIFRFIGludGVycnVwdCBoYW5k bGVyLgorCSAqLworCWlmICghKGRldmljZS0+bW9kZV9mbGFncyAmIE1JUElfRFNJX01PREVfVklE RU8pKSB7CisJCXJldCA9IGV4eW5vc19kc2lfcmVnaXN0ZXJfdGVfaXJxKGRzaW0sICZkZXZpY2Ut PmRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X2xvY2soJmRy bS0+bW9kZV9jb25maWcubXV0ZXgpOworCisJZHNpbS0+bGFuZXMgPSBkZXZpY2UtPmxhbmVzOwor CWRzaW0tPmZvcm1hdCA9IGRldmljZS0+Zm9ybWF0OworCWRzaW0tPm1vZGVfZmxhZ3MgPSBkZXZp Y2UtPm1vZGVfZmxhZ3M7CisJZXh5bm9zX2RybV9jcnRjX2dldF9ieV90eXBlKGRybSwgRVhZTk9T X0RJU1BMQVlfVFlQRV9MQ0QpLT5pODBfbW9kZSA9CisJCQkhKGRzaW0tPm1vZGVfZmxhZ3MgJiBN SVBJX0RTSV9NT0RFX1ZJREVPKTsKKworCW11dGV4X3VubG9jaygmZHJtLT5tb2RlX2NvbmZpZy5t dXRleCk7CisKKwlpZiAoZHJtLT5tb2RlX2NvbmZpZy5wb2xsX2VuYWJsZWQpCisJCWRybV9rbXNf aGVscGVyX2hvdHBsdWdfZXZlbnQoZHJtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IF9leHlub3NfZHNpX2hvc3RfZGV0YWNoKHN0cnVjdCBleHlub3NfZHNpICpkc2ltLAorCQkJCSAg IHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgZXh5bm9zX2RzaV9l bmMgKmRzaSA9IGRzaW0tPnByaXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRzaS0+ZW5j b2Rlci5kZXY7CisKKwlpZiAoZHJtLT5tb2RlX2NvbmZpZy5wb2xsX2VuYWJsZWQpCisJCWRybV9r bXNfaGVscGVyX2hvdHBsdWdfZXZlbnQoZHJtKTsKKworCWV4eW5vc19kc2lfdW5yZWdpc3Rlcl90 ZV9pcnEoZHNpbSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBleHlub3NfZHNpX2Jp bmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCiAJCQkJdm9pZCAq ZGF0YSkKIHsKLQlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7 CisJc3RydWN0IGV4eW5vc19kc2kgKmRzaW0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1 Y3QgZXh5bm9zX2RzaV9lbmMgKmRzaSA9IGRzaW0tPnByaXY7CiAJc3RydWN0IGRybV9lbmNvZGVy ICplbmNvZGVyID0gJmRzaS0+ZW5jb2RlcjsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9 IGRhdGE7CiAJaW50IHJldDsKQEAgLTE3NDMsMTcgKzE3OTYsMTcgQEAgc3RhdGljIGludCBleHlu b3NfZHNpX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCiAJ aWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gbWlwaV9kc2lfaG9zdF9yZWdp c3RlcigmZHNpLT5kc2lfaG9zdCk7CisJcmV0dXJuIG1pcGlfZHNpX2hvc3RfcmVnaXN0ZXIoJmRz aW0tPmRzaV9ob3N0KTsKIH0KIAogc3RhdGljIHZvaWQgZXh5bm9zX2RzaV91bmJpbmQoc3RydWN0 IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCiAJCQkJdm9pZCAqZGF0YSkKIHsK LQlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0 IGV4eW5vc19kc2kgKmRzaW0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWV4eW5vc19kc2lf YXRvbWljX2Rpc2FibGUoJmRzaS0+YnJpZGdlLCBOVUxMKTsKKwlkc2ltLT5icmlkZ2UuZnVuY3Mt PmF0b21pY19kaXNhYmxlKCZkc2ltLT5icmlkZ2UsIE5VTEwpOwogCi0JbWlwaV9kc2lfaG9zdF91 bnJlZ2lzdGVyKCZkc2ktPmRzaV9ob3N0KTsKKwltaXBpX2RzaV9ob3N0X3VucmVnaXN0ZXIoJmRz aW0tPmRzaV9ob3N0KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGV4 eW5vc19kc2lfY29tcG9uZW50X29wcyA9IHsKQEAgLTE3NjEsNiArMTgxNCw0MCBAQCBzdGF0aWMg Y29uc3Qgc3RydWN0IGNvbXBvbmVudF9vcHMgZXh5bm9zX2RzaV9jb21wb25lbnRfb3BzID0gewog CS51bmJpbmQJPSBleHlub3NfZHNpX3VuYmluZCwKIH07CiAKK3N0YXRpYyBpbnQgZXh5bm9zX2Rz aV9yZWdpc3Rlcl9ob3N0KHN0cnVjdCBleHlub3NfZHNpICpkc2ltKQoreworCXN0cnVjdCBleHlu b3NfZHNpX2VuYyAqZHNpOworCisJZHNpID0gZGV2bV9remFsbG9jKGRzaW0tPmRldiwgc2l6ZW9m KCpkc2kpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRzaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlk c2ltLT5wcml2ID0gZHNpOworCWRzaW0tPmJyaWRnZS5wcmVfZW5hYmxlX3ByZXZfZmlyc3QgPSB0 cnVlOworCisJcmV0dXJuIGNvbXBvbmVudF9hZGQoZHNpbS0+ZGV2LCAmZXh5bm9zX2RzaV9jb21w b25lbnRfb3BzKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2RzaV91bnJlZ2lzdGVyX2hvc3Qo c3RydWN0IGV4eW5vc19kc2kgKmRzaW0pCit7CisJY29tcG9uZW50X2RlbChkc2ltLT5kZXYsICZl eHlub3NfZHNpX2NvbXBvbmVudF9vcHMpOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfZHNpbV9y ZWdpc3Rlcl9ob3N0KHN0cnVjdCBleHlub3NfZHNpICpkc2ltKQoreworCXJldHVybiBtaXBpX2Rz aV9ob3N0X3JlZ2lzdGVyKCZkc2ltLT5kc2lfaG9zdCk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVy aWNfZHNpbV91bnJlZ2lzdGVyX2hvc3Qoc3RydWN0IGV4eW5vc19kc2kgKmRzaW0pCit7CisJbWlw aV9kc2lfaG9zdF91bnJlZ2lzdGVyKCZkc2ltLT5kc2lfaG9zdCk7Cit9CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgZXh5bm9zX2RzaW1faG9zdF9vcHMgZ2VuZXJpY19kc2ltX2hvc3Rfb3BzID0gewor CS5yZWdpc3Rlcl9ob3N0ID0gZ2VuZXJpY19kc2ltX3JlZ2lzdGVyX2hvc3QsCisJLnVucmVnaXN0 ZXJfaG9zdCA9IGdlbmVyaWNfZHNpbV91bnJlZ2lzdGVyX2hvc3QsCit9OworCiBzdGF0aWMgY29u c3Qgc3RydWN0IGRybV9icmlkZ2VfdGltaW5ncyBkc2ltX2JyaWRnZV90aW1pbmdzX2RlX2xvdyA9 IHsKIAkuaW5wdXRfYnVzX2ZsYWdzID0gRFJNX0JVU19GTEFHX0RFX0xPVywKIH07CkBAIC0xODU1 LDcgKzE5NDIsOSBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfcHJvYmUoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikKIAlpZiAoZHNpLT5wbGF0X2RhdGEtPmh3X3R5cGUgPT0gRFNJTV9UWVBF X0lNWDhNTSkKIAkJZHNpLT5icmlkZ2UudGltaW5ncyA9ICZkc2ltX2JyaWRnZV90aW1pbmdzX2Rl X2xvdzsKIAotCXJldCA9IGNvbXBvbmVudF9hZGQoZGV2LCAmZXh5bm9zX2RzaV9jb21wb25lbnRf b3BzKTsKKwlpZiAoZHNpLT5wbGF0X2RhdGEtPmhvc3Rfb3BzICYmIGRzaS0+cGxhdF9kYXRhLT5o b3N0X29wcy0+cmVnaXN0ZXJfaG9zdCkKKwkJcmV0ID0gZHNpLT5wbGF0X2RhdGEtPmhvc3Rfb3Bz LT5yZWdpc3Rlcl9ob3N0KGRzaSk7CisKIAlpZiAocmV0KQogCQlnb3RvIGVycl9kaXNhYmxlX3J1 bnRpbWU7CiAKQEAgLTE5NDYsMjQgKzIwMzUsMzYgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZf cG1fb3BzIGV4eW5vc19kc2lfcG1fb3BzID0gewogCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1l KQogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3NfZHNpbV9ob3N0X29wcyBleHlub3Nf ZHNpX2hvc3Rfb3BzID0geworCS5yZWdpc3Rlcl9ob3N0ID0gZXh5bm9zX2RzaV9yZWdpc3Rlcl9o b3N0LAorCS51bnJlZ2lzdGVyX2hvc3QgPSBleHlub3NfZHNpX3VucmVnaXN0ZXJfaG9zdCwKKwku YXR0YWNoID0gX2V4eW5vc19kc2lfaG9zdF9hdHRhY2gsCisJLmRldGFjaCA9IF9leHlub3NfZHNp X2hvc3RfZGV0YWNoLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3NfZHNpX3BsYXRf ZGF0YSBleHlub3MzMjUwX2RzaV9wZGF0YSA9IHsKIAkuaHdfdHlwZSA9IERTSU1fVFlQRV9FWFlO T1MzMjUwLAorCS5ob3N0X29wcyA9ICZleHlub3NfZHNpX2hvc3Rfb3BzLAogfTsKIAogc3RhdGlj IGNvbnN0IHN0cnVjdCBleHlub3NfZHNpX3BsYXRfZGF0YSBleHlub3M0MjEwX2RzaV9wZGF0YSA9 IHsKIAkuaHdfdHlwZSA9IERTSU1fVFlQRV9FWFlOT1M0MjEwLAorCS5ob3N0X29wcyA9ICZleHlu b3NfZHNpX2hvc3Rfb3BzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3NfZHNpX3Bs YXRfZGF0YSBleHlub3M1NDEwX2RzaV9wZGF0YSA9IHsKIAkuaHdfdHlwZSA9IERTSU1fVFlQRV9F WFlOT1M1NDEwLAorCS5ob3N0X29wcyA9ICZleHlub3NfZHNpX2hvc3Rfb3BzLAogfTsKIAogc3Rh dGljIGNvbnN0IHN0cnVjdCBleHlub3NfZHNpX3BsYXRfZGF0YSBleHlub3M1NDIyX2RzaV9wZGF0 YSA9IHsKIAkuaHdfdHlwZSA9IERTSU1fVFlQRV9FWFlOT1M1NDIyLAorCS5ob3N0X29wcyA9ICZl eHlub3NfZHNpX2hvc3Rfb3BzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3NfZHNp X3BsYXRfZGF0YSBleHlub3M1NDMzX2RzaV9wZGF0YSA9IHsKIAkuaHdfdHlwZSA9IERTSU1fVFlQ RV9FWFlOT1M1NDMzLAorCS5ob3N0X29wcyA9ICZleHlub3NfZHNpX2hvc3Rfb3BzLAogfTsKIAog c3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZXh5bm9zX2RzaV9vZl9tYXRjaFtdID0g ewotLSAKMi4yNS4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtYXJtLWtlcm5lbAo=