From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f177.google.com (mail-lj1-f177.google.com [209.85.208.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B0D4132C38; Tue, 2 Apr 2024 16:40:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.177 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712076025; cv=none; b=lTds23ClhCHuLEdUQZsV8821V6rOdwCH5ohU+gFj1avTV3osUbgK04wByA3yJptDMZrQnQ+c0G41UhtdolwMuTuwGFhKmDxbm1jNM1W/CP+6MnIGkytj/pwRsNqOC9ZJJ21WtWJn5UitlVbbE/hpEX4IBgAPLT2XC8PXiahiCJk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712076025; c=relaxed/simple; bh=bPzZAjPgb7YR2f8OiRfv2mTtF4c6m/IEuL2l7gAXHyY=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=MLse4Utm7lGjjwpvO5GnA825gFy6DRR/DFdiYhnRzR2xesitiJmdxT3kS5aX44A8p4bFXh/PtNhkDCFox6c6jAf0LuzYRut/p3Vw7q1icfisRGbigOUySvloyvfAoCst4Ss8HHJS7b1GPiJjHqodErIp+HAJiszw1Bv3oJVrq/M= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=MNZdWuPr; arc=none smtp.client-ip=209.85.208.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MNZdWuPr" Received: by mail-lj1-f177.google.com with SMTP id 38308e7fff4ca-2d485886545so89305111fa.2; Tue, 02 Apr 2024 09:40:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712076021; x=1712680821; 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=xeglKPkGssu647V9+AWVaK1QLXwREHb2PyTHNRkcVfU=; b=MNZdWuPr2zyoun6926avXxjtEHcQG1a/NRbVOYLjlULP8KNvjLBHBN1EFBxTVW802N PqdxbOLOQNC9wl3xBkpzSwOqdmposWUNoc/CBhN/NI30kP0OhMe/E8Ft06XE2qYlHDkF B4eer0yLTPQD7wCV5+GMSgd+fUpGCw4jKfT0K6VXfyFKWz8sRbErCR4locvwQYVfPWGe vqwjqcCpI3lrIct2Nv4Kts914Yc8rsdpZ7CvznoOXnBUTapDCprsl0BzHXDgkDfeAIaJ 3ID+8YMfcfqiZ/RHB0k3W67jPGFOaCZSSuwzsHNhbdQAEAKR3VBmcuZkmPePQU9Ni+8l 0Rbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712076021; x=1712680821; 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=xeglKPkGssu647V9+AWVaK1QLXwREHb2PyTHNRkcVfU=; b=YZ2wT40601v/MnCGzFesWqCiJCcGBtr5urZMkeJpLQVcj3W8/zWY1k9zyYQzDTn2Sb USERhKuzL21fne/RC8ADYxv2bjGncgYCtSxtTIhSeWaemH73AXAOMYcn4kmSHxXW9exO jwfXbRsOuqEkKFwZ3g+u4aKZXUlNosFyuw5C77qZWWXSmyjYsVov5N38NWU8m40f006I KD17HkOKXWBozXYGNs/y78Hsw3nvCd0L1nm+QuhGSs3QtaWD4BQ6qPlCJaYAYuvidlMH T2w9X2rCDofuwNxWIz6H2+4m7+6XwZrEk76qm7SKeNVT/xZUJYwMYP83WmDBPaYd/Mi/ WMcA== X-Forwarded-Encrypted: i=1; AJvYcCW6zCV6TViiScf94WeuqpzgnFkhzZW5acRK2z7u9i+2q4M15U97+a/0KUhSsDXjfD1PTvkoeW6hJI/a2ZobKanTgLaW+S4qQ6LNJf9bnZ5fwuAmo4+V7zfOSHXWlmatjpVq1wA29GucZx1UCXLxh9vP5XXyeO+5kMwJSsSld+Pmibnntu8= X-Gm-Message-State: AOJu0YzOBTsv3IBODKvvL9kHpdhDoZKJUeFdcVA5PVfTA3CBdNrfvL9I Llo/cVp9SSGvO3bJaShSdH5Wp8/LoT6GfcuF+MFK07GHNEwveBwW7nb9d9tJ1ACgrxtmquFBWBo KRSh/uWEBc67SgphngmjO+DLJ++4= X-Google-Smtp-Source: AGHT+IGl+uNohAmGp7yty1Y/r35Wex0MlzIlU/dh6fUEpfO9UkK1JTZF2iD3j6JHceSsWZiSgmFGxtk1zREniCvtrzM= X-Received: by 2002:a2e:a168:0:b0:2d8:d91:d77a with SMTP id u8-20020a2ea168000000b002d80d91d77amr2094457ljl.5.1712076020719; Tue, 02 Apr 2024 09:40:20 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-gpio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240323-pinctrl-scmi-v6-0-a895243257c0@nxp.com> <20240323-pinctrl-scmi-v6-3-a895243257c0@nxp.com> In-Reply-To: From: Andy Shevchenko Date: Tue, 2 Apr 2024 19:39:44 +0300 Message-ID: Subject: Re: [PATCH v6 3/4] firmware: arm_scmi: Add SCMI v3.2 pincontrol protocol basic support To: Cristian Marussi Cc: Peng Fan , "Peng Fan (OSS)" , Sudeep Holla , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Dan Carpenter , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-gpio@vger.kernel.org" , Oleksii Moisieiev Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Apr 2, 2024 at 6:58=E2=80=AFPM Cristian Marussi wrote: > On Tue, Apr 02, 2024 at 04:06:06PM +0300, Andy Shevchenko wrote: > > On Tue, Apr 2, 2024 at 10:48=E2=80=AFAM Cristian Marussi > > wrote: > > > On Sun, Mar 31, 2024 at 01:44:28PM +0000, Peng Fan wrote: > > > > > Sat, Mar 23, 2024 at 08:15:16PM +0800, Peng Fan (OSS) kirjoitti: ... > > > > > > +#include > > > > > > +#include > > > > > > +#include > > > > > > > > > > This is semi-random list of headers. Please, follow IWYU principl= e (include > > > > > what you use). There are a lot of inclusions I see missing (just = in the context of > > > > > this page I see bits.h, types.h, and asm/byteorder.h). > > > > > > > > Is there any documentation about this requirement? > > > > Some headers are already included by others. > > > > The documentation here is called "a common sense". > > The C language is built like this and we expect that nobody will > > invest into the dependency hell that we have already, that's why IWYU > > principle, please follow it. > > Yes, but given that we have a growing number of SCMI protocols there is a > common local protocols.h header to group all includes needed by any > protocols: the idea behind this (and the devm_ saga down below) was to ea= se > development of protocols, since there are lots of them and growing, given > the SCMI spec is extensible. Yes, and what you are effectively suggesting is: "Technical debt? Oh, fine, we do not care!" This is not good. I'm in a long term of cleaning up the dependency hell in the kernel (my main focus is kernel.h for now) and I am talking from my experience. I do not like what people are doing in 95% of the code, that's why I really want to stop the bad practices as soon as possible. Last to add, but not least is that your code may be used as an example for others, hence we really have to do our best in order to avoid bad design, practices, and cargo cults. If this requires more refactoring of the existing code, then do it sooner than later. ... > > > Andy made (mostly) the same remarks on this same patch ~1-year ago on > > > this same patch while it was posted by Oleksii. > > > > > > And I told that time that most of the remarks around devm_ usage were > > > wrong due to how the SCMI core handles protocol initialization (using= a > > > devres group transparently). > > > > > > This is what I answered that time. > > > > > > https://lore.kernel.org/linux-arm-kernel/ZJ78hBcjAhiU+ZBO@e120937-lin= /#t > > > > > > I wont repeat myself, but, in a nutshell the memory allocation like i= t > > > is now is fine: a bit happens via devm_ at protocol initialization, t= he > > > other is doe via explicit kmalloc at runtime and freed via kfree at > > > remove time (if needed...i.e. checking the present flag of some struc= ts) > > > > This sounds like a mess. devm_ is expected to be used only for the > > ->probe() stage, otherwise you may consider cleanup.h (__free() macro) > > to have automatic free at the paths where memory is not needed. > > Indeed, this protocol_init code is called by the SCMI core once for all w= hen > an SCMI driver tries at first to use this specific protocol by 'getting' = its > protocol_ops, so it is indeed called inside the probe chain of the driver= : > at this point you *can* decide to use devres to allocate memory and be as= sured > that if the init fails, or when the driver cease to use this protocol (ca= lling > its remove()) and no other driver is using it, all the stuff that have be= en > allocated related to this protocol will be released by the core for you. > (using an internal devres group) > > Without this you should handle manually all the deallocation manually on > the init error-paths AND also provide all the cleanup explicitly when > the protocol is no more used by any driver (multiple users of the same > protocol instance are possible)...for all protocols. Yes. Is it a problem? > This is/was handy since, till now, all the SCMI querying and resources > allocation happened anyway all at once at init time... > > ...the mess, as you kindly called it, derives from the fact that this spe= cific > protocol is the first and only one that does NOT allocate all that it nee= ds > during the initialization (to minimize needless allocs for a lot of possi= bly > unused resources) and this lazy-initialization phase, done after init at = runtime, > must be handled manually since it cannot be managed by the devres group t= hat is > open/clsoed around init by the SCMI core. > > I dont like particularly this split allocation but it has a reason and an= y > other solution seems more messy to me at the moment. > > And I dont feel like changing all the SCMI protocol initialziation core c= ode > (that address a lot more under the hood) is a desirable solution to addre= ss a > non-existent problem really. > > > And the function naming doesn't suggest that you have a probe-remove > > pair. Moreover, if the init-deinit part is called in the probe-remove, > > the devm_ must not be mixed with non-devm ones, as it breaks the order > > and leads to subtle mistakes. > > Initialization order is enforced by SCMI core like this: > > @driver_probe->get_protocol_ops() > @core/get_protocol_ops > -> devres_group_open() > -> protocol_init->devm_*() > -> devres_group_close() > -> driver_probing > > @runtime optional explicit_lazy_kmallocs inside the protocol > > @driver_remove->put_protocol_ops() > @core/put_protocol_ops() > -> protocol_denit->optional_explicit_kfree_of_the_above > -> devres_group_release() > -> driver_removing > > ... dont think there's an ordering problem. The mess with devm_ vs. non-devm is quite easy to achieve. You are probably out of the control of what the protocol driver wants to do in the init. Is the usage of devm (which APIs and in which order can be used) WRT SCMI documented somewhere? Misuse of devm is a common issue, I'm not surprised it will hit your subsystem one day with such an approach. > ...note that the ph->dev provided in the protocol_init and used by devm_ > is NOT the dev of the SCMI driver probe/remove that uses the get_protocol= _ops, > it is an internal SCMI device associated with the core SCMI stack probing= and > allocations, within which a devres group for the specific protocol is cre= ated > when that specific protocol is initialized...protocols are not fully > fledged drivers are just bits of the SCMI stack that are initialized when= needed > (and possibly also loaded when needed for vendor protocols) and > de-initialzed when no more SCMI driver users exist for that protocol. P.S. I guess from now on it's your call, but this code and in case other drivers use similar, is badly written. I hope some documentation exists to at least justify all this mess and explaining why there no and (what's really important) will never be a problem. --=20 With Best Regards, Andy Shevchenko 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 C3767C6FD1F for ; Tue, 2 Apr 2024 16:40:35 +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=RLyN/fXTF3C5pFjpgT2Gflz9tIridS7gO4suFKLYNmo=; b=y1SmJg7+t0y19R SaLBbnWFFUeNZsacZfCGldEflJLxvvn/2Xhh5QEcU8VMVAq0NkPblV+PDNmmaWSwbnZ8QXvdFCOJ4 o6NiXKoCs1DINcClKwkgxx8XH7fdf2865SU0439rHTIJ0atIitmFFm0q0wxq/Ype1jYOVDfkQ08jN rd5PAt3qRKI+t0lDqqYSbX6ziwpP5538+UYuCgPMnIPZgjLzUNTs9nBUk3FdHXZvc1B9j17CtUvo+ pm2rXDXsjsT8L7QGE97/0+BxpVys7KD/qQmUjtJRx33CpbY+dFJMXg9kAuyWaSx+jz3ZlCrCdS8zX Z11VtVBZES1rLZMkvu8Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rrhBS-0000000C4gP-2uzc; Tue, 02 Apr 2024 16:40:26 +0000 Received: from mail-lf1-x12d.google.com ([2a00:1450:4864:20::12d]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rrhBP-0000000C4dO-00mD for linux-arm-kernel@lists.infradead.org; Tue, 02 Apr 2024 16:40:25 +0000 Received: by mail-lf1-x12d.google.com with SMTP id 2adb3069b0e04-51381021af1so7335399e87.0 for ; Tue, 02 Apr 2024 09:40:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712076021; x=1712680821; 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=xeglKPkGssu647V9+AWVaK1QLXwREHb2PyTHNRkcVfU=; b=IYZxldWodEOUc7IehjVXFuAKYbyGRToBmJ/A9XyWw0dCPHYo3pKWBkH9JedLp1VWgQ ilIvHgaqd7jXkL8k4j+m6A/nY0vWRydKsueuY8DFUdHn7n8A8GpeL8BXh0DhXY+FK+9J 6QaJBDfecuykQvar9UOXDKuj4ATwo+OMPbYiufygbbxEtx05lWqWOBgU/s8jV8FtgtHg tk02ldSTGcxsSauCQx7hL0hmsWbq+lcrIe8IqQHgnk5c2KdamfDRCbpndZTSOAbeXn0x chM0i73Zqm5Gv2x0OO+4TFbz40BaZXW/VH+crBH2RJ4Dam+kcu1kopTv7A4Q5KYQdaZw x76A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712076021; x=1712680821; 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=xeglKPkGssu647V9+AWVaK1QLXwREHb2PyTHNRkcVfU=; b=P3QDYqe0PVuzglKHpR0ECatO4KWp5zmFbvkIGtFHoUpf6ZS+zLD3BqCSmIZOyKzgxP /KH+3Eb8MgSEMT7DK667GvFnoJLomUM7VuXzIZVqsGhE2bSXTxva6exkYzCHRm4Db1Tf pqAJI+gL41uGItbVT94fM4HexGht7TqUgvAembN32WU6E1hF0wsAfUl26dDsFM5EmDh7 Mh2anW1LbIiH1p/0wyn4lRv2Nshh+bsWVfMoKXAwVAvYxyfrpRN0uC/SeFLUcekgYg0L +5tVC9Xuv6myBTQwMBvinjoH9EKtCPi59tZm7POATAaH64FhFZr/cCfDQ5W1NtzDJy7b WMIQ== X-Forwarded-Encrypted: i=1; AJvYcCXoDNPxVuDKAgzHVJhgG4DAIR6kqQDxwsqSpeTJLITKWTZh+nvxuAdeACRePBApGbgVIdARo8gasPCnLsgx5PP9f5yEFmJCjcWX4SUVEHs38aSB/6Q= X-Gm-Message-State: AOJu0YxgDtxvXWXLKEGkQ+oaA7QbaW/7emtzJUPyMVN2p+Y47Tkl9cx0 tInIJean3xpOx5pPMGri/KdfTJjlU36H5sGPvK4fZTuG6Dg8WYOePBaHDC3Cc0+YfPNenq5ccpx wwJxcWAS2eb3vFHiaqjN4YBJ4OZw= X-Google-Smtp-Source: AGHT+IGl+uNohAmGp7yty1Y/r35Wex0MlzIlU/dh6fUEpfO9UkK1JTZF2iD3j6JHceSsWZiSgmFGxtk1zREniCvtrzM= X-Received: by 2002:a2e:a168:0:b0:2d8:d91:d77a with SMTP id u8-20020a2ea168000000b002d80d91d77amr2094457ljl.5.1712076020719; Tue, 02 Apr 2024 09:40:20 -0700 (PDT) MIME-Version: 1.0 References: <20240323-pinctrl-scmi-v6-0-a895243257c0@nxp.com> <20240323-pinctrl-scmi-v6-3-a895243257c0@nxp.com> In-Reply-To: From: Andy Shevchenko Date: Tue, 2 Apr 2024 19:39:44 +0300 Message-ID: Subject: Re: [PATCH v6 3/4] firmware: arm_scmi: Add SCMI v3.2 pincontrol protocol basic support To: Cristian Marussi Cc: Peng Fan , "Peng Fan (OSS)" , Sudeep Holla , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Dan Carpenter , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-gpio@vger.kernel.org" , Oleksii Moisieiev X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240402_094023_230568_B7B704F0 X-CRM114-Status: GOOD ( 50.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 T24gVHVlLCBBcHIgMiwgMjAyNCBhdCA2OjU44oCvUE0gQ3Jpc3RpYW4gTWFydXNzaQo8Y3Jpc3Rp YW4ubWFydXNzaUBhcm0uY29tPiB3cm90ZToKPiBPbiBUdWUsIEFwciAwMiwgMjAyNCBhdCAwNDow NjowNlBNICswMzAwLCBBbmR5IFNoZXZjaGVua28gd3JvdGU6Cj4gPiBPbiBUdWUsIEFwciAyLCAy MDI0IGF0IDEwOjQ44oCvQU0gQ3Jpc3RpYW4gTWFydXNzaQo+ID4gPGNyaXN0aWFuLm1hcnVzc2lA YXJtLmNvbT4gd3JvdGU6Cj4gPiA+IE9uIFN1biwgTWFyIDMxLCAyMDI0IGF0IDAxOjQ0OjI4UE0g KzAwMDAsIFBlbmcgRmFuIHdyb3RlOgo+ID4gPiA+ID4gU2F0LCBNYXIgMjMsIDIwMjQgYXQgMDg6 MTU6MTZQTSArMDgwMCwgUGVuZyBGYW4gKE9TUykga2lyam9pdHRpOgoKLi4uCgo+ID4gPiA+ID4g PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ID4gPiA+ID4gPiArI2luY2x1ZGUgPGxpbnV4 L3NjbWlfcHJvdG9jb2wuaD4KPiA+ID4gPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4g PiA+ID4gPgo+ID4gPiA+ID4gVGhpcyBpcyBzZW1pLXJhbmRvbSBsaXN0IG9mIGhlYWRlcnMuIFBs ZWFzZSwgZm9sbG93IElXWVUgcHJpbmNpcGxlIChpbmNsdWRlCj4gPiA+ID4gPiB3aGF0IHlvdSB1 c2UpLiBUaGVyZSBhcmUgYSBsb3Qgb2YgaW5jbHVzaW9ucyBJIHNlZSBtaXNzaW5nIChqdXN0IGlu IHRoZSBjb250ZXh0IG9mCj4gPiA+ID4gPiB0aGlzIHBhZ2UgSSBzZWUgYml0cy5oLCB0eXBlcy5o LCBhbmQgIGFzbS9ieXRlb3JkZXIuaCkuCj4gPiA+ID4KPiA+ID4gPiBJcyB0aGVyZSBhbnkgZG9j dW1lbnRhdGlvbiBhYm91dCB0aGlzIHJlcXVpcmVtZW50Pwo+ID4gPiA+IFNvbWUgaGVhZGVycyBh cmUgYWxyZWFkeSBpbmNsdWRlZCBieSBvdGhlcnMuCj4gPgo+ID4gVGhlIGRvY3VtZW50YXRpb24g aGVyZSBpcyBjYWxsZWQgImEgY29tbW9uIHNlbnNlIi4KPiA+IFRoZSBDIGxhbmd1YWdlIGlzIGJ1 aWx0IGxpa2UgdGhpcyBhbmQgd2UgZXhwZWN0IHRoYXQgbm9ib2R5IHdpbGwKPiA+IGludmVzdCBp bnRvIHRoZSBkZXBlbmRlbmN5IGhlbGwgdGhhdCB3ZSBoYXZlIGFscmVhZHksIHRoYXQncyB3aHkg SVdZVQo+ID4gcHJpbmNpcGxlLCBwbGVhc2UgZm9sbG93IGl0Lgo+Cj4gWWVzLCBidXQgZ2l2ZW4g dGhhdCB3ZSBoYXZlIGEgZ3Jvd2luZyBudW1iZXIgb2YgU0NNSSBwcm90b2NvbHMgdGhlcmUgaXMg YQo+IGNvbW1vbiBsb2NhbCBwcm90b2NvbHMuaCBoZWFkZXIgdG8gZ3JvdXAgYWxsIGluY2x1ZGVz IG5lZWRlZCBieSBhbnkKPiBwcm90b2NvbHM6IHRoZSBpZGVhIGJlaGluZCB0aGlzIChhbmQgdGhl IGRldm1fIHNhZ2EgZG93biBiZWxvdykgd2FzIHRvIGVhc2UKPiBkZXZlbG9wbWVudCBvZiBwcm90 b2NvbHMsIHNpbmNlIHRoZXJlIGFyZSBsb3RzIG9mIHRoZW0gYW5kIGdyb3dpbmcsIGdpdmVuCj4g dGhlIFNDTUkgc3BlYyBpcyBleHRlbnNpYmxlLgoKWWVzLCBhbmQgd2hhdCB5b3UgYXJlIGVmZmVj dGl2ZWx5IHN1Z2dlc3RpbmcgaXM6ICJUZWNobmljYWwgZGVidD8gT2gsCmZpbmUsIHdlIGRvIG5v dCBjYXJlISIgVGhpcyBpcyBub3QgZ29vZC4gSSdtIGluIGEgbG9uZyB0ZXJtIG9mCmNsZWFuaW5n IHVwIHRoZSBkZXBlbmRlbmN5IGhlbGwgaW4gdGhlIGtlcm5lbCAobXkgbWFpbiBmb2N1cyBpcwpr ZXJuZWwuaCBmb3Igbm93KSBhbmQgSSBhbSB0YWxraW5nIGZyb20gbXkgZXhwZXJpZW5jZS4gSSBk byBub3QgbGlrZQp3aGF0IHBlb3BsZSBhcmUgZG9pbmcgaW4gOTUlIG9mIHRoZSBjb2RlLCB0aGF0 J3Mgd2h5IEkgcmVhbGx5IHdhbnQgdG8Kc3RvcCB0aGUgYmFkIHByYWN0aWNlcyBhcyBzb29uIGFz IHBvc3NpYmxlLgoKTGFzdCB0byBhZGQsIGJ1dCBub3QgbGVhc3QgaXMgdGhhdCB5b3VyIGNvZGUg bWF5IGJlIHVzZWQgYXMgYW4gZXhhbXBsZQpmb3Igb3RoZXJzLCBoZW5jZSB3ZSByZWFsbHkgaGF2 ZSB0byBkbyBvdXIgYmVzdCBpbiBvcmRlciB0byBhdm9pZCBiYWQKZGVzaWduLCBwcmFjdGljZXMs IGFuZCBjYXJnbyBjdWx0cy4gSWYgdGhpcyByZXF1aXJlcyBtb3JlIHJlZmFjdG9yaW5nCm9mIHRo ZSBleGlzdGluZyBjb2RlLCB0aGVuIGRvIGl0IHNvb25lciB0aGFuIGxhdGVyLgoKLi4uCgo+ID4g PiBBbmR5IG1hZGUgKG1vc3RseSkgdGhlIHNhbWUgcmVtYXJrcyBvbiB0aGlzIHNhbWUgcGF0Y2gg fjEteWVhciBhZ28gb24KPiA+ID4gdGhpcyBzYW1lIHBhdGNoIHdoaWxlIGl0IHdhcyBwb3N0ZWQg YnkgT2xla3NpaS4KPiA+ID4KPiA+ID4gQW5kIEkgdG9sZCB0aGF0IHRpbWUgdGhhdCBtb3N0IG9m IHRoZSByZW1hcmtzIGFyb3VuZCBkZXZtXyB1c2FnZSB3ZXJlCj4gPiA+IHdyb25nIGR1ZSB0byBo b3cgdGhlIFNDTUkgY29yZSBoYW5kbGVzIHByb3RvY29sIGluaXRpYWxpemF0aW9uICh1c2luZyBh Cj4gPiA+IGRldnJlcyBncm91cCB0cmFuc3BhcmVudGx5KS4KPiA+ID4KPiA+ID4gVGhpcyBpcyB3 aGF0IEkgYW5zd2VyZWQgdGhhdCB0aW1lLgo+ID4gPgo+ID4gPiBodHRwczovL2xvcmUua2VybmVs Lm9yZy9saW51eC1hcm0ta2VybmVsL1pKNzhoQmNqQWhpVStaQk9AZTEyMDkzNy1saW4vI3QKPiA+ ID4KPiA+ID4gSSB3b250IHJlcGVhdCBteXNlbGYsIGJ1dCwgaW4gYSBudXRzaGVsbCB0aGUgbWVt b3J5IGFsbG9jYXRpb24gbGlrZSBpdAo+ID4gPiBpcyBub3cgaXMgZmluZTogYSBiaXQgaGFwcGVu cyB2aWEgZGV2bV8gYXQgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24sIHRoZQo+ID4gPiBvdGhlciBp cyBkb2UgdmlhIGV4cGxpY2l0IGttYWxsb2MgYXQgcnVudGltZSBhbmQgZnJlZWQgdmlhIGtmcmVl IGF0Cj4gPiA+IHJlbW92ZSB0aW1lIChpZiBuZWVkZWQuLi5pLmUuIGNoZWNraW5nIHRoZSBwcmVz ZW50IGZsYWcgb2Ygc29tZSBzdHJ1Y3RzKQo+ID4KPiA+IFRoaXMgc291bmRzIGxpa2UgYSBtZXNz LiBkZXZtXyBpcyBleHBlY3RlZCB0byBiZSB1c2VkIG9ubHkgZm9yIHRoZQo+ID4gLT5wcm9iZSgp IHN0YWdlLCBvdGhlcndpc2UgeW91IG1heSBjb25zaWRlciBjbGVhbnVwLmggKF9fZnJlZSgpIG1h Y3JvKQo+ID4gdG8gaGF2ZSBhdXRvbWF0aWMgZnJlZSBhdCB0aGUgcGF0aHMgd2hlcmUgbWVtb3J5 IGlzIG5vdCBuZWVkZWQuCj4KPiBJbmRlZWQsIHRoaXMgcHJvdG9jb2xfaW5pdCBjb2RlIGlzIGNh bGxlZCBieSB0aGUgU0NNSSBjb3JlIG9uY2UgZm9yIGFsbCB3aGVuCj4gYW4gU0NNSSBkcml2ZXIg dHJpZXMgYXQgZmlyc3QgdG8gdXNlIHRoaXMgc3BlY2lmaWMgcHJvdG9jb2wgYnkgJ2dldHRpbmcn IGl0cwo+IHByb3RvY29sX29wcywgc28gaXQgaXMgaW5kZWVkIGNhbGxlZCBpbnNpZGUgdGhlIHBy b2JlIGNoYWluIG9mIHRoZSBkcml2ZXI6Cj4gYXQgdGhpcyBwb2ludCB5b3UgKmNhbiogZGVjaWRl IHRvIHVzZSBkZXZyZXMgdG8gYWxsb2NhdGUgbWVtb3J5IGFuZCBiZSBhc3N1cmVkCj4gdGhhdCBp ZiB0aGUgaW5pdCBmYWlscywgb3Igd2hlbiB0aGUgZHJpdmVyIGNlYXNlIHRvIHVzZSB0aGlzIHBy b3RvY29sIChjYWxsaW5nCj4gaXRzIHJlbW92ZSgpKSBhbmQgbm8gb3RoZXIgZHJpdmVyIGlzIHVz aW5nIGl0LCBhbGwgdGhlIHN0dWZmIHRoYXQgaGF2ZSBiZWVuCj4gYWxsb2NhdGVkIHJlbGF0ZWQg dG8gdGhpcyBwcm90b2NvbCB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb3JlIGZvciB5b3UuCj4g KHVzaW5nIGFuIGludGVybmFsIGRldnJlcyBncm91cCkKPgo+IFdpdGhvdXQgdGhpcyB5b3Ugc2hv dWxkIGhhbmRsZSBtYW51YWxseSBhbGwgdGhlIGRlYWxsb2NhdGlvbiBtYW51YWxseSBvbgo+IHRo ZSBpbml0IGVycm9yLXBhdGhzIEFORCBhbHNvIHByb3ZpZGUgYWxsIHRoZSBjbGVhbnVwIGV4cGxp Y2l0bHkgd2hlbgo+IHRoZSBwcm90b2NvbCBpcyBubyBtb3JlIHVzZWQgYnkgYW55IGRyaXZlciAo bXVsdGlwbGUgdXNlcnMgb2YgdGhlIHNhbWUKPiBwcm90b2NvbCBpbnN0YW5jZSBhcmUgcG9zc2li bGUpLi4uZm9yIGFsbCBwcm90b2NvbHMuCgpZZXMuIElzIGl0IGEgcHJvYmxlbT8KCj4gVGhpcyBp cy93YXMgaGFuZHkgc2luY2UsIHRpbGwgbm93LCBhbGwgdGhlIFNDTUkgcXVlcnlpbmcgYW5kIHJl c291cmNlcwo+IGFsbG9jYXRpb24gaGFwcGVuZWQgYW55d2F5IGFsbCBhdCBvbmNlIGF0IGluaXQg dGltZS4uLgo+Cj4gLi4udGhlIG1lc3MsIGFzIHlvdSBraW5kbHkgY2FsbGVkIGl0LCBkZXJpdmVz IGZyb20gdGhlIGZhY3QgdGhhdCB0aGlzIHNwZWNpZmljCj4gcHJvdG9jb2wgaXMgdGhlIGZpcnN0 IGFuZCBvbmx5IG9uZSB0aGF0IGRvZXMgTk9UIGFsbG9jYXRlIGFsbCB0aGF0IGl0IG5lZWRzCj4g ZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiAodG8gbWluaW1pemUgbmVlZGxlc3MgYWxsb2NzIGZv ciBhIGxvdCBvZiBwb3NzaWJseQo+IHVudXNlZCByZXNvdXJjZXMpIGFuZCB0aGlzIGxhenktaW5p dGlhbGl6YXRpb24gcGhhc2UsIGRvbmUgYWZ0ZXIgaW5pdCBhdCBydW50aW1lLAo+IG11c3QgYmUg aGFuZGxlZCBtYW51YWxseSBzaW5jZSBpdCBjYW5ub3QgYmUgbWFuYWdlZCBieSB0aGUgZGV2cmVz IGdyb3VwIHRoYXQgaXMKPiBvcGVuL2Nsc29lZCBhcm91bmQgaW5pdCBieSB0aGUgU0NNSSBjb3Jl Lgo+Cj4gSSBkb250IGxpa2UgcGFydGljdWxhcmx5IHRoaXMgc3BsaXQgYWxsb2NhdGlvbiBidXQg aXQgaGFzIGEgcmVhc29uIGFuZCBhbnkKPiBvdGhlciBzb2x1dGlvbiBzZWVtcyBtb3JlIG1lc3N5 IHRvIG1lIGF0IHRoZSBtb21lbnQuCj4KPiBBbmQgSSBkb250IGZlZWwgbGlrZSBjaGFuZ2luZyBh bGwgdGhlIFNDTUkgcHJvdG9jb2wgaW5pdGlhbHppYXRpb24gY29yZSBjb2RlCj4gKHRoYXQgYWRk cmVzcyBhIGxvdCBtb3JlIHVuZGVyIHRoZSBob29kKSBpcyBhIGRlc2lyYWJsZSBzb2x1dGlvbiB0 byBhZGRyZXNzIGEKPiBub24tZXhpc3RlbnQgcHJvYmxlbSByZWFsbHkuCj4KPiA+IEFuZCB0aGUg ZnVuY3Rpb24gbmFtaW5nIGRvZXNuJ3Qgc3VnZ2VzdCB0aGF0IHlvdSBoYXZlIGEgcHJvYmUtcmVt b3ZlCj4gPiBwYWlyLiBNb3Jlb3ZlciwgaWYgdGhlIGluaXQtZGVpbml0IHBhcnQgaXMgY2FsbGVk IGluIHRoZSBwcm9iZS1yZW1vdmUsCj4gPiB0aGUgZGV2bV8gbXVzdCBub3QgYmUgbWl4ZWQgd2l0 aCBub24tZGV2bSBvbmVzLCBhcyBpdCBicmVha3MgdGhlIG9yZGVyCj4gPiBhbmQgbGVhZHMgdG8g c3VidGxlIG1pc3Rha2VzLgo+Cj4gSW5pdGlhbGl6YXRpb24gb3JkZXIgaXMgZW5mb3JjZWQgYnkg U0NNSSBjb3JlIGxpa2UgdGhpczoKPgo+ICBAZHJpdmVyX3Byb2JlLT5nZXRfcHJvdG9jb2xfb3Bz KCkKPiAgIEBjb3JlL2dldF9wcm90b2NvbF9vcHMKPiAgICAgIC0+IGRldnJlc19ncm91cF9vcGVu KCkKPiAgICAgIC0+IHByb3RvY29sX2luaXQtPmRldm1fKigpCj4gICAgICAtPiBkZXZyZXNfZ3Jv dXBfY2xvc2UoKQo+ICAgICAgLT4gZHJpdmVyX3Byb2JpbmcKPgo+ICAgIEBydW50aW1lIG9wdGlv bmFsIGV4cGxpY2l0X2xhenlfa21hbGxvY3MgaW5zaWRlIHRoZSBwcm90b2NvbAo+Cj4gIEBkcml2 ZXJfcmVtb3ZlLT5wdXRfcHJvdG9jb2xfb3BzKCkKPiAgICBAY29yZS9wdXRfcHJvdG9jb2xfb3Bz KCkKPiAgICAgIC0+IHByb3RvY29sX2Rlbml0LT5vcHRpb25hbF9leHBsaWNpdF9rZnJlZV9vZl90 aGVfYWJvdmUKPiAgICAgIC0+IGRldnJlc19ncm91cF9yZWxlYXNlKCkKPiAgICAtPiBkcml2ZXJf cmVtb3ZpbmcKPgo+IC4uLiBkb250IHRoaW5rIHRoZXJlJ3MgYW4gb3JkZXJpbmcgcHJvYmxlbS4K ClRoZSBtZXNzIHdpdGggZGV2bV8gdnMuIG5vbi1kZXZtIGlzIHF1aXRlIGVhc3kgdG8gYWNoaWV2 ZS4gWW91IGFyZQpwcm9iYWJseSBvdXQgb2YgdGhlIGNvbnRyb2wgb2Ygd2hhdCB0aGUgcHJvdG9j b2wgZHJpdmVyIHdhbnRzIHRvIGRvIGluCnRoZSBpbml0LiBJcyB0aGUgdXNhZ2Ugb2YgZGV2bSAo d2hpY2ggQVBJcyBhbmQgaW4gd2hpY2ggb3JkZXIgY2FuIGJlCnVzZWQpICBXUlQgU0NNSSBkb2N1 bWVudGVkIHNvbWV3aGVyZT8KCk1pc3VzZSBvZiBkZXZtIGlzIGEgY29tbW9uIGlzc3VlLCBJJ20g bm90IHN1cnByaXNlZCBpdCB3aWxsIGhpdCB5b3VyCnN1YnN5c3RlbSBvbmUgZGF5IHdpdGggc3Vj aCBhbiBhcHByb2FjaC4KCj4gLi4ubm90ZSB0aGF0IHRoZSBwaC0+ZGV2IHByb3ZpZGVkIGluIHRo ZSBwcm90b2NvbF9pbml0IGFuZCB1c2VkIGJ5IGRldm1fCj4gaXMgTk9UIHRoZSBkZXYgb2YgdGhl IFNDTUkgZHJpdmVyIHByb2JlL3JlbW92ZSB0aGF0IHVzZXMgdGhlIGdldF9wcm90b2NvbF9vcHMs Cj4gaXQgaXMgYW4gaW50ZXJuYWwgU0NNSSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3Jl IFNDTUkgc3RhY2sgcHJvYmluZyBhbmQKPiBhbGxvY2F0aW9ucywgd2l0aGluIHdoaWNoIGEgZGV2 cmVzIGdyb3VwIGZvciB0aGUgc3BlY2lmaWMgcHJvdG9jb2wgaXMgY3JlYXRlZAo+IHdoZW4gdGhh dCBzcGVjaWZpYyBwcm90b2NvbCBpcyBpbml0aWFsaXplZC4uLnByb3RvY29scyBhcmUgbm90IGZ1 bGx5Cj4gZmxlZGdlZCBkcml2ZXJzIGFyZSBqdXN0IGJpdHMgb2YgdGhlIFNDTUkgc3RhY2sgdGhh dCBhcmUgaW5pdGlhbGl6ZWQgd2hlbiBuZWVkZWQKPiAoYW5kIHBvc3NpYmx5IGFsc28gbG9hZGVk IHdoZW4gbmVlZGVkIGZvciB2ZW5kb3IgcHJvdG9jb2xzKSBhbmQKPiBkZS1pbml0aWFsemVkIHdo ZW4gbm8gbW9yZSBTQ01JIGRyaXZlciB1c2VycyBleGlzdCBmb3IgdGhhdCBwcm90b2NvbC4KClAu Uy4gSSBndWVzcyBmcm9tIG5vdyBvbiBpdCdzIHlvdXIgY2FsbCwgYnV0IHRoaXMgY29kZSBhbmQg aW4gY2FzZQpvdGhlciBkcml2ZXJzIHVzZSBzaW1pbGFyLCBpcyBiYWRseSB3cml0dGVuLiBJIGhv cGUgc29tZSBkb2N1bWVudGF0aW9uCmV4aXN0cyB0byBhdCBsZWFzdCBqdXN0aWZ5IGFsbCB0aGlz IG1lc3MgYW5kIGV4cGxhaW5pbmcgd2h5IHRoZXJlIG5vCmFuZCAod2hhdCdzIHJlYWxseSBpbXBv cnRhbnQpIHdpbGwgbmV2ZXIgYmUgYSBwcm9ibGVtLgoKLS0gCldpdGggQmVzdCBSZWdhcmRzLApB bmR5IFNoZXZjaGVua28KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK