From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753871AbcD2OrT (ORCPT ); Fri, 29 Apr 2016 10:47:19 -0400 Received: from smtp.domeneshop.no ([194.63.252.55]:56954 "EHLO smtp.domeneshop.no" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753826AbcD2OrO (ORCPT ); Fri, 29 Apr 2016 10:47:14 -0400 Subject: Re: [PATCH v4 3/7] drm/fb-helper: Add fb_deferred_io support To: Tomi Valkeinen , dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org References: <1461856717-6476-1-git-send-email-noralf@tronnes.org> <1461856717-6476-4-git-send-email-noralf@tronnes.org> <572358A0.8010002@ti.com> Cc: daniel@ffwll.ch, laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Message-ID: <572373EC.9010503@tronnes.org> Date: Fri, 29 Apr 2016 16:47:08 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 MIME-Version: 1.0 In-Reply-To: <572358A0.8010002@ti.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Den 29.04.2016 14:50, skrev Tomi Valkeinen: > Hi, > > On 28/04/16 18:18, Noralf Trønnes wrote: >> This adds deferred io support to drm_fb_helper. >> The fbdev framebuffer changes are flushed using the callback >> (struct drm_framebuffer *)->funcs->dirty() by a dedicated worker >> ensuring that it always runs in process context. >> >> Signed-off-by: Noralf Trønnes >> Reviewed-by: Daniel Vetter >> --- > Thanks for the series! Unfortunately I haven't been able to follow the > discussions properly, so I hope my questions haven't been covered earlier. > >> Changes since v3: >> - Don't use forward decl, move drm_fb_helper_dirty_work() >> - Use DIV_ROUND_UP in drm_fb_helper_deferred_io() >> >> Changes since v2: >> - FB_DEFERRED_IO is now always selected by DRM_KMS_FB_HELPER, ifdef removed >> - The drm_clip_rect utility functions are dropped, so open code it >> - docs: use & to denote structs >> >> Changes since v1: >> - Use a dedicated worker to run the framebuffer flushing like qxl does >> - Add parameter descriptions to drm_fb_helper_deferred_io >> >> drivers/gpu/drm/Kconfig | 1 + >> drivers/gpu/drm/drm_fb_helper.c | 103 +++++++++++++++++++++++++++++++++++++++- >> include/drm/drm_fb_helper.h | 15 ++++++ >> 3 files changed, 118 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig >> index 9e4f2f1..8e6f34b 100644 >> --- a/drivers/gpu/drm/Kconfig >> +++ b/drivers/gpu/drm/Kconfig >> @@ -52,6 +52,7 @@ config DRM_KMS_FB_HELPER >> select FB_CFB_FILLRECT >> select FB_CFB_COPYAREA >> select FB_CFB_IMAGEBLIT >> + select FB_DEFERRED_IO >> help >> FBDEV helpers for KMS drivers. >> >> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c >> index 855108e..62f849f 100644 >> --- a/drivers/gpu/drm/drm_fb_helper.c >> +++ b/drivers/gpu/drm/drm_fb_helper.c >> @@ -84,6 +84,15 @@ static LIST_HEAD(kernel_fb_helper_list); >> * and set up an initial configuration using the detected hardware, drivers >> * should call drm_fb_helper_single_add_all_connectors() followed by >> * drm_fb_helper_initial_config(). >> + * >> + * If CONFIG_FB_DEFERRED_IO is enabled and &drm_framebuffer_funcs ->dirty is >> + * set, the drm_fb_helper_{cfb,sys}_{write,fillrect,copyarea,imageblit} >> + * functions will accumulate changes and schedule &fb_helper .dirty_work to run >> + * right away. This worker then calls the dirty() function ensuring that it >> + * will always run in process context since the fb_*() function could be >> + * running in atomic context. If drm_fb_helper_deferred_io() is used as the > Who's calling {write,fillrect,copyarea,imageblit} in an atomic context? > That sounds like a very bad idea to me... I haven't verified it myself, but took it as fact based on commit: bcb39af4486be07e896fc374a2336bad3104ae0a drm/udl: make usage as a console safer Okay you don't really want to use udl devices as your console, but if you are unlucky enough to do so, you run into a lot of schedule while atomic due to printk being called from all sorts of funky places. So check if we are in an atomic context, and queue the damage for later, the next printk should cause it to appear. This isn't ideal, but it is simple, and seems to work okay in my testing here. (dirty area idea came from xenfb) fixes a bunch of sleeping while atomic issues running fbcon on udl devices. Cc: stable@vger.kernel.org Signed-off-by: Dave Airlie > If this is only for accumulating changes, I think it may be better to > leave that to the driver as it may have better idea of how to accumulate. > > But, of course, this is a helper, so if all the drivers use this kind of > accumulation, it makes sense =). qxl already accumulates damage this way and upcoming tinydrm also. udl has handled this damage inline except when in_atomic() which results in damage being deferred to the next fb_*() call. It is possible for drivers to have their own fb_*() handling and still use drm_fb_helper_deferred_io(). For those who likes details, this is fbcon unblanking which results in a full display update on a 320x240 display, shell with blinking cursor on the last line of the console: [ 5505.164150] drm_fb_helper_dirty: x=152,width=8,y=224,height=16 [ 5505.164186] [drm:drm_atomic_state_init] Allocated atomic state b859e400 [...more drm atomic msgs...] [ 5505.164713] drm_fb_helper_dirty: x=152,width=8,y=224,height=16 [ 5505.164746] [drm:drm_atomic_state_init] Allocated atomic state b859e440 [...more drm atomic msgs...] [ 5505.165086] drm_fb_helper_dirty: x=0,width=320,y=0,height=16 [ 5505.165153] drm_fb_helper_dirty: x=0,width=320,y=16,height=16 [ 5505.165220] drm_fb_helper_dirty: x=0,width=320,y=32,height=16 [ 5505.165287] drm_fb_helper_dirty: x=0,width=320,y=48,height=16 [ 5505.165354] drm_fb_helper_dirty: x=0,width=320,y=64,height=16 [ 5505.165420] drm_fb_helper_dirty: x=0,width=320,y=80,height=16 [ 5505.165487] drm_fb_helper_dirty: x=0,width=320,y=96,height=16 [ 5505.165553] drm_fb_helper_dirty: x=0,width=320,y=112,height=16 [ 5505.165619] drm_fb_helper_dirty: x=0,width=320,y=128,height=16 [ 5505.165686] drm_fb_helper_dirty: x=0,width=320,y=144,height=16 [ 5505.165752] drm_fb_helper_dirty: x=0,width=320,y=160,height=16 [ 5505.165818] drm_fb_helper_dirty: x=0,width=320,y=176,height=16 [ 5505.165884] drm_fb_helper_dirty: x=0,width=320,y=192,height=16 [ 5505.165949] drm_fb_helper_dirty: x=0,width=320,y=208,height=16 [ 5505.165978] drm_fb_helper_dirty: x=0,width=112,y=224,height=16 [ 5505.165988] drm_fb_helper_dirty: x=112,width=8,y=224,height=16 [ 5505.166002] drm_fb_helper_dirty: x=120,width=24,y=224,height=16 [ 5505.166041] drm_fb_helper_dirty: x=144,width=176,y=224,height=16 [ 5505.166058] drm_fb_helper_dirty: x=152,width=8,y=224,height=16 [ 5505.166079] drm_fb_helper_dirty: x=152,width=8,y=224,height=16 [ 5505.166424] drm_fb_helper_dirty_work: x1=0,x2=320,y1=0,y2=240 [ 5505.166452] adafruit-tft spi0.0: mipi_dbi_dirtyfb: vmem=bac40000, x1=0, x2=320, y1=0, y2=240 Cursor blinking: [ 5505.363478] drm_fb_helper_dirty: x=152,width=8,y=224,height=16 [ 5505.363509] drm_fb_helper_dirty_work: x1=152,x2=160,y1=224,y2=240 [ 5505.363539] adafruit-tft spi0.0: mipi_dbi_dirtyfb: vmem=bac40000, x1=152, x2=160, y1=224, y2=240 [ 5505.563488] drm_fb_helper_dirty: x=152,width=8,y=224,height=16 [ 5505.563514] drm_fb_helper_dirty_work: x1=152,x2=160,y1=224,y2=240 [ 5505.563542] adafruit-tft spi0.0: mipi_dbi_dirtyfb: vmem=bac40000, x1=152, x2=160, y1=224, y2=240 Noralf. From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Date: Fri, 29 Apr 2016 14:47:08 +0000 Subject: Re: [PATCH v4 3/7] drm/fb-helper: Add fb_deferred_io support Message-Id: <572373EC.9010503@tronnes.org> List-Id: References: <1461856717-6476-1-git-send-email-noralf@tronnes.org> <1461856717-6476-4-git-send-email-noralf@tronnes.org> <572358A0.8010002@ti.com> In-Reply-To: <572358A0.8010002@ti.com> MIME-Version: 1.0 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: quoted-printable To: Tomi Valkeinen , dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org Den 29.04.2016 14:50, skrev Tomi Valkeinen: > Hi, > > On 28/04/16 18:18, Noralf Tr=C3=B8nnes wrote: >> This adds deferred io support to drm_fb_helper. >> The fbdev framebuffer changes are flushed using the callback >> (struct drm_framebuffer *)->funcs->dirty() by a dedicated worker >> ensuring that it always runs in process context. >> >> Signed-off-by: Noralf Tr=C3=B8nnes >> Reviewed-by: Daniel Vetter >> --- > Thanks for the series! Unfortunately I haven't been able to follow the > discussions properly, so I hope my questions haven't been covered earlier. > >> Changes since v3: >> - Don't use forward decl, move drm_fb_helper_dirty_work() >> - Use DIV_ROUND_UP in drm_fb_helper_deferred_io() >> >> Changes since v2: >> - FB_DEFERRED_IO is now always selected by DRM_KMS_FB_HELPER, ifdef remo= ved >> - The drm_clip_rect utility functions are dropped, so open code it >> - docs: use & to denote structs >> >> Changes since v1: >> - Use a dedicated worker to run the framebuffer flushing like qxl does >> - Add parameter descriptions to drm_fb_helper_deferred_io >> >> drivers/gpu/drm/Kconfig | 1 + >> drivers/gpu/drm/drm_fb_helper.c | 103 ++++++++++++++++++++++++++++++++= +++++++- >> include/drm/drm_fb_helper.h | 15 ++++++ >> 3 files changed, 118 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig >> index 9e4f2f1..8e6f34b 100644 >> --- a/drivers/gpu/drm/Kconfig >> +++ b/drivers/gpu/drm/Kconfig >> @@ -52,6 +52,7 @@ config DRM_KMS_FB_HELPER >> select FB_CFB_FILLRECT >> select FB_CFB_COPYAREA >> select FB_CFB_IMAGEBLIT >> + select FB_DEFERRED_IO >> help >> FBDEV helpers for KMS drivers. >> >> diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_he= lper.c >> index 855108e..62f849f 100644 >> --- a/drivers/gpu/drm/drm_fb_helper.c >> +++ b/drivers/gpu/drm/drm_fb_helper.c >> @@ -84,6 +84,15 @@ static LIST_HEAD(kernel_fb_helper_list); >> * and set up an initial configuration using the detected hardware, dr= ivers >> * should call drm_fb_helper_single_add_all_connectors() followed by >> * drm_fb_helper_initial_config(). >> + * >> + * If CONFIG_FB_DEFERRED_IO is enabled and &drm_framebuffer_funcs ->dir= ty is >> + * set, the drm_fb_helper_{cfb,sys}_{write,fillrect,copyarea,imageblit} >> + * functions will accumulate changes and schedule &fb_helper .dirty_wor= k to run >> + * right away. This worker then calls the dirty() function ensuring tha= t it >> + * will always run in process context since the fb_*() function could be >> + * running in atomic context. If drm_fb_helper_deferred_io() is used as= the > Who's calling {write,fillrect,copyarea,imageblit} in an atomic context? > That sounds like a very bad idea to me... I haven't verified it myself, but took it as fact based on commit: bcb39af4486be07e896fc374a2336bad3104ae0a drm/udl: make usage as a console safer Okay you don't really want to use udl devices as your console, but if you are unlucky enough to do so, you run into a lot of schedule while atomic due to printk being called from all sorts of funky places. So check if we are in an atomic context, and queue the damage for later, the next printk should cause it to appear. This isn't ideal, but it is simple, and seems to work okay in my testing here. (dirty area idea came from xenfb) fixes a bunch of sleeping while atomic issues running fbcon on udl devices. Cc: stable@vger.kernel.org Signed-off-by: Dave Airlie > If this is only for accumulating changes, I think it may be better to > leave that to the driver as it may have better idea of how to accumulate. > > But, of course, this is a helper, so if all the drivers use this kind of > accumulation, it makes sense =3D). qxl already accumulates damage this way and upcoming tinydrm also. udl has handled this damage inline except when in_atomic() which results in damage being deferred to the next fb_*() call. It is possible for drivers to have their own fb_*() handling and still use drm_fb_helper_deferred_io(). For those who likes details, this is fbcon unblanking which results in a full display update on a 320x240 display, shell with blinking cursor on the last line of the console: [ 5505.164150] drm_fb_helper_dirty: x=152,width=3D8,y"4,height=16 [ 5505.164186] [drm:drm_atomic_state_init] Allocated atomic state b859e400 [...more drm atomic msgs...] [ 5505.164713] drm_fb_helper_dirty: x=152,width=3D8,y"4,height=16 [ 5505.164746] [drm:drm_atomic_state_init] Allocated atomic state b859e440 [...more drm atomic msgs...] [ 5505.165086] drm_fb_helper_dirty: x=3D0,width20,y=3D0,height=16 [ 5505.165153] drm_fb_helper_dirty: x=3D0,width20,y=16,height=16 [ 5505.165220] drm_fb_helper_dirty: x=3D0,width20,y2,height=16 [ 5505.165287] drm_fb_helper_dirty: x=3D0,width20,yH,height=16 [ 5505.165354] drm_fb_helper_dirty: x=3D0,width20,yd,height=16 [ 5505.165420] drm_fb_helper_dirty: x=3D0,width20,y=80,height=16 [ 5505.165487] drm_fb_helper_dirty: x=3D0,width20,y=96,height=16 [ 5505.165553] drm_fb_helper_dirty: x=3D0,width20,y=112,height=16 [ 5505.165619] drm_fb_helper_dirty: x=3D0,width20,y=128,height=16 [ 5505.165686] drm_fb_helper_dirty: x=3D0,width20,y=144,height=16 [ 5505.165752] drm_fb_helper_dirty: x=3D0,width20,y=160,height=16 [ 5505.165818] drm_fb_helper_dirty: x=3D0,width20,y=176,height=16 [ 5505.165884] drm_fb_helper_dirty: x=3D0,width20,y=192,height=16 [ 5505.165949] drm_fb_helper_dirty: x=3D0,width20,y 8,height=16 [ 5505.165978] drm_fb_helper_dirty: x=3D0,width=112,y"4,height=16 [ 5505.165988] drm_fb_helper_dirty: x=112,width=3D8,y"4,height=16 [ 5505.166002] drm_fb_helper_dirty: x=120,width$,y"4,height=16 [ 5505.166041] drm_fb_helper_dirty: x=144,width=176,y"4,height=16 [ 5505.166058] drm_fb_helper_dirty: x=152,width=3D8,y"4,height=16 [ 5505.166079] drm_fb_helper_dirty: x=152,width=3D8,y"4,height=16 [ 5505.166424] drm_fb_helper_dirty_work: x1=3D0,x220,y1=3D0,y2$0 [ 5505.166452] adafruit-tft spi0.0: mipi_dbi_dirtyfb: vmem=BAc40000,=20 x1=3D0, x220, y1=3D0, y2$0 Cursor blinking: [ 5505.363478] drm_fb_helper_dirty: x=152,width=3D8,y"4,height=16 [ 5505.363509] drm_fb_helper_dirty_work: x1=152,x2=160,y1"4,y2$0 [ 5505.363539] adafruit-tft spi0.0: mipi_dbi_dirtyfb: vmem=BAc40000,=20 x1=152, x2=160, y1"4, y2$0 [ 5505.563488] drm_fb_helper_dirty: x=152,width=3D8,y"4,height=16 [ 5505.563514] drm_fb_helper_dirty_work: x1=152,x2=160,y1"4,y2$0 [ 5505.563542] adafruit-tft spi0.0: mipi_dbi_dirtyfb: vmem=BAc40000,=20 x1=152, x2=160, y1"4, y2$0 Noralf. From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?Q?Noralf_Tr=c3=b8nnes?= Subject: Re: [PATCH v4 3/7] drm/fb-helper: Add fb_deferred_io support Date: Fri, 29 Apr 2016 16:47:08 +0200 Message-ID: <572373EC.9010503@tronnes.org> References: <1461856717-6476-1-git-send-email-noralf@tronnes.org> <1461856717-6476-4-git-send-email-noralf@tronnes.org> <572358A0.8010002@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from smtp.domeneshop.no (smtp.domeneshop.no [IPv6:2a01:5b40:0:3005::1]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4EA266E32B for ; Fri, 29 Apr 2016 14:47:14 +0000 (UTC) In-Reply-To: <572358A0.8010002@ti.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Tomi Valkeinen , dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: laurent.pinchart@ideasonboard.com, linux-kernel@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org CkRlbiAyOS4wNC4yMDE2IDE0OjUwLCBza3JldiBUb21pIFZhbGtlaW5lbjoKPiBIaSwKPgo+IE9u IDI4LzA0LzE2IDE4OjE4LCBOb3JhbGYgVHLDuG5uZXMgd3JvdGU6Cj4+IFRoaXMgYWRkcyBkZWZl cnJlZCBpbyBzdXBwb3J0IHRvIGRybV9mYl9oZWxwZXIuCj4+IFRoZSBmYmRldiBmcmFtZWJ1ZmZl ciBjaGFuZ2VzIGFyZSBmbHVzaGVkIHVzaW5nIHRoZSBjYWxsYmFjawo+PiAoc3RydWN0IGRybV9m cmFtZWJ1ZmZlciAqKS0+ZnVuY3MtPmRpcnR5KCkgYnkgYSBkZWRpY2F0ZWQgd29ya2VyCj4+IGVu c3VyaW5nIHRoYXQgaXQgYWx3YXlzIHJ1bnMgaW4gcHJvY2VzcyBjb250ZXh0Lgo+Pgo+PiBTaWdu ZWQtb2ZmLWJ5OiBOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4KPj4gUmV2aWV3 ZWQtYnk6IERhbmllbCBWZXR0ZXIgPGRhbmllbC52ZXR0ZXJAZmZ3bGwuY2g+Cj4+IC0tLQo+IFRo YW5rcyBmb3IgdGhlIHNlcmllcyEgVW5mb3J0dW5hdGVseSBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRv IGZvbGxvdyB0aGUKPiBkaXNjdXNzaW9ucyBwcm9wZXJseSwgc28gSSBob3BlIG15IHF1ZXN0aW9u cyBoYXZlbid0IGJlZW4gY292ZXJlZCBlYXJsaWVyLgo+Cj4+IENoYW5nZXMgc2luY2UgdjM6Cj4+ IC0gRG9uJ3QgdXNlIGZvcndhcmQgZGVjbCwgbW92ZSBkcm1fZmJfaGVscGVyX2RpcnR5X3dvcmso KQo+PiAtIFVzZSBESVZfUk9VTkRfVVAgaW4gZHJtX2ZiX2hlbHBlcl9kZWZlcnJlZF9pbygpCj4+ Cj4+IENoYW5nZXMgc2luY2UgdjI6Cj4+IC0gRkJfREVGRVJSRURfSU8gaXMgbm93IGFsd2F5cyBz ZWxlY3RlZCBieSBEUk1fS01TX0ZCX0hFTFBFUiwgaWZkZWYgcmVtb3ZlZAo+PiAtIFRoZSBkcm1f Y2xpcF9yZWN0IHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBkcm9wcGVkLCBzbyBvcGVuIGNvZGUgaXQK Pj4gLSBkb2NzOiB1c2UgJiB0byBkZW5vdGUgc3RydWN0cwo+Pgo+PiBDaGFuZ2VzIHNpbmNlIHYx Ogo+PiAtIFVzZSBhIGRlZGljYXRlZCB3b3JrZXIgdG8gcnVuIHRoZSBmcmFtZWJ1ZmZlciBmbHVz aGluZyBsaWtlIHF4bCBkb2VzCj4+IC0gQWRkIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMgdG8gZHJt X2ZiX2hlbHBlcl9kZWZlcnJlZF9pbwo+Pgo+PiAgIGRyaXZlcnMvZ3B1L2RybS9LY29uZmlnICAg ICAgICAgfCAgIDEgKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgfCAxMDMg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+PiAgIGluY2x1ZGUvZHJt L2RybV9mYl9oZWxwZXIuaCAgICAgfCAgMTUgKysrKysrCj4+ICAgMyBmaWxlcyBjaGFuZ2VkLCAx MTggaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwo+PiBpbmRleCA5ZTRm MmYxLi44ZTZmMzRiIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwo+PiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwo+PiBAQCAtNTIsNiArNTIsNyBAQCBjb25maWcg RFJNX0tNU19GQl9IRUxQRVIKPj4gICAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAo+PiAgIAlzZWxl Y3QgRkJfQ0ZCX0NPUFlBUkVBCj4+ICAgCXNlbGVjdCBGQl9DRkJfSU1BR0VCTElUCj4+ICsJc2Vs ZWN0IEZCX0RFRkVSUkVEX0lPCj4+ICAgCWhlbHAKPj4gICAJICBGQkRFViBoZWxwZXJzIGZvciBL TVMgZHJpdmVycy4KPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVs cGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCj4+IGluZGV4IDg1NTEwOGUu LjYyZjg0OWYgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMK Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwo+PiBAQCAtODQsNiArODQs MTUgQEAgc3RhdGljIExJU1RfSEVBRChrZXJuZWxfZmJfaGVscGVyX2xpc3QpOwo+PiAgICAqIGFu ZCBzZXQgdXAgYW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBkZXRlY3RlZCBoYXJk d2FyZSwgZHJpdmVycwo+PiAgICAqIHNob3VsZCBjYWxsIGRybV9mYl9oZWxwZXJfc2luZ2xlX2Fk ZF9hbGxfY29ubmVjdG9ycygpIGZvbGxvd2VkIGJ5Cj4+ICAgICogZHJtX2ZiX2hlbHBlcl9pbml0 aWFsX2NvbmZpZygpLgo+PiArICoKPj4gKyAqIElmIENPTkZJR19GQl9ERUZFUlJFRF9JTyBpcyBl bmFibGVkIGFuZCAmZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIC0+ZGlydHkgaXMKPj4gKyAqIHNldCwg dGhlIGRybV9mYl9oZWxwZXJfe2NmYixzeXN9X3t3cml0ZSxmaWxscmVjdCxjb3B5YXJlYSxpbWFn ZWJsaXR9Cj4+ICsgKiBmdW5jdGlvbnMgd2lsbCBhY2N1bXVsYXRlIGNoYW5nZXMgYW5kIHNjaGVk dWxlICZmYl9oZWxwZXIgLmRpcnR5X3dvcmsgdG8gcnVuCj4+ICsgKiByaWdodCBhd2F5LiBUaGlz IHdvcmtlciB0aGVuIGNhbGxzIHRoZSBkaXJ0eSgpIGZ1bmN0aW9uIGVuc3VyaW5nIHRoYXQgaXQK Pj4gKyAqIHdpbGwgYWx3YXlzIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQgc2luY2UgdGhlIGZiXyoo KSBmdW5jdGlvbiBjb3VsZCBiZQo+PiArICogcnVubmluZyBpbiBhdG9taWMgY29udGV4dC4gSWYg ZHJtX2ZiX2hlbHBlcl9kZWZlcnJlZF9pbygpIGlzIHVzZWQgYXMgdGhlCj4gV2hvJ3MgY2FsbGlu ZyB7d3JpdGUsZmlsbHJlY3QsY29weWFyZWEsaW1hZ2VibGl0fSBpbiBhbiBhdG9taWMgY29udGV4 dD8KPiBUaGF0IHNvdW5kcyBsaWtlIGEgdmVyeSBiYWQgaWRlYSB0byBtZS4uLgoKSSBoYXZlbid0 IHZlcmlmaWVkIGl0IG15c2VsZiwgYnV0IHRvb2sgaXQgYXMgZmFjdCBiYXNlZCBvbgpjb21taXQ6 IGJjYjM5YWY0NDg2YmUwN2U4OTZmYzM3NGEyMzM2YmFkMzEwNGFlMGEKCmRybS91ZGw6IG1ha2Ug dXNhZ2UgYXMgYSBjb25zb2xlIHNhZmVyCk9rYXkgeW91IGRvbid0IHJlYWxseSB3YW50IHRvIHVz ZSB1ZGwgZGV2aWNlcyBhcyB5b3VyIGNvbnNvbGUsIGJ1dCBpZgp5b3UgYXJlIHVubHVja3kgZW5v dWdoIHRvIGRvIHNvLCB5b3UgcnVuIGludG8gYSBsb3Qgb2Ygc2NoZWR1bGUgd2hpbGUgYXRvbWlj CmR1ZSB0byBwcmludGsgYmVpbmcgY2FsbGVkIGZyb20gYWxsIHNvcnRzIG9mIGZ1bmt5IHBsYWNl cy4gU28gY2hlY2sgaWYgd2UKYXJlIGluIGFuIGF0b21pYyBjb250ZXh0LCBhbmQgcXVldWUgdGhl IGRhbWFnZSBmb3IgbGF0ZXIsIHRoZSBuZXh0IHByaW50awpzaG91bGQgY2F1c2UgaXQgdG8gYXBw ZWFyLiBUaGlzIGlzbid0IGlkZWFsLCBidXQgaXQgaXMgc2ltcGxlLCBhbmQgc2VlbXMgdG8Kd29y ayBva2F5IGluIG15IHRlc3RpbmcgaGVyZS4KCihkaXJ0eSBhcmVhIGlkZWEgY2FtZSBmcm9tIHhl bmZiKQoKZml4ZXMgYSBidW5jaCBvZiBzbGVlcGluZyB3aGlsZSBhdG9taWMgaXNzdWVzIHJ1bm5p bmcgZmJjb24gb24gdWRsIGRldmljZXMuCgpDYzogc3RhYmxlQHZnZXIua2VybmVsLm9yZwpTaWdu ZWQtb2ZmLWJ5OiBEYXZlIEFpcmxpZSA8YWlybGllZEByZWRoYXQuY29tPgoKPiBJZiB0aGlzIGlz IG9ubHkgZm9yIGFjY3VtdWxhdGluZyBjaGFuZ2VzLCBJIHRoaW5rIGl0IG1heSBiZSBiZXR0ZXIg dG8KPiBsZWF2ZSB0aGF0IHRvIHRoZSBkcml2ZXIgYXMgaXQgbWF5IGhhdmUgYmV0dGVyIGlkZWEg b2YgaG93IHRvIGFjY3VtdWxhdGUuCj4KPiBCdXQsIG9mIGNvdXJzZSwgdGhpcyBpcyBhIGhlbHBl ciwgc28gaWYgYWxsIHRoZSBkcml2ZXJzIHVzZSB0aGlzIGtpbmQgb2YKPiBhY2N1bXVsYXRpb24s IGl0IG1ha2VzIHNlbnNlID0pLgoKcXhsIGFscmVhZHkgYWNjdW11bGF0ZXMgZGFtYWdlIHRoaXMg d2F5IGFuZCB1cGNvbWluZyB0aW55ZHJtIGFsc28uCnVkbCBoYXMgaGFuZGxlZCB0aGlzIGRhbWFn ZSBpbmxpbmUgZXhjZXB0IHdoZW4gaW5fYXRvbWljKCkgd2hpY2ggcmVzdWx0cwppbiBkYW1hZ2Ug YmVpbmcgZGVmZXJyZWQgdG8gdGhlIG5leHQgZmJfKigpIGNhbGwuCgpJdCBpcyBwb3NzaWJsZSBm b3IgZHJpdmVycyB0byBoYXZlIHRoZWlyIG93biBmYl8qKCkgaGFuZGxpbmcgYW5kIHN0aWxsCnVz ZSBkcm1fZmJfaGVscGVyX2RlZmVycmVkX2lvKCkuCgoKRm9yIHRob3NlIHdobyBsaWtlcyBkZXRh aWxzLCB0aGlzIGlzIGZiY29uIHVuYmxhbmtpbmcgd2hpY2ggcmVzdWx0cyBpbiBhCmZ1bGwgZGlz cGxheSB1cGRhdGUgb24gYSAzMjB4MjQwIGRpc3BsYXksIHNoZWxsIHdpdGggYmxpbmtpbmcgY3Vy c29yIG9uCnRoZSBsYXN0IGxpbmUgb2YgdGhlIGNvbnNvbGU6CgpbIDU1MDUuMTY0MTUwXSBkcm1f ZmJfaGVscGVyX2RpcnR5OiB4PTE1Mix3aWR0aD04LHk9MjI0LGhlaWdodD0xNgpbIDU1MDUuMTY0 MTg2XSBbZHJtOmRybV9hdG9taWNfc3RhdGVfaW5pdF0gQWxsb2NhdGVkIGF0b21pYyBzdGF0ZSBi ODU5ZTQwMApbLi4ubW9yZSBkcm0gYXRvbWljIG1zZ3MuLi5dClsgNTUwNS4xNjQ3MTNdIGRybV9m Yl9oZWxwZXJfZGlydHk6IHg9MTUyLHdpZHRoPTgseT0yMjQsaGVpZ2h0PTE2ClsgNTUwNS4xNjQ3 NDZdIFtkcm06ZHJtX2F0b21pY19zdGF0ZV9pbml0XSBBbGxvY2F0ZWQgYXRvbWljIHN0YXRlIGI4 NTllNDQwClsuLi5tb3JlIGRybSBhdG9taWMgbXNncy4uLl0KWyA1NTA1LjE2NTA4Nl0gZHJtX2Zi X2hlbHBlcl9kaXJ0eTogeD0wLHdpZHRoPTMyMCx5PTAsaGVpZ2h0PTE2ClsgNTUwNS4xNjUxNTNd IGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MCx3aWR0aD0zMjAseT0xNixoZWlnaHQ9MTYKWyA1NTA1 LjE2NTIyMF0gZHJtX2ZiX2hlbHBlcl9kaXJ0eTogeD0wLHdpZHRoPTMyMCx5PTMyLGhlaWdodD0x NgpbIDU1MDUuMTY1Mjg3XSBkcm1fZmJfaGVscGVyX2RpcnR5OiB4PTAsd2lkdGg9MzIwLHk9NDgs aGVpZ2h0PTE2ClsgNTUwNS4xNjUzNTRdIGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MCx3aWR0aD0z MjAseT02NCxoZWlnaHQ9MTYKWyA1NTA1LjE2NTQyMF0gZHJtX2ZiX2hlbHBlcl9kaXJ0eTogeD0w LHdpZHRoPTMyMCx5PTgwLGhlaWdodD0xNgpbIDU1MDUuMTY1NDg3XSBkcm1fZmJfaGVscGVyX2Rp cnR5OiB4PTAsd2lkdGg9MzIwLHk9OTYsaGVpZ2h0PTE2ClsgNTUwNS4xNjU1NTNdIGRybV9mYl9o ZWxwZXJfZGlydHk6IHg9MCx3aWR0aD0zMjAseT0xMTIsaGVpZ2h0PTE2ClsgNTUwNS4xNjU2MTld IGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MCx3aWR0aD0zMjAseT0xMjgsaGVpZ2h0PTE2ClsgNTUw NS4xNjU2ODZdIGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MCx3aWR0aD0zMjAseT0xNDQsaGVpZ2h0 PTE2ClsgNTUwNS4xNjU3NTJdIGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MCx3aWR0aD0zMjAseT0x NjAsaGVpZ2h0PTE2ClsgNTUwNS4xNjU4MThdIGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MCx3aWR0 aD0zMjAseT0xNzYsaGVpZ2h0PTE2ClsgNTUwNS4xNjU4ODRdIGRybV9mYl9oZWxwZXJfZGlydHk6 IHg9MCx3aWR0aD0zMjAseT0xOTIsaGVpZ2h0PTE2ClsgNTUwNS4xNjU5NDldIGRybV9mYl9oZWxw ZXJfZGlydHk6IHg9MCx3aWR0aD0zMjAseT0yMDgsaGVpZ2h0PTE2ClsgNTUwNS4xNjU5NzhdIGRy bV9mYl9oZWxwZXJfZGlydHk6IHg9MCx3aWR0aD0xMTIseT0yMjQsaGVpZ2h0PTE2ClsgNTUwNS4x NjU5ODhdIGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MTEyLHdpZHRoPTgseT0yMjQsaGVpZ2h0PTE2 ClsgNTUwNS4xNjYwMDJdIGRybV9mYl9oZWxwZXJfZGlydHk6IHg9MTIwLHdpZHRoPTI0LHk9MjI0 LGhlaWdodD0xNgpbIDU1MDUuMTY2MDQxXSBkcm1fZmJfaGVscGVyX2RpcnR5OiB4PTE0NCx3aWR0 aD0xNzYseT0yMjQsaGVpZ2h0PTE2ClsgNTUwNS4xNjYwNThdIGRybV9mYl9oZWxwZXJfZGlydHk6 IHg9MTUyLHdpZHRoPTgseT0yMjQsaGVpZ2h0PTE2ClsgNTUwNS4xNjYwNzldIGRybV9mYl9oZWxw ZXJfZGlydHk6IHg9MTUyLHdpZHRoPTgseT0yMjQsaGVpZ2h0PTE2ClsgNTUwNS4xNjY0MjRdIGRy bV9mYl9oZWxwZXJfZGlydHlfd29yazogeDE9MCx4Mj0zMjAseTE9MCx5Mj0yNDAKWyA1NTA1LjE2 NjQ1Ml0gYWRhZnJ1aXQtdGZ0IHNwaTAuMDogbWlwaV9kYmlfZGlydHlmYjogdm1lbT1iYWM0MDAw MCwgCngxPTAsIHgyPTMyMCwgeTE9MCwgeTI9MjQwCgpDdXJzb3IgYmxpbmtpbmc6CgpbIDU1MDUu MzYzNDc4XSBkcm1fZmJfaGVscGVyX2RpcnR5OiB4PTE1Mix3aWR0aD04LHk9MjI0LGhlaWdodD0x NgpbIDU1MDUuMzYzNTA5XSBkcm1fZmJfaGVscGVyX2RpcnR5X3dvcms6IHgxPTE1Mix4Mj0xNjAs eTE9MjI0LHkyPTI0MApbIDU1MDUuMzYzNTM5XSBhZGFmcnVpdC10ZnQgc3BpMC4wOiBtaXBpX2Ri aV9kaXJ0eWZiOiB2bWVtPWJhYzQwMDAwLCAKeDE9MTUyLCB4Mj0xNjAsIHkxPTIyNCwgeTI9MjQw CgpbIDU1MDUuNTYzNDg4XSBkcm1fZmJfaGVscGVyX2RpcnR5OiB4PTE1Mix3aWR0aD04LHk9MjI0 LGhlaWdodD0xNgpbIDU1MDUuNTYzNTE0XSBkcm1fZmJfaGVscGVyX2RpcnR5X3dvcms6IHgxPTE1 Mix4Mj0xNjAseTE9MjI0LHkyPTI0MApbIDU1MDUuNTYzNTQyXSBhZGFmcnVpdC10ZnQgc3BpMC4w OiBtaXBpX2RiaV9kaXJ0eWZiOiB2bWVtPWJhYzQwMDAwLCAKeDE9MTUyLCB4Mj0xNjAsIHkxPTIy NCwgeTI9MjQwCgoKTm9yYWxmLgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVk ZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2RyaS1kZXZlbAo=