From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yb1-f174.google.com (mail-yb1-f174.google.com [209.85.219.174]) (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 0ECD53EA7B for ; Thu, 28 Mar 2024 09:10:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.174 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711617046; cv=none; b=BFWmomVf9hPkxBd9IBfGK3zs/UA2K11GhcFoJpgGMg4Xhn3y9j5a3dO2bdwDIzsWTKySU352XljmLEO8SgQd2EkwbQK0d/bgS22FJiK7zGg0Rcx8wXtEQp6T3ufctH4BCgXBr0uBSCOJYw7hDlbRgSo4P3MCbOyPH19fP3XN+Co= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711617046; c=relaxed/simple; bh=zs1W41ONFASJqBRMmOeY3SJDp6Omt2dZKibNGDwafio=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=N2e0HRDnLnPqzhPrP3dGIEFPPVXHMqlPy/W61EZYoO0R2GMSmxcIHdR8MK6u8RNNB+ob0HcUmr83t7vLkrcR8815tkPeDngPIURvfN2XMgPQM0ruCfCJiCiuwl4RGso1eNfyMfHceKP4DcQW1fQJHTY4BUZPmdK6/DGv8RmvOiM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=cwxLd6NP; arc=none smtp.client-ip=209.85.219.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="cwxLd6NP" Received: by mail-yb1-f174.google.com with SMTP id 3f1490d57ef6-dcbc6a6808fso597234276.2 for ; Thu, 28 Mar 2024 02:10:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1711617044; x=1712221844; 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=9KhmQXbbvltdCLYtd5UE/LLG4WE9XPPqX5yUaWcDs3Y=; b=cwxLd6NPI1eNzGiErfL1Q+YGBlrXLxHbmXr7q40B7o7s1K9F6dxP1vdxqijjATRvWE LBTvRHCKbiDti29VEwrYppEzu0/JS/rUmi9t6ef1ALLXGnwOkdOZjTpWN3UQHj+AHelN /SmboOk6pKD5MX8l5vKB16rFjfEKkIP9QJa04q0mlGhmOTuPClAKyFcPGmTn5wQi21vY Rbtpxoqvo2MK92ebPtTSgK/0sQJQI2htqiWOQ1d49X4B/FZawk1TDxyXY1AQuXqLhjKg 36AzJA5Hvs6F9sqygkwl97MX28etdOojdjz8PryOHi9fBFWQZ7UUXyxhra61ljTTKPdU l57g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711617044; x=1712221844; 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=9KhmQXbbvltdCLYtd5UE/LLG4WE9XPPqX5yUaWcDs3Y=; b=WN0g8o0iyhQ2W3XcsG1DzfxKZqrN7U9p7KSd0I1JgDQBtpIq9nF4uxDqReYpdxcwWk PEBJX90UWpnFxAntcl5fNDF+9wT3eDZV7dsKJ8CUlR8I74V2yDiY8rERK4h/ajN0JsJv EmlNjaviwiXp3tKus0tvCnnS/f68hhH2f9rBEwo+bK3dhsit5schhTxXA3PgjrUutW3S 3BXT7lHugX4T1UJlcVVjZIciU/l1KiBkTdAdLFomdm66TlwoyhV+eJ9XoOGhgl3kMHUB 0I+IUULoo/Z5ZRgkpwZnfjQFdWq08AAye+22z64kb/PSZ1AbFGcXgp0Gl3hiNaXZnikt Uthw== X-Forwarded-Encrypted: i=1; AJvYcCU8ylxIR03+rVZTsJUY9UTyGg2UKYIi1uIRNprKUlpIbPVYnh4LtJ6bJoTrepu4chMc74tx3dD2pA4RE6Vt8OUW6smjOVNYQmZzVfkM X-Gm-Message-State: AOJu0YwUAuY163xnSQaX/tPUK+gDn9wjDyCNaxYB7nBgqTNsKei1yGCt k+bCZBPX3X+5vj8xmLQwUGM+wzHrP1XwJXDNlq8x3t2mOFj+ngVXHoQsMbdBNNLJf7hHOSeqatB m5jBNz6ZBz2XV5fRGYbXUo+Q5dkGY2JljEc1ehA== X-Google-Smtp-Source: AGHT+IE/An0AbYWd/vynrRp8DTmGveyGGpQEeSo55JBojQnvTdoXVkDFJynntDgoXapBblKZSyiQw6tIneF8Q5a7YVE= X-Received: by 2002:a25:6c54:0:b0:dc7:140:8c0c with SMTP id h81-20020a256c54000000b00dc701408c0cmr2153996ybc.23.1711617043928; Thu, 28 Mar 2024 02:10:43 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240313035719.768469-1-ychuang570808@gmail.com> <20240313035719.768469-4-ychuang570808@gmail.com> In-Reply-To: <20240313035719.768469-4-ychuang570808@gmail.com> From: Linus Walleij Date: Thu, 28 Mar 2024 10:10:33 +0100 Message-ID: Subject: Re: [PATCH v6 3/3] pinctrl: nuvoton: Add ma35d1 pinctrl and GPIO driver To: Jacky Huang Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, p.zabel@pengutronix.de, j.neuschaefer@gmx.net, linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, ychuang3@nuvoton.com, schung@nuvoton.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Jacky, overall this looks very good. On Wed, Mar 13, 2024 at 4:57=E2=80=AFAM Jacky Huang wrote: > From: Jacky Huang > > Add common pinctrl and GPIO driver for Nuvoton MA35 series SoC, and > add support for ma35d1 pinctrl. > > Signed-off-by: Jacky Huang (...) > +static int ma35_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int= selector, > + unsigned int group) > +{ > + struct ma35_pinctrl *npctl =3D pinctrl_dev_get_drvdata(pctldev); > + struct ma35_pin_group *grp =3D &npctl->groups[group]; > + struct ma35_pin_setting *setting =3D grp->settings; > + u32 i, regval; > + > + dev_dbg(npctl->dev, "enable function %s group %s\n", > + npctl->functions[selector].name, npctl->groups[group].nam= e); > + > + for (i =3D 0; i < grp->npins; i++) { > + regmap_read(npctl->regmap, setting->offset, ®val); > + regval &=3D ~GENMASK(setting->shift + 3, setting->shift); Add a comment explaining why you add +3 > +static int ma35_gpio_core_direction_in(struct gpio_chip *gc, unsigned in= t gpio) > +{ > + struct ma35_pin_bank *bank =3D gpiochip_get_data(gc); > + void __iomem *reg_mode =3D bank->reg_base + MA35_GP_REG_MODE; > + unsigned long flags; > + unsigned int regval; > + > + spin_lock_irqsave(&bank->lock, flags); > + > + regval =3D readl(reg_mode); > + regval &=3D ~GENMASK(gpio * 2 + 1, gpio * 2); > + regval |=3D MA35_GP_MODE_INPUT << gpio * 2; Here the first time you do this magic explain in a comment why you use *2+1 and *2 overall (I guess two bits per line). > +static int ma35_gpio_core_get(struct gpio_chip *gc, unsigned int gpio) > +{ > + struct ma35_pin_bank *bank =3D gpiochip_get_data(gc); > + > + return readl(bank->reg_base + MA35_PIN_MAP_BASE + gpio * 4); Here add a comment explaining the *4 I guess one 32-bit register per pin? > +static int ma35_irq_irqtype(struct irq_data *d, unsigned int type) > +{ > + struct ma35_pin_bank *bank =3D gpiochip_get_data(irq_data_get_irq= _chip_data(d)); > + void __iomem *reg_itype =3D bank->reg_base + MA35_GP_REG_INTTYPE; > + void __iomem *reg_ien =3D bank->reg_base + MA35_GP_REG_INTEN; > + unsigned int num =3D (d->hwirq); > + > + if (type =3D=3D IRQ_TYPE_PROBE) { > + writel(readl(reg_itype) & ~BIT(num), reg_itype); > + writel(readl(reg_ien) | BIT(num) | BIT(num + 16), reg_ien= ); > + bank->irqtype &=3D ~BIT(num); > + bank->irqinten |=3D BIT(num) | BIT(num + 16); > + return 0; > + } > + > + if (type & IRQ_TYPE_LEVEL_MASK) { > + writel(readl(reg_itype) | BIT(num), reg_itype); > + writel(readl(reg_ien) & ~(BIT(num) | BIT(num + 16)), reg_= ien); > + bank->irqtype |=3D BIT(num); > + bank->irqinten &=3D ~(BIT(num) | BIT(num + 16)); > + if (type =3D=3D IRQ_TYPE_LEVEL_HIGH) { > + writel(readl(reg_ien) | BIT(num + 16), reg_ien); > + bank->irqinten |=3D BIT(num + 16); > + return 0; > + } > + > + if (type =3D=3D IRQ_TYPE_LEVEL_LOW) { > + writel(readl(reg_ien) | BIT(num), reg_ien); > + bank->irqinten |=3D BIT(num); > + return 0; > + } > + > + } else { > + writel(readl(reg_itype) & ~BIT(num), reg_itype); > + bank->irqtype &=3D ~BIT(num); > + > + if (type & IRQ_TYPE_EDGE_RISING) { > + writel(readl(reg_ien) | BIT(num + 16), reg_ien); > + bank->irqinten |=3D BIT(num + 16); > + > + } else { > + writel(readl(reg_ien) & ~BIT(num + 16), reg_ien); > + bank->irqinten &=3D ~BIT(num + 16); > + } > + > + if (type & IRQ_TYPE_EDGE_FALLING) { > + writel(readl(reg_ien) | BIT(num), reg_ien); > + bank->irqinten |=3D BIT(num); > + > + } else { > + writel(readl(reg_ien) & ~BIT(num), reg_ien); > + bank->irqinten &=3D ~BIT(num); > + } > + } > + return 0; > +} I don't understand why you don't set the irq_handler: irq_set_handler_locked(d, handle_edge_irq); irq_set_handler_locked(d, handle_level_irq); It seems you are not handling IRQ_TYPE_EDGE_BOTH? What happens if both rising and falling is specified simultaneously? The if/else nesting is hard to read. switch (type) { case IRQ_TYPE_EDGE_BOTH: (...) case IRQ_TYPE_EDGE_RISING: (...) See drivers/gpio/gpio-ftgpio010.c for an example. Have you checked that handling edge and level IRQs really work as expected? > +static int ma35_gpiolib_register(struct platform_device *pdev, struct ma= 35_pinctrl *npctl) > +{ > + struct ma35_pin_ctrl *ctrl =3D npctl->ctrl; > + struct ma35_pin_bank *bank =3D ctrl->pin_banks; > + int ret; > + int i; > + > + for (i =3D 0; i < ctrl->nr_banks; ++i, ++bank) { > + if (!bank->valid) { > + dev_warn(&pdev->dev, "bank %s is not valid\n", > + bank->np->name); > + continue; > + } > + bank->irqtype =3D 0; > + bank->irqinten =3D 0; > + bank->chip.label =3D bank->name; > + bank->chip.of_gpio_n_cells =3D 2; > + bank->chip.parent =3D &pdev->dev; > + bank->chip.request =3D ma35_gpio_core_to_request; > + bank->chip.direction_input =3D ma35_gpio_core_direction_i= n; > + bank->chip.direction_output =3D ma35_gpio_core_direction_= out; > + bank->chip.get =3D ma35_gpio_core_get; > + bank->chip.set =3D ma35_gpio_core_set; > + bank->chip.base =3D -1; > + bank->chip.ngpio =3D bank->nr_pins; > + bank->chip.can_sleep =3D false; > + spin_lock_init(&bank->lock); > + > + if (bank->irq > 0) { > + struct gpio_irq_chip *girq; > + > + girq =3D &bank->chip.irq; > + gpio_irq_chip_set_chip(girq, &ma35_gpio_irqchip); > + girq->parent_handler =3D ma35_irq_demux_intgroup; > + girq->num_parents =3D 1; > + > + girq->parents =3D devm_kcalloc(&pdev->dev, 1, siz= eof(*girq->parents), > + GFP_KERNEL); > + if (!girq->parents) > + return -ENOMEM; > + > + girq->parents[0] =3D bank->irq; > + girq->default_type =3D IRQ_TYPE_NONE; > + girq->handler =3D handle_level_irq; Does this really work for the edge IRQs? I recommend setting this to handle_bad_irq and assign the right handler in .set_type(). Yours, Linus Walleij 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 4F78DC54E64 for ; Thu, 28 Mar 2024 09:11:04 +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=IkU0jJHas+YNUT/rDwrYS+426231rs3h9FYBM8drA4s=; b=FQezam/nopdEV+ 7vI8J28oKIUYPBMcYsTQlXpkT6QKI7UqlRlfzcHu+fAPevnP0idp7aoKV2Te2alhyKxezT9VW+ASG +0nInoQ4tfR60KQQvSElz2ffKCJg9r23FTTXH7F6CaXhuOY3EDRN7PHVTz2MmNxD2Fq0/x0LIk2bu /qvroAnOzbMLEeqkNjB5vLKicpakQx29kAbLfm0u/tZ+4IAFrptJHtLaS4tM5GdUUWOOqWDl+e1jL djP9kziixbGrpOiH1WX8RMa4zmjR77eGP2udhomCGkh1haMCV/IDUsx8A43CJr5mc6MGi6Qyk6vT1 yz5fmaFFOMNYOxVZu7yA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rplmZ-0000000DFKA-3oMR; Thu, 28 Mar 2024 09:10:47 +0000 Received: from mail-yb1-xb2b.google.com ([2607:f8b0:4864:20::b2b]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rplmX-0000000DFJc-2Ql4 for linux-arm-kernel@lists.infradead.org; Thu, 28 Mar 2024 09:10:46 +0000 Received: by mail-yb1-xb2b.google.com with SMTP id 3f1490d57ef6-dc74e33fe1bso682919276.0 for ; Thu, 28 Mar 2024 02:10:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1711617044; x=1712221844; 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=9KhmQXbbvltdCLYtd5UE/LLG4WE9XPPqX5yUaWcDs3Y=; b=rTsdT224tdGPJTtEBhwj3JgD1vwV/5FVjZIhWRkIFDwVk3HsqhG+TzdNi7XtKCwBet 3KJPNeZdyGoTkL6r5cdXkeskzhKNWOAz+7ibchr/AEnNuoluZMpV+9og5Xlq4W7haUvd A9BA1/RbQBHepp2L5eIqkDEuR5LOSXtLWSZTTkTofoaPpBscc4gdNLjsCgzTfb9i48N6 M4K9US+n+g706B6W5mlwl1mphTeB3aTcH+0dupcYgfzDSwm6vTcNa293DEKEMhvl8wHU g4JPZHr47rXlv4UzROLrnBY+x2kR7VXZDhW8SZjZuiZL4HNPTwFA48qZ4AexbRffW9zh 6W2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711617044; x=1712221844; 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=9KhmQXbbvltdCLYtd5UE/LLG4WE9XPPqX5yUaWcDs3Y=; b=cIzDVlt1vuKW2sIBu9OwPMDrXMi+YpEG4XzjDyfh48uH7e6hOK2tmjmoyZ2CWd9fsQ A7YdQ9WpaEk8oDXFStG4LsYE3wciUMLYW4VLMndS4sekJm5g/608Kyo8Piq/zGp7854I /KMqdlu1Sr/x1fs6cQ6aRIpi870D3RO5xP3GA6lCXXZL6iBKpMdAg1lfZTox8zd6HXY8 WgV9dcd+uCs1jf9TXsARx09v5ufqVKoLriyqPDdXlKCd09EqGiPgmOOFW1WaEBD4rVvc Bv+RpZUpNcsUPzhL/VFSUz3+L/fZ2FPqxlInccCXtRfjGd+G2YTj34uMl5h2ZOG39vke bsEg== X-Forwarded-Encrypted: i=1; AJvYcCVKzUXLm39n3dNK1IM/Cn/vltOprSEos++Q/V5RjT2itxbTIT5nVvAz65OqsxxvfXlfk+EJ1qiqG/FJLHfMr6p6RHeH/W36fD16DVYLruNakuJzS6M= X-Gm-Message-State: AOJu0YwXyRO2NjY/1q6RO4ezm7/YG3Z4hfBTtJcoz1T9DF7bdca34jS8 GdGczg2+K8ykRPQBPd+Te3WVeU1Ps0H8snf2IlaxE06zBc8yrmDL6nnBIgy8QCaJo2uimWvLlg+ Ul/pyHqo2vezjBtH0TYxbpDF+Z1Enzi5tF3TPUw== X-Google-Smtp-Source: AGHT+IE/An0AbYWd/vynrRp8DTmGveyGGpQEeSo55JBojQnvTdoXVkDFJynntDgoXapBblKZSyiQw6tIneF8Q5a7YVE= X-Received: by 2002:a25:6c54:0:b0:dc7:140:8c0c with SMTP id h81-20020a256c54000000b00dc701408c0cmr2153996ybc.23.1711617043928; Thu, 28 Mar 2024 02:10:43 -0700 (PDT) MIME-Version: 1.0 References: <20240313035719.768469-1-ychuang570808@gmail.com> <20240313035719.768469-4-ychuang570808@gmail.com> In-Reply-To: <20240313035719.768469-4-ychuang570808@gmail.com> From: Linus Walleij Date: Thu, 28 Mar 2024 10:10:33 +0100 Message-ID: Subject: Re: [PATCH v6 3/3] pinctrl: nuvoton: Add ma35d1 pinctrl and GPIO driver To: Jacky Huang Cc: robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, p.zabel@pengutronix.de, j.neuschaefer@gmx.net, linux-arm-kernel@lists.infradead.org, linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, ychuang3@nuvoton.com, schung@nuvoton.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240328_021045_658359_021B530E X-CRM114-Status: GOOD ( 20.99 ) 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 SGkgSmFja3ksCgpvdmVyYWxsIHRoaXMgbG9va3MgdmVyeSBnb29kLgoKT24gV2VkLCBNYXIgMTMs IDIwMjQgYXQgNDo1N+KAr0FNIEphY2t5IEh1YW5nIDx5Y2h1YW5nNTcwODA4QGdtYWlsLmNvbT4g d3JvdGU6CgoKPiBGcm9tOiBKYWNreSBIdWFuZyA8eWNodWFuZzNAbnV2b3Rvbi5jb20+Cj4KPiBB ZGQgY29tbW9uIHBpbmN0cmwgYW5kIEdQSU8gZHJpdmVyIGZvciBOdXZvdG9uIE1BMzUgc2VyaWVz IFNvQywgYW5kCj4gYWRkIHN1cHBvcnQgZm9yIG1hMzVkMSBwaW5jdHJsLgo+Cj4gU2lnbmVkLW9m Zi1ieTogSmFja3kgSHVhbmcgPHljaHVhbmczQG51dm90b24uY29tPgooLi4uKQo+ICtzdGF0aWMg aW50IG1hMzVfcGlubXV4X3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNp Z25lZCBpbnQgc2VsZWN0b3IsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2ln bmVkIGludCBncm91cCkKPiArewo+ICsgICAgICAgc3RydWN0IG1hMzVfcGluY3RybCAqbnBjdGwg PSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKPiArICAgICAgIHN0cnVjdCBtYTM1 X3Bpbl9ncm91cCAqZ3JwID0gJm5wY3RsLT5ncm91cHNbZ3JvdXBdOwo+ICsgICAgICAgc3RydWN0 IG1hMzVfcGluX3NldHRpbmcgKnNldHRpbmcgPSBncnAtPnNldHRpbmdzOwo+ICsgICAgICAgdTMy IGksIHJlZ3ZhbDsKPiArCj4gKyAgICAgICBkZXZfZGJnKG5wY3RsLT5kZXYsICJlbmFibGUgZnVu Y3Rpb24gJXMgZ3JvdXAgJXNcbiIsCj4gKyAgICAgICAgICAgICAgIG5wY3RsLT5mdW5jdGlvbnNb c2VsZWN0b3JdLm5hbWUsIG5wY3RsLT5ncm91cHNbZ3JvdXBdLm5hbWUpOwo+ICsKPiArICAgICAg IGZvciAoaSA9IDA7IGkgPCBncnAtPm5waW5zOyBpKyspIHsKPiArICAgICAgICAgICAgICAgcmVn bWFwX3JlYWQobnBjdGwtPnJlZ21hcCwgc2V0dGluZy0+b2Zmc2V0LCAmcmVndmFsKTsKPiArICAg ICAgICAgICAgICAgcmVndmFsICY9IH5HRU5NQVNLKHNldHRpbmctPnNoaWZ0ICsgMywgc2V0dGlu Zy0+c2hpZnQpOwoKQWRkIGEgY29tbWVudCBleHBsYWluaW5nIHdoeSB5b3UgYWRkICszCgo+ICtz dGF0aWMgaW50IG1hMzVfZ3Bpb19jb3JlX2RpcmVjdGlvbl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpn YywgdW5zaWduZWQgaW50IGdwaW8pCj4gK3sKPiArICAgICAgIHN0cnVjdCBtYTM1X3Bpbl9iYW5r ICpiYW5rID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwo+ICsgICAgICAgdm9pZCBfX2lvbWVtICpy ZWdfbW9kZSA9IGJhbmstPnJlZ19iYXNlICsgTUEzNV9HUF9SRUdfTU9ERTsKPiArICAgICAgIHVu c2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKyAgICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+ICsKPiAr ICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsgICAg ICAgcmVndmFsID0gcmVhZGwocmVnX21vZGUpOwo+ICsgICAgICAgcmVndmFsICY9IH5HRU5NQVNL KGdwaW8gKiAyICsgMSwgZ3BpbyAqIDIpOwo+ICsgICAgICAgcmVndmFsIHw9IE1BMzVfR1BfTU9E RV9JTlBVVCA8PCBncGlvICogMjsKCkhlcmUgdGhlIGZpcnN0IHRpbWUgeW91IGRvIHRoaXMgbWFn aWMgZXhwbGFpbiBpbiBhIGNvbW1lbnQgd2h5IHlvdQp1c2UgKjIrMSBhbmQgKjIgb3ZlcmFsbCAo SSBndWVzcyB0d28gYml0cyBwZXIgbGluZSkuCgo+ICtzdGF0aWMgaW50IG1hMzVfZ3Bpb19jb3Jl X2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCj4gK3sKPiArICAg ICAgIHN0cnVjdCBtYTM1X3Bpbl9iYW5rICpiYW5rID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwo+ ICsKPiArICAgICAgIHJldHVybiByZWFkbChiYW5rLT5yZWdfYmFzZSArIE1BMzVfUElOX01BUF9C QVNFICsgZ3BpbyAqIDQpOwoKSGVyZSBhZGQgYSBjb21tZW50IGV4cGxhaW5pbmcgdGhlICo0Ckkg Z3Vlc3Mgb25lIDMyLWJpdCByZWdpc3RlciBwZXIgcGluPwoKPiArc3RhdGljIGludCBtYTM1X2ly cV9pcnF0eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCj4gK3sKPiAr ICAgICAgIHN0cnVjdCBtYTM1X3Bpbl9iYW5rICpiYW5rID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoaXJx X2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCkpOwo+ICsgICAgICAgdm9pZCBfX2lvbWVtICpyZWdf aXR5cGUgPSBiYW5rLT5yZWdfYmFzZSArIE1BMzVfR1BfUkVHX0lOVFRZUEU7Cj4gKyAgICAgICB2 b2lkIF9faW9tZW0gKnJlZ19pZW4gPSBiYW5rLT5yZWdfYmFzZSArIE1BMzVfR1BfUkVHX0lOVEVO Owo+ICsgICAgICAgdW5zaWduZWQgaW50IG51bSA9IChkLT5od2lycSk7Cj4gKwo+ICsgICAgICAg aWYgKHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKPiArICAgICAgICAgICAgICAgd3JpdGVsKHJl YWRsKHJlZ19pdHlwZSkgJiB+QklUKG51bSksIHJlZ19pdHlwZSk7Cj4gKyAgICAgICAgICAgICAg IHdyaXRlbChyZWFkbChyZWdfaWVuKSB8IEJJVChudW0pIHwgQklUKG51bSArIDE2KSwgcmVnX2ll bik7Cj4gKyAgICAgICAgICAgICAgIGJhbmstPmlycXR5cGUgJj0gfkJJVChudW0pOwo+ICsgICAg ICAgICAgICAgICBiYW5rLT5pcnFpbnRlbiB8PSBCSVQobnVtKSB8IEJJVChudW0gKyAxNik7Cj4g KyAgICAgICAgICAgICAgIHJldHVybiAwOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIGlmICh0 eXBlICYgSVJRX1RZUEVfTEVWRUxfTUFTSykgewo+ICsgICAgICAgICAgICAgICB3cml0ZWwocmVh ZGwocmVnX2l0eXBlKSB8IEJJVChudW0pLCByZWdfaXR5cGUpOwo+ICsgICAgICAgICAgICAgICB3 cml0ZWwocmVhZGwocmVnX2llbikgJiB+KEJJVChudW0pIHwgQklUKG51bSArIDE2KSksIHJlZ19p ZW4pOwo+ICsgICAgICAgICAgICAgICBiYW5rLT5pcnF0eXBlIHw9IEJJVChudW0pOwo+ICsgICAg ICAgICAgICAgICBiYW5rLT5pcnFpbnRlbiAmPSB+KEJJVChudW0pIHwgQklUKG51bSArIDE2KSk7 Cj4gKyAgICAgICAgICAgICAgIGlmICh0eXBlID09IElSUV9UWVBFX0xFVkVMX0hJR0gpIHsKPiAr ICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWwocmVhZGwocmVnX2llbikgfCBCSVQobnVtICsg MTYpLCByZWdfaWVuKTsKPiArICAgICAgICAgICAgICAgICAgICAgICBiYW5rLT5pcnFpbnRlbiB8 PSBCSVQobnVtICsgMTYpOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwo+ICsg ICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBJUlFfVFlQ RV9MRVZFTF9MT1cpIHsKPiArICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWwocmVhZGwocmVn X2llbikgfCBCSVQobnVtKSwgcmVnX2llbik7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgYmFu ay0+aXJxaW50ZW4gfD0gQklUKG51bSk7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu IDA7Cj4gKyAgICAgICAgICAgICAgIH0KPiArCj4gKyAgICAgICB9IGVsc2Ugewo+ICsgICAgICAg ICAgICAgICB3cml0ZWwocmVhZGwocmVnX2l0eXBlKSAmIH5CSVQobnVtKSwgcmVnX2l0eXBlKTsK PiArICAgICAgICAgICAgICAgYmFuay0+aXJxdHlwZSAmPSB+QklUKG51bSk7Cj4gKwo+ICsgICAg ICAgICAgICAgICBpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKSB7Cj4gKyAgICAgICAg ICAgICAgICAgICAgICAgd3JpdGVsKHJlYWRsKHJlZ19pZW4pIHwgQklUKG51bSArIDE2KSwgcmVn X2llbik7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgYmFuay0+aXJxaW50ZW4gfD0gQklUKG51 bSArIDE2KTsKPiArCj4gKyAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gKyAgICAgICAgICAgICAg ICAgICAgICAgd3JpdGVsKHJlYWRsKHJlZ19pZW4pICYgfkJJVChudW0gKyAxNiksIHJlZ19pZW4p Owo+ICsgICAgICAgICAgICAgICAgICAgICAgIGJhbmstPmlycWludGVuICY9IH5CSVQobnVtICsg MTYpOwo+ICsgICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBpZiAodHlwZSAm IElSUV9UWVBFX0VER0VfRkFMTElORykgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIHdyaXRl bChyZWFkbChyZWdfaWVuKSB8IEJJVChudW0pLCByZWdfaWVuKTsKPiArICAgICAgICAgICAgICAg ICAgICAgICBiYW5rLT5pcnFpbnRlbiB8PSBCSVQobnVtKTsKPiArCj4gKyAgICAgICAgICAgICAg IH0gZWxzZSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVsKHJlYWRsKHJlZ19pZW4p ICYgfkJJVChudW0pLCByZWdfaWVuKTsKPiArICAgICAgICAgICAgICAgICAgICAgICBiYW5rLT5p cnFpbnRlbiAmPSB+QklUKG51bSk7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgIH0KPiAr ICAgICAgIHJldHVybiAwOwo+ICt9CgpJIGRvbid0IHVuZGVyc3RhbmQgd2h5IHlvdSBkb24ndCBz ZXQgdGhlIGlycV9oYW5kbGVyOgppcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQsIGhhbmRsZV9lZGdl X2lycSk7CmlycV9zZXRfaGFuZGxlcl9sb2NrZWQoZCwgaGFuZGxlX2xldmVsX2lycSk7CgpJdCBz ZWVtcyB5b3UgYXJlIG5vdCBoYW5kbGluZyBJUlFfVFlQRV9FREdFX0JPVEg/CldoYXQgaGFwcGVu cyBpZiBib3RoIHJpc2luZyBhbmQgZmFsbGluZyBpcyBzcGVjaWZpZWQgc2ltdWx0YW5lb3VzbHk/ CgpUaGUgaWYvZWxzZSBuZXN0aW5nIGlzIGhhcmQgdG8gcmVhZC4Kc3dpdGNoICh0eXBlKSB7CiAg ICAgICAgY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6CiguLi4pCiAgICAgICAgY2FzZSBJUlFfVFlQ RV9FREdFX1JJU0lORzoKKC4uLikKClNlZSBkcml2ZXJzL2dwaW8vZ3Bpby1mdGdwaW8wMTAuYyBm b3IgYW4gZXhhbXBsZS4KCkhhdmUgeW91IGNoZWNrZWQgdGhhdCBoYW5kbGluZyBlZGdlIGFuZCBs ZXZlbCBJUlFzIHJlYWxseSB3b3JrCmFzIGV4cGVjdGVkPwoKPiArc3RhdGljIGludCBtYTM1X2dw aW9saWJfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IG1hMzVf cGluY3RybCAqbnBjdGwpCj4gK3sKPiArICAgICAgIHN0cnVjdCBtYTM1X3Bpbl9jdHJsICpjdHJs ID0gbnBjdGwtPmN0cmw7Cj4gKyAgICAgICBzdHJ1Y3QgbWEzNV9waW5fYmFuayAqYmFuayA9IGN0 cmwtPnBpbl9iYW5rczsKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAgICBpbnQgaTsKPiArCj4g KyAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3RybC0+bnJfYmFua3M7ICsraSwgKytiYW5rKSB7Cj4g KyAgICAgICAgICAgICAgIGlmICghYmFuay0+dmFsaWQpIHsKPiArICAgICAgICAgICAgICAgICAg ICAgICBkZXZfd2FybigmcGRldi0+ZGV2LCAiYmFuayAlcyBpcyBub3QgdmFsaWRcbiIsCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuay0+bnAtPm5hbWUpOwo+ICsgICAgICAg ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ICsgICAgICAgICAgICAgICB9Cj4gKyAgICAgICAg ICAgICAgIGJhbmstPmlycXR5cGUgPSAwOwo+ICsgICAgICAgICAgICAgICBiYW5rLT5pcnFpbnRl biA9IDA7Cj4gKyAgICAgICAgICAgICAgIGJhbmstPmNoaXAubGFiZWwgPSBiYW5rLT5uYW1lOwo+ ICsgICAgICAgICAgICAgICBiYW5rLT5jaGlwLm9mX2dwaW9fbl9jZWxscyA9IDI7Cj4gKyAgICAg ICAgICAgICAgIGJhbmstPmNoaXAucGFyZW50ID0gJnBkZXYtPmRldjsKPiArICAgICAgICAgICAg ICAgYmFuay0+Y2hpcC5yZXF1ZXN0ID0gbWEzNV9ncGlvX2NvcmVfdG9fcmVxdWVzdDsKPiArICAg ICAgICAgICAgICAgYmFuay0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBtYTM1X2dwaW9fY29yZV9k aXJlY3Rpb25faW47Cj4gKyAgICAgICAgICAgICAgIGJhbmstPmNoaXAuZGlyZWN0aW9uX291dHB1 dCA9IG1hMzVfZ3Bpb19jb3JlX2RpcmVjdGlvbl9vdXQ7Cj4gKyAgICAgICAgICAgICAgIGJhbmst PmNoaXAuZ2V0ID0gbWEzNV9ncGlvX2NvcmVfZ2V0Owo+ICsgICAgICAgICAgICAgICBiYW5rLT5j aGlwLnNldCA9IG1hMzVfZ3Bpb19jb3JlX3NldDsKPiArICAgICAgICAgICAgICAgYmFuay0+Y2hp cC5iYXNlID0gLTE7Cj4gKyAgICAgICAgICAgICAgIGJhbmstPmNoaXAubmdwaW8gPSBiYW5rLT5u cl9waW5zOwo+ICsgICAgICAgICAgICAgICBiYW5rLT5jaGlwLmNhbl9zbGVlcCA9IGZhbHNlOwo+ ICsgICAgICAgICAgICAgICBzcGluX2xvY2tfaW5pdCgmYmFuay0+bG9jayk7Cj4gKwo+ICsgICAg ICAgICAgICAgICBpZiAoYmFuay0+aXJxID4gMCkgewo+ICsgICAgICAgICAgICAgICAgICAgICAg IHN0cnVjdCBncGlvX2lycV9jaGlwICpnaXJxOwo+ICsKPiArICAgICAgICAgICAgICAgICAgICAg ICBnaXJxID0gJmJhbmstPmNoaXAuaXJxOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGdwaW9f aXJxX2NoaXBfc2V0X2NoaXAoZ2lycSwgJm1hMzVfZ3Bpb19pcnFjaGlwKTsKPiArICAgICAgICAg ICAgICAgICAgICAgICBnaXJxLT5wYXJlbnRfaGFuZGxlciA9IG1hMzVfaXJxX2RlbXV4X2ludGdy b3VwOwo+ICsgICAgICAgICAgICAgICAgICAgICAgIGdpcnEtPm51bV9wYXJlbnRzID0gMTsKPiAr Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgZ2lycS0+cGFyZW50cyA9IGRldm1fa2NhbGxvYygm cGRldi0+ZGV2LCAxLCBzaXplb2YoKmdpcnEtPnBhcmVudHMpLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7Cj4gKyAgICAg ICAgICAgICAgICAgICAgICAgaWYgKCFnaXJxLT5wYXJlbnRzKQo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsgICAgICAgICAgICAgICAgICAg ICAgIGdpcnEtPnBhcmVudHNbMF0gPSBiYW5rLT5pcnE7Cj4gKyAgICAgICAgICAgICAgICAgICAg ICAgZ2lycS0+ZGVmYXVsdF90eXBlID0gSVJRX1RZUEVfTk9ORTsKPiArICAgICAgICAgICAgICAg ICAgICAgICBnaXJxLT5oYW5kbGVyID0gaGFuZGxlX2xldmVsX2lycTsKCkRvZXMgdGhpcyByZWFs bHkgd29yayBmb3IgdGhlIGVkZ2UgSVJRcz8KCkkgcmVjb21tZW5kIHNldHRpbmcgdGhpcyB0byBo YW5kbGVfYmFkX2lycSBhbmQgYXNzaWduIHRoZSByaWdodApoYW5kbGVyIGluIC5zZXRfdHlwZSgp LgoKWW91cnMsCkxpbnVzIFdhbGxlaWoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK