From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (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 5DAF7249ED; Fri, 29 Mar 2024 08:17:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711700267; cv=none; b=PvzS8PJs72f14sRgvPJeAYyz5/GevKtphTLtpUx53JnkYUA+LyobgtzibarRh43uCApKL7euHju1nXUVfVtgTNfQPhhyQsOMF46/Q9BQKvBRniL0Jpb2j8lcNFNSnVtN9+mIo/PSOIp48Gn+OaaSE+ItRYsVr3ta8iia6XwSv+w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711700267; c=relaxed/simple; bh=xcI33/1wG7Kt9NX9R3scZ3uOF9kigUKYPJzA7QpnciQ=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=kyMZj9mUChYDItH1P3Eh83WPJUYVxTXZlVTZKAdbcZyRF40yArlwvd6pKIB+NlHc6XVZS90+FK4cl5PP/S46j5fdYJmuW+d5vB+stAOzVn5Eln7dU1bqeJaovIAl+HjgUFhhepXwK6ZRDpCj1z+S5iKQhOEh4SW2Ws4g9N56rj4= 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=ba8FkR0U; arc=none smtp.client-ip=209.85.210.181 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="ba8FkR0U" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-6eae2b57ff2so787851b3a.2; Fri, 29 Mar 2024 01:17:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711700264; x=1712305064; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=FO9tV3Xn+H5beEgAxwVhgbmhSxv5Ufnf/uazK/ynCgc=; b=ba8FkR0Ul1VjK6Y+z/ERVKgEs7TTZC7UYBfrbFYQmomHu5HZqzB/drf1VBmaSKlP9a scs6921t6emn7vRyjw+HTf0l67W2f3v81Qd7QjT9K0FOb1dviczxoGhzrF81A0YBlPya 4dMdduRYa/ZvHS15T/61hAUOi85tYZqDm93G8dISphYJ6dqC0mecjl9y5KgcRFhxQUiq ECOLomLh+TDNAgFRwkK2DpTvqizOWybsMWYE9M6/nATVitU4+tNTYmGBX4u9uv55cGEu 78rYkGtZGYUGescuNIWMmIZsEmBr9ja8GgLD1ygoSL9uWSTp6Nl8BhdRah4isCRAeC/3 nE7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711700264; x=1712305064; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=FO9tV3Xn+H5beEgAxwVhgbmhSxv5Ufnf/uazK/ynCgc=; b=h2LmF1nmrKZdxAp5uRjJ1J2JU+Twc6LzOCBXe9ktkNAQcdGSRk5ScdUSHTGbiUj2R9 EFsANVYTngw7ZfBVX9JRz4x8DGQ8kpq1uEsWX1HQCZNrbq0CY91Opm8MGkx8kJM7MScG 7tcG53JXLb3fny+k1cq9aNHdfQ/Ge05+/FvIC9gy2pE0Y+dNw5KmEdDnQT1rTK3I4pug FMaWUjyPtCcVEwU8M9ujRywqKIr2UcTYSYZ+2Ld1QYaIWwEK/ofoc+Qj7Kn3g/TvzJIZ 8g89fkjLfOYzSUuT1R4JgL6YglRAE0ekg9DrByYDbShkKElqhQBOr9kv7jsUPFb02Bvn MmAw== X-Forwarded-Encrypted: i=1; AJvYcCWdC6IN26YEVSSkD84s59efFB6oKdDZsXf7QseToBgBa5D6SFiDunfRipuLt2m4yCFoL1zevghnqdB4Ds1kFvdkBsEVOWb0hgf1Q8Nk20eC4zp9l1kgS9rup/j2i3SWjWNJW7nXZ+7f9FYN7u1EEINVBe1Vuol+ZoTzf/xeeQVcco8HUYk= X-Gm-Message-State: AOJu0YxFDjPPLvhzQEyMGBsq6mGSe9JSg2ADlb1bprwNXVSgOpK6SJiO CpO+JCxvwEQrxOYpS6I0c3ORXTKqWFlsNsWXF1tu8xh9wkVHNu2XASlRHSWA X-Google-Smtp-Source: AGHT+IGrWLGrCMmOqVpiFcT4g1I5JXdy19B2EPJ2VkIa2LhwPNd5vqTRTYCemyJ/a61nIuwaXik/sg== X-Received: by 2002:a05:6a00:3a22:b0:6ea:e2d8:468 with SMTP id fj34-20020a056a003a2200b006eae2d80468mr1711036pfb.26.1711700264472; Fri, 29 Mar 2024 01:17:44 -0700 (PDT) Received: from [172.19.1.47] (60-250-192-107.hinet-ip.hinet.net. [60.250.192.107]) by smtp.gmail.com with ESMTPSA id fj33-20020a056a003a2100b006e57247f4e5sm2569841pfb.8.2024.03.29.01.17.42 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 29 Mar 2024 01:17:44 -0700 (PDT) Message-ID: Date: Fri, 29 Mar 2024 16:17:40 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v6 3/3] pinctrl: nuvoton: Add ma35d1 pinctrl and GPIO driver To: Linus Walleij 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 References: <20240313035719.768469-1-ychuang570808@gmail.com> <20240313035719.768469-4-ychuang570808@gmail.com> Content-Language: en-US From: Jacky Huang In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Dear Linus, Thanks for your review. On 2024/3/28 下午 05:10, Linus Walleij wrote: > Hi Jacky, > > overall this looks very good. > > On Wed, Mar 13, 2024 at 4:57 AM 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 = pinctrl_dev_get_drvdata(pctldev); >> + struct ma35_pin_group *grp = &npctl->groups[group]; >> + struct ma35_pin_setting *setting = grp->settings; >> + u32 i, regval; >> + >> + dev_dbg(npctl->dev, "enable function %s group %s\n", >> + npctl->functions[selector].name, npctl->groups[group].name); >> + >> + for (i = 0; i < grp->npins; i++) { >> + regmap_read(npctl->regmap, setting->offset, ®val); >> + regval &= ~GENMASK(setting->shift + 3, setting->shift); > Add a comment explaining why you add +3 The pinmux selection is 4 bits. I will use a constant for the bitmask width instead. > >> +static int ma35_gpio_core_direction_in(struct gpio_chip *gc, unsigned int gpio) >> +{ >> + struct ma35_pin_bank *bank = gpiochip_get_data(gc); >> + void __iomem *reg_mode = bank->reg_base + MA35_GP_REG_MODE; >> + unsigned long flags; >> + unsigned int regval; >> + >> + spin_lock_irqsave(&bank->lock, flags); >> + >> + regval = readl(reg_mode); >> + regval &= ~GENMASK(gpio * 2 + 1, gpio * 2); >> + regval |= 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). Yes, it is two bits per pin. I will add a comment to explain this. >> +static int ma35_gpio_core_get(struct gpio_chip *gc, unsigned int gpio) >> +{ >> + struct ma35_pin_bank *bank = 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? Yes, it maps one 32-bit register to a gpio pin. I will add a comment to explain this. >> +static int ma35_irq_irqtype(struct irq_data *d, unsigned int type) >> +{ >> + struct ma35_pin_bank *bank = gpiochip_get_data(irq_data_get_irq_chip_data(d)); >> + void __iomem *reg_itype = bank->reg_base + MA35_GP_REG_INTTYPE; >> + void __iomem *reg_ien = bank->reg_base + MA35_GP_REG_INTEN; >> + unsigned int num = (d->hwirq); >> + >> + if (type == IRQ_TYPE_PROBE) { >> + writel(readl(reg_itype) & ~BIT(num), reg_itype); >> + writel(readl(reg_ien) | BIT(num) | BIT(num + 16), reg_ien); >> + bank->irqtype &= ~BIT(num); >> + bank->irqinten |= 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 |= BIT(num); >> + bank->irqinten &= ~(BIT(num) | BIT(num + 16)); >> + if (type == IRQ_TYPE_LEVEL_HIGH) { >> + writel(readl(reg_ien) | BIT(num + 16), reg_ien); >> + bank->irqinten |= BIT(num + 16); >> + return 0; >> + } >> + >> + if (type == IRQ_TYPE_LEVEL_LOW) { >> + writel(readl(reg_ien) | BIT(num), reg_ien); >> + bank->irqinten |= BIT(num); >> + return 0; >> + } >> + >> + } else { >> + writel(readl(reg_itype) & ~BIT(num), reg_itype); >> + bank->irqtype &= ~BIT(num); >> + >> + if (type & IRQ_TYPE_EDGE_RISING) { >> + writel(readl(reg_ien) | BIT(num + 16), reg_ien); >> + bank->irqinten |= BIT(num + 16); >> + >> + } else { >> + writel(readl(reg_ien) & ~BIT(num + 16), reg_ien); >> + bank->irqinten &= ~BIT(num + 16); >> + } >> + >> + if (type & IRQ_TYPE_EDGE_FALLING) { >> + writel(readl(reg_ien) | BIT(num), reg_ien); >> + bank->irqinten |= BIT(num); >> + >> + } else { >> + writel(readl(reg_ien) & ~BIT(num), reg_ien); >> + bank->irqinten &= ~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); I will add the irq_set_handler_locked(). > 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. We'll refer to this driver to modify our code. > Have you checked that handling edge and level IRQs really work > as expected? This driver works with edge or level IRQs in linux-5.10, and some modifications have been made for upstream. We'll verify if it also works in linux-6.9. >> +static int ma35_gpiolib_register(struct platform_device *pdev, struct ma35_pinctrl *npctl) >> +{ >> + struct ma35_pin_ctrl *ctrl = npctl->ctrl; >> + struct ma35_pin_bank *bank = ctrl->pin_banks; >> + int ret; >> + int i; >> + >> + for (i = 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 = 0; >> + bank->irqinten = 0; >> + bank->chip.label = bank->name; >> + bank->chip.of_gpio_n_cells = 2; >> + bank->chip.parent = &pdev->dev; >> + bank->chip.request = ma35_gpio_core_to_request; >> + bank->chip.direction_input = ma35_gpio_core_direction_in; >> + bank->chip.direction_output = ma35_gpio_core_direction_out; >> + bank->chip.get = ma35_gpio_core_get; >> + bank->chip.set = ma35_gpio_core_set; >> + bank->chip.base = -1; >> + bank->chip.ngpio = bank->nr_pins; >> + bank->chip.can_sleep = false; >> + spin_lock_init(&bank->lock); >> + >> + if (bank->irq > 0) { >> + struct gpio_irq_chip *girq; >> + >> + girq = &bank->chip.irq; >> + gpio_irq_chip_set_chip(girq, &ma35_gpio_irqchip); >> + girq->parent_handler = ma35_irq_demux_intgroup; >> + girq->num_parents = 1; >> + >> + girq->parents = devm_kcalloc(&pdev->dev, 1, sizeof(*girq->parents), >> + GFP_KERNEL); >> + if (!girq->parents) >> + return -ENOMEM; >> + >> + girq->parents[0] = bank->irq; >> + girq->default_type = IRQ_TYPE_NONE; >> + girq->handler = 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 OK, I will fix it. Best Regards, Jacky Huang 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 A2F79CD1288 for ; Fri, 29 Mar 2024 08:18:00 +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=OS7JSGwgNA2pc6S+Ob2Kl13bhJa68y683Uzfbnhx4AM=; b=NqySDBoMoIcNTG Ax+R8Q/N3Z56dJN/pKWETKNQ4hY6jCO2rM5KVHM/I7D5nRpu8c1666kKRJTE5B6NrZo1WOmihFRde 2/UXOyl8iX3TDGkxERXSxryunSvVQZtkXApMiSbbThVwRYDBL9agZl+KhI3M4RPYdSNhQSTIuHmiN P3qYL400VN3z+uLpYcxVIJwC3ryW6sj/0saW6rUgi82ZRlmTkeIYCvzbyhoa7J5MHjRabvIWY3xPx 8NYO4UFb4i6EKfMc63O+Aulym5T3h8LTD7ZXBCdKRLWlZcEPWtEJP9Z59NRnzbaUx7g3+sXOpVQLB D9bS0EZKiq/em3hRxbEQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rq7Qr-0000000HHZ4-30Nq; Fri, 29 Mar 2024 08:17:49 +0000 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rq7Qo-0000000HHYQ-1PT5 for linux-arm-kernel@lists.infradead.org; Fri, 29 Mar 2024 08:17:47 +0000 Received: by mail-pf1-x42d.google.com with SMTP id d2e1a72fcca58-6e73e8bdea2so1637043b3a.0 for ; Fri, 29 Mar 2024 01:17:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711700264; x=1712305064; darn=lists.infradead.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=FO9tV3Xn+H5beEgAxwVhgbmhSxv5Ufnf/uazK/ynCgc=; b=Pbr0NDWAnSIQhU2YjMQwkTp4Xw7w7dVJtxKq0F/jjVNobNoCXy8I49ZFt8pygtXGce C6rHLeYavBa/dwRyaFG0W/haeb+1Y3SM78npq5iqY2jiwgxVBxr8NhGl29yeSrquiCL5 IBUtvzHbSnIfdM+LA7FmIqDgHMM3IkREcTUq3m94Gaf12KcyXzZW5ZqBWlvL4ofzW65K M94/6wnWYWS+VKNvbYidwx61l2FN13H+BCStmCV/VwRZAW81sYmn8IHVFGFLVX6jckAH KzGzJuBXCyGY8ay5Lq1DbFpdcYvUJRRWWmV1rLNd3Clrsefrjpn0gRT8iFj6z/bwp4nN PGzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711700264; x=1712305064; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=FO9tV3Xn+H5beEgAxwVhgbmhSxv5Ufnf/uazK/ynCgc=; b=ogVfwTTjzHhHD8qNUvC21h3D/vxI9sE/iY2cUOk65zULnmDAFZ94cCQ/2iYs1wEl3a 0Q11DERx6732tEk8rQ+iVCcK4bRcPpJZVBLACMA44M7v3wJnXH9fh/rz6qoJQlsBCPNX 1Ds7Ue4GgvtR8nOnIHOu7Ar7itxEBz0lFTPRCqL4UUvJGB8oFdTQFtQ/8OjwUekqcHXt DAw4H+QWvkL8SciKKk3ZIjUkVdMdu6iX6yoqbrkPz6Ck7RK8+SXFsq1ZnDTTcdSC/MnS 9V+5Ygwejmz+812x3lMm/i3SCZUCT3ekZmhqHqhuzBHLkZxxDTWOk+LgwNvyQv/FAU7s 685w== X-Forwarded-Encrypted: i=1; AJvYcCVeSAxvfqFxL76dPmDmhv2uizsLUfRiHqgjCPUO+js7jNtw4+21EEKGpf8KR5WIHG/wG9Hl5tqG+BwEUe4cq8iOtXHM111oETbEvXEefoT+UfCYCTk= X-Gm-Message-State: AOJu0Yyy0TCBjcsmNHHKh8gK3gGzOz0Dht8r1lwZLQhQhFvVQDvsufCv 1tqv1jgX/VJbbk2ECcsjjftXidtoB6NA7P5Vz4bYyePObpGrfR+w X-Google-Smtp-Source: AGHT+IGrWLGrCMmOqVpiFcT4g1I5JXdy19B2EPJ2VkIa2LhwPNd5vqTRTYCemyJ/a61nIuwaXik/sg== X-Received: by 2002:a05:6a00:3a22:b0:6ea:e2d8:468 with SMTP id fj34-20020a056a003a2200b006eae2d80468mr1711036pfb.26.1711700264472; Fri, 29 Mar 2024 01:17:44 -0700 (PDT) Received: from [172.19.1.47] (60-250-192-107.hinet-ip.hinet.net. [60.250.192.107]) by smtp.gmail.com with ESMTPSA id fj33-20020a056a003a2100b006e57247f4e5sm2569841pfb.8.2024.03.29.01.17.42 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 29 Mar 2024 01:17:44 -0700 (PDT) Message-ID: Date: Fri, 29 Mar 2024 16:17:40 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v6 3/3] pinctrl: nuvoton: Add ma35d1 pinctrl and GPIO driver To: Linus Walleij 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 References: <20240313035719.768469-1-ychuang570808@gmail.com> <20240313035719.768469-4-ychuang570808@gmail.com> Content-Language: en-US From: Jacky Huang In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240329_011746_416216_50799893 X-CRM114-Status: GOOD ( 30.20 ) 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 CkRlYXIgTGludXMsCgpUaGFua3MgZm9yIHlvdXIgcmV2aWV3LgoKCk9uIDIwMjQvMy8yOCDkuIvl jYggMDU6MTAsIExpbnVzIFdhbGxlaWogd3JvdGU6Cj4gSGkgSmFja3ksCj4KPiBvdmVyYWxsIHRo aXMgbG9va3MgdmVyeSBnb29kLgo+Cj4gT24gV2VkLCBNYXIgMTMsIDIwMjQgYXQgNDo1N+KAr0FN IEphY2t5IEh1YW5nIDx5Y2h1YW5nNTcwODA4QGdtYWlsLmNvbT4gd3JvdGU6Cj4KPgo+PiBGcm9t OiBKYWNreSBIdWFuZyA8eWNodWFuZzNAbnV2b3Rvbi5jb20+Cj4+Cj4+IEFkZCBjb21tb24gcGlu Y3RybCBhbmQgR1BJTyBkcml2ZXIgZm9yIE51dm90b24gTUEzNSBzZXJpZXMgU29DLCBhbmQKPj4g YWRkIHN1cHBvcnQgZm9yIG1hMzVkMSBwaW5jdHJsLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBKYWNr eSBIdWFuZyA8eWNodWFuZzNAbnV2b3Rvbi5jb20+Cj4gKC4uLikKPj4gK3N0YXRpYyBpbnQgbWEz NV9waW5tdXhfc2V0X211eChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGlu dCBzZWxlY3RvciwKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGlu dCBncm91cCkKPj4gK3sKPj4gKyAgICAgICBzdHJ1Y3QgbWEzNV9waW5jdHJsICpucGN0bCA9IHBp bmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwo+PiArICAgICAgIHN0cnVjdCBtYTM1X3Bp bl9ncm91cCAqZ3JwID0gJm5wY3RsLT5ncm91cHNbZ3JvdXBdOwo+PiArICAgICAgIHN0cnVjdCBt YTM1X3Bpbl9zZXR0aW5nICpzZXR0aW5nID0gZ3JwLT5zZXR0aW5nczsKPj4gKyAgICAgICB1MzIg aSwgcmVndmFsOwo+PiArCj4+ICsgICAgICAgZGV2X2RiZyhucGN0bC0+ZGV2LCAiZW5hYmxlIGZ1 bmN0aW9uICVzIGdyb3VwICVzXG4iLAo+PiArICAgICAgICAgICAgICAgbnBjdGwtPmZ1bmN0aW9u c1tzZWxlY3Rvcl0ubmFtZSwgbnBjdGwtPmdyb3Vwc1tncm91cF0ubmFtZSk7Cj4+ICsKPj4gKyAg ICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JwLT5ucGluczsgaSsrKSB7Cj4+ICsgICAgICAgICAgICAg ICByZWdtYXBfcmVhZChucGN0bC0+cmVnbWFwLCBzZXR0aW5nLT5vZmZzZXQsICZyZWd2YWwpOwo+ PiArICAgICAgICAgICAgICAgcmVndmFsICY9IH5HRU5NQVNLKHNldHRpbmctPnNoaWZ0ICsgMywg c2V0dGluZy0+c2hpZnQpOwo+IEFkZCBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgeW91IGFkZCAr MwoKVGhlIHBpbm11eCBzZWxlY3Rpb24gaXMgNCBiaXRzLiBJIHdpbGwgdXNlIGEgY29uc3RhbnQg Zm9yIHRoZSBiaXRtYXNrIAp3aWR0aCBpbnN0ZWFkLgoKPgo+PiArc3RhdGljIGludCBtYTM1X2dw aW9fY29yZV9kaXJlY3Rpb25faW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBn cGlvKQo+PiArewo+PiArICAgICAgIHN0cnVjdCBtYTM1X3Bpbl9iYW5rICpiYW5rID0gZ3Bpb2No aXBfZ2V0X2RhdGEoZ2MpOwo+PiArICAgICAgIHZvaWQgX19pb21lbSAqcmVnX21vZGUgPSBiYW5r LT5yZWdfYmFzZSArIE1BMzVfR1BfUkVHX01PREU7Cj4+ICsgICAgICAgdW5zaWduZWQgbG9uZyBm bGFnczsKPj4gKyAgICAgICB1bnNpZ25lZCBpbnQgcmVndmFsOwo+PiArCj4+ICsgICAgICAgc3Bp bl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArICAgICAgIHJlZ3Zh bCA9IHJlYWRsKHJlZ19tb2RlKTsKPj4gKyAgICAgICByZWd2YWwgJj0gfkdFTk1BU0soZ3BpbyAq IDIgKyAxLCBncGlvICogMik7Cj4+ICsgICAgICAgcmVndmFsIHw9IE1BMzVfR1BfTU9ERV9JTlBV VCA8PCBncGlvICogMjsKPiBIZXJlIHRoZSBmaXJzdCB0aW1lIHlvdSBkbyB0aGlzIG1hZ2ljIGV4 cGxhaW4gaW4gYSBjb21tZW50IHdoeSB5b3UKPiB1c2UgKjIrMSBhbmQgKjIgb3ZlcmFsbCAoSSBn dWVzcyB0d28gYml0cyBwZXIgbGluZSkuCgpZZXMsIGl0IGlzIHR3byBiaXRzIHBlciBwaW4uIEkg d2lsbCBhZGQgYSBjb21tZW50IHRvIGV4cGxhaW4gdGhpcy4KCj4+ICtzdGF0aWMgaW50IG1hMzVf Z3Bpb19jb3JlX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCj4+ ICt7Cj4+ICsgICAgICAgc3RydWN0IG1hMzVfcGluX2JhbmsgKmJhbmsgPSBncGlvY2hpcF9nZXRf ZGF0YShnYyk7Cj4+ICsKPj4gKyAgICAgICByZXR1cm4gcmVhZGwoYmFuay0+cmVnX2Jhc2UgKyBN QTM1X1BJTl9NQVBfQkFTRSArIGdwaW8gKiA0KTsKPiBIZXJlIGFkZCBhIGNvbW1lbnQgZXhwbGFp bmluZyB0aGUgKjQKPiBJIGd1ZXNzIG9uZSAzMi1iaXQgcmVnaXN0ZXIgcGVyIHBpbj8KClllcywg aXQgbWFwcyBvbmUgMzItYml0IHJlZ2lzdGVyIHRvIGEgZ3BpbyBwaW4uCkkgd2lsbCBhZGQgYSBj b21tZW50IHRvIGV4cGxhaW4gdGhpcy4KCj4+ICtzdGF0aWMgaW50IG1hMzVfaXJxX2lycXR5cGUo c3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKPj4gK3sKPj4gKyAgICAgICBz dHJ1Y3QgbWEzNV9waW5fYmFuayAqYmFuayA9IGdwaW9jaGlwX2dldF9kYXRhKGlycV9kYXRhX2dl dF9pcnFfY2hpcF9kYXRhKGQpKTsKPj4gKyAgICAgICB2b2lkIF9faW9tZW0gKnJlZ19pdHlwZSA9 IGJhbmstPnJlZ19iYXNlICsgTUEzNV9HUF9SRUdfSU5UVFlQRTsKPj4gKyAgICAgICB2b2lkIF9f aW9tZW0gKnJlZ19pZW4gPSBiYW5rLT5yZWdfYmFzZSArIE1BMzVfR1BfUkVHX0lOVEVOOwo+PiAr ICAgICAgIHVuc2lnbmVkIGludCBudW0gPSAoZC0+aHdpcnEpOwo+PiArCj4+ICsgICAgICAgaWYg KHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKPj4gKyAgICAgICAgICAgICAgIHdyaXRlbChyZWFk bChyZWdfaXR5cGUpICYgfkJJVChudW0pLCByZWdfaXR5cGUpOwo+PiArICAgICAgICAgICAgICAg d3JpdGVsKHJlYWRsKHJlZ19pZW4pIHwgQklUKG51bSkgfCBCSVQobnVtICsgMTYpLCByZWdfaWVu KTsKPj4gKyAgICAgICAgICAgICAgIGJhbmstPmlycXR5cGUgJj0gfkJJVChudW0pOwo+PiArICAg ICAgICAgICAgICAgYmFuay0+aXJxaW50ZW4gfD0gQklUKG51bSkgfCBCSVQobnVtICsgMTYpOwo+ PiArICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4+ICsgICAgICAgfQo+PiArCj4+ICsgICAgICAg aWYgKHR5cGUgJiBJUlFfVFlQRV9MRVZFTF9NQVNLKSB7Cj4+ICsgICAgICAgICAgICAgICB3cml0 ZWwocmVhZGwocmVnX2l0eXBlKSB8IEJJVChudW0pLCByZWdfaXR5cGUpOwo+PiArICAgICAgICAg ICAgICAgd3JpdGVsKHJlYWRsKHJlZ19pZW4pICYgfihCSVQobnVtKSB8IEJJVChudW0gKyAxNikp LCByZWdfaWVuKTsKPj4gKyAgICAgICAgICAgICAgIGJhbmstPmlycXR5cGUgfD0gQklUKG51bSk7 Cj4+ICsgICAgICAgICAgICAgICBiYW5rLT5pcnFpbnRlbiAmPSB+KEJJVChudW0pIHwgQklUKG51 bSArIDE2KSk7Cj4+ICsgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBJUlFfVFlQRV9MRVZFTF9I SUdIKSB7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbChyZWFkbChyZWdfaWVuKSB8 IEJJVChudW0gKyAxNiksIHJlZ19pZW4pOwo+PiArICAgICAgICAgICAgICAgICAgICAgICBiYW5r LT5pcnFpbnRlbiB8PSBCSVQobnVtICsgMTYpOwo+PiArICAgICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gMDsKPj4gKyAgICAgICAgICAgICAgIH0KPj4gKwo+PiArICAgICAgICAgICAgICAgaWYg KHR5cGUgPT0gSVJRX1RZUEVfTEVWRUxfTE9XKSB7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAg IHdyaXRlbChyZWFkbChyZWdfaWVuKSB8IEJJVChudW0pLCByZWdfaWVuKTsKPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgYmFuay0+aXJxaW50ZW4gfD0gQklUKG51bSk7Cj4+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiAwOwo+PiArICAgICAgICAgICAgICAgfQo+PiArCj4+ICsgICAg ICAgfSBlbHNlIHsKPj4gKyAgICAgICAgICAgICAgIHdyaXRlbChyZWFkbChyZWdfaXR5cGUpICYg fkJJVChudW0pLCByZWdfaXR5cGUpOwo+PiArICAgICAgICAgICAgICAgYmFuay0+aXJxdHlwZSAm PSB+QklUKG51bSk7Cj4+ICsKPj4gKyAgICAgICAgICAgICAgIGlmICh0eXBlICYgSVJRX1RZUEVf RURHRV9SSVNJTkcpIHsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVsKHJlYWRsKHJl Z19pZW4pIHwgQklUKG51bSArIDE2KSwgcmVnX2llbik7Cj4+ICsgICAgICAgICAgICAgICAgICAg ICAgIGJhbmstPmlycWludGVuIHw9IEJJVChudW0gKyAxNik7Cj4+ICsKPj4gKyAgICAgICAgICAg ICAgIH0gZWxzZSB7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbChyZWFkbChyZWdf aWVuKSAmIH5CSVQobnVtICsgMTYpLCByZWdfaWVuKTsKPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgYmFuay0+aXJxaW50ZW4gJj0gfkJJVChudW0gKyAxNik7Cj4+ICsgICAgICAgICAgICAgICB9 Cj4+ICsKPj4gKyAgICAgICAgICAgICAgIGlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9GQUxMSU5H KSB7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbChyZWFkbChyZWdfaWVuKSB8IEJJ VChudW0pLCByZWdfaWVuKTsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgYmFuay0+aXJxaW50 ZW4gfD0gQklUKG51bSk7Cj4+ICsKPj4gKyAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4+ICsgICAg ICAgICAgICAgICAgICAgICAgIHdyaXRlbChyZWFkbChyZWdfaWVuKSAmIH5CSVQobnVtKSwgcmVn X2llbik7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgIGJhbmstPmlycWludGVuICY9IH5CSVQo bnVtKTsKPj4gKyAgICAgICAgICAgICAgIH0KPj4gKyAgICAgICB9Cj4+ICsgICAgICAgcmV0dXJu IDA7Cj4+ICt9Cj4gSSBkb24ndCB1bmRlcnN0YW5kIHdoeSB5b3UgZG9uJ3Qgc2V0IHRoZSBpcnFf aGFuZGxlcjoKPiBpcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQsIGhhbmRsZV9lZGdlX2lycSk7Cj4g aXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLCBoYW5kbGVfbGV2ZWxfaXJxKTsKCkkgd2lsbCBhZGQg dGhlIGlycV9zZXRfaGFuZGxlcl9sb2NrZWQoKS4KPiBJdCBzZWVtcyB5b3UgYXJlIG5vdCBoYW5k bGluZyBJUlFfVFlQRV9FREdFX0JPVEg/Cj4gV2hhdCBoYXBwZW5zIGlmIGJvdGggcmlzaW5nIGFu ZCBmYWxsaW5nIGlzIHNwZWNpZmllZCBzaW11bHRhbmVvdXNseT8KPgo+IFRoZSBpZi9lbHNlIG5l c3RpbmcgaXMgaGFyZCB0byByZWFkLgo+IHN3aXRjaCAodHlwZSkgewo+ICAgICAgICAgIGNhc2Ug SVJRX1RZUEVfRURHRV9CT1RIOgo+ICguLi4pCj4gICAgICAgICAgY2FzZSBJUlFfVFlQRV9FREdF X1JJU0lORzoKPiAoLi4uKQo+Cj4gU2VlIGRyaXZlcnMvZ3Bpby9ncGlvLWZ0Z3BpbzAxMC5jIGZv ciBhbiBleGFtcGxlLgoKV2UnbGwgcmVmZXIgdG8gdGhpcyBkcml2ZXIgdG8gbW9kaWZ5IG91ciBj b2RlLgoKPiBIYXZlIHlvdSBjaGVja2VkIHRoYXQgaGFuZGxpbmcgZWRnZSBhbmQgbGV2ZWwgSVJR cyByZWFsbHkgd29yawo+IGFzIGV4cGVjdGVkPwoKVGhpcyBkcml2ZXIgd29ya3Mgd2l0aCBlZGdl IG9yIGxldmVsIElSUXMgaW4gbGludXgtNS4xMCwgYW5kIHNvbWUgCm1vZGlmaWNhdGlvbnMKaGF2 ZSBiZWVuIG1hZGUgZm9yIHVwc3RyZWFtLiBXZSdsbCB2ZXJpZnkgaWYgaXQgYWxzbyB3b3JrcyBp biBsaW51eC02LjkuCgo+PiArc3RhdGljIGludCBtYTM1X2dwaW9saWJfcmVnaXN0ZXIoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IG1hMzVfcGluY3RybCAqbnBjdGwpCj4+ICt7 Cj4+ICsgICAgICAgc3RydWN0IG1hMzVfcGluX2N0cmwgKmN0cmwgPSBucGN0bC0+Y3RybDsKPj4g KyAgICAgICBzdHJ1Y3QgbWEzNV9waW5fYmFuayAqYmFuayA9IGN0cmwtPnBpbl9iYW5rczsKPj4g KyAgICAgICBpbnQgcmV0Owo+PiArICAgICAgIGludCBpOwo+PiArCj4+ICsgICAgICAgZm9yIChp ID0gMDsgaSA8IGN0cmwtPm5yX2JhbmtzOyArK2ksICsrYmFuaykgewo+PiArICAgICAgICAgICAg ICAgaWYgKCFiYW5rLT52YWxpZCkgewo+PiArICAgICAgICAgICAgICAgICAgICAgICBkZXZfd2Fy bigmcGRldi0+ZGV2LCAiYmFuayAlcyBpcyBub3QgdmFsaWRcbiIsCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGJhbmstPm5wLT5uYW1lKTsKPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgY29udGludWU7Cj4+ICsgICAgICAgICAgICAgICB9Cj4+ICsgICAgICAgICAgICAgICBi YW5rLT5pcnF0eXBlID0gMDsKPj4gKyAgICAgICAgICAgICAgIGJhbmstPmlycWludGVuID0gMDsK Pj4gKyAgICAgICAgICAgICAgIGJhbmstPmNoaXAubGFiZWwgPSBiYW5rLT5uYW1lOwo+PiArICAg ICAgICAgICAgICAgYmFuay0+Y2hpcC5vZl9ncGlvX25fY2VsbHMgPSAyOwo+PiArICAgICAgICAg ICAgICAgYmFuay0+Y2hpcC5wYXJlbnQgPSAmcGRldi0+ZGV2Owo+PiArICAgICAgICAgICAgICAg YmFuay0+Y2hpcC5yZXF1ZXN0ID0gbWEzNV9ncGlvX2NvcmVfdG9fcmVxdWVzdDsKPj4gKyAgICAg ICAgICAgICAgIGJhbmstPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbWEzNV9ncGlvX2NvcmVfZGly ZWN0aW9uX2luOwo+PiArICAgICAgICAgICAgICAgYmFuay0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0 ID0gbWEzNV9ncGlvX2NvcmVfZGlyZWN0aW9uX291dDsKPj4gKyAgICAgICAgICAgICAgIGJhbmst PmNoaXAuZ2V0ID0gbWEzNV9ncGlvX2NvcmVfZ2V0Owo+PiArICAgICAgICAgICAgICAgYmFuay0+ Y2hpcC5zZXQgPSBtYTM1X2dwaW9fY29yZV9zZXQ7Cj4+ICsgICAgICAgICAgICAgICBiYW5rLT5j aGlwLmJhc2UgPSAtMTsKPj4gKyAgICAgICAgICAgICAgIGJhbmstPmNoaXAubmdwaW8gPSBiYW5r LT5ucl9waW5zOwo+PiArICAgICAgICAgICAgICAgYmFuay0+Y2hpcC5jYW5fc2xlZXAgPSBmYWxz ZTsKPj4gKyAgICAgICAgICAgICAgIHNwaW5fbG9ja19pbml0KCZiYW5rLT5sb2NrKTsKPj4gKwo+ PiArICAgICAgICAgICAgICAgaWYgKGJhbmstPmlycSA+IDApIHsKPj4gKyAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IGdwaW9faXJxX2NoaXAgKmdpcnE7Cj4+ICsKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgZ2lycSA9ICZiYW5rLT5jaGlwLmlycTsKPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgZ3Bpb19pcnFfY2hpcF9zZXRfY2hpcChnaXJxLCAmbWEzNV9ncGlvX2lycWNoaXApOwo+ PiArICAgICAgICAgICAgICAgICAgICAgICBnaXJxLT5wYXJlbnRfaGFuZGxlciA9IG1hMzVfaXJx X2RlbXV4X2ludGdyb3VwOwo+PiArICAgICAgICAgICAgICAgICAgICAgICBnaXJxLT5udW1fcGFy ZW50cyA9IDE7Cj4+ICsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgZ2lycS0+cGFyZW50cyA9 IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCAxLCBzaXplb2YoKmdpcnEtPnBhcmVudHMpLAo+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9L RVJORUwpOwo+PiArICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdpcnEtPnBhcmVudHMpCj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4+ICsKPj4g KyAgICAgICAgICAgICAgICAgICAgICAgZ2lycS0+cGFyZW50c1swXSA9IGJhbmstPmlycTsKPj4g KyAgICAgICAgICAgICAgICAgICAgICAgZ2lycS0+ZGVmYXVsdF90eXBlID0gSVJRX1RZUEVfTk9O RTsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgZ2lycS0+aGFuZGxlciA9IGhhbmRsZV9sZXZl bF9pcnE7Cj4gRG9lcyB0aGlzIHJlYWxseSB3b3JrIGZvciB0aGUgZWRnZSBJUlFzPwo+Cj4gSSBy ZWNvbW1lbmQgc2V0dGluZyB0aGlzIHRvIGhhbmRsZV9iYWRfaXJxIGFuZCBhc3NpZ24gdGhlIHJp Z2h0Cj4gaGFuZGxlciBpbiAuc2V0X3R5cGUoKS4KPgo+IFlvdXJzLAo+IExpbnVzIFdhbGxlaWoK Ck9LLCBJIHdpbGwgZml4IGl0LgoKCkJlc3QgUmVnYXJkcywKSmFja3kgSHVhbmcKCgoKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2Vy bmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0 cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVs Cg==