From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH v3 8/9] xen/gntdev: Implement dma-buf export functionality Date: Tue, 12 Jun 2018 16:41:59 +0300 Message-ID: <20180612134200.17456-9-andr2000@gmail.com> References: <20180612134200.17456-1-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x241.google.com (mail-lf0-x241.google.com [IPv6:2a00:1450:4010:c07::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id AE1776E4E5 for ; Tue, 12 Jun 2018 13:42:23 +0000 (UTC) Received: by mail-lf0-x241.google.com with SMTP id q11-v6so36086295lfc.7 for ; Tue, 12 Jun 2018 06:42:23 -0700 (PDT) In-Reply-To: <20180612134200.17456-1-andr2000@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: andr2000@gmail.com, daniel.vetter@intel.com, dongwon.kim@intel.com, Oleksandr Andrushchenko List-Id: dri-devel@lists.freedesktop.org RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKMS4gQ3JlYXRlIGEgZG1hLWJ1ZiBmcm9tIGdyYW50IHJlZmVyZW5jZXMgcHJvdmlk ZWQgYnkgdGhlIGZvcmVpZ24KICAgZG9tYWluLiBCeSBkZWZhdWx0IGRtYS1idWYgaXMgYmFja2Vk IGJ5IHN5c3RlbSBtZW1vcnkgcGFnZXMsIGJ1dAogICBieSBwcm92aWRpbmcgR05UREVWX0RNQV9G TEFHX1hYWCBmbGFncyBpdCBjYW4gYWxzbyBiZSBjcmVhdGVkCiAgIGFzIGEgRE1BIHdyaXRlLWNv bWJpbmUvY29oZXJlbnQgYnVmZmVyLCBlLmcuIGFsbG9jYXRlZCB3aXRoCiAgIGNvcnJlc3BvbmRp bmcgZG1hX2FsbG9jX3h4eCBBUEkuCiAgIEV4cG9ydCB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBhcyBh IG5ldyBkbWEtYnVmLgoKMi4gSW1wbGVtZW50IHdhaXRpbmcgZm9yIHRoZSBkbWEtYnVmIHRvIGJl IHJlbGVhc2VkOiBibG9jayB1bnRpbCB0aGUKICAgZG1hLWJ1ZiB3aXRoIHRoZSBmaWxlIGRlc2Ny aXB0b3IgcHJvdmlkZWQgaXMgcmVsZWFzZWQuCiAgIElmIHdpdGhpbiB0aGUgdGltZS1vdXQgcHJv dmlkZWQgdGhlIGJ1ZmZlciBpcyBub3QgcmVsZWFzZWQgdGhlbgogICAtRVRJTUVET1VUIGVycm9y IGlzIHJldHVybmVkLiBJZiB0aGUgYnVmZmVyIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvcgogICBk b2VzIG5vdCBleGlzdCBvciBoYXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkLCB0aGVuIC1FTk9FTlQg aXMKICAgcmV0dXJuZWQuIEZvciB2YWxpZCBmaWxlIGRlc2NyaXB0b3JzIHRoaXMgbXVzdCBub3Qg YmUgdHJlYXRlZCBhcwogICBlcnJvci4KCjMuIE1ha2UgZ250ZGV2J3MgY29tbW9uIGNvZGUgYW5k IHN0cnVjdHVyZXMgYXZhaWxhYmxlIHRvIGRtYS1idWYuCgpTaWduZWQtb2ZmLWJ5OiBPbGVrc2Fu ZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Ci0tLQog ZHJpdmVycy94ZW4vZ250ZGV2LWNvbW1vbi5oIHwgICA0ICsKIGRyaXZlcnMveGVuL2dudGRldi1k bWFidWYuYyB8IDQ3MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIGRyaXZl cnMveGVuL2dudGRldi5jICAgICAgICB8ICAxMCArCiAzIGZpbGVzIGNoYW5nZWQsIDQ4MiBpbnNl cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2dudGRl di1jb21tb24uaCBiL2RyaXZlcnMveGVuL2dudGRldi1jb21tb24uaAppbmRleCBhMzQwOGZkMzli MDcuLjcyZjgwZGJjZTg2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ250ZGV2LWNvbW1vbi5o CisrKyBiL2RyaXZlcnMveGVuL2dudGRldi1jb21tb24uaApAQCAtODksNCArODksOCBAQCBib29s IGdudGRldl9hY2NvdW50X21hcHBlZF9wYWdlcyhpbnQgY291bnQpOwogCiBpbnQgZ250ZGV2X21h cF9ncmFudF9wYWdlcyhzdHJ1Y3QgZ250ZGV2X2dyYW50X21hcCAqbWFwKTsKIAorI2lmZGVmIENP TkZJR19YRU5fR05UREVWX0RNQUJVRgordm9pZCBnbnRkZXZfcmVtb3ZlX21hcChzdHJ1Y3QgZ250 ZGV2X3ByaXYgKnByaXYsIHN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFwICptYXApOworI2VuZGlmCisK ICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ250ZGV2LWRtYWJ1Zi5jIGIvZHJpdmVy cy94ZW4vZ250ZGV2LWRtYWJ1Zi5jCmluZGV4IGRjNTdjNmEyNTUyNS4uODRjYmE2N2M2YWQ3IDEw MDY0NAotLS0gYS9kcml2ZXJzL3hlbi9nbnRkZXYtZG1hYnVmLmMKKysrIGIvZHJpdmVycy94ZW4v Z250ZGV2LWRtYWJ1Zi5jCkBAIC0zLDEzICszLDUzIEBACiAvKgogICogWGVuIGRtYS1idWYgZnVu Y3Rpb25hbGl0eSBmb3IgZ250ZGV2LgogICoKKyAqIERNQSBidWZmZXIgaW1wbGVtZW50YXRpb24g aXMgYmFzZWQgb24gZHJpdmVycy9ncHUvZHJtL2RybV9wcmltZS5jLgorICoKICAqIENvcHlyaWdo dCAoYykgMjAxOCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbywgRVBBTSBTeXN0ZW1zIEluYy4KICAq LwogCisjaW5jbHVkZSA8bGludXgvZG1hLWJ1Zi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K IAorI2luY2x1ZGUgPHhlbi9ncmFudF90YWJsZS5oPgorI2luY2x1ZGUgPHhlbi9nbnRkZXYuaD4K KworI2luY2x1ZGUgImdudGRldi1jb21tb24uaCIKICNpbmNsdWRlICJnbnRkZXYtZG1hYnVmLmgi CiAKK3N0cnVjdCBnbnRkZXZfZG1hYnVmIHsKKwlzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl9wcml2ICpw cml2OworCXN0cnVjdCBkbWFfYnVmICpkbWFidWY7CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0Owor CWludCBmZDsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIEV4cG9ydGVkIGJ1ZmZlcnMg YXJlIHJlZmVyZW5jZSBjb3VudGVkLiAqLworCQkJc3RydWN0IGtyZWYgcmVmY291bnQ7CisKKwkJ CXN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdjsKKwkJCXN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFwICpt YXA7CisJCX0gZXhwOworCX0gdTsKKworCS8qIE51bWJlciBvZiBwYWdlcyB0aGlzIGJ1ZmZlciBo YXMuICovCisJaW50IG5yX3BhZ2VzOworCS8qIFBhZ2VzIG9mIHRoaXMgYnVmZmVyLiAqLworCXN0 cnVjdCBwYWdlICoqcGFnZXM7Cit9OworCitzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl93YWl0X29iaiB7 CisJc3RydWN0IGxpc3RfaGVhZCBuZXh0OworCXN0cnVjdCBnbnRkZXZfZG1hYnVmICpnbnRkZXZf ZG1hYnVmOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Cit9OworCitzdHJ1Y3QgZ250 ZGV2X2RtYWJ1Zl9hdHRhY2htZW50IHsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKKwllbnVtIGRt YV9kYXRhX2RpcmVjdGlvbiBkaXI7Cit9OworCiBzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl9wcml2IHsK IAkvKiBMaXN0IG9mIGV4cG9ydGVkIERNQSBidWZmZXJzLiAqLwogCXN0cnVjdCBsaXN0X2hlYWQg ZXhwX2xpc3Q7CkBAIC0yMywxNyArNjMsNDM5IEBAIHN0cnVjdCBnbnRkZXZfZG1hYnVmX3ByaXYg ewogCiAvKiBJbXBsZW1lbnRhdGlvbiBvZiB3YWl0IGZvciBleHBvcnRlZCBETUEgYnVmZmVyIHRv IGJlIHJlbGVhc2VkLiAqLwogCitzdGF0aWMgdm9pZCBkbWFidWZfZXhwX3JlbGVhc2Uoc3RydWN0 IGtyZWYgKmtyZWYpOworCitzdGF0aWMgc3RydWN0IGdudGRldl9kbWFidWZfd2FpdF9vYmogKgor ZG1hYnVmX2V4cF93YWl0X29ial9uZXcoc3RydWN0IGdudGRldl9kbWFidWZfcHJpdiAqcHJpdiwK KwkJCXN0cnVjdCBnbnRkZXZfZG1hYnVmICpnbnRkZXZfZG1hYnVmKQoreworCXN0cnVjdCBnbnRk ZXZfZG1hYnVmX3dhaXRfb2JqICpvYmo7CisKKwlvYmogPSBremFsbG9jKHNpemVvZigqb2JqKSwg R0ZQX0tFUk5FTCk7CisJaWYgKCFvYmopCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJ aW5pdF9jb21wbGV0aW9uKCZvYmotPmNvbXBsZXRpb24pOworCW9iai0+Z250ZGV2X2RtYWJ1ZiA9 IGdudGRldl9kbWFidWY7CisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKwlsaXN0X2FkZCgm b2JqLT5uZXh0LCAmcHJpdi0+ZXhwX3dhaXRfbGlzdCk7CisJLyogUHV0IG91ciByZWZlcmVuY2Ug YW5kIHdhaXQgZm9yIGdudGRldl9kbWFidWYncyByZWxlYXNlIHRvIGZpcmUuICovCisJa3JlZl9w dXQoJmdudGRldl9kbWFidWYtPnUuZXhwLnJlZmNvdW50LCBkbWFidWZfZXhwX3JlbGVhc2UpOwor CW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZv aWQgZG1hYnVmX2V4cF93YWl0X29ial9mcmVlKHN0cnVjdCBnbnRkZXZfZG1hYnVmX3ByaXYgKnBy aXYsCisJCQkJICAgICBzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl93YWl0X29iaiAqb2JqKQoreworCXN0 cnVjdCBnbnRkZXZfZG1hYnVmX3dhaXRfb2JqICpjdXJfb2JqLCAqcTsKKworCW11dGV4X2xvY2so JnByaXYtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXJfb2JqLCBxLCAmcHJp di0+ZXhwX3dhaXRfbGlzdCwgbmV4dCkKKwkJaWYgKGN1cl9vYmogPT0gb2JqKSB7CisJCQlsaXN0 X2RlbCgmb2JqLT5uZXh0KTsKKwkJCWtmcmVlKG9iaik7CisJCQlicmVhazsKKwkJfQorCW11dGV4 X3VubG9jaygmcHJpdi0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZG1hYnVmX2V4cF93YWl0X29i al93YWl0KHN0cnVjdCBnbnRkZXZfZG1hYnVmX3dhaXRfb2JqICpvYmosCisJCQkJICAgIHUzMiB3 YWl0X3RvX21zKQoreworCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm9iai0+Y29t cGxldGlvbiwKKwkJCW1zZWNzX3RvX2ppZmZpZXMod2FpdF90b19tcykpIDw9IDApCisJCXJldHVy biAtRVRJTUVET1VUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBf d2FpdF9vYmpfc2lnbmFsKHN0cnVjdCBnbnRkZXZfZG1hYnVmX3ByaXYgKnByaXYsCisJCQkJICAg ICAgIHN0cnVjdCBnbnRkZXZfZG1hYnVmICpnbnRkZXZfZG1hYnVmKQoreworCXN0cnVjdCBnbnRk ZXZfZG1hYnVmX3dhaXRfb2JqICpvYmosICpxOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZl KG9iaiwgcSwgJnByaXYtPmV4cF93YWl0X2xpc3QsIG5leHQpCisJCWlmIChvYmotPmdudGRldl9k bWFidWYgPT0gZ250ZGV2X2RtYWJ1ZikgeworCQkJcHJfZGVidWcoIkZvdW5kIGdudGRldl9kbWFi dWYgaW4gdGhlIHdhaXQgbGlzdCwgd2FrZVxuIik7CisJCQljb21wbGV0ZV9hbGwoJm9iai0+Y29t cGxldGlvbik7CisJCQlicmVhazsKKwkJfQorfQorCitzdGF0aWMgc3RydWN0IGdudGRldl9kbWFi dWYgKgorZG1hYnVmX2V4cF93YWl0X29ial9nZXRfYnlfZmQoc3RydWN0IGdudGRldl9kbWFidWZf cHJpdiAqcHJpdiwgaW50IGZkKQoreworCXN0cnVjdCBnbnRkZXZfZG1hYnVmICpxLCAqZ250ZGV2 X2RtYWJ1ZiwgKnJldCA9IEVSUl9QVFIoLUVOT0VOVCk7CisKKwltdXRleF9sb2NrKCZwcml2LT5s b2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZ250ZGV2X2RtYWJ1ZiwgcSwgJnByaXYt PmV4cF9saXN0LCBuZXh0KQorCQlpZiAoZ250ZGV2X2RtYWJ1Zi0+ZmQgPT0gZmQpIHsKKwkJCXBy X2RlYnVnKCJGb3VuZCBnbnRkZXZfZG1hYnVmIGluIHRoZSB3YWl0IGxpc3RcbiIpOworCQkJa3Jl Zl9nZXQoJmdudGRldl9kbWFidWYtPnUuZXhwLnJlZmNvdW50KTsKKwkJCXJldCA9IGdudGRldl9k bWFidWY7CisJCQlicmVhazsKKwkJfQorCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0 dXJuIHJldDsKK30KKwogaW50IGdudGRldl9kbWFidWZfZXhwX3dhaXRfcmVsZWFzZWQoc3RydWN0 IGdudGRldl9kbWFidWZfcHJpdiAqcHJpdiwgaW50IGZkLAogCQkJCSAgICBpbnQgd2FpdF90b19t cykKIHsKLQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJ1Y3QgZ250ZGV2X2RtYWJ1ZiAqZ250ZGV2X2Rt YWJ1ZjsKKwlzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl93YWl0X29iaiAqb2JqOworCWludCByZXQ7CisK Kwlwcl9kZWJ1ZygiV2lsbCB3YWl0IGZvciBkbWEtYnVmIHdpdGggZmQgJWRcbiIsIGZkKTsKKwkv KgorCSAqIFRyeSB0byBmaW5kIHRoZSBETUEgYnVmZmVyOiBpZiBub3QgZm91bmQgbWVhbnMgdGhh dAorCSAqIGVpdGhlciB0aGUgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmVsZWFzZWQgb3IgZmls ZSBkZXNjcmlwdG9yCisJICogcHJvdmlkZWQgaXMgd3JvbmcuCisJICovCisJZ250ZGV2X2RtYWJ1 ZiA9IGRtYWJ1Zl9leHBfd2FpdF9vYmpfZ2V0X2J5X2ZkKHByaXYsIGZkKTsKKwlpZiAoSVNfRVJS KGdudGRldl9kbWFidWYpKQorCQlyZXR1cm4gUFRSX0VSUihnbnRkZXZfZG1hYnVmKTsKKworCS8q CisJICogZ250ZGV2X2RtYWJ1ZiBzdGlsbCBleGlzdHMgYW5kIGlzIHJlZmVyZW5jZSBjb3VudCBs b2NrZWQgYnkgdXMgbm93LAorCSAqIHNvIHByZXBhcmUgdG8gd2FpdDogYWxsb2NhdGUgd2FpdCBv YmplY3QgYW5kIGFkZCBpdCB0byB0aGUgd2FpdCBsaXN0LAorCSAqIHNvIHdlIGNhbiBmaW5kIGl0 IG9uIHJlbGVhc2UuCisJICovCisJb2JqID0gZG1hYnVmX2V4cF93YWl0X29ial9uZXcocHJpdiwg Z250ZGV2X2RtYWJ1Zik7CisJaWYgKElTX0VSUihvYmopKQorCQlyZXR1cm4gUFRSX0VSUihvYmop OworCisJcmV0ID0gZG1hYnVmX2V4cF93YWl0X29ial93YWl0KG9iaiwgd2FpdF90b19tcyk7CisJ ZG1hYnVmX2V4cF93YWl0X29ial9mcmVlKHByaXYsIG9iaik7CisJcmV0dXJuIHJldDsKK30KKwor LyogRE1BIGJ1ZmZlciBleHBvcnQgc3VwcG9ydC4gKi8KKworc3RhdGljIHN0cnVjdCBzZ190YWJs ZSAqCitkbWFidWZfcGFnZXNfdG9fc2d0KHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGlu dCBucl9wYWdlcykKK3sKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKKwlpbnQgcmV0OworCisJc2d0 ID0ga21hbGxvYyhzaXplb2YoKnNndCksIEdGUF9LRVJORUwpOworCWlmICghc2d0KSB7CisJCXJl dCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHNnX2FsbG9jX3RhYmxlX2Zy b21fcGFnZXMoc2d0LCBwYWdlcywgbnJfcGFnZXMsIDAsCisJCQkJCW5yX3BhZ2VzIDw8IFBBR0Vf U0hJRlQsCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0 dXJuIHNndDsKKworb3V0OgorCWtmcmVlKHNndCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30K Kworc3RhdGljIGludCBkbWFidWZfZXhwX29wc19hdHRhY2goc3RydWN0IGRtYV9idWYgKmRtYV9i dWYsCisJCQkJIHN0cnVjdCBkZXZpY2UgKnRhcmdldF9kZXYsCisJCQkJIHN0cnVjdCBkbWFfYnVm X2F0dGFjaG1lbnQgKmF0dGFjaCkKK3sKKwlzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl9hdHRhY2htZW50 ICpnbnRkZXZfZG1hYnVmX2F0dGFjaDsKKworCWdudGRldl9kbWFidWZfYXR0YWNoID0ga3phbGxv YyhzaXplb2YoKmdudGRldl9kbWFidWZfYXR0YWNoKSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7 CisJaWYgKCFnbnRkZXZfZG1hYnVmX2F0dGFjaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnbnRk ZXZfZG1hYnVmX2F0dGFjaC0+ZGlyID0gRE1BX05PTkU7CisJYXR0YWNoLT5wcml2ID0gZ250ZGV2 X2RtYWJ1Zl9hdHRhY2g7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBf b3BzX2RldGFjaChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZiwKKwkJCQkgIHN0cnVjdCBkbWFfYnVm X2F0dGFjaG1lbnQgKmF0dGFjaCkKK3sKKwlzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl9hdHRhY2htZW50 ICpnbnRkZXZfZG1hYnVmX2F0dGFjaCA9IGF0dGFjaC0+cHJpdjsKKworCWlmIChnbnRkZXZfZG1h YnVmX2F0dGFjaCkgeworCQlzdHJ1Y3Qgc2dfdGFibGUgKnNndCA9IGdudGRldl9kbWFidWZfYXR0 YWNoLT5zZ3Q7CisKKwkJaWYgKHNndCkgeworCQkJaWYgKGdudGRldl9kbWFidWZfYXR0YWNoLT5k aXIgIT0gRE1BX05PTkUpCisJCQkJZG1hX3VubWFwX3NnX2F0dHJzKGF0dGFjaC0+ZGV2LCBzZ3Qt PnNnbCwKKwkJCQkJCSAgIHNndC0+bmVudHMsCisJCQkJCQkgICBnbnRkZXZfZG1hYnVmX2F0dGFj aC0+ZGlyLAorCQkJCQkJICAgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQyk7CisJCQlzZ19mcmVlX3Rh YmxlKHNndCk7CisJCX0KKworCQlrZnJlZShzZ3QpOworCQlrZnJlZShnbnRkZXZfZG1hYnVmX2F0 dGFjaCk7CisJCWF0dGFjaC0+cHJpdiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNn X3RhYmxlICoKK2RtYWJ1Zl9leHBfb3BzX21hcF9kbWFfYnVmKHN0cnVjdCBkbWFfYnVmX2F0dGFj aG1lbnQgKmF0dGFjaCwKKwkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlz dHJ1Y3QgZ250ZGV2X2RtYWJ1Zl9hdHRhY2htZW50ICpnbnRkZXZfZG1hYnVmX2F0dGFjaCA9IGF0 dGFjaC0+cHJpdjsKKwlzdHJ1Y3QgZ250ZGV2X2RtYWJ1ZiAqZ250ZGV2X2RtYWJ1ZiA9IGF0dGFj aC0+ZG1hYnVmLT5wcml2OworCXN0cnVjdCBzZ190YWJsZSAqc2d0OworCisJcHJfZGVidWcoIk1h cHBpbmcgJWQgcGFnZXMgZm9yIGRldiAlcFxuIiwgZ250ZGV2X2RtYWJ1Zi0+bnJfcGFnZXMsCisJ CSBhdHRhY2gtPmRldik7CisKKwlpZiAoZGlyID09IERNQV9OT05FIHx8ICFnbnRkZXZfZG1hYnVm X2F0dGFjaCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwkvKiBSZXR1cm4gdGhlIGNh Y2hlZCBtYXBwaW5nIHdoZW4gcG9zc2libGUuICovCisJaWYgKGdudGRldl9kbWFidWZfYXR0YWNo LT5kaXIgPT0gZGlyKQorCQlyZXR1cm4gZ250ZGV2X2RtYWJ1Zl9hdHRhY2gtPnNndDsKKworCS8q CisJICogVHdvIG1hcHBpbmdzIHdpdGggZGlmZmVyZW50IGRpcmVjdGlvbnMgZm9yIHRoZSBzYW1l IGF0dGFjaG1lbnQgYXJlCisJICogbm90IGFsbG93ZWQuCisJICovCisJaWYgKGdudGRldl9kbWFi dWZfYXR0YWNoLT5kaXIgIT0gRE1BX05PTkUpCisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisK KwlzZ3QgPSBkbWFidWZfcGFnZXNfdG9fc2d0KGdudGRldl9kbWFidWYtPnBhZ2VzLAorCQkJCSAg Z250ZGV2X2RtYWJ1Zi0+bnJfcGFnZXMpOworCWlmICghSVNfRVJSKHNndCkpIHsKKwkJaWYgKCFk bWFfbWFwX3NnX2F0dHJzKGF0dGFjaC0+ZGV2LCBzZ3QtPnNnbCwgc2d0LT5uZW50cywgZGlyLAor CQkJCSAgICAgIERNQV9BVFRSX1NLSVBfQ1BVX1NZTkMpKSB7CisJCQlzZ19mcmVlX3RhYmxlKHNn dCk7CisJCQlrZnJlZShzZ3QpOworCQkJc2d0ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJfSBlbHNl IHsKKwkJCWdudGRldl9kbWFidWZfYXR0YWNoLT5zZ3QgPSBzZ3Q7CisJCQlnbnRkZXZfZG1hYnVm X2F0dGFjaC0+ZGlyID0gZGlyOworCQl9CisJfQorCWlmIChJU19FUlIoc2d0KSkKKwkJcHJfZGVi dWcoIkZhaWxlZCB0byBtYXAgc2cgdGFibGUgZm9yIGRldiAlcFxuIiwgYXR0YWNoLT5kZXYpOwor CXJldHVybiBzZ3Q7Cit9CisKK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBfb3BzX3VubWFwX2RtYV9i dWYoc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNoLAorCQkJCQkgc3RydWN0IHNnX3Rh YmxlICpzZ3QsCisJCQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJLyogTm90 IGltcGxlbWVudGVkLiBUaGUgdW5tYXAgaXMgZG9uZSBhdCBkbWFidWZfZXhwX29wc19kZXRhY2go KS4gKi8KK30KKworc3RhdGljIHZvaWQgZG1hYnVmX2V4cF9yZWxlYXNlKHN0cnVjdCBrcmVmICpr cmVmKQoreworCXN0cnVjdCBnbnRkZXZfZG1hYnVmICpnbnRkZXZfZG1hYnVmID0KKwkJY29udGFp bmVyX29mKGtyZWYsIHN0cnVjdCBnbnRkZXZfZG1hYnVmLCB1LmV4cC5yZWZjb3VudCk7CisKKwlk bWFidWZfZXhwX3dhaXRfb2JqX3NpZ25hbChnbnRkZXZfZG1hYnVmLT5wcml2LCBnbnRkZXZfZG1h YnVmKTsKKwlsaXN0X2RlbCgmZ250ZGV2X2RtYWJ1Zi0+bmV4dCk7CisJa2ZyZWUoZ250ZGV2X2Rt YWJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBfb3BzX3JlbGVhc2Uoc3RydWN0IGRt YV9idWYgKmRtYV9idWYpCit7CisJc3RydWN0IGdudGRldl9kbWFidWYgKmdudGRldl9kbWFidWYg PSBkbWFfYnVmLT5wcml2OworCXN0cnVjdCBnbnRkZXZfZG1hYnVmX3ByaXYgKnByaXYgPSBnbnRk ZXZfZG1hYnVmLT5wcml2OworCisJZ250ZGV2X3JlbW92ZV9tYXAoZ250ZGV2X2RtYWJ1Zi0+dS5l eHAucHJpdiwgZ250ZGV2X2RtYWJ1Zi0+dS5leHAubWFwKTsKKwltdXRleF9sb2NrKCZwcml2LT5s b2NrKTsKKwlrcmVmX3B1dCgmZ250ZGV2X2RtYWJ1Zi0+dS5leHAucmVmY291bnQsIGRtYWJ1Zl9l eHBfcmVsZWFzZSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKK30KKworc3RhdGljIHZv aWQgKmRtYWJ1Zl9leHBfb3BzX2ttYXBfYXRvbWljKHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLAor CQkJCQl1bnNpZ25lZCBsb25nIHBhZ2VfbnVtKQoreworCS8qIE5vdCBpbXBsZW1lbnRlZC4gKi8K KwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZG1hYnVmX2V4cF9vcHNfa3VubWFwX2F0 b21pYyhzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgcGFnZV9u dW0sIHZvaWQgKmFkZHIpCit7CisJLyogTm90IGltcGxlbWVudGVkLiAqLworfQorCitzdGF0aWMg dm9pZCAqZG1hYnVmX2V4cF9vcHNfa21hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZiwKKwkJCQkg dW5zaWduZWQgbG9uZyBwYWdlX251bSkKK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQuICovCisJcmV0 dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGRtYWJ1Zl9leHBfb3BzX2t1bm1hcChzdHJ1Y3Qg ZG1hX2J1ZiAqZG1hX2J1ZiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGFnZV9udW0sIHZvaWQgKmFk ZHIpCit7CisJLyogTm90IGltcGxlbWVudGVkLiAqLworfQorCitzdGF0aWMgaW50IGRtYWJ1Zl9l eHBfb3BzX21tYXAoc3RydWN0IGRtYV9idWYgKmRtYV9idWYsCisJCQkgICAgICAgc3RydWN0IHZt X2FyZWFfc3RydWN0ICp2bWEpCit7CisJLyogTm90IGltcGxlbWVudGVkLiAqLworCXJldHVybiAw OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9idWZfb3BzIGRtYWJ1Zl9leHBfb3BzID0g IHsKKwkuYXR0YWNoID0gZG1hYnVmX2V4cF9vcHNfYXR0YWNoLAorCS5kZXRhY2ggPSBkbWFidWZf ZXhwX29wc19kZXRhY2gsCisJLm1hcF9kbWFfYnVmID0gZG1hYnVmX2V4cF9vcHNfbWFwX2RtYV9i dWYsCisJLnVubWFwX2RtYV9idWYgPSBkbWFidWZfZXhwX29wc191bm1hcF9kbWFfYnVmLAorCS5y ZWxlYXNlID0gZG1hYnVmX2V4cF9vcHNfcmVsZWFzZSwKKwkubWFwID0gZG1hYnVmX2V4cF9vcHNf a21hcCwKKwkubWFwX2F0b21pYyA9IGRtYWJ1Zl9leHBfb3BzX2ttYXBfYXRvbWljLAorCS51bm1h cCA9IGRtYWJ1Zl9leHBfb3BzX2t1bm1hcCwKKwkudW5tYXBfYXRvbWljID0gZG1hYnVmX2V4cF9v cHNfa3VubWFwX2F0b21pYywKKwkubW1hcCA9IGRtYWJ1Zl9leHBfb3BzX21tYXAsCit9OworCitz dHJ1Y3QgZ250ZGV2X2RtYWJ1Zl9leHBvcnRfYXJncyB7CisJc3RydWN0IGdudGRldl9wcml2ICpw cml2OworCXN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFwICptYXA7CisJc3RydWN0IGdudGRldl9kbWFi dWZfcHJpdiAqZG1hYnVmX3ByaXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBjb3VudDsK KwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXUzMiBmZDsKK307CisKK3N0YXRpYyBpbnQgZG1hYnVm X2V4cF9mcm9tX3BhZ2VzKHN0cnVjdCBnbnRkZXZfZG1hYnVmX2V4cG9ydF9hcmdzICphcmdzKQor eworCURFRklORV9ETUFfQlVGX0VYUE9SVF9JTkZPKGV4cF9pbmZvKTsKKwlzdHJ1Y3QgZ250ZGV2 X2RtYWJ1ZiAqZ250ZGV2X2RtYWJ1ZjsKKwlpbnQgcmV0ID0gMDsKKworCWdudGRldl9kbWFidWYg PSBremFsbG9jKHNpemVvZigqZ250ZGV2X2RtYWJ1ZiksIEdGUF9LRVJORUwpOworCWlmICghZ250 ZGV2X2RtYWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrcmVmX2luaXQoJmdudGRldl9kbWFi dWYtPnUuZXhwLnJlZmNvdW50KTsKKworCWdudGRldl9kbWFidWYtPnByaXYgPSBhcmdzLT5kbWFi dWZfcHJpdjsKKwlnbnRkZXZfZG1hYnVmLT5ucl9wYWdlcyA9IGFyZ3MtPmNvdW50OworCWdudGRl dl9kbWFidWYtPnBhZ2VzID0gYXJncy0+cGFnZXM7CisJZ250ZGV2X2RtYWJ1Zi0+dS5leHAucHJp diA9IGFyZ3MtPnByaXY7CisJZ250ZGV2X2RtYWJ1Zi0+dS5leHAubWFwID0gYXJncy0+bWFwOwor CisJZXhwX2luZm8uZXhwX25hbWUgPSBLQlVJTERfTU9ETkFNRTsKKwlpZiAoYXJncy0+ZGV2LT5k cml2ZXIgJiYgYXJncy0+ZGV2LT5kcml2ZXItPm93bmVyKQorCQlleHBfaW5mby5vd25lciA9IGFy Z3MtPmRldi0+ZHJpdmVyLT5vd25lcjsKKwllbHNlCisJCWV4cF9pbmZvLm93bmVyID0gVEhJU19N T0RVTEU7CisJZXhwX2luZm8ub3BzID0gJmRtYWJ1Zl9leHBfb3BzOworCWV4cF9pbmZvLnNpemUg PSBhcmdzLT5jb3VudCA8PCBQQUdFX1NISUZUOworCWV4cF9pbmZvLmZsYWdzID0gT19SRFdSOwor CWV4cF9pbmZvLnByaXYgPSBnbnRkZXZfZG1hYnVmOworCisJZ250ZGV2X2RtYWJ1Zi0+ZG1hYnVm ID0gZG1hX2J1Zl9leHBvcnQoJmV4cF9pbmZvKTsKKwlpZiAoSVNfRVJSKGdudGRldl9kbWFidWYt PmRtYWJ1ZikpIHsKKwkJcmV0ID0gUFRSX0VSUihnbnRkZXZfZG1hYnVmLT5kbWFidWYpOworCQln bnRkZXZfZG1hYnVmLT5kbWFidWYgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0g ZG1hX2J1Zl9mZChnbnRkZXZfZG1hYnVmLT5kbWFidWYsIE9fQ0xPRVhFQyk7CisJaWYgKHJldCA8 IDApCisJCWdvdG8gZmFpbDsKKworCWdudGRldl9kbWFidWYtPmZkID0gcmV0OworCWFyZ3MtPmZk ID0gcmV0OworCisJcHJfZGVidWcoIkV4cG9ydGluZyBETUEgYnVmZmVyIHdpdGggZmQgJWRcbiIs IHJldCk7CisKKwltdXRleF9sb2NrKCZhcmdzLT5kbWFidWZfcHJpdi0+bG9jayk7CisJbGlzdF9h ZGQoJmdudGRldl9kbWFidWYtPm5leHQsICZhcmdzLT5kbWFidWZfcHJpdi0+ZXhwX2xpc3QpOwor CW11dGV4X3VubG9jaygmYXJncy0+ZG1hYnVmX3ByaXYtPmxvY2spOworCXJldHVybiAwOworCitm YWlsOgorCWlmIChnbnRkZXZfZG1hYnVmLT5kbWFidWYpCisJCWRtYV9idWZfcHV0KGdudGRldl9k bWFidWYtPmRtYWJ1Zik7CisJa2ZyZWUoZ250ZGV2X2RtYWJ1Zik7CisJcmV0dXJuIHJldDsKK30K Kworc3RhdGljIHN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFwICoKK2RtYWJ1Zl9leHBfYWxsb2NfYmFj a2luZ19zdG9yYWdlKHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdiwgaW50IGRtYWJ1Zl9mbGFncywK KwkJCQkgaW50IGNvdW50KQoreworCXN0cnVjdCBnbnRkZXZfZ3JhbnRfbWFwICptYXA7CisKKwlp ZiAodW5saWtlbHkoY291bnQgPD0gMCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJ aWYgKChkbWFidWZfZmxhZ3MgJiBHTlRERVZfRE1BX0ZMQUdfV0MpICYmCisJICAgIChkbWFidWZf ZmxhZ3MgJiBHTlRERVZfRE1BX0ZMQUdfQ09IRVJFTlQpKSB7CisJCXByX2RlYnVnKCJXcm9uZyBk bWEtYnVmIGZsYWdzOiBlaXRoZXIgV0Mgb3IgY29oZXJlbnQsIG5vdCBib3RoXG4iKTsKKwkJcmV0 dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJbWFwID0gZ250ZGV2X2FsbG9jX21hcChwcml2 LCBjb3VudCwgZG1hYnVmX2ZsYWdzKTsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVO T01FTSk7CisKKwlpZiAodW5saWtlbHkoZ250ZGV2X2FjY291bnRfbWFwcGVkX3BhZ2VzKGNvdW50 KSkpIHsKKwkJcHJfZGVidWcoImNhbid0IG1hcDogb3ZlciBsaW1pdFxuIik7CisJCWdudGRldl9w dXRfbWFwKE5VTEwsIG1hcCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlyZXR1 cm4gbWFwOwogfQogCiBpbnQgZ250ZGV2X2RtYWJ1Zl9leHBfZnJvbV9yZWZzKHN0cnVjdCBnbnRk ZXZfcHJpdiAqcHJpdiwgaW50IGZsYWdzLAogCQkJCWludCBjb3VudCwgdTMyIGRvbWlkLCB1MzIg KnJlZnMsIHUzMiAqZmQpCiB7CisJc3RydWN0IGdudGRldl9ncmFudF9tYXAgKm1hcDsKKwlzdHJ1 Y3QgZ250ZGV2X2RtYWJ1Zl9leHBvcnRfYXJncyBhcmdzOworCWludCBpLCByZXQ7CisKIAkqZmQg PSAtMTsKLQlyZXR1cm4gLUVJTlZBTDsKKworCW1hcCA9IGRtYWJ1Zl9leHBfYWxsb2NfYmFja2lu Z19zdG9yYWdlKHByaXYsIGZsYWdzLCBjb3VudCk7CisJaWYgKElTX0VSUihtYXApKQorCQlyZXR1 cm4gUFRSX0VSUihtYXApOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJbWFw LT5ncmFudHNbaV0uZG9taWQgPSBkb21pZDsKKwkJbWFwLT5ncmFudHNbaV0ucmVmID0gcmVmc1tp XTsKKwl9CisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKwlnbnRkZXZfYWRkX21hcChwcml2 LCBtYXApOworCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwltYXAtPmZsYWdzIHw9IEdO VE1BUF9ob3N0X21hcDsKKyNpZiBkZWZpbmVkKENPTkZJR19YODYpCisJbWFwLT5mbGFncyB8PSBH TlRNQVBfZGV2aWNlX21hcDsKKyNlbmRpZgorCisJcmV0ID0gZ250ZGV2X21hcF9ncmFudF9wYWdl cyhtYXApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWFyZ3MucHJpdiA9IHByaXY7 CisJYXJncy5tYXAgPSBtYXA7CisJYXJncy5kZXYgPSBwcml2LT5kbWFfZGV2OworCWFyZ3MuZG1h YnVmX3ByaXYgPSBwcml2LT5kbWFidWZfcHJpdjsKKwlhcmdzLmNvdW50ID0gbWFwLT5jb3VudDsK KwlhcmdzLnBhZ2VzID0gbWFwLT5wYWdlczsKKworCXJldCA9IGRtYWJ1Zl9leHBfZnJvbV9wYWdl cygmYXJncyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJKmZkID0gYXJncy5mZDsK KwlyZXR1cm4gMDsKKworb3V0OgorCWdudGRldl9yZW1vdmVfbWFwKHByaXYsIG1hcCk7CisJcmV0 dXJuIHJldDsKIH0KIAogLyogRE1BIGJ1ZmZlciBpbXBvcnQgc3VwcG9ydC4gKi8KQEAgLTYzLDYg KzUyNSwxMCBAQCBzdHJ1Y3QgZ250ZGV2X2RtYWJ1Zl9wcml2ICpnbnRkZXZfZG1hYnVmX2luaXQo dm9pZCkKIAlpZiAoIXByaXYpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCisJbXV0ZXhf aW5pdCgmcHJpdi0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmV4cF9saXN0KTsKKwlJ TklUX0xJU1RfSEVBRCgmcHJpdi0+ZXhwX3dhaXRfbGlzdCk7CisKIAlyZXR1cm4gcHJpdjsKIH0K IApkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ250ZGV2LmMgYi9kcml2ZXJzL3hlbi9nbnRkZXYu YwppbmRleCBlODI2NjBkODFkN2UuLjVmOTNjZDUzNDg0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy94 ZW4vZ250ZGV2LmMKKysrIGIvZHJpdmVycy94ZW4vZ250ZGV2LmMKQEAgLTI2Miw2ICsyNjIsMTYg QEAgdm9pZCBnbnRkZXZfcHV0X21hcChzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsIHN0cnVjdCBn bnRkZXZfZ3JhbnRfbWFwICptYXApCiAJZ250ZGV2X2ZyZWVfbWFwKG1hcCk7CiB9CiAKKyNpZmRl ZiBDT05GSUdfWEVOX0dOVERFVl9ETUFCVUYKK3ZvaWQgZ250ZGV2X3JlbW92ZV9tYXAoc3RydWN0 IGdudGRldl9wcml2ICpwcml2LCBzdHJ1Y3QgZ250ZGV2X2dyYW50X21hcCAqbWFwKQoreworCW11 dGV4X2xvY2soJnByaXYtPmxvY2spOworCWxpc3RfZGVsKCZtYXAtPm5leHQpOworCWdudGRldl9w dXRfbWFwKE5VTEwgLyogYWxyZWFkeSByZW1vdmVkICovLCBtYXApOworCW11dGV4X3VubG9jaygm cHJpdi0+bG9jayk7Cit9CisjZW5kaWYKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBpbnQg ZmluZF9ncmFudF9wdGVzKHB0ZV90ICpwdGUsIHBndGFibGVfdCB0b2tlbiwKLS0gCjIuMTcuMQoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-lf0-f67.google.com ([209.85.215.67]:40984 "EHLO mail-lf0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933203AbeFLNmX (ORCPT ); Tue, 12 Jun 2018 09:42:23 -0400 From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: daniel.vetter@intel.com, andr2000@gmail.com, dongwon.kim@intel.com, matthew.d.roper@intel.com, Oleksandr Andrushchenko Subject: [PATCH v3 8/9] xen/gntdev: Implement dma-buf export functionality Date: Tue, 12 Jun 2018 16:41:59 +0300 Message-Id: <20180612134200.17456-9-andr2000@gmail.com> In-Reply-To: <20180612134200.17456-1-andr2000@gmail.com> References: <20180612134200.17456-1-andr2000@gmail.com> Sender: linux-media-owner@vger.kernel.org List-ID: From: Oleksandr Andrushchenko 1. Create a dma-buf from grant references provided by the foreign domain. By default dma-buf is backed by system memory pages, but by providing GNTDEV_DMA_FLAG_XXX flags it can also be created as a DMA write-combine/coherent buffer, e.g. allocated with corresponding dma_alloc_xxx API. Export the resulting buffer as a new dma-buf. 2. Implement waiting for the dma-buf to be released: block until the dma-buf with the file descriptor provided is released. If within the time-out provided the buffer is not released then -ETIMEDOUT error is returned. If the buffer with the file descriptor does not exist or has already been released, then -ENOENT is returned. For valid file descriptors this must not be treated as error. 3. Make gntdev's common code and structures available to dma-buf. Signed-off-by: Oleksandr Andrushchenko --- drivers/xen/gntdev-common.h | 4 + drivers/xen/gntdev-dmabuf.c | 470 +++++++++++++++++++++++++++++++++++- drivers/xen/gntdev.c | 10 + 3 files changed, 482 insertions(+), 2 deletions(-) diff --git a/drivers/xen/gntdev-common.h b/drivers/xen/gntdev-common.h index a3408fd39b07..72f80dbce861 100644 --- a/drivers/xen/gntdev-common.h +++ b/drivers/xen/gntdev-common.h @@ -89,4 +89,8 @@ bool gntdev_account_mapped_pages(int count); int gntdev_map_grant_pages(struct gntdev_grant_map *map); +#ifdef CONFIG_XEN_GNTDEV_DMABUF +void gntdev_remove_map(struct gntdev_priv *priv, struct gntdev_grant_map *map); +#endif + #endif diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c index dc57c6a25525..84cba67c6ad7 100644 --- a/drivers/xen/gntdev-dmabuf.c +++ b/drivers/xen/gntdev-dmabuf.c @@ -3,13 +3,53 @@ /* * Xen dma-buf functionality for gntdev. * + * DMA buffer implementation is based on drivers/gpu/drm/drm_prime.c. + * * Copyright (c) 2018 Oleksandr Andrushchenko, EPAM Systems Inc. */ +#include #include +#include +#include + +#include "gntdev-common.h" #include "gntdev-dmabuf.h" +struct gntdev_dmabuf { + struct gntdev_dmabuf_priv *priv; + struct dma_buf *dmabuf; + struct list_head next; + int fd; + + union { + struct { + /* Exported buffers are reference counted. */ + struct kref refcount; + + struct gntdev_priv *priv; + struct gntdev_grant_map *map; + } exp; + } u; + + /* Number of pages this buffer has. */ + int nr_pages; + /* Pages of this buffer. */ + struct page **pages; +}; + +struct gntdev_dmabuf_wait_obj { + struct list_head next; + struct gntdev_dmabuf *gntdev_dmabuf; + struct completion completion; +}; + +struct gntdev_dmabuf_attachment { + struct sg_table *sgt; + enum dma_data_direction dir; +}; + struct gntdev_dmabuf_priv { /* List of exported DMA buffers. */ struct list_head exp_list; @@ -23,17 +63,439 @@ struct gntdev_dmabuf_priv { /* Implementation of wait for exported DMA buffer to be released. */ +static void dmabuf_exp_release(struct kref *kref); + +static struct gntdev_dmabuf_wait_obj * +dmabuf_exp_wait_obj_new(struct gntdev_dmabuf_priv *priv, + struct gntdev_dmabuf *gntdev_dmabuf) +{ + struct gntdev_dmabuf_wait_obj *obj; + + obj = kzalloc(sizeof(*obj), GFP_KERNEL); + if (!obj) + return ERR_PTR(-ENOMEM); + + init_completion(&obj->completion); + obj->gntdev_dmabuf = gntdev_dmabuf; + + mutex_lock(&priv->lock); + list_add(&obj->next, &priv->exp_wait_list); + /* Put our reference and wait for gntdev_dmabuf's release to fire. */ + kref_put(&gntdev_dmabuf->u.exp.refcount, dmabuf_exp_release); + mutex_unlock(&priv->lock); + return obj; +} + +static void dmabuf_exp_wait_obj_free(struct gntdev_dmabuf_priv *priv, + struct gntdev_dmabuf_wait_obj *obj) +{ + struct gntdev_dmabuf_wait_obj *cur_obj, *q; + + mutex_lock(&priv->lock); + list_for_each_entry_safe(cur_obj, q, &priv->exp_wait_list, next) + if (cur_obj == obj) { + list_del(&obj->next); + kfree(obj); + break; + } + mutex_unlock(&priv->lock); +} + +static int dmabuf_exp_wait_obj_wait(struct gntdev_dmabuf_wait_obj *obj, + u32 wait_to_ms) +{ + if (wait_for_completion_timeout(&obj->completion, + msecs_to_jiffies(wait_to_ms)) <= 0) + return -ETIMEDOUT; + + return 0; +} + +static void dmabuf_exp_wait_obj_signal(struct gntdev_dmabuf_priv *priv, + struct gntdev_dmabuf *gntdev_dmabuf) +{ + struct gntdev_dmabuf_wait_obj *obj, *q; + + list_for_each_entry_safe(obj, q, &priv->exp_wait_list, next) + if (obj->gntdev_dmabuf == gntdev_dmabuf) { + pr_debug("Found gntdev_dmabuf in the wait list, wake\n"); + complete_all(&obj->completion); + break; + } +} + +static struct gntdev_dmabuf * +dmabuf_exp_wait_obj_get_by_fd(struct gntdev_dmabuf_priv *priv, int fd) +{ + struct gntdev_dmabuf *q, *gntdev_dmabuf, *ret = ERR_PTR(-ENOENT); + + mutex_lock(&priv->lock); + list_for_each_entry_safe(gntdev_dmabuf, q, &priv->exp_list, next) + if (gntdev_dmabuf->fd == fd) { + pr_debug("Found gntdev_dmabuf in the wait list\n"); + kref_get(&gntdev_dmabuf->u.exp.refcount); + ret = gntdev_dmabuf; + break; + } + mutex_unlock(&priv->lock); + return ret; +} + int gntdev_dmabuf_exp_wait_released(struct gntdev_dmabuf_priv *priv, int fd, int wait_to_ms) { - return -EINVAL; + struct gntdev_dmabuf *gntdev_dmabuf; + struct gntdev_dmabuf_wait_obj *obj; + int ret; + + pr_debug("Will wait for dma-buf with fd %d\n", fd); + /* + * Try to find the DMA buffer: if not found means that + * either the buffer has already been released or file descriptor + * provided is wrong. + */ + gntdev_dmabuf = dmabuf_exp_wait_obj_get_by_fd(priv, fd); + if (IS_ERR(gntdev_dmabuf)) + return PTR_ERR(gntdev_dmabuf); + + /* + * gntdev_dmabuf still exists and is reference count locked by us now, + * so prepare to wait: allocate wait object and add it to the wait list, + * so we can find it on release. + */ + obj = dmabuf_exp_wait_obj_new(priv, gntdev_dmabuf); + if (IS_ERR(obj)) + return PTR_ERR(obj); + + ret = dmabuf_exp_wait_obj_wait(obj, wait_to_ms); + dmabuf_exp_wait_obj_free(priv, obj); + return ret; +} + +/* DMA buffer export support. */ + +static struct sg_table * +dmabuf_pages_to_sgt(struct page **pages, unsigned int nr_pages) +{ + struct sg_table *sgt; + int ret; + + sgt = kmalloc(sizeof(*sgt), GFP_KERNEL); + if (!sgt) { + ret = -ENOMEM; + goto out; + } + + ret = sg_alloc_table_from_pages(sgt, pages, nr_pages, 0, + nr_pages << PAGE_SHIFT, + GFP_KERNEL); + if (ret) + goto out; + + return sgt; + +out: + kfree(sgt); + return ERR_PTR(ret); +} + +static int dmabuf_exp_ops_attach(struct dma_buf *dma_buf, + struct device *target_dev, + struct dma_buf_attachment *attach) +{ + struct gntdev_dmabuf_attachment *gntdev_dmabuf_attach; + + gntdev_dmabuf_attach = kzalloc(sizeof(*gntdev_dmabuf_attach), + GFP_KERNEL); + if (!gntdev_dmabuf_attach) + return -ENOMEM; + + gntdev_dmabuf_attach->dir = DMA_NONE; + attach->priv = gntdev_dmabuf_attach; + return 0; +} + +static void dmabuf_exp_ops_detach(struct dma_buf *dma_buf, + struct dma_buf_attachment *attach) +{ + struct gntdev_dmabuf_attachment *gntdev_dmabuf_attach = attach->priv; + + if (gntdev_dmabuf_attach) { + struct sg_table *sgt = gntdev_dmabuf_attach->sgt; + + if (sgt) { + if (gntdev_dmabuf_attach->dir != DMA_NONE) + dma_unmap_sg_attrs(attach->dev, sgt->sgl, + sgt->nents, + gntdev_dmabuf_attach->dir, + DMA_ATTR_SKIP_CPU_SYNC); + sg_free_table(sgt); + } + + kfree(sgt); + kfree(gntdev_dmabuf_attach); + attach->priv = NULL; + } +} + +static struct sg_table * +dmabuf_exp_ops_map_dma_buf(struct dma_buf_attachment *attach, + enum dma_data_direction dir) +{ + struct gntdev_dmabuf_attachment *gntdev_dmabuf_attach = attach->priv; + struct gntdev_dmabuf *gntdev_dmabuf = attach->dmabuf->priv; + struct sg_table *sgt; + + pr_debug("Mapping %d pages for dev %p\n", gntdev_dmabuf->nr_pages, + attach->dev); + + if (dir == DMA_NONE || !gntdev_dmabuf_attach) + return ERR_PTR(-EINVAL); + + /* Return the cached mapping when possible. */ + if (gntdev_dmabuf_attach->dir == dir) + return gntdev_dmabuf_attach->sgt; + + /* + * Two mappings with different directions for the same attachment are + * not allowed. + */ + if (gntdev_dmabuf_attach->dir != DMA_NONE) + return ERR_PTR(-EBUSY); + + sgt = dmabuf_pages_to_sgt(gntdev_dmabuf->pages, + gntdev_dmabuf->nr_pages); + if (!IS_ERR(sgt)) { + if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir, + DMA_ATTR_SKIP_CPU_SYNC)) { + sg_free_table(sgt); + kfree(sgt); + sgt = ERR_PTR(-ENOMEM); + } else { + gntdev_dmabuf_attach->sgt = sgt; + gntdev_dmabuf_attach->dir = dir; + } + } + if (IS_ERR(sgt)) + pr_debug("Failed to map sg table for dev %p\n", attach->dev); + return sgt; +} + +static void dmabuf_exp_ops_unmap_dma_buf(struct dma_buf_attachment *attach, + struct sg_table *sgt, + enum dma_data_direction dir) +{ + /* Not implemented. The unmap is done at dmabuf_exp_ops_detach(). */ +} + +static void dmabuf_exp_release(struct kref *kref) +{ + struct gntdev_dmabuf *gntdev_dmabuf = + container_of(kref, struct gntdev_dmabuf, u.exp.refcount); + + dmabuf_exp_wait_obj_signal(gntdev_dmabuf->priv, gntdev_dmabuf); + list_del(&gntdev_dmabuf->next); + kfree(gntdev_dmabuf); +} + +static void dmabuf_exp_ops_release(struct dma_buf *dma_buf) +{ + struct gntdev_dmabuf *gntdev_dmabuf = dma_buf->priv; + struct gntdev_dmabuf_priv *priv = gntdev_dmabuf->priv; + + gntdev_remove_map(gntdev_dmabuf->u.exp.priv, gntdev_dmabuf->u.exp.map); + mutex_lock(&priv->lock); + kref_put(&gntdev_dmabuf->u.exp.refcount, dmabuf_exp_release); + mutex_unlock(&priv->lock); +} + +static void *dmabuf_exp_ops_kmap_atomic(struct dma_buf *dma_buf, + unsigned long page_num) +{ + /* Not implemented. */ + return NULL; +} + +static void dmabuf_exp_ops_kunmap_atomic(struct dma_buf *dma_buf, + unsigned long page_num, void *addr) +{ + /* Not implemented. */ +} + +static void *dmabuf_exp_ops_kmap(struct dma_buf *dma_buf, + unsigned long page_num) +{ + /* Not implemented. */ + return NULL; +} + +static void dmabuf_exp_ops_kunmap(struct dma_buf *dma_buf, + unsigned long page_num, void *addr) +{ + /* Not implemented. */ +} + +static int dmabuf_exp_ops_mmap(struct dma_buf *dma_buf, + struct vm_area_struct *vma) +{ + /* Not implemented. */ + return 0; +} + +static const struct dma_buf_ops dmabuf_exp_ops = { + .attach = dmabuf_exp_ops_attach, + .detach = dmabuf_exp_ops_detach, + .map_dma_buf = dmabuf_exp_ops_map_dma_buf, + .unmap_dma_buf = dmabuf_exp_ops_unmap_dma_buf, + .release = dmabuf_exp_ops_release, + .map = dmabuf_exp_ops_kmap, + .map_atomic = dmabuf_exp_ops_kmap_atomic, + .unmap = dmabuf_exp_ops_kunmap, + .unmap_atomic = dmabuf_exp_ops_kunmap_atomic, + .mmap = dmabuf_exp_ops_mmap, +}; + +struct gntdev_dmabuf_export_args { + struct gntdev_priv *priv; + struct gntdev_grant_map *map; + struct gntdev_dmabuf_priv *dmabuf_priv; + struct device *dev; + int count; + struct page **pages; + u32 fd; +}; + +static int dmabuf_exp_from_pages(struct gntdev_dmabuf_export_args *args) +{ + DEFINE_DMA_BUF_EXPORT_INFO(exp_info); + struct gntdev_dmabuf *gntdev_dmabuf; + int ret = 0; + + gntdev_dmabuf = kzalloc(sizeof(*gntdev_dmabuf), GFP_KERNEL); + if (!gntdev_dmabuf) + return -ENOMEM; + + kref_init(&gntdev_dmabuf->u.exp.refcount); + + gntdev_dmabuf->priv = args->dmabuf_priv; + gntdev_dmabuf->nr_pages = args->count; + gntdev_dmabuf->pages = args->pages; + gntdev_dmabuf->u.exp.priv = args->priv; + gntdev_dmabuf->u.exp.map = args->map; + + exp_info.exp_name = KBUILD_MODNAME; + if (args->dev->driver && args->dev->driver->owner) + exp_info.owner = args->dev->driver->owner; + else + exp_info.owner = THIS_MODULE; + exp_info.ops = &dmabuf_exp_ops; + exp_info.size = args->count << PAGE_SHIFT; + exp_info.flags = O_RDWR; + exp_info.priv = gntdev_dmabuf; + + gntdev_dmabuf->dmabuf = dma_buf_export(&exp_info); + if (IS_ERR(gntdev_dmabuf->dmabuf)) { + ret = PTR_ERR(gntdev_dmabuf->dmabuf); + gntdev_dmabuf->dmabuf = NULL; + goto fail; + } + + ret = dma_buf_fd(gntdev_dmabuf->dmabuf, O_CLOEXEC); + if (ret < 0) + goto fail; + + gntdev_dmabuf->fd = ret; + args->fd = ret; + + pr_debug("Exporting DMA buffer with fd %d\n", ret); + + mutex_lock(&args->dmabuf_priv->lock); + list_add(&gntdev_dmabuf->next, &args->dmabuf_priv->exp_list); + mutex_unlock(&args->dmabuf_priv->lock); + return 0; + +fail: + if (gntdev_dmabuf->dmabuf) + dma_buf_put(gntdev_dmabuf->dmabuf); + kfree(gntdev_dmabuf); + return ret; +} + +static struct gntdev_grant_map * +dmabuf_exp_alloc_backing_storage(struct gntdev_priv *priv, int dmabuf_flags, + int count) +{ + struct gntdev_grant_map *map; + + if (unlikely(count <= 0)) + return ERR_PTR(-EINVAL); + + if ((dmabuf_flags & GNTDEV_DMA_FLAG_WC) && + (dmabuf_flags & GNTDEV_DMA_FLAG_COHERENT)) { + pr_debug("Wrong dma-buf flags: either WC or coherent, not both\n"); + return ERR_PTR(-EINVAL); + } + + map = gntdev_alloc_map(priv, count, dmabuf_flags); + if (!map) + return ERR_PTR(-ENOMEM); + + if (unlikely(gntdev_account_mapped_pages(count))) { + pr_debug("can't map: over limit\n"); + gntdev_put_map(NULL, map); + return ERR_PTR(-ENOMEM); + } + return map; } int gntdev_dmabuf_exp_from_refs(struct gntdev_priv *priv, int flags, int count, u32 domid, u32 *refs, u32 *fd) { + struct gntdev_grant_map *map; + struct gntdev_dmabuf_export_args args; + int i, ret; + *fd = -1; - return -EINVAL; + + map = dmabuf_exp_alloc_backing_storage(priv, flags, count); + if (IS_ERR(map)) + return PTR_ERR(map); + + for (i = 0; i < count; i++) { + map->grants[i].domid = domid; + map->grants[i].ref = refs[i]; + } + + mutex_lock(&priv->lock); + gntdev_add_map(priv, map); + mutex_unlock(&priv->lock); + + map->flags |= GNTMAP_host_map; +#if defined(CONFIG_X86) + map->flags |= GNTMAP_device_map; +#endif + + ret = gntdev_map_grant_pages(map); + if (ret < 0) + goto out; + + args.priv = priv; + args.map = map; + args.dev = priv->dma_dev; + args.dmabuf_priv = priv->dmabuf_priv; + args.count = map->count; + args.pages = map->pages; + + ret = dmabuf_exp_from_pages(&args); + if (ret < 0) + goto out; + + *fd = args.fd; + return 0; + +out: + gntdev_remove_map(priv, map); + return ret; } /* DMA buffer import support. */ @@ -63,6 +525,10 @@ struct gntdev_dmabuf_priv *gntdev_dmabuf_init(void) if (!priv) return ERR_PTR(-ENOMEM); + mutex_init(&priv->lock); + INIT_LIST_HEAD(&priv->exp_list); + INIT_LIST_HEAD(&priv->exp_wait_list); + return priv; } diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index e82660d81d7e..5f93cd534840 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -262,6 +262,16 @@ void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map) gntdev_free_map(map); } +#ifdef CONFIG_XEN_GNTDEV_DMABUF +void gntdev_remove_map(struct gntdev_priv *priv, struct gntdev_grant_map *map) +{ + mutex_lock(&priv->lock); + list_del(&map->next); + gntdev_put_map(NULL /* already removed */, map); + mutex_unlock(&priv->lock); +} +#endif + /* ------------------------------------------------------------------ */ static int find_grant_ptes(pte_t *pte, pgtable_t token, -- 2.17.1