From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752205AbeEPHpf (ORCPT ); Wed, 16 May 2018 03:45:35 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:39289 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750775AbeEPHpd (ORCPT ); Wed, 16 May 2018 03:45:33 -0400 X-Google-Smtp-Source: AB8JxZozWyrDBkv9+CQrwNS/OJxZFBnEIkprz0V39PHuZX9s22tTj9+ZJfs6XBA0Q0ryrMO8+bQ8hg== Subject: Re: [PATCH v2 3/5] mfd: cros-ec: Introduce CEC commands and events definitions. To: Hans Verkuil , airlied@linux.ie, hans.verkuil@cisco.com, lee.jones@linaro.org, olof@lixom.net, seanpaul@google.com Cc: sadolfsson@google.com, felixe@google.com, bleung@google.com, darekm@google.com, marcheu@chromium.org, fparent@baylibre.com, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, Stefan Adolfsson References: <1526395342-15481-1-git-send-email-narmstrong@baylibre.com> <1526395342-15481-4-git-send-email-narmstrong@baylibre.com> <774f11b2-d21a-7dd5-4463-bcdff1f6535f@xs4all.nl> From: Neil Armstrong Openpgp: preference=signencrypt Autocrypt: addr=narmstrong@baylibre.com; prefer-encrypt=mutual; keydata= xsBNBE1ZBs8BCAD78xVLsXPwV/2qQx2FaO/7mhWL0Qodw8UcQJnkrWmgTFRobtTWxuRx8WWP GTjuhvbleoQ5Cxjr+v+1ARGCH46MxFP5DwauzPekwJUD5QKZlaw/bURTLmS2id5wWi3lqVH4 BVF2WzvGyyeV1o4RTCYDnZ9VLLylJ9bneEaIs/7cjCEbipGGFlfIML3sfqnIvMAxIMZrvcl9 qPV2k+KQ7q+aXavU5W+yLNn7QtXUB530Zlk/d2ETgzQ5FLYYnUDAaRl+8JUTjc0CNOTpCeik 80TZcE6f8M76Xa6yU8VcNko94Ck7iB4vj70q76P/J7kt98hklrr85/3NU3oti3nrIHmHABEB AAHNKE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT7CwHsEEwEKACUC GyMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheABQJXDO2CAhkBAAoJEBaat7Gkz/iubGIH/iyk RqvgB62oKOFlgOTYCMkYpm2aAOZZLf6VKHKc7DoVwuUkjHfIRXdslbrxi4pk5VKU6ZP9AKsN NtMZntB8WrBTtkAZfZbTF7850uwd3eU5cN/7N1Q6g0JQihE7w4GlIkEpQ8vwSg5W7hkx3yQ6 2YzrUZh/b7QThXbNZ7xOeSEms014QXazx8+txR7jrGF3dYxBsCkotO/8DNtZ1R+aUvRfpKg5 ZgABTC0LmAQnuUUf2PHcKFAHZo5KrdO+tyfL+LgTUXIXkK+tenkLsAJ0cagz1EZ5gntuheLD YJuzS4zN+1Asmb9kVKxhjSQOcIh6g2tw7vaYJgL/OzJtZi6JlIXOwE0ETVkGzwEIALyKDN/O GURaHBVzwjgYq+ZtifvekdrSNl8TIDH8g1xicBYpQTbPn6bbSZbdvfeQPNCcD4/EhXZuhQXM coJsQQQnO4vwVULmPGgtGf8PVc7dxKOeta+qUh6+SRh3vIcAUFHDT3f/Zdspz+e2E0hPV2hi SvICLk11qO6cyJE13zeNFoeY3ggrKY+IzbFomIZY4yG6xI99NIPEVE9lNBXBKIlewIyVlkOa YvJWSV+p5gdJXOvScNN1epm5YHmf9aE2ZjnqZGoMMtsyw18YoX9BqMFInxqYQQ3j/HpVgTSv mo5ea5qQDDUaCsaTf8UeDcwYOtgI8iL4oHcsGtUXoUk33HEAEQEAAcLAXwQYAQIACQUCTVkG zwIbDAAKCRAWmrexpM/4rrXiB/sGbkQ6itMrAIfnM7IbRuiSZS1unlySUVYu3SD6YBYnNi3G 5EpbwfBNuT3H8//rVvtOFK4OD8cRYkxXRQmTvqa33eDIHu/zr1HMKErm+2SD6PO9umRef8V8 2o2oaCLvf4WeIssFjwB0b6a12opuRP7yo3E3gTCSKmbUuLv1CtxKQF+fUV1cVaTPMyT25Od+ RC1K+iOR0F54oUJvJeq7fUzbn/KdlhA8XPGzwGRy4zcsPWvwnXgfe5tk680fEKZVwOZKIEuJ C3v+/yZpQzDvGYJvbyix0lHnrCzq43WefRHI5XTTQbM0WUIBIcGmq38+OgUsMYu4NzLu7uZF Acmp6h8g Organization: Baylibre Message-ID: <53f91641-80b0-b568-e1a2-0da4764c51e4@baylibre.com> Date: Wed, 16 May 2018 09:45:27 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <774f11b2-d21a-7dd5-4463-bcdff1f6535f@xs4all.nl> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Hans, On 15/05/2018 17:28, Hans Verkuil wrote: > On 05/15/2018 04:42 PM, Neil Armstrong wrote: >> The EC can expose a CEC bus, this patch adds the CEC related definitions >> needed by the cros-ec-cec driver. >> Having a 16 byte mkbp event size makes it possible to send CEC >> messages from the EC to the AP directly inside the mkbp event >> instead of first doing a notification and then a read. >> >> Signed-off-by: Stefan Adolfsson >> Signed-off-by: Neil Armstrong >> --- >> drivers/platform/chrome/cros_ec_proto.c | 42 +++++++++++++---- >> include/linux/mfd/cros_ec.h | 2 +- >> include/linux/mfd/cros_ec_commands.h | 80 +++++++++++++++++++++++++++++++++ >> 3 files changed, 114 insertions(+), 10 deletions(-) >> >> diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c >> index e7bbdf9..ba47f79 100644 >> --- a/drivers/platform/chrome/cros_ec_proto.c >> +++ b/drivers/platform/chrome/cros_ec_proto.c >> @@ -504,29 +504,53 @@ int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev, >> } >> EXPORT_SYMBOL(cros_ec_cmd_xfer_status); >> >> +static int get_next_event_xfer(struct cros_ec_device *ec_dev, >> + struct cros_ec_command *msg, >> + int version, uint32_t size) >> +{ >> + int ret; >> + >> + msg->version = version; >> + msg->command = EC_CMD_GET_NEXT_EVENT; >> + msg->insize = size; >> + msg->outsize = 0; >> + >> + ret = cros_ec_cmd_xfer(ec_dev, msg); >> + if (ret > 0) { >> + ec_dev->event_size = ret - 1; >> + memcpy(&ec_dev->event_data, msg->data, size); >> + } >> + >> + return ret; >> +} >> + >> static int get_next_event(struct cros_ec_device *ec_dev) >> { >> u8 buffer[sizeof(struct cros_ec_command) + sizeof(ec_dev->event_data)]; >> struct cros_ec_command *msg = (struct cros_ec_command *)&buffer; >> + static int cmd_version = 1; >> int ret; >> >> + BUILD_BUG_ON(sizeof(union ec_response_get_next_data_v1) != 16); > > Use the define instead of hardcoding 16. I'm not really sure why you need this. > If cec_message uses the right define for the array size (see my comment below), > then this really can't go wrong, can it? This is taken from the chrome kernelk, to be sure the size is ok, but yes it should be 16, I'll see if I can drop this. > >> + >> if (ec_dev->suspended) { >> dev_dbg(ec_dev->dev, "Device suspended.\n"); >> return -EHOSTDOWN; >> } >> >> - msg->version = 0; >> - msg->command = EC_CMD_GET_NEXT_EVENT; >> - msg->insize = sizeof(ec_dev->event_data); >> - msg->outsize = 0; >> + if (cmd_version == 1) { >> + ret = get_next_event_xfer(ec_dev, msg, cmd_version, >> + sizeof(ec_dev->event_data)); >> + if (ret != EC_RES_INVALID_VERSION) >> + return ret; >> >> - ret = cros_ec_cmd_xfer(ec_dev, msg); >> - if (ret > 0) { >> - ec_dev->event_size = ret - 1; >> - memcpy(&ec_dev->event_data, msg->data, >> - sizeof(ec_dev->event_data)); >> + /* Fallback to version 0 for future send attempts */ >> + cmd_version = 0; >> } >> >> + ret = get_next_event_xfer(ec_dev, msg, cmd_version, >> + sizeof(struct ec_response_get_next_event)); >> + >> return ret; >> } >> >> diff --git a/include/linux/mfd/cros_ec.h b/include/linux/mfd/cros_ec.h >> index 2d4e23c..f3415eb 100644 >> --- a/include/linux/mfd/cros_ec.h >> +++ b/include/linux/mfd/cros_ec.h >> @@ -147,7 +147,7 @@ struct cros_ec_device { >> bool mkbp_event_supported; >> struct blocking_notifier_head event_notifier; >> >> - struct ec_response_get_next_event event_data; >> + struct ec_response_get_next_event_v1 event_data; >> int event_size; >> u32 host_event_wake_mask; >> }; >> diff --git a/include/linux/mfd/cros_ec_commands.h b/include/linux/mfd/cros_ec_commands.h >> index f2edd99..18df466 100644 >> --- a/include/linux/mfd/cros_ec_commands.h >> +++ b/include/linux/mfd/cros_ec_commands.h >> @@ -804,6 +804,8 @@ enum ec_feature_code { >> EC_FEATURE_MOTION_SENSE_FIFO = 24, >> /* EC has RTC feature that can be controlled by host commands */ >> EC_FEATURE_RTC = 27, >> + /* EC supports CEC commands */ >> + EC_FEATURE_CEC = 35, >> }; >> >> #define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32)) >> @@ -2078,6 +2080,12 @@ enum ec_mkbp_event { >> /* EC sent a sysrq command */ >> EC_MKBP_EVENT_SYSRQ = 6, >> >> + /* Notify the AP that something happened on CEC */ >> + EC_MKBP_CEC_EVENT = 8, >> + >> + /* Send an incoming CEC message to the AP */ >> + EC_MKBP_EVENT_CEC_MESSAGE = 9, >> + >> /* Number of MKBP events */ >> EC_MKBP_EVENT_COUNT, >> }; >> @@ -2093,12 +2101,31 @@ union ec_response_get_next_data { >> uint32_t sysrq; >> } __packed; >> >> +union ec_response_get_next_data_v1 { >> + uint8_t key_matrix[16]; >> + >> + /* Unaligned */ >> + uint32_t host_event; >> + >> + uint32_t buttons; >> + uint32_t switches; >> + uint32_t sysrq; >> + uint32_t cec_events; >> + uint8_t cec_message[16]; >> +} __packed; >> + >> struct ec_response_get_next_event { >> uint8_t event_type; >> /* Followed by event data if any */ >> union ec_response_get_next_data data; >> } __packed; >> >> +struct ec_response_get_next_event_v1 { >> + uint8_t event_type; >> + /* Followed by event data if any */ >> + union ec_response_get_next_data_v1 data; >> +} __packed; >> + >> /* Bit indices for buttons and switches.*/ >> /* Buttons */ >> #define EC_MKBP_POWER_BUTTON 0 >> @@ -2828,6 +2855,59 @@ struct ec_params_reboot_ec { >> /* Current version of ACPI memory address space */ >> #define EC_ACPI_MEM_VERSION_CURRENT 1 >> >> +/*****************************************************************************/ >> +/* >> + * HDMI CEC commands >> + * >> + * These commands are for sending and receiving message via HDMI CEC >> + */ >> +#define MAX_CEC_MSG_LEN 16 > > Hmm, uapi/linux/cec.h already defines CEC_MAX_MSG_SIZE with the same value. > Perhaps it is better to include linux/cec.h here instead of creating a second > define? > > And shouldn't this define also be used for the cec_message array above? These defines are tied to the Embedded Controller API, so it may be goog to keep them separated from the rest of the Linux APO, I'll see about using the define in the event struct, but I think they want to have a formal array size using a number. Neil > > Regards, > > Hans > >> + >> +/* CEC message from the AP to be written on the CEC bus */ >> +#define EC_CMD_CEC_WRITE_MSG 0x00B8 >> + >> +/* Message to write to the CEC bus */ >> +struct ec_params_cec_write { >> + uint8_t msg[MAX_CEC_MSG_LEN]; >> +} __packed; >> + >> +/* Set various CEC parameters */ >> +#define EC_CMD_CEC_SET 0x00BA >> + >> +struct ec_params_cec_set { >> + uint8_t cmd; /* enum cec_command */ >> + union { >> + uint8_t enable; >> + uint8_t address; >> + }; >> +} __packed; >> + >> +/* Read various CEC parameters */ >> +#define EC_CMD_CEC_GET 0x00BB >> + >> +struct ec_params_cec_get { >> + uint8_t cmd; /* enum cec_command */ >> +} __packed; >> + >> +struct ec_response_cec_get { >> + union { >> + uint8_t enable; >> + uint8_t address; >> + }; >> +} __packed; >> + >> +enum cec_command { >> + /* CEC reading, writing and events enable */ >> + CEC_CMD_ENABLE, >> + /* CEC logical address */ >> + CEC_CMD_LOGICAL_ADDRESS, >> +}; >> + >> +/* Events from CEC to AP */ >> +enum mkbp_cec_event { >> + EC_MKBP_CEC_SEND_OK = 1 << 0, >> + EC_MKBP_CEC_SEND_FAILED = 1 << 1, >> +}; >> >> /*****************************************************************************/ >> /* >> > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Neil Armstrong Subject: Re: [PATCH v2 3/5] mfd: cros-ec: Introduce CEC commands and events definitions. Date: Wed, 16 May 2018 09:45:27 +0200 Message-ID: <53f91641-80b0-b568-e1a2-0da4764c51e4@baylibre.com> References: <1526395342-15481-1-git-send-email-narmstrong@baylibre.com> <1526395342-15481-4-git-send-email-narmstrong@baylibre.com> <774f11b2-d21a-7dd5-4463-bcdff1f6535f@xs4all.nl> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qk0-x242.google.com (mail-qk0-x242.google.com [IPv6:2607:f8b0:400d:c09::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id 865346E37C for ; Wed, 16 May 2018 07:45:33 +0000 (UTC) Received: by mail-qk0-x242.google.com with SMTP id s83-v6so2378147qke.7 for ; Wed, 16 May 2018 00:45:33 -0700 (PDT) In-Reply-To: <774f11b2-d21a-7dd5-4463-bcdff1f6535f@xs4all.nl> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Hans Verkuil , airlied@linux.ie, hans.verkuil@cisco.com, lee.jones@linaro.org, olof@lixom.net, seanpaul@google.com Cc: sadolfsson@google.com, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Stefan Adolfsson , fparent@baylibre.com, felixe@google.com, marcheu@chromium.org, bleung@google.com, darekm@google.com, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SGkgSGFucywKCk9uIDE1LzA1LzIwMTggMTc6MjgsIEhhbnMgVmVya3VpbCB3cm90ZToKPiBPbiAw NS8xNS8yMDE4IDA0OjQyIFBNLCBOZWlsIEFybXN0cm9uZyB3cm90ZToKPj4gVGhlIEVDIGNhbiBl eHBvc2UgYSBDRUMgYnVzLCB0aGlzIHBhdGNoIGFkZHMgdGhlIENFQyByZWxhdGVkIGRlZmluaXRp b25zCj4+IG5lZWRlZCBieSB0aGUgY3Jvcy1lYy1jZWMgZHJpdmVyLgo+PiBIYXZpbmcgYSAxNiBi eXRlIG1rYnAgZXZlbnQgc2l6ZSBtYWtlcyBpdCBwb3NzaWJsZSB0byBzZW5kIENFQwo+PiBtZXNz YWdlcyBmcm9tIHRoZSBFQyB0byB0aGUgQVAgZGlyZWN0bHkgaW5zaWRlIHRoZSBta2JwIGV2ZW50 Cj4+IGluc3RlYWQgb2YgZmlyc3QgZG9pbmcgYSBub3RpZmljYXRpb24gYW5kIHRoZW4gYSByZWFk Lgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gQWRvbGZzc29uIDxzYWRvbGZzc29uQGNocm9t aXVtLm9yZz4KPj4gU2lnbmVkLW9mZi1ieTogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5 bGlicmUuY29tPgo+PiAtLS0KPj4gIGRyaXZlcnMvcGxhdGZvcm0vY2hyb21lL2Nyb3NfZWNfcHJv dG8uYyB8IDQyICsrKysrKysrKysrKystLS0tCj4+ICBpbmNsdWRlL2xpbnV4L21mZC9jcm9zX2Vj LmggICAgICAgICAgICAgfCAgMiArLQo+PiAgaW5jbHVkZS9saW51eC9tZmQvY3Jvc19lY19jb21t YW5kcy5oICAgIHwgODAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICAzIGZp bGVzIGNoYW5nZWQsIDExNCBpbnNlcnRpb25zKCspLCAxMCBkZWxldGlvbnMoLSkKPj4KPj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vY2hyb21lL2Nyb3NfZWNfcHJvdG8uYyBiL2RyaXZl cnMvcGxhdGZvcm0vY2hyb21lL2Nyb3NfZWNfcHJvdG8uYwo+PiBpbmRleCBlN2JiZGY5Li5iYTQ3 Zjc5IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL3BsYXRmb3JtL2Nocm9tZS9jcm9zX2VjX3Byb3Rv LmMKPj4gKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvY3Jvc19lY19wcm90by5jCj4+IEBA IC01MDQsMjkgKzUwNCw1MyBAQCBpbnQgY3Jvc19lY19jbWRfeGZlcl9zdGF0dXMoc3RydWN0IGNy b3NfZWNfZGV2aWNlICplY19kZXYsCj4+ICB9Cj4+ICBFWFBPUlRfU1lNQk9MKGNyb3NfZWNfY21k X3hmZXJfc3RhdHVzKTsKPj4gIAo+PiArc3RhdGljIGludCBnZXRfbmV4dF9ldmVudF94ZmVyKHN0 cnVjdCBjcm9zX2VjX2RldmljZSAqZWNfZGV2LAo+PiArCQkJICAgICAgIHN0cnVjdCBjcm9zX2Vj X2NvbW1hbmQgKm1zZywKPj4gKwkJCSAgICAgICBpbnQgdmVyc2lvbiwgdWludDMyX3Qgc2l6ZSkK Pj4gK3sKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJbXNnLT52ZXJzaW9uID0gdmVyc2lvbjsKPj4g Kwltc2ctPmNvbW1hbmQgPSBFQ19DTURfR0VUX05FWFRfRVZFTlQ7Cj4+ICsJbXNnLT5pbnNpemUg PSBzaXplOwo+PiArCW1zZy0+b3V0c2l6ZSA9IDA7Cj4+ICsKPj4gKwlyZXQgPSBjcm9zX2VjX2Nt ZF94ZmVyKGVjX2RldiwgbXNnKTsKPj4gKwlpZiAocmV0ID4gMCkgewo+PiArCQllY19kZXYtPmV2 ZW50X3NpemUgPSByZXQgLSAxOwo+PiArCQltZW1jcHkoJmVjX2Rldi0+ZXZlbnRfZGF0YSwgbXNn LT5kYXRhLCBzaXplKTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ ICBzdGF0aWMgaW50IGdldF9uZXh0X2V2ZW50KHN0cnVjdCBjcm9zX2VjX2RldmljZSAqZWNfZGV2 KQo+PiAgewo+PiAgCXU4IGJ1ZmZlcltzaXplb2Yoc3RydWN0IGNyb3NfZWNfY29tbWFuZCkgKyBz aXplb2YoZWNfZGV2LT5ldmVudF9kYXRhKV07Cj4+ICAJc3RydWN0IGNyb3NfZWNfY29tbWFuZCAq bXNnID0gKHN0cnVjdCBjcm9zX2VjX2NvbW1hbmQgKikmYnVmZmVyOwo+PiArCXN0YXRpYyBpbnQg Y21kX3ZlcnNpb24gPSAxOwo+PiAgCWludCByZXQ7Cj4+ICAKPj4gKwlCVUlMRF9CVUdfT04oc2l6 ZW9mKHVuaW9uIGVjX3Jlc3BvbnNlX2dldF9uZXh0X2RhdGFfdjEpICE9IDE2KTsKPiAKPiBVc2Ug dGhlIGRlZmluZSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgMTYuIEknbSBub3QgcmVhbGx5IHN1cmUg d2h5IHlvdSBuZWVkIHRoaXMuCj4gSWYgY2VjX21lc3NhZ2UgdXNlcyB0aGUgcmlnaHQgZGVmaW5l IGZvciB0aGUgYXJyYXkgc2l6ZSAoc2VlIG15IGNvbW1lbnQgYmVsb3cpLAo+IHRoZW4gdGhpcyBy ZWFsbHkgY2FuJ3QgZ28gd3JvbmcsIGNhbiBpdD8KClRoaXMgaXMgdGFrZW4gZnJvbSB0aGUgY2hy b21lIGtlcm5lbGssIHRvIGJlIHN1cmUgdGhlIHNpemUgaXMgb2ssIGJ1dCB5ZXMgaXQgc2hvdWxk IGJlIDE2LCBJJ2xsIHNlZQppZiBJIGNhbiBkcm9wIHRoaXMuCgo+IAo+PiArCj4+ICAJaWYgKGVj X2Rldi0+c3VzcGVuZGVkKSB7Cj4+ICAJCWRldl9kYmcoZWNfZGV2LT5kZXYsICJEZXZpY2Ugc3Vz cGVuZGVkLlxuIik7Cj4+ICAJCXJldHVybiAtRUhPU1RET1dOOwo+PiAgCX0KPj4gIAo+PiAtCW1z Zy0+dmVyc2lvbiA9IDA7Cj4+IC0JbXNnLT5jb21tYW5kID0gRUNfQ01EX0dFVF9ORVhUX0VWRU5U Owo+PiAtCW1zZy0+aW5zaXplID0gc2l6ZW9mKGVjX2Rldi0+ZXZlbnRfZGF0YSk7Cj4+IC0JbXNn LT5vdXRzaXplID0gMDsKPj4gKwlpZiAoY21kX3ZlcnNpb24gPT0gMSkgewo+PiArCQlyZXQgPSBn ZXRfbmV4dF9ldmVudF94ZmVyKGVjX2RldiwgbXNnLCBjbWRfdmVyc2lvbiwKPj4gKwkJCQkJICBz aXplb2YoZWNfZGV2LT5ldmVudF9kYXRhKSk7Cj4+ICsJCWlmIChyZXQgIT0gRUNfUkVTX0lOVkFM SURfVkVSU0lPTikKPj4gKwkJCXJldHVybiByZXQ7Cj4+ICAKPj4gLQlyZXQgPSBjcm9zX2VjX2Nt ZF94ZmVyKGVjX2RldiwgbXNnKTsKPj4gLQlpZiAocmV0ID4gMCkgewo+PiAtCQllY19kZXYtPmV2 ZW50X3NpemUgPSByZXQgLSAxOwo+PiAtCQltZW1jcHkoJmVjX2Rldi0+ZXZlbnRfZGF0YSwgbXNn LT5kYXRhLAo+PiAtCQkgICAgICAgc2l6ZW9mKGVjX2Rldi0+ZXZlbnRfZGF0YSkpOwo+PiArCQkv KiBGYWxsYmFjayB0byB2ZXJzaW9uIDAgZm9yIGZ1dHVyZSBzZW5kIGF0dGVtcHRzICovCj4+ICsJ CWNtZF92ZXJzaW9uID0gMDsKPj4gIAl9Cj4+ICAKPj4gKwlyZXQgPSBnZXRfbmV4dF9ldmVudF94 ZmVyKGVjX2RldiwgbXNnLCBjbWRfdmVyc2lvbiwKPj4gKwkJCQkgIHNpemVvZihzdHJ1Y3QgZWNf cmVzcG9uc2VfZ2V0X25leHRfZXZlbnQpKTsKPj4gKwo+PiAgCXJldHVybiByZXQ7Cj4+ICB9Cj4+ ICAKPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2Nyb3NfZWMuaCBiL2luY2x1ZGUv bGludXgvbWZkL2Nyb3NfZWMuaAo+PiBpbmRleCAyZDRlMjNjLi5mMzQxNWViIDEwMDY0NAo+PiAt LS0gYS9pbmNsdWRlL2xpbnV4L21mZC9jcm9zX2VjLmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9t ZmQvY3Jvc19lYy5oCj4+IEBAIC0xNDcsNyArMTQ3LDcgQEAgc3RydWN0IGNyb3NfZWNfZGV2aWNl IHsKPj4gIAlib29sIG1rYnBfZXZlbnRfc3VwcG9ydGVkOwo+PiAgCXN0cnVjdCBibG9ja2luZ19u b3RpZmllcl9oZWFkIGV2ZW50X25vdGlmaWVyOwo+PiAgCj4+IC0Jc3RydWN0IGVjX3Jlc3BvbnNl X2dldF9uZXh0X2V2ZW50IGV2ZW50X2RhdGE7Cj4+ICsJc3RydWN0IGVjX3Jlc3BvbnNlX2dldF9u ZXh0X2V2ZW50X3YxIGV2ZW50X2RhdGE7Cj4+ICAJaW50IGV2ZW50X3NpemU7Cj4+ICAJdTMyIGhv c3RfZXZlbnRfd2FrZV9tYXNrOwo+PiAgfTsKPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgv bWZkL2Nyb3NfZWNfY29tbWFuZHMuaCBiL2luY2x1ZGUvbGludXgvbWZkL2Nyb3NfZWNfY29tbWFu ZHMuaAo+PiBpbmRleCBmMmVkZDk5Li4xOGRmNDY2IDEwMDY0NAo+PiAtLS0gYS9pbmNsdWRlL2xp bnV4L21mZC9jcm9zX2VjX2NvbW1hbmRzLmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9tZmQvY3Jv c19lY19jb21tYW5kcy5oCj4+IEBAIC04MDQsNiArODA0LDggQEAgZW51bSBlY19mZWF0dXJlX2Nv ZGUgewo+PiAgCUVDX0ZFQVRVUkVfTU9USU9OX1NFTlNFX0ZJRk8gPSAyNCwKPj4gIAkvKiBFQyBo YXMgUlRDIGZlYXR1cmUgdGhhdCBjYW4gYmUgY29udHJvbGxlZCBieSBob3N0IGNvbW1hbmRzICov Cj4+ICAJRUNfRkVBVFVSRV9SVEMgPSAyNywKPj4gKwkvKiBFQyBzdXBwb3J0cyBDRUMgY29tbWFu ZHMgKi8KPj4gKwlFQ19GRUFUVVJFX0NFQyA9IDM1LAo+PiAgfTsKPj4gIAo+PiAgI2RlZmluZSBF Q19GRUFUVVJFX01BU0tfMChldmVudF9jb2RlKSAoMVVMIDw8IChldmVudF9jb2RlICUgMzIpKQo+ PiBAQCAtMjA3OCw2ICsyMDgwLDEyIEBAIGVudW0gZWNfbWticF9ldmVudCB7Cj4+ICAJLyogRUMg c2VudCBhIHN5c3JxIGNvbW1hbmQgKi8KPj4gIAlFQ19NS0JQX0VWRU5UX1NZU1JRID0gNiwKPj4g IAo+PiArCS8qIE5vdGlmeSB0aGUgQVAgdGhhdCBzb21ldGhpbmcgaGFwcGVuZWQgb24gQ0VDICov Cj4+ICsJRUNfTUtCUF9DRUNfRVZFTlQgPSA4LAo+PiArCj4+ICsJLyogU2VuZCBhbiBpbmNvbWlu ZyBDRUMgbWVzc2FnZSB0byB0aGUgQVAgKi8KPj4gKwlFQ19NS0JQX0VWRU5UX0NFQ19NRVNTQUdF ID0gOSwKPj4gKwo+PiAgCS8qIE51bWJlciBvZiBNS0JQIGV2ZW50cyAqLwo+PiAgCUVDX01LQlBf RVZFTlRfQ09VTlQsCj4+ICB9Owo+PiBAQCAtMjA5MywxMiArMjEwMSwzMSBAQCB1bmlvbiBlY19y ZXNwb25zZV9nZXRfbmV4dF9kYXRhIHsKPj4gIAl1aW50MzJfdCAgIHN5c3JxOwo+PiAgfSBfX3Bh Y2tlZDsKPj4gIAo+PiArdW5pb24gZWNfcmVzcG9uc2VfZ2V0X25leHRfZGF0YV92MSB7Cj4+ICsJ dWludDhfdCAgIGtleV9tYXRyaXhbMTZdOwo+PiArCj4+ICsJLyogVW5hbGlnbmVkICovCj4+ICsJ dWludDMyX3QgIGhvc3RfZXZlbnQ7Cj4+ICsKPj4gKwl1aW50MzJfdCAgIGJ1dHRvbnM7Cj4+ICsJ dWludDMyX3QgICBzd2l0Y2hlczsKPj4gKwl1aW50MzJfdCAgIHN5c3JxOwo+PiArCXVpbnQzMl90 ICAgY2VjX2V2ZW50czsKPj4gKwl1aW50OF90ICAgIGNlY19tZXNzYWdlWzE2XTsKPj4gK30gX19w YWNrZWQ7Cj4+ICsKPj4gIHN0cnVjdCBlY19yZXNwb25zZV9nZXRfbmV4dF9ldmVudCB7Cj4+ICAJ dWludDhfdCBldmVudF90eXBlOwo+PiAgCS8qIEZvbGxvd2VkIGJ5IGV2ZW50IGRhdGEgaWYgYW55 ICovCj4+ICAJdW5pb24gZWNfcmVzcG9uc2VfZ2V0X25leHRfZGF0YSBkYXRhOwo+PiAgfSBfX3Bh Y2tlZDsKPj4gIAo+PiArc3RydWN0IGVjX3Jlc3BvbnNlX2dldF9uZXh0X2V2ZW50X3YxIHsKPj4g Kwl1aW50OF90IGV2ZW50X3R5cGU7Cj4+ICsJLyogRm9sbG93ZWQgYnkgZXZlbnQgZGF0YSBpZiBh bnkgKi8KPj4gKwl1bmlvbiBlY19yZXNwb25zZV9nZXRfbmV4dF9kYXRhX3YxIGRhdGE7Cj4+ICt9 IF9fcGFja2VkOwo+PiArCj4+ICAvKiBCaXQgaW5kaWNlcyBmb3IgYnV0dG9ucyBhbmQgc3dpdGNo ZXMuKi8KPj4gIC8qIEJ1dHRvbnMgKi8KPj4gICNkZWZpbmUgRUNfTUtCUF9QT1dFUl9CVVRUT04J MAo+PiBAQCAtMjgyOCw2ICsyODU1LDU5IEBAIHN0cnVjdCBlY19wYXJhbXNfcmVib290X2VjIHsK Pj4gIC8qIEN1cnJlbnQgdmVyc2lvbiBvZiBBQ1BJIG1lbW9yeSBhZGRyZXNzIHNwYWNlICovCj4+ ICAjZGVmaW5lIEVDX0FDUElfTUVNX1ZFUlNJT05fQ1VSUkVOVCAxCj4+ICAKPj4gKy8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KPj4gKy8qCj4+ICsgKiBIRE1JIENFQyBjb21tYW5kcwo+PiArICoKPj4g KyAqIFRoZXNlIGNvbW1hbmRzIGFyZSBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIG1lc3NhZ2Ug dmlhIEhETUkgQ0VDCj4+ICsgKi8KPj4gKyNkZWZpbmUgTUFYX0NFQ19NU0dfTEVOIDE2Cj4gCj4g SG1tLCB1YXBpL2xpbnV4L2NlYy5oIGFscmVhZHkgZGVmaW5lcyBDRUNfTUFYX01TR19TSVpFIHdp dGggdGhlIHNhbWUgdmFsdWUuCj4gUGVyaGFwcyBpdCBpcyBiZXR0ZXIgdG8gaW5jbHVkZSBsaW51 eC9jZWMuaCBoZXJlIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBzZWNvbmQKPiBkZWZpbmU/Cj4gCj4g QW5kIHNob3VsZG4ndCB0aGlzIGRlZmluZSBhbHNvIGJlIHVzZWQgZm9yIHRoZSBjZWNfbWVzc2Fn ZSBhcnJheSBhYm92ZT8KClRoZXNlIGRlZmluZXMgYXJlIHRpZWQgdG8gdGhlIEVtYmVkZGVkIENv bnRyb2xsZXIgQVBJLCBzbyBpdCBtYXkgYmUgZ29vZyB0byBrZWVwIHRoZW0Kc2VwYXJhdGVkIGZy b20gdGhlIHJlc3Qgb2YgdGhlIExpbnV4IEFQTywgSSdsbCBzZWUgYWJvdXQgdXNpbmcgdGhlIGRl ZmluZSBpbiB0aGUgZXZlbnQKc3RydWN0LCBidXQgSSB0aGluayB0aGV5IHdhbnQgdG8gaGF2ZSBh IGZvcm1hbCBhcnJheSBzaXplIHVzaW5nIGEgbnVtYmVyLgoKTmVpbAoKPiAKPiBSZWdhcmRzLAo+ IAo+IAlIYW5zCj4gCj4+ICsKPj4gKy8qIENFQyBtZXNzYWdlIGZyb20gdGhlIEFQIHRvIGJlIHdy aXR0ZW4gb24gdGhlIENFQyBidXMgKi8KPj4gKyNkZWZpbmUgRUNfQ01EX0NFQ19XUklURV9NU0cg MHgwMEI4Cj4+ICsKPj4gKy8qIE1lc3NhZ2UgdG8gd3JpdGUgdG8gdGhlIENFQyBidXMgKi8KPj4g K3N0cnVjdCBlY19wYXJhbXNfY2VjX3dyaXRlIHsKPj4gKwl1aW50OF90IG1zZ1tNQVhfQ0VDX01T R19MRU5dOwo+PiArfSBfX3BhY2tlZDsKPj4gKwo+PiArLyogU2V0IHZhcmlvdXMgQ0VDIHBhcmFt ZXRlcnMgKi8KPj4gKyNkZWZpbmUgRUNfQ01EX0NFQ19TRVQgMHgwMEJBCj4+ICsKPj4gK3N0cnVj dCBlY19wYXJhbXNfY2VjX3NldCB7Cj4+ICsJdWludDhfdCBjbWQ7IC8qIGVudW0gY2VjX2NvbW1h bmQgKi8KPj4gKwl1bmlvbiB7Cj4+ICsJCXVpbnQ4X3QgZW5hYmxlOwo+PiArCQl1aW50OF90IGFk ZHJlc3M7Cj4+ICsJfTsKPj4gK30gX19wYWNrZWQ7Cj4+ICsKPj4gKy8qIFJlYWQgdmFyaW91cyBD RUMgcGFyYW1ldGVycyAqLwo+PiArI2RlZmluZSBFQ19DTURfQ0VDX0dFVCAweDAwQkIKPj4gKwo+ PiArc3RydWN0IGVjX3BhcmFtc19jZWNfZ2V0IHsKPj4gKwl1aW50OF90IGNtZDsgLyogZW51bSBj ZWNfY29tbWFuZCAqLwo+PiArfSBfX3BhY2tlZDsKPj4gKwo+PiArc3RydWN0IGVjX3Jlc3BvbnNl X2NlY19nZXQgewo+PiArCXVuaW9uIHsKPj4gKwkJdWludDhfdCBlbmFibGU7Cj4+ICsJCXVpbnQ4 X3QgYWRkcmVzczsKPj4gKwl9Owo+PiArfSBfX3BhY2tlZDsKPj4gKwo+PiArZW51bSBjZWNfY29t bWFuZCB7Cj4+ICsJLyogQ0VDIHJlYWRpbmcsIHdyaXRpbmcgYW5kIGV2ZW50cyBlbmFibGUgKi8K Pj4gKwlDRUNfQ01EX0VOQUJMRSwKPj4gKwkvKiBDRUMgbG9naWNhbCBhZGRyZXNzICAqLwo+PiAr CUNFQ19DTURfTE9HSUNBTF9BRERSRVNTLAo+PiArfTsKPj4gKwo+PiArLyogRXZlbnRzIGZyb20g Q0VDIHRvIEFQICovCj4+ICtlbnVtIG1rYnBfY2VjX2V2ZW50IHsKPj4gKwlFQ19NS0JQX0NFQ19T RU5EX09LCQkJPSAxIDw8IDAsCj4+ICsJRUNfTUtCUF9DRUNfU0VORF9GQUlMRUQJCQk9IDEgPDwg MSwKPj4gK307Cj4+ICAKPj4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KPj4gIC8qCj4+Cj4gCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwg bWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK