From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6DEBC48BCF for ; Wed, 9 Jun 2021 17:36:12 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A42A861183 for ; Wed, 9 Jun 2021 17:36:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A42A861183 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 368466EA1A; Wed, 9 Jun 2021 17:36:08 +0000 (UTC) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id A3D766E13C; Wed, 9 Jun 2021 17:36:06 +0000 (UTC) IronPort-SDR: x4dPa0lP9V4+uIjWoigRiA8DJm25pvnA4JP5doLpLIsUukYpdEwPAwqmvq6PEStJqOKtf94eOc rKH5OHOm8z3Q== X-IronPort-AV: E=McAfee;i="6200,9189,10010"; a="202100645" X-IronPort-AV: E=Sophos;i="5.83,261,1616482800"; d="scan'208";a="202100645" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jun 2021 10:36:04 -0700 IronPort-SDR: AcITcgzNUsPcsaroLvtQjHaeP4x+5tfSATQqq34ysHOjJjKIVexVcaehFV65bPpGZFnXXQvLPc Jg05UpKWcvhg== X-IronPort-AV: E=Sophos;i="5.83,261,1616482800"; d="scan'208";a="482468203" Received: from johnharr-mobl1.amr.corp.intel.com (HELO [10.212.251.201]) ([10.212.251.201]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jun 2021 10:36:04 -0700 Subject: Re: [PATCH 07/13] drm/i915/guc: New definition of the CTB registration action To: Daniele Ceraolo Spurio , Matthew Brost , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210607180356.165785-1-matthew.brost@intel.com> <20210607180356.165785-8-matthew.brost@intel.com> <946237c6-1671-b419-5337-d5b8cc02a041@intel.com> From: John Harrison Message-ID: <04a5897a-b521-b999-433e-81c417a19f70@intel.com> Date: Wed, 9 Jun 2021 10:36:03 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <946237c6-1671-b419-5337-d5b8cc02a041@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-GB X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michal.Wajdeczko@intel.com Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 6/7/2021 18:23, Daniele Ceraolo Spurio wrote: > On 6/7/2021 11:03 AM, Matthew Brost wrote: >> From: Michal Wajdeczko >> >> Definition of the CTB registration action has changed. >> Add some ABI documentation and implement required changes. >> >> Signed-off-by: Michal Wajdeczko >> Signed-off-by: Matthew Brost >> Cc: Piotr Piórkowski #4 >> --- >>   .../gpu/drm/i915/gt/uc/abi/guc_actions_abi.h  | 107 ++++++++++++++++++ >>   .../gt/uc/abi/guc_communication_ctb_abi.h     |   4 - >>   drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c     |  76 ++++++++----- >>   3 files changed, 152 insertions(+), 35 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h >> b/drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h >> index 90efef8a73e4..6426fc183692 100644 >> --- a/drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h >> +++ b/drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h >> @@ -6,6 +6,113 @@ >>   #ifndef _ABI_GUC_ACTIONS_ABI_H >>   #define _ABI_GUC_ACTIONS_ABI_H >>   +/** >> + * DOC: HOST2GUC_REGISTER_CTB >> + * >> + * This message is used as part of the `CTB based communication`_ >> setup. >> + * >> + * This message must be sent as `MMIO HXG Message`_. >> + * >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  |   | Bits  | >> Description                                                  | >> + * >> +===+=======+==============================================================+ >> + *  | 0 |    31 | ORIGIN = >> GUC_HXG_ORIGIN_HOST_                                | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   | 30:28 | TYPE = >> GUC_HXG_TYPE_REQUEST_                                 | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   | 27:16 | DATA0 = >> MBZ                                                  | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |  15:0 | ACTION = _`GUC_ACTION_HOST2GUC_REGISTER_CTB` = >> 0x5200        | > > Specs says 4505 > >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  | 1 | 31:12 | RESERVED = >> MBZ                                               | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |  11:8 | **TYPE** - type for the `CT >> Buffer`_                         | >> + *  |   | >> |                                                              | >> + *  |   |       |   - _`GUC_CTB_TYPE_HOST2GUC` = >> 0                             | >> + *  |   |       |   - _`GUC_CTB_TYPE_GUC2HOST` = >> 1                             | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |   7:0 | **SIZE** - size of the `CT Buffer`_ in 4K units >> minus 1      | >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  | 2 |  31:0 | **DESC_ADDR** - GGTT address of the `CTB >> Descriptor`_        | >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  | 3 |  31:0 | **BUFF_ADDF** - GGTT address of the `CT >> Buffer`_             | >> + * >> +---+-------+--------------------------------------------------------------+ >> +* >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  |   | Bits  | >> Description                                                  | >> + * >> +===+=======+==============================================================+ >> + *  | 0 |    31 | ORIGIN = >> GUC_HXG_ORIGIN_GUC_                                 | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   | 30:28 | TYPE = >> GUC_HXG_TYPE_RESPONSE_SUCCESS_                        | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |  27:0 | DATA0 = >> MBZ                                                  | >> + * >> +---+-------+--------------------------------------------------------------+ >> + */ >> +#define GUC_ACTION_HOST2GUC_REGISTER_CTB        0x4505 // FIXME 0x5200 > > Why FIXME? AFAICS the specs still says 4505, even if we plan to update > at some point I don;t think this deserves a FIXME since nothing is > incorrect. > >> + >> +#define HOST2GUC_REGISTER_CTB_REQUEST_MSG_LEN >> (GUC_HXG_REQUEST_MSG_MIN_LEN + 3u) >> +#define HOST2GUC_REGISTER_CTB_REQUEST_MSG_0_MBZ >> GUC_HXG_REQUEST_MSG_0_DATA0 >> +#define HOST2GUC_REGISTER_CTB_REQUEST_MSG_1_MBZ        (0xfffff << 12) >> +#define HOST2GUC_REGISTER_CTB_REQUEST_MSG_1_TYPE    (0xf << 8) >> +#define   GUC_CTB_TYPE_HOST2GUC                0u >> +#define   GUC_CTB_TYPE_GUC2HOST                1u >> +#define HOST2GUC_REGISTER_CTB_REQUEST_MSG_1_SIZE    (0xff << 0) >> +#define HOST2GUC_REGISTER_CTB_REQUEST_MSG_2_DESC_ADDR >> GUC_HXG_REQUEST_MSG_n_DATAn >> +#define HOST2GUC_REGISTER_CTB_REQUEST_MSG_3_BUFF_ADDR >> GUC_HXG_REQUEST_MSG_n_DATAn > > The full mask still seems like overkill to me and I still think we > should use BIT()/GENMASK() and a _MASK prefix, but not going to block > on it. > >> + >> +#define HOST2GUC_REGISTER_CTB_RESPONSE_MSG_LEN >> GUC_HXG_RESPONSE_MSG_MIN_LEN >> +#define HOST2GUC_REGISTER_CTB_RESPONSE_MSG_0_MBZ >> GUC_HXG_RESPONSE_MSG_0_DATA0 >> + >> +/** >> + * DOC: HOST2GUC_DEREGISTER_CTB >> + * >> + * This message is used as part of the `CTB based communication`_ >> teardown. >> + * >> + * This message must be sent as `MMIO HXG Message`_. >> + * >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  |   | Bits  | >> Description                                                  | >> + * >> +===+=======+==============================================================+ >> + *  | 0 |    31 | ORIGIN = >> GUC_HXG_ORIGIN_HOST_                                | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   | 30:28 | TYPE = >> GUC_HXG_TYPE_REQUEST_                                 | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   | 27:16 | DATA0 = >> MBZ                                                  | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |  15:0 | ACTION = _`GUC_ACTION_HOST2GUC_DEREGISTER_CTB` = >> 0x5201      | > > Specs says 4506 > I would say that the enum value should not be included in the structure definition. I would also argue that there is no point in repeating the common header structure for every single H2G action definition. That is just overly verbose and makes it harder to read the spec. It implies that every action has a different header structure and must be coded individually. Personally, I don't believe we should be replicating the entire GuC API spec in the driver header files anyway. This is not something that is defined by the i915 driver so the i915 driver should not be defining it! Instead, just include a link or pointer to where the actual spec can be found. We don't copy the entire bspec page for every register that the driver touches, so why should this be any different? John. >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  | 1 | 31:12 | RESERVED = >> MBZ                                               | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |  11:8 | **TYPE** - type of the `CT >> Buffer`_                          | >> + *  |   | >> |                                                              | >> + *  |   |       | see >> `GUC_ACTION_HOST2GUC_REGISTER_CTB`_                      | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |   7:0 | RESERVED = >> MBZ                                               | >> + * >> +---+-------+--------------------------------------------------------------+ >> +* >> + * >> +---+-------+--------------------------------------------------------------+ >> + *  |   | Bits  | >> Description                                                  | >> + * >> +===+=======+==============================================================+ >> + *  | 0 |    31 | ORIGIN = >> GUC_HXG_ORIGIN_GUC_                                 | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   | 30:28 | TYPE = >> GUC_HXG_TYPE_RESPONSE_SUCCESS_                        | >> + *  | >> +-------+--------------------------------------------------------------+ >> + *  |   |  27:0 | DATA0 = >> MBZ                                                  | >> + * >> +---+-------+--------------------------------------------------------------+ >> + */ >> +#define GUC_ACTION_HOST2GUC_DEREGISTER_CTB        0x4506 // FIXME >> 0x5201 > > Same comment for the FIXME as above > >> + >> +#define HOST2GUC_DEREGISTER_CTB_REQUEST_MSG_LEN >> (GUC_HXG_REQUEST_MSG_MIN_LEN + 1u) >> +#define HOST2GUC_DEREGISTER_CTB_REQUEST_MSG_0_MBZ >> GUC_HXG_REQUEST_MSG_0_DATA0 >> +#define HOST2GUC_DEREGISTER_CTB_REQUEST_MSG_1_MBZ    (0xfffff << 12) >> +#define HOST2GUC_DEREGISTER_CTB_REQUEST_MSG_1_TYPE    (0xf << 8) >> +#define HOST2GUC_DEREGISTER_CTB_REQUEST_MSG_1_MBZ2    (0xff << 0) >> + >> +#define HOST2GUC_DEREGISTER_CTB_RESPONSE_MSG_LEN >> GUC_HXG_RESPONSE_MSG_MIN_LEN >> +#define HOST2GUC_DEREGISTER_CTB_RESPONSE_MSG_0_MBZ >> GUC_HXG_RESPONSE_MSG_0_DATA0 >> + >> +/* legacy definitions */ >> + >>   enum intel_guc_action { >>       INTEL_GUC_ACTION_DEFAULT = 0x0, >>       INTEL_GUC_ACTION_REQUEST_PREEMPTION = 0x2, >> diff --git >> a/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h >> b/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h >> index c2a069a78e01..127b256a662c 100644 >> --- a/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h >> +++ b/drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h >> @@ -112,10 +112,6 @@ static_assert(sizeof(struct guc_ct_buffer_desc) >> == 64); >>    * - **flags**, holds various bits to control message handling >>    */ >>   -/* Type of command transport buffer */ >> -#define INTEL_GUC_CT_BUFFER_TYPE_SEND    0x0u >> -#define INTEL_GUC_CT_BUFFER_TYPE_RECV    0x1u >> - >>   /* >>    * Definition of the command transport message header (DW0) >>    * >> diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c >> b/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c >> index 3241a477196f..6a29be779cc9 100644 >> --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c >> +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c >> @@ -103,9 +103,9 @@ void intel_guc_ct_init_early(struct intel_guc_ct >> *ct) >>   static inline const char *guc_ct_buffer_type_to_str(u32 type) >>   { >>       switch (type) { >> -    case INTEL_GUC_CT_BUFFER_TYPE_SEND: >> +    case GUC_CTB_TYPE_HOST2GUC: >>           return "SEND"; >> -    case INTEL_GUC_CT_BUFFER_TYPE_RECV: >> +    case GUC_CTB_TYPE_GUC2HOST: >>           return "RECV"; >>       default: >>           return ""; >> @@ -136,25 +136,33 @@ static void guc_ct_buffer_init(struct >> intel_guc_ct_buffer *ctb, >>       guc_ct_buffer_reset(ctb); >>   } >>   -static int guc_action_register_ct_buffer(struct intel_guc *guc, >> -                     u32 desc_addr, >> -                     u32 type) >> +static int guc_action_register_ct_buffer(struct intel_guc *guc, u32 >> type, >> +                     u32 desc_addr, u32 buff_addr, u32 size) >>   { >> -    u32 action[] = { >> -        INTEL_GUC_ACTION_REGISTER_COMMAND_TRANSPORT_BUFFER, >> -        desc_addr, >> -        sizeof(struct guc_ct_buffer_desc), >> -        type >> +    u32 request[HOST2GUC_REGISTER_CTB_REQUEST_MSG_LEN] = { >> +        FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_HOST) | >> +        FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_REQUEST) | >> +        FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION, >> GUC_ACTION_HOST2GUC_REGISTER_CTB), > > IMO we could use a macro or 2 for the HXG header, to avoid all these > lines, which are hard to read. something like: > > GUC_HXG_HEADER(origin, type, data, action) \ >     (FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, origin) | \ >      FIELD_PREP(GUC_HXG_MSG_0_TYPE, type) | \ > FIELD_PREP(GUC_HXG_MSG_0_DATA0, data) | \ >      FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION, action)) > > H2G_HEADER(type, data, action) \ >     GUC_HXG_HEADER(GUC_HXG_ORIGIN_HOST, type, data, action) > > and then call > > H2G_HEADER(GUC_HXG_TYPE_REQUEST, 0, GUC_ACTION_HOST2GUC_REGISTER_CTB) > > > Not a blocker. > > Daniele > >> + FIELD_PREP(HOST2GUC_REGISTER_CTB_REQUEST_MSG_1_SIZE, size / SZ_4K - >> 1) | >> +        FIELD_PREP(HOST2GUC_REGISTER_CTB_REQUEST_MSG_1_TYPE, type), >> + FIELD_PREP(HOST2GUC_REGISTER_CTB_REQUEST_MSG_2_DESC_ADDR, desc_addr), >> + FIELD_PREP(HOST2GUC_REGISTER_CTB_REQUEST_MSG_3_BUFF_ADDR, buff_addr), >>       }; >>   -    /* Can't use generic send(), CT registration must go over MMIO */ >> -    return intel_guc_send_mmio(guc, action, ARRAY_SIZE(action), >> NULL, 0); >> +    GEM_BUG_ON(type != GUC_CTB_TYPE_HOST2GUC && type != >> GUC_CTB_TYPE_GUC2HOST); >> +    GEM_BUG_ON(size % SZ_4K); >> + >> +    /* CT registration must go over MMIO */ >> +    return intel_guc_send_mmio(guc, request, ARRAY_SIZE(request), >> NULL, 0); >>   } >>   -static int ct_register_buffer(struct intel_guc_ct *ct, u32 >> desc_addr, u32 type) >> +static int ct_register_buffer(struct intel_guc_ct *ct, u32 type, >> +                  u32 desc_addr, u32 buff_addr, u32 size) >>   { >> -    int err = guc_action_register_ct_buffer(ct_to_guc(ct), >> desc_addr, type); >> +    int err; >>   +    err = guc_action_register_ct_buffer(ct_to_guc(ct), type, >> +                        desc_addr, buff_addr, size); >>       if (unlikely(err)) >>           CT_ERROR(ct, "Failed to register %s buffer (err=%d)\n", >>                guc_ct_buffer_type_to_str(type), err); >> @@ -163,14 +171,17 @@ static int ct_register_buffer(struct >> intel_guc_ct *ct, u32 desc_addr, u32 type) >>     static int guc_action_deregister_ct_buffer(struct intel_guc *guc, >> u32 type) >>   { >> -    u32 action[] = { >> -        INTEL_GUC_ACTION_DEREGISTER_COMMAND_TRANSPORT_BUFFER, >> -        CTB_OWNER_HOST, >> -        type >> +    u32 request[HOST2GUC_DEREGISTER_CTB_REQUEST_MSG_LEN] = { >> +        FIELD_PREP(GUC_HXG_MSG_0_ORIGIN, GUC_HXG_ORIGIN_HOST) | >> +        FIELD_PREP(GUC_HXG_MSG_0_TYPE, GUC_HXG_TYPE_REQUEST) | >> +        FIELD_PREP(GUC_HXG_REQUEST_MSG_0_ACTION, >> GUC_ACTION_HOST2GUC_DEREGISTER_CTB), >> +        FIELD_PREP(HOST2GUC_DEREGISTER_CTB_REQUEST_MSG_1_TYPE, type), >>       }; >>   -    /* Can't use generic send(), CT deregistration must go over >> MMIO */ >> -    return intel_guc_send_mmio(guc, action, ARRAY_SIZE(action), >> NULL, 0); >> +    GEM_BUG_ON(type != GUC_CTB_TYPE_HOST2GUC && type != >> GUC_CTB_TYPE_GUC2HOST); >> + >> +    /* CT deregistration must go over MMIO */ >> +    return intel_guc_send_mmio(guc, request, ARRAY_SIZE(request), >> NULL, 0); >>   } >>     static int ct_deregister_buffer(struct intel_guc_ct *ct, u32 type) >> @@ -258,7 +269,7 @@ void intel_guc_ct_fini(struct intel_guc_ct *ct) >>   int intel_guc_ct_enable(struct intel_guc_ct *ct) >>   { >>       struct intel_guc *guc = ct_to_guc(ct); >> -    u32 base, cmds; >> +    u32 base, desc, cmds; >>       void *blob; >>       int err; >>   @@ -274,23 +285,26 @@ int intel_guc_ct_enable(struct intel_guc_ct *ct) >>       GEM_BUG_ON(blob != ct->ctbs.send.desc); >>         /* (re)initialize descriptors */ >> -    cmds = base + ptrdiff(ct->ctbs.send.cmds, blob); >>       guc_ct_buffer_reset(&ct->ctbs.send); >> - >> -    cmds = base + ptrdiff(ct->ctbs.recv.cmds, blob); >>       guc_ct_buffer_reset(&ct->ctbs.recv); >>         /* >>        * Register both CT buffers starting with RECV buffer. >>        * Descriptors are in first half of the blob. >>        */ >> -    err = ct_register_buffer(ct, base + ptrdiff(ct->ctbs.recv.desc, >> blob), >> -                 INTEL_GUC_CT_BUFFER_TYPE_RECV); >> +    desc = base + ptrdiff(ct->ctbs.recv.desc, blob); >> +    cmds = base + ptrdiff(ct->ctbs.recv.cmds, blob); >> +    err = ct_register_buffer(ct, GUC_CTB_TYPE_GUC2HOST, >> +                 desc, cmds, ct->ctbs.recv.size * 4); >> + >>       if (unlikely(err)) >>           goto err_out; >>   -    err = ct_register_buffer(ct, base + >> ptrdiff(ct->ctbs.send.desc, blob), >> -                 INTEL_GUC_CT_BUFFER_TYPE_SEND); >> +    desc = base + ptrdiff(ct->ctbs.send.desc, blob); >> +    cmds = base + ptrdiff(ct->ctbs.send.cmds, blob); >> +    err = ct_register_buffer(ct, GUC_CTB_TYPE_HOST2GUC, >> +                 desc, cmds, ct->ctbs.send.size * 4); >> + >>       if (unlikely(err)) >>           goto err_deregister; >>   @@ -299,7 +313,7 @@ int intel_guc_ct_enable(struct intel_guc_ct *ct) >>       return 0; >>     err_deregister: >> -    ct_deregister_buffer(ct, INTEL_GUC_CT_BUFFER_TYPE_RECV); >> +    ct_deregister_buffer(ct, GUC_CTB_TYPE_GUC2HOST); >>   err_out: >>       CT_PROBE_ERROR(ct, "Failed to enable CTB (%pe)\n", ERR_PTR(err)); >>       return err; >> @@ -318,8 +332,8 @@ void intel_guc_ct_disable(struct intel_guc_ct *ct) >>       ct->enabled = false; >>         if (intel_guc_is_fw_running(guc)) { >> -        ct_deregister_buffer(ct, INTEL_GUC_CT_BUFFER_TYPE_SEND); >> -        ct_deregister_buffer(ct, INTEL_GUC_CT_BUFFER_TYPE_RECV); >> +        ct_deregister_buffer(ct, GUC_CTB_TYPE_HOST2GUC); >> +        ct_deregister_buffer(ct, GUC_CTB_TYPE_GUC2HOST); >>       } >>   } > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 651FEC48BCD for ; Wed, 9 Jun 2021 17:36:08 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3536861183 for ; Wed, 9 Jun 2021 17:36:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3536861183 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 78A366E13C; Wed, 9 Jun 2021 17:36:07 +0000 (UTC) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id A3D766E13C; Wed, 9 Jun 2021 17:36:06 +0000 (UTC) IronPort-SDR: x4dPa0lP9V4+uIjWoigRiA8DJm25pvnA4JP5doLpLIsUukYpdEwPAwqmvq6PEStJqOKtf94eOc rKH5OHOm8z3Q== X-IronPort-AV: E=McAfee;i="6200,9189,10010"; a="202100645" X-IronPort-AV: E=Sophos;i="5.83,261,1616482800"; d="scan'208";a="202100645" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jun 2021 10:36:04 -0700 IronPort-SDR: AcITcgzNUsPcsaroLvtQjHaeP4x+5tfSATQqq34ysHOjJjKIVexVcaehFV65bPpGZFnXXQvLPc Jg05UpKWcvhg== X-IronPort-AV: E=Sophos;i="5.83,261,1616482800"; d="scan'208";a="482468203" Received: from johnharr-mobl1.amr.corp.intel.com (HELO [10.212.251.201]) ([10.212.251.201]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jun 2021 10:36:04 -0700 To: Daniele Ceraolo Spurio , Matthew Brost , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org References: <20210607180356.165785-1-matthew.brost@intel.com> <20210607180356.165785-8-matthew.brost@intel.com> <946237c6-1671-b419-5337-d5b8cc02a041@intel.com> From: John Harrison Message-ID: <04a5897a-b521-b999-433e-81c417a19f70@intel.com> Date: Wed, 9 Jun 2021 10:36:03 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <946237c6-1671-b419-5337-d5b8cc02a041@intel.com> Content-Language: en-GB Subject: Re: [Intel-gfx] [PATCH 07/13] drm/i915/guc: New definition of the CTB registration action X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gNi83LzIwMjEgMTg6MjMsIERhbmllbGUgQ2VyYW9sbyBTcHVyaW8gd3JvdGU6Cj4gT24gNi83 LzIwMjEgMTE6MDMgQU0sIE1hdHRoZXcgQnJvc3Qgd3JvdGU6Cj4+IEZyb206IE1pY2hhbCBXYWpk ZWN6a28gPG1pY2hhbC53YWpkZWN6a29AaW50ZWwuY29tPgo+Pgo+PiBEZWZpbml0aW9uIG9mIHRo ZSBDVEIgcmVnaXN0cmF0aW9uIGFjdGlvbiBoYXMgY2hhbmdlZC4KPj4gQWRkIHNvbWUgQUJJIGRv Y3VtZW50YXRpb24gYW5kIGltcGxlbWVudCByZXF1aXJlZCBjaGFuZ2VzLgo+Pgo+PiBTaWduZWQt b2ZmLWJ5OiBNaWNoYWwgV2FqZGVjemtvIDxtaWNoYWwud2FqZGVjemtvQGludGVsLmNvbT4KPj4g U2lnbmVkLW9mZi1ieTogTWF0dGhldyBCcm9zdCA8bWF0dGhldy5icm9zdEBpbnRlbC5jb20+Cj4+ IENjOiBQaW90ciBQacOzcmtvd3NraSA8cGlvdHIucGlvcmtvd3NraUBpbnRlbC5jb20+ICM0Cj4+ IC0tLQo+PiDCoCAuLi4vZ3B1L2RybS9pOTE1L2d0L3VjL2FiaS9ndWNfYWN0aW9uc19hYmkuaMKg IHwgMTA3ICsrKysrKysrKysrKysrKysrKwo+PiDCoCAuLi4vZ3QvdWMvYWJpL2d1Y19jb21tdW5p Y2F0aW9uX2N0Yl9hYmkuaMKgwqDCoMKgIHzCoMKgIDQgLQo+PiDCoCBkcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC91Yy9pbnRlbF9ndWNfY3QuY8KgwqDCoMKgIHzCoCA3NiArKysrKysrKy0tLS0tCj4+ IMKgIDMgZmlsZXMgY2hhbmdlZCwgMTUyIGluc2VydGlvbnMoKyksIDM1IGRlbGV0aW9ucygtKQo+ Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvYWJpL2d1Y19hY3Rp b25zX2FiaS5oIAo+PiBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2FiaS9ndWNfYWN0aW9u c19hYmkuaAo+PiBpbmRleCA5MGVmZWY4YTczZTQuLjY0MjZmYzE4MzY5MiAxMDA2NDQKPj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvYWJpL2d1Y19hY3Rpb25zX2FiaS5oCj4+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2FiaS9ndWNfYWN0aW9uc19hYmkuaAo+PiBA QCAtNiw2ICs2LDExMyBAQAo+PiDCoCAjaWZuZGVmIF9BQklfR1VDX0FDVElPTlNfQUJJX0gKPj4g wqAgI2RlZmluZSBfQUJJX0dVQ19BQ1RJT05TX0FCSV9ICj4+IMKgICsvKioKPj4gKyAqIERPQzog SE9TVDJHVUNfUkVHSVNURVJfQ1RCCj4+ICsgKgo+PiArICogVGhpcyBtZXNzYWdlIGlzIHVzZWQg YXMgcGFydCBvZiB0aGUgYENUQiBiYXNlZCBjb21tdW5pY2F0aW9uYF8gCj4+IHNldHVwLgo+PiAr ICoKPj4gKyAqIFRoaXMgbWVzc2FnZSBtdXN0IGJlIHNlbnQgYXMgYE1NSU8gSFhHIE1lc3NhZ2Vg Xy4KPj4gKyAqCj4+ICsgKiAKPj4gKy0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+PiArICrCoCB8wqDCoCB8 IEJpdHPCoCB8IAo+PiBEZXNjcmlwdGlvbsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHwKPj4gKyAqIAo+PiArPT09Kz09PT09PT0rPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCj4+ICsgKsKgIHwgMCB8 wqDCoMKgIDMxIHwgT1JJR0lOID0gCj4+IEdVQ19IWEdfT1JJR0lOX0hPU1RfwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+PiAr ICrCoCB8IAo+PiArLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqwqAgfMKgwqAgfCAzMDoyOCB8IFRZUEUg PSAKPj4gR1VDX0hYR19UWVBFX1JFUVVFU1RfwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4+ICsgKsKgIHwgCj4+ICstLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tKwo+PiArICrCoCB8wqDCoCB8IDI3OjE2IHwgREFUQTAgPSAKPj4gTUJawqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+PiArICrCoCB8IAo+PiArLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSsKPj4gKyAqwqAgfMKgwqAgfMKgIDE1OjAgfCBBQ1RJT04gPSBfYEdVQ19BQ1RJ T05fSE9TVDJHVUNfUkVHSVNURVJfQ1RCYCA9IAo+PiAweDUyMDDCoMKgwqDCoMKgwqDCoCB8Cj4K PiBTcGVjcyBzYXlzIDQ1MDUKPgo+PiArICogCj4+ICstLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAq wqAgfCAxIHwgMzE6MTIgfCBSRVNFUlZFRCA9IAo+PiBNQlrCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB8Cj4+ICsgKsKgIHwgCj4+ICstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+PiArICrCoCB8 wqDCoCB8wqAgMTE6OCB8ICoqVFlQRSoqIC0gdHlwZSBmb3IgdGhlIGBDVCAKPj4gQnVmZmVyYF/C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+PiArICrC oCB8wqDCoCB8IAo+PiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+PiArICrCoCB8wqDCoCB8wqDCoMKgwqDCoMKgIHzC oMKgIC0gX2BHVUNfQ1RCX1RZUEVfSE9TVDJHVUNgID0gCj4+IDDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4+ICsgKsKgIHzCoMKgIHzC oMKgwqDCoMKgwqAgfMKgwqAgLSBfYEdVQ19DVEJfVFlQRV9HVUMySE9TVGAgPSAKPj4gMcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPj4g KyAqwqAgfCAKPj4gKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKsKgIHzCoMKgIHzCoMKgIDc6MCB8ICoq U0laRSoqIC0gc2l6ZSBvZiB0aGUgYENUIEJ1ZmZlcmBfIGluIDRLIHVuaXRzIAo+PiBtaW51cyAx wqDCoMKgwqDCoCB8Cj4+ICsgKiAKPj4gKy0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+PiArICrCoCB8IDIg fMKgIDMxOjAgfCAqKkRFU0NfQUREUioqIC0gR0dUVCBhZGRyZXNzIG9mIHRoZSBgQ1RCIAo+PiBE ZXNjcmlwdG9yYF/CoMKgwqDCoMKgwqDCoCB8Cj4+ICsgKiAKPj4gKy0tLSstLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Kwo+PiArICrCoCB8IDMgfMKgIDMxOjAgfCAqKkJVRkZfQURERioqIC0gR0dUVCBhZGRyZXNzIG9m IHRoZSBgQ1QgCj4+IEJ1ZmZlcmBfwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPj4gKyAqIAo+ PiArLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4+ICsqCj4+ICsgKiAKPj4gKy0tLSstLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Kwo+PiArICrCoCB8wqDCoCB8IEJpdHPCoCB8IAo+PiBEZXNjcmlwdGlvbsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPj4gKyAqIAo+PiArPT09Kz09PT09PT0rPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0rCj4+ICsgKsKgIHwgMCB8wqDCoMKgIDMxIHwgT1JJR0lOID0gCj4+IEdVQ19IWEdfT1JJR0lO X0dVQ1/CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHwKPj4gKyAqwqAgfCAKPj4gKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKsKgIHzC oMKgIHwgMzA6MjggfCBUWVBFID0gCj4+IEdVQ19IWEdfVFlQRV9SRVNQT05TRV9TVUNDRVNTX8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+PiArICrCoCB8 IAo+PiArLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqwqAgfMKgwqAgfMKgIDI3OjAgfCBEQVRBMCA9IAo+ PiBNQlrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4+ICsgKiAK Pj4gKy0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+PiArICovCj4+ICsjZGVmaW5lIEdVQ19BQ1RJT05fSE9T VDJHVUNfUkVHSVNURVJfQ1RCwqDCoMKgwqDCoMKgwqAgMHg0NTA1IC8vIEZJWE1FIDB4NTIwMAo+ Cj4gV2h5IEZJWE1FPyBBRkFJQ1MgdGhlIHNwZWNzIHN0aWxsIHNheXMgNDUwNSwgZXZlbiBpZiB3 ZSBwbGFuIHRvIHVwZGF0ZSAKPiBhdCBzb21lIHBvaW50IEkgZG9uO3QgdGhpbmsgdGhpcyBkZXNl cnZlcyBhIEZJWE1FIHNpbmNlIG5vdGhpbmcgaXMgCj4gaW5jb3JyZWN0Lgo+Cj4+ICsKPj4gKyNk ZWZpbmUgSE9TVDJHVUNfUkVHSVNURVJfQ1RCX1JFUVVFU1RfTVNHX0xFTiAKPj4gKEdVQ19IWEdf UkVRVUVTVF9NU0dfTUlOX0xFTiArIDN1KQo+PiArI2RlZmluZSBIT1NUMkdVQ19SRUdJU1RFUl9D VEJfUkVRVUVTVF9NU0dfMF9NQlogCj4+IEdVQ19IWEdfUkVRVUVTVF9NU0dfMF9EQVRBMAo+PiAr I2RlZmluZSBIT1NUMkdVQ19SRUdJU1RFUl9DVEJfUkVRVUVTVF9NU0dfMV9NQlrCoMKgwqDCoMKg wqDCoCAoMHhmZmZmZiA8PCAxMikKPj4gKyNkZWZpbmUgSE9TVDJHVUNfUkVHSVNURVJfQ1RCX1JF UVVFU1RfTVNHXzFfVFlQRcKgwqDCoCAoMHhmIDw8IDgpCj4+ICsjZGVmaW5lwqDCoCBHVUNfQ1RC X1RZUEVfSE9TVDJHVUPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHUKPj4gKyNkZWZp bmXCoMKgIEdVQ19DVEJfVFlQRV9HVUMySE9TVMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAxdQo+PiArI2RlZmluZSBIT1NUMkdVQ19SRUdJU1RFUl9DVEJfUkVRVUVTVF9NU0dfMV9TSVpF wqDCoMKgICgweGZmIDw8IDApCj4+ICsjZGVmaW5lIEhPU1QyR1VDX1JFR0lTVEVSX0NUQl9SRVFV RVNUX01TR18yX0RFU0NfQUREUiAKPj4gR1VDX0hYR19SRVFVRVNUX01TR19uX0RBVEFuCj4+ICsj ZGVmaW5lIEhPU1QyR1VDX1JFR0lTVEVSX0NUQl9SRVFVRVNUX01TR18zX0JVRkZfQUREUiAKPj4g R1VDX0hYR19SRVFVRVNUX01TR19uX0RBVEFuCj4KPiBUaGUgZnVsbCBtYXNrIHN0aWxsIHNlZW1z IGxpa2Ugb3ZlcmtpbGwgdG8gbWUgYW5kIEkgc3RpbGwgdGhpbmsgd2UgCj4gc2hvdWxkIHVzZSBC SVQoKS9HRU5NQVNLKCkgYW5kIGEgX01BU0sgcHJlZml4LCBidXQgbm90IGdvaW5nIHRvIGJsb2Nr IAo+IG9uIGl0Lgo+Cj4+ICsKPj4gKyNkZWZpbmUgSE9TVDJHVUNfUkVHSVNURVJfQ1RCX1JFU1BP TlNFX01TR19MRU4gCj4+IEdVQ19IWEdfUkVTUE9OU0VfTVNHX01JTl9MRU4KPj4gKyNkZWZpbmUg SE9TVDJHVUNfUkVHSVNURVJfQ1RCX1JFU1BPTlNFX01TR18wX01CWiAKPj4gR1VDX0hYR19SRVNQ T05TRV9NU0dfMF9EQVRBMAo+PiArCj4+ICsvKioKPj4gKyAqIERPQzogSE9TVDJHVUNfREVSRUdJ U1RFUl9DVEIKPj4gKyAqCj4+ICsgKiBUaGlzIG1lc3NhZ2UgaXMgdXNlZCBhcyBwYXJ0IG9mIHRo ZSBgQ1RCIGJhc2VkIGNvbW11bmljYXRpb25gXyAKPj4gdGVhcmRvd24uCj4+ICsgKgo+PiArICog VGhpcyBtZXNzYWdlIG11c3QgYmUgc2VudCBhcyBgTU1JTyBIWEcgTWVzc2FnZWBfLgo+PiArICoK Pj4gKyAqIAo+PiArLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKsKgIHzCoMKgIHwgQml0c8KgIHwg Cj4+IERlc2NyaXB0aW9uwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fAo+PiArICogCj4+ICs9PT0rPT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKPj4gKyAqwqAgfCAwIHzCoMKgwqAgMzEg fCBPUklHSU4gPSAKPj4gR1VDX0hYR19PUklHSU5fSE9TVF/CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4+ICsgKsKgIHwgCj4+ ICstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKwo+PiArICrCoCB8wqDCoCB8IDMwOjI4IHwgVFlQRSA9IAo+PiBHVUNf SFhHX1RZUEVfUkVRVUVTVF/CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPj4gKyAqwqAgfCAKPj4gKy0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r Cj4+ICsgKsKgIHzCoMKgIHwgMjc6MTYgfCBEQVRBMCA9IAo+PiBNQlrCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8Cj4+ICsgKsKgIHwgCj4+ICstLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Kwo+PiArICrCoCB8wqDCoCB8wqAgMTU6MCB8IEFDVElPTiA9IF9gR1VDX0FDVElPTl9IT1NUMkdV Q19ERVJFR0lTVEVSX0NUQmAgPSAKPj4gMHg1MjAxwqDCoMKgwqDCoCB8Cj4KPiBTcGVjcyBzYXlz IDQ1MDYKPgpJIHdvdWxkIHNheSB0aGF0IHRoZSBlbnVtIHZhbHVlIHNob3VsZCBub3QgYmUgaW5j bHVkZWQgaW4gdGhlIHN0cnVjdHVyZSAKZGVmaW5pdGlvbi4gSSB3b3VsZCBhbHNvIGFyZ3VlIHRo YXQgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmVwZWF0aW5nIHRoZSAKY29tbW9uIGhlYWRlciBzdHJ1 Y3R1cmUgZm9yIGV2ZXJ5IHNpbmdsZSBIMkcgYWN0aW9uIGRlZmluaXRpb24uIFRoYXQgaXMgCmp1 c3Qgb3Zlcmx5IHZlcmJvc2UgYW5kIG1ha2VzIGl0IGhhcmRlciB0byByZWFkIHRoZSBzcGVjLiBJ dCBpbXBsaWVzIAp0aGF0IGV2ZXJ5IGFjdGlvbiBoYXMgYSBkaWZmZXJlbnQgaGVhZGVyIHN0cnVj dHVyZSBhbmQgbXVzdCBiZSBjb2RlZCAKaW5kaXZpZHVhbGx5LgoKUGVyc29uYWxseSwgSSBkb24n dCBiZWxpZXZlIHdlIHNob3VsZCBiZSByZXBsaWNhdGluZyB0aGUgZW50aXJlIEd1QyBBUEkgCnNw ZWMgaW4gdGhlIGRyaXZlciBoZWFkZXIgZmlsZXMgYW55d2F5LiBUaGlzIGlzIG5vdCBzb21ldGhp bmcgdGhhdCBpcyAKZGVmaW5lZCBieSB0aGUgaTkxNSBkcml2ZXIgc28gdGhlIGk5MTUgZHJpdmVy IHNob3VsZCBub3QgYmUgZGVmaW5pbmcgaXQhIApJbnN0ZWFkLCBqdXN0IGluY2x1ZGUgYSBsaW5r IG9yIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFjdHVhbCBzcGVjIGNhbiBiZSAKZm91bmQuIFdlIGRv bid0IGNvcHkgdGhlIGVudGlyZSBic3BlYyBwYWdlIGZvciBldmVyeSByZWdpc3RlciB0aGF0IHRo ZSAKZHJpdmVyIHRvdWNoZXMsIHNvIHdoeSBzaG91bGQgdGhpcyBiZSBhbnkgZGlmZmVyZW50PwoK Sm9obi4KCgo+PiArICogCj4+ICstLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqwqAgfCAxIHwgMzE6 MTIgfCBSRVNFUlZFRCA9IAo+PiBNQlrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB8Cj4+ICsgKsKgIHwgCj4+ICstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+PiArICrCoCB8wqDCoCB8wqAgMTE6 OCB8ICoqVFlQRSoqIC0gdHlwZSBvZiB0aGUgYENUIAo+PiBCdWZmZXJgX8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwKPj4gKyAqwqAgfMKgwqAgfCAK Pj4gfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHwKPj4gKyAqwqAgfMKgwqAgfMKgwqDCoMKgwqDCoCB8IHNlZSAKPj4gYEdV Q19BQ1RJT05fSE9TVDJHVUNfUkVHSVNURVJfQ1RCYF/CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfAo+PiArICrCoCB8IAo+PiArLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAq wqAgfMKgwqAgfMKgwqAgNzowIHwgUkVTRVJWRUQgPSAKPj4gTUJawqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfAo+PiArICogCj4+ICstLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyoK Pj4gKyAqIAo+PiArLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKsKgIHzCoMKgIHwgQml0c8KgIHwg Cj4+IERlc2NyaXB0aW9uwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg fAo+PiArICogCj4+ICs9PT0rPT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKPj4gKyAqwqAgfCAwIHzCoMKgwqAgMzEg fCBPUklHSU4gPSAKPj4gR1VDX0hYR19PUklHSU5fR1VDX8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfAo+PiArICrCoCB8IAo+ PiArLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqwqAgfMKgwqAgfCAzMDoyOCB8IFRZUEUgPSAKPj4gR1VD X0hYR19UWVBFX1JFU1BPTlNFX1NVQ0NFU1NfwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB8Cj4+ICsgKsKgIHwgCj4+ICstLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+PiArICrC oCB8wqDCoCB8wqAgMjc6MCB8IERBVEEwID0gCj4+IE1CWsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHwKPj4gKyAqIAo+PiArLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4+ICsg Ki8KPj4gKyNkZWZpbmUgR1VDX0FDVElPTl9IT1NUMkdVQ19ERVJFR0lTVEVSX0NUQsKgwqDCoMKg wqDCoMKgIDB4NDUwNiAvLyBGSVhNRSAKPj4gMHg1MjAxCj4KPiBTYW1lIGNvbW1lbnQgZm9yIHRo ZSBGSVhNRSBhcyBhYm92ZQo+Cj4+ICsKPj4gKyNkZWZpbmUgSE9TVDJHVUNfREVSRUdJU1RFUl9D VEJfUkVRVUVTVF9NU0dfTEVOIAo+PiAoR1VDX0hYR19SRVFVRVNUX01TR19NSU5fTEVOICsgMXUp Cj4+ICsjZGVmaW5lIEhPU1QyR1VDX0RFUkVHSVNURVJfQ1RCX1JFUVVFU1RfTVNHXzBfTUJaIAo+ PiBHVUNfSFhHX1JFUVVFU1RfTVNHXzBfREFUQTAKPj4gKyNkZWZpbmUgSE9TVDJHVUNfREVSRUdJ U1RFUl9DVEJfUkVRVUVTVF9NU0dfMV9NQlrCoMKgwqAgKDB4ZmZmZmYgPDwgMTIpCj4+ICsjZGVm aW5lIEhPU1QyR1VDX0RFUkVHSVNURVJfQ1RCX1JFUVVFU1RfTVNHXzFfVFlQRcKgwqDCoCAoMHhm IDw8IDgpCj4+ICsjZGVmaW5lIEhPU1QyR1VDX0RFUkVHSVNURVJfQ1RCX1JFUVVFU1RfTVNHXzFf TUJaMsKgwqDCoCAoMHhmZiA8PCAwKQo+PiArCj4+ICsjZGVmaW5lIEhPU1QyR1VDX0RFUkVHSVNU RVJfQ1RCX1JFU1BPTlNFX01TR19MRU4gCj4+IEdVQ19IWEdfUkVTUE9OU0VfTVNHX01JTl9MRU4K Pj4gKyNkZWZpbmUgSE9TVDJHVUNfREVSRUdJU1RFUl9DVEJfUkVTUE9OU0VfTVNHXzBfTUJaIAo+ PiBHVUNfSFhHX1JFU1BPTlNFX01TR18wX0RBVEEwCj4+ICsKPj4gKy8qIGxlZ2FjeSBkZWZpbml0 aW9ucyAqLwo+PiArCj4+IMKgIGVudW0gaW50ZWxfZ3VjX2FjdGlvbiB7Cj4+IMKgwqDCoMKgwqAg SU5URUxfR1VDX0FDVElPTl9ERUZBVUxUID0gMHgwLAo+PiDCoMKgwqDCoMKgIElOVEVMX0dVQ19B Q1RJT05fUkVRVUVTVF9QUkVFTVBUSU9OID0gMHgyLAo+PiBkaWZmIC0tZ2l0IAo+PiBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2d0L3VjL2FiaS9ndWNfY29tbXVuaWNhdGlvbl9jdGJfYWJpLmggCj4+ IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvYWJpL2d1Y19jb21tdW5pY2F0aW9uX2N0Yl9h YmkuaAo+PiBpbmRleCBjMmEwNjlhNzhlMDEuLjEyN2IyNTZhNjYyYyAxMDA2NDQKPj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvYWJpL2d1Y19jb21tdW5pY2F0aW9uX2N0Yl9hYmku aAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9hYmkvZ3VjX2NvbW11bmljYXRp b25fY3RiX2FiaS5oCj4+IEBAIC0xMTIsMTAgKzExMiw2IEBAIHN0YXRpY19hc3NlcnQoc2l6ZW9m KHN0cnVjdCBndWNfY3RfYnVmZmVyX2Rlc2MpIAo+PiA9PSA2NCk7Cj4+IMKgwqAgKiAtICoqZmxh Z3MqKiwgaG9sZHMgdmFyaW91cyBiaXRzIHRvIGNvbnRyb2wgbWVzc2FnZSBoYW5kbGluZwo+PiDC oMKgICovCj4+IMKgIC0vKiBUeXBlIG9mIGNvbW1hbmQgdHJhbnNwb3J0IGJ1ZmZlciAqLwo+PiAt I2RlZmluZSBJTlRFTF9HVUNfQ1RfQlVGRkVSX1RZUEVfU0VORMKgwqDCoCAweDB1Cj4+IC0jZGVm aW5lIElOVEVMX0dVQ19DVF9CVUZGRVJfVFlQRV9SRUNWwqDCoMKgIDB4MXUKPj4gLQo+PiDCoCAv Kgo+PiDCoMKgICogRGVmaW5pdGlvbiBvZiB0aGUgY29tbWFuZCB0cmFuc3BvcnQgbWVzc2FnZSBo ZWFkZXIgKERXMCkKPj4gwqDCoCAqCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9ndC91Yy9pbnRlbF9ndWNfY3QuYyAKPj4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9p bnRlbF9ndWNfY3QuYwo+PiBpbmRleCAzMjQxYTQ3NzE5NmYuLjZhMjliZTc3OWNjOSAxMDA2NDQK Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX2N0LmMKPj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX2N0LmMKPj4gQEAgLTEwMyw5 ICsxMDMsOSBAQCB2b2lkIGludGVsX2d1Y19jdF9pbml0X2Vhcmx5KHN0cnVjdCBpbnRlbF9ndWNf Y3QgCj4+ICpjdCkKPj4gwqAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpndWNfY3RfYnVmZmVy X3R5cGVfdG9fc3RyKHUzMiB0eXBlKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgc3dpdGNoICh0eXBl KSB7Cj4+IC3CoMKgwqAgY2FzZSBJTlRFTF9HVUNfQ1RfQlVGRkVSX1RZUEVfU0VORDoKPj4gK8Kg wqDCoCBjYXNlIEdVQ19DVEJfVFlQRV9IT1NUMkdVQzoKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybiAiU0VORCI7Cj4+IC3CoMKgwqAgY2FzZSBJTlRFTF9HVUNfQ1RfQlVGRkVSX1RZUEVfUkVD VjoKPj4gK8KgwqDCoCBjYXNlIEdVQ19DVEJfVFlQRV9HVUMySE9TVDoKPj4gwqDCoMKgwqDCoMKg wqDCoMKgIHJldHVybiAiUkVDViI7Cj4+IMKgwqDCoMKgwqAgZGVmYXVsdDoKPj4gwqDCoMKgwqDC oMKgwqDCoMKgIHJldHVybiAiPGludmFsaWQ+IjsKPj4gQEAgLTEzNiwyNSArMTM2LDMzIEBAIHN0 YXRpYyB2b2lkIGd1Y19jdF9idWZmZXJfaW5pdChzdHJ1Y3QgCj4+IGludGVsX2d1Y19jdF9idWZm ZXIgKmN0YiwKPj4gwqDCoMKgwqDCoCBndWNfY3RfYnVmZmVyX3Jlc2V0KGN0Yik7Cj4+IMKgIH0K Pj4gwqAgLXN0YXRpYyBpbnQgZ3VjX2FjdGlvbl9yZWdpc3Rlcl9jdF9idWZmZXIoc3RydWN0IGlu dGVsX2d1YyAqZ3VjLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB1MzIgZGVzY19hZGRyLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB1MzIgdHlwZSkKPj4gK3N0YXRpYyBpbnQgZ3VjX2FjdGlvbl9yZWdpc3Rlcl9jdF9idWZm ZXIoc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1MzIgCj4+IHR5cGUsCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBkZXNjX2FkZHIsIHUzMiBidWZmX2FkZHIs IHUzMiBzaXplKQo+PiDCoCB7Cj4+IC3CoMKgwqAgdTMyIGFjdGlvbltdID0gewo+PiAtwqDCoMKg wqDCoMKgwqAgSU5URUxfR1VDX0FDVElPTl9SRUdJU1RFUl9DT01NQU5EX1RSQU5TUE9SVF9CVUZG RVIsCj4+IC3CoMKgwqDCoMKgwqDCoCBkZXNjX2FkZHIsCj4+IC3CoMKgwqDCoMKgwqDCoCBzaXpl b2Yoc3RydWN0IGd1Y19jdF9idWZmZXJfZGVzYyksCj4+IC3CoMKgwqDCoMKgwqDCoCB0eXBlCj4+ ICvCoMKgwqAgdTMyIHJlcXVlc3RbSE9TVDJHVUNfUkVHSVNURVJfQ1RCX1JFUVVFU1RfTVNHX0xF Tl0gPSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBGSUVMRF9QUkVQKEdVQ19IWEdfTVNHXzBfT1JJR0lO LCBHVUNfSFhHX09SSUdJTl9IT1NUKSB8Cj4+ICvCoMKgwqDCoMKgwqDCoCBGSUVMRF9QUkVQKEdV Q19IWEdfTVNHXzBfVFlQRSwgR1VDX0hYR19UWVBFX1JFUVVFU1QpIHwKPj4gK8KgwqDCoMKgwqDC oMKgIEZJRUxEX1BSRVAoR1VDX0hYR19SRVFVRVNUX01TR18wX0FDVElPTiwgCj4+IEdVQ19BQ1RJ T05fSE9TVDJHVUNfUkVHSVNURVJfQ1RCKSwKPgo+IElNTyB3ZSBjb3VsZCB1c2UgYSBtYWNybyBv ciAyIGZvciB0aGUgSFhHIGhlYWRlciwgdG8gYXZvaWQgYWxsIHRoZXNlIAo+IGxpbmVzLCB3aGlj aCBhcmUgaGFyZCB0byByZWFkLiBzb21ldGhpbmcgbGlrZToKPgo+IEdVQ19IWEdfSEVBREVSKG9y aWdpbiwgdHlwZSwgZGF0YSwgYWN0aW9uKSBcCj4gwqDCoMKgIChGSUVMRF9QUkVQKEdVQ19IWEdf TVNHXzBfT1JJR0lOLCBvcmlnaW4pIHwgXAo+IMKgwqDCoMKgIEZJRUxEX1BSRVAoR1VDX0hYR19N U0dfMF9UWVBFLCB0eXBlKSB8IFwKPiBGSUVMRF9QUkVQKEdVQ19IWEdfTVNHXzBfREFUQTAsIGRh dGEpIHwgXAo+IMKgwqDCoMKgIEZJRUxEX1BSRVAoR1VDX0hYR19SRVFVRVNUX01TR18wX0FDVElP TiwgYWN0aW9uKSkKPgo+IEgyR19IRUFERVIodHlwZSwgZGF0YSwgYWN0aW9uKSBcCj4gwqDCoMKg IEdVQ19IWEdfSEVBREVSKEdVQ19IWEdfT1JJR0lOX0hPU1QsIHR5cGUsIGRhdGEsIGFjdGlvbikK Pgo+IGFuZCB0aGVuIGNhbGwKPgo+IEgyR19IRUFERVIoR1VDX0hYR19UWVBFX1JFUVVFU1QsIDAs IEdVQ19BQ1RJT05fSE9TVDJHVUNfUkVHSVNURVJfQ1RCKQo+Cj4KPiBOb3QgYSBibG9ja2VyLgo+ Cj4gRGFuaWVsZQo+Cj4+ICsgRklFTERfUFJFUChIT1NUMkdVQ19SRUdJU1RFUl9DVEJfUkVRVUVT VF9NU0dfMV9TSVpFLCBzaXplIC8gU1pfNEsgLSAKPj4gMSkgfAo+PiArwqDCoMKgwqDCoMKgwqAg RklFTERfUFJFUChIT1NUMkdVQ19SRUdJU1RFUl9DVEJfUkVRVUVTVF9NU0dfMV9UWVBFLCB0eXBl KSwKPj4gKyBGSUVMRF9QUkVQKEhPU1QyR1VDX1JFR0lTVEVSX0NUQl9SRVFVRVNUX01TR18yX0RF U0NfQUREUiwgZGVzY19hZGRyKSwKPj4gKyBGSUVMRF9QUkVQKEhPU1QyR1VDX1JFR0lTVEVSX0NU Ql9SRVFVRVNUX01TR18zX0JVRkZfQUREUiwgYnVmZl9hZGRyKSwKPj4gwqDCoMKgwqDCoCB9Owo+ PiDCoCAtwqDCoMKgIC8qIENhbid0IHVzZSBnZW5lcmljIHNlbmQoKSwgQ1QgcmVnaXN0cmF0aW9u IG11c3QgZ28gb3ZlciBNTUlPICovCj4+IC3CoMKgwqAgcmV0dXJuIGludGVsX2d1Y19zZW5kX21t aW8oZ3VjLCBhY3Rpb24sIEFSUkFZX1NJWkUoYWN0aW9uKSwgCj4+IE5VTEwsIDApOwo+PiArwqDC oMKgIEdFTV9CVUdfT04odHlwZSAhPSBHVUNfQ1RCX1RZUEVfSE9TVDJHVUMgJiYgdHlwZSAhPSAK Pj4gR1VDX0NUQl9UWVBFX0dVQzJIT1NUKTsKPj4gK8KgwqDCoCBHRU1fQlVHX09OKHNpemUgJSBT Wl80Syk7Cj4+ICsKPj4gK8KgwqDCoCAvKiBDVCByZWdpc3RyYXRpb24gbXVzdCBnbyBvdmVyIE1N SU8gKi8KPj4gK8KgwqDCoCByZXR1cm4gaW50ZWxfZ3VjX3NlbmRfbW1pbyhndWMsIHJlcXVlc3Qs IEFSUkFZX1NJWkUocmVxdWVzdCksIAo+PiBOVUxMLCAwKTsKPj4gwqAgfQo+PiDCoCAtc3RhdGlj IGludCBjdF9yZWdpc3Rlcl9idWZmZXIoc3RydWN0IGludGVsX2d1Y19jdCAqY3QsIHUzMiAKPj4g ZGVzY19hZGRyLCB1MzIgdHlwZSkKPj4gK3N0YXRpYyBpbnQgY3RfcmVnaXN0ZXJfYnVmZmVyKHN0 cnVjdCBpbnRlbF9ndWNfY3QgKmN0LCB1MzIgdHlwZSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdTMyIGRlc2NfYWRkciwgdTMyIGJ1ZmZfYWRkciwgdTMyIHNpemUpCj4+ IMKgIHsKPj4gLcKgwqDCoCBpbnQgZXJyID0gZ3VjX2FjdGlvbl9yZWdpc3Rlcl9jdF9idWZmZXIo Y3RfdG9fZ3VjKGN0KSwgCj4+IGRlc2NfYWRkciwgdHlwZSk7Cj4+ICvCoMKgwqAgaW50IGVycjsK Pj4gwqAgK8KgwqDCoCBlcnIgPSBndWNfYWN0aW9uX3JlZ2lzdGVyX2N0X2J1ZmZlcihjdF90b19n dWMoY3QpLCB0eXBlLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBkZXNjX2FkZHIsIGJ1ZmZfYWRkciwgc2l6ZSk7Cj4+IMKgwqDCoMKgwqAgaWYgKHVu bGlrZWx5KGVycikpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBDVF9FUlJPUihjdCwgIkZhaWxlZCB0 byByZWdpc3RlciAlcyBidWZmZXIgKGVycj0lZClcbiIsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZ3VjX2N0X2J1ZmZlcl90eXBlX3RvX3N0cih0eXBlKSwgZXJyKTsKPj4gQEAgLTE2 MywxNCArMTcxLDE3IEBAIHN0YXRpYyBpbnQgY3RfcmVnaXN0ZXJfYnVmZmVyKHN0cnVjdCAKPj4g aW50ZWxfZ3VjX2N0ICpjdCwgdTMyIGRlc2NfYWRkciwgdTMyIHR5cGUpCj4+IMKgIMKgIHN0YXRp YyBpbnQgZ3VjX2FjdGlvbl9kZXJlZ2lzdGVyX2N0X2J1ZmZlcihzdHJ1Y3QgaW50ZWxfZ3VjICpn dWMsIAo+PiB1MzIgdHlwZSkKPj4gwqAgewo+PiAtwqDCoMKgIHUzMiBhY3Rpb25bXSA9IHsKPj4g LcKgwqDCoMKgwqDCoMKgIElOVEVMX0dVQ19BQ1RJT05fREVSRUdJU1RFUl9DT01NQU5EX1RSQU5T UE9SVF9CVUZGRVIsCj4+IC3CoMKgwqDCoMKgwqDCoCBDVEJfT1dORVJfSE9TVCwKPj4gLcKgwqDC oMKgwqDCoMKgIHR5cGUKPj4gK8KgwqDCoCB1MzIgcmVxdWVzdFtIT1NUMkdVQ19ERVJFR0lTVEVS X0NUQl9SRVFVRVNUX01TR19MRU5dID0gewo+PiArwqDCoMKgwqDCoMKgwqAgRklFTERfUFJFUChH VUNfSFhHX01TR18wX09SSUdJTiwgR1VDX0hYR19PUklHSU5fSE9TVCkgfAo+PiArwqDCoMKgwqDC oMKgwqAgRklFTERfUFJFUChHVUNfSFhHX01TR18wX1RZUEUsIEdVQ19IWEdfVFlQRV9SRVFVRVNU KSB8Cj4+ICvCoMKgwqDCoMKgwqDCoCBGSUVMRF9QUkVQKEdVQ19IWEdfUkVRVUVTVF9NU0dfMF9B Q1RJT04sIAo+PiBHVUNfQUNUSU9OX0hPU1QyR1VDX0RFUkVHSVNURVJfQ1RCKSwKPj4gK8KgwqDC oMKgwqDCoMKgIEZJRUxEX1BSRVAoSE9TVDJHVUNfREVSRUdJU1RFUl9DVEJfUkVRVUVTVF9NU0df MV9UWVBFLCB0eXBlKSwKPj4gwqDCoMKgwqDCoCB9Owo+PiDCoCAtwqDCoMKgIC8qIENhbid0IHVz ZSBnZW5lcmljIHNlbmQoKSwgQ1QgZGVyZWdpc3RyYXRpb24gbXVzdCBnbyBvdmVyIAo+PiBNTUlP ICovCj4+IC3CoMKgwqAgcmV0dXJuIGludGVsX2d1Y19zZW5kX21taW8oZ3VjLCBhY3Rpb24sIEFS UkFZX1NJWkUoYWN0aW9uKSwgCj4+IE5VTEwsIDApOwo+PiArwqDCoMKgIEdFTV9CVUdfT04odHlw ZSAhPSBHVUNfQ1RCX1RZUEVfSE9TVDJHVUMgJiYgdHlwZSAhPSAKPj4gR1VDX0NUQl9UWVBFX0dV QzJIT1NUKTsKPj4gKwo+PiArwqDCoMKgIC8qIENUIGRlcmVnaXN0cmF0aW9uIG11c3QgZ28gb3Zl ciBNTUlPICovCj4+ICvCoMKgwqAgcmV0dXJuIGludGVsX2d1Y19zZW5kX21taW8oZ3VjLCByZXF1 ZXN0LCBBUlJBWV9TSVpFKHJlcXVlc3QpLCAKPj4gTlVMTCwgMCk7Cj4+IMKgIH0KPj4gwqAgwqAg c3RhdGljIGludCBjdF9kZXJlZ2lzdGVyX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfZ3VjX2N0ICpjdCwg dTMyIHR5cGUpCj4+IEBAIC0yNTgsNyArMjY5LDcgQEAgdm9pZCBpbnRlbF9ndWNfY3RfZmluaShz dHJ1Y3QgaW50ZWxfZ3VjX2N0ICpjdCkKPj4gwqAgaW50IGludGVsX2d1Y19jdF9lbmFibGUoc3Ry dWN0IGludGVsX2d1Y19jdCAqY3QpCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgaW50ZWxf Z3VjICpndWMgPSBjdF90b19ndWMoY3QpOwo+PiAtwqDCoMKgIHUzMiBiYXNlLCBjbWRzOwo+PiAr wqDCoMKgIHUzMiBiYXNlLCBkZXNjLCBjbWRzOwo+PiDCoMKgwqDCoMKgIHZvaWQgKmJsb2I7Cj4+ IMKgwqDCoMKgwqAgaW50IGVycjsKPj4gwqAgQEAgLTI3NCwyMyArMjg1LDI2IEBAIGludCBpbnRl bF9ndWNfY3RfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWNfY3QgKmN0KQo+PiDCoMKgwqDCoMKgIEdF TV9CVUdfT04oYmxvYiAhPSBjdC0+Y3Ricy5zZW5kLmRlc2MpOwo+PiDCoCDCoMKgwqDCoMKgIC8q IChyZSlpbml0aWFsaXplIGRlc2NyaXB0b3JzICovCj4+IC3CoMKgwqAgY21kcyA9IGJhc2UgKyBw dHJkaWZmKGN0LT5jdGJzLnNlbmQuY21kcywgYmxvYik7Cj4+IMKgwqDCoMKgwqAgZ3VjX2N0X2J1 ZmZlcl9yZXNldCgmY3QtPmN0YnMuc2VuZCk7Cj4+IC0KPj4gLcKgwqDCoCBjbWRzID0gYmFzZSAr IHB0cmRpZmYoY3QtPmN0YnMucmVjdi5jbWRzLCBibG9iKTsKPj4gwqDCoMKgwqDCoCBndWNfY3Rf YnVmZmVyX3Jlc2V0KCZjdC0+Y3Ricy5yZWN2KTsKPj4gwqAgwqDCoMKgwqDCoCAvKgo+PiDCoMKg wqDCoMKgwqAgKiBSZWdpc3RlciBib3RoIENUIGJ1ZmZlcnMgc3RhcnRpbmcgd2l0aCBSRUNWIGJ1 ZmZlci4KPj4gwqDCoMKgwqDCoMKgICogRGVzY3JpcHRvcnMgYXJlIGluIGZpcnN0IGhhbGYgb2Yg dGhlIGJsb2IuCj4+IMKgwqDCoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGVyciA9IGN0X3JlZ2lzdGVy X2J1ZmZlcihjdCwgYmFzZSArIHB0cmRpZmYoY3QtPmN0YnMucmVjdi5kZXNjLCAKPj4gYmxvYiks Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBJTlRFTF9HVUNfQ1RfQlVGRkVS X1RZUEVfUkVDVik7Cj4+ICvCoMKgwqAgZGVzYyA9IGJhc2UgKyBwdHJkaWZmKGN0LT5jdGJzLnJl Y3YuZGVzYywgYmxvYik7Cj4+ICvCoMKgwqAgY21kcyA9IGJhc2UgKyBwdHJkaWZmKGN0LT5jdGJz LnJlY3YuY21kcywgYmxvYik7Cj4+ICvCoMKgwqAgZXJyID0gY3RfcmVnaXN0ZXJfYnVmZmVyKGN0 LCBHVUNfQ1RCX1RZUEVfR1VDMkhPU1QsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBkZXNjLCBjbWRzLCBjdC0+Y3Ricy5yZWN2LnNpemUgKiA0KTsKPj4gKwo+PiDCoMKgwqDC oMKgIGlmICh1bmxpa2VseShlcnIpKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfb3V0 Owo+PiDCoCAtwqDCoMKgIGVyciA9IGN0X3JlZ2lzdGVyX2J1ZmZlcihjdCwgYmFzZSArIAo+PiBw dHJkaWZmKGN0LT5jdGJzLnNlbmQuZGVzYywgYmxvYiksCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBJTlRFTF9HVUNfQ1RfQlVGRkVSX1RZUEVfU0VORCk7Cj4+ICvCoMKgwqAg ZGVzYyA9IGJhc2UgKyBwdHJkaWZmKGN0LT5jdGJzLnNlbmQuZGVzYywgYmxvYik7Cj4+ICvCoMKg wqAgY21kcyA9IGJhc2UgKyBwdHJkaWZmKGN0LT5jdGJzLnNlbmQuY21kcywgYmxvYik7Cj4+ICvC oMKgwqAgZXJyID0gY3RfcmVnaXN0ZXJfYnVmZmVyKGN0LCBHVUNfQ1RCX1RZUEVfSE9TVDJHVUMs Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkZXNjLCBjbWRzLCBjdC0+Y3Ri cy5zZW5kLnNpemUgKiA0KTsKPj4gKwo+PiDCoMKgwqDCoMKgIGlmICh1bmxpa2VseShlcnIpKQo+ PiDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfZGVyZWdpc3RlcjsKPj4gwqAgQEAgLTI5OSw3 ICszMTMsNyBAQCBpbnQgaW50ZWxfZ3VjX2N0X2VuYWJsZShzdHJ1Y3QgaW50ZWxfZ3VjX2N0ICpj dCkKPj4gwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gwqAgwqAgZXJyX2RlcmVnaXN0ZXI6Cj4+IC3C oMKgwqAgY3RfZGVyZWdpc3Rlcl9idWZmZXIoY3QsIElOVEVMX0dVQ19DVF9CVUZGRVJfVFlQRV9S RUNWKTsKPj4gK8KgwqDCoCBjdF9kZXJlZ2lzdGVyX2J1ZmZlcihjdCwgR1VDX0NUQl9UWVBFX0dV QzJIT1NUKTsKPj4gwqAgZXJyX291dDoKPj4gwqDCoMKgwqDCoCBDVF9QUk9CRV9FUlJPUihjdCwg IkZhaWxlZCB0byBlbmFibGUgQ1RCICglcGUpXG4iLCBFUlJfUFRSKGVycikpOwo+PiDCoMKgwqDC oMKgIHJldHVybiBlcnI7Cj4+IEBAIC0zMTgsOCArMzMyLDggQEAgdm9pZCBpbnRlbF9ndWNfY3Rf ZGlzYWJsZShzdHJ1Y3QgaW50ZWxfZ3VjX2N0ICpjdCkKPj4gwqDCoMKgwqDCoCBjdC0+ZW5hYmxl ZCA9IGZhbHNlOwo+PiDCoCDCoMKgwqDCoMKgIGlmIChpbnRlbF9ndWNfaXNfZndfcnVubmluZyhn dWMpKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBjdF9kZXJlZ2lzdGVyX2J1ZmZlcihjdCwgSU5URUxf R1VDX0NUX0JVRkZFUl9UWVBFX1NFTkQpOwo+PiAtwqDCoMKgwqDCoMKgwqAgY3RfZGVyZWdpc3Rl cl9idWZmZXIoY3QsIElOVEVMX0dVQ19DVF9CVUZGRVJfVFlQRV9SRUNWKTsKPj4gK8KgwqDCoMKg wqDCoMKgIGN0X2RlcmVnaXN0ZXJfYnVmZmVyKGN0LCBHVUNfQ1RCX1RZUEVfSE9TVDJHVUMpOwo+ PiArwqDCoMKgwqDCoMKgwqAgY3RfZGVyZWdpc3Rlcl9idWZmZXIoY3QsIEdVQ19DVEJfVFlQRV9H VUMySE9TVCk7Cj4+IMKgwqDCoMKgwqAgfQo+PiDCoCB9Cj4KCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwt Z2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=