From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on archive.lwn.net X-Spam-Level: X-Spam-Status: No, score=-5.9 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, T_MIXED_ES autolearn=ham autolearn_force=no version=3.4.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by archive.lwn.net (Postfix) with ESMTP id 977737D089 for ; Fri, 14 Dec 2018 14:23:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730076AbeLNOXM (ORCPT ); Fri, 14 Dec 2018 09:23:12 -0500 Received: from mail-eopbgr150049.outbound.protection.outlook.com ([40.107.15.49]:46048 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730106AbeLNOXL (ORCPT ); Fri, 14 Dec 2018 09:23:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector1-arm-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=YNPaCLjuqwWfvJ3NzVlYH67P2wEyLhDLF2D0/YPX14I=; b=O57vI2FLQO9InGGCPe2h6i/PF5yHOHffDbBL3bxJoqqBHR3WZL4dvbkK3C6BA4ug51M55bAXi/xTSigOA+dtwZUfCA9Hpo+wPjIwTv1zs2fP4ojgQL8NuIitGC+krA3cJRrR6J3AZgo4dRcFZdOn7eoWkcDVIuq6+hLr+jU4kXs= Received: from AM0PR08MB3891.eurprd08.prod.outlook.com (20.178.82.147) by AM0PR08MB3619.eurprd08.prod.outlook.com (20.177.111.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1425.20; Fri, 14 Dec 2018 14:23:00 +0000 Received: from AM0PR08MB3891.eurprd08.prod.outlook.com ([fe80::f1f9:6693:ed35:d489]) by AM0PR08MB3891.eurprd08.prod.outlook.com ([fe80::f1f9:6693:ed35:d489%4]) with mapi id 15.20.1425.021; Fri, 14 Dec 2018 14:23:00 +0000 From: Ayan Halder To: Liviu Dudau CC: "linux-doc@vger.kernel.org" , "arnd@arndb.de" , "corbet@lwn.net" , "airlied@linux.ie" , "gregkh@linuxfoundation.org" , "nicolas.ferre@microchip.com" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "davem@davemloft.net" , "maxime.ripard@bootlin.com" , "malidp@foss.arm.com" , "mchehab+samsung@kernel.org" , "akpm@linux-foundation.org" , nd , "sean@poorly.run" Subject: Re: [RFC AFBC 07/12] drm/arm/malidp: Define the constraints on each supported drm_fourcc format for the AFBC modifiers. Thread-Topic: [RFC AFBC 07/12] drm/arm/malidp: Define the constraints on each supported drm_fourcc format for the AFBC modifiers. Thread-Index: AQHUivvOJrCqCbxuBEiiM4l9ViXVPKVu3V6AgA99sYA= Date: Fri, 14 Dec 2018 14:23:00 +0000 Message-ID: <20181214142259.GD19564@arm.com> References: <1543836703-8491-1-git-send-email-ayan.halder@arm.com> <1543836703-8491-8-git-send-email-ayan.halder@arm.com> <20181204174912.GO988@e110455-lin.cambridge.arm.com> In-Reply-To: <20181204174912.GO988@e110455-lin.cambridge.arm.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: LO2P265CA0314.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a4::14) To AM0PR08MB3891.eurprd08.prod.outlook.com (2603:10a6:208:109::19) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Ayan.Halder@arm.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [217.140.106.50] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;AM0PR08MB3619;6:8c5pF8jWPK3QSYJvWGsQ6JtFEaDtcwrNaOhcxwWIjV1i0Ry5dz0mOHafxfOkCYR5ydkvyXB9W+lc8VghwrJCqg+bMoMPuZZLtJoCY0azF9+6HHszgagJYFj8F/DUTcrNw3+o7DPVJUOqBYCAc/IKAbyMJz0yllU2oeWTJUoWUUp0e1A9a6x9nrarGyX4dlA/BSYtj+yzH7xsO3ngWqOWPRZJA2G32LYGAwqhSOfkG67WD1WEo7BpwloC0b0a6nC+SceN29aEJYbDbVdhptC+6a1JChAlYQQTgy1cVgmGUmcs+Tu017XPwKPUl2vIixeQKopqlwHB/Opj79+Hy+X+ZeoF+XcDbjyQWEYwxXD1eQpeAOT7fNnyBODht5kT21KDx0RCrUtsz4BnzmqXKvFpRum7J3i0TrIOVRZ0Tsgmq1OaFHOgf/AlHjCCEsJzNFhk0jbFAtLmXi2bSV7P/iwtmw==;5:cuWW4SQf/5weOO74tmKatKc2Cip3ndzhNvtlKbBkf/GxDEMG2bbgU8U/lZe4ozEqN86PAHKyDK075RCmqwaiU+57N36jn1z+vOX0ABNFq0lKmf95awSGOBn3gs87ztsC81QO3g6Whs6jL1ypGt92FCy+PQCuklImh2UUGAHc09I=;7:Rrm4LN/w2FiowPFLquToGdag2JD5uaik0Bg7DuR0gpmqNS6+oSXAd3sPJBwPZ5dtem/XqiaOR957PJivM5oft7427Tyvao0IBHZbw6uZ7Sm0Ad32MXN5ScyhadlDspCVE8vKSeZvsh8aseLpuV6EZw== x-ms-office365-filtering-correlation-id: 401dc92a-af63-42d6-245f-08d661cfa6a1 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);SRVR:AM0PR08MB3619; x-ms-traffictypediagnostic: AM0PR08MB3619: nodisclaimer: True x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(3230021)(999002)(6040522)(2401047)(5005006)(8121501046)(3231475)(944501520)(52105112)(93006095)(93001095)(10201501046)(3002001)(6055026)(148016)(149066)(150057)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(20161123564045)(201708071742011)(7699051)(76991095);SRVR:AM0PR08MB3619;BCL:0;PCL:0;RULEID:;SRVR:AM0PR08MB3619; x-forefront-prvs: 08864C38AC x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(376002)(366004)(396003)(39850400004)(346002)(136003)(189003)(199004)(486006)(217873002)(478600001)(11346002)(14444005)(256004)(6306002)(6512007)(86362001)(575784001)(33656002)(476003)(68736007)(2616005)(105586002)(97736004)(6486002)(36756003)(386003)(44832011)(52116002)(6506007)(76176011)(446003)(106356001)(102836004)(7736002)(26005)(99286004)(66066001)(71200400001)(71190400001)(3846002)(6116002)(7416002)(54906003)(37006003)(5660300001)(186003)(8676002)(305945005)(1076002)(81166006)(25786009)(316002)(53936002)(6246003)(2906002)(81156014)(8936002)(6636002)(6436002)(53946003)(4326008)(6862004)(4744004)(229853002)(72206003)(14454004)(966005)(309714004);DIR:OUT;SFP:1101;SCL:1;SRVR:AM0PR08MB3619;H:AM0PR08MB3891.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: Q4q1IFOjXwzLo8blWLqZBEK7j06BsAgmlyjduTTd6gyzTKqQ4B25pTNgcigP1MQDPlz8MvjEhj0Ax+7vg4wBJ7ceitPqoowsUHU2LBZH/bzXpdrQOdi1JGDlZxly9UYG84p5NpCc6lBQzPGtZTtEqxHD8lQwrlyrLCuBYoBt27GR6uOsYLuVmkjpvAjMifaC+J3XTnkIE1IY4ptbJ1107cNlKL6JAaWw4CoZrria9oP1qd++Z5mFu8kL71oxQLRv+t7EiOl5DnGJW1e7X7ZT5Jjoe2xXZ8iqWbLEq9pK+OwRzVAehMiDh7Zmg81Nr0A2 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-ID: <6A485C71CB4BB546B626E56FE0E04B02@eurprd08.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-Network-Message-Id: 401dc92a-af63-42d6-245f-08d661cfa6a1 X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Dec 2018 14:23:00.3550 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB3619 Sender: linux-doc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org On Tue, Dec 04, 2018 at 05:49:12PM +0000, Liviu Dudau wrote: > On Mon, Dec 03, 2018 at 11:32:01AM +0000, Ayan Halder wrote: > > The constraints are as follows (for Mali-DP 500, 550, 650) :- > >=20 > > 1. AFBC is not supported for the formats defined in malidp_hw_format_is= _linear_only() > >=20 > > 2. Some of the formats are supported only with AFBC modifiers. Thus we = have > > introduced a new function 'malidp_hw_format_is_afbc_only()' which verif= ies the same. > >=20 > > 3. AFBC_FORMAT_MOD_YTR needs to be provided for any RGB format. > >=20 > > 4. Formats <=3D 16bpp cannot support AFBC_FORMAT_MOD_SPLIT. > >=20 > > 5. CBR should not be set for non-subsampled formats. > >=20 > > 6. SMART layer does not support framebuffer with AFBC modifiers. > > Return -EINVAL for such a scenario. > >=20 > > 7. AFBC_FORMAT_MOD_YTR is not supported for any YUV formats. > >=20 > > 8. Formats which are subsampled cannot support AFBC_FORMAT_MOD_SPLIT. H= owever in > > DP550, YUV_420_10BIT is supported with AFBC_FORMAT_MOD_SPLIT. This feat= ure has > > been identified with MALIDP_DEVICE_AFBC_YUV_420_10_SUPPORT_SPLIT. > >=20 > > 9. In DP550 and DP650, for YUYV, the hardware supports different format= -ids to > > be used with and without AFBC modifier. We have used the feature > > 'MALIDP_DEVICE_AFBC_YUYV_USE_422_P2' to identify this characteristic. > >=20 > > Signed-off-by: Ayan Kumar halder > > --- > > drivers/gpu/drm/arm/malidp_drv.c | 23 +------ > > drivers/gpu/drm/arm/malidp_drv.h | 6 ++ > > drivers/gpu/drm/arm/malidp_hw.c | 71 +++++++++++++++++++-- > > drivers/gpu/drm/arm/malidp_hw.h | 5 +- > > drivers/gpu/drm/arm/malidp_mw.c | 2 +- > > drivers/gpu/drm/arm/malidp_planes.c | 124 ++++++++++++++++++++++++++++= +++++++- > > 6 files changed, 199 insertions(+), 32 deletions(-) > >=20 > > diff --git a/drivers/gpu/drm/arm/malidp_drv.c b/drivers/gpu/drm/arm/mal= idp_drv.c > > index b8db92f..2f0b553 100644 > > --- a/drivers/gpu/drm/arm/malidp_drv.c > > +++ b/drivers/gpu/drm/arm/malidp_drv.c > > @@ -264,29 +264,8 @@ static bool > > malidp_verify_afbc_framebuffer_caps(struct drm_device *dev, > > const struct drm_mode_fb_cmd2 *mode_cmd) > > { > > - const struct drm_format_info *info; > > - > > - if ((mode_cmd->modifier[0] >> 56) !=3D DRM_FORMAT_MOD_VENDOR_ARM) { > > - DRM_DEBUG_KMS("Unknown modifier (not Arm)\n"); > > + if (malidp_format_mod_supported(dev, mode_cmd->pixel_format, mode_cmd= ->modifier[0]) =3D=3D false) > > return false; > > - } > > - > > - if (mode_cmd->modifier[0] & > > - ~DRM_FORMAT_MOD_ARM_AFBC(AFBC_MOD_VALID_BITS)) { > > - DRM_DEBUG_KMS("Unsupported modifiers\n"); > > - return false; > > - } > > - > > - info =3D drm_get_format_info(dev, mode_cmd); > > - if (!info) { > > - DRM_DEBUG_KMS("Unable to get the format information\n"); > > - return false; > > - } > > - > > - if (info->num_planes !=3D 1) { > > - DRM_DEBUG_KMS("AFBC buffers expect one plane\n"); > > - return false; > > - } > > =20 > > if (mode_cmd->offsets[0] !=3D 0) { > > DRM_DEBUG_KMS("AFBC buffers' plane offset should be 0\n"); > > diff --git a/drivers/gpu/drm/arm/malidp_drv.h b/drivers/gpu/drm/arm/mal= idp_drv.h > > index b76c86f..019a682 100644 > > --- a/drivers/gpu/drm/arm/malidp_drv.h > > +++ b/drivers/gpu/drm/arm/malidp_drv.h > > @@ -90,6 +90,12 @@ struct malidp_crtc_state { > > int malidp_de_planes_init(struct drm_device *drm); > > int malidp_crtc_init(struct drm_device *drm); > > =20 > > +bool malidp_hw_format_is_linear_only(u32 format); > > +bool malidp_hw_format_is_afbc_only(u32 format); > > + > > +bool malidp_format_mod_supported(struct drm_device *drm, > > + u32 format, u64 modifier); > > + > > #ifdef CONFIG_DEBUG_FS > > void malidp_error(struct malidp_drm *malidp, > > struct malidp_error_stats *error_stats, u32 status, > > diff --git a/drivers/gpu/drm/arm/malidp_hw.c b/drivers/gpu/drm/arm/mali= dp_hw.c > > index 25ac5890..4a774be 100644 > > --- a/drivers/gpu/drm/arm/malidp_hw.c > > +++ b/drivers/gpu/drm/arm/malidp_hw.c > > @@ -60,6 +60,8 @@ static const struct malidp_format_id malidp500_de_for= mats[] =3D { > > #define MALIDP_ID(__group, __format) \ > > ((((__group) & 0x7) << 3) | ((__format) & 0x7)) > > =20 > > +#define AFBC_YUV_422_FORMAT_ID MALIDP_ID(5, 1) > > + > > #define MALIDP_COMMON_FORMATS \ > > /* fourcc, layers supporting the format, internal id */ \ > > { DRM_FORMAT_ARGB2101010, DE_VIDEO1 | DE_GRAPHICS1 | DE_VIDEO2 | SE_M= EMWRITE, MALIDP_ID(0, 0) }, \ > > @@ -887,7 +889,10 @@ const struct malidp_hw malidp_device[MALIDP_MAX_DE= VICES] =3D { > > .se_base =3D MALIDP550_SE_BASE, > > .dc_base =3D MALIDP550_DC_BASE, > > .out_depth_base =3D MALIDP550_DE_OUTPUT_DEPTH, > > - .features =3D MALIDP_REGMAP_HAS_CLEARIRQ | MALIDP_DEVICE_AFBC_SUPPO= RT_SPLIT | AFBC_SUPPORT_SPLIT_WITH_YUV_420_10, > > + .features =3D MALIDP_REGMAP_HAS_CLEARIRQ | > > + MALIDP_DEVICE_AFBC_SUPPORT_SPLIT | > > + MALIDP_DEVICE_AFBC_YUV_420_10_SUPPORT_SPLIT | >=20 > Please roll some of these changes into patch 5/12. >=20 > > + MALIDP_DEVICE_AFBC_YUYV_USE_422_P2, > > .n_layers =3D ARRAY_SIZE(malidp550_layers), > > .layers =3D malidp550_layers, > > .de_irq_map =3D { > > @@ -933,7 +938,9 @@ const struct malidp_hw malidp_device[MALIDP_MAX_DEV= ICES] =3D { > > .se_base =3D MALIDP550_SE_BASE, > > .dc_base =3D MALIDP550_DC_BASE, > > .out_depth_base =3D MALIDP550_DE_OUTPUT_DEPTH, > > - .features =3D MALIDP_REGMAP_HAS_CLEARIRQ | MALIDP_DEVICE_AFBC_SUPPO= RT_SPLIT, > > + .features =3D MALIDP_REGMAP_HAS_CLEARIRQ | > > + MALIDP_DEVICE_AFBC_SUPPORT_SPLIT | > > + MALIDP_DEVICE_AFBC_YUYV_USE_422_P2, > > .n_layers =3D ARRAY_SIZE(malidp650_layers), > > .layers =3D malidp650_layers, > > .de_irq_map =3D { > > @@ -982,19 +989,73 @@ const struct malidp_hw malidp_device[MALIDP_MAX_D= EVICES] =3D { > > }; > > =20 > > u8 malidp_hw_get_format_id(const struct malidp_hw_regmap *map, > > - u8 layer_id, u32 format) > > + u8 layer_id, u32 format, bool has_modifier) > > { > > unsigned int i; > > =20 > > for (i =3D 0; i < map->n_pixel_formats; i++) { > > if (((map->pixel_formats[i].layer & layer_id) =3D=3D layer_id) && > > - (map->pixel_formats[i].format =3D=3D format)) > > - return map->pixel_formats[i].id; > > + (map->pixel_formats[i].format =3D=3D format)) { > > + > > + /* > > + * In some DP550 and DP650, DRM_FORMAT_YUYV + AFBC modifier > > + * is supported by a different h/w format id than > > + * DRM_FORMAT_YUYV (only). > > + */ > > + if (format =3D=3D DRM_FORMAT_YUYV && > > + (has_modifier) && > > + (map->features & MALIDP_DEVICE_AFBC_YUYV_USE_422_P2)) > > + return AFBC_YUV_422_FORMAT_ID; > > + else > > + return map->pixel_formats[i].id; > > + } > > } > > =20 > > return MALIDP_INVALID_FORMAT_ID; > > } > > =20 > > +bool malidp_hw_format_is_linear_only(u32 format) > > +{ > > + switch (format) { > > + case DRM_FORMAT_ARGB2101010: > > + case DRM_FORMAT_RGBA1010102: > > + case DRM_FORMAT_BGRA1010102: > > + case DRM_FORMAT_ARGB8888: > > + case DRM_FORMAT_RGBA8888: > > + case DRM_FORMAT_BGRA8888: > > + case DRM_FORMAT_XBGR8888: > > + case DRM_FORMAT_XRGB8888: > > + case DRM_FORMAT_RGBX8888: > > + case DRM_FORMAT_BGRX8888: > > + case DRM_FORMAT_RGB888: > > + case DRM_FORMAT_RGB565: > > + case DRM_FORMAT_ARGB1555: > > + case DRM_FORMAT_RGBA5551: > > + case DRM_FORMAT_BGRA5551: > > + case DRM_FORMAT_UYVY: > > + case DRM_FORMAT_XYUV8888: > > + case DRM_FORMAT_XVYU2101010: > > + case DRM_FORMAT_X0L2: > > + case DRM_FORMAT_X0L0: > > + return true; > > + default: > > + return false; > > + } > > +} > > + > > +bool malidp_hw_format_is_afbc_only(u32 format) > > +{ > > + switch (format) { > > + case DRM_FORMAT_VUY888: > > + case DRM_FORMAT_VUY101010: > > + case DRM_FORMAT_YUV420_8BIT: > > + case DRM_FORMAT_YUV420_10BIT: > > + return true; > > + default: > > + return false; > > + } > > +} > > + > > static void malidp_hw_clear_irq(struct malidp_hw_device *hwdev, u8 blo= ck, u32 irq) > > { > > u32 base =3D malidp_get_block_base(hwdev, block); > > diff --git a/drivers/gpu/drm/arm/malidp_hw.h b/drivers/gpu/drm/arm/mali= dp_hw.h > > index 27b907f..52188f0 100644 > > --- a/drivers/gpu/drm/arm/malidp_hw.h > > +++ b/drivers/gpu/drm/arm/malidp_hw.h > > @@ -97,7 +97,8 @@ struct malidp_se_config { > > /* regmap features */ > > #define MALIDP_REGMAP_HAS_CLEARIRQ BIT(0) > > #define MALIDP_DEVICE_AFBC_SUPPORT_SPLIT BIT(1) > > -#define AFBC_SUPPORT_SPLIT_WITH_YUV_420_10 BIT(2) > > +#define MALIDP_DEVICE_AFBC_YUV_420_10_SUPPORT_SPLIT BIT(2) > > +#define MALIDP_DEVICE_AFBC_YUYV_USE_422_P2 BIT(3) > > =20 > > struct malidp_hw_regmap { > > /* address offset of the DE register bank */ > > @@ -323,7 +324,7 @@ int malidp_se_irq_init(struct drm_device *drm, int = irq); > > void malidp_se_irq_fini(struct malidp_hw_device *hwdev); > > =20 > > u8 malidp_hw_get_format_id(const struct malidp_hw_regmap *map, > > - u8 layer_id, u32 format); > > + u8 layer_id, u32 format, bool has_modifier); > > =20 > > static inline u8 malidp_hw_get_pitch_align(struct malidp_hw_device *hw= dev, bool rotated) > > { > > diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/mali= dp_mw.c > > index 91472e5..0484744 100644 > > --- a/drivers/gpu/drm/arm/malidp_mw.c > > +++ b/drivers/gpu/drm/arm/malidp_mw.c > > @@ -143,7 +143,7 @@ malidp_mw_encoder_atomic_check(struct drm_encoder *= encoder, > > =20 > > mw_state->format =3D > > malidp_hw_get_format_id(&malidp->dev->hw->map, SE_MEMWRITE, > > - fb->format->format); > > + fb->format->format, !!fb->modifier); > > if (mw_state->format =3D=3D MALIDP_INVALID_FORMAT_ID) { > > struct drm_format_name_buf format_name; > > =20 > > diff --git a/drivers/gpu/drm/arm/malidp_planes.c b/drivers/gpu/drm/arm/= malidp_planes.c > > index cd60f73..0765cee 100644 > > --- a/drivers/gpu/drm/arm/malidp_planes.c > > +++ b/drivers/gpu/drm/arm/malidp_planes.c > > @@ -52,6 +52,8 @@ > > #define MALIDP550_LS_ENABLE 0x01c > > #define MALIDP550_LS_R1_IN_SIZE 0x020 > > =20 > > +#define MODIFIERS_COUNT_MAX 15 > > + > > /* > > * This 4-entry look-up-table is used to determine the full 8-bit alph= a value > > * for formats with 1- or 2-bit alpha channels. > > @@ -145,6 +147,117 @@ static void malidp_plane_atomic_print_state(struc= t drm_printer *p, > > drm_printf(p, "\tmmu_prefetch_pgsize=3D%d\n", ms->mmu_prefetch_pgsize= ); > > } > > =20 > > +bool malidp_format_mod_supported(struct drm_device *drm, > > + u32 format, u64 modifier) > > +{ > > + const struct drm_format_info *info; > > + const u64 *modifiers; > > + struct malidp_drm *malidp =3D drm->dev_private; > > + const struct malidp_hw_regmap *map =3D &malidp->dev->hw->map; > > + > > + if (WARN_ON(modifier =3D=3D DRM_FORMAT_MOD_INVALID)) > > + return false; > > + > > + /* Some pixel formats are supported without any modifier */ > > + if (modifier =3D=3D DRM_FORMAT_MOD_LINEAR) { > > + /* However these pixel formats need to be supported with >=20 > Nitpick: multi-line comment style is to start with a line that contains > only the marker for the start of the comment. Agreed >=20 > > + * modifiers only > > + */ > > + return !malidp_hw_format_is_afbc_only(format); > > + } > > + > > + if ((modifier >> 56) !=3D DRM_FORMAT_MOD_VENDOR_ARM) { > > + DRM_ERROR("Unknown modifier (not Arm)\n"); > > + return false; > > + } > > + > > + if (modifier & > > + ~DRM_FORMAT_MOD_ARM_AFBC(AFBC_MOD_VALID_BITS)) { > > + DRM_DEBUG_KMS("Unsupported modifiers\n"); > > + return false; > > + } > > + > > + modifiers =3D malidp_format_modifiers; >=20 > Actually, looking again at patch 5/12 it looks to me like you could roll > it into this patch completely. > Agreed, I will merge patch 5/12 "Defining a common list of AFBC modifiers" with the current patch ("adding constraints for each format and modifier"). > > + while (*modifiers !=3D DRM_FORMAT_MOD_INVALID) { > > + if (*modifiers =3D=3D modifier) { > > + /* SPLIT buffers must use SPARSE layout */ > > + if (WARN_ON_ONCE((modifier & AFBC_SPLIT) && !(modifier & AFBC_SPARS= E))) > > + return false; > > + > > + /* CBR only applies to YUV formats, where YTR should be always 0 */ > > + if (WARN_ON_ONCE((modifier & AFBC_CBR) && (modifier & AFBC_YTR))) > > + return false; >=20 > You can take these checks outside the while() loop as they test if the > modifier passed as a parameter is valid, which you should check before > running through the array. If you do that, then the loop through the > malidp_format_modifiers is a simple "if found, break out of loop" and > then the next check will return false if you iterated over the entire > list. >=20 Agreed > > + > > + break; > > + } > > + > > + modifiers++; > > + } > > + > > + /* return false, if the modifier was not found */ > > + if (*modifiers =3D=3D DRM_FORMAT_MOD_INVALID) { > > + DRM_DEBUG_KMS("Unsupported modifier\n"); > > + return false; > > + } > > + > > + info =3D drm_format_info(format); > > + > > + if (info->num_planes !=3D 1) { > > + DRM_DEBUG_KMS("AFBC buffers expect one plane\n"); > > + return false; > > + } > > + > > + if (malidp_hw_format_is_linear_only(format) =3D=3D true) { > > + DRM_DEBUG_KMS("Given format (0x%x) is supported is linear mode only\= n", format); > > + return false; > > + } > > + > > + /* > > + * RGB formats need to provide YTR modifier and YUV formats should no= t > > + * provide YTR modifier. > > + */ > > + if (!(info->is_yuv) !=3D !!(modifier & AFBC_FORMAT_MOD_YTR)) { > > + DRM_DEBUG_KMS("AFBC_FORMAT_MOD_YTR is %s for %s formats\n", > > + info->is_yuv ? "disallowed" : "mandatory", > > + info->is_yuv ? "YUV" : "RGB"); > > + return false; > > + } > > + > > + if (modifier & AFBC_SPLIT) { > > + if (!info->is_yuv) { > > + if (drm_format_plane_cpp(format, 0) <=3D 2) { > > + DRM_DEBUG_KMS("RGB formats <=3D 16bpp are not supported with SPLIT= \n"); > > + return false; > > + } > > + } > > + > > + if ((drm_format_horz_chroma_subsampling(format) !=3D 1) || > > + (drm_format_vert_chroma_subsampling(format) !=3D 1)) { > > + if (!(format =3D=3D DRM_FORMAT_YUV420_10BIT && > > + (map->features & MALIDP_DEVICE_AFBC_YUV_420_10_SUPPORT_SPLIT))= ) { > > + DRM_DEBUG_KMS("Formats which are sub-sampled should never be split= \n"); > > + return false; > > + } > > + } > > + } > > + > > + if (modifier & AFBC_CBR) { > > + if ((drm_format_horz_chroma_subsampling(format) =3D=3D 1) || > > + (drm_format_vert_chroma_subsampling(format) =3D=3D 1)) { > > + DRM_DEBUG_KMS("Formats which are not sub-sampled should not have CB= R set\n"); > > + return false; > > + } > > + } > > + > > + return true; > > +} > > + > > +static bool malidp_format_mod_supported_per_plane(struct drm_plane *pl= ane, > > + u32 format, u64 modifier) > > +{ > > + return malidp_format_mod_supported(plane->dev, format, modifier); > > +} > > + > > static const struct drm_plane_funcs malidp_de_plane_funcs =3D { > > .update_plane =3D drm_atomic_helper_update_plane, > > .disable_plane =3D drm_atomic_helper_disable_plane, > > @@ -153,6 +266,7 @@ static const struct drm_plane_funcs malidp_de_plane= _funcs =3D { > > .atomic_duplicate_state =3D malidp_duplicate_plane_state, > > .atomic_destroy_state =3D malidp_destroy_plane_state, > > .atomic_print_state =3D malidp_plane_atomic_print_state, > > + .format_mod_supported =3D malidp_format_mod_supported_per_plane, > > }; > > =20 > > static int malidp_se_check_scaling(struct malidp_plane *mp, > > @@ -406,8 +520,8 @@ static int malidp_de_plane_check(struct drm_plane *= plane, > > fb =3D state->fb; > > =20 > > ms->format =3D malidp_hw_get_format_id(&mp->hwdev->hw->map, > > - mp->layer->id, > > - fb->format->format); > > + mp->layer->id, fb->format->format, > > + !!fb->modifier); > > if (ms->format =3D=3D MALIDP_INVALID_FORMAT_ID) > > return -EINVAL; > > =20 > > @@ -469,6 +583,12 @@ static int malidp_de_plane_check(struct drm_plane = *plane, > > return -EINVAL; > > } > > =20 > > + /* SMART layer does not support AFBC */ > > + if (mp->layer->id =3D=3D DE_SMART && fb->modifier) { > > + DRM_ERROR("AFBC framebuffer not supported in SMART layer"); > > + return -EINVAL; > > + } > > + > > ms->rotmem_size =3D 0; > > if (state->rotation & MALIDP_ROTATED_MASK) { > > int val; > > --=20 > > 2.7.4 > >=20 >=20 > Best regards, > Liviu >=20 >=20 > --=20 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > | I would like to | > | fix the world, | > | but they're not | > | giving me the | > \ source code! / > --------------- > ??\_(???)_/?? > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ayan Halder Subject: Re: [RFC AFBC 07/12] drm/arm/malidp: Define the constraints on each supported drm_fourcc format for the AFBC modifiers. Date: Fri, 14 Dec 2018 14:23:00 +0000 Message-ID: <20181214142259.GD19564@arm.com> References: <1543836703-8491-1-git-send-email-ayan.halder@arm.com> <1543836703-8491-8-git-send-email-ayan.halder@arm.com> <20181204174912.GO988@e110455-lin.cambridge.arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-eopbgr70075.outbound.protection.outlook.com [40.107.7.75]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6BB1E6F521 for ; Fri, 14 Dec 2018 14:23:03 +0000 (UTC) In-Reply-To: <20181204174912.GO988@e110455-lin.cambridge.arm.com> Content-Language: en-US Content-ID: <6A485C71CB4BB546B626E56FE0E04B02@eurprd08.prod.outlook.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Liviu Dudau Cc: "arnd@arndb.de" , "corbet@lwn.net" , "airlied@linux.ie" , "gregkh@linuxfoundation.org" , "linux-doc@vger.kernel.org" , "nicolas.ferre@microchip.com" , "dri-devel@lists.freedesktop.org" , "linux-kernel@vger.kernel.org" , "maxime.ripard@bootlin.com" , "malidp@foss.arm.com" , "mchehab+samsung@kernel.org" , "akpm@linux-foundation.org" , nd , "sean@poorly.run" , "davem@davemloft.net" List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBEZWMgMDQsIDIwMTggYXQgMDU6NDk6MTJQTSArMDAwMCwgTGl2aXUgRHVkYXUgd3Jv dGU6Cj4gT24gTW9uLCBEZWMgMDMsIDIwMTggYXQgMTE6MzI6MDFBTSArMDAwMCwgQXlhbiBIYWxk ZXIgd3JvdGU6Cj4gPiBUaGUgY29uc3RyYWludHMgYXJlIGFzIGZvbGxvd3MgKGZvciBNYWxpLURQ IDUwMCwgNTUwLCA2NTApIDotCj4gPiAKPiA+IDEuIEFGQkMgaXMgbm90IHN1cHBvcnRlZCBmb3Ig dGhlIGZvcm1hdHMgZGVmaW5lZCBpbiBtYWxpZHBfaHdfZm9ybWF0X2lzX2xpbmVhcl9vbmx5KCkK PiA+IAo+ID4gMi4gU29tZSBvZiB0aGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIG9ubHkgd2l0aCBB RkJDIG1vZGlmaWVycy4gVGh1cyB3ZSBoYXZlCj4gPiBpbnRyb2R1Y2VkIGEgbmV3IGZ1bmN0aW9u ICdtYWxpZHBfaHdfZm9ybWF0X2lzX2FmYmNfb25seSgpJyB3aGljaCB2ZXJpZmllcyB0aGUgc2Ft ZS4KPiA+IAo+ID4gMy4gQUZCQ19GT1JNQVRfTU9EX1lUUiBuZWVkcyB0byBiZSBwcm92aWRlZCBm b3IgYW55IFJHQiBmb3JtYXQuCj4gPiAKPiA+IDQuIEZvcm1hdHMgPD0gMTZicHAgY2Fubm90IHN1 cHBvcnQgQUZCQ19GT1JNQVRfTU9EX1NQTElULgo+ID4gCj4gPiA1LiBDQlIgc2hvdWxkIG5vdCBi ZSBzZXQgZm9yIG5vbi1zdWJzYW1wbGVkIGZvcm1hdHMuCj4gPiAKPiA+IDYuIFNNQVJUIGxheWVy IGRvZXMgbm90IHN1cHBvcnQgZnJhbWVidWZmZXIgd2l0aCBBRkJDIG1vZGlmaWVycy4KPiA+IFJl dHVybiAtRUlOVkFMIGZvciBzdWNoIGEgc2NlbmFyaW8uCj4gPiAKPiA+IDcuIEFGQkNfRk9STUFU X01PRF9ZVFIgaXMgbm90IHN1cHBvcnRlZCBmb3IgYW55IFlVViBmb3JtYXRzLgo+ID4gCj4gPiA4 LiBGb3JtYXRzIHdoaWNoIGFyZSBzdWJzYW1wbGVkIGNhbm5vdCBzdXBwb3J0IEFGQkNfRk9STUFU X01PRF9TUExJVC4gSG93ZXZlciBpbgo+ID4gRFA1NTAsIFlVVl80MjBfMTBCSVQgaXMgc3VwcG9y dGVkIHdpdGggQUZCQ19GT1JNQVRfTU9EX1NQTElULiBUaGlzIGZlYXR1cmUgaGFzCj4gPiBiZWVu IGlkZW50aWZpZWQgd2l0aCBNQUxJRFBfREVWSUNFX0FGQkNfWVVWXzQyMF8xMF9TVVBQT1JUX1NQ TElULgo+ID4gCj4gPiA5LiBJbiBEUDU1MCBhbmQgRFA2NTAsIGZvciBZVVlWLCB0aGUgaGFyZHdh cmUgc3VwcG9ydHMgZGlmZmVyZW50IGZvcm1hdC1pZHMgdG8KPiA+IGJlIHVzZWQgd2l0aCBhbmQg d2l0aG91dCBBRkJDIG1vZGlmaWVyLiBXZSBoYXZlIHVzZWQgdGhlIGZlYXR1cmUKPiA+ICdNQUxJ RFBfREVWSUNFX0FGQkNfWVVZVl9VU0VfNDIyX1AyJyB0byBpZGVudGlmeSB0aGlzIGNoYXJhY3Rl cmlzdGljLgo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBBeWFuIEt1bWFyIGhhbGRlciA8YXlhbi5o YWxkZXJAYXJtLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2Ry di5jICAgIHwgIDIzICstLS0tLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9kcnYu aCAgICB8ICAgNiArKwo+ID4gIGRyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3LmMgICAgIHwg IDcxICsrKysrKysrKysrKysrKysrKystLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRw X2h3LmggICAgIHwgICA1ICstCj4gPiAgZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfbXcuYyAg ICAgfCAgIDIgKy0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9wbGFuZXMuYyB8IDEy NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KPiA+ICA2IGZpbGVzIGNoYW5n ZWQsIDE5OSBpbnNlcnRpb25zKCspLCAzMiBkZWxldGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2Fy bS9tYWxpZHBfZHJ2LmMKPiA+IGluZGV4IGI4ZGI5MmYuLjJmMGI1NTMgMTAwNjQ0Cj4gPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9kcnYuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2FybS9tYWxpZHBfZHJ2LmMKPiA+IEBAIC0yNjQsMjkgKzI2NCw4IEBAIHN0YXRpYyBib29s Cj4gPiAgbWFsaWRwX3ZlcmlmeV9hZmJjX2ZyYW1lYnVmZmVyX2NhcHMoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKPiA+ICAJCQkJICAgIGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQyICptb2Rl X2NtZCkKPiA+ICB7Cj4gPiAtCWNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2luZm8gKmluZm87Cj4g PiAtCj4gPiAtCWlmICgobW9kZV9jbWQtPm1vZGlmaWVyWzBdID4+IDU2KSAhPSBEUk1fRk9STUFU X01PRF9WRU5ET1JfQVJNKSB7Cj4gPiAtCQlEUk1fREVCVUdfS01TKCJVbmtub3duIG1vZGlmaWVy IChub3QgQXJtKVxuIik7Cj4gPiArCWlmIChtYWxpZHBfZm9ybWF0X21vZF9zdXBwb3J0ZWQoZGV2 LCBtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0LCBtb2RlX2NtZC0+bW9kaWZpZXJbMF0pID09IGZhbHNl KQo+ID4gIAkJcmV0dXJuIGZhbHNlOwo+ID4gLQl9Cj4gPiAtCj4gPiAtCWlmIChtb2RlX2NtZC0+ bW9kaWZpZXJbMF0gJgo+ID4gLQkgICAgfkRSTV9GT1JNQVRfTU9EX0FSTV9BRkJDKEFGQkNfTU9E X1ZBTElEX0JJVFMpKSB7Cj4gPiAtCQlEUk1fREVCVUdfS01TKCJVbnN1cHBvcnRlZCBtb2RpZmll cnNcbiIpOwo+ID4gLQkJcmV0dXJuIGZhbHNlOwo+ID4gLQl9Cj4gPiAtCj4gPiAtCWluZm8gPSBk cm1fZ2V0X2Zvcm1hdF9pbmZvKGRldiwgbW9kZV9jbWQpOwo+ID4gLQlpZiAoIWluZm8pIHsKPiA+ IC0JCURSTV9ERUJVR19LTVMoIlVuYWJsZSB0byBnZXQgdGhlIGZvcm1hdCBpbmZvcm1hdGlvblxu Iik7Cj4gPiAtCQlyZXR1cm4gZmFsc2U7Cj4gPiAtCX0KPiA+IC0KPiA+IC0JaWYgKGluZm8tPm51 bV9wbGFuZXMgIT0gMSkgewo+ID4gLQkJRFJNX0RFQlVHX0tNUygiQUZCQyBidWZmZXJzIGV4cGVj dCBvbmUgcGxhbmVcbiIpOwo+ID4gLQkJcmV0dXJuIGZhbHNlOwo+ID4gLQl9Cj4gPiAgCj4gPiAg CWlmIChtb2RlX2NtZC0+b2Zmc2V0c1swXSAhPSAwKSB7Cj4gPiAgCQlEUk1fREVCVUdfS01TKCJB RkJDIGJ1ZmZlcnMnIHBsYW5lIG9mZnNldCBzaG91bGQgYmUgMFxuIik7Cj4gPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vYXJt L21hbGlkcF9kcnYuaAo+ID4gaW5kZXggYjc2Yzg2Zi4uMDE5YTY4MiAxMDA2NDQKPiA+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2Rydi5oCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vYXJtL21hbGlkcF9kcnYuaAo+ID4gQEAgLTkwLDYgKzkwLDEyIEBAIHN0cnVjdCBtYWxpZHBf Y3J0Y19zdGF0ZSB7Cj4gPiAgaW50IG1hbGlkcF9kZV9wbGFuZXNfaW5pdChzdHJ1Y3QgZHJtX2Rl dmljZSAqZHJtKTsKPiA+ICBpbnQgbWFsaWRwX2NydGNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAq ZHJtKTsKPiA+ICAKPiA+ICtib29sIG1hbGlkcF9od19mb3JtYXRfaXNfbGluZWFyX29ubHkodTMy IGZvcm1hdCk7Cj4gPiArYm9vbCBtYWxpZHBfaHdfZm9ybWF0X2lzX2FmYmNfb25seSh1MzIgZm9y bWF0KTsKPiA+ICsKPiA+ICtib29sIG1hbGlkcF9mb3JtYXRfbW9kX3N1cHBvcnRlZChzdHJ1Y3Qg ZHJtX2RldmljZSAqZHJtLAo+ID4gKwkJCQkgdTMyIGZvcm1hdCwgdTY0IG1vZGlmaWVyKTsKPiA+ ICsKPiA+ICAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCj4gPiAgdm9pZCBtYWxpZHBfZXJyb3Ioc3Ry dWN0IG1hbGlkcF9kcm0gKm1hbGlkcCwKPiA+ICAJCSAgc3RydWN0IG1hbGlkcF9lcnJvcl9zdGF0 cyAqZXJyb3Jfc3RhdHMsIHUzMiBzdGF0dXMsCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2FybS9tYWxpZHBfaHcuYyBiL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3LmMKPiA+ IGluZGV4IDI1YWM1ODkwLi40YTc3NGJlIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2FybS9tYWxpZHBfaHcuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfaHcu Ywo+ID4gQEAgLTYwLDYgKzYwLDggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBtYWxpZHBfZm9ybWF0 X2lkIG1hbGlkcDUwMF9kZV9mb3JtYXRzW10gPSB7Cj4gPiAgI2RlZmluZSBNQUxJRFBfSUQoX19n cm91cCwgX19mb3JtYXQpIFwKPiA+ICAJKCgoKF9fZ3JvdXApICYgMHg3KSA8PCAzKSB8ICgoX19m b3JtYXQpICYgMHg3KSkKPiA+ICAKPiA+ICsjZGVmaW5lIEFGQkNfWVVWXzQyMl9GT1JNQVRfSUQJ TUFMSURQX0lEKDUsIDEpCj4gPiArCj4gPiAgI2RlZmluZSBNQUxJRFBfQ09NTU9OX0ZPUk1BVFMg XAo+ID4gIAkvKiAgICBmb3VyY2MsICAgbGF5ZXJzIHN1cHBvcnRpbmcgdGhlIGZvcm1hdCwgICAg ICBpbnRlcm5hbCBpZCAgICovIFwKPiA+ICAJeyBEUk1fRk9STUFUX0FSR0IyMTAxMDEwLCBERV9W SURFTzEgfCBERV9HUkFQSElDUzEgfCBERV9WSURFTzIgfCBTRV9NRU1XUklURSwgTUFMSURQX0lE KDAsIDApIH0sIFwKPiA+IEBAIC04ODcsNyArODg5LDEwIEBAIGNvbnN0IHN0cnVjdCBtYWxpZHBf aHcgbWFsaWRwX2RldmljZVtNQUxJRFBfTUFYX0RFVklDRVNdID0gewo+ID4gIAkJCS5zZV9iYXNl ID0gTUFMSURQNTUwX1NFX0JBU0UsCj4gPiAgCQkJLmRjX2Jhc2UgPSBNQUxJRFA1NTBfRENfQkFT RSwKPiA+ICAJCQkub3V0X2RlcHRoX2Jhc2UgPSBNQUxJRFA1NTBfREVfT1VUUFVUX0RFUFRILAo+ ID4gLQkJCS5mZWF0dXJlcyA9IE1BTElEUF9SRUdNQVBfSEFTX0NMRUFSSVJRIHwgTUFMSURQX0RF VklDRV9BRkJDX1NVUFBPUlRfU1BMSVQgfCBBRkJDX1NVUFBPUlRfU1BMSVRfV0lUSF9ZVVZfNDIw XzEwLAo+ID4gKwkJCS5mZWF0dXJlcyA9IE1BTElEUF9SRUdNQVBfSEFTX0NMRUFSSVJRIHwKPiA+ ICsJCQkJICAgIE1BTElEUF9ERVZJQ0VfQUZCQ19TVVBQT1JUX1NQTElUIHwKPiA+ICsJCQkJICAg IE1BTElEUF9ERVZJQ0VfQUZCQ19ZVVZfNDIwXzEwX1NVUFBPUlRfU1BMSVQgfAo+IAo+IFBsZWFz ZSByb2xsIHNvbWUgb2YgdGhlc2UgY2hhbmdlcyBpbnRvIHBhdGNoIDUvMTIuCj4gCj4gPiArCQkJ CSAgICBNQUxJRFBfREVWSUNFX0FGQkNfWVVZVl9VU0VfNDIyX1AyLAo+ID4gIAkJCS5uX2xheWVy cyA9IEFSUkFZX1NJWkUobWFsaWRwNTUwX2xheWVycyksCj4gPiAgCQkJLmxheWVycyA9IG1hbGlk cDU1MF9sYXllcnMsCj4gPiAgCQkJLmRlX2lycV9tYXAgPSB7Cj4gPiBAQCAtOTMzLDcgKzkzOCw5 IEBAIGNvbnN0IHN0cnVjdCBtYWxpZHBfaHcgbWFsaWRwX2RldmljZVtNQUxJRFBfTUFYX0RFVklD RVNdID0gewo+ID4gIAkJCS5zZV9iYXNlID0gTUFMSURQNTUwX1NFX0JBU0UsCj4gPiAgCQkJLmRj X2Jhc2UgPSBNQUxJRFA1NTBfRENfQkFTRSwKPiA+ICAJCQkub3V0X2RlcHRoX2Jhc2UgPSBNQUxJ RFA1NTBfREVfT1VUUFVUX0RFUFRILAo+ID4gLQkJCS5mZWF0dXJlcyA9IE1BTElEUF9SRUdNQVBf SEFTX0NMRUFSSVJRIHwgTUFMSURQX0RFVklDRV9BRkJDX1NVUFBPUlRfU1BMSVQsCj4gPiArCQkJ LmZlYXR1cmVzID0gTUFMSURQX1JFR01BUF9IQVNfQ0xFQVJJUlEgfAo+ID4gKwkJCQkgICAgTUFM SURQX0RFVklDRV9BRkJDX1NVUFBPUlRfU1BMSVQgfAo+ID4gKwkJCQkgICAgTUFMSURQX0RFVklD RV9BRkJDX1lVWVZfVVNFXzQyMl9QMiwKPiA+ICAJCQkubl9sYXllcnMgPSBBUlJBWV9TSVpFKG1h bGlkcDY1MF9sYXllcnMpLAo+ID4gIAkJCS5sYXllcnMgPSBtYWxpZHA2NTBfbGF5ZXJzLAo+ID4g IAkJCS5kZV9pcnFfbWFwID0gewo+ID4gQEAgLTk4MiwxOSArOTg5LDczIEBAIGNvbnN0IHN0cnVj dCBtYWxpZHBfaHcgbWFsaWRwX2RldmljZVtNQUxJRFBfTUFYX0RFVklDRVNdID0gewo+ID4gIH07 Cj4gPiAgCj4gPiAgdTggbWFsaWRwX2h3X2dldF9mb3JtYXRfaWQoY29uc3Qgc3RydWN0IG1hbGlk cF9od19yZWdtYXAgKm1hcCwKPiA+IC0JCQkgICB1OCBsYXllcl9pZCwgdTMyIGZvcm1hdCkKPiA+ ICsJCQkgICB1OCBsYXllcl9pZCwgdTMyIGZvcm1hdCwgYm9vbCBoYXNfbW9kaWZpZXIpCj4gPiAg ewo+ID4gIAl1bnNpZ25lZCBpbnQgaTsKPiA+ICAKPiA+ICAJZm9yIChpID0gMDsgaSA8IG1hcC0+ bl9waXhlbF9mb3JtYXRzOyBpKyspIHsKPiA+ICAJCWlmICgoKG1hcC0+cGl4ZWxfZm9ybWF0c1tp XS5sYXllciAmIGxheWVyX2lkKSA9PSBsYXllcl9pZCkgJiYKPiA+IC0JCSAgICAobWFwLT5waXhl bF9mb3JtYXRzW2ldLmZvcm1hdCA9PSBmb3JtYXQpKQo+ID4gLQkJCXJldHVybiBtYXAtPnBpeGVs X2Zvcm1hdHNbaV0uaWQ7Cj4gPiArCQkgICAgKG1hcC0+cGl4ZWxfZm9ybWF0c1tpXS5mb3JtYXQg PT0gZm9ybWF0KSkgewo+ID4gKwo+ID4gKwkJCS8qCj4gPiArCQkJICogSW4gc29tZSBEUDU1MCBh bmQgRFA2NTAsIERSTV9GT1JNQVRfWVVZViArIEFGQkMgbW9kaWZpZXIKPiA+ICsJCQkgKiBpcyBz dXBwb3J0ZWQgYnkgYSBkaWZmZXJlbnQgaC93IGZvcm1hdCBpZCB0aGFuCj4gPiArCQkJICogRFJN X0ZPUk1BVF9ZVVlWIChvbmx5KS4KPiA+ICsJCQkgKi8KPiA+ICsJCQlpZiAoZm9ybWF0ID09IERS TV9GT1JNQVRfWVVZViAmJgo+ID4gKwkJCSAgICAoaGFzX21vZGlmaWVyKSAmJgo+ID4gKwkJCSAg ICAobWFwLT5mZWF0dXJlcyAmIE1BTElEUF9ERVZJQ0VfQUZCQ19ZVVlWX1VTRV80MjJfUDIpKQo+ ID4gKwkJCQlyZXR1cm4gQUZCQ19ZVVZfNDIyX0ZPUk1BVF9JRDsKPiA+ICsJCQllbHNlCj4gPiAr CQkJCXJldHVybiBtYXAtPnBpeGVsX2Zvcm1hdHNbaV0uaWQ7Cj4gPiArCQl9Cj4gPiAgCX0KPiA+ ICAKPiA+ICAJcmV0dXJuIE1BTElEUF9JTlZBTElEX0ZPUk1BVF9JRDsKPiA+ICB9Cj4gPiAgCj4g PiArYm9vbCBtYWxpZHBfaHdfZm9ybWF0X2lzX2xpbmVhcl9vbmx5KHUzMiBmb3JtYXQpCj4gPiAr ewo+ID4gKwlzd2l0Y2ggKGZvcm1hdCkgewo+ID4gKwljYXNlIERSTV9GT1JNQVRfQVJHQjIxMDEw MTA6Cj4gPiArCWNhc2UgRFJNX0ZPUk1BVF9SR0JBMTAxMDEwMjoKPiA+ICsJY2FzZSBEUk1fRk9S TUFUX0JHUkExMDEwMTAyOgo+ID4gKwljYXNlIERSTV9GT1JNQVRfQVJHQjg4ODg6Cj4gPiArCWNh c2UgRFJNX0ZPUk1BVF9SR0JBODg4ODoKPiA+ICsJY2FzZSBEUk1fRk9STUFUX0JHUkE4ODg4Ogo+ ID4gKwljYXNlIERSTV9GT1JNQVRfWEJHUjg4ODg6Cj4gPiArCWNhc2UgRFJNX0ZPUk1BVF9YUkdC ODg4ODoKPiA+ICsJY2FzZSBEUk1fRk9STUFUX1JHQlg4ODg4Ogo+ID4gKwljYXNlIERSTV9GT1JN QVRfQkdSWDg4ODg6Cj4gPiArCWNhc2UgRFJNX0ZPUk1BVF9SR0I4ODg6Cj4gPiArCWNhc2UgRFJN X0ZPUk1BVF9SR0I1NjU6Cj4gPiArCWNhc2UgRFJNX0ZPUk1BVF9BUkdCMTU1NToKPiA+ICsJY2Fz ZSBEUk1fRk9STUFUX1JHQkE1NTUxOgo+ID4gKwljYXNlIERSTV9GT1JNQVRfQkdSQTU1NTE6Cj4g PiArCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgo+ID4gKwljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6 Cj4gPiArCWNhc2UgRFJNX0ZPUk1BVF9YVllVMjEwMTAxMDoKPiA+ICsJY2FzZSBEUk1fRk9STUFU X1gwTDI6Cj4gPiArCWNhc2UgRFJNX0ZPUk1BVF9YMEwwOgo+ID4gKwkJcmV0dXJuIHRydWU7Cj4g PiArCWRlZmF1bHQ6Cj4gPiArCQlyZXR1cm4gZmFsc2U7Cj4gPiArCX0KPiA+ICt9Cj4gPiArCj4g PiArYm9vbCBtYWxpZHBfaHdfZm9ybWF0X2lzX2FmYmNfb25seSh1MzIgZm9ybWF0KQo+ID4gK3sK PiA+ICsJc3dpdGNoIChmb3JtYXQpIHsKPiA+ICsJY2FzZSBEUk1fRk9STUFUX1ZVWTg4ODoKPiA+ ICsJY2FzZSBEUk1fRk9STUFUX1ZVWTEwMTAxMDoKPiA+ICsJY2FzZSBEUk1fRk9STUFUX1lVVjQy MF84QklUOgo+ID4gKwljYXNlIERSTV9GT1JNQVRfWVVWNDIwXzEwQklUOgo+ID4gKwkJcmV0dXJu IHRydWU7Cj4gPiArCWRlZmF1bHQ6Cj4gPiArCQlyZXR1cm4gZmFsc2U7Cj4gPiArCX0KPiA+ICt9 Cj4gPiArCj4gPiAgc3RhdGljIHZvaWQgbWFsaWRwX2h3X2NsZWFyX2lycShzdHJ1Y3QgbWFsaWRw X2h3X2RldmljZSAqaHdkZXYsIHU4IGJsb2NrLCB1MzIgaXJxKQo+ID4gIHsKPiA+ICAJdTMyIGJh c2UgPSBtYWxpZHBfZ2V0X2Jsb2NrX2Jhc2UoaHdkZXYsIGJsb2NrKTsKPiA+IGRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vYXJtL21hbGlkcF9ody5oIGIvZHJpdmVycy9ncHUvZHJtL2FybS9t YWxpZHBfaHcuaAo+ID4gaW5kZXggMjdiOTA3Zi4uNTIxODhmMCAxMDA2NDQKPiA+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX2h3LmgKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9h cm0vbWFsaWRwX2h3LmgKPiA+IEBAIC05Nyw3ICs5Nyw4IEBAIHN0cnVjdCBtYWxpZHBfc2VfY29u ZmlnIHsKPiA+ICAvKiByZWdtYXAgZmVhdHVyZXMgKi8KPiA+ICAjZGVmaW5lIE1BTElEUF9SRUdN QVBfSEFTX0NMRUFSSVJRCQkJCUJJVCgwKQo+ID4gICNkZWZpbmUgTUFMSURQX0RFVklDRV9BRkJD X1NVUFBPUlRfU1BMSVQJCQlCSVQoMSkKPiA+IC0jZGVmaW5lIEFGQkNfU1VQUE9SVF9TUExJVF9X SVRIX1lVVl80MjBfMTAJCQlCSVQoMikKPiA+ICsjZGVmaW5lIE1BTElEUF9ERVZJQ0VfQUZCQ19Z VVZfNDIwXzEwX1NVUFBPUlRfU1BMSVQJCUJJVCgyKQo+ID4gKyNkZWZpbmUgTUFMSURQX0RFVklD RV9BRkJDX1lVWVZfVVNFXzQyMl9QMgkJCUJJVCgzKQo+ID4gIAo+ID4gIHN0cnVjdCBtYWxpZHBf aHdfcmVnbWFwIHsKPiA+ICAJLyogYWRkcmVzcyBvZmZzZXQgb2YgdGhlIERFIHJlZ2lzdGVyIGJh bmsgKi8KPiA+IEBAIC0zMjMsNyArMzI0LDcgQEAgaW50IG1hbGlkcF9zZV9pcnFfaW5pdChzdHJ1 Y3QgZHJtX2RldmljZSAqZHJtLCBpbnQgaXJxKTsKPiA+ICB2b2lkIG1hbGlkcF9zZV9pcnFfZmlu aShzdHJ1Y3QgbWFsaWRwX2h3X2RldmljZSAqaHdkZXYpOwo+ID4gIAo+ID4gIHU4IG1hbGlkcF9o d19nZXRfZm9ybWF0X2lkKGNvbnN0IHN0cnVjdCBtYWxpZHBfaHdfcmVnbWFwICptYXAsCj4gPiAt CQkJICAgdTggbGF5ZXJfaWQsIHUzMiBmb3JtYXQpOwo+ID4gKwkJCSAgIHU4IGxheWVyX2lkLCB1 MzIgZm9ybWF0LCBib29sIGhhc19tb2RpZmllcik7Cj4gPiAgCj4gPiAgc3RhdGljIGlubGluZSB1 OCBtYWxpZHBfaHdfZ2V0X3BpdGNoX2FsaWduKHN0cnVjdCBtYWxpZHBfaHdfZGV2aWNlICpod2Rl diwgYm9vbCByb3RhdGVkKQo+ID4gIHsKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v YXJtL21hbGlkcF9tdy5jIGIvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfbXcuYwo+ID4gaW5k ZXggOTE0NzJlNS4uMDQ4NDc0NCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hcm0v bWFsaWRwX213LmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9hcm0vbWFsaWRwX213LmMKPiA+ IEBAIC0xNDMsNyArMTQzLDcgQEAgbWFsaWRwX213X2VuY29kZXJfYXRvbWljX2NoZWNrKHN0cnVj dCBkcm1fZW5jb2RlciAqZW5jb2RlciwKPiA+ICAKPiA+ICAJbXdfc3RhdGUtPmZvcm1hdCA9Cj4g PiAgCQltYWxpZHBfaHdfZ2V0X2Zvcm1hdF9pZCgmbWFsaWRwLT5kZXYtPmh3LT5tYXAsIFNFX01F TVdSSVRFLAo+ID4gLQkJCQkJZmItPmZvcm1hdC0+Zm9ybWF0KTsKPiA+ICsJCQkJCWZiLT5mb3Jt YXQtPmZvcm1hdCwgISFmYi0+bW9kaWZpZXIpOwo+ID4gIAlpZiAobXdfc3RhdGUtPmZvcm1hdCA9 PSBNQUxJRFBfSU5WQUxJRF9GT1JNQVRfSUQpIHsKPiA+ICAJCXN0cnVjdCBkcm1fZm9ybWF0X25h bWVfYnVmIGZvcm1hdF9uYW1lOwo+ID4gIAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9hcm0vbWFsaWRwX3BsYW5lcy5jIGIvZHJpdmVycy9ncHUvZHJtL2FybS9tYWxpZHBfcGxhbmVz LmMKPiA+IGluZGV4IGNkNjBmNzMuLjA3NjVjZWUgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vYXJtL21hbGlkcF9wbGFuZXMuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FybS9t YWxpZHBfcGxhbmVzLmMKPiA+IEBAIC01Miw2ICs1Miw4IEBACj4gPiAgI2RlZmluZSBNQUxJRFA1 NTBfTFNfRU5BQkxFCQkweDAxYwo+ID4gICNkZWZpbmUgTUFMSURQNTUwX0xTX1IxX0lOX1NJWkUJ CTB4MDIwCj4gPiAgCj4gPiArI2RlZmluZSBNT0RJRklFUlNfQ09VTlRfTUFYCQkxNQo+ID4gKwo+ ID4gIC8qCj4gPiAgICogVGhpcyA0LWVudHJ5IGxvb2stdXAtdGFibGUgaXMgdXNlZCB0byBkZXRl cm1pbmUgdGhlIGZ1bGwgOC1iaXQgYWxwaGEgdmFsdWUKPiA+ICAgKiBmb3IgZm9ybWF0cyB3aXRo IDEtIG9yIDItYml0IGFscGhhIGNoYW5uZWxzLgo+ID4gQEAgLTE0NSw2ICsxNDcsMTE3IEBAIHN0 YXRpYyB2b2lkIG1hbGlkcF9wbGFuZV9hdG9taWNfcHJpbnRfc3RhdGUoc3RydWN0IGRybV9wcmlu dGVyICpwLAo+ID4gIAlkcm1fcHJpbnRmKHAsICJcdG1tdV9wcmVmZXRjaF9wZ3NpemU9JWRcbiIs IG1zLT5tbXVfcHJlZmV0Y2hfcGdzaXplKTsKPiA+ICB9Cj4gPiAgCj4gPiArYm9vbCBtYWxpZHBf Zm9ybWF0X21vZF9zdXBwb3J0ZWQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwKPiA+ICsJCQkJIHUz MiBmb3JtYXQsIHU2NCBtb2RpZmllcikKPiA+ICt7Cj4gPiArCWNvbnN0IHN0cnVjdCBkcm1fZm9y bWF0X2luZm8gKmluZm87Cj4gPiArCWNvbnN0IHU2NCAqbW9kaWZpZXJzOwo+ID4gKwlzdHJ1Y3Qg bWFsaWRwX2RybSAqbWFsaWRwID0gZHJtLT5kZXZfcHJpdmF0ZTsKPiA+ICsJY29uc3Qgc3RydWN0 IG1hbGlkcF9od19yZWdtYXAgKm1hcCA9ICZtYWxpZHAtPmRldi0+aHctPm1hcDsKPiA+ICsKPiA+ ICsJaWYgKFdBUk5fT04obW9kaWZpZXIgPT0gRFJNX0ZPUk1BVF9NT0RfSU5WQUxJRCkpCj4gPiAr CQlyZXR1cm4gZmFsc2U7Cj4gPiArCj4gPiArCS8qIFNvbWUgcGl4ZWwgZm9ybWF0cyBhcmUgc3Vw cG9ydGVkIHdpdGhvdXQgYW55IG1vZGlmaWVyICovCj4gPiArCWlmIChtb2RpZmllciA9PSBEUk1f Rk9STUFUX01PRF9MSU5FQVIpIHsKPiA+ICsJCS8qIEhvd2V2ZXIgdGhlc2UgcGl4ZWwgZm9ybWF0 cyBuZWVkIHRvIGJlIHN1cHBvcnRlZCB3aXRoCj4gCj4gTml0cGljazogbXVsdGktbGluZSBjb21t ZW50IHN0eWxlIGlzIHRvIHN0YXJ0IHdpdGggYSBsaW5lIHRoYXQgY29udGFpbnMKPiBvbmx5IHRo ZSBtYXJrZXIgZm9yIHRoZSBzdGFydCBvZiB0aGUgY29tbWVudC4KQWdyZWVkCj4gCj4gPiArCQkg KiBtb2RpZmllcnMgb25seQo+ID4gKwkJICovCj4gPiArCQlyZXR1cm4gIW1hbGlkcF9od19mb3Jt YXRfaXNfYWZiY19vbmx5KGZvcm1hdCk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKChtb2RpZmll ciA+PiA1NikgIT0gRFJNX0ZPUk1BVF9NT0RfVkVORE9SX0FSTSkgewo+ID4gKwkJRFJNX0VSUk9S KCJVbmtub3duIG1vZGlmaWVyIChub3QgQXJtKVxuIik7Cj4gPiArCQlyZXR1cm4gZmFsc2U7Cj4g PiArCX0KPiA+ICsKPiA+ICsJaWYgKG1vZGlmaWVyICYKPiA+ICsJICAgIH5EUk1fRk9STUFUX01P RF9BUk1fQUZCQyhBRkJDX01PRF9WQUxJRF9CSVRTKSkgewo+ID4gKwkJRFJNX0RFQlVHX0tNUygi VW5zdXBwb3J0ZWQgbW9kaWZpZXJzXG4iKTsKPiA+ICsJCXJldHVybiBmYWxzZTsKPiA+ICsJfQo+ ID4gKwo+ID4gKwltb2RpZmllcnMgPSBtYWxpZHBfZm9ybWF0X21vZGlmaWVyczsKPiAKPiBBY3R1 YWxseSwgbG9va2luZyBhZ2FpbiBhdCBwYXRjaCA1LzEyIGl0IGxvb2tzIHRvIG1lIGxpa2UgeW91 IGNvdWxkIHJvbGwKPiBpdCBpbnRvIHRoaXMgcGF0Y2ggY29tcGxldGVseS4KPgpBZ3JlZWQsIEkg d2lsbCBtZXJnZSBwYXRjaCA1LzEyICJEZWZpbmluZyBhIGNvbW1vbiBsaXN0IG9mIEFGQkMKbW9k aWZpZXJzIiB3aXRoIHRoZSBjdXJyZW50IHBhdGNoICgiYWRkaW5nIGNvbnN0cmFpbnRzIGZvciBl YWNoIGZvcm1hdAphbmQgbW9kaWZpZXIiKS4KCj4gPiArCXdoaWxlICgqbW9kaWZpZXJzICE9IERS TV9GT1JNQVRfTU9EX0lOVkFMSUQpIHsKPiA+ICsJCWlmICgqbW9kaWZpZXJzID09IG1vZGlmaWVy KSB7Cj4gPiArCQkJLyogU1BMSVQgYnVmZmVycyBtdXN0IHVzZSBTUEFSU0UgbGF5b3V0ICovCj4g PiArCQkJaWYgKFdBUk5fT05fT05DRSgobW9kaWZpZXIgJiBBRkJDX1NQTElUKSAmJiAhKG1vZGlm aWVyICYgQUZCQ19TUEFSU0UpKSkKPiA+ICsJCQkJcmV0dXJuIGZhbHNlOwo+ID4gKwo+ID4gKwkJ CS8qIENCUiBvbmx5IGFwcGxpZXMgdG8gWVVWIGZvcm1hdHMsIHdoZXJlIFlUUiBzaG91bGQgYmUg YWx3YXlzIDAgKi8KPiA+ICsJCQlpZiAoV0FSTl9PTl9PTkNFKChtb2RpZmllciAmIEFGQkNfQ0JS KSAmJiAobW9kaWZpZXIgJiBBRkJDX1lUUikpKQo+ID4gKwkJCQlyZXR1cm4gZmFsc2U7Cj4gCj4g WW91IGNhbiB0YWtlIHRoZXNlIGNoZWNrcyBvdXRzaWRlIHRoZSB3aGlsZSgpIGxvb3AgYXMgdGhl eSB0ZXN0IGlmIHRoZQo+IG1vZGlmaWVyIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBpcyB2YWxpZCwg d2hpY2ggeW91IHNob3VsZCBjaGVjayBiZWZvcmUKPiBydW5uaW5nIHRocm91Z2ggdGhlIGFycmF5 LiBJZiB5b3UgZG8gdGhhdCwgdGhlbiB0aGUgbG9vcCB0aHJvdWdoIHRoZQo+IG1hbGlkcF9mb3Jt YXRfbW9kaWZpZXJzIGlzIGEgc2ltcGxlICJpZiBmb3VuZCwgYnJlYWsgb3V0IG9mIGxvb3AiIGFu ZAo+IHRoZW4gdGhlIG5leHQgY2hlY2sgd2lsbCByZXR1cm4gZmFsc2UgaWYgeW91IGl0ZXJhdGVk IG92ZXIgdGhlIGVudGlyZQo+IGxpc3QuCj4gCkFncmVlZAo+ID4gKwo+ID4gKwkJCWJyZWFrOwo+ ID4gKwkJfQo+ID4gKwo+ID4gKwkJbW9kaWZpZXJzKys7Cj4gPiArCX0KPiA+ICsKPiA+ICsJLyog cmV0dXJuIGZhbHNlLCBpZiB0aGUgbW9kaWZpZXIgd2FzIG5vdCBmb3VuZCAqLwo+ID4gKwlpZiAo Km1vZGlmaWVycyA9PSBEUk1fRk9STUFUX01PRF9JTlZBTElEKSB7Cj4gPiArCQlEUk1fREVCVUdf S01TKCJVbnN1cHBvcnRlZCBtb2RpZmllclxuIik7Cj4gPiArCQlyZXR1cm4gZmFsc2U7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJaW5mbyA9IGRybV9mb3JtYXRfaW5mbyhmb3JtYXQpOwo+ID4gKwo+ID4g KwlpZiAoaW5mby0+bnVtX3BsYW5lcyAhPSAxKSB7Cj4gPiArCQlEUk1fREVCVUdfS01TKCJBRkJD IGJ1ZmZlcnMgZXhwZWN0IG9uZSBwbGFuZVxuIik7Cj4gPiArCQlyZXR1cm4gZmFsc2U7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJaWYgKG1hbGlkcF9od19mb3JtYXRfaXNfbGluZWFyX29ubHkoZm9ybWF0 KSA9PSB0cnVlKSB7Cj4gPiArCQlEUk1fREVCVUdfS01TKCJHaXZlbiBmb3JtYXQgKDB4JXgpIGlz IHN1cHBvcnRlZCBpcyBsaW5lYXIgbW9kZSBvbmx5XG4iLCBmb3JtYXQpOwo+ID4gKwkJcmV0dXJu IGZhbHNlOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFJHQiBmb3JtYXRzIG5lZWQg dG8gcHJvdmlkZSBZVFIgbW9kaWZpZXIgYW5kIFlVViBmb3JtYXRzIHNob3VsZCBub3QKPiA+ICsJ ICogcHJvdmlkZSBZVFIgbW9kaWZpZXIuCj4gPiArCSAqLwo+ID4gKwlpZiAoIShpbmZvLT5pc195 dXYpICE9ICEhKG1vZGlmaWVyICYgQUZCQ19GT1JNQVRfTU9EX1lUUikpIHsKPiA+ICsJCURSTV9E RUJVR19LTVMoIkFGQkNfRk9STUFUX01PRF9ZVFIgaXMgJXMgZm9yICVzIGZvcm1hdHNcbiIsCj4g PiArCQkJICAgICAgaW5mby0+aXNfeXV2ID8gImRpc2FsbG93ZWQiIDogIm1hbmRhdG9yeSIsCj4g PiArCQkJICAgICAgaW5mby0+aXNfeXV2ID8gIllVViIgOiAiUkdCIik7Cj4gPiArCQlyZXR1cm4g ZmFsc2U7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKG1vZGlmaWVyICYgQUZCQ19TUExJVCkgewo+ ID4gKwkJaWYgKCFpbmZvLT5pc195dXYpIHsKPiA+ICsJCQlpZiAoZHJtX2Zvcm1hdF9wbGFuZV9j cHAoZm9ybWF0LCAwKSA8PSAyKSB7Cj4gPiArCQkJCURSTV9ERUJVR19LTVMoIlJHQiBmb3JtYXRz IDw9IDE2YnBwIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggU1BMSVRcbiIpOwo+ID4gKwkJCQlyZXR1 cm4gZmFsc2U7Cj4gPiArCQkJfQo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJaWYgKChkcm1fZm9ybWF0 X2hvcnpfY2hyb21hX3N1YnNhbXBsaW5nKGZvcm1hdCkgIT0gMSkgfHwKPiA+ICsJCSAgICAoZHJt X2Zvcm1hdF92ZXJ0X2Nocm9tYV9zdWJzYW1wbGluZyhmb3JtYXQpICE9IDEpKSB7Cj4gPiArCQkJ aWYgKCEoZm9ybWF0ID09IERSTV9GT1JNQVRfWVVWNDIwXzEwQklUICYmCj4gPiArCQkJICAgICAo bWFwLT5mZWF0dXJlcyAmIE1BTElEUF9ERVZJQ0VfQUZCQ19ZVVZfNDIwXzEwX1NVUFBPUlRfU1BM SVQpKSkgewo+ID4gKwkJCQlEUk1fREVCVUdfS01TKCJGb3JtYXRzIHdoaWNoIGFyZSBzdWItc2Ft cGxlZCBzaG91bGQgbmV2ZXIgYmUgc3BsaXRcbiIpOwo+ID4gKwkJCQlyZXR1cm4gZmFsc2U7Cj4g PiArCQkJfQo+ID4gKwkJfQo+ID4gKwl9Cj4gPiArCj4gPiArCWlmIChtb2RpZmllciAmIEFGQkNf Q0JSKSB7Cj4gPiArCQlpZiAoKGRybV9mb3JtYXRfaG9yel9jaHJvbWFfc3Vic2FtcGxpbmcoZm9y bWF0KSA9PSAxKSB8fAo+ID4gKwkJICAgIChkcm1fZm9ybWF0X3ZlcnRfY2hyb21hX3N1YnNhbXBs aW5nKGZvcm1hdCkgPT0gMSkpIHsKPiA+ICsJCQlEUk1fREVCVUdfS01TKCJGb3JtYXRzIHdoaWNo IGFyZSBub3Qgc3ViLXNhbXBsZWQgc2hvdWxkIG5vdCBoYXZlIENCUiBzZXRcbiIpOwo+ID4gKwkJ CXJldHVybiBmYWxzZTsKPiA+ICsJCX0KPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXR1cm4gdHJ1ZTsK PiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGJvb2wgbWFsaWRwX2Zvcm1hdF9tb2Rfc3VwcG9ydGVk X3Blcl9wbGFuZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiA+ICsJCQkJCQkgIHUzMiBmb3Jt YXQsIHU2NCBtb2RpZmllcikKPiA+ICt7Cj4gPiArCXJldHVybiBtYWxpZHBfZm9ybWF0X21vZF9z dXBwb3J0ZWQocGxhbmUtPmRldiwgZm9ybWF0LCBtb2RpZmllcik7Cj4gPiArfQo+ID4gKwo+ID4g IHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX3BsYW5lX2Z1bmNzIG1hbGlkcF9kZV9wbGFuZV9mdW5j cyA9IHsKPiA+ICAJLnVwZGF0ZV9wbGFuZSA9IGRybV9hdG9taWNfaGVscGVyX3VwZGF0ZV9wbGFu ZSwKPiA+ICAJLmRpc2FibGVfcGxhbmUgPSBkcm1fYXRvbWljX2hlbHBlcl9kaXNhYmxlX3BsYW5l LAo+ID4gQEAgLTE1Myw2ICsyNjYsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wbGFuZV9m dW5jcyBtYWxpZHBfZGVfcGxhbmVfZnVuY3MgPSB7Cj4gPiAgCS5hdG9taWNfZHVwbGljYXRlX3N0 YXRlID0gbWFsaWRwX2R1cGxpY2F0ZV9wbGFuZV9zdGF0ZSwKPiA+ICAJLmF0b21pY19kZXN0cm95 X3N0YXRlID0gbWFsaWRwX2Rlc3Ryb3lfcGxhbmVfc3RhdGUsCj4gPiAgCS5hdG9taWNfcHJpbnRf c3RhdGUgPSBtYWxpZHBfcGxhbmVfYXRvbWljX3ByaW50X3N0YXRlLAo+ID4gKwkuZm9ybWF0X21v ZF9zdXBwb3J0ZWQgPSBtYWxpZHBfZm9ybWF0X21vZF9zdXBwb3J0ZWRfcGVyX3BsYW5lLAo+ID4g IH07Cj4gPiAgCj4gPiAgc3RhdGljIGludCBtYWxpZHBfc2VfY2hlY2tfc2NhbGluZyhzdHJ1Y3Qg bWFsaWRwX3BsYW5lICptcCwKPiA+IEBAIC00MDYsOCArNTIwLDggQEAgc3RhdGljIGludCBtYWxp ZHBfZGVfcGxhbmVfY2hlY2soc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gPiAgCWZiID0gc3Rh dGUtPmZiOwo+ID4gIAo+ID4gIAltcy0+Zm9ybWF0ID0gbWFsaWRwX2h3X2dldF9mb3JtYXRfaWQo Jm1wLT5od2Rldi0+aHctPm1hcCwKPiA+IC0JCQkJCSAgICAgbXAtPmxheWVyLT5pZCwKPiA+IC0J CQkJCSAgICAgZmItPmZvcm1hdC0+Zm9ybWF0KTsKPiA+ICsJCQkJCSAgICAgbXAtPmxheWVyLT5p ZCwgZmItPmZvcm1hdC0+Zm9ybWF0LAo+ID4gKwkJCQkJICAgICAhIWZiLT5tb2RpZmllcik7Cj4g PiAgCWlmIChtcy0+Zm9ybWF0ID09IE1BTElEUF9JTlZBTElEX0ZPUk1BVF9JRCkKPiA+ICAJCXJl dHVybiAtRUlOVkFMOwo+ID4gIAo+ID4gQEAgLTQ2OSw2ICs1ODMsMTIgQEAgc3RhdGljIGludCBt YWxpZHBfZGVfcGxhbmVfY2hlY2soc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gPiAgCQkJcmV0 dXJuIC1FSU5WQUw7Cj4gPiAgCX0KPiA+ICAKPiA+ICsJLyogU01BUlQgbGF5ZXIgZG9lcyBub3Qg c3VwcG9ydCBBRkJDICovCj4gPiArCWlmIChtcC0+bGF5ZXItPmlkID09IERFX1NNQVJUICYmIGZi LT5tb2RpZmllcikgewo+ID4gKwkJRFJNX0VSUk9SKCJBRkJDIGZyYW1lYnVmZmVyIG5vdCBzdXBw b3J0ZWQgaW4gU01BUlQgbGF5ZXIiKTsKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4gKwl9Cj4g PiArCj4gPiAgCW1zLT5yb3RtZW1fc2l6ZSA9IDA7Cj4gPiAgCWlmIChzdGF0ZS0+cm90YXRpb24g JiBNQUxJRFBfUk9UQVRFRF9NQVNLKSB7Cj4gPiAgCQlpbnQgdmFsOwo+ID4gLS0gCj4gPiAyLjcu NAo+ID4gCj4gCj4gQmVzdCByZWdhcmRzLAo+IExpdml1Cj4gCj4gCj4gLS0gCj4gPT09PT09PT09 PT09PT09PT09PT0KPiB8IEkgd291bGQgbGlrZSB0byB8Cj4gfCBmaXggdGhlIHdvcmxkLCAgfAo+ IHwgYnV0IHRoZXkncmUgbm90IHwKPiB8IGdpdmluZyBtZSB0aGUgICB8Cj4gIFwgc291cmNlIGNv ZGUhICAvCj4gICAtLS0tLS0tLS0tLS0tLS0KPiAgICAgPz9cXyg/Pz8pXy8/Pwo+IF9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gZHJpLWRldmVsIG1haWxp bmcgbGlzdAo+IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbApfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0 CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3Rv cC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK