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 66D64C43613 for ; Mon, 24 Jun 2019 12:38:26 +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 39EE8212F5 for ; Mon, 24 Jun 2019 12:38:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ZHl8j3Q/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 39EE8212F5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com 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=7ppXhgbo0G57DJwb697Zz3e23lLmlxOhdSOENOzLfJ0=; b=ZHl8j3Q/UtJNn8 xBn4Lbs95eccDqCjXNI6uT7J8xfHJbK3xbFyhsAdhvdUasqPd1OqJBKs9tB50HrChX1JLMrzxKAfU ztFF/3ZrTRxgaNLGpkGzAsKpz2yAtUGyULoMzlaphbR6xI1v653LUsHmVoGkt8GQQ1OSNHQhqGqws JVquj/68j3Whqa9KSGicOElLd2MNerJD5IggPjLt9OKKEBOM6VOQcTsfx0NOiec2MabLDr5VS718b yuLFzn2DfP/aQiZcvynz6GVpB45tIy3bRTmXqFydK/c78ntWoYJrQsM+IVNzrEgjOqMHtuoRmHnMC KodOtB8RskwTIjjQc2Ig==; 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 1hfOEl-0007g4-Hb; Mon, 24 Jun 2019 12:38:19 +0000 Received: from mga03.intel.com ([134.134.136.65]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hfOEh-0007f2-A0 for linux-amlogic@lists.infradead.org; Mon, 24 Jun 2019 12:38:18 +0000 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Jun 2019 05:37:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,412,1557212400"; d="scan'208";a="171974093" Received: from stinkbox.fi.intel.com (HELO stinkbox) ([10.237.72.174]) by orsmga002.jf.intel.com with SMTP; 24 Jun 2019 05:37:42 -0700 Received: by stinkbox (sSMTP sendmail emulation); Mon, 24 Jun 2019 15:37:41 +0300 Date: Mon, 24 Jun 2019 15:37:41 +0300 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Sam Ravnborg Subject: Re: [PATCH 1/2] drm: Pretty print mode flags Message-ID: <20190624123741.GJ5942@intel.com> References: <20190620185049.8974-1-ville.syrjala@linux.intel.com> <20190620202542.GA12106@ravnborg.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190620202542.GA12106@ravnborg.org> User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190624_053815_427674_347DEB5C X-CRM114-Status: GOOD ( 32.63 ) 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 On Thu, Jun 20, 2019 at 10:25:42PM +0200, Sam Ravnborg wrote: > 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. You're suggesting to print the whole mode to a temp buffer, and then print that with just %s? I thought about that, but it would waste even more stack so didn't think it was all that great. > = > A middle ground could be to introduce a struct for the buf so we know > the callers do it right. I'm not a fan of that struct approach because it forces you to use a dedicated buffer for the thing. With just a raw char[] you can print to anything, so it could be used more like strcat() as well. Also I think it makes it more clear how much stack space you're blowing away. And it looks a bit like snprintf() so it's more clear what's happening on. Although in this case that last point is kinda lost due to the macro thing. > = > 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/arm= ada/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 dr= m_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 dr= m_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_= printer *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_= printer *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= /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, vo= id *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/me= son/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 *connecto= r, > > 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, bu= f)); > > = > > /* 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 *pr= iv, 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/dr= m/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= /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_en= coder *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= /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 =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/driver= s/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 =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= /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 =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/dr= m/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_cr= tc *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= /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 =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/ms= m/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_brid= ge *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= /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 *br= idge, > > 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= /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_val= id(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_val= id(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/omap= drm/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_crt= c *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= /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_pa= nel *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_c= rtc.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 =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 D= RM_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 cha= r *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 -- = Ville Syrj=E4l=E4 Intel _______________________________________________ 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 33157C43613 for ; Mon, 24 Jun 2019 12:37:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E6F76212F5 for ; Mon, 24 Jun 2019 12:37:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727540AbfFXMhs (ORCPT ); Mon, 24 Jun 2019 08:37:48 -0400 Received: from mga17.intel.com ([192.55.52.151]:32468 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726834AbfFXMhs (ORCPT ); Mon, 24 Jun 2019 08:37:48 -0400 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Jun 2019 05:37:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,412,1557212400"; d="scan'208";a="171974093" Received: from stinkbox.fi.intel.com (HELO stinkbox) ([10.237.72.174]) by orsmga002.jf.intel.com with SMTP; 24 Jun 2019 05:37:42 -0700 Received: by stinkbox (sSMTP sendmail emulation); Mon, 24 Jun 2019 15:37:41 +0300 Date: Mon, 24 Jun 2019 15:37:41 +0300 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Sam Ravnborg 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: <20190624123741.GJ5942@intel.com> References: <20190620185049.8974-1-ville.syrjala@linux.intel.com> <20190620202542.GA12106@ravnborg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20190620202542.GA12106@ravnborg.org> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org On Thu, Jun 20, 2019 at 10:25:42PM +0200, Sam Ravnborg wrote: > 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. You're suggesting to print the whole mode to a temp buffer, and then print that with just %s? I thought about that, but it would waste even more stack so didn't think it was all that great. > > A middle ground could be to introduce a struct for the buf so we know > the callers do it right. I'm not a fan of that struct approach because it forces you to use a dedicated buffer for the thing. With just a raw char[] you can print to anything, so it could be used more like strcat() as well. Also I think it makes it more clear how much stack space you're blowing away. And it looks a bit like snprintf() so it's more clear what's happening on. Although in this case that last point is kinda lost due to the macro thing. > > 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 -- Ville Syrjälä Intel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH 1/2] drm: Pretty print mode flags Date: Mon, 24 Jun 2019 15:37:41 +0300 Message-ID: <20190624123741.GJ5942@intel.com> References: <20190620185049.8974-1-ville.syrjala@linux.intel.com> <20190620202542.GA12106@ravnborg.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20190620202542.GA12106-uyr5N9Q2VtJg9hUCZPvPmw@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: Sam Ravnborg Cc: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Neil Armstrong , linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, intel-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Russell King , dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Rob Clark , Tomi Valkeinen , Thierry Reding , Benjamin Gaignard , linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Vincent Abriou , Ilia Mirkin List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBKdW4gMjAsIDIwMTkgYXQgMTA6MjU6NDJQTSArMDIwMCwgU2FtIFJhdm5ib3JnIHdy b3RlOgo+IEhpIFZpbGxlLgo+IAo+IE9uIFRodSwgSnVuIDIwLCAyMDE5IGF0IDA5OjUwOjQ4UE0g KzAzMDAsIFZpbGxlIFN5cmphbGEgd3JvdGU6Cj4gPiBGcm9tOiBWaWxsZSBTeXJqw6Rsw6QgPHZp bGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPgo+ID4gCj4gPiBEZWNvZGUgdGhlIG1vZGUgZmxh Z3Mgd2hlbiBwcmludGluZyB0aGUgbW9kZWxpbmUgc28gdGhhdCBJCj4gPiBubyBsb25nZXIgaGF2 ZSB0byBkZWNvZGUgdGhlIGhleCBudW1iZXIgbXlzZWxmLgo+IFlvdSBhcmUgZXh0ZW5kaW5nIHRo ZSBjdXJyZW50IHdheSB0byBwcmludCBtb2RlIGZsYWdzLAo+IGJ1dCBJIHdvdWxkIGFueXdheSBs aWtlIHRvIHBvaW50IG91dCBhIGRpZmZlcmVudCBhcHByb2FjaC4KPiAKPiBXaGVuIEkgbmVlZCB0 byBwcmludCBhIGZvdXJjYyBjb2RlIGl0IGlzIGFzIHNpbXBsZSBhczoKPiAKPiB7Cj4gCXN0cnVj dCBkcm1fZm9ybWF0X25hbWVfYnVmIGZidWY7Cj4gCj4gCXByaW50aygiTXkgZm9ybWF0OiAlc1xu IiwgZHJtX2dldF9mb3JtYXRfbmFtZShmb3JtYXQsICZmYnVmKTsKPiB9Cj4gCj4gVGhpcyB3YXkg dG8gaGFuZGxlIHRoaXMgZmVlbHMgbW9yZSBzdHJhaWdodGZvcndhcmQKPiB0aGFuIHRoZSBjdXJy ZW50IGFwcHJvYWNoIHVzZWQgZm9yIG1vZGVzLgo+IAo+IE1heWJlIGJpa2VzaGVkZGluZywgYXMg eW91ciBtaWxlYWdlIG1heSB2YXJ5LgoKWW91J3JlIHN1Z2dlc3RpbmcgdG8gcHJpbnQgdGhlIHdo b2xlIG1vZGUgdG8gYSB0ZW1wIGJ1ZmZlciwgYW5kIHRoZW4KcHJpbnQgdGhhdCB3aXRoIGp1c3Qg JXM/IEkgdGhvdWdodCBhYm91dCB0aGF0LCBidXQgaXQgd291bGQgd2FzdGUKZXZlbiBtb3JlIHN0 YWNrIHNvIGRpZG4ndCB0aGluayBpdCB3YXMgYWxsIHRoYXQgZ3JlYXQuCgo+IAo+IEEgbWlkZGxl IGdyb3VuZCBjb3VsZCBiZSB0byBpbnRyb2R1Y2UgYSBzdHJ1Y3QgZm9yIHRoZSBidWYgc28gd2Ug a25vdwo+IHRoZSBjYWxsZXJzIGRvIGl0IHJpZ2h0LgoKSSdtIG5vdCBhIGZhbiBvZiB0aGF0IHN0 cnVjdCBhcHByb2FjaCBiZWNhdXNlIGl0IGZvcmNlcyB5b3UgdG8gdXNlCmEgZGVkaWNhdGVkIGJ1 ZmZlciBmb3IgdGhlIHRoaW5nLiBXaXRoIGp1c3QgYSByYXcgY2hhcltdIHlvdSBjYW4KcHJpbnQg dG8gYW55dGhpbmcsIHNvIGl0IGNvdWxkIGJlIHVzZWQgbW9yZSBsaWtlIHN0cmNhdCgpIGFzIHdl bGwuCkFsc28gSSB0aGluayBpdCBtYWtlcyBpdCBtb3JlIGNsZWFyIGhvdyBtdWNoIHN0YWNrIHNw YWNlIHlvdSdyZQpibG93aW5nIGF3YXkuIEFuZCBpdCBsb29rcyBhIGJpdCBsaWtlIHNucHJpbnRm KCkgc28gaXQncyBtb3JlCmNsZWFyIHdoYXQncyBoYXBwZW5pbmcgb24uIEFsdGhvdWdoIGluIHRo aXMgY2FzZSB0aGF0IGxhc3QgcG9pbnQKaXMga2luZGEgbG9zdCBkdWUgdG8gdGhlIG1hY3JvIHRo aW5nLgoKPiAKPiBNb3N0IG9mIHRoZSBjb2RlIHdvdWxkIGJlIHRoZSBzYW1lLCBidXQgYWxsIGNh bGwgc2l0ZXMgd291bGQgbmVlZCB0byBiZQo+IHVwZGF0ZWQuCj4gV2hhdCBkbyB5b3UgdGhpbms/ Cj4gCj4gCVNhbQo+IAo+IAo+ID4gCj4gPiBUbyBkbyB0aGlzIG5lYXRseSBJIG1hZGUgdGhlIGNh bGxlciBwcm92aWRlIGEgdGVtcG9yYXJ5Cj4gPiBvbiBzdGFjayBidWZmZXIgd2hlcmUgd2UgY2Fu IHByb2R1Y2UgdGhlIHJlc3VsdHMuIEkgY2hvY2UgNjQKPiA+IGJ5dGVzIGFzIGEgcmVhc29uYWJs ZSBzaXplIGZvciB0aGlzLiBUaGUgd29yc3QgY2FzZSBJIHRoaW5rCj4gPiBpcyA+IDEwMCBieXRl cyBidXQgdGhhdCBraW5kIG9mIG1vZGUgd291bGQgYmUgbm9uc2Vuc2UgYW55d2F5Cj4gPiBzbyBJ IGZpZ3VyZWQgY29ycmVjdCBkZWNvZGluZyBpc24ndCBhcyBpbXBvcnRhbnQgaW4gc3VjaAo+ID4g Y2FzZXMuCj4gPiAKPiA+IENjOiBSdXNzZWxsIEtpbmcgPGxpbnV4QGFybWxpbnV4Lm9yZy51az4K PiA+IENjOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+Cj4gPiBDYzog Um9iIENsYXJrIDxyb2JkY2xhcmtAZ21haWwuY29tPgo+ID4gQ2M6IFRvbWkgVmFsa2VpbmVuIDx0 b21pLnZhbGtlaW5lbkB0aS5jb20+Cj4gPiBDYzogVGhpZXJyeSBSZWRpbmcgPHRoaWVycnkucmVk aW5nQGdtYWlsLmNvbT4KPiA+IENjOiBTYW0gUmF2bmJvcmcgPHNhbUByYXZuYm9yZy5vcmc+Cj4g PiBDYzogQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGxpbmFyby5vcmc+Cj4g PiBDYzogVmluY2VudCBBYnJpb3UgPHZpbmNlbnQuYWJyaW91QHN0LmNvbT4KPiA+IENjOiBsaW51 eC1hbWxvZ2ljQGxpc3RzLmluZnJhZGVhZC5vcmcKPiA+IENjOiBsaW51eC1hcm0tbXNtQHZnZXIu a2VybmVsLm9yZwo+ID4gQ2M6IGZyZWVkcmVub0BsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiA+IENj OiBJbGlhIE1pcmtpbiA8aW1pcmtpbkBhbHVtLm1pdC5lZHU+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBW aWxsZSBTeXJqw6Rsw6QgPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPgo+ID4gLS0tCj4g PiAgZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfY3J0Yy5jICAgICAgICAgIHwgICAzICst Cj4gPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyAgICAgICAgICAgICAgICAgIHwgICAz ICstCj4gPiAgZHJpdmVycy9ncHUvZHJtL2RybV9tb2Rlcy5jICAgICAgICAgICAgICAgICAgIHwg MTE2ICsrKysrKysrKysrKysrKysrLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVi dWdmcy5jICAgICAgICAgICB8ICAgMyArLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9tZXNvbi9tZXNv bl9kd19oZG1pLmMgICAgICAgICB8ICAgMyArLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9tZXNvbi9t ZXNvbl92ZW5jLmMgICAgICAgICAgICB8ICAgNCArLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9tc20v ZGlzcC9tZHA0L21kcDRfY3J0Yy5jICAgICB8ICAgMyArLQo+ID4gIC4uLi9ncHUvZHJtL21zbS9k aXNwL21kcDQvbWRwNF9kc2lfZW5jb2Rlci5jICB8ICAgMyArLQo+ID4gIC4uLi9ncHUvZHJtL21z bS9kaXNwL21kcDQvbWRwNF9kdHZfZW5jb2Rlci5jICB8ICAgMyArLQo+ID4gIC4uLi9ncHUvZHJt L21zbS9kaXNwL21kcDQvbWRwNF9sY2RjX2VuY29kZXIuYyB8ICAgMyArLQo+ID4gIC4uLi9ncHUv ZHJtL21zbS9kaXNwL21kcDUvbWRwNV9jbWRfZW5jb2Rlci5jICB8ICAgNCArLQo+ID4gIGRyaXZl cnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY3J0Yy5jICAgICB8ICAgMyArLQo+ID4gIGRy aXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfZW5jb2Rlci5jICB8ICAgMyArLQo+ID4g IGRyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaV9tYW5hZ2VyLmMgICAgICAgICB8ICAgMyArLQo+ ID4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZWRwL2VkcF9icmlkZ2UuYyAgICAgICAgICB8ICAgMyAr LQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY29ubmVjdG9yLmMgICAgICB8ICAg NSArLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY3J0Yy5jICAgICAgICAgICB8 ICAgMyArLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1yb25iby1yYjA3MGQzMC5j ICB8ICAgMyArLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9zdGkvc3RpX2NydGMuYyAgICAgICAgICAg ICAgICB8ICAgMyArLQo+ID4gIGluY2x1ZGUvZHJtL2RybV9tb2Rlcy5oICAgICAgICAgICAgICAg ICAgICAgICB8ICAxNCArKy0KPiA+ICAyMCBmaWxlcyBjaGFuZ2VkLCAxNjUgaW5zZXJ0aW9ucygr KSwgMjMgZGVsZXRpb25zKC0pCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v YXJtYWRhL2FybWFkYV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vYXJtYWRhL2FybWFkYV9jcnRj LmMKPiA+IGluZGV4IGJhNGEzZmFiNzc0NS4uY2U5MzM1NjgyYmQyIDEwMDY0NAo+ID4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2FybWFkYS9hcm1hZGFfY3J0Yy5jCj4gPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vYXJtYWRhL2FybWFkYV9jcnRjLmMKPiA+IEBAIC0yNjIsNiArMjYyLDcgQEAgc3RhdGlj IHZvaWQgYXJtYWRhX2RybV9jcnRjX21vZGVfc2V0X25vZmIoc3RydWN0IGRybV9jcnRjICpjcnRj KQo+ID4gIAl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4gIAl1bnNpZ25lZCBpOwo+ID4gIAlib29s IGludGVybGFjZWQgPSAhIShhZGotPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpOwo+ ID4gKwljaGFyIGJ1ZltEUk1fTU9ERV9GTEFHU19CVUZfTEVOXTsKPiA+ICAKPiA+ICAJaSA9IDA7 Cj4gPiAgCXJtID0gYWRqLT5jcnRjX2hzeW5jX3N0YXJ0IC0gYWRqLT5jcnRjX2hkaXNwbGF5Owo+ ID4gQEAgLTI3MCw3ICsyNzEsNyBAQCBzdGF0aWMgdm9pZCBhcm1hZGFfZHJtX2NydGNfbW9kZV9z ZXRfbm9mYihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4gPiAgCXRtID0gYWRqLT5jcnRjX3Z0b3Rh bCAtIGFkai0+Y3J0Y192c3luY19lbmQ7Cj4gPiAgCj4gPiAgCURSTV9ERUJVR19LTVMoIltDUlRD OiVkOiVzXSBtb2RlICIgRFJNX01PREVfRk1UICJcbiIsCj4gPiAtCQkgICAgICBjcnRjLT5iYXNl LmlkLCBjcnRjLT5uYW1lLCBEUk1fTU9ERV9BUkcoYWRqKSk7Cj4gPiArCQkgICAgICBjcnRjLT5i YXNlLmlkLCBjcnRjLT5uYW1lLCBEUk1fTU9ERV9BUkcoYWRqLCBidWYpKTsKPiA+ICAJRFJNX0RF QlVHX0tNUygibG0gJWQgcm0gJWQgdG0gJWQgYm0gJWRcbiIsIGxtLCBybSwgdG0sIGJtKTsKPiA+ ICAKPiA+ICAJLyogTm93IGNvbXB1dGUgdGhlIGRpdmlkZXIgZm9yIHJlYWwgKi8KPiA+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jIGIvZHJpdmVycy9ncHUvZHJtL2Ry bV9hdG9taWMuYwo+ID4gaW5kZXggNDE5MzgxYWJiZGQxLi44MWNhZjkxZmJkNzIgMTAwNjQ0Cj4g PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCj4gPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vZHJtX2F0b21pYy5jCj4gPiBAQCAtMzgwLDYgKzM4MCw3IEBAIHN0YXRpYyB2b2lkIGRy bV9hdG9taWNfY3J0Y19wcmludF9zdGF0ZShzdHJ1Y3QgZHJtX3ByaW50ZXIgKnAsCj4gPiAgCQlj b25zdCBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKnN0YXRlKQo+ID4gIHsKPiA+ICAJc3RydWN0IGRy bV9jcnRjICpjcnRjID0gc3RhdGUtPmNydGM7Cj4gPiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdT X0JVRl9MRU5dOwo+ID4gIAo+ID4gIAlkcm1fcHJpbnRmKHAsICJjcnRjWyV1XTogJXNcbiIsIGNy dGMtPmJhc2UuaWQsIGNydGMtPm5hbWUpOwo+ID4gIAlkcm1fcHJpbnRmKHAsICJcdGVuYWJsZT0l ZFxuIiwgc3RhdGUtPmVuYWJsZSk7Cj4gPiBAQCAtMzkzLDcgKzM5NCw3IEBAIHN0YXRpYyB2b2lk IGRybV9hdG9taWNfY3J0Y19wcmludF9zdGF0ZShzdHJ1Y3QgZHJtX3ByaW50ZXIgKnAsCj4gPiAg CWRybV9wcmludGYocCwgIlx0cGxhbmVfbWFzaz0leFxuIiwgc3RhdGUtPnBsYW5lX21hc2spOwo+ ID4gIAlkcm1fcHJpbnRmKHAsICJcdGNvbm5lY3Rvcl9tYXNrPSV4XG4iLCBzdGF0ZS0+Y29ubmVj dG9yX21hc2spOwo+ID4gIAlkcm1fcHJpbnRmKHAsICJcdGVuY29kZXJfbWFzaz0leFxuIiwgc3Rh dGUtPmVuY29kZXJfbWFzayk7Cj4gPiAtCWRybV9wcmludGYocCwgIlx0bW9kZTogIiBEUk1fTU9E RV9GTVQgIlxuIiwgRFJNX01PREVfQVJHKCZzdGF0ZS0+bW9kZSkpOwo+ID4gKwlkcm1fcHJpbnRm KHAsICJcdG1vZGU6ICIgRFJNX01PREVfRk1UICJcbiIsIERSTV9NT0RFX0FSRygmc3RhdGUtPm1v ZGUsIGJ1ZikpOwo+ID4gIAo+ID4gIAlpZiAoY3J0Yy0+ZnVuY3MtPmF0b21pY19wcmludF9zdGF0 ZSkKPiA+ICAJCWNydGMtPmZ1bmNzLT5hdG9taWNfcHJpbnRfc3RhdGUocCwgc3RhdGUpOwo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW9kZXMuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fbW9kZXMuYwo+ID4gaW5kZXggNTdlNjQwODI4OGM4Li4zZDE1YzYwMDI5NWEgMTAwNjQ0 Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21vZGVzLmMKPiA+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fbW9kZXMuYwo+ID4gQEAgLTQ1LDYgKzQ1LDExOCBAQAo+ID4gIAo+ID4gICNp bmNsdWRlICJkcm1fY3J0Y19pbnRlcm5hbC5oIgo+ID4gIAo+ID4gK3N0YXRpYyBjaGFyICpzbnBy aW50X2NvbnQoY2hhciAqYnVmLCBpbnQgKmxlbiwKPiA+ICsJCQkgIGNvbnN0IGNoYXIgKnN0ciwg Ym9vbCBsYXN0KQo+ID4gK3sKPiA+ICsJaW50IHI7Cj4gPiArCj4gPiArCXIgPSBzbnByaW50Zihi dWYsICpsZW4sICIlcyVzIiwgc3RyLCBsYXN0ID8gIiIgOiAiLCIpOwo+ID4gKwlpZiAociA+PSAq bGVuKQo+ID4gKwkJcmV0dXJuIGJ1ZjsKPiA+ICsKPiA+ICsJKmxlbiAtPSByOwo+ID4gKwlidWYg Kz0gcjsKPiA+ICsKPiA+ICsJcmV0dXJuIGJ1ZjsKPiA+ICt9Cj4gPiArCj4gPiArI2RlZmluZSBN T0RFX1NUUih4KSB7IC5uYW1lID0gI3gsIC5mbGFnID0gRFJNX01PREVfRkxBR18gIyMgeCwgfQo+ ID4gKwo+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgewo+ID4gKwljb25zdCBjaGFyICpuYW1lOwo+ ID4gKwl1MzIgZmxhZzsKPiA+ICt9IG1vZGVfZmxhZ3NbXSA9IHsKPiA+ICsJTU9ERV9TVFIoUEhT WU5DKSwKPiA+ICsJTU9ERV9TVFIoTkhTWU5DKSwKPiA+ICsJTU9ERV9TVFIoUFZTWU5DKSwKPiA+ ICsJTU9ERV9TVFIoTlZTWU5DKSwKPiA+ICsJTU9ERV9TVFIoSU5URVJMQUNFKSwKPiA+ICsJTU9E RV9TVFIoQ1NZTkMpLAo+ID4gKwlNT0RFX1NUUihQQ1NZTkMpLAo+ID4gKwlNT0RFX1NUUihOQ1NZ TkMpLAo+ID4gKwlNT0RFX1NUUihEQkxTQ0FOKSwKPiA+ICsJTU9ERV9TVFIoSFNLRVcpLAo+ID4g KwlNT0RFX1NUUihEQkxDTEspLAo+ID4gKwlNT0RFX1NUUihDTEtESVYyKSwKPiA+ICt9Owo+ID4g Kwo+ID4gKyN1bmRlZiBNT0RFX1NUUgo+ID4gKyNkZWZpbmUgTU9ERV9TVFIoeCkgW0RSTV9NT0RF X0ZMQUdfM0RfICMjIHggPj4gMTRdID0gI3gKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IHN0ZXJlb19mbGFnc1tdID0gewo+ID4gKwlNT0RFX1NUUihOT05FKSwKPiA+ICsJTU9E RV9TVFIoRlJBTUVfUEFDS0lORyksCj4gPiArCU1PREVfU1RSKEZJRUxEX0FMVEVSTkFUSVZFKSwK PiA+ICsJTU9ERV9TVFIoTElORV9BTFRFUk5BVElWRSksCj4gPiArCU1PREVfU1RSKFNJREVfQllf U0lERV9GVUxMKSwKPiA+ICsJTU9ERV9TVFIoTF9ERVBUSCksCj4gPiArCU1PREVfU1RSKExfREVQ VEhfR0ZYX0dGWF9ERVBUSCksCj4gPiArCU1PREVfU1RSKFRPUF9BTkRfQk9UVE9NKSwKPiA+ICsJ TU9ERV9TVFIoU0lERV9CWV9TSURFX0hBTEYpLAo+ID4gK307Cj4gPiArCj4gPiArI3VuZGVmIE1P REVfU1RSCj4gPiArI2RlZmluZSBNT0RFX1NUUih4KSBbRFJNX01PREVfRkxBR19QSUNfQVJfICMj IHggPj4gMTldID0gI3gKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzcGVj dF9mbGFnc1tdID0gewo+ID4gKwlNT0RFX1NUUihOT05FKSwKPiA+ICsJTU9ERV9TVFIoNF8zKSwK PiA+ICsJTU9ERV9TVFIoMTZfOSksCj4gPiArCU1PREVfU1RSKDY0XzI3KSwKPiA+ICsJTU9ERV9T VFIoMjU2XzEzNSksCj4gPiArfTsKPiA+ICsKPiA+ICsjdW5kZWYgTU9ERV9TVFIKPiA+ICsKPiA+ ICtjb25zdCBjaGFyICpkcm1fZ2V0X21vZGVfZmxhZ3NfbmFtZShjaGFyICpidWYsIGludCBsZW4s IHUzMiBmbGFncykKPiA+ICt7Cj4gPiArCWNoYXIgKnB0ciA9IGJ1ZjsKPiA+ICsJaW50IGk7Cj4g PiArCj4gPiArCWlmIChsZW4gPT0gMCkKPiA+ICsJCXJldHVybiBidWY7Cj4gPiArCj4gPiArCWJ1 ZlswXSA9ICdcMCc7Cj4gPiArCj4gPiArCWlmIChmbGFncyAmIERSTV9NT0RFX0ZMQUdfM0RfTUFT Sykgewo+ID4gKwkJaW50IHN0ZXJlbyA9IChmbGFncyAmIERSTV9NT0RFX0ZMQUdfM0RfTUFTSykg Pj4gMTQ7Cj4gPiArCj4gPiArCQlpZiAoc3RlcmVvIDwgQVJSQVlfU0laRShzdGVyZW9fZmxhZ3Mp KSB7Cj4gPiArCQkJZmxhZ3MgJj0gfkRSTV9NT0RFX0ZMQUdfM0RfTUFTSzsKPiA+ICsJCQlwdHIg PSBzbnByaW50X2NvbnQocHRyLCAmbGVuLAo+ID4gKwkJCQkJICAgc3RlcmVvX2ZsYWdzW3N0ZXJl b10sICFmbGFncyk7Cj4gPiArCQl9Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKGZsYWdzICYgRFJN X01PREVfRkxBR19QSUNfQVJfTUFTSykgewo+ID4gKwkJaW50IGFzcGVjdCA9IChmbGFncyAmIERS TV9NT0RFX0ZMQUdfUElDX0FSX01BU0spID4+IDE5Owo+ID4gKwo+ID4gKwkJaWYgKGFzcGVjdCA8 IEFSUkFZX1NJWkUoYXNwZWN0X2ZsYWdzKSkgewo+ID4gKwkJCWZsYWdzICY9IH5EUk1fTU9ERV9G TEFHX1BJQ19BUl9NQVNLOwo+ID4gKwkJCXB0ciA9IHNucHJpbnRfY29udChwdHIsICZsZW4sCj4g PiArCQkJCQkgICBhc3BlY3RfZmxhZ3NbYXNwZWN0XSwgIWZsYWdzKTsKPiA+ICsJCX0KPiA+ICsJ fQo+ID4gKwo+ID4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb2RlX2ZsYWdzKTsgaSsr KSB7Cj4gPiArCQl1MzIgZmxhZyA9IG1vZGVfZmxhZ3NbaV0uZmxhZzsKPiA+ICsKPiA+ICsJCWlm ICgoZmxhZ3MgJiBmbGFnKSA9PSAwKQo+ID4gKwkJCWNvbnRpbnVlOwo+ID4gKwo+ID4gKwkJZmxh Z3MgJj0gfmZsYWc7Cj4gPiArCj4gPiArCQlwdHIgPSBzbnByaW50X2NvbnQocHRyLCAmbGVuLAo+ ID4gKwkJCQkgICBtb2RlX2ZsYWdzW2ldLm5hbWUsICFmbGFncyk7Cj4gPiArCX0KPiA+ICsKPiA+ ICsJaWYgKGZsYWdzKQo+ID4gKwkJcHRyID0gc25wcmludF9jb250KHB0ciwgJmxlbiwgIj8iLCB0 cnVlKTsKPiA+ICsKPiA+ICsJcmV0dXJuIGJ1ZjsKPiA+ICt9Cj4gPiArRVhQT1JUX1NZTUJPTChk cm1fZ2V0X21vZGVfZmxhZ3NfbmFtZSk7Cj4gPiArCj4gPiAgLyoqCj4gPiAgICogZHJtX21vZGVf ZGVidWdfcHJpbnRtb2RlbGluZSAtIHByaW50IGEgbW9kZSB0byBkbWVzZwo+ID4gICAqIEBtb2Rl OiBtb2RlIHRvIHByaW50Cj4gPiBAQCAtNTMsNyArMTY1LDkgQEAKPiA+ICAgKi8KPiA+ICB2b2lk IGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUoY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21v ZGUgKm1vZGUpCj4gPiAgewo+ID4gLQlEUk1fREVCVUdfS01TKCJNb2RlbGluZSAiIERSTV9NT0RF X0ZNVCAiXG4iLCBEUk1fTU9ERV9BUkcobW9kZSkpOwo+ID4gKwljaGFyIGJ1ZltEUk1fTU9ERV9G TEFHU19CVUZfTEVOXTsKPiA+ICsKPiA+ICsJRFJNX0RFQlVHX0tNUygiTW9kZWxpbmUgIiBEUk1f TU9ERV9GTVQgIlxuIiwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ID4gIH0KPiA+ICBFWFBP UlRfU1lNQk9MKGRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUpOwo+ID4gIAo+ID4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKPiA+IGluZGV4IDYyY2YzNGRiOTI4MC4uMThhM2ZmOGUx NDYxIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMK PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVidWdmcy5jCj4gPiBAQCAtMjUz OSwxMiArMjUzOSwxMyBAQCBzdGF0aWMgaW50IGk5MTVfZG1jX2luZm8oc3RydWN0IHNlcV9maWxl ICptLCB2b2lkICp1bnVzZWQpCj4gPiAgc3RhdGljIHZvaWQgaW50ZWxfc2VxX3ByaW50X21vZGUo c3RydWN0IHNlcV9maWxlICptLCBpbnQgdGFicywKPiA+ICAJCQkJIHN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICptb2RlKQo+ID4gIHsKPiA+ICsJY2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVGX0xF Tl07Cj4gPiAgCWludCBpOwo+ID4gIAo+ID4gIAlmb3IgKGkgPSAwOyBpIDwgdGFiczsgaSsrKQo+ ID4gIAkJc2VxX3B1dGMobSwgJ1x0Jyk7Cj4gPiAgCj4gPiAtCXNlcV9wcmludGYobSwgRFJNX01P REVfRk1UICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gPiArCXNlcV9wcmludGYobSwgRFJN X01PREVfRk1UICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiA+ICB9Cj4gPiAgCj4g PiAgc3RhdGljIHZvaWQgaW50ZWxfZW5jb2Rlcl9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwKPiA+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVzb24vbWVzb25fZHdfaGRtaS5jIGIvZHJp dmVycy9ncHUvZHJtL21lc29uL21lc29uX2R3X2hkbWkuYwo+ID4gaW5kZXggZGYzZjlkZGQyMjM0 Li4zMGU1M2EwNDNiYTYgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVzb24vbWVz b25fZHdfaGRtaS5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbWVzb24vbWVzb25fZHdfaGRt aS5jCj4gPiBAQCAtNjEwLDEzICs2MTAsMTQgQEAgZHdfaGRtaV9tb2RlX3ZhbGlkKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiAgCQkgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqbW9kZSkKPiA+ICB7Cj4gPiAgCXN0cnVjdCBtZXNvbl9kcm0gKnByaXYgPSBjb25u ZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7Cj4gPiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JV Rl9MRU5dOwo+ID4gIAl1bnNpZ25lZCBpbnQgdmNsa19mcmVxOwo+ID4gIAl1bnNpZ25lZCBpbnQg dmVuY19mcmVxOwo+ID4gIAl1bnNpZ25lZCBpbnQgaGRtaV9mcmVxOwo+ID4gIAlpbnQgdmljID0g ZHJtX21hdGNoX2NlYV9tb2RlKG1vZGUpOwo+ID4gIAllbnVtIGRybV9tb2RlX3N0YXR1cyBzdGF0 dXM7Cj4gPiAgCj4gPiAtCURSTV9ERUJVR19EUklWRVIoIk1vZGVsaW5lICIgRFJNX01PREVfRk1U ICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gPiArCURSTV9ERUJVR19EUklWRVIoIk1vZGVs aW5lICIgRFJNX01PREVfRk1UICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiA+ICAK PiA+ICAJLyogSWYgc2luayBtYXggVE1EUyBjbG9jaywgd2UgcmVqZWN0IHRoZSBtb2RlICovCj4g PiAgCWlmIChjb25uZWN0b3ItPmRpc3BsYXlfaW5mby5tYXhfdG1kc19jbG9jayAmJgo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZXNvbi9tZXNvbl92ZW5jLmMgYi9kcml2ZXJzL2dw dS9kcm0vbWVzb24vbWVzb25fdmVuYy5jCj4gPiBpbmRleCA3YjdhMGQ4ZDczN2MuLjA5YWNiYzA2 ZjlmMyAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZXNvbi9tZXNvbl92ZW5jLmMK PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZXNvbi9tZXNvbl92ZW5jLmMKPiA+IEBAIC05ODcs OSArOTg3LDExIEBAIHZvaWQgbWVzb25fdmVuY19oZG1pX21vZGVfc2V0KHN0cnVjdCBtZXNvbl9k cm0gKnByaXYsIGludCB2aWMsCj4gPiAgCWlmIChtZXNvbl92ZW5jX2hkbWlfc3VwcG9ydGVkX3Zp Yyh2aWMpKSB7Cj4gPiAgCQl2bW9kZSA9IG1lc29uX3ZlbmNfaGRtaV9nZXRfdmljX3Ztb2RlKHZp Yyk7Cj4gPiAgCQlpZiAoIXZtb2RlKSB7Cj4gPiArCQkJY2hhciBidWZbRFJNX01PREVfRkxBR1Nf QlVGX0xFTl07Cj4gPiArCj4gPiAgCQkJZGV2X2Vycihwcml2LT5kZXYsICIlczogRmF0YWwgRXJy b3IsIHVuc3VwcG9ydGVkIG1vZGUgIgo+ID4gIAkJCQlEUk1fTU9ERV9GTVQgIlxuIiwgX19mdW5j X18sCj4gPiAtCQkJCURSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gPiArCQkJCURSTV9NT0RFX0FSRyht b2RlLCBidWYpKTsKPiA+ICAJCQlyZXR1cm47Cj4gPiAgCQl9Cj4gPiAgCX0gZWxzZSB7Cj4gPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9jcnRjLmMgYi9k cml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNC9tZHA0X2NydGMuYwo+ID4gaW5kZXggMGNmZDRj MDZiNjEwLi5mNjhkOWY3NGIwZTQgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNt L2Rpc3AvbWRwNC9tZHA0X2NydGMuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNw L21kcDQvbWRwNF9jcnRjLmMKPiA+IEBAIC0yMzgsNiArMjM4LDcgQEAgc3RhdGljIHZvaWQgbWRw NF9jcnRjX21vZGVfc2V0X25vZmIoc3RydWN0IGRybV9jcnRjICpjcnRjKQo+ID4gIAllbnVtIG1k cDRfZG1hIGRtYSA9IG1kcDRfY3J0Yy0+ZG1hOwo+ID4gIAlpbnQgb3ZscCA9IG1kcDRfY3J0Yy0+ b3ZscDsKPiA+ICAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7Cj4gPiArCWNoYXIgYnVm W0RSTV9NT0RFX0ZMQUdTX0JVRl9MRU5dOwo+ID4gIAo+ID4gIAlpZiAoV0FSTl9PTighY3J0Yy0+ c3RhdGUpKQo+ID4gIAkJcmV0dXJuOwo+ID4gQEAgLTI0NSw3ICsyNDYsNyBAQCBzdGF0aWMgdm9p ZCBtZHA0X2NydGNfbW9kZV9zZXRfbm9mYihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCj4gPiAgCW1v ZGUgPSAmY3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGU7Cj4gPiAgCj4gPiAgCURCRygiJXM6IHNl dCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwKPiA+IC0JCQltZHA0X2NydGMtPm5hbWUsIERSTV9NT0RF X0FSRyhtb2RlKSk7Cj4gPiArCSAgICBtZHA0X2NydGMtPm5hbWUsIERSTV9NT0RFX0FSRyhtb2Rl LCBidWYpKTsKPiA+ICAKPiA+ICAJbWRwNF93cml0ZShtZHA0X2ttcywgUkVHX01EUDRfRE1BX1NS Q19TSVpFKGRtYSksCj4gPiAgCQkJTURQNF9ETUFfU1JDX1NJWkVfV0lEVEgobW9kZS0+aGRpc3Bs YXkpIHwKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNC9tZHA0 X2RzaV9lbmNvZGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNC9tZHA0X2RzaV9l bmNvZGVyLmMKPiA+IGluZGV4IGNhYTM5YjQ2MjFlMy4uMmUwZGNhNGQyNDg0IDEwMDY0NAo+ID4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kc2lfZW5jb2Rlci5jCj4g PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNC9tZHA0X2RzaV9lbmNvZGVyLmMK PiA+IEBAIC01NSwxMCArNTUsMTEgQEAgc3RhdGljIHZvaWQgbWRwNF9kc2lfZW5jb2Rlcl9tb2Rl X3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCj4gPiAgCXVpbnQzMl90IGRzaV9oc3lu Y19za2V3LCB2c3luY19wZXJpb2QsIHZzeW5jX2xlbiwgY3RybF9wb2w7Cj4gPiAgCXVpbnQzMl90 IGRpc3BsYXlfdl9zdGFydCwgZGlzcGxheV92X2VuZDsKPiA+ICAJdWludDMyX3QgaHN5bmNfc3Rh cnRfeCwgaHN5bmNfZW5kX3g7Cj4gPiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JVRl9MRU5d Owo+ID4gIAo+ID4gIAltb2RlID0gYWRqdXN0ZWRfbW9kZTsKPiA+ICAKPiA+IC0JREJHKCJzZXQg bW9kZTogIiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gPiArCURCRygic2V0 IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSwgYnVmKSk7Cj4gPiAgCj4g PiAgCWN0cmxfcG9sID0gMDsKPiA+ICAJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19O SFNZTkMpCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRw NF9kdHZfZW5jb2Rlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kdHZf ZW5jb2Rlci5jCj4gPiBpbmRleCAyNTlkNTE5NzE0MDEuLmU4OGFjMDcwYTY3MiAxMDA2NDQKPiA+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA0L21kcDRfZHR2X2VuY29kZXIuYwo+ ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDQvbWRwNF9kdHZfZW5jb2Rlci5j Cj4gPiBAQCAtMTAxLDEwICsxMDEsMTEgQEAgc3RhdGljIHZvaWQgbWRwNF9kdHZfZW5jb2Rlcl9t b2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCj4gPiAgCXVpbnQzMl90IGR0dl9o c3luY19za2V3LCB2c3luY19wZXJpb2QsIHZzeW5jX2xlbiwgY3RybF9wb2w7Cj4gPiAgCXVpbnQz Ml90IGRpc3BsYXlfdl9zdGFydCwgZGlzcGxheV92X2VuZDsKPiA+ICAJdWludDMyX3QgaHN5bmNf c3RhcnRfeCwgaHN5bmNfZW5kX3g7Cj4gPiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JVRl9M RU5dOwo+ID4gIAo+ID4gIAltb2RlID0gYWRqdXN0ZWRfbW9kZTsKPiA+ICAKPiA+IC0JREJHKCJz ZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gPiArCURCRygi c2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSwgYnVmKSk7Cj4gPiAg Cj4gPiAgCW1kcDRfZHR2X2VuY29kZXItPnBpeGNsb2NrID0gbW9kZS0+Y2xvY2sgKiAxMDAwOwo+ ID4gIAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA0L21kcDRf bGNkY19lbmNvZGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNC9tZHA0X2xjZGNf ZW5jb2Rlci5jCj4gPiBpbmRleCBkZjZmOTgwM2ExZDcuLjk5YmRhZTljOTQ1YiAxMDA2NDQKPiA+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA0L21kcDRfbGNkY19lbmNvZGVyLmMK PiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA0L21kcDRfbGNkY19lbmNvZGVy LmMKPiA+IEBAIC0yNzAsMTAgKzI3MCwxMSBAQCBzdGF0aWMgdm9pZCBtZHA0X2xjZGNfZW5jb2Rl cl9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCj4gPiAgCXVpbnQzMl90IGxj ZGNfaHN5bmNfc2tldywgdnN5bmNfcGVyaW9kLCB2c3luY19sZW4sIGN0cmxfcG9sOwo+ID4gIAl1 aW50MzJfdCBkaXNwbGF5X3Zfc3RhcnQsIGRpc3BsYXlfdl9lbmQ7Cj4gPiAgCXVpbnQzMl90IGhz eW5jX3N0YXJ0X3gsIGhzeW5jX2VuZF94Owo+ID4gKwljaGFyIGJ1ZltEUk1fTU9ERV9GTEFHU19C VUZfTEVOXTsKPiA+ICAKPiA+ICAJbW9kZSA9IGFkanVzdGVkX21vZGU7Cj4gPiAgCj4gPiAtCURC Rygic2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSkpOwo+ID4gKwlE QkcoInNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ ID4gIAo+ID4gIAltZHA0X2xjZGNfZW5jb2Rlci0+cGl4Y2xvY2sgPSBtb2RlLT5jbG9jayAqIDEw MDA7Cj4gPiAgCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDUv bWRwNV9jbWRfZW5jb2Rlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDUvbWRwNV9j bWRfZW5jb2Rlci5jCj4gPiBpbmRleCBlZWVmNDFmY2Q0ZTEuLjZiZmZiZWJlZThiYiAxMDA2NDQK PiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY21kX2VuY29kZXIu Ywo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDUvbWRwNV9jbWRfZW5jb2Rl ci5jCj4gPiBAQCAtMTI0LDkgKzEyNCwxMSBAQCB2b2lkIG1kcDVfY21kX2VuY29kZXJfbW9kZV9z ZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAo+ID4gIAkJCSAgICAgICBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiA+ICAJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21v ZGUgKmFkanVzdGVkX21vZGUpCj4gPiAgewo+ID4gKwljaGFyIGJ1ZltEUk1fTU9ERV9GTEFHU19C VUZfTEVOXTsKPiA+ICsKPiA+ICAJbW9kZSA9IGFkanVzdGVkX21vZGU7Cj4gPiAgCj4gPiAtCURC Rygic2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSkpOwo+ID4gKwlE QkcoInNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ ID4gIAlwaW5ncG9uZ190ZWFyY2hlY2tfc2V0dXAoZW5jb2RlciwgbW9kZSk7Cj4gPiAgCW1kcDVf Y3J0Y19zZXRfcGlwZWxpbmUoZW5jb2Rlci0+Y3J0Yyk7Cj4gPiAgfQo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVfY3J0Yy5jIGIvZHJpdmVycy9ncHUv ZHJtL21zbS9kaXNwL21kcDUvbWRwNV9jcnRjLmMKPiA+IGluZGV4IGMzNzUxYzk1YjQ1Mi4uODg4 YTI1ZDFkYThiIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kaXNwL21kcDUv bWRwNV9jcnRjLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21kcDVf Y3J0Yy5jCj4gPiBAQCAtMzc4LDEzICszNzgsMTQgQEAgc3RhdGljIHZvaWQgbWRwNV9jcnRjX21v ZGVfc2V0X25vZmIoc3RydWN0IGRybV9jcnRjICpjcnRjKQo+ID4gIAl1MzIgbWl4ZXJfd2lkdGgs IHZhbDsKPiA+ICAJdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+ICAJc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGU7Cj4gPiArCWNoYXIgYnVmW0RSTV9NT0RFX0ZMQUdTX0JVRl9MRU5dOwo+ID4g IAo+ID4gIAlpZiAoV0FSTl9PTighY3J0Yy0+c3RhdGUpKQo+ID4gIAkJcmV0dXJuOwo+ID4gIAo+ ID4gIAltb2RlID0gJmNydGMtPnN0YXRlLT5hZGp1c3RlZF9tb2RlOwo+ID4gIAo+ID4gLQlEQkco IiVzOiBzZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQsIGNydGMtPm5hbWUsIERSTV9NT0RFX0FSRyht b2RlKSk7Cj4gPiArCURCRygiJXM6IHNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgY3J0Yy0+bmFt ZSwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ID4gIAo+ID4gIAltaXhlcl93aWR0aCA9IG1v ZGUtPmhkaXNwbGF5Owo+ID4gIAlpZiAocl9taXhlcikKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vbXNtL2Rpc3AvbWRwNS9tZHA1X2VuY29kZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9t c20vZGlzcC9tZHA1L21kcDVfZW5jb2Rlci5jCj4gPiBpbmRleCA4MjBhNjJjNDAwNjMuLjgwOTEx OGJiNjk2NSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9tZHA1L21k cDVfZW5jb2Rlci5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvbWRwNS9tZHA1 X2VuY29kZXIuYwo+ID4gQEAgLTExNSwxMCArMTE1LDExIEBAIHN0YXRpYyB2b2lkIG1kcDVfdmlk X2VuY29kZXJfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAo+ID4gIAl1aW50 MzJfdCBoc3luY19zdGFydF94LCBoc3luY19lbmRfeDsKPiA+ICAJdWludDMyX3QgZm9ybWF0ID0g MHgyMTAwOwo+ID4gIAl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4gKwljaGFyIGJ1ZltEUk1fTU9E RV9GTEFHU19CVUZfTEVOXTsKPiA+ICAKPiA+ICAJbW9kZSA9IGFkanVzdGVkX21vZGU7Cj4gPiAg Cj4gPiAtCURCRygic2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSkp Owo+ID4gKwlEQkcoInNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUs IGJ1ZikpOwo+ID4gIAo+ID4gIAljdHJsX3BvbCA9IDA7Cj4gPiAgCj4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9t c20vZHNpL2RzaV9tYW5hZ2VyLmMKPiA+IGluZGV4IGVjNmNiMGY3ZjIwNi4uMWJmMmY1MDNiODRi IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYwo+ ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYwo+ID4gQEAgLTUy Nyw4ICs1MjcsOSBAQCBzdGF0aWMgdm9pZCBkc2lfbWdyX2JyaWRnZV9tb2RlX3NldChzdHJ1Y3Qg ZHJtX2JyaWRnZSAqYnJpZGdlLAo+ID4gIAlzdHJ1Y3QgbXNtX2RzaSAqb3RoZXJfZHNpID0gZHNp X21ncl9nZXRfb3RoZXJfZHNpKGlkKTsKPiA+ICAJc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3Qg PSBtc21fZHNpLT5ob3N0Owo+ID4gIAlib29sIGlzX2R1YWxfZHNpID0gSVNfRFVBTF9EU0koKTsK PiA+ICsJY2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gPiAgCj4gPiAtCURCRygi c2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSkpOwo+ID4gKwlEQkco InNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ID4g IAo+ID4gIAlpZiAoaXNfZHVhbF9kc2kgJiYgIUlTX01BU1RFUl9EU0lfTElOSyhpZCkpCj4gPiAg CQlyZXR1cm47Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9lZHAvZWRwX2Jy aWRnZS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9lZHAvZWRwX2JyaWRnZS5jCj4gPiBpbmRleCAy OTUwYmJhNGFjYTkuLjA4NDQzNDU4NjJlZiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9tc20vZWRwL2VkcF9icmlkZ2UuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9lZHAv ZWRwX2JyaWRnZS5jCj4gPiBAQCAtNTEsOCArNTEsOSBAQCBzdGF0aWMgdm9pZCBlZHBfYnJpZGdl X21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gPiAgCXN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3I7Cj4gPiAgCXN0cnVjdCBlZHBfYnJpZGdlICplZHBfYnJpZGdlID0g dG9fZWRwX2JyaWRnZShicmlkZ2UpOwo+ID4gIAlzdHJ1Y3QgbXNtX2VkcCAqZWRwID0gZWRwX2Jy aWRnZS0+ZWRwOwo+ID4gKwljaGFyIGJ1ZltEUk1fTU9ERV9GTEFHU19CVUZfTEVOXTsKPiA+ICAK PiA+IC0JREJHKCJzZXQgbW9kZTogIiBEUk1fTU9ERV9GTVQsIERSTV9NT0RFX0FSRyhtb2RlKSk7 Cj4gPiArCURCRygic2V0IG1vZGU6ICIgRFJNX01PREVfRk1ULCBEUk1fTU9ERV9BUkcobW9kZSwg YnVmKSk7Cj4gPiAgCj4gPiAgCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5t b2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewo+ID4gIAkJaWYgKChjb25uZWN0b3It PmVuY29kZXIgIT0gTlVMTCkgJiYKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vb21h cGRybS9vbWFwX2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9ncHUvZHJtL29tYXBkcm0vb21hcF9jb25u ZWN0b3IuYwo+ID4gaW5kZXggNTk2NzI4MzkzNGUxLi40Y2UyOTI4OGM3MGUgMTAwNjQ0Cj4gPiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2Nvbm5lY3Rvci5jCj4gPiArKysgYi9k cml2ZXJzL2dwdS9kcm0vb21hcGRybS9vbWFwX2Nvbm5lY3Rvci5jCj4gPiBAQCAtMjc2LDYgKzI3 Niw3IEBAIHN0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cyBvbWFwX2Nvbm5lY3Rvcl9tb2RlX3Zh bGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uCj4gPiAgCXN0cnVjdCBvbWFwX2Nvbm5lY3Rv ciAqb21hcF9jb25uZWN0b3IgPSB0b19vbWFwX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwo+ID4gIAlz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBuZXdfbW9kZSA9IHsgeyAwIH0gfTsKPiA+ICAJZW51bSBk cm1fbW9kZV9zdGF0dXMgc3RhdHVzOwo+ID4gKwljaGFyIGJ1ZltEUk1fTU9ERV9GTEFHU19CVUZf TEVOXTsKPiA+ICAKPiA+ICAJc3RhdHVzID0gb21hcF9jb25uZWN0b3JfbW9kZV9maXh1cChvbWFw X2Nvbm5lY3Rvci0+b3V0cHV0LCBtb2RlLAo+ID4gIAkJCQkJICAgJm5ld19tb2RlKTsKPiA+IEBA IC0yODgsOCArMjg5LDggQEAgc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzIG9tYXBfY29ubmVj dG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4KPiA+ICAKPiA+ICBkb25l Ogo+ID4gIAlEQkcoImNvbm5lY3RvcjogbW9kZSAlczogIiBEUk1fTU9ERV9GTVQsCj4gPiAtCQkJ KHN0YXR1cyA9PSBNT0RFX09LKSA/ICJ2YWxpZCIgOiAiaW52YWxpZCIsCj4gPiAtCQkJRFJNX01P REVfQVJHKG1vZGUpKTsKPiA+ICsJICAgIChzdGF0dXMgPT0gTU9ERV9PSykgPyAidmFsaWQiIDog ImludmFsaWQiLAo+ID4gKwkgICAgRFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ID4gIAo+ID4g IAlyZXR1cm4gc3RhdHVzOwo+ID4gIH0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v b21hcGRybS9vbWFwX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY3J0Yy5j Cj4gPiBpbmRleCBkNjEyMTU0OTQ2MTcuLjIyMTQ1OWQ2YWJlOSAxMDA2NDQKPiA+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9vbWFwZHJtL29tYXBfY3J0Yy5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vb21hcGRybS9vbWFwX2NydGMuYwo+ID4gQEAgLTU1Myw5ICs1NTMsMTAgQEAgc3RhdGljIHZv aWQgb21hcF9jcnRjX21vZGVfc2V0X25vZmIoc3RydWN0IGRybV9jcnRjICpjcnRjKQo+ID4gIHsK PiA+ICAJc3RydWN0IG9tYXBfY3J0YyAqb21hcF9jcnRjID0gdG9fb21hcF9jcnRjKGNydGMpOwo+ ID4gIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZjcnRjLT5zdGF0ZS0+YWRqdXN0 ZWRfbW9kZTsKPiA+ICsJY2hhciBidWZbRFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gPiAgCj4g PiAgCURCRygiJXM6IHNldCBtb2RlOiAiIERSTV9NT0RFX0ZNVCwKPiA+IC0JICAgIG9tYXBfY3J0 Yy0+bmFtZSwgRFJNX01PREVfQVJHKG1vZGUpKTsKPiA+ICsJICAgIG9tYXBfY3J0Yy0+bmFtZSwg RFJNX01PREVfQVJHKG1vZGUsIGJ1ZikpOwo+ID4gIAo+ID4gIAlkcm1fZGlzcGxheV9tb2RlX3Rv X3ZpZGVvbW9kZShtb2RlLCAmb21hcF9jcnRjLT52bSk7Cj4gPiAgfQo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1yb25iby1yYjA3MGQzMC5jIGIvZHJpdmVycy9n cHUvZHJtL3BhbmVsL3BhbmVsLXJvbmJvLXJiMDcwZDMwLmMKPiA+IGluZGV4IDNjMTU3NjRmMGMw My4uNDY4ZWJkY2E5NGY0IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL3Bh bmVsLXJvbmJvLXJiMDcwZDMwLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5l bC1yb25iby1yYjA3MGQzMC5jCj4gPiBAQCAtMTI2LDEyICsxMjYsMTMgQEAgc3RhdGljIGludCBy YjA3MGQzMF9wYW5lbF9nZXRfbW9kZXMoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCj4gPiAgCXN0 cnVjdCByYjA3MGQzMF9wYW5lbCAqY3R4ID0gcGFuZWxfdG9fcmIwNzBkMzBfcGFuZWwocGFuZWwp Owo+ID4gIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKPiA+ICAJc3RhdGljIGNvbnN0 IHUzMiBidXNfZm9ybWF0ID0gTUVESUFfQlVTX0ZNVF9SR0I4ODhfMVgyNDsKPiA+ICsJY2hhciBi dWZbRFJNX01PREVfRkxBR1NfQlVGX0xFTl07Cj4gPiAgCj4gPiAgCW1vZGUgPSBkcm1fbW9kZV9k dXBsaWNhdGUocGFuZWwtPmRybSwgJmRlZmF1bHRfbW9kZSk7Cj4gPiAgCWlmICghbW9kZSkgewo+ ID4gIAkJRFJNX0RFVl9FUlJPUigmY3R4LT5kc2ktPmRldiwKPiA+ICAJCQkgICAgICAiRmFpbGVk IHRvIGFkZCBtb2RlICIgRFJNX01PREVfRk1UICJcbiIsCj4gPiAtCQkJICAgICAgRFJNX01PREVf QVJHKCZkZWZhdWx0X21vZGUpKTsKPiA+ICsJCQkgICAgICBEUk1fTU9ERV9BUkcoJmRlZmF1bHRf bW9kZSwgYnVmKSk7Cj4gPiAgCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICAJfQo+ID4gIAo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9zdGkvc3RpX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9zdGkvc3RpX2NydGMuYwo+ID4gaW5kZXggZGM2NGZiZmM0ZTYxLi5iYzk2MDJmNTE5ZDcgMTAw NjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vc3RpL3N0aV9jcnRjLmMKPiA+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9zdGkvc3RpX2NydGMuYwo+ID4gQEAgLTU0LDExICs1NCwxMiBAQCBzdGlf Y3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICptb2RlKQo+ID4gIAlzdHJ1Y3Qgc3RpX2NvbXBvc2l0b3IgKmNvbXBvID0gZGV2X2dldF9k cnZkYXRhKGRldik7Cj4gPiAgCXN0cnVjdCBjbGsgKmNvbXBvX2NsaywgKnBpeF9jbGs7Cj4gPiAg CWludCByYXRlID0gbW9kZS0+Y2xvY2sgKiAxMDAwOwo+ID4gKwljaGFyIGJ1ZltEUk1fTU9ERV9G TEFHU19CVUZfTEVOXTsKPiA+ICAKPiA+ICAJRFJNX0RFQlVHX0tNUygiQ1JUQzolZCAoJXMpIG1v ZGU6ICglcylcbiIsCj4gPiAgCQkgICAgICBjcnRjLT5iYXNlLmlkLCBzdGlfbWl4ZXJfdG9fc3Ry KG1peGVyKSwgbW9kZS0+bmFtZSk7Cj4gPiAgCj4gPiAtCURSTV9ERUJVR19LTVMoRFJNX01PREVf Rk1UICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlKSk7Cj4gPiArCURSTV9ERUJVR19LTVMoRFJNX01P REVfRk1UICJcbiIsIERSTV9NT0RFX0FSRyhtb2RlLCBidWYpKTsKPiA+ICAKPiA+ICAJaWYgKG1p eGVyLT5pZCA9PSBTVElfTUlYRVJfTUFJTikgewo+ID4gIAkJY29tcG9fY2xrID0gY29tcG8tPmNs a19jb21wb19tYWluOwo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2Rlcy5oIGIv aW5jbHVkZS9kcm0vZHJtX21vZGVzLmgKPiA+IGluZGV4IDA4M2YxNjc0NzM2OS4uMzk2MmRiZjgy MTAwIDEwMDY0NAo+ID4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21vZGVzLmgKPiA+ICsrKyBiL2lu Y2x1ZGUvZHJtL2RybV9tb2Rlcy5oCj4gPiBAQCAtNDI4LDIwICs0MjgsMjcgQEAgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgewo+ID4gIAlzdHJ1Y3QgbGlzdF9oZWFkIGV4cG9ydF9oZWFkOwo+ID4g IH07Cj4gPiAgCj4gPiArLyoqCj4gPiArICogRFJNX01PREVfRkxBR1NfQlVGX0xFTiAtIHJlYXNv bmFibGUgc2l6ZSBmb3IgdGhlIGJ1ZmZlciBwYXNzZWQgdG8gRFJNX01PREVfQVJHKCkKPiA+ICsg Ki8KPiA+ICsjZGVmaW5lIERSTV9NT0RFX0ZMQUdTX0JVRl9MRU4gNjQKPiA+ICsKPiA+ICAvKioK PiA+ICAgKiBEUk1fTU9ERV9GTVQgLSBwcmludGYgc3RyaW5nIGZvciAmc3RydWN0IGRybV9kaXNw bGF5X21vZGUKPiA+ICAgKi8KPiA+IC0jZGVmaW5lIERSTV9NT0RFX0ZNVCAgICAiXCIlc1wiOiAl ZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAweCV4IDB4JXgiCj4gPiArI2RlZmluZSBEUk1f TU9ERV9GTVQgICAgIlwiJXNcIjogJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgMHgleCAw eCV4ICVzIgo+ID4gIAo+ID4gIC8qKgo+ID4gICAqIERSTV9NT0RFX0FSRyAtIHByaW50ZiBhcmd1 bWVudHMgZm9yICZzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZQo+ID4gICAqIEBtOiBkaXNwbGF5IG1v ZGUKPiA+ICsgKiBAYjogYnVmZmVyIGZvciB0ZW1wb3Jhcnkgc3RyaW5nCj4gPiAgICovCj4gPiAt I2RlZmluZSBEUk1fTU9ERV9BUkcobSkgXAo+ID4gKyNkZWZpbmUgRFJNX01PREVfQVJHKG0sIGIp IFwKPiA+ICAJKG0pLT5uYW1lLCAobSktPnZyZWZyZXNoLCAobSktPmNsb2NrLCBcCj4gPiAgCSht KS0+aGRpc3BsYXksIChtKS0+aHN5bmNfc3RhcnQsIChtKS0+aHN5bmNfZW5kLCAobSktPmh0b3Rh bCwgXAo+ID4gIAkobSktPnZkaXNwbGF5LCAobSktPnZzeW5jX3N0YXJ0LCAobSktPnZzeW5jX2Vu ZCwgKG0pLT52dG90YWwsIFwKPiA+IC0JKG0pLT50eXBlLCAobSktPmZsYWdzCj4gPiArCShtKS0+ dHlwZSwgKG0pLT5mbGFncywgXAo+ID4gKwlkcm1fZ2V0X21vZGVfZmxhZ3NfbmFtZShiLCBzaXpl b2YoYiksIChtKS0+ZmxhZ3MpCj4gPiAgCj4gPiAgI2RlZmluZSBvYmpfdG9fbW9kZSh4KSBjb250 YWluZXJfb2YoeCwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUsIGJhc2UpCj4gPiAgCj4gPiBAQCAt NTQyLDUgKzU0OSw2IEBAIGRybV9tb2RlX3BhcnNlX2NvbW1hbmRfbGluZV9mb3JfY29ubmVjdG9y KGNvbnN0IGNoYXIgKm1vZGVfb3B0aW9uLAo+ID4gIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICoK PiA+ICBkcm1fbW9kZV9jcmVhdGVfZnJvbV9jbWRsaW5lX21vZGUoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwKPiA+ICAJCQkJICBzdHJ1Y3QgZHJtX2NtZGxpbmVfbW9kZSAqY21kKTsKPiA+ICtjb25z dCBjaGFyICpkcm1fZ2V0X21vZGVfZmxhZ3NfbmFtZShjaGFyICpidWYsIGludCBsZW4sIHUzMiBm bGFncyk7Cj4gPiAgCj4gPiAgI2VuZGlmIC8qIF9fRFJNX01PREVTX0hfXyAqLwo+ID4gLS0gCj4g PiAyLjIxLjAKCi0tIApWaWxsZSBTeXJqw6Rsw6QKSW50ZWwKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KRnJlZWRyZW5vIG1haWxpbmcgbGlzdApGcmVlZHJl bm9AbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZnJlZWRyZW5v