From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 633A2C32771 for ; Sat, 24 Sep 2022 11:45:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233648AbiIXLpT (ORCPT ); Sat, 24 Sep 2022 07:45:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233651AbiIXLo6 (ORCPT ); Sat, 24 Sep 2022 07:44:58 -0400 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C7F43252; Sat, 24 Sep 2022 04:44:49 -0700 (PDT) Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 28OBiORQ003689; Sat, 24 Sep 2022 11:44:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=3N1VaLpXUDkXxS9kSOW/35TYj4yY7CtvK57VDScUYOE=; b=Q2wGJMTuP0svRfVDj4EGI97TmocbPgs4sj7oGS39R42NC6s9QqMwtCocsUkOgjLqqcM4 9B5gGx3NP25kwFGgh6FqlE6Z/42hkUJ+rrPzTteqY6QPARIidav3kOEOQFw4ZmGLmcGD E1tk7W4YneIRUqGcXo9HPGCMEzA+4bgtKekxSzxOf06nad1dZShViq9OzOjkuqxBg3qb KANZuVO+KiBN9uv21ag69jUjY9swJznhyL7TUADxlZ1QmN9pdBPnmLrCVYF9s8C6cWmL dY0Cwn+rzA1x8j3DagQDQjKNMHIVWGdb/H5oYshuH/zULv3XKZoaDXRUvMvXKcmjKnkJ Bw== Received: from nalasppmta03.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3jsu6frje4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 24 Sep 2022 11:44:36 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA03.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 28OBiZHD015936 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 24 Sep 2022 11:44:35 GMT Received: from [10.110.112.23] (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.29; Sat, 24 Sep 2022 04:44:30 -0700 Message-ID: <9cba3c3d-c489-d99b-0bf1-81113fd6186f@quicinc.com> Date: Sat, 24 Sep 2022 17:14:26 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: Re: [PATCH V13 2/7] soc: qcom: dcc: Add driver support for Data Capture and Compare unit(DCC) Content-Language: en-US To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Rob Herring , Alex Elder CC: , , , , "Sai Prakash Ranjan" , Sibi Sankar , Rajendra Nayak , References: <44ca04316e8b67f1662d304d8535236d82710bda.1663642052.git.quic_schowdhu@quicinc.com> From: Souradeep Chowdhury In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: D1ViNZuXCqshm-L8q8dUw0YAmA6WaEZk X-Proofpoint-ORIG-GUID: D1ViNZuXCqshm-L8q8dUw0YAmA6WaEZk X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.528,FMLib:17.11.122.1 definitions=2022-09-24_04,2022-09-22_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 clxscore=1015 bulkscore=0 suspectscore=0 phishscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 mlxscore=0 mlxlogscore=999 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2209240088 Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org On 9/24/2022 1:12 AM, Krzysztof Kozlowski wrote: > On 20/09/2022 05:56, Souradeep Chowdhury wrote: >> The DCC is a DMA Engine designed to capture and store data >> during system crash or software triggers. The DCC operates >> based on user inputs via the debugfs interface. The user gives >> addresses as inputs and these addresses are stored in the > (...) > >> + >> +#define DCC_RD_MOD_WR_ADDR 0xC105E >> + >> +/*DCC debugfs directory*/ >> +static struct dentry *dcc_dbg; >> + >> +enum dcc_descriptor_type { >> + DCC_READ_TYPE, >> + DCC_LOOP_TYPE, >> + DCC_READ_WRITE_TYPE, >> + DCC_WRITE_TYPE >> +}; >> + >> +struct dcc_config_entry { >> + u32 base; >> + u32 offset; >> + u32 len; >> + u32 loop_cnt; >> + u32 write_val; >> + u32 mask; >> + bool apb_bus; >> + enum dcc_descriptor_type desc_type; >> + struct list_head list; >> +}; >> + >> +/** >> + * struct dcc_drvdata - configuration information related to a dcc device >> + * @base: Base Address of the dcc device >> + * @dev: The device attached to the driver data >> + * @mutex: Lock to protect access and manipulation of dcc_drvdata >> + * @ram_base: Base address for the SRAM dedicated for the dcc device >> + * @ram_size: Total size of the SRAM dedicated for the dcc device >> + * @ram_offset: Offset to the SRAM dedicated for dcc device >> + * @mem_map_ver: Memory map version of DCC hardware >> + * @ram_cfg: Used for address limit calculation for dcc >> + * @ram_start: Starting address of DCC SRAM >> + * @sram_dev: Micellaneous device equivalent of dcc SRAM >> + * @cfg_head: Points to the head of the linked list of addresses >> + * @dbg_dir: The dcc debugfs directory under which all the debugfs files are placed >> + * @nr_link_list: Total number of linkedlists supported by the DCC configuration >> + * @loopoff: Loop offset bits range for the addresses > All these entres have messed up spacing. Ack > >> + * @enable: This contains an array of linkedlist enable flags > No, this is not an array of linked lists... It's a pointer to bool. This > is not way to store linked lists. Ack > > >> + >> +static int dcc_probe(struct platform_device *pdev) >> +{ >> + u32 val; >> + int ret = 0, i, size; >> + struct device *dev = &pdev->dev; >> + struct dcc_drvdata *dcc; >> + struct resource *res; >> + >> + dcc = devm_kzalloc(dev, sizeof(*dcc), GFP_KERNEL); >> + if (!dcc) >> + return -ENOMEM; >> + >> + dcc->dev = &pdev->dev; >> + platform_set_drvdata(pdev, dcc); >> + >> + dcc->base = devm_platform_ioremap_resource(pdev, 0); >> + if (IS_ERR(dcc->base)) >> + return PTR_ERR(dcc->base); >> + >> + dcc->ram_base = devm_platform_get_and_ioremap_resource(pdev, 1, &res); >> + if (IS_ERR(dcc->ram_base)) >> + return PTR_ERR(dcc->ram_base); >> + >> + dcc->ram_size = resource_size(res); >> + >> + dcc->ram_offset = (size_t)of_device_get_match_data(&pdev->dev); >> + >> + val = dcc_readl(dcc, DCC_HW_INFO); >> + >> + if (FIELD_GET(DCC_VER_INFO_MASK, val)) { >> + dcc->mem_map_ver = 3; >> + dcc->nr_link_list = dcc_readl(dcc, DCC_LL_NUM_INFO); >> + if (dcc->nr_link_list == 0) >> + return -EINVAL; >> + } else if ((val & DCC_VER_MASK2) == DCC_VER_MASK2) { >> + dcc->mem_map_ver = 2; >> + dcc->nr_link_list = dcc_readl(dcc, DCC_LL_NUM_INFO); >> + if (dcc->nr_link_list == 0) >> + return -EINVAL; >> + } else { >> + dcc->mem_map_ver = 1; >> + dcc->nr_link_list = DCC_MAX_LINK_LIST; >> + } >> + >> + /* Either set the fixed loop offset or calculate it > Start with /* > (see coding style) Ack > >> + * from ram_size.Max consecutive addresses the >> + * dcc can loop is equivalent to the ram size >> + */ >> + if (val & DCC_LOOP_OFFSET_MASK) >> + dcc->loopoff = DCC_FIX_LOOP_OFFSET; >> + else >> + dcc->loopoff = get_bitmask_order((dcc->ram_size + >> + dcc->ram_offset) / 4 - 1); >> + >> + mutex_init(&dcc->mutex); >> + /* Allocate space for all entries at once */ >> + size = sizeof(*dcc->enable) + sizeof(*dcc->cfg_head); > This is quite confusing way of handling lists - some parts of drvdata > are list, some are not. We are using three things for lists here.  A cfg_head which points to the head of the individual linkedlist of addresses. a nr_linked_list to store the total number of lists supported by dcc and an array of boolean to store the enabled status of each individual lists >> + >> + dcc->enable = devm_kcalloc(dev, dcc->nr_link_list, size, GFP_KERNEL); >> + if (!dcc->enable) >> + return -ENOMEM; >> + >> + dcc->cfg_head = (struct list_head *)(dcc->enable + dcc->nr_link_list); > That's unusual way to iterate over list... Here we are instantiating the head of each individual linked lists in the array that stores the list. > >> + >> + for (i = 0; i < dcc->nr_link_list; i++) >> + INIT_LIST_HEAD(&dcc->cfg_head[i]); >> + >> + ret = dcc_sram_dev_init(dcc); >> + if (ret) { >> + dev_err(dcc->dev, "DCC: sram node not registered.\n"); >> + return ret; >> + } >> + >> + ret = dcc_create_debug_dir(dcc); >> + if (ret) { >> + dev_err(dcc->dev, "DCC: debugfs files not created.\n"); > debugfs failures are not reasons to fail probe. Also no need to print > errors. The total functionality of this driver is dependent on the debugfs files. That is why the probe if failed with error message if it is not created. This is done as per Alex's comment on version 8 of the patch. >> + dcc_sram_dev_exit(dcc); >> + return ret; >> + } >> + >> + return 0; >> +} >> + >> +static int dcc_remove(struct platform_device *pdev) >> +{ >> + struct dcc_drvdata *drvdata = platform_get_drvdata(pdev); >> + >> + dcc_delete_debug_dir(drvdata); >> + >> + dcc_sram_dev_exit(drvdata); >> + > No need for blank lines between each calls. Ack > >> + dcc_config_reset(drvdata); >> + >> + return 0; >> +} >> + >> +static const struct of_device_id dcc_match_table[] = { >> + { .compatible = "qcom,sm8150-dcc", .data = (void *)0x5000 }, >> + { .compatible = "qcom,sc7280-dcc", .data = (void *)0x12000 }, >> + { .compatible = "qcom,sc7180-dcc", .data = (void *)0x6000 }, >> + { .compatible = "qcom,sdm845-dcc", .data = (void *)0x6000 }, >> + { } >> +}; >> +MODULE_DEVICE_TABLE(of, dcc_match_table); >> + >> +static struct platform_driver dcc_driver = { >> + .probe = dcc_probe, >> + .remove = dcc_remove, >> + .driver = { >> + .name = "qcom-dcc", >> + .of_match_table = dcc_match_table, >> + }, >> +}; >> + >> +module_platform_driver(dcc_driver); >> + >> +MODULE_LICENSE("GPL"); >> +MODULE_DESCRIPTION("Qualcomm Technologies Inc. DCC driver"); >> + > Best regards, > Krzysztof > 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 49841C32771 for ; Sat, 24 Sep 2022 11:45:52 +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-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:CC:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=V9mceEsQ5enozeRS7JUF597KQS0JpEngG8HUAmaBsUg=; b=ATdr+dECJI0SYg Fv8igmtagzAbWnrKxtqyhk6/flNTaYD+EbHUIt6vWzQ/hxb+K7w4ksuJgUKgtL3z1GGpetRD754Hv TX/bFTZfPJNaEiHnn4nCuGsrnlHJom3EPyuYdfwwdcB898AALXvcwj8VXzFcR/hf4AzTV3GsesHrI k+HM2yQ4WYl8mmhA1+5E8UUoZS3dRp+no/JMfJMhfk3pbZ+KNvim859So8LNAjZPNGTVlWmm+79wc Qh2QF9bfT5kEiqvNAH++d7WJqD1veeQgEBvfGPa1KcRsOv8JcOgRHqfZLJlssswlyzXiCueaQaxpP LCwKKC0r8rR+h3zZshmg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oc3aU-0070lI-Ru; Sat, 24 Sep 2022 11:44:51 +0000 Received: from mx0a-0031df01.pphosted.com ([205.220.168.131]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oc3aR-0070kK-49 for linux-arm-kernel@lists.infradead.org; Sat, 24 Sep 2022 11:44:49 +0000 Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 28OBiORQ003689; Sat, 24 Sep 2022 11:44:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=3N1VaLpXUDkXxS9kSOW/35TYj4yY7CtvK57VDScUYOE=; b=Q2wGJMTuP0svRfVDj4EGI97TmocbPgs4sj7oGS39R42NC6s9QqMwtCocsUkOgjLqqcM4 9B5gGx3NP25kwFGgh6FqlE6Z/42hkUJ+rrPzTteqY6QPARIidav3kOEOQFw4ZmGLmcGD E1tk7W4YneIRUqGcXo9HPGCMEzA+4bgtKekxSzxOf06nad1dZShViq9OzOjkuqxBg3qb KANZuVO+KiBN9uv21ag69jUjY9swJznhyL7TUADxlZ1QmN9pdBPnmLrCVYF9s8C6cWmL dY0Cwn+rzA1x8j3DagQDQjKNMHIVWGdb/H5oYshuH/zULv3XKZoaDXRUvMvXKcmjKnkJ Bw== Received: from nalasppmta03.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3jsu6frje4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 24 Sep 2022 11:44:36 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA03.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 28OBiZHD015936 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 24 Sep 2022 11:44:35 GMT Received: from [10.110.112.23] (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.29; Sat, 24 Sep 2022 04:44:30 -0700 Message-ID: <9cba3c3d-c489-d99b-0bf1-81113fd6186f@quicinc.com> Date: Sat, 24 Sep 2022 17:14:26 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: Re: [PATCH V13 2/7] soc: qcom: dcc: Add driver support for Data Capture and Compare unit(DCC) Content-Language: en-US To: Krzysztof Kozlowski , Andy Gross , Bjorn Andersson , Rob Herring , Alex Elder CC: , , , , "Sai Prakash Ranjan" , Sibi Sankar , Rajendra Nayak , References: <44ca04316e8b67f1662d304d8535236d82710bda.1663642052.git.quic_schowdhu@quicinc.com> From: Souradeep Chowdhury In-Reply-To: X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: D1ViNZuXCqshm-L8q8dUw0YAmA6WaEZk X-Proofpoint-ORIG-GUID: D1ViNZuXCqshm-L8q8dUw0YAmA6WaEZk X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.528,FMLib:17.11.122.1 definitions=2022-09-24_04,2022-09-22_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 clxscore=1015 bulkscore=0 suspectscore=0 phishscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 mlxscore=0 mlxlogscore=999 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2209240088 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220924_044447_198902_9946B663 X-CRM114-Status: GOOD ( 36.53 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Ck9uIDkvMjQvMjAyMiAxOjEyIEFNLCBLcnp5c3p0b2YgS296bG93c2tpIHdyb3RlOgo+IE9uIDIw LzA5LzIwMjIgMDU6NTYsIFNvdXJhZGVlcCBDaG93ZGh1cnkgd3JvdGU6Cj4+IFRoZSBEQ0MgaXMg YSBETUEgRW5naW5lIGRlc2lnbmVkIHRvIGNhcHR1cmUgYW5kIHN0b3JlIGRhdGEKPj4gZHVyaW5n IHN5c3RlbSBjcmFzaCBvciBzb2Z0d2FyZSB0cmlnZ2Vycy4gVGhlIERDQyBvcGVyYXRlcwo+PiBi YXNlZCBvbiB1c2VyIGlucHV0cyB2aWEgdGhlIGRlYnVnZnMgaW50ZXJmYWNlLiBUaGUgdXNlciBn aXZlcwo+PiBhZGRyZXNzZXMgYXMgaW5wdXRzIGFuZCB0aGVzZSBhZGRyZXNzZXMgYXJlIHN0b3Jl ZCBpbiB0aGUKPiAoLi4uKQo+Cj4+ICsKPj4gKyNkZWZpbmUgRENDX1JEX01PRF9XUl9BRERSICAg ICAgICAgICAgICAweEMxMDVFCj4+ICsKPj4gKy8qRENDIGRlYnVnZnMgZGlyZWN0b3J5Ki8KPj4g K3N0YXRpYyBzdHJ1Y3QgZGVudHJ5CSpkY2NfZGJnOwo+PiArCj4+ICtlbnVtIGRjY19kZXNjcmlw dG9yX3R5cGUgewo+PiArCURDQ19SRUFEX1RZUEUsCj4+ICsJRENDX0xPT1BfVFlQRSwKPj4gKwlE Q0NfUkVBRF9XUklURV9UWVBFLAo+PiArCURDQ19XUklURV9UWVBFCj4+ICt9Owo+PiArCj4+ICtz dHJ1Y3QgZGNjX2NvbmZpZ19lbnRyeSB7Cj4+ICsJdTMyCQkJCWJhc2U7Cj4+ICsJdTMyCQkJCW9m ZnNldDsKPj4gKwl1MzIJCQkJbGVuOwo+PiArCXUzMgkJCQlsb29wX2NudDsKPj4gKwl1MzIJCQkJ d3JpdGVfdmFsOwo+PiArCXUzMgkJCQltYXNrOwo+PiArCWJvb2wJCQkJYXBiX2J1czsKPj4gKwll bnVtIGRjY19kZXNjcmlwdG9yX3R5cGUJZGVzY190eXBlOwo+PiArCXN0cnVjdCBsaXN0X2hlYWQJ CWxpc3Q7Cj4+ICt9Owo+PiArCj4+ICsvKioKPj4gKyAqIHN0cnVjdCBkY2NfZHJ2ZGF0YSAtIGNv bmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhIGRjYyBkZXZpY2UKPj4gKyAqIEBi YXNlOgkgICAgICBCYXNlIEFkZHJlc3Mgb2YgdGhlIGRjYyBkZXZpY2UKPj4gKyAqIEBkZXY6CSAg ICAgIFRoZSBkZXZpY2UgYXR0YWNoZWQgdG8gdGhlIGRyaXZlciBkYXRhCj4+ICsgKiBAbXV0ZXg6 CSAgICAgIExvY2sgdG8gcHJvdGVjdCBhY2Nlc3MgYW5kIG1hbmlwdWxhdGlvbiBvZiBkY2NfZHJ2 ZGF0YQo+PiArICogQHJhbV9iYXNlOiAgICAgICAgIEJhc2UgYWRkcmVzcyBmb3IgdGhlIFNSQU0g ZGVkaWNhdGVkIGZvciB0aGUgZGNjIGRldmljZQo+PiArICogQHJhbV9zaXplOiAgICAgICAgIFRv dGFsIHNpemUgb2YgdGhlIFNSQU0gZGVkaWNhdGVkIGZvciB0aGUgZGNjIGRldmljZQo+PiArICog QHJhbV9vZmZzZXQ6ICAgICAgIE9mZnNldCB0byB0aGUgU1JBTSBkZWRpY2F0ZWQgZm9yIGRjYyBk ZXZpY2UKPj4gKyAqIEBtZW1fbWFwX3ZlcjogICAgICBNZW1vcnkgbWFwIHZlcnNpb24gb2YgREND IGhhcmR3YXJlCj4+ICsgKiBAcmFtX2NmZzogICAgICAgICAgVXNlZCBmb3IgYWRkcmVzcyBsaW1p dCBjYWxjdWxhdGlvbiBmb3IgZGNjCj4+ICsgKiBAcmFtX3N0YXJ0OiAgICAgICAgU3RhcnRpbmcg YWRkcmVzcyBvZiBEQ0MgU1JBTQo+PiArICogQHNyYW1fZGV2OgkgICAgICBNaWNlbGxhbmVvdXMg ZGV2aWNlIGVxdWl2YWxlbnQgb2YgZGNjIFNSQU0KPj4gKyAqIEBjZmdfaGVhZDoJICAgICAgUG9p bnRzIHRvIHRoZSBoZWFkIG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBhZGRyZXNzZXMKPj4gKyAqIEBk YmdfZGlyOiAgICAgICAgICBUaGUgZGNjIGRlYnVnZnMgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIGFs bCB0aGUgZGVidWdmcyBmaWxlcyBhcmUgcGxhY2VkCj4+ICsgKiBAbnJfbGlua19saXN0OiAgICAg VG90YWwgbnVtYmVyIG9mIGxpbmtlZGxpc3RzIHN1cHBvcnRlZCBieSB0aGUgRENDIGNvbmZpZ3Vy YXRpb24KPj4gKyAqIEBsb29wb2ZmOiAgICAgICAgICBMb29wIG9mZnNldCBiaXRzIHJhbmdlIGZv ciB0aGUgYWRkcmVzc2VzCj4gQWxsIHRoZXNlIGVudHJlcyBoYXZlIG1lc3NlZCB1cCBzcGFjaW5n LgpBY2sKPgo+PiArICogQGVuYWJsZTogICAgICAgICAgIFRoaXMgY29udGFpbnMgYW4gYXJyYXkg b2YgbGlua2VkbGlzdCBlbmFibGUgZmxhZ3MKPiBObywgdGhpcyBpcyBub3QgYW4gYXJyYXkgb2Yg bGlua2VkIGxpc3RzLi4uIEl0J3MgYSBwb2ludGVyIHRvIGJvb2wuIFRoaXMKPiBpcyBub3Qgd2F5 IHRvIHN0b3JlIGxpbmtlZCBsaXN0cy4KQWNrCj4KPgo+PiArCj4+ICtzdGF0aWMgaW50IGRjY19w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+PiArewo+PiArCXUzMiB2YWw7Cj4+ ICsJaW50IHJldCA9IDAsIGksIHNpemU7Cj4+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYt PmRldjsKPj4gKwlzdHJ1Y3QgZGNjX2RydmRhdGEgKmRjYzsKPj4gKwlzdHJ1Y3QgcmVzb3VyY2Ug KnJlczsKPj4gKwo+PiArCWRjYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGNjKSwgR0ZQ X0tFUk5FTCk7Cj4+ICsJaWYgKCFkY2MpCj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCj4+ICsJ ZGNjLT5kZXYgPSAmcGRldi0+ZGV2Owo+PiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRj Yyk7Cj4+ICsKPj4gKwlkY2MtPmJhc2UgPSBkZXZtX3BsYXRmb3JtX2lvcmVtYXBfcmVzb3VyY2Uo cGRldiwgMCk7Cj4+ICsJaWYgKElTX0VSUihkY2MtPmJhc2UpKQo+PiArCQlyZXR1cm4gUFRSX0VS UihkY2MtPmJhc2UpOwo+PiArCj4+ICsJZGNjLT5yYW1fYmFzZSA9IGRldm1fcGxhdGZvcm1fZ2V0 X2FuZF9pb3JlbWFwX3Jlc291cmNlKHBkZXYsIDEsICZyZXMpOwo+PiArCWlmIChJU19FUlIoZGNj LT5yYW1fYmFzZSkpCj4+ICsJCXJldHVybiBQVFJfRVJSKGRjYy0+cmFtX2Jhc2UpOwo+PiArCj4+ ICsJZGNjLT5yYW1fc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKPj4gKwo+PiArCWRjYy0+cmFt X29mZnNldCA9IChzaXplX3Qpb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwo+ PiArCj4+ICsJdmFsID0gZGNjX3JlYWRsKGRjYywgRENDX0hXX0lORk8pOwo+PiArCj4+ICsJaWYg KEZJRUxEX0dFVChEQ0NfVkVSX0lORk9fTUFTSywgdmFsKSkgewo+PiArCQlkY2MtPm1lbV9tYXBf dmVyID0gMzsKPj4gKwkJZGNjLT5ucl9saW5rX2xpc3QgPSBkY2NfcmVhZGwoZGNjLCBEQ0NfTExf TlVNX0lORk8pOwo+PiArCQlpZiAoZGNjLT5ucl9saW5rX2xpc3QgPT0gMCkKPj4gKwkJCXJldHVy bgktRUlOVkFMOwo+PiArCX0gZWxzZSBpZiAoKHZhbCAmIERDQ19WRVJfTUFTSzIpID09IERDQ19W RVJfTUFTSzIpIHsKPj4gKwkJZGNjLT5tZW1fbWFwX3ZlciA9IDI7Cj4+ICsJCWRjYy0+bnJfbGlu a19saXN0ID0gZGNjX3JlYWRsKGRjYywgRENDX0xMX05VTV9JTkZPKTsKPj4gKwkJaWYgKGRjYy0+ bnJfbGlua19saXN0ID09IDApCj4+ICsJCQlyZXR1cm4JLUVJTlZBTDsKPj4gKwl9IGVsc2Ugewo+ PiArCQlkY2MtPm1lbV9tYXBfdmVyID0gMTsKPj4gKwkJZGNjLT5ucl9saW5rX2xpc3QgPSBEQ0Nf TUFYX0xJTktfTElTVDsKPj4gKwl9Cj4+ICsKPj4gKwkvKiBFaXRoZXIgc2V0IHRoZSBmaXhlZCBs b29wIG9mZnNldCBvciBjYWxjdWxhdGUgaXQKPiBTdGFydCB3aXRoIC8qCj4gKHNlZSBjb2Rpbmcg c3R5bGUpCkFjawo+Cj4+ICsJICogZnJvbSByYW1fc2l6ZS5NYXggY29uc2VjdXRpdmUgYWRkcmVz c2VzIHRoZQo+PiArCSAqIGRjYyBjYW4gbG9vcCBpcyBlcXVpdmFsZW50IHRvIHRoZSByYW0gc2l6 ZQo+PiArCSAqLwo+PiArCWlmICh2YWwgJiBEQ0NfTE9PUF9PRkZTRVRfTUFTSykKPj4gKwkJZGNj LT5sb29wb2ZmID0gRENDX0ZJWF9MT09QX09GRlNFVDsKPj4gKwllbHNlCj4+ICsJCWRjYy0+bG9v cG9mZiA9IGdldF9iaXRtYXNrX29yZGVyKChkY2MtPnJhbV9zaXplICsKPj4gKwkJCQlkY2MtPnJh bV9vZmZzZXQpIC8gNCAtIDEpOwo+PiArCj4+ICsJbXV0ZXhfaW5pdCgmZGNjLT5tdXRleCk7Cj4+ ICsJLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCBlbnRyaWVzIGF0IG9uY2UgKi8KPj4gKwlzaXpl ID0gc2l6ZW9mKCpkY2MtPmVuYWJsZSkgKyBzaXplb2YoKmRjYy0+Y2ZnX2hlYWQpOwo+IFRoaXMg aXMgcXVpdGUgY29uZnVzaW5nIHdheSBvZiBoYW5kbGluZyBsaXN0cyAtIHNvbWUgcGFydHMgb2Yg ZHJ2ZGF0YQo+IGFyZSBsaXN0LCBzb21lIGFyZSBub3QuCgpXZSBhcmUgdXNpbmcgdGhyZWUgdGhp bmdzIGZvciBsaXN0cyBoZXJlLsKgIEEgY2ZnX2hlYWQgd2hpY2ggcG9pbnRzIHRvIAp0aGUgaGVh ZCBvZiB0aGUKCmluZGl2aWR1YWwgbGlua2VkbGlzdCBvZiBhZGRyZXNzZXMuIGEgbnJfbGlua2Vk X2xpc3QgdG8gc3RvcmUgdGhlIHRvdGFsIApudW1iZXIgb2YgbGlzdHMKCnN1cHBvcnRlZCBieSBk Y2MgYW5kIGFuIGFycmF5IG9mIGJvb2xlYW4gdG8gc3RvcmUgdGhlIGVuYWJsZWQgc3RhdHVzIG9m IAplYWNoIGluZGl2aWR1YWwgbGlzdHMKCj4+ICsKPj4gKwlkY2MtPmVuYWJsZSA9IGRldm1fa2Nh bGxvYyhkZXYsIGRjYy0+bnJfbGlua19saXN0LCBzaXplLCBHRlBfS0VSTkVMKTsKPj4gKwlpZiAo IWRjYy0+ZW5hYmxlKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCWRjYy0+Y2ZnX2hl YWQgPSAoc3RydWN0IGxpc3RfaGVhZCAqKShkY2MtPmVuYWJsZSArIGRjYy0+bnJfbGlua19saXN0 KTsKPiBUaGF0J3MgdW51c3VhbCB3YXkgdG8gaXRlcmF0ZSBvdmVyIGxpc3QuLi4KSGVyZSB3ZSBh cmUgaW5zdGFudGlhdGluZyB0aGUgaGVhZCBvZiBlYWNoIGluZGl2aWR1YWwgbGlua2VkIGxpc3Rz IGluIAp0aGUgYXJyYXkgdGhhdCBzdG9yZXMgdGhlIGxpc3QuCj4KPj4gKwo+PiArCWZvciAoaSA9 IDA7IGkgPCBkY2MtPm5yX2xpbmtfbGlzdDsgaSsrKQo+PiArCQlJTklUX0xJU1RfSEVBRCgmZGNj LT5jZmdfaGVhZFtpXSk7Cj4+ICsKPj4gKwlyZXQgPSBkY2Nfc3JhbV9kZXZfaW5pdChkY2MpOwo+ PiArCWlmIChyZXQpIHsKPj4gKwkJZGV2X2VycihkY2MtPmRldiwgIkRDQzogc3JhbSBub2RlIG5v dCByZWdpc3RlcmVkLlxuIik7Cj4+ICsJCXJldHVybiByZXQ7Cj4+ICsJfQo+PiArCj4+ICsJcmV0 ID0gZGNjX2NyZWF0ZV9kZWJ1Z19kaXIoZGNjKTsKPj4gKwlpZiAocmV0KSB7Cj4+ICsJCWRldl9l cnIoZGNjLT5kZXYsICJEQ0M6IGRlYnVnZnMgZmlsZXMgbm90IGNyZWF0ZWQuXG4iKTsKPiBkZWJ1 Z2ZzIGZhaWx1cmVzIGFyZSBub3QgcmVhc29ucyB0byBmYWlsIHByb2JlLiBBbHNvIG5vIG5lZWQg dG8gcHJpbnQKPiBlcnJvcnMuCgpUaGUgdG90YWwgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGRyaXZl ciBpcyBkZXBlbmRlbnQgb24gdGhlIGRlYnVnZnMgCmZpbGVzLiBUaGF0IGlzIHdoeQoKdGhlIHBy b2JlIGlmIGZhaWxlZCB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgaXQgaXMgbm90IGNyZWF0ZWQuIFRo aXMgaXMgCmRvbmUgYXMgcGVyIEFsZXgncwoKY29tbWVudCBvbiB2ZXJzaW9uIDggb2YgdGhlIHBh dGNoLgoKPj4gKwkJZGNjX3NyYW1fZGV2X2V4aXQoZGNjKTsKPj4gKwkJcmV0dXJuIHJldDsKPj4g Kwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBkY2NfcmVt b3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4+ICt7Cj4+ICsJc3RydWN0IGRjY19k cnZkYXRhICpkcnZkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4+ICsKPj4gKwlk Y2NfZGVsZXRlX2RlYnVnX2RpcihkcnZkYXRhKTsKPj4gKwo+PiArCWRjY19zcmFtX2Rldl9leGl0 KGRydmRhdGEpOwo+PiArCj4gTm8gbmVlZCBmb3IgYmxhbmsgbGluZXMgYmV0d2VlbiBlYWNoIGNh bGxzLgpBY2sKPgo+PiArCWRjY19jb25maWdfcmVzZXQoZHJ2ZGF0YSk7Cj4+ICsKPj4gKwlyZXR1 cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGNj X21hdGNoX3RhYmxlW10gPSB7Cj4+ICsJeyAuY29tcGF0aWJsZSA9ICJxY29tLHNtODE1MC1kY2Mi LCAuZGF0YSA9ICh2b2lkICopMHg1MDAwIH0sCj4+ICsJeyAuY29tcGF0aWJsZSA9ICJxY29tLHNj NzI4MC1kY2MiLCAuZGF0YSA9ICh2b2lkICopMHgxMjAwMCB9LAo+PiArCXsgLmNvbXBhdGlibGUg PSAicWNvbSxzYzcxODAtZGNjIiwgLmRhdGEgPSAodm9pZCAqKTB4NjAwMCB9LAo+PiArCXsgLmNv bXBhdGlibGUgPSAicWNvbSxzZG04NDUtZGNjIiwgLmRhdGEgPSAodm9pZCAqKTB4NjAwMCB9LAo+ PiArCXsgfQo+PiArfTsKPj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGRjY19tYXRjaF90YWJs ZSk7Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRjY19kcml2ZXIgPSB7 Cj4+ICsJLnByb2JlID0gZGNjX3Byb2JlLAo+PiArCS5yZW1vdmUJPSBkY2NfcmVtb3ZlLAo+PiAr CS5kcml2ZXIJPSB7Cj4+ICsJCS5uYW1lID0gInFjb20tZGNjIiwKPj4gKwkJLm9mX21hdGNoX3Rh YmxlCT0gZGNjX21hdGNoX3RhYmxlLAo+PiArCX0sCj4+ICt9Owo+PiArCj4+ICttb2R1bGVfcGxh dGZvcm1fZHJpdmVyKGRjY19kcml2ZXIpOwo+PiArCj4+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7 Cj4+ICtNT0RVTEVfREVTQ1JJUFRJT04oIlF1YWxjb21tIFRlY2hub2xvZ2llcyBJbmMuIERDQyBk cml2ZXIiKTsKPj4gKwo+IEJlc3QgcmVnYXJkcywKPiBLcnp5c3p0b2YKPgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=