I2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8aXB4ZS9pby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxpcHhlL2Vpc2EuaD4KCkZJTEVfTElDRU5DRSAoIEdQTDJfT1JfTEFURVIgKTsKCnN0YXRpYyB2b2lkIGVpc2FidXNfcmVtb3ZlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICk7CgovKioKICogUmVzZXQgYW5kIGVuYWJsZS9kaXNhYmxlIGFuIEVJU0EgZGV2aWNlCiAqCiAqIEB2IGVpc2EJCUVJU0EgZGV2aWNlCiAqIEB2IGVuYWJsZWQJCTE9ZW5hYmxlLCAwPWRpc2FibGUKICovCnZvaWQgZWlzYV9kZXZpY2VfZW5hYmxlZCAoIHN0cnVjdCBlaXNhX2RldmljZSAqZWlzYSwgaW50IGVuYWJsZWQgKSB7CgkvKiBTZXQgcmVzZXQgbGluZSBoaWdoIGZvciAxMDAwILVzLiAgU3BlYyBzYXlzIDUwMCC1cywgYnV0CgkgKiB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgYWxsIGNhcmRzLCBzbyB3ZSBhcmUgY29uc2VydmF0aXZlLgoJICovCglvdXRiICggRUlTQV9DTURfUkVTRVQsIGVpc2EtPmlvYWRkciArIEVJU0FfR0xPQkFMX0NPTkZJRyApOwoJdWRlbGF5ICggMTAwMCApOyAvKiBNdXN0IHdhaXQgODAwICovCgoJLyogU2V0IHJlc2V0IGxvdyBhbmQgd3JpdGUgYSAxIHRvIEVOQUJMRS4gIERlbGF5IGFnYWluLCBpbgoJICogY2FzZSB0aGUgY2FyZCB0YWtlcyBhIHdoaWxlIHRvIHdha2UgdXAuCgkgKi8KCW91dGIgKCBlbmFibGVkID8gRUlTQV9DTURfRU5BQkxFIDogMCwKCSAgICAgICBlaXNhLT5pb2FkZHIgKyBFSVNBX0dMT0JBTF9DT05GSUcgKTsKCXVkZWxheSAoIDEwMDAgKTsgLyogTXVzdCB3YWl0IDgwMCAqLwoKCURCRyAoICJFSVNBICVzIGRldmljZSAlMDJ4XG4iLCAoIGVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiICksCgkgICAgICBlaXNhLT5zbG90ICk7Cn0KCi8qKgogKiBQcm9iZSBhbiBFSVNBIGRldmljZQogKgogKiBAdiBlaXNhCQlFSVNBIGRldmljZQogKiBAcmV0IHJjCQlSZXR1cm4gc3RhdHVzIGNvZGUKICoKICogU2VhcmNoZXMgZm9yIGEgZHJpdmVyIGZvciB0aGUgRUlTQSBkZXZpY2UuICBJZiBhIGRyaXZlciBpcyBmb3VuZCwKICogaXRzIHByb2JlKCkgcm91dGluZSBpcyBjYWxsZWQuCiAqLwpzdGF0aWMgaW50IGVpc2FfcHJvYmUgKCBzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVpc2EgKSB7CglzdHJ1Y3QgZWlzYV9kcml2ZXIgKmRyaXZlcjsKCXN0cnVjdCBlaXNhX2RldmljZV9pZCAqaWQ7Cgl1bnNpZ25lZCBpbnQgaTsKCWludCByYzsKCglEQkcgKCAiQWRkaW5nIEVJU0EgZGV2aWNlICUwMnggKCUwNHg6JTA0eCAoXCIlc1wiKSBpbyAleClcbiIsCgkgICAgICBlaXNhLT5zbG90LCBlaXNhLT52ZW5kb3JfaWQsIGVpc2EtPnByb2RfaWQsCgkgICAgICBpc2FfaWRfc3RyaW5nICggZWlzYS0+dmVuZG9yX2lkLCBlaXNhLT5wcm9kX2lkICksIGVpc2EtPmlvYWRkciApOwoKCWZvcl9lYWNoX3RhYmxlX2VudHJ5ICggZHJpdmVyLCBFSVNBX0RSSVZFUlMgKSB7CgkJZm9yICggaSA9IDAgOyBpIDwgZHJpdmVyLT5pZF9jb3VudCA7IGkrKyApIHsKCQkJaWQgPSAmZHJpdmVyLT5pZHNbaV07CgkJCWlmICggaWQtPnZlbmRvcl9pZCAhPSBlaXNhLT52ZW5kb3JfaWQgKQoJCQkJY29udGludWU7CgkJCWlmICggSVNBX1BST0RfSUQgKCBpZC0+cHJvZF9pZCApICE9CgkJCSAgICAgSVNBX1BST0RfSUQgKCBlaXNhLT5wcm9kX2lkICkgKQoJCQkJY29udGludWU7CgkJCWVpc2EtPmRyaXZlciA9IGRyaXZlcjsKCQkJZWlzYS0+ZGV2LmRyaXZlcl9uYW1lID0gaWQtPm5hbWU7CgkJCURCRyAoICIuLi51c2luZyBkcml2ZXIgJXNcbiIsIGVpc2EtPmRldi5kcml2ZXJfbmFtZSApOwoJCQlpZiAoICggcmMgPSBkcml2ZXItPnByb2JlICggZWlzYSwgaWQgKSApICE9IDAgKSB7CgkJCQlEQkcgKCAiLi4uLi4ucHJvYmUgZmFpbGVkXG4iICk7CgkJCQljb250aW51ZTsKCQkJfQoJCQlyZXR1cm4gMDsKCQl9Cgl9CgoJREJHICggIi4uLm5vIGRyaXZlciBmb3VuZFxuIiApOwoJcmV0dXJuIC1FTk9UVFk7Cn0KCi8qKgogKiBSZW1vdmUgYW4gRUlTQSBkZXZpY2UKICoKICogQHYgZWlzYQkJRUlTQSBkZXZpY2UKICovCnN0YXRpYyB2b2lkIGVpc2FfcmVtb3ZlICggc3RydWN0IGVpc2FfZGV2aWNlICplaXNhICkgewoJZWlzYS0+ZHJpdmVyLT5yZW1vdmUgKCBlaXNhICk7CglEQkcgKCAiUmVtb3ZlZCBFSVNBIGRldmljZSAlMDJ4XG4iLCBlaXNhLT5zbG90ICk7Cn0KCi8qKgogKiBQcm9iZSBFSVNBIHJvb3QgYnVzCiAqCiAqIEB2IHJvb3RkZXYJCUVJU0EgYnVzIHJvb3QgZGV2aWNlCiAqCiAqIFNjYW5zIHRoZSBFSVNBIGJ1cyBmb3IgZGV2aWNlcyBhbmQgcmVnaXN0ZXJzIGFsbCBkZXZpY2VzIGl0IGNhbgogKiBmaW5kLgogKi8Kc3RhdGljIGludCBlaXNhYnVzX3Byb2JlICggc3RydWN0IHJvb3RfZGV2aWNlICpyb290ZGV2ICkgewoJc3RydWN0IGVpc2FfZGV2aWNlICplaXNhID0gTlVMTDsKCXVuc2lnbmVkIGludCBzbG90OwoJaW50IHJjOwoKCWZvciAoIHNsb3QgPSBFSVNBX01JTl9TTE9UIDsgc2xvdCA8PSBFSVNBX01BWF9TTE9UIDsgc2xvdCsrICkgewoJCS8qIEFsbG9jYXRlIHN0cnVjdCBlaXNhX2RldmljZSAqLwoJCWlmICggISBlaXNhICkKCQkJZWlzYSA9IG1hbGxvYyAoIHNpemVvZiAoICplaXNhICkgKTsKCQlpZiAoICEgZWlzYSApIHsKCQkJcmMgPSAtRU5PTUVNOwoJCQlnb3RvIGVycjsKCQl9CgkJbWVtc2V0ICggZWlzYSwgMCwgc2l6ZW9mICggKmVpc2EgKSApOwoJCWVpc2EtPnNsb3QgPSBzbG90OwoJCWVpc2EtPmlvYWRkciA9IEVJU0FfU0xPVF9CQVNFICggZWlzYS0+c2xvdCApOwoKCQkvKiBUZXN0IGZvciBib2FyZCBwcmVzZW50ICovCgkJb3V0YiAoIDB4ZmYsIGVpc2EtPmlvYWRkciArIEVJU0FfVkVORE9SX0lEICk7CgkJZWlzYS0+dmVuZG9yX2lkID0KCQkJbGUxNl90b19jcHUgKCBpbncgKCBlaXNhLT5pb2FkZHIgKyBFSVNBX1ZFTkRPUl9JRCApICk7CgkJZWlzYS0+cHJvZF9pZCA9CgkJCWxlMTZfdG9fY3B1ICggaW53ICggZWlzYS0+aW9hZGRyICsgRUlTQV9QUk9EX0lEICkgKTsKCQlpZiAoIGVpc2EtPnZlbmRvcl9pZCAmIDB4ODAgKSB7CgkJCS8qIE5vIGJvYXJkIHByZXNlbnQgKi8KCQkJY29udGludWU7CgkJfQoKCQkvKiBBZGQgdG8gZGV2aWNlIGhpZXJhcmNoeSAqLwoJCXNucHJpbnRmICggZWlzYS0+ZGV2Lm5hbWUsIHNpemVvZiAoIGVpc2EtPmRldi5uYW1lICksCgkJCSAgICJFSVNBJTAyeCIsIHNsb3QgKTsKCQllaXNhLT5kZXYuZGVzYy5idXNfdHlwZSA9IEJVU19UWVBFX0VJU0E7CgkJZWlzYS0+ZGV2LmRlc2MudmVuZG9yID0gZWlzYS0+dmVuZG9yX2lkOwoJCWVpc2EtPmRldi5kZXNjLmRldmljZSA9IGVpc2EtPnByb2RfaWQ7CgkJZWlzYS0+ZGV2LnBhcmVudCA9ICZyb290ZGV2LT5kZXY7CgkJbGlzdF9hZGQgKCAmZWlzYS0+ZGV2LnNpYmxpbmdzLCAmcm9vdGRldi0+ZGV2LmNoaWxkcmVuICk7CgkJSU5JVF9MSVNUX0hFQUQgKCAmZWlzYS0+ZGV2LmNoaWxkcmVuICk7CgoJCS8qIExvb2sgZm9yIGEgZHJpdmVyICovCgkJaWYgKCBlaXNhX3Byb2JlICggZWlzYSApID09IDAgKSB7CgkJCS8qIGVpc2FkZXYgcmVnaXN0ZXJlZCwgd2UgY2FuIGRyb3Agb3VyIHJlZiAqLwoJCQllaXNhID0gTlVMTDsKCQl9IGVsc2UgewoJCQkvKiBOb3QgcmVnaXN0ZXJlZDsgcmUtdXNlIHN0cnVjdCAqLwoJCQlsaXN0X2RlbCAoICZlaXNhLT5kZXYuc2libGluZ3MgKTsKCQl9Cgl9CgoJZnJlZSAoIGVpc2EgKTsKCXJldHVybiAwOwoKIGVycjoKCWZyZWUgKCBlaXNhICk7CgllaXNhYnVzX3JlbW92ZSAoIHJvb3RkZXYgKTsKCXJldHVybiByYzsKfQoKLyoqCiAqIFJlbW92ZSBFSVNBIHJvb3QgYnVzCiAqCiAqIEB2IHJvb3RkZXYJCUVJU0EgYnVzIHJvb3QgZGV2aWNlCiAqLwpzdGF0aWMgdm9pZCBlaXNhYnVzX3JlbW92ZSAoIHN0cnVjdCByb290X2RldmljZSAqcm9vdGRldiApIHsKCXN0cnVjdCBlaXNhX2RldmljZSAqZWlzYTsKCXN0cnVjdCBlaXNhX2RldmljZSAqdG1wOwoKCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAoIGVpc2EsIHRtcCwgJnJvb3RkZXYtPmRldi5jaGlsZHJlbiwKCQkJCSAgIGRldi5zaWJsaW5ncyApIHsKCQllaXNhX3JlbW92ZSAoIGVpc2EgKTsKCQlsaXN0X2RlbCAoICZlaXNhLT5kZXYuc2libGluZ3MgKTsKCQlmcmVlICggZWlzYSApOwoJfQp9CgovKiogRUlTQSBidXMgcm9vdCBkZXZpY2UgZHJpdmVyICovCnN0YXRpYyBzdHJ1Y3Qgcm9vdF9kcml2ZXIgZWlzYV9yb290X2RyaXZlciA9IHsKCS5wcm9iZSA9IGVpc2FidXNfcHJvYmUsCgkucmVtb3ZlID0gZWlzYWJ1c19yZW1vdmUsCn07CgovKiogRUlTQSBidXMgcm9vdCBkZXZpY2UgKi8Kc3RydWN0IHJvb3RfZGV2aWNlIGVpc2Ffcm9vdF9kZXZpY2UgX19yb290X2RldmljZSA9IHsKCS5kZXYgPSB7IC5uYW1lID0gIkVJU0EiIH0sCgkuZHJpdmVyID0gJmVpc2Ffcm9vdF9kcml2ZXIsCn07Cg==