From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andy Shevchenko Subject: [PATCH v8 3/7] PCI: Introduce pci_dev_for_each_resource() Date: Thu, 30 Mar 2023 19:24:30 +0300 Message-ID: <20230330162434.35055-4-andriy.shevchenko@linux.intel.com> References: <20230330162434.35055-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=1680193711; x=1711729711; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=KHCoRXEtiwe/FhEOF5L3Qq5P3Xpu9j6hzV2s/by6feA=; b=TLdWjYGoOZmNuVgwOFxDmbNsEhuboLOP9EpUBYr49DAg+gS23fAogdPb 6Zkb9M9JSKJjW6EYda1Rh5S4+ZHmThuQ2B0AyAyGqrhvPNHHfI3cwlPpn cFU5wzCCuyiBxZ5Wl+GQ1jvJOtl5nB2ob0/Q1CexCV6WRdD0A9l4ahnHV X135BDUQeOGHa+ZP3Nc3MCR//KFrHUhgFUjkrgFCQmTB4c5GBYqkTkwfp l2EOEXbKfxujTmOUeMXTcCgvzfZiBHCje2RiIhSruWAnY5RSxdu7IqiSN AHO7FG6WtkV6xSlX9ylIlti7nZYFesmkCMKRasssrJyvHz1MrHxyKtTSr g==; In-Reply-To: <20230330162434.35055-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 , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Mika Westerberg , Michael Ellerman , Randy Dunlap , Arnd Bergmann , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , 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@list 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 Y29tPgotLS0KIC5jbGFuZy1mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEg KwogYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMgICAgICAgICAgICAgICAgICAgfCAgNSArKy0tCiBh cmNoL2FybS9rZXJuZWwvYmlvczMyLmMgICAgICAgICAgICAgICAgICB8IDE2ICsrKysrKy0tLS0t LS0KIGFyY2gvYXJtL21hY2gtZG92ZS9wY2llLmMgICAgICAgICAgICAgICAgIHwgMTAgKysrKy0t LS0KIGFyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMgICAgICAgICAgICAgIHwgMTAgKysrKy0t LS0KIGFyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYyAgICAgICAgICAgICAgIHwgMTAgKysrKy0t LS0KIGFyY2gvbWlwcy9wY2kvb3BzLWJjbTYzeHguYyAgICAgICAgICAgICAgIHwgIDggKysrLS0t LQogYXJjaC9taXBzL3BjaS9wY2ktbGVnYWN5LmMgICAgICAgICAgICAgICAgfCAgMyArLS0KIGFy Y2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jICAgICAgICAgIHwgMjEgKysrKysrKystLS0t LS0tLQogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvcGNpLmMgICAgICAgICAgfCAgOCArKyst LS0tCiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYyB8ICA1ICsrLS0K IGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYyAgICAgIHwgMTYgKysrKysrLS0t LS0tLQogYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jICAgICAgICAgfCAxMCArKysr LS0tLQogYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYyAgICAgICAgICAgICAgfCAgNSArKy0t CiBhcmNoL3NwYXJjL2tlcm5lbC9wY2kuYyAgICAgICAgICAgICAgICAgICB8IDEwICsrKystLS0t CiBhcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMgICAgICAgICAgICAgICAgICB8ICA1ICsrLS0KIGRy aXZlcnMvcGNpL3JlbW92ZS5jICAgICAgICAgICAgICAgICAgICAgIHwgIDUgKystLQogZHJpdmVy cy9wY2kvc2V0dXAtYnVzLmMgICAgICAgICAgICAgICAgICAgfCAyNyArKysrKysrKy0tLS0tLS0t LS0tLS0KIGRyaXZlcnMvcGNpL3NldHVwLXJlcy5jICAgICAgICAgICAgICAgICAgIHwgIDQgKy0t LQogZHJpdmVycy9wY2kvdmdhYXJiLmMgICAgICAgICAgICAgICAgICAgICAgfCAxNyArKysrLS0t LS0tLS0tCiBkcml2ZXJzL3BjaS94ZW4tcGNpZnJvbnQuYyAgICAgICAgICAgICAgICB8ICA0ICst LS0KIGRyaXZlcnMvcG5wL3F1aXJrcy5jICAgICAgICAgICAgICAgICAgICAgIHwgMjkgKysrKysr KystLS0tLS0tLS0tLS0tLS0KIGluY2x1ZGUvbGludXgvcGNpLmggICAgICAgICAgICAgICAgICAg ICAgIHwgMTUgKysrKysrKysrKysrCiAyMyBmaWxlcyBjaGFuZ2VkLCAxMTIgaW5zZXJ0aW9ucygr KSwgMTMyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmct Zm9ybWF0CmluZGV4IGQ5ODhlOWZhOWIyNi4uMjA0OGIwMjk2ZDc2IDEwMDY0NAotLS0gYS8uY2xh bmctZm9ybWF0CisrKyBiLy5jbGFuZy1mb3JtYXQKQEAgLTUyMCw2ICs1MjAsNyBAQCBGb3JFYWNo TWFjcm9zOgogICAtICdvZl9wcm9wZXJ0eV9mb3JfZWFjaF9zdHJpbmcnCiAgIC0gJ29mX3Byb3Bl cnR5X2Zvcl9lYWNoX3UzMicKICAgLSAncGNpX2J1c19mb3JfZWFjaF9yZXNvdXJjZScKKyAgLSAn cGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZScKICAgLSAncGNpX2RvZV9mb3JfZWFjaF9vZmYnCiAg IC0gJ3BjbF9mb3JfZWFjaF9jaHVuaycKICAgLSAncGNsX2Zvcl9lYWNoX3NlZ21lbnQnCmRpZmYg LS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5j CmluZGV4IDY0ZmJmYjA3NjNiMi4uNDQ1OGViN2Y0NGYwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhh L2tlcm5lbC9wY2kuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYwpAQCAtMjg4LDExICsy ODgsMTAgQEAgcGNpYmlvc19jbGFpbV9vbmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKQogCXN0cnVj dCBwY2lfYnVzICpjaGlsZF9idXM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmItPmRl dmljZXMsIGJ1c19saXN0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50IGk7CiAKLQkJ Zm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0cnVjdCByZXNv dXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByLCBpKSB7CiAJCQlpZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8fCAhci0+Zmxh Z3MpCiAJCQkJY29udGludWU7CiAJCQlpZiAocGNpX2hhc19mbGFnKFBDSV9QUk9CRV9PTkxZKSB8 fApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVs L2Jpb3MzMi5jCmluZGV4IGU3ZWYyYjViZWE5Yy4uZDMzNGM3ZmI2NzJiIDEwMDY0NAotLS0gYS9h cmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBA IC0xNDIsMTUgKzE0MiwxNSBAQCBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9J RF9XSU5CT05EMiwgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDBGLAogICovCiBzdGF0aWMg dm9pZCBwY2lfZml4dXBfZGVjMjEyODUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsK LQogCWlmIChkZXYtPmRldmZuID09IDApIHsKKwkJc3RydWN0IHJlc291cmNlICpyOworCiAJCWRl di0+Y2xhc3MgJj0gMHhmZjsKIAkJZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1Qg PDwgODsKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCWRl di0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgICA9IDA7 Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNv dXJjZShkZXYsIHIpIHsKKwkJCXItPnN0YXJ0ID0gMDsKKwkJCXItPmVuZCA9IDA7CisJCQlyLT5m bGFncyA9IDA7CiAJCX0KIAl9CiB9CkBAIC0xNjIsMTMgKzE2MiwxMSBAQCBERUNMQVJFX1BDSV9G SVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDXzIxMjg1LCBw Y2lfZml4dXBfZAogc3RhdGljIHZvaWQgcGNpX2ZpeHVwX2lkZV9iYXNlcyhzdHJ1Y3QgcGNpX2Rl diAqZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcjsKLQlpbnQgaTsKIAogCWlmICgoZGV2LT5j bGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCiAJCXJldHVybjsKIAotCWZvciAo aSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXIgPSBkZXYtPnJlc291cmNl ICsgaTsKKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcikgewogCQlpZiAoKHItPnN0 YXJ0ICYgfjB4ODApID09IDB4Mzc0KSB7CiAJCQlyLT5zdGFydCB8PSAyOwogCQkJci0+ZW5kID0g ci0+c3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jIGIvYXJjaC9h cm0vbWFjaC1kb3ZlL3BjaWUuYwppbmRleCA3NTRjYTM4MWY2MDAuLjMwNDRiN2UwMzg5MCAxMDA2 NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLWRv dmUvcGNpZS5jCkBAIC0xNDIsMTQgKzE0MiwxNCBAQCBzdGF0aWMgc3RydWN0IHBjaV9vcHMgcGNp ZV9vcHMgPSB7CiBzdGF0aWMgdm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikK IHsKIAlpZiAoZGV2LT5idXMtPnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2Zm4gPT0gMCkgewot CQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsK IAkJZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0g MDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ld LnN0YXJ0ID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwotCQkJZGV2LT5yZXNv dXJjZVtpXS5mbGFncyA9IDA7CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByKSB7 CisJCQlyLT5zdGFydCA9IDA7CisJCQlyLT5lbmQgICA9IDA7CisJCQlyLT5mbGFncyA9IDA7CiAJ CX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jIGIvYXJj aC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYwppbmRleCA2MTkwZjUzOGExMjQuLjBlYmM5MDllYTI3 MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2Fy bS9tYWNoLW12Nzh4eDAvcGNpZS5jCkBAIC0xODYsMTQgKzE4NiwxNCBAQCBzdGF0aWMgc3RydWN0 IHBjaV9vcHMgcGNpZV9vcHMgPSB7CiBzdGF0aWMgdm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBj aV9kZXYgKmRldikKIHsKIAlpZiAoZGV2LT5idXMtPnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2 Zm4gPT0gMCkgewotCQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xh c3MgJj0gMHhmZjsKIAkJZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsK LQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYt PnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwot CQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByKSB7CisJCQlyLT5zdGFydCA9IDA7CisJCQlyLT5lbmQgICA9IDA7CisJCQlyLT5m bGFncyA9IDA7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgv cGNpLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKaW5kZXggODg4ZmRjOTA5OWM1Li4z MzEzYmM1YTYzZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYworKysg Yi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKQEAgLTUyMiwxNCArNTIyLDE0IEBAIHN0YXRp YyBpbnQgX19pbml0IHBjaV9zZXR1cChzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCiBzdGF0aWMg dm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpZiAoZGV2LT5idXMt PnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2Zm4gPT0gMCkgewotCQlpbnQgaTsKKwkJc3RydWN0 IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsKIAkJZGV2LT5jbGFzcyB8PSBQ Q0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VO VF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJCWRl di0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7 CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByKSB7CisJCQlyLT5zdGFydAk9IDA7 CisJCQlyLT5lbmQJCT0gMDsKKwkJCXItPmZsYWdzCT0gMDsKIAkJfQogCX0KIH0KZGlmZiAtLWdp dCBhL2FyY2gvbWlwcy9wY2kvb3BzLWJjbTYzeHguYyBiL2FyY2gvbWlwcy9wY2kvb3BzLWJjbTYz eHguYwppbmRleCBkYzZkYzI3NDEyNzIuLmIwZWEwMjNjNDdjMCAxMDA2NDQKLS0tIGEvYXJjaC9t aXBzL3BjaS9vcHMtYmNtNjN4eC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLWJjbTYzeHguYwpA QCAtNDEzLDE4ICs0MTMsMTggQEAgc3RydWN0IHBjaV9vcHMgYmNtNjN4eF9jYl9vcHMgPSB7CiBz dGF0aWMgdm9pZCBiY202M3h4X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RhdGlj IGludCBpb193aW5kb3cgPSAtMTsKLQlpbnQgaSwgZm91bmQsIG5ld19pb193aW5kb3c7CisJaW50 IGZvdW5kLCBuZXdfaW9fd2luZG93OworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1MzIgdmFsOwog CiAJLyogbG9vayBmb3IgYW55IGlvIHJlc291cmNlICovCiAJZm91bmQgPSAwOwotCWZvciAoaSA9 IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlpZiAocGNpX3Jlc291cmNl X2ZsYWdzKGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKSB7CisJcGNpX2Rldl9mb3JfZWFjaF9yZXNv dXJjZShkZXYsIHIpIHsKKwkJaWYgKHJlc291cmNlX3R5cGUocikgPT0gSU9SRVNPVVJDRV9JTykg ewogCQkJZm91bmQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KIAlpZiAoIWZvdW5kKQogCQly ZXR1cm47CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jIGIvYXJjaC9t aXBzL3BjaS9wY2ktbGVnYWN5LmMKaW5kZXggNDY4NzIyYzhhNWM2Li5lYzI1NjdmOGVmZDggMTAw NjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jCisrKyBiL2FyY2gvbWlwcy9wY2kv cGNpLWxlZ2FjeS5jCkBAIC0yNDksMTIgKzI0OSwxMSBAQCBzdGF0aWMgaW50IHBjaWJpb3NfZW5h YmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIAogCXBjaV9yZWFk X2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0J Zm9yIChpZHggPSAwOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKKwlwY2lfZGV2 X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgciwgaWR4KSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSBy ZXF1ZXN0ZWQgc3R1ZmYgKi8KIAkJaWYgKCEobWFzayAmICgxPDxpZHgpKSkKIAkJCWNvbnRpbnVl OwogCi0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwogCQlpZiAoIShyLT5mbGFncyAmIChJT1JF U09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGlkeCA9 PSBQQ0lfUk9NX1JFU09VUkNFKSAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9w Y2ktY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwppbmRleCBkNjdj Zjc5YmY1ZDAuLmU4OGQ3YzlmZWVlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9w Y2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTg4 MCw2ICs4ODAsNyBAQCBpbnQgcGNpYmlvc19yb290X2JyaWRnZV9wcmVwYXJlKHN0cnVjdCBwY2lf aG9zdF9icmlkZ2UgKmJyaWRnZSkKIHN0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXBfcmVzb3VyY2Vz KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0g cGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQg aTsKIAogCWlmICghaG9zZSkgewpAQCAtODkxLDkgKzg5Miw5IEBAIHN0YXRpYyB2b2lkIHBjaWJp b3NfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiAJaWYgKGRldi0+aXNfdmly dGZuKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNF OyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgaTsKKwlw Y2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcmVzLCBpKSB7CiAJCXN0cnVjdCBwY2lfYnVz X3JlZ2lvbiByZWc7CisKIAkJaWYgKCFyZXMtPmZsYWdzKQogCQkJY29udGludWU7CiAKQEAgLTE0 NTIsMTEgKzE0NTMsMTAgQEAgdm9pZCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9i dXMgKmJ1cykKIAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGRfYnVzOwogCiAJbGlzdF9mb3JfZWFjaF9l bnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAq cjsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKysp IHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCisJCXBjaV9k ZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCQlpZiAoci0+cGFyZW50IHx8ICFy LT5zdGFydCB8fCAhci0+ZmxhZ3MpCiAJCQkJY29udGludWU7CiAKQEAgLTE3MDUsMTkgKzE3MDUs MjAgQEAgRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc19zY2FuX3BoYik7CiAKIHN0YXRpYyB2b2lk IGZpeHVwX2hpZGVfaG9zdF9yZXNvdXJjZV9mc2woc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlp bnQgaSwgY2xhc3MgPSBkZXYtPmNsYXNzID4+IDg7CisJaW50IGNsYXNzID0gZGV2LT5jbGFzcyA+ PiA4OwogCS8qIFdoZW4gY29uZmlndXJlZCBhcyBhZ2VudCwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNl ID0gMSAqLwogCWludCBwcm9nX2lmID0gZGV2LT5jbGFzcyAmIDB4ZjsKKwlzdHJ1Y3QgcmVzb3Vy Y2UgKnI7CiAKIAlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQyB8fAog CSAgICAgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9PVEhFUikgJiYKIAkJKGRldi0+aGRyX3R5 cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCkgJiYKIAkJKHByb2dfaWYgPT0gMCkgJiYKIAkJ KGRldi0+YnVzLT5wYXJlbnQgPT0gTlVMTCkpIHsKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9D T1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJ CWRldi0+cmVzb3VyY2VbaV0uZW5kID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAw OworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcikgeworCQkJci0+c3RhcnQgPSAw OworCQkJci0+ZW5kID0gMDsKKwkJCXItPmZsYWdzID0gMDsKIAkJfQogCX0KIH0KZGlmZiAtLWdp dCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRm b3Jtcy80eHgvcGNpLmMKaW5kZXggY2E1ZGQ3YTU4NDJhLi4wN2RjYzJiODAwN2YgMTAwNjQ0Ci0t LSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9w bGF0Zm9ybXMvNHh4L3BjaS5jCkBAIC01Nyw3ICs1Nyw3IEBAIHN0YXRpYyBpbmxpbmUgaW50IHBw YzQ0MHNwZV9yZXZBKHZvaWQpCiBzdGF0aWMgdm9pZCBmaXh1cF9wcGM0eHhfcGNpX2JyaWRnZShz dHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlp bnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKIAlpZiAoZGV2LT5kZXZmbiAhPSAwIHx8IGRl di0+YnVzLT5zZWxmICE9IE5VTEwpCiAJCXJldHVybjsKQEAgLTc5LDkgKzc5LDkgQEAgc3RhdGlj IHZvaWQgZml4dXBfcHBjNHh4X3BjaV9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIAkvKiBI aWRlIHRoZSBQQ0kgaG9zdCBCQVJzIGZyb20gdGhlIGtlcm5lbCBhcyB0aGVpciBjb250ZW50IGRv ZXNuJ3QKIAkgKiBmaXQgd2VsbCBpbiB0aGUgcmVzb3VyY2UgbWFuYWdlbWVudAogCSAqLwotCWZv ciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlkZXYtPnJlc291 cmNlW2ldLnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOwotCQlkZXYtPnJlc291cmNl W2ldLmZsYWdzID0gMDsKKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcikgeworCQly LT5zdGFydCA9IHItPmVuZCA9IDA7CisJCXItPmZsYWdzID0gMDsKIAl9CiAKIAlwcmludGsoS0VS Tl9JTkZPICJQQ0k6IEhpZGluZyA0eHggaG9zdCBicmlkZ2UgcmVzb3VyY2VzICVzXG4iLApkaWZm IC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMgYi9hcmNo L3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYwppbmRleCA4NTllMjgxOGM0M2Qu LjBjYTQ0MDFiYTc4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21w YzUyeHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNp LmMKQEAgLTMyNywxNCArMzI3LDEzIEBAIG1wYzUyeHhfcGNpX3NldHVwKHN0cnVjdCBwY2lfY29u dHJvbGxlciAqaG9zZSwKIHN0YXRpYyB2b2lkCiBtcGM1Mnh4X3BjaV9maXh1cF9yZXNvdXJjZXMo c3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsK IAogCXByX2RlYnVnKCIlcygpICUuNHg6JS40eFxuIiwgX19mdW5jX18sIGRldi0+dmVuZG9yLCBk ZXYtPmRldmljZSk7CiAKIAkvKiBXZSBkb24ndCByZWx5IG9uIGJvb3QgbG9hZGVyIGZvciBQQ0kg YW5kIHJlc2V0cyBhbGwKIAkgICBkZXZpY2VzICovCi0JZm9yIChpID0gMDsgaSA8IERFVklDRV9D T1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVz b3VyY2VbaV07CisJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHJlcykgewogCQlpZiAo cmVzLT5lbmQgPiByZXMtPnN0YXJ0KSB7CS8qIE9ubHkgdmFsaWQgcmVzb3VyY2VzICovCiAJCQly ZXMtPmVuZCAtPSByZXMtPnN0YXJ0OwogCQkJcmVzLT5zdGFydCA9IDA7CmRpZmYgLS1naXQgYS9h cmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZv cm1zL3BzZXJpZXMvcGNpLmMKaW5kZXggNjBlMGE1ODkyOGVmLi4xNzcyYWUzZDE5M2QgMTAwNjQ0 Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bv d2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKQEAgLTI0MCw3ICsyNDAsNyBAQCB2b2lkIF9f aW5pdCBwU2VyaWVzX2ZpbmFsX2ZpeHVwKHZvaWQpCiAgKi8KIHN0YXRpYyB2b2lkIGZpeHVwX3dp bmJvbmRfODJjMTA1KHN0cnVjdCBwY2lfZGV2KiBkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJl c291cmNlICpyOwogCXVuc2lnbmVkIGludCByZWc7CiAKIAlpZiAoIW1hY2hpbmVfaXMocHNlcmll cykpCkBAIC0yNTEsMTQgKzI1MSwxNCBAQCBzdGF0aWMgdm9pZCBmaXh1cF93aW5ib25kXzgyYzEw NShzdHJ1Y3QgcGNpX2RldiogZGV2KQogCS8qIEVuYWJsZSBMRUdJUlEgdG8gdXNlIElOVEMgaW5z dGVhZCBvZiBJU0EgaW50ZXJydXB0cyAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAw eDQwLCByZWcgfCAoMTw8MTEpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVT T1VSQ0U7ICsraSkgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByKSB7CiAJCS8q IHphcCB0aGUgMm5kIGZ1bmN0aW9uIG9mIHRoZSB3aW5ib25kIGNoaXAgKi8KLQkJaWYgKGRldi0+ cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX0lPCi0JCSAgICAmJiBkZXYtPmJ1cy0+bnVt YmVyID09IDAgJiYgZGV2LT5kZXZmbiA9PSAweDgxKQotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFn cyAmPSB+SU9SRVNPVVJDRV9JTzsKLQkJaWYgKGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPT0gMCAm JiBkZXYtPnJlc291cmNlW2ldLmVuZCkgewotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7 Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7CisJCWlmIChkZXYtPmJ1cy0+bnVtYmVyID09 IDAgJiYgZGV2LT5kZXZmbiA9PSAweDgxICYmCisJCSAgICByLT5mbGFncyAmIElPUkVTT1VSQ0Vf SU8pCisJCQlyLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9JTzsKKwkJaWYgKHItPnN0YXJ0ID09IDAg JiYgci0+ZW5kKSB7CisJCQlyLT5mbGFncyA9IDA7CisJCQlyLT5lbmQgPSAwOwogCQl9CiAJfQog fQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jIGIvYXJjaC9z aC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jCmluZGV4IGIwYzJhNTIzOGQwNC4uNGY1ZTQ5ZjEw ODA1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKKysrIGIv YXJjaC9zaC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jCkBAIC0xNDAsMTIgKzE0MCwxMiBAQCBz dGF0aWMgdm9pZCBzaDc3ODZfcGNpX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiAJICogUHJl dmVudCBlbnVtZXJhdGlvbiBvZiByb290IGNvbXBsZXggcmVzb3VyY2VzLgogCSAqLwogCWlmIChw Y2lfaXNfcm9vdF9idXMoZGV2LT5idXMpICYmIGRldi0+ZGV2Zm4gPT0gMCkgewotCQlpbnQgaTsK KwkJc3RydWN0IHJlc291cmNlICpyOwogCi0JCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRf UkVTT1VSQ0U7IGkrKykgewotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydAk9IDA7Ci0JCQlkZXYt PnJlc291cmNlW2ldLmVuZAk9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzCT0gMDsKKwkJ cGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIpIHsKKwkJCXItPnN0YXJ0CT0gMDsKKwkJ CXItPmVuZAkJPSAwOworCQkJci0+ZmxhZ3MJPSAwOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEv YXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNp LmMKaW5kZXggZTVlNWZmNmI5YTVjLi5iNjY2M2EzZmJhZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3Bh cmMva2VybmVsL2xlb25fcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpA QCAtNjIsMTUgKzYyLDE0IEBAIHZvaWQgbGVvbl9wY2lfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpvZmRldiwgc3RydWN0IGxlb25fcGNpX2luZm8gKmluZm8pCiAKIGludCBwY2liaW9zX2Vu YWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCiB7CisJc3RydWN0IHJl c291cmNlICpyZXM7CiAJdTE2IGNtZCwgb2xkY21kOwogCWludCBpOwogCiAJcGNpX3JlYWRfY29u ZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkY21kID0gY21kOwogCi0JZm9y IChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNl ICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2Uo ZGV2LCByZXMsIGkpIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwog CQlpZiAoIShtYXNrICYgKDE8PGkpKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9z cGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCBjYjFlZjI1 MTE2ZTkuLmE5NDhhNDk4MTdjNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMK KysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKQEAgLTY2MywxMSArNjYzLDEwIEBAIHN0YXRp YyB2b2lkIHBjaV9jbGFpbV9idXNfcmVzb3VyY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCiAJc3Ry dWN0IHBjaV9kZXYgKmRldjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZp Y2VzLCBidXNfbGlzdCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJCWludCBpOwogCi0JCWZv ciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3Vy Y2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNl KGRldiwgciwgaSkgewogCQkJaWYgKHItPnBhcmVudCB8fCAhci0+c3RhcnQgfHwgIXItPmZsYWdz KQogCQkJCWNvbnRpbnVlOwogCkBAIC03MjQsMTUgKzcyMywxNCBAQCBzdHJ1Y3QgcGNpX2J1cyAq cGNpX3NjYW5fb25lX3BibShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCiAKIGludCBwY2liaW9z X2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCiB7CisJc3RydWN0 IHJlc291cmNlICpyZXM7CiAJdTE2IGNtZCwgb2xkY21kOwogCWludCBpOwogCiAJcGNpX3JlYWRf Y29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkY21kID0gY21kOwogCi0J Zm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291 cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByZXMsIGkpIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAq LwogCQlpZiAoIShtYXNrICYgKDE8PGkpKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJj aC9zcGFyYy9rZXJuZWwvcGNpYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCmluZGV4IGVl NGM5YTlhMTcxYy4uMjVmZTBhMDYxNzMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9w Y2ljLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCkBAIC02NDMsMTUgKzY0MywxNCBA QCB2b2lkIHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiAKIGludCBwY2li aW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCiB7CisJc3Ry dWN0IHJlc291cmNlICpyZXM7CiAJdTE2IGNtZCwgb2xkY21kOwogCWludCBpOwogCiAJcGNpX3Jl YWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkY21kID0gY21kOwog Ci0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJl c291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZfZm9yX2VhY2hfcmVz b3VyY2UoZGV2LCByZXMsIGkpIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVm ZiAqLwogCQlpZiAoIShtYXNrICYgKDE8PGkpKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9wY2kvcmVtb3ZlLmMgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwppbmRleCAwMTQ1YWVm MWI5MzAuLmMwNDllZGRjMWUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMKKysr IGIvZHJpdmVycy9wY2kvcmVtb3ZlLmMKQEAgLTUsMTAgKzUsOSBAQAogCiBzdGF0aWMgdm9pZCBw Y2lfZnJlZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKKwlzdHJ1 Y3QgcmVzb3VyY2UgKnJlczsKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsg aSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gZGV2LT5yZXNvdXJjZSArIGk7CisJcGNp X2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHJlcykgewogCQlpZiAocmVzLT5wYXJlbnQpCiAJ CQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0 dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjNjkwNTcyYjEwY2UuLjAy N2I5ODVkZDFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJp dmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTEyNCwyMCArMTI0LDE3IEBAIHN0YXRpYyByZXNvdXJj ZV9zaXplX3QgZ2V0X3Jlc19hZGRfYWxpZ24oc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKIAlyZXR1 cm4gZGV2X3JlcyA/IGRldl9yZXMtPm1pbl9hbGlnbiA6IDA7CiB9CiAKLQogLyogU29ydCByZXNv dXJjZXMgYnkgYWxpZ25tZW50ICovCiBzdGF0aWMgdm9pZCBwZGV2X3NvcnRfcmVzb3VyY2VzKHN0 cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CisJc3RydWN0IHJl c291cmNlICpyOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VT OyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyOworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByLCBpKSB7CiAJCXN0cnVjdCBwY2lfZGV2X3Jlc291cmNlICpkZXZfcmVzLCAqdG1w OwogCQlyZXNvdXJjZV9zaXplX3Qgcl9hbGlnbjsKIAkJc3RydWN0IGxpc3RfaGVhZCAqbjsKIAot CQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KIAkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9Q Q0lfRklYRUQpCiAJCQljb250aW51ZTsKIApAQCAtODk1LDEwICs4OTIsOSBAQCBzdGF0aWMgdm9p ZCBwYnVzX3NpemVfaW8oc3RydWN0IHBjaV9idXMgKmJ1cywgcmVzb3VyY2Vfc2l6ZV90IG1pbl9z aXplLAogCiAJbWluX2FsaWduID0gd2luZG93X2FsaWdubWVudChidXMsIElPUkVTT1VSQ0VfSU8p OwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewot CQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCi0JCWZvciAoaSA9IDA7IGkgPCBQQ0lf TlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNv dXJjZVtpXTsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIpIHsKIAkJCXVuc2ln bmVkIGxvbmcgcl9zaXplOwogCiAJCQlpZiAoci0+cGFyZW50IHx8ICEoci0+ZmxhZ3MgJiBJT1JF U09VUkNFX0lPKSkKQEAgLTEwMTQsMTAgKzEwMTAsMTAgQEAgc3RhdGljIGludCBwYnVzX3NpemVf bWVtKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGxvbmcgbWFzaywKIAlzaXplID0gMDsK IAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewor CQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBQQ0lf TlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNv dXJjZVtpXTsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIsIGkpIHsKIAkJCXJl c291cmNlX3NpemVfdCByX3NpemU7CiAKIAkJCWlmIChyLT5wYXJlbnQgfHwgKHItPmZsYWdzICYg SU9SRVNPVVJDRV9QQ0lfRklYRUQpIHx8CkBAIC0xMzU4LDExICsxMzU0LDEwIEBAIHN0YXRpYyB2 b2lkIGFzc2lnbl9maXhlZF9yZXNvdXJjZV9vbl9idXMoc3RydWN0IHBjaV9idXMgKmIsIHN0cnVj dCByZXNvdXJjZSAqcikKICAqLwogc3RhdGljIHZvaWQgcGRldl9hc3NpZ25fZml4ZWRfcmVzb3Vy Y2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJlc291cmNlICpy OwogCi0JZm9yIChpID0gMDsgaSA8ICBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJcGNpX2Rl dl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIpIHsKIAkJc3RydWN0IHBjaV9idXMgKmI7Ci0JCXN0 cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwogCiAJCWlmIChyLT5wYXJlbnQg fHwgIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfUENJX0ZJWEVEKSB8fAogCQkgICAgIShyLT5mbGFn cyAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKSkKQEAgLTE3OTUsMTEgKzE3OTAs OSBAQCBzdGF0aWMgdm9pZCByZW1vdmVfZGV2X3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2 LCBzdHJ1Y3QgcmVzb3VyY2UgKmlvLAogCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKm1taW8sCiAJCQkJ IHN0cnVjdCByZXNvdXJjZSAqbW1pb19wcmVmKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsg aSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSAm ZGV2LT5yZXNvdXJjZVtpXTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAorCXBjaV9kZXZfZm9y X2VhY2hfcmVzb3VyY2UoZGV2LCByZXMpIHsKIAkJaWYgKHJlc291cmNlX3R5cGUocmVzKSA9PSBJ T1JFU09VUkNFX0lPKSB7CiAJCQlyZW1vdmVfZGV2X3Jlc291cmNlKGlvLCBkZXYsIHJlcyk7CiAJ CX0gZWxzZSBpZiAocmVzb3VyY2VfdHlwZShyZXMpID09IElPUkVTT1VSQ0VfTUVNKSB7CmRpZmYg LS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5j CmluZGV4IGI0OTJlNjdjM2Q4Ny4uOTY3ZjlhNzU4OTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bj aS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAtNDg0LDEyICs0 ODQsMTAgQEAgaW50IHBjaV9lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlu dCBtYXNrKQogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwog CW9sZF9jbWQgPSBjbWQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkr KykgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCWlmICghKG1h c2sgJiAoMSA8PCBpKSkpCiAJCQljb250aW51ZTsKIAotCQlyID0gJmRldi0+cmVzb3VyY2VbaV07 Ci0KIAkJaWYgKCEoci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkp CiAJCQljb250aW51ZTsKIAkJaWYgKChpID09IFBDSV9ST01fUkVTT1VSQ0UpICYmCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3BjaS92Z2FhcmIuYyBiL2RyaXZlcnMvcGNpL3ZnYWFyYi5jCmluZGV4IGY4 MGI2ZWM4OGRjMy4uNWE2OTYwNzhiMzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS92Z2FhcmIu YworKysgYi9kcml2ZXJzL3BjaS92Z2FhcmIuYwpAQCAtNTQ4LDEwICs1NDgsOCBAQCBzdGF0aWMg Ym9vbCB2Z2FfaXNfZmlybXdhcmVfZGVmYXVsdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKICNpZiBk ZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCiAJdTY0IGJhc2UgPSBz Y3JlZW5faW5mby5sZmJfYmFzZTsKIAl1NjQgc2l6ZSA9IHNjcmVlbl9pbmZvLmxmYl9zaXplOwor CXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1NjQgbGltaXQ7Ci0JcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0 LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKIAogCS8qIFNlbGVjdCB0aGUg ZGV2aWNlIG93bmluZyB0aGUgYm9vdCBmcmFtZWJ1ZmZlciBpZiB0aGVyZSBpcyBvbmUgKi8KIApA QCAtNTYxLDE5ICs1NTksMTQgQEAgc3RhdGljIGJvb2wgdmdhX2lzX2Zpcm13YXJlX2RlZmF1bHQo c3RydWN0IHBjaV9kZXYgKnBkZXYpCiAJbGltaXQgPSBiYXNlICsgc2l6ZTsKIAogCS8qIERvZXMg ZmlybXdhcmUgZnJhbWVidWZmZXIgYmVsb25nIHRvIHVzPyAqLwotCWZvciAoaSA9IDA7IGkgPCBE RVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFn cyhwZGV2LCBpKTsKLQotCQlpZiAoKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09IDApCisJcGNp X2Rldl9mb3JfZWFjaF9yZXNvdXJjZShwZGV2LCByKSB7CisJCWlmIChyZXNvdXJjZV90eXBlKHIp ICE9IElPUkVTT1VSQ0VfTUVNKQogCQkJY29udGludWU7CiAKLQkJc3RhcnQgPSBwY2lfcmVzb3Vy Y2Vfc3RhcnQocGRldiwgaSk7Ci0JCWVuZCAgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIGkpOwot Ci0JCWlmICghc3RhcnQgfHwgIWVuZCkKKwkJaWYgKCFyLT5zdGFydCB8fCAhci0+ZW5kKQogCQkJ Y29udGludWU7CiAKLQkJaWYgKGJhc2UgPCBzdGFydCB8fCBsaW1pdCA+PSBlbmQpCisJCWlmIChi YXNlIDwgci0+c3RhcnQgfHwgbGltaXQgPj0gci0+ZW5kKQogCQkJY29udGludWU7CiAKIAkJcmV0 dXJuIHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS94ZW4tcGNpZnJvbnQuYyBiL2RyaXZl cnMvcGNpL3hlbi1wY2lmcm9udC5jCmluZGV4IGZjZDAyOWNhMmViMS4uODNjMGFiNTA2NzZkIDEw MDY0NAotLS0gYS9kcml2ZXJzL3BjaS94ZW4tcGNpZnJvbnQuYworKysgYi9kcml2ZXJzL3BjaS94 ZW4tcGNpZnJvbnQuYwpAQCAtMzkwLDkgKzM5MCw3IEBAIHN0YXRpYyBpbnQgcGNpZnJvbnRfY2xh aW1fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqZGF0YSkKIAlpbnQgaTsKIAlz dHJ1Y3QgcmVzb3VyY2UgKnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7 IGkrKykgewotCQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jl c291cmNlKGRldiwgciwgaSkgewogCQlpZiAoIXItPnBhcmVudCAmJiByLT5zdGFydCAmJiByLT5m bGFncykgewogCQkJZGV2X2luZm8oJnBkZXYtPnhkZXYtPmRldiwgImNsYWltaW5nIHJlc291cmNl ICVzLyVkXG4iLAogCQkJCXBjaV9uYW1lKGRldiksIGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9w bnAvcXVpcmtzLmMgYi9kcml2ZXJzL3BucC9xdWlya3MuYwppbmRleCBhYzk4Yjk5MTkwMjkuLjYw ODVhMTQ3MWRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcXVpcmtzLmMKKysrIGIvZHJpdmVy cy9wbnAvcXVpcmtzLmMKQEAgLTIyOSw4ICsyMjksNyBAQCBzdGF0aWMgdm9pZCBxdWlya19hZDE4 MTVfbXB1X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQogc3RhdGljIHZvaWQgcXVpcmtf c3lzdGVtX3BjaV9yZXNvdXJjZXMoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNp X2RldiAqcGRldiA9IE5VTEw7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JcmVzb3VyY2Vfc2l6 ZV90IHBucF9zdGFydCwgcG5wX2VuZCwgcGNpX3N0YXJ0LCBwY2lfZW5kOworCXN0cnVjdCByZXNv dXJjZSAqcmVzLCAqcjsKIAlpbnQgaSwgajsKIAogCS8qCkBAIC0yNDMsMzIgKzI0MiwyNiBAQCBz dGF0aWMgdm9pZCBxdWlya19zeXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2 KQogCSAqIHNvIHRoZXkgd29uJ3QgYmUgY2xhaW1lZCBieSB0aGUgUE5QIHN5c3RlbSBkcml2ZXIu CiAJICovCiAJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBERVZJ Q0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdHlwZTsK KwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShwZGV2LCByLCBpKSB7CisJCQl1bnNpZ25lZCBs b25nIHR5cGUgPSByZXNvdXJjZV90eXBlKHIpOwogCi0JCQlmbGFncyA9IHBjaV9yZXNvdXJjZV9m bGFncyhwZGV2LCBpKTsKLQkJCXR5cGUgPSBmbGFncyAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNP VVJDRV9NRU0pOwotCQkJaWYgKCF0eXBlIHx8IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0g MCkKKwkJCWlmICghKHR5cGUgPT0gSU9SRVNPVVJDRV9JTyB8fCB0eXBlID09IElPUkVTT1VSQ0Vf TUVNKSB8fAorCQkJICAgIHJlc291cmNlX3NpemUocikgPT0gMCkKIAkJCQljb250aW51ZTsKIAot CQkJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKKwkJCWlmIChyLT5mbGFncyAmIElPUkVT T1VSQ0VfVU5TRVQpCiAJCQkJY29udGludWU7CiAKLQkJCXBjaV9zdGFydCA9IHBjaV9yZXNvdXJj ZV9zdGFydChwZGV2LCBpKTsKLQkJCXBjaV9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIGkp OwogCQkJZm9yIChqID0gMDsKIAkJCSAgICAgKHJlcyA9IHBucF9nZXRfcmVzb3VyY2UoZGV2LCB0 eXBlLCBqKSk7IGorKykgewogCQkJCWlmIChyZXMtPnN0YXJ0ID09IDAgJiYgcmVzLT5lbmQgPT0g MCkKIAkJCQkJY29udGludWU7CiAKLQkJCQlwbnBfc3RhcnQgPSByZXMtPnN0YXJ0OwotCQkJCXBu cF9lbmQgPSByZXMtPmVuZDsKLQogCQkJCS8qCiAJCQkJICogSWYgdGhlIFBOUCByZWdpb24gZG9l c24ndCBvdmVybGFwIHRoZSBQQ0kKIAkJCQkgKiByZWdpb24gYXQgYWxsLCB0aGVyZSdzIG5vIHBy b2JsZW0uCiAJCQkJICovCi0JCQkJaWYgKHBucF9lbmQgPCBwY2lfc3RhcnQgfHwgcG5wX3N0YXJ0 ID4gcGNpX2VuZCkKKwkJCQlpZiAoIXJlc291cmNlX292ZXJsYXBzKHJlcywgcikpCiAJCQkJCWNv bnRpbnVlOwogCiAJCQkJLyoKQEAgLTI3OCw4ICsyNzEsNyBAQCBzdGF0aWMgdm9pZCBxdWlya19z eXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQogCQkJCSAqIFBOUCBkZXZp Y2UgZGVzY3JpYmVzIGEgYnJpZGdlIHdpdGggUENJCiAJCQkJICogYmVoaW5kIGl0LgogCQkJCSAq LwotCQkJCWlmIChwbnBfc3RhcnQgPD0gcGNpX3N0YXJ0ICYmCi0JCQkJICAgIHBucF9lbmQgPj0g cGNpX2VuZCkKKwkJCQlpZiAocmVzLT5zdGFydCA8PSByLT5zdGFydCAmJiByZXMtPmVuZCA+PSBy LT5lbmQpCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJLyoKQEAgLTI4OCw5ICsyODAsOCBAQCBzdGF0 aWMgdm9pZCBxdWlya19zeXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQog CQkJCSAqIGRyaXZlciBmcm9tIHJlcXVlc3RpbmcgaXRzIHJlc291cmNlcy4KIAkJCQkgKi8KIAkJ CQlkZXZfd2FybigmZGV2LT5kZXYsCi0JCQkJCSAiZGlzYWJsaW5nICVwUiBiZWNhdXNlIGl0IG92 ZXJsYXBzICIKLQkJCQkJICIlcyBCQVIgJWQgJXBSXG4iLCByZXMsCi0JCQkJCSBwY2lfbmFtZShw ZGV2KSwgaSwgJnBkZXYtPnJlc291cmNlW2ldKTsKKwkJCQkJICJkaXNhYmxpbmcgJXBSIGJlY2F1 c2UgaXQgb3ZlcmxhcHMgJXMgQkFSICVkICVwUlxuIiwKKwkJCQkJIHJlcywgcGNpX25hbWUocGRl diksIGksIHIpOwogCQkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKIAkJCX0K IAkJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNp LmgKaW5kZXggYWVhYTk1NDU1ZDRjLi41Y2FjZDllNGM4Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUv bGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMjYsNiArMjYsNyBAQAog CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9h cmdzLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+ CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CkBAIC0yMDAzLDYgKzIwMDQsMjAgQEAgaW50IHBj aV9pb2Jhcl9wZm4oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIHN0cnVjdCB2bV9hcmVh X3N0cnVjdCAqdm1hKTsKIAkocGNpX3Jlc291cmNlX2VuZCgoZGV2KSwgKGJhcikpID8gCQkJCVwK IAkgcmVzb3VyY2Vfc2l6ZShwY2lfcmVzb3VyY2VfbigoZGV2KSwgKGJhcikpKSA6IDApCiAKKyNk ZWZpbmUgX19wY2lfZGV2X2Zvcl9lYWNoX3JlczAoZGV2LCByZXMsIC4uLikJCQkJXAorCWZvciAo dW5zaWduZWQgaW50IF9fYiA9IDA7CQkJCQlcCisJICAgICByZXMgPSBwY2lfcmVzb3VyY2Vfbihk ZXYsIF9fYiksIF9fYiA8IFBDSV9OVU1fUkVTT1VSQ0VTOwlcCisJICAgICBfX2IrKykKKworI2Rl ZmluZSBfX3BjaV9kZXZfZm9yX2VhY2hfcmVzMShkZXYsIHJlcywgX19iKQkJCQlcCisJZm9yIChf X2IgPSAwOwkJCQkJCQlcCisJICAgICByZXMgPSBwY2lfcmVzb3VyY2VfbihkZXYsIF9fYiksIF9f YiA8IFBDSV9OVU1fUkVTT1VSQ0VTOwlcCisJICAgICBfX2IrKykKKworI2RlZmluZSBwY2lfZGV2 X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcmVzLCAuLi4pCQkJXAorCUNPTkNBVEVOQVRFKF9fcGNp X2Rldl9mb3JfZWFjaF9yZXMsIENPVU5UX0FSR1MoX19WQV9BUkdTX18pKSAJXAorCQkgICAgKGRl diwgcmVzLCBfX1ZBX0FSR1NfXykKKwogLyoKICAqIFNpbWlsYXIgdG8gdGhlIGhlbHBlcnMgYWJv dmUsIHRoZXNlIG1hbmlwdWxhdGUgcGVyLXBjaV9kZXYKICAqIGRyaXZlci1zcGVjaWZpYyBkYXRh LiAgVGhleSBhcmUgcmVhbGx5IGp1c3QgYSB3cmFwcGVyIGFyb3VuZAotLSAKMi40MC4wLjEuZ2Fh ODk0NjIxN2EwYgoK 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 182BFC77B74 for ; Thu, 30 Mar 2023 16:28:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231630AbjC3Q2j (ORCPT ); Thu, 30 Mar 2023 12:28:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60336 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231716AbjC3Q2g (ORCPT ); Thu, 30 Mar 2023 12:28:36 -0400 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B00EFC676; Thu, 30 Mar 2023 09:28:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1680193711; x=1711729711; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=KHCoRXEtiwe/FhEOF5L3Qq5P3Xpu9j6hzV2s/by6feA=; b=TLdWjYGoOZmNuVgwOFxDmbNsEhuboLOP9EpUBYr49DAg+gS23fAogdPb 6Zkb9M9JSKJjW6EYda1Rh5S4+ZHmThuQ2B0AyAyGqrhvPNHHfI3cwlPpn cFU5wzCCuyiBxZ5Wl+GQ1jvJOtl5nB2ob0/Q1CexCV6WRdD0A9l4ahnHV X135BDUQeOGHa+ZP3Nc3MCR//KFrHUhgFUjkrgFCQmTB4c5GBYqkTkwfp l2EOEXbKfxujTmOUeMXTcCgvzfZiBHCje2RiIhSruWAnY5RSxdu7IqiSN AHO7FG6WtkV6xSlX9ylIlti7nZYFesmkCMKRasssrJyvHz1MrHxyKtTSr g==; X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="427496027" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="427496027" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2023 09:28:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="858971551" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="858971551" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga005.jf.intel.com with ESMTP; 30 Mar 2023 09:28:19 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 924B4211; Thu, 30 Mar 2023 19:24:50 +0300 (EEST) From: Andy Shevchenko To: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Andy Shevchenko , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Mika Westerberg , Michael Ellerman , Randy Dunlap , Arnd Bergmann , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , 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 v8 3/7] PCI: Introduce pci_dev_for_each_resource() Date: Thu, 30 Mar 2023 19:24:30 +0300 Message-Id: <20230330162434.35055-4-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230330162434.35055-1-andriy.shevchenko@linux.intel.com> References: <20230330162434.35055-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 | 1 + 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, 112 insertions(+), 132 deletions(-) diff --git a/.clang-format b/.clang-format index d988e9fa9b26..2048b0296d76 100644 --- a/.clang-format +++ b/.clang-format @@ -520,6 +520,7 @@ ForEachMacros: - 'of_property_for_each_string' - 'of_property_for_each_u32' - 'pci_bus_for_each_resource' + - 'pci_dev_for_each_resource' - '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..d334c7fb672b 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(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(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..3044b7e03890 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(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..0ebc909ea273 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(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..3313bc5a63ea 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(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..b0ea023c47c0 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(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..e88d7c9feeec 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(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..07dcc2b8007f 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(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..0ca4401ba781 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(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..1772ae3d193d 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(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..4f5e49f10805 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(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(dev, res) { if (res->parent) release_resource(res); } diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index c690572b10ce..027b985dd1ee 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(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(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(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..5a696078b382 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(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 aeaa95455d4c..5cacd9e4c8cd 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -26,6 +26,7 @@ #include +#include #include #include #include @@ -2003,6 +2004,20 @@ int pci_iobar_pfn(struct pci_dev *pdev, int bar, struct vm_area_struct *vma); (pci_resource_end((dev), (bar)) ? \ resource_size(pci_resource_n((dev), (bar))) : 0) +#define __pci_dev_for_each_res0(dev, res, ...) \ + for (unsigned int __b = 0; \ + res = pci_resource_n(dev, __b), __b < PCI_NUM_RESOURCES; \ + __b++) + +#define __pci_dev_for_each_res1(dev, res, __b) \ + for (__b = 0; \ + res = pci_resource_n(dev, __b), __b < PCI_NUM_RESOURCES; \ + __b++) + +#define pci_dev_for_each_resource(dev, res, ...) \ + CONCATENATE(__pci_dev_for_each_res, COUNT_ARGS(__VA_ARGS__)) \ + (dev, res, __VA_ARGS__) + /* * Similar to the helpers above, these manipulate per-pci_dev * driver-specific data. They are really just a wrapper around -- 2.40.0.1.gaa8946217a0b 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 D76D1C761A6 for ; Thu, 30 Mar 2023 16:31:52 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4PnTTM2CpSz3fR3 for ; Fri, 31 Mar 2023 03:31:51 +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=meD7qi3x; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=linux.intel.com (client-ip=192.55.52.43; helo=mga05.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=meD7qi3x; dkim-atps=neutral Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 4PnTPW6w3rz3fQk for ; Fri, 31 Mar 2023 03:28:31 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1680193712; x=1711729712; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=KHCoRXEtiwe/FhEOF5L3Qq5P3Xpu9j6hzV2s/by6feA=; b=meD7qi3xjfYznSFrKs6ZIg/4hKheS14hWxQocmmLX9Q83Qsd6O20NYZh XWPPPayOU+r09Y0BaeFFkJHv1j3evXxfIZoUYedIKey1wm8uFEfxd2YKt FHP/ePPldmuuoufA9Qg8E8vxf+EQS7wHk+AVkrS9PwekjxQrDD8ZI8pIB JI3zT4gZGzPCaMq0jF+qZU38+0vwuPzSJESuqJ1Vj15mW4lAfZmX5N2xC 4IeNSs1yyfCaPVicc69gU7ea3kUgshztlrbqfqjLHWq6XkN1Net3ZEzcX VBDIKAZdBJc/Yak65RDay0hoZKni259i6GX/N99dwZDXE9JC5cLUNbQyc A==; X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="427496038" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="427496038" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2023 09:28:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="858971551" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="858971551" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga005.jf.intel.com with ESMTP; 30 Mar 2023 09:28:19 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 924B4211; Thu, 30 Mar 2023 19:24:50 +0300 (EEST) From: Andy Shevchenko To: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Andy Shevchenko , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Mika Westerberg , Michael Ellerman , Randy Dunlap , Arnd Bergmann , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , 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 v8 3/7] PCI: Introduce pci_dev_for_each_resource() Date: Thu, 30 Mar 2023 19:24:30 +0300 Message-Id: <20230330162434.35055-4-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230330162434.35055-1-andriy.shevchenko@linux.intel.com> References: <20230330162434.35055-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 | 1 + 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, 112 insertions(+), 132 deletions(-) diff --git a/.clang-format b/.clang-format index d988e9fa9b26..2048b0296d76 100644 --- a/.clang-format +++ b/.clang-format @@ -520,6 +520,7 @@ ForEachMacros: - 'of_property_for_each_string' - 'of_property_for_each_u32' - 'pci_bus_for_each_resource' + - 'pci_dev_for_each_resource' - '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..d334c7fb672b 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(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(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..3044b7e03890 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(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..0ebc909ea273 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(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..3313bc5a63ea 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(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..b0ea023c47c0 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(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..e88d7c9feeec 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(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..07dcc2b8007f 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(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..0ca4401ba781 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(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..1772ae3d193d 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(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..4f5e49f10805 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(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(dev, res) { if (res->parent) release_resource(res); } diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index c690572b10ce..027b985dd1ee 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(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(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(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..5a696078b382 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(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 aeaa95455d4c..5cacd9e4c8cd 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -26,6 +26,7 @@ #include +#include #include #include #include @@ -2003,6 +2004,20 @@ int pci_iobar_pfn(struct pci_dev *pdev, int bar, struct vm_area_struct *vma); (pci_resource_end((dev), (bar)) ? \ resource_size(pci_resource_n((dev), (bar))) : 0) +#define __pci_dev_for_each_res0(dev, res, ...) \ + for (unsigned int __b = 0; \ + res = pci_resource_n(dev, __b), __b < PCI_NUM_RESOURCES; \ + __b++) + +#define __pci_dev_for_each_res1(dev, res, __b) \ + for (__b = 0; \ + res = pci_resource_n(dev, __b), __b < PCI_NUM_RESOURCES; \ + __b++) + +#define pci_dev_for_each_resource(dev, res, ...) \ + CONCATENATE(__pci_dev_for_each_res, COUNT_ARGS(__VA_ARGS__)) \ + (dev, res, __VA_ARGS__) + /* * Similar to the helpers above, these manipulate per-pci_dev * driver-specific data. They are really just a wrapper around -- 2.40.0.1.gaa8946217a0b 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 AACBDC761A6 for ; Thu, 30 Mar 2023 16:29:34 +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=Ohdx3mFWku7oSEJJWXcDcsoeLvNZ7sHhWy78nKTKgPs=; b=aSzZgbwgE7vfVp m/fVNLxUIDWK6xfyO+1Tm5o4WofGLpJTfKDwekKfNcf6FuZOoMXzOkdeDzPSTDbirrXPorThZXW+O RQr7QUvgGRYNtF1wmDoVb7I4V0O5RQvqkplGD38QM9CeEwjUR3ZzLpulsRcAHx7P8qkKMPGTJw/Sk dgEHPCdl8qxNz4sRnM9ZPChUFPrjiUgQjBqhAZY8NgTI5CEXFj/kTwxjp/scq9pSwSeZwJ182N2VR bCEtsrSlugqf+1BLgbJHIO3t1w6NgPg0DtoJeB2bcncEZAPUGadMMPdVZ1rUV8zEZ0WfvL4o2qE0Y VMTtxpPtV06zhBPwlh/A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1phv8g-004Shy-1g; Thu, 30 Mar 2023 16:28:38 +0000 Received: from mga05.intel.com ([192.55.52.43]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1phv8Y-004SZn-2P for linux-arm-kernel@lists.infradead.org; Thu, 30 Mar 2023 16:28:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1680193710; x=1711729710; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=KHCoRXEtiwe/FhEOF5L3Qq5P3Xpu9j6hzV2s/by6feA=; b=EIuKDsZQfWRrDxO5Fb1ABjxZHlsbKHDRKX6ggLs7YU4pCZUDDXrxbYgm KX2N/UGuLMqHBBW1Ft4XdeEZkIlIm7yyruSrTadWP+GZN4dcOXR996dMD Ce28mxzhi8NFEc8rnOBP2F60GkFKa65tgBT31BytJLreu4+AGF/ycE1BX HBqVR9SMhFRExWSZ5usZ7mT7RC7Ok/wgSumwT1owvAeFjDyFGIcOXQQNz OK0XP2msFFJ4AaI8EE6qdmA4nx/+a6Euxx76IydPP0kAhZBYw1lXo6lYC 7ZTybvnA77sq+i1QQEwClMCKIiMLzGvQ0oKMkEOIvG99ZRA8xCZXncEjl g==; X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="427496040" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="427496040" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2023 09:28:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10665"; a="858971551" X-IronPort-AV: E=Sophos;i="5.98,305,1673942400"; d="scan'208";a="858971551" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga005.jf.intel.com with ESMTP; 30 Mar 2023 09:28:19 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 924B4211; Thu, 30 Mar 2023 19:24:50 +0300 (EEST) From: Andy Shevchenko To: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= , Andy Shevchenko , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Mika Westerberg , Michael Ellerman , Randy Dunlap , Arnd Bergmann , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , 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 v8 3/7] PCI: Introduce pci_dev_for_each_resource() Date: Thu, 30 Mar 2023 19:24:30 +0300 Message-Id: <20230330162434.35055-4-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230330162434.35055-1-andriy.shevchenko@linux.intel.com> References: <20230330162434.35055-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-20230330_092830_842542_1B96D90E X-CRM114-Status: GOOD ( 24.93 ) 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 Y29tPgotLS0KIC5jbGFuZy1mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEg KwogYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMgICAgICAgICAgICAgICAgICAgfCAgNSArKy0tCiBh cmNoL2FybS9rZXJuZWwvYmlvczMyLmMgICAgICAgICAgICAgICAgICB8IDE2ICsrKysrKy0tLS0t LS0KIGFyY2gvYXJtL21hY2gtZG92ZS9wY2llLmMgICAgICAgICAgICAgICAgIHwgMTAgKysrKy0t LS0KIGFyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMgICAgICAgICAgICAgIHwgMTAgKysrKy0t LS0KIGFyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYyAgICAgICAgICAgICAgIHwgMTAgKysrKy0t LS0KIGFyY2gvbWlwcy9wY2kvb3BzLWJjbTYzeHguYyAgICAgICAgICAgICAgIHwgIDggKysrLS0t LQogYXJjaC9taXBzL3BjaS9wY2ktbGVnYWN5LmMgICAgICAgICAgICAgICAgfCAgMyArLS0KIGFy Y2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jICAgICAgICAgIHwgMjEgKysrKysrKystLS0t LS0tLQogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvcGNpLmMgICAgICAgICAgfCAgOCArKyst LS0tCiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYyB8ICA1ICsrLS0K IGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYyAgICAgIHwgMTYgKysrKysrLS0t LS0tLQogYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jICAgICAgICAgfCAxMCArKysr LS0tLQogYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYyAgICAgICAgICAgICAgfCAgNSArKy0t CiBhcmNoL3NwYXJjL2tlcm5lbC9wY2kuYyAgICAgICAgICAgICAgICAgICB8IDEwICsrKystLS0t CiBhcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMgICAgICAgICAgICAgICAgICB8ICA1ICsrLS0KIGRy aXZlcnMvcGNpL3JlbW92ZS5jICAgICAgICAgICAgICAgICAgICAgIHwgIDUgKystLQogZHJpdmVy cy9wY2kvc2V0dXAtYnVzLmMgICAgICAgICAgICAgICAgICAgfCAyNyArKysrKysrKy0tLS0tLS0t LS0tLS0KIGRyaXZlcnMvcGNpL3NldHVwLXJlcy5jICAgICAgICAgICAgICAgICAgIHwgIDQgKy0t LQogZHJpdmVycy9wY2kvdmdhYXJiLmMgICAgICAgICAgICAgICAgICAgICAgfCAxNyArKysrLS0t LS0tLS0tCiBkcml2ZXJzL3BjaS94ZW4tcGNpZnJvbnQuYyAgICAgICAgICAgICAgICB8ICA0ICst LS0KIGRyaXZlcnMvcG5wL3F1aXJrcy5jICAgICAgICAgICAgICAgICAgICAgIHwgMjkgKysrKysr KystLS0tLS0tLS0tLS0tLS0KIGluY2x1ZGUvbGludXgvcGNpLmggICAgICAgICAgICAgICAgICAg ICAgIHwgMTUgKysrKysrKysrKysrCiAyMyBmaWxlcyBjaGFuZ2VkLCAxMTIgaW5zZXJ0aW9ucygr KSwgMTMyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmct Zm9ybWF0CmluZGV4IGQ5ODhlOWZhOWIyNi4uMjA0OGIwMjk2ZDc2IDEwMDY0NAotLS0gYS8uY2xh bmctZm9ybWF0CisrKyBiLy5jbGFuZy1mb3JtYXQKQEAgLTUyMCw2ICs1MjAsNyBAQCBGb3JFYWNo TWFjcm9zOgogICAtICdvZl9wcm9wZXJ0eV9mb3JfZWFjaF9zdHJpbmcnCiAgIC0gJ29mX3Byb3Bl cnR5X2Zvcl9lYWNoX3UzMicKICAgLSAncGNpX2J1c19mb3JfZWFjaF9yZXNvdXJjZScKKyAgLSAn cGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZScKICAgLSAncGNpX2RvZV9mb3JfZWFjaF9vZmYnCiAg IC0gJ3BjbF9mb3JfZWFjaF9jaHVuaycKICAgLSAncGNsX2Zvcl9lYWNoX3NlZ21lbnQnCmRpZmYg LS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5j CmluZGV4IDY0ZmJmYjA3NjNiMi4uNDQ1OGViN2Y0NGYwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhh L2tlcm5lbC9wY2kuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYwpAQCAtMjg4LDExICsy ODgsMTAgQEAgcGNpYmlvc19jbGFpbV9vbmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKQogCXN0cnVj dCBwY2lfYnVzICpjaGlsZF9idXM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmItPmRl dmljZXMsIGJ1c19saXN0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcjsKIAkJaW50IGk7CiAKLQkJ Zm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCXN0cnVjdCByZXNv dXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByLCBpKSB7CiAJCQlpZiAoci0+cGFyZW50IHx8ICFyLT5zdGFydCB8fCAhci0+Zmxh Z3MpCiAJCQkJY29udGludWU7CiAJCQlpZiAocGNpX2hhc19mbGFnKFBDSV9QUk9CRV9PTkxZKSB8 fApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVs L2Jpb3MzMi5jCmluZGV4IGU3ZWYyYjViZWE5Yy4uZDMzNGM3ZmI2NzJiIDEwMDY0NAotLS0gYS9h cmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBA IC0xNDIsMTUgKzE0MiwxNSBAQCBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9J RF9XSU5CT05EMiwgUENJX0RFVklDRV9JRF9XSU5CT05EMl84OUM5NDBGLAogICovCiBzdGF0aWMg dm9pZCBwY2lfZml4dXBfZGVjMjEyODUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsK LQogCWlmIChkZXYtPmRldmZuID09IDApIHsKKwkJc3RydWN0IHJlc291cmNlICpyOworCiAJCWRl di0+Y2xhc3MgJj0gMHhmZjsKIAkJZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1Qg PDwgODsKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJCWRl di0+cmVzb3VyY2VbaV0uc3RhcnQgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgICA9IDA7 Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gMDsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNv dXJjZShkZXYsIHIpIHsKKwkJCXItPnN0YXJ0ID0gMDsKKwkJCXItPmVuZCA9IDA7CisJCQlyLT5m bGFncyA9IDA7CiAJCX0KIAl9CiB9CkBAIC0xNjIsMTMgKzE2MiwxMSBAQCBERUNMQVJFX1BDSV9G SVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDXzIxMjg1LCBw Y2lfZml4dXBfZAogc3RhdGljIHZvaWQgcGNpX2ZpeHVwX2lkZV9iYXNlcyhzdHJ1Y3QgcGNpX2Rl diAqZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcjsKLQlpbnQgaTsKIAogCWlmICgoZGV2LT5j bGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCiAJCXJldHVybjsKIAotCWZvciAo aSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCXIgPSBkZXYtPnJlc291cmNl ICsgaTsKKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcikgewogCQlpZiAoKHItPnN0 YXJ0ICYgfjB4ODApID09IDB4Mzc0KSB7CiAJCQlyLT5zdGFydCB8PSAyOwogCQkJci0+ZW5kID0g ci0+c3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jIGIvYXJjaC9h cm0vbWFjaC1kb3ZlL3BjaWUuYwppbmRleCA3NTRjYTM4MWY2MDAuLjMwNDRiN2UwMzg5MCAxMDA2 NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLWRv dmUvcGNpZS5jCkBAIC0xNDIsMTQgKzE0MiwxNCBAQCBzdGF0aWMgc3RydWN0IHBjaV9vcHMgcGNp ZV9vcHMgPSB7CiBzdGF0aWMgdm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikK IHsKIAlpZiAoZGV2LT5idXMtPnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2Zm4gPT0gMCkgewot CQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsK IAkJZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0g MDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ld LnN0YXJ0ID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwotCQkJZGV2LT5yZXNv dXJjZVtpXS5mbGFncyA9IDA7CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByKSB7 CisJCQlyLT5zdGFydCA9IDA7CisJCQlyLT5lbmQgICA9IDA7CisJCQlyLT5mbGFncyA9IDA7CiAJ CX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jIGIvYXJj aC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYwppbmRleCA2MTkwZjUzOGExMjQuLjBlYmM5MDllYTI3 MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2Fy bS9tYWNoLW12Nzh4eDAvcGNpZS5jCkBAIC0xODYsMTQgKzE4NiwxNCBAQCBzdGF0aWMgc3RydWN0 IHBjaV9vcHMgcGNpZV9vcHMgPSB7CiBzdGF0aWMgdm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBj aV9kZXYgKmRldikKIHsKIAlpZiAoZGV2LT5idXMtPnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2 Zm4gPT0gMCkgewotCQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xh c3MgJj0gMHhmZjsKIAkJZGV2LT5jbGFzcyB8PSBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsK LQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYt PnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwot CQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByKSB7CisJCQlyLT5zdGFydCA9IDA7CisJCQlyLT5lbmQgICA9IDA7CisJCQlyLT5m bGFncyA9IDA7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgv cGNpLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKaW5kZXggODg4ZmRjOTA5OWM1Li4z MzEzYmM1YTYzZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYworKysg Yi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKQEAgLTUyMiwxNCArNTIyLDE0IEBAIHN0YXRp YyBpbnQgX19pbml0IHBjaV9zZXR1cChzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpCiBzdGF0aWMg dm9pZCByY19wY2lfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpZiAoZGV2LT5idXMt PnBhcmVudCA9PSBOVUxMICYmIGRldi0+ZGV2Zm4gPT0gMCkgewotCQlpbnQgaTsKKwkJc3RydWN0 IHJlc291cmNlICpyOwogCiAJCWRldi0+Y2xhc3MgJj0gMHhmZjsKIAkJZGV2LT5jbGFzcyB8PSBQ Q0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgODsKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VO VF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJCWRl di0+cmVzb3VyY2VbaV0uZW5kICAgPSAwOwotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7 CisJCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByKSB7CisJCQlyLT5zdGFydAk9IDA7 CisJCQlyLT5lbmQJCT0gMDsKKwkJCXItPmZsYWdzCT0gMDsKIAkJfQogCX0KIH0KZGlmZiAtLWdp dCBhL2FyY2gvbWlwcy9wY2kvb3BzLWJjbTYzeHguYyBiL2FyY2gvbWlwcy9wY2kvb3BzLWJjbTYz eHguYwppbmRleCBkYzZkYzI3NDEyNzIuLmIwZWEwMjNjNDdjMCAxMDA2NDQKLS0tIGEvYXJjaC9t aXBzL3BjaS9vcHMtYmNtNjN4eC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLWJjbTYzeHguYwpA QCAtNDEzLDE4ICs0MTMsMTggQEAgc3RydWN0IHBjaV9vcHMgYmNtNjN4eF9jYl9vcHMgPSB7CiBz dGF0aWMgdm9pZCBiY202M3h4X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RhdGlj IGludCBpb193aW5kb3cgPSAtMTsKLQlpbnQgaSwgZm91bmQsIG5ld19pb193aW5kb3c7CisJaW50 IGZvdW5kLCBuZXdfaW9fd2luZG93OworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1MzIgdmFsOwog CiAJLyogbG9vayBmb3IgYW55IGlvIHJlc291cmNlICovCiAJZm91bmQgPSAwOwotCWZvciAoaSA9 IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlpZiAocGNpX3Jlc291cmNl X2ZsYWdzKGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKSB7CisJcGNpX2Rldl9mb3JfZWFjaF9yZXNv dXJjZShkZXYsIHIpIHsKKwkJaWYgKHJlc291cmNlX3R5cGUocikgPT0gSU9SRVNPVVJDRV9JTykg ewogCQkJZm91bmQgPSAxOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KIAlpZiAoIWZvdW5kKQogCQly ZXR1cm47CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jIGIvYXJjaC9t aXBzL3BjaS9wY2ktbGVnYWN5LmMKaW5kZXggNDY4NzIyYzhhNWM2Li5lYzI1NjdmOGVmZDggMTAw NjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLWxlZ2FjeS5jCisrKyBiL2FyY2gvbWlwcy9wY2kv cGNpLWxlZ2FjeS5jCkBAIC0yNDksMTIgKzI0OSwxMSBAQCBzdGF0aWMgaW50IHBjaWJpb3NfZW5h YmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIAogCXBjaV9yZWFk X2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0J Zm9yIChpZHggPSAwOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKKwlwY2lfZGV2 X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgciwgaWR4KSB7CiAJCS8qIE9ubHkgc2V0IHVwIHRoZSBy ZXF1ZXN0ZWQgc3R1ZmYgKi8KIAkJaWYgKCEobWFzayAmICgxPDxpZHgpKSkKIAkJCWNvbnRpbnVl OwogCi0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwogCQlpZiAoIShyLT5mbGFncyAmIChJT1JF U09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGlkeCA9 PSBQQ0lfUk9NX1JFU09VUkNFKSAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9w Y2ktY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwppbmRleCBkNjdj Zjc5YmY1ZDAuLmU4OGQ3YzlmZWVlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9w Y2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTg4 MCw2ICs4ODAsNyBAQCBpbnQgcGNpYmlvc19yb290X2JyaWRnZV9wcmVwYXJlKHN0cnVjdCBwY2lf aG9zdF9icmlkZ2UgKmJyaWRnZSkKIHN0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXBfcmVzb3VyY2Vz KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0g cGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQg aTsKIAogCWlmICghaG9zZSkgewpAQCAtODkxLDkgKzg5Miw5IEBAIHN0YXRpYyB2b2lkIHBjaWJp b3NfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiAJaWYgKGRldi0+aXNfdmly dGZuKQogCQlyZXR1cm47CiAKLQlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNF OyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgaTsKKwlw Y2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcmVzLCBpKSB7CiAJCXN0cnVjdCBwY2lfYnVz X3JlZ2lvbiByZWc7CisKIAkJaWYgKCFyZXMtPmZsYWdzKQogCQkJY29udGludWU7CiAKQEAgLTE0 NTIsMTEgKzE0NTMsMTAgQEAgdm9pZCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9i dXMgKmJ1cykKIAlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGRfYnVzOwogCiAJbGlzdF9mb3JfZWFjaF9l bnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCXN0cnVjdCByZXNvdXJjZSAq cjsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKysp IHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwotCisJCXBjaV9k ZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCQlpZiAoci0+cGFyZW50IHx8ICFy LT5zdGFydCB8fCAhci0+ZmxhZ3MpCiAJCQkJY29udGludWU7CiAKQEAgLTE3MDUsMTkgKzE3MDUs MjAgQEAgRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc19zY2FuX3BoYik7CiAKIHN0YXRpYyB2b2lk IGZpeHVwX2hpZGVfaG9zdF9yZXNvdXJjZV9mc2woc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlp bnQgaSwgY2xhc3MgPSBkZXYtPmNsYXNzID4+IDg7CisJaW50IGNsYXNzID0gZGV2LT5jbGFzcyA+ PiA4OwogCS8qIFdoZW4gY29uZmlndXJlZCBhcyBhZ2VudCwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNl ID0gMSAqLwogCWludCBwcm9nX2lmID0gZGV2LT5jbGFzcyAmIDB4ZjsKKwlzdHJ1Y3QgcmVzb3Vy Y2UgKnI7CiAKIAlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQyB8fAog CSAgICAgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9PVEhFUikgJiYKIAkJKGRldi0+aGRyX3R5 cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCkgJiYKIAkJKHByb2dfaWYgPT0gMCkgJiYKIAkJ KGRldi0+YnVzLT5wYXJlbnQgPT0gTlVMTCkpIHsKLQkJZm9yIChpID0gMDsgaSA8IERFVklDRV9D T1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKLQkJ CWRldi0+cmVzb3VyY2VbaV0uZW5kID0gMDsKLQkJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAw OworCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcikgeworCQkJci0+c3RhcnQgPSAw OworCQkJci0+ZW5kID0gMDsKKwkJCXItPmZsYWdzID0gMDsKIAkJfQogCX0KIH0KZGlmZiAtLWdp dCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRm b3Jtcy80eHgvcGNpLmMKaW5kZXggY2E1ZGQ3YTU4NDJhLi4wN2RjYzJiODAwN2YgMTAwNjQ0Ci0t LSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9w bGF0Zm9ybXMvNHh4L3BjaS5jCkBAIC01Nyw3ICs1Nyw3IEBAIHN0YXRpYyBpbmxpbmUgaW50IHBw YzQ0MHNwZV9yZXZBKHZvaWQpCiBzdGF0aWMgdm9pZCBmaXh1cF9wcGM0eHhfcGNpX2JyaWRnZShz dHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlp bnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAKIAlpZiAoZGV2LT5kZXZmbiAhPSAwIHx8IGRl di0+YnVzLT5zZWxmICE9IE5VTEwpCiAJCXJldHVybjsKQEAgLTc5LDkgKzc5LDkgQEAgc3RhdGlj IHZvaWQgZml4dXBfcHBjNHh4X3BjaV9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIAkvKiBI aWRlIHRoZSBQQ0kgaG9zdCBCQVJzIGZyb20gdGhlIGtlcm5lbCBhcyB0aGVpciBjb250ZW50IGRv ZXNuJ3QKIAkgKiBmaXQgd2VsbCBpbiB0aGUgcmVzb3VyY2UgbWFuYWdlbWVudAogCSAqLwotCWZv ciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlkZXYtPnJlc291 cmNlW2ldLnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQgPSAwOwotCQlkZXYtPnJlc291cmNl W2ldLmZsYWdzID0gMDsKKwlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcikgeworCQly LT5zdGFydCA9IHItPmVuZCA9IDA7CisJCXItPmZsYWdzID0gMDsKIAl9CiAKIAlwcmludGsoS0VS Tl9JTkZPICJQQ0k6IEhpZGluZyA0eHggaG9zdCBicmlkZ2UgcmVzb3VyY2VzICVzXG4iLApkaWZm IC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMgYi9hcmNo L3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wY2kuYwppbmRleCA4NTllMjgxOGM0M2Qu LjBjYTQ0MDFiYTc4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21w YzUyeHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNp LmMKQEAgLTMyNywxNCArMzI3LDEzIEBAIG1wYzUyeHhfcGNpX3NldHVwKHN0cnVjdCBwY2lfY29u dHJvbGxlciAqaG9zZSwKIHN0YXRpYyB2b2lkCiBtcGM1Mnh4X3BjaV9maXh1cF9yZXNvdXJjZXMo c3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsK IAogCXByX2RlYnVnKCIlcygpICUuNHg6JS40eFxuIiwgX19mdW5jX18sIGRldi0+dmVuZG9yLCBk ZXYtPmRldmljZSk7CiAKIAkvKiBXZSBkb24ndCByZWx5IG9uIGJvb3QgbG9hZGVyIGZvciBQQ0kg YW5kIHJlc2V0cyBhbGwKIAkgICBkZXZpY2VzICovCi0JZm9yIChpID0gMDsgaSA8IERFVklDRV9D T1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVz b3VyY2VbaV07CisJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHJlcykgewogCQlpZiAo cmVzLT5lbmQgPiByZXMtPnN0YXJ0KSB7CS8qIE9ubHkgdmFsaWQgcmVzb3VyY2VzICovCiAJCQly ZXMtPmVuZCAtPSByZXMtPnN0YXJ0OwogCQkJcmVzLT5zdGFydCA9IDA7CmRpZmYgLS1naXQgYS9h cmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZv cm1zL3BzZXJpZXMvcGNpLmMKaW5kZXggNjBlMGE1ODkyOGVmLi4xNzcyYWUzZDE5M2QgMTAwNjQ0 Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bv d2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKQEAgLTI0MCw3ICsyNDAsNyBAQCB2b2lkIF9f aW5pdCBwU2VyaWVzX2ZpbmFsX2ZpeHVwKHZvaWQpCiAgKi8KIHN0YXRpYyB2b2lkIGZpeHVwX3dp bmJvbmRfODJjMTA1KHN0cnVjdCBwY2lfZGV2KiBkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJl c291cmNlICpyOwogCXVuc2lnbmVkIGludCByZWc7CiAKIAlpZiAoIW1hY2hpbmVfaXMocHNlcmll cykpCkBAIC0yNTEsMTQgKzI1MSwxNCBAQCBzdGF0aWMgdm9pZCBmaXh1cF93aW5ib25kXzgyYzEw NShzdHJ1Y3QgcGNpX2RldiogZGV2KQogCS8qIEVuYWJsZSBMRUdJUlEgdG8gdXNlIElOVEMgaW5z dGVhZCBvZiBJU0EgaW50ZXJydXB0cyAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAw eDQwLCByZWcgfCAoMTw8MTEpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVT T1VSQ0U7ICsraSkgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByKSB7CiAJCS8q IHphcCB0aGUgMm5kIGZ1bmN0aW9uIG9mIHRoZSB3aW5ib25kIGNoaXAgKi8KLQkJaWYgKGRldi0+ cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX0lPCi0JCSAgICAmJiBkZXYtPmJ1cy0+bnVt YmVyID09IDAgJiYgZGV2LT5kZXZmbiA9PSAweDgxKQotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFn cyAmPSB+SU9SRVNPVVJDRV9JTzsKLQkJaWYgKGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPT0gMCAm JiBkZXYtPnJlc291cmNlW2ldLmVuZCkgewotCQkJZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7 Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IDA7CisJCWlmIChkZXYtPmJ1cy0+bnVtYmVyID09 IDAgJiYgZGV2LT5kZXZmbiA9PSAweDgxICYmCisJCSAgICByLT5mbGFncyAmIElPUkVTT1VSQ0Vf SU8pCisJCQlyLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9JTzsKKwkJaWYgKHItPnN0YXJ0ID09IDAg JiYgci0+ZW5kKSB7CisJCQlyLT5mbGFncyA9IDA7CisJCQlyLT5lbmQgPSAwOwogCQl9CiAJfQog fQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jIGIvYXJjaC9z aC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jCmluZGV4IGIwYzJhNTIzOGQwNC4uNGY1ZTQ5ZjEw ODA1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKKysrIGIv YXJjaC9zaC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jCkBAIC0xNDAsMTIgKzE0MCwxMiBAQCBz dGF0aWMgdm9pZCBzaDc3ODZfcGNpX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiAJICogUHJl dmVudCBlbnVtZXJhdGlvbiBvZiByb290IGNvbXBsZXggcmVzb3VyY2VzLgogCSAqLwogCWlmIChw Y2lfaXNfcm9vdF9idXMoZGV2LT5idXMpICYmIGRldi0+ZGV2Zm4gPT0gMCkgewotCQlpbnQgaTsK KwkJc3RydWN0IHJlc291cmNlICpyOwogCi0JCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRf UkVTT1VSQ0U7IGkrKykgewotCQkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydAk9IDA7Ci0JCQlkZXYt PnJlc291cmNlW2ldLmVuZAk9IDA7Ci0JCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzCT0gMDsKKwkJ cGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIpIHsKKwkJCXItPnN0YXJ0CT0gMDsKKwkJ CXItPmVuZAkJPSAwOworCQkJci0+ZmxhZ3MJPSAwOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEv YXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNp LmMKaW5kZXggZTVlNWZmNmI5YTVjLi5iNjY2M2EzZmJhZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3Bh cmMva2VybmVsL2xlb25fcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwpA QCAtNjIsMTUgKzYyLDE0IEBAIHZvaWQgbGVvbl9wY2lfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpvZmRldiwgc3RydWN0IGxlb25fcGNpX2luZm8gKmluZm8pCiAKIGludCBwY2liaW9zX2Vu YWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCiB7CisJc3RydWN0IHJl c291cmNlICpyZXM7CiAJdTE2IGNtZCwgb2xkY21kOwogCWludCBpOwogCiAJcGNpX3JlYWRfY29u ZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkY21kID0gY21kOwogCi0JZm9y IChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNl ICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2Uo ZGV2LCByZXMsIGkpIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwog CQlpZiAoIShtYXNrICYgKDE8PGkpKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9z cGFyYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYwppbmRleCBjYjFlZjI1 MTE2ZTkuLmE5NDhhNDk4MTdjNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMK KysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKQEAgLTY2MywxMSArNjYzLDEwIEBAIHN0YXRp YyB2b2lkIHBjaV9jbGFpbV9idXNfcmVzb3VyY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpCiAJc3Ry dWN0IHBjaV9kZXYgKmRldjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZp Y2VzLCBidXNfbGlzdCkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJCWludCBpOwogCi0JCWZv ciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3Vy Y2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCQlwY2lfZGV2X2Zvcl9lYWNoX3Jlc291cmNl KGRldiwgciwgaSkgewogCQkJaWYgKHItPnBhcmVudCB8fCAhci0+c3RhcnQgfHwgIXItPmZsYWdz KQogCQkJCWNvbnRpbnVlOwogCkBAIC03MjQsMTUgKzcyMywxNCBAQCBzdHJ1Y3QgcGNpX2J1cyAq cGNpX3NjYW5fb25lX3BibShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCiAKIGludCBwY2liaW9z X2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCiB7CisJc3RydWN0 IHJlc291cmNlICpyZXM7CiAJdTE2IGNtZCwgb2xkY21kOwogCWludCBpOwogCiAJcGNpX3JlYWRf Y29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkY21kID0gY21kOwogCi0J Zm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291 cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByZXMsIGkpIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAq LwogCQlpZiAoIShtYXNrICYgKDE8PGkpKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJj aC9zcGFyYy9rZXJuZWwvcGNpYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCmluZGV4IGVl NGM5YTlhMTcxYy4uMjVmZTBhMDYxNzMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9w Y2ljLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCkBAIC02NDMsMTUgKzY0MywxNCBA QCB2b2lkIHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCiAKIGludCBwY2li aW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCiB7CisJc3Ry dWN0IHJlc291cmNlICpyZXM7CiAJdTE2IGNtZCwgb2xkY21kOwogCWludCBpOwogCiAJcGNpX3Jl YWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkY21kID0gY21kOwog Ci0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJl c291cmNlICpyZXMgPSAmZGV2LT5yZXNvdXJjZVtpXTsKLQorCXBjaV9kZXZfZm9yX2VhY2hfcmVz b3VyY2UoZGV2LCByZXMsIGkpIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVm ZiAqLwogCQlpZiAoIShtYXNrICYgKDE8PGkpKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9wY2kvcmVtb3ZlLmMgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwppbmRleCAwMTQ1YWVm MWI5MzAuLmMwNDllZGRjMWUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMKKysr IGIvZHJpdmVycy9wY2kvcmVtb3ZlLmMKQEAgLTUsMTAgKzUsOSBAQAogCiBzdGF0aWMgdm9pZCBw Y2lfZnJlZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgaTsKKwlzdHJ1 Y3QgcmVzb3VyY2UgKnJlczsKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsg aSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gZGV2LT5yZXNvdXJjZSArIGk7CisJcGNp X2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHJlcykgewogCQlpZiAocmVzLT5wYXJlbnQpCiAJ CQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0 dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjNjkwNTcyYjEwY2UuLjAy N2I5ODVkZDFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJp dmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTEyNCwyMCArMTI0LDE3IEBAIHN0YXRpYyByZXNvdXJj ZV9zaXplX3QgZ2V0X3Jlc19hZGRfYWxpZ24oc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKIAlyZXR1 cm4gZGV2X3JlcyA/IGRldl9yZXMtPm1pbl9hbGlnbiA6IDA7CiB9CiAKLQogLyogU29ydCByZXNv dXJjZXMgYnkgYWxpZ25tZW50ICovCiBzdGF0aWMgdm9pZCBwZGV2X3NvcnRfcmVzb3VyY2VzKHN0 cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CisJc3RydWN0IHJl c291cmNlICpyOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VT OyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyOworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3Vy Y2UoZGV2LCByLCBpKSB7CiAJCXN0cnVjdCBwY2lfZGV2X3Jlc291cmNlICpkZXZfcmVzLCAqdG1w OwogCQlyZXNvdXJjZV9zaXplX3Qgcl9hbGlnbjsKIAkJc3RydWN0IGxpc3RfaGVhZCAqbjsKIAot CQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KIAkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9Q Q0lfRklYRUQpCiAJCQljb250aW51ZTsKIApAQCAtODk1LDEwICs4OTIsOSBAQCBzdGF0aWMgdm9p ZCBwYnVzX3NpemVfaW8oc3RydWN0IHBjaV9idXMgKmJ1cywgcmVzb3VyY2Vfc2l6ZV90IG1pbl9z aXplLAogCiAJbWluX2FsaWduID0gd2luZG93X2FsaWdubWVudChidXMsIElPUkVTT1VSQ0VfSU8p OwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewot CQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICpyOwogCi0JCWZvciAoaSA9IDA7IGkgPCBQQ0lf TlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNv dXJjZVtpXTsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIpIHsKIAkJCXVuc2ln bmVkIGxvbmcgcl9zaXplOwogCiAJCQlpZiAoci0+cGFyZW50IHx8ICEoci0+ZmxhZ3MgJiBJT1JF U09VUkNFX0lPKSkKQEAgLTEwMTQsMTAgKzEwMTAsMTAgQEAgc3RhdGljIGludCBwYnVzX3NpemVf bWVtKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGxvbmcgbWFzaywKIAlzaXplID0gMDsK IAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewor CQlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBQQ0lf TlVNX1JFU09VUkNFUzsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNv dXJjZVtpXTsKKwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIsIGkpIHsKIAkJCXJl c291cmNlX3NpemVfdCByX3NpemU7CiAKIAkJCWlmIChyLT5wYXJlbnQgfHwgKHItPmZsYWdzICYg SU9SRVNPVVJDRV9QQ0lfRklYRUQpIHx8CkBAIC0xMzU4LDExICsxMzU0LDEwIEBAIHN0YXRpYyB2 b2lkIGFzc2lnbl9maXhlZF9yZXNvdXJjZV9vbl9idXMoc3RydWN0IHBjaV9idXMgKmIsIHN0cnVj dCByZXNvdXJjZSAqcikKICAqLwogc3RhdGljIHZvaWQgcGRldl9hc3NpZ25fZml4ZWRfcmVzb3Vy Y2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IHJlc291cmNlICpy OwogCi0JZm9yIChpID0gMDsgaSA8ICBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJcGNpX2Rl dl9mb3JfZWFjaF9yZXNvdXJjZShkZXYsIHIpIHsKIAkJc3RydWN0IHBjaV9idXMgKmI7Ci0JCXN0 cnVjdCByZXNvdXJjZSAqciA9ICZkZXYtPnJlc291cmNlW2ldOwogCiAJCWlmIChyLT5wYXJlbnQg fHwgIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfUENJX0ZJWEVEKSB8fAogCQkgICAgIShyLT5mbGFn cyAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pKSkKQEAgLTE3OTUsMTEgKzE3OTAs OSBAQCBzdGF0aWMgdm9pZCByZW1vdmVfZGV2X3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2 LCBzdHJ1Y3QgcmVzb3VyY2UgKmlvLAogCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKm1taW8sCiAJCQkJ IHN0cnVjdCByZXNvdXJjZSAqbW1pb19wcmVmKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsg aSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSAm ZGV2LT5yZXNvdXJjZVtpXTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAorCXBjaV9kZXZfZm9y X2VhY2hfcmVzb3VyY2UoZGV2LCByZXMpIHsKIAkJaWYgKHJlc291cmNlX3R5cGUocmVzKSA9PSBJ T1JFU09VUkNFX0lPKSB7CiAJCQlyZW1vdmVfZGV2X3Jlc291cmNlKGlvLCBkZXYsIHJlcyk7CiAJ CX0gZWxzZSBpZiAocmVzb3VyY2VfdHlwZShyZXMpID09IElPUkVTT1VSQ0VfTUVNKSB7CmRpZmYg LS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5j CmluZGV4IGI0OTJlNjdjM2Q4Ny4uOTY3ZjlhNzU4OTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bj aS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAtNDg0LDEyICs0 ODQsMTAgQEAgaW50IHBjaV9lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGlu dCBtYXNrKQogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwog CW9sZF9jbWQgPSBjbWQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkr KykgeworCXBjaV9kZXZfZm9yX2VhY2hfcmVzb3VyY2UoZGV2LCByLCBpKSB7CiAJCWlmICghKG1h c2sgJiAoMSA8PCBpKSkpCiAJCQljb250aW51ZTsKIAotCQlyID0gJmRldi0+cmVzb3VyY2VbaV07 Ci0KIAkJaWYgKCEoci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkp CiAJCQljb250aW51ZTsKIAkJaWYgKChpID09IFBDSV9ST01fUkVTT1VSQ0UpICYmCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3BjaS92Z2FhcmIuYyBiL2RyaXZlcnMvcGNpL3ZnYWFyYi5jCmluZGV4IGY4 MGI2ZWM4OGRjMy4uNWE2OTYwNzhiMzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS92Z2FhcmIu YworKysgYi9kcml2ZXJzL3BjaS92Z2FhcmIuYwpAQCAtNTQ4LDEwICs1NDgsOCBAQCBzdGF0aWMg Ym9vbCB2Z2FfaXNfZmlybXdhcmVfZGVmYXVsdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKICNpZiBk ZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCiAJdTY0IGJhc2UgPSBz Y3JlZW5faW5mby5sZmJfYmFzZTsKIAl1NjQgc2l6ZSA9IHNjcmVlbl9pbmZvLmxmYl9zaXplOwor CXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1NjQgbGltaXQ7Ci0JcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0 LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKIAogCS8qIFNlbGVjdCB0aGUg ZGV2aWNlIG93bmluZyB0aGUgYm9vdCBmcmFtZWJ1ZmZlciBpZiB0aGVyZSBpcyBvbmUgKi8KIApA QCAtNTYxLDE5ICs1NTksMTQgQEAgc3RhdGljIGJvb2wgdmdhX2lzX2Zpcm13YXJlX2RlZmF1bHQo c3RydWN0IHBjaV9kZXYgKnBkZXYpCiAJbGltaXQgPSBiYXNlICsgc2l6ZTsKIAogCS8qIERvZXMg ZmlybXdhcmUgZnJhbWVidWZmZXIgYmVsb25nIHRvIHVzPyAqLwotCWZvciAoaSA9IDA7IGkgPCBE RVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQlmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFn cyhwZGV2LCBpKTsKLQotCQlpZiAoKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pID09IDApCisJcGNp X2Rldl9mb3JfZWFjaF9yZXNvdXJjZShwZGV2LCByKSB7CisJCWlmIChyZXNvdXJjZV90eXBlKHIp ICE9IElPUkVTT1VSQ0VfTUVNKQogCQkJY29udGludWU7CiAKLQkJc3RhcnQgPSBwY2lfcmVzb3Vy Y2Vfc3RhcnQocGRldiwgaSk7Ci0JCWVuZCAgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIGkpOwot Ci0JCWlmICghc3RhcnQgfHwgIWVuZCkKKwkJaWYgKCFyLT5zdGFydCB8fCAhci0+ZW5kKQogCQkJ Y29udGludWU7CiAKLQkJaWYgKGJhc2UgPCBzdGFydCB8fCBsaW1pdCA+PSBlbmQpCisJCWlmIChi YXNlIDwgci0+c3RhcnQgfHwgbGltaXQgPj0gci0+ZW5kKQogCQkJY29udGludWU7CiAKIAkJcmV0 dXJuIHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS94ZW4tcGNpZnJvbnQuYyBiL2RyaXZl cnMvcGNpL3hlbi1wY2lmcm9udC5jCmluZGV4IGZjZDAyOWNhMmViMS4uODNjMGFiNTA2NzZkIDEw MDY0NAotLS0gYS9kcml2ZXJzL3BjaS94ZW4tcGNpZnJvbnQuYworKysgYi9kcml2ZXJzL3BjaS94 ZW4tcGNpZnJvbnQuYwpAQCAtMzkwLDkgKzM5MCw3IEBAIHN0YXRpYyBpbnQgcGNpZnJvbnRfY2xh aW1fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqZGF0YSkKIAlpbnQgaTsKIAlz dHJ1Y3QgcmVzb3VyY2UgKnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7 IGkrKykgewotCQlyID0gJmRldi0+cmVzb3VyY2VbaV07Ci0KKwlwY2lfZGV2X2Zvcl9lYWNoX3Jl c291cmNlKGRldiwgciwgaSkgewogCQlpZiAoIXItPnBhcmVudCAmJiByLT5zdGFydCAmJiByLT5m bGFncykgewogCQkJZGV2X2luZm8oJnBkZXYtPnhkZXYtPmRldiwgImNsYWltaW5nIHJlc291cmNl ICVzLyVkXG4iLAogCQkJCXBjaV9uYW1lKGRldiksIGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9w bnAvcXVpcmtzLmMgYi9kcml2ZXJzL3BucC9xdWlya3MuYwppbmRleCBhYzk4Yjk5MTkwMjkuLjYw ODVhMTQ3MWRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcXVpcmtzLmMKKysrIGIvZHJpdmVy cy9wbnAvcXVpcmtzLmMKQEAgLTIyOSw4ICsyMjksNyBAQCBzdGF0aWMgdm9pZCBxdWlya19hZDE4 MTVfbXB1X3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQogc3RhdGljIHZvaWQgcXVpcmtf c3lzdGVtX3BjaV9yZXNvdXJjZXMoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNp X2RldiAqcGRldiA9IE5VTEw7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JcmVzb3VyY2Vfc2l6 ZV90IHBucF9zdGFydCwgcG5wX2VuZCwgcGNpX3N0YXJ0LCBwY2lfZW5kOworCXN0cnVjdCByZXNv dXJjZSAqcmVzLCAqcjsKIAlpbnQgaSwgajsKIAogCS8qCkBAIC0yNDMsMzIgKzI0MiwyNiBAQCBz dGF0aWMgdm9pZCBxdWlya19zeXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2 KQogCSAqIHNvIHRoZXkgd29uJ3QgYmUgY2xhaW1lZCBieSB0aGUgUE5QIHN5c3RlbSBkcml2ZXIu CiAJICovCiAJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBERVZJ Q0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykgewotCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdHlwZTsK KwkJcGNpX2Rldl9mb3JfZWFjaF9yZXNvdXJjZShwZGV2LCByLCBpKSB7CisJCQl1bnNpZ25lZCBs b25nIHR5cGUgPSByZXNvdXJjZV90eXBlKHIpOwogCi0JCQlmbGFncyA9IHBjaV9yZXNvdXJjZV9m bGFncyhwZGV2LCBpKTsKLQkJCXR5cGUgPSBmbGFncyAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNP VVJDRV9NRU0pOwotCQkJaWYgKCF0eXBlIHx8IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0g MCkKKwkJCWlmICghKHR5cGUgPT0gSU9SRVNPVVJDRV9JTyB8fCB0eXBlID09IElPUkVTT1VSQ0Vf TUVNKSB8fAorCQkJICAgIHJlc291cmNlX3NpemUocikgPT0gMCkKIAkJCQljb250aW51ZTsKIAot CQkJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKKwkJCWlmIChyLT5mbGFncyAmIElPUkVT T1VSQ0VfVU5TRVQpCiAJCQkJY29udGludWU7CiAKLQkJCXBjaV9zdGFydCA9IHBjaV9yZXNvdXJj ZV9zdGFydChwZGV2LCBpKTsKLQkJCXBjaV9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIGkp OwogCQkJZm9yIChqID0gMDsKIAkJCSAgICAgKHJlcyA9IHBucF9nZXRfcmVzb3VyY2UoZGV2LCB0 eXBlLCBqKSk7IGorKykgewogCQkJCWlmIChyZXMtPnN0YXJ0ID09IDAgJiYgcmVzLT5lbmQgPT0g MCkKIAkJCQkJY29udGludWU7CiAKLQkJCQlwbnBfc3RhcnQgPSByZXMtPnN0YXJ0OwotCQkJCXBu cF9lbmQgPSByZXMtPmVuZDsKLQogCQkJCS8qCiAJCQkJICogSWYgdGhlIFBOUCByZWdpb24gZG9l c24ndCBvdmVybGFwIHRoZSBQQ0kKIAkJCQkgKiByZWdpb24gYXQgYWxsLCB0aGVyZSdzIG5vIHBy b2JsZW0uCiAJCQkJICovCi0JCQkJaWYgKHBucF9lbmQgPCBwY2lfc3RhcnQgfHwgcG5wX3N0YXJ0 ID4gcGNpX2VuZCkKKwkJCQlpZiAoIXJlc291cmNlX292ZXJsYXBzKHJlcywgcikpCiAJCQkJCWNv bnRpbnVlOwogCiAJCQkJLyoKQEAgLTI3OCw4ICsyNzEsNyBAQCBzdGF0aWMgdm9pZCBxdWlya19z eXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQogCQkJCSAqIFBOUCBkZXZp Y2UgZGVzY3JpYmVzIGEgYnJpZGdlIHdpdGggUENJCiAJCQkJICogYmVoaW5kIGl0LgogCQkJCSAq LwotCQkJCWlmIChwbnBfc3RhcnQgPD0gcGNpX3N0YXJ0ICYmCi0JCQkJICAgIHBucF9lbmQgPj0g cGNpX2VuZCkKKwkJCQlpZiAocmVzLT5zdGFydCA8PSByLT5zdGFydCAmJiByZXMtPmVuZCA+PSBy LT5lbmQpCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJLyoKQEAgLTI4OCw5ICsyODAsOCBAQCBzdGF0 aWMgdm9pZCBxdWlya19zeXN0ZW1fcGNpX3Jlc291cmNlcyhzdHJ1Y3QgcG5wX2RldiAqZGV2KQog CQkJCSAqIGRyaXZlciBmcm9tIHJlcXVlc3RpbmcgaXRzIHJlc291cmNlcy4KIAkJCQkgKi8KIAkJ CQlkZXZfd2FybigmZGV2LT5kZXYsCi0JCQkJCSAiZGlzYWJsaW5nICVwUiBiZWNhdXNlIGl0IG92 ZXJsYXBzICIKLQkJCQkJICIlcyBCQVIgJWQgJXBSXG4iLCByZXMsCi0JCQkJCSBwY2lfbmFtZShw ZGV2KSwgaSwgJnBkZXYtPnJlc291cmNlW2ldKTsKKwkJCQkJICJkaXNhYmxpbmcgJXBSIGJlY2F1 c2UgaXQgb3ZlcmxhcHMgJXMgQkFSICVkICVwUlxuIiwKKwkJCQkJIHJlcywgcGNpX25hbWUocGRl diksIGksIHIpOwogCQkJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9ESVNBQkxFRDsKIAkJCX0K IAkJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNp LmgKaW5kZXggYWVhYTk1NDU1ZDRjLi41Y2FjZDllNGM4Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUv bGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMjYsNiArMjYsNyBAQAog CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9h cmdzLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+ CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CkBAIC0yMDAzLDYgKzIwMDQsMjAgQEAgaW50IHBj aV9pb2Jhcl9wZm4oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIHN0cnVjdCB2bV9hcmVh X3N0cnVjdCAqdm1hKTsKIAkocGNpX3Jlc291cmNlX2VuZCgoZGV2KSwgKGJhcikpID8gCQkJCVwK IAkgcmVzb3VyY2Vfc2l6ZShwY2lfcmVzb3VyY2VfbigoZGV2KSwgKGJhcikpKSA6IDApCiAKKyNk ZWZpbmUgX19wY2lfZGV2X2Zvcl9lYWNoX3JlczAoZGV2LCByZXMsIC4uLikJCQkJXAorCWZvciAo dW5zaWduZWQgaW50IF9fYiA9IDA7CQkJCQlcCisJICAgICByZXMgPSBwY2lfcmVzb3VyY2Vfbihk ZXYsIF9fYiksIF9fYiA8IFBDSV9OVU1fUkVTT1VSQ0VTOwlcCisJICAgICBfX2IrKykKKworI2Rl ZmluZSBfX3BjaV9kZXZfZm9yX2VhY2hfcmVzMShkZXYsIHJlcywgX19iKQkJCQlcCisJZm9yIChf X2IgPSAwOwkJCQkJCQlcCisJICAgICByZXMgPSBwY2lfcmVzb3VyY2VfbihkZXYsIF9fYiksIF9f YiA8IFBDSV9OVU1fUkVTT1VSQ0VTOwlcCisJICAgICBfX2IrKykKKworI2RlZmluZSBwY2lfZGV2 X2Zvcl9lYWNoX3Jlc291cmNlKGRldiwgcmVzLCAuLi4pCQkJXAorCUNPTkNBVEVOQVRFKF9fcGNp X2Rldl9mb3JfZWFjaF9yZXMsIENPVU5UX0FSR1MoX19WQV9BUkdTX18pKSAJXAorCQkgICAgKGRl diwgcmVzLCBfX1ZBX0FSR1NfXykKKwogLyoKICAqIFNpbWlsYXIgdG8gdGhlIGhlbHBlcnMgYWJv dmUsIHRoZXNlIG1hbmlwdWxhdGUgcGVyLXBjaV9kZXYKICAqIGRyaXZlci1zcGVjaWZpYyBkYXRh LiAgVGhleSBhcmUgcmVhbGx5IGp1c3QgYSB3cmFwcGVyIGFyb3VuZAotLSAKMi40MC4wLjEuZ2Fh ODk0NjIxN2EwYgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK