From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lee Jones Subject: Re: [PATCH 4/6] hwrng: st: Add support for ST's HW Random Number Generator Date: Mon, 14 Sep 2015 09:04:51 +0100 Message-ID: <20150914080451.GD27591@x1> References: <1442002110-28733-1-git-send-email-lee.jones@linaro.org> <1442002110-28733-5-git-send-email-lee.jones@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: devicetree@vger.kernel.org, herbert@gondor.apana.org.au, linux-kernel@vger.kernel.org, Pankaj Dev , linux-crypto@vger.kernel.org, mpm@selenic.com, linux-arm-kernel@lists.infradead.org, kernel@stlinux.com To: Kieran Bingham Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org List-Id: linux-crypto.vger.kernel.org T24gU2F0LCAxMiBTZXAgMjAxNSwgS2llcmFuIEJpbmdoYW0gd3JvdGU6Cj4gT24gMTEgU2VwdGVt YmVyIDIwMTUgYXQgMjE6MDgsIExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+IHdyb3Rl Ogo+ID4gU2lnbmVkLW9mZi1ieTogUGFua2FqIERldiA8cGFua2FqLmRldkBzdC5jb20+Cj4gPiBT aWduZWQtb2ZmLWJ5OiBMZWUgSm9uZXMgPGxlZS5qb25lc0BsaW5hcm8ub3JnPgo+ID4gLS0tCj4g PiAgZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnICB8ICAxMCArKysKPiA+ICBkcml2ZXJz L2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlIHwgICAxICsKPiA+ICBkcml2ZXJzL2NoYXIvaHdfcmFu ZG9tL3N0LXJuZy5jIHwgMTQyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKPiA+ICAzIGZpbGVzIGNoYW5nZWQsIDE1MyBpbnNlcnRpb25zKCspCj4gPiAgY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvY2hhci9od19yYW5kb20vc3Qtcm5nLmMKPiA+Cj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2h3X3Jh bmRvbS9LY29uZmlnCj4gPiBpbmRleCBmNDhjZjExLi5iYjZjYjc3IDEwMDY0NAo+ID4gLS0tIGEv ZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCj4gPiArKysgYi9kcml2ZXJzL2NoYXIvaHdf cmFuZG9tL0tjb25maWcKPiA+IEBAIC0zNDYsNiArMzQ2LDE2IEBAIGNvbmZpZyBIV19SQU5ET01f TVNNCj4gPgo+ID4gICAgICAgICAgIElmIHVuc3VyZSwgc2F5IFkuCj4gPgo+ID4gK2NvbmZpZyBI V19SQU5ET01fU1QKPiA+ICsgICAgICAgdHJpc3RhdGUgIlNUIE1pY3JvZWxlY3Ryb25pY3MgSFcg UmFuZG9tIE51bWJlciBHZW5lcmF0b3Igc3VwcG9ydCIKPiA+ICsgICAgICAgZGVwZW5kcyBvbiBI V19SQU5ET00gJiYgQVJDSF9TVEkKPiA+ICsgICAgICAgLS0taGVscC0tLQo+ID4gKyAgICAgICAg IFRoaXMgZHJpdmVyIHByb3ZpZGVzIGtlcm5lbC1zaWRlIHN1cHBvcnQgZm9yIHRoZSBSYW5kb20g TnVtYmVyCj4gPiArICAgICAgICAgR2VuZXJhdG9yIGhhcmR3YXJlIGZvdW5kIG9uIFNUaSBzZXJp ZXMgb2YgU29Dcy4KPiA+ICsKPiA+ICsgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFz IGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKPiA+ICsgICAgICAgICBtb2R1bGUgd2lsbCBi ZSBjYWxsZWQgc3Qtcm5nLgo+ID4gKwo+ID4gIGNvbmZpZyBIV19SQU5ET01fWEdFTkUKPiA+ICAg ICAgICAgdHJpc3RhdGUgIkFQTSBYLUdlbmUgVHJ1ZSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciAo VFJORykgc3VwcG9ydCIKPiA+ICAgICAgICAgZGVwZW5kcyBvbiBIV19SQU5ET00gJiYgQVJDSF9Y R0VORQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vTWFrZWZpbGUgYi9k cml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlCj4gPiBpbmRleCAwNTViYjAxLi44YmNmYjQ1 IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQo+ID4gKysr IGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQo+ID4gQEAgLTMwLDQgKzMwLDUgQEAg b2JqLSQoQ09ORklHX0hXX1JBTkRPTV9UUE0pICs9IHRwbS1ybmcubwo+ID4gIG9iai0kKENPTkZJ R19IV19SQU5ET01fQkNNMjgzNSkgKz0gYmNtMjgzNS1ybmcubwo+ID4gIG9iai0kKENPTkZJR19I V19SQU5ET01fSVBST0NfUk5HMjAwKSArPSBpcHJvYy1ybmcyMDAubwo+ID4gIG9iai0kKENPTkZJ R19IV19SQU5ET01fTVNNKSArPSBtc20tcm5nLm8KPiA+ICtvYmotJChDT05GSUdfSFdfUkFORE9N X1NUKSArPSBzdC1ybmcubwo+ID4gIG9iai0kKENPTkZJR19IV19SQU5ET01fWEdFTkUpICs9IHhn ZW5lLXJuZy5vCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9zdC1ybmcu YyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vc3Qtcm5nLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi43MTdhODMxCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysg Yi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3N0LXJuZy5jCj4gPiBAQCAtMCwwICsxLDE0MiBAQAo+ ID4gKy8qCj4gPiArICogU1QgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgRHJpdmVyIFNUJ3MgUGxh dGZvcm1zCj4gPiArICoKPiA+ICsgKiBBdXRob3I6IFBhbmthaiBEZXY6IDxwYW5rYWouZGV2QHN0 LmNvbT4KPiA+ICsgKiAgICAgICAgIExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+Cj4g PiArICoKPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU1RNaWNyb2VsZWN0cm9uaWNzIChSJkQp IExpbWl0ZWQKPiA+ICsgKgo+ID4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gPiArICogaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKPiA+ ICsgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KPiA+ICsgKi8K PiA+ICsKPiA+ICsjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2Rl bGF5Lmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2h3X3JhbmRvbS5oPgo+ID4gKyNpbmNsdWRlIDxs aW51eC9pby5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgvb2YuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiA+ICsKPiA+ICsvKiBSZWdpc3RlcnMgKi8KPiA+ICsj ZGVmaW5lIFNUX1JOR19TVEFUVVNfUkVHICAgICAgICAgICAgICAweDIwCj4gPiArI2RlZmluZSBT VF9STkdfREFUQV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAweDI0Cj4gPiArCj4gPiArLyog UmVnaXN0ZXJzIGZpZWxkcyAqLwo+ID4gKyNkZWZpbmUgU1RfUk5HX1NUQVRVU19CQURfU0VRVUVO Q0UgICAgIEJJVCgwKQo+ID4gKyNkZWZpbmUgU1RfUk5HX1NUQVRVU19CQURfQUxURVJOQU5DRSAg IEJJVCgxKQo+ID4gKyNkZWZpbmUgU1RfUk5HX1NUQVRVU19GSUZPX0ZVTEwgICAgICAgICAgICAg ICAgQklUKDUpCj4gPiArCj4gPiArI2RlZmluZSBTVF9STkdfRklGT19TSVpFICAgICAgICAgICAg ICAgOAo+ID4gKyNkZWZpbmUgU1RfUk5HX1NBTVBMRV9TSVpFICAgICAgICAgICAgIDIgLyogMiBC eXRlICgxNmJpdCkgc2FtcGxlcyAqLwo+ID4gKwo+ID4gKy8qIFNhbXBsZXMgYXJlIGF2YWlsYWJs ZSBldmVyeSAwLjY2N3VzLCB3aGljaCB3ZSByb3VuZCB0byAxdXMgKi8KPiA+ICsjZGVmaW5lIFNU X1JOR19GSUxMX0ZJRk9fVElNRU9VVCAgICgxICogKFNUX1JOR19GSUZPX1NJWkUgLyBTVF9STkdf U0FNUExFX1NJWkUpKQo+ID4gKwo+ID4gK3N0cnVjdCBzdF9ybmdfZGF0YSB7Cj4gPiArICAgICAg IHZvaWQgX19pb21lbSAgICAqYmFzZTsKPiA+ICsgICAgICAgc3RydWN0IGNsayAgICAgICpjbGs7 Cj4gPiArICAgICAgIHN0cnVjdCBod3JuZyAgICBvcHM7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdGF0 aWMgaW50IHN0X3JuZ19yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB2b2lkICpkYXRhLCBzaXplX3Qg bWF4LCBib29sIHdhaXQpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3Qgc3Rfcm5nX2RhdGEgKmRk YXRhID0gKHN0cnVjdCBzdF9ybmdfZGF0YSAqKXJuZy0+cHJpdjsKPiA+ICsgICAgICAgdTMyIHN0 YXR1czsKPiA+ICsgICAgICAgaW50IGk7Cj4gPiArCj4gPiArICAgICAgIGlmIChtYXggPCBzaXpl b2YodTE2KSkKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ICsKPiA+ICsg ICAgICAgLyogV2FpdCB1bnRpbCBGSUZPIGlzIGZ1bGwgLSBtYXggNHVTKi8KPiA+ICsgICAgICAg Zm9yIChpID0gMDsgaSA8IFNUX1JOR19GSUxMX0ZJRk9fVElNRU9VVDsgaSsrKSB7Cj4gPiArICAg ICAgICAgICAgICAgc3RhdHVzID0gcmVhZGxfcmVsYXhlZChkZGF0YS0+YmFzZSArIFNUX1JOR19T VEFUVVNfUkVHKTsKPiA+ICsgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgU1RfUk5HX1NUQVRV U19GSUZPX0ZVTEwpCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiA+ICsgICAg ICAgICAgICAgICB1ZGVsYXkoMSk7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgaWYg KGkgPT0gU1RfUk5HX0ZJTExfRklGT19USU1FT1VUKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVy biAwOwo+ID4gKwo+ID4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgU1RfUk5HX0ZJRk9fU0laRSAm JiBpIDwgbWF4OyBpICs9IDIpCj4gPiArICAgICAgICAgICAgICAgKih1MTYgKikoZGF0YSArIGkp ID0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlYWRsX3JlbGF4ZWQoZGRhdGEtPmJhc2Ug KyBTVF9STkdfREFUQV9SRUcpOwo+IAo+IFdpbGwgdGhpcyBjb2RlIGFsd2F5cyBiZSBjYWxsZWQg d2l0aCBtYXggJSAyID09IDA/IC4uLgo+ICBJLmUuIHdpbGwKPiAgICAgc3Rfcm5nX3JlYWQocm5n LCBkYXRhWzVdLCA1LCB3YWl0ZmxnKQo+ICBvdmVyZmxvdyBhbiBhcnJheT8KCi5yZWFkKCkgY2Fu IGJlIGNhbGxlZCB3aXRoIGVpdGhlciAxNiwgMzIgb3IgdGhlIHNpemUgb2YgdGhlIGNhY2hlLAp3 aGljaCBpcyB1bmxpa2VseSB0byBiZSBhbnl0aGluZyAhKE5eMikgKGl0J3MgNjQgaW4gb3VyIGNh c2UpLgoKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIGkgLSAyOyAgIC8qIE5vIG9mIGJ5dGVzIHJl YWQgKi8KPiAKPiAgIFJlYWxseT8gRG9lc24ndCB0aGlzIHJldHVybiAwIG9uIHN0X3JuZ19yZWFk KHJuZywgZGF0YVsyXSwgMiwgd2FpdGZsZyk7CgpIbW0uLi4gSSBhc3N1bWVkIHRoZSBPQSdzIG1h dGggd2FzIGdvb2QgaGVyZS4KCkdvb2Qgc3BvdC4gIEkgd2lsbCBydW4gc29tZSB0ZXN0cyB0byBj b25maXJtLgoKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBzdF9ybmdfcHJvYmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBzdF9ybmdf ZGF0YSAqZGRhdGE7Cj4gPiArICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzOwo+ID4gKyAgICAg ICBzdHJ1Y3QgY2xrICpjbGs7Cj4gPiArICAgICAgIHZvaWQgX19pb21lbSAqYmFzZTsKPiA+ICsg ICAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsgICAgICAgZGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBk ZXYtPmRldiwgc2l6ZW9mKCpkZGF0YSksIEdGUF9LRVJORUwpOwo+ID4gKyAgICAgICBpZiAoIWRk YXRhKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gKwo+ID4gKyAgICAg ICByZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwo+ ID4gKyAgICAgICBiYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7 Cj4gPiArICAgICAgIGlmIChJU19FUlIoYmFzZSkpCj4gCj4gQXJlIHdlIGxlYWtpbmcgZGRhdGEg aGVyZSA/IEkuZS4gYmVmb3JlIGl0cyBhdHRhY2hlZCB3aXRoIHNldF9kcnZkYXRhPwoKSXQgd29u J3QgbGVhay4gIFRoYXQncyB0aGUgcG9pbnQgb2YgZGV2bV8qLgoKUGxlYXNlIHNlZTogRG9jdW1l bnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2cmVzLnR4dAoKPiA+ICsgICAgICAgICAgICAgICByZXR1 cm4gUFRSX0VSUihiYXNlKTsKPiA+ICsKPiA+ICsgICAgICAgY2xrID0gZGV2bV9jbGtfZ2V0KCZw ZGV2LT5kZXYsIE5VTEwpOwo+ID4gKyAgICAgICBpZiAoIWNsaykKPiAKPiBBbmQgaGVyZSAuLi4K Ck5vcGUuCgo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4gKyAg ICAgICBjbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKPiA+ICsKPiA+ICsgICAgICAgZGRhdGEtPm9w cy5wcml2ID0gKHVuc2lnbmVkIGxvbmcpZGRhdGE7Cj4gPiArICAgICAgIGRkYXRhLT5vcHMucmVh ZCA9IHN0X3JuZ19yZWFkOwo+ID4gKyAgICAgICBkZGF0YS0+b3BzLm5hbWUgPSBwZGV2LT5uYW1l Owo+ID4gKyAgICAgICBkZGF0YS0+YmFzZSAgICAgPSBiYXNlOwo+ID4gKyAgICAgICBkZGF0YS0+ Y2xrICAgICAgPSBjbGs7Cj4gPiArCj4gPiArICAgICAgIGRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ ZGV2LCBkZGF0YSk7Cj4gPiArCj4gPiArICAgICAgIHJldCA9IGh3cm5nX3JlZ2lzdGVyKCZkZGF0 YS0+b3BzKTsKPiA+ICsgICAgICAgaWYgKHJldCkgewo+ID4gKyAgICAgICAgICAgICAgIGRldl9l cnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBIVyBSTkdcbiIpOwo+ID4gKyAgICAg ICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgZGV2 X2luZm8oJnBkZXYtPmRldiwgIlN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIEhXIFJOR1xuIik7Cj4g PiArCj4gPiArICAgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IHN0 X3JuZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAg ICAgIHN0cnVjdCBzdF9ybmdfZGF0YSAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRl dik7Cj4gPiArCj4gPiArICAgICAgIGh3cm5nX3VucmVnaXN0ZXIoJmRkYXRhLT5vcHMpOwo+ID4g Kwo+ID4gKyAgICAgICBjbGtfZGlzYWJsZV91bnByZXBhcmUoZGRhdGEtPmNsayk7Cj4gPiArCj4g PiArICAgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IG9mX2RldmljZV9pZCBzdF9ybmdfbWF0Y2hbXSA9IHsKPiA+ICsgICAgICAgeyAuY29tcGF0aWJs ZSA9ICJzdCxybmciIH0sCj4gPiArICAgICAgIHt9LAo+ID4gK307Cj4gPiArTU9EVUxFX0RFVklD RV9UQUJMRShvZiwgc3Rfcm5nX21hdGNoKTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRm b3JtX2RyaXZlciBzdF9ybmdfZHJpdmVyID0gewo+ID4gKyAgICAgICAuZHJpdmVyID0gewo+ID4g KyAgICAgICAgICAgICAgIC5uYW1lID0gInN0LWh3cmFuZG9tIiwKPiA+ICsgICAgICAgICAgICAg ICAub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoc3Rfcm5nX21hdGNoKSwKPiA+ICsgICAg ICAgfSwKPiA+ICsgICAgICAgLnByb2JlID0gc3Rfcm5nX3Byb2JlLAo+ID4gKyAgICAgICAucmVt b3ZlID0gc3Rfcm5nX3JlbW92ZQo+ID4gK307Cj4gPiArCj4gPiArbW9kdWxlX3BsYXRmb3JtX2Ry aXZlcihzdF9ybmdfZHJpdmVyKTsKPiA+ICsKPiA+ICtNT0RVTEVfQVVUSE9SKCJQYW5rYWogRGV2 IDxwYW5rYWouZGV2QHN0LmNvbT4iKTsKPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4g Pgo+IAo+IAoKLS0gCkxlZSBKb25lcwpMaW5hcm8gU1RNaWNyb2VsZWN0cm9uaWNzIExhbmRpbmcg VGVhbSBMZWFkCkxpbmFyby5vcmcg4pSCIE9wZW4gc291cmNlIHNvZnR3YXJlIGZvciBBUk0gU29D cwpGb2xsb3cgTGluYXJvOiBGYWNlYm9vayB8IFR3aXR0ZXIgfCBCbG9nCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: lee.jones@linaro.org (Lee Jones) Date: Mon, 14 Sep 2015 09:04:51 +0100 Subject: [PATCH 4/6] hwrng: st: Add support for ST's HW Random Number Generator In-Reply-To: References: <1442002110-28733-1-git-send-email-lee.jones@linaro.org> <1442002110-28733-5-git-send-email-lee.jones@linaro.org> Message-ID: <20150914080451.GD27591@x1> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Sat, 12 Sep 2015, Kieran Bingham wrote: > On 11 September 2015 at 21:08, Lee Jones wrote: > > Signed-off-by: Pankaj Dev > > Signed-off-by: Lee Jones > > --- > > drivers/char/hw_random/Kconfig | 10 +++ > > drivers/char/hw_random/Makefile | 1 + > > drivers/char/hw_random/st-rng.c | 142 ++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 153 insertions(+) > > create mode 100644 drivers/char/hw_random/st-rng.c > > > > diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig > > index f48cf11..bb6cb77 100644 > > --- a/drivers/char/hw_random/Kconfig > > +++ b/drivers/char/hw_random/Kconfig > > @@ -346,6 +346,16 @@ config HW_RANDOM_MSM > > > > If unsure, say Y. > > > > +config HW_RANDOM_ST > > + tristate "ST Microelectronics HW Random Number Generator support" > > + depends on HW_RANDOM && ARCH_STI > > + ---help--- > > + This driver provides kernel-side support for the Random Number > > + Generator hardware found on STi series of SoCs. > > + > > + To compile this driver as a module, choose M here: the > > + module will be called st-rng. > > + > > config HW_RANDOM_XGENE > > tristate "APM X-Gene True Random Number Generator (TRNG) support" > > depends on HW_RANDOM && ARCH_XGENE > > diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile > > index 055bb01..8bcfb45 100644 > > --- a/drivers/char/hw_random/Makefile > > +++ b/drivers/char/hw_random/Makefile > > @@ -30,4 +30,5 @@ obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o > > obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o > > obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) += iproc-rng200.o > > obj-$(CONFIG_HW_RANDOM_MSM) += msm-rng.o > > +obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o > > obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o > > diff --git a/drivers/char/hw_random/st-rng.c b/drivers/char/hw_random/st-rng.c > > new file mode 100644 > > index 0000000..717a831 > > --- /dev/null > > +++ b/drivers/char/hw_random/st-rng.c > > @@ -0,0 +1,142 @@ > > +/* > > + * ST Random Number Generator Driver ST's Platforms > > + * > > + * Author: Pankaj Dev: > > + * Lee Jones > > + * > > + * Copyright (C) 2015 STMicroelectronics (R&D) Limited > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License version 2 as > > + * published by the Free Software Foundation. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +/* Registers */ > > +#define ST_RNG_STATUS_REG 0x20 > > +#define ST_RNG_DATA_REG 0x24 > > + > > +/* Registers fields */ > > +#define ST_RNG_STATUS_BAD_SEQUENCE BIT(0) > > +#define ST_RNG_STATUS_BAD_ALTERNANCE BIT(1) > > +#define ST_RNG_STATUS_FIFO_FULL BIT(5) > > + > > +#define ST_RNG_FIFO_SIZE 8 > > +#define ST_RNG_SAMPLE_SIZE 2 /* 2 Byte (16bit) samples */ > > + > > +/* Samples are available every 0.667us, which we round to 1us */ > > +#define ST_RNG_FILL_FIFO_TIMEOUT (1 * (ST_RNG_FIFO_SIZE / ST_RNG_SAMPLE_SIZE)) > > + > > +struct st_rng_data { > > + void __iomem *base; > > + struct clk *clk; > > + struct hwrng ops; > > +}; > > + > > +static int st_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) > > +{ > > + struct st_rng_data *ddata = (struct st_rng_data *)rng->priv; > > + u32 status; > > + int i; > > + > > + if (max < sizeof(u16)) > > + return -EINVAL; > > + > > + /* Wait until FIFO is full - max 4uS*/ > > + for (i = 0; i < ST_RNG_FILL_FIFO_TIMEOUT; i++) { > > + status = readl_relaxed(ddata->base + ST_RNG_STATUS_REG); > > + if (status & ST_RNG_STATUS_FIFO_FULL) > > + break; > > + udelay(1); > > + } > > + > > + if (i == ST_RNG_FILL_FIFO_TIMEOUT) > > + return 0; > > + > > + for (i = 0; i < ST_RNG_FIFO_SIZE && i < max; i += 2) > > + *(u16 *)(data + i) = > > + readl_relaxed(ddata->base + ST_RNG_DATA_REG); > > Will this code always be called with max % 2 == 0? ... > I.e. will > st_rng_read(rng, data[5], 5, waitflg) > overflow an array? .read() can be called with either 16, 32 or the size of the cache, which is unlikely to be anything !(N^2) (it's 64 in our case). > > + > > + return i - 2; /* No of bytes read */ > > Really? Doesn't this return 0 on st_rng_read(rng, data[2], 2, waitflg); Hmm... I assumed the OA's math was good here. Good spot. I will run some tests to confirm. > > +} > > + > > +static int st_rng_probe(struct platform_device *pdev) > > +{ > > + struct st_rng_data *ddata; > > + struct resource *res; > > + struct clk *clk; > > + void __iomem *base; > > + int ret; > > + > > + ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); > > + if (!ddata) > > + return -ENOMEM; > > + > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + base = devm_ioremap_resource(&pdev->dev, res); > > + if (IS_ERR(base)) > > Are we leaking ddata here ? I.e. before its attached with set_drvdata? It won't leak. That's the point of devm_*. Please see: Documentation/driver-model/devres.txt > > + return PTR_ERR(base); > > + > > + clk = devm_clk_get(&pdev->dev, NULL); > > + if (!clk) > > And here ... Nope. > > + return -EINVAL; > > + > > + clk_prepare_enable(clk); > > + > > + ddata->ops.priv = (unsigned long)ddata; > > + ddata->ops.read = st_rng_read; > > + ddata->ops.name = pdev->name; > > + ddata->base = base; > > + ddata->clk = clk; > > + > > + dev_set_drvdata(&pdev->dev, ddata); > > + > > + ret = hwrng_register(&ddata->ops); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to register HW RNG\n"); > > + return ret; > > + } > > + > > + dev_info(&pdev->dev, "Successfully registered HW RNG\n"); > > + > > + return 0; > > +} > > + > > +static int st_rng_remove(struct platform_device *pdev) > > +{ > > + struct st_rng_data *ddata = dev_get_drvdata(&pdev->dev); > > + > > + hwrng_unregister(&ddata->ops); > > + > > + clk_disable_unprepare(ddata->clk); > > + > > + return 0; > > +} > > + > > +static const struct of_device_id st_rng_match[] = { > > + { .compatible = "st,rng" }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(of, st_rng_match); > > + > > +static struct platform_driver st_rng_driver = { > > + .driver = { > > + .name = "st-hwrandom", > > + .of_match_table = of_match_ptr(st_rng_match), > > + }, > > + .probe = st_rng_probe, > > + .remove = st_rng_remove > > +}; > > + > > +module_platform_driver(st_rng_driver); > > + > > +MODULE_AUTHOR("Pankaj Dev "); > > +MODULE_LICENSE("GPL v2"); > > > > -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org ? Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754622AbbINIFb (ORCPT ); Mon, 14 Sep 2015 04:05:31 -0400 Received: from mail-wi0-f179.google.com ([209.85.212.179]:33122 "EHLO mail-wi0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753643AbbINIEz (ORCPT ); Mon, 14 Sep 2015 04:04:55 -0400 Date: Mon, 14 Sep 2015 09:04:51 +0100 From: Lee Jones To: Kieran Bingham Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@stlinux.com, mpm@selenic.com, herbert@gondor.apana.org.au, linux-crypto@vger.kernel.org, devicetree@vger.kernel.org, Pankaj Dev Subject: Re: [PATCH 4/6] hwrng: st: Add support for ST's HW Random Number Generator Message-ID: <20150914080451.GD27591@x1> References: <1442002110-28733-1-git-send-email-lee.jones@linaro.org> <1442002110-28733-5-git-send-email-lee.jones@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, 12 Sep 2015, Kieran Bingham wrote: > On 11 September 2015 at 21:08, Lee Jones wrote: > > Signed-off-by: Pankaj Dev > > Signed-off-by: Lee Jones > > --- > > drivers/char/hw_random/Kconfig | 10 +++ > > drivers/char/hw_random/Makefile | 1 + > > drivers/char/hw_random/st-rng.c | 142 ++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 153 insertions(+) > > create mode 100644 drivers/char/hw_random/st-rng.c > > > > diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig > > index f48cf11..bb6cb77 100644 > > --- a/drivers/char/hw_random/Kconfig > > +++ b/drivers/char/hw_random/Kconfig > > @@ -346,6 +346,16 @@ config HW_RANDOM_MSM > > > > If unsure, say Y. > > > > +config HW_RANDOM_ST > > + tristate "ST Microelectronics HW Random Number Generator support" > > + depends on HW_RANDOM && ARCH_STI > > + ---help--- > > + This driver provides kernel-side support for the Random Number > > + Generator hardware found on STi series of SoCs. > > + > > + To compile this driver as a module, choose M here: the > > + module will be called st-rng. > > + > > config HW_RANDOM_XGENE > > tristate "APM X-Gene True Random Number Generator (TRNG) support" > > depends on HW_RANDOM && ARCH_XGENE > > diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile > > index 055bb01..8bcfb45 100644 > > --- a/drivers/char/hw_random/Makefile > > +++ b/drivers/char/hw_random/Makefile > > @@ -30,4 +30,5 @@ obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o > > obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o > > obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) += iproc-rng200.o > > obj-$(CONFIG_HW_RANDOM_MSM) += msm-rng.o > > +obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o > > obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o > > diff --git a/drivers/char/hw_random/st-rng.c b/drivers/char/hw_random/st-rng.c > > new file mode 100644 > > index 0000000..717a831 > > --- /dev/null > > +++ b/drivers/char/hw_random/st-rng.c > > @@ -0,0 +1,142 @@ > > +/* > > + * ST Random Number Generator Driver ST's Platforms > > + * > > + * Author: Pankaj Dev: > > + * Lee Jones > > + * > > + * Copyright (C) 2015 STMicroelectronics (R&D) Limited > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License version 2 as > > + * published by the Free Software Foundation. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +/* Registers */ > > +#define ST_RNG_STATUS_REG 0x20 > > +#define ST_RNG_DATA_REG 0x24 > > + > > +/* Registers fields */ > > +#define ST_RNG_STATUS_BAD_SEQUENCE BIT(0) > > +#define ST_RNG_STATUS_BAD_ALTERNANCE BIT(1) > > +#define ST_RNG_STATUS_FIFO_FULL BIT(5) > > + > > +#define ST_RNG_FIFO_SIZE 8 > > +#define ST_RNG_SAMPLE_SIZE 2 /* 2 Byte (16bit) samples */ > > + > > +/* Samples are available every 0.667us, which we round to 1us */ > > +#define ST_RNG_FILL_FIFO_TIMEOUT (1 * (ST_RNG_FIFO_SIZE / ST_RNG_SAMPLE_SIZE)) > > + > > +struct st_rng_data { > > + void __iomem *base; > > + struct clk *clk; > > + struct hwrng ops; > > +}; > > + > > +static int st_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) > > +{ > > + struct st_rng_data *ddata = (struct st_rng_data *)rng->priv; > > + u32 status; > > + int i; > > + > > + if (max < sizeof(u16)) > > + return -EINVAL; > > + > > + /* Wait until FIFO is full - max 4uS*/ > > + for (i = 0; i < ST_RNG_FILL_FIFO_TIMEOUT; i++) { > > + status = readl_relaxed(ddata->base + ST_RNG_STATUS_REG); > > + if (status & ST_RNG_STATUS_FIFO_FULL) > > + break; > > + udelay(1); > > + } > > + > > + if (i == ST_RNG_FILL_FIFO_TIMEOUT) > > + return 0; > > + > > + for (i = 0; i < ST_RNG_FIFO_SIZE && i < max; i += 2) > > + *(u16 *)(data + i) = > > + readl_relaxed(ddata->base + ST_RNG_DATA_REG); > > Will this code always be called with max % 2 == 0? ... > I.e. will > st_rng_read(rng, data[5], 5, waitflg) > overflow an array? .read() can be called with either 16, 32 or the size of the cache, which is unlikely to be anything !(N^2) (it's 64 in our case). > > + > > + return i - 2; /* No of bytes read */ > > Really? Doesn't this return 0 on st_rng_read(rng, data[2], 2, waitflg); Hmm... I assumed the OA's math was good here. Good spot. I will run some tests to confirm. > > +} > > + > > +static int st_rng_probe(struct platform_device *pdev) > > +{ > > + struct st_rng_data *ddata; > > + struct resource *res; > > + struct clk *clk; > > + void __iomem *base; > > + int ret; > > + > > + ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); > > + if (!ddata) > > + return -ENOMEM; > > + > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + base = devm_ioremap_resource(&pdev->dev, res); > > + if (IS_ERR(base)) > > Are we leaking ddata here ? I.e. before its attached with set_drvdata? It won't leak. That's the point of devm_*. Please see: Documentation/driver-model/devres.txt > > + return PTR_ERR(base); > > + > > + clk = devm_clk_get(&pdev->dev, NULL); > > + if (!clk) > > And here ... Nope. > > + return -EINVAL; > > + > > + clk_prepare_enable(clk); > > + > > + ddata->ops.priv = (unsigned long)ddata; > > + ddata->ops.read = st_rng_read; > > + ddata->ops.name = pdev->name; > > + ddata->base = base; > > + ddata->clk = clk; > > + > > + dev_set_drvdata(&pdev->dev, ddata); > > + > > + ret = hwrng_register(&ddata->ops); > > + if (ret) { > > + dev_err(&pdev->dev, "Failed to register HW RNG\n"); > > + return ret; > > + } > > + > > + dev_info(&pdev->dev, "Successfully registered HW RNG\n"); > > + > > + return 0; > > +} > > + > > +static int st_rng_remove(struct platform_device *pdev) > > +{ > > + struct st_rng_data *ddata = dev_get_drvdata(&pdev->dev); > > + > > + hwrng_unregister(&ddata->ops); > > + > > + clk_disable_unprepare(ddata->clk); > > + > > + return 0; > > +} > > + > > +static const struct of_device_id st_rng_match[] = { > > + { .compatible = "st,rng" }, > > + {}, > > +}; > > +MODULE_DEVICE_TABLE(of, st_rng_match); > > + > > +static struct platform_driver st_rng_driver = { > > + .driver = { > > + .name = "st-hwrandom", > > + .of_match_table = of_match_ptr(st_rng_match), > > + }, > > + .probe = st_rng_probe, > > + .remove = st_rng_remove > > +}; > > + > > +module_platform_driver(st_rng_driver); > > + > > +MODULE_AUTHOR("Pankaj Dev "); > > +MODULE_LICENSE("GPL v2"); > > > > -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog