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 X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E97FC43463 for ; Fri, 18 Sep 2020 22:50:57 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C53E622208 for ; Fri, 18 Sep 2020 22:50:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Vckwe6xI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726130AbgIRWuz (ORCPT ); Fri, 18 Sep 2020 18:50:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48776 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725874AbgIRWuz (ORCPT ); Fri, 18 Sep 2020 18:50:55 -0400 Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 36013C0613CE; Fri, 18 Sep 2020 15:50:55 -0700 (PDT) Received: by mail-wm1-x344.google.com with SMTP id q9so6693218wmj.2; Fri, 18 Sep 2020 15:50:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=idMbHdqE5RSEL1+PYj6diJYT02GB4Z1nCCZPgrHPta8=; b=Vckwe6xI+A2C9eCp+WMph4qWQrfTlLHpa/4Y4LcF58WPWCTf/ZHeH2RfuXQtP7J6C1 aiaOaBaC7RR8SZnurM9CSGq9Ik5ovliFaK+fr/Ipcyeg/UMsJ4i3a+2OSTHJFOSTswAS Ejy+wr8tZXZUYLPwo3viLSmcfe0Zn2hSSH7RWuaZa3wTNr0/0cEJC08FTKPxyVXaWN74 /XuXaAD/ErGKs1jYCUkO0cYJYR2W/FDvJIAknyNtTo5r0kgD7QVsdeym95tNUccXEMr3 vmm+XD1GvGDu+anKwVRMu2p+WN/VbAPSAKJuUMvTDjthRGE+wNmGj7aJR5C+DqshkclM HZIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=idMbHdqE5RSEL1+PYj6diJYT02GB4Z1nCCZPgrHPta8=; b=Z0Qghxgp9Q6UZW+7MfTwur4buV51Kb9gU6K67oSfcD0cn+sQ5GvW8PJmX9OepstaNo mI76NJw/986R7CINvcWi+/vBl5zhbTElgwb6o1ZJFzydJq8gUVZWwO0x+hA7Kz/0doyk lxYNKK88FcbHg/7p/5sz/NX1Ixg6zf4exb25538G47UzSP5BV+UnA6p7vApGdXZl1iWy ntg9MCx2LU68yF24DVnOp+42czRsdLNZ1BLI3br3y/xfPLE47ZJZzI2r8CQpgyosUp62 TQqjGl+niqJmzAsrH2aUhyxAK0L+pumzNvFsc0J+J7HpS8iFyXTbFklWXga5mq4P03Pp gn+w== X-Gm-Message-State: AOAM533/Ql2ftsafZOTlRH7zMewIQgP2z9bRalJPGY8D8o8tu/MTSuB4 r9HA8Uw/BEnXTlu0toKeyHM= X-Google-Smtp-Source: ABdhPJwjf4jXNqYTyGVIF3CtQIUJQDErVPkzZsagv3DdXcCRd8jzDPcLVTuvuBWHdOemvSRbNZgvMQ== X-Received: by 2002:a1c:9cd3:: with SMTP id f202mr17665842wme.148.1600469453514; Fri, 18 Sep 2020 15:50:53 -0700 (PDT) Received: from [192.168.1.211] ([2.29.208.34]) by smtp.gmail.com with ESMTPSA id c14sm7462056wrv.12.2020.09.18.15.50.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Sep 2020 15:50:52 -0700 (PDT) From: Dan Scally Subject: Re: [RFC PATCH] Add bridge driver to connect sensors to CIO2 device via software nodes on ACPI platforms To: Dan Carpenter Cc: yong.zhi@intel.com, sakari.ailus@linux.intel.com, bingbu.cao@intel.com, tian.shu.qiu@intel.com, mchehab@kernel.org, gregkh@linuxfoundation.org, davem@davemloft.net, robh@kernel.org, devel@driverdev.osuosl.org, jorhand@linux.microsoft.com, kieran.bingham@ideasonboard.com, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, kitakar@gmail.com References: <20200916213618.8003-1-djrscally@gmail.com> <20200917093407.GK4282@kadam> Message-ID: <8d19e234-2e87-693a-c3e7-a8433ae83d61@gmail.com> Date: Fri, 18 Sep 2020 23:50:51 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20200917093407.GK4282@kadam> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Dan -  thanks for all your comments. Sorry it took a while to get to yours. On 17/09/2020 10:34, Dan Carpenter wrote: > On Wed, Sep 16, 2020 at 10:36:18PM +0100, Daniel Scally wrote: >> diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2.c b/drivers/media/pci/intel/ipu3/ipu3-cio2.c >> index 92f5eadf2c99..fd941d2c7581 100644 >> --- a/drivers/media/pci/intel/ipu3/ipu3-cio2.c >> +++ b/drivers/media/pci/intel/ipu3/ipu3-cio2.c >> @@ -1719,6 +1719,59 @@ static void cio2_queues_exit(struct cio2_device *cio2) >> cio2_queue_exit(cio2, &cio2->queue[i]); >> } >> >> +static int cio2_probe_can_progress(struct pci_dev *pci_dev) >> +{ >> + void *sensor; >> + >> + /* >> + * On ACPI platforms, we need to probe _after_ sensors wishing to connect >> + * to cio2 have added a device link. If there are no consumers yet, then >> + * we need to defer. The .sync_state() callback will then be called after >> + * all linked sensors have probed >> + */ >> + >> + if (IS_ENABLED(CONFIG_ACPI)) { > Reverse this condition. > > if (!IS_ENABLED(CONFIG_ACPI)) > return 0; > > Yeah, much better. >> + sensor = (struct device *)list_first_entry_or_null( >> + &pci_dev->dev.links.consumers, >> + struct dev_links_info, >> + consumers); >> + >> + if (!sensor) >> + return -EPROBE_DEFER; > Get rid of the cast. > > if (list_empty(&pci_dev->dev.links.consumers)) > return -EPROBE_DEFER; > > return 0; > Also much better, though I think possibly this whole section will be going away now after some of the other pointers... >> + cio2 = dev_get_drvdata(dev); >> + >> + if (!cio2) { > Delete the blank line between the call and the test. They're part of > the same step. "cio2" can't be NULL anyway, so delete the test. Thanks - I'll skip blank lines in that situation in future >> + >> + if (ret < 0) { >> + dev_err(dev, "Failed to fetch SSDB data\n"); >> + return ret; >> + } >> + >> + sensor->link = sensor_data.link; >> + sensor->lanes = sensor_data.lanes; >> + sensor->mclkspeed = sensor_data.mclkspeed; >> + >> + return 0; >> +} >> + >> +static int create_endpoint_properties(struct device *dev, >> + struct sensor_bios_data *ssdb, >> + struct property_entry *sensor_props, >> + struct property_entry *cio2_props) >> +{ >> + u32 *data_lanes; >> + int i; > Indented too far. > >> + >> + data_lanes = devm_kmalloc(dev, sizeof(u32) * (int)ssdb->lanes, > No need for the cast. Use devm_kmalloc_array(). Ah - TIL that that exists, thanks. >> + GFP_KERNEL); >> + >> + if (!data_lanes) { >> + dev_err(dev, >> + "Couldn't allocate memory for data lanes array\n"); > Delete the error message (checkpatch.pl --strict). And that too - I wasn't using the --strict flag, I'll do that next time >> + >> + sensor_props[0] = PROPERTY_ENTRY_U32("clock-frequency", >> + ssdb->mclkspeed); >> + sensor_props[1] = PROPERTY_ENTRY_U32("bus-type", 5); >> + sensor_props[2] = PROPERTY_ENTRY_U32("clock-lanes", 0); >> + sensor_props[3] = PROPERTY_ENTRY_U32_ARRAY_LEN("data-lanes", >> + data_lanes, >> + (int)ssdb->lanes); >> + sensor_props[4] = remote_endpoints[(bridge.n_sensors * 2) + ENDPOINT_SENSOR]; >> + sensor_props[5] = PROPERTY_ENTRY_NULL; >> + >> + cio2_props[0] = PROPERTY_ENTRY_U32_ARRAY_LEN("data-lanes", >> + data_lanes, >> + (int)ssdb->lanes); >> + cio2_props[1] = remote_endpoints[(bridge.n_sensors * 2) + ENDPOINT_CIO2]; >> + cio2_props[2] = PROPERTY_ENTRY_NULL; >> + >> + return 0; >> +} >> + >> +static int connect_supported_devices(void) >> +{ >> + struct acpi_device *adev; >> + struct device *dev; >> + struct sensor_bios_data ssdb; >> + struct sensor *sensor; >> + struct property_entry *sensor_props; >> + struct property_entry *cio2_props; >> + struct fwnode_handle *fwnode; >> + struct software_node *nodes; >> + struct v4l2_subdev *sd; >> + int i, ret; >> + >> + for (i = 0; i < ARRAY_SIZE(supported_devices); i++) { >> + adev = acpi_dev_get_first_match_dev(supported_devices[i], >> + NULL, -1); >> + >> + if (!adev) >> + continue; >> + >> + dev = bus_find_device_by_acpi_dev(&i2c_bus_type, adev); >> + >> + if (!dev) { >> + pr_info("ACPI match for %s, but it has no i2c device\n", >> + supported_devices[i]); >> + continue; >> + } >> + >> + if (!dev->driver_data) { >> + pr_info("ACPI match for %s, but it has no driver\n", >> + supported_devices[i]); > put_device(dev); Good catch, thank you. >> + } >> + >> + ret = connect_supported_devices(); >> + >> + if ((ret < 0) || (bridge.n_sensors <= 0)) { >> + pr_err("cio2_bridge: Failed to connect any devices\n"); >> + goto out; > If (bridge.n_sensors <= 0) is true then we need to set ret = -EINVAL > or something. Really .n_sensors can't be negative. > > The name "out" is a crappy label name because it doesn't say what the > goto does. When I scroll down then it turns out that "goto out;" calls > a free_everything() function. That kind of error handling is always > buggy. > > There are several typical bugs. 1) Something leaks because the error > handling style is too complicated to be audited. 2) Dereferencing > uninitialized pointers. 3) Undoing something which hasn't been done. > > I believe that in this case one bug is with the handling of the > bridge.cio2_fwnode. We "restore" it back to the original state > as soon as we have a non-NULL bridge.cio2 instead of waiting until we > have stored the original state. > > The best way to do error handling is this. > > Every function cleans up after itself. The connect_supported_devices() > function is a bit special because it's a loop. I would would write it > so that if it fails then it cleans up the partial loop iteration and > then at the end it cleans up all the failed loop iterations. > > for (i = 0; i < ARRAY_SIZE(supported_devices); i++) { > a = frob(); > if (!a) > goto unwind; > b = frob(); > if (!b) { > free(a); > goto unwind; > } > ... > } > > return 0; > > unwind: > for (i = 0; i < bridge.n_sensors; i++) { > free(b); > free(a); > } > bridge.n_sensors = 0; > > return ret; > > The problem with cio2_bridge_unregister_sensors() is that it doesn't > clean up partial iterations through the loop. (Missing calls to > put_device(dev)). > > Loops are complicated but the rest is simple. 1) Every allocation > function needs a matching cleanup function. 2) Use good label names > which say what the goto does. 3) The goto should free the most recent > successful allocation. > > a = frob(); > if (!a) > return -ENOMEM; > > b = frob(); > if (!b) { > ret = -ENOMEM; > goto free_a; > } > > c = frob(); > if (!c) { > ret = -ENOMEM; > goto free_b; > } > > return 0; > > free_b: > free(b); > free_a: > free(a); > > return ret; > > The free function doesn't have any if statements. > > void free_function() > { > free(c); > free(b); > free(a); > } > > The reviewer only needs to keep track of the most recent allocation > and verify that the goto free_foo matches what should be freed. This > system means the code is auditable (no leaks), you never free anything > which wasn't allocated. > This  section and the other comments on error handling was really helpful - I appreciate you taking the time to explain so thoroughly. 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 X-Spam-Level: X-Spam-Status: No, score=-9.7 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12B32C43464 for ; Fri, 18 Sep 2020 22:51:08 +0000 (UTC) Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6C4E722208 for ; Fri, 18 Sep 2020 22:51:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Vckwe6xI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6C4E722208 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 022672E203; Fri, 18 Sep 2020 22:51:07 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Wg7+gNaBQm+O; Fri, 18 Sep 2020 22:51:00 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by silver.osuosl.org (Postfix) with ESMTP id 8EB3A204B4; Fri, 18 Sep 2020 22:51:00 +0000 (UTC) Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by ash.osuosl.org (Postfix) with ESMTP id 6104D1BF82F for ; Fri, 18 Sep 2020 22:50:59 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 5B160204B4 for ; Fri, 18 Sep 2020 22:50:57 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7D2BO9EpvaXf for ; Fri, 18 Sep 2020 22:50:55 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by silver.osuosl.org (Postfix) with ESMTPS id 5E45B204A3 for ; Fri, 18 Sep 2020 22:50:55 +0000 (UTC) Received: by mail-wm1-f65.google.com with SMTP id e17so6696502wme.0 for ; Fri, 18 Sep 2020 15:50:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=idMbHdqE5RSEL1+PYj6diJYT02GB4Z1nCCZPgrHPta8=; b=Vckwe6xI+A2C9eCp+WMph4qWQrfTlLHpa/4Y4LcF58WPWCTf/ZHeH2RfuXQtP7J6C1 aiaOaBaC7RR8SZnurM9CSGq9Ik5ovliFaK+fr/Ipcyeg/UMsJ4i3a+2OSTHJFOSTswAS Ejy+wr8tZXZUYLPwo3viLSmcfe0Zn2hSSH7RWuaZa3wTNr0/0cEJC08FTKPxyVXaWN74 /XuXaAD/ErGKs1jYCUkO0cYJYR2W/FDvJIAknyNtTo5r0kgD7QVsdeym95tNUccXEMr3 vmm+XD1GvGDu+anKwVRMu2p+WN/VbAPSAKJuUMvTDjthRGE+wNmGj7aJR5C+DqshkclM HZIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=idMbHdqE5RSEL1+PYj6diJYT02GB4Z1nCCZPgrHPta8=; b=kwItEt6qIbZL20zAW67cWr2O39/S8Sb4IRNu4inMsyOTFBDtVKiXFXRS+x89vyt39I nkxUIyir3JWWMpbBTGe+PQtsvFFQUk3Vz6okkTCjq2nF0KtREqZ3nT9qd587kmdgLsaL n/QjgEwgv1Yvx2VkMmFWZLHYQQNv1XNHaLwto/sLxdza5IgGvwQcfB6P2rqlTKu7/Er5 6YlTJos10O8D9nIuNZmHdhKwWT4CGfNR4nX+sQVlJyKcIr1nISwJWpJxaswNBqPOMlxW m7hsXEV0MUsrbJY55XNBoLGow6nuaFvXaVVme5o1ywf44+qnl5cHIVB9pdMvra4wVYrL zOZQ== X-Gm-Message-State: AOAM533QlRP6c76jkt4vTFZm5oyqET3KuphAf4rpmsRO1DIR6zfXoZNl 5OxVpUKTy3AgvpTK5G011rM= X-Google-Smtp-Source: ABdhPJwjf4jXNqYTyGVIF3CtQIUJQDErVPkzZsagv3DdXcCRd8jzDPcLVTuvuBWHdOemvSRbNZgvMQ== X-Received: by 2002:a1c:9cd3:: with SMTP id f202mr17665842wme.148.1600469453514; Fri, 18 Sep 2020 15:50:53 -0700 (PDT) Received: from [192.168.1.211] ([2.29.208.34]) by smtp.gmail.com with ESMTPSA id c14sm7462056wrv.12.2020.09.18.15.50.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 18 Sep 2020 15:50:52 -0700 (PDT) From: Dan Scally Subject: Re: [RFC PATCH] Add bridge driver to connect sensors to CIO2 device via software nodes on ACPI platforms To: Dan Carpenter References: <20200916213618.8003-1-djrscally@gmail.com> <20200917093407.GK4282@kadam> Message-ID: <8d19e234-2e87-693a-c3e7-a8433ae83d61@gmail.com> Date: Fri, 18 Sep 2020 23:50:51 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20200917093407.GK4282@kadam> Content-Language: en-US X-BeenThere: driverdev-devel@linuxdriverproject.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Driver Project Developer List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devel@driverdev.osuosl.org, robh@kernel.org, jorhand@linux.microsoft.com, linux-media@vger.kernel.org, gregkh@linuxfoundation.org, kieran.bingham@ideasonboard.com, linux-kernel@vger.kernel.org, kitakar@gmail.com, sakari.ailus@linux.intel.com, bingbu.cao@intel.com, mchehab@kernel.org, davem@davemloft.net, tian.shu.qiu@intel.com, yong.zhi@intel.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: driverdev-devel-bounces@linuxdriverproject.org Sender: "devel" SGkgRGFuIC3CoCB0aGFua3MgZm9yIGFsbCB5b3VyIGNvbW1lbnRzLiBTb3JyeSBpdCB0b29rIGEg d2hpbGUgdG8gZ2V0IHRvCnlvdXJzLgoKT24gMTcvMDkvMjAyMCAxMDozNCwgRGFuIENhcnBlbnRl ciB3cm90ZToKPiBPbiBXZWQsIFNlcCAxNiwgMjAyMCBhdCAxMDozNjoxOFBNICswMTAwLCBEYW5p ZWwgU2NhbGx5IHdyb3RlOgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvaW50ZWwv aXB1My9pcHUzLWNpbzIuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL2ludGVsL2lwdTMvaXB1My1jaW8y LmMKPj4gaW5kZXggOTJmNWVhZGYyYzk5Li5mZDk0MWQyYzc1ODEgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvbWVkaWEvcGNpL2ludGVsL2lwdTMvaXB1My1jaW8yLmMKPj4gKysrIGIvZHJpdmVycy9t ZWRpYS9wY2kvaW50ZWwvaXB1My9pcHUzLWNpbzIuYwo+PiBAQCAtMTcxOSw2ICsxNzE5LDU5IEBA IHN0YXRpYyB2b2lkIGNpbzJfcXVldWVzX2V4aXQoc3RydWN0IGNpbzJfZGV2aWNlICpjaW8yKQo+ PiAgCQljaW8yX3F1ZXVlX2V4aXQoY2lvMiwgJmNpbzItPnF1ZXVlW2ldKTsKPj4gIH0KPj4gIAo+ PiArc3RhdGljIGludCBjaW8yX3Byb2JlX2Nhbl9wcm9ncmVzcyhzdHJ1Y3QgcGNpX2RldiAqcGNp X2RldikKPj4gK3sKPj4gKwl2b2lkICpzZW5zb3I7Cj4+ICsKPj4gKwkvKgo+PiArCSAqIE9uIEFD UEkgcGxhdGZvcm1zLCB3ZSBuZWVkIHRvIHByb2JlIF9hZnRlcl8gc2Vuc29ycyB3aXNoaW5nIHRv IGNvbm5lY3QKPj4gKwkgKiB0byBjaW8yIGhhdmUgYWRkZWQgYSBkZXZpY2UgbGluay4gSWYgdGhl cmUgYXJlIG5vIGNvbnN1bWVycyB5ZXQsIHRoZW4KPj4gKwkgKiB3ZSBuZWVkIHRvIGRlZmVyLiBU aGUgLnN5bmNfc3RhdGUoKSBjYWxsYmFjayB3aWxsIHRoZW4gYmUgY2FsbGVkIGFmdGVyCj4+ICsJ ICogYWxsIGxpbmtlZCBzZW5zb3JzIGhhdmUgcHJvYmVkCj4+ICsJICovCj4+ICsKPj4gKwlpZiAo SVNfRU5BQkxFRChDT05GSUdfQUNQSSkpIHsKPiBSZXZlcnNlIHRoaXMgY29uZGl0aW9uLgo+Cj4g CWlmICghSVNfRU5BQkxFRChDT05GSUdfQUNQSSkpCj4gCQlyZXR1cm4gMDsKPgo+ClllYWgsIG11 Y2ggYmV0dGVyLgo+PiArCQlzZW5zb3IgPSAoc3RydWN0IGRldmljZSAqKWxpc3RfZmlyc3RfZW50 cnlfb3JfbnVsbCgKPj4gKwkJCQkJCQkJJnBjaV9kZXYtPmRldi5saW5rcy5jb25zdW1lcnMsCj4+ ICsJCQkJCQkJCXN0cnVjdCBkZXZfbGlua3NfaW5mbywKPj4gKwkJCQkJCQkJY29uc3VtZXJzKTsK Pj4gKwo+PiArCQlpZiAoIXNlbnNvcikKPj4gKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOwo+IEdl dCByaWQgb2YgdGhlIGNhc3QuCj4KPiAJaWYgKGxpc3RfZW1wdHkoJnBjaV9kZXYtPmRldi5saW5r cy5jb25zdW1lcnMpKQo+IAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Cj4KPiAJcmV0dXJuIDA7Cj4K QWxzbyBtdWNoIGJldHRlciwgdGhvdWdoIEkgdGhpbmsgcG9zc2libHkgdGhpcyB3aG9sZSBzZWN0 aW9uIHdpbGwgYmUKZ29pbmcgYXdheSBub3cgYWZ0ZXIgc29tZSBvZiB0aGUgb3RoZXIgcG9pbnRl cnMuLi4KPj4gKwkJY2lvMiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+PiArCj4+ICsJCWlmICgh Y2lvMikgewo+IERlbGV0ZSB0aGUgYmxhbmsgbGluZSBiZXR3ZWVuIHRoZSBjYWxsIGFuZCB0aGUg dGVzdC4gIFRoZXkncmUgcGFydCBvZgo+IHRoZSBzYW1lIHN0ZXAuICAiY2lvMiIgY2FuJ3QgYmUg TlVMTCBhbnl3YXksIHNvIGRlbGV0ZSB0aGUgdGVzdC4KVGhhbmtzIC0gSSdsbCBza2lwIGJsYW5r IGxpbmVzIGluIHRoYXQgc2l0dWF0aW9uIGluIGZ1dHVyZQo+PiArCj4+ICsJaWYgKHJldCA8IDAp IHsKPj4gKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZmV0Y2ggU1NEQiBkYXRhXG4iKTsKPj4g KwkJcmV0dXJuIHJldDsKPj4gKwl9Cj4+ICsKPj4gKwlzZW5zb3ItPmxpbmsgPSBzZW5zb3JfZGF0 YS5saW5rOwo+PiArCXNlbnNvci0+bGFuZXMgPSBzZW5zb3JfZGF0YS5sYW5lczsKPj4gKwlzZW5z b3ItPm1jbGtzcGVlZCA9IHNlbnNvcl9kYXRhLm1jbGtzcGVlZDsKPj4gKwo+PiArCXJldHVybiAw Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGNyZWF0ZV9lbmRwb2ludF9wcm9wZXJ0aWVzKHN0 cnVjdCBkZXZpY2UgKmRldiwKPj4gKwkJCQkgICAgICBzdHJ1Y3Qgc2Vuc29yX2Jpb3NfZGF0YSAq c3NkYiwKPj4gKwkJCQkgICAgICBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgKnNlbnNvcl9wcm9wcywK Pj4gKwkJCQkgICAgICBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgKmNpbzJfcHJvcHMpCj4+ICt7Cj4+ ICsJCXUzMiAqZGF0YV9sYW5lczsKPj4gKwkJaW50IGk7Cj4gSW5kZW50ZWQgdG9vIGZhci4KPgo+ PiArCj4+ICsJCWRhdGFfbGFuZXMgPSBkZXZtX2ttYWxsb2MoZGV2LCBzaXplb2YodTMyKSAqIChp bnQpc3NkYi0+bGFuZXMsCj4gTm8gbmVlZCBmb3IgdGhlIGNhc3QuICBVc2UgZGV2bV9rbWFsbG9j X2FycmF5KCkuCkFoIC0gVElMIHRoYXQgdGhhdCBleGlzdHMsIHRoYW5rcy4KPj4gKwkJCQkJICBH RlBfS0VSTkVMKTsKPj4gKwo+PiArCQlpZiAoIWRhdGFfbGFuZXMpIHsKPj4gKwkJCWRldl9lcnIo ZGV2LAo+PiArCQkJCSJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRhdGEgbGFuZXMgYXJy YXlcbiIpOwo+IERlbGV0ZSB0aGUgZXJyb3IgbWVzc2FnZSAoY2hlY2twYXRjaC5wbCAtLXN0cmlj dCkuCkFuZCB0aGF0IHRvbyAtIEkgd2Fzbid0IHVzaW5nIHRoZSAtLXN0cmljdCBmbGFnLCBJJ2xs IGRvIHRoYXQgbmV4dCB0aW1lCj4+ICsKPj4gKwkJc2Vuc29yX3Byb3BzWzBdID0gUFJPUEVSVFlf RU5UUllfVTMyKCJjbG9jay1mcmVxdWVuY3kiLAo+PiArCQkJCQkJICAgICBzc2RiLT5tY2xrc3Bl ZWQpOwo+PiArCQlzZW5zb3JfcHJvcHNbMV0gPSBQUk9QRVJUWV9FTlRSWV9VMzIoImJ1cy10eXBl IiwgNSk7Cj4+ICsJCXNlbnNvcl9wcm9wc1syXSA9IFBST1BFUlRZX0VOVFJZX1UzMigiY2xvY2st bGFuZXMiLCAwKTsKPj4gKwkJc2Vuc29yX3Byb3BzWzNdID0gUFJPUEVSVFlfRU5UUllfVTMyX0FS UkFZX0xFTigiZGF0YS1sYW5lcyIsCj4+ICsJCQkJCQkJICAgICAgIGRhdGFfbGFuZXMsCj4+ICsJ CQkJCQkJICAgICAgIChpbnQpc3NkYi0+bGFuZXMpOwo+PiArCQlzZW5zb3JfcHJvcHNbNF0gPSBy ZW1vdGVfZW5kcG9pbnRzWyhicmlkZ2Uubl9zZW5zb3JzICogMikgKyBFTkRQT0lOVF9TRU5TT1Jd Owo+PiArCQlzZW5zb3JfcHJvcHNbNV0gPSBQUk9QRVJUWV9FTlRSWV9OVUxMOwo+PiArCj4+ICsJ CWNpbzJfcHJvcHNbMF0gPSBQUk9QRVJUWV9FTlRSWV9VMzJfQVJSQVlfTEVOKCJkYXRhLWxhbmVz IiwKPj4gKwkJCQkJCQkgICAgIGRhdGFfbGFuZXMsCj4+ICsJCQkJCQkJICAgICAoaW50KXNzZGIt PmxhbmVzKTsKPj4gKwkJY2lvMl9wcm9wc1sxXSA9IHJlbW90ZV9lbmRwb2ludHNbKGJyaWRnZS5u X3NlbnNvcnMgKiAyKSArIEVORFBPSU5UX0NJTzJdOwo+PiArCQljaW8yX3Byb3BzWzJdID0gUFJP UEVSVFlfRU5UUllfTlVMTDsKPj4gKwo+PiArCQlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3Rh dGljIGludCBjb25uZWN0X3N1cHBvcnRlZF9kZXZpY2VzKHZvaWQpCj4+ICt7Cj4+ICsJc3RydWN0 IGFjcGlfZGV2aWNlICphZGV2Owo+PiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPj4gKwlzdHJ1Y3Qg c2Vuc29yX2Jpb3NfZGF0YSBzc2RiOwo+PiArCXN0cnVjdCBzZW5zb3IgKnNlbnNvcjsKPj4gKwlz dHJ1Y3QgcHJvcGVydHlfZW50cnkgKnNlbnNvcl9wcm9wczsKPj4gKwlzdHJ1Y3QgcHJvcGVydHlf ZW50cnkgKmNpbzJfcHJvcHM7Cj4+ICsJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZTsKPj4g KwlzdHJ1Y3Qgc29mdHdhcmVfbm9kZSAqbm9kZXM7Cj4+ICsJc3RydWN0IHY0bDJfc3ViZGV2ICpz ZDsKPj4gKwlpbnQgaSwgcmV0Owo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUo c3VwcG9ydGVkX2RldmljZXMpOyBpKyspIHsKPj4gKwkJYWRldiA9IGFjcGlfZGV2X2dldF9maXJz dF9tYXRjaF9kZXYoc3VwcG9ydGVkX2RldmljZXNbaV0sCj4+ICsJCQkJCQkgICAgTlVMTCwgLTEp Owo+PiArCj4+ICsJCWlmICghYWRldikKPj4gKwkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCWRldiA9 IGJ1c19maW5kX2RldmljZV9ieV9hY3BpX2RldigmaTJjX2J1c190eXBlLCBhZGV2KTsKPj4gKwo+ PiArCQlpZiAoIWRldikgewo+PiArCQkJcHJfaW5mbygiQUNQSSBtYXRjaCBmb3IgJXMsIGJ1dCBp dCBoYXMgbm8gaTJjIGRldmljZVxuIiwKPj4gKwkJCQlzdXBwb3J0ZWRfZGV2aWNlc1tpXSk7Cj4+ ICsJCQljb250aW51ZTsKPj4gKwkJfQo+PiArCj4+ICsJCWlmICghZGV2LT5kcml2ZXJfZGF0YSkg ewo+PiArCQkJcHJfaW5mbygiQUNQSSBtYXRjaCBmb3IgJXMsIGJ1dCBpdCBoYXMgbm8gZHJpdmVy XG4iLAo+PiArCQkJCXN1cHBvcnRlZF9kZXZpY2VzW2ldKTsKPiBwdXRfZGV2aWNlKGRldik7Ckdv b2QgY2F0Y2gsIHRoYW5rIHlvdS4KPj4gKwl9Cj4+ICsKPj4gKwlyZXQgPSBjb25uZWN0X3N1cHBv cnRlZF9kZXZpY2VzKCk7Cj4+ICsKPj4gKwlpZiAoKHJldCA8IDApIHx8IChicmlkZ2Uubl9zZW5z b3JzIDw9IDApKSB7Cj4+ICsJCXByX2VycigiY2lvMl9icmlkZ2U6IEZhaWxlZCB0byBjb25uZWN0 IGFueSBkZXZpY2VzXG4iKTsKPj4gKwkJZ290byBvdXQ7Cj4gSWYgKGJyaWRnZS5uX3NlbnNvcnMg PD0gMCkgaXMgdHJ1ZSB0aGVuIHdlIG5lZWQgdG8gc2V0IHJldCA9IC1FSU5WQUwKPiBvciBzb21l dGhpbmcuICBSZWFsbHkgLm5fc2Vuc29ycyBjYW4ndCBiZSBuZWdhdGl2ZS4KPgo+IFRoZSBuYW1l ICJvdXQiIGlzIGEgY3JhcHB5IGxhYmVsIG5hbWUgYmVjYXVzZSBpdCBkb2Vzbid0IHNheSB3aGF0 IHRoZQo+IGdvdG8gZG9lcy4gIFdoZW4gSSBzY3JvbGwgZG93biB0aGVuIGl0IHR1cm5zIG91dCB0 aGF0ICJnb3RvIG91dDsiIGNhbGxzCj4gYSBmcmVlX2V2ZXJ5dGhpbmcoKSBmdW5jdGlvbi4gIFRo YXQga2luZCBvZiBlcnJvciBoYW5kbGluZyBpcyBhbHdheXMKPiBidWdneS4KPgo+IFRoZXJlIGFy ZSBzZXZlcmFsIHR5cGljYWwgYnVncy4gIDEpIFNvbWV0aGluZyBsZWFrcyBiZWNhdXNlIHRoZSBl cnJvcgo+IGhhbmRsaW5nIHN0eWxlIGlzIHRvbyBjb21wbGljYXRlZCB0byBiZSBhdWRpdGVkLiAg MikgIERlcmVmZXJlbmNpbmcKPiB1bmluaXRpYWxpemVkIHBvaW50ZXJzLiAgMykgIFVuZG9pbmcg c29tZXRoaW5nIHdoaWNoIGhhc24ndCBiZWVuIGRvbmUuCj4KPiBJIGJlbGlldmUgdGhhdCBpbiB0 aGlzIGNhc2Ugb25lIGJ1ZyBpcyB3aXRoIHRoZSBoYW5kbGluZyBvZiB0aGUKPiBicmlkZ2UuY2lv Ml9md25vZGUuICBXZSAicmVzdG9yZSIgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgc3RhdGUKPiBh cyBzb29uIGFzIHdlIGhhdmUgYSBub24tTlVMTCBicmlkZ2UuY2lvMiBpbnN0ZWFkIG9mIHdhaXRp bmcgdW50aWwgd2UKPiBoYXZlIHN0b3JlZCB0aGUgb3JpZ2luYWwgc3RhdGUuCj4KPiBUaGUgYmVz dCB3YXkgdG8gZG8gZXJyb3IgaGFuZGxpbmcgaXMgdGhpcy4KPgo+IEV2ZXJ5IGZ1bmN0aW9uIGNs ZWFucyB1cCBhZnRlciBpdHNlbGYuICBUaGUgY29ubmVjdF9zdXBwb3J0ZWRfZGV2aWNlcygpCj4g ZnVuY3Rpb24gaXMgYSBiaXQgc3BlY2lhbCBiZWNhdXNlIGl0J3MgYSBsb29wLiAgSSB3b3VsZCB3 b3VsZCB3cml0ZSBpdAo+IHNvIHRoYXQgaWYgaXQgZmFpbHMgdGhlbiBpdCBjbGVhbnMgdXAgdGhl IHBhcnRpYWwgbG9vcCBpdGVyYXRpb24gYW5kCj4gdGhlbiBhdCB0aGUgZW5kIGl0IGNsZWFucyB1 cCBhbGwgdGhlIGZhaWxlZCBsb29wIGl0ZXJhdGlvbnMuCj4KPiAJZm9yIChpID0gMDsgaSA8IEFS UkFZX1NJWkUoc3VwcG9ydGVkX2RldmljZXMpOyBpKyspIHsKPiAJCWEgPSBmcm9iKCk7Cj4gCQlp ZiAoIWEpCj4gCQkJZ290byB1bndpbmQ7Cj4gCQliID0gZnJvYigpOwo+IAkJaWYgKCFiKSB7Cj4g CQkJZnJlZShhKTsKPiAJCQlnb3RvIHVud2luZDsKPiAJCX0KPiAJCS4uLgo+IAl9Cj4KPiAJcmV0 dXJuIDA7Cj4KPiB1bndpbmQ6Cj4gCWZvciAoaSA9IDA7IGkgPCBicmlkZ2Uubl9zZW5zb3JzOyBp KyspIHsKPiAJCWZyZWUoYik7Cj4gCQlmcmVlKGEpOwo+IAl9Cj4gCWJyaWRnZS5uX3NlbnNvcnMg PSAwOwo+Cj4gCXJldHVybiByZXQ7Cj4KPiBUaGUgcHJvYmxlbSB3aXRoIGNpbzJfYnJpZGdlX3Vu cmVnaXN0ZXJfc2Vuc29ycygpIGlzIHRoYXQgaXQgZG9lc24ndAo+IGNsZWFuIHVwIHBhcnRpYWwg aXRlcmF0aW9ucyB0aHJvdWdoIHRoZSBsb29wLiAgKE1pc3NpbmcgY2FsbHMgdG8KPiBwdXRfZGV2 aWNlKGRldikpLgo+Cj4gTG9vcHMgYXJlIGNvbXBsaWNhdGVkIGJ1dCB0aGUgcmVzdCBpcyBzaW1w bGUuICAxKSBFdmVyeSBhbGxvY2F0aW9uCj4gZnVuY3Rpb24gbmVlZHMgYSBtYXRjaGluZyBjbGVh bnVwIGZ1bmN0aW9uLiAgMikgVXNlIGdvb2QgbGFiZWwgbmFtZXMKPiB3aGljaCBzYXkgd2hhdCB0 aGUgZ290byBkb2VzLiAgMykgIFRoZSBnb3RvIHNob3VsZCBmcmVlIHRoZSBtb3N0IHJlY2VudAo+ IHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbi4KPgo+IAlhID0gZnJvYigpOwo+IAlpZiAoIWEpCj4gCQly ZXR1cm4gLUVOT01FTTsKPgo+IAliID0gZnJvYigpOwo+IAlpZiAoIWIpIHsKPiAJCXJldCA9IC1F Tk9NRU07Cj4gCQlnb3RvIGZyZWVfYTsKPiAJfQo+Cj4gCWMgPSBmcm9iKCk7Cj4gCWlmICghYykg ewo+IAkJcmV0ID0gLUVOT01FTTsKPiAJCWdvdG8gZnJlZV9iOwo+IAl9Cj4KPiAJcmV0dXJuIDA7 Cj4KPiBmcmVlX2I6Cj4gCWZyZWUoYik7Cj4gZnJlZV9hOgo+IAlmcmVlKGEpOwo+Cj4gCXJldHVy biByZXQ7Cj4KPiBUaGUgZnJlZSBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgYW55IGlmIHN0YXRlbWVu dHMuCj4KPiB2b2lkIGZyZWVfZnVuY3Rpb24oKQo+IHsKPiAJZnJlZShjKTsKPiAJZnJlZShiKTsK PiAJZnJlZShhKTsKPiB9Cj4KPiBUaGUgcmV2aWV3ZXIgb25seSBuZWVkcyB0byBrZWVwIHRyYWNr IG9mIHRoZSBtb3N0IHJlY2VudCBhbGxvY2F0aW9uCj4gYW5kIHZlcmlmeSB0aGF0IHRoZSBnb3Rv IGZyZWVfZm9vIG1hdGNoZXMgd2hhdCBzaG91bGQgYmUgZnJlZWQuICBUaGlzCj4gc3lzdGVtIG1l YW5zIHRoZSBjb2RlIGlzIGF1ZGl0YWJsZSAobm8gbGVha3MpLCB5b3UgbmV2ZXIgZnJlZSBhbnl0 aGluZwo+IHdoaWNoIHdhc24ndCBhbGxvY2F0ZWQuCj4KVGhpc8KgIHNlY3Rpb24gYW5kIHRoZSBv dGhlciBjb21tZW50cyBvbiBlcnJvciBoYW5kbGluZyB3YXMgcmVhbGx5CmhlbHBmdWwgLSBJIGFw cHJlY2lhdGUgeW91IHRha2luZyB0aGUgdGltZSB0byBleHBsYWluIHNvIHRob3JvdWdobHkuCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkZXZlbCBtYWls aW5nIGxpc3QKZGV2ZWxAbGludXhkcml2ZXJwcm9qZWN0Lm9yZwpodHRwOi8vZHJpdmVyZGV2Lmxp bnV4ZHJpdmVycHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcml2ZXJkZXYtZGV2ZWwK