From mboxrd@z Thu Jan 1 00:00:00 1970 From: seanpaul@chromium.org (Sean Paul) Date: Thu, 22 Dec 2016 09:56:01 -0500 Subject: [PATCH v2] drm: zte: add overlay plane support In-Reply-To: <1482235795-6223-1-git-send-email-shawnguo@kernel.org> References: <1482235795-6223-1-git-send-email-shawnguo@kernel.org> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Tue, Dec 20, 2016 at 7:09 AM, Shawn Guo wrote: > From: Shawn Guo > > It enables VOU VL (Video Layer) to support overlay plane with scaling > function. VL0 has some quirks on scaling support. We chose to skip it > and only adds VL1 and VL2 into DRM core for now. > > Signed-off-by: Shawn Guo > --- > Changes for v2: > - Use clipped coordinates for overlay position calculation > > drivers/gpu/drm/zte/zx_plane.c | 293 ++++++++++++++++++++++++++++++++++-- > drivers/gpu/drm/zte/zx_plane_regs.h | 51 +++++++ > drivers/gpu/drm/zte/zx_vou.c | 149 +++++++++++++++++- > drivers/gpu/drm/zte/zx_vou.h | 3 + > drivers/gpu/drm/zte/zx_vou_regs.h | 18 +++ > 5 files changed, 497 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c > index 546eb92a94e8..8cd7cf71b2b0 100644 > --- a/drivers/gpu/drm/zte/zx_plane.c > +++ b/drivers/gpu/drm/zte/zx_plane.c > @@ -40,6 +40,269 @@ struct zx_plane { > DRM_FORMAT_ARGB4444, > }; > > +static const uint32_t vl_formats[] = { > + DRM_FORMAT_NV12, /* Semi-planar YUV420 */ > + DRM_FORMAT_YUV420, /* Planar YUV420 */ > + DRM_FORMAT_YUYV, /* Packed YUV422 */ > + DRM_FORMAT_YVYU, > + DRM_FORMAT_UYVY, > + DRM_FORMAT_VYUY, > + DRM_FORMAT_YUV444, /* YUV444 8bit */ > + /* > + * TODO: add formats below that HW supports: > + * - YUV420 P010 > + * - YUV420 Hantro > + * - YUV444 10bit > + */ > +}; > + > +#define FRAC_16_16(mult, div) (((mult) << 16) / (div)) > + > +static int zx_vl_plane_atomic_check(struct drm_plane *plane, > + struct drm_plane_state *plane_state) > +{ > + struct drm_framebuffer *fb = plane_state->fb; > + struct drm_crtc *crtc = plane_state->crtc; > + struct drm_crtc_state *crtc_state; > + struct drm_rect clip; > + int min_scale = FRAC_16_16(1, 8); > + int max_scale = FRAC_16_16(8, 1); > + > + if (!crtc || !fb) > + return 0; > + > + crtc_state = drm_atomic_get_existing_crtc_state(plane_state->state, > + crtc); > + if (WARN_ON(!crtc_state)) > + return -EINVAL; > + > + /* nothing to check when disabling or disabled */ > + if (!crtc_state->enable) > + return 0; > + > + /* plane must be enabled */ > + if (!plane_state->crtc) > + return -EINVAL; > + > + clip.x1 = 0; > + clip.y1 = 0; > + clip.x2 = crtc_state->adjusted_mode.hdisplay; > + clip.y2 = crtc_state->adjusted_mode.vdisplay; > + > + return drm_plane_helper_check_state(plane_state, &clip, > + min_scale, max_scale, > + true, true); > +} > + > +static u32 zx_vl_get_fmt(uint32_t format) > +{ > + u32 val = 0; > + > + switch (format) { > + case DRM_FORMAT_NV12: > + val = VL_FMT_YUV420; > + break; > + case DRM_FORMAT_YUV420: > + val = VL_YUV420_PLANAR | VL_FMT_YUV420; > + break; > + case DRM_FORMAT_YUYV: > + val = VL_YUV422_YUYV | VL_FMT_YUV422; > + break; > + case DRM_FORMAT_YVYU: > + val = VL_YUV422_YVYU | VL_FMT_YUV422; > + break; > + case DRM_FORMAT_UYVY: > + val = VL_YUV422_UYVY | VL_FMT_YUV422; > + break; > + case DRM_FORMAT_VYUY: > + val = VL_YUV422_VYUY | VL_FMT_YUV422; > + break; > + case DRM_FORMAT_YUV444: > + val = VL_FMT_YUV444_8BIT; > + break; > + default: > + WARN_ONCE(1, "invalid pixel format %d\n", format); > + } > + > + return val; > +} > + > +static inline void zx_vl_set_update(struct zx_plane *zplane) > +{ > + void __iomem *layer = zplane->layer; > + > + zx_writel_mask(layer + VL_CTRL0, VL_UPDATE, VL_UPDATE); > +} > + > +static inline void zx_vl_rsz_set_update(struct zx_plane *zplane) > +{ > + zx_writel(zplane->rsz + RSZ_VL_ENABLE_CFG, 1); > +} > + > +static u32 zx_vl_rsz_get_fmt(uint32_t format) > +{ > + u32 val = 0; > + > + switch (format) { > + case DRM_FORMAT_NV12: > + case DRM_FORMAT_YUV420: > + val = RSZ_VL_FMT_YCBCR420; > + break; > + case DRM_FORMAT_YUYV: > + case DRM_FORMAT_YVYU: > + case DRM_FORMAT_UYVY: > + case DRM_FORMAT_VYUY: > + val = RSZ_VL_FMT_YCBCR422; > + break; > + case DRM_FORMAT_YUV444: > + val = RSZ_VL_FMT_YCBCR444; > + break; > + default: > + WARN_ONCE(1, "invalid pixel format %d\n", format); > + } > + > + return val; > +} > + > +static inline u32 rsz_step_value(u32 src, u32 dst) > +{ > + u32 val = 0; > + > + if (src == dst) > + val = 0; > + else if (src < dst) > + val = RSZ_PARA_STEP((src << 16) / dst); > + else if (src > dst) > + val = RSZ_DATA_STEP(src / dst) | > + RSZ_PARA_STEP(((src << 16) / dst) & 0xffff); > + > + return val; > +} > + > +static void zx_vl_rsz_setup(struct zx_plane *zplane, uint32_t format, > + u32 src_w, u32 src_h, u32 dst_w, u32 dst_h) > +{ > + void __iomem *rsz = zplane->rsz; > + u32 src_chroma_w = src_w; > + u32 src_chroma_h = src_h; > + u32 fmt; > + > + /* Set up source and destination resolution */ > + zx_writel(rsz + RSZ_SRC_CFG, RSZ_VER(src_h - 1) | RSZ_HOR(src_w - 1)); > + zx_writel(rsz + RSZ_DEST_CFG, RSZ_VER(dst_h - 1) | RSZ_HOR(dst_w - 1)); > + > + /* Configure data format for VL RSZ */ > + fmt = zx_vl_rsz_get_fmt(format); > + zx_writel_mask(rsz + RSZ_VL_CTRL_CFG, RSZ_VL_FMT_MASK, fmt); > + > + /* Calculate Chroma heigth and width */ > + if (fmt == RSZ_VL_FMT_YCBCR420) { > + src_chroma_w = src_w >> 1; > + src_chroma_h = src_h >> 1; > + } else if (fmt == RSZ_VL_FMT_YCBCR422) { > + src_chroma_w = src_w >> 1; > + } > + > + /* Set up Luma and Chroma step registers */ > + zx_writel(rsz + RSZ_VL_LUMA_HOR, rsz_step_value(src_w, dst_w)); > + zx_writel(rsz + RSZ_VL_LUMA_VER, rsz_step_value(src_h, dst_h)); > + zx_writel(rsz + RSZ_VL_CHROMA_HOR, rsz_step_value(src_chroma_w, dst_w)); > + zx_writel(rsz + RSZ_VL_CHROMA_VER, rsz_step_value(src_chroma_h, dst_h)); > + > + zx_vl_rsz_set_update(zplane); > +} > + > +static void zx_vl_plane_atomic_update(struct drm_plane *plane, > + struct drm_plane_state *old_state) > +{ > + struct zx_plane *zplane = to_zx_plane(plane); > + struct drm_plane_state *state = plane->state; > + struct drm_framebuffer *fb = state->fb; > + struct drm_rect *src = &state->src; > + struct drm_rect *dst = &state->dst; > + struct drm_gem_cma_object *cma_obj; > + void __iomem *layer = zplane->layer; > + void __iomem *hbsc = zplane->hbsc; > + void __iomem *paddr_reg; > + dma_addr_t paddr; > + u32 src_x, src_y, src_w, src_h; > + u32 dst_x, dst_y, dst_w, dst_h; > + uint32_t format; > + u32 fmt; > + int num_planes; > + int i; > + > + if (!fb) > + return; > + > + format = fb->pixel_format; > + > + src_x = src->x1 >> 16; > + src_y = src->y1 >> 16; > + src_w = drm_rect_width(src) >> 16; > + src_h = drm_rect_height(src) >> 16; > + > + dst_x = dst->x1; > + dst_y = dst->y1; > + dst_w = drm_rect_width(dst); > + dst_h = drm_rect_height(dst); > + > + /* Set up data address registers for Y, Cb and Cr planes */ > + num_planes = drm_format_num_planes(format); > + paddr_reg = layer + VL_Y; > + for (i = 0; i < num_planes; i++) { > + cma_obj = drm_fb_cma_get_gem_obj(fb, i); > + paddr = cma_obj->paddr + fb->offsets[i]; > + paddr += src_y * fb->pitches[i]; > + paddr += src_x * drm_format_plane_cpp(format, i); > + zx_writel(paddr_reg, paddr); > + paddr_reg += 4; > + } > + > + /* Set up source height/width register */ > + zx_writel(layer + VL_SRC_SIZE, GL_SRC_W(src_w) | GL_SRC_H(src_h)); > + > + /* Set up start position register */ > + zx_writel(layer + VL_POS_START, GL_POS_X(dst_x) | GL_POS_Y(dst_y)); > + > + /* Set up end position register */ > + zx_writel(layer + VL_POS_END, > + GL_POS_X(dst_x + dst_w) | GL_POS_Y(dst_y + dst_h)); > + > + /* Strides of Cb and Cr planes should be identical */ > + zx_writel(layer + VL_STRIDE, LUMA_STRIDE(fb->pitches[0]) | > + CHROMA_STRIDE(fb->pitches[1])); > + > + /* Set up video layer data format */ > + fmt = zx_vl_get_fmt(format); > + zx_writel(layer + VL_CTRL1, fmt); > + > + /* Always use scaler since it exists (set for not bypass) */ > + zx_writel_mask(layer + VL_CTRL2, VL_SCALER_BYPASS_MODE, > + VL_SCALER_BYPASS_MODE); > + > + zx_vl_rsz_setup(zplane, format, src_w, src_h, dst_w, dst_h); > + > + /* Enable HBSC block */ > + zx_writel_mask(hbsc + HBSC_CTRL0, HBSC_CTRL_EN, HBSC_CTRL_EN); > + > + zx_overlay_enable(plane); > + > + zx_vl_set_update(zplane); > +} > + > +static void zx_vl_plane_atomic_disable(struct drm_plane *plane, > + struct drm_plane_state *old_state) > +{ > + zx_overlay_disable(plane); > +} > + > +static const struct drm_plane_helper_funcs zx_vl_plane_helper_funcs = { > + .atomic_check = zx_vl_plane_atomic_check, > + .atomic_update = zx_vl_plane_atomic_update, > + .atomic_disable = zx_vl_plane_atomic_disable, > +}; > + > static int zx_gl_plane_atomic_check(struct drm_plane *plane, > struct drm_plane_state *plane_state) > { > @@ -107,14 +370,6 @@ static inline void zx_gl_rsz_set_update(struct zx_plane *zplane) > zx_writel(zplane->rsz + RSZ_ENABLE_CFG, 1); > } > > -void zx_plane_set_update(struct drm_plane *plane) > -{ > - struct zx_plane *zplane = to_zx_plane(plane); > - > - zx_gl_rsz_set_update(zplane); > - zx_gl_set_update(zplane); > -} > - > static void zx_gl_rsz_setup(struct zx_plane *zplane, u32 src_w, u32 src_h, > u32 dst_w, u32 dst_h) > { > @@ -230,6 +485,24 @@ static void zx_plane_destroy(struct drm_plane *plane) > .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, > }; > > +void zx_plane_set_update(struct drm_plane *plane) > +{ > + struct zx_plane *zplane = to_zx_plane(plane); > + > + switch (plane->type) { > + case DRM_PLANE_TYPE_PRIMARY: > + zx_gl_rsz_set_update(zplane); > + zx_gl_set_update(zplane); > + break; > + case DRM_PLANE_TYPE_OVERLAY: > + zx_vl_rsz_set_update(zplane); > + zx_vl_set_update(zplane); > + break; > + default: > + WARN_ONCE(1, "unsupported plane type %d\n", plane->type); > + } > +} > + > static void zx_plane_hbsc_init(struct zx_plane *zplane) > { > void __iomem *hbsc = zplane->hbsc; > @@ -279,7 +552,9 @@ struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev, > format_count = ARRAY_SIZE(gl_formats); > break; > case DRM_PLANE_TYPE_OVERLAY: > - /* TODO: add video layer (vl) support */ > + helper = &zx_vl_plane_helper_funcs; > + formats = vl_formats; > + format_count = ARRAY_SIZE(vl_formats); > break; > default: > return ERR_PTR(-ENODEV); > diff --git a/drivers/gpu/drm/zte/zx_plane_regs.h b/drivers/gpu/drm/zte/zx_plane_regs.h > index 3dde6716a558..65f271aeabed 100644 > --- a/drivers/gpu/drm/zte/zx_plane_regs.h > +++ b/drivers/gpu/drm/zte/zx_plane_regs.h > @@ -46,6 +46,37 @@ > #define GL_POS_X(x) (((x) << GL_POS_X_SHIFT) & GL_POS_X_MASK) > #define GL_POS_Y(x) (((x) << GL_POS_Y_SHIFT) & GL_POS_Y_MASK) > > +/* VL registers */ > +#define VL_CTRL0 0x00 > +#define VL_UPDATE BIT(3) > +#define VL_CTRL1 0x04 > +#define VL_YUV420_PLANAR BIT(5) > +#define VL_YUV422_SHIFT 3 > +#define VL_YUV422_YUYV (0 << VL_YUV422_SHIFT) > +#define VL_YUV422_YVYU (1 << VL_YUV422_SHIFT) > +#define VL_YUV422_UYVY (2 << VL_YUV422_SHIFT) > +#define VL_YUV422_VYUY (3 << VL_YUV422_SHIFT) > +#define VL_FMT_YUV420 0 > +#define VL_FMT_YUV422 1 > +#define VL_FMT_YUV420_P010 2 > +#define VL_FMT_YUV420_HANTRO 3 > +#define VL_FMT_YUV444_8BIT 4 > +#define VL_FMT_YUV444_10BIT 5 > +#define VL_CTRL2 0x08 > +#define VL_SCALER_BYPASS_MODE BIT(0) > +#define VL_STRIDE 0x0c > +#define LUMA_STRIDE_SHIFT 16 > +#define LUMA_STRIDE_MASK (0xffff << LUMA_STRIDE_SHIFT) > +#define CHROMA_STRIDE_SHIFT 0 > +#define CHROMA_STRIDE_MASK (0xffff << CHROMA_STRIDE_SHIFT) > +#define VL_SRC_SIZE 0x10 > +#define VL_Y 0x14 > +#define VL_POS_START 0x30 > +#define VL_POS_END 0x34 > + > +#define LUMA_STRIDE(x) (((x) << LUMA_STRIDE_SHIFT) & LUMA_STRIDE_MASK) > +#define CHROMA_STRIDE(x) (((x) << CHROMA_STRIDE_SHIFT) & CHROMA_STRIDE_MASK) > + > /* CSC registers */ > #define CSC_CTRL0 0x30 > #define CSC_COV_MODE_SHIFT 16 > @@ -69,6 +100,18 @@ > #define RSZ_DEST_CFG 0x04 > #define RSZ_ENABLE_CFG 0x14 > > +#define RSZ_VL_LUMA_HOR 0x08 > +#define RSZ_VL_LUMA_VER 0x0c > +#define RSZ_VL_CHROMA_HOR 0x10 > +#define RSZ_VL_CHROMA_VER 0x14 > +#define RSZ_VL_CTRL_CFG 0x18 > +#define RSZ_VL_FMT_SHIFT 3 > +#define RSZ_VL_FMT_MASK (0x3 << RSZ_VL_FMT_SHIFT) > +#define RSZ_VL_FMT_YCBCR420 (0x0 << RSZ_VL_FMT_SHIFT) > +#define RSZ_VL_FMT_YCBCR422 (0x1 << RSZ_VL_FMT_SHIFT) > +#define RSZ_VL_FMT_YCBCR444 (0x2 << RSZ_VL_FMT_SHIFT) > +#define RSZ_VL_ENABLE_CFG 0x1c > + > #define RSZ_VER_SHIFT 16 > #define RSZ_VER_MASK (0xffff << RSZ_VER_SHIFT) > #define RSZ_HOR_SHIFT 0 > @@ -77,6 +120,14 @@ > #define RSZ_VER(x) (((x) << RSZ_VER_SHIFT) & RSZ_VER_MASK) > #define RSZ_HOR(x) (((x) << RSZ_HOR_SHIFT) & RSZ_HOR_MASK) > > +#define RSZ_DATA_STEP_SHIFT 16 > +#define RSZ_DATA_STEP_MASK (0xffff << RSZ_DATA_STEP_SHIFT) > +#define RSZ_PARA_STEP_SHIFT 0 > +#define RSZ_PARA_STEP_MASK (0xffff << RSZ_PARA_STEP_SHIFT) > + > +#define RSZ_DATA_STEP(x) (((x) << RSZ_DATA_STEP_SHIFT) & RSZ_DATA_STEP_MASK) > +#define RSZ_PARA_STEP(x) (((x) << RSZ_PARA_STEP_SHIFT) & RSZ_PARA_STEP_MASK) > + > /* HBSC registers */ > #define HBSC_SATURATION 0x00 > #define HBSC_HUE 0x04 > diff --git a/drivers/gpu/drm/zte/zx_vou.c b/drivers/gpu/drm/zte/zx_vou.c > index 73fe15c17c32..8ca9c4bdeeaf 100644 > --- a/drivers/gpu/drm/zte/zx_vou.c > +++ b/drivers/gpu/drm/zte/zx_vou.c > @@ -93,10 +93,38 @@ struct zx_crtc { > const struct zx_crtc_bits *bits; > enum vou_chn_type chn_type; > struct clk *pixclk; > + u32 overlay_bitmap; > }; > > #define to_zx_crtc(x) container_of(x, struct zx_crtc, crtc) > > +struct zx_vl_bits { > + u32 enable; > + u32 chnsel; > + u32 clksel; > +}; > + > +static const struct zx_vl_bits zx_vl_bits[VL_NUM] = { > + { > + .enable = OSD_CTRL0_VL0_EN, > + .chnsel = OSD_CTRL0_VL0_SEL, > + .clksel = VOU_CLK_VL0_SEL, > + }, { > + .enable = OSD_CTRL0_VL1_EN, > + .chnsel = OSD_CTRL0_VL1_SEL, > + .clksel = VOU_CLK_VL1_SEL, > + }, { > + .enable = OSD_CTRL0_VL2_EN, > + .chnsel = OSD_CTRL0_VL2_SEL, > + .clksel = VOU_CLK_VL2_SEL, > + }, > +}; > + > +struct zx_overlay { > + struct drm_plane *plane; If you subclass plane instead of storing the pointer, you don't need to keep an array of overlays in vou_hw or the find_vl_idx function. > + const struct zx_vl_bits *bits; > +}; > + > struct zx_vou_hw { > struct device *dev; > void __iomem *osd; > @@ -110,6 +138,7 @@ struct zx_vou_hw { > struct clk *aux_clk; > struct zx_crtc *main_crtc; > struct zx_crtc *aux_crtc; > + struct zx_overlay overlays[VL_NUM]; > }; > > static inline struct zx_vou_hw *crtc_to_vou(struct drm_crtc *crtc) > @@ -404,6 +433,112 @@ void zx_vou_disable_vblank(struct drm_device *drm, unsigned int pipe) > zcrtc->bits->int_frame_mask, 0); > } > > +static int zx_overlay_find_vl_idx(struct drm_plane *plane, > + struct zx_vou_hw *vou) > +{ > + int i; > + > + for (i = 0; i < VL_NUM; i++) { > + if (vou->overlays[i].plane == plane) > + break; > + } > + > + if (i == VL_NUM) { > + DRM_DEV_ERROR(vou->dev, "failed to find VL\n"); > + return -EINVAL; > + } > + > + return i; > +} > + > +void zx_overlay_enable(struct drm_plane *plane) > +{ > + struct zx_crtc *zcrtc = to_zx_crtc(plane->state->crtc); > + struct zx_vou_hw *vou = zcrtc->vou; > + const struct zx_vl_bits *bits; > + int idx; > + > + idx = zx_overlay_find_vl_idx(plane, vou); > + if (idx < 0) > + return; > + > + bits = vou->overlays[idx].bits; > + zcrtc->overlay_bitmap |= 1 << idx; > + > + if (zcrtc->chn_type == VOU_CHN_MAIN) { > + zx_writel_mask(vou->osd + OSD_CTRL0, bits->chnsel, 0); > + zx_writel_mask(vou->vouctl + VOU_CLK_SEL, bits->clksel, 0); > + } else { > + zx_writel_mask(vou->osd + OSD_CTRL0, bits->chnsel, > + bits->chnsel); > + zx_writel_mask(vou->vouctl + VOU_CLK_SEL, bits->clksel, > + bits->clksel); > + } > + > + zx_writel_mask(vou->osd + OSD_CTRL0, bits->enable, bits->enable); > +} > + > +void zx_overlay_disable(struct drm_plane *plane) > +{ > + struct zx_crtc *zcrtc = to_zx_crtc(plane->crtc); > + struct zx_vou_hw *vou = zcrtc->vou; > + const struct zx_vl_bits *bits; > + int idx; > + > + idx = zx_overlay_find_vl_idx(plane, vou); > + if (idx < 0) > + return; > + > + bits = vou->overlays[idx].bits; > + zcrtc->overlay_bitmap &= ~(1 << idx); > + > + zx_writel_mask(vou->osd + OSD_CTRL0, bits->enable, 0); > +} > + > +static void zx_overlay_init(struct drm_device *drm, struct zx_vou_hw *vou) > +{ > + struct device *dev = vou->dev; > + struct drm_plane *plane; > + struct zx_layer_data data; > + int i; > + > + /* > + * VL0 has some quirks on scaling support which need special handling. > + * Let's leave it out for now. > + */ > + for (i = 1; i < VL_NUM; i++) { > + data.layer = vou->osd + OSD_VL_OFFSET(i); > + data.hbsc = vou->osd + HBSC_VL_OFFSET(i); > + data.rsz = vou->otfppu + RSZ_VL_OFFSET(i); > + > + plane = zx_plane_init(drm, dev, &data, DRM_PLANE_TYPE_OVERLAY); > + if (IS_ERR(plane)) { > + DRM_DEV_ERROR(dev, "failed to init overlay %d\n", i); > + continue; > + } > + > + vou->overlays[i].plane = plane; > + vou->overlays[i].bits = &zx_vl_bits[i]; > + } > +} > + > +static inline void zx_osd_int_update(struct zx_crtc *zcrtc) > +{ > + u32 bitmap = zcrtc->overlay_bitmap; > + int i; > + > + vou_chn_set_update(zcrtc); > + zx_plane_set_update(zcrtc->primary); > + > + if (bitmap) { > + for (i = 0; i < VL_NUM; i++) { > + if ((bitmap & (1 << i)) == 0) > + continue; > + zx_plane_set_update(zcrtc->vou->overlays[i].plane); > + } > + } > +} > + > static irqreturn_t vou_irq_handler(int irq, void *dev_id) > { > struct zx_vou_hw *vou = dev_id; > @@ -423,15 +558,11 @@ static irqreturn_t vou_irq_handler(int irq, void *dev_id) > state = zx_readl(vou->osd + OSD_INT_STA); > zx_writel(vou->osd + OSD_INT_CLRSTA, state); > > - if (state & OSD_INT_MAIN_UPT) { > - vou_chn_set_update(vou->main_crtc); > - zx_plane_set_update(vou->main_crtc->primary); > - } > + if (state & OSD_INT_MAIN_UPT) > + zx_osd_int_update(vou->main_crtc); > > - if (state & OSD_INT_AUX_UPT) { > - vou_chn_set_update(vou->aux_crtc); > - zx_plane_set_update(vou->aux_crtc->primary); > - } > + if (state & OSD_INT_AUX_UPT) > + zx_osd_int_update(vou->aux_crtc); > > if (state & OSD_INT_ERROR) > DRM_DEV_ERROR(vou->dev, "OSD ERROR: 0x%08x!\n", state); > @@ -611,6 +742,8 @@ static int zx_crtc_bind(struct device *dev, struct device *master, void *data) > goto disable_ppu_clk; > } > > + zx_overlay_init(drm, vou); > + > return 0; > > disable_ppu_clk: > diff --git a/drivers/gpu/drm/zte/zx_vou.h b/drivers/gpu/drm/zte/zx_vou.h > index 349e06cd86f4..1559c1f79db7 100644 > --- a/drivers/gpu/drm/zte/zx_vou.h > +++ b/drivers/gpu/drm/zte/zx_vou.h > @@ -43,4 +43,7 @@ struct vou_inf { > int zx_vou_enable_vblank(struct drm_device *drm, unsigned int pipe); > void zx_vou_disable_vblank(struct drm_device *drm, unsigned int pipe); > > +void zx_overlay_enable(struct drm_plane *plane); > +void zx_overlay_disable(struct drm_plane *plane); > + > #endif /* __ZX_VOU_H__ */ > diff --git a/drivers/gpu/drm/zte/zx_vou_regs.h b/drivers/gpu/drm/zte/zx_vou_regs.h > index f44e7a4ae441..193c1ce01fe7 100644 > --- a/drivers/gpu/drm/zte/zx_vou_regs.h > +++ b/drivers/gpu/drm/zte/zx_vou_regs.h > @@ -22,6 +22,15 @@ > #define AUX_HBSC_OFFSET 0x860 > #define AUX_RSZ_OFFSET 0x800 > > +#define OSD_VL0_OFFSET 0x040 > +#define OSD_VL_OFFSET(i) (OSD_VL0_OFFSET + 0x050 * (i)) > + > +#define HBSC_VL0_OFFSET 0x760 > +#define HBSC_VL_OFFSET(i) (HBSC_VL0_OFFSET + 0x040 * (i)) > + > +#define RSZ_VL1_U0 0xa00 > +#define RSZ_VL_OFFSET(i) (RSZ_VL1_U0 + 0x200 * (i)) > + > /* OSD (GPC_GLOBAL) registers */ > #define OSD_INT_STA 0x04 > #define OSD_INT_CLRSTA 0x08 > @@ -42,6 +51,12 @@ > ) > #define OSD_INT_ENABLE (OSD_INT_ERROR | OSD_INT_AUX_UPT | OSD_INT_MAIN_UPT) > #define OSD_CTRL0 0x10 > +#define OSD_CTRL0_VL0_EN BIT(13) > +#define OSD_CTRL0_VL0_SEL BIT(12) > +#define OSD_CTRL0_VL1_EN BIT(11) > +#define OSD_CTRL0_VL1_SEL BIT(10) > +#define OSD_CTRL0_VL2_EN BIT(9) > +#define OSD_CTRL0_VL2_SEL BIT(8) > #define OSD_CTRL0_GL0_EN BIT(7) > #define OSD_CTRL0_GL0_SEL BIT(6) > #define OSD_CTRL0_GL1_EN BIT(5) > @@ -146,6 +161,9 @@ > #define VOU_INF_DATA_SEL 0x08 > #define VOU_SOFT_RST 0x14 > #define VOU_CLK_SEL 0x18 > +#define VOU_CLK_VL2_SEL BIT(8) > +#define VOU_CLK_VL1_SEL BIT(7) > +#define VOU_CLK_VL0_SEL BIT(6) > #define VOU_CLK_GL1_SEL BIT(5) > #define VOU_CLK_GL0_SEL BIT(4) > #define VOU_CLK_REQEN 0x20 > -- > 1.9.1 > -- Sean Paul, Software Engineer, Google / Chromium OS From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH v2] drm: zte: add overlay plane support Date: Thu, 22 Dec 2016 09:56:01 -0500 Message-ID: References: <1482235795-6223-1-git-send-email-shawnguo@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-yb0-x233.google.com (mail-yb0-x233.google.com [IPv6:2607:f8b0:4002:c09::233]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4DDCB6F2E5 for ; Thu, 22 Dec 2016 14:56:25 +0000 (UTC) Received: by mail-yb0-x233.google.com with SMTP id 84so14610127ybe.3 for ; Thu, 22 Dec 2016 06:56:25 -0800 (PST) Received: from mail-yw0-f180.google.com (mail-yw0-f180.google.com. [209.85.161.180]) by smtp.gmail.com with ESMTPSA id a204sm776628ywa.38.2016.12.22.06.56.22 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Dec 2016 06:56:22 -0800 (PST) Received: by mail-yw0-f180.google.com with SMTP id v81so13954747ywb.2 for ; Thu, 22 Dec 2016 06:56:22 -0800 (PST) In-Reply-To: <1482235795-6223-1-git-send-email-shawnguo@kernel.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Shawn Guo Cc: Daniel Vetter , Baoyou Xie , dri-devel , Linux ARM Kernel , Jun Nie List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBEZWMgMjAsIDIwMTYgYXQgNzowOSBBTSwgU2hhd24gR3VvIDxzaGF3bmd1b0BrZXJu ZWwub3JnPiB3cm90ZToKPiBGcm9tOiBTaGF3biBHdW8gPHNoYXduLmd1b0BsaW5hcm8ub3JnPgo+ Cj4gSXQgZW5hYmxlcyBWT1UgVkwgKFZpZGVvIExheWVyKSB0byBzdXBwb3J0IG92ZXJsYXkgcGxh bmUgd2l0aCBzY2FsaW5nCj4gZnVuY3Rpb24uICBWTDAgaGFzIHNvbWUgcXVpcmtzIG9uIHNjYWxp bmcgc3VwcG9ydC4gIFdlIGNob3NlIHRvIHNraXAgaXQKPiBhbmQgb25seSBhZGRzIFZMMSBhbmQg VkwyIGludG8gRFJNIGNvcmUgZm9yIG5vdy4KPgo+IFNpZ25lZC1vZmYtYnk6IFNoYXduIEd1byA8 c2hhd24uZ3VvQGxpbmFyby5vcmc+Cj4gLS0tCj4gQ2hhbmdlcyBmb3IgdjI6Cj4gIC0gVXNlIGNs aXBwZWQgY29vcmRpbmF0ZXMgZm9yIG92ZXJsYXkgcG9zaXRpb24gY2FsY3VsYXRpb24KPgo+ICBk cml2ZXJzL2dwdS9kcm0venRlL3p4X3BsYW5lLmMgICAgICB8IDI5MyArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrLS0KPiAgZHJpdmVycy9ncHUvZHJtL3p0ZS96eF9wbGFuZV9yZWdz LmggfCAgNTEgKysrKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0venRlL3p4X3ZvdS5jICAgICAgICB8 IDE0OSArKysrKysrKysrKysrKysrKy0KPiAgZHJpdmVycy9ncHUvZHJtL3p0ZS96eF92b3UuaCAg ICAgICAgfCAgIDMgKwo+ICBkcml2ZXJzL2dwdS9kcm0venRlL3p4X3ZvdV9yZWdzLmggICB8ICAx OCArKysKPiAgNSBmaWxlcyBjaGFuZ2VkLCA0OTcgaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25z KC0pCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3p0ZS96eF9wbGFuZS5jIGIvZHJp dmVycy9ncHUvZHJtL3p0ZS96eF9wbGFuZS5jCj4gaW5kZXggNTQ2ZWI5MmE5NGU4Li44Y2Q3Y2Y3 MWIyYjAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3p0ZS96eF9wbGFuZS5jCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL3p0ZS96eF9wbGFuZS5jCj4gQEAgLTQwLDYgKzQwLDI2OSBAQCBz dHJ1Y3QgenhfcGxhbmUgewo+ICAgICAgICAgRFJNX0ZPUk1BVF9BUkdCNDQ0NCwKPiAgfTsKPgo+ ICtzdGF0aWMgY29uc3QgdWludDMyX3QgdmxfZm9ybWF0c1tdID0gewo+ICsgICAgICAgRFJNX0ZP Uk1BVF9OVjEyLCAgICAgICAgLyogU2VtaS1wbGFuYXIgWVVWNDIwICovCj4gKyAgICAgICBEUk1f Rk9STUFUX1lVVjQyMCwgICAgICAvKiBQbGFuYXIgWVVWNDIwICovCj4gKyAgICAgICBEUk1fRk9S TUFUX1lVWVYsICAgICAgICAvKiBQYWNrZWQgWVVWNDIyICovCj4gKyAgICAgICBEUk1fRk9STUFU X1lWWVUsCj4gKyAgICAgICBEUk1fRk9STUFUX1VZVlksCj4gKyAgICAgICBEUk1fRk9STUFUX1ZZ VVksCj4gKyAgICAgICBEUk1fRk9STUFUX1lVVjQ0NCwgICAgICAvKiBZVVY0NDQgOGJpdCAqLwo+ ICsgICAgICAgLyoKPiArICAgICAgICAqIFRPRE86IGFkZCBmb3JtYXRzIGJlbG93IHRoYXQgSFcg c3VwcG9ydHM6Cj4gKyAgICAgICAgKiAgLSBZVVY0MjAgUDAxMAo+ICsgICAgICAgICogIC0gWVVW NDIwIEhhbnRybwo+ICsgICAgICAgICogIC0gWVVWNDQ0IDEwYml0Cj4gKyAgICAgICAgKi8KPiAr fTsKPiArCj4gKyNkZWZpbmUgRlJBQ18xNl8xNihtdWx0LCBkaXYpICAgICgoKG11bHQpIDw8IDE2 KSAvIChkaXYpKQo+ICsKPiArc3RhdGljIGludCB6eF92bF9wbGFuZV9hdG9taWNfY2hlY2soc3Ry dWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqcGxhbmVfc3RhdGUpCj4gK3sKPiArICAgICAgIHN0 cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gcGxhbmVfc3RhdGUtPmZiOwo+ICsgICAgICAgc3Ry dWN0IGRybV9jcnRjICpjcnRjID0gcGxhbmVfc3RhdGUtPmNydGM7Cj4gKyAgICAgICBzdHJ1Y3Qg ZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gKyAgICAgICBzdHJ1Y3QgZHJtX3JlY3QgY2xp cDsKPiArICAgICAgIGludCBtaW5fc2NhbGUgPSBGUkFDXzE2XzE2KDEsIDgpOwo+ICsgICAgICAg aW50IG1heF9zY2FsZSA9IEZSQUNfMTZfMTYoOCwgMSk7Cj4gKwo+ICsgICAgICAgaWYgKCFjcnRj IHx8ICFmYikKPiArICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4gKwo+ICsgICAgICAgY3J0Y19z dGF0ZSA9IGRybV9hdG9taWNfZ2V0X2V4aXN0aW5nX2NydGNfc3RhdGUocGxhbmVfc3RhdGUtPnN0 YXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY3J0Yyk7Cj4gKyAgICAgICBpZiAoV0FSTl9PTighY3J0Y19zdGF0ZSkpCj4gKyAgICAg ICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ICsKPiArICAgICAgIC8qIG5vdGhpbmcgdG8gY2hl Y2sgd2hlbiBkaXNhYmxpbmcgb3IgZGlzYWJsZWQgKi8KPiArICAgICAgIGlmICghY3J0Y19zdGF0 ZS0+ZW5hYmxlKQo+ICsgICAgICAgICAgICAgICByZXR1cm4gMDsKPiArCj4gKyAgICAgICAvKiBw bGFuZSBtdXN0IGJlIGVuYWJsZWQgKi8KPiArICAgICAgIGlmICghcGxhbmVfc3RhdGUtPmNydGMp Cj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ICsKPiArICAgICAgIGNsaXAueDEg PSAwOwo+ICsgICAgICAgY2xpcC55MSA9IDA7Cj4gKyAgICAgICBjbGlwLngyID0gY3J0Y19zdGF0 ZS0+YWRqdXN0ZWRfbW9kZS5oZGlzcGxheTsKPiArICAgICAgIGNsaXAueTIgPSBjcnRjX3N0YXRl LT5hZGp1c3RlZF9tb2RlLnZkaXNwbGF5Owo+ICsKPiArICAgICAgIHJldHVybiBkcm1fcGxhbmVf aGVscGVyX2NoZWNrX3N0YXRlKHBsYW5lX3N0YXRlLCAmY2xpcCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zY2FsZSwgbWF4X3NjYWxlLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7Cj4gK30K PiArCj4gK3N0YXRpYyB1MzIgenhfdmxfZ2V0X2ZtdCh1aW50MzJfdCBmb3JtYXQpCj4gK3sKPiAr ICAgICAgIHUzMiB2YWwgPSAwOwo+ICsKPiArICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Cj4gKyAg ICAgICBjYXNlIERSTV9GT1JNQVRfTlYxMjoKPiArICAgICAgICAgICAgICAgdmFsID0gVkxfRk1U X1lVVjQyMDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIERSTV9GT1JN QVRfWVVWNDIwOgo+ICsgICAgICAgICAgICAgICB2YWwgPSBWTF9ZVVY0MjBfUExBTkFSIHwgVkxf Rk1UX1lVVjQyMDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIERSTV9G T1JNQVRfWVVZVjoKPiArICAgICAgICAgICAgICAgdmFsID0gVkxfWVVWNDIyX1lVWVYgfCBWTF9G TVRfWVVWNDIyOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgRFJNX0ZP Uk1BVF9ZVllVOgo+ICsgICAgICAgICAgICAgICB2YWwgPSBWTF9ZVVY0MjJfWVZZVSB8IFZMX0ZN VF9ZVVY0MjI7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSBEUk1fRk9S TUFUX1VZVlk6Cj4gKyAgICAgICAgICAgICAgIHZhbCA9IFZMX1lVVjQyMl9VWVZZIHwgVkxfRk1U X1lVVjQyMjsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIERSTV9GT1JN QVRfVllVWToKPiArICAgICAgICAgICAgICAgdmFsID0gVkxfWVVWNDIyX1ZZVVkgfCBWTF9GTVRf WVVWNDIyOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgRFJNX0ZPUk1B VF9ZVVY0NDQ6Cj4gKyAgICAgICAgICAgICAgIHZhbCA9IFZMX0ZNVF9ZVVY0NDRfOEJJVDsKPiAr ICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBkZWZhdWx0Ogo+ICsgICAgICAgICAgICAg ICBXQVJOX09OQ0UoMSwgImludmFsaWQgcGl4ZWwgZm9ybWF0ICVkXG4iLCBmb3JtYXQpOwo+ICsg ICAgICAgfQo+ICsKPiArICAgICAgIHJldHVybiB2YWw7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxp bmUgdm9pZCB6eF92bF9zZXRfdXBkYXRlKHN0cnVjdCB6eF9wbGFuZSAqenBsYW5lKQo+ICt7Cj4g KyAgICAgICB2b2lkIF9faW9tZW0gKmxheWVyID0genBsYW5lLT5sYXllcjsKPiArCj4gKyAgICAg ICB6eF93cml0ZWxfbWFzayhsYXllciArIFZMX0NUUkwwLCBWTF9VUERBVEUsIFZMX1VQREFURSk7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCB6eF92bF9yc3pfc2V0X3VwZGF0ZShzdHJ1 Y3QgenhfcGxhbmUgKnpwbGFuZSkKPiArewo+ICsgICAgICAgenhfd3JpdGVsKHpwbGFuZS0+cnN6 ICsgUlNaX1ZMX0VOQUJMRV9DRkcsIDEpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMyIHp4X3ZsX3Jz el9nZXRfZm10KHVpbnQzMl90IGZvcm1hdCkKPiArewo+ICsgICAgICAgdTMyIHZhbCA9IDA7Cj4g Kwo+ICsgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKPiArICAgICAgIGNhc2UgRFJNX0ZPUk1BVF9O VjEyOgo+ICsgICAgICAgY2FzZSBEUk1fRk9STUFUX1lVVjQyMDoKPiArICAgICAgICAgICAgICAg dmFsID0gUlNaX1ZMX0ZNVF9ZQ0JDUjQyMDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAg ICAgICBjYXNlIERSTV9GT1JNQVRfWVVZVjoKPiArICAgICAgIGNhc2UgRFJNX0ZPUk1BVF9ZVllV Ogo+ICsgICAgICAgY2FzZSBEUk1fRk9STUFUX1VZVlk6Cj4gKyAgICAgICBjYXNlIERSTV9GT1JN QVRfVllVWToKPiArICAgICAgICAgICAgICAgdmFsID0gUlNaX1ZMX0ZNVF9ZQ0JDUjQyMjsKPiAr ICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIERSTV9GT1JNQVRfWVVWNDQ0Ogo+ ICsgICAgICAgICAgICAgICB2YWwgPSBSU1pfVkxfRk1UX1lDQkNSNDQ0Owo+ICsgICAgICAgICAg ICAgICBicmVhazsKPiArICAgICAgIGRlZmF1bHQ6Cj4gKyAgICAgICAgICAgICAgIFdBUk5fT05D RSgxLCAiaW52YWxpZCBwaXhlbCBmb3JtYXQgJWRcbiIsIGZvcm1hdCk7Cj4gKyAgICAgICB9Cj4g Kwo+ICsgICAgICAgcmV0dXJuIHZhbDsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1MzIgcnN6 X3N0ZXBfdmFsdWUodTMyIHNyYywgdTMyIGRzdCkKPiArewo+ICsgICAgICAgdTMyIHZhbCA9IDA7 Cj4gKwo+ICsgICAgICAgaWYgKHNyYyA9PSBkc3QpCj4gKyAgICAgICAgICAgICAgIHZhbCA9IDA7 Cj4gKyAgICAgICBlbHNlIGlmIChzcmMgPCBkc3QpCj4gKyAgICAgICAgICAgICAgIHZhbCA9IFJT Wl9QQVJBX1NURVAoKHNyYyA8PCAxNikgLyBkc3QpOwo+ICsgICAgICAgZWxzZSBpZiAoc3JjID4g ZHN0KQo+ICsgICAgICAgICAgICAgICB2YWwgPSBSU1pfREFUQV9TVEVQKHNyYyAvIGRzdCkgfAo+ ICsgICAgICAgICAgICAgICAgICAgICBSU1pfUEFSQV9TVEVQKCgoc3JjIDw8IDE2KSAvIGRzdCkg JiAweGZmZmYpOwo+ICsKPiArICAgICAgIHJldHVybiB2YWw7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIHp4X3ZsX3Jzel9zZXR1cChzdHJ1Y3QgenhfcGxhbmUgKnpwbGFuZSwgdWludDMyX3QgZm9y bWF0LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgc3JjX3csIHUzMiBzcmNfaCwg dTMyIGRzdF93LCB1MzIgZHN0X2gpCj4gK3sKPiArICAgICAgIHZvaWQgX19pb21lbSAqcnN6ID0g enBsYW5lLT5yc3o7Cj4gKyAgICAgICB1MzIgc3JjX2Nocm9tYV93ID0gc3JjX3c7Cj4gKyAgICAg ICB1MzIgc3JjX2Nocm9tYV9oID0gc3JjX2g7Cj4gKyAgICAgICB1MzIgZm10Owo+ICsKPiArICAg ICAgIC8qIFNldCB1cCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlc29sdXRpb24gKi8KPiArICAg ICAgIHp4X3dyaXRlbChyc3ogKyBSU1pfU1JDX0NGRywgUlNaX1ZFUihzcmNfaCAtIDEpIHwgUlNa X0hPUihzcmNfdyAtIDEpKTsKPiArICAgICAgIHp4X3dyaXRlbChyc3ogKyBSU1pfREVTVF9DRkcs IFJTWl9WRVIoZHN0X2ggLSAxKSB8IFJTWl9IT1IoZHN0X3cgLSAxKSk7Cj4gKwo+ICsgICAgICAg LyogQ29uZmlndXJlIGRhdGEgZm9ybWF0IGZvciBWTCBSU1ogKi8KPiArICAgICAgIGZtdCA9IHp4 X3ZsX3Jzel9nZXRfZm10KGZvcm1hdCk7Cj4gKyAgICAgICB6eF93cml0ZWxfbWFzayhyc3ogKyBS U1pfVkxfQ1RSTF9DRkcsIFJTWl9WTF9GTVRfTUFTSywgZm10KTsKPiArCj4gKyAgICAgICAvKiBD YWxjdWxhdGUgQ2hyb21hIGhlaWd0aCBhbmQgd2lkdGggKi8KPiArICAgICAgIGlmIChmbXQgPT0g UlNaX1ZMX0ZNVF9ZQ0JDUjQyMCkgewo+ICsgICAgICAgICAgICAgICBzcmNfY2hyb21hX3cgPSBz cmNfdyA+PiAxOwo+ICsgICAgICAgICAgICAgICBzcmNfY2hyb21hX2ggPSBzcmNfaCA+PiAxOwo+ ICsgICAgICAgfSBlbHNlIGlmIChmbXQgPT0gUlNaX1ZMX0ZNVF9ZQ0JDUjQyMikgewo+ICsgICAg ICAgICAgICAgICBzcmNfY2hyb21hX3cgPSBzcmNfdyA+PiAxOwo+ICsgICAgICAgfQo+ICsKPiAr ICAgICAgIC8qIFNldCB1cCBMdW1hIGFuZCBDaHJvbWEgc3RlcCByZWdpc3RlcnMgKi8KPiArICAg ICAgIHp4X3dyaXRlbChyc3ogKyBSU1pfVkxfTFVNQV9IT1IsIHJzel9zdGVwX3ZhbHVlKHNyY193 LCBkc3RfdykpOwo+ICsgICAgICAgenhfd3JpdGVsKHJzeiArIFJTWl9WTF9MVU1BX1ZFUiwgcnN6 X3N0ZXBfdmFsdWUoc3JjX2gsIGRzdF9oKSk7Cj4gKyAgICAgICB6eF93cml0ZWwocnN6ICsgUlNa X1ZMX0NIUk9NQV9IT1IsIHJzel9zdGVwX3ZhbHVlKHNyY19jaHJvbWFfdywgZHN0X3cpKTsKPiAr ICAgICAgIHp4X3dyaXRlbChyc3ogKyBSU1pfVkxfQ0hST01BX1ZFUiwgcnN6X3N0ZXBfdmFsdWUo c3JjX2Nocm9tYV9oLCBkc3RfaCkpOwo+ICsKPiArICAgICAgIHp4X3ZsX3Jzel9zZXRfdXBkYXRl KHpwbGFuZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHp4X3ZsX3BsYW5lX2F0b21pY191cGRh dGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpvbGRfc3RhdGUpCj4gK3sKPiArICAg ICAgIHN0cnVjdCB6eF9wbGFuZSAqenBsYW5lID0gdG9fenhfcGxhbmUocGxhbmUpOwo+ICsgICAg ICAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGUgPSBwbGFuZS0+c3RhdGU7Cj4gKyAgICAg ICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IHN0YXRlLT5mYjsKPiArICAgICAgIHN0cnVj dCBkcm1fcmVjdCAqc3JjID0gJnN0YXRlLT5zcmM7Cj4gKyAgICAgICBzdHJ1Y3QgZHJtX3JlY3Qg KmRzdCA9ICZzdGF0ZS0+ZHN0Owo+ICsgICAgICAgc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAq Y21hX29iajsKPiArICAgICAgIHZvaWQgX19pb21lbSAqbGF5ZXIgPSB6cGxhbmUtPmxheWVyOwo+ ICsgICAgICAgdm9pZCBfX2lvbWVtICpoYnNjID0genBsYW5lLT5oYnNjOwo+ICsgICAgICAgdm9p ZCBfX2lvbWVtICpwYWRkcl9yZWc7Cj4gKyAgICAgICBkbWFfYWRkcl90IHBhZGRyOwo+ICsgICAg ICAgdTMyIHNyY194LCBzcmNfeSwgc3JjX3csIHNyY19oOwo+ICsgICAgICAgdTMyIGRzdF94LCBk c3RfeSwgZHN0X3csIGRzdF9oOwo+ICsgICAgICAgdWludDMyX3QgZm9ybWF0Owo+ICsgICAgICAg dTMyIGZtdDsKPiArICAgICAgIGludCBudW1fcGxhbmVzOwo+ICsgICAgICAgaW50IGk7Cj4gKwo+ ICsgICAgICAgaWYgKCFmYikKPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ICsKPiArICAgICAg IGZvcm1hdCA9IGZiLT5waXhlbF9mb3JtYXQ7Cj4gKwo+ICsgICAgICAgc3JjX3ggPSBzcmMtPngx ID4+IDE2Owo+ICsgICAgICAgc3JjX3kgPSBzcmMtPnkxID4+IDE2Owo+ICsgICAgICAgc3JjX3cg PSBkcm1fcmVjdF93aWR0aChzcmMpID4+IDE2Owo+ICsgICAgICAgc3JjX2ggPSBkcm1fcmVjdF9o ZWlnaHQoc3JjKSA+PiAxNjsKPiArCj4gKyAgICAgICBkc3RfeCA9IGRzdC0+eDE7Cj4gKyAgICAg ICBkc3RfeSA9IGRzdC0+eTE7Cj4gKyAgICAgICBkc3RfdyA9IGRybV9yZWN0X3dpZHRoKGRzdCk7 Cj4gKyAgICAgICBkc3RfaCA9IGRybV9yZWN0X2hlaWdodChkc3QpOwo+ICsKPiArICAgICAgIC8q IFNldCB1cCBkYXRhIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciBZLCBDYiBhbmQgQ3IgcGxhbmVzICov Cj4gKyAgICAgICBudW1fcGxhbmVzID0gZHJtX2Zvcm1hdF9udW1fcGxhbmVzKGZvcm1hdCk7Cj4g KyAgICAgICBwYWRkcl9yZWcgPSBsYXllciArIFZMX1k7Cj4gKyAgICAgICBmb3IgKGkgPSAwOyBp IDwgbnVtX3BsYW5lczsgaSsrKSB7Cj4gKyAgICAgICAgICAgICAgIGNtYV9vYmogPSBkcm1fZmJf Y21hX2dldF9nZW1fb2JqKGZiLCBpKTsKPiArICAgICAgICAgICAgICAgcGFkZHIgPSBjbWFfb2Jq LT5wYWRkciArIGZiLT5vZmZzZXRzW2ldOwo+ICsgICAgICAgICAgICAgICBwYWRkciArPSBzcmNf eSAqIGZiLT5waXRjaGVzW2ldOwo+ICsgICAgICAgICAgICAgICBwYWRkciArPSBzcmNfeCAqIGRy bV9mb3JtYXRfcGxhbmVfY3BwKGZvcm1hdCwgaSk7Cj4gKyAgICAgICAgICAgICAgIHp4X3dyaXRl bChwYWRkcl9yZWcsIHBhZGRyKTsKPiArICAgICAgICAgICAgICAgcGFkZHJfcmVnICs9IDQ7Cj4g KyAgICAgICB9Cj4gKwo+ICsgICAgICAgLyogU2V0IHVwIHNvdXJjZSBoZWlnaHQvd2lkdGggcmVn aXN0ZXIgKi8KPiArICAgICAgIHp4X3dyaXRlbChsYXllciArIFZMX1NSQ19TSVpFLCBHTF9TUkNf VyhzcmNfdykgfCBHTF9TUkNfSChzcmNfaCkpOwo+ICsKPiArICAgICAgIC8qIFNldCB1cCBzdGFy dCBwb3NpdGlvbiByZWdpc3RlciAqLwo+ICsgICAgICAgenhfd3JpdGVsKGxheWVyICsgVkxfUE9T X1NUQVJULCBHTF9QT1NfWChkc3RfeCkgfCBHTF9QT1NfWShkc3RfeSkpOwo+ICsKPiArICAgICAg IC8qIFNldCB1cCBlbmQgcG9zaXRpb24gcmVnaXN0ZXIgKi8KPiArICAgICAgIHp4X3dyaXRlbChs YXllciArIFZMX1BPU19FTkQsCj4gKyAgICAgICAgICAgICAgICAgR0xfUE9TX1goZHN0X3ggKyBk c3RfdykgfCBHTF9QT1NfWShkc3RfeSArIGRzdF9oKSk7Cj4gKwo+ICsgICAgICAgLyogU3RyaWRl cyBvZiBDYiBhbmQgQ3IgcGxhbmVzIHNob3VsZCBiZSBpZGVudGljYWwgKi8KPiArICAgICAgIHp4 X3dyaXRlbChsYXllciArIFZMX1NUUklERSwgTFVNQV9TVFJJREUoZmItPnBpdGNoZXNbMF0pIHwK PiArICAgICAgICAgICAgICAgICBDSFJPTUFfU1RSSURFKGZiLT5waXRjaGVzWzFdKSk7Cj4gKwo+ ICsgICAgICAgLyogU2V0IHVwIHZpZGVvIGxheWVyIGRhdGEgZm9ybWF0ICovCj4gKyAgICAgICBm bXQgPSB6eF92bF9nZXRfZm10KGZvcm1hdCk7Cj4gKyAgICAgICB6eF93cml0ZWwobGF5ZXIgKyBW TF9DVFJMMSwgZm10KTsKPiArCj4gKyAgICAgICAvKiBBbHdheXMgdXNlIHNjYWxlciBzaW5jZSBp dCBleGlzdHMgKHNldCBmb3Igbm90IGJ5cGFzcykgKi8KPiArICAgICAgIHp4X3dyaXRlbF9tYXNr KGxheWVyICsgVkxfQ1RSTDIsIFZMX1NDQUxFUl9CWVBBU1NfTU9ERSwKPiArICAgICAgICAgICAg ICAgICAgICAgIFZMX1NDQUxFUl9CWVBBU1NfTU9ERSk7Cj4gKwo+ICsgICAgICAgenhfdmxfcnN6 X3NldHVwKHpwbGFuZSwgZm9ybWF0LCBzcmNfdywgc3JjX2gsIGRzdF93LCBkc3RfaCk7Cj4gKwo+ ICsgICAgICAgLyogRW5hYmxlIEhCU0MgYmxvY2sgKi8KPiArICAgICAgIHp4X3dyaXRlbF9tYXNr KGhic2MgKyBIQlNDX0NUUkwwLCBIQlNDX0NUUkxfRU4sIEhCU0NfQ1RSTF9FTik7Cj4gKwo+ICsg ICAgICAgenhfb3ZlcmxheV9lbmFibGUocGxhbmUpOwo+ICsKPiArICAgICAgIHp4X3ZsX3NldF91 cGRhdGUoenBsYW5lKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgenhfdmxfcGxhbmVfYXRvbWlj X2Rpc2FibGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqb2xkX3N0YXRlKQo+ICt7 Cj4gKyAgICAgICB6eF9vdmVybGF5X2Rpc2FibGUocGxhbmUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9wbGFuZV9oZWxwZXJfZnVuY3MgenhfdmxfcGxhbmVfaGVscGVyX2Z1 bmNzID0gewo+ICsgICAgICAgLmF0b21pY19jaGVjayA9IHp4X3ZsX3BsYW5lX2F0b21pY19jaGVj aywKPiArICAgICAgIC5hdG9taWNfdXBkYXRlID0genhfdmxfcGxhbmVfYXRvbWljX3VwZGF0ZSwK PiArICAgICAgIC5hdG9taWNfZGlzYWJsZSA9IHp4X3ZsX3BsYW5lX2F0b21pY19kaXNhYmxlLAo+ ICt9Owo+ICsKPiAgc3RhdGljIGludCB6eF9nbF9wbGFuZV9hdG9taWNfY2hlY2soc3RydWN0IGRy bV9wbGFuZSAqcGxhbmUsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IGRybV9wbGFuZV9zdGF0ZSAqcGxhbmVfc3RhdGUpCj4gIHsKPiBAQCAtMTA3LDE0ICszNzAs NiBAQCBzdGF0aWMgaW5saW5lIHZvaWQgenhfZ2xfcnN6X3NldF91cGRhdGUoc3RydWN0IHp4X3Bs YW5lICp6cGxhbmUpCj4gICAgICAgICB6eF93cml0ZWwoenBsYW5lLT5yc3ogKyBSU1pfRU5BQkxF X0NGRywgMSk7Cj4gIH0KPgo+IC12b2lkIHp4X3BsYW5lX3NldF91cGRhdGUoc3RydWN0IGRybV9w bGFuZSAqcGxhbmUpCj4gLXsKPiAtICAgICAgIHN0cnVjdCB6eF9wbGFuZSAqenBsYW5lID0gdG9f enhfcGxhbmUocGxhbmUpOwo+IC0KPiAtICAgICAgIHp4X2dsX3Jzel9zZXRfdXBkYXRlKHpwbGFu ZSk7Cj4gLSAgICAgICB6eF9nbF9zZXRfdXBkYXRlKHpwbGFuZSk7Cj4gLX0KPiAtCj4gIHN0YXRp YyB2b2lkIHp4X2dsX3Jzel9zZXR1cChzdHJ1Y3QgenhfcGxhbmUgKnpwbGFuZSwgdTMyIHNyY193 LCB1MzIgc3JjX2gsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBkc3RfdywgdTMy IGRzdF9oKQo+ICB7Cj4gQEAgLTIzMCw2ICs0ODUsMjQgQEAgc3RhdGljIHZvaWQgenhfcGxhbmVf ZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKPiAgICAgICAgIC5hdG9taWNfZGVzdHJv eV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX3BsYW5lX2Rlc3Ryb3lfc3RhdGUsCj4gIH07Cj4K PiArdm9pZCB6eF9wbGFuZV9zZXRfdXBkYXRlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQo+ICt7 Cj4gKyAgICAgICBzdHJ1Y3QgenhfcGxhbmUgKnpwbGFuZSA9IHRvX3p4X3BsYW5lKHBsYW5lKTsK PiArCj4gKyAgICAgICBzd2l0Y2ggKHBsYW5lLT50eXBlKSB7Cj4gKyAgICAgICBjYXNlIERSTV9Q TEFORV9UWVBFX1BSSU1BUlk6Cj4gKyAgICAgICAgICAgICAgIHp4X2dsX3Jzel9zZXRfdXBkYXRl KHpwbGFuZSk7Cj4gKyAgICAgICAgICAgICAgIHp4X2dsX3NldF91cGRhdGUoenBsYW5lKTsKPiAr ICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIERSTV9QTEFORV9UWVBFX09WRVJM QVk6Cj4gKyAgICAgICAgICAgICAgIHp4X3ZsX3Jzel9zZXRfdXBkYXRlKHpwbGFuZSk7Cj4gKyAg ICAgICAgICAgICAgIHp4X3ZsX3NldF91cGRhdGUoenBsYW5lKTsKPiArICAgICAgICAgICAgICAg YnJlYWs7Cj4gKyAgICAgICBkZWZhdWx0Ogo+ICsgICAgICAgICAgICAgICBXQVJOX09OQ0UoMSwg InVuc3VwcG9ydGVkIHBsYW5lIHR5cGUgJWRcbiIsIHBsYW5lLT50eXBlKTsKPiArICAgICAgIH0K PiArfQo+ICsKPiAgc3RhdGljIHZvaWQgenhfcGxhbmVfaGJzY19pbml0KHN0cnVjdCB6eF9wbGFu ZSAqenBsYW5lKQo+ICB7Cj4gICAgICAgICB2b2lkIF9faW9tZW0gKmhic2MgPSB6cGxhbmUtPmhi c2M7Cj4gQEAgLTI3OSw3ICs1NTIsOSBAQCBzdHJ1Y3QgZHJtX3BsYW5lICp6eF9wbGFuZV9pbml0 KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0sIHN0cnVjdCBkZXZpY2UgKmRldiwKPiAgICAgICAgICAg ICAgICAgZm9ybWF0X2NvdW50ID0gQVJSQVlfU0laRShnbF9mb3JtYXRzKTsKPiAgICAgICAgICAg ICAgICAgYnJlYWs7Cj4gICAgICAgICBjYXNlIERSTV9QTEFORV9UWVBFX09WRVJMQVk6Cj4gLSAg ICAgICAgICAgICAgIC8qIFRPRE86IGFkZCB2aWRlbyBsYXllciAodmwpIHN1cHBvcnQgKi8KPiAr ICAgICAgICAgICAgICAgaGVscGVyID0gJnp4X3ZsX3BsYW5lX2hlbHBlcl9mdW5jczsKPiArICAg ICAgICAgICAgICAgZm9ybWF0cyA9IHZsX2Zvcm1hdHM7Cj4gKyAgICAgICAgICAgICAgIGZvcm1h dF9jb3VudCA9IEFSUkFZX1NJWkUodmxfZm9ybWF0cyk7Cj4gICAgICAgICAgICAgICAgIGJyZWFr Owo+ICAgICAgICAgZGVmYXVsdDoKPiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIoLUVO T0RFVik7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS96dGUvenhfcGxhbmVfcmVncy5o IGIvZHJpdmVycy9ncHUvZHJtL3p0ZS96eF9wbGFuZV9yZWdzLmgKPiBpbmRleCAzZGRlNjcxNmE1 NTguLjY1ZjI3MWFlYWJlZCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0venRlL3p4X3Bs YW5lX3JlZ3MuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS96dGUvenhfcGxhbmVfcmVncy5oCj4g QEAgLTQ2LDYgKzQ2LDM3IEBACj4gICNkZWZpbmUgR0xfUE9TX1goeCkgICAgKCgoeCkgPDwgR0xf UE9TX1hfU0hJRlQpICYgR0xfUE9TX1hfTUFTSykKPiAgI2RlZmluZSBHTF9QT1NfWSh4KSAgICAo KCh4KSA8PCBHTF9QT1NfWV9TSElGVCkgJiBHTF9QT1NfWV9NQVNLKQo+Cj4gKy8qIFZMIHJlZ2lz dGVycyAqLwo+ICsjZGVmaW5lIFZMX0NUUkwwICAgICAgICAgICAgICAgICAgICAgICAweDAwCj4g KyNkZWZpbmUgVkxfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgIEJJVCgzKQo+ICsjZGVmaW5l IFZMX0NUUkwxICAgICAgICAgICAgICAgICAgICAgICAweDA0Cj4gKyNkZWZpbmUgVkxfWVVWNDIw X1BMQU5BUiAgICAgICAgICAgICAgIEJJVCg1KQo+ICsjZGVmaW5lIFZMX1lVVjQyMl9TSElGVCAg ICAgICAgICAgICAgICAgICAgICAgIDMKPiArI2RlZmluZSBWTF9ZVVY0MjJfWVVZViAgICAgICAg ICAgICAgICAgKDAgPDwgVkxfWVVWNDIyX1NISUZUKQo+ICsjZGVmaW5lIFZMX1lVVjQyMl9ZVllV ICAgICAgICAgICAgICAgICAoMSA8PCBWTF9ZVVY0MjJfU0hJRlQpCj4gKyNkZWZpbmUgVkxfWVVW NDIyX1VZVlkgICAgICAgICAgICAgICAgICgyIDw8IFZMX1lVVjQyMl9TSElGVCkKPiArI2RlZmlu ZSBWTF9ZVVY0MjJfVllVWSAgICAgICAgICAgICAgICAgKDMgPDwgVkxfWVVWNDIyX1NISUZUKQo+ ICsjZGVmaW5lIFZMX0ZNVF9ZVVY0MjAgICAgICAgICAgICAgICAgICAwCj4gKyNkZWZpbmUgVkxf Rk1UX1lVVjQyMiAgICAgICAgICAgICAgICAgIDEKPiArI2RlZmluZSBWTF9GTVRfWVVWNDIwX1Aw MTAgICAgICAgICAgICAgMgo+ICsjZGVmaW5lIFZMX0ZNVF9ZVVY0MjBfSEFOVFJPICAgICAgICAg ICAzCj4gKyNkZWZpbmUgVkxfRk1UX1lVVjQ0NF84QklUICAgICAgICAgICAgIDQKPiArI2RlZmlu ZSBWTF9GTVRfWVVWNDQ0XzEwQklUICAgICAgICAgICAgNQo+ICsjZGVmaW5lIFZMX0NUUkwyICAg ICAgICAgICAgICAgICAgICAgICAweDA4Cj4gKyNkZWZpbmUgVkxfU0NBTEVSX0JZUEFTU19NT0RF ICAgICAgICAgIEJJVCgwKQo+ICsjZGVmaW5lIFZMX1NUUklERSAgICAgICAgICAgICAgICAgICAg ICAweDBjCj4gKyNkZWZpbmUgTFVNQV9TVFJJREVfU0hJRlQgICAgICAgICAgICAgIDE2Cj4gKyNk ZWZpbmUgTFVNQV9TVFJJREVfTUFTSyAgICAgICAgICAgICAgICgweGZmZmYgPDwgTFVNQV9TVFJJ REVfU0hJRlQpCj4gKyNkZWZpbmUgQ0hST01BX1NUUklERV9TSElGVCAgICAgICAgICAgIDAKPiAr I2RlZmluZSBDSFJPTUFfU1RSSURFX01BU0sgICAgICAgICAgICAgKDB4ZmZmZiA8PCBDSFJPTUFf U1RSSURFX1NISUZUKQo+ICsjZGVmaW5lIFZMX1NSQ19TSVpFICAgICAgICAgICAgICAgICAgICAw eDEwCj4gKyNkZWZpbmUgVkxfWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQKPiArI2Rl ZmluZSBWTF9QT1NfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgzMAo+ICsjZGVmaW5lIFZMX1BP U19FTkQgICAgICAgICAgICAgICAgICAgICAweDM0Cj4gKwo+ICsjZGVmaW5lIExVTUFfU1RSSURF KHgpICAoKCh4KSA8PCBMVU1BX1NUUklERV9TSElGVCkgJiBMVU1BX1NUUklERV9NQVNLKQo+ICsj ZGVmaW5lIENIUk9NQV9TVFJJREUoeCkgKCgoeCkgPDwgQ0hST01BX1NUUklERV9TSElGVCkgJiBD SFJPTUFfU1RSSURFX01BU0spCj4gKwo+ICAvKiBDU0MgcmVnaXN0ZXJzICovCj4gICNkZWZpbmUg Q1NDX0NUUkwwICAgICAgICAgICAgICAgICAgICAgIDB4MzAKPiAgI2RlZmluZSBDU0NfQ09WX01P REVfU0hJRlQgICAgICAgICAgICAgMTYKPiBAQCAtNjksNiArMTAwLDE4IEBACj4gICNkZWZpbmUg UlNaX0RFU1RfQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDQKPiAgI2RlZmluZSBSU1pfRU5BQkxF X0NGRyAgICAgICAgICAgICAgICAgMHgxNAo+Cj4gKyNkZWZpbmUgUlNaX1ZMX0xVTUFfSE9SICAg ICAgICAgICAgICAgICAgICAgICAgMHgwOAo+ICsjZGVmaW5lIFJTWl9WTF9MVU1BX1ZFUiAgICAg ICAgICAgICAgICAgICAgICAgIDB4MGMKPiArI2RlZmluZSBSU1pfVkxfQ0hST01BX0hPUiAgICAg ICAgICAgICAgMHgxMAo+ICsjZGVmaW5lIFJTWl9WTF9DSFJPTUFfVkVSICAgICAgICAgICAgICAw eDE0Cj4gKyNkZWZpbmUgUlNaX1ZMX0NUUkxfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHgx OAo+ICsjZGVmaW5lIFJTWl9WTF9GTVRfU0hJRlQgICAgICAgICAgICAgICAzCj4gKyNkZWZpbmUg UlNaX1ZMX0ZNVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgKDB4MyA8PCBSU1pfVkxfRk1U X1NISUZUKQo+ICsjZGVmaW5lIFJTWl9WTF9GTVRfWUNCQ1I0MjAgICAgICAgICAgICAoMHgwIDw8 IFJTWl9WTF9GTVRfU0hJRlQpCj4gKyNkZWZpbmUgUlNaX1ZMX0ZNVF9ZQ0JDUjQyMiAgICAgICAg ICAgICgweDEgPDwgUlNaX1ZMX0ZNVF9TSElGVCkKPiArI2RlZmluZSBSU1pfVkxfRk1UX1lDQkNS NDQ0ICAgICAgICAgICAgKDB4MiA8PCBSU1pfVkxfRk1UX1NISUZUKQo+ICsjZGVmaW5lIFJTWl9W TF9FTkFCTEVfQ0ZHICAgICAgICAgICAgICAweDFjCj4gKwo+ICAjZGVmaW5lIFJTWl9WRVJfU0hJ RlQgICAgICAgICAgICAgICAgICAxNgo+ICAjZGVmaW5lIFJTWl9WRVJfTUFTSyAgICAgICAgICAg ICAgICAgICAoMHhmZmZmIDw8IFJTWl9WRVJfU0hJRlQpCj4gICNkZWZpbmUgUlNaX0hPUl9TSElG VCAgICAgICAgICAgICAgICAgIDAKPiBAQCAtNzcsNiArMTIwLDE0IEBACj4gICNkZWZpbmUgUlNa X1ZFUih4KSAgICAgKCgoeCkgPDwgUlNaX1ZFUl9TSElGVCkgJiBSU1pfVkVSX01BU0spCj4gICNk ZWZpbmUgUlNaX0hPUih4KSAgICAgKCgoeCkgPDwgUlNaX0hPUl9TSElGVCkgJiBSU1pfSE9SX01B U0spCj4KPiArI2RlZmluZSBSU1pfREFUQV9TVEVQX1NISUZUICAgICAgICAgICAgMTYKPiArI2Rl ZmluZSBSU1pfREFUQV9TVEVQX01BU0sgICAgICAgICAgICAgKDB4ZmZmZiA8PCBSU1pfREFUQV9T VEVQX1NISUZUKQo+ICsjZGVmaW5lIFJTWl9QQVJBX1NURVBfU0hJRlQgICAgICAgICAgICAwCj4g KyNkZWZpbmUgUlNaX1BBUkFfU1RFUF9NQVNLICAgICAgICAgICAgICgweGZmZmYgPDwgUlNaX1BB UkFfU1RFUF9TSElGVCkKPiArCj4gKyNkZWZpbmUgUlNaX0RBVEFfU1RFUCh4KSAoKCh4KSA8PCBS U1pfREFUQV9TVEVQX1NISUZUKSAmIFJTWl9EQVRBX1NURVBfTUFTSykKPiArI2RlZmluZSBSU1pf UEFSQV9TVEVQKHgpICgoKHgpIDw8IFJTWl9QQVJBX1NURVBfU0hJRlQpICYgUlNaX1BBUkFfU1RF UF9NQVNLKQo+ICsKPiAgLyogSEJTQyByZWdpc3RlcnMgKi8KPiAgI2RlZmluZSBIQlNDX1NBVFVS QVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweDAwCj4gICNkZWZpbmUgSEJTQ19IVUUgICAg ICAgICAgICAgICAgICAgICAgIDB4MDQKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3p0 ZS96eF92b3UuYyBiL2RyaXZlcnMvZ3B1L2RybS96dGUvenhfdm91LmMKPiBpbmRleCA3M2ZlMTVj MTdjMzIuLjhjYTljNGJkZWVhZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0venRlL3p4 X3ZvdS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3p0ZS96eF92b3UuYwo+IEBAIC05MywxMCAr OTMsMzggQEAgc3RydWN0IHp4X2NydGMgewo+ICAgICAgICAgY29uc3Qgc3RydWN0IHp4X2NydGNf Yml0cyAqYml0czsKPiAgICAgICAgIGVudW0gdm91X2Nobl90eXBlIGNobl90eXBlOwo+ICAgICAg ICAgc3RydWN0IGNsayAqcGl4Y2xrOwo+ICsgICAgICAgdTMyIG92ZXJsYXlfYml0bWFwOwo+ICB9 Owo+Cj4gICNkZWZpbmUgdG9fenhfY3J0Yyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IHp4X2Ny dGMsIGNydGMpCj4KPiArc3RydWN0IHp4X3ZsX2JpdHMgewo+ICsgICAgICAgdTMyIGVuYWJsZTsK PiArICAgICAgIHUzMiBjaG5zZWw7Cj4gKyAgICAgICB1MzIgY2xrc2VsOwo+ICt9Owo+ICsKPiAr c3RhdGljIGNvbnN0IHN0cnVjdCB6eF92bF9iaXRzIHp4X3ZsX2JpdHNbVkxfTlVNXSA9IHsKPiAr ICAgICAgIHsKPiArICAgICAgICAgICAgICAgLmVuYWJsZSA9IE9TRF9DVFJMMF9WTDBfRU4sCj4g KyAgICAgICAgICAgICAgIC5jaG5zZWwgPSBPU0RfQ1RSTDBfVkwwX1NFTCwKPiArICAgICAgICAg ICAgICAgLmNsa3NlbCA9IFZPVV9DTEtfVkwwX1NFTCwKPiArICAgICAgIH0sIHsKPiArICAgICAg ICAgICAgICAgLmVuYWJsZSA9IE9TRF9DVFJMMF9WTDFfRU4sCj4gKyAgICAgICAgICAgICAgIC5j aG5zZWwgPSBPU0RfQ1RSTDBfVkwxX1NFTCwKPiArICAgICAgICAgICAgICAgLmNsa3NlbCA9IFZP VV9DTEtfVkwxX1NFTCwKPiArICAgICAgIH0sIHsKPiArICAgICAgICAgICAgICAgLmVuYWJsZSA9 IE9TRF9DVFJMMF9WTDJfRU4sCj4gKyAgICAgICAgICAgICAgIC5jaG5zZWwgPSBPU0RfQ1RSTDBf VkwyX1NFTCwKPiArICAgICAgICAgICAgICAgLmNsa3NlbCA9IFZPVV9DTEtfVkwyX1NFTCwKPiAr ICAgICAgIH0sCj4gK307Cj4gKwo+ICtzdHJ1Y3Qgenhfb3ZlcmxheSB7Cj4gKyAgICAgICBzdHJ1 Y3QgZHJtX3BsYW5lICpwbGFuZTsKCklmIHlvdSBzdWJjbGFzcyBwbGFuZSBpbnN0ZWFkIG9mIHN0 b3JpbmcgdGhlIHBvaW50ZXIsIHlvdSBkb24ndCBuZWVkCnRvIGtlZXAgYW4gYXJyYXkgb2Ygb3Zl cmxheXMgaW4gdm91X2h3IG9yIHRoZSBmaW5kX3ZsX2lkeCBmdW5jdGlvbi4KCj4gKyAgICAgICBj b25zdCBzdHJ1Y3QgenhfdmxfYml0cyAqYml0czsKPiArfTsKPiArCj4gIHN0cnVjdCB6eF92b3Vf aHcgewo+ICAgICAgICAgc3RydWN0IGRldmljZSAqZGV2Owo+ICAgICAgICAgdm9pZCBfX2lvbWVt ICpvc2Q7Cj4gQEAgLTExMCw2ICsxMzgsNyBAQCBzdHJ1Y3Qgenhfdm91X2h3IHsKPiAgICAgICAg IHN0cnVjdCBjbGsgKmF1eF9jbGs7Cj4gICAgICAgICBzdHJ1Y3QgenhfY3J0YyAqbWFpbl9jcnRj Owo+ICAgICAgICAgc3RydWN0IHp4X2NydGMgKmF1eF9jcnRjOwo+ICsgICAgICAgc3RydWN0IHp4 X292ZXJsYXkgb3ZlcmxheXNbVkxfTlVNXTsKPiAgfTsKPgo+ICBzdGF0aWMgaW5saW5lIHN0cnVj dCB6eF92b3VfaHcgKmNydGNfdG9fdm91KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiBAQCAtNDA0 LDYgKzQzMywxMTIgQEAgdm9pZCB6eF92b3VfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZp Y2UgKmRybSwgdW5zaWduZWQgaW50IHBpcGUpCj4gICAgICAgICAgICAgICAgICAgICAgICB6Y3J0 Yy0+Yml0cy0+aW50X2ZyYW1lX21hc2ssIDApOwo+ICB9Cj4KPiArc3RhdGljIGludCB6eF9vdmVy bGF5X2ZpbmRfdmxfaWR4KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgenhfdm91X2h3ICp2b3UpCj4gK3sKPiArICAgICAg IGludCBpOwo+ICsKPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCBWTF9OVU07IGkrKykgewo+ICsg ICAgICAgICAgICAgICBpZiAodm91LT5vdmVybGF5c1tpXS5wbGFuZSA9PSBwbGFuZSkKPiArICAg ICAgICAgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICBpZiAo aSA9PSBWTF9OVU0pIHsKPiArICAgICAgICAgICAgICAgRFJNX0RFVl9FUlJPUih2b3UtPmRldiwg ImZhaWxlZCB0byBmaW5kIFZMXG4iKTsKPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7 Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcmV0dXJuIGk7Cj4gK30KPiArCj4gK3ZvaWQgenhf b3ZlcmxheV9lbmFibGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCj4gK3sKPiArICAgICAgIHN0 cnVjdCB6eF9jcnRjICp6Y3J0YyA9IHRvX3p4X2NydGMocGxhbmUtPnN0YXRlLT5jcnRjKTsKPiAr ICAgICAgIHN0cnVjdCB6eF92b3VfaHcgKnZvdSA9IHpjcnRjLT52b3U7Cj4gKyAgICAgICBjb25z dCBzdHJ1Y3QgenhfdmxfYml0cyAqYml0czsKPiArICAgICAgIGludCBpZHg7Cj4gKwo+ICsgICAg ICAgaWR4ID0genhfb3ZlcmxheV9maW5kX3ZsX2lkeChwbGFuZSwgdm91KTsKPiArICAgICAgIGlm IChpZHggPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gKwo+ICsgICAgICAgYml0cyA9 IHZvdS0+b3ZlcmxheXNbaWR4XS5iaXRzOwo+ICsgICAgICAgemNydGMtPm92ZXJsYXlfYml0bWFw IHw9IDEgPDwgaWR4Owo+ICsKPiArICAgICAgIGlmICh6Y3J0Yy0+Y2huX3R5cGUgPT0gVk9VX0NI Tl9NQUlOKSB7Cj4gKyAgICAgICAgICAgICAgIHp4X3dyaXRlbF9tYXNrKHZvdS0+b3NkICsgT1NE X0NUUkwwLCBiaXRzLT5jaG5zZWwsIDApOwo+ICsgICAgICAgICAgICAgICB6eF93cml0ZWxfbWFz ayh2b3UtPnZvdWN0bCArIFZPVV9DTEtfU0VMLCBiaXRzLT5jbGtzZWwsIDApOwo+ICsgICAgICAg fSBlbHNlIHsKPiArICAgICAgICAgICAgICAgenhfd3JpdGVsX21hc2sodm91LT5vc2QgKyBPU0Rf Q1RSTDAsIGJpdHMtPmNobnNlbCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0 cy0+Y2huc2VsKTsKPiArICAgICAgICAgICAgICAgenhfd3JpdGVsX21hc2sodm91LT52b3VjdGwg KyBWT1VfQ0xLX1NFTCwgYml0cy0+Y2xrc2VsLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBiaXRzLT5jbGtzZWwpOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHp4X3dyaXRlbF9t YXNrKHZvdS0+b3NkICsgT1NEX0NUUkwwLCBiaXRzLT5lbmFibGUsIGJpdHMtPmVuYWJsZSk7Cj4g K30KPiArCj4gK3ZvaWQgenhfb3ZlcmxheV9kaXNhYmxlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5l KQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgenhfY3J0YyAqemNydGMgPSB0b196eF9jcnRjKHBsYW5l LT5jcnRjKTsKPiArICAgICAgIHN0cnVjdCB6eF92b3VfaHcgKnZvdSA9IHpjcnRjLT52b3U7Cj4g KyAgICAgICBjb25zdCBzdHJ1Y3QgenhfdmxfYml0cyAqYml0czsKPiArICAgICAgIGludCBpZHg7 Cj4gKwo+ICsgICAgICAgaWR4ID0genhfb3ZlcmxheV9maW5kX3ZsX2lkeChwbGFuZSwgdm91KTsK PiArICAgICAgIGlmIChpZHggPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gKwo+ICsg ICAgICAgYml0cyA9IHZvdS0+b3ZlcmxheXNbaWR4XS5iaXRzOwo+ICsgICAgICAgemNydGMtPm92 ZXJsYXlfYml0bWFwICY9IH4oMSA8PCBpZHgpOwo+ICsKPiArICAgICAgIHp4X3dyaXRlbF9tYXNr KHZvdS0+b3NkICsgT1NEX0NUUkwwLCBiaXRzLT5lbmFibGUsIDApOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCB6eF9vdmVybGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IHp4 X3ZvdV9odyAqdm91KQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSB2b3UtPmRl djsKPiArICAgICAgIHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lOwo+ICsgICAgICAgc3RydWN0IHp4 X2xheWVyX2RhdGEgZGF0YTsKPiArICAgICAgIGludCBpOwo+ICsKPiArICAgICAgIC8qCj4gKyAg ICAgICAgKiBWTDAgaGFzIHNvbWUgcXVpcmtzIG9uIHNjYWxpbmcgc3VwcG9ydCB3aGljaCBuZWVk IHNwZWNpYWwgaGFuZGxpbmcuCj4gKyAgICAgICAgKiBMZXQncyBsZWF2ZSBpdCBvdXQgZm9yIG5v dy4KPiArICAgICAgICAqLwo+ICsgICAgICAgZm9yIChpID0gMTsgaSA8IFZMX05VTTsgaSsrKSB7 Cj4gKyAgICAgICAgICAgICAgIGRhdGEubGF5ZXIgPSB2b3UtPm9zZCArIE9TRF9WTF9PRkZTRVQo aSk7Cj4gKyAgICAgICAgICAgICAgIGRhdGEuaGJzYyA9IHZvdS0+b3NkICsgSEJTQ19WTF9PRkZT RVQoaSk7Cj4gKyAgICAgICAgICAgICAgIGRhdGEucnN6ID0gdm91LT5vdGZwcHUgKyBSU1pfVkxf T0ZGU0VUKGkpOwo+ICsKPiArICAgICAgICAgICAgICAgcGxhbmUgPSB6eF9wbGFuZV9pbml0KGRy bSwgZGV2LCAmZGF0YSwgRFJNX1BMQU5FX1RZUEVfT1ZFUkxBWSk7Cj4gKyAgICAgICAgICAgICAg IGlmIChJU19FUlIocGxhbmUpKSB7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgRFJNX0RFVl9F UlJPUihkZXYsICJmYWlsZWQgdG8gaW5pdCBvdmVybGF5ICVkXG4iLCBpKTsKPiArICAgICAgICAg ICAgICAgICAgICAgICBjb250aW51ZTsKPiArICAgICAgICAgICAgICAgfQo+ICsKPiArICAgICAg ICAgICAgICAgdm91LT5vdmVybGF5c1tpXS5wbGFuZSA9IHBsYW5lOwo+ICsgICAgICAgICAgICAg ICB2b3UtPm92ZXJsYXlzW2ldLmJpdHMgPSAmenhfdmxfYml0c1tpXTsKPiArICAgICAgIH0KPiAr fQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIHp4X29zZF9pbnRfdXBkYXRlKHN0cnVjdCB6eF9j cnRjICp6Y3J0YykKPiArewo+ICsgICAgICAgdTMyIGJpdG1hcCA9IHpjcnRjLT5vdmVybGF5X2Jp dG1hcDsKPiArICAgICAgIGludCBpOwo+ICsKPiArICAgICAgIHZvdV9jaG5fc2V0X3VwZGF0ZSh6 Y3J0Yyk7Cj4gKyAgICAgICB6eF9wbGFuZV9zZXRfdXBkYXRlKHpjcnRjLT5wcmltYXJ5KTsKPiAr Cj4gKyAgICAgICBpZiAoYml0bWFwKSB7Cj4gKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkg PCBWTF9OVU07IGkrKykgIHsKPiArICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJpdG1hcCAm ICgxIDw8IGkpKSA9PSAwKQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGlu dWU7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgenhfcGxhbmVfc2V0X3VwZGF0ZSh6Y3J0Yy0+ dm91LT5vdmVybGF5c1tpXS5wbGFuZSk7Cj4gKyAgICAgICAgICAgICAgIH0KPiArICAgICAgIH0K PiArfQo+ICsKPiAgc3RhdGljIGlycXJldHVybl90IHZvdV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2 b2lkICpkZXZfaWQpCj4gIHsKPiAgICAgICAgIHN0cnVjdCB6eF92b3VfaHcgKnZvdSA9IGRldl9p ZDsKPiBAQCAtNDIzLDE1ICs1NTgsMTEgQEAgc3RhdGljIGlycXJldHVybl90IHZvdV9pcnFfaGFu ZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4gICAgICAgICBzdGF0ZSA9IHp4X3JlYWRsKHZv dS0+b3NkICsgT1NEX0lOVF9TVEEpOwo+ICAgICAgICAgenhfd3JpdGVsKHZvdS0+b3NkICsgT1NE X0lOVF9DTFJTVEEsIHN0YXRlKTsKPgo+IC0gICAgICAgaWYgKHN0YXRlICYgT1NEX0lOVF9NQUlO X1VQVCkgewo+IC0gICAgICAgICAgICAgICB2b3VfY2huX3NldF91cGRhdGUodm91LT5tYWluX2Ny dGMpOwo+IC0gICAgICAgICAgICAgICB6eF9wbGFuZV9zZXRfdXBkYXRlKHZvdS0+bWFpbl9jcnRj LT5wcmltYXJ5KTsKPiAtICAgICAgIH0KPiArICAgICAgIGlmIChzdGF0ZSAmIE9TRF9JTlRfTUFJ Tl9VUFQpCj4gKyAgICAgICAgICAgICAgIHp4X29zZF9pbnRfdXBkYXRlKHZvdS0+bWFpbl9jcnRj KTsKPgo+IC0gICAgICAgaWYgKHN0YXRlICYgT1NEX0lOVF9BVVhfVVBUKSB7Cj4gLSAgICAgICAg ICAgICAgIHZvdV9jaG5fc2V0X3VwZGF0ZSh2b3UtPmF1eF9jcnRjKTsKPiAtICAgICAgICAgICAg ICAgenhfcGxhbmVfc2V0X3VwZGF0ZSh2b3UtPmF1eF9jcnRjLT5wcmltYXJ5KTsKPiAtICAgICAg IH0KPiArICAgICAgIGlmIChzdGF0ZSAmIE9TRF9JTlRfQVVYX1VQVCkKPiArICAgICAgICAgICAg ICAgenhfb3NkX2ludF91cGRhdGUodm91LT5hdXhfY3J0Yyk7Cj4KPiAgICAgICAgIGlmIChzdGF0 ZSAmIE9TRF9JTlRfRVJST1IpCj4gICAgICAgICAgICAgICAgIERSTV9ERVZfRVJST1Iodm91LT5k ZXYsICJPU0QgRVJST1I6IDB4JTA4eCFcbiIsIHN0YXRlKTsKPiBAQCAtNjExLDYgKzc0Miw4IEBA IHN0YXRpYyBpbnQgenhfY3J0Y19iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmlj ZSAqbWFzdGVyLCB2b2lkICpkYXRhKQo+ICAgICAgICAgICAgICAgICBnb3RvIGRpc2FibGVfcHB1 X2NsazsKPiAgICAgICAgIH0KPgo+ICsgICAgICAgenhfb3ZlcmxheV9pbml0KGRybSwgdm91KTsK PiArCj4gICAgICAgICByZXR1cm4gMDsKPgo+ICBkaXNhYmxlX3BwdV9jbGs6Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS96dGUvenhfdm91LmggYi9kcml2ZXJzL2dwdS9kcm0venRlL3p4 X3ZvdS5oCj4gaW5kZXggMzQ5ZTA2Y2Q4NmY0Li4xNTU5YzFmNzlkYjcgMTAwNjQ0Cj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL3p0ZS96eF92b3UuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS96dGUv enhfdm91LmgKPiBAQCAtNDMsNCArNDMsNyBAQCBzdHJ1Y3Qgdm91X2luZiB7Cj4gIGludCB6eF92 b3VfZW5hYmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCB1bnNpZ25lZCBpbnQgcGlw ZSk7Cj4gIHZvaWQgenhfdm91X2Rpc2FibGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkcm0s IHVuc2lnbmVkIGludCBwaXBlKTsKPgo+ICt2b2lkIHp4X292ZXJsYXlfZW5hYmxlKHN0cnVjdCBk cm1fcGxhbmUgKnBsYW5lKTsKPiArdm9pZCB6eF9vdmVybGF5X2Rpc2FibGUoc3RydWN0IGRybV9w bGFuZSAqcGxhbmUpOwo+ICsKPiAgI2VuZGlmIC8qIF9fWlhfVk9VX0hfXyAqLwo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0venRlL3p4X3ZvdV9yZWdzLmggYi9kcml2ZXJzL2dwdS9kcm0v enRlL3p4X3ZvdV9yZWdzLmgKPiBpbmRleCBmNDRlN2E0YWU0NDEuLjE5M2MxY2UwMWZlNyAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0venRlL3p4X3ZvdV9yZWdzLmgKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0venRlL3p4X3ZvdV9yZWdzLmgKPiBAQCAtMjIsNiArMjIsMTUgQEAKPiAgI2Rl ZmluZSBBVVhfSEJTQ19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAweDg2MAo+ICAjZGVm aW5lIEFVWF9SU1pfT0ZGU0VUICAgICAgICAgICAgICAgICAweDgwMAo+Cj4gKyNkZWZpbmUgT1NE X1ZMMF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MDQwCj4gKyNkZWZpbmUgT1NEX1ZMX09GRlNF VChpKSAgICAgICAgICAgICAgIChPU0RfVkwwX09GRlNFVCArIDB4MDUwICogKGkpKQo+ICsKPiAr I2RlZmluZSBIQlNDX1ZMMF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAweDc2MAo+ICsj ZGVmaW5lIEhCU0NfVkxfT0ZGU0VUKGkpICAgICAgICAgICAgICAoSEJTQ19WTDBfT0ZGU0VUICsg MHgwNDAgKiAoaSkpCj4gKwo+ICsjZGVmaW5lIFJTWl9WTDFfVTAgICAgICAgICAgICAgICAgICAg ICAweGEwMAo+ICsjZGVmaW5lIFJTWl9WTF9PRkZTRVQoaSkgICAgICAgICAgICAgICAoUlNaX1ZM MV9VMCArIDB4MjAwICogKGkpKQo+ICsKPiAgLyogT1NEIChHUENfR0xPQkFMKSByZWdpc3RlcnMg Ki8KPiAgI2RlZmluZSBPU0RfSU5UX1NUQSAgICAgICAgICAgICAgICAgICAgMHgwNAo+ICAjZGVm aW5lIE9TRF9JTlRfQ0xSU1RBICAgICAgICAgICAgICAgICAweDA4Cj4gQEAgLTQyLDYgKzUxLDEy IEBACj4gICkKPiAgI2RlZmluZSBPU0RfSU5UX0VOQUJMRSAoT1NEX0lOVF9FUlJPUiB8IE9TRF9J TlRfQVVYX1VQVCB8IE9TRF9JTlRfTUFJTl9VUFQpCj4gICNkZWZpbmUgT1NEX0NUUkwwICAgICAg ICAgICAgICAgICAgICAgIDB4MTAKPiArI2RlZmluZSBPU0RfQ1RSTDBfVkwwX0VOICAgICAgICAg ICAgICAgQklUKDEzKQo+ICsjZGVmaW5lIE9TRF9DVFJMMF9WTDBfU0VMICAgICAgICAgICAgICBC SVQoMTIpCj4gKyNkZWZpbmUgT1NEX0NUUkwwX1ZMMV9FTiAgICAgICAgICAgICAgIEJJVCgxMSkK PiArI2RlZmluZSBPU0RfQ1RSTDBfVkwxX1NFTCAgICAgICAgICAgICAgQklUKDEwKQo+ICsjZGVm aW5lIE9TRF9DVFJMMF9WTDJfRU4gICAgICAgICAgICAgICBCSVQoOSkKPiArI2RlZmluZSBPU0Rf Q1RSTDBfVkwyX1NFTCAgICAgICAgICAgICAgQklUKDgpCj4gICNkZWZpbmUgT1NEX0NUUkwwX0dM MF9FTiAgICAgICAgICAgICAgIEJJVCg3KQo+ICAjZGVmaW5lIE9TRF9DVFJMMF9HTDBfU0VMICAg ICAgICAgICAgICBCSVQoNikKPiAgI2RlZmluZSBPU0RfQ1RSTDBfR0wxX0VOICAgICAgICAgICAg ICAgQklUKDUpCj4gQEAgLTE0Niw2ICsxNjEsOSBAQAo+ICAjZGVmaW5lIFZPVV9JTkZfREFUQV9T RUwgICAgICAgICAgICAgICAweDA4Cj4gICNkZWZpbmUgVk9VX1NPRlRfUlNUICAgICAgICAgICAg ICAgICAgIDB4MTQKPiAgI2RlZmluZSBWT1VfQ0xLX1NFTCAgICAgICAgICAgICAgICAgICAgMHgx OAo+ICsjZGVmaW5lIFZPVV9DTEtfVkwyX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg4 KQo+ICsjZGVmaW5lIFZPVV9DTEtfVkwxX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg3 KQo+ICsjZGVmaW5lIFZPVV9DTEtfVkwwX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg2 KQo+ICAjZGVmaW5lIFZPVV9DTEtfR0wxX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg1 KQo+ICAjZGVmaW5lIFZPVV9DTEtfR0wwX1NFTCAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg0 KQo+ICAjZGVmaW5lIFZPVV9DTEtfUkVRRU4gICAgICAgICAgICAgICAgICAweDIwCj4gLS0KPiAx LjkuMQo+CgoKCi0tIApTZWFuIFBhdWwsIFNvZnR3YXJlIEVuZ2luZWVyLCBHb29nbGUgLyBDaHJv bWl1bSBPUwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpk cmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK