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 X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 61C2AC43613 for ; Thu, 20 Jun 2019 20:26:04 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 3364B2084A for ; Thu, 20 Jun 2019 20:26:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fv8btJYc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3364B2084A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ravnborg.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+OZqDa1doYgxepo3Zf+k4+W/gn/nIeYP5SmrYu4ueI4=; b=fv8btJYcQoTOXk qvj+WaFKMgqnOwwtFdVCbEIJjGW9GNn2nx6xvO2+Gy8WAV/kOq/Qgi1qoAPlKNtjORv3gK8zzBKJw AqtIehF1rg1ynoUoMEA+R5G5AoG7UtzmsKCI7JBPa1ZLtLjAtQxW0eqZMqo2rf/g6fhVbqY4k2rP4 XIirEBqVGdCYaAL5DYIkrwZZG0c027HhVi+RHabtzBy0Lyk72vdDVmOOy3f8PY2/HLs9B/uQfENZR xUmfLpUluwA1QlRSD/oadqGEGkn3J2h4DqSMWBkElguBmHIi3w708ecypJ7+k+AJO6UMiRP+h3Oi0 sr+72b4R2CUg0xHLatiw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1he3d6-00028M-6o; Thu, 20 Jun 2019 20:25:56 +0000 Received: from asavdk3.altibox.net ([109.247.116.14]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1he3d0-00027I-LH for linux-amlogic@lists.infradead.org; Thu, 20 Jun 2019 20:25:53 +0000 Received: from ravnborg.org (unknown [158.248.194.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id E808A20021; Thu, 20 Jun 2019 22:25:43 +0200 (CEST) Date: Thu, 20 Jun 2019 22:25:42 +0200 From: Sam Ravnborg To: Ville Syrjala Subject: Re: [PATCH 1/2] drm: Pretty print mode flags Message-ID: <20190620202542.GA12106@ravnborg.org> References: <20190620185049.8974-1-ville.syrjala@linux.intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190620185049.8974-1-ville.syrjala@linux.intel.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=dqr19Wo4 c=1 sm=1 tr=0 a=UWs3HLbX/2nnQ3s7vZ42gw==:117 a=UWs3HLbX/2nnQ3s7vZ42gw==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19 a=8nJEP1OIZ-IA:10 a=QyXUC8HyAAAA:8 a=PHq6YzTAAAAA:8 a=IpJZQVW2AAAA:8 a=pGLkceISAAAA:8 a=sozttTNsAAAA:8 a=7gkXJVJtAAAA:8 a=KKAkSRfTAAAA:8 a=8b9GpE9nAAAA:8 a=JfrnYn6hAAAA:8 a=VwQbUJbxAAAA:8 a=e5mUnYsNAAAA:8 a=D7w3X7Iln0mF8MUCZl0A:9 a=on3ZYwNNgxJVYIY-:21 a=_m1eqBLaFCl2ildt:21 a=wPNLvfGTeEIA:10 a=ZKzU8r6zoKMcqsNulkmm:22 a=IawgGOuG5U0WyFbmm1f5:22 a=aeg5Gbbo78KNqacMgKqU:22 a=E9Po1WZjFZOl8hwRPBS3:22 a=cvBusfyB2V15izCimMoJ:22 a=T3LWEMljR5ZiDmsYVIUa:22 a=1CNFftbPRP8L7MoqJWF3:22 a=AjGcO6oz07-iQ99wixmX:22 a=Vxmtnl_E_bksehYqCbjh:22 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190620_132551_227474_15777FF8 X-CRM114-Status: GOOD ( 26.22 ) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: freedreno@lists.freedesktop.org, Neil Armstrong , linux-arm-msm@vger.kernel.org, intel-gfx@lists.freedesktop.org, Russell King , dri-devel@lists.freedesktop.org, Rob Clark , Tomi Valkeinen , Thierry Reding , Benjamin Gaignard , linux-amlogic@lists.infradead.org, Vincent Abriou , Ilia Mirkin Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org Hi Ville. On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote: > From: Ville Syrj=E4l=E4 > = > Decode the mode flags when printing the modeline so that I > no longer have to decode the hex number myself. You are extending the current way to print mode flags, but I would anyway like to point out a different approach. When I need to print a fourcc code it is as simple as: { struct drm_format_name_buf fbuf; printk("My format: %s\n", drm_get_format_name(format, &fbuf); } This way to handle this feels more straightforward than the current approach used for modes. Maybe bikeshedding, as your mileage may vary. A middle ground could be to introduce a struct for the buf so we know the callers do it right. Most of the code would be the same, but all call sites would need to be updated. What do you think? Sam > = > To do this neatly I made the caller provide a temporary > on stack buffer where we can produce the results. I choce 64 > bytes as a reasonable size for this. The worst case I think > is > 100 bytes but that kind of mode would be nonsense anyway > so I figured correct decoding isn't as important in such > cases. > = > Cc: Russell King > Cc: Neil Armstrong > Cc: Rob Clark > Cc: Tomi Valkeinen > Cc: Thierry Reding > Cc: Sam Ravnborg > Cc: Benjamin Gaignard > Cc: Vincent Abriou > Cc: linux-amlogic@lists.infradead.org > Cc: linux-arm-msm@vger.kernel.org > Cc: freedreno@lists.freedesktop.org > Cc: Ilia Mirkin > Signed-off-by: Ville Syrj=E4l=E4 > --- > drivers/gpu/drm/armada/armada_crtc.c | 3 +- > drivers/gpu/drm/drm_atomic.c | 3 +- > drivers/gpu/drm/drm_modes.c | 116 +++++++++++++++++- > drivers/gpu/drm/i915/i915_debugfs.c | 3 +- > drivers/gpu/drm/meson/meson_dw_hdmi.c | 3 +- > drivers/gpu/drm/meson/meson_venc.c | 4 +- > drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c | 3 +- > .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c | 3 +- > .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c | 3 +- > .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 3 +- > .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c | 4 +- > drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 3 +- > drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c | 3 +- > drivers/gpu/drm/msm/dsi/dsi_manager.c | 3 +- > drivers/gpu/drm/msm/edp/edp_bridge.c | 3 +- > drivers/gpu/drm/omapdrm/omap_connector.c | 5 +- > drivers/gpu/drm/omapdrm/omap_crtc.c | 3 +- > drivers/gpu/drm/panel/panel-ronbo-rb070d30.c | 3 +- > drivers/gpu/drm/sti/sti_crtc.c | 3 +- > include/drm/drm_modes.h | 14 ++- > 20 files changed, 165 insertions(+), 23 deletions(-) > = > diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armad= a/armada_crtc.c > index ba4a3fab7745..ce9335682bd2 100644 > --- a/drivers/gpu/drm/armada/armada_crtc.c > +++ b/drivers/gpu/drm/armada/armada_crtc.c > @@ -262,6 +262,7 @@ static void armada_drm_crtc_mode_set_nofb(struct drm_= crtc *crtc) > unsigned long flags; > unsigned i; > bool interlaced =3D !!(adj->flags & DRM_MODE_FLAG_INTERLACE); > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > i =3D 0; > rm =3D adj->crtc_hsync_start - adj->crtc_hdisplay; > @@ -270,7 +271,7 @@ static void armada_drm_crtc_mode_set_nofb(struct drm_= crtc *crtc) > tm =3D adj->crtc_vtotal - adj->crtc_vsync_end; > = > DRM_DEBUG_KMS("[CRTC:%d:%s] mode " DRM_MODE_FMT "\n", > - crtc->base.id, crtc->name, DRM_MODE_ARG(adj)); > + crtc->base.id, crtc->name, DRM_MODE_ARG(adj, buf)); > DRM_DEBUG_KMS("lm %d rm %d tm %d bm %d\n", lm, rm, tm, bm); > = > /* Now compute the divider for real */ > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 419381abbdd1..81caf91fbd72 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -380,6 +380,7 @@ static void drm_atomic_crtc_print_state(struct drm_pr= inter *p, > const struct drm_crtc_state *state) > { > struct drm_crtc *crtc =3D state->crtc; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > drm_printf(p, "crtc[%u]: %s\n", crtc->base.id, crtc->name); > drm_printf(p, "\tenable=3D%d\n", state->enable); > @@ -393,7 +394,7 @@ static void drm_atomic_crtc_print_state(struct drm_pr= inter *p, > drm_printf(p, "\tplane_mask=3D%x\n", state->plane_mask); > drm_printf(p, "\tconnector_mask=3D%x\n", state->connector_mask); > drm_printf(p, "\tencoder_mask=3D%x\n", state->encoder_mask); > - drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode)); > + drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode, = buf)); > = > if (crtc->funcs->atomic_print_state) > crtc->funcs->atomic_print_state(p, state); > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index 57e6408288c8..3d15c600295a 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -45,6 +45,118 @@ > = > #include "drm_crtc_internal.h" > = > +static char *snprint_cont(char *buf, int *len, > + const char *str, bool last) > +{ > + int r; > + > + r =3D snprintf(buf, *len, "%s%s", str, last ? "" : ","); > + if (r >=3D *len) > + return buf; > + > + *len -=3D r; > + buf +=3D r; > + > + return buf; > +} > + > +#define MODE_STR(x) { .name =3D #x, .flag =3D DRM_MODE_FLAG_ ## x, } > + > +static const struct { > + const char *name; > + u32 flag; > +} mode_flags[] =3D { > + MODE_STR(PHSYNC), > + MODE_STR(NHSYNC), > + MODE_STR(PVSYNC), > + MODE_STR(NVSYNC), > + MODE_STR(INTERLACE), > + MODE_STR(CSYNC), > + MODE_STR(PCSYNC), > + MODE_STR(NCSYNC), > + MODE_STR(DBLSCAN), > + MODE_STR(HSKEW), > + MODE_STR(DBLCLK), > + MODE_STR(CLKDIV2), > +}; > + > +#undef MODE_STR > +#define MODE_STR(x) [DRM_MODE_FLAG_3D_ ## x >> 14] =3D #x > + > +static const char * const stereo_flags[] =3D { > + MODE_STR(NONE), > + MODE_STR(FRAME_PACKING), > + MODE_STR(FIELD_ALTERNATIVE), > + MODE_STR(LINE_ALTERNATIVE), > + MODE_STR(SIDE_BY_SIDE_FULL), > + MODE_STR(L_DEPTH), > + MODE_STR(L_DEPTH_GFX_GFX_DEPTH), > + MODE_STR(TOP_AND_BOTTOM), > + MODE_STR(SIDE_BY_SIDE_HALF), > +}; > + > +#undef MODE_STR > +#define MODE_STR(x) [DRM_MODE_FLAG_PIC_AR_ ## x >> 19] =3D #x > + > +static const char * const aspect_flags[] =3D { > + MODE_STR(NONE), > + MODE_STR(4_3), > + MODE_STR(16_9), > + MODE_STR(64_27), > + MODE_STR(256_135), > +}; > + > +#undef MODE_STR > + > +const char *drm_get_mode_flags_name(char *buf, int len, u32 flags) > +{ > + char *ptr =3D buf; > + int i; > + > + if (len =3D=3D 0) > + return buf; > + > + buf[0] =3D '\0'; > + > + if (flags & DRM_MODE_FLAG_3D_MASK) { > + int stereo =3D (flags & DRM_MODE_FLAG_3D_MASK) >> 14; > + > + if (stereo < ARRAY_SIZE(stereo_flags)) { > + flags &=3D ~DRM_MODE_FLAG_3D_MASK; > + ptr =3D snprint_cont(ptr, &len, > + stereo_flags[stereo], !flags); > + } > + } > + > + if (flags & DRM_MODE_FLAG_PIC_AR_MASK) { > + int aspect =3D (flags & DRM_MODE_FLAG_PIC_AR_MASK) >> 19; > + > + if (aspect < ARRAY_SIZE(aspect_flags)) { > + flags &=3D ~DRM_MODE_FLAG_PIC_AR_MASK; > + ptr =3D snprint_cont(ptr, &len, > + aspect_flags[aspect], !flags); > + } > + } > + > + for (i =3D 0; i < ARRAY_SIZE(mode_flags); i++) { > + u32 flag =3D mode_flags[i].flag; > + > + if ((flags & flag) =3D=3D 0) > + continue; > + > + flags &=3D ~flag; > + > + ptr =3D snprint_cont(ptr, &len, > + mode_flags[i].name, !flags); > + } > + > + if (flags) > + ptr =3D snprint_cont(ptr, &len, "?", true); > + > + return buf; > +} > +EXPORT_SYMBOL(drm_get_mode_flags_name); > + > /** > * drm_mode_debug_printmodeline - print a mode to dmesg > * @mode: mode to print > @@ -53,7 +165,9 @@ > */ > void drm_mode_debug_printmodeline(const struct drm_display_mode *mode) > { > - DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > + > + DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)); > } > EXPORT_SYMBOL(drm_mode_debug_printmodeline); > = > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i= 915_debugfs.c > index 62cf34db9280..18a3ff8e1461 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -2539,12 +2539,13 @@ static int i915_dmc_info(struct seq_file *m, void= *unused) > static void intel_seq_print_mode(struct seq_file *m, int tabs, > struct drm_display_mode *mode) > { > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > int i; > = > for (i =3D 0; i < tabs; i++) > seq_putc(m, '\t'); > = > - seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)); > } > = > static void intel_encoder_info(struct seq_file *m, > diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meso= n/meson_dw_hdmi.c > index df3f9ddd2234..30e53a043ba6 100644 > --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c > +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c > @@ -610,13 +610,14 @@ dw_hdmi_mode_valid(struct drm_connector *connector, > const struct drm_display_mode *mode) > { > struct meson_drm *priv =3D connector->dev->dev_private; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > unsigned int vclk_freq; > unsigned int venc_freq; > unsigned int hdmi_freq; > int vic =3D drm_match_cea_mode(mode); > enum drm_mode_status status; > = > - DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)= ); > = > /* If sink max TMDS clock, we reject the mode */ > if (connector->display_info.max_tmds_clock && > diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/m= eson_venc.c > index 7b7a0d8d737c..09acbc06f9f3 100644 > --- a/drivers/gpu/drm/meson/meson_venc.c > +++ b/drivers/gpu/drm/meson/meson_venc.c > @@ -987,9 +987,11 @@ void meson_venc_hdmi_mode_set(struct meson_drm *priv= , int vic, > if (meson_venc_hdmi_supported_vic(vic)) { > vmode =3D meson_venc_hdmi_get_vic_vmode(vic); > if (!vmode) { > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > + > dev_err(priv->dev, "%s: Fatal Error, unsupported mode " > DRM_MODE_FMT "\n", __func__, > - DRM_MODE_ARG(mode)); > + DRM_MODE_ARG(mode, buf)); > return; > } > } else { > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/= msm/disp/mdp4/mdp4_crtc.c > index 0cfd4c06b610..f68d9f74b0e4 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c > @@ -238,6 +238,7 @@ static void mdp4_crtc_mode_set_nofb(struct drm_crtc *= crtc) > enum mdp4_dma dma =3D mdp4_crtc->dma; > int ovlp =3D mdp4_crtc->ovlp; > struct drm_display_mode *mode; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > if (WARN_ON(!crtc->state)) > return; > @@ -245,7 +246,7 @@ static void mdp4_crtc_mode_set_nofb(struct drm_crtc *= crtc) > mode =3D &crtc->state->adjusted_mode; > = > DBG("%s: set mode: " DRM_MODE_FMT, > - mdp4_crtc->name, DRM_MODE_ARG(mode)); > + mdp4_crtc->name, DRM_MODE_ARG(mode, buf)); > = > mdp4_write(mdp4_kms, REG_MDP4_DMA_SRC_SIZE(dma), > MDP4_DMA_SRC_SIZE_WIDTH(mode->hdisplay) | > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c b/drivers/g= pu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c > index caa39b4621e3..2e0dca4d2484 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c > @@ -55,10 +55,11 @@ static void mdp4_dsi_encoder_mode_set(struct drm_enco= der *encoder, > uint32_t dsi_hsync_skew, vsync_period, vsync_len, ctrl_pol; > uint32_t display_v_start, display_v_end; > uint32_t hsync_start_x, hsync_end_x; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > mode =3D adjusted_mode; > = > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > = > ctrl_pol =3D 0; > if (mode->flags & DRM_MODE_FLAG_NHSYNC) > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c b/drivers/g= pu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c > index 259d51971401..e88ac070a672 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c > @@ -101,10 +101,11 @@ static void mdp4_dtv_encoder_mode_set(struct drm_en= coder *encoder, > uint32_t dtv_hsync_skew, vsync_period, vsync_len, ctrl_pol; > uint32_t display_v_start, display_v_end; > uint32_t hsync_start_x, hsync_end_x; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > mode =3D adjusted_mode; > = > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > = > mdp4_dtv_encoder->pixclock =3D mode->clock * 1000; > = > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/= gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c > index df6f9803a1d7..99bdae9c945b 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c > @@ -270,10 +270,11 @@ static void mdp4_lcdc_encoder_mode_set(struct drm_e= ncoder *encoder, > uint32_t lcdc_hsync_skew, vsync_period, vsync_len, ctrl_pol; > uint32_t display_v_start, display_v_end; > uint32_t hsync_start_x, hsync_end_x; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > mode =3D adjusted_mode; > = > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > = > mdp4_lcdc_encoder->pixclock =3D mode->clock * 1000; > = > diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c b/drivers/g= pu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c > index eeef41fcd4e1..6bffbebee8bb 100644 > --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c > @@ -124,9 +124,11 @@ void mdp5_cmd_encoder_mode_set(struct drm_encoder *e= ncoder, > struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode) > { > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > + > mode =3D adjusted_mode; > = > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > pingpong_tearcheck_setup(encoder, mode); > mdp5_crtc_set_pipeline(encoder->crtc); > } > diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/= msm/disp/mdp5/mdp5_crtc.c > index c3751c95b452..888a25d1da8b 100644 > --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c > +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c > @@ -378,13 +378,14 @@ static void mdp5_crtc_mode_set_nofb(struct drm_crtc= *crtc) > u32 mixer_width, val; > unsigned long flags; > struct drm_display_mode *mode; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > if (WARN_ON(!crtc->state)) > return; > = > mode =3D &crtc->state->adjusted_mode; > = > - DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode)); > + DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode, buf)); > = > mixer_width =3D mode->hdisplay; > if (r_mixer) > diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c b/drivers/gpu/d= rm/msm/disp/mdp5/mdp5_encoder.c > index 820a62c40063..809118bb6965 100644 > --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c > @@ -115,10 +115,11 @@ static void mdp5_vid_encoder_mode_set(struct drm_en= coder *encoder, > uint32_t hsync_start_x, hsync_end_x; > uint32_t format =3D 0x2100; > unsigned long flags; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > mode =3D adjusted_mode; > = > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > = > ctrl_pol =3D 0; > = > diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/= dsi/dsi_manager.c > index ec6cb0f7f206..1bf2f503b84b 100644 > --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c > +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c > @@ -527,8 +527,9 @@ static void dsi_mgr_bridge_mode_set(struct drm_bridge= *bridge, > struct msm_dsi *other_dsi =3D dsi_mgr_get_other_dsi(id); > struct mipi_dsi_host *host =3D msm_dsi->host; > bool is_dual_dsi =3D IS_DUAL_DSI(); > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > = > if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) > return; > diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c b/drivers/gpu/drm/msm/e= dp/edp_bridge.c > index 2950bba4aca9..0844345862ef 100644 > --- a/drivers/gpu/drm/msm/edp/edp_bridge.c > +++ b/drivers/gpu/drm/msm/edp/edp_bridge.c > @@ -51,8 +51,9 @@ static void edp_bridge_mode_set(struct drm_bridge *brid= ge, > struct drm_connector *connector; > struct edp_bridge *edp_bridge =3D to_edp_bridge(bridge); > struct msm_edp *edp =3D edp_bridge->edp; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > = > list_for_each_entry(connector, &dev->mode_config.connector_list, head) { > if ((connector->encoder !=3D NULL) && > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/o= mapdrm/omap_connector.c > index 5967283934e1..4ce29288c70e 100644 > --- a/drivers/gpu/drm/omapdrm/omap_connector.c > +++ b/drivers/gpu/drm/omapdrm/omap_connector.c > @@ -276,6 +276,7 @@ static enum drm_mode_status omap_connector_mode_valid= (struct drm_connector *conn > struct omap_connector *omap_connector =3D to_omap_connector(connector); > struct drm_display_mode new_mode =3D { { 0 } }; > enum drm_mode_status status; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > status =3D omap_connector_mode_fixup(omap_connector->output, mode, > &new_mode); > @@ -288,8 +289,8 @@ static enum drm_mode_status omap_connector_mode_valid= (struct drm_connector *conn > = > done: > DBG("connector: mode %s: " DRM_MODE_FMT, > - (status =3D=3D MODE_OK) ? "valid" : "invalid", > - DRM_MODE_ARG(mode)); > + (status =3D=3D MODE_OK) ? "valid" : "invalid", > + DRM_MODE_ARG(mode, buf)); > = > return status; > } > diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdr= m/omap_crtc.c > index d61215494617..221459d6abe9 100644 > --- a/drivers/gpu/drm/omapdrm/omap_crtc.c > +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c > @@ -553,9 +553,10 @@ static void omap_crtc_mode_set_nofb(struct drm_crtc = *crtc) > { > struct omap_crtc *omap_crtc =3D to_omap_crtc(crtc); > struct drm_display_mode *mode =3D &crtc->state->adjusted_mode; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > DBG("%s: set mode: " DRM_MODE_FMT, > - omap_crtc->name, DRM_MODE_ARG(mode)); > + omap_crtc->name, DRM_MODE_ARG(mode, buf)); > = > drm_display_mode_to_videomode(mode, &omap_crtc->vm); > } > diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/d= rm/panel/panel-ronbo-rb070d30.c > index 3c15764f0c03..468ebdca94f4 100644 > --- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c > +++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c > @@ -126,12 +126,13 @@ static int rb070d30_panel_get_modes(struct drm_pane= l *panel) > struct rb070d30_panel *ctx =3D panel_to_rb070d30_panel(panel); > struct drm_display_mode *mode; > static const u32 bus_format =3D MEDIA_BUS_FMT_RGB888_1X24; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > mode =3D drm_mode_duplicate(panel->drm, &default_mode); > if (!mode) { > DRM_DEV_ERROR(&ctx->dsi->dev, > "Failed to add mode " DRM_MODE_FMT "\n", > - DRM_MODE_ARG(&default_mode)); > + DRM_MODE_ARG(&default_mode, buf)); > return -EINVAL; > } > = > diff --git a/drivers/gpu/drm/sti/sti_crtc.c b/drivers/gpu/drm/sti/sti_crt= c.c > index dc64fbfc4e61..bc9602f519d7 100644 > --- a/drivers/gpu/drm/sti/sti_crtc.c > +++ b/drivers/gpu/drm/sti/sti_crtc.c > @@ -54,11 +54,12 @@ sti_crtc_mode_set(struct drm_crtc *crtc, struct drm_d= isplay_mode *mode) > struct sti_compositor *compo =3D dev_get_drvdata(dev); > struct clk *compo_clk, *pix_clk; > int rate =3D mode->clock * 1000; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > = > DRM_DEBUG_KMS("CRTC:%d (%s) mode: (%s)\n", > crtc->base.id, sti_mixer_to_str(mixer), mode->name); > = > - DRM_DEBUG_KMS(DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + DRM_DEBUG_KMS(DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)); > = > if (mixer->id =3D=3D STI_MIXER_MAIN) { > compo_clk =3D compo->clk_compo_main; > diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h > index 083f16747369..3962dbf82100 100644 > --- a/include/drm/drm_modes.h > +++ b/include/drm/drm_modes.h > @@ -428,20 +428,27 @@ struct drm_display_mode { > struct list_head export_head; > }; > = > +/** > + * DRM_MODE_FLAGS_BUF_LEN - reasonable size for the buffer passed to DRM= _MODE_ARG() > + */ > +#define DRM_MODE_FLAGS_BUF_LEN 64 > + > /** > * DRM_MODE_FMT - printf string for &struct drm_display_mode > */ > -#define DRM_MODE_FMT "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x" > +#define DRM_MODE_FMT "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x= %s" > = > /** > * DRM_MODE_ARG - printf arguments for &struct drm_display_mode > * @m: display mode > + * @b: buffer for temporary string > */ > -#define DRM_MODE_ARG(m) \ > +#define DRM_MODE_ARG(m, b) \ > (m)->name, (m)->vrefresh, (m)->clock, \ > (m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \ > (m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \ > - (m)->type, (m)->flags > + (m)->type, (m)->flags, \ > + drm_get_mode_flags_name(b, sizeof(b), (m)->flags) > = > #define obj_to_mode(x) container_of(x, struct drm_display_mode, base) > = > @@ -542,5 +549,6 @@ drm_mode_parse_command_line_for_connector(const char = *mode_option, > struct drm_display_mode * > drm_mode_create_from_cmdline_mode(struct drm_device *dev, > struct drm_cmdline_mode *cmd); > +const char *drm_get_mode_flags_name(char *buf, int len, u32 flags); > = > #endif /* __DRM_MODES_H__ */ > -- = > 2.21.0 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic 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 X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DABF9C43613 for ; Thu, 20 Jun 2019 20:25:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A05E12084E for ; Thu, 20 Jun 2019 20:25:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727080AbfFTUZy (ORCPT ); Thu, 20 Jun 2019 16:25:54 -0400 Received: from asavdk3.altibox.net ([109.247.116.14]:52163 "EHLO asavdk3.altibox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727000AbfFTUZx (ORCPT ); Thu, 20 Jun 2019 16:25:53 -0400 Received: from ravnborg.org (unknown [158.248.194.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by asavdk3.altibox.net (Postfix) with ESMTPS id E808A20021; Thu, 20 Jun 2019 22:25:43 +0200 (CEST) Date: Thu, 20 Jun 2019 22:25:42 +0200 From: Sam Ravnborg To: Ville Syrjala Cc: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, Russell King , Neil Armstrong , Rob Clark , Tomi Valkeinen , Thierry Reding , Benjamin Gaignard , Vincent Abriou , linux-amlogic@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, Ilia Mirkin Subject: Re: [PATCH 1/2] drm: Pretty print mode flags Message-ID: <20190620202542.GA12106@ravnborg.org> References: <20190620185049.8974-1-ville.syrjala@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20190620185049.8974-1-ville.syrjala@linux.intel.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.3 cv=dqr19Wo4 c=1 sm=1 tr=0 a=UWs3HLbX/2nnQ3s7vZ42gw==:117 a=UWs3HLbX/2nnQ3s7vZ42gw==:17 a=jpOVt7BSZ2e4Z31A5e1TngXxSK0=:19 a=8nJEP1OIZ-IA:10 a=QyXUC8HyAAAA:8 a=PHq6YzTAAAAA:8 a=IpJZQVW2AAAA:8 a=pGLkceISAAAA:8 a=sozttTNsAAAA:8 a=7gkXJVJtAAAA:8 a=KKAkSRfTAAAA:8 a=8b9GpE9nAAAA:8 a=JfrnYn6hAAAA:8 a=VwQbUJbxAAAA:8 a=e5mUnYsNAAAA:8 a=D7w3X7Iln0mF8MUCZl0A:9 a=on3ZYwNNgxJVYIY-:21 a=_m1eqBLaFCl2ildt:21 a=wPNLvfGTeEIA:10 a=ZKzU8r6zoKMcqsNulkmm:22 a=IawgGOuG5U0WyFbmm1f5:22 a=aeg5Gbbo78KNqacMgKqU:22 a=E9Po1WZjFZOl8hwRPBS3:22 a=cvBusfyB2V15izCimMoJ:22 a=T3LWEMljR5ZiDmsYVIUa:22 a=1CNFftbPRP8L7MoqJWF3:22 a=AjGcO6oz07-iQ99wixmX:22 a=Vxmtnl_E_bksehYqCbjh:22 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Hi Ville. On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote: > From: Ville Syrjälä > > Decode the mode flags when printing the modeline so that I > no longer have to decode the hex number myself. You are extending the current way to print mode flags, but I would anyway like to point out a different approach. When I need to print a fourcc code it is as simple as: { struct drm_format_name_buf fbuf; printk("My format: %s\n", drm_get_format_name(format, &fbuf); } This way to handle this feels more straightforward than the current approach used for modes. Maybe bikeshedding, as your mileage may vary. A middle ground could be to introduce a struct for the buf so we know the callers do it right. Most of the code would be the same, but all call sites would need to be updated. What do you think? Sam > > To do this neatly I made the caller provide a temporary > on stack buffer where we can produce the results. I choce 64 > bytes as a reasonable size for this. The worst case I think > is > 100 bytes but that kind of mode would be nonsense anyway > so I figured correct decoding isn't as important in such > cases. > > Cc: Russell King > Cc: Neil Armstrong > Cc: Rob Clark > Cc: Tomi Valkeinen > Cc: Thierry Reding > Cc: Sam Ravnborg > Cc: Benjamin Gaignard > Cc: Vincent Abriou > Cc: linux-amlogic@lists.infradead.org > Cc: linux-arm-msm@vger.kernel.org > Cc: freedreno@lists.freedesktop.org > Cc: Ilia Mirkin > Signed-off-by: Ville Syrjälä > --- > drivers/gpu/drm/armada/armada_crtc.c | 3 +- > drivers/gpu/drm/drm_atomic.c | 3 +- > drivers/gpu/drm/drm_modes.c | 116 +++++++++++++++++- > drivers/gpu/drm/i915/i915_debugfs.c | 3 +- > drivers/gpu/drm/meson/meson_dw_hdmi.c | 3 +- > drivers/gpu/drm/meson/meson_venc.c | 4 +- > drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c | 3 +- > .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c | 3 +- > .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c | 3 +- > .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 3 +- > .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c | 4 +- > drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 3 +- > drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c | 3 +- > drivers/gpu/drm/msm/dsi/dsi_manager.c | 3 +- > drivers/gpu/drm/msm/edp/edp_bridge.c | 3 +- > drivers/gpu/drm/omapdrm/omap_connector.c | 5 +- > drivers/gpu/drm/omapdrm/omap_crtc.c | 3 +- > drivers/gpu/drm/panel/panel-ronbo-rb070d30.c | 3 +- > drivers/gpu/drm/sti/sti_crtc.c | 3 +- > include/drm/drm_modes.h | 14 ++- > 20 files changed, 165 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c > index ba4a3fab7745..ce9335682bd2 100644 > --- a/drivers/gpu/drm/armada/armada_crtc.c > +++ b/drivers/gpu/drm/armada/armada_crtc.c > @@ -262,6 +262,7 @@ static void armada_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) > unsigned long flags; > unsigned i; > bool interlaced = !!(adj->flags & DRM_MODE_FLAG_INTERLACE); > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > i = 0; > rm = adj->crtc_hsync_start - adj->crtc_hdisplay; > @@ -270,7 +271,7 @@ static void armada_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) > tm = adj->crtc_vtotal - adj->crtc_vsync_end; > > DRM_DEBUG_KMS("[CRTC:%d:%s] mode " DRM_MODE_FMT "\n", > - crtc->base.id, crtc->name, DRM_MODE_ARG(adj)); > + crtc->base.id, crtc->name, DRM_MODE_ARG(adj, buf)); > DRM_DEBUG_KMS("lm %d rm %d tm %d bm %d\n", lm, rm, tm, bm); > > /* Now compute the divider for real */ > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 419381abbdd1..81caf91fbd72 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -380,6 +380,7 @@ static void drm_atomic_crtc_print_state(struct drm_printer *p, > const struct drm_crtc_state *state) > { > struct drm_crtc *crtc = state->crtc; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > drm_printf(p, "crtc[%u]: %s\n", crtc->base.id, crtc->name); > drm_printf(p, "\tenable=%d\n", state->enable); > @@ -393,7 +394,7 @@ static void drm_atomic_crtc_print_state(struct drm_printer *p, > drm_printf(p, "\tplane_mask=%x\n", state->plane_mask); > drm_printf(p, "\tconnector_mask=%x\n", state->connector_mask); > drm_printf(p, "\tencoder_mask=%x\n", state->encoder_mask); > - drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode)); > + drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode, buf)); > > if (crtc->funcs->atomic_print_state) > crtc->funcs->atomic_print_state(p, state); > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index 57e6408288c8..3d15c600295a 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -45,6 +45,118 @@ > > #include "drm_crtc_internal.h" > > +static char *snprint_cont(char *buf, int *len, > + const char *str, bool last) > +{ > + int r; > + > + r = snprintf(buf, *len, "%s%s", str, last ? "" : ","); > + if (r >= *len) > + return buf; > + > + *len -= r; > + buf += r; > + > + return buf; > +} > + > +#define MODE_STR(x) { .name = #x, .flag = DRM_MODE_FLAG_ ## x, } > + > +static const struct { > + const char *name; > + u32 flag; > +} mode_flags[] = { > + MODE_STR(PHSYNC), > + MODE_STR(NHSYNC), > + MODE_STR(PVSYNC), > + MODE_STR(NVSYNC), > + MODE_STR(INTERLACE), > + MODE_STR(CSYNC), > + MODE_STR(PCSYNC), > + MODE_STR(NCSYNC), > + MODE_STR(DBLSCAN), > + MODE_STR(HSKEW), > + MODE_STR(DBLCLK), > + MODE_STR(CLKDIV2), > +}; > + > +#undef MODE_STR > +#define MODE_STR(x) [DRM_MODE_FLAG_3D_ ## x >> 14] = #x > + > +static const char * const stereo_flags[] = { > + MODE_STR(NONE), > + MODE_STR(FRAME_PACKING), > + MODE_STR(FIELD_ALTERNATIVE), > + MODE_STR(LINE_ALTERNATIVE), > + MODE_STR(SIDE_BY_SIDE_FULL), > + MODE_STR(L_DEPTH), > + MODE_STR(L_DEPTH_GFX_GFX_DEPTH), > + MODE_STR(TOP_AND_BOTTOM), > + MODE_STR(SIDE_BY_SIDE_HALF), > +}; > + > +#undef MODE_STR > +#define MODE_STR(x) [DRM_MODE_FLAG_PIC_AR_ ## x >> 19] = #x > + > +static const char * const aspect_flags[] = { > + MODE_STR(NONE), > + MODE_STR(4_3), > + MODE_STR(16_9), > + MODE_STR(64_27), > + MODE_STR(256_135), > +}; > + > +#undef MODE_STR > + > +const char *drm_get_mode_flags_name(char *buf, int len, u32 flags) > +{ > + char *ptr = buf; > + int i; > + > + if (len == 0) > + return buf; > + > + buf[0] = '\0'; > + > + if (flags & DRM_MODE_FLAG_3D_MASK) { > + int stereo = (flags & DRM_MODE_FLAG_3D_MASK) >> 14; > + > + if (stereo < ARRAY_SIZE(stereo_flags)) { > + flags &= ~DRM_MODE_FLAG_3D_MASK; > + ptr = snprint_cont(ptr, &len, > + stereo_flags[stereo], !flags); > + } > + } > + > + if (flags & DRM_MODE_FLAG_PIC_AR_MASK) { > + int aspect = (flags & DRM_MODE_FLAG_PIC_AR_MASK) >> 19; > + > + if (aspect < ARRAY_SIZE(aspect_flags)) { > + flags &= ~DRM_MODE_FLAG_PIC_AR_MASK; > + ptr = snprint_cont(ptr, &len, > + aspect_flags[aspect], !flags); > + } > + } > + > + for (i = 0; i < ARRAY_SIZE(mode_flags); i++) { > + u32 flag = mode_flags[i].flag; > + > + if ((flags & flag) == 0) > + continue; > + > + flags &= ~flag; > + > + ptr = snprint_cont(ptr, &len, > + mode_flags[i].name, !flags); > + } > + > + if (flags) > + ptr = snprint_cont(ptr, &len, "?", true); > + > + return buf; > +} > +EXPORT_SYMBOL(drm_get_mode_flags_name); > + > /** > * drm_mode_debug_printmodeline - print a mode to dmesg > * @mode: mode to print > @@ -53,7 +165,9 @@ > */ > void drm_mode_debug_printmodeline(const struct drm_display_mode *mode) > { > - DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > + > + DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)); > } > EXPORT_SYMBOL(drm_mode_debug_printmodeline); > > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index 62cf34db9280..18a3ff8e1461 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -2539,12 +2539,13 @@ static int i915_dmc_info(struct seq_file *m, void *unused) > static void intel_seq_print_mode(struct seq_file *m, int tabs, > struct drm_display_mode *mode) > { > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > int i; > > for (i = 0; i < tabs; i++) > seq_putc(m, '\t'); > > - seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)); > } > > static void intel_encoder_info(struct seq_file *m, > diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c > index df3f9ddd2234..30e53a043ba6 100644 > --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c > +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c > @@ -610,13 +610,14 @@ dw_hdmi_mode_valid(struct drm_connector *connector, > const struct drm_display_mode *mode) > { > struct meson_drm *priv = connector->dev->dev_private; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > unsigned int vclk_freq; > unsigned int venc_freq; > unsigned int hdmi_freq; > int vic = drm_match_cea_mode(mode); > enum drm_mode_status status; > > - DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)); > > /* If sink max TMDS clock, we reject the mode */ > if (connector->display_info.max_tmds_clock && > diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c > index 7b7a0d8d737c..09acbc06f9f3 100644 > --- a/drivers/gpu/drm/meson/meson_venc.c > +++ b/drivers/gpu/drm/meson/meson_venc.c > @@ -987,9 +987,11 @@ void meson_venc_hdmi_mode_set(struct meson_drm *priv, int vic, > if (meson_venc_hdmi_supported_vic(vic)) { > vmode = meson_venc_hdmi_get_vic_vmode(vic); > if (!vmode) { > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > + > dev_err(priv->dev, "%s: Fatal Error, unsupported mode " > DRM_MODE_FMT "\n", __func__, > - DRM_MODE_ARG(mode)); > + DRM_MODE_ARG(mode, buf)); > return; > } > } else { > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c > index 0cfd4c06b610..f68d9f74b0e4 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c > @@ -238,6 +238,7 @@ static void mdp4_crtc_mode_set_nofb(struct drm_crtc *crtc) > enum mdp4_dma dma = mdp4_crtc->dma; > int ovlp = mdp4_crtc->ovlp; > struct drm_display_mode *mode; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > if (WARN_ON(!crtc->state)) > return; > @@ -245,7 +246,7 @@ static void mdp4_crtc_mode_set_nofb(struct drm_crtc *crtc) > mode = &crtc->state->adjusted_mode; > > DBG("%s: set mode: " DRM_MODE_FMT, > - mdp4_crtc->name, DRM_MODE_ARG(mode)); > + mdp4_crtc->name, DRM_MODE_ARG(mode, buf)); > > mdp4_write(mdp4_kms, REG_MDP4_DMA_SRC_SIZE(dma), > MDP4_DMA_SRC_SIZE_WIDTH(mode->hdisplay) | > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c > index caa39b4621e3..2e0dca4d2484 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c > @@ -55,10 +55,11 @@ static void mdp4_dsi_encoder_mode_set(struct drm_encoder *encoder, > uint32_t dsi_hsync_skew, vsync_period, vsync_len, ctrl_pol; > uint32_t display_v_start, display_v_end; > uint32_t hsync_start_x, hsync_end_x; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > mode = adjusted_mode; > > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > > ctrl_pol = 0; > if (mode->flags & DRM_MODE_FLAG_NHSYNC) > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c > index 259d51971401..e88ac070a672 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c > @@ -101,10 +101,11 @@ static void mdp4_dtv_encoder_mode_set(struct drm_encoder *encoder, > uint32_t dtv_hsync_skew, vsync_period, vsync_len, ctrl_pol; > uint32_t display_v_start, display_v_end; > uint32_t hsync_start_x, hsync_end_x; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > mode = adjusted_mode; > > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > > mdp4_dtv_encoder->pixclock = mode->clock * 1000; > > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c > index df6f9803a1d7..99bdae9c945b 100644 > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c > @@ -270,10 +270,11 @@ static void mdp4_lcdc_encoder_mode_set(struct drm_encoder *encoder, > uint32_t lcdc_hsync_skew, vsync_period, vsync_len, ctrl_pol; > uint32_t display_v_start, display_v_end; > uint32_t hsync_start_x, hsync_end_x; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > mode = adjusted_mode; > > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > > mdp4_lcdc_encoder->pixclock = mode->clock * 1000; > > diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c > index eeef41fcd4e1..6bffbebee8bb 100644 > --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c > @@ -124,9 +124,11 @@ void mdp5_cmd_encoder_mode_set(struct drm_encoder *encoder, > struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode) > { > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > + > mode = adjusted_mode; > > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > pingpong_tearcheck_setup(encoder, mode); > mdp5_crtc_set_pipeline(encoder->crtc); > } > diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c > index c3751c95b452..888a25d1da8b 100644 > --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c > +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c > @@ -378,13 +378,14 @@ static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc) > u32 mixer_width, val; > unsigned long flags; > struct drm_display_mode *mode; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > if (WARN_ON(!crtc->state)) > return; > > mode = &crtc->state->adjusted_mode; > > - DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode)); > + DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode, buf)); > > mixer_width = mode->hdisplay; > if (r_mixer) > diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c > index 820a62c40063..809118bb6965 100644 > --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c > +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c > @@ -115,10 +115,11 @@ static void mdp5_vid_encoder_mode_set(struct drm_encoder *encoder, > uint32_t hsync_start_x, hsync_end_x; > uint32_t format = 0x2100; > unsigned long flags; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > mode = adjusted_mode; > > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > > ctrl_pol = 0; > > diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c > index ec6cb0f7f206..1bf2f503b84b 100644 > --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c > +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c > @@ -527,8 +527,9 @@ static void dsi_mgr_bridge_mode_set(struct drm_bridge *bridge, > struct msm_dsi *other_dsi = dsi_mgr_get_other_dsi(id); > struct mipi_dsi_host *host = msm_dsi->host; > bool is_dual_dsi = IS_DUAL_DSI(); > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > > if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) > return; > diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c b/drivers/gpu/drm/msm/edp/edp_bridge.c > index 2950bba4aca9..0844345862ef 100644 > --- a/drivers/gpu/drm/msm/edp/edp_bridge.c > +++ b/drivers/gpu/drm/msm/edp/edp_bridge.c > @@ -51,8 +51,9 @@ static void edp_bridge_mode_set(struct drm_bridge *bridge, > struct drm_connector *connector; > struct edp_bridge *edp_bridge = to_edp_bridge(bridge); > struct msm_edp *edp = edp_bridge->edp; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > - DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode)); > + DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf)); > > list_for_each_entry(connector, &dev->mode_config.connector_list, head) { > if ((connector->encoder != NULL) && > diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c > index 5967283934e1..4ce29288c70e 100644 > --- a/drivers/gpu/drm/omapdrm/omap_connector.c > +++ b/drivers/gpu/drm/omapdrm/omap_connector.c > @@ -276,6 +276,7 @@ static enum drm_mode_status omap_connector_mode_valid(struct drm_connector *conn > struct omap_connector *omap_connector = to_omap_connector(connector); > struct drm_display_mode new_mode = { { 0 } }; > enum drm_mode_status status; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > status = omap_connector_mode_fixup(omap_connector->output, mode, > &new_mode); > @@ -288,8 +289,8 @@ static enum drm_mode_status omap_connector_mode_valid(struct drm_connector *conn > > done: > DBG("connector: mode %s: " DRM_MODE_FMT, > - (status == MODE_OK) ? "valid" : "invalid", > - DRM_MODE_ARG(mode)); > + (status == MODE_OK) ? "valid" : "invalid", > + DRM_MODE_ARG(mode, buf)); > > return status; > } > diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c > index d61215494617..221459d6abe9 100644 > --- a/drivers/gpu/drm/omapdrm/omap_crtc.c > +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c > @@ -553,9 +553,10 @@ static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc) > { > struct omap_crtc *omap_crtc = to_omap_crtc(crtc); > struct drm_display_mode *mode = &crtc->state->adjusted_mode; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > DBG("%s: set mode: " DRM_MODE_FMT, > - omap_crtc->name, DRM_MODE_ARG(mode)); > + omap_crtc->name, DRM_MODE_ARG(mode, buf)); > > drm_display_mode_to_videomode(mode, &omap_crtc->vm); > } > diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c > index 3c15764f0c03..468ebdca94f4 100644 > --- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c > +++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c > @@ -126,12 +126,13 @@ static int rb070d30_panel_get_modes(struct drm_panel *panel) > struct rb070d30_panel *ctx = panel_to_rb070d30_panel(panel); > struct drm_display_mode *mode; > static const u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > mode = drm_mode_duplicate(panel->drm, &default_mode); > if (!mode) { > DRM_DEV_ERROR(&ctx->dsi->dev, > "Failed to add mode " DRM_MODE_FMT "\n", > - DRM_MODE_ARG(&default_mode)); > + DRM_MODE_ARG(&default_mode, buf)); > return -EINVAL; > } > > diff --git a/drivers/gpu/drm/sti/sti_crtc.c b/drivers/gpu/drm/sti/sti_crtc.c > index dc64fbfc4e61..bc9602f519d7 100644 > --- a/drivers/gpu/drm/sti/sti_crtc.c > +++ b/drivers/gpu/drm/sti/sti_crtc.c > @@ -54,11 +54,12 @@ sti_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode) > struct sti_compositor *compo = dev_get_drvdata(dev); > struct clk *compo_clk, *pix_clk; > int rate = mode->clock * 1000; > + char buf[DRM_MODE_FLAGS_BUF_LEN]; > > DRM_DEBUG_KMS("CRTC:%d (%s) mode: (%s)\n", > crtc->base.id, sti_mixer_to_str(mixer), mode->name); > > - DRM_DEBUG_KMS(DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); > + DRM_DEBUG_KMS(DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf)); > > if (mixer->id == STI_MIXER_MAIN) { > compo_clk = compo->clk_compo_main; > diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h > index 083f16747369..3962dbf82100 100644 > --- a/include/drm/drm_modes.h > +++ b/include/drm/drm_modes.h > @@ -428,20 +428,27 @@ struct drm_display_mode { > struct list_head export_head; > }; > > +/** > + * DRM_MODE_FLAGS_BUF_LEN - reasonable size for the buffer passed to DRM_MODE_ARG() > + */ > +#define DRM_MODE_FLAGS_BUF_LEN 64 > + > /** > * DRM_MODE_FMT - printf string for &struct drm_display_mode > */ > -#define DRM_MODE_FMT "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x" > +#define DRM_MODE_FMT "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x %s" > > /** > * DRM_MODE_ARG - printf arguments for &struct drm_display_mode > * @m: display mode > + * @b: buffer for temporary string > */ > -#define DRM_MODE_ARG(m) \ > +#define DRM_MODE_ARG(m, b) \ > (m)->name, (m)->vrefresh, (m)->clock, \ > (m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \ > (m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \ > - (m)->type, (m)->flags > + (m)->type, (m)->flags, \ > + drm_get_mode_flags_name(b, sizeof(b), (m)->flags) > > #define obj_to_mode(x) container_of(x, struct drm_display_mode, base) > > @@ -542,5 +549,6 @@ drm_mode_parse_command_line_for_connector(const char *mode_option, > struct drm_display_mode * > drm_mode_create_from_cmdline_mode(struct drm_device *dev, > struct drm_cmdline_mode *cmd); > +const char *drm_get_mode_flags_name(char *buf, int len, u32 flags); > > #endif /* __DRM_MODES_H__ */ > -- > 2.21.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sam Ravnborg Subject: Re: [PATCH 1/2] drm: Pretty print mode flags Date: Thu, 20 Jun 2019 22:25:42 +0200 Message-ID: <20190620202542.GA12106@ravnborg.org> References: <20190620185049.8974-1-ville.syrjala@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20190620185049.8974-1-ville.syrjala@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Ville Syrjala Cc: freedreno@lists.freedesktop.org, Neil Armstrong , linux-arm-msm@vger.kernel.org, intel-gfx@lists.freedesktop.org, Russell King , dri-devel@lists.freedesktop.org, Tomi Valkeinen , Benjamin Gaignard , linux-amlogic@lists.infradead.org, Vincent Abriou , Ilia Mirkin List-Id: dri-devel@lists.freedesktop.org SGkgVmlsbGUuCgpPbiBUaHUsIEp1biAyMCwgMjAxOSBhdCAwOTo1MDo0OFBNICswMzAwLCBWaWxs ZSBTeXJqYWxhIHdyb3RlOgo+IEZyb206IFZpbGxlIFN5cmrDpGzDpCA8dmlsbGUuc3lyamFsYUBs aW51eC5pbnRlbC5jb20+Cj4gCj4gRGVjb2RlIHRoZSBtb2RlIGZsYWdzIHdoZW4gcHJpbnRpbmcg dGhlIG1vZGVsaW5lIHNvIHRoYXQgSQo+IG5vIGxvbmdlciBoYXZlIHRvIGRlY29kZSB0aGUgaGV4 IG51bWJlciBteXNlbGYuCllvdSBhcmUgZXh0ZW5kaW5nIHRoZSBjdXJyZW50IHdheSB0byBwcmlu dCBtb2RlIGZsYWdzLApidXQgSSB3b3VsZCBhbnl3YXkgbGlrZSB0byBwb2ludCBvdXQgYSBkaWZm ZXJlbnQgYXBwcm9hY2guCgpXaGVuIEkgbmVlZCB0byBwcmludCBhIGZvdXJjYyBjb2RlIGl0IGlz IGFzIHNpbXBsZSBhczoKCnsKCXN0cnVjdCBkcm1fZm9ybWF0X25hbWVfYnVmIGZidWY7CgoJcHJp bnRrKCJNeSBmb3JtYXQ6ICVzXG4iLCBkcm1fZ2V0X2Zvcm1hdF9uYW1lKGZvcm1hdCwgJmZidWYp Owp9CgpUaGlzIHdheSB0byBoYW5kbGUgdGhpcyBmZWVscyBtb3JlIHN0cmFpZ2h0Zm9yd2FyZAp0 aGFuIHRoZSBjdXJyZW50IGFwcHJvYWNoIHVzZWQgZm9yIG1vZGVzLgoKTWF5YmUgYmlrZXNoZWRk aW5nLCBhcyB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuCgpBIG1pZGRsZSBncm91bmQgY291bGQgYmUg dG8gaW50cm9kdWNlIGEgc3RydWN0IGZvciB0aGUgYnVmIHNvIHdlIGtub3cKdGhlIGNhbGxlcnMg ZG8gaXQgcmlnaHQuCgpNb3N0IG9mIHRoZSBjb2RlIHdvdWxkIGJlIHRoZSBzYW1lLCBidXQgYWxs IGNhbGwgc2l0ZXMgd291bGQgbmVlZCB0byBiZQp1cGRhdGVkLgpXaGF0IGRvIHlvdSB0aGluaz8K CglTYW0KCgo+IAo+IFRvIGRvIHRoaXMgbmVhdGx5IEkgbWFkZSB0aGUgY2FsbGVyIHByb3ZpZGUg YSB0ZW1wb3JhcnkKPiBvbiBzdGFjayBidWZmZXIgd2hlcmUgd2UgY2FuIHByb2R1Y2UgdGhlIHJl c3VsdHMuIEkgY2hvY2UgNjQKPiBieXRlcyBhcyBhIHJlYXNvbmFibGUgc2l6ZSBmb3IgdGhpcy4g VGhlIHdvcnN0IGNhc2UgSSB0aGluawo+IGlzID4gMTAwIGJ5dGVzIGJ1dCB0aGF0IGtpbmQgb2Yg bW9kZSB3b3VsZCBiZSBub25zZW5zZSBhbnl3YXkKPiBzbyBJIGZpZ3VyZWQgY29ycmVjdCBkZWNv ZGluZyBpc24ndCBhcyBpbXBvcnRhbnQgaW4gc3VjaAo+IGNhc2VzLgo+IAo+IENjOiBSdXNzZWxs IEtpbmcgPGxpbnV4QGFybWxpbnV4Lm9yZy51az4KPiBDYzogTmVpbCBBcm1zdHJvbmcgPG5hcm1z dHJvbmdAYmF5bGlicmUuY29tPgo+IENjOiBSb2IgQ2xhcmsgPHJvYmRjbGFya0BnbWFpbC5jb20+ Cj4gQ2M6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkB0aS5jb20+Cj4gQ2M6IFRoaWVy cnkgUmVkaW5nIDx0aGllcnJ5LnJlZGluZ0BnbWFpbC5jb20+Cj4gQ2M6IFNhbSBSYXZuYm9yZyA8 c2FtQHJhdm5ib3JnLm9yZz4KPiBDYzogQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWdu YXJkQGxpbmFyby5vcmc+Cj4gQ2M6IFZpbmNlbnQgQWJyaW91IDx2aW5jZW50LmFicmlvdUBzdC5j b20+Cj4gQ2M6IGxpbnV4LWFtbG9naWNAbGlzdHMuaW5mcmFkZWFkLm9yZwo+IENjOiBsaW51eC1h cm0tbXNtQHZnZXIua2VybmVsLm9yZwo+IENjOiBmcmVlZHJlbm9AbGlzdHMuZnJlZWRlc2t0b3Au b3JnCj4gQ2M6IElsaWEgTWlya2luIDxpbWlya2luQGFsdW0ubWl0LmVkdT4KPiBTaWduZWQtb2Zm LWJ5OiBWaWxsZSBTeXJqw6Rsw6QgPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPgo+IC0t LQo+ICBkcml2ZXJzL2dwdS9kcm0vYXJtYWRhL2FybWFkYV9jcnRjLmMgICAgICAgICAgfCAgIDMg Ky0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyAgICAgICAgICAgICAgICAgIHwgICAz ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYyAgICAgICAgICAgICAgICAgICB8IDEx NiArKysrKysrKysrKysrKysrKy0KPiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2Zz LmMgICAgICAgICAgIHwgICAzICstCj4gIGRyaXZlcnMvZ3B1L2RybS9tZXNvbi9tZXNvbl9kd19o ZG1pLmMgICAgICAgICB8ICAgMyArLQo+ICBkcml2ZXJzL2dwdS9kcm0vbWVzb24vbWVzb25fdmVu Yy5jICAgICAgICAgICAgfCAgIDQgKy0KPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQv bWRwNF9jcnRjLmMgICAgIHwgICAzICstCj4gIC4uLi9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRw NF9kc2lfZW5jb2Rlci5jICB8ICAgMyArLQo+ICAuLi4vZ3B1L2RybS9tc20vZGlzcC9tZHA0L21k cDRfZHR2X2VuY29kZXIuYyAgfCAgIDMgKy0KPiAgLi4uL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNC9t ZHA0X2xjZGNfZW5jb2Rlci5jIHwgICAzICstCj4gIC4uLi9ncHUvZHJtL21zbS9kaXNwL21kcDUv bWRwNV9jbWRfZW5jb2Rlci5jICB8ICAgNCArLQo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3Av bWRwNS9tZHA1X2NydGMuYyAgICAgfCAgIDMgKy0KPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kaXNw L21kcDUvbWRwNV9lbmNvZGVyLmMgIHwgICAzICstCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHNp L2RzaV9tYW5hZ2VyLmMgICAgICAgICB8ICAgMyArLQo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2Vk cC9lZHBfYnJpZGdlLmMgICAgICAgICAgfCAgIDMgKy0KPiAgZHJpdmVycy9ncHUvZHJtL29tYXBk cm0vb21hcF9jb25uZWN0b3IuYyAgICAgIHwgICA1ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9vbWFw ZHJtL29tYXBfY3J0Yy5jICAgICAgICAgICB8ICAgMyArLQo+ICBkcml2ZXJzL2dwdS9kcm0vcGFu ZWwvcGFuZWwtcm9uYm8tcmIwNzBkMzAuYyAgfCAgIDMgKy0KPiAgZHJpdmVycy9ncHUvZHJtL3N0 aS9zdGlfY3J0Yy5jICAgICAgICAgICAgICAgIHwgICAzICstCj4gIGluY2x1ZGUvZHJtL2RybV9t b2Rlcy5oICAgICAgICAgICAgICAgICAgICAgICB8ICAxNCArKy0KPiAgMjAgZmlsZXMgY2hhbmdl ZCwgMTY1IGluc2VydGlvbnMoKyksIDIzIGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYXJtYWRhL2FybWFkYV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vYXJt YWRhL2FybWFkYV9jcnRjLmMKPiBpbmRleCBiYTRhM2ZhYjc3NDUuLmNlOTMzNTY4MmJkMiAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXJtYWRhL2FybWFkYV9jcnRjLmMKPiArKysgYi9k cml2ZXJzL2dwdS9kcm0vYXJtYWRhL2FybWFkYV9jcnRjLmMKPiBAQCAtMjYyLDYgKzI2Miw3IEBA IHN0YXRpYyB2b2lkIGFybWFkYV9kcm1fY3J0Y19tb2RlX3NldF9ub2ZiKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YykKPiAgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gIAl1bnNpZ25lZCBpOwo+ICAJYm9v bCBpbnRlcmxhY2VkID0gISEoYWRqLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKTsK PiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JVRl9MRU5dOwo+ICAKPiAgCWkgPSAwOwo+ICAJ cm0gPSBhZGotPmNydGNfaHN5bmNfc3RhcnQgLSBhZGotPmNydGNfaGRpc3BsYXk7Cj4gQEAgLTI3 MCw3ICsyNzEsNyBAQCBzdGF0aWMgdm9pZCBhcm1hZGFfZHJtX2NydGNfbW9kZV9zZXRfbm9mYihz dHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4gIAl0bSA9IGFkai0+Y3J0Y192dG90YWwgLSBhZGotPmNy dGNfdnN5bmNfZW5kOwo+ICAKPiAgCURSTV9ERUJVR19LTVMoIltDUlRDOiVkOiVzXSBtb2RlICIg RFJNX01PREVfRk1UICJcbiIsCj4gLQkJICAgICAgY3J0Yy0+YmFzZS5pZCwgY3J0Yy0+bmFtZSwg RFJNX01PREVfQVJHKGFkaikpOwo+ICsJCSAgICAgIGNydGMtPmJhc2UuaWQsIGNydGMtPm5hbWUs IERSTV9NT0RFX0FSRyhhZGosIGJ1ZikpOwo+ICAJRFJNX0RFQlVHX0tNUygibG0gJWQgcm0gJWQg dG0gJWQgYm0gJWRcbiIsIGxtLCBybSwgdG0sIGJtKTsKPiAgCj4gIAkvKiBOb3cgY29tcHV0ZSB0 aGUgZGl2aWRlciBmb3IgcmVhbCAqLwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJt X2F0b21pYy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwo+IGluZGV4IDQxOTM4MWFi YmRkMS4uODFjYWY5MWZiZDcyIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRv bWljLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCj4gQEAgLTM4MCw2ICsz ODAsNyBAQCBzdGF0aWMgdm9pZCBkcm1fYXRvbWljX2NydGNfcHJpbnRfc3RhdGUoc3RydWN0IGRy bV9wcmludGVyICpwLAo+ICAJCWNvbnN0IHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqc3RhdGUpCj4g IHsKPiAgCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IHN0YXRlLT5jcnRjOwo+ICsJY2hhciBidWZb RFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gIAo+ICAJZHJtX3ByaW50ZihwLCAiY3J0Y1sldV06 ICVzXG4iLCBjcnRjLT5iYXNlLmlkLCBjcnRjLT5uYW1lKTsKPiAgCWRybV9wcmludGYocCwgIlx0 ZW5hYmxlPSVkXG4iLCBzdGF0ZS0+ZW5hYmxlKTsKPiBAQCAtMzkzLDcgKzM5NCw3IEBAIHN0YXRp YyB2b2lkIGRybV9hdG9taWNfY3J0Y19wcmludF9zdGF0ZShzdHJ1Y3QgZHJtX3ByaW50ZXIgKnAs Cj4gIAlkcm1fcHJpbnRmKHAsICJcdHBsYW5lX21hc2s9JXhcbiIsIHN0YXRlLT5wbGFuZV9tYXNr KTsKPiAgCWRybV9wcmludGYocCwgIlx0Y29ubmVjdG9yX21hc2s9JXhcbiIsIHN0YXRlLT5jb25u ZWN0b3JfbWFzayk7Cj4gIAlkcm1fcHJpbnRmKHAsICJcdGVuY29kZXJfbWFzaz0leFxuIiwgc3Rh dGUtPmVuY29kZXJfbWFzayk7Cj4gLQlkcm1fcHJpbnRmKHAsICJcdG1vZGU6ICIgRFJNX01PREVf Rk1UICJcbiIsIERSTV9NT0RFX0FSRygmc3RhdGUtPm1vZGUpKTsKPiArCWRybV9wcmludGYocCwg Ilx0bW9kZTogIiBEUk1fTU9ERV9GTVQgIlxuIiwgRFJNX01PREVfQVJHKCZzdGF0ZS0+bW9kZSwg YnVmKSk7Cj4gIAo+ICAJaWYgKGNydGMtPmZ1bmNzLT5hdG9taWNfcHJpbnRfc3RhdGUpCj4gIAkJ Y3J0Yy0+ZnVuY3MtPmF0b21pY19wcmludF9zdGF0ZShwLCBzdGF0ZSk7Cj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMu Ywo+IGluZGV4IDU3ZTY0MDgyODhjOC4uM2QxNWM2MDAyOTVhIDEwMDY0NAo+IC0tLSBhL2RyaXZl cnMvZ3B1L2RybS9kcm1fbW9kZXMuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMu Ywo+IEBAIC00NSw2ICs0NSwxMTggQEAKPiAgCj4gICNpbmNsdWRlICJkcm1fY3J0Y19pbnRlcm5h bC5oIgo+ICAKPiArc3RhdGljIGNoYXIgKnNucHJpbnRfY29udChjaGFyICpidWYsIGludCAqbGVu LAo+ICsJCQkgIGNvbnN0IGNoYXIgKnN0ciwgYm9vbCBsYXN0KQo+ICt7Cj4gKwlpbnQgcjsKPiAr Cj4gKwlyID0gc25wcmludGYoYnVmLCAqbGVuLCAiJXMlcyIsIHN0ciwgbGFzdCA/ICIiIDogIiwi KTsKPiArCWlmIChyID49ICpsZW4pCj4gKwkJcmV0dXJuIGJ1ZjsKPiArCj4gKwkqbGVuIC09IHI7 Cj4gKwlidWYgKz0gcjsKPiArCj4gKwlyZXR1cm4gYnVmOwo+ICt9Cj4gKwo+ICsjZGVmaW5lIE1P REVfU1RSKHgpIHsgLm5hbWUgPSAjeCwgLmZsYWcgPSBEUk1fTU9ERV9GTEFHXyAjIyB4LCB9Cj4g Kwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHsKPiArCWNvbnN0IGNoYXIgKm5hbWU7Cj4gKwl1MzIg ZmxhZzsKPiArfSBtb2RlX2ZsYWdzW10gPSB7Cj4gKwlNT0RFX1NUUihQSFNZTkMpLAo+ICsJTU9E RV9TVFIoTkhTWU5DKSwKPiArCU1PREVfU1RSKFBWU1lOQyksCj4gKwlNT0RFX1NUUihOVlNZTkMp LAo+ICsJTU9ERV9TVFIoSU5URVJMQUNFKSwKPiArCU1PREVfU1RSKENTWU5DKSwKPiArCU1PREVf U1RSKFBDU1lOQyksCj4gKwlNT0RFX1NUUihOQ1NZTkMpLAo+ICsJTU9ERV9TVFIoREJMU0NBTiks Cj4gKwlNT0RFX1NUUihIU0tFVyksCj4gKwlNT0RFX1NUUihEQkxDTEspLAo+ICsJTU9ERV9TVFIo Q0xLRElWMiksCj4gK307Cj4gKwo+ICsjdW5kZWYgTU9ERV9TVFIKPiArI2RlZmluZSBNT0RFX1NU Uih4KSBbRFJNX01PREVfRkxBR18zRF8gIyMgeCA+PiAxNF0gPSAjeAo+ICsKPiArc3RhdGljIGNv bnN0IGNoYXIgKiBjb25zdCBzdGVyZW9fZmxhZ3NbXSA9IHsKPiArCU1PREVfU1RSKE5PTkUpLAo+ ICsJTU9ERV9TVFIoRlJBTUVfUEFDS0lORyksCj4gKwlNT0RFX1NUUihGSUVMRF9BTFRFUk5BVElW RSksCj4gKwlNT0RFX1NUUihMSU5FX0FMVEVSTkFUSVZFKSwKPiArCU1PREVfU1RSKFNJREVfQllf U0lERV9GVUxMKSwKPiArCU1PREVfU1RSKExfREVQVEgpLAo+ICsJTU9ERV9TVFIoTF9ERVBUSF9H RlhfR0ZYX0RFUFRIKSwKPiArCU1PREVfU1RSKFRPUF9BTkRfQk9UVE9NKSwKPiArCU1PREVfU1RS KFNJREVfQllfU0lERV9IQUxGKSwKPiArfTsKPiArCj4gKyN1bmRlZiBNT0RFX1NUUgo+ICsjZGVm aW5lIE1PREVfU1RSKHgpIFtEUk1fTU9ERV9GTEFHX1BJQ19BUl8gIyMgeCA+PiAxOV0gPSAjeAo+ ICsKPiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3BlY3RfZmxhZ3NbXSA9IHsKPiArCU1P REVfU1RSKE5PTkUpLAo+ICsJTU9ERV9TVFIoNF8zKSwKPiArCU1PREVfU1RSKDE2XzkpLAo+ICsJ TU9ERV9TVFIoNjRfMjcpLAo+ICsJTU9ERV9TVFIoMjU2XzEzNSksCj4gK307Cj4gKwo+ICsjdW5k ZWYgTU9ERV9TVFIKPiArCj4gK2NvbnN0IGNoYXIgKmRybV9nZXRfbW9kZV9mbGFnc19uYW1lKGNo YXIgKmJ1ZiwgaW50IGxlbiwgdTMyIGZsYWdzKQo+ICt7Cj4gKwljaGFyICpwdHIgPSBidWY7Cj4g KwlpbnQgaTsKPiArCj4gKwlpZiAobGVuID09IDApCj4gKwkJcmV0dXJuIGJ1ZjsKPiArCj4gKwli dWZbMF0gPSAnXDAnOwo+ICsKPiArCWlmIChmbGFncyAmIERSTV9NT0RFX0ZMQUdfM0RfTUFTSykg ewo+ICsJCWludCBzdGVyZW8gPSAoZmxhZ3MgJiBEUk1fTU9ERV9GTEFHXzNEX01BU0spID4+IDE0 Owo+ICsKPiArCQlpZiAoc3RlcmVvIDwgQVJSQVlfU0laRShzdGVyZW9fZmxhZ3MpKSB7Cj4gKwkJ CWZsYWdzICY9IH5EUk1fTU9ERV9GTEFHXzNEX01BU0s7Cj4gKwkJCXB0ciA9IHNucHJpbnRfY29u dChwdHIsICZsZW4sCj4gKwkJCQkJICAgc3RlcmVvX2ZsYWdzW3N0ZXJlb10sICFmbGFncyk7Cj4g KwkJfQo+ICsJfQo+ICsKPiArCWlmIChmbGFncyAmIERSTV9NT0RFX0ZMQUdfUElDX0FSX01BU0sp IHsKPiArCQlpbnQgYXNwZWN0ID0gKGZsYWdzICYgRFJNX01PREVfRkxBR19QSUNfQVJfTUFTSykg Pj4gMTk7Cj4gKwo+ICsJCWlmIChhc3BlY3QgPCBBUlJBWV9TSVpFKGFzcGVjdF9mbGFncykpIHsK PiArCQkJZmxhZ3MgJj0gfkRSTV9NT0RFX0ZMQUdfUElDX0FSX01BU0s7Cj4gKwkJCXB0ciA9IHNu cHJpbnRfY29udChwdHIsICZsZW4sCj4gKwkJCQkJICAgYXNwZWN0X2ZsYWdzW2FzcGVjdF0sICFm bGFncyk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1v ZGVfZmxhZ3MpOyBpKyspIHsKPiArCQl1MzIgZmxhZyA9IG1vZGVfZmxhZ3NbaV0uZmxhZzsKPiAr Cj4gKwkJaWYgKChmbGFncyAmIGZsYWcpID09IDApCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlm bGFncyAmPSB+ZmxhZzsKPiArCj4gKwkJcHRyID0gc25wcmludF9jb250KHB0ciwgJmxlbiwKPiAr CQkJCSAgIG1vZGVfZmxhZ3NbaV0ubmFtZSwgIWZsYWdzKTsKPiArCX0KPiArCj4gKwlpZiAoZmxh Z3MpCj4gKwkJcHRyID0gc25wcmludF9jb250KHB0ciwgJmxlbiwgIj8iLCB0cnVlKTsKPiArCj4g KwlyZXR1cm4gYnVmOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2dldF9tb2RlX2ZsYWdzX25h bWUpOwo+ICsKPiAgLyoqCj4gICAqIGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUgLSBwcmlu dCBhIG1vZGUgdG8gZG1lc2cKPiAgICogQG1vZGU6IG1vZGUgdG8gcHJpbnQKPiBAQCAtNTMsNyAr MTY1LDkgQEAKPiAgICovCj4gIHZvaWQgZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShjb25z dCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiAgewo+IC0JRFJNX0RFQlVHX0tNUygi TW9kZWxpbmUgIiBEUk1fTU9ERV9GTVQgIlxuIiwgRFJNX01PREVfQVJHKG1vZGUpKTsKPiArCWNo YXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JVRl9MRU5dOwo+ICsKPiArCURSTV9ERUJVR19LTVMoIk1v ZGVsaW5lICIgRFJNX01PREVfRk1UICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiAg fQo+ICBFWFBPUlRfU1lNQk9MKGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUpOwo+ICAKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwo+IGluZGV4IDYyY2YzNGRiOTI4MC4uMThhM2Zm OGUxNDYxIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5j Cj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKPiBAQCAtMjUzOSwx MiArMjUzOSwxMyBAQCBzdGF0aWMgaW50IGk5MTVfZG1jX2luZm8oc3RydWN0IHNlcV9maWxlICpt LCB2b2lkICp1bnVzZWQpCj4gIHN0YXRpYyB2b2lkIGludGVsX3NlcV9wcmludF9tb2RlKHN0cnVj dCBzZXFfZmlsZSAqbSwgaW50IHRhYnMsCj4gIAkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUg Km1vZGUpCj4gIHsKPiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JVRl9MRU5dOwo+ICAJaW50 IGk7Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IHRhYnM7IGkrKykKPiAgCQlzZXFfcHV0YyhtLCAn XHQnKTsKPiAgCj4gLQlzZXFfcHJpbnRmKG0sIERSTV9NT0RFX0ZNVCAiXG4iLCBEUk1fTU9ERV9B UkcobW9kZSkpOwo+ICsJc2VxX3ByaW50ZihtLCBEUk1fTU9ERV9GTVQgIlxuIiwgRFJNX01PREVf QVJHKG1vZGUsIGJ1ZikpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgdm9pZCBpbnRlbF9lbmNvZGVyX2lu Zm8oc3RydWN0IHNlcV9maWxlICptLAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVz b24vbWVzb25fZHdfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL21lc29uL21lc29uX2R3X2hkbWku Ywo+IGluZGV4IGRmM2Y5ZGRkMjIzNC4uMzBlNTNhMDQzYmE2IDEwMDY0NAo+IC0tLSBhL2RyaXZl cnMvZ3B1L2RybS9tZXNvbi9tZXNvbl9kd19oZG1pLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v bWVzb24vbWVzb25fZHdfaGRtaS5jCj4gQEAgLTYxMCwxMyArNjEwLDE0IEBAIGR3X2hkbWlfbW9k ZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ICAJCSAgIGNvbnN0IHN0 cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICB7Cj4gIAlzdHJ1Y3QgbWVzb25fZHJtICpw cml2ID0gY29ubmVjdG9yLT5kZXYtPmRldl9wcml2YXRlOwo+ICsJY2hhciBidWZbRFJNX01PREVf RkxBR1NfQlVGX0xFTl07Cj4gIAl1bnNpZ25lZCBpbnQgdmNsa19mcmVxOwo+ICAJdW5zaWduZWQg aW50IHZlbmNfZnJlcTsKPiAgCXVuc2lnbmVkIGludCBoZG1pX2ZyZXE7Cj4gIAlpbnQgdmljID0g ZHJtX21hdGNoX2NlYV9tb2RlKG1vZGUpOwo+ICAJZW51bSBkcm1fbW9kZV9zdGF0dXMgc3RhdHVz Owo+ICAKPiAtCURSTV9ERUJVR19EUklWRVIoIk1vZGVsaW5lICIgRFJNX01PREVfRk1UICJcbiIs IERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gKwlEUk1fREVCVUdfRFJJVkVSKCJNb2RlbGluZSAiIERS TV9NT0RFX0ZNVCAiXG4iLCBEUk1fTU9ERV9BUkcobW9kZSwgYnVmKSk7Cj4gIAo+ICAJLyogSWYg c2luayBtYXggVE1EUyBjbG9jaywgd2UgcmVqZWN0IHRoZSBtb2RlICovCj4gIAlpZiAoY29ubmVj dG9yLT5kaXNwbGF5X2luZm8ubWF4X3RtZHNfY2xvY2sgJiYKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL21lc29uL21lc29uX3ZlbmMuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZXNvbi9tZXNv bl92ZW5jLmMKPiBpbmRleCA3YjdhMGQ4ZDczN2MuLjA5YWNiYzA2ZjlmMyAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vbWVzb24vbWVzb25fdmVuYy5jCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL21lc29uL21lc29uX3ZlbmMuYwo+IEBAIC05ODcsOSArOTg3LDExIEBAIHZvaWQgbWVzb25f dmVuY19oZG1pX21vZGVfc2V0KHN0cnVjdCBtZXNvbl9kcm0gKnByaXYsIGludCB2aWMsCj4gIAlp ZiAobWVzb25fdmVuY19oZG1pX3N1cHBvcnRlZF92aWModmljKSkgewo+ICAJCXZtb2RlID0gbWVz b25fdmVuY19oZG1pX2dldF92aWNfdm1vZGUodmljKTsKPiAgCQlpZiAoIXZtb2RlKSB7Cj4gKwkJ CWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JVRl9MRU5dOwo+ICsKPiAgCQkJZGV2X2Vycihwcml2 LT5kZXYsICIlczogRmF0YWwgRXJyb3IsIHVuc3VwcG9ydGVkIG1vZGUgIgo+ICAJCQkJRFJNX01P REVfRk1UICJcbiIsIF9fZnVuY19fLAo+IC0JCQkJRFJNX01PREVfQVJHKG1vZGUpKTsKPiArCQkJ CURSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiAgCQkJcmV0dXJuOwo+ICAJCX0KPiAgCX0gZWxz ZSB7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA0L21kcDRfY3J0 Yy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9jcnRjLmMKPiBpbmRleCAw Y2ZkNGMwNmI2MTAuLmY2OGQ5Zjc0YjBlNCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v bXNtL2Rpc3AvbWRwNC9tZHA0X2NydGMuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlz cC9tZHA0L21kcDRfY3J0Yy5jCj4gQEAgLTIzOCw2ICsyMzgsNyBAQCBzdGF0aWMgdm9pZCBtZHA0 X2NydGNfbW9kZV9zZXRfbm9mYihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4gIAllbnVtIG1kcDRf ZG1hIGRtYSA9IG1kcDRfY3J0Yy0+ZG1hOwo+ICAJaW50IG92bHAgPSBtZHA0X2NydGMtPm92bHA7 Cj4gIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKPiArCWNoYXIgYnVmW0RSTV9NT0RF X0ZMQUdTX0JVRl9MRU5dOwo+ICAKPiAgCWlmIChXQVJOX09OKCFjcnRjLT5zdGF0ZSkpCj4gIAkJ cmV0dXJuOwo+IEBAIC0yNDUsNyArMjQ2LDcgQEAgc3RhdGljIHZvaWQgbWRwNF9jcnRjX21vZGVf c2V0X25vZmIoc3RydWN0IGRybV9jcnRjICpjcnRjKQo+ICAJbW9kZSA9ICZjcnRjLT5zdGF0ZS0+ YWRqdXN0ZWRfbW9kZTsKPiAgCj4gIAlEQkcoIiVzOiBzZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQs Cj4gLQkJCW1kcDRfY3J0Yy0+bmFtZSwgRFJNX01PREVfQVJHKG1vZGUpKTsKPiArCSAgICBtZHA0 X2NydGMtPm5hbWUsIERSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiAgCj4gIAltZHA0X3dyaXRl KG1kcDRfa21zLCBSRUdfTURQNF9ETUFfU1JDX1NJWkUoZG1hKSwKPiAgCQkJTURQNF9ETUFfU1JD X1NJWkVfV0lEVEgobW9kZS0+aGRpc3BsYXkpIHwKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kc2lfZW5jb2Rlci5jIGIvZHJpdmVycy9ncHUvZHJtL21z bS9kaXNwL21kcDQvbWRwNF9kc2lfZW5jb2Rlci5jCj4gaW5kZXggY2FhMzliNDYyMWUzLi4yZTBk Y2E0ZDI0ODQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRw NF9kc2lfZW5jb2Rlci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRw NF9kc2lfZW5jb2Rlci5jCj4gQEAgLTU1LDEwICs1NSwxMSBAQCBzdGF0aWMgdm9pZCBtZHA0X2Rz aV9lbmNvZGVyX21vZGVfc2V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKPiAgCXVpbnQz Ml90IGRzaV9oc3luY19za2V3LCB2c3luY19wZXJpb2QsIHZzeW5jX2xlbiwgY3RybF9wb2w7Cj4g IAl1aW50MzJfdCBkaXNwbGF5X3Zfc3RhcnQsIGRpc3BsYXlfdl9lbmQ7Cj4gIAl1aW50MzJfdCBo c3luY19zdGFydF94LCBoc3luY19lbmRfeDsKPiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JV Rl9MRU5dOwo+ICAKPiAgCW1vZGUgPSBhZGp1c3RlZF9tb2RlOwo+ICAKPiAtCURCRygic2V0IG1v ZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSkpOwo+ICsJREJHKCJzZXQgbW9k ZTogIiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiAgCj4gIAljdHJs X3BvbCA9IDA7Cj4gIAlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX05IU1lOQykKPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kdHZfZW5jb2Rl ci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kdHZfZW5jb2Rlci5jCj4g aW5kZXggMjU5ZDUxOTcxNDAxLi5lODhhYzA3MGE2NzIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9n cHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kdHZfZW5jb2Rlci5jCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kdHZfZW5jb2Rlci5jCj4gQEAgLTEwMSwxMCArMTAx LDExIEBAIHN0YXRpYyB2b2lkIG1kcDRfZHR2X2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9l bmNvZGVyICplbmNvZGVyLAo+ICAJdWludDMyX3QgZHR2X2hzeW5jX3NrZXcsIHZzeW5jX3Blcmlv ZCwgdnN5bmNfbGVuLCBjdHJsX3BvbDsKPiAgCXVpbnQzMl90IGRpc3BsYXlfdl9zdGFydCwgZGlz cGxheV92X2VuZDsKPiAgCXVpbnQzMl90IGhzeW5jX3N0YXJ0X3gsIGhzeW5jX2VuZF94Owo+ICsJ Y2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gIAo+ICAJbW9kZSA9IGFkanVzdGVk X21vZGU7Cj4gIAo+IC0JREJHKCJzZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FS Ryhtb2RlKSk7Cj4gKwlEQkcoInNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJH KG1vZGUsIGJ1ZikpOwo+ICAKPiAgCW1kcDRfZHR2X2VuY29kZXItPnBpeGNsb2NrID0gbW9kZS0+ Y2xvY2sgKiAxMDAwOwo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNw L21kcDQvbWRwNF9sY2RjX2VuY29kZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA0 L21kcDRfbGNkY19lbmNvZGVyLmMKPiBpbmRleCBkZjZmOTgwM2ExZDcuLjk5YmRhZTljOTQ1YiAx MDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNC9tZHA0X2xjZGNfZW5j b2Rlci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9sY2RjX2Vu Y29kZXIuYwo+IEBAIC0yNzAsMTAgKzI3MCwxMSBAQCBzdGF0aWMgdm9pZCBtZHA0X2xjZGNfZW5j b2Rlcl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCj4gIAl1aW50MzJfdCBs Y2RjX2hzeW5jX3NrZXcsIHZzeW5jX3BlcmlvZCwgdnN5bmNfbGVuLCBjdHJsX3BvbDsKPiAgCXVp bnQzMl90IGRpc3BsYXlfdl9zdGFydCwgZGlzcGxheV92X2VuZDsKPiAgCXVpbnQzMl90IGhzeW5j X3N0YXJ0X3gsIGhzeW5jX2VuZF94Owo+ICsJY2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVGX0xF Tl07Cj4gIAo+ICAJbW9kZSA9IGFkanVzdGVkX21vZGU7Cj4gIAo+IC0JREJHKCJzZXQgbW9kZTog IiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gKwlEQkcoInNldCBtb2RlOiAi IERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ICAKPiAgCW1kcDRfbGNk Y19lbmNvZGVyLT5waXhjbG9jayA9IG1vZGUtPmNsb2NrICogMTAwMDsKPiAgCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY21kX2VuY29kZXIuYyBiL2Ry aXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY21kX2VuY29kZXIuYwo+IGluZGV4IGVl ZWY0MWZjZDRlMS4uNmJmZmJlYmVlOGJiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9t c20vZGlzcC9tZHA1L21kcDVfY21kX2VuY29kZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9t c20vZGlzcC9tZHA1L21kcDVfY21kX2VuY29kZXIuYwo+IEBAIC0xMjQsOSArMTI0LDExIEBAIHZv aWQgbWRwNV9jbWRfZW5jb2Rlcl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIs Cj4gIAkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiAgCQkJICAgICAg IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQo+ICB7Cj4gKwljaGFyIGJ1 ZltEUk1fTU9ERV9GTEFHU19CVUZfTEVOXTsKPiArCj4gIAltb2RlID0gYWRqdXN0ZWRfbW9kZTsK PiAgCj4gLQlEQkcoInNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUp KTsKPiArCURCRygic2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSwg YnVmKSk7Cj4gIAlwaW5ncG9uZ190ZWFyY2hlY2tfc2V0dXAoZW5jb2RlciwgbW9kZSk7Cj4gIAlt ZHA1X2NydGNfc2V0X3BpcGVsaW5lKGVuY29kZXItPmNydGMpOwo+ICB9Cj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY3J0Yy5jIGIvZHJpdmVycy9ncHUv ZHJtL21zbS9kaXNwL21kcDUvbWRwNV9jcnRjLmMKPiBpbmRleCBjMzc1MWM5NWI0NTIuLjg4OGEy NWQxZGE4YiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNS9tZHA1 X2NydGMuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY3J0Yy5j Cj4gQEAgLTM3OCwxMyArMzc4LDE0IEBAIHN0YXRpYyB2b2lkIG1kcDVfY3J0Y19tb2RlX3NldF9u b2ZiKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiAgCXUzMiBtaXhlcl93aWR0aCwgdmFsOwo+ICAJ dW5zaWduZWQgbG9uZyBmbGFnczsKPiAgCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOwo+ ICsJY2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gIAo+ICAJaWYgKFdBUk5fT04o IWNydGMtPnN0YXRlKSkKPiAgCQlyZXR1cm47Cj4gIAo+ICAJbW9kZSA9ICZjcnRjLT5zdGF0ZS0+ YWRqdXN0ZWRfbW9kZTsKPiAgCj4gLQlEQkcoIiVzOiBzZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQs IGNydGMtPm5hbWUsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gKwlEQkcoIiVzOiBzZXQgbW9kZTog IiBEUk1fTU9ERV9GTVQsIGNydGMtPm5hbWUsIERSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiAg Cj4gIAltaXhlcl93aWR0aCA9IG1vZGUtPmhkaXNwbGF5Owo+ICAJaWYgKHJfbWl4ZXIpCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfZW5jb2Rlci5jIGIv ZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDUvbWRwNV9lbmNvZGVyLmMKPiBpbmRleCA4MjBh NjJjNDAwNjMuLjgwOTExOGJiNjk2NSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNt L2Rpc3AvbWRwNS9tZHA1X2VuY29kZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlz cC9tZHA1L21kcDVfZW5jb2Rlci5jCj4gQEAgLTExNSwxMCArMTE1LDExIEBAIHN0YXRpYyB2b2lk IG1kcDVfdmlkX2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAo+ ICAJdWludDMyX3QgaHN5bmNfc3RhcnRfeCwgaHN5bmNfZW5kX3g7Cj4gIAl1aW50MzJfdCBmb3Jt YXQgPSAweDIxMDA7Cj4gIAl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsJY2hhciBidWZbRFJNX01P REVfRkxBR1NfQlVGX0xFTl07Cj4gIAo+ICAJbW9kZSA9IGFkanVzdGVkX21vZGU7Cj4gIAo+IC0J REJHKCJzZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gKwlE QkcoInNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ ICAKPiAgCWN0cmxfcG9sID0gMDsKPiAgCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9t c20vZHNpL2RzaV9tYW5hZ2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfbWFuYWdl ci5jCj4gaW5kZXggZWM2Y2IwZjdmMjA2Li4xYmYyZjUwM2I4NGIgMTAwNjQ0Cj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9tc20vZHNpL2RzaV9tYW5hZ2VyLmMKPiBAQCAtNTI3LDggKzUyNyw5IEBAIHN0YXRpYyB2b2lk IGRzaV9tZ3JfYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gIAlz dHJ1Y3QgbXNtX2RzaSAqb3RoZXJfZHNpID0gZHNpX21ncl9nZXRfb3RoZXJfZHNpKGlkKTsKPiAg CXN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0ID0gbXNtX2RzaS0+aG9zdDsKPiAgCWJvb2wgaXNf ZHVhbF9kc2kgPSBJU19EVUFMX0RTSSgpOwo+ICsJY2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVG X0xFTl07Cj4gIAo+IC0JREJHKCJzZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FS Ryhtb2RlKSk7Cj4gKwlEQkcoInNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJH KG1vZGUsIGJ1ZikpOwo+ICAKPiAgCWlmIChpc19kdWFsX2RzaSAmJiAhSVNfTUFTVEVSX0RTSV9M SU5LKGlkKSkKPiAgCQlyZXR1cm47Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20v ZWRwL2VkcF9icmlkZ2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZWRwL2VkcF9icmlkZ2UuYwo+ IGluZGV4IDI5NTBiYmE0YWNhOS4uMDg0NDM0NTg2MmVmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv Z3B1L2RybS9tc20vZWRwL2VkcF9icmlkZ2UuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20v ZWRwL2VkcF9icmlkZ2UuYwo+IEBAIC01MSw4ICs1MSw5IEBAIHN0YXRpYyB2b2lkIGVkcF9icmlk Z2VfbW9kZV9zZXQoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPiAgCXN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3I7Cj4gIAlzdHJ1Y3QgZWRwX2JyaWRnZSAqZWRwX2JyaWRnZSA9IHRv X2VkcF9icmlkZ2UoYnJpZGdlKTsKPiAgCXN0cnVjdCBtc21fZWRwICplZHAgPSBlZHBfYnJpZGdl LT5lZHA7Cj4gKwljaGFyIGJ1ZltEUk1fTU9ERV9GTEFHU19CVUZfTEVOXTsKPiAgCj4gLQlEQkco InNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUpKTsKPiArCURCRygi c2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSwgYnVmKSk7Cj4gIAo+ ICAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5l Y3Rvcl9saXN0LCBoZWFkKSB7Cj4gIAkJaWYgKChjb25uZWN0b3ItPmVuY29kZXIgIT0gTlVMTCkg JiYKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jb25uZWN0b3Iu YyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY29ubmVjdG9yLmMKPiBpbmRleCA1OTY3 MjgzOTM0ZTEuLjRjZTI5Mjg4YzcwZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vb21h cGRybS9vbWFwX2Nvbm5lY3Rvci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21h cF9jb25uZWN0b3IuYwo+IEBAIC0yNzYsNiArMjc2LDcgQEAgc3RhdGljIGVudW0gZHJtX21vZGVf c3RhdHVzIG9tYXBfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm4KPiAgCXN0cnVjdCBvbWFwX2Nvbm5lY3RvciAqb21hcF9jb25uZWN0b3IgPSB0b19vbWFwX2Nv bm5lY3Rvcihjb25uZWN0b3IpOwo+ICAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbmV3X21vZGUg PSB7IHsgMCB9IH07Cj4gIAllbnVtIGRybV9tb2RlX3N0YXR1cyBzdGF0dXM7Cj4gKwljaGFyIGJ1 ZltEUk1fTU9ERV9GTEFHU19CVUZfTEVOXTsKPiAgCj4gIAlzdGF0dXMgPSBvbWFwX2Nvbm5lY3Rv cl9tb2RlX2ZpeHVwKG9tYXBfY29ubmVjdG9yLT5vdXRwdXQsIG1vZGUsCj4gIAkJCQkJICAgJm5l d19tb2RlKTsKPiBAQCAtMjg4LDggKzI4OSw4IEBAIHN0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1 cyBvbWFwX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uCj4g IAo+ICBkb25lOgo+ICAJREJHKCJjb25uZWN0b3I6IG1vZGUgJXM6ICIgRFJNX01PREVfRk1ULAo+ IC0JCQkoc3RhdHVzID09IE1PREVfT0spID8gInZhbGlkIiA6ICJpbnZhbGlkIiwKPiAtCQkJRFJN X01PREVfQVJHKG1vZGUpKTsKPiArCSAgICAoc3RhdHVzID09IE1PREVfT0spID8gInZhbGlkIiA6 ICJpbnZhbGlkIiwKPiArCSAgICBEUk1fTU9ERV9BUkcobW9kZSwgYnVmKSk7Cj4gIAo+ICAJcmV0 dXJuIHN0YXR1czsKPiAgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9v bWFwX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY3J0Yy5jCj4gaW5kZXgg ZDYxMjE1NDk0NjE3Li4yMjE0NTlkNmFiZTkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L29tYXBkcm0vb21hcF9jcnRjLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFw X2NydGMuYwo+IEBAIC01NTMsOSArNTUzLDEwIEBAIHN0YXRpYyB2b2lkIG9tYXBfY3J0Y19tb2Rl X3NldF9ub2ZiKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiAgewo+ICAJc3RydWN0IG9tYXBfY3J0 YyAqb21hcF9jcnRjID0gdG9fb21hcF9jcnRjKGNydGMpOwo+ICAJc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUgPSAmY3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGU7Cj4gKwljaGFyIGJ1ZltE Uk1fTU9ERV9GTEFHU19CVUZfTEVOXTsKPiAgCj4gIAlEQkcoIiVzOiBzZXQgbW9kZTogIiBEUk1f TU9ERV9GTVQsCj4gLQkgICAgb21hcF9jcnRjLT5uYW1lLCBEUk1fTU9ERV9BUkcobW9kZSkpOwo+ ICsJICAgIG9tYXBfY3J0Yy0+bmFtZSwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ICAKPiAg CWRybV9kaXNwbGF5X21vZGVfdG9fdmlkZW9tb2RlKG1vZGUsICZvbWFwX2NydGMtPnZtKTsKPiAg fQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtcm9uYm8tcmIwNzBk MzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1yb25iby1yYjA3MGQzMC5jCj4gaW5k ZXggM2MxNTc2NGYwYzAzLi40NjhlYmRjYTk0ZjQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL3BhbmVsL3BhbmVsLXJvbmJvLXJiMDcwZDMwLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v cGFuZWwvcGFuZWwtcm9uYm8tcmIwNzBkMzAuYwo+IEBAIC0xMjYsMTIgKzEyNiwxMyBAQCBzdGF0 aWMgaW50IHJiMDcwZDMwX3BhbmVsX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkK PiAgCXN0cnVjdCByYjA3MGQzMF9wYW5lbCAqY3R4ID0gcGFuZWxfdG9fcmIwNzBkMzBfcGFuZWwo cGFuZWwpOwo+ICAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7Cj4gIAlzdGF0aWMgY29u c3QgdTMyIGJ1c19mb3JtYXQgPSBNRURJQV9CVVNfRk1UX1JHQjg4OF8xWDI0Owo+ICsJY2hhciBi dWZbRFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gIAo+ICAJbW9kZSA9IGRybV9tb2RlX2R1cGxp Y2F0ZShwYW5lbC0+ZHJtLCAmZGVmYXVsdF9tb2RlKTsKPiAgCWlmICghbW9kZSkgewo+ICAJCURS TV9ERVZfRVJST1IoJmN0eC0+ZHNpLT5kZXYsCj4gIAkJCSAgICAgICJGYWlsZWQgdG8gYWRkIG1v ZGUgIiBEUk1fTU9ERV9GTVQgIlxuIiwKPiAtCQkJICAgICAgRFJNX01PREVfQVJHKCZkZWZhdWx0 X21vZGUpKTsKPiArCQkJICAgICAgRFJNX01PREVfQVJHKCZkZWZhdWx0X21vZGUsIGJ1ZikpOwo+ ICAJCXJldHVybiAtRUlOVkFMOwo+ICAJfQo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL3N0aS9zdGlfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3N0aS9zdGlfY3J0Yy5jCj4gaW5k ZXggZGM2NGZiZmM0ZTYxLi5iYzk2MDJmNTE5ZDcgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL3N0aS9zdGlfY3J0Yy5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3N0aS9zdGlfY3J0Yy5j Cj4gQEAgLTU0LDExICs1NCwxMiBAQCBzdGlfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMg KmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICAJc3RydWN0IHN0aV9jb21w b3NpdG9yICpjb21wbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICAJc3RydWN0IGNsayAqY29t cG9fY2xrLCAqcGl4X2NsazsKPiAgCWludCByYXRlID0gbW9kZS0+Y2xvY2sgKiAxMDAwOwo+ICsJ Y2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gIAo+ICAJRFJNX0RFQlVHX0tNUygi Q1JUQzolZCAoJXMpIG1vZGU6ICglcylcbiIsCj4gIAkJICAgICAgY3J0Yy0+YmFzZS5pZCwgc3Rp X21peGVyX3RvX3N0cihtaXhlciksIG1vZGUtPm5hbWUpOwo+ICAKPiAtCURSTV9ERUJVR19LTVMo RFJNX01PREVfRk1UICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gKwlEUk1fREVCVUdfS01T KERSTV9NT0RFX0ZNVCAiXG4iLCBEUk1fTU9ERV9BUkcobW9kZSwgYnVmKSk7Cj4gIAo+ICAJaWYg KG1peGVyLT5pZCA9PSBTVElfTUlYRVJfTUFJTikgewo+ICAJCWNvbXBvX2NsayA9IGNvbXBvLT5j bGtfY29tcG9fbWFpbjsKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX21vZGVzLmggYi9p bmNsdWRlL2RybS9kcm1fbW9kZXMuaAo+IGluZGV4IDA4M2YxNjc0NzM2OS4uMzk2MmRiZjgyMTAw IDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvZHJtL2RybV9tb2Rlcy5oCj4gKysrIGIvaW5jbHVkZS9k cm0vZHJtX21vZGVzLmgKPiBAQCAtNDI4LDIwICs0MjgsMjcgQEAgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgewo+ICAJc3RydWN0IGxpc3RfaGVhZCBleHBvcnRfaGVhZDsKPiAgfTsKPiAgCj4gKy8q Kgo+ICsgKiBEUk1fTU9ERV9GTEFHU19CVUZfTEVOIC0gcmVhc29uYWJsZSBzaXplIGZvciB0aGUg YnVmZmVyIHBhc3NlZCB0byBEUk1fTU9ERV9BUkcoKQo+ICsgKi8KPiArI2RlZmluZSBEUk1fTU9E RV9GTEFHU19CVUZfTEVOIDY0Cj4gKwo+ICAvKioKPiAgICogRFJNX01PREVfRk1UIC0gcHJpbnRm IHN0cmluZyBmb3IgJnN0cnVjdCBkcm1fZGlzcGxheV9tb2RlCj4gICAqLwo+IC0jZGVmaW5lIERS TV9NT0RFX0ZNVCAgICAiXCIlc1wiOiAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAweCV4 IDB4JXgiCj4gKyNkZWZpbmUgRFJNX01PREVfRk1UICAgICJcIiVzXCI6ICVkICVkICVkICVkICVk ICVkICVkICVkICVkICVkIDB4JXggMHgleCAlcyIKPiAgCj4gIC8qKgo+ICAgKiBEUk1fTU9ERV9B UkcgLSBwcmludGYgYXJndW1lbnRzIGZvciAmc3RydWN0IGRybV9kaXNwbGF5X21vZGUKPiAgICog QG06IGRpc3BsYXkgbW9kZQo+ICsgKiBAYjogYnVmZmVyIGZvciB0ZW1wb3Jhcnkgc3RyaW5nCj4g ICAqLwo+IC0jZGVmaW5lIERSTV9NT0RFX0FSRyhtKSBcCj4gKyNkZWZpbmUgRFJNX01PREVfQVJH KG0sIGIpIFwKPiAgCShtKS0+bmFtZSwgKG0pLT52cmVmcmVzaCwgKG0pLT5jbG9jaywgXAo+ICAJ KG0pLT5oZGlzcGxheSwgKG0pLT5oc3luY19zdGFydCwgKG0pLT5oc3luY19lbmQsIChtKS0+aHRv dGFsLCBcCj4gIAkobSktPnZkaXNwbGF5LCAobSktPnZzeW5jX3N0YXJ0LCAobSktPnZzeW5jX2Vu ZCwgKG0pLT52dG90YWwsIFwKPiAtCShtKS0+dHlwZSwgKG0pLT5mbGFncwo+ICsJKG0pLT50eXBl LCAobSktPmZsYWdzLCBcCj4gKwlkcm1fZ2V0X21vZGVfZmxhZ3NfbmFtZShiLCBzaXplb2YoYiks IChtKS0+ZmxhZ3MpCj4gIAo+ICAjZGVmaW5lIG9ial90b19tb2RlKHgpIGNvbnRhaW5lcl9vZih4 LCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSwgYmFzZSkKPiAgCj4gQEAgLTU0Miw1ICs1NDksNiBA QCBkcm1fbW9kZV9wYXJzZV9jb21tYW5kX2xpbmVfZm9yX2Nvbm5lY3Rvcihjb25zdCBjaGFyICpt b2RlX29wdGlvbiwKPiAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKgo+ICBkcm1fbW9kZV9jcmVh dGVfZnJvbV9jbWRsaW5lX21vZGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPiAgCQkJCSAgc3Ry dWN0IGRybV9jbWRsaW5lX21vZGUgKmNtZCk7Cj4gK2NvbnN0IGNoYXIgKmRybV9nZXRfbW9kZV9m bGFnc19uYW1lKGNoYXIgKmJ1ZiwgaW50IGxlbiwgdTMyIGZsYWdzKTsKPiAgCj4gICNlbmRpZiAv KiBfX0RSTV9NT0RFU19IX18gKi8KPiAtLSAKPiAyLjIxLjAKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1n ZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4