From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andy Shevchenko Subject: [PATCH v6 1/4] PCI: Introduce pci_dev_for_each_resource() Date: Mon, 20 Mar 2023 15:16:30 +0200 Message-ID: <20230320131633.61680-2-andriy.shevchenko@linux.intel.com> References: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> Mime-Version: 1.0 Content-Transfer-Encoding: base64 Return-path: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679318170; x=1710854170; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=03KpgEWjTRIOrghUDlJ37yTkg0WA7G7gXnWuRYLhmBU=; b=FPbgs8bn19Luqxz+LhamuJC+ZX6wAWnZBxVMVLXxBvgJpMRcwRb3NI39 O8bQewYdMwrO9Sw3//U4+GYVu7dMdNXvnIastOTu+Icm1mK/7EnjMzFob K0c5wzvioO4U4G6zOjU00ARvaLnefKkZv39j8qASYOHXM7xn+jwhHs22k 9wWohoelspkxfA/eEjsLmAEUGEp6FBzoukux4Aw2ewVXOgzcLcmTKjUl7 wnQb/Gvt1H3MC663WBaPJD6Q8hjeZ28akHm6U+tNsR6HZDGLLFedzKgj/ 6j7LrLZ7C4/V8J0Nk+TqJb/C+58sbQtlFodsx7flyeI5TsO3MTex00wl5 Q==; In-Reply-To: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> List-ID: Content-Type: text/plain; charset="macroman" To: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Andy Shevchenko , Mika Westerberg , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Michael Ellerman , Randy Dunlap , Arnd Bergmann , Niklas Schnelle , Bjorn Helgaas , "Rafael J. Wysocki" , =?UTF-8?q?Pali=20Roh=C3=A1r?= , "Maciej W. Rozycki" , Juergen Gross , Dominik Brodowski , linux-kernel@vger.kernel.org, linux-alpha@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mips@vger.kernel.org, linuxppc-dev@lists Cc: Miguel Ojeda , Richard Henderson , Ivan Kokshaysky , Matt Turner , Russell King , Andrew Lunn , Sebastian Hesselbarth , Gregory Clement , Thomas Bogendoerfer , Nicholas Piggin , Christophe Leroy , Anatolij Gustschin , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Bjorn Helgaas , Stefano Stabellini RnJvbTogTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAbGludXguaW50ZWwuY29tPgoK SW5zdGVhZCBvZiBvcGVuLWNvZGluZyBpdCBldmVyeXdoZXJlIGludHJvZHVjZSBhIHRpbnkgaGVs cGVyIHRoYXQgY2FuIGJlCnVzZWQgdG8gaXRlcmF0ZSBvdmVyIGVhY2ggcmVzb3VyY2Ugb2YgYSBQ Q0kgZGV2aWNlLCBhbmQgY29udmVydCB0aGUgbW9zdApvYnZpb3VzIHVzZXJzIGludG8gaXQuCgpX aGlsZSBhdCBpdCBkcm9wIGRvdWJsZWQgZW1wdHkgbGluZSBiZWZvcmUgcGRldl9zb3J0X3Jlc291 cmNlcygpLgoKTm8gZnVuY3Rpb25hbCBjaGFuZ2VzIGludGVuZGVkLgoKU3VnZ2VzdGVkLWJ5OiBB bmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4KU2lnbmVk LW9mZi1ieTogTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAbGludXguaW50ZWwuY29t PgpTaWduZWQtb2ZmLWJ5OiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4 LmludGVsLmNvbT4KUmV2aWV3ZWQtYnk6IEtyenlzenRvZiBXaWxjennFhHNraSA8a3dAbGludXgu Y29tPgotLS0KIC5jbGFuZy1mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIg KysKIGFyY2gvYWxwaGEva2VybmVsL3BjaS5jICAgICAgICAgICAgICAgICAgIHwgIDUgKystLQog YXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jICAgICAgICAgICAgICAgICAgfCAxNiArKysrKystLS0t LS0tCiBhcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jICAgICAgICAgICAgICAgICB8IDEwICsrKyst LS0tCiBhcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jICAgICAgICAgICAgICB8IDEwICsrKyst LS0tCiBhcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMgICAgICAgICAgICAgICB8IDEwICsrKyst LS0tCiBhcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMgICAgICAgICAgICAgICB8ICA4ICsrKy0t LS0KIGFyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jICAgICAgICAgICAgICAgIHwgIDMgKy0tCiBh cmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyAgICAgICAgICB8IDIxICsrKysrKysrLS0t LS0tLS0KIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jICAgICAgICAgIHwgIDggKysr LS0tLQogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMgfCAgNSArKy0t CiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgICAgICB8IDE2ICsrKysrKy0t LS0tLS0KIGFyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYyAgICAgICAgIHwgMTAgKysr Ky0tLS0KIGFyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgICAgICAgICAgICAgIHwgIDUgKyst LQogYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgICAgICAgICAgICAgICAgICAgfCAxMCArKysrLS0t LQogYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jICAgICAgICAgICAgICAgICAgfCAgNSArKy0tCiBk cml2ZXJzL3BjaS9yZW1vdmUuYyAgICAgICAgICAgICAgICAgICAgICB8ICA1ICsrLS0KIGRyaXZl cnMvcGNpL3NldHVwLWJ1cy5jICAgICAgICAgICAgICAgICAgIHwgMjcgKysrKysrKystLS0tLS0t LS0tLS0tCiBkcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyAgICAgICAgICAgICAgICAgICB8ICA0ICst LS0KIGRyaXZlcnMvcGNpL3ZnYWFyYi5jICAgICAgICAgICAgICAgICAgICAgIHwgMTcgKysrKy0t LS0tLS0tLQogZHJpdmVycy9wY2kveGVuLXBjaWZyb250LmMgICAgICAgICAgICAgICAgfCAgNCAr LS0tCiBkcml2ZXJzL3BucC9xdWlya3MuYyAgICAgICAgICAgICAgICAgICAgICB8IDI5ICsrKysr KysrLS0tLS0tLS0tLS0tLS0tCiBpbmNsdWRlL2xpbnV4L3BjaS5oICAgICAgICAgICAgICAgICAg ICAgICB8IDE1ICsrKysrKysrKystLQogMjMgZmlsZXMgY2hhbmdlZCwgMTExIGluc2VydGlvbnMo KyksIDEzNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS8uY2xhbmctZm9ybWF0IGIvLmNsYW5n LWZvcm1hdAppbmRleCBkOTg4ZTlmYTliMjYuLjI2NmFiYjg0MzY1NCAxMDA2NDQKLS0tIGEvLmNs YW5nLWZvcm1hdAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC01MjAsNiArNTIwLDggQEAgRm9yRWFj aE1hY3JvczoKICAgLSAnb2ZfcHJvcGVydHlfZm9yX2VhY2hfc3RyaW5nJwogICAtICdvZl9wcm9w ZXJ0eV9mb3JfZWFjaF91MzInCiAgIC0gJ3BjaV9idXNfZm9yX2VhY2hfcmVzb3VyY2UnCisgIC0g J3BjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UnCisgIC0gJ3BjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2VfcCcKICAgLSAncGNpX2RvZV9mb3JfZWFjaF9vZmYnCiAgIC0gJ3BjbF9mb3JfZWFjaF9jaHVu aycKICAgLSAncGNsX2Zvcl9lYWNoX3NlZ21lbnQnCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tl cm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCmluZGV4IDY0ZmJmYjA3NjNiMi4u NDQ1OGViN2Y0NGYwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYworKysgYi9h cmNoL2FscGhhL2tlcm5lbC9wY2kuYwpAQCAtMjg4LDExICsyODgsMTAgQEAgcGNpYmlvc19jbGFp bV9vbmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKQogCXN0cnVjdCBwY2lfYnVzICpjaGlsZF9idXM7 CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmItPmRldmljZXMsIGJ1c19saXN0KSB7CisJ CXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9O VU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291 cmNlW2ldOwotCisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCQlp ZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8fCAhci0+ZmxhZ3MpCiAJCQkJY29udGludWU7CiAJ CQlpZiAocGNpX2hhc19mbGFnKFBDSV9QUk9CRV9PTkxZKSB8fApkaWZmIC0tZ2l0IGEvYXJjaC9h cm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCmluZGV4IGU3ZWYy YjViZWE5Yy4uNTI1NDczNGIyM2U2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMy LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC0xNDIsMTUgKzE0MiwxNSBAQCBE RUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwgUENJX0RFVklD RV9JRF9XSU5CT05EMl84OUM5NDBGLAogICovCiBzdGF0aWMgdm9pZCBwY2lfZml4dXBfZGVjMjEy ODUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKLQogCWlmIChkZXYtPmRldmZuID09 IDApIHsKKwkJc3RydWN0IHJlc291cmNlICpyOworCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsKIAkJ ZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0gMDsg aSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQg PSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgICA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ld LmZsYWdzID0gMDsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZV9wKGRldiwgcikgeworCQkJ ci0+c3RhcnQgPSAwOworCQkJci0+ZW5kID0gMDsKKwkJCXItPmZsYWdzID0gMDsKIAkJfQogCX0K IH0KQEAgLTE2MiwxMyArMTYyLDExIEBAIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVO RE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfMjEyODUsIHBjaV9maXh1cF9kCiBzdGF0aWMg dm9pZCBwY2lfZml4dXBfaWRlX2Jhc2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0 IHJlc291cmNlICpyOwotCWludCBpOwogCiAJaWYgKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9D TEFTU19TVE9SQUdFX0lERSkKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1f UkVTT1VSQ0VTOyBpKyspIHsKLQkJciA9IGRldi0+cmVzb3VyY2UgKyBpOworCXBjaV9kZXZfZm9y X2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsKIAkJaWYgKChyLT5zdGFydCAmIH4weDgwKSA9PSAw eDM3NCkgewogCQkJci0+c3RhcnQgfD0gMjsKIAkJCXItPmVuZCA9IHItPnN0YXJ0OwpkaWZmIC0t Z2l0IGEvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtZG92ZS9wY2ll LmMKaW5kZXggNzU0Y2EzODFmNjAwLi41OGNlY2Q3OWEyMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJt L21hY2gtZG92ZS9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYwpAQCAtMTQy LDE0ICsxNDIsMTQgQEAgc3RhdGljIHN0cnVjdCBwY2lfb3BzIHBjaWVfb3BzID0gewogc3RhdGlj IHZvaWQgcmNfcGNpX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaWYgKGRldi0+YnVz LT5wYXJlbnQgPT0gTlVMTCAmJiBkZXYtPmRldmZuID09IDApIHsKLQkJaW50IGk7CisJCXN0cnVj dCByZXNvdXJjZSAqcjsKIAogCQlkZXYtPmNsYXNzICY9IDB4ZmY7CiAJCWRldi0+Y2xhc3MgfD0g UENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDg7Ci0JCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09V TlRfUkVTT1VSQ0U7IGkrKykgewotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7Ci0JCQlk ZXYtPnJlc291cmNlW2ldLmVuZCAgID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAw OworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CisJCQlyLT5zdGFydCA9 IDA7CisJCQlyLT5lbmQgICA9IDA7CisJCQlyLT5mbGFncyA9IDA7CiAJCX0KIAl9CiB9CmRpZmYg LS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4 eHgwL3BjaWUuYwppbmRleCA2MTkwZjUzOGExMjQuLmY1OWYwMjE1MGEzNiAxMDA2NDQKLS0tIGEv YXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAv cGNpZS5jCkBAIC0xODYsMTQgKzE4NiwxNCBAQCBzdGF0aWMgc3RydWN0IHBjaV9vcHMgcGNpZV9v cHMgPSB7CiBzdGF0aWMgdm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsK IAlpZiAoZGV2LT5idXMtPnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2Zm4gPT0gMCkgewotCQlp bnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsKIAkJ ZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0gMDsg aSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0 YXJ0ID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwotCQkJZGV2LT5yZXNvdXJj ZVtpXS5mbGFncyA9IDA7CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsK KwkJCXItPnN0YXJ0ID0gMDsKKwkJCXItPmVuZCAgID0gMDsKKwkJCXItPmZsYWdzID0gMDsKIAkJ fQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYyBiL2FyY2gv YXJtL21hY2gtb3Jpb241eC9wY2kuYwppbmRleCA4ODhmZGM5MDk5YzUuLjA5MzNiNDdiNjAxYSAx MDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCisrKyBiL2FyY2gvYXJtL21h Y2gtb3Jpb241eC9wY2kuYwpAQCAtNTIyLDE0ICs1MjIsMTQgQEAgc3RhdGljIGludCBfX2luaXQg cGNpX3NldHVwKHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKIHN0YXRpYyB2b2lkIHJjX3BjaV9m aXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWlmIChkZXYtPmJ1cy0+cGFyZW50ID09IE5V TEwgJiYgZGV2LT5kZXZmbiA9PSAwKSB7Ci0JCWludCBpOworCQlzdHJ1Y3QgcmVzb3VyY2UgKnI7 CiAKIAkJZGV2LT5jbGFzcyAmPSAweGZmOwogCQlkZXYtPmNsYXNzIHw9IFBDSV9DTEFTU19CUklE R0VfSE9TVCA8PCA4OwotCQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBp KyspIHsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtp XS5lbmQgICA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKKwkJcGNpX2Rldl9m b3JfZWFjaF9yZXNvdXJjZV9wKGRldiwgcikgeworCQkJci0+c3RhcnQJPSAwOworCQkJci0+ZW5k CQk9IDA7CisJCQlyLT5mbGFncwk9IDA7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL21p cHMvcGNpL29wcy1iY202M3h4LmMgYi9hcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMKaW5kZXgg ZGM2ZGMyNzQxMjcyLi5jMGVmY2JmM2M2M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3Bz LWJjbTYzeHguYworKysgYi9hcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMKQEAgLTQxMywxOCAr NDEzLDE4IEBAIHN0cnVjdCBwY2lfb3BzIGJjbTYzeHhfY2Jfb3BzID0gewogc3RhdGljIHZvaWQg YmNtNjN4eF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0YXRpYyBpbnQgaW9fd2lu ZG93ID0gLTE7Ci0JaW50IGksIGZvdW5kLCBuZXdfaW9fd2luZG93OworCWludCBmb3VuZCwgbmV3 X2lvX3dpbmRvdzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJdTMyIHZhbDsKIAogCS8qIGxvb2sg Zm9yIGFueSBpbyByZXNvdXJjZSAqLwogCWZvdW5kID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgREVW SUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKLQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhkZXYs IGkpICYgSU9SRVNPVVJDRV9JTykgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYs IHIpIHsKKwkJaWYgKHJlc291cmNlX3R5cGUocikgPT0gSU9SRVNPVVJDRV9JTykgewogCQkJZm91 bmQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KIAlpZiAoIWZvdW5kKQogCQlyZXR1cm47CiAK ZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jIGIvYXJjaC9taXBzL3BjaS9w Y2ktbGVnYWN5LmMKaW5kZXggNDY4NzIyYzhhNWM2Li5lYzI1NjdmOGVmZDggMTAwNjQ0Ci0tLSBh L2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2Fj eS5jCkBAIC0yNDksMTIgKzI0OSwxMSBAQCBzdGF0aWMgaW50IHBjaWJpb3NfZW5hYmxlX3Jlc291 cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIAogCXBjaV9yZWFkX2NvbmZpZ193 b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0JZm9yIChpZHgg PSAwOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKKwlwY2lfZGV2X2Zvcl9lYWNo X3Jlc291cmNlKGRldiwgciwgaWR4KSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQg c3R1ZmYgKi8KIAkJaWYgKCEobWFzayAmICgxPDxpZHgpKSkKIAkJCWNvbnRpbnVlOwogCi0JCXIg PSAmZGV2LT5yZXNvdXJjZVtpZHhdOwogCQlpZiAoIShyLT5mbGFncyAmIChJT1JFU09VUkNFX0lP IHwgSU9SRVNPVVJDRV9NRU0pKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGlkeCA9PSBQQ0lfUk9N X1JFU09VUkNFKSAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9u LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwppbmRleCBkNjdjZjc5YmY1ZDAu LjE5MDhhNDZjYWQ1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9u LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTg4MCw2ICs4ODAs NyBAQCBpbnQgcGNpYmlvc19yb290X2JyaWRnZV9wcmVwYXJlKHN0cnVjdCBwY2lfaG9zdF9icmlk Z2UgKmJyaWRnZSkKIHN0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBw Y2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190 b19ob3N0KGRldi0+YnVzKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgaTsKIAogCWlm ICghaG9zZSkgewpAQCAtODkxLDkgKzg5Miw5IEBAIHN0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXBf cmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiAJaWYgKGRldi0+aXNfdmlydGZuKQogCQly ZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsK LQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgaTsKKwlwY2lfZGV2X2Zv cl9lYWNoX3Jlc291cmNlKGRldiwgcmVzLCBpKSB7CiAJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiBy ZWc7CisKIAkJaWYgKCFyZXMtPmZsYWdzKQogCQkJY29udGludWU7CiAKQEAgLTE0NTIsMTEgKzE0 NTMsMTAgQEAgdm9pZCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykK IAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGRfYnVzOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYs ICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50 IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0 cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCisJCXBjaV9kZXZfZm9yX2Vh Y2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCQlpZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8 fCAhci0+ZmxhZ3MpCiAJCQkJY29udGludWU7CiAKQEAgLTE3MDUsMTkgKzE3MDUsMjAgQEAgRVhQ T1JUX1NZTUJPTF9HUEwocGNpYmlvc19zY2FuX3BoYik7CiAKIHN0YXRpYyB2b2lkIGZpeHVwX2hp ZGVfaG9zdF9yZXNvdXJjZV9mc2woc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaSwgY2xh c3MgPSBkZXYtPmNsYXNzID4+IDg7CisJaW50IGNsYXNzID0gZGV2LT5jbGFzcyA+PiA4OwogCS8q IFdoZW4gY29uZmlndXJlZCBhcyBhZ2VudCwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlID0gMSAqLwog CWludCBwcm9nX2lmID0gZGV2LT5jbGFzcyAmIDB4ZjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAK IAlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQyB8fAogCSAgICAgY2xh c3MgPT0gUENJX0NMQVNTX0JSSURHRV9PVEhFUikgJiYKIAkJKGRldi0+aGRyX3R5cGUgPT0gUENJ X0hFQURFUl9UWVBFX05PUk1BTCkgJiYKIAkJKHByb2dfaWYgPT0gMCkgJiYKIAkJKGRldi0+YnVz LT5wYXJlbnQgPT0gTlVMTCkpIHsKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNP VVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJCWRldi0+cmVz b3VyY2VbaV0uZW5kID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOworCQlwY2lf ZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CisJCQlyLT5zdGFydCA9IDA7CisJCQly LT5lbmQgPSAwOworCQkJci0+ZmxhZ3MgPSAwOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJj aC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4 eC9wY2kuYwppbmRleCBjYTVkZDdhNTg0MmEuLjlkMTkxMjNjMGRhOCAxMDA2NDQKLS0tIGEvYXJj aC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jt cy80eHgvcGNpLmMKQEAgLTU3LDcgKzU3LDcgQEAgc3RhdGljIGlubGluZSBpbnQgcHBjNDQwc3Bl X3JldkEodm9pZCkKIHN0YXRpYyB2b2lkIGZpeHVwX3BwYzR4eF9wY2lfYnJpZGdlKHN0cnVjdCBw Y2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCWludCBpOwor CXN0cnVjdCByZXNvdXJjZSAqcjsKIAogCWlmIChkZXYtPmRldmZuICE9IDAgfHwgZGV2LT5idXMt PnNlbGYgIT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtNzksOSArNzksOSBAQCBzdGF0aWMgdm9pZCBm aXh1cF9wcGM0eHhfcGNpX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogCS8qIEhpZGUgdGhl IFBDSSBob3N0IEJBUnMgZnJvbSB0aGUga2VybmVsIGFzIHRoZWlyIGNvbnRlbnQgZG9lc24ndAog CSAqIGZpdCB3ZWxsIGluIHRoZSByZXNvdXJjZSBtYW5hZ2VtZW50CiAJICovCi0JZm9yIChpID0g MDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCWRldi0+cmVzb3VyY2VbaV0u c3RhcnQgPSBkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7Ci0JCWRldi0+cmVzb3VyY2VbaV0uZmxh Z3MgPSAwOworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsKKwkJci0+c3Rh cnQgPSByLT5lbmQgPSAwOworCQlyLT5mbGFncyA9IDA7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5G TyAiUENJOiBIaWRpbmcgNHh4IGhvc3QgYnJpZGdlIHJlc291cmNlcyAlc1xuIiwKZGlmZiAtLWdp dCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jIGIvYXJjaC9wb3dl cnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKaW5kZXggODU5ZTI4MThjNDNkLi5lYTcy ZWY0ZmM2M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4 X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jCkBA IC0zMjcsMTQgKzMyNywxMyBAQCBtcGM1Mnh4X3BjaV9zZXR1cChzdHJ1Y3QgcGNpX2NvbnRyb2xs ZXIgKmhvc2UsCiBzdGF0aWMgdm9pZAogbXBjNTJ4eF9wY2lfZml4dXBfcmVzb3VyY2VzKHN0cnVj dCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlw cl9kZWJ1ZygiJXMoKSAlLjR4OiUuNHhcbiIsIF9fZnVuY19fLCBkZXYtPnZlbmRvciwgZGV2LT5k ZXZpY2UpOwogCiAJLyogV2UgZG9uJ3QgcmVseSBvbiBib290IGxvYWRlciBmb3IgUENJIGFuZCBy ZXNldHMgYWxsCiAJICAgZGV2aWNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRf UkVTT1VSQ0U7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZkZXYtPnJlc291cmNl W2ldOworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHJlcykgewogCQlpZiAocmVz LT5lbmQgPiByZXMtPnN0YXJ0KSB7CS8qIE9ubHkgdmFsaWQgcmVzb3VyY2VzICovCiAJCQlyZXMt PmVuZCAtPSByZXMtPnN0YXJ0OwogCQkJcmVzLT5zdGFydCA9IDA7CmRpZmYgLS1naXQgYS9hcmNo L3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1z L3BzZXJpZXMvcGNpLmMKaW5kZXggNjBlMGE1ODkyOGVmLi5lZTdiMmM3MzdjOTIgMTAwNjQ0Ci0t LSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2Vy cGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKQEAgLTI0MCw3ICsyNDAsNyBAQCB2b2lkIF9faW5p dCBwU2VyaWVzX2ZpbmFsX2ZpeHVwKHZvaWQpCiAgKi8KIHN0YXRpYyB2b2lkIGZpeHVwX3dpbmJv bmRfODJjMTA1KHN0cnVjdCBwY2lfZGV2KiBkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJlc291 cmNlICpyOwogCXVuc2lnbmVkIGludCByZWc7CiAKIAlpZiAoIW1hY2hpbmVfaXMocHNlcmllcykp CkBAIC0yNTEsMTQgKzI1MSwxNCBAQCBzdGF0aWMgdm9pZCBmaXh1cF93aW5ib25kXzgyYzEwNShz dHJ1Y3QgcGNpX2RldiogZGV2KQogCS8qIEVuYWJsZSBMRUdJUlEgdG8gdXNlIElOVEMgaW5zdGVh ZCBvZiBJU0EgaW50ZXJydXB0cyAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQw LCByZWcgfCAoMTw8MTEpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VS Q0U7ICsraSkgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsKIAkJLyog emFwIHRoZSAybmQgZnVuY3Rpb24gb2YgdGhlIHdpbmJvbmQgY2hpcCAqLwotCQlpZiAoZGV2LT5y ZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfSU8KLQkJICAgICYmIGRldi0+YnVzLT5udW1i ZXIgPT0gMCAmJiBkZXYtPmRldmZuID09IDB4ODEpCi0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdz ICY9IH5JT1JFU09VUkNFX0lPOwotCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9PSAwICYm IGRldi0+cmVzb3VyY2VbaV0uZW5kKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsK LQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kID0gMDsKKwkJaWYgKGRldi0+YnVzLT5udW1iZXIgPT0g MCAmJiBkZXYtPmRldmZuID09IDB4ODEgJiYKKwkJICAgIHItPmZsYWdzICYgSU9SRVNPVVJDRV9J TykKKwkJCXItPmZsYWdzICY9IH5JT1JFU09VUkNFX0lPOworCQlpZiAoci0+c3RhcnQgPT0gMCAm JiByLT5lbmQpIHsKKwkJCXItPmZsYWdzID0gMDsKKwkJCXItPmVuZCA9IDA7CiAJCX0KIAl9CiB9 CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMgYi9hcmNoL3No L2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKaW5kZXggYjBjMmE1MjM4ZDA0Li45ODJmOWFlYzJm MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYworKysgYi9h cmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKQEAgLTE0MCwxMiArMTQwLDEyIEBAIHN0 YXRpYyB2b2lkIHNoNzc4Nl9wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIAkgKiBQcmV2 ZW50IGVudW1lcmF0aW9uIG9mIHJvb3QgY29tcGxleCByZXNvdXJjZXMuCiAJICovCiAJaWYgKHBj aV9pc19yb290X2J1cyhkZXYtPmJ1cykgJiYgZGV2LT5kZXZmbiA9PSAwKSB7Ci0JCWludCBpOwor CQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9S RVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0CT0gMDsKLQkJCWRldi0+ cmVzb3VyY2VbaV0uZW5kCT0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MJPSAwOworCQlw Y2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CisJCQlyLT5zdGFydAk9IDA7CisJ CQlyLT5lbmQJCT0gMDsKKwkJCXItPmZsYWdzCT0gMDsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBh L2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3Bj aS5jCmluZGV4IGU1ZTVmZjZiOWE1Yy4uYjY2NjNhM2ZiYWU5IDEwMDY0NAotLS0gYS9hcmNoL3Nw YXJjL2tlcm5lbC9sZW9uX3BjaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMK QEAgLTYyLDE1ICs2MiwxNCBAQCB2b2lkIGxlb25fcGNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqb2ZkZXYsIHN0cnVjdCBsZW9uX3BjaV9pbmZvICppbmZvKQogCiBpbnQgcGNpYmlvc19l bmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogeworCXN0cnVjdCBy ZXNvdXJjZSAqcmVzOwogCXUxNiBjbWQsIG9sZGNtZDsKIAlpbnQgaTsKIAogCXBjaV9yZWFkX2Nv bmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZGNtZCA9IGNtZDsKIAotCWZv ciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJj ZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNl KGRldiwgcmVzLCBpKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYgKi8K IAkJaWYgKCEobWFzayAmICgxPDxpKSkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2FyY2gv c3BhcmMva2VybmVsL3BjaS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKaW5kZXggY2IxZWYy NTExNmU5Li5hOTQ4YTQ5ODE3YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaS5j CisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCkBAIC02NjMsMTEgKzY2MywxMCBAQCBzdGF0 aWMgdm9pZCBwY2lfY2xhaW1fYnVzX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogCXN0 cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2 aWNlcywgYnVzX2xpc3QpIHsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCQlpbnQgaTsKIAotCQlm b3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgewotCQkJc3RydWN0IHJlc291 cmNlICpyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJj ZShkZXYsIHIsIGkpIHsKIAkJCWlmIChyLT5wYXJlbnQgfHwgIXItPnN0YXJ0IHx8ICFyLT5mbGFn cykKIAkJCQljb250aW51ZTsKIApAQCAtNzI0LDE1ICs3MjMsMTQgQEAgc3RydWN0IHBjaV9idXMg KnBjaV9zY2FuX29uZV9wYm0oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCiBpbnQgcGNpYmlv c19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogeworCXN0cnVj dCByZXNvdXJjZSAqcmVzOwogCXUxNiBjbWQsIG9sZGNtZDsKIAlpbnQgaTsKIAogCXBjaV9yZWFk X2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZGNtZCA9IGNtZDsKIAot CWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNv dXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291 cmNlKGRldiwgcmVzLCBpKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYg Ki8KIAkJaWYgKCEobWFzayAmICgxPDxpKSkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2Fy Y2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCBl ZTRjOWE5YTE3MWMuLjI1ZmUwYTA2MTczMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwv cGNpYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwpAQCAtNjQzLDE1ICs2NDMsMTQg QEAgdm9pZCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogCiBpbnQgcGNp Ymlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogeworCXN0 cnVjdCByZXNvdXJjZSAqcmVzOwogCXUxNiBjbWQsIG9sZGNtZDsKIAlpbnQgaTsKIAogCXBjaV9y ZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZGNtZCA9IGNtZDsK IAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCBy ZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jl c291cmNlKGRldiwgcmVzLCBpKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1 ZmYgKi8KIAkJaWYgKCEobWFzayAmICgxPDxpKSkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGNpL3JlbW92ZS5jIGIvZHJpdmVycy9wY2kvcmVtb3ZlLmMKaW5kZXggMDE0NWFl ZjFiOTMwLi4xMzEwZTAxZmI1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JlbW92ZS5jCisr KyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCkBAIC01LDEwICs1LDkgQEAKIAogc3RhdGljIHZvaWQg cGNpX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGk7CisJc3Ry dWN0IHJlc291cmNlICpyZXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7 IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2UgKyBpOworCXBj aV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHJlcykgewogCQlpZiAocmVzLT5wYXJlbnQp CiAJCQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kv c2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjNjkwNTcyYjEwY2Uu LmQ0ZmM3NjY1ZjcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIv ZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTEyNCwyMCArMTI0LDE3IEBAIHN0YXRpYyByZXNv dXJjZV9zaXplX3QgZ2V0X3Jlc19hZGRfYWxpZ24oc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKIAly ZXR1cm4gZGV2X3JlcyA/IGRldl9yZXMtPm1pbl9hbGlnbiA6IDA7CiB9CiAKLQogLyogU29ydCBy ZXNvdXJjZXMgYnkgYWxpZ25tZW50ICovCiBzdGF0aWMgdm9pZCBwZGV2X3NvcnRfcmVzb3VyY2Vz KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CisJc3RydWN0 IHJlc291cmNlICpyOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VS Q0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyOworCXBjaV9kZXZfZm9yX2VhY2hfcmVz b3VyY2UoZGV2LCByLCBpKSB7CiAJCXN0cnVjdCBwY2lfZGV2X3Jlc291cmNlICpkZXZfcmVzLCAq dG1wOwogCQlyZXNvdXJjZV9zaXplX3Qgcl9hbGlnbjsKIAkJc3RydWN0IGxpc3RfaGVhZCAqbjsK IAotCQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KIAkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJD RV9QQ0lfRklYRUQpCiAJCQljb250aW51ZTsKIApAQCAtODk1LDEwICs4OTIsOSBAQCBzdGF0aWMg dm9pZCBwYnVzX3NpemVfaW8oc3RydWN0IHBjaV9idXMgKmJ1cywgcmVzb3VyY2Vfc2l6ZV90IG1p bl9zaXplLAogCiAJbWluX2FsaWduID0gd2luZG93X2FsaWdubWVudChidXMsIElPUkVTT1VSQ0Vf SU8pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkg ewotCQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCi0JCWZvciAoaSA9IDA7IGkgPCBQ Q0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5y ZXNvdXJjZVtpXTsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZV9wKGRldiwgcikgewogCQkJ dW5zaWduZWQgbG9uZyByX3NpemU7CiAKIAkJCWlmIChyLT5wYXJlbnQgfHwgIShyLT5mbGFncyAm IElPUkVTT1VSQ0VfSU8pKQpAQCAtMTAxNCwxMCArMTAxMCwxMCBAQCBzdGF0aWMgaW50IHBidXNf c2l6ZV9tZW0oc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgbG9uZyBtYXNrLAogCXNpemUg PSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0 KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8 IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYt PnJlc291cmNlW2ldOworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgciwgaSkgewog CQkJcmVzb3VyY2Vfc2l6ZV90IHJfc2l6ZTsKIAogCQkJaWYgKHItPnBhcmVudCB8fCAoci0+Zmxh Z3MgJiBJT1JFU09VUkNFX1BDSV9GSVhFRCkgfHwKQEAgLTEzNTgsMTEgKzEzNTQsMTAgQEAgc3Rh dGljIHZvaWQgYXNzaWduX2ZpeGVkX3Jlc291cmNlX29uX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYiwg c3RydWN0IHJlc291cmNlICpyKQogICovCiBzdGF0aWMgdm9pZCBwZGV2X2Fzc2lnbl9maXhlZF9y ZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3Vy Y2UgKnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgIFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwlw Y2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CiAJCXN0cnVjdCBwY2lfYnVzICpi OwotCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKIAogCQlpZiAoci0+ cGFyZW50IHx8ICEoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BDSV9GSVhFRCkgfHwKIAkJICAgICEo ci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkpCkBAIC0xNzk1LDEx ICsxNzkwLDkgQEAgc3RhdGljIHZvaWQgcmVtb3ZlX2Rldl9yZXNvdXJjZXMoc3RydWN0IHBjaV9k ZXYgKmRldiwgc3RydWN0IHJlc291cmNlICppbywKIAkJCQkgc3RydWN0IHJlc291cmNlICptbWlv LAogCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKm1taW9fcHJlZikKIHsKLQlpbnQgaTsKLQotCWZvciAo aSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAq cmVzID0gJmRldi0+cmVzb3VyY2VbaV07CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAKKwlwY2lf ZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByZXMpIHsKIAkJaWYgKHJlc291cmNlX3R5cGUo cmVzKSA9PSBJT1JFU09VUkNFX0lPKSB7CiAJCQlyZW1vdmVfZGV2X3Jlc291cmNlKGlvLCBkZXYs IHJlcyk7CiAJCX0gZWxzZSBpZiAocmVzb3VyY2VfdHlwZShyZXMpID09IElPUkVTT1VSQ0VfTUVN KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3Nl dHVwLXJlcy5jCmluZGV4IGI0OTJlNjdjM2Q4Ny4uOTY3ZjlhNzU4OTIzIDEwMDY0NAotLS0gYS9k cml2ZXJzL3BjaS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAt NDg0LDEyICs0ODQsMTAgQEAgaW50IHBjaV9lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2 ICpkZXYsIGludCBtYXNrKQogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQs ICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNP VVJDRVM7IGkrKykgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJ CWlmICghKG1hc2sgJiAoMSA8PCBpKSkpCiAJCQljb250aW51ZTsKIAotCQlyID0gJmRldi0+cmVz b3VyY2VbaV07Ci0KIAkJaWYgKCEoci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VS Q0VfTUVNKSkpCiAJCQljb250aW51ZTsKIAkJaWYgKChpID09IFBDSV9ST01fUkVTT1VSQ0UpICYm CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS92Z2FhcmIuYyBiL2RyaXZlcnMvcGNpL3ZnYWFyYi5j CmluZGV4IGY4MGI2ZWM4OGRjMy4uM2VjNmEwYjdkYmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bj aS92Z2FhcmIuYworKysgYi9kcml2ZXJzL3BjaS92Z2FhcmIuYwpAQCAtNTQ4LDEwICs1NDgsOCBA QCBzdGF0aWMgYm9vbCB2Z2FfaXNfZmlybXdhcmVfZGVmYXVsdChzdHJ1Y3QgcGNpX2RldiAqcGRl dikKICNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCiAJdTY0 IGJhc2UgPSBzY3JlZW5faW5mby5sZmJfYmFzZTsKIAl1NjQgc2l6ZSA9IHNjcmVlbl9pbmZvLmxm Yl9zaXplOworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1NjQgbGltaXQ7Ci0JcmVzb3VyY2Vfc2l6 ZV90IHN0YXJ0LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKIAogCS8qIFNl bGVjdCB0aGUgZGV2aWNlIG93bmluZyB0aGUgYm9vdCBmcmFtZWJ1ZmZlciBpZiB0aGVyZSBpcyBv bmUgKi8KIApAQCAtNTYxLDE5ICs1NTksMTQgQEAgc3RhdGljIGJvb2wgdmdhX2lzX2Zpcm13YXJl X2RlZmF1bHQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiAJbGltaXQgPSBiYXNlICsgc2l6ZTsKIAog CS8qIERvZXMgZmlybXdhcmUgZnJhbWVidWZmZXIgYmVsb25nIHRvIHVzPyAqLwotCWZvciAoaSA9 IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlmbGFncyA9IHBjaV9yZXNv dXJjZV9mbGFncyhwZGV2LCBpKTsKLQotCQlpZiAoKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09 IDApCisJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZV9wKHBkZXYsIHIpIHsKKwkJaWYgKHJlc291 cmNlX3R5cGUocikgIT0gSU9SRVNPVVJDRV9NRU0pCiAJCQljb250aW51ZTsKIAotCQlzdGFydCA9 IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKTsKLQkJZW5kICA9IHBjaV9yZXNvdXJjZV9lbmQo cGRldiwgaSk7Ci0KLQkJaWYgKCFzdGFydCB8fCAhZW5kKQorCQlpZiAoIXItPnN0YXJ0IHx8ICFy LT5lbmQpCiAJCQljb250aW51ZTsKIAotCQlpZiAoYmFzZSA8IHN0YXJ0IHx8IGxpbWl0ID49IGVu ZCkKKwkJaWYgKGJhc2UgPCByLT5zdGFydCB8fCBsaW1pdCA+PSByLT5lbmQpCiAJCQljb250aW51 ZTsKIAogCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3hlbi1wY2lmcm9u dC5jIGIvZHJpdmVycy9wY2kveGVuLXBjaWZyb250LmMKaW5kZXggZmNkMDI5Y2EyZWIxLi44M2Mw YWI1MDY3NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3hlbi1wY2lmcm9udC5jCisrKyBiL2Ry aXZlcnMvcGNpL3hlbi1wY2lmcm9udC5jCkBAIC0zOTAsOSArMzkwLDcgQEAgc3RhdGljIGludCBw Y2lmcm9udF9jbGFpbV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICpkYXRhKQog CWludCBpOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVN X1JFU09VUkNFUzsgaSsrKSB7Ci0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZf Zm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCWlmICghci0+cGFyZW50ICYmIHItPnN0 YXJ0ICYmIHItPmZsYWdzKSB7CiAJCQlkZXZfaW5mbygmcGRldi0+eGRldi0+ZGV2LCAiY2xhaW1p bmcgcmVzb3VyY2UgJXMvJWRcbiIsCiAJCQkJcGNpX25hbWUoZGV2KSwgaSk7CmRpZmYgLS1naXQg YS9kcml2ZXJzL3BucC9xdWlya3MuYyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCmluZGV4IGFjOThi OTkxOTAyOS4uNjA4NWExNDcxZGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9xdWlya3MuYwor KysgYi9kcml2ZXJzL3BucC9xdWlya3MuYwpAQCAtMjI5LDggKzIyOSw3IEBAIHN0YXRpYyB2b2lk IHF1aXJrX2FkMTgxNV9tcHVfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiBzdGF0aWMg dm9pZCBxdWlya19zeXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewog CXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQly ZXNvdXJjZV9zaXplX3QgcG5wX3N0YXJ0LCBwbnBfZW5kLCBwY2lfc3RhcnQsIHBjaV9lbmQ7CisJ c3RydWN0IHJlc291cmNlICpyZXMsICpyOwogCWludCBpLCBqOwogCiAJLyoKQEAgLTI0MywzMiAr MjQyLDI2IEBAIHN0YXRpYyB2b2lkIHF1aXJrX3N5c3RlbV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBw bnBfZGV2ICpkZXYpCiAJICogc28gdGhleSB3b24ndCBiZSBjbGFpbWVkIGJ5IHRoZSBQTlAgc3lz dGVtIGRyaXZlci4KIAkgKi8KIAlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0g MDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGZs YWdzLCB0eXBlOworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKHBkZXYsIHIsIGkpIHsKKwkJ CXVuc2lnbmVkIGxvbmcgdHlwZSA9IHJlc291cmNlX3R5cGUocik7CiAKLQkJCWZsYWdzID0gcGNp X3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpOwotCQkJdHlwZSA9IGZsYWdzICYgKElPUkVTT1VSQ0Vf SU8gfCBJT1JFU09VUkNFX01FTSk7Ci0JCQlpZiAoIXR5cGUgfHwgcGNpX3Jlc291cmNlX2xlbihw ZGV2LCBpKSA9PSAwKQorCQkJaWYgKCEodHlwZSA9PSBJT1JFU09VUkNFX0lPIHx8IHR5cGUgPT0g SU9SRVNPVVJDRV9NRU0pIHx8CisJCQkgICAgcmVzb3VyY2Vfc2l6ZShyKSA9PSAwKQogCQkJCWNv bnRpbnVlOwogCi0JCQlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKQorCQkJaWYgKHItPmZs YWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKIAkJCQljb250aW51ZTsKIAotCQkJcGNpX3N0YXJ0ID0g cGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOwotCQkJcGNpX2VuZCA9IHBjaV9yZXNvdXJjZV9l bmQocGRldiwgaSk7CiAJCQlmb3IgKGogPSAwOwogCQkJICAgICAocmVzID0gcG5wX2dldF9yZXNv dXJjZShkZXYsIHR5cGUsIGopKTsgaisrKSB7CiAJCQkJaWYgKHJlcy0+c3RhcnQgPT0gMCAmJiBy ZXMtPmVuZCA9PSAwKQogCQkJCQljb250aW51ZTsKIAotCQkJCXBucF9zdGFydCA9IHJlcy0+c3Rh cnQ7Ci0JCQkJcG5wX2VuZCA9IHJlcy0+ZW5kOwotCiAJCQkJLyoKIAkJCQkgKiBJZiB0aGUgUE5Q IHJlZ2lvbiBkb2Vzbid0IG92ZXJsYXAgdGhlIFBDSQogCQkJCSAqIHJlZ2lvbiBhdCBhbGwsIHRo ZXJlJ3Mgbm8gcHJvYmxlbS4KIAkJCQkgKi8KLQkJCQlpZiAocG5wX2VuZCA8IHBjaV9zdGFydCB8 fCBwbnBfc3RhcnQgPiBwY2lfZW5kKQorCQkJCWlmICghcmVzb3VyY2Vfb3ZlcmxhcHMocmVzLCBy KSkKIAkJCQkJY29udGludWU7CiAKIAkJCQkvKgpAQCAtMjc4LDggKzI3MSw3IEBAIHN0YXRpYyB2 b2lkIHF1aXJrX3N5c3RlbV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiAJCQkJ ICogUE5QIGRldmljZSBkZXNjcmliZXMgYSBicmlkZ2Ugd2l0aCBQQ0kKIAkJCQkgKiBiZWhpbmQg aXQuCiAJCQkJICovCi0JCQkJaWYgKHBucF9zdGFydCA8PSBwY2lfc3RhcnQgJiYKLQkJCQkgICAg cG5wX2VuZCA+PSBwY2lfZW5kKQorCQkJCWlmIChyZXMtPnN0YXJ0IDw9IHItPnN0YXJ0ICYmIHJl cy0+ZW5kID49IHItPmVuZCkKIAkJCQkJY29udGludWU7CiAKIAkJCQkvKgpAQCAtMjg4LDkgKzI4 MCw4IEBAIHN0YXRpYyB2b2lkIHF1aXJrX3N5c3RlbV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBwbnBf ZGV2ICpkZXYpCiAJCQkJICogZHJpdmVyIGZyb20gcmVxdWVzdGluZyBpdHMgcmVzb3VyY2VzLgog CQkJCSAqLwogCQkJCWRldl93YXJuKCZkZXYtPmRldiwKLQkJCQkJICJkaXNhYmxpbmcgJXBSIGJl Y2F1c2UgaXQgb3ZlcmxhcHMgIgotCQkJCQkgIiVzIEJBUiAlZCAlcFJcbiIsIHJlcywKLQkJCQkJ IHBjaV9uYW1lKHBkZXYpLCBpLCAmcGRldi0+cmVzb3VyY2VbaV0pOworCQkJCQkgImRpc2FibGlu ZyAlcFIgYmVjYXVzZSBpdCBvdmVybGFwcyAlcyBCQVIgJWQgJXBSXG4iLAorCQkJCQkgcmVzLCBw Y2lfbmFtZShwZGV2KSwgaSwgcik7CiAJCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0RJU0FC TEVEOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVk ZS9saW51eC9wY2kuaAppbmRleCBiNTBlNWM3OWY3ZTMuLmE5N2YwMjZhZmFlZCAxMDA2NDQKLS0t IGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0xOTk1 LDE0ICsxOTk1LDI1IEBAIGludCBwY2lfaW9iYXJfcGZuKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBp bnQgYmFyLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAgKiBUaGVzZSBoZWxwZXJzIHBy b3ZpZGUgZnV0dXJlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICogZm9yIGFjY2Vzc2lu ZyBwb3B1bGFyIFBDSSBCQVIgaW5mbwogICovCisjZGVmaW5lIHBjaV9yZXNvdXJjZV9uKGRldiwg YmFyKQkoJihkZXYpLT5yZXNvdXJjZVsoYmFyKV0pCiAjZGVmaW5lIHBjaV9yZXNvdXJjZV9zdGFy dChkZXYsIGJhcikJKChkZXYpLT5yZXNvdXJjZVsoYmFyKV0uc3RhcnQpCiAjZGVmaW5lIHBjaV9y ZXNvdXJjZV9lbmQoZGV2LCBiYXIpCSgoZGV2KS0+cmVzb3VyY2VbKGJhcildLmVuZCkKICNkZWZp bmUgcGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgYmFyKQkoKGRldiktPnJlc291cmNlWyhiYXIpXS5m bGFncykKICNkZWZpbmUgcGNpX3Jlc291cmNlX2xlbihkZXYsYmFyKSBcCiAJKChwY2lfcmVzb3Vy Y2VfZW5kKChkZXYpLCAoYmFyKSkgPT0gMCkgPyAwIDoJXAogCQkJCQkJCVwKLQkgKHBjaV9yZXNv dXJjZV9lbmQoKGRldiksIChiYXIpKSAtCQlcCi0JICBwY2lfcmVzb3VyY2Vfc3RhcnQoKGRldiks IChiYXIpKSArIDEpKQorCSByZXNvdXJjZV9zaXplKHBjaV9yZXNvdXJjZV9uKChkZXYpLCAoYmFy KSkpKQorCisjZGVmaW5lIF9fcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHJlcywgX19p LCB2YXJ0eXBlKQkJXAorCWZvciAodmFydHlwZSBfX2kgPSAwOwkJCQkJCVwKKwkgICAgIHJlcyA9 IHBjaV9yZXNvdXJjZV9uKGRldiwgX19pKSwgX19pIDwgUENJX05VTV9SRVNPVVJDRVM7CVwKKwkg ICAgIF9faSsrKQorCisjZGVmaW5lIHBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByZXMs IGkpCQkJCVwKKyAgICAgICBfX3BjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByZXMsIGks ICkKKworI2RlZmluZSBwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByZXMpCQkJCVwK KwlfX3BjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByZXMsIF9faSwgdW5zaWduZWQgaW50 KQogCiAvKgogICogU2ltaWxhciB0byB0aGUgaGVscGVycyBhYm92ZSwgdGhlc2UgbWFuaXB1bGF0 ZSBwZXItcGNpX2RldgotLSAKMi4zOS4yCgo= 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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 219F2C77B62 for ; Mon, 20 Mar 2023 13:16:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231666AbjCTNQQ (ORCPT ); Mon, 20 Mar 2023 09:16:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40490 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231640AbjCTNQN (ORCPT ); Mon, 20 Mar 2023 09:16:13 -0400 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7055119F17; Mon, 20 Mar 2023 06:16:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679318170; x=1710854170; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=03KpgEWjTRIOrghUDlJ37yTkg0WA7G7gXnWuRYLhmBU=; b=FPbgs8bn19Luqxz+LhamuJC+ZX6wAWnZBxVMVLXxBvgJpMRcwRb3NI39 O8bQewYdMwrO9Sw3//U4+GYVu7dMdNXvnIastOTu+Icm1mK/7EnjMzFob K0c5wzvioO4U4G6zOjU00ARvaLnefKkZv39j8qASYOHXM7xn+jwhHs22k 9wWohoelspkxfA/eEjsLmAEUGEp6FBzoukux4Aw2ewVXOgzcLcmTKjUl7 wnQb/Gvt1H3MC663WBaPJD6Q8hjeZ28akHm6U+tNsR6HZDGLLFedzKgj/ 6j7LrLZ7C4/V8J0Nk+TqJb/C+58sbQtlFodsx7flyeI5TsO3MTex00wl5 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="341015324" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="341015324" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Mar 2023 06:16:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="824468999" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="824468999" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga001.fm.intel.com with ESMTP; 20 Mar 2023 06:15:58 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id F13BA3DD; Mon, 20 Mar 2023 15:16:43 +0200 (EET) From: Andy Shevchenko To: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Andy Shevchenko , Mika Westerberg , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Michael Ellerman , Randy Dunlap , Arnd Bergmann , Niklas Schnelle , Bjorn Helgaas , "Rafael J. Wysocki" , =?UTF-8?q?Pali=20Roh=C3=A1r?= , "Maciej W. Rozycki" , Juergen Gross , Dominik Brodowski , linux-kernel@vger.kernel.org, linux-alpha@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-pci@vger.kernel.org, xen-devel@lists.xenproject.org, linux-acpi@vger.kernel.org Cc: Miguel Ojeda , Richard Henderson , Ivan Kokshaysky , Matt Turner , Russell King , Andrew Lunn , Sebastian Hesselbarth , Gregory Clement , Thomas Bogendoerfer , Nicholas Piggin , Christophe Leroy , Anatolij Gustschin , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Bjorn Helgaas , Stefano Stabellini , Oleksandr Tyshchenko Subject: [PATCH v6 1/4] PCI: Introduce pci_dev_for_each_resource() Date: Mon, 20 Mar 2023 15:16:30 +0200 Message-Id: <20230320131633.61680-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> References: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org From: Mika Westerberg Instead of open-coding it everywhere introduce a tiny helper that can be used to iterate over each resource of a PCI device, and convert the most obvious users into it. While at it drop doubled empty line before pdev_sort_resources(). No functional changes intended. Suggested-by: Andy Shevchenko Signed-off-by: Mika Westerberg Signed-off-by: Andy Shevchenko Reviewed-by: Krzysztof Wilczyński --- .clang-format | 2 ++ arch/alpha/kernel/pci.c | 5 ++-- arch/arm/kernel/bios32.c | 16 ++++++------- arch/arm/mach-dove/pcie.c | 10 ++++---- arch/arm/mach-mv78xx0/pcie.c | 10 ++++---- arch/arm/mach-orion5x/pci.c | 10 ++++---- arch/mips/pci/ops-bcm63xx.c | 8 +++---- arch/mips/pci/pci-legacy.c | 3 +-- arch/powerpc/kernel/pci-common.c | 21 ++++++++-------- arch/powerpc/platforms/4xx/pci.c | 8 +++---- arch/powerpc/platforms/52xx/mpc52xx_pci.c | 5 ++-- arch/powerpc/platforms/pseries/pci.c | 16 ++++++------- arch/sh/drivers/pci/pcie-sh7786.c | 10 ++++---- arch/sparc/kernel/leon_pci.c | 5 ++-- arch/sparc/kernel/pci.c | 10 ++++---- arch/sparc/kernel/pcic.c | 5 ++-- drivers/pci/remove.c | 5 ++-- drivers/pci/setup-bus.c | 27 ++++++++------------- drivers/pci/setup-res.c | 4 +--- drivers/pci/vgaarb.c | 17 ++++--------- drivers/pci/xen-pcifront.c | 4 +--- drivers/pnp/quirks.c | 29 ++++++++--------------- include/linux/pci.h | 15 ++++++++++-- 23 files changed, 111 insertions(+), 134 deletions(-) diff --git a/.clang-format b/.clang-format index d988e9fa9b26..266abb843654 100644 --- a/.clang-format +++ b/.clang-format @@ -520,6 +520,8 @@ ForEachMacros: - 'of_property_for_each_string' - 'of_property_for_each_u32' - 'pci_bus_for_each_resource' + - 'pci_dev_for_each_resource' + - 'pci_dev_for_each_resource_p' - 'pci_doe_for_each_off' - 'pcl_for_each_chunk' - 'pcl_for_each_segment' diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 64fbfb0763b2..4458eb7f44f0 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c @@ -288,11 +288,10 @@ pcibios_claim_one_bus(struct pci_bus *b) struct pci_bus *child_bus; list_for_each_entry(dev, &b->devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (r->parent || !r->start || !r->flags) continue; if (pci_has_flag(PCI_PROBE_ONLY) || diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index e7ef2b5bea9c..5254734b23e6 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -142,15 +142,15 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940F, */ static void pci_fixup_dec21285(struct pci_dev *dev) { - int i; - if (dev->devfn == 0) { + struct resource *r; + dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } @@ -162,13 +162,11 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, pci_fixup_d static void pci_fixup_ide_bases(struct pci_dev *dev) { struct resource *r; - int i; if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) return; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - r = dev->resource + i; + pci_dev_for_each_resource_p(dev, r) { if ((r->start & ~0x80) == 0x374) { r->start |= 2; r->end = r->start; diff --git a/arch/arm/mach-dove/pcie.c b/arch/arm/mach-dove/pcie.c index 754ca381f600..58cecd79a204 100644 --- a/arch/arm/mach-dove/pcie.c +++ b/arch/arm/mach-dove/pcie.c @@ -142,14 +142,14 @@ static struct pci_ops pcie_ops = { static void rc_pci_fixup(struct pci_dev *dev) { if (dev->bus->parent == NULL && dev->devfn == 0) { - int i; + struct resource *r; dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index 6190f538a124..f59f02150a36 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c @@ -186,14 +186,14 @@ static struct pci_ops pcie_ops = { static void rc_pci_fixup(struct pci_dev *dev) { if (dev->bus->parent == NULL && dev->devfn == 0) { - int i; + struct resource *r; dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index 888fdc9099c5..0933b47b601a 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c @@ -522,14 +522,14 @@ static int __init pci_setup(struct pci_sys_data *sys) static void rc_pci_fixup(struct pci_dev *dev) { if (dev->bus->parent == NULL && dev->devfn == 0) { - int i; + struct resource *r; dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/mips/pci/ops-bcm63xx.c b/arch/mips/pci/ops-bcm63xx.c index dc6dc2741272..c0efcbf3c63f 100644 --- a/arch/mips/pci/ops-bcm63xx.c +++ b/arch/mips/pci/ops-bcm63xx.c @@ -413,18 +413,18 @@ struct pci_ops bcm63xx_cb_ops = { static void bcm63xx_fixup(struct pci_dev *dev) { static int io_window = -1; - int i, found, new_io_window; + int found, new_io_window; + struct resource *r; u32 val; /* look for any io resource */ found = 0; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - if (pci_resource_flags(dev, i) & IORESOURCE_IO) { + pci_dev_for_each_resource_p(dev, r) { + if (resource_type(r) == IORESOURCE_IO) { found = 1; break; } } - if (!found) return; diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c index 468722c8a5c6..ec2567f8efd8 100644 --- a/arch/mips/pci/pci-legacy.c +++ b/arch/mips/pci/pci-legacy.c @@ -249,12 +249,11 @@ static int pcibios_enable_resources(struct pci_dev *dev, int mask) pci_read_config_word(dev, PCI_COMMAND, &cmd); old_cmd = cmd; - for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) { + pci_dev_for_each_resource(dev, r, idx) { /* Only set up the requested stuff */ if (!(mask & (1<resource[idx]; if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) continue; if ((idx == PCI_ROM_RESOURCE) && diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index d67cf79bf5d0..1908a46cad54 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -880,6 +880,7 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) static void pcibios_fixup_resources(struct pci_dev *dev) { struct pci_controller *hose = pci_bus_to_host(dev->bus); + struct resource *res; int i; if (!hose) { @@ -891,9 +892,9 @@ static void pcibios_fixup_resources(struct pci_dev *dev) if (dev->is_virtfn) return; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - struct resource *res = dev->resource + i; + pci_dev_for_each_resource(dev, res, i) { struct pci_bus_region reg; + if (!res->flags) continue; @@ -1452,11 +1453,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus) struct pci_bus *child_bus; list_for_each_entry(dev, &bus->devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (r->parent || !r->start || !r->flags) continue; @@ -1705,19 +1705,20 @@ EXPORT_SYMBOL_GPL(pcibios_scan_phb); static void fixup_hide_host_resource_fsl(struct pci_dev *dev) { - int i, class = dev->class >> 8; + int class = dev->class >> 8; /* When configured as agent, programming interface = 1 */ int prog_if = dev->class & 0xf; + struct resource *r; if ((class == PCI_CLASS_PROCESSOR_POWERPC || class == PCI_CLASS_BRIDGE_OTHER) && (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) && (prog_if == 0) && (dev->bus->parent == NULL)) { - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c index ca5dd7a5842a..9d19123c0da8 100644 --- a/arch/powerpc/platforms/4xx/pci.c +++ b/arch/powerpc/platforms/4xx/pci.c @@ -57,7 +57,7 @@ static inline int ppc440spe_revA(void) static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev) { struct pci_controller *hose; - int i; + struct resource *r; if (dev->devfn != 0 || dev->bus->self != NULL) return; @@ -79,9 +79,9 @@ static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev) /* Hide the PCI host BARs from the kernel as their content doesn't * fit well in the resource management */ - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = r->end = 0; + r->flags = 0; } printk(KERN_INFO "PCI: Hiding 4xx host bridge resources %s\n", diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pci.c b/arch/powerpc/platforms/52xx/mpc52xx_pci.c index 859e2818c43d..ea72ef4fc63b 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_pci.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_pci.c @@ -327,14 +327,13 @@ mpc52xx_pci_setup(struct pci_controller *hose, static void mpc52xx_pci_fixup_resources(struct pci_dev *dev) { - int i; + struct resource *res; pr_debug("%s() %.4x:%.4x\n", __func__, dev->vendor, dev->device); /* We don't rely on boot loader for PCI and resets all devices */ - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - struct resource *res = &dev->resource[i]; + pci_dev_for_each_resource_p(dev, res) { if (res->end > res->start) { /* Only valid resources */ res->end -= res->start; res->start = 0; diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c index 60e0a58928ef..ee7b2c737c92 100644 --- a/arch/powerpc/platforms/pseries/pci.c +++ b/arch/powerpc/platforms/pseries/pci.c @@ -240,7 +240,7 @@ void __init pSeries_final_fixup(void) */ static void fixup_winbond_82c105(struct pci_dev* dev) { - int i; + struct resource *r; unsigned int reg; if (!machine_is(pseries)) @@ -251,14 +251,14 @@ static void fixup_winbond_82c105(struct pci_dev* dev) /* Enable LEGIRQ to use INTC instead of ISA interrupts */ pci_write_config_dword(dev, 0x40, reg | (1<<11)); - for (i = 0; i < DEVICE_COUNT_RESOURCE; ++i) { + pci_dev_for_each_resource_p(dev, r) { /* zap the 2nd function of the winbond chip */ - if (dev->resource[i].flags & IORESOURCE_IO - && dev->bus->number == 0 && dev->devfn == 0x81) - dev->resource[i].flags &= ~IORESOURCE_IO; - if (dev->resource[i].start == 0 && dev->resource[i].end) { - dev->resource[i].flags = 0; - dev->resource[i].end = 0; + if (dev->bus->number == 0 && dev->devfn == 0x81 && + r->flags & IORESOURCE_IO) + r->flags &= ~IORESOURCE_IO; + if (r->start == 0 && r->end) { + r->flags = 0; + r->end = 0; } } } diff --git a/arch/sh/drivers/pci/pcie-sh7786.c b/arch/sh/drivers/pci/pcie-sh7786.c index b0c2a5238d04..982f9aec2f2f 100644 --- a/arch/sh/drivers/pci/pcie-sh7786.c +++ b/arch/sh/drivers/pci/pcie-sh7786.c @@ -140,12 +140,12 @@ static void sh7786_pci_fixup(struct pci_dev *dev) * Prevent enumeration of root complex resources. */ if (pci_is_root_bus(dev->bus) && dev->devfn == 0) { - int i; + struct resource *r; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c index e5e5ff6b9a5c..b6663a3fbae9 100644 --- a/arch/sparc/kernel/leon_pci.c +++ b/arch/sparc/kernel/leon_pci.c @@ -62,15 +62,14 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) int pcibios_enable_device(struct pci_dev *dev, int mask) { + struct resource *res; u16 cmd, oldcmd; int i; pci_read_config_word(dev, PCI_COMMAND, &cmd); oldcmd = cmd; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *res = &dev->resource[i]; - + pci_dev_for_each_resource(dev, res, i) { /* Only set up the requested stuff */ if (!(mask & (1<devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (r->parent || !r->start || !r->flags) continue; @@ -724,15 +723,14 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm, int pcibios_enable_device(struct pci_dev *dev, int mask) { + struct resource *res; u16 cmd, oldcmd; int i; pci_read_config_word(dev, PCI_COMMAND, &cmd); oldcmd = cmd; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *res = &dev->resource[i]; - + pci_dev_for_each_resource(dev, res, i) { /* Only set up the requested stuff */ if (!(mask & (1<resource[i]; - + pci_dev_for_each_resource(dev, res, i) { /* Only set up the requested stuff */ if (!(mask & (1<resource + i; + pci_dev_for_each_resource_p(dev, res) { if (res->parent) release_resource(res); } diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index c690572b10ce..d4fc7665f70a 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -124,20 +124,17 @@ static resource_size_t get_res_add_align(struct list_head *head, return dev_res ? dev_res->min_align : 0; } - /* Sort resources by alignment */ static void pdev_sort_resources(struct pci_dev *dev, struct list_head *head) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r; + pci_dev_for_each_resource(dev, r, i) { struct pci_dev_resource *dev_res, *tmp; resource_size_t r_align; struct list_head *n; - r = &dev->resource[i]; - if (r->flags & IORESOURCE_PCI_FIXED) continue; @@ -895,10 +892,9 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, min_align = window_alignment(bus, IORESOURCE_IO); list_for_each_entry(dev, &bus->devices, bus_list) { - int i; + struct resource *r; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; + pci_dev_for_each_resource_p(dev, r) { unsigned long r_size; if (r->parent || !(r->flags & IORESOURCE_IO)) @@ -1014,10 +1010,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, size = 0; list_for_each_entry(dev, &bus->devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; + pci_dev_for_each_resource(dev, r, i) { resource_size_t r_size; if (r->parent || (r->flags & IORESOURCE_PCI_FIXED) || @@ -1358,11 +1354,10 @@ static void assign_fixed_resource_on_bus(struct pci_bus *b, struct resource *r) */ static void pdev_assign_fixed_resources(struct pci_dev *dev) { - int i; + struct resource *r; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { + pci_dev_for_each_resource_p(dev, r) { struct pci_bus *b; - struct resource *r = &dev->resource[i]; if (r->parent || !(r->flags & IORESOURCE_PCI_FIXED) || !(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) @@ -1795,11 +1790,9 @@ static void remove_dev_resources(struct pci_dev *dev, struct resource *io, struct resource *mmio, struct resource *mmio_pref) { - int i; - - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *res = &dev->resource[i]; + struct resource *res; + pci_dev_for_each_resource_p(dev, res) { if (resource_type(res) == IORESOURCE_IO) { remove_dev_resource(io, dev, res); } else if (resource_type(res) == IORESOURCE_MEM) { diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index b492e67c3d87..967f9a758923 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c @@ -484,12 +484,10 @@ int pci_enable_resources(struct pci_dev *dev, int mask) pci_read_config_word(dev, PCI_COMMAND, &cmd); old_cmd = cmd; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { + pci_dev_for_each_resource(dev, r, i) { if (!(mask & (1 << i))) continue; - r = &dev->resource[i]; - if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) continue; if ((i == PCI_ROM_RESOURCE) && diff --git a/drivers/pci/vgaarb.c b/drivers/pci/vgaarb.c index f80b6ec88dc3..3ec6a0b7dbf0 100644 --- a/drivers/pci/vgaarb.c +++ b/drivers/pci/vgaarb.c @@ -548,10 +548,8 @@ static bool vga_is_firmware_default(struct pci_dev *pdev) #if defined(CONFIG_X86) || defined(CONFIG_IA64) u64 base = screen_info.lfb_base; u64 size = screen_info.lfb_size; + struct resource *r; u64 limit; - resource_size_t start, end; - unsigned long flags; - int i; /* Select the device owning the boot framebuffer if there is one */ @@ -561,19 +559,14 @@ static bool vga_is_firmware_default(struct pci_dev *pdev) limit = base + size; /* Does firmware framebuffer belong to us? */ - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - flags = pci_resource_flags(pdev, i); - - if ((flags & IORESOURCE_MEM) == 0) + pci_dev_for_each_resource_p(pdev, r) { + if (resource_type(r) != IORESOURCE_MEM) continue; - start = pci_resource_start(pdev, i); - end = pci_resource_end(pdev, i); - - if (!start || !end) + if (!r->start || !r->end) continue; - if (base < start || limit >= end) + if (base < r->start || limit >= r->end) continue; return true; diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index fcd029ca2eb1..83c0ab50676d 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c @@ -390,9 +390,7 @@ static int pcifront_claim_resource(struct pci_dev *dev, void *data) int i; struct resource *r; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (!r->parent && r->start && r->flags) { dev_info(&pdev->xdev->dev, "claiming resource %s/%d\n", pci_name(dev), i); diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index ac98b9919029..6085a1471de2 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c @@ -229,8 +229,7 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev) static void quirk_system_pci_resources(struct pnp_dev *dev) { struct pci_dev *pdev = NULL; - struct resource *res; - resource_size_t pnp_start, pnp_end, pci_start, pci_end; + struct resource *res, *r; int i, j; /* @@ -243,32 +242,26 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) * so they won't be claimed by the PNP system driver. */ for_each_pci_dev(pdev) { - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - unsigned long flags, type; + pci_dev_for_each_resource(pdev, r, i) { + unsigned long type = resource_type(r); - flags = pci_resource_flags(pdev, i); - type = flags & (IORESOURCE_IO | IORESOURCE_MEM); - if (!type || pci_resource_len(pdev, i) == 0) + if (!(type == IORESOURCE_IO || type == IORESOURCE_MEM) || + resource_size(r) == 0) continue; - if (flags & IORESOURCE_UNSET) + if (r->flags & IORESOURCE_UNSET) continue; - pci_start = pci_resource_start(pdev, i); - pci_end = pci_resource_end(pdev, i); for (j = 0; (res = pnp_get_resource(dev, type, j)); j++) { if (res->start == 0 && res->end == 0) continue; - pnp_start = res->start; - pnp_end = res->end; - /* * If the PNP region doesn't overlap the PCI * region at all, there's no problem. */ - if (pnp_end < pci_start || pnp_start > pci_end) + if (!resource_overlaps(res, r)) continue; /* @@ -278,8 +271,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) * PNP device describes a bridge with PCI * behind it. */ - if (pnp_start <= pci_start && - pnp_end >= pci_end) + if (res->start <= r->start && res->end >= r->end) continue; /* @@ -288,9 +280,8 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) * driver from requesting its resources. */ dev_warn(&dev->dev, - "disabling %pR because it overlaps " - "%s BAR %d %pR\n", res, - pci_name(pdev), i, &pdev->resource[i]); + "disabling %pR because it overlaps %s BAR %d %pR\n", + res, pci_name(pdev), i, r); res->flags |= IORESOURCE_DISABLED; } } diff --git a/include/linux/pci.h b/include/linux/pci.h index b50e5c79f7e3..a97f026afaed 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1995,14 +1995,25 @@ int pci_iobar_pfn(struct pci_dev *pdev, int bar, struct vm_area_struct *vma); * These helpers provide future and backwards compatibility * for accessing popular PCI BAR info */ +#define pci_resource_n(dev, bar) (&(dev)->resource[(bar)]) #define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start) #define pci_resource_end(dev, bar) ((dev)->resource[(bar)].end) #define pci_resource_flags(dev, bar) ((dev)->resource[(bar)].flags) #define pci_resource_len(dev,bar) \ ((pci_resource_end((dev), (bar)) == 0) ? 0 : \ \ - (pci_resource_end((dev), (bar)) - \ - pci_resource_start((dev), (bar)) + 1)) + resource_size(pci_resource_n((dev), (bar)))) + +#define __pci_dev_for_each_resource(dev, res, __i, vartype) \ + for (vartype __i = 0; \ + res = pci_resource_n(dev, __i), __i < PCI_NUM_RESOURCES; \ + __i++) + +#define pci_dev_for_each_resource(dev, res, i) \ + __pci_dev_for_each_resource(dev, res, i, ) + +#define pci_dev_for_each_resource_p(dev, res) \ + __pci_dev_for_each_resource(dev, res, __i, unsigned int) /* * Similar to the helpers above, these manipulate per-pci_dev -- 2.39.2 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 Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 67B8AC7618A for ; Mon, 20 Mar 2023 13:18:03 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4PgFfK5L3Yz3chx for ; Tue, 21 Mar 2023 00:18:01 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=J7HLmEY8; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=linux.intel.com (client-ip=134.134.136.65; helo=mga03.intel.com; envelope-from=andriy.shevchenko@linux.intel.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=J7HLmEY8; dkim-atps=neutral Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4PgFcG1QFSz3cCc for ; Tue, 21 Mar 2023 00:16:14 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679318174; x=1710854174; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=03KpgEWjTRIOrghUDlJ37yTkg0WA7G7gXnWuRYLhmBU=; b=J7HLmEY8NwQGvATNtemCETJ4Ian6bCg95IQ2wsO8bdZBHJZT4Cag2vhQ rrjWFU+XAy93KvqVFO1/1Ny0s+KAHH+4FKaq1KnZM+X8dcQbt/N/nJ9dV aTyDQUz4qBDe1JcLayFr2mMkXo9/yTtUwg7Midp4KbHyq1hzb3pRSPFN4 DbysDe+UPR9dAlyOPszisSkIGrHIO3/D5zCuuss0H+UTzS9r9sZHuYPj1 yj5Ebh/NcoaiaToyuL9CcQyNMZjeRntPP2gMgdHQ5ieCkGqIHKPSaSIWX 1swIGCcJWrIAVsXbcSUQuy/Uzkqxf9sBJEQerbkmjqIKUdFJWAk3CP/DX w==; X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="341015341" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="341015341" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Mar 2023 06:16:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="824468999" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="824468999" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga001.fm.intel.com with ESMTP; 20 Mar 2023 06:15:58 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id F13BA3DD; Mon, 20 Mar 2023 15:16:43 +0200 (EET) From: Andy Shevchenko To: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Andy Shevchenko , Mika Westerberg , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Michael Ellerman , Randy Dunlap , Arnd Bergmann , Niklas Schnelle , Bjorn Helgaas , "Rafael J. Wysocki" , =?UTF-8?q?Pali=20Roh=C3=A1r?= , "Maciej W. Rozycki" , Juergen Gross , Dominik Brodowski , linux-kernel@vger.kernel.org, linux-alpha@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-pci@vger.kernel.org, xen-devel@lists.xenproject.org, linux-acpi@vger.kernel.org Subject: [PATCH v6 1/4] PCI: Introduce pci_dev_for_each_resource() Date: Mon, 20 Mar 2023 15:16:30 +0200 Message-Id: <20230320131633.61680-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> References: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Lunn , Thomas Bogendoerfer , Stefano Stabellini , Yoshinori Sato , Oleksandr Tyshchenko , Gregory Clement , Richard Henderson , Russell King , Nicholas Piggin , Bjorn Helgaas , Rich Felker , Ivan Kokshaysky , John Paul Adrian Glaubitz , Miguel Ojeda , Matt Turner , Anatolij Gustschin , "David S. Miller" , Sebastian Hesselbarth Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" From: Mika Westerberg Instead of open-coding it everywhere introduce a tiny helper that can be used to iterate over each resource of a PCI device, and convert the most obvious users into it. While at it drop doubled empty line before pdev_sort_resources(). No functional changes intended. Suggested-by: Andy Shevchenko Signed-off-by: Mika Westerberg Signed-off-by: Andy Shevchenko Reviewed-by: Krzysztof Wilczyński --- .clang-format | 2 ++ arch/alpha/kernel/pci.c | 5 ++-- arch/arm/kernel/bios32.c | 16 ++++++------- arch/arm/mach-dove/pcie.c | 10 ++++---- arch/arm/mach-mv78xx0/pcie.c | 10 ++++---- arch/arm/mach-orion5x/pci.c | 10 ++++---- arch/mips/pci/ops-bcm63xx.c | 8 +++---- arch/mips/pci/pci-legacy.c | 3 +-- arch/powerpc/kernel/pci-common.c | 21 ++++++++-------- arch/powerpc/platforms/4xx/pci.c | 8 +++---- arch/powerpc/platforms/52xx/mpc52xx_pci.c | 5 ++-- arch/powerpc/platforms/pseries/pci.c | 16 ++++++------- arch/sh/drivers/pci/pcie-sh7786.c | 10 ++++---- arch/sparc/kernel/leon_pci.c | 5 ++-- arch/sparc/kernel/pci.c | 10 ++++---- arch/sparc/kernel/pcic.c | 5 ++-- drivers/pci/remove.c | 5 ++-- drivers/pci/setup-bus.c | 27 ++++++++------------- drivers/pci/setup-res.c | 4 +--- drivers/pci/vgaarb.c | 17 ++++--------- drivers/pci/xen-pcifront.c | 4 +--- drivers/pnp/quirks.c | 29 ++++++++--------------- include/linux/pci.h | 15 ++++++++++-- 23 files changed, 111 insertions(+), 134 deletions(-) diff --git a/.clang-format b/.clang-format index d988e9fa9b26..266abb843654 100644 --- a/.clang-format +++ b/.clang-format @@ -520,6 +520,8 @@ ForEachMacros: - 'of_property_for_each_string' - 'of_property_for_each_u32' - 'pci_bus_for_each_resource' + - 'pci_dev_for_each_resource' + - 'pci_dev_for_each_resource_p' - 'pci_doe_for_each_off' - 'pcl_for_each_chunk' - 'pcl_for_each_segment' diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index 64fbfb0763b2..4458eb7f44f0 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c @@ -288,11 +288,10 @@ pcibios_claim_one_bus(struct pci_bus *b) struct pci_bus *child_bus; list_for_each_entry(dev, &b->devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (r->parent || !r->start || !r->flags) continue; if (pci_has_flag(PCI_PROBE_ONLY) || diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index e7ef2b5bea9c..5254734b23e6 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -142,15 +142,15 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940F, */ static void pci_fixup_dec21285(struct pci_dev *dev) { - int i; - if (dev->devfn == 0) { + struct resource *r; + dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } @@ -162,13 +162,11 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21285, pci_fixup_d static void pci_fixup_ide_bases(struct pci_dev *dev) { struct resource *r; - int i; if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) return; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - r = dev->resource + i; + pci_dev_for_each_resource_p(dev, r) { if ((r->start & ~0x80) == 0x374) { r->start |= 2; r->end = r->start; diff --git a/arch/arm/mach-dove/pcie.c b/arch/arm/mach-dove/pcie.c index 754ca381f600..58cecd79a204 100644 --- a/arch/arm/mach-dove/pcie.c +++ b/arch/arm/mach-dove/pcie.c @@ -142,14 +142,14 @@ static struct pci_ops pcie_ops = { static void rc_pci_fixup(struct pci_dev *dev) { if (dev->bus->parent == NULL && dev->devfn == 0) { - int i; + struct resource *r; dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index 6190f538a124..f59f02150a36 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c @@ -186,14 +186,14 @@ static struct pci_ops pcie_ops = { static void rc_pci_fixup(struct pci_dev *dev) { if (dev->bus->parent == NULL && dev->devfn == 0) { - int i; + struct resource *r; dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index 888fdc9099c5..0933b47b601a 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c @@ -522,14 +522,14 @@ static int __init pci_setup(struct pci_sys_data *sys) static void rc_pci_fixup(struct pci_dev *dev) { if (dev->bus->parent == NULL && dev->devfn == 0) { - int i; + struct resource *r; dev->class &= 0xff; dev->class |= PCI_CLASS_BRIDGE_HOST << 8; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/mips/pci/ops-bcm63xx.c b/arch/mips/pci/ops-bcm63xx.c index dc6dc2741272..c0efcbf3c63f 100644 --- a/arch/mips/pci/ops-bcm63xx.c +++ b/arch/mips/pci/ops-bcm63xx.c @@ -413,18 +413,18 @@ struct pci_ops bcm63xx_cb_ops = { static void bcm63xx_fixup(struct pci_dev *dev) { static int io_window = -1; - int i, found, new_io_window; + int found, new_io_window; + struct resource *r; u32 val; /* look for any io resource */ found = 0; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - if (pci_resource_flags(dev, i) & IORESOURCE_IO) { + pci_dev_for_each_resource_p(dev, r) { + if (resource_type(r) == IORESOURCE_IO) { found = 1; break; } } - if (!found) return; diff --git a/arch/mips/pci/pci-legacy.c b/arch/mips/pci/pci-legacy.c index 468722c8a5c6..ec2567f8efd8 100644 --- a/arch/mips/pci/pci-legacy.c +++ b/arch/mips/pci/pci-legacy.c @@ -249,12 +249,11 @@ static int pcibios_enable_resources(struct pci_dev *dev, int mask) pci_read_config_word(dev, PCI_COMMAND, &cmd); old_cmd = cmd; - for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) { + pci_dev_for_each_resource(dev, r, idx) { /* Only set up the requested stuff */ if (!(mask & (1<resource[idx]; if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) continue; if ((idx == PCI_ROM_RESOURCE) && diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index d67cf79bf5d0..1908a46cad54 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -880,6 +880,7 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) static void pcibios_fixup_resources(struct pci_dev *dev) { struct pci_controller *hose = pci_bus_to_host(dev->bus); + struct resource *res; int i; if (!hose) { @@ -891,9 +892,9 @@ static void pcibios_fixup_resources(struct pci_dev *dev) if (dev->is_virtfn) return; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - struct resource *res = dev->resource + i; + pci_dev_for_each_resource(dev, res, i) { struct pci_bus_region reg; + if (!res->flags) continue; @@ -1452,11 +1453,10 @@ void pcibios_claim_one_bus(struct pci_bus *bus) struct pci_bus *child_bus; list_for_each_entry(dev, &bus->devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (r->parent || !r->start || !r->flags) continue; @@ -1705,19 +1705,20 @@ EXPORT_SYMBOL_GPL(pcibios_scan_phb); static void fixup_hide_host_resource_fsl(struct pci_dev *dev) { - int i, class = dev->class >> 8; + int class = dev->class >> 8; /* When configured as agent, programming interface = 1 */ int prog_if = dev->class & 0xf; + struct resource *r; if ((class == PCI_CLASS_PROCESSOR_POWERPC || class == PCI_CLASS_BRIDGE_OTHER) && (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) && (prog_if == 0) && (dev->bus->parent == NULL)) { - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/powerpc/platforms/4xx/pci.c b/arch/powerpc/platforms/4xx/pci.c index ca5dd7a5842a..9d19123c0da8 100644 --- a/arch/powerpc/platforms/4xx/pci.c +++ b/arch/powerpc/platforms/4xx/pci.c @@ -57,7 +57,7 @@ static inline int ppc440spe_revA(void) static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev) { struct pci_controller *hose; - int i; + struct resource *r; if (dev->devfn != 0 || dev->bus->self != NULL) return; @@ -79,9 +79,9 @@ static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev) /* Hide the PCI host BARs from the kernel as their content doesn't * fit well in the resource management */ - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = r->end = 0; + r->flags = 0; } printk(KERN_INFO "PCI: Hiding 4xx host bridge resources %s\n", diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pci.c b/arch/powerpc/platforms/52xx/mpc52xx_pci.c index 859e2818c43d..ea72ef4fc63b 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_pci.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_pci.c @@ -327,14 +327,13 @@ mpc52xx_pci_setup(struct pci_controller *hose, static void mpc52xx_pci_fixup_resources(struct pci_dev *dev) { - int i; + struct resource *res; pr_debug("%s() %.4x:%.4x\n", __func__, dev->vendor, dev->device); /* We don't rely on boot loader for PCI and resets all devices */ - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - struct resource *res = &dev->resource[i]; + pci_dev_for_each_resource_p(dev, res) { if (res->end > res->start) { /* Only valid resources */ res->end -= res->start; res->start = 0; diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c index 60e0a58928ef..ee7b2c737c92 100644 --- a/arch/powerpc/platforms/pseries/pci.c +++ b/arch/powerpc/platforms/pseries/pci.c @@ -240,7 +240,7 @@ void __init pSeries_final_fixup(void) */ static void fixup_winbond_82c105(struct pci_dev* dev) { - int i; + struct resource *r; unsigned int reg; if (!machine_is(pseries)) @@ -251,14 +251,14 @@ static void fixup_winbond_82c105(struct pci_dev* dev) /* Enable LEGIRQ to use INTC instead of ISA interrupts */ pci_write_config_dword(dev, 0x40, reg | (1<<11)); - for (i = 0; i < DEVICE_COUNT_RESOURCE; ++i) { + pci_dev_for_each_resource_p(dev, r) { /* zap the 2nd function of the winbond chip */ - if (dev->resource[i].flags & IORESOURCE_IO - && dev->bus->number == 0 && dev->devfn == 0x81) - dev->resource[i].flags &= ~IORESOURCE_IO; - if (dev->resource[i].start == 0 && dev->resource[i].end) { - dev->resource[i].flags = 0; - dev->resource[i].end = 0; + if (dev->bus->number == 0 && dev->devfn == 0x81 && + r->flags & IORESOURCE_IO) + r->flags &= ~IORESOURCE_IO; + if (r->start == 0 && r->end) { + r->flags = 0; + r->end = 0; } } } diff --git a/arch/sh/drivers/pci/pcie-sh7786.c b/arch/sh/drivers/pci/pcie-sh7786.c index b0c2a5238d04..982f9aec2f2f 100644 --- a/arch/sh/drivers/pci/pcie-sh7786.c +++ b/arch/sh/drivers/pci/pcie-sh7786.c @@ -140,12 +140,12 @@ static void sh7786_pci_fixup(struct pci_dev *dev) * Prevent enumeration of root complex resources. */ if (pci_is_root_bus(dev->bus) && dev->devfn == 0) { - int i; + struct resource *r; - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; + pci_dev_for_each_resource_p(dev, r) { + r->start = 0; + r->end = 0; + r->flags = 0; } } } diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c index e5e5ff6b9a5c..b6663a3fbae9 100644 --- a/arch/sparc/kernel/leon_pci.c +++ b/arch/sparc/kernel/leon_pci.c @@ -62,15 +62,14 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info) int pcibios_enable_device(struct pci_dev *dev, int mask) { + struct resource *res; u16 cmd, oldcmd; int i; pci_read_config_word(dev, PCI_COMMAND, &cmd); oldcmd = cmd; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *res = &dev->resource[i]; - + pci_dev_for_each_resource(dev, res, i) { /* Only set up the requested stuff */ if (!(mask & (1<devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (r->parent || !r->start || !r->flags) continue; @@ -724,15 +723,14 @@ struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm, int pcibios_enable_device(struct pci_dev *dev, int mask) { + struct resource *res; u16 cmd, oldcmd; int i; pci_read_config_word(dev, PCI_COMMAND, &cmd); oldcmd = cmd; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *res = &dev->resource[i]; - + pci_dev_for_each_resource(dev, res, i) { /* Only set up the requested stuff */ if (!(mask & (1<resource[i]; - + pci_dev_for_each_resource(dev, res, i) { /* Only set up the requested stuff */ if (!(mask & (1<resource + i; + pci_dev_for_each_resource_p(dev, res) { if (res->parent) release_resource(res); } diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index c690572b10ce..d4fc7665f70a 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -124,20 +124,17 @@ static resource_size_t get_res_add_align(struct list_head *head, return dev_res ? dev_res->min_align : 0; } - /* Sort resources by alignment */ static void pdev_sort_resources(struct pci_dev *dev, struct list_head *head) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r; + pci_dev_for_each_resource(dev, r, i) { struct pci_dev_resource *dev_res, *tmp; resource_size_t r_align; struct list_head *n; - r = &dev->resource[i]; - if (r->flags & IORESOURCE_PCI_FIXED) continue; @@ -895,10 +892,9 @@ static void pbus_size_io(struct pci_bus *bus, resource_size_t min_size, min_align = window_alignment(bus, IORESOURCE_IO); list_for_each_entry(dev, &bus->devices, bus_list) { - int i; + struct resource *r; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; + pci_dev_for_each_resource_p(dev, r) { unsigned long r_size; if (r->parent || !(r->flags & IORESOURCE_IO)) @@ -1014,10 +1010,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, size = 0; list_for_each_entry(dev, &bus->devices, bus_list) { + struct resource *r; int i; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; + pci_dev_for_each_resource(dev, r, i) { resource_size_t r_size; if (r->parent || (r->flags & IORESOURCE_PCI_FIXED) || @@ -1358,11 +1354,10 @@ static void assign_fixed_resource_on_bus(struct pci_bus *b, struct resource *r) */ static void pdev_assign_fixed_resources(struct pci_dev *dev) { - int i; + struct resource *r; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { + pci_dev_for_each_resource_p(dev, r) { struct pci_bus *b; - struct resource *r = &dev->resource[i]; if (r->parent || !(r->flags & IORESOURCE_PCI_FIXED) || !(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) @@ -1795,11 +1790,9 @@ static void remove_dev_resources(struct pci_dev *dev, struct resource *io, struct resource *mmio, struct resource *mmio_pref) { - int i; - - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *res = &dev->resource[i]; + struct resource *res; + pci_dev_for_each_resource_p(dev, res) { if (resource_type(res) == IORESOURCE_IO) { remove_dev_resource(io, dev, res); } else if (resource_type(res) == IORESOURCE_MEM) { diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index b492e67c3d87..967f9a758923 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c @@ -484,12 +484,10 @@ int pci_enable_resources(struct pci_dev *dev, int mask) pci_read_config_word(dev, PCI_COMMAND, &cmd); old_cmd = cmd; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { + pci_dev_for_each_resource(dev, r, i) { if (!(mask & (1 << i))) continue; - r = &dev->resource[i]; - if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) continue; if ((i == PCI_ROM_RESOURCE) && diff --git a/drivers/pci/vgaarb.c b/drivers/pci/vgaarb.c index f80b6ec88dc3..3ec6a0b7dbf0 100644 --- a/drivers/pci/vgaarb.c +++ b/drivers/pci/vgaarb.c @@ -548,10 +548,8 @@ static bool vga_is_firmware_default(struct pci_dev *pdev) #if defined(CONFIG_X86) || defined(CONFIG_IA64) u64 base = screen_info.lfb_base; u64 size = screen_info.lfb_size; + struct resource *r; u64 limit; - resource_size_t start, end; - unsigned long flags; - int i; /* Select the device owning the boot framebuffer if there is one */ @@ -561,19 +559,14 @@ static bool vga_is_firmware_default(struct pci_dev *pdev) limit = base + size; /* Does firmware framebuffer belong to us? */ - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - flags = pci_resource_flags(pdev, i); - - if ((flags & IORESOURCE_MEM) == 0) + pci_dev_for_each_resource_p(pdev, r) { + if (resource_type(r) != IORESOURCE_MEM) continue; - start = pci_resource_start(pdev, i); - end = pci_resource_end(pdev, i); - - if (!start || !end) + if (!r->start || !r->end) continue; - if (base < start || limit >= end) + if (base < r->start || limit >= r->end) continue; return true; diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index fcd029ca2eb1..83c0ab50676d 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c @@ -390,9 +390,7 @@ static int pcifront_claim_resource(struct pci_dev *dev, void *data) int i; struct resource *r; - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - r = &dev->resource[i]; - + pci_dev_for_each_resource(dev, r, i) { if (!r->parent && r->start && r->flags) { dev_info(&pdev->xdev->dev, "claiming resource %s/%d\n", pci_name(dev), i); diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index ac98b9919029..6085a1471de2 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c @@ -229,8 +229,7 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev) static void quirk_system_pci_resources(struct pnp_dev *dev) { struct pci_dev *pdev = NULL; - struct resource *res; - resource_size_t pnp_start, pnp_end, pci_start, pci_end; + struct resource *res, *r; int i, j; /* @@ -243,32 +242,26 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) * so they won't be claimed by the PNP system driver. */ for_each_pci_dev(pdev) { - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - unsigned long flags, type; + pci_dev_for_each_resource(pdev, r, i) { + unsigned long type = resource_type(r); - flags = pci_resource_flags(pdev, i); - type = flags & (IORESOURCE_IO | IORESOURCE_MEM); - if (!type || pci_resource_len(pdev, i) == 0) + if (!(type == IORESOURCE_IO || type == IORESOURCE_MEM) || + resource_size(r) == 0) continue; - if (flags & IORESOURCE_UNSET) + if (r->flags & IORESOURCE_UNSET) continue; - pci_start = pci_resource_start(pdev, i); - pci_end = pci_resource_end(pdev, i); for (j = 0; (res = pnp_get_resource(dev, type, j)); j++) { if (res->start == 0 && res->end == 0) continue; - pnp_start = res->start; - pnp_end = res->end; - /* * If the PNP region doesn't overlap the PCI * region at all, there's no problem. */ - if (pnp_end < pci_start || pnp_start > pci_end) + if (!resource_overlaps(res, r)) continue; /* @@ -278,8 +271,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) * PNP device describes a bridge with PCI * behind it. */ - if (pnp_start <= pci_start && - pnp_end >= pci_end) + if (res->start <= r->start && res->end >= r->end) continue; /* @@ -288,9 +280,8 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) * driver from requesting its resources. */ dev_warn(&dev->dev, - "disabling %pR because it overlaps " - "%s BAR %d %pR\n", res, - pci_name(pdev), i, &pdev->resource[i]); + "disabling %pR because it overlaps %s BAR %d %pR\n", + res, pci_name(pdev), i, r); res->flags |= IORESOURCE_DISABLED; } } diff --git a/include/linux/pci.h b/include/linux/pci.h index b50e5c79f7e3..a97f026afaed 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1995,14 +1995,25 @@ int pci_iobar_pfn(struct pci_dev *pdev, int bar, struct vm_area_struct *vma); * These helpers provide future and backwards compatibility * for accessing popular PCI BAR info */ +#define pci_resource_n(dev, bar) (&(dev)->resource[(bar)]) #define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start) #define pci_resource_end(dev, bar) ((dev)->resource[(bar)].end) #define pci_resource_flags(dev, bar) ((dev)->resource[(bar)].flags) #define pci_resource_len(dev,bar) \ ((pci_resource_end((dev), (bar)) == 0) ? 0 : \ \ - (pci_resource_end((dev), (bar)) - \ - pci_resource_start((dev), (bar)) + 1)) + resource_size(pci_resource_n((dev), (bar)))) + +#define __pci_dev_for_each_resource(dev, res, __i, vartype) \ + for (vartype __i = 0; \ + res = pci_resource_n(dev, __i), __i < PCI_NUM_RESOURCES; \ + __i++) + +#define pci_dev_for_each_resource(dev, res, i) \ + __pci_dev_for_each_resource(dev, res, i, ) + +#define pci_dev_for_each_resource_p(dev, res) \ + __pci_dev_for_each_resource(dev, res, __i, unsigned int) /* * Similar to the helpers above, these manipulate per-pci_dev -- 2.39.2 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A3B8BC7618D for ; Mon, 20 Mar 2023 13:17:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+GSwbO2dup9QOa9kedNSqCB5CzodclE5Kp/Wkj8J0M8=; b=uvQt0Y83yirf8w BDtul7dr5QkAmz3uAL+HBzYtsIgywe9tIXdIyLrywdbcOR1GaZDYqChx8IC0ldXMyKD3aDBFH1yqX 1I1fnEJC7+3QiK8SoBy2q9yjqqSzvcrgUGbDk2/+QBcFmD2VJ/s9n2WcHASIEVf+T8b6ASO6if6YB wk8jHBmLqB2y03aJLoxN7nldNerxzxiyRwI+GaWWemo6Hhq9pUexw2LwDcfHeiZ12BBBvA4pTJ4R4 17NBeeY9FZjTdtIqybWyyv/myplPIf38fdFLLXnclkiPGWYmxRPgslzjwhDHEQzPSpIIGDT0syI1r PcPdfiu6bShv5ZXj14Fg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1peFN7-0094tb-33; Mon, 20 Mar 2023 13:16:21 +0000 Received: from mga03.intel.com ([134.134.136.65]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1peFMz-0094pn-1u for linux-arm-kernel@lists.infradead.org; Mon, 20 Mar 2023 13:16:16 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679318173; x=1710854173; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=03KpgEWjTRIOrghUDlJ37yTkg0WA7G7gXnWuRYLhmBU=; b=HRytNq1pF3r5XJXc9tgjXo9rlTV/DzWFKeZ0L2j9dH7KlgtAZihJSsTc XQ4kI/FBdKb78zzGc7AVcp6TZnpzdCpVpBou/0gw6rTVKZ0hh+RokEeXd tiVfaRxTa+8tdCjM9IRvWonmPu+a1w7ajs1ETMAQ1moDjlShNqGZ08TyU dHAzhBsPPc+Ib/mAlmeUF9RczUByRXUSg82+3/NQewm6bvmDc3nCTIIQm QOSEBRy2d+2NgOKvTLXtUehixSG1YdjuyxiNWRPoWr14KQp24Ouk4l/kh Vv8UCZun4g3N3K+GqVb/EFbgvdon0aPx45Oj4Gjy0dMn7aqrPJCALb6wr g==; X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="341015334" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="341015334" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Mar 2023 06:16:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="824468999" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="824468999" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga001.fm.intel.com with ESMTP; 20 Mar 2023 06:15:58 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id F13BA3DD; Mon, 20 Mar 2023 15:16:43 +0200 (EET) From: Andy Shevchenko To: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Andy Shevchenko , Mika Westerberg , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Michael Ellerman , Randy Dunlap , Arnd Bergmann , Niklas Schnelle , Bjorn Helgaas , "Rafael J. Wysocki" , =?UTF-8?q?Pali=20Roh=C3=A1r?= , "Maciej W. Rozycki" , Juergen Gross , Dominik Brodowski , linux-kernel@vger.kernel.org, linux-alpha@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-pci@vger.kernel.org, xen-devel@lists.xenproject.org, linux-acpi@vger.kernel.org Cc: Miguel Ojeda , Richard Henderson , Ivan Kokshaysky , Matt Turner , Russell King , Andrew Lunn , Sebastian Hesselbarth , Gregory Clement , Thomas Bogendoerfer , Nicholas Piggin , Christophe Leroy , Anatolij Gustschin , Yoshinori Sato , Rich Felker , John Paul Adrian Glaubitz , "David S. Miller" , Bjorn Helgaas , Stefano Stabellini , Oleksandr Tyshchenko Subject: [PATCH v6 1/4] PCI: Introduce pci_dev_for_each_resource() Date: Mon, 20 Mar 2023 15:16:30 +0200 Message-Id: <20230320131633.61680-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> References: <20230320131633.61680-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230320_061613_706525_50BF4C8C X-CRM114-Status: GOOD ( 26.11 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAbGludXguaW50ZWwuY29tPgoK SW5zdGVhZCBvZiBvcGVuLWNvZGluZyBpdCBldmVyeXdoZXJlIGludHJvZHVjZSBhIHRpbnkgaGVs cGVyIHRoYXQgY2FuIGJlCnVzZWQgdG8gaXRlcmF0ZSBvdmVyIGVhY2ggcmVzb3VyY2Ugb2YgYSBQ Q0kgZGV2aWNlLCBhbmQgY29udmVydCB0aGUgbW9zdApvYnZpb3VzIHVzZXJzIGludG8gaXQuCgpX aGlsZSBhdCBpdCBkcm9wIGRvdWJsZWQgZW1wdHkgbGluZSBiZWZvcmUgcGRldl9zb3J0X3Jlc291 cmNlcygpLgoKTm8gZnVuY3Rpb25hbCBjaGFuZ2VzIGludGVuZGVkLgoKU3VnZ2VzdGVkLWJ5OiBB bmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4KU2lnbmVk LW9mZi1ieTogTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAbGludXguaW50ZWwuY29t PgpTaWduZWQtb2ZmLWJ5OiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4 LmludGVsLmNvbT4KUmV2aWV3ZWQtYnk6IEtyenlzenRvZiBXaWxjennFhHNraSA8a3dAbGludXgu Y29tPgotLS0KIC5jbGFuZy1mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDIg KysKIGFyY2gvYWxwaGEva2VybmVsL3BjaS5jICAgICAgICAgICAgICAgICAgIHwgIDUgKystLQog YXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jICAgICAgICAgICAgICAgICAgfCAxNiArKysrKystLS0t LS0tCiBhcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jICAgICAgICAgICAgICAgICB8IDEwICsrKyst LS0tCiBhcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jICAgICAgICAgICAgICB8IDEwICsrKyst LS0tCiBhcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMgICAgICAgICAgICAgICB8IDEwICsrKyst LS0tCiBhcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMgICAgICAgICAgICAgICB8ICA4ICsrKy0t LS0KIGFyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jICAgICAgICAgICAgICAgIHwgIDMgKy0tCiBh cmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyAgICAgICAgICB8IDIxICsrKysrKysrLS0t LS0tLS0KIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jICAgICAgICAgIHwgIDggKysr LS0tLQogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMgfCAgNSArKy0t CiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgICAgICB8IDE2ICsrKysrKy0t LS0tLS0KIGFyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYyAgICAgICAgIHwgMTAgKysr Ky0tLS0KIGFyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgICAgICAgICAgICAgIHwgIDUgKyst LQogYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMgICAgICAgICAgICAgICAgICAgfCAxMCArKysrLS0t LQogYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jICAgICAgICAgICAgICAgICAgfCAgNSArKy0tCiBk cml2ZXJzL3BjaS9yZW1vdmUuYyAgICAgICAgICAgICAgICAgICAgICB8ICA1ICsrLS0KIGRyaXZl cnMvcGNpL3NldHVwLWJ1cy5jICAgICAgICAgICAgICAgICAgIHwgMjcgKysrKysrKystLS0tLS0t LS0tLS0tCiBkcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyAgICAgICAgICAgICAgICAgICB8ICA0ICst LS0KIGRyaXZlcnMvcGNpL3ZnYWFyYi5jICAgICAgICAgICAgICAgICAgICAgIHwgMTcgKysrKy0t LS0tLS0tLQogZHJpdmVycy9wY2kveGVuLXBjaWZyb250LmMgICAgICAgICAgICAgICAgfCAgNCAr LS0tCiBkcml2ZXJzL3BucC9xdWlya3MuYyAgICAgICAgICAgICAgICAgICAgICB8IDI5ICsrKysr KysrLS0tLS0tLS0tLS0tLS0tCiBpbmNsdWRlL2xpbnV4L3BjaS5oICAgICAgICAgICAgICAgICAg ICAgICB8IDE1ICsrKysrKysrKystLQogMjMgZmlsZXMgY2hhbmdlZCwgMTExIGluc2VydGlvbnMo KyksIDEzNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS8uY2xhbmctZm9ybWF0IGIvLmNsYW5n LWZvcm1hdAppbmRleCBkOTg4ZTlmYTliMjYuLjI2NmFiYjg0MzY1NCAxMDA2NDQKLS0tIGEvLmNs YW5nLWZvcm1hdAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC01MjAsNiArNTIwLDggQEAgRm9yRWFj aE1hY3JvczoKICAgLSAnb2ZfcHJvcGVydHlfZm9yX2VhY2hfc3RyaW5nJwogICAtICdvZl9wcm9w ZXJ0eV9mb3JfZWFjaF91MzInCiAgIC0gJ3BjaV9idXNfZm9yX2VhY2hfcmVzb3VyY2UnCisgIC0g J3BjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UnCisgIC0gJ3BjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2VfcCcKICAgLSAncGNpX2RvZV9mb3JfZWFjaF9vZmYnCiAgIC0gJ3BjbF9mb3JfZWFjaF9jaHVu aycKICAgLSAncGNsX2Zvcl9lYWNoX3NlZ21lbnQnCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tl cm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCmluZGV4IDY0ZmJmYjA3NjNiMi4u NDQ1OGViN2Y0NGYwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYworKysgYi9h cmNoL2FscGhhL2tlcm5lbC9wY2kuYwpAQCAtMjg4LDExICsyODgsMTAgQEAgcGNpYmlvc19jbGFp bV9vbmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKQogCXN0cnVjdCBwY2lfYnVzICpjaGlsZF9idXM7 CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmItPmRldmljZXMsIGJ1c19saXN0KSB7CisJ CXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9O VU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291 cmNlW2ldOwotCisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCQlp ZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8fCAhci0+ZmxhZ3MpCiAJCQkJY29udGludWU7CiAJ CQlpZiAocGNpX2hhc19mbGFnKFBDSV9QUk9CRV9PTkxZKSB8fApkaWZmIC0tZ2l0IGEvYXJjaC9h cm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCmluZGV4IGU3ZWYy YjViZWE5Yy4uNTI1NDczNGIyM2U2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMy LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC0xNDIsMTUgKzE0MiwxNSBAQCBE RUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9XSU5CT05EMiwgUENJX0RFVklD RV9JRF9XSU5CT05EMl84OUM5NDBGLAogICovCiBzdGF0aWMgdm9pZCBwY2lfZml4dXBfZGVjMjEy ODUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKLQogCWlmIChkZXYtPmRldmZuID09 IDApIHsKKwkJc3RydWN0IHJlc291cmNlICpyOworCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsKIAkJ ZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0gMDsg aSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQg PSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgICA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ld LmZsYWdzID0gMDsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZV9wKGRldiwgcikgeworCQkJ ci0+c3RhcnQgPSAwOworCQkJci0+ZW5kID0gMDsKKwkJCXItPmZsYWdzID0gMDsKIAkJfQogCX0K IH0KQEAgLTE2MiwxMyArMTYyLDExIEBAIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVO RE9SX0lEX0RFQywgUENJX0RFVklDRV9JRF9ERUNfMjEyODUsIHBjaV9maXh1cF9kCiBzdGF0aWMg dm9pZCBwY2lfZml4dXBfaWRlX2Jhc2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0 IHJlc291cmNlICpyOwotCWludCBpOwogCiAJaWYgKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9D TEFTU19TVE9SQUdFX0lERSkKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1f UkVTT1VSQ0VTOyBpKyspIHsKLQkJciA9IGRldi0+cmVzb3VyY2UgKyBpOworCXBjaV9kZXZfZm9y X2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsKIAkJaWYgKChyLT5zdGFydCAmIH4weDgwKSA9PSAw eDM3NCkgewogCQkJci0+c3RhcnQgfD0gMjsKIAkJCXItPmVuZCA9IHItPnN0YXJ0OwpkaWZmIC0t Z2l0IGEvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtZG92ZS9wY2ll LmMKaW5kZXggNzU0Y2EzODFmNjAwLi41OGNlY2Q3OWEyMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJt L21hY2gtZG92ZS9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYwpAQCAtMTQy LDE0ICsxNDIsMTQgQEAgc3RhdGljIHN0cnVjdCBwY2lfb3BzIHBjaWVfb3BzID0gewogc3RhdGlj IHZvaWQgcmNfcGNpX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaWYgKGRldi0+YnVz LT5wYXJlbnQgPT0gTlVMTCAmJiBkZXYtPmRldmZuID09IDApIHsKLQkJaW50IGk7CisJCXN0cnVj dCByZXNvdXJjZSAqcjsKIAogCQlkZXYtPmNsYXNzICY9IDB4ZmY7CiAJCWRldi0+Y2xhc3MgfD0g UENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDg7Ci0JCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09V TlRfUkVTT1VSQ0U7IGkrKykgewotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9IDA7Ci0JCQlk ZXYtPnJlc291cmNlW2ldLmVuZCAgID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAw OworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CisJCQlyLT5zdGFydCA9 IDA7CisJCQlyLT5lbmQgICA9IDA7CisJCQlyLT5mbGFncyA9IDA7CiAJCX0KIAl9CiB9CmRpZmYg LS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4 eHgwL3BjaWUuYwppbmRleCA2MTkwZjUzOGExMjQuLmY1OWYwMjE1MGEzNiAxMDA2NDQKLS0tIGEv YXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAv cGNpZS5jCkBAIC0xODYsMTQgKzE4NiwxNCBAQCBzdGF0aWMgc3RydWN0IHBjaV9vcHMgcGNpZV9v cHMgPSB7CiBzdGF0aWMgdm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsK IAlpZiAoZGV2LT5idXMtPnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2Zm4gPT0gMCkgewotCQlp bnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsKIAkJ ZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0gMDsg aSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0 YXJ0ID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwotCQkJZGV2LT5yZXNvdXJj ZVtpXS5mbGFncyA9IDA7CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsK KwkJCXItPnN0YXJ0ID0gMDsKKwkJCXItPmVuZCAgID0gMDsKKwkJCXItPmZsYWdzID0gMDsKIAkJ fQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYyBiL2FyY2gv YXJtL21hY2gtb3Jpb241eC9wY2kuYwppbmRleCA4ODhmZGM5MDk5YzUuLjA5MzNiNDdiNjAxYSAx MDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCisrKyBiL2FyY2gvYXJtL21h Y2gtb3Jpb241eC9wY2kuYwpAQCAtNTIyLDE0ICs1MjIsMTQgQEAgc3RhdGljIGludCBfX2luaXQg cGNpX3NldHVwKHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKIHN0YXRpYyB2b2lkIHJjX3BjaV9m aXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWlmIChkZXYtPmJ1cy0+cGFyZW50ID09IE5V TEwgJiYgZGV2LT5kZXZmbiA9PSAwKSB7Ci0JCWludCBpOworCQlzdHJ1Y3QgcmVzb3VyY2UgKnI7 CiAKIAkJZGV2LT5jbGFzcyAmPSAweGZmOwogCQlkZXYtPmNsYXNzIHw9IFBDSV9DTEFTU19CUklE R0VfSE9TVCA8PCA4OwotCQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBp KyspIHsKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtp XS5lbmQgICA9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKKwkJcGNpX2Rldl9m b3JfZWFjaF9yZXNvdXJjZV9wKGRldiwgcikgeworCQkJci0+c3RhcnQJPSAwOworCQkJci0+ZW5k CQk9IDA7CisJCQlyLT5mbGFncwk9IDA7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL21p cHMvcGNpL29wcy1iY202M3h4LmMgYi9hcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMKaW5kZXgg ZGM2ZGMyNzQxMjcyLi5jMGVmY2JmM2M2M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3Bz LWJjbTYzeHguYworKysgYi9hcmNoL21pcHMvcGNpL29wcy1iY202M3h4LmMKQEAgLTQxMywxOCAr NDEzLDE4IEBAIHN0cnVjdCBwY2lfb3BzIGJjbTYzeHhfY2Jfb3BzID0gewogc3RhdGljIHZvaWQg YmNtNjN4eF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0YXRpYyBpbnQgaW9fd2lu ZG93ID0gLTE7Ci0JaW50IGksIGZvdW5kLCBuZXdfaW9fd2luZG93OworCWludCBmb3VuZCwgbmV3 X2lvX3dpbmRvdzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJdTMyIHZhbDsKIAogCS8qIGxvb2sg Zm9yIGFueSBpbyByZXNvdXJjZSAqLwogCWZvdW5kID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgREVW SUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKLQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhkZXYs IGkpICYgSU9SRVNPVVJDRV9JTykgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYs IHIpIHsKKwkJaWYgKHJlc291cmNlX3R5cGUocikgPT0gSU9SRVNPVVJDRV9JTykgewogCQkJZm91 bmQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KIAlpZiAoIWZvdW5kKQogCQlyZXR1cm47CiAK ZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jIGIvYXJjaC9taXBzL3BjaS9w Y2ktbGVnYWN5LmMKaW5kZXggNDY4NzIyYzhhNWM2Li5lYzI1NjdmOGVmZDggMTAwNjQ0Ci0tLSBh L2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2Fj eS5jCkBAIC0yNDksMTIgKzI0OSwxMSBAQCBzdGF0aWMgaW50IHBjaWJpb3NfZW5hYmxlX3Jlc291 cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIAogCXBjaV9yZWFkX2NvbmZpZ193 b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0JZm9yIChpZHgg PSAwOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKKwlwY2lfZGV2X2Zvcl9lYWNo X3Jlc291cmNlKGRldiwgciwgaWR4KSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQg c3R1ZmYgKi8KIAkJaWYgKCEobWFzayAmICgxPDxpZHgpKSkKIAkJCWNvbnRpbnVlOwogCi0JCXIg PSAmZGV2LT5yZXNvdXJjZVtpZHhdOwogCQlpZiAoIShyLT5mbGFncyAmIChJT1JFU09VUkNFX0lP IHwgSU9SRVNPVVJDRV9NRU0pKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGlkeCA9PSBQQ0lfUk9N X1JFU09VUkNFKSAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9u LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwppbmRleCBkNjdjZjc5YmY1ZDAu LjE5MDhhNDZjYWQ1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9u LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTg4MCw2ICs4ODAs NyBAQCBpbnQgcGNpYmlvc19yb290X2JyaWRnZV9wcmVwYXJlKHN0cnVjdCBwY2lfaG9zdF9icmlk Z2UgKmJyaWRnZSkKIHN0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBw Y2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190 b19ob3N0KGRldi0+YnVzKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgaTsKIAogCWlm ICghaG9zZSkgewpAQCAtODkxLDkgKzg5Miw5IEBAIHN0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXBf cmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiAJaWYgKGRldi0+aXNfdmlydGZuKQogCQly ZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsK LQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgaTsKKwlwY2lfZGV2X2Zv cl9lYWNoX3Jlc291cmNlKGRldiwgcmVzLCBpKSB7CiAJCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiBy ZWc7CisKIAkJaWYgKCFyZXMtPmZsYWdzKQogCQkJY29udGludWU7CiAKQEAgLTE0NTIsMTEgKzE0 NTMsMTAgQEAgdm9pZCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykK IAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGRfYnVzOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYs ICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50 IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0 cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCisJCXBjaV9kZXZfZm9yX2Vh Y2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCQlpZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8 fCAhci0+ZmxhZ3MpCiAJCQkJY29udGludWU7CiAKQEAgLTE3MDUsMTkgKzE3MDUsMjAgQEAgRVhQ T1JUX1NZTUJPTF9HUEwocGNpYmlvc19zY2FuX3BoYik7CiAKIHN0YXRpYyB2b2lkIGZpeHVwX2hp ZGVfaG9zdF9yZXNvdXJjZV9mc2woc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaSwgY2xh c3MgPSBkZXYtPmNsYXNzID4+IDg7CisJaW50IGNsYXNzID0gZGV2LT5jbGFzcyA+PiA4OwogCS8q IFdoZW4gY29uZmlndXJlZCBhcyBhZ2VudCwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlID0gMSAqLwog CWludCBwcm9nX2lmID0gZGV2LT5jbGFzcyAmIDB4ZjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAK IAlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQyB8fAogCSAgICAgY2xh c3MgPT0gUENJX0NMQVNTX0JSSURHRV9PVEhFUikgJiYKIAkJKGRldi0+aGRyX3R5cGUgPT0gUENJ X0hFQURFUl9UWVBFX05PUk1BTCkgJiYKIAkJKHByb2dfaWYgPT0gMCkgJiYKIAkJKGRldi0+YnVz LT5wYXJlbnQgPT0gTlVMTCkpIHsKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNP VVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJCWRldi0+cmVz b3VyY2VbaV0uZW5kID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOworCQlwY2lf ZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CisJCQlyLT5zdGFydCA9IDA7CisJCQly LT5lbmQgPSAwOworCQkJci0+ZmxhZ3MgPSAwOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJj aC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4 eC9wY2kuYwppbmRleCBjYTVkZDdhNTg0MmEuLjlkMTkxMjNjMGRhOCAxMDA2NDQKLS0tIGEvYXJj aC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jt cy80eHgvcGNpLmMKQEAgLTU3LDcgKzU3LDcgQEAgc3RhdGljIGlubGluZSBpbnQgcHBjNDQwc3Bl X3JldkEodm9pZCkKIHN0YXRpYyB2b2lkIGZpeHVwX3BwYzR4eF9wY2lfYnJpZGdlKHN0cnVjdCBw Y2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCWludCBpOwor CXN0cnVjdCByZXNvdXJjZSAqcjsKIAogCWlmIChkZXYtPmRldmZuICE9IDAgfHwgZGV2LT5idXMt PnNlbGYgIT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtNzksOSArNzksOSBAQCBzdGF0aWMgdm9pZCBm aXh1cF9wcGM0eHhfcGNpX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogCS8qIEhpZGUgdGhl IFBDSSBob3N0IEJBUnMgZnJvbSB0aGUga2VybmVsIGFzIHRoZWlyIGNvbnRlbnQgZG9lc24ndAog CSAqIGZpdCB3ZWxsIGluIHRoZSByZXNvdXJjZSBtYW5hZ2VtZW50CiAJICovCi0JZm9yIChpID0g MDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCWRldi0+cmVzb3VyY2VbaV0u c3RhcnQgPSBkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7Ci0JCWRldi0+cmVzb3VyY2VbaV0uZmxh Z3MgPSAwOworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsKKwkJci0+c3Rh cnQgPSByLT5lbmQgPSAwOworCQlyLT5mbGFncyA9IDA7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5G TyAiUENJOiBIaWRpbmcgNHh4IGhvc3QgYnJpZGdlIHJlc291cmNlcyAlc1xuIiwKZGlmZiAtLWdp dCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jIGIvYXJjaC9wb3dl cnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKaW5kZXggODU5ZTI4MThjNDNkLi5lYTcy ZWY0ZmM2M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4 X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jCkBA IC0zMjcsMTQgKzMyNywxMyBAQCBtcGM1Mnh4X3BjaV9zZXR1cChzdHJ1Y3QgcGNpX2NvbnRyb2xs ZXIgKmhvc2UsCiBzdGF0aWMgdm9pZAogbXBjNTJ4eF9wY2lfZml4dXBfcmVzb3VyY2VzKHN0cnVj dCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAKIAlw cl9kZWJ1ZygiJXMoKSAlLjR4OiUuNHhcbiIsIF9fZnVuY19fLCBkZXYtPnZlbmRvciwgZGV2LT5k ZXZpY2UpOwogCiAJLyogV2UgZG9uJ3QgcmVseSBvbiBib290IGxvYWRlciBmb3IgUENJIGFuZCBy ZXNldHMgYWxsCiAJICAgZGV2aWNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRf UkVTT1VSQ0U7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZkZXYtPnJlc291cmNl W2ldOworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHJlcykgewogCQlpZiAocmVz LT5lbmQgPiByZXMtPnN0YXJ0KSB7CS8qIE9ubHkgdmFsaWQgcmVzb3VyY2VzICovCiAJCQlyZXMt PmVuZCAtPSByZXMtPnN0YXJ0OwogCQkJcmVzLT5zdGFydCA9IDA7CmRpZmYgLS1naXQgYS9hcmNo L3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1z L3BzZXJpZXMvcGNpLmMKaW5kZXggNjBlMGE1ODkyOGVmLi5lZTdiMmM3MzdjOTIgMTAwNjQ0Ci0t LSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2Vy cGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKQEAgLTI0MCw3ICsyNDAsNyBAQCB2b2lkIF9faW5p dCBwU2VyaWVzX2ZpbmFsX2ZpeHVwKHZvaWQpCiAgKi8KIHN0YXRpYyB2b2lkIGZpeHVwX3dpbmJv bmRfODJjMTA1KHN0cnVjdCBwY2lfZGV2KiBkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJlc291 cmNlICpyOwogCXVuc2lnbmVkIGludCByZWc7CiAKIAlpZiAoIW1hY2hpbmVfaXMocHNlcmllcykp CkBAIC0yNTEsMTQgKzI1MSwxNCBAQCBzdGF0aWMgdm9pZCBmaXh1cF93aW5ib25kXzgyYzEwNShz dHJ1Y3QgcGNpX2RldiogZGV2KQogCS8qIEVuYWJsZSBMRUdJUlEgdG8gdXNlIElOVEMgaW5zdGVh ZCBvZiBJU0EgaW50ZXJydXB0cyAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQw LCByZWcgfCAoMTw8MTEpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VS Q0U7ICsraSkgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHIpIHsKIAkJLyog emFwIHRoZSAybmQgZnVuY3Rpb24gb2YgdGhlIHdpbmJvbmQgY2hpcCAqLwotCQlpZiAoZGV2LT5y ZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfSU8KLQkJICAgICYmIGRldi0+YnVzLT5udW1i ZXIgPT0gMCAmJiBkZXYtPmRldmZuID09IDB4ODEpCi0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdz ICY9IH5JT1JFU09VUkNFX0lPOwotCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9PSAwICYm IGRldi0+cmVzb3VyY2VbaV0uZW5kKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsK LQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kID0gMDsKKwkJaWYgKGRldi0+YnVzLT5udW1iZXIgPT0g MCAmJiBkZXYtPmRldmZuID09IDB4ODEgJiYKKwkJICAgIHItPmZsYWdzICYgSU9SRVNPVVJDRV9J TykKKwkJCXItPmZsYWdzICY9IH5JT1JFU09VUkNFX0lPOworCQlpZiAoci0+c3RhcnQgPT0gMCAm JiByLT5lbmQpIHsKKwkJCXItPmZsYWdzID0gMDsKKwkJCXItPmVuZCA9IDA7CiAJCX0KIAl9CiB9 CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMgYi9hcmNoL3No L2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKaW5kZXggYjBjMmE1MjM4ZDA0Li45ODJmOWFlYzJm MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYworKysgYi9h cmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKQEAgLTE0MCwxMiArMTQwLDEyIEBAIHN0 YXRpYyB2b2lkIHNoNzc4Nl9wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIAkgKiBQcmV2 ZW50IGVudW1lcmF0aW9uIG9mIHJvb3QgY29tcGxleCByZXNvdXJjZXMuCiAJICovCiAJaWYgKHBj aV9pc19yb290X2J1cyhkZXYtPmJ1cykgJiYgZGV2LT5kZXZmbiA9PSAwKSB7Ci0JCWludCBpOwor CQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9S RVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0CT0gMDsKLQkJCWRldi0+ cmVzb3VyY2VbaV0uZW5kCT0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MJPSAwOworCQlw Y2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CisJCQlyLT5zdGFydAk9IDA7CisJ CQlyLT5lbmQJCT0gMDsKKwkJCXItPmZsYWdzCT0gMDsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBh L2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3Bj aS5jCmluZGV4IGU1ZTVmZjZiOWE1Yy4uYjY2NjNhM2ZiYWU5IDEwMDY0NAotLS0gYS9hcmNoL3Nw YXJjL2tlcm5lbC9sZW9uX3BjaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMK QEAgLTYyLDE1ICs2MiwxNCBAQCB2b2lkIGxlb25fcGNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqb2ZkZXYsIHN0cnVjdCBsZW9uX3BjaV9pbmZvICppbmZvKQogCiBpbnQgcGNpYmlvc19l bmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogeworCXN0cnVjdCBy ZXNvdXJjZSAqcmVzOwogCXUxNiBjbWQsIG9sZGNtZDsKIAlpbnQgaTsKIAogCXBjaV9yZWFkX2Nv bmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZGNtZCA9IGNtZDsKIAotCWZv ciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJj ZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNl KGRldiwgcmVzLCBpKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYgKi8K IAkJaWYgKCEobWFzayAmICgxPDxpKSkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2FyY2gv c3BhcmMva2VybmVsL3BjaS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKaW5kZXggY2IxZWYy NTExNmU5Li5hOTQ4YTQ5ODE3YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaS5j CisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCkBAIC02NjMsMTEgKzY2MywxMCBAQCBzdGF0 aWMgdm9pZCBwY2lfY2xhaW1fYnVzX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogCXN0 cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2 aWNlcywgYnVzX2xpc3QpIHsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCQlpbnQgaTsKIAotCQlm b3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgewotCQkJc3RydWN0IHJlc291 cmNlICpyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJj ZShkZXYsIHIsIGkpIHsKIAkJCWlmIChyLT5wYXJlbnQgfHwgIXItPnN0YXJ0IHx8ICFyLT5mbGFn cykKIAkJCQljb250aW51ZTsKIApAQCAtNzI0LDE1ICs3MjMsMTQgQEAgc3RydWN0IHBjaV9idXMg KnBjaV9zY2FuX29uZV9wYm0oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCiBpbnQgcGNpYmlv c19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogeworCXN0cnVj dCByZXNvdXJjZSAqcmVzOwogCXUxNiBjbWQsIG9sZGNtZDsKIAlpbnQgaTsKIAogCXBjaV9yZWFk X2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZGNtZCA9IGNtZDsKIAot CWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNv dXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291 cmNlKGRldiwgcmVzLCBpKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYg Ki8KIAkJaWYgKCEobWFzayAmICgxPDxpKSkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2Fy Y2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCBl ZTRjOWE5YTE3MWMuLjI1ZmUwYTA2MTczMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwv cGNpYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwpAQCAtNjQzLDE1ICs2NDMsMTQg QEAgdm9pZCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogCiBpbnQgcGNp Ymlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQogeworCXN0 cnVjdCByZXNvdXJjZSAqcmVzOwogCXUxNiBjbWQsIG9sZGNtZDsKIAlpbnQgaTsKIAogCXBjaV9y ZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZGNtZCA9IGNtZDsK IAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCBy ZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jl c291cmNlKGRldiwgcmVzLCBpKSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1 ZmYgKi8KIAkJaWYgKCEobWFzayAmICgxPDxpKSkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGNpL3JlbW92ZS5jIGIvZHJpdmVycy9wY2kvcmVtb3ZlLmMKaW5kZXggMDE0NWFl ZjFiOTMwLi4xMzEwZTAxZmI1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JlbW92ZS5jCisr KyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCkBAIC01LDEwICs1LDkgQEAKIAogc3RhdGljIHZvaWQg cGNpX2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGk7CisJc3Ry dWN0IHJlc291cmNlICpyZXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7 IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2UgKyBpOworCXBj aV9kZXZfZm9yX2VhY2hfcmVzb3VyY2VfcChkZXYsIHJlcykgewogCQlpZiAocmVzLT5wYXJlbnQp CiAJCQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kv c2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjNjkwNTcyYjEwY2Uu LmQ0ZmM3NjY1ZjcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIv ZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTEyNCwyMCArMTI0LDE3IEBAIHN0YXRpYyByZXNv dXJjZV9zaXplX3QgZ2V0X3Jlc19hZGRfYWxpZ24oc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKIAly ZXR1cm4gZGV2X3JlcyA/IGRldl9yZXMtPm1pbl9hbGlnbiA6IDA7CiB9CiAKLQogLyogU29ydCBy ZXNvdXJjZXMgYnkgYWxpZ25tZW50ICovCiBzdGF0aWMgdm9pZCBwZGV2X3NvcnRfcmVzb3VyY2Vz KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CisJc3RydWN0 IHJlc291cmNlICpyOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VS Q0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyOworCXBjaV9kZXZfZm9yX2VhY2hfcmVz b3VyY2UoZGV2LCByLCBpKSB7CiAJCXN0cnVjdCBwY2lfZGV2X3Jlc291cmNlICpkZXZfcmVzLCAq dG1wOwogCQlyZXNvdXJjZV9zaXplX3Qgcl9hbGlnbjsKIAkJc3RydWN0IGxpc3RfaGVhZCAqbjsK IAotCQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KIAkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJD RV9QQ0lfRklYRUQpCiAJCQljb250aW51ZTsKIApAQCAtODk1LDEwICs4OTIsOSBAQCBzdGF0aWMg dm9pZCBwYnVzX3NpemVfaW8oc3RydWN0IHBjaV9idXMgKmJ1cywgcmVzb3VyY2Vfc2l6ZV90IG1p bl9zaXplLAogCiAJbWluX2FsaWduID0gd2luZG93X2FsaWdubWVudChidXMsIElPUkVTT1VSQ0Vf SU8pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkg ewotCQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCi0JCWZvciAoaSA9IDA7IGkgPCBQ Q0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5y ZXNvdXJjZVtpXTsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZV9wKGRldiwgcikgewogCQkJ dW5zaWduZWQgbG9uZyByX3NpemU7CiAKIAkJCWlmIChyLT5wYXJlbnQgfHwgIShyLT5mbGFncyAm IElPUkVTT1VSQ0VfSU8pKQpAQCAtMTAxNCwxMCArMTAxMCwxMCBAQCBzdGF0aWMgaW50IHBidXNf c2l6ZV9tZW0oc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgbG9uZyBtYXNrLAogCXNpemUg PSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0 KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8 IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYt PnJlc291cmNlW2ldOworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgciwgaSkgewog CQkJcmVzb3VyY2Vfc2l6ZV90IHJfc2l6ZTsKIAogCQkJaWYgKHItPnBhcmVudCB8fCAoci0+Zmxh Z3MgJiBJT1JFU09VUkNFX1BDSV9GSVhFRCkgfHwKQEAgLTEzNTgsMTEgKzEzNTQsMTAgQEAgc3Rh dGljIHZvaWQgYXNzaWduX2ZpeGVkX3Jlc291cmNlX29uX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYiwg c3RydWN0IHJlc291cmNlICpyKQogICovCiBzdGF0aWMgdm9pZCBwZGV2X2Fzc2lnbl9maXhlZF9y ZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3Vy Y2UgKnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgIFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwlw Y2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByKSB7CiAJCXN0cnVjdCBwY2lfYnVzICpi OwotCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKIAogCQlpZiAoci0+ cGFyZW50IHx8ICEoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BDSV9GSVhFRCkgfHwKIAkJICAgICEo ci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkpCkBAIC0xNzk1LDEx ICsxNzkwLDkgQEAgc3RhdGljIHZvaWQgcmVtb3ZlX2Rldl9yZXNvdXJjZXMoc3RydWN0IHBjaV9k ZXYgKmRldiwgc3RydWN0IHJlc291cmNlICppbywKIAkJCQkgc3RydWN0IHJlc291cmNlICptbWlv LAogCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKm1taW9fcHJlZikKIHsKLQlpbnQgaTsKLQotCWZvciAo aSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAq cmVzID0gJmRldi0+cmVzb3VyY2VbaV07CisJc3RydWN0IHJlc291cmNlICpyZXM7CiAKKwlwY2lf ZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByZXMpIHsKIAkJaWYgKHJlc291cmNlX3R5cGUo cmVzKSA9PSBJT1JFU09VUkNFX0lPKSB7CiAJCQlyZW1vdmVfZGV2X3Jlc291cmNlKGlvLCBkZXYs IHJlcyk7CiAJCX0gZWxzZSBpZiAocmVzb3VyY2VfdHlwZShyZXMpID09IElPUkVTT1VSQ0VfTUVN KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3Nl dHVwLXJlcy5jCmluZGV4IGI0OTJlNjdjM2Q4Ny4uOTY3ZjlhNzU4OTIzIDEwMDY0NAotLS0gYS9k cml2ZXJzL3BjaS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAt NDg0LDEyICs0ODQsMTAgQEAgaW50IHBjaV9lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2 ICpkZXYsIGludCBtYXNrKQogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQs ICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNP VVJDRVM7IGkrKykgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJ CWlmICghKG1hc2sgJiAoMSA8PCBpKSkpCiAJCQljb250aW51ZTsKIAotCQlyID0gJmRldi0+cmVz b3VyY2VbaV07Ci0KIAkJaWYgKCEoci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VS Q0VfTUVNKSkpCiAJCQljb250aW51ZTsKIAkJaWYgKChpID09IFBDSV9ST01fUkVTT1VSQ0UpICYm CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS92Z2FhcmIuYyBiL2RyaXZlcnMvcGNpL3ZnYWFyYi5j CmluZGV4IGY4MGI2ZWM4OGRjMy4uM2VjNmEwYjdkYmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bj aS92Z2FhcmIuYworKysgYi9kcml2ZXJzL3BjaS92Z2FhcmIuYwpAQCAtNTQ4LDEwICs1NDgsOCBA QCBzdGF0aWMgYm9vbCB2Z2FfaXNfZmlybXdhcmVfZGVmYXVsdChzdHJ1Y3QgcGNpX2RldiAqcGRl dikKICNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCiAJdTY0 IGJhc2UgPSBzY3JlZW5faW5mby5sZmJfYmFzZTsKIAl1NjQgc2l6ZSA9IHNjcmVlbl9pbmZvLmxm Yl9zaXplOworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1NjQgbGltaXQ7Ci0JcmVzb3VyY2Vfc2l6 ZV90IHN0YXJ0LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKIAogCS8qIFNl bGVjdCB0aGUgZGV2aWNlIG93bmluZyB0aGUgYm9vdCBmcmFtZWJ1ZmZlciBpZiB0aGVyZSBpcyBv bmUgKi8KIApAQCAtNTYxLDE5ICs1NTksMTQgQEAgc3RhdGljIGJvb2wgdmdhX2lzX2Zpcm13YXJl X2RlZmF1bHQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiAJbGltaXQgPSBiYXNlICsgc2l6ZTsKIAog CS8qIERvZXMgZmlybXdhcmUgZnJhbWVidWZmZXIgYmVsb25nIHRvIHVzPyAqLwotCWZvciAoaSA9 IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlmbGFncyA9IHBjaV9yZXNv dXJjZV9mbGFncyhwZGV2LCBpKTsKLQotCQlpZiAoKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09 IDApCisJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZV9wKHBkZXYsIHIpIHsKKwkJaWYgKHJlc291 cmNlX3R5cGUocikgIT0gSU9SRVNPVVJDRV9NRU0pCiAJCQljb250aW51ZTsKIAotCQlzdGFydCA9 IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKTsKLQkJZW5kICA9IHBjaV9yZXNvdXJjZV9lbmQo cGRldiwgaSk7Ci0KLQkJaWYgKCFzdGFydCB8fCAhZW5kKQorCQlpZiAoIXItPnN0YXJ0IHx8ICFy LT5lbmQpCiAJCQljb250aW51ZTsKIAotCQlpZiAoYmFzZSA8IHN0YXJ0IHx8IGxpbWl0ID49IGVu ZCkKKwkJaWYgKGJhc2UgPCByLT5zdGFydCB8fCBsaW1pdCA+PSByLT5lbmQpCiAJCQljb250aW51 ZTsKIAogCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3hlbi1wY2lmcm9u dC5jIGIvZHJpdmVycy9wY2kveGVuLXBjaWZyb250LmMKaW5kZXggZmNkMDI5Y2EyZWIxLi44M2Mw YWI1MDY3NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3hlbi1wY2lmcm9udC5jCisrKyBiL2Ry aXZlcnMvcGNpL3hlbi1wY2lmcm9udC5jCkBAIC0zOTAsOSArMzkwLDcgQEAgc3RhdGljIGludCBw Y2lmcm9udF9jbGFpbV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICpkYXRhKQog CWludCBpOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVN X1JFU09VUkNFUzsgaSsrKSB7Ci0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZf Zm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCWlmICghci0+cGFyZW50ICYmIHItPnN0 YXJ0ICYmIHItPmZsYWdzKSB7CiAJCQlkZXZfaW5mbygmcGRldi0+eGRldi0+ZGV2LCAiY2xhaW1p bmcgcmVzb3VyY2UgJXMvJWRcbiIsCiAJCQkJcGNpX25hbWUoZGV2KSwgaSk7CmRpZmYgLS1naXQg YS9kcml2ZXJzL3BucC9xdWlya3MuYyBiL2RyaXZlcnMvcG5wL3F1aXJrcy5jCmluZGV4IGFjOThi OTkxOTAyOS4uNjA4NWExNDcxZGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9xdWlya3MuYwor KysgYi9kcml2ZXJzL3BucC9xdWlya3MuYwpAQCAtMjI5LDggKzIyOSw3IEBAIHN0YXRpYyB2b2lk IHF1aXJrX2FkMTgxNV9tcHVfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiBzdGF0aWMg dm9pZCBxdWlya19zeXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewog CXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQly ZXNvdXJjZV9zaXplX3QgcG5wX3N0YXJ0LCBwbnBfZW5kLCBwY2lfc3RhcnQsIHBjaV9lbmQ7CisJ c3RydWN0IHJlc291cmNlICpyZXMsICpyOwogCWludCBpLCBqOwogCiAJLyoKQEAgLTI0MywzMiAr MjQyLDI2IEBAIHN0YXRpYyB2b2lkIHF1aXJrX3N5c3RlbV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBw bnBfZGV2ICpkZXYpCiAJICogc28gdGhleSB3b24ndCBiZSBjbGFpbWVkIGJ5IHRoZSBQTlAgc3lz dGVtIGRyaXZlci4KIAkgKi8KIAlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0g MDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGZs YWdzLCB0eXBlOworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKHBkZXYsIHIsIGkpIHsKKwkJ CXVuc2lnbmVkIGxvbmcgdHlwZSA9IHJlc291cmNlX3R5cGUocik7CiAKLQkJCWZsYWdzID0gcGNp X3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpOwotCQkJdHlwZSA9IGZsYWdzICYgKElPUkVTT1VSQ0Vf SU8gfCBJT1JFU09VUkNFX01FTSk7Ci0JCQlpZiAoIXR5cGUgfHwgcGNpX3Jlc291cmNlX2xlbihw ZGV2LCBpKSA9PSAwKQorCQkJaWYgKCEodHlwZSA9PSBJT1JFU09VUkNFX0lPIHx8IHR5cGUgPT0g SU9SRVNPVVJDRV9NRU0pIHx8CisJCQkgICAgcmVzb3VyY2Vfc2l6ZShyKSA9PSAwKQogCQkJCWNv bnRpbnVlOwogCi0JCQlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKQorCQkJaWYgKHItPmZs YWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKIAkJCQljb250aW51ZTsKIAotCQkJcGNpX3N0YXJ0ID0g cGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOwotCQkJcGNpX2VuZCA9IHBjaV9yZXNvdXJjZV9l bmQocGRldiwgaSk7CiAJCQlmb3IgKGogPSAwOwogCQkJICAgICAocmVzID0gcG5wX2dldF9yZXNv dXJjZShkZXYsIHR5cGUsIGopKTsgaisrKSB7CiAJCQkJaWYgKHJlcy0+c3RhcnQgPT0gMCAmJiBy ZXMtPmVuZCA9PSAwKQogCQkJCQljb250aW51ZTsKIAotCQkJCXBucF9zdGFydCA9IHJlcy0+c3Rh cnQ7Ci0JCQkJcG5wX2VuZCA9IHJlcy0+ZW5kOwotCiAJCQkJLyoKIAkJCQkgKiBJZiB0aGUgUE5Q IHJlZ2lvbiBkb2Vzbid0IG92ZXJsYXAgdGhlIFBDSQogCQkJCSAqIHJlZ2lvbiBhdCBhbGwsIHRo ZXJlJ3Mgbm8gcHJvYmxlbS4KIAkJCQkgKi8KLQkJCQlpZiAocG5wX2VuZCA8IHBjaV9zdGFydCB8 fCBwbnBfc3RhcnQgPiBwY2lfZW5kKQorCQkJCWlmICghcmVzb3VyY2Vfb3ZlcmxhcHMocmVzLCBy KSkKIAkJCQkJY29udGludWU7CiAKIAkJCQkvKgpAQCAtMjc4LDggKzI3MSw3IEBAIHN0YXRpYyB2 b2lkIHF1aXJrX3N5c3RlbV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiAJCQkJ ICogUE5QIGRldmljZSBkZXNjcmliZXMgYSBicmlkZ2Ugd2l0aCBQQ0kKIAkJCQkgKiBiZWhpbmQg aXQuCiAJCQkJICovCi0JCQkJaWYgKHBucF9zdGFydCA8PSBwY2lfc3RhcnQgJiYKLQkJCQkgICAg cG5wX2VuZCA+PSBwY2lfZW5kKQorCQkJCWlmIChyZXMtPnN0YXJ0IDw9IHItPnN0YXJ0ICYmIHJl cy0+ZW5kID49IHItPmVuZCkKIAkJCQkJY29udGludWU7CiAKIAkJCQkvKgpAQCAtMjg4LDkgKzI4 MCw4IEBAIHN0YXRpYyB2b2lkIHF1aXJrX3N5c3RlbV9wY2lfcmVzb3VyY2VzKHN0cnVjdCBwbnBf ZGV2ICpkZXYpCiAJCQkJICogZHJpdmVyIGZyb20gcmVxdWVzdGluZyBpdHMgcmVzb3VyY2VzLgog CQkJCSAqLwogCQkJCWRldl93YXJuKCZkZXYtPmRldiwKLQkJCQkJICJkaXNhYmxpbmcgJXBSIGJl Y2F1c2UgaXQgb3ZlcmxhcHMgIgotCQkJCQkgIiVzIEJBUiAlZCAlcFJcbiIsIHJlcywKLQkJCQkJ IHBjaV9uYW1lKHBkZXYpLCBpLCAmcGRldi0+cmVzb3VyY2VbaV0pOworCQkJCQkgImRpc2FibGlu ZyAlcFIgYmVjYXVzZSBpdCBvdmVybGFwcyAlcyBCQVIgJWQgJXBSXG4iLAorCQkJCQkgcmVzLCBw Y2lfbmFtZShwZGV2KSwgaSwgcik7CiAJCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0RJU0FC TEVEOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVk ZS9saW51eC9wY2kuaAppbmRleCBiNTBlNWM3OWY3ZTMuLmE5N2YwMjZhZmFlZCAxMDA2NDQKLS0t IGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0xOTk1 LDE0ICsxOTk1LDI1IEBAIGludCBwY2lfaW9iYXJfcGZuKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBp bnQgYmFyLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAgKiBUaGVzZSBoZWxwZXJzIHBy b3ZpZGUgZnV0dXJlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICogZm9yIGFjY2Vzc2lu ZyBwb3B1bGFyIFBDSSBCQVIgaW5mbwogICovCisjZGVmaW5lIHBjaV9yZXNvdXJjZV9uKGRldiwg YmFyKQkoJihkZXYpLT5yZXNvdXJjZVsoYmFyKV0pCiAjZGVmaW5lIHBjaV9yZXNvdXJjZV9zdGFy dChkZXYsIGJhcikJKChkZXYpLT5yZXNvdXJjZVsoYmFyKV0uc3RhcnQpCiAjZGVmaW5lIHBjaV9y ZXNvdXJjZV9lbmQoZGV2LCBiYXIpCSgoZGV2KS0+cmVzb3VyY2VbKGJhcildLmVuZCkKICNkZWZp bmUgcGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgYmFyKQkoKGRldiktPnJlc291cmNlWyhiYXIpXS5m bGFncykKICNkZWZpbmUgcGNpX3Jlc291cmNlX2xlbihkZXYsYmFyKSBcCiAJKChwY2lfcmVzb3Vy Y2VfZW5kKChkZXYpLCAoYmFyKSkgPT0gMCkgPyAwIDoJXAogCQkJCQkJCVwKLQkgKHBjaV9yZXNv dXJjZV9lbmQoKGRldiksIChiYXIpKSAtCQlcCi0JICBwY2lfcmVzb3VyY2Vfc3RhcnQoKGRldiks IChiYXIpKSArIDEpKQorCSByZXNvdXJjZV9zaXplKHBjaV9yZXNvdXJjZV9uKChkZXYpLCAoYmFy KSkpKQorCisjZGVmaW5lIF9fcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHJlcywgX19p LCB2YXJ0eXBlKQkJXAorCWZvciAodmFydHlwZSBfX2kgPSAwOwkJCQkJCVwKKwkgICAgIHJlcyA9 IHBjaV9yZXNvdXJjZV9uKGRldiwgX19pKSwgX19pIDwgUENJX05VTV9SRVNPVVJDRVM7CVwKKwkg ICAgIF9faSsrKQorCisjZGVmaW5lIHBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByZXMs IGkpCQkJCVwKKyAgICAgICBfX3BjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByZXMsIGks ICkKKworI2RlZmluZSBwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlX3AoZGV2LCByZXMpCQkJCVwK KwlfX3BjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByZXMsIF9faSwgdW5zaWduZWQgaW50 KQogCiAvKgogICogU2ltaWxhciB0byB0aGUgaGVscGVycyBhYm92ZSwgdGhlc2UgbWFuaXB1bGF0 ZSBwZXItcGNpX2RldgotLSAKMi4zOS4yCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJt LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=