From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="W7pl2zU3" Received: from mail-qv1-xf2a.google.com (mail-qv1-xf2a.google.com [IPv6:2607:f8b0:4864:20::f2a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 24C4510F9 for ; Fri, 8 Dec 2023 03:35:20 -0800 (PST) Received: by mail-qv1-xf2a.google.com with SMTP id 6a1803df08f44-67a9be1407aso11155086d6.0 for ; Fri, 08 Dec 2023 03:35:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1702035319; x=1702640119; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=zUV2gymsVRTUXmEES1qoIcu+UrHpB6U3bjKRN5uPogc=; b=W7pl2zU3uQGpW48sHXvMb8Ff7HNSdn4M2ypFwdnZVlTeGPdPxh53msLsZegf2nkrBx wPyN2tJRQWEGqZ/+E82C4deeC7O025AaRnrjKBdgNtQ1P4XWUiktMVvG0swQV1qJDNBC m8Qdv688qh1ZjcDOaYxzgeCEULzJHjiZZnrWjUfH95II+8OC6PLX+i1povMVt/nd8laW wAkbQagR6c0Pp2fgbk52rhdiKnXndfcYXQ5BsXRpoNd3+HE+Zzm5lH7nUeVFq6Bllhhp Mh0qpddpxSgwT2BUrR4F6W+NAfBW38adke/RmOntI7EngaQT1Vy7JyZhuqXOxDAOP26/ QuyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702035319; x=1702640119; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zUV2gymsVRTUXmEES1qoIcu+UrHpB6U3bjKRN5uPogc=; b=UWolrn/KZIUSm+/kWCIjkaV1WnLzBxoQr6E0V8Gw0x6uj6+TzWblyazdkyHiXgbTBc 8NYMlB+RnXUagPeK5q3YkJyEyb5E8l2pbxYpeODccqaxLttgmINBNGjH3BnR7Fzv6rJT +hyWUBH10mELGRYaJIaYLvfy6AwnGkdoE2OQGfFRFZ73FJ0sB+NGaUYgsunZJRVuX1Xh h40y4Wn0Nc92yF1GF11vCkBbqT89EbG5kPUPu7Bl/vxk9SE9z9oYUyLotuFqrhT8PMpN dBCPB/RreZ2QT6n76XzF9YwbtZb2bb9ix6wuDszwGqKF6TJMwdAlj8K4UEZ3BfvOKoKD lbsQ== X-Gm-Message-State: AOJu0Yxu2Tie6cdHERjlSzN7EWp2OcM6tvDwlKdDZraKh6VHzI2V7+f7 jCMQuc34XnHMZxn6wwVtdXxs3rWYw0OtR9Iuz6St6w== X-Google-Smtp-Source: AGHT+IEC6JdZ6U/gEesI+E7ZbvlG7lTwKLLiNtgy400dLC/RZUM/6b3j6Xea2JLJw6/USyS+V81pzcCJ0cSbyQMs0hA= X-Received: by 2002:a05:6214:32c:b0:67a:a721:cae3 with SMTP id j12-20020a056214032c00b0067aa721cae3mr4135955qvu.68.1702035318988; Fri, 08 Dec 2023 03:35:18 -0800 (PST) Precedence: bulk X-Mailing-List: linux-gpio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20231201160925.3136868-1-peter.griffin@linaro.org> <20231201160925.3136868-13-peter.griffin@linaro.org> In-Reply-To: From: Peter Griffin Date: Fri, 8 Dec 2023 11:35:07 +0000 Message-ID: Subject: Re: [PATCH v5 12/20] clk: samsung: clk-gs101: Add cmu_top, cmu_misc and cmu_apm support To: Sam Protsenko Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, mturquette@baylibre.com, conor+dt@kernel.org, sboyd@kernel.org, tomasz.figa@gmail.com, s.nawrocki@samsung.com, linus.walleij@linaro.org, wim@linux-watchdog.org, linux@roeck-us.net, catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de, olof@lixom.net, gregkh@linuxfoundation.org, jirislaby@kernel.org, cw00.choi@samsung.com, alim.akhtar@samsung.com, tudor.ambarus@linaro.org, andre.draszik@linaro.org, saravanak@google.com, willmcvicker@google.com, soc@kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-clk@vger.kernel.org, linux-gpio@vger.kernel.org, linux-watchdog@vger.kernel.org, kernel-team@android.com, linux-serial@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Sam, Thanks for your review. I've trimmed the non relevant parts of the email a bit at Krzysztofs request. On Fri, 1 Dec 2023 at 22:40, Sam Protsenko wro= te: > > On Fri, Dec 1, 2023 at 10:11=E2=80=AFAM Peter Griffin wrote: > > > > cmu_top is the top level clock management unit which contains PLLs, mux= es, > > dividers and gates that feed the other clock management units. > > > > cmu_misc clocks IPs such as Watchdog and cmu_apm clocks ips part of the > > APM module. > > > > Acked-by: Chanwoo Choi > > Tested-by: Will McVicker > > Signed-off-by: Peter Griffin > > --- > > drivers/clk/samsung/Makefile | 1 + > > drivers/clk/samsung/clk-gs101.c | 2495 +++++++++++++++++++++++++++++++ > > 2 files changed, 2496 insertions(+) > > create mode 100644 drivers/clk/samsung/clk-gs101.c > > > > diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefil= e > > index ebbeacabe88f..3056944a5a54 100644 > > --- a/drivers/clk/samsung/Makefile > > +++ b/drivers/clk/samsung/Makefile > > @@ -21,6 +21,7 @@ obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) +=3D clk-exynos= 7.o > > obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) +=3D clk-exynos7885.o > > obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) +=3D clk-exynos850.o > > obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) +=3D clk-exynosautov9.o > > +obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) +=3D clk-gs101.o > > obj-$(CONFIG_S3C64XX_COMMON_CLK) +=3D clk-s3c64xx.o > > obj-$(CONFIG_S5PV210_COMMON_CLK) +=3D clk-s5pv210.o clk-s5pv210-= audss.o > > obj-$(CONFIG_TESLA_FSD_COMMON_CLK) +=3D clk-fsd.o > > diff --git a/drivers/clk/samsung/clk-gs101.c b/drivers/clk/samsung/clk-= gs101.c > > new file mode 100644 > > index 000000000000..6bd233a7ab63 > > --- /dev/null > > +++ b/drivers/clk/samsung/clk-gs101.c > > @@ -0,0 +1,2495 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright (C) 2023 Linaro Ltd. > > + * Author: Peter Griffin > > + * > > + * Common Clock Framework support for GS101. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include > > + > > +#include "clk.h" > > +#include "clk-exynos-arm64.h" > > + > > +/* NOTE: Must be equal to the last clock ID increased by one */ > > +#define TOP_NR_CLK (CLK_GOUT_TPU_UART + 1) > > +#define APM_NR_CLK (CLK_APM_PLL_DIV16_APM + 1) > > +#define MISC_NR_CLK (CLK_GOUT_MISC_XIU_D_MISC_IPCLKPORT_ACLK + 1) > > + > > Suggest using CLKS_NR_* naming, to follow other drivers for consistency. Will fix > > > +/* ---- CMU_TOP ------------------------------------------------------= ------- */ > > + > > +/* Register Offset definitions for CMU_TOP (0x1e080000) */ > > + > > +#define PLL_LOCKTIME_PLL_SHARED0 0x0000 > > +#define PLL_LOCKTIME_PLL_SHARED1 0x0004 > > +#define PLL_LOCKTIME_PLL_SHARED2 0x0008 > > +#define PLL_LOCKTIME_PLL_SHARED3 0x000c > > + DIV(CLK_DOUT_MFC_MFC, "dout_cmu_mfc_mfc", "gout_cmu_mfc_mfc", > > + CLK_CON_DIV_CLKCMU_MFC_MFC, 0, 4), > > + DIV(CLK_DOUT_MIF_BUSP, "dout_cmu_mif_busp", "gout_cmu_mif_busp"= , > > + CLK_CON_DIV_CLKCMU_MIF_BUSP, 0, 4), > > + DIV(CLK_DOUT_MISC_BUS, "dout_cmu_misc_bus", "gout_cmu_misc_bus"= , > > + CLK_CON_DIV_CLKCMU_MISC_BUS, 0, 4), > > + DIV(CLK_DOUT_MISC_SSS, "dout_cmu_misc_sss", "gout_cmu_misc_sss"= , > > + CLK_CON_DIV_CLKCMU_MISC_SSS, 0, 4), > > + /* CLK_CON_DIV_CLKCMU_OTP lower bits reserved*/ > > Why the above clock where bits are reserved is declared, but this one > is not? Also, above comment is marked as TODO, but this one is not. > And there is no space before */. Good spot! These two dividers with reserved lower bits should be fixed factor clocks. I've fixed in v6. > > > + DIV(CLK_DOUT_PDP_BUS, "dout_cmu_pdp_bus", "gout_cmu_pdp_bus", > > + CLK_CON_DIV_CLKCMU_PDP_BUS, 0, 4), > > + DIV(CLK_DOUT_PDP_VRA, "dout_cmu_pdp_vra", "gout_cmu_pdp_vra", > > + CLK_CON_DIV_CLKCMU_PDP_VRA, 0, 4), > > + DIV(CLK_DOUT_PERIC0_BUS, "dout_cmu_peric0_bus", "gout_cmu_peric= 0_bus", > > + CLK_CON_DIV_CLKCMU_PERIC0_BUS, 0, 4), > > + DIV(CLK_DOUT_SHARED1_DIV2, "dout_shared1_div2", "mout_shared1_p= ll", > > + CLK_CON_DIV_PLL_SHARED1_DIV2, 0, 1), > > + DIV(CLK_DOUT_SHARED1_DIV3, "dout_shared1_div3", "mout_shared1_p= ll", > > + CLK_CON_DIV_PLL_SHARED1_DIV3, 0, 2), > > + DIV(CLK_DOUT_SHARED1_DIV4, "dout_shared1_div4", "mout_shared1_p= ll", > > + CLK_CON_DIV_PLL_SHARED1_DIV4, 0, 1), > > + DIV(CLK_DOUT_SHARED2_DIV2, "dout_shared2_div2", "mout_shared2_p= ll", > > + CLK_CON_DIV_PLL_SHARED2_DIV2, 0, 1), > > + DIV(CLK_DOUT_SHARED3_DIV2, "dout_shared3_div2", "mout_shared3_p= ll", > > + CLK_CON_DIV_PLL_SHARED3_DIV2, 0, 1), > > +}; > > + > > +static const struct samsung_gate_clock cmu_top_gate_clks[] __initconst= =3D { > > + GATE(CLK_GOUT_BUS0_BOOST, "gout_cmu_bus0_boost", "mout_cmu_boos= t_option1", > > Please stick to 80 characters length, here and below. Will fix. > > > + CLK_CON_GAT_CLKCMU_BUS0_BOOST, 21, 0, 0), > > + GATE(CLK_GOUT_BUS1_BOOST, "gout_cmu_bus1_boost", "mout_cmu_boos= t_option1", > > + CLK_CON_GAT_CLKCMU_BUS1_BOOST, 21, 0, 0), > > + GATE(CLK_GOUT_BUS2_BOOST, "gout_cmu_bus2_boost", "mout_cmu_boos= t_option1", > > + CLK_CON_GAT_CLKCMU_BUS2_BOOST, 21, 0, 0), > > + GATE(CLK_GOUT_CORE_BOOST, "gout_cmu_core_boost", "mout_cmu_boos= t_option1", > > + CLK_CON_GAT_CLKCMU_CORE_BOOST, 21, 0, 0), > > +static void __init gs101_cmu_top_init(struct device_node *np) > > +{ > > + exynos_arm64_register_cmu(NULL, np, &top_cmu_info); > > +} > > + > > +/* Register CMU_TOP early, as it's a dependency for other early domain= s */ > > +CLK_OF_DECLARE(gs101_cmu_top, "google,gs101-cmu-top", > > + gs101_cmu_top_init); > > + > > +/* ---- CMU_APM ------------------------------------------------------= ------- */ > > Suggest adding an empty line here. Will fix > > > +/* Register Offset definitions for CMU_APM (0x17400000) */ > > +#define APM_CMU_APM_CONTROLLER_OPTION = 0x0800 > > +#define CLKOUT_CON_BLK_APM_CMU_APM_CLKOUT0 = 0x0810 > > +#define CLK_CON_MUX_MUX_CLKCMU_APM_FUNC = 0x1000 > > +#define CLK_CON_MUX_MUX_CLKCMU_APM_FUNCSRC = 0x1004 > > +#define CLK_CON_DIV_DIV_CLK_APM_BOOST = 0x1800 > > +#define CLK_CON_DIV_DIV_CLK_APM_USI0_UART = 0x1804 > > +#define CLK_CON_DIV_DIV_CLK_APM_USI0_USI = 0x1808 > > +#define CLK_CON_DIV_DIV_CLK_APM_USI1_UART = 0x180c > > +#define CLK_CON_GAT_CLK_BLK_APM_UID_APM_CMU_APM_IPCLKPORT_PCLK = 0x2000 > > +#define CLK_CON_GAT_CLK_BUS0_BOOST_OPTION1 = 0x2004 > > +#define CLK_CON_GAT_CLK_CMU_BOOST_OPTION1 = 0x2008 > > +#define CLK_CON_GAT_CLK_CORE_BOOST_OPTION1 = 0x200c > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SPEEDY_APM_IPCLKPORT_PCLK = 0x20a8 > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SPEEDY_SUB_APM_IPCLKPORT_PCLK = 0x20ac > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SSMT_D_APM_IPCLKPORT_ACLK = 0x20b0 > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SSMT_D_APM_IPCLKPORT_PCLK = 0x20b4 > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SSMT_G_DBGCORE_IPCLKPORT_ACLK = 0x20b8 > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SSMT_G_DBGCORE_IPCLKPORT_PCLK = 0x20bc > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SS_DBGCORE_IPCLKPORT_SS_DBGCORE_I= PCLKPORT_HCLK 0x20c0 > > As I understand, all those parts like IPCLKPORT, BLK, UID (RSTNSYNC > probably too) -- they don't really mean anything in the context of the > driver, just noise. And if you remove those -- there won't be any > conflicts with other names, because those bits are not the unique > parts. Following the TRM letter for letter in this case just makes > things extremely long without adding any value IMHO. For example, that > name above might be: > > CLK_CON_GAT_GOUT_APM_SS_DBGCORE_SS_DBGCORE_HCLK > > or even > > CLK_CON_GAT_GOUT_APM_SS_DBGCORE_HCLK > > would be fine. > > In clk-exynos850 driver I removed all those parts, because they make > it pretty much impossible to read both the driver and dts. And yeah, > because those names consequenty lead to very long string names, dts > will be hard to read too, which is even worse. But again, that's only > my IMHO. I would like to keep the register names unmodified, as I mentioned previously mangling them makes checking with the datasheet much harder. As the name in the header and string are already mangled a bit I'm OK with mangling that a bit more. With that in mind I've done the following mangling in v6: - Register name: CLK_CON_GAT_GOUT_BLK_APM_UID_APBIF_GPIO_ALIVE_IPCLKPORT_PCLK Replace `CLK_CON_GAT_GOUT_BLK__UID_` with `CLK_GOUT__= ` Replace ` _IPCLKPORT` with nothing Replace `_RSTNSYNC` with nothing So you end up with: GATE(CLK_GOUT_APM_APBIF_GPIO_ALIVE_PCLK, "gout_apm_apbif_gpio_alive_pclk", "gout_apm_func", CLK_CON_GAT_GOUT_BLK_APM_UID_APBIF_GPIO_ALIVE_IPCLKPORT_PCLK, 21, 0, 0), That still enables cross referencing with the datasheet via the unmodified register name, but the dt binding define and string are slightly shorter like you wanted. The mangling described above the vast majority of clock names look fine. There are a couple of anomalies though like `CLK_GOUT_MISC_MISC_CMU_MISC_PCLK` and `CLK_GOUT_APM_APM_CMU_APM_PCLK`. I think it is a *really* bad idea to do custom mangling on these specific names though. > > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SYSMMU_D_APM_IPCLKPORT_CLK_S2 = 0x20c4 > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_SYSREG_APM_IPCLKPORT_PCLK = 0x20cc > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_UASC_APM_IPCLKPORT_ACLK = 0x20d0 > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_UASC_APM_IPCLKPORT_PCLK = 0x20d4 > > +#define CLK_CON_GAT_GOUT_BLK_APM_UID_UASC_DBGCORE_IPCLKPORT_ACLK = 0x20d8 > > + GATE(CLK_GOUT_APM_APBIF_RTC_IPCLKPORT_PCLK, > > + "gout_apm_apbif_rtc_ipclkport_pclk", "gout_apm_func", > > + CLK_CON_GAT_GOUT_BLK_APM_UID_APBIF_RTC_IPCLKPORT_PCLK, 21,= 0, 0), > > + GATE(CLK_GOUT_APM_APBIF_TRTC_IPCLKPORT_PCLK, > > + "gout_apm_apbif_trtc_ipclkport_pclk", "gout_apm_func", > > + CLK_CON_GAT_GOUT_BLK_APM_UID_APBIF_TRTC_IPCLKPORT_PCLK, 21= , 0, 0), > > + GATE(CLK_GOUT_APM_APM_USI0_UART_IPCLKPORT_PCLK, > > + "gout_apm_apm_usi0_uart_ipclkport_pclk", "gout_apm_func", > > + CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI0_UART_IPCLKPORT_PCLK, > > + 21, 0, 0), > > + GATE(CLK_GOUT_APM_APM_USI0_USI_IPCLKPORT_IPCLK, > > + "gout_apm_apm_usi0_usi_ipclkport_ipclk", "dout_apm_usi0_ua= rt", > > + CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI0_USI_IPCLKPORT_PCLK, > > PCLK vs IPCLK? Will fix. The order here should match the register offsets CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI0_UART_IPCLKPORT_IPCLK, CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI0_UART_IPCLKPORT_PCLK, CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI0_USI_IPCLKPORT_IPCLK, CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI0_USI_IPCLKPORT_PCLK, CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI1_UART_IPCLKPORT_IPCLK, CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI1_UART_IPCLKPORT_PCLK, > > > + 21, 0, 0), > > + GATE(CLK_GOUT_APM_APM_USI0_USI_IPCLKPORT_PCLK, > > + "gout_apm_apm_usi0_usi_ipclkport_pclk", "gout_apm_func", > > + CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI1_UART_IPCLKPORT_PCLK,= 21, 0, 0), > > Should it be USI0 instead of USI1? It's the same as the definition > below. Also, please stick to 80 characters per line, here and below. I've revisited the 6 clock gates described above to ensure they are in register offset order. > > > + GATE(CLK_GOUT_APM_APM_USI1_UART_IPCLKPORT_IPCLK, > > + "gout_apm_apm_usi1_uart_ipclkport_ipclk", "dout_apm_usi1_u= art", > > + CLK_CON_GAT_GOUT_BLK_APM_UID_APM_USI1_UART_IPCLKPORT_IPCLK= , 21, 0, 0), > > + GATE(CLK_GOUT_APM_APM_USI1_UART_IPCLKPORT_PCLK, > > + "gout_apm_apm_usi1_uart_ipclkport_pclk", "gout_apm_func", > > +static const struct samsung_cmu_info apm_cmu_info __initconst =3D { > > + .mux_clks =3D apm_mux_clks, > > + .nr_mux_clks =3D ARRAY_SIZE(apm_mux_clks), > > + .div_clks =3D apm_div_clks, > > + .nr_div_clks =3D ARRAY_SIZE(apm_div_clks), > > + .gate_clks =3D apm_gate_clks, > > + .nr_gate_clks =3D ARRAY_SIZE(apm_gate_clks), > > + .fixed_clks =3D apm_fixed_clks, > > + .nr_fixed_clks =3D ARRAY_SIZE(apm_fixed_clks), > > + .nr_clk_ids =3D APM_NR_CLK, > > + .clk_regs =3D apm_clk_regs, > > + .nr_clk_regs =3D ARRAY_SIZE(apm_clk_regs), > > +}; > > + > > +/* ---- CMU_MISC -----------------------------------------------------= -------- */ > > Suggest adding an empty line here. Will fix > > > +/* Register Offset definitions for CMU_MISC (0x10010000) */ > > +#define PLL_CON0_MUX_CLKCMU_MISC_BUS_USER 0x0600 > > +#define PLL_CON1_MUX_CLKCMU_MISC_BUS_USER 0x0604 > > +#define PLL_CON0_MUX_CLKCMU_MISC_SSS_USER 0x0610 > > +#define PLL_CON1_MUX_CLKCMU_MISC_SSS_USER 0x0614 > > +#define MISC_CMU_MISC_CONTROLLER_OPTION 0x0800 > > +#define CLKOUT_CON_BLK_MISC_CMU_MISC_CLKOUT0 0x0810 > > +#define CLK_CON_MUX_MUX_CLK_MISC_GIC 0x1000 > > +#define CLK_CON_DIV_DIV_CLK_MISC_BUSP 0x1800 > > +#define CLK_CON_DIV_DIV_CLK_MISC_GIC 0x1804 > > Please align all values for this group at the same indentation level. Will fix > > > +#define CLK_CON_GAT_CLK_BLK_MISC_UID_MISC_CMU_MISC_IPCLKPORT_PCLK = 0x2000 > > +#define CLK_CON_GAT_CLK_BLK_MISC_UID_OTP_CON_BIRA_IPCLKPORT_I_OSCCLK = 0x2004 > > +#define CLK_CON_GAT_CLK_BLK_MISC_UID_OTP_CON_BISR_IPCLKPORT_I_OSCCLK = 0x2008 > > +#define CLK_CON_GAT_CLK_BLK_MISC_UID_OTP_CON_TOP_IPCLKPORT_I_OSCCLK = 0x200c > > +#define CLK_CON_GAT_CLK_BLK_MISC_UID_RSTNSYNC_CLK_MISC_OSCCLK_IPCLKPOR= T_CLK 0x2010 > > Just want to give you one more example for my rant above. Look how > much easier it is to understand this name (than above one): > > CLK_CON_GAT_MISC_OSCCLK_CLK > > Which also turns this (public API!): > > "gout_misc_rstnsync_clk_misc_oscclk_ipclkport_clk" > > into this: > > "gout_misc_oscclk_clk" In v6 this becomes GATE(CLK_GOUT_MISC_CLK_MISC_OSCCLK_CLK, "gout_misc_clk_misc_oscclk_clk", "dout_misc_busp", CLK_CON_GAT_CLK_BLK_MISC_UID_RSTNSYNC_CLK_MISC_OSCCLK_IPCLKPORT_CLK, 21, 0, 0), > > > +#define CLK_CON_GAT_GOUT_BLK_MISC_UID_ADM_AHB_SSS_IPCLKPORT_HCLKM = 0x2014 > > +#define CLK_CON_GAT_GOUT_BLK_MISC_UID_AD_APB_DIT_IPCLKPORT_PCLKM = 0x2018 > > +#define CLK_CON_GAT_GOUT_BLK_MISC_UID_AD_APB_PUF_IPCLKPORT_PCLKM = 0x201c > > +#define CLK_CON_GAT_GOUT_BLK_MISC_UID_DIT_IPCLKPORT_ICLKL2A = 0x2020 > > +#define CLK_CON_GAT_GOUT_BLK_MISC_UID_D_TZPC_MISC_IPCLKPORT_PCLK = 0x2024 > > +#define CLK_CON_GAT_GOUT_BLK_MISC_UID_GIC_IPCLKPORT_GICCLK = 0x2028 > > +#define CLK_CON_GAT_GOUT_BLK_MISC_UID_GPC_MISC_IPCLKPORT_PCLK = 0x202c > > +static const struct samsung_div_clock misc_div_clks[] __initconst =3D = { > > + DIV(CLK_DOUT_MISC_BUSP, "dout_misc_busp", "mout_misc_bus_user", > > + CLK_CON_DIV_DIV_CLK_MISC_BUSP, 0, 3), > > + DIV(CLK_DOUT_MISC_GIC, "dout_misc_gic", "mout_misc_bus_user", > > + CLK_CON_DIV_DIV_CLK_MISC_GIC, 0, 3), > > +}; > > + > > +static const struct samsung_gate_clock misc_gate_clks[] __initconst = =3D { > > + GATE(CLK_GOUT_MISC_MISC_CMU_MISC_IPCLKPORT_PCLK, > > + "gout_misc_ipclkport_pclk", "dout_misc_busp", > > So if you want to be consistent, it should be > "gout_misc_misc_misc_....". My point is -- Samsung's naming in TRM is > insane. They wanted to stick to some very detailed and unified naming > schema (or just generated those names from some internal clock tree > data), granted. But I'm just not sure if it's the best idea to follow > it in driver's code. With the naming described above it becomes "gout_misc_misc_cmu_misc_pclk". Not ideal, and this is one of the clocks I mentioned above. The overwhelming majority of the clock names don't have such repetition in their name though. If we start doing custom mangling on specific clocks it is going to become a nightmare to track. As I mentioned previously there are thousands of clocks in the SoC. Most upstream platforms only seem to implement a small subset of clocks in each CMU which maybe makes it easier to track. Our goal though is to have full functionality upstream. > > > + CLK_CON_GAT_CLK_BLK_MISC_UID_MISC_CMU_MISC_IPCLKPORT_PCLK, > > + 21, 0, 0), > > + GATE(CLK_GOUT_MISC_OTP_CON_BIRA_IPCLKPORT_I_OSCCLK, > > + "gout_misc_otp_con_bira_ipclkport_i_oscclk", "dout_misc_bu= sp", > > + CLK_CON_GAT_CLK_BLK_MISC_UID_OTP_CON_BIRA_IPCLKPORT_I_OSCC= LK, > > + 21, 0, 0), > > + GATE(CLK_GOUT_MISC_OTP_CON_BISR_IPCLKPORT_I_OSCCLK, > > + "gout_misc_otp_con_bisr_ipclkport_i_oscclk", "dout_misc_bu= sp", > > + CLK_CON_GAT_CLK_BLK_MISC_UID_OTP_CON_BISR_IPCLKPORT_I_OSCC= LK, > > + 21, 0, 0), > > + GATE(CLK_GOUT_MISC_RTIC_IPCLKPORT_I_ACLK, > > + "gout_misc_rtic_ipclkport_i_aclk", "dout_misc_busp", > > + CLK_CON_GAT_GOUT_BLK_MISC_UID_RTIC_IPCLKPORT_I_ACLK, > > + 21, 0, 0), > > + GATE(CLK_GOUT_MISC_RTIC_IPCLKPORT_I_PCLK, "gout_misc_rtic_ipclk= port_i_pclk", > > 80 characters per line please. Will fix regards, Peter 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 B7AAAC4167B for ; Fri, 8 Dec 2023 11:35:54 +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:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ZcLHxx0pqtRLi74Nuy9wE8uJ9cIsu+NlaL2JFkBvEy0=; b=sQfxG03uWEoeuE uXTNXcoT3qmyev7NqnMvmTUMYZQEwJHwO/MJWg5SJoxQb4GXY9eqW4qo6k4elTeV8uSvwZ6Ch3GF6 zY6tZH5Q7tx5o4cicF1u3DwpO+zsgTF28R6W0lEk0p1T8I1lOOUTXyQ4Dbo2LCqIGe38l5BvZ2/Eo v47RlN9Yc5LlUQIBOSHm9hY5AFNb+CqZGwX3D2rLltMhC5uVyDGPWs8KFDicywSYkt+MGS6wh/0e6 WPjQyX466ZxGO4PTgNbeB1vMKindMdazrcTiBplodZYqI3WGI/6X6Ol5OOypjPFo+05FMzJCpQ5a4 nLig5Q+7ScmeISjMELzQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rBZ8e-00FWOe-2b; Fri, 08 Dec 2023 11:35:24 +0000 Received: from mail-qv1-xf31.google.com ([2607:f8b0:4864:20::f31]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rBZ8b-00FWNP-0C for linux-arm-kernel@lists.infradead.org; Fri, 08 Dec 2023 11:35:23 +0000 Received: by mail-qv1-xf31.google.com with SMTP id 6a1803df08f44-67ad277a06bso11112966d6.1 for ; Fri, 08 Dec 2023 03:35:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1702035319; x=1702640119; darn=lists.infradead.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=zUV2gymsVRTUXmEES1qoIcu+UrHpB6U3bjKRN5uPogc=; b=FMqxoVhO9Yh6dVTFPv2HwbPbktQ/StnY1OYLuyFCcrT0XsiqBEgkUIcbLxxMHL93ud 3jm93s+bDFs9JN1fFaUh498B31Yq2sHECjSu1A254FCi7LdVlcWScLYw5xxQFNi1ffpB AfhqN3GJhjoqpmbJV2CT5lnbh7E+MmKjnor/uHjeWo6fxI5rdQUmWTY4nMFPmG3HOhAR 1npHwQ0vtWBXLsBIkSnowN9tSJBk8eXCl7gpx3MJ8OLdi5oISDNMOB15oJsTXWhX3Fly OSIBZrRWSjgFbEsbC/ccI4M8QfnRkt90IC0Ps0zYqwwX9BpijUc8FUK70hdpN0gr6ksw LM/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702035319; x=1702640119; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zUV2gymsVRTUXmEES1qoIcu+UrHpB6U3bjKRN5uPogc=; b=amUsxVBpoxImNBzCW5+om9fvoJOK1RwXPFACj1ap8H5hPpYP0rHvGyTgueehv8QEaI atBWm6BMi/pnzNn5veKz0C14LUL0ceqXjAYbIHdDZ1aK68aQq/JbQiJzRq44DR238lLq GOGLAsUlx3+Y4TMO4xKuDQfanwHKR7t7BFQDiBSD65d0FOp+Ili1mx9XZ9JptyxPoVl8 3KoR1EmOSakfpuDis0+uevIZVAW3tMAELBXItuHvBdfrbHAAG78prv8iPO8lCRJUCDxH OmZlS2CUgZ/JjGGqDVgJiO+Gh94Yvd5dJPnklsG7DagVwKKIugqmZDhuEX2NzOOmWWPn KNaA== X-Gm-Message-State: AOJu0YzLBDXh/ST4f8DRyalMSnatZgqmPd7mRYPOmtKYK8grFU/r8P8I rWgBYlbalaQWNHqT+PwO6WzzsMFiEV5IxPqwqAjk3g== X-Google-Smtp-Source: AGHT+IEC6JdZ6U/gEesI+E7ZbvlG7lTwKLLiNtgy400dLC/RZUM/6b3j6Xea2JLJw6/USyS+V81pzcCJ0cSbyQMs0hA= X-Received: by 2002:a05:6214:32c:b0:67a:a721:cae3 with SMTP id j12-20020a056214032c00b0067aa721cae3mr4135955qvu.68.1702035318988; Fri, 08 Dec 2023 03:35:18 -0800 (PST) MIME-Version: 1.0 References: <20231201160925.3136868-1-peter.griffin@linaro.org> <20231201160925.3136868-13-peter.griffin@linaro.org> In-Reply-To: From: Peter Griffin Date: Fri, 8 Dec 2023 11:35:07 +0000 Message-ID: Subject: Re: [PATCH v5 12/20] clk: samsung: clk-gs101: Add cmu_top, cmu_misc and cmu_apm support To: Sam Protsenko Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, mturquette@baylibre.com, conor+dt@kernel.org, sboyd@kernel.org, tomasz.figa@gmail.com, s.nawrocki@samsung.com, linus.walleij@linaro.org, wim@linux-watchdog.org, linux@roeck-us.net, catalin.marinas@arm.com, will@kernel.org, arnd@arndb.de, olof@lixom.net, gregkh@linuxfoundation.org, jirislaby@kernel.org, cw00.choi@samsung.com, alim.akhtar@samsung.com, tudor.ambarus@linaro.org, andre.draszik@linaro.org, saravanak@google.com, willmcvicker@google.com, soc@kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-clk@vger.kernel.org, linux-gpio@vger.kernel.org, linux-watchdog@vger.kernel.org, kernel-team@android.com, linux-serial@vger.kernel.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231208_033521_103549_D1618867 X-CRM114-Status: GOOD ( 35.77 ) 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 SGkgU2FtLAoKVGhhbmtzIGZvciB5b3VyIHJldmlldy4gSSd2ZSB0cmltbWVkIHRoZSBub24gcmVs ZXZhbnQgcGFydHMgb2YgdGhlCmVtYWlsIGEgYml0IGF0IEtyenlzenRvZnMgcmVxdWVzdC4KCk9u IEZyaSwgMSBEZWMgMjAyMyBhdCAyMjo0MCwgU2FtIFByb3RzZW5rbyA8c2VtZW4ucHJvdHNlbmtv QGxpbmFyby5vcmc+IHdyb3RlOgo+Cj4gT24gRnJpLCBEZWMgMSwgMjAyMyBhdCAxMDoxMeKAr0FN IFBldGVyIEdyaWZmaW4gPHBldGVyLmdyaWZmaW5AbGluYXJvLm9yZz4gd3JvdGU6Cj4gPgo+ID4g Y211X3RvcCBpcyB0aGUgdG9wIGxldmVsIGNsb2NrIG1hbmFnZW1lbnQgdW5pdCB3aGljaCBjb250 YWlucyBQTExzLCBtdXhlcywKPiA+IGRpdmlkZXJzIGFuZCBnYXRlcyB0aGF0IGZlZWQgdGhlIG90 aGVyIGNsb2NrIG1hbmFnZW1lbnQgdW5pdHMuCj4gPgo+ID4gY211X21pc2MgY2xvY2tzIElQcyBz dWNoIGFzIFdhdGNoZG9nIGFuZCBjbXVfYXBtIGNsb2NrcyBpcHMgcGFydCBvZiB0aGUKPiA+IEFQ TSBtb2R1bGUuCj4gPgo+ID4gQWNrZWQtYnk6IENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1 bmcuY29tPgo+ID4gVGVzdGVkLWJ5OiBXaWxsIE1jVmlja2VyIDx3aWxsbWN2aWNrZXJAZ29vZ2xl LmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IFBldGVyIEdyaWZmaW4gPHBldGVyLmdyaWZmaW5AbGlu YXJvLm9yZz4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvY2xrL3NhbXN1bmcvTWFrZWZpbGUgICAgfCAg ICAxICsKPiA+ICBkcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1nczEwMS5jIHwgMjQ5NSArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCj4gPiAgMiBmaWxlcyBjaGFuZ2VkLCAyNDk2IGluc2Vy dGlvbnMoKykKPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGst Z3MxMDEuYwo+ID4KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zYW1zdW5nL01ha2VmaWxl IGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9NYWtlZmlsZQo+ID4gaW5kZXggZWJiZWFjYWJlODhmLi4z MDU2OTQ0YTVhNTQgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2Nsay9zYW1zdW5nL01ha2VmaWxl Cj4gPiArKysgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL01ha2VmaWxlCj4gPiBAQCAtMjEsNiArMjEs NyBAQCBvYmotJChDT05GSUdfRVhZTk9TX0FSTTY0X0NPTU1PTl9DTEspICs9IGNsay1leHlub3M3 Lm8KPiA+ICBvYmotJChDT05GSUdfRVhZTk9TX0FSTTY0X0NPTU1PTl9DTEspICArPSBjbGstZXh5 bm9zNzg4NS5vCj4gPiAgb2JqLSQoQ09ORklHX0VYWU5PU19BUk02NF9DT01NT05fQ0xLKSAgKz0g Y2xrLWV4eW5vczg1MC5vCj4gPiAgb2JqLSQoQ09ORklHX0VYWU5PU19BUk02NF9DT01NT05fQ0xL KSAgKz0gY2xrLWV4eW5vc2F1dG92OS5vCj4gPiArb2JqLSQoQ09ORklHX0VYWU5PU19BUk02NF9D T01NT05fQ0xLKSAgKz0gY2xrLWdzMTAxLm8KPiA+ICBvYmotJChDT05GSUdfUzNDNjRYWF9DT01N T05fQ0xLKSAgICAgICArPSBjbGstczNjNjR4eC5vCj4gPiAgb2JqLSQoQ09ORklHX1M1UFYyMTBf Q09NTU9OX0NMSykgICAgICAgKz0gY2xrLXM1cHYyMTAubyBjbGstczVwdjIxMC1hdWRzcy5vCj4g PiAgb2JqLSQoQ09ORklHX1RFU0xBX0ZTRF9DT01NT05fQ0xLKSAgICAgKz0gY2xrLWZzZC5vCj4g PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZ3MxMDEuYyBiL2RyaXZlcnMv Y2xrL3NhbXN1bmcvY2xrLWdzMTAxLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRl eCAwMDAwMDAwMDAwMDAuLjZiZDIzM2E3YWI2Mwo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIv ZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZ3MxMDEuYwo+ID4gQEAgLTAsMCArMSwyNDk1IEBACj4g PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ID4gKy8qCj4gPiAr ICogQ29weXJpZ2h0IChDKSAyMDIzIExpbmFybyBMdGQuCj4gPiArICogQXV0aG9yOiBQZXRlciBH cmlmZmluIDxwZXRlci5ncmlmZmluQGxpbmFyby5vcmc+Cj4gPiArICoKPiA+ICsgKiBDb21tb24g Q2xvY2sgRnJhbWV3b3JrIHN1cHBvcnQgZm9yIEdTMTAxLgo+ID4gKyAqLwo+ID4gKwo+ID4gKyNp bmNsdWRlIDxsaW51eC9jbGsuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+ Cj4gPiArI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L29mX2Rldmlj ZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiA+ICsKPiA+ICsj aW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svZ29vZ2xlLGdzMTAxLmg+Cj4gPiArCj4gPiArI2lu Y2x1ZGUgImNsay5oIgo+ID4gKyNpbmNsdWRlICJjbGstZXh5bm9zLWFybTY0LmgiCj4gPiArCj4g PiArLyogTk9URTogTXVzdCBiZSBlcXVhbCB0byB0aGUgbGFzdCBjbG9jayBJRCBpbmNyZWFzZWQg Ynkgb25lICovCj4gPiArI2RlZmluZSBUT1BfTlJfQ0xLICAgICAoQ0xLX0dPVVRfVFBVX1VBUlQg KyAxKQo+ID4gKyNkZWZpbmUgQVBNX05SX0NMSyAgICAgKENMS19BUE1fUExMX0RJVjE2X0FQTSAr IDEpCj4gPiArI2RlZmluZSBNSVNDX05SX0NMSyAgICAoQ0xLX0dPVVRfTUlTQ19YSVVfRF9NSVND X0lQQ0xLUE9SVF9BQ0xLICsgMSkKPiA+ICsKPgo+IFN1Z2dlc3QgdXNpbmcgQ0xLU19OUl8qIG5h bWluZywgdG8gZm9sbG93IG90aGVyIGRyaXZlcnMgZm9yIGNvbnNpc3RlbmN5LgoKV2lsbCBmaXgK Cj4KPiA+ICsvKiAtLS0tIENNVV9UT1AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwo+ID4gKwo+ID4gKy8qIFJlZ2lzdGVyIE9m ZnNldCBkZWZpbml0aW9ucyBmb3IgQ01VX1RPUCAoMHgxZTA4MDAwMCkgKi8KPiA+ICsKPiA+ICsj ZGVmaW5lIFBMTF9MT0NLVElNRV9QTExfU0hBUkVEMCAgICAgICAgICAgICAgICAgICAgICAgMHgw MDAwCj4gPiArI2RlZmluZSBQTExfTE9DS1RJTUVfUExMX1NIQVJFRDEgICAgICAgICAgICAgICAg ICAgICAgIDB4MDAwNAo+ID4gKyNkZWZpbmUgUExMX0xPQ0tUSU1FX1BMTF9TSEFSRUQyICAgICAg ICAgICAgICAgICAgICAgICAweDAwMDgKPiA+ICsjZGVmaW5lIFBMTF9MT0NLVElNRV9QTExfU0hB UkVEMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBjCjxjdXQ+Cj4gPiArICAgICAgIERJVihD TEtfRE9VVF9NRkNfTUZDLCAiZG91dF9jbXVfbWZjX21mYyIsICJnb3V0X2NtdV9tZmNfbWZjIiwK PiA+ICsgICAgICAgICAgIENMS19DT05fRElWX0NMS0NNVV9NRkNfTUZDLCAwLCA0KSwKPiA+ICsg ICAgICAgRElWKENMS19ET1VUX01JRl9CVVNQLCAiZG91dF9jbXVfbWlmX2J1c3AiLCAiZ291dF9j bXVfbWlmX2J1c3AiLAo+ID4gKyAgICAgICAgICAgQ0xLX0NPTl9ESVZfQ0xLQ01VX01JRl9CVVNQ LCAwLCA0KSwKPiA+ICsgICAgICAgRElWKENMS19ET1VUX01JU0NfQlVTLCAiZG91dF9jbXVfbWlz Y19idXMiLCAiZ291dF9jbXVfbWlzY19idXMiLAo+ID4gKyAgICAgICAgICAgQ0xLX0NPTl9ESVZf Q0xLQ01VX01JU0NfQlVTLCAwLCA0KSwKPiA+ICsgICAgICAgRElWKENMS19ET1VUX01JU0NfU1NT LCAiZG91dF9jbXVfbWlzY19zc3MiLCAiZ291dF9jbXVfbWlzY19zc3MiLAo+ID4gKyAgICAgICAg ICAgQ0xLX0NPTl9ESVZfQ0xLQ01VX01JU0NfU1NTLCAwLCA0KSwKPiA+ICsgICAgICAgLyogQ0xL X0NPTl9ESVZfQ0xLQ01VX09UUCBsb3dlciBiaXRzIHJlc2VydmVkKi8KPgo+IFdoeSB0aGUgYWJv dmUgY2xvY2sgd2hlcmUgYml0cyBhcmUgcmVzZXJ2ZWQgaXMgZGVjbGFyZWQsIGJ1dCB0aGlzIG9u ZQo+IGlzIG5vdD8gQWxzbywgYWJvdmUgY29tbWVudCBpcyBtYXJrZWQgYXMgVE9ETywgYnV0IHRo aXMgb25lIGlzIG5vdC4KPiBBbmQgdGhlcmUgaXMgbm8gc3BhY2UgYmVmb3JlICovLgoKR29vZCBz cG90ISBUaGVzZSB0d28gZGl2aWRlcnMgd2l0aCByZXNlcnZlZCBsb3dlciBiaXRzIHNob3VsZCBi ZSBmaXhlZApmYWN0b3IgY2xvY2tzLiBJJ3ZlIGZpeGVkIGluIHY2LgoKPgo+ID4gKyAgICAgICBE SVYoQ0xLX0RPVVRfUERQX0JVUywgImRvdXRfY211X3BkcF9idXMiLCAiZ291dF9jbXVfcGRwX2J1 cyIsCj4gPiArICAgICAgICAgICBDTEtfQ09OX0RJVl9DTEtDTVVfUERQX0JVUywgMCwgNCksCj4g PiArICAgICAgIERJVihDTEtfRE9VVF9QRFBfVlJBLCAiZG91dF9jbXVfcGRwX3ZyYSIsICJnb3V0 X2NtdV9wZHBfdnJhIiwKPiA+ICsgICAgICAgICAgIENMS19DT05fRElWX0NMS0NNVV9QRFBfVlJB LCAwLCA0KSwKPiA+ICsgICAgICAgRElWKENMS19ET1VUX1BFUklDMF9CVVMsICJkb3V0X2NtdV9w ZXJpYzBfYnVzIiwgImdvdXRfY211X3BlcmljMF9idXMiLAo+ID4gKyAgICAgICAgICAgQ0xLX0NP Tl9ESVZfQ0xLQ01VX1BFUklDMF9CVVMsIDAsIDQpLAo8Y3V0Pgo+ID4gKyAgICAgICBESVYoQ0xL X0RPVVRfU0hBUkVEMV9ESVYyLCAiZG91dF9zaGFyZWQxX2RpdjIiLCAibW91dF9zaGFyZWQxX3Bs bCIsCj4gPiArICAgICAgICAgICBDTEtfQ09OX0RJVl9QTExfU0hBUkVEMV9ESVYyLCAwLCAxKSwK PiA+ICsgICAgICAgRElWKENMS19ET1VUX1NIQVJFRDFfRElWMywgImRvdXRfc2hhcmVkMV9kaXYz IiwgIm1vdXRfc2hhcmVkMV9wbGwiLAo+ID4gKyAgICAgICAgICAgQ0xLX0NPTl9ESVZfUExMX1NI QVJFRDFfRElWMywgMCwgMiksCj4gPiArICAgICAgIERJVihDTEtfRE9VVF9TSEFSRUQxX0RJVjQs ICJkb3V0X3NoYXJlZDFfZGl2NCIsICJtb3V0X3NoYXJlZDFfcGxsIiwKPiA+ICsgICAgICAgICAg IENMS19DT05fRElWX1BMTF9TSEFSRUQxX0RJVjQsIDAsIDEpLAo+ID4gKyAgICAgICBESVYoQ0xL X0RPVVRfU0hBUkVEMl9ESVYyLCAiZG91dF9zaGFyZWQyX2RpdjIiLCAibW91dF9zaGFyZWQyX3Bs bCIsCj4gPiArICAgICAgICAgICBDTEtfQ09OX0RJVl9QTExfU0hBUkVEMl9ESVYyLCAwLCAxKSwK PiA+ICsgICAgICAgRElWKENMS19ET1VUX1NIQVJFRDNfRElWMiwgImRvdXRfc2hhcmVkM19kaXYy IiwgIm1vdXRfc2hhcmVkM19wbGwiLAo+ID4gKyAgICAgICAgICAgQ0xLX0NPTl9ESVZfUExMX1NI QVJFRDNfRElWMiwgMCwgMSksCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IHNhbXN1bmdfZ2F0ZV9jbG9jayBjbXVfdG9wX2dhdGVfY2xrc1tdIF9faW5pdGNvbnN0ID0gewo+ ID4gKyAgICAgICBHQVRFKENMS19HT1VUX0JVUzBfQk9PU1QsICJnb3V0X2NtdV9idXMwX2Jvb3N0 IiwgIm1vdXRfY211X2Jvb3N0X29wdGlvbjEiLAo+Cj4gUGxlYXNlIHN0aWNrIHRvIDgwIGNoYXJh Y3RlcnMgbGVuZ3RoLCBoZXJlIGFuZCBiZWxvdy4KCldpbGwgZml4LgoKPgo+ID4gKyAgICAgICAg ICAgIENMS19DT05fR0FUX0NMS0NNVV9CVVMwX0JPT1NULCAyMSwgMCwgMCksCj4gPiArICAgICAg IEdBVEUoQ0xLX0dPVVRfQlVTMV9CT09TVCwgImdvdXRfY211X2J1czFfYm9vc3QiLCAibW91dF9j bXVfYm9vc3Rfb3B0aW9uMSIsCj4gPiArICAgICAgICAgICAgQ0xLX0NPTl9HQVRfQ0xLQ01VX0JV UzFfQk9PU1QsIDIxLCAwLCAwKSwKPiA+ICsgICAgICAgR0FURShDTEtfR09VVF9CVVMyX0JPT1NU LCAiZ291dF9jbXVfYnVzMl9ib29zdCIsICJtb3V0X2NtdV9ib29zdF9vcHRpb24xIiwKPiA+ICsg ICAgICAgICAgICBDTEtfQ09OX0dBVF9DTEtDTVVfQlVTMl9CT09TVCwgMjEsIDAsIDApLAo+ID4g KyAgICAgICBHQVRFKENMS19HT1VUX0NPUkVfQk9PU1QsICJnb3V0X2NtdV9jb3JlX2Jvb3N0Iiwg Im1vdXRfY211X2Jvb3N0X29wdGlvbjEiLAo+ID4gKyAgICAgICAgICAgIENMS19DT05fR0FUX0NM S0NNVV9DT1JFX0JPT1NULCAyMSwgMCwgMCksCgo+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCBnczEw MV9jbXVfdG9wX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKPiA+ICt7Cj4gPiArICAgICAg IGV4eW5vc19hcm02NF9yZWdpc3Rlcl9jbXUoTlVMTCwgbnAsICZ0b3BfY211X2luZm8pOwo+ID4g K30KPiA+ICsKPiA+ICsvKiBSZWdpc3RlciBDTVVfVE9QIGVhcmx5LCBhcyBpdCdzIGEgZGVwZW5k ZW5jeSBmb3Igb3RoZXIgZWFybHkgZG9tYWlucyAqLwo+ID4gK0NMS19PRl9ERUNMQVJFKGdzMTAx X2NtdV90b3AsICJnb29nbGUsZ3MxMDEtY211LXRvcCIsCj4gPiArICAgICAgICAgICAgICBnczEw MV9jbXVfdG9wX2luaXQpOwo+ID4gKwo+ID4gKy8qIC0tLS0gQ01VX0FQTSAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCj4KPiBT dWdnZXN0IGFkZGluZyBhbiBlbXB0eSBsaW5lIGhlcmUuCgpXaWxsIGZpeAoKPgo+ID4gKy8qIFJl Z2lzdGVyIE9mZnNldCBkZWZpbml0aW9ucyBmb3IgQ01VX0FQTSAoMHgxNzQwMDAwMCkgKi8KPiA+ ICsjZGVmaW5lIEFQTV9DTVVfQVBNX0NPTlRST0xMRVJfT1BUSU9OICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKPiA+ICsjZGVmaW5lIENMS09V VF9DT05fQkxLX0FQTV9DTVVfQVBNX0NMS09VVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAweDA4MTAKPiA+ICsjZGVmaW5lIENMS19DT05fTVVYX01VWF9DTEtD TVVfQVBNX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDB4MTAwMAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9NVVhfTVVYX0NMS0NNVV9BUE1f RlVOQ1NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAw NAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9ESVZfRElWX0NMS19BUE1fQk9PU1QgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMAo+ID4gKyNkZWZpbmUg Q0xLX0NPTl9ESVZfRElWX0NMS19BUE1fVVNJMF9VQVJUICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDB4MTgwNAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9ESVZfRElW X0NMS19BUE1fVVNJMF9VU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDB4MTgwOAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9ESVZfRElWX0NMS19BUE1fVVNJMV9V QVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwYwo+ ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfQ0xLX0JMS19BUE1fVUlEX0FQTV9DTVVfQVBNX0lQQ0xL UE9SVF9QQ0xLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAo+ID4gKyNkZWZpbmUgQ0xL X0NPTl9HQVRfQ0xLX0JVUzBfQk9PU1RfT1BUSU9OMSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDB4MjAwNAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfQ0xLX0NN VV9CT09TVF9PUFRJT04xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDB4MjAwOAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfQ0xLX0NPUkVfQk9PU1RfT1BUSU9O MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwYwo8Y3V0 Pgo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfR09VVF9CTEtfQVBNX1VJRF9TUEVFRFlfQVBNX0lQ Q0xLUE9SVF9QQ0xLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjBhOAo+ID4gKyNkZWZpbmUg Q0xLX0NPTl9HQVRfR09VVF9CTEtfQVBNX1VJRF9TUEVFRFlfU1VCX0FQTV9JUENMS1BPUlRfUENM SyAgICAgICAgICAgICAgICAgICAgIDB4MjBhYwo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfR09V VF9CTEtfQVBNX1VJRF9TU01UX0RfQVBNX0lQQ0xLUE9SVF9BQ0xLICAgICAgICAgICAgICAgICAg ICAgICAgIDB4MjBiMAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfR09VVF9CTEtfQVBNX1VJRF9T U01UX0RfQVBNX0lQQ0xLUE9SVF9QQ0xLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjBiNAo+ ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfR09VVF9CTEtfQVBNX1VJRF9TU01UX0dfREJHQ09SRV9J UENMS1BPUlRfQUNMSyAgICAgICAgICAgICAgICAgICAgIDB4MjBiOAo+ID4gKyNkZWZpbmUgQ0xL X0NPTl9HQVRfR09VVF9CTEtfQVBNX1VJRF9TU01UX0dfREJHQ09SRV9JUENMS1BPUlRfUENMSyAg ICAgICAgICAgICAgICAgICAgIDB4MjBiYwo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfR09VVF9C TEtfQVBNX1VJRF9TU19EQkdDT1JFX0lQQ0xLUE9SVF9TU19EQkdDT1JFX0lQQ0xLUE9SVF9IQ0xL ICAgIDB4MjBjMAo+Cj4gQXMgSSB1bmRlcnN0YW5kLCBhbGwgdGhvc2UgcGFydHMgbGlrZSBJUENM S1BPUlQsIEJMSywgVUlEIChSU1ROU1lOQwo+IHByb2JhYmx5IHRvbykgLS0gdGhleSBkb24ndCBy ZWFsbHkgbWVhbiBhbnl0aGluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUKPiBkcml2ZXIsIGp1c3Qg bm9pc2UuIEFuZCBpZiB5b3UgcmVtb3ZlIHRob3NlIC0tIHRoZXJlIHdvbid0IGJlIGFueQo+IGNv bmZsaWN0cyB3aXRoIG90aGVyIG5hbWVzLCBiZWNhdXNlIHRob3NlIGJpdHMgYXJlIG5vdCB0aGUg dW5pcXVlCj4gcGFydHMuIEZvbGxvd2luZyB0aGUgVFJNIGxldHRlciBmb3IgbGV0dGVyIGluIHRo aXMgY2FzZSBqdXN0IG1ha2VzCj4gdGhpbmdzIGV4dHJlbWVseSBsb25nIHdpdGhvdXQgYWRkaW5n IGFueSB2YWx1ZSBJTUhPLiBGb3IgZXhhbXBsZSwgdGhhdAo+IG5hbWUgYWJvdmUgbWlnaHQgYmU6 Cj4KPiAgICAgQ0xLX0NPTl9HQVRfR09VVF9BUE1fU1NfREJHQ09SRV9TU19EQkdDT1JFX0hDTEsK Pgo+IG9yIGV2ZW4KPgo+ICAgICBDTEtfQ09OX0dBVF9HT1VUX0FQTV9TU19EQkdDT1JFX0hDTEsK Pgo+IHdvdWxkIGJlIGZpbmUuCj4KPiBJbiBjbGstZXh5bm9zODUwIGRyaXZlciBJIHJlbW92ZWQg YWxsIHRob3NlIHBhcnRzLCBiZWNhdXNlIHRoZXkgbWFrZQo+IGl0IHByZXR0eSBtdWNoIGltcG9z c2libGUgdG8gcmVhZCBib3RoIHRoZSBkcml2ZXIgYW5kIGR0cy4gQW5kIHllYWgsCj4gYmVjYXVz ZSB0aG9zZSBuYW1lcyBjb25zZXF1ZW50eSBsZWFkIHRvIHZlcnkgbG9uZyBzdHJpbmcgbmFtZXMs IGR0cwo+IHdpbGwgYmUgaGFyZCB0byByZWFkIHRvbywgd2hpY2ggaXMgZXZlbiB3b3JzZS4gQnV0 IGFnYWluLCB0aGF0J3Mgb25seQo+IG15IElNSE8uCgpJIHdvdWxkIGxpa2UgdG8ga2VlcCB0aGUg cmVnaXN0ZXIgbmFtZXMgdW5tb2RpZmllZCwgYXMgSSBtZW50aW9uZWQKcHJldmlvdXNseSBtYW5n bGluZyB0aGVtIG1ha2VzIGNoZWNraW5nIHdpdGggdGhlIGRhdGFzaGVldCBtdWNoCmhhcmRlci4g QXMgdGhlIG5hbWUgaW4gdGhlIGhlYWRlciBhbmQgc3RyaW5nIGFyZSBhbHJlYWR5IG1hbmdsZWQg YSBiaXQKSSdtIE9LIHdpdGggbWFuZ2xpbmcgdGhhdCBhIGJpdCBtb3JlLgoKV2l0aCB0aGF0IGlu IG1pbmQgSSd2ZSBkb25lIHRoZSBmb2xsb3dpbmcgbWFuZ2xpbmcgaW4gdjY6IC0KClJlZ2lzdGVy IG5hbWU6IENMS19DT05fR0FUX0dPVVRfQkxLX0FQTV9VSURfQVBCSUZfR1BJT19BTElWRV9JUENM S1BPUlRfUENMSwoKUmVwbGFjZSBgQ0xLX0NPTl9HQVRfR09VVF9CTEtfPGJsb2NrbmFtZT5fVUlE X2Agd2l0aCBgQ0xLX0dPVVRfPGJsb2NrbmFtZT5fYApSZXBsYWNlIGAgX0lQQ0xLUE9SVGAgd2l0 aCBub3RoaW5nClJlcGxhY2UgYF9SU1ROU1lOQ2Agd2l0aCBub3RoaW5nCgpTbyB5b3UgZW5kIHVw IHdpdGg6CgpHQVRFKENMS19HT1VUX0FQTV9BUEJJRl9HUElPX0FMSVZFX1BDTEssCiAgICAgICAg ICAgICJnb3V0X2FwbV9hcGJpZl9ncGlvX2FsaXZlX3BjbGsiLCAiZ291dF9hcG1fZnVuYyIsCiAg ICAgICAgICAgICBDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlEX0FQQklGX0dQSU9fQUxJVkVf SVBDTEtQT1JUX1BDTEssCiAgICAgICAgICAgICAyMSwgMCwgMCksCgpUaGF0IHN0aWxsIGVuYWJs ZXMgY3Jvc3MgcmVmZXJlbmNpbmcgd2l0aCB0aGUgZGF0YXNoZWV0IHZpYSB0aGUKdW5tb2RpZmll ZCByZWdpc3RlciBuYW1lLCBidXQgdGhlIGR0IGJpbmRpbmcgZGVmaW5lIGFuZCBzdHJpbmcgYXJl CnNsaWdodGx5IHNob3J0ZXIgbGlrZSB5b3Ugd2FudGVkLiBUaGUgbWFuZ2xpbmcgZGVzY3JpYmVk IGFib3ZlIHRoZQp2YXN0IG1ham9yaXR5IG9mIGNsb2NrIG5hbWVzIGxvb2sgZmluZS4gVGhlcmUg YXJlIGEgY291cGxlIG9mCmFub21hbGllcyB0aG91Z2ggbGlrZSAgYENMS19HT1VUX01JU0NfTUlT Q19DTVVfTUlTQ19QQ0xLYCBhbmQKYENMS19HT1VUX0FQTV9BUE1fQ01VX0FQTV9QQ0xLYC4gSSB0 aGluayBpdCBpcyBhICpyZWFsbHkqIGJhZCBpZGVhIHRvCmRvIGN1c3RvbSBtYW5nbGluZyBvbiB0 aGVzZSBzcGVjaWZpYyBuYW1lcyB0aG91Z2guCgo+Cj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9H T1VUX0JMS19BUE1fVUlEX1NZU01NVV9EX0FQTV9JUENMS1BPUlRfQ0xLX1MyICAgICAgICAgICAg ICAgICAgICAgMHgyMGM0Cj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlE X1NZU1JFR19BUE1fSVBDTEtQT1JUX1BDTEsgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMGNj Cj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlEX1VBU0NfQVBNX0lQQ0xL UE9SVF9BQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMGQwCj4gPiArI2RlZmluZSBD TEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlEX1VBU0NfQVBNX0lQQ0xLUE9SVF9QQ0xLICAgICAg ICAgICAgICAgICAgICAgICAgICAgMHgyMGQ0Cj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9HT1VU X0JMS19BUE1fVUlEX1VBU0NfREJHQ09SRV9JUENMS1BPUlRfQUNMSyAgICAgICAgICAgICAgICAg ICAgICAgMHgyMGQ4Cgo8Y3V0PgoKPiA+ICsgICAgICAgR0FURShDTEtfR09VVF9BUE1fQVBCSUZf UlRDX0lQQ0xLUE9SVF9QQ0xLLAo+ID4gKyAgICAgICAgICAgICJnb3V0X2FwbV9hcGJpZl9ydGNf aXBjbGtwb3J0X3BjbGsiLCAiZ291dF9hcG1fZnVuYyIsCj4gPiArICAgICAgICAgICAgQ0xLX0NP Tl9HQVRfR09VVF9CTEtfQVBNX1VJRF9BUEJJRl9SVENfSVBDTEtQT1JUX1BDTEssIDIxLCAwLCAw KSwKPiA+ICsgICAgICAgR0FURShDTEtfR09VVF9BUE1fQVBCSUZfVFJUQ19JUENMS1BPUlRfUENM SywKPiA+ICsgICAgICAgICAgICAiZ291dF9hcG1fYXBiaWZfdHJ0Y19pcGNsa3BvcnRfcGNsayIs ICJnb3V0X2FwbV9mdW5jIiwKPiA+ICsgICAgICAgICAgICBDTEtfQ09OX0dBVF9HT1VUX0JMS19B UE1fVUlEX0FQQklGX1RSVENfSVBDTEtQT1JUX1BDTEssIDIxLCAwLCAwKSwKPiA+ICsgICAgICAg R0FURShDTEtfR09VVF9BUE1fQVBNX1VTSTBfVUFSVF9JUENMS1BPUlRfUENMSywKPiA+ICsgICAg ICAgICAgICAiZ291dF9hcG1fYXBtX3VzaTBfdWFydF9pcGNsa3BvcnRfcGNsayIsICJnb3V0X2Fw bV9mdW5jIiwKPiA+ICsgICAgICAgICAgICBDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlEX0FQ TV9VU0kwX1VBUlRfSVBDTEtQT1JUX1BDTEssCj4gPiArICAgICAgICAgICAgMjEsIDAsIDApLAo+ ID4gKyAgICAgICBHQVRFKENMS19HT1VUX0FQTV9BUE1fVVNJMF9VU0lfSVBDTEtQT1JUX0lQQ0xL LAo+ID4gKyAgICAgICAgICAgICJnb3V0X2FwbV9hcG1fdXNpMF91c2lfaXBjbGtwb3J0X2lwY2xr IiwgImRvdXRfYXBtX3VzaTBfdWFydCIsCj4gPiArICAgICAgICAgICAgQ0xLX0NPTl9HQVRfR09V VF9CTEtfQVBNX1VJRF9BUE1fVVNJMF9VU0lfSVBDTEtQT1JUX1BDTEssCj4KPiBQQ0xLIHZzIElQ Q0xLPwoKV2lsbCBmaXguIFRoZSBvcmRlciBoZXJlIHNob3VsZCBtYXRjaCB0aGUgcmVnaXN0ZXIg b2Zmc2V0cwoKQ0xLX0NPTl9HQVRfR09VVF9CTEtfQVBNX1VJRF9BUE1fVVNJMF9VQVJUX0lQQ0xL UE9SVF9JUENMSywKQ0xLX0NPTl9HQVRfR09VVF9CTEtfQVBNX1VJRF9BUE1fVVNJMF9VQVJUX0lQ Q0xLUE9SVF9QQ0xLLApDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlEX0FQTV9VU0kwX1VTSV9J UENMS1BPUlRfSVBDTEssCkNMS19DT05fR0FUX0dPVVRfQkxLX0FQTV9VSURfQVBNX1VTSTBfVVNJ X0lQQ0xLUE9SVF9QQ0xLLApDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlEX0FQTV9VU0kxX1VB UlRfSVBDTEtQT1JUX0lQQ0xLLApDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1fVUlEX0FQTV9VU0kx X1VBUlRfSVBDTEtQT1JUX1BDTEssCgo+Cj4gPiArICAgICAgICAgICAgMjEsIDAsIDApLAo+ID4g KyAgICAgICBHQVRFKENMS19HT1VUX0FQTV9BUE1fVVNJMF9VU0lfSVBDTEtQT1JUX1BDTEssCj4g PiArICAgICAgICAgICAgImdvdXRfYXBtX2FwbV91c2kwX3VzaV9pcGNsa3BvcnRfcGNsayIsICJn b3V0X2FwbV9mdW5jIiwKPiA+ICsgICAgICAgICAgICBDTEtfQ09OX0dBVF9HT1VUX0JMS19BUE1f VUlEX0FQTV9VU0kxX1VBUlRfSVBDTEtQT1JUX1BDTEssIDIxLCAwLCAwKSwKPgo+IFNob3VsZCBp dCBiZSBVU0kwIGluc3RlYWQgb2YgVVNJMT8gSXQncyB0aGUgc2FtZSBhcyB0aGUgZGVmaW5pdGlv bgo+IGJlbG93LiBBbHNvLCBwbGVhc2Ugc3RpY2sgdG8gODAgY2hhcmFjdGVycyBwZXIgbGluZSwg aGVyZSBhbmQgYmVsb3cuCgpJJ3ZlIHJldmlzaXRlZCB0aGUgNiBjbG9jayBnYXRlcyBkZXNjcmli ZWQgYWJvdmUgdG8gZW5zdXJlIHRoZXkgYXJlIGluCnJlZ2lzdGVyIG9mZnNldCBvcmRlci4KCj4K PiA+ICsgICAgICAgR0FURShDTEtfR09VVF9BUE1fQVBNX1VTSTFfVUFSVF9JUENMS1BPUlRfSVBD TEssCj4gPiArICAgICAgICAgICAgImdvdXRfYXBtX2FwbV91c2kxX3VhcnRfaXBjbGtwb3J0X2lw Y2xrIiwgImRvdXRfYXBtX3VzaTFfdWFydCIsCj4gPiArICAgICAgICAgICAgQ0xLX0NPTl9HQVRf R09VVF9CTEtfQVBNX1VJRF9BUE1fVVNJMV9VQVJUX0lQQ0xLUE9SVF9JUENMSywgMjEsIDAsIDAp LAo+ID4gKyAgICAgICBHQVRFKENMS19HT1VUX0FQTV9BUE1fVVNJMV9VQVJUX0lQQ0xLUE9SVF9Q Q0xLLAo+ID4gKyAgICAgICAgICAgICJnb3V0X2FwbV9hcG1fdXNpMV91YXJ0X2lwY2xrcG9ydF9w Y2xrIiwgImdvdXRfYXBtX2Z1bmMiLAoKPGN1dD4KCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBz YW1zdW5nX2NtdV9pbmZvIGFwbV9jbXVfaW5mbyBfX2luaXRjb25zdCA9IHsKPiA+ICsgICAgICAg Lm11eF9jbGtzICAgICAgICAgICAgICAgPSBhcG1fbXV4X2Nsa3MsCj4gPiArICAgICAgIC5ucl9t dXhfY2xrcyAgICAgICAgICAgID0gQVJSQVlfU0laRShhcG1fbXV4X2Nsa3MpLAo+ID4gKyAgICAg ICAuZGl2X2Nsa3MgICAgICAgICAgICAgICA9IGFwbV9kaXZfY2xrcywKPiA+ICsgICAgICAgLm5y X2Rpdl9jbGtzICAgICAgICAgICAgPSBBUlJBWV9TSVpFKGFwbV9kaXZfY2xrcyksCj4gPiArICAg ICAgIC5nYXRlX2Nsa3MgICAgICAgICAgICAgID0gYXBtX2dhdGVfY2xrcywKPiA+ICsgICAgICAg Lm5yX2dhdGVfY2xrcyAgICAgICAgICAgPSBBUlJBWV9TSVpFKGFwbV9nYXRlX2Nsa3MpLAo+ID4g KyAgICAgICAuZml4ZWRfY2xrcyAgICAgICAgICAgICA9IGFwbV9maXhlZF9jbGtzLAo+ID4gKyAg ICAgICAubnJfZml4ZWRfY2xrcyAgICAgICAgICA9IEFSUkFZX1NJWkUoYXBtX2ZpeGVkX2Nsa3Mp LAo+ID4gKyAgICAgICAubnJfY2xrX2lkcyAgICAgICAgICAgICA9IEFQTV9OUl9DTEssCj4gPiAr ICAgICAgIC5jbGtfcmVncyAgICAgICAgICAgICAgID0gYXBtX2Nsa19yZWdzLAo+ID4gKyAgICAg ICAubnJfY2xrX3JlZ3MgICAgICAgICAgICA9IEFSUkFZX1NJWkUoYXBtX2Nsa19yZWdzKSwKPiA+ ICt9Owo+ID4gKwo+ID4gKy8qIC0tLS0gQ01VX01JU0MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwo+Cj4gU3VnZ2VzdCBhZGRp bmcgYW4gZW1wdHkgbGluZSBoZXJlLgoKV2lsbCBmaXgKPgo+ID4gKy8qIFJlZ2lzdGVyIE9mZnNl dCBkZWZpbml0aW9ucyBmb3IgQ01VX01JU0MgKDB4MTAwMTAwMDApICovCj4gPiArI2RlZmluZSBQ TExfQ09OMF9NVVhfQ0xLQ01VX01JU0NfQlVTX1VTRVIgICAgICAweDA2MDAKPiA+ICsjZGVmaW5l IFBMTF9DT04xX01VWF9DTEtDTVVfTUlTQ19CVVNfVVNFUiAgICAgIDB4MDYwNAo+ID4gKyNkZWZp bmUgUExMX0NPTjBfTVVYX0NMS0NNVV9NSVNDX1NTU19VU0VSICAgICAgMHgwNjEwCj4gPiArI2Rl ZmluZSBQTExfQ09OMV9NVVhfQ0xLQ01VX01JU0NfU1NTX1VTRVIgICAgICAweDA2MTQKPiA+ICsj ZGVmaW5lIE1JU0NfQ01VX01JU0NfQ09OVFJPTExFUl9PUFRJT04gICAgICAgICAgICAgICAgMHgw ODAwCj4gPiArI2RlZmluZSBDTEtPVVRfQ09OX0JMS19NSVNDX0NNVV9NSVNDX0NMS09VVDAgICAw eDA4MTAKPiA+ICsjZGVmaW5lIENMS19DT05fTVVYX01VWF9DTEtfTUlTQ19HSUMgICAgICAgICAg IDB4MTAwMAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9ESVZfRElWX0NMS19NSVNDX0JVU1AgICAgICAg ICAgMHgxODAwCj4gPiArI2RlZmluZSBDTEtfQ09OX0RJVl9ESVZfQ0xLX01JU0NfR0lDICAgICAg ICAgICAweDE4MDQKPgo+IFBsZWFzZSBhbGlnbiBhbGwgdmFsdWVzIGZvciB0aGlzIGdyb3VwIGF0 IHRoZSBzYW1lIGluZGVudGF0aW9uIGxldmVsLgoKV2lsbCBmaXgKCj4KPiA+ICsjZGVmaW5lIENM S19DT05fR0FUX0NMS19CTEtfTUlTQ19VSURfTUlTQ19DTVVfTUlTQ19JUENMS1BPUlRfUENMSyAg ICAgICAgICAgICAgMHgyMDAwCj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9DTEtfQkxLX01JU0Nf VUlEX09UUF9DT05fQklSQV9JUENMS1BPUlRfSV9PU0NDTEsgICAgICAgICAgIDB4MjAwNAo+ID4g KyNkZWZpbmUgQ0xLX0NPTl9HQVRfQ0xLX0JMS19NSVNDX1VJRF9PVFBfQ09OX0JJU1JfSVBDTEtQ T1JUX0lfT1NDQ0xLICAgICAgICAgICAweDIwMDgKPiA+ICsjZGVmaW5lIENMS19DT05fR0FUX0NM S19CTEtfTUlTQ19VSURfT1RQX0NPTl9UT1BfSVBDTEtQT1JUX0lfT1NDQ0xLICAgICAgICAgICAg MHgyMDBjCj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9DTEtfQkxLX01JU0NfVUlEX1JTVE5TWU5D X0NMS19NSVNDX09TQ0NMS19JUENMS1BPUlRfQ0xLICAgIDB4MjAxMAo+Cj4gSnVzdCB3YW50IHRv IGdpdmUgeW91IG9uZSBtb3JlIGV4YW1wbGUgZm9yIG15IHJhbnQgYWJvdmUuIExvb2sgaG93Cj4g bXVjaCBlYXNpZXIgaXQgaXMgdG8gdW5kZXJzdGFuZCB0aGlzIG5hbWUgKHRoYW4gYWJvdmUgb25l KToKPgo+ICAgICBDTEtfQ09OX0dBVF9NSVNDX09TQ0NMS19DTEsKPgo+IFdoaWNoIGFsc28gdHVy bnMgdGhpcyAocHVibGljIEFQSSEpOgo+Cj4gICAgICJnb3V0X21pc2NfcnN0bnN5bmNfY2xrX21p c2Nfb3NjY2xrX2lwY2xrcG9ydF9jbGsiCj4KPiBpbnRvIHRoaXM6Cj4KPiAgICAgImdvdXRfbWlz Y19vc2NjbGtfY2xrIgoKSW4gdjYgdGhpcyBiZWNvbWVzCgpHQVRFKENMS19HT1VUX01JU0NfQ0xL X01JU0NfT1NDQ0xLX0NMSywKICAgICAiZ291dF9taXNjX2Nsa19taXNjX29zY2Nsa19jbGsiLCAi ZG91dF9taXNjX2J1c3AiLAogICAgIENMS19DT05fR0FUX0NMS19CTEtfTUlTQ19VSURfUlNUTlNZ TkNfQ0xLX01JU0NfT1NDQ0xLX0lQQ0xLUE9SVF9DTEssCiAgICAgMjEsIDAsIDApLAoKPGN1dD4K Pgo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9HQVRfR09VVF9CTEtfTUlTQ19VSURfQURNX0FIQl9TU1Nf SVBDTEtQT1JUX0hDTEtNICAgICAgICAgICAgICAweDIwMTQKPiA+ICsjZGVmaW5lIENMS19DT05f R0FUX0dPVVRfQkxLX01JU0NfVUlEX0FEX0FQQl9ESVRfSVBDTEtQT1JUX1BDTEtNICAgICAgICAg ICAgICAgMHgyMDE4Cj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9HT1VUX0JMS19NSVNDX1VJRF9B RF9BUEJfUFVGX0lQQ0xLUE9SVF9QQ0xLTSAgICAgICAgICAgICAgIDB4MjAxYwo+ID4gKyNkZWZp bmUgQ0xLX0NPTl9HQVRfR09VVF9CTEtfTUlTQ19VSURfRElUX0lQQ0xLUE9SVF9JQ0xLTDJBICAg ICAgICAgICAgICAgICAgICAweDIwMjAKPiA+ICsjZGVmaW5lIENMS19DT05fR0FUX0dPVVRfQkxL X01JU0NfVUlEX0RfVFpQQ19NSVNDX0lQQ0xLUE9SVF9QQ0xLICAgICAgICAgICAgICAgMHgyMDI0 Cj4gPiArI2RlZmluZSBDTEtfQ09OX0dBVF9HT1VUX0JMS19NSVNDX1VJRF9HSUNfSVBDTEtQT1JU X0dJQ0NMSyAgICAgICAgICAgICAgICAgICAgIDB4MjAyOAo+ID4gKyNkZWZpbmUgQ0xLX0NPTl9H QVRfR09VVF9CTEtfTUlTQ19VSURfR1BDX01JU0NfSVBDTEtQT1JUX1BDTEsgICAgICAgICAgICAg ICAgICAweDIwMmMKCjxjdXQ+Cgo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kaXZf Y2xvY2sgbWlzY19kaXZfY2xrc1tdIF9faW5pdGNvbnN0ID0gewo+ID4gKyAgICAgICBESVYoQ0xL X0RPVVRfTUlTQ19CVVNQLCAiZG91dF9taXNjX2J1c3AiLCAibW91dF9taXNjX2J1c191c2VyIiwK PiA+ICsgICAgICAgICAgIENMS19DT05fRElWX0RJVl9DTEtfTUlTQ19CVVNQLCAwLCAzKSwKPiA+ ICsgICAgICAgRElWKENMS19ET1VUX01JU0NfR0lDLCAiZG91dF9taXNjX2dpYyIsICJtb3V0X21p c2NfYnVzX3VzZXIiLAo+ID4gKyAgICAgICAgICAgQ0xLX0NPTl9ESVZfRElWX0NMS19NSVNDX0dJ QywgMCwgMyksCj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdf Z2F0ZV9jbG9jayBtaXNjX2dhdGVfY2xrc1tdIF9faW5pdGNvbnN0ID0gewo+ID4gKyAgICAgICBH QVRFKENMS19HT1VUX01JU0NfTUlTQ19DTVVfTUlTQ19JUENMS1BPUlRfUENMSywKPiA+ICsgICAg ICAgICAgICAiZ291dF9taXNjX2lwY2xrcG9ydF9wY2xrIiwgImRvdXRfbWlzY19idXNwIiwKPgo+ IFNvIGlmIHlvdSB3YW50IHRvIGJlIGNvbnNpc3RlbnQsIGl0IHNob3VsZCBiZQo+ICJnb3V0X21p c2NfbWlzY19taXNjXy4uLi4iLiBNeSBwb2ludCBpcyAtLSBTYW1zdW5nJ3MgbmFtaW5nIGluIFRS TSBpcwo+IGluc2FuZS4gVGhleSB3YW50ZWQgdG8gc3RpY2sgdG8gc29tZSB2ZXJ5IGRldGFpbGVk IGFuZCB1bmlmaWVkIG5hbWluZwo+IHNjaGVtYSAob3IganVzdCBnZW5lcmF0ZWQgdGhvc2UgbmFt ZXMgZnJvbSBzb21lIGludGVybmFsIGNsb2NrIHRyZWUKPiBkYXRhKSwgZ3JhbnRlZC4gQnV0IEkn bSBqdXN0IG5vdCBzdXJlIGlmIGl0J3MgdGhlIGJlc3QgaWRlYSB0byBmb2xsb3cKPiBpdCBpbiBk cml2ZXIncyBjb2RlLgoKV2l0aCB0aGUgbmFtaW5nIGRlc2NyaWJlZCBhYm92ZSBpdCBiZWNvbWVz CiJnb3V0X21pc2NfbWlzY19jbXVfbWlzY19wY2xrIi4gTm90IGlkZWFsLCBhbmQgdGhpcyBpcyBv bmUgb2YgdGhlCmNsb2NrcyBJIG1lbnRpb25lZCBhYm92ZS4gVGhlIG92ZXJ3aGVsbWluZyBtYWpv cml0eSBvZiB0aGUgY2xvY2sgbmFtZXMKZG9uJ3QgaGF2ZSBzdWNoIHJlcGV0aXRpb24gaW4gdGhl aXIgbmFtZSB0aG91Z2guIElmIHdlIHN0YXJ0IGRvaW5nCmN1c3RvbSBtYW5nbGluZyBvbiBzcGVj aWZpYyBjbG9ja3MgaXQgaXMgZ29pbmcgdG8gYmVjb21lIGEgbmlnaHRtYXJlCnRvIHRyYWNrLiBB cyBJIG1lbnRpb25lZCBwcmV2aW91c2x5IHRoZXJlIGFyZSB0aG91c2FuZHMgb2YgY2xvY2tzIGlu CnRoZSBTb0MuIE1vc3QgdXBzdHJlYW0gcGxhdGZvcm1zIG9ubHkgc2VlbSB0byBpbXBsZW1lbnQg YSBzbWFsbCBzdWJzZXQKb2YgY2xvY2tzIGluIGVhY2ggQ01VIHdoaWNoIG1heWJlIG1ha2VzIGl0 IGVhc2llciB0byB0cmFjay4gT3VyIGdvYWwKdGhvdWdoIGlzIHRvIGhhdmUgZnVsbCBmdW5jdGlv bmFsaXR5IHVwc3RyZWFtLgoKPgo+ID4gKyAgICAgICAgICAgIENMS19DT05fR0FUX0NMS19CTEtf TUlTQ19VSURfTUlTQ19DTVVfTUlTQ19JUENMS1BPUlRfUENMSywKPiA+ICsgICAgICAgICAgICAy MSwgMCwgMCksCj4gPiArICAgICAgIEdBVEUoQ0xLX0dPVVRfTUlTQ19PVFBfQ09OX0JJUkFfSVBD TEtQT1JUX0lfT1NDQ0xLLAo+ID4gKyAgICAgICAgICAgICJnb3V0X21pc2Nfb3RwX2Nvbl9iaXJh X2lwY2xrcG9ydF9pX29zY2NsayIsICJkb3V0X21pc2NfYnVzcCIsCj4gPiArICAgICAgICAgICAg Q0xLX0NPTl9HQVRfQ0xLX0JMS19NSVNDX1VJRF9PVFBfQ09OX0JJUkFfSVBDTEtQT1JUX0lfT1ND Q0xLLAo+ID4gKyAgICAgICAgICAgIDIxLCAwLCAwKSwKPiA+ICsgICAgICAgR0FURShDTEtfR09V VF9NSVNDX09UUF9DT05fQklTUl9JUENMS1BPUlRfSV9PU0NDTEssCj4gPiArICAgICAgICAgICAg ImdvdXRfbWlzY19vdHBfY29uX2Jpc3JfaXBjbGtwb3J0X2lfb3NjY2xrIiwgImRvdXRfbWlzY19i dXNwIiwKPiA+ICsgICAgICAgICAgICBDTEtfQ09OX0dBVF9DTEtfQkxLX01JU0NfVUlEX09UUF9D T05fQklTUl9JUENMS1BPUlRfSV9PU0NDTEssCj4gPiArICAgICAgICAgICAgMjEsIDAsIDApLAo8 c25pcD4KPiA+ICsgICAgICAgR0FURShDTEtfR09VVF9NSVNDX1JUSUNfSVBDTEtQT1JUX0lfQUNM SywKPiA+ICsgICAgICAgICAgICAiZ291dF9taXNjX3J0aWNfaXBjbGtwb3J0X2lfYWNsayIsICJk b3V0X21pc2NfYnVzcCIsCj4gPiArICAgICAgICAgICAgQ0xLX0NPTl9HQVRfR09VVF9CTEtfTUlT Q19VSURfUlRJQ19JUENMS1BPUlRfSV9BQ0xLLAo+ID4gKyAgICAgICAgICAgIDIxLCAwLCAwKSwK PiA+ICsgICAgICAgR0FURShDTEtfR09VVF9NSVNDX1JUSUNfSVBDTEtQT1JUX0lfUENMSywgImdv dXRfbWlzY19ydGljX2lwY2xrcG9ydF9pX3BjbGsiLAo+Cj4gODAgY2hhcmFjdGVycyBwZXIgbGlu ZSBwbGVhc2UuCgpXaWxsIGZpeAoKcmVnYXJkcywKClBldGVyCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlz dApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==