From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AG47ELugEwl9JxMxp3mVJGAwA8O2E/xKk3F69TUrkvSD5oI6zF3MJKv7RQkh0B9uGKInhto3AeHW ARC-Seal: i=1; a=rsa-sha256; t=1521550665; cv=none; d=google.com; s=arc-20160816; b=jnkD1lP6OxkkCvr5tmeU534W1GPeSXtadwuLXoAW5ROfTm2/tz1HTE6frKDx4+n/1p sgWCXnpNQMe+Ejzu8tM9CkjzzY4x04uo71P4GTlLK/IrTODV3iI+FgqF/aM1lRV/El8e 362YyZrguLlefCqJ62j+AgsA4T0vhIV++ZB0m/h2SKG870oS9NMyIJWC+wUmv6/T7E3z DcucjypS2FiG/51OYWB04DRYHVqVdbxPHwHf5n0f9zt/vj1bmSqibF0Y4kP1l7B3PY4s iewiFnUU7TFtvMOLj0AvZavAo6WMpBVBjuLXmnJr27d1Xfvt6VewpyH+8LdITkIqSPqD a7BA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=b1jr4YGmKQnkll0wRqmeRFlp5sf4G4YRhp+rNCCbVBo=; b=yzCELfRoCa99/K6kHuWNp+AfTO2a+5nW+u+LXKINzz9n27V4MuvcTSRHpd40M1/nCA m9tBu2ObeJFrmz1NZD8cUj8ck/EarKka/rq1NLZ1Q8QMcj2ejytb0GFsUBwk6KD1gwDK 471JH2MU3kyOHb9AxpGVClaa+dwGPrRyBMUIvLEFeOY9tjndlCL2uE1I976fzRJP5nqm QUq07kmzxE+V1QLUSo/Kzfae5ENLHn83xnp9FcSuCHR8WZqHtqfLeFIhTf/p1EhgEEUD OT5QME7hQqJjO1tHd3McISaBYglByHHeW9NLh7yMoY6BoaWPwAZd2N1wADiG1WSapUto /LxQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of heikki.krogerus@linux.intel.com designates 134.134.136.31 as permitted sender) smtp.mailfrom=heikki.krogerus@linux.intel.com Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of heikki.krogerus@linux.intel.com designates 134.134.136.31 as permitted sender) smtp.mailfrom=heikki.krogerus@linux.intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,335,1517904000"; d="scan'208";a="39592572" From: Heikki Krogerus To: Greg Kroah-Hartman , Hans de Goede Cc: Darren Hart , Andy Shevchenko , MyungJoo Ham , Chanwoo Choi , Mathias Nyman , Guenter Roeck , Jun Li , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v9 08/12] xhci: Add Intel extended cap / otg phy mux handling Date: Tue, 20 Mar 2018 15:57:09 +0300 Message-Id: <20180320125713.85465-9-heikki.krogerus@linux.intel.com> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180320125713.85465-1-heikki.krogerus@linux.intel.com> References: <20180320125713.85465-1-heikki.krogerus@linux.intel.com> X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1595461511144331478?= X-GMAIL-MSGID: =?utf-8?q?1595461511144331478?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: From: Hans de Goede The xHCI controller on various Intel SoCs has an extended cap mmio-range which contains registers to control the muxing to the xHCI (host mode) or the dwc3 (device mode) and vbus-detection for the otg usb-phy. Having a role-sw driver included in the xHCI code (under drivers/usb/host) is not desirable. So this commit adds a simple handler for this extended capability, which creates a platform device with the caps mmio region as resource, this allows us to write a separate platform role-sw driver for the role-switch. Note this commit adds a call to the new xhci_ext_cap_init() function to xhci_pci_probe(), it is added here because xhci_ext_cap_init() must be called only once. If in the future we also want to handle ext-caps on non pci xHCI HCDs from xhci_ext_cap_init() a call to it should also be added to other bus probe paths. Signed-off-by: Hans de Goede Acked-by: Mathias Nyman Reviewed-by: Andy Shevchenko Signed-off-by: Heikki Krogerus --- Changes in v4: -Add Andy's Reviewed-by Changes in v2: -Use SPDX license header -Various small style cleanups / changes -Add Heikki's Reviewed-by Changes from some time ago when this patch was part of another patch-set: -Check xHCI controller PCI device-id instead of only checking for the Intel Extended capability ID, as the Extended capability ID is used on other model Intel xHCI controllers too -Add a new generic xhci_ext_cap_init() function and handle the new XHCI_INTEL_CHT_USB_MUX quirk there. -Stop using Cherry Trail / CHT in various places as other Intel SoCs (e.g. Broxton / Apollo Lake) also have this --- drivers/usb/host/Makefile | 2 +- drivers/usb/host/xhci-ext-caps.c | 90 ++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/xhci-ext-caps.h | 2 + drivers/usb/host/xhci-pci.c | 5 +++ drivers/usb/host/xhci.h | 2 + 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 drivers/usb/host/xhci-ext-caps.c diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 4ede4ce12366..8a8cffe0b445 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -11,7 +11,7 @@ fhci-y += fhci-mem.o fhci-tds.o fhci-sched.o fhci-$(CONFIG_FHCI_DEBUG) += fhci-dbg.o -xhci-hcd-y := xhci.o xhci-mem.o +xhci-hcd-y := xhci.o xhci-mem.o xhci-ext-caps.o xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o xhci-hcd-y += xhci-trace.o diff --git a/drivers/usb/host/xhci-ext-caps.c b/drivers/usb/host/xhci-ext-caps.c new file mode 100644 index 000000000000..399113f9fc5c --- /dev/null +++ b/drivers/usb/host/xhci-ext-caps.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * XHCI extended capability handling + * + * Copyright (c) 2017 Hans de Goede + */ + +#include +#include "xhci.h" + +#define USB_SW_DRV_NAME "intel_xhci_usb_sw" +#define USB_SW_RESOURCE_SIZE 0x400 + +static void xhci_intel_unregister_pdev(void *arg) +{ + platform_device_unregister(arg); +} + +static int xhci_create_intel_xhci_sw_pdev(struct xhci_hcd *xhci, u32 cap_offset) +{ + struct usb_hcd *hcd = xhci_to_hcd(xhci); + struct device *dev = hcd->self.controller; + struct platform_device *pdev; + struct resource res = { 0, }; + int ret; + + pdev = platform_device_alloc(USB_SW_DRV_NAME, PLATFORM_DEVID_NONE); + if (!pdev) { + xhci_err(xhci, "couldn't allocate %s platform device\n", + USB_SW_DRV_NAME); + return -ENOMEM; + } + + res.start = hcd->rsrc_start + cap_offset; + res.end = res.start + USB_SW_RESOURCE_SIZE - 1; + res.name = USB_SW_DRV_NAME; + res.flags = IORESOURCE_MEM; + + ret = platform_device_add_resources(pdev, &res, 1); + if (ret) { + dev_err(dev, "couldn't add resources to intel_xhci_usb_sw pdev\n"); + platform_device_put(pdev); + return ret; + } + + pdev->dev.parent = dev; + + ret = platform_device_add(pdev); + if (ret) { + dev_err(dev, "couldn't register intel_xhci_usb_sw pdev\n"); + platform_device_put(pdev); + return ret; + } + + ret = devm_add_action_or_reset(dev, xhci_intel_unregister_pdev, pdev); + if (ret) { + dev_err(dev, "couldn't add unregister action for intel_xhci_usb_sw pdev\n"); + return ret; + } + + return 0; +} + +int xhci_ext_cap_init(struct xhci_hcd *xhci) +{ + void __iomem *base = &xhci->cap_regs->hc_capbase; + u32 offset, val; + int ret; + + offset = xhci_find_next_ext_cap(base, 0, 0); + + while (offset) { + val = readl(base + offset); + + switch (XHCI_EXT_CAPS_ID(val)) { + case XHCI_EXT_CAPS_VENDOR_INTEL: + if (xhci->quirks & XHCI_INTEL_USB_ROLE_SW) { + ret = xhci_create_intel_xhci_sw_pdev(xhci, + offset); + if (ret) + return ret; + } + break; + } + offset = xhci_find_next_ext_cap(base, offset, 0); + } + + return 0; +} +EXPORT_SYMBOL_GPL(xhci_ext_cap_init); diff --git a/drivers/usb/host/xhci-ext-caps.h b/drivers/usb/host/xhci-ext-caps.h index 631e7cc62604..268328c20681 100644 --- a/drivers/usb/host/xhci-ext-caps.h +++ b/drivers/usb/host/xhci-ext-caps.h @@ -39,6 +39,8 @@ #define XHCI_EXT_CAPS_ROUTE 5 /* IDs 6-9 reserved */ #define XHCI_EXT_CAPS_DEBUG 10 +/* Vendor caps */ +#define XHCI_EXT_CAPS_VENDOR_INTEL 192 /* USB Legacy Support Capability - section 7.1.1 */ #define XHCI_HC_BIOS_OWNED (1 << 16) #define XHCI_HC_OS_OWNED (1 << 24) diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index d9f831b67e57..f17b7eab66cf 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -178,6 +178,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI) { xhci->quirks |= XHCI_SSIC_PORT_UNUSED; + xhci->quirks |= XHCI_INTEL_USB_ROLE_SW; } if (pdev->vendor == PCI_VENDOR_ID_INTEL && (pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI || @@ -311,6 +312,10 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) goto dealloc_usb2_hcd; } + retval = xhci_ext_cap_init(xhci); + if (retval) + goto put_usb3_hcd; + retval = usb_add_hcd(xhci->shared_hcd, dev->irq, IRQF_SHARED); if (retval) diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 8acc8f8d790f..05c909b04f14 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1829,6 +1829,7 @@ struct xhci_hcd { #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28) #define XHCI_HW_LPM_DISABLE (1 << 29) #define XHCI_SUSPEND_DELAY (1 << 30) +#define XHCI_INTEL_USB_ROLE_SW (1 << 31) unsigned int num_active_eps; unsigned int limit_active_eps; @@ -2024,6 +2025,7 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks); void xhci_init_driver(struct hc_driver *drv, const struct xhci_driver_overrides *over); int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id); +int xhci_ext_cap_init(struct xhci_hcd *xhci); int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup); int xhci_resume(struct xhci_hcd *xhci, bool hibernated); -- 2.16.2 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v9,08/12] xhci: Add Intel extended cap / otg phy mux handling From: Heikki Krogerus Message-Id: <20180320125713.85465-9-heikki.krogerus@linux.intel.com> Date: Tue, 20 Mar 2018 15:57:09 +0300 To: Greg Kroah-Hartman , Hans de Goede Cc: Darren Hart , Andy Shevchenko , MyungJoo Ham , Chanwoo Choi , Mathias Nyman , Guenter Roeck , Jun Li , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org List-ID: RnJvbTogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KClRoZSB4SENJIGNvbnRy b2xsZXIgb24gdmFyaW91cyBJbnRlbCBTb0NzIGhhcyBhbiBleHRlbmRlZCBjYXAgbW1pby1yYW5n ZQp3aGljaCBjb250YWlucyByZWdpc3RlcnMgdG8gY29udHJvbCB0aGUgbXV4aW5nIHRvIHRoZSB4 SENJIChob3N0IG1vZGUpCm9yIHRoZSBkd2MzIChkZXZpY2UgbW9kZSkgYW5kIHZidXMtZGV0ZWN0 aW9uIGZvciB0aGUgb3RnIHVzYi1waHkuCgpIYXZpbmcgYSByb2xlLXN3IGRyaXZlciBpbmNsdWRl ZCBpbiB0aGUgeEhDSSBjb2RlICh1bmRlciBkcml2ZXJzL3VzYi9ob3N0KQppcyBub3QgZGVzaXJh YmxlLiBTbyB0aGlzIGNvbW1pdCBhZGRzIGEgc2ltcGxlIGhhbmRsZXIgZm9yIHRoaXMgZXh0ZW5k ZWQKY2FwYWJpbGl0eSwgd2hpY2ggY3JlYXRlcyBhIHBsYXRmb3JtIGRldmljZSB3aXRoIHRoZSBj YXBzIG1taW8gcmVnaW9uIGFzCnJlc291cmNlLCB0aGlzIGFsbG93cyB1cyB0byB3cml0ZSBhIHNl cGFyYXRlIHBsYXRmb3JtIHJvbGUtc3cgZHJpdmVyIGZvcgp0aGUgcm9sZS1zd2l0Y2guCgpOb3Rl IHRoaXMgY29tbWl0IGFkZHMgYSBjYWxsIHRvIHRoZSBuZXcgeGhjaV9leHRfY2FwX2luaXQoKSBm dW5jdGlvbgp0byB4aGNpX3BjaV9wcm9iZSgpLCBpdCBpcyBhZGRlZCBoZXJlIGJlY2F1c2UgeGhj aV9leHRfY2FwX2luaXQoKSBtdXN0CmJlIGNhbGxlZCBvbmx5IG9uY2UuIElmIGluIHRoZSBmdXR1 cmUgd2UgYWxzbyB3YW50IHRvIGhhbmRsZSBleHQtY2FwcwpvbiBub24gcGNpIHhIQ0kgSENEcyBm cm9tIHhoY2lfZXh0X2NhcF9pbml0KCkgYSBjYWxsIHRvIGl0IHNob3VsZCBhbHNvCmJlIGFkZGVk IHRvIG90aGVyIGJ1cyBwcm9iZSBwYXRocy4KClNpZ25lZC1vZmYtYnk6IEhhbnMgZGUgR29lZGUg PGhkZWdvZWRlQHJlZGhhdC5jb20+CkFja2VkLWJ5OiBNYXRoaWFzIE55bWFuIDxtYXRoaWFzLm55 bWFuQGxpbnV4LmludGVsLmNvbT4KUmV2aWV3ZWQtYnk6IEFuZHkgU2hldmNoZW5rbyA8YW5keS5z aGV2Y2hlbmtvQGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogSGVpa2tpIEtyb2dlcnVzIDxoZWlr a2kua3JvZ2VydXNAbGludXguaW50ZWwuY29tPgotLS0KQ2hhbmdlcyBpbiB2NDoKLUFkZCBBbmR5 J3MgUmV2aWV3ZWQtYnkKCkNoYW5nZXMgaW4gdjI6Ci1Vc2UgU1BEWCBsaWNlbnNlIGhlYWRlcgot VmFyaW91cyBzbWFsbCBzdHlsZSBjbGVhbnVwcyAvIGNoYW5nZXMKLUFkZCBIZWlra2kncyBSZXZp ZXdlZC1ieQoKQ2hhbmdlcyBmcm9tIHNvbWUgdGltZSBhZ28gd2hlbiB0aGlzIHBhdGNoIHdhcyBw YXJ0IG9mIGFub3RoZXIgcGF0Y2gtc2V0OgotQ2hlY2sgeEhDSSBjb250cm9sbGVyIFBDSSBkZXZp Y2UtaWQgaW5zdGVhZCBvZiBvbmx5IGNoZWNraW5nIGZvciB0aGUKIEludGVsIEV4dGVuZGVkIGNh cGFiaWxpdHkgSUQsIGFzIHRoZSBFeHRlbmRlZCBjYXBhYmlsaXR5IElEIGlzIHVzZWQgb24KIG90 aGVyIG1vZGVsIEludGVsIHhIQ0kgY29udHJvbGxlcnMgdG9vCi1BZGQgYSBuZXcgZ2VuZXJpYyB4 aGNpX2V4dF9jYXBfaW5pdCgpIGZ1bmN0aW9uIGFuZCBoYW5kbGUgdGhlIG5ldwogWEhDSV9JTlRF TF9DSFRfVVNCX01VWCBxdWlyayB0aGVyZS4KLVN0b3AgdXNpbmcgQ2hlcnJ5IFRyYWlsIC8gQ0hU IGluIHZhcmlvdXMgcGxhY2VzIGFzIG90aGVyIEludGVsIFNvQ3MKIChlLmcuIEJyb3h0b24gLyBB cG9sbG8gTGFrZSkgYWxzbyBoYXZlIHRoaXMKLS0tCiBkcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxl ICAgICAgICB8ICAyICstCiBkcml2ZXJzL3VzYi9ob3N0L3hoY2ktZXh0LWNhcHMuYyB8IDkwICsr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2hvc3Qv eGhjaS1leHQtY2Fwcy5oIHwgIDIgKwogZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jICAgICAg fCAgNSArKysKIGRyaXZlcnMvdXNiL2hvc3QveGhjaS5oICAgICAgICAgIHwgIDIgKwogNSBmaWxl cyBjaGFuZ2VkLCAxMDAgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvdXNiL2hvc3QveGhjaS1leHQtY2Fwcy5jCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy91c2IvaG9zdC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKaW5kZXgg NGVkZTRjZTEyMzY2Li44YThjZmZlMGI0NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qv TWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQpAQCAtMTEsNyArMTEsNyBA QCBmaGNpLXkgKz0gZmhjaS1tZW0ubyBmaGNpLXRkcy5vIGZoY2ktc2NoZWQubwogCiBmaGNpLSQo Q09ORklHX0ZIQ0lfREVCVUcpICs9IGZoY2ktZGJnLm8KIAoteGhjaS1oY2QteSA6PSB4aGNpLm8g eGhjaS1tZW0ubworeGhjaS1oY2QteSA6PSB4aGNpLm8geGhjaS1tZW0ubyB4aGNpLWV4dC1jYXBz Lm8KIHhoY2ktaGNkLXkgKz0geGhjaS1yaW5nLm8geGhjaS1odWIubyB4aGNpLWRiZy5vCiB4aGNp LWhjZC15ICs9IHhoY2ktdHJhY2UubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3ho Y2ktZXh0LWNhcHMuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1leHQtY2Fwcy5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMzk5MTEzZjlmYzVjCi0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWV4dC1jYXBzLmMKQEAgLTAsMCArMSw5MCBA QAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBYSENJIGV4dGVu ZGVkIGNhcGFiaWxpdHkgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgSGFucyBk ZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxh dGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSAieGhjaS5oIgorCisjZGVmaW5lIFVTQl9TV19EUlZf TkFNRQkJImludGVsX3hoY2lfdXNiX3N3IgorI2RlZmluZSBVU0JfU1dfUkVTT1VSQ0VfU0laRQkw eDQwMAorCitzdGF0aWMgdm9pZCB4aGNpX2ludGVsX3VucmVnaXN0ZXJfcGRldih2b2lkICphcmcp Cit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoYXJnKTsKK30KKworc3RhdGljIGludCB4 aGNpX2NyZWF0ZV9pbnRlbF94aGNpX3N3X3BkZXYoc3RydWN0IHhoY2lfaGNkICp4aGNpLCB1MzIg Y2FwX29mZnNldCkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0geGhjaV90b19oY2QoeGhjaSk7 CisJc3RydWN0IGRldmljZSAqZGV2ID0gaGNkLT5zZWxmLmNvbnRyb2xsZXI7CisJc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UJcmVzID0geyAwLCB9OworCWlu dCByZXQ7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKFVTQl9TV19EUlZfTkFNRSwg UExBVEZPUk1fREVWSURfTk9ORSk7CisJaWYgKCFwZGV2KSB7CisJCXhoY2lfZXJyKHhoY2ksICJj b3VsZG4ndCBhbGxvY2F0ZSAlcyBwbGF0Zm9ybSBkZXZpY2VcbiIsCisJCQkgVVNCX1NXX0RSVl9O QU1FKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVzLnN0YXJ0ID0gaGNkLT5yc3JjX3N0 YXJ0ICsgY2FwX29mZnNldDsKKwlyZXMuZW5kCSAgPSByZXMuc3RhcnQgKyBVU0JfU1dfUkVTT1VS Q0VfU0laRSAtIDE7CisJcmVzLm5hbWUgID0gVVNCX1NXX0RSVl9OQU1FOworCXJlcy5mbGFncyA9 IElPUkVTT1VSQ0VfTUVNOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMo cGRldiwgJnJlcywgMSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImNvdWxkbid0IGFk ZCByZXNvdXJjZXMgdG8gaW50ZWxfeGhjaV91c2Jfc3cgcGRldlxuIik7CisJCXBsYXRmb3JtX2Rl dmljZV9wdXQocGRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGRldi0+ZGV2LnBhcmVudCA9 IGRldjsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisJaWYgKHJldCkgewor CQlkZXZfZXJyKGRldiwgImNvdWxkbid0IHJlZ2lzdGVyIGludGVsX3hoY2lfdXNiX3N3IHBkZXZc biIpOworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKwor CXJldCA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIHhoY2lfaW50ZWxfdW5yZWdpc3Rl cl9wZGV2LCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY291bGRuJ3QgYWRk IHVucmVnaXN0ZXIgYWN0aW9uIGZvciBpbnRlbF94aGNpX3VzYl9zdyBwZGV2XG4iKTsKKwkJcmV0 dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHhoY2lfZXh0X2NhcF9pbml0KHN0 cnVjdCB4aGNpX2hjZCAqeGhjaSkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSAmeGhjaS0+Y2Fw X3JlZ3MtPmhjX2NhcGJhc2U7CisJdTMyIG9mZnNldCwgdmFsOworCWludCByZXQ7CisKKwlvZmZz ZXQgPSB4aGNpX2ZpbmRfbmV4dF9leHRfY2FwKGJhc2UsIDAsIDApOworCisJd2hpbGUgKG9mZnNl dCkgeworCQl2YWwgPSByZWFkbChiYXNlICsgb2Zmc2V0KTsKKworCQlzd2l0Y2ggKFhIQ0lfRVhU X0NBUFNfSUQodmFsKSkgeworCQljYXNlIFhIQ0lfRVhUX0NBUFNfVkVORE9SX0lOVEVMOgorCQkJ aWYgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfSU5URUxfVVNCX1JPTEVfU1cpIHsKKwkJCQlyZXQgPSB4 aGNpX2NyZWF0ZV9pbnRlbF94aGNpX3N3X3BkZXYoeGhjaSwKKwkJCQkJCQkJICAgICBvZmZzZXQp OworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQor CQlvZmZzZXQgPSB4aGNpX2ZpbmRfbmV4dF9leHRfY2FwKGJhc2UsIG9mZnNldCwgMCk7CisJfQor CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4aGNpX2V4dF9jYXBfaW5pdCk7CmRp ZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktZXh0LWNhcHMuaCBiL2RyaXZlcnMvdXNi L2hvc3QveGhjaS1leHQtY2Fwcy5oCmluZGV4IDYzMWU3Y2M2MjYwNC4uMjY4MzI4YzIwNjgxIDEw MDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktZXh0LWNhcHMuaAorKysgYi9kcml2ZXJz L3VzYi9ob3N0L3hoY2ktZXh0LWNhcHMuaApAQCAtMzksNiArMzksOCBAQAogI2RlZmluZSBYSENJ X0VYVF9DQVBTX1JPVVRFCTUKIC8qIElEcyA2LTkgcmVzZXJ2ZWQgKi8KICNkZWZpbmUgWEhDSV9F WFRfQ0FQU19ERUJVRwkxMAorLyogVmVuZG9yIGNhcHMgKi8KKyNkZWZpbmUgWEhDSV9FWFRfQ0FQ U19WRU5ET1JfSU5URUwJMTkyCiAvKiBVU0IgTGVnYWN5IFN1cHBvcnQgQ2FwYWJpbGl0eSAtIHNl Y3Rpb24gNy4xLjEgKi8KICNkZWZpbmUgWEhDSV9IQ19CSU9TX09XTkVECSgxIDw8IDE2KQogI2Rl ZmluZSBYSENJX0hDX09TX09XTkVECSgxIDw8IDI0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv aG9zdC94aGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCmluZGV4IGQ5Zjgz MWI2N2U1Ny4uZjE3YjdlYWI2NmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kt cGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCkBAIC0xNzgsNiArMTc4LDcg QEAgc3RhdGljIHZvaWQgeGhjaV9wY2lfcXVpcmtzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0 IHhoY2lfaGNkICp4aGNpKQogCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRF TCAmJgogCQkgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfQ0hFUlJZVklFV19Y SENJKSB7CiAJCXhoY2ktPnF1aXJrcyB8PSBYSENJX1NTSUNfUE9SVF9VTlVTRUQ7CisJCXhoY2kt PnF1aXJrcyB8PSBYSENJX0lOVEVMX1VTQl9ST0xFX1NXOwogCX0KIAlpZiAocGRldi0+dmVuZG9y ID09IFBDSV9WRU5ET1JfSURfSU5URUwgJiYKIAkgICAgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVW SUNFX0lEX0lOVEVMX0NIRVJSWVZJRVdfWEhDSSB8fApAQCAtMzExLDYgKzMxMiwxMCBAQCBzdGF0 aWMgaW50IHhoY2lfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBw Y2lfZGV2aWNlX2lkICppZCkKIAkJZ290byBkZWFsbG9jX3VzYjJfaGNkOwogCX0KIAorCXJldHZh bCA9IHhoY2lfZXh0X2NhcF9pbml0KHhoY2kpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcHV0X3Vz YjNfaGNkOworCiAJcmV0dmFsID0gdXNiX2FkZF9oY2QoeGhjaS0+c2hhcmVkX2hjZCwgZGV2LT5p cnEsCiAJCQlJUlFGX1NIQVJFRCk7CiAJaWYgKHJldHZhbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMv dXNiL2hvc3QveGhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKaW5kZXggOGFjYzhmOGQ3 OTBmLi4wNWM5MDliMDRmMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCisr KyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCkBAIC0xODI5LDYgKzE4MjksNyBAQCBzdHJ1Y3Qg eGhjaV9oY2QgewogI2RlZmluZSBYSENJX0FTTUVESUFfTU9ESUZZX0ZMT1dDT05UUk9MCSgxIDw8 IDI4KQogI2RlZmluZSBYSENJX0hXX0xQTV9ESVNBQkxFCSgxIDw8IDI5KQogI2RlZmluZSBYSENJ X1NVU1BFTkRfREVMQVkJKDEgPDwgMzApCisjZGVmaW5lIFhIQ0lfSU5URUxfVVNCX1JPTEVfU1cJ KDEgPDwgMzEpCiAKIAl1bnNpZ25lZCBpbnQJCW51bV9hY3RpdmVfZXBzOwogCXVuc2lnbmVkIGlu dAkJbGltaXRfYWN0aXZlX2VwczsKQEAgLTIwMjQsNiArMjAyNSw3IEBAIGludCB4aGNpX2dlbl9z ZXR1cChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCB4aGNpX2dldF9xdWlya3NfdCBnZXRfcXVpcmtzKTsK IHZvaWQgeGhjaV9pbml0X2RyaXZlcihzdHJ1Y3QgaGNfZHJpdmVyICpkcnYsCiAJCSAgICAgIGNv bnN0IHN0cnVjdCB4aGNpX2RyaXZlcl9vdmVycmlkZXMgKm92ZXIpOwogaW50IHhoY2lfZGlzYWJs ZV9zbG90KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgdTMyIHNsb3RfaWQpOworaW50IHhoY2lfZXh0 X2NhcF9pbml0KHN0cnVjdCB4aGNpX2hjZCAqeGhjaSk7CiAKIGludCB4aGNpX3N1c3BlbmQoc3Ry dWN0IHhoY2lfaGNkICp4aGNpLCBib29sIGRvX3dha2V1cCk7CiBpbnQgeGhjaV9yZXN1bWUoc3Ry dWN0IHhoY2lfaGNkICp4aGNpLCBib29sIGhpYmVybmF0ZWQpOwo=