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 D8E7CCA0EED for ; Thu, 28 Aug 2025 11:06:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type: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=WyGqgdCxHHZ0WqHQyWJK/IV7Suf/Xw7KrmTuRZik4js=; b=IaYjBqgSEJ73DmWZpky2+Km3ZI uQxVi0wMkH5xkfZzkMnDOW+dzIcLfey58RJh2Xko6A/PFfy5HW/39Ml0kPbc03pVvprB14+lICrYr dWl9YW/pP18Y77c/8Zno8fWHXxJcOQ4JJbyvEd4Hb/bvINvtg57R4ymqkNNGlIQVOi/Q+G2uEYYI0 zT74b8pGkw1TEn3B5rdoKJ81OqLG+Z2ChcYxJhfXszbFrI7eoiINnoY+iEzIlRe0+1+M1ogBiNgsG olpcpQs1rX4IhoSQJ2y7d02dgUOhpsO/4WUDFqykn9X+V4/0xls93kc6w2mhsZcK0+rNIX5sVv+NN z9tA04lw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uraSx-00000001HfR-3Rq6; Thu, 28 Aug 2025 11:06:51 +0000 Received: from bali.collaboradmins.com ([2a01:4f8:201:9162::2]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1urZTV-000000014lI-2RpL; Thu, 28 Aug 2025 10:03:22 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1756375398; bh=nCTV06WWtfHMZWRisXpyJ/SJmpEYn6VwPhh/jXVXBYA=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=kQ9CGV025NnRJyfl1LkkWM3qppd1P22I26rdgTExBn/PQVUCTlXO7rX26sQqkzBW/ 9sr+xlQ6jlMWoeA6KQXYQgaG4rD6O4xvn6MsCo+ldZaYkgn4aOnuTtO+BhvMxyJBuM LgncDxpBlM9b772Xlwz9ccNKhZNBGZBKiQPQjELMpIUa0+bdRPVp4mTHaHkwkWbuWg 2h07J8rBLEz5V3Fr0Gdkf+gtVQhcPQf7eSdWSy+/R13VY9ItDRPXkhmw2EhdMRvIGp s5VXACfuHDGzXheeCiyg/986fu0Xh/Jb6gr3GzZNYXi1o495JeGcmpplMUtUNXXXuQ ohfHCmT947CAA== Received: from [172.18.81.15] (ip-185-104-138-156.ptr.icomera.net [185.104.138.156]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: mriesch) by bali.collaboradmins.com (Postfix) with ESMTPSA id DFCF617E0A49; Thu, 28 Aug 2025 12:03:14 +0200 (CEST) Message-ID: <23ccc744-745d-4a31-a79c-2d64bf1ed43d@collabora.com> Date: Thu, 28 Aug 2025 12:03:13 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v10 06/13] media: rockchip: add a driver for the rockchip camera interface To: Bryan O'Donoghue , Mehdi Djait , Maxime Chevallier , =?UTF-8?Q?Th=C3=A9o_Lebrun?= , Thomas Petazzoni , Gerald Loacker , Markus Elfring , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Reichel , Collabora Kernel Team , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Mehdi Djait References: <20240220-rk3568-vicap-v10-0-62d8a7b209b4@collabora.com> <20240220-rk3568-vicap-v10-6-62d8a7b209b4@collabora.com> <3b4173cb-655d-48ea-b86a-a036f666cf40@linaro.org> Content-Language: en-US From: Michael Riesch In-Reply-To: <3b4173cb-655d-48ea-b86a-a036f666cf40@linaro.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250828_030321_813372_0B262626 X-CRM114-Status: GOOD ( 38.11 ) 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: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Bryan, Thanks for your comments :-) On 8/26/25 08:21, Bryan O'Donoghue wrote: > On 19/08/2025 00:25, Michael Riesch via B4 Relay wrote: [...] >> + >> +static void rkcif_dvp_stop_streaming(struct rkcif_stream *stream) >> +{ >> +    struct rkcif_device *rkcif = stream->rkcif; >> +    u32 val; >> + >> +    val = rkcif_dvp_read(rkcif, RKCIF_DVP_CTRL); > > This dvp_read stuff looks a bit funny to me, you have a lookup which can > return 0 for unknown registers. > > Probably not the case with a control register like this one but, for > argument sake if RKCIF_DVP_CTRL was not a valid register i.e. > rkcif_dvp_read() would return 0 and you'd still act on that data to > write back to an unkown register. ...which would then hit the same check in rkcif_dvp_write and simply return without writing anything. Also, the WARN_ON_ONCE in the lookup would complain and indicate that the driver developer made some mistake. I hope that the driver developer is thus nudged towards fixing the code they wrote. > Would you not be better off having say callbacks to contain cases where > registers are potentially not present > > ops->update_maybe_not_present_reg(); > > followed by writes to registers that would alawys be there ? I'll think about that in more detail, but right now my thoughts are that if any of the registers below are not valid, this piece of hardware is pretty useless and there is something rotten in the driver. Thus, we complain loudly to the developer. >> +    rkcif_dvp_write(rkcif, RKCIF_DVP_CTRL, >> +            val & (~RKCIF_CTRL_ENABLE_CAPTURE)); >> +    rkcif_dvp_write(rkcif, RKCIF_DVP_INTEN, 0x0); >> +    rkcif_dvp_write(rkcif, RKCIF_DVP_INTSTAT, 0x3ff); >> +    rkcif_dvp_write(rkcif, RKCIF_DVP_FRAME_STATUS, 0x0); >> + >> +    stream->stopping = false; >> +} >> + >> +static void rkcif_dvp_reset_stream(struct rkcif_device *rkcif) >> +{ >> +    u32 ctl = rkcif_dvp_read(rkcif, RKCIF_DVP_CTRL); >> + >> +    rkcif_dvp_write(rkcif, RKCIF_DVP_CTRL, >> +            ctl & (~RKCIF_CTRL_ENABLE_CAPTURE)); >> +    rkcif_dvp_write(rkcif, RKCIF_DVP_CTRL, ctl | >> RKCIF_CTRL_ENABLE_CAPTURE); >> +} >> + >> +static void rkcif_dvp_set_crop(struct rkcif_stream *stream, u16 left, >> u16 top) >> +{ >> +    struct rkcif_device *rkcif = stream->rkcif; >> +    u32 val; >> + >> +    val = RKCIF_XY_COORD(left, top); >> +    rkcif_dvp_write(rkcif, RKCIF_DVP_CROP, val); >> +} >> + >> +irqreturn_t rkcif_dvp_isr(int irq, void *ctx) >> +{ >> +    struct device *dev = ctx; >> +    struct rkcif_device *rkcif = dev_get_drvdata(dev); >> +    struct rkcif_stream *stream; >> +    u32 intstat, lastline, lastpix, cif_frmst; >> +    irqreturn_t ret = IRQ_NONE; >> + >> +    if (!rkcif->match_data->dvp) >> +        return ret; > > Wouldn't you be better off conditionally registering your ISR if > match_data->dvp is true instead ? As you have surely seen, the ISR is shared between all interfaces, i.e., DVP and MIPI. Now the currently supported models all have a DVP and your suggestion would work. However, I think the RK3562 VICAP can be easily supported by this driver but does not feature a DVP (several MIPI interfaces, though). In this case match_data->dvp evaluates to false but still there is the need to register the ISR. > >> + >> +    intstat = rkcif_dvp_read(rkcif, RKCIF_DVP_INTSTAT); >> +    cif_frmst = rkcif_dvp_read(rkcif, RKCIF_DVP_FRAME_STATUS); >> +    lastline = RKCIF_FETCH_Y(rkcif_dvp_read(rkcif, >> RKCIF_DVP_LAST_LINE)); >> +    lastpix = RKCIF_FETCH_Y(rkcif_dvp_read(rkcif, RKCIF_DVP_LAST_PIX)); >> + >> +    if (intstat & RKCIF_INTSTAT_FRAME_END) { >> +        rkcif_dvp_write(rkcif, RKCIF_DVP_INTSTAT, >> +                RKCIF_INTSTAT_FRAME_END_CLR | >> +                RKCIF_INTSTAT_LINE_END_CLR); >> + >> +        stream = &rkcif->interfaces[RKCIF_DVP].streams[RKCIF_ID0]; >> + >> +        if (stream->stopping) { >> +            rkcif_dvp_stop_streaming(stream); >> +            wake_up(&stream->wq_stopped); >> +            ret = IRQ_HANDLED; >> +            goto out; >> +        } >> + >> +        if (lastline != stream->pix.height) { >> +            v4l2_err(&rkcif->v4l2_dev, >> +                 "bad frame, irq:%#x frmst:%#x size:%dx%d\n", >> +                 intstat, cif_frmst, lastpix, lastline); >> + >> +            rkcif_dvp_reset_stream(rkcif); >> +        } >> + >> +        rkcif_stream_pingpong(stream); >> + >> +        ret = IRQ_HANDLED; >> +    } >> +out: >> +    return ret; >> +} >> + >> +int rkcif_dvp_register(struct rkcif_device *rkcif) >> +{ >> +    struct rkcif_interface *interface; >> +    unsigned int streams_num; >> +    int ret; >> + >> +    if (!rkcif->match_data->dvp) >> +        return 0; > > If you don't register the device when match_data->dvp is false, then I > think you can relax the carry-on checks elsewhere on match_data->dvp, > not including dvp_unregister +1 I'll review all instances of this check. > The rest of the file as I breifly skim it looks OK to me, its a bit big > though. > > Would it be possible to break this patch up a little bit ? Might make it > easier for other reviewers to give an SoB for smaller chunks. I suppose what I could do is split this up into five patches, as the commit message already outlines: 1) add a basic driver (no-op skeleton only) 2) abstraction for the ping-pong scheme to allow for future extensions 3) abstraction for the INTERFACE and CROP parts to allow for future extensions 4) support for the PX30 VIP 5) support for the RK3568 VICAP DVP Please note that in this case I would rework the patch for a final (this-time-really-final) time and drop this elaborate co-developed-by list, as the patch in question will then have nothing to do it all with anything what was before v2 of this series. Unless I hear any objections to that from anyone, I'll try to implement that next week. Best regards, Michael > > --- > bod 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 D16BACA0FF2 for ; Thu, 28 Aug 2025 11:06:58 +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: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=WdZAmQ28UjoHhKKkwMesA7x5iboYkiZ6S2gW/EozC7o=; b=wsTbFBYrYm7Z6+ 52CmMiQhNv9IetV0rip4Whnph9Gv6r5HgA92gqFQcLjJTEvWzn/ItyGWn8AV62lO0/xBJbUtAXJyv WcfeoDpsua2X4tIbZUNa/6Nef8IKGTu8ZnuTAEHW1svKhZrBcetZ3ORTUKED2enequ9iM+DkdVbhH IjB3bK9i4ihkXP12J1OUtWGa80GvfPkN3Wi7PJIPwm+DCcSP6MBa+QC0eNoGvuHfJwIff7LQfS1Yg NHkfGlLkpJRBi6G1/AR3+n6hMwapBlPpXT+gPdjnBv3AcrKC8vD8U6uvNDa12mpdnWhZRfXA3jebG pqWWJGYIWWxbBZOoq9gw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uraSy-00000001Hg8-1kPq; Thu, 28 Aug 2025 11:06:52 +0000 Received: from bali.collaboradmins.com ([2a01:4f8:201:9162::2]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1urZTV-000000014lI-2RpL; Thu, 28 Aug 2025 10:03:22 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1756375398; bh=nCTV06WWtfHMZWRisXpyJ/SJmpEYn6VwPhh/jXVXBYA=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=kQ9CGV025NnRJyfl1LkkWM3qppd1P22I26rdgTExBn/PQVUCTlXO7rX26sQqkzBW/ 9sr+xlQ6jlMWoeA6KQXYQgaG4rD6O4xvn6MsCo+ldZaYkgn4aOnuTtO+BhvMxyJBuM LgncDxpBlM9b772Xlwz9ccNKhZNBGZBKiQPQjELMpIUa0+bdRPVp4mTHaHkwkWbuWg 2h07J8rBLEz5V3Fr0Gdkf+gtVQhcPQf7eSdWSy+/R13VY9ItDRPXkhmw2EhdMRvIGp s5VXACfuHDGzXheeCiyg/986fu0Xh/Jb6gr3GzZNYXi1o495JeGcmpplMUtUNXXXuQ ohfHCmT947CAA== Received: from [172.18.81.15] (ip-185-104-138-156.ptr.icomera.net [185.104.138.156]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: mriesch) by bali.collaboradmins.com (Postfix) with ESMTPSA id DFCF617E0A49; Thu, 28 Aug 2025 12:03:14 +0200 (CEST) Message-ID: <23ccc744-745d-4a31-a79c-2d64bf1ed43d@collabora.com> Date: Thu, 28 Aug 2025 12:03:13 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v10 06/13] media: rockchip: add a driver for the rockchip camera interface To: Bryan O'Donoghue , Mehdi Djait , Maxime Chevallier , =?UTF-8?Q?Th=C3=A9o_Lebrun?= , Thomas Petazzoni , Gerald Loacker , Markus Elfring , Laurent Pinchart , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiko Stuebner , Kever Yang , Nicolas Dufresne , Sebastian Reichel , Collabora Kernel Team , Paul Kocialkowski , Alexander Shiyan , Val Packett , Rob Herring , Philipp Zabel , Sakari Ailus Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Mehdi Djait References: <20240220-rk3568-vicap-v10-0-62d8a7b209b4@collabora.com> <20240220-rk3568-vicap-v10-6-62d8a7b209b4@collabora.com> <3b4173cb-655d-48ea-b86a-a036f666cf40@linaro.org> Content-Language: en-US From: Michael Riesch In-Reply-To: <3b4173cb-655d-48ea-b86a-a036f666cf40@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250828_030321_813372_0B262626 X-CRM114-Status: GOOD ( 38.11 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGkgQnJ5YW4sCgpUaGFua3MgZm9yIHlvdXIgY29tbWVudHMgOi0pCgpPbiA4LzI2LzI1IDA4OjIx LCBCcnlhbiBPJ0Rvbm9naHVlIHdyb3RlOgo+IE9uIDE5LzA4LzIwMjUgMDA6MjUsIE1pY2hhZWwg Umllc2NoIHZpYSBCNCBSZWxheSB3cm90ZToKClsuLi5dCgo+PiArCj4+ICtzdGF0aWMgdm9pZCBy a2NpZl9kdnBfc3RvcF9zdHJlYW1pbmcoc3RydWN0IHJrY2lmX3N0cmVhbSAqc3RyZWFtKQo+PiAr ewo+PiArwqDCoMKgIHN0cnVjdCBya2NpZl9kZXZpY2UgKnJrY2lmID0gc3RyZWFtLT5ya2NpZjsK Pj4gK8KgwqDCoCB1MzIgdmFsOwo+PiArCj4+ICvCoMKgwqAgdmFsID0gcmtjaWZfZHZwX3JlYWQo cmtjaWYsIFJLQ0lGX0RWUF9DVFJMKTsKPiAKPiBUaGlzIGR2cF9yZWFkIHN0dWZmIGxvb2tzIGEg Yml0IGZ1bm55IHRvIG1lLCB5b3UgaGF2ZSBhIGxvb2t1cCB3aGljaCBjYW4KPiByZXR1cm4gMCBm b3IgdW5rbm93biByZWdpc3RlcnMuCj4gCj4gUHJvYmFibHkgbm90IHRoZSBjYXNlIHdpdGggYSBj b250cm9sIHJlZ2lzdGVyIGxpa2UgdGhpcyBvbmUgYnV0LCBmb3IKPiBhcmd1bWVudCBzYWtlIGlm IFJLQ0lGX0RWUF9DVFJMIHdhcyBub3QgYSB2YWxpZCByZWdpc3RlciBpLmUuCj4gcmtjaWZfZHZw X3JlYWQoKSB3b3VsZCByZXR1cm4gMCBhbmQgeW91J2Qgc3RpbGwgYWN0IG9uIHRoYXQgZGF0YSB0 bwo+IHdyaXRlIGJhY2sgdG8gYW4gdW5rb3duIHJlZ2lzdGVyLgoKLi4ud2hpY2ggd291bGQgdGhl biBoaXQgdGhlIHNhbWUgY2hlY2sgaW4gcmtjaWZfZHZwX3dyaXRlIGFuZCBzaW1wbHkKcmV0dXJu IHdpdGhvdXQgd3JpdGluZyBhbnl0aGluZy4gQWxzbywgdGhlIFdBUk5fT05fT05DRSBpbiB0aGUg bG9va3VwCndvdWxkIGNvbXBsYWluIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZSBkcml2ZXIgZGV2ZWxv cGVyIG1hZGUgc29tZSBtaXN0YWtlLgpJIGhvcGUgdGhhdCB0aGUgZHJpdmVyIGRldmVsb3BlciBp cyB0aHVzIG51ZGdlZCB0b3dhcmRzIGZpeGluZyB0aGUgY29kZQp0aGV5IHdyb3RlLgoKPiBXb3Vs ZCB5b3Ugbm90IGJlIGJldHRlciBvZmYgaGF2aW5nIHNheSBjYWxsYmFja3MgdG8gY29udGFpbiBj YXNlcyB3aGVyZQo+IHJlZ2lzdGVycyBhcmUgcG90ZW50aWFsbHkgbm90IHByZXNlbnQKPiAKPiBv cHMtPnVwZGF0ZV9tYXliZV9ub3RfcHJlc2VudF9yZWcoKTsKPiAKPiBmb2xsb3dlZCBieSB3cml0 ZXMgdG8gcmVnaXN0ZXJzIHRoYXQgd291bGQgYWxhd3lzIGJlIHRoZXJlID8KCkknbGwgdGhpbmsg YWJvdXQgdGhhdCBpbiBtb3JlIGRldGFpbCwgYnV0IHJpZ2h0IG5vdyBteSB0aG91Z2h0cyBhcmUg dGhhdAppZiBhbnkgb2YgdGhlIHJlZ2lzdGVycyBiZWxvdyBhcmUgbm90IHZhbGlkLCB0aGlzIHBp ZWNlIG9mIGhhcmR3YXJlIGlzCnByZXR0eSB1c2VsZXNzIGFuZCB0aGVyZSBpcyBzb21ldGhpbmcg cm90dGVuIGluIHRoZSBkcml2ZXIuIFRodXMsIHdlCmNvbXBsYWluIGxvdWRseSB0byB0aGUgZGV2 ZWxvcGVyLgoKPj4gK8KgwqDCoCBya2NpZl9kdnBfd3JpdGUocmtjaWYsIFJLQ0lGX0RWUF9DVFJM LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2YWwgJiAoflJLQ0lGX0NUUkxfRU5BQkxFX0NB UFRVUkUpKTsKPj4gK8KgwqDCoCBya2NpZl9kdnBfd3JpdGUocmtjaWYsIFJLQ0lGX0RWUF9JTlRF TiwgMHgwKTsKPj4gK8KgwqDCoCBya2NpZl9kdnBfd3JpdGUocmtjaWYsIFJLQ0lGX0RWUF9JTlRT VEFULCAweDNmZik7Cj4+ICvCoMKgwqAgcmtjaWZfZHZwX3dyaXRlKHJrY2lmLCBSS0NJRl9EVlBf RlJBTUVfU1RBVFVTLCAweDApOwo+PiArCj4+ICvCoMKgwqAgc3RyZWFtLT5zdG9wcGluZyA9IGZh bHNlOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBya2NpZl9kdnBfcmVzZXRfc3RyZWFtKHN0 cnVjdCBya2NpZl9kZXZpY2UgKnJrY2lmKQo+PiArewo+PiArwqDCoMKgIHUzMiBjdGwgPSBya2Np Zl9kdnBfcmVhZChya2NpZiwgUktDSUZfRFZQX0NUUkwpOwo+PiArCj4+ICvCoMKgwqAgcmtjaWZf ZHZwX3dyaXRlKHJrY2lmLCBSS0NJRl9EVlBfQ1RSTCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY3RsICYgKH5SS0NJRl9DVFJMX0VOQUJMRV9DQVBUVVJFKSk7Cj4+ICvCoMKgwqAgcmtjaWZf ZHZwX3dyaXRlKHJrY2lmLCBSS0NJRl9EVlBfQ1RSTCwgY3RsIHwKPj4gUktDSUZfQ1RSTF9FTkFC TEVfQ0FQVFVSRSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHJrY2lmX2R2cF9zZXRfY3Jv cChzdHJ1Y3QgcmtjaWZfc3RyZWFtICpzdHJlYW0sIHUxNiBsZWZ0LAo+PiB1MTYgdG9wKQo+PiAr ewo+PiArwqDCoMKgIHN0cnVjdCBya2NpZl9kZXZpY2UgKnJrY2lmID0gc3RyZWFtLT5ya2NpZjsK Pj4gK8KgwqDCoCB1MzIgdmFsOwo+PiArCj4+ICvCoMKgwqAgdmFsID0gUktDSUZfWFlfQ09PUkQo bGVmdCwgdG9wKTsKPj4gK8KgwqDCoCBya2NpZl9kdnBfd3JpdGUocmtjaWYsIFJLQ0lGX0RWUF9D Uk9QLCB2YWwpOwo+PiArfQo+PiArCj4+ICtpcnFyZXR1cm5fdCBya2NpZl9kdnBfaXNyKGludCBp cnEsIHZvaWQgKmN0eCkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjdHg7 Cj4+ICvCoMKgwqAgc3RydWN0IHJrY2lmX2RldmljZSAqcmtjaWYgPSBkZXZfZ2V0X2RydmRhdGEo ZGV2KTsKPj4gK8KgwqDCoCBzdHJ1Y3QgcmtjaWZfc3RyZWFtICpzdHJlYW07Cj4+ICvCoMKgwqAg dTMyIGludHN0YXQsIGxhc3RsaW5lLCBsYXN0cGl4LCBjaWZfZnJtc3Q7Cj4+ICvCoMKgwqAgaXJx cmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXJrY2lmLT5tYXRj aF9kYXRhLT5kdnApCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+IAo+IFdvdWxkbid0 IHlvdSBiZSBiZXR0ZXIgb2ZmIGNvbmRpdGlvbmFsbHkgcmVnaXN0ZXJpbmcgeW91ciBJU1IgaWYK PiBtYXRjaF9kYXRhLT5kdnAgaXMgdHJ1ZSBpbnN0ZWFkID8KCkFzIHlvdSBoYXZlIHN1cmVseSBz ZWVuLCB0aGUgSVNSIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBpbnRlcmZhY2VzLCBpLmUuLApEVlAg YW5kIE1JUEkuIE5vdyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCBtb2RlbHMgYWxsIGhhdmUgYSBE VlAgYW5kIHlvdXIKc3VnZ2VzdGlvbiB3b3VsZCB3b3JrLiBIb3dldmVyLCBJIHRoaW5rIHRoZSBS SzM1NjIgVklDQVAgY2FuIGJlIGVhc2lseQpzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgYnV0IGRv ZXMgbm90IGZlYXR1cmUgYSBEVlAgKHNldmVyYWwgTUlQSQppbnRlcmZhY2VzLCB0aG91Z2gpLiBJ biB0aGlzIGNhc2UgbWF0Y2hfZGF0YS0+ZHZwIGV2YWx1YXRlcyB0byBmYWxzZSBidXQKc3RpbGwg dGhlcmUgaXMgdGhlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlIElTUi4KCj4gCj4+ICsKPj4gK8KgwqDC oCBpbnRzdGF0ID0gcmtjaWZfZHZwX3JlYWQocmtjaWYsIFJLQ0lGX0RWUF9JTlRTVEFUKTsKPj4g K8KgwqDCoCBjaWZfZnJtc3QgPSBya2NpZl9kdnBfcmVhZChya2NpZiwgUktDSUZfRFZQX0ZSQU1F X1NUQVRVUyk7Cj4+ICvCoMKgwqAgbGFzdGxpbmUgPSBSS0NJRl9GRVRDSF9ZKHJrY2lmX2R2cF9y ZWFkKHJrY2lmLAo+PiBSS0NJRl9EVlBfTEFTVF9MSU5FKSk7Cj4+ICvCoMKgwqAgbGFzdHBpeCA9 IFJLQ0lGX0ZFVENIX1kocmtjaWZfZHZwX3JlYWQocmtjaWYsIFJLQ0lGX0RWUF9MQVNUX1BJWCkp Owo+PiArCj4+ICvCoMKgwqAgaWYgKGludHN0YXQgJiBSS0NJRl9JTlRTVEFUX0ZSQU1FX0VORCkg ewo+PiArwqDCoMKgwqDCoMKgwqAgcmtjaWZfZHZwX3dyaXRlKHJrY2lmLCBSS0NJRl9EVlBfSU5U U1RBVCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBSS0NJRl9JTlRTVEFUX0ZS QU1FX0VORF9DTFIgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFJLQ0lGX0lO VFNUQVRfTElORV9FTkRfQ0xSKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgc3RyZWFtID0gJnJr Y2lmLT5pbnRlcmZhY2VzW1JLQ0lGX0RWUF0uc3RyZWFtc1tSS0NJRl9JRDBdOwo+PiArCj4+ICvC oMKgwqDCoMKgwqDCoCBpZiAoc3RyZWFtLT5zdG9wcGluZykgewo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBya2NpZl9kdnBfc3RvcF9zdHJlYW1pbmcoc3RyZWFtKTsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgd2FrZV91cCgmc3RyZWFtLT53cV9zdG9wcGVkKTsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcmV0ID0gSVJRX0hBTkRMRUQ7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGdvdG8gb3V0Owo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBp ZiAobGFzdGxpbmUgIT0gc3RyZWFtLT5waXguaGVpZ2h0KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHY0bDJfZXJyKCZya2NpZi0+djRsMl9kZXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAiYmFkIGZyYW1lLCBpcnE6JSN4IGZybXN0OiUjeCBzaXplOiVkeCVkXG4i LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50c3RhdCwgY2lmX2ZybXN0 LCBsYXN0cGl4LCBsYXN0bGluZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmtj aWZfZHZwX3Jlc2V0X3N0cmVhbShya2NpZik7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4g K8KgwqDCoMKgwqDCoMKgIHJrY2lmX3N0cmVhbV9waW5ncG9uZyhzdHJlYW0pOwo+PiArCj4+ICvC oMKgwqDCoMKgwqDCoCByZXQgPSBJUlFfSEFORExFRDsKPj4gK8KgwqDCoCB9Cj4+ICtvdXQ6Cj4+ ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiAraW50IHJrY2lmX2R2cF9yZWdpc3Rl cihzdHJ1Y3QgcmtjaWZfZGV2aWNlICpya2NpZikKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3Qgcmtj aWZfaW50ZXJmYWNlICppbnRlcmZhY2U7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50IHN0cmVhbXNf bnVtOwo+PiArwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXJrY2lmLT5tYXRj aF9kYXRhLT5kdnApCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPiAKPiBJZiB5b3UgZG9u J3QgcmVnaXN0ZXIgdGhlIGRldmljZSB3aGVuIG1hdGNoX2RhdGEtPmR2cCBpcyBmYWxzZSwgdGhl biBJCj4gdGhpbmsgeW91IGNhbiByZWxheCB0aGUgY2Fycnktb24gY2hlY2tzIGVsc2V3aGVyZSBv biBtYXRjaF9kYXRhLT5kdnAsCj4gbm90IGluY2x1ZGluZyBkdnBfdW5yZWdpc3RlcgoKKzEgSSds bCByZXZpZXcgYWxsIGluc3RhbmNlcyBvZiB0aGlzIGNoZWNrLgoKPiBUaGUgcmVzdCBvZiB0aGUg ZmlsZSBhcyBJIGJyZWlmbHkgc2tpbSBpdCBsb29rcyBPSyB0byBtZSwgaXRzIGEgYml0IGJpZwo+ IHRob3VnaC4KPiAKPiBXb3VsZCBpdCBiZSBwb3NzaWJsZSB0byBicmVhayB0aGlzIHBhdGNoIHVw IGEgbGl0dGxlIGJpdCA/IE1pZ2h0IG1ha2UgaXQKPiBlYXNpZXIgZm9yIG90aGVyIHJldmlld2Vy cyB0byBnaXZlIGFuIFNvQiBmb3Igc21hbGxlciBjaHVua3MuCgpJIHN1cHBvc2Ugd2hhdCBJIGNv dWxkIGRvIGlzIHNwbGl0IHRoaXMgdXAgaW50byBmaXZlIHBhdGNoZXMsIGFzIHRoZQpjb21taXQg bWVzc2FnZSBhbHJlYWR5IG91dGxpbmVzOgoKMSkgYWRkIGEgYmFzaWMgZHJpdmVyIChuby1vcCBz a2VsZXRvbiBvbmx5KQoyKSBhYnN0cmFjdGlvbiBmb3IgdGhlIHBpbmctcG9uZyBzY2hlbWUgdG8g YWxsb3cgZm9yIGZ1dHVyZSBleHRlbnNpb25zCjMpIGFic3RyYWN0aW9uIGZvciB0aGUgSU5URVJG QUNFIGFuZCBDUk9QIHBhcnRzIHRvIGFsbG93IGZvciBmdXR1cmUKICAgZXh0ZW5zaW9ucwo0KSBz dXBwb3J0IGZvciB0aGUgUFgzMCBWSVAKNSkgc3VwcG9ydCBmb3IgdGhlIFJLMzU2OCBWSUNBUCBE VlAKClBsZWFzZSBub3RlIHRoYXQgaW4gdGhpcyBjYXNlIEkgd291bGQgcmV3b3JrIHRoZSBwYXRj aCBmb3IgYSBmaW5hbAoodGhpcy10aW1lLXJlYWxseS1maW5hbCkgdGltZSBhbmQgZHJvcCB0aGlz IGVsYWJvcmF0ZSBjby1kZXZlbG9wZWQtYnkKbGlzdCwgYXMgdGhlIHBhdGNoIGluIHF1ZXN0aW9u IHdpbGwgdGhlbiBoYXZlIG5vdGhpbmcgdG8gZG8gaXQgYWxsIHdpdGgKYW55dGhpbmcgd2hhdCB3 YXMgYmVmb3JlIHYyIG9mIHRoaXMgc2VyaWVzLgoKVW5sZXNzIEkgaGVhciBhbnkgb2JqZWN0aW9u cyB0byB0aGF0IGZyb20gYW55b25lLCBJJ2xsIHRyeSB0byBpbXBsZW1lbnQKdGhhdCBuZXh0IHdl ZWsuCgpCZXN0IHJlZ2FyZHMsCk1pY2hhZWwKCj4gCj4gLS0tCj4gYm9kCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgtcm9ja2NoaXAgbWFpbGlu ZyBsaXN0CkxpbnV4LXJvY2tjaGlwQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yb2NrY2hpcAo=