* Re: [PATCH V2 4/6] cpuidle/pseries: Move the pseries_idle backend driver to sysdev.
From: Preeti U Murthy @ 2013-07-31 3:59 UTC (permalink / raw)
To: Wang Dongsheng-B40534
Cc: Deepthi Dharwar, linux-pm@vger.kernel.org,
daniel.lezcano@linaro.org, rjw@sisk.pl,
linux-kernel@vger.kernel.org, srivatsa.bhat@linux.vnet.ibm.com,
linuxppc-dev@lists.ozlabs.org
In-Reply-To: <ABB05CD9C9F68C46A5CEDC7F15439259FF2953@039-SN2MPN1-021.039d.mgd.msft.net>
Hi Dongsheng,
On 07/31/2013 08:52 AM, Wang Dongsheng-B40534 wrote:
>
>
>> -----Original Message-----
>> From: Deepthi Dharwar [mailto:deepthi@linux.vnet.ibm.com]
>> Sent: Wednesday, July 31, 2013 10:59 AM
>> To: benh@kernel.crashing.org; daniel.lezcano@linaro.org; linux-
>> kernel@vger.kernel.org; michael@ellerman.id.au;
>> srivatsa.bhat@linux.vnet.ibm.com; preeti@linux.vnet.ibm.com;
>> svaidy@linux.vnet.ibm.com; linuxppc-dev@lists.ozlabs.org
>> Cc: rjw@sisk.pl; Wang Dongsheng-B40534; linux-pm@vger.kernel.org
>> Subject: [PATCH V2 4/6] cpuidle/pseries: Move the pseries_idle backend
>> driver to sysdev.
>>
>> Move pseries_idle backend driver code to arch/powerpc/sysdev
>> so that the code can be used for a common driver for powernv
>> and pseries. This removes a lot of code duplicacy.
>>
> Why not drivers/cpuidle/?
>
> I think it should be move to drivers/cpuidle.
Please take a look at what the cpuidle under drivers has to provide.
cpuidle has two parts to it. The front end and the back end. The front
end constitutes the cpuidle governors, registering of arch specific
cpuidle drivers, disabling and enabling of cpuidle feature. It is this
front end code which is present under drivers/cpuidle.
The arch specific cpuidle drivers which decide what needs to be done to
enter a specific idle state chosen by the cpuidle governor is what
constitutes the back end of cpuidle. This will not be in drivers/cpuidle
but in an arch/ specific code.
The cpuidle under drivers/cpuidle drives the idle power management, but
the low level handling of the entry into idle states should be taken
care of by the architecture.
Your recent patch :
cpuidle: add freescale e500 family porcessors idle support IMO should
hook onto the backend cpuidle driver that this patchset provides.
Regards
Preeti U Murthy
^ permalink raw reply
* RE: [PATCH V2 5/6] cpuidle/powerpc: Backend-powerpc idle driver for powernv and pseries.
From: Wang Dongsheng-B40534 @ 2013-07-31 4:01 UTC (permalink / raw)
To: Deepthi Dharwar, benh@kernel.crashing.org,
daniel.lezcano@linaro.org, linux-kernel@vger.kernel.org,
michael@ellerman.id.au, srivatsa.bhat@linux.vnet.ibm.com,
preeti@linux.vnet.ibm.com, svaidy@linux.vnet.ibm.com,
linuxppc-dev@lists.ozlabs.org
Cc: rjw@sisk.pl, linux-pm@vger.kernel.org
In-Reply-To: <20130731025934.19448.16658.stgit@deepthi>
DQoNCj4gDQo+IC1zdGF0aWMgaW50IHBzZXJpZXNfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVyKHN0
cnVjdCBub3RpZmllcl9ibG9jayAqbiwNCj4gK3N0YXRpYyBpbnQgcG93ZXJwY19jcHVpZGxlX2Fk
ZF9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLA0KPiAgCQkJdW5zaWduZWQg
bG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpDQo+ICB7DQo+ICAJaW50IGhvdGNwdSA9ICh1bnNpZ25l
ZCBsb25nKWhjcHU7DQo+ICAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPQ0KPiAtCQkJcGVy
X2NwdV9wdHIocHNlcmllc19jcHVpZGxlX2RldmljZXMsIGhvdGNwdSk7DQo+ICsJCQlwZXJfY3B1
X3B0cihwb3dlcnBjX2NwdWlkbGVfZGV2aWNlcywgaG90Y3B1KTsNCj4gDQo+ICAJaWYgKGRldiAm
JiBjcHVpZGxlX2dldF9kcml2ZXIoKSkgew0KPiAgCQlzd2l0Y2ggKGFjdGlvbikgew0KPiBAQCAt
MjM1LDE2ICsyNzAsMTYgQEAgc3RhdGljIGludCBwc2VyaWVzX2NwdWlkbGVfYWRkX2NwdV9ub3Rp
ZmllcihzdHJ1Y3QNCj4gbm90aWZpZXJfYmxvY2sgKm4sDQo+ICB9DQo+IA0KPiAgc3RhdGljIHN0
cnVjdCBub3RpZmllcl9ibG9jayBzZXR1cF9ob3RwbHVnX25vdGlmaWVyID0gew0KPiAtCS5ub3Rp
Zmllcl9jYWxsID0gcHNlcmllc19jcHVpZGxlX2FkZF9jcHVfbm90aWZpZXIsDQo+ICsJLm5vdGlm
aWVyX2NhbGwgPSBwb3dlcnBjX2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllciwNCj4gIH07DQo+IA0K
SSB0aGluayBEYW5pZWwgbWVhbnMgbW92ZSB0aGUgbm90aWZpZXIgdG8gY3B1aWRsZSBmcmFtZXdv
cmssIG5vdCBqdXN0IHBvd2VycGMuDQoNCkFuZCBzaG91bGQgYmUgcmVtb3ZlIGFsbCBhYm91dCAq
ZGV2aWNlKi4gSWYgdGhlIG5vdGlmaWVyIGhhbmRsZSB1c2luZyBkZXZpY2UsDQp5b3UgY2FuIHVz
ZSAiY3B1aWRsZV9kZXZpY2VzIi4NCg0KLSBkb25nc2hlbmcNCg0KPiAtc3RhdGljIGludCBfX2lu
aXQgcHNlcmllc19wcm9jZXNzb3JfaWRsZV9pbml0KHZvaWQpDQo+ICtzdGF0aWMgaW50IF9faW5p
dCBwb3dlcnBjX3Byb2Nlc3Nvcl9pZGxlX2luaXQodm9pZCkNCj4gIHsNCj4gIAlpbnQgcmV0dmFs
Ow0KPiANCj4gLQlyZXR2YWwgPSBwc2VyaWVzX2lkbGVfcHJvYmUoKTsNCj4gKwlyZXR2YWwgPSBw
b3dlcnBjX2lkbGVfcHJvYmUoKTsNCj4gIAlpZiAocmV0dmFsKQ0KPiAgCQlyZXR1cm4gcmV0dmFs
Ow0KPiANCj4gLQlwc2VyaWVzX2NwdWlkbGVfZHJpdmVyX2luaXQoKTsNCj4gLQlyZXR2YWwgPSBj
cHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmcHNlcmllc19pZGxlX2RyaXZlcik7DQo+ICsJcG93ZXJw
Y19jcHVpZGxlX2RyaXZlcl9pbml0KCk7DQo+ICsJcmV0dmFsID0gY3B1aWRsZV9yZWdpc3Rlcl9k
cml2ZXIoJnBvd2VycGNfaWRsZV9kcml2ZXIpOw0KPiAgCWlmIChyZXR2YWwpIHsNCj4gLQkJcHJp
bnRrKEtFUk5fREVCVUcgIlJlZ2lzdHJhdGlvbiBvZiBwc2VyaWVzIGRyaXZlciBmYWlsZWQuXG4i
KTsNCj4gKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJlZ2lzdHJhdGlvbiBvZiBwb3dlcnBjIGRyaXZl
ciBmYWlsZWQuXG4iKTsNCj4gIAkJcmV0dXJuIHJldHZhbDsNCj4gIAl9DQo+IA0KPiAgCXVwZGF0
ZV9zbXRfc25vb3plX2RlbGF5KC0xLCBwZXJfY3B1KHNtdF9zbm9vemVfZGVsYXksIDApKTsNCj4g
DQo+IC0JcmV0dmFsID0gcHNlcmllc19pZGxlX2RldmljZXNfaW5pdCgpOw0KPiArCXJldHZhbCA9
IHBvd2VycGNfaWRsZV9kZXZpY2VzX2luaXQoKTsNClNob3VsZCBiZSByZW1vdmUgYWxsICpkZXZp
Y2UqLCB1c2luZyBjcHVpZGxlX3JlZ2lzdGVyLg0KDQotIGRvbmdzaGVuZw0KDQo=
^ permalink raw reply
* RE: [PATCH V2 4/6] cpuidle/pseries: Move the pseries_idle backend driver to sysdev.
From: Wang Dongsheng-B40534 @ 2013-07-31 3:22 UTC (permalink / raw)
To: Deepthi Dharwar, benh@kernel.crashing.org,
daniel.lezcano@linaro.org, linux-kernel@vger.kernel.org,
michael@ellerman.id.au, srivatsa.bhat@linux.vnet.ibm.com,
preeti@linux.vnet.ibm.com, svaidy@linux.vnet.ibm.com,
linuxppc-dev@lists.ozlabs.org
Cc: rjw@sisk.pl, linux-pm@vger.kernel.org
In-Reply-To: <20130731025924.19448.46538.stgit@deepthi>
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogRGVlcHRoaSBEaGFyd2Fy
IFttYWlsdG86ZGVlcHRoaUBsaW51eC52bmV0LmlibS5jb21dDQo+IFNlbnQ6IFdlZG5lc2RheSwg
SnVseSAzMSwgMjAxMyAxMDo1OSBBTQ0KPiBUbzogYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnOyBk
YW5pZWwubGV6Y2Fub0BsaW5hcm8ub3JnOyBsaW51eC0NCj4ga2VybmVsQHZnZXIua2VybmVsLm9y
ZzsgbWljaGFlbEBlbGxlcm1hbi5pZC5hdTsNCj4gc3JpdmF0c2EuYmhhdEBsaW51eC52bmV0Lmli
bS5jb207IHByZWV0aUBsaW51eC52bmV0LmlibS5jb207DQo+IHN2YWlkeUBsaW51eC52bmV0Lmli
bS5jb207IGxpbnV4cHBjLWRldkBsaXN0cy5vemxhYnMub3JnDQo+IENjOiByandAc2lzay5wbDsg
V2FuZyBEb25nc2hlbmctQjQwNTM0OyBsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcNCj4gU3ViamVj
dDogW1BBVENIIFYyIDQvNl0gY3B1aWRsZS9wc2VyaWVzOiBNb3ZlIHRoZSBwc2VyaWVzX2lkbGUg
YmFja2VuZA0KPiBkcml2ZXIgdG8gc3lzZGV2Lg0KPiANCj4gTW92ZSBwc2VyaWVzX2lkbGUgYmFj
a2VuZCBkcml2ZXIgY29kZSB0byBhcmNoL3Bvd2VycGMvc3lzZGV2DQo+IHNvIHRoYXQgdGhlIGNv
ZGUgY2FuIGJlIHVzZWQgZm9yIGEgY29tbW9uIGRyaXZlciBmb3IgcG93ZXJudg0KPiBhbmQgcHNl
cmllcy4gVGhpcyByZW1vdmVzIGEgbG90IG9mIGNvZGUgZHVwbGljYWN5Lg0KPiANCldoeSBub3Qg
ZHJpdmVycy9jcHVpZGxlLz8NCg0KSSB0aGluayBpdCBzaG91bGQgYmUgbW92ZSB0byBkcml2ZXJz
L2NwdWlkbGUuDQoNCi1kb25nc2hlbmcNCg0KPiBTaWduZWQtb2ZmLWJ5OiBEZWVwdGhpIERoYXJ3
YXIgPGRlZXB0aGlAbGludXgudm5ldC5pYm0uY29tPg0KPiAtLS0NCj4gIGFyY2gvcG93ZXJwYy9w
bGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnICAgICAgICAgIHwgICAgOSAtDQo+ICBhcmNoL3Bvd2Vy
cGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUgICAgICAgICB8ICAgIDENCj4gIGFyY2gvcG93
ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wcm9jZXNzb3JfaWRsZS5jIHwgIDM4NCAtLS0tLS0tLS0t
LS0tLS0tLQ0KPiAtLS0tLS0NCj4gIGFyY2gvcG93ZXJwYy9zeXNkZXYvS2NvbmZpZyAgICAgICAg
ICAgICAgICAgICAgIHwgICAgOSArDQo+ICBhcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlICAg
ICAgICAgICAgICAgICAgICB8ICAgIDENCj4gIGFyY2gvcG93ZXJwYy9zeXNkZXYvcHJvY2Vzc29y
X2lkbGUuYyAgICAgICAgICAgIHwgIDM4NA0KPiArKysrKysrKysrKysrKysrKysrKysrKw0KPiAg
NiBmaWxlcyBjaGFuZ2VkLCAzOTQgaW5zZXJ0aW9ucygrKSwgMzk0IGRlbGV0aW9ucygtKQ0KPiAg
ZGVsZXRlIG1vZGUgMTAwNjQ0IGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wcm9jZXNz
b3JfaWRsZS5jDQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9wb3dlcnBjL3N5c2Rldi9wcm9j
ZXNzb3JfaWRsZS5jDQo+IA0KPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9w
c2VyaWVzL0tjb25maWcNCj4gYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZp
Zw0KPiBpbmRleCA2MmI0ZjgwLi5iYjU5YmIwIDEwMDY0NA0KPiAtLS0gYS9hcmNoL3Bvd2VycGMv
cGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZw0KPiArKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1z
L3BzZXJpZXMvS2NvbmZpZw0KPiBAQCAtMTE5LDEyICsxMTksMyBAQCBjb25maWcgRFRMDQo+ICAJ
ICB3aGljaCBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIGEgZGVidWdmcyBmaWxlLg0KPiANCj4gIAkg
IFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLg0KPiAtDQo+IC1jb25maWcgUFNFUklFU19JRExFDQo+
IC0JYm9vbCAiQ3B1aWRsZSBkcml2ZXIgZm9yIHBTZXJpZXMgcGxhdGZvcm1zIg0KPiAtCWRlcGVu
ZHMgb24gQ1BVX0lETEUNCj4gLQlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTDQo+IC0JZGVmYXVsdCB5
DQo+IC0JaGVscA0KPiAtCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBwcm9jZXNzb3Ig
aWRsZSBzdGF0ZSBtYW5hZ2VtZW50DQo+IC0JICB0aHJvdWdoIGNwdWlkbGUgc3Vic3lzdGVtLg0K
PiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlDQo+
IGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlDQo+IGluZGV4IDhhZTAx
MDMuLjRiMjIzNzkgMTAwNjQ0DQo+IC0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmll
cy9NYWtlZmlsZQ0KPiArKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZp
bGUNCj4gQEAgLTIxLDcgKzIxLDYgQEAgb2JqLSQoQ09ORklHX0hDQUxMX1NUQVRTKQkrPSBodkNh
bGxfaW5zdC5vDQo+ICBvYmotJChDT05GSUdfQ01NKQkJKz0gY21tLm8NCj4gIG9iai0kKENPTkZJ
R19EVEwpCQkrPSBkdGwubw0KPiAgb2JqLSQoQ09ORklHX0lPX0VWRU5UX0lSUSkJKz0gaW9fZXZl
bnRfaXJxLm8NCj4gLW9iai0kKENPTkZJR19QU0VSSUVTX0lETEUpCSs9IHByb2Nlc3Nvcl9pZGxl
Lm8NCj4gDQo+ICBpZmVxICgkKENPTkZJR19QUENfUFNFUklFUykseSkNCj4gIG9iai0kKENPTkZJ
R19TVVNQRU5EKQkJKz0gc3VzcGVuZC5vDQo+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxh
dGZvcm1zL3BzZXJpZXMvcHJvY2Vzc29yX2lkbGUuYw0KPiBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9y
bXMvcHNlcmllcy9wcm9jZXNzb3JfaWRsZS5jDQo+IGRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NA0K
PiBpbmRleCAwZDc1YTU0Li4wMDAwMDAwDQo+IC0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMv
cHNlcmllcy9wcm9jZXNzb3JfaWRsZS5jDQo+ICsrKyAvZGV2L251bGwNCj4gQEAgLTEsMzg0ICsw
LDAgQEANCj4gLS8qDQo+IC0gKiAgcHJvY2Vzc29yX2lkbGUgLSBpZGxlIHN0YXRlIGNwdWlkbGUg
ZHJpdmVyLg0KPiAtICogIEFkYXB0ZWQgZnJvbSBkcml2ZXJzL2lkbGUvaW50ZWxfaWRsZS5jIGFu
ZA0KPiAtICogIGRyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jDQo+IC0gKg0KPiAtICovDQo+
IC0NCj4gLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCj4gLSNpbmNsdWRlIDxsaW51eC9tb2R1
bGUuaD4NCj4gLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQo+IC0jaW5jbHVkZSA8bGludXgvbW9k
dWxlcGFyYW0uaD4NCj4gLSNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+DQo+IC0jaW5jbHVkZSA8
bGludXgvY3B1Lmg+DQo+IC0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4NCj4gLQ0KPiAtI2lu
Y2x1ZGUgPGFzbS9wYWNhLmg+DQo+IC0jaW5jbHVkZSA8YXNtL3JlZy5oPg0KPiAtI2luY2x1ZGUg
PGFzbS9tYWNoZGVwLmg+DQo+IC0jaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+DQo+IC0jaW5jbHVk
ZSA8YXNtL3J1bmxhdGNoLmg+DQo+IC0jaW5jbHVkZSA8YXNtL3BscGFyX3dyYXBwZXJzLmg+DQo+
IC0NCj4gLS8qIFNub296ZSBEZWxheSwgcHNlcmllc19pZGxlICovDQo+IC1ERUNMQVJFX1BFUl9D
UFUobG9uZywgc210X3Nub296ZV9kZWxheSk7DQo+IC0NCj4gLXN0cnVjdCBjcHVpZGxlX2RyaXZl
ciBwc2VyaWVzX2lkbGVfZHJpdmVyID0gew0KPiAtCS5uYW1lICAgICAgICAgICAgID0gInBzZXJp
ZXNfaWRsZSIsDQo+IC0JLm93bmVyICAgICAgICAgICAgPSBUSElTX01PRFVMRSwNCj4gLX07DQo+
IC0NCj4gLSNkZWZpbmUgTUFYX0lETEVfU1RBVEVfQ09VTlQJMg0KPiAtDQo+IC1zdGF0aWMgaW50
IG1heF9pZGxlX3N0YXRlID0gTUFYX0lETEVfU1RBVEVfQ09VTlQgLSAxOw0KPiAtc3RhdGljIHN0
cnVjdCBjcHVpZGxlX2RldmljZSBfX3BlcmNwdSAqcHNlcmllc19jcHVpZGxlX2RldmljZXM7DQo+
IC1zdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgKmNwdWlkbGVfc3RhdGVfdGFibGU7DQo+IC0N
Cj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGxlX2xvb3BfcHJvbG9nKHVuc2lnbmVkIGxvbmcgKmlu
X3B1cnIpDQo+IC17DQo+IC0JKmluX3B1cnIgPSBtZnNwcihTUFJOX1BVUlIpOw0KPiAtCS8qDQo+
IC0JICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQ0K
PiAtCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4NCj4gLQkg
Ki8NCj4gLQlnZXRfbHBwYWNhKCktPmlkbGUgPSAxOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW5s
aW5lIHZvaWQgaWRsZV9sb29wX2VwaWxvZyh1bnNpZ25lZCBsb25nIGluX3B1cnIpDQo+IC17DQo+
IC0JZ2V0X2xwcGFjYSgpLT53YWl0X3N0YXRlX2N5Y2xlcyArPSBtZnNwcihTUFJOX1BVUlIpIC0g
aW5fcHVycjsNCj4gLQlnZXRfbHBwYWNhKCktPmlkbGUgPSAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0
aWMgaW50IHNub296ZV9sb29wKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LA0KPiAtCQkJc3Ry
dWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsDQo+IC0JCQlpbnQgaW5kZXgpDQo+IC17DQo+IC0JdW5z
aWduZWQgbG9uZyBpbl9wdXJyOw0KPiAtCWludCBjcHUgPSBkZXYtPmNwdTsNCj4gLQ0KPiAtCWlk
bGVfbG9vcF9wcm9sb2coJmluX3B1cnIpOw0KPiAtCWxvY2FsX2lycV9lbmFibGUoKTsNCj4gLQlz
ZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsNCj4gLQ0KPiAtCXdoaWxlICgoIW5l
ZWRfcmVzY2hlZCgpKSAmJiBjcHVfb25saW5lKGNwdSkpIHsNCj4gLQkJcHBjNjRfcnVubGF0Y2hf
b2ZmKCk7DQo+IC0JCUhNVF9sb3coKTsNCj4gLQkJSE1UX3ZlcnlfbG93KCk7DQo+IC0JfQ0KPiAt
DQo+IC0JSE1UX21lZGl1bSgpOw0KPiAtCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05S
RkxBRyk7DQo+IC0Jc21wX21iKCk7DQo+IC0NCj4gLQlpZGxlX2xvb3BfZXBpbG9nKGluX3B1cnIp
Ow0KPiAtDQo+IC0JcmV0dXJuIGluZGV4Ow0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgdm9pZCBjaGVj
a19hbmRfY2VkZV9wcm9jZXNzb3Iodm9pZCkNCj4gLXsNCj4gLQkvKg0KPiAtCSAqIEVuc3VyZSBv
dXIgaW50ZXJydXB0IHN0YXRlIGlzIHByb3Blcmx5IHRyYWNrZWQsDQo+IC0JICogYWxzbyBjaGVj
a3MgaWYgbm8gaW50ZXJydXB0IGhhcyBvY2N1cnJlZCB3aGlsZSB3ZQ0KPiAtCSAqIHdlcmUgc29m
dC1kaXNhYmxlZA0KPiAtCSAqLw0KPiAtCWlmIChwcmVwX2lycV9mb3JfaWRsZSgpKSB7DQo+IC0J
CWNlZGVfcHJvY2Vzc29yKCk7DQo+IC0jaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTDQo+IC0J
CS8qIEVuc3VyZSB0aGF0IEhfQ0VERSByZXR1cm5zIHdpdGggSVJRcyBvbiAqLw0KPiAtCQlpZiAo
V0FSTl9PTighKG1mbXNyKCkgJiBNU1JfRUUpKSkNCj4gLQkJCV9faGFyZF9pcnFfZW5hYmxlKCk7
DQo+IC0jZW5kaWYNCj4gLQl9DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbnQgZGVkaWNhdGVkX2Nl
ZGVfbG9vcChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwNCj4gLQkJCQlzdHJ1Y3QgY3B1aWRs
ZV9kcml2ZXIgKmRydiwNCj4gLQkJCQlpbnQgaW5kZXgpDQo+IC17DQo+IC0JdW5zaWduZWQgbG9u
ZyBpbl9wdXJyOw0KPiAtDQo+IC0JaWRsZV9sb29wX3Byb2xvZygmaW5fcHVycik7DQo+IC0JZ2V0
X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDE7DQo+IC0NCj4gLQlwcGM2NF9ydW5s
YXRjaF9vZmYoKTsNCj4gLQlITVRfbWVkaXVtKCk7DQo+IC0JY2hlY2tfYW5kX2NlZGVfcHJvY2Vz
c29yKCk7DQo+IC0NCj4gLQlnZXRfbHBwYWNhKCktPmRvbmF0ZV9kZWRpY2F0ZWRfY3B1ID0gMDsN
Cj4gLQ0KPiAtCWlkbGVfbG9vcF9lcGlsb2coaW5fcHVycik7DQo+IC0NCj4gLQlyZXR1cm4gaW5k
ZXg7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbnQgc2hhcmVkX2NlZGVfbG9vcChzdHJ1Y3QgY3B1
aWRsZV9kZXZpY2UgKmRldiwNCj4gLQkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LA0KPiAt
CQkJaW50IGluZGV4KQ0KPiAtew0KPiAtCXVuc2lnbmVkIGxvbmcgaW5fcHVycjsNCj4gLQ0KPiAt
CWlkbGVfbG9vcF9wcm9sb2coJmluX3B1cnIpOw0KPiAtDQo+IC0JLyoNCj4gLQkgKiBZaWVsZCB0
aGUgcHJvY2Vzc29yIHRvIHRoZSBoeXBlcnZpc29yLiAgV2UgcmV0dXJuIGlmDQo+IC0JICogYW4g
ZXh0ZXJuYWwgaW50ZXJydXB0IG9jY3VycyAod2hpY2ggYXJlIGRyaXZlbiBwcmlvcg0KPiAtCSAq
IHRvIHJldHVybmluZyBoZXJlKSBvciBpZiBhIHByb2Qgb2NjdXJzIGZyb20gYW5vdGhlcg0KPiAt
CSAqIHByb2Nlc3Nvci4gV2hlbiByZXR1cm5pbmcgaGVyZSwgZXh0ZXJuYWwgaW50ZXJydXB0cw0K
PiAtCSAqIGFyZSBlbmFibGVkLg0KPiAtCSAqLw0KPiAtCWNoZWNrX2FuZF9jZWRlX3Byb2Nlc3Nv
cigpOw0KPiAtDQo+IC0JaWRsZV9sb29wX2VwaWxvZyhpbl9wdXJyKTsNCj4gLQ0KPiAtCXJldHVy
biBpbmRleDsNCj4gLX0NCj4gLQ0KPiAtLyoNCj4gLSAqIFN0YXRlcyBmb3IgZGVkaWNhdGVkIHBh
cnRpdGlvbiBjYXNlLg0KPiAtICovDQo+IC1zdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgZGVk
aWNhdGVkX3N0YXRlc1tNQVhfSURMRV9TVEFURV9DT1VOVF0gPSB7DQo+IC0JeyAvKiBTbm9vemUg
Ki8NCj4gLQkJLm5hbWUgPSAic25vb3plIiwNCj4gLQkJLmRlc2MgPSAic25vb3plIiwNCj4gLQkJ
LmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsDQo+IC0JCS5leGl0X2xhdGVuY3kgPSAw
LA0KPiAtCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDAsDQo+IC0JCS5lbnRlciA9ICZzbm9vemVfbG9v
cCB9LA0KPiAtCXsgLyogQ0VERSAqLw0KPiAtCQkubmFtZSA9ICJDRURFIiwNCj4gLQkJLmRlc2Mg
PSAiQ0VERSIsDQo+IC0JCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElELA0KPiAtCQku
ZXhpdF9sYXRlbmN5ID0gMTAsDQo+IC0JCS50YXJnZXRfcmVzaWRlbmN5ID0gMTAwLA0KPiAtCQku
ZW50ZXIgPSAmZGVkaWNhdGVkX2NlZGVfbG9vcCB9LA0KPiAtfTsNCj4gLQ0KPiAtLyoNCj4gLSAq
IFN0YXRlcyBmb3Igc2hhcmVkIHBhcnRpdGlvbiBjYXNlLg0KPiAtICovDQo+IC1zdGF0aWMgc3Ry
dWN0IGNwdWlkbGVfc3RhdGUgc2hhcmVkX3N0YXRlc1tNQVhfSURMRV9TVEFURV9DT1VOVF0gPSB7
DQo+IC0JeyAvKiBTaGFyZWQgQ2VkZSAqLw0KPiAtCQkubmFtZSA9ICJTaGFyZWQgQ2VkZSIsDQo+
IC0JCS5kZXNjID0gIlNoYXJlZCBDZWRlIiwNCj4gLQkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJ
TUVfVkFMSUQsDQo+IC0JCS5leGl0X2xhdGVuY3kgPSAwLA0KPiAtCQkudGFyZ2V0X3Jlc2lkZW5j
eSA9IDAsDQo+IC0JCS5lbnRlciA9ICZzaGFyZWRfY2VkZV9sb29wIH0sDQo+IC19Ow0KPiAtDQo+
IC12b2lkIHVwZGF0ZV9zbXRfc25vb3plX2RlbGF5KGludCBjcHUsIGludCByZXNpZGVuY3kpDQo+
IC17DQo+IC0Jc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSBjcHVpZGxlX2dldF9kcml2ZXIo
KTsNCj4gLQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldjsNCj4gLQ0KPiAtCWlmIChjcHVpZGxl
X3N0YXRlX3RhYmxlICE9IGRlZGljYXRlZF9zdGF0ZXMpDQo+IC0JCXJldHVybjsNCj4gLQ0KPiAt
CWlmICghZHJ2KQ0KPiAtCQlyZXR1cm47DQo+IC0NCj4gLQlpZiAoY3B1ID09IC0xKSB7DQo+IC0J
CWlmIChyZXNpZGVuY3kgPCAwKSB7DQo+IC0JCQkvKiBEaXNhYmxlIE5BUCBvbiBhbGwgY3B1cyAq
Lw0KPiAtCQkJZHJ2LT5zdGF0ZXNbMV0uZGlzYWJsZWQgPSB0cnVlOw0KPiAtCQkJcmV0dXJuOw0K
PiAtCQl9IGVsc2Ugew0KPiAtCQkJZHJ2LT5zdGF0ZXNbMV0udGFyZ2V0X3Jlc2lkZW5jeSA9IHJl
c2lkZW5jeTsNCj4gLQkJCWRydi0+c3RhdGVzWzFdLmRpc2FibGVkID0gZmFsc2U7DQo+IC0JCQly
ZXR1cm47DQo+IC0JCX0NCj4gLQl9DQo+IC0NCj4gLQlkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2
aWNlcywgY3B1KTsNCj4gLQlpZiAoIWRldikNCj4gLQkJcmV0dXJuOw0KPiAtDQo+IC0JaWYgKHJl
c2lkZW5jeSA8IDApDQo+IC0JCWRldi0+c3RhdGVzX3VzYWdlWzFdLmRpc2FibGUgPSAxOw0KPiAt
CWVsc2Ugew0KPiAtCQlkcnYtPnN0YXRlc1sxXS50YXJnZXRfcmVzaWRlbmN5ID0gcmVzaWRlbmN5
Ow0KPiAtCQlkcnYtPnN0YXRlc1sxXS5kaXNhYmxlZCA9IGZhbHNlOw0KPiAtCQlkZXYtPnN0YXRl
c191c2FnZVsxXS5kaXNhYmxlID0gMDsNCj4gLQl9DQo+IC19DQo+IC0NCj4gLXN0YXRpYyBpbnQg
cHNlcmllc19jcHVpZGxlX2FkZF9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpu
LA0KPiAtCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpDQo+IC17DQo+IC0JaW50
IGhvdGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7DQo+IC0Jc3RydWN0IGNwdWlkbGVfZGV2aWNl
ICpkZXYgPQ0KPiAtCQkJcGVyX2NwdV9wdHIocHNlcmllc19jcHVpZGxlX2RldmljZXMsIGhvdGNw
dSk7DQo+IC0NCj4gLQlpZiAoZGV2ICYmIGNwdWlkbGVfZ2V0X2RyaXZlcigpKSB7DQo+IC0JCXN3
aXRjaCAoYWN0aW9uKSB7DQo+IC0JCWNhc2UgQ1BVX09OTElORToNCj4gLQkJY2FzZSBDUFVfT05M
SU5FX0ZST1pFTjoNCj4gLQkJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsNCj4gLQkJCWNwdWlk
bGVfZW5hYmxlX2RldmljZShkZXYpOw0KPiAtCQkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygp
Ow0KPiAtCQkJYnJlYWs7DQo+IC0NCj4gLQkJY2FzZSBDUFVfREVBRDoNCj4gLQkJY2FzZSBDUFVf
REVBRF9GUk9aRU46DQo+IC0JCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7DQo+IC0JCQljcHVp
ZGxlX2Rpc2FibGVfZGV2aWNlKGRldik7DQo+IC0JCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2Nr
KCk7DQo+IC0JCQlicmVhazsNCj4gLQ0KPiAtCQlkZWZhdWx0Og0KPiAtCQkJcmV0dXJuIE5PVElG
WV9ET05FOw0KPiAtCQl9DQo+IC0JfQ0KPiAtCXJldHVybiBOT1RJRllfT0s7DQo+IC19DQo+IC0N
Cj4gLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2V0dXBfaG90cGx1Z19ub3RpZmllciA9
IHsNCj4gLQkubm90aWZpZXJfY2FsbCA9IHBzZXJpZXNfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVy
LA0KPiAtfTsNCj4gLQ0KPiAtLyoNCj4gLSAqIHBzZXJpZXNfY3B1aWRsZV9kcml2ZXJfaW5pdCgp
DQo+IC0gKi8NCj4gLXN0YXRpYyBpbnQgcHNlcmllc19jcHVpZGxlX2RyaXZlcl9pbml0KHZvaWQp
DQo+IC17DQo+IC0JaW50IGlkbGVfc3RhdGU7DQo+IC0Jc3RydWN0IGNwdWlkbGVfZHJpdmVyICpk
cnYgPSAmcHNlcmllc19pZGxlX2RyaXZlcjsNCj4gLQ0KPiAtCWRydi0+c3RhdGVfY291bnQgPSAw
Ow0KPiAtDQo+IC0JZm9yIChpZGxlX3N0YXRlID0gMDsgaWRsZV9zdGF0ZSA8IE1BWF9JRExFX1NU
QVRFX0NPVU5UOw0KPiArK2lkbGVfc3RhdGUpIHsNCj4gLQ0KPiAtCQlpZiAoaWRsZV9zdGF0ZSA+
IG1heF9pZGxlX3N0YXRlKQ0KPiAtCQkJYnJlYWs7DQo+IC0NCj4gLQkJLyogaXMgdGhlIHN0YXRl
IG5vdCBlbmFibGVkPyAqLw0KPiAtCQlpZiAoY3B1aWRsZV9zdGF0ZV90YWJsZVtpZGxlX3N0YXRl
XS5lbnRlciA9PSBOVUxMKQ0KPiAtCQkJY29udGludWU7DQo+IC0NCj4gLQkJZHJ2LT5zdGF0ZXNb
ZHJ2LT5zdGF0ZV9jb3VudF0gPQkvKiBzdHJ1Y3R1cmUgY29weSAqLw0KPiAtCQkJY3B1aWRsZV9z
dGF0ZV90YWJsZVtpZGxlX3N0YXRlXTsNCj4gLQ0KPiAtCQlkcnYtPnN0YXRlX2NvdW50ICs9IDE7
DQo+IC0JfQ0KPiAtDQo+IC0JcmV0dXJuIDA7DQo+IC19DQo+IC0NCj4gLS8qIHBzZXJpZXNfaWRs
ZV9kZXZpY2VzX3VuaW5pdCh2b2lkKQ0KPiAtICogdW5yZWdpc3RlciBjcHVpZGxlIGRldmljZXMg
YW5kIGRlLWFsbG9jYXRlIG1lbW9yeQ0KPiAtICovDQo+IC1zdGF0aWMgdm9pZCBwc2VyaWVzX2lk
bGVfZGV2aWNlc191bmluaXQodm9pZCkNCj4gLXsNCj4gLQlpbnQgaTsNCj4gLQlzdHJ1Y3QgY3B1
aWRsZV9kZXZpY2UgKmRldjsNCj4gLQ0KPiAtCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7DQo+
IC0JCWRldiA9IHBlcl9jcHVfcHRyKHBzZXJpZXNfY3B1aWRsZV9kZXZpY2VzLCBpKTsNCj4gLQkJ
Y3B1aWRsZV91bnJlZ2lzdGVyX2RldmljZShkZXYpOw0KPiAtCX0NCj4gLQ0KPiAtCWZyZWVfcGVy
Y3B1KHBzZXJpZXNfY3B1aWRsZV9kZXZpY2VzKTsNCj4gLQlyZXR1cm47DQo+IC19DQo+IC0NCj4g
LS8qIHBzZXJpZXNfaWRsZV9kZXZpY2VzX2luaXQoKQ0KPiAtICogYWxsb2NhdGUsIGluaXRpYWxp
emUgYW5kIHJlZ2lzdGVyIGNwdWlkbGUgZGV2aWNlDQo+IC0gKi8NCj4gLXN0YXRpYyBpbnQgcHNl
cmllc19pZGxlX2RldmljZXNfaW5pdCh2b2lkKQ0KPiAtew0KPiAtCWludCBpOw0KPiAtCXN0cnVj
dCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJnBzZXJpZXNfaWRsZV9kcml2ZXI7DQo+IC0Jc3RydWN0
IGNwdWlkbGVfZGV2aWNlICpkZXY7DQo+IC0NCj4gLQlwc2VyaWVzX2NwdWlkbGVfZGV2aWNlcyA9
IGFsbG9jX3BlcmNwdShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UpOw0KPiAtCWlmIChwc2VyaWVzX2Nw
dWlkbGVfZGV2aWNlcyA9PSBOVUxMKQ0KPiAtCQlyZXR1cm4gLUVOT01FTTsNCj4gLQ0KPiAtCWZv
cl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7DQo+IC0JCWRldiA9IHBlcl9jcHVfcHRyKHBzZXJpZXNf
Y3B1aWRsZV9kZXZpY2VzLCBpKTsNCj4gLQkJZGV2LT5zdGF0ZV9jb3VudCA9IGRydi0+c3RhdGVf
Y291bnQ7DQo+IC0JCWRldi0+Y3B1ID0gaTsNCj4gLQkJaWYgKGNwdWlkbGVfcmVnaXN0ZXJfZGV2
aWNlKGRldikpIHsNCj4gLQkJCXByaW50ayhLRVJOX0RFQlVHIFwNCj4gLQkJCQkiY3B1aWRsZV9y
ZWdpc3Rlcl9kZXZpY2UgJWQgZmFpbGVkIVxuIiwgaSk7DQo+IC0JCQlyZXR1cm4gLUVJTzsNCj4g
LQkJfQ0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiAwOw0KPiAtfQ0KPiAtDQo+IC0vKg0KPiAtICog
cHNlcmllc19pZGxlX3Byb2JlKCkNCj4gLSAqIENob29zZSBzdGF0ZSB0YWJsZSBmb3Igc2hhcmVk
IHZlcnN1cyBkZWRpY2F0ZWQgcGFydGl0aW9uDQo+IC0gKi8NCj4gLXN0YXRpYyBpbnQgcHNlcmll
c19pZGxlX3Byb2JlKHZvaWQpDQo+IC17DQo+IC0NCj4gLQlpZiAoIWZpcm13YXJlX2hhc19mZWF0
dXJlKEZXX0ZFQVRVUkVfU1BMUEFSKSkNCj4gLQkJcmV0dXJuIC1FTk9ERVY7DQo+IC0NCj4gLQlp
ZiAoY3B1aWRsZV9kaXNhYmxlICE9IElETEVfTk9fT1ZFUlJJREUpDQo+IC0JCXJldHVybiAtRU5P
REVWOw0KPiAtDQo+IC0JaWYgKG1heF9pZGxlX3N0YXRlID09IDApIHsNCj4gLQkJcHJpbnRrKEtF
Uk5fREVCVUcgInBzZXJpZXMgcHJvY2Vzc29yIGlkbGUgZGlzYWJsZWQuXG4iKTsNCj4gLQkJcmV0
dXJuIC1FUEVSTTsNCj4gLQl9DQo+IC0NCj4gLQlpZiAoZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJv
YykNCj4gLQkJY3B1aWRsZV9zdGF0ZV90YWJsZSA9IHNoYXJlZF9zdGF0ZXM7DQo+IC0JZWxzZQ0K
PiAtCQljcHVpZGxlX3N0YXRlX3RhYmxlID0gZGVkaWNhdGVkX3N0YXRlczsNCj4gLQ0KPiAtCXJl
dHVybiAwOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW50IF9faW5pdCBwc2VyaWVzX3Byb2Nlc3Nv
cl9pZGxlX2luaXQodm9pZCkNCj4gLXsNCj4gLQlpbnQgcmV0dmFsOw0KPiAtDQo+IC0JcmV0dmFs
ID0gcHNlcmllc19pZGxlX3Byb2JlKCk7DQo+IC0JaWYgKHJldHZhbCkNCj4gLQkJcmV0dXJuIHJl
dHZhbDsNCj4gLQ0KPiAtCXBzZXJpZXNfY3B1aWRsZV9kcml2ZXJfaW5pdCgpOw0KPiAtCXJldHZh
bCA9IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZwc2VyaWVzX2lkbGVfZHJpdmVyKTsNCj4gLQlp
ZiAocmV0dmFsKSB7DQo+IC0JCXByaW50ayhLRVJOX0RFQlVHICJSZWdpc3RyYXRpb24gb2YgcHNl
cmllcyBkcml2ZXIgZmFpbGVkLlxuIik7DQo+IC0JCXJldHVybiByZXR2YWw7DQo+IC0JfQ0KPiAt
DQo+IC0JdXBkYXRlX3NtdF9zbm9vemVfZGVsYXkoLTEsIHBlcl9jcHUoc210X3Nub296ZV9kZWxh
eSwgMCkpOw0KPiAtDQo+IC0JcmV0dmFsID0gcHNlcmllc19pZGxlX2RldmljZXNfaW5pdCgpOw0K
PiAtCWlmIChyZXR2YWwpIHsNCj4gLQkJcHNlcmllc19pZGxlX2RldmljZXNfdW5pbml0KCk7DQo+
IC0JCWNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoJnBzZXJpZXNfaWRsZV9kcml2ZXIpOw0KPiAt
CQlyZXR1cm4gcmV0dmFsOw0KPiAtCX0NCj4gLQ0KPiAtCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigm
c2V0dXBfaG90cGx1Z19ub3RpZmllcik7DQo+IC0JcHJpbnRrKEtFUk5fREVCVUcgInBzZXJpZXNf
aWRsZV9kcml2ZXIgcmVnaXN0ZXJlZFxuIik7DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0NCj4g
LQ0KPiAtc3RhdGljIHZvaWQgX19leGl0IHBzZXJpZXNfcHJvY2Vzc29yX2lkbGVfZXhpdCh2b2lk
KQ0KPiAtew0KPiAtDQo+IC0JdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNldHVwX2hvdHBsdWdf
bm90aWZpZXIpOw0KPiAtCXBzZXJpZXNfaWRsZV9kZXZpY2VzX3VuaW5pdCgpOw0KPiAtCWNwdWlk
bGVfdW5yZWdpc3Rlcl9kcml2ZXIoJnBzZXJpZXNfaWRsZV9kcml2ZXIpOw0KPiAtDQo+IC0JcmV0
dXJuOw0KPiAtfQ0KPiAtDQo+IC1tb2R1bGVfaW5pdChwc2VyaWVzX3Byb2Nlc3Nvcl9pZGxlX2lu
aXQpOw0KPiAtbW9kdWxlX2V4aXQocHNlcmllc19wcm9jZXNzb3JfaWRsZV9leGl0KTsNCj4gLQ0K
PiAtTU9EVUxFX0FVVEhPUigiRGVlcHRoaSBEaGFyd2FyIDxkZWVwdGhpQGxpbnV4LnZuZXQuaWJt
LmNvbT4iKTsNCj4gLU1PRFVMRV9ERVNDUklQVElPTigiQ3B1aWRsZSBkcml2ZXIgZm9yIFBPV0VS
Iik7DQo+IC1NT0RVTEVfTElDRU5TRSgiR1BMIik7DQo+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2Vy
cGMvc3lzZGV2L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L0tjb25maWcNCj4gaW5kZXgg
YWI0Y2I1NC4uODU2NGEzZiAxMDA2NDQNCj4gLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9LY29u
ZmlnDQo+ICsrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvS2NvbmZpZw0KPiBAQCAtMzQsMyArMzQs
MTIgQEAgY29uZmlnIFNDT01fREVCVUdGUw0KPiAgY29uZmlnIEdFX0ZQR0ENCj4gIAlib29sDQo+
ICAJZGVmYXVsdCBuDQo+ICsNCj4gK2NvbmZpZyBQU0VSSUVTX0lETEUNCj4gKwlib29sICJDcHVp
ZGxlIGRyaXZlciBmb3IgcFNlcmllcyBwbGF0Zm9ybXMiDQo+ICsJZGVwZW5kcyBvbiBDUFVfSURM
RQ0KPiArCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMNCj4gKwlkZWZhdWx0IHkNCj4gKwloZWxwDQo+
ICsJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIHByb2Nlc3NvciBpZGxlIHN0YXRlIG1h
bmFnZW1lbnQNCj4gKwkgIGZvciBwU2VyaWVzIHRocm91Z2ggY3B1aWRsZSBzdWJzeXN0ZW0uDQo+
IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBj
L3N5c2Rldi9NYWtlZmlsZQ0KPiBpbmRleCBmNjdhYzkwLi45M2QyY2RkIDEwMDY0NA0KPiAtLS0g
YS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlDQo+ICsrKyBiL2FyY2gvcG93ZXJwYy9zeXNk
ZXYvTWFrZWZpbGUNCj4gQEAgLTQ5LDYgKzQ5LDcgQEAgZW5kaWYNCj4gIG9iai0kKENPTkZJR19Q
UEM0eHhfTVNJKQkrPSBwcGM0eHhfbXNpLm8NCj4gIG9iai0kKENPTkZJR19QUEM0eHhfQ1BNKQkr
PSBwcGM0eHhfY3BtLm8NCj4gIG9iai0kKENPTkZJR19QUEM0eHhfR1BJTykJKz0gcHBjNHh4X2dw
aW8ubw0KPiArb2JqLSQoQ09ORklHX1BTRVJJRVNfSURMRSkJKz0gcHJvY2Vzc29yX2lkbGUubw0K
PiANCj4gIG9iai0kKENPTkZJR19DUE0pCQkrPSBjcG1fY29tbW9uLm8NCj4gIG9iai0kKENPTkZJ
R19DUE0yKQkJKz0gY3BtMi5vIGNwbTJfcGljLm8NCj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJw
Yy9zeXNkZXYvcHJvY2Vzc29yX2lkbGUuYw0KPiBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHJvY2Vz
c29yX2lkbGUuYw0KPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwLi4wZDc1
YTU0DQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcm9jZXNz
b3JfaWRsZS5jDQo+IEBAIC0wLDAgKzEsMzg0IEBADQo+ICsvKg0KPiArICogIHByb2Nlc3Nvcl9p
ZGxlIC0gaWRsZSBzdGF0ZSBjcHVpZGxlIGRyaXZlci4NCj4gKyAqICBBZGFwdGVkIGZyb20gZHJp
dmVycy9pZGxlL2ludGVsX2lkbGUuYyBhbmQNCj4gKyAqICBkcml2ZXJzL2FjcGkvcHJvY2Vzc29y
X2lkbGUuYw0KPiArICoNCj4gKyAqLw0KPiArDQo+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+
DQo+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQo+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5o
Pg0KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+DQo+ICsjaW5jbHVkZSA8bGludXgv
Y3B1aWRsZS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L2NwdS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4
L25vdGlmaWVyLmg+DQo+ICsNCj4gKyNpbmNsdWRlIDxhc20vcGFjYS5oPg0KPiArI2luY2x1ZGUg
PGFzbS9yZWcuaD4NCj4gKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPg0KPiArI2luY2x1ZGUgPGFz
bS9maXJtd2FyZS5oPg0KPiArI2luY2x1ZGUgPGFzbS9ydW5sYXRjaC5oPg0KPiArI2luY2x1ZGUg
PGFzbS9wbHBhcl93cmFwcGVycy5oPg0KPiArDQo+ICsvKiBTbm9vemUgRGVsYXksIHBzZXJpZXNf
aWRsZSAqLw0KPiArREVDTEFSRV9QRVJfQ1BVKGxvbmcsIHNtdF9zbm9vemVfZGVsYXkpOw0KPiAr
DQo+ICtzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgcHNlcmllc19pZGxlX2RyaXZlciA9IHsNCj4gKwku
bmFtZSAgICAgICAgICAgICA9ICJwc2VyaWVzX2lkbGUiLA0KPiArCS5vd25lciAgICAgICAgICAg
ID0gVEhJU19NT0RVTEUsDQo+ICt9Ow0KPiArDQo+ICsjZGVmaW5lIE1BWF9JRExFX1NUQVRFX0NP
VU5UCTINCj4gKw0KPiArc3RhdGljIGludCBtYXhfaWRsZV9zdGF0ZSA9IE1BWF9JRExFX1NUQVRF
X0NPVU5UIC0gMTsNCj4gK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgX19wZXJjcHUgKnBz
ZXJpZXNfY3B1aWRsZV9kZXZpY2VzOw0KPiArc3RhdGljIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpj
cHVpZGxlX3N0YXRlX3RhYmxlOw0KPiArDQo+ICtzdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9sb29w
X3Byb2xvZyh1bnNpZ25lZCBsb25nICppbl9wdXJyKQ0KPiArew0KPiArCSppbl9wdXJyID0gbWZz
cHIoU1BSTl9QVVJSKTsNCj4gKwkvKg0KPiArCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdl
IGFyZSBpZGxlLiBOb3cgd291bGQgYmUNCj4gKwkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVy
IHdvcmsgdG8gZGlzcGF0Y2guDQo+ICsJICovDQo+ICsJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsN
Cj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkIGlkbGVfbG9vcF9lcGlsb2codW5zaWdu
ZWQgbG9uZyBpbl9wdXJyKQ0KPiArew0KPiArCWdldF9scHBhY2EoKS0+d2FpdF9zdGF0ZV9jeWNs
ZXMgKz0gbWZzcHIoU1BSTl9QVVJSKSAtIGluX3B1cnI7DQo+ICsJZ2V0X2xwcGFjYSgpLT5pZGxl
ID0gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBzbm9vemVfbG9vcChzdHJ1Y3QgY3B1aWRs
ZV9kZXZpY2UgKmRldiwNCj4gKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LA0KPiArCQkJ
aW50IGluZGV4KQ0KPiArew0KPiArCXVuc2lnbmVkIGxvbmcgaW5fcHVycjsNCj4gKwlpbnQgY3B1
ID0gZGV2LT5jcHU7DQo+ICsNCj4gKwlpZGxlX2xvb3BfcHJvbG9nKCZpbl9wdXJyKTsNCj4gKwls
b2NhbF9pcnFfZW5hYmxlKCk7DQo+ICsJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxB
Ryk7DQo+ICsNCj4gKwl3aGlsZSAoKCFuZWVkX3Jlc2NoZWQoKSkgJiYgY3B1X29ubGluZShjcHUp
KSB7DQo+ICsJCXBwYzY0X3J1bmxhdGNoX29mZigpOw0KPiArCQlITVRfbG93KCk7DQo+ICsJCUhN
VF92ZXJ5X2xvdygpOw0KPiArCX0NCj4gKw0KPiArCUhNVF9tZWRpdW0oKTsNCj4gKwljbGVhcl90
aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOw0KPiArCXNtcF9tYigpOw0KPiArDQo+ICsJ
aWRsZV9sb29wX2VwaWxvZyhpbl9wdXJyKTsNCj4gKw0KPiArCXJldHVybiBpbmRleDsNCj4gK30N
Cj4gKw0KPiArc3RhdGljIHZvaWQgY2hlY2tfYW5kX2NlZGVfcHJvY2Vzc29yKHZvaWQpDQo+ICt7
DQo+ICsJLyoNCj4gKwkgKiBFbnN1cmUgb3VyIGludGVycnVwdCBzdGF0ZSBpcyBwcm9wZXJseSB0
cmFja2VkLA0KPiArCSAqIGFsc28gY2hlY2tzIGlmIG5vIGludGVycnVwdCBoYXMgb2NjdXJyZWQg
d2hpbGUgd2UNCj4gKwkgKiB3ZXJlIHNvZnQtZGlzYWJsZWQNCj4gKwkgKi8NCj4gKwlpZiAocHJl
cF9pcnFfZm9yX2lkbGUoKSkgew0KPiArCQljZWRlX3Byb2Nlc3NvcigpOw0KPiArI2lmZGVmIENP
TkZJR19UUkFDRV9JUlFGTEFHUw0KPiArCQkvKiBFbnN1cmUgdGhhdCBIX0NFREUgcmV0dXJucyB3
aXRoIElSUXMgb24gKi8NCj4gKwkJaWYgKFdBUk5fT04oIShtZm1zcigpICYgTVNSX0VFKSkpDQo+
ICsJCQlfX2hhcmRfaXJxX2VuYWJsZSgpOw0KPiArI2VuZGlmDQo+ICsJfQ0KPiArfQ0KPiArDQo+
ICtzdGF0aWMgaW50IGRlZGljYXRlZF9jZWRlX2xvb3Aoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpk
ZXYsDQo+ICsJCQkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsDQo+ICsJCQkJaW50IGluZGV4
KQ0KPiArew0KPiArCXVuc2lnbmVkIGxvbmcgaW5fcHVycjsNCj4gKw0KPiArCWlkbGVfbG9vcF9w
cm9sb2coJmluX3B1cnIpOw0KPiArCWdldF9scHBhY2EoKS0+ZG9uYXRlX2RlZGljYXRlZF9jcHUg
PSAxOw0KPiArDQo+ICsJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7DQo+ICsJSE1UX21lZGl1bSgpOw0K
PiArCWNoZWNrX2FuZF9jZWRlX3Byb2Nlc3NvcigpOw0KPiArDQo+ICsJZ2V0X2xwcGFjYSgpLT5k
b25hdGVfZGVkaWNhdGVkX2NwdSA9IDA7DQo+ICsNCj4gKwlpZGxlX2xvb3BfZXBpbG9nKGluX3B1
cnIpOw0KPiArDQo+ICsJcmV0dXJuIGluZGV4Ow0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IHNo
YXJlZF9jZWRlX2xvb3Aoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsDQo+ICsJCQlzdHJ1Y3Qg
Y3B1aWRsZV9kcml2ZXIgKmRydiwNCj4gKwkJCWludCBpbmRleCkNCj4gK3sNCj4gKwl1bnNpZ25l
ZCBsb25nIGluX3B1cnI7DQo+ICsNCj4gKwlpZGxlX2xvb3BfcHJvbG9nKCZpbl9wdXJyKTsNCj4g
Kw0KPiArCS8qDQo+ICsJICogWWllbGQgdGhlIHByb2Nlc3NvciB0byB0aGUgaHlwZXJ2aXNvci4g
IFdlIHJldHVybiBpZg0KPiArCSAqIGFuIGV4dGVybmFsIGludGVycnVwdCBvY2N1cnMgKHdoaWNo
IGFyZSBkcml2ZW4gcHJpb3INCj4gKwkgKiB0byByZXR1cm5pbmcgaGVyZSkgb3IgaWYgYSBwcm9k
IG9jY3VycyBmcm9tIGFub3RoZXINCj4gKwkgKiBwcm9jZXNzb3IuIFdoZW4gcmV0dXJuaW5nIGhl
cmUsIGV4dGVybmFsIGludGVycnVwdHMNCj4gKwkgKiBhcmUgZW5hYmxlZC4NCj4gKwkgKi8NCj4g
KwljaGVja19hbmRfY2VkZV9wcm9jZXNzb3IoKTsNCj4gKw0KPiArCWlkbGVfbG9vcF9lcGlsb2co
aW5fcHVycik7DQo+ICsNCj4gKwlyZXR1cm4gaW5kZXg7DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsg
KiBTdGF0ZXMgZm9yIGRlZGljYXRlZCBwYXJ0aXRpb24gY2FzZS4NCj4gKyAqLw0KPiArc3RhdGlj
IHN0cnVjdCBjcHVpZGxlX3N0YXRlIGRlZGljYXRlZF9zdGF0ZXNbTUFYX0lETEVfU1RBVEVfQ09V
TlRdID0gew0KPiArCXsgLyogU25vb3plICovDQo+ICsJCS5uYW1lID0gInNub296ZSIsDQo+ICsJ
CS5kZXNjID0gInNub296ZSIsDQo+ICsJCS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElE
LA0KPiArCQkuZXhpdF9sYXRlbmN5ID0gMCwNCj4gKwkJLnRhcmdldF9yZXNpZGVuY3kgPSAwLA0K
PiArCQkuZW50ZXIgPSAmc25vb3plX2xvb3AgfSwNCj4gKwl7IC8qIENFREUgKi8NCj4gKwkJLm5h
bWUgPSAiQ0VERSIsDQo+ICsJCS5kZXNjID0gIkNFREUiLA0KPiArCQkuZmxhZ3MgPSBDUFVJRExF
X0ZMQUdfVElNRV9WQUxJRCwNCj4gKwkJLmV4aXRfbGF0ZW5jeSA9IDEwLA0KPiArCQkudGFyZ2V0
X3Jlc2lkZW5jeSA9IDEwMCwNCj4gKwkJLmVudGVyID0gJmRlZGljYXRlZF9jZWRlX2xvb3AgfSwN
Cj4gK307DQo+ICsNCj4gKy8qDQo+ICsgKiBTdGF0ZXMgZm9yIHNoYXJlZCBwYXJ0aXRpb24gY2Fz
ZS4NCj4gKyAqLw0KPiArc3RhdGljIHN0cnVjdCBjcHVpZGxlX3N0YXRlIHNoYXJlZF9zdGF0ZXNb
TUFYX0lETEVfU1RBVEVfQ09VTlRdID0gew0KPiArCXsgLyogU2hhcmVkIENlZGUgKi8NCj4gKwkJ
Lm5hbWUgPSAiU2hhcmVkIENlZGUiLA0KPiArCQkuZGVzYyA9ICJTaGFyZWQgQ2VkZSIsDQo+ICsJ
CS5mbGFncyA9IENQVUlETEVfRkxBR19USU1FX1ZBTElELA0KPiArCQkuZXhpdF9sYXRlbmN5ID0g
MCwNCj4gKwkJLnRhcmdldF9yZXNpZGVuY3kgPSAwLA0KPiArCQkuZW50ZXIgPSAmc2hhcmVkX2Nl
ZGVfbG9vcCB9LA0KPiArfTsNCj4gKw0KPiArdm9pZCB1cGRhdGVfc210X3Nub296ZV9kZWxheShp
bnQgY3B1LCBpbnQgcmVzaWRlbmN5KQ0KPiArew0KPiArCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAq
ZHJ2ID0gY3B1aWRsZV9nZXRfZHJpdmVyKCk7DQo+ICsJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpk
ZXY7DQo+ICsNCj4gKwlpZiAoY3B1aWRsZV9zdGF0ZV90YWJsZSAhPSBkZWRpY2F0ZWRfc3RhdGVz
KQ0KPiArCQlyZXR1cm47DQo+ICsNCj4gKwlpZiAoIWRydikNCj4gKwkJcmV0dXJuOw0KPiArDQo+
ICsJaWYgKGNwdSA9PSAtMSkgew0KPiArCQlpZiAocmVzaWRlbmN5IDwgMCkgew0KPiArCQkJLyog
RGlzYWJsZSBOQVAgb24gYWxsIGNwdXMgKi8NCj4gKwkJCWRydi0+c3RhdGVzWzFdLmRpc2FibGVk
ID0gdHJ1ZTsNCj4gKwkJCXJldHVybjsNCj4gKwkJfSBlbHNlIHsNCj4gKwkJCWRydi0+c3RhdGVz
WzFdLnRhcmdldF9yZXNpZGVuY3kgPSByZXNpZGVuY3k7DQo+ICsJCQlkcnYtPnN0YXRlc1sxXS5k
aXNhYmxlZCA9IGZhbHNlOw0KPiArCQkJcmV0dXJuOw0KPiArCQl9DQo+ICsJfQ0KPiArDQo+ICsJ
ZGV2ID0gcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGNwdSk7DQo+ICsJaWYgKCFkZXYpDQo+ICsJ
CXJldHVybjsNCj4gKw0KPiArCWlmIChyZXNpZGVuY3kgPCAwKQ0KPiArCQlkZXYtPnN0YXRlc191
c2FnZVsxXS5kaXNhYmxlID0gMTsNCj4gKwllbHNlIHsNCj4gKwkJZHJ2LT5zdGF0ZXNbMV0udGFy
Z2V0X3Jlc2lkZW5jeSA9IHJlc2lkZW5jeTsNCj4gKwkJZHJ2LT5zdGF0ZXNbMV0uZGlzYWJsZWQg
PSBmYWxzZTsNCj4gKwkJZGV2LT5zdGF0ZXNfdXNhZ2VbMV0uZGlzYWJsZSA9IDA7DQo+ICsJfQ0K
PiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IHBzZXJpZXNfY3B1aWRsZV9hZGRfY3B1X25vdGlmaWVy
KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwNCj4gKwkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2
b2lkICpoY3B1KQ0KPiArew0KPiArCWludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1Ow0K
PiArCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0NCj4gKwkJCXBlcl9jcHVfcHRyKHBzZXJp
ZXNfY3B1aWRsZV9kZXZpY2VzLCBob3RjcHUpOw0KPiArDQo+ICsJaWYgKGRldiAmJiBjcHVpZGxl
X2dldF9kcml2ZXIoKSkgew0KPiArCQlzd2l0Y2ggKGFjdGlvbikgew0KPiArCQljYXNlIENQVV9P
TkxJTkU6DQo+ICsJCWNhc2UgQ1BVX09OTElORV9GUk9aRU46DQo+ICsJCQljcHVpZGxlX3BhdXNl
X2FuZF9sb2NrKCk7DQo+ICsJCQljcHVpZGxlX2VuYWJsZV9kZXZpY2UoZGV2KTsNCj4gKwkJCWNw
dWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsNCj4gKwkJCWJyZWFrOw0KPiArDQo+ICsJCWNhc2Ug
Q1BVX0RFQUQ6DQo+ICsJCWNhc2UgQ1BVX0RFQURfRlJPWkVOOg0KPiArCQkJY3B1aWRsZV9wYXVz
ZV9hbmRfbG9jaygpOw0KPiArCQkJY3B1aWRsZV9kaXNhYmxlX2RldmljZShkZXYpOw0KPiArCQkJ
Y3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOw0KPiArCQkJYnJlYWs7DQo+ICsNCj4gKwkJZGVm
YXVsdDoNCj4gKwkJCXJldHVybiBOT1RJRllfRE9ORTsNCj4gKwkJfQ0KPiArCX0NCj4gKwlyZXR1
cm4gTk9USUZZX09LOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2Nr
IHNldHVwX2hvdHBsdWdfbm90aWZpZXIgPSB7DQo+ICsJLm5vdGlmaWVyX2NhbGwgPSBwc2VyaWVz
X2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllciwNCj4gK307DQo+ICsNCj4gKy8qDQo+ICsgKiBwc2Vy
aWVzX2NwdWlkbGVfZHJpdmVyX2luaXQoKQ0KPiArICovDQo+ICtzdGF0aWMgaW50IHBzZXJpZXNf
Y3B1aWRsZV9kcml2ZXJfaW5pdCh2b2lkKQ0KPiArew0KPiArCWludCBpZGxlX3N0YXRlOw0KPiAr
CXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJnBzZXJpZXNfaWRsZV9kcml2ZXI7DQo+ICsN
Cj4gKwlkcnYtPnN0YXRlX2NvdW50ID0gMDsNCj4gKw0KPiArCWZvciAoaWRsZV9zdGF0ZSA9IDA7
IGlkbGVfc3RhdGUgPCBNQVhfSURMRV9TVEFURV9DT1VOVDsNCj4gKytpZGxlX3N0YXRlKSB7DQo+
ICsNCj4gKwkJaWYgKGlkbGVfc3RhdGUgPiBtYXhfaWRsZV9zdGF0ZSkNCj4gKwkJCWJyZWFrOw0K
PiArDQo+ICsJCS8qIGlzIHRoZSBzdGF0ZSBub3QgZW5hYmxlZD8gKi8NCj4gKwkJaWYgKGNwdWlk
bGVfc3RhdGVfdGFibGVbaWRsZV9zdGF0ZV0uZW50ZXIgPT0gTlVMTCkNCj4gKwkJCWNvbnRpbnVl
Ow0KPiArDQo+ICsJCWRydi0+c3RhdGVzW2Rydi0+c3RhdGVfY291bnRdID0JLyogc3RydWN0dXJl
IGNvcHkgKi8NCj4gKwkJCWNwdWlkbGVfc3RhdGVfdGFibGVbaWRsZV9zdGF0ZV07DQo+ICsNCj4g
KwkJZHJ2LT5zdGF0ZV9jb3VudCArPSAxOw0KPiArCX0NCj4gKw0KPiArCXJldHVybiAwOw0KPiAr
fQ0KPiArDQo+ICsvKiBwc2VyaWVzX2lkbGVfZGV2aWNlc191bmluaXQodm9pZCkNCj4gKyAqIHVu
cmVnaXN0ZXIgY3B1aWRsZSBkZXZpY2VzIGFuZCBkZS1hbGxvY2F0ZSBtZW1vcnkNCj4gKyAqLw0K
PiArc3RhdGljIHZvaWQgcHNlcmllc19pZGxlX2RldmljZXNfdW5pbml0KHZvaWQpDQo+ICt7DQo+
ICsJaW50IGk7DQo+ICsJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXY7DQo+ICsNCj4gKwlmb3Jf
ZWFjaF9wb3NzaWJsZV9jcHUoaSkgew0KPiArCQlkZXYgPSBwZXJfY3B1X3B0cihwc2VyaWVzX2Nw
dWlkbGVfZGV2aWNlcywgaSk7DQo+ICsJCWNwdWlkbGVfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2KTsN
Cj4gKwl9DQo+ICsNCj4gKwlmcmVlX3BlcmNwdShwc2VyaWVzX2NwdWlkbGVfZGV2aWNlcyk7DQo+
ICsJcmV0dXJuOw0KPiArfQ0KPiArDQo+ICsvKiBwc2VyaWVzX2lkbGVfZGV2aWNlc19pbml0KCkN
Cj4gKyAqIGFsbG9jYXRlLCBpbml0aWFsaXplIGFuZCByZWdpc3RlciBjcHVpZGxlIGRldmljZQ0K
PiArICovDQo+ICtzdGF0aWMgaW50IHBzZXJpZXNfaWRsZV9kZXZpY2VzX2luaXQodm9pZCkNCj4g
K3sNCj4gKwlpbnQgaTsNCj4gKwlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiA9ICZwc2VyaWVz
X2lkbGVfZHJpdmVyOw0KPiArCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2Ow0KPiArDQo+ICsJ
cHNlcmllc19jcHVpZGxlX2RldmljZXMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGNwdWlkbGVfZGV2
aWNlKTsNCj4gKwlpZiAocHNlcmllc19jcHVpZGxlX2RldmljZXMgPT0gTlVMTCkNCj4gKwkJcmV0
dXJuIC1FTk9NRU07DQo+ICsNCj4gKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgew0KPiArCQlk
ZXYgPSBwZXJfY3B1X3B0cihwc2VyaWVzX2NwdWlkbGVfZGV2aWNlcywgaSk7DQo+ICsJCWRldi0+
c3RhdGVfY291bnQgPSBkcnYtPnN0YXRlX2NvdW50Ow0KPiArCQlkZXYtPmNwdSA9IGk7DQo+ICsJ
CWlmIChjcHVpZGxlX3JlZ2lzdGVyX2RldmljZShkZXYpKSB7DQo+ICsJCQlwcmludGsoS0VSTl9E
RUJVRyBcDQo+ICsJCQkJImNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlICVkIGZhaWxlZCFcbiIsIGkp
Ow0KPiArCQkJcmV0dXJuIC1FSU87DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gMDsN
Cj4gK30NCj4gKw0KPiArLyoNCj4gKyAqIHBzZXJpZXNfaWRsZV9wcm9iZSgpDQo+ICsgKiBDaG9v
c2Ugc3RhdGUgdGFibGUgZm9yIHNoYXJlZCB2ZXJzdXMgZGVkaWNhdGVkIHBhcnRpdGlvbg0KPiAr
ICovDQo+ICtzdGF0aWMgaW50IHBzZXJpZXNfaWRsZV9wcm9iZSh2b2lkKQ0KPiArew0KPiArDQo+
ICsJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1NQTFBBUikpDQo+ICsJCXJl
dHVybiAtRU5PREVWOw0KPiArDQo+ICsJaWYgKGNwdWlkbGVfZGlzYWJsZSAhPSBJRExFX05PX09W
RVJSSURFKQ0KPiArCQlyZXR1cm4gLUVOT0RFVjsNCj4gKw0KPiArCWlmIChtYXhfaWRsZV9zdGF0
ZSA9PSAwKSB7DQo+ICsJCXByaW50ayhLRVJOX0RFQlVHICJwc2VyaWVzIHByb2Nlc3NvciBpZGxl
IGRpc2FibGVkLlxuIik7DQo+ICsJCXJldHVybiAtRVBFUk07DQo+ICsJfQ0KPiArDQo+ICsJaWYg
KGdldF9scHBhY2EoKS0+c2hhcmVkX3Byb2MpDQo+ICsJCWNwdWlkbGVfc3RhdGVfdGFibGUgPSBz
aGFyZWRfc3RhdGVzOw0KPiArCWVsc2UNCj4gKwkJY3B1aWRsZV9zdGF0ZV90YWJsZSA9IGRlZGlj
YXRlZF9zdGF0ZXM7DQo+ICsNCj4gKwlyZXR1cm4gMDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlu
dCBfX2luaXQgcHNlcmllc19wcm9jZXNzb3JfaWRsZV9pbml0KHZvaWQpDQo+ICt7DQo+ICsJaW50
IHJldHZhbDsNCj4gKw0KPiArCXJldHZhbCA9IHBzZXJpZXNfaWRsZV9wcm9iZSgpOw0KPiArCWlm
IChyZXR2YWwpDQo+ICsJCXJldHVybiByZXR2YWw7DQo+ICsNCj4gKwlwc2VyaWVzX2NwdWlkbGVf
ZHJpdmVyX2luaXQoKTsNCj4gKwlyZXR2YWwgPSBjcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmcHNl
cmllc19pZGxlX2RyaXZlcik7DQo+ICsJaWYgKHJldHZhbCkgew0KPiArCQlwcmludGsoS0VSTl9E
RUJVRyAiUmVnaXN0cmF0aW9uIG9mIHBzZXJpZXMgZHJpdmVyIGZhaWxlZC5cbiIpOw0KPiArCQly
ZXR1cm4gcmV0dmFsOw0KPiArCX0NCj4gKw0KPiArCXVwZGF0ZV9zbXRfc25vb3plX2RlbGF5KC0x
LCBwZXJfY3B1KHNtdF9zbm9vemVfZGVsYXksIDApKTsNCj4gKw0KPiArCXJldHZhbCA9IHBzZXJp
ZXNfaWRsZV9kZXZpY2VzX2luaXQoKTsNCj4gKwlpZiAocmV0dmFsKSB7DQo+ICsJCXBzZXJpZXNf
aWRsZV9kZXZpY2VzX3VuaW5pdCgpOw0KPiArCQljcHVpZGxlX3VucmVnaXN0ZXJfZHJpdmVyKCZw
c2VyaWVzX2lkbGVfZHJpdmVyKTsNCj4gKwkJcmV0dXJuIHJldHZhbDsNCj4gKwl9DQo+ICsNCj4g
KwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNldHVwX2hvdHBsdWdfbm90aWZpZXIpOw0KPiArCXBy
aW50ayhLRVJOX0RFQlVHICJwc2VyaWVzX2lkbGVfZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOw0KPiAr
DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB2b2lkIF9fZXhpdCBwc2VyaWVz
X3Byb2Nlc3Nvcl9pZGxlX2V4aXQodm9pZCkNCj4gK3sNCj4gKw0KPiArCXVucmVnaXN0ZXJfY3B1
X25vdGlmaWVyKCZzZXR1cF9ob3RwbHVnX25vdGlmaWVyKTsNCj4gKwlwc2VyaWVzX2lkbGVfZGV2
aWNlc191bmluaXQoKTsNCj4gKwljcHVpZGxlX3VucmVnaXN0ZXJfZHJpdmVyKCZwc2VyaWVzX2lk
bGVfZHJpdmVyKTsNCj4gKw0KPiArCXJldHVybjsNCj4gK30NCj4gKw0KPiArbW9kdWxlX2luaXQo
cHNlcmllc19wcm9jZXNzb3JfaWRsZV9pbml0KTsNCj4gK21vZHVsZV9leGl0KHBzZXJpZXNfcHJv
Y2Vzc29yX2lkbGVfZXhpdCk7DQo+ICsNCj4gK01PRFVMRV9BVVRIT1IoIkRlZXB0aGkgRGhhcndh
ciA8ZGVlcHRoaUBsaW51eC52bmV0LmlibS5jb20+Iik7DQo+ICtNT0RVTEVfREVTQ1JJUFRJT04o
IkNwdWlkbGUgZHJpdmVyIGZvciBQT1dFUiIpOw0KPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOw0K
PiANCg0K
^ permalink raw reply
* Re: [PATCH] cpuidle: add freescale e500 family porcessors idle support
From: Deepthi Dharwar @ 2013-07-31 3:03 UTC (permalink / raw)
To: Wang Dongsheng-B40534
Cc: Wood Scott-B07421, Li Yang-R58472, Zhao Chenhui-B35336,
linux-pm@vger.kernel.org, Daniel Lezcano, rjw@sisk.pl,
linuxppc-dev@lists.ozlabs.org
In-Reply-To: <ABB05CD9C9F68C46A5CEDC7F15439259FEF361@039-SN2MPN1-021.039d.mgd.msft.net>
On 07/30/2013 04:32 PM, Wang Dongsheng-B40534 wrote:
Hi Dongsheng,
I have posted out a generic powerpc idle backend driver ccing you.
Please take a look at it and integrate your platform idle states into it.
Right now, cpu hotplug notifier is common for all powerpc. This
shouldn't hinder you.
This will reduce code duplication and would make it easier to
plug into the framework. All you need is platform specific
idle states table and config changes.
Regards,
Deepthi
>
>> -----Original Message-----
>> From: Daniel Lezcano [mailto:daniel.lezcano@linaro.org]
>> Sent: Tuesday, July 30, 2013 5:51 PM
>> To: Wang Dongsheng-B40534
>> Cc: Wood Scott-B07421; rjw@sisk.pl; benh@kernel.crashing.org; Li Yang-
>> R58472; Zhao Chenhui-B35336; linux-pm@vger.kernel.org; linuxppc-
>> dev@lists.ozlabs.org
>> Subject: Re: [PATCH] cpuidle: add freescale e500 family porcessors idle
>> support
>>
>> On 07/30/2013 09:00 AM, Dongsheng Wang wrote:
>>> From: Wang Dongsheng <dongsheng.wang@freescale.com>
>>>
>>> Add cpuidle support for e500 family, using cpuidle framework to manage
>>> various low power modes. The new implementation will remain compatible
>>> with original idle method.
>>>
>>> Initially, this supports PW10, and subsequent patches will support
>>> PW20/DOZE/NAP.
>>>
>>> Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
>>> ---
>>> This patch keep using cpuidle_register_device(), because we need to
>>> support cpu hotplug. I will fix "device" issue in this driver, after
>>> Deepthi Dharwar <deepthi@linux.vnet.ibm.com> add a hotplug handler
>>> into cpuidle freamwork.
>>>
>>> diff --git a/arch/powerpc/include/asm/machdep.h
>>> b/arch/powerpc/include/asm/machdep.h
>>> index 8b48090..cbdbe25 100644
>>> --- a/arch/powerpc/include/asm/machdep.h
>>> +++ b/arch/powerpc/include/asm/machdep.h
>>> @@ -271,6 +271,16 @@ extern void power7_idle(void); extern void
>>> ppc6xx_idle(void); extern void book3e_idle(void);
>>>
>>> +/* Wait for Interrupt */
>>> +static inline void fsl_cpuidle_wait(void) { #ifdef CONFIG_PPC64
>>> + book3e_idle();
>>> +#else
>>> + e500_idle();
>>> +#endif
>>> +}
>>> +
>>> /*
>>> * ppc_md contains a copy of the machine description structure for the
>>> * current platform. machine_id contains the initial address where the
>>> diff --git a/drivers/cpuidle/Kconfig b/drivers/cpuidle/Kconfig
>>> index b3fb81d..7ed114b 100644
>>> --- a/drivers/cpuidle/Kconfig
>>> +++ b/drivers/cpuidle/Kconfig
>>> @@ -35,6 +35,11 @@ depends on ARM
>>> source "drivers/cpuidle/Kconfig.arm"
>>> endmenu
>>>
>>> +menu "PowerPC CPU Idle Drivers"
>>> +depends on PPC32 || PPC64
>>> +source "drivers/cpuidle/Kconfig.powerpc"
>>> +endmenu
>>> +
>>> endif
>>>
>>> config ARCH_NEEDS_CPU_IDLE_COUPLED
>>> diff --git a/drivers/cpuidle/Kconfig.powerpc
>> b/drivers/cpuidle/Kconfig.powerpc
>>> new file mode 100644
>>> index 0000000..9f3f5ef
>>> --- /dev/null
>>> +++ b/drivers/cpuidle/Kconfig.powerpc
>>> @@ -0,0 +1,9 @@
>>> +#
>>> +# PowerPC CPU Idle drivers
>>> +#
>>> +
>>> +config PPC_E500_CPUIDLE
>>> + bool "CPU Idle Driver for E500 family processors"
>>> + depends on FSL_SOC_BOOKE
>>> + help
>>> + Select this to enable cpuidle on e500 family processors.
>>> diff --git a/drivers/cpuidle/Makefile b/drivers/cpuidle/Makefile
>>> index 0b9d200..0dde3db 100644
>>> --- a/drivers/cpuidle/Makefile
>>> +++ b/drivers/cpuidle/Makefile
>>> @@ -11,3 +11,7 @@ obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE) += cpuidle-
>> calxeda.o
>>> obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) += cpuidle-kirkwood.o
>>> obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) += cpuidle-zynq.o
>>> obj-$(CONFIG_ARM_U8500_CPUIDLE) += cpuidle-ux500.o
>>> +
>>>
>> +########################################################################
>> ##########
>>> +# PowerPC platform drivers
>>> +obj-$(CONFIG_PPC_E500_CPUIDLE) += cpuidle-e500.o
>>> diff --git a/drivers/cpuidle/cpuidle-e500.c b/drivers/cpuidle/cpuidle-
>> e500.c
>>> new file mode 100644
>>> index 0000000..1919cea
>>> --- /dev/null
>>> +++ b/drivers/cpuidle/cpuidle-e500.c
>>> @@ -0,0 +1,222 @@
>>> +/*
>>> + * Copyright 2013 Freescale Semiconductor, Inc.
>>> + *
>>> + * CPU Idle driver for Freescale PowerPC e500 family processors.
>>> + *
>>> + * 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.
>>> + *
>>> + * Author: Wang Dongsheng <dongsheng.wang@freescale.com>
>>> + */
>>> +
>>> +#include <linux/cpu.h>
>>> +#include <linux/cpuidle.h>
>>> +#include <linux/init.h>
>>> +#include <linux/kernel.h>
>>> +#include <linux/module.h>
>>> +#include <linux/notifier.h>
>>> +
>>> +#include <asm/machdep.h>
>>> +
>>> +static struct cpuidle_driver e500_idle_driver = {
>>> + .name = "e500_idle",
>>> + .owner = THIS_MODULE,
>>> +};
>>> +
>>> +static struct cpuidle_device __percpu *e500_cpuidle_devices;
>>> +
>>> +static void e500_cpuidle(void)
>>> +{
>>> + /*
>>> + * This would call on the cpuidle framework, and the back-end
>>> + * driver to go to idle states.
>>> + */
>>> + if (cpuidle_idle_call()) {
>>> + /*
>>> + * On error, execute default handler
>>> + * to go into low thread priority and possibly
>>> + * low power mode.
>>> + */
>>> + HMT_low();
>>> + HMT_very_low();
>>> + }
>>> +}
>>
>> Nope, this is not the place to add such function.
>>
> Thanks.
>
> But Why not? On powerpc there is already have a cpuidle method. We need to compatible them.
>
> Um.. arch/powerpc/platforms/xxx ?
>
>>> +static int pw10_enter(struct cpuidle_device *dev,
>>> + struct cpuidle_driver *drv, int index)
>>> +{
>>> + fsl_cpuidle_wait();
>>> + return index;
>>> +}
>>> +
>>> +static struct cpuidle_state fsl_pw_idle_states[] = {
>>> + {
>>> + .name = "pw10",
>>> + .desc = "pw10",
>>> + .flags = CPUIDLE_FLAG_TIME_VALID,
>>> + .exit_latency = 0,
>>> + .target_residency = 0,
>>> + .enter = &pw10_enter
>>> + },
>>> +};
>>> +
>>> +static int cpu_hotplug_notify(struct notifier_block *n,
>>> + unsigned long action, void *hcpu)
>>> +{
>>> + unsigned long hotcpu = (unsigned long)hcpu;
>>> + struct cpuidle_device *dev =
>>> + per_cpu_ptr(e500_cpuidle_devices, hotcpu);
>>> +
>>> + if (dev && cpuidle_get_driver()) {
>>> + switch (action) {
>>> + case CPU_ONLINE:
>>> + case CPU_ONLINE_FROZEN:
>>> + cpuidle_pause_and_lock();
>>> + cpuidle_enable_device(dev);
>>> + cpuidle_resume_and_unlock();
>>> + break;
>>> +
>>> + case CPU_DEAD:
>>> + case CPU_DEAD_FROZEN:
>>> + cpuidle_pause_and_lock();
>>> + cpuidle_disable_device(dev);
>>> + cpuidle_resume_and_unlock();
>>> + break;
>>> +
>>> + default:
>>> + return NOTIFY_DONE;
>>> + }
>>> + }
>>> +
>>> + return NOTIFY_OK;
>>> +}
>>> +
>>> +static struct notifier_block cpu_hotplug_notifier = {
>>> + .notifier_call = cpu_hotplug_notify,
>>> +};
>>
>> This should go to the cpuidle framework.
>>
> Yes, I see, Deepthi will post it...
> :(, This patch is relying on for Deepthi's patch about "hotplug notifier".
>
>>> +
>>> +/*
>>> + * e500_idle_devices_init(void)
>>> + * allocate, initialize and register cpuidle device
>>> + */
>>> +static int e500_idle_devices_init(void)
>>> +{
>>> + int i;
>>> + struct cpuidle_driver *drv = &e500_idle_driver;
>>> + struct cpuidle_device *dev;
>>> +
>>> + e500_cpuidle_devices = alloc_percpu(struct cpuidle_device);
>>> + if (!e500_cpuidle_devices)
>>> + return -ENOMEM;
>>> +
>>> + for_each_possible_cpu(i) {
>>> + dev = per_cpu_ptr(e500_cpuidle_devices, i);
>>> + dev->state_count = drv->state_count;
>>> + dev->cpu = i;
>>> +
>>> + if (cpuidle_register_device(dev)) {
>>> + pr_err("cpuidle_register_device %d failed!\n", i);
>>> + return -EIO;
>>> + }
>>> + }
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +/*
>>> + * e500_idle_devices_uninit(void)
>>> + * unregister cpuidle devices and de-allocate memory
>>> + */
>>> +static void e500_idle_devices_uninit(void)
>>> +{
>>> + int i;
>>> + struct cpuidle_device *dev;
>>> +
>>> + if (!e500_cpuidle_devices)
>>> + return;
>>> +
>>> + for_each_possible_cpu(i) {
>>> + dev = per_cpu_ptr(e500_cpuidle_devices, i);
>>> + cpuidle_unregister_device(dev);
>>> + }
>>> +
>>> + free_percpu(e500_cpuidle_devices);
>>> +}
>>> +
>>> +static void e500_cpuidle_driver_init(unsigned int max_idle_state,
>>> + struct cpuidle_state *cpuidle_state_table)
>>> +{
>>> + int idle_state;
>>> + struct cpuidle_driver *drv = &e500_idle_driver;
>>> +
>>> + drv->state_count = 0;
>>> +
>>> + for (idle_state = 0; idle_state < max_idle_state; ++idle_state) {
>>> + if (!cpuidle_state_table[idle_state].enter)
>>> + break;
>>> +
>>> + drv->states[drv->state_count] =
>> cpuidle_state_table[idle_state];
>>> + drv->state_count++;
>>> + }
>>> +}
>>> +
>>> +static int cpu_is_feature(unsigned long feature)
>>> +{
>>> + return (cur_cpu_spec->cpu_features == feature);
>>> +}
>>> +
>>> +static int __init e500_idle_init(void)
>>> +{
>>> + struct cpuidle_state *cpuidle_state_table = NULL;
>>> + struct cpuidle_driver *drv = &e500_idle_driver;
>>> + int err;
>>> + unsigned int max_idle_state = 0;
>>> +
>>> + if (cpuidle_disable != IDLE_NO_OVERRIDE)
>>> + return -ENODEV;
>>> +
>>> + if (cpu_is_feature(CPU_FTRS_E500MC) ||
>> cpu_is_feature(CPU_FTRS_E5500) ||
>>> + cpu_is_feature(CPU_FTRS_E6500)) {
>>> + cpuidle_state_table = fsl_pw_idle_states;
>>> + max_idle_state = ARRAY_SIZE(fsl_pw_idle_states);
>>> + }
>>> +
>>> + if (!cpuidle_state_table || !max_idle_state)
>>> + return -EPERM;
>>
>> Please use different drivers for each and then register the right one
>> instead of state count convolutions.
>>
>> Then use cpuidle_register(&mydriver, NULL) and get rid of the duplicate
>> initialization routine.
>>
> Yes, Thanks, This patch keep using cpuidle_register_device(), because we need to
> support cpu hotplug. I will fix "device" issue in this driver, after
> Deepthi Dharwar <deepthi@linux.vnet.ibm.com> add a hotplug handler
> into cpuidle freamwork.
>
>>
>>> + e500_cpuidle_driver_init(max_idle_state, cpuidle_state_table);
>>> +
>>> + if (!drv->state_count)
>>> + return -EPERM;
>>> +
>>> + err = cpuidle_register_driver(drv);
>>> + if (err) {
>>> + pr_err("Register e500 family cpuidle driver failed.\n");
>>> +
>>> + return err;
>>> + }
>>> +
>>> + err = e500_idle_devices_init();
>>> + if (err)
>>> + goto out;
>>> +
>>> + err = register_cpu_notifier(&cpu_hotplug_notifier);
>>> + if (err)
>>> + goto out;
>>> +
>>> + ppc_md.power_save = e500_cpuidle;
>>
>> This is not the place.
>>
>>> +
>>> + pr_info("e500_idle_driver registered.\n");
>>> +
>>> + return 0;
>>> +
>>> +out:
>>> + e500_idle_devices_uninit();
>>> + cpuidle_unregister_driver(drv);
>>> +
>>> + pr_err("Register e500 family cpuidle driver failed.\n");
>>> +
>>> + return err;
>>> +}
>>> +device_initcall(e500_idle_init);
>>>
>>
>>
>> --
>> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
>>
>> Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
>> <http://twitter.com/#!/linaroorg> Twitter |
>> <http://www.linaro.org/linaro-blog/> Blog
>>
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
>
^ permalink raw reply
* [PATCH V2 5/6] cpuidle/powerpc: Backend-powerpc idle driver for powernv and pseries.
From: Deepthi Dharwar @ 2013-07-31 2:59 UTC (permalink / raw)
To: benh, daniel.lezcano, linux-kernel, michael, srivatsa.bhat,
preeti, svaidy, linuxppc-dev
Cc: rjw, dongsheng.wang, linux-pm
In-Reply-To: <20130731025840.19448.24468.stgit@deepthi>
The following patch extends the current pseries backend
idle driver to powernv platform.
Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
---
arch/powerpc/include/asm/processor.h | 2 -
arch/powerpc/sysdev/Kconfig | 8 +-
arch/powerpc/sysdev/Makefile | 2 -
arch/powerpc/sysdev/processor_idle.c | 132 ++++++++++++++++++++++------------
4 files changed, 92 insertions(+), 52 deletions(-)
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index 47a35b0..e64b817 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -426,7 +426,7 @@ enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF};
extern int powersave_nap; /* set if nap mode can be used in idle loop */
extern void power7_nap(void);
-#ifdef CONFIG_PSERIES_IDLE
+#ifdef CONFIG_POWERPC_IDLE
extern void update_smt_snooze_delay(int cpu, int residency);
#else
static inline void update_smt_snooze_delay(int cpu, int residency) {}
diff --git a/arch/powerpc/sysdev/Kconfig b/arch/powerpc/sysdev/Kconfig
index 8564a3f..f61d794 100644
--- a/arch/powerpc/sysdev/Kconfig
+++ b/arch/powerpc/sysdev/Kconfig
@@ -35,11 +35,11 @@ config GE_FPGA
bool
default n
-config PSERIES_IDLE
- bool "Cpuidle driver for pSeries platforms"
+config POWERPC_IDLE
+ bool "Cpuidle driver for POWERPC platforms"
depends on CPU_IDLE
- depends on PPC_PSERIES
+ depends on PPC_PSERIES || PPC_POWERNV
default y
help
Select this option to enable processor idle state management
- for pSeries through cpuidle subsystem.
+ for POWER and POWERNV through cpuidle subsystem.
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile
index 93d2cdd..ec290e2 100644
--- a/arch/powerpc/sysdev/Makefile
+++ b/arch/powerpc/sysdev/Makefile
@@ -49,7 +49,7 @@ endif
obj-$(CONFIG_PPC4xx_MSI) += ppc4xx_msi.o
obj-$(CONFIG_PPC4xx_CPM) += ppc4xx_cpm.o
obj-$(CONFIG_PPC4xx_GPIO) += ppc4xx_gpio.o
-obj-$(CONFIG_PSERIES_IDLE) += processor_idle.o
+obj-$(CONFIG_POWERPC_IDLE) += processor_idle.o
obj-$(CONFIG_CPM) += cpm_common.o
obj-$(CONFIG_CPM2) += cpm2.o cpm2_pic.o
diff --git a/arch/powerpc/sysdev/processor_idle.c b/arch/powerpc/sysdev/processor_idle.c
index 0d75a54..d152f540d 100644
--- a/arch/powerpc/sysdev/processor_idle.c
+++ b/arch/powerpc/sysdev/processor_idle.c
@@ -20,18 +20,18 @@
#include <asm/runlatch.h>
#include <asm/plpar_wrappers.h>
-/* Snooze Delay, pseries_idle */
+/* Snooze Delay, powerpc_idle */
DECLARE_PER_CPU(long, smt_snooze_delay);
-struct cpuidle_driver pseries_idle_driver = {
- .name = "pseries_idle",
+struct cpuidle_driver powerpc_idle_driver = {
+ .name = "powerpc_idle",
.owner = THIS_MODULE,
};
#define MAX_IDLE_STATE_COUNT 2
static int max_idle_state = MAX_IDLE_STATE_COUNT - 1;
-static struct cpuidle_device __percpu *pseries_cpuidle_devices;
+static struct cpuidle_device __percpu *powerpc_cpuidle_devices;
static struct cpuidle_state *cpuidle_state_table;
static inline void idle_loop_prolog(unsigned long *in_purr)
@@ -55,13 +55,14 @@ static int snooze_loop(struct cpuidle_device *dev,
int index)
{
unsigned long in_purr;
- int cpu = dev->cpu;
+#ifndef PPC_POWERNV
idle_loop_prolog(&in_purr);
+#endif
local_irq_enable();
set_thread_flag(TIF_POLLING_NRFLAG);
- while ((!need_resched()) && cpu_online(cpu)) {
+ while (!need_resched()) {
ppc64_runlatch_off();
HMT_low();
HMT_very_low();
@@ -71,7 +72,9 @@ static int snooze_loop(struct cpuidle_device *dev,
clear_thread_flag(TIF_POLLING_NRFLAG);
smp_mb();
+#ifndef PPC_POWERNV
idle_loop_epilog(in_purr);
+#endif
return index;
}
@@ -135,10 +138,21 @@ static int shared_cede_loop(struct cpuidle_device *dev,
return index;
}
+#ifdef PPC_POWERNV
+static int nap_loop(struct cpuidle_device *dev,
+ struct cpuidle_driver *drv,
+ int index)
+{
+ ppc64_runlatch_off();
+ power7_idle();
+ return index;
+}
+#endif
+
/*
* States for dedicated partition case.
*/
-static struct cpuidle_state dedicated_states[MAX_IDLE_STATE_COUNT] = {
+static struct cpuidle_state pseries_dedicated_states[MAX_IDLE_STATE_COUNT] = {
{ /* Snooze */
.name = "snooze",
.desc = "snooze",
@@ -158,7 +172,7 @@ static struct cpuidle_state dedicated_states[MAX_IDLE_STATE_COUNT] = {
/*
* States for shared partition case.
*/
-static struct cpuidle_state shared_states[MAX_IDLE_STATE_COUNT] = {
+static struct cpuidle_state pseries_shared_states[MAX_IDLE_STATE_COUNT] = {
{ /* Shared Cede */
.name = "Shared Cede",
.desc = "Shared Cede",
@@ -168,13 +182,34 @@ static struct cpuidle_state shared_states[MAX_IDLE_STATE_COUNT] = {
.enter = &shared_cede_loop },
};
+#ifdef PPC_POWERNV
+static struct cpuidle_state powernv_states[MAX_IDLE_STATE_COUNT] = {
+ { /* Snooze */
+ .name = "snooze",
+ .desc = "snooze",
+ .flags = CPUIDLE_FLAG_TIME_VALID,
+ .exit_latency = 0,
+ .target_residency = 0,
+ .enter = &snooze_loop },
+ { /* CEDE */
+ .name = "CEDE",
+ .desc = "CEDE",
+ .flags = CPUIDLE_FLAG_TIME_VALID,
+ .exit_latency = 10,
+ .target_residency = 100,
+ .enter = &nap_loop },
+};
+#endif
+
void update_smt_snooze_delay(int cpu, int residency)
{
struct cpuidle_driver *drv = cpuidle_get_driver();
struct cpuidle_device *dev;
- if (cpuidle_state_table != dedicated_states)
+#ifndef PPC_POWERNV
+ if (cpuidle_state_table != pseries_dedicated_states)
return;
+#endif
if (!drv)
return;
@@ -204,12 +239,12 @@ void update_smt_snooze_delay(int cpu, int residency)
}
}
-static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
+static int powerpc_cpuidle_add_cpu_notifier(struct notifier_block *n,
unsigned long action, void *hcpu)
{
int hotcpu = (unsigned long)hcpu;
struct cpuidle_device *dev =
- per_cpu_ptr(pseries_cpuidle_devices, hotcpu);
+ per_cpu_ptr(powerpc_cpuidle_devices, hotcpu);
if (dev && cpuidle_get_driver()) {
switch (action) {
@@ -235,16 +270,16 @@ static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
}
static struct notifier_block setup_hotplug_notifier = {
- .notifier_call = pseries_cpuidle_add_cpu_notifier,
+ .notifier_call = powerpc_cpuidle_add_cpu_notifier,
};
/*
- * pseries_cpuidle_driver_init()
+ * powerpc_cpuidle_driver_init()
*/
-static int pseries_cpuidle_driver_init(void)
+static int powerpc_cpuidle_driver_init(void)
{
int idle_state;
- struct cpuidle_driver *drv = &pseries_idle_driver;
+ struct cpuidle_driver *drv = &powerpc_idle_driver;
drv->state_count = 0;
@@ -266,38 +301,38 @@ static int pseries_cpuidle_driver_init(void)
return 0;
}
-/* pseries_idle_devices_uninit(void)
+/* powerpc_idle_devices_uninit(void)
* unregister cpuidle devices and de-allocate memory
*/
-static void pseries_idle_devices_uninit(void)
+static void powerpc_idle_devices_uninit(void)
{
int i;
struct cpuidle_device *dev;
for_each_possible_cpu(i) {
- dev = per_cpu_ptr(pseries_cpuidle_devices, i);
+ dev = per_cpu_ptr(powerpc_cpuidle_devices, i);
cpuidle_unregister_device(dev);
}
- free_percpu(pseries_cpuidle_devices);
+ free_percpu(powerpc_cpuidle_devices);
return;
}
-/* pseries_idle_devices_init()
+/* powerpc_idle_devices_init()
* allocate, initialize and register cpuidle device
*/
-static int pseries_idle_devices_init(void)
+static int powerpc_idle_devices_init(void)
{
int i;
- struct cpuidle_driver *drv = &pseries_idle_driver;
+ struct cpuidle_driver *drv = &powerpc_idle_driver;
struct cpuidle_device *dev;
- pseries_cpuidle_devices = alloc_percpu(struct cpuidle_device);
- if (pseries_cpuidle_devices == NULL)
+ powerpc_cpuidle_devices = alloc_percpu(struct cpuidle_device);
+ if (powerpc_cpuidle_devices == NULL)
return -ENOMEM;
for_each_possible_cpu(i) {
- dev = per_cpu_ptr(pseries_cpuidle_devices, i);
+ dev = per_cpu_ptr(powerpc_cpuidle_devices, i);
dev->state_count = drv->state_count;
dev->cpu = i;
if (cpuidle_register_device(dev)) {
@@ -311,74 +346,79 @@ static int pseries_idle_devices_init(void)
}
/*
- * pseries_idle_probe()
+ * powerpc_idle_probe()
* Choose state table for shared versus dedicated partition
*/
-static int pseries_idle_probe(void)
+static int powerpc_idle_probe(void)
{
+#ifndef PPC_POWERNV
if (!firmware_has_feature(FW_FEATURE_SPLPAR))
return -ENODEV;
+#endif
if (cpuidle_disable != IDLE_NO_OVERRIDE)
return -ENODEV;
if (max_idle_state == 0) {
- printk(KERN_DEBUG "pseries processor idle disabled.\n");
+ printk(KERN_DEBUG "powerpc processor idle disabled.\n");
return -EPERM;
}
+#ifdef PPC_POWERNV
+ cpuidle_state_table = powernv_states;
+#else
if (get_lppaca()->shared_proc)
- cpuidle_state_table = shared_states;
+ cpuidle_state_table = pseries_shared_states;
else
- cpuidle_state_table = dedicated_states;
-
+ cpuidle_state_table = pseries_dedicated_states;
+#endif
return 0;
}
-static int __init pseries_processor_idle_init(void)
+static int __init powerpc_processor_idle_init(void)
{
int retval;
- retval = pseries_idle_probe();
+ retval = powerpc_idle_probe();
if (retval)
return retval;
- pseries_cpuidle_driver_init();
- retval = cpuidle_register_driver(&pseries_idle_driver);
+ powerpc_cpuidle_driver_init();
+ retval = cpuidle_register_driver(&powerpc_idle_driver);
if (retval) {
- printk(KERN_DEBUG "Registration of pseries driver failed.\n");
+ printk(KERN_DEBUG "Registration of powerpc driver failed.\n");
return retval;
}
update_smt_snooze_delay(-1, per_cpu(smt_snooze_delay, 0));
- retval = pseries_idle_devices_init();
+ retval = powerpc_idle_devices_init();
if (retval) {
- pseries_idle_devices_uninit();
- cpuidle_unregister_driver(&pseries_idle_driver);
+ powerpc_idle_devices_uninit();
+ cpuidle_unregister_driver(&powerpc_idle_driver);
return retval;
}
register_cpu_notifier(&setup_hotplug_notifier);
- printk(KERN_DEBUG "pseries_idle_driver registered\n");
+ printk(KERN_DEBUG "powerpc_idle_driver registered\n");
return 0;
}
-static void __exit pseries_processor_idle_exit(void)
+static void __exit powerpc_processor_idle_exit(void)
{
unregister_cpu_notifier(&setup_hotplug_notifier);
- pseries_idle_devices_uninit();
- cpuidle_unregister_driver(&pseries_idle_driver);
+ powerpc_idle_devices_uninit();
+ cpuidle_unregister_driver(&powerpc_idle_driver);
return;
}
-module_init(pseries_processor_idle_init);
-module_exit(pseries_processor_idle_exit);
+module_init(powerpc_processor_idle_init);
+module_exit(powerpc_processor_idle_exit);
MODULE_AUTHOR("Deepthi Dharwar <deepthi@linux.vnet.ibm.com>");
-MODULE_DESCRIPTION("Cpuidle driver for POWER");
+MODULE_DESCRIPTION("Cpuidle driver for POWERPC");
MODULE_LICENSE("GPL");
^ permalink raw reply related
* [PATCH V2 6/6] cpuidle/powernv: Enable idle powernv cpu to call into the cpuidle framework.
From: Deepthi Dharwar @ 2013-07-31 2:59 UTC (permalink / raw)
To: benh, daniel.lezcano, linux-kernel, michael, srivatsa.bhat,
preeti, svaidy, linuxppc-dev
Cc: rjw, dongsheng.wang, linux-pm
In-Reply-To: <20130731025840.19448.24468.stgit@deepthi>
This patch enables idle powernv cpu to hook on to the cpuidle
framework, if available, else call on to default idle platform
code.
Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
---
arch/powerpc/platforms/powernv/setup.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c
index 84438af..d4283dd 100644
--- a/arch/powerpc/platforms/powernv/setup.c
+++ b/arch/powerpc/platforms/powernv/setup.c
@@ -25,6 +25,7 @@
#include <linux/of.h>
#include <linux/interrupt.h>
#include <linux/bug.h>
+#include <linux/cpuidle.h>
#include <asm/machdep.h>
#include <asm/firmware.h>
@@ -196,6 +197,15 @@ static int __init pnv_probe(void)
return 1;
}
+void powernv_idle(void)
+{
+ /* Hook to cpuidle framework if available, else
+ * call on default platform idle code
+ */
+ if (cpuidle_idle_call())
+ power7_idle();
+}
+
define_machine(powernv) {
.name = "PowerNV",
.probe = pnv_probe,
@@ -205,7 +215,7 @@ define_machine(powernv) {
.show_cpuinfo = pnv_show_cpuinfo,
.progress = pnv_progress,
.machine_shutdown = pnv_shutdown,
- .power_save = power7_idle,
+ .power_save = powernv_idle,
.calibrate_decr = generic_calibrate_decr,
#ifdef CONFIG_KEXEC
.kexec_cpu_down = pnv_kexec_cpu_down,
^ permalink raw reply related
* [PATCH V2 3/6] pseries: Move plpar_wrapper.h to powerpc common include/asm location.
From: Deepthi Dharwar @ 2013-07-31 2:59 UTC (permalink / raw)
To: benh, daniel.lezcano, linux-kernel, michael, srivatsa.bhat,
preeti, svaidy, linuxppc-dev
Cc: rjw, dongsheng.wang, linux-pm
In-Reply-To: <20130731025840.19448.24468.stgit@deepthi>
As a part of pseries_idle backend driver cleanup to make
the code common to both pseries and powernv archs, it
is necessary to move the backend-driver code to powerpc/sysdev.
As a pre-requisite to that, it is essential to move plpar_wrapper.h
to include/asm.
Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
---
arch/powerpc/include/asm/plpar_wrappers.h | 324 +++++++++++++++++++++++
arch/powerpc/platforms/pseries/cmm.c | 3
arch/powerpc/platforms/pseries/dtl.c | 3
arch/powerpc/platforms/pseries/hotplug-cpu.c | 3
arch/powerpc/platforms/pseries/hvconsole.c | 2
arch/powerpc/platforms/pseries/iommu.c | 3
arch/powerpc/platforms/pseries/kexec.c | 2
arch/powerpc/platforms/pseries/lpar.c | 2
arch/powerpc/platforms/pseries/plpar_wrappers.h | 324 -----------------------
arch/powerpc/platforms/pseries/processor_idle.c | 3
arch/powerpc/platforms/pseries/setup.c | 2
arch/powerpc/platforms/pseries/smp.c | 2
12 files changed, 335 insertions(+), 338 deletions(-)
create mode 100644 arch/powerpc/include/asm/plpar_wrappers.h
delete mode 100644 arch/powerpc/platforms/pseries/plpar_wrappers.h
diff --git a/arch/powerpc/include/asm/plpar_wrappers.h b/arch/powerpc/include/asm/plpar_wrappers.h
new file mode 100644
index 0000000..f35787b
--- /dev/null
+++ b/arch/powerpc/include/asm/plpar_wrappers.h
@@ -0,0 +1,324 @@
+#ifndef _PSERIES_PLPAR_WRAPPERS_H
+#define _PSERIES_PLPAR_WRAPPERS_H
+
+#include <linux/string.h>
+#include <linux/irqflags.h>
+
+#include <asm/hvcall.h>
+#include <asm/paca.h>
+#include <asm/page.h>
+
+/* Get state of physical CPU from query_cpu_stopped */
+int smp_query_cpu_stopped(unsigned int pcpu);
+#define QCSS_STOPPED 0
+#define QCSS_STOPPING 1
+#define QCSS_NOT_STOPPED 2
+#define QCSS_HARDWARE_ERROR -1
+#define QCSS_HARDWARE_BUSY -2
+
+static inline long poll_pending(void)
+{
+ return plpar_hcall_norets(H_POLL_PENDING);
+}
+
+static inline u8 get_cede_latency_hint(void)
+{
+ return get_lppaca()->cede_latency_hint;
+}
+
+static inline void set_cede_latency_hint(u8 latency_hint)
+{
+ get_lppaca()->cede_latency_hint = latency_hint;
+}
+
+static inline long cede_processor(void)
+{
+ return plpar_hcall_norets(H_CEDE);
+}
+
+static inline long extended_cede_processor(unsigned long latency_hint)
+{
+ long rc;
+ u8 old_latency_hint = get_cede_latency_hint();
+
+ set_cede_latency_hint(latency_hint);
+
+ rc = cede_processor();
+#ifdef CONFIG_TRACE_IRQFLAGS
+ /* Ensure that H_CEDE returns with IRQs on */
+ if (WARN_ON(!(mfmsr() & MSR_EE)))
+ __hard_irq_enable();
+#endif
+
+ set_cede_latency_hint(old_latency_hint);
+
+ return rc;
+}
+
+static inline long vpa_call(unsigned long flags, unsigned long cpu,
+ unsigned long vpa)
+{
+ flags = flags << H_VPA_FUNC_SHIFT;
+
+ return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);
+}
+
+static inline long unregister_vpa(unsigned long cpu)
+{
+ return vpa_call(H_VPA_DEREG_VPA, cpu, 0);
+}
+
+static inline long register_vpa(unsigned long cpu, unsigned long vpa)
+{
+ return vpa_call(H_VPA_REG_VPA, cpu, vpa);
+}
+
+static inline long unregister_slb_shadow(unsigned long cpu)
+{
+ return vpa_call(H_VPA_DEREG_SLB, cpu, 0);
+}
+
+static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)
+{
+ return vpa_call(H_VPA_REG_SLB, cpu, vpa);
+}
+
+static inline long unregister_dtl(unsigned long cpu)
+{
+ return vpa_call(H_VPA_DEREG_DTL, cpu, 0);
+}
+
+static inline long register_dtl(unsigned long cpu, unsigned long vpa)
+{
+ return vpa_call(H_VPA_REG_DTL, cpu, vpa);
+}
+
+static inline long plpar_page_set_loaned(unsigned long vpa)
+{
+ unsigned long cmo_page_sz = cmo_get_page_size();
+ long rc = 0;
+ int i;
+
+ for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
+ rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0);
+
+ for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
+ plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE,
+ vpa + i - cmo_page_sz, 0);
+
+ return rc;
+}
+
+static inline long plpar_page_set_active(unsigned long vpa)
+{
+ unsigned long cmo_page_sz = cmo_get_page_size();
+ long rc = 0;
+ int i;
+
+ for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
+ rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0);
+
+ for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
+ plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED,
+ vpa + i - cmo_page_sz, 0);
+
+ return rc;
+}
+
+extern void vpa_init(int cpu);
+
+static inline long plpar_pte_enter(unsigned long flags,
+ unsigned long hpte_group, unsigned long hpte_v,
+ unsigned long hpte_r, unsigned long *slot)
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+ rc = plpar_hcall(H_ENTER, retbuf, flags, hpte_group, hpte_v, hpte_r);
+
+ *slot = retbuf[0];
+
+ return rc;
+}
+
+static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,
+ unsigned long avpn, unsigned long *old_pteh_ret,
+ unsigned long *old_ptel_ret)
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+ rc = plpar_hcall(H_REMOVE, retbuf, flags, ptex, avpn);
+
+ *old_pteh_ret = retbuf[0];
+ *old_ptel_ret = retbuf[1];
+
+ return rc;
+}
+
+/* plpar_pte_remove_raw can be called in real mode. It calls plpar_hcall_raw */
+static inline long plpar_pte_remove_raw(unsigned long flags, unsigned long ptex,
+ unsigned long avpn, unsigned long *old_pteh_ret,
+ unsigned long *old_ptel_ret)
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+ rc = plpar_hcall_raw(H_REMOVE, retbuf, flags, ptex, avpn);
+
+ *old_pteh_ret = retbuf[0];
+ *old_ptel_ret = retbuf[1];
+
+ return rc;
+}
+
+static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,
+ unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+ rc = plpar_hcall(H_READ, retbuf, flags, ptex);
+
+ *old_pteh_ret = retbuf[0];
+ *old_ptel_ret = retbuf[1];
+
+ return rc;
+}
+
+/* plpar_pte_read_raw can be called in real mode. It calls plpar_hcall_raw */
+static inline long plpar_pte_read_raw(unsigned long flags, unsigned long ptex,
+ unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+ rc = plpar_hcall_raw(H_READ, retbuf, flags, ptex);
+
+ *old_pteh_ret = retbuf[0];
+ *old_ptel_ret = retbuf[1];
+
+ return rc;
+}
+
+/*
+ * plpar_pte_read_4_raw can be called in real mode.
+ * ptes must be 8*sizeof(unsigned long)
+ */
+static inline long plpar_pte_read_4_raw(unsigned long flags, unsigned long ptex,
+ unsigned long *ptes)
+
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
+
+ rc = plpar_hcall9_raw(H_READ, retbuf, flags | H_READ_4, ptex);
+
+ memcpy(ptes, retbuf, 8*sizeof(unsigned long));
+
+ return rc;
+}
+
+static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,
+ unsigned long avpn)
+{
+ return plpar_hcall_norets(H_PROTECT, flags, ptex, avpn);
+}
+
+static inline long plpar_tce_get(unsigned long liobn, unsigned long ioba,
+ unsigned long *tce_ret)
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+ rc = plpar_hcall(H_GET_TCE, retbuf, liobn, ioba);
+
+ *tce_ret = retbuf[0];
+
+ return rc;
+}
+
+static inline long plpar_tce_put(unsigned long liobn, unsigned long ioba,
+ unsigned long tceval)
+{
+ return plpar_hcall_norets(H_PUT_TCE, liobn, ioba, tceval);
+}
+
+static inline long plpar_tce_put_indirect(unsigned long liobn,
+ unsigned long ioba, unsigned long page, unsigned long count)
+{
+ return plpar_hcall_norets(H_PUT_TCE_INDIRECT, liobn, ioba, page, count);
+}
+
+static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,
+ unsigned long tceval, unsigned long count)
+{
+ return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);
+}
+
+static inline long plpar_get_term_char(unsigned long termno,
+ unsigned long *len_ret, char *buf_ret)
+{
+ long rc;
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+ unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */
+
+ rc = plpar_hcall(H_GET_TERM_CHAR, retbuf, termno);
+
+ *len_ret = retbuf[0];
+ lbuf[0] = retbuf[1];
+ lbuf[1] = retbuf[2];
+
+ return rc;
+}
+
+static inline long plpar_put_term_char(unsigned long termno, unsigned long len,
+ const char *buffer)
+{
+ unsigned long *lbuf = (unsigned long *)buffer; /* TODO: alignment? */
+ return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],
+ lbuf[1]);
+}
+
+/* Set various resource mode parameters */
+static inline long plpar_set_mode(unsigned long mflags, unsigned long resource,
+ unsigned long value1, unsigned long value2)
+{
+ return plpar_hcall_norets(H_SET_MODE, mflags, resource, value1, value2);
+}
+
+/*
+ * Enable relocation on exceptions on this partition
+ *
+ * Note: this call has a partition wide scope and can take a while to complete.
+ * If it returns H_LONG_BUSY_* it should be retried periodically until it
+ * returns H_SUCCESS.
+ */
+static inline long enable_reloc_on_exceptions(void)
+{
+ /* mflags = 3: Exceptions at 0xC000000000004000 */
+ return plpar_set_mode(3, 3, 0, 0);
+}
+
+/*
+ * Disable relocation on exceptions on this partition
+ *
+ * Note: this call has a partition wide scope and can take a while to complete.
+ * If it returns H_LONG_BUSY_* it should be retried periodically until it
+ * returns H_SUCCESS.
+ */
+static inline long disable_reloc_on_exceptions(void) {
+ return plpar_set_mode(0, 3, 0, 0);
+}
+
+static inline long plapr_set_ciabr(unsigned long ciabr)
+{
+ return plpar_set_mode(0, 1, ciabr, 0);
+}
+
+static inline long plapr_set_watchpoint0(unsigned long dawr0, unsigned long dawrx0)
+{
+ return plpar_set_mode(0, 2, dawr0, dawrx0);
+}
+
+#endif /* _PSERIES_PLPAR_WRAPPERS_H */
diff --git a/arch/powerpc/platforms/pseries/cmm.c b/arch/powerpc/platforms/pseries/cmm.c
index c638535..1e561be 100644
--- a/arch/powerpc/platforms/pseries/cmm.c
+++ b/arch/powerpc/platforms/pseries/cmm.c
@@ -40,8 +40,7 @@
#include <asm/pgalloc.h>
#include <asm/uaccess.h>
#include <linux/memory.h>
-
-#include "plpar_wrappers.h"
+#include <asm/plpar_wrappers.h>
#define CMM_DRIVER_VERSION "1.0.0"
#define CMM_DEFAULT_DELAY 1
diff --git a/arch/powerpc/platforms/pseries/dtl.c b/arch/powerpc/platforms/pseries/dtl.c
index 0cc0ac0..f6cb051 100644
--- a/arch/powerpc/platforms/pseries/dtl.c
+++ b/arch/powerpc/platforms/pseries/dtl.c
@@ -29,8 +29,7 @@
#include <asm/firmware.h>
#include <asm/lppaca.h>
#include <asm/debug.h>
-
-#include "plpar_wrappers.h"
+#include <asm/plpar_wrappers.h>
struct dtl {
struct dtl_entry *buf;
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index 217ca5c..a8ef932 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -30,7 +30,8 @@
#include <asm/machdep.h>
#include <asm/vdso_datapage.h>
#include <asm/xics.h>
-#include "plpar_wrappers.h"
+#include <asm/plpar_wrappers.h>
+
#include "offline_states.h"
/* This version can't take the spinlock, because it never returns */
diff --git a/arch/powerpc/platforms/pseries/hvconsole.c b/arch/powerpc/platforms/pseries/hvconsole.c
index b344f94..f3f108b 100644
--- a/arch/powerpc/platforms/pseries/hvconsole.c
+++ b/arch/powerpc/platforms/pseries/hvconsole.c
@@ -28,7 +28,7 @@
#include <linux/errno.h>
#include <asm/hvcall.h>
#include <asm/hvconsole.h>
-#include "plpar_wrappers.h"
+#include <asm/plpar_wrappers.h>
/**
* hvc_get_chars - retrieve characters from firmware for denoted vterm adatper
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
index 23fc1dc..4821933 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -48,8 +48,7 @@
#include <asm/ppc-pci.h>
#include <asm/udbg.h>
#include <asm/mmzone.h>
-
-#include "plpar_wrappers.h"
+#include <asm/plpar_wrappers.h>
static void tce_invalidate_pSeries_sw(struct iommu_table *tbl,
diff --git a/arch/powerpc/platforms/pseries/kexec.c b/arch/powerpc/platforms/pseries/kexec.c
index 7d94bdc..13fa95b3 100644
--- a/arch/powerpc/platforms/pseries/kexec.c
+++ b/arch/powerpc/platforms/pseries/kexec.c
@@ -17,9 +17,9 @@
#include <asm/mpic.h>
#include <asm/xics.h>
#include <asm/smp.h>
+#include <asm/plpar_wrappers.h>
#include "pseries.h"
-#include "plpar_wrappers.h"
static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
{
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
index 8bad880..e1873bc 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -41,8 +41,8 @@
#include <asm/smp.h>
#include <asm/trace.h>
#include <asm/firmware.h>
+#include <asm/plpar_wrappers.h>
-#include "plpar_wrappers.h"
#include "pseries.h"
/* Flag bits for H_BULK_REMOVE */
diff --git a/arch/powerpc/platforms/pseries/plpar_wrappers.h b/arch/powerpc/platforms/pseries/plpar_wrappers.h
deleted file mode 100644
index f35787b..0000000
--- a/arch/powerpc/platforms/pseries/plpar_wrappers.h
+++ /dev/null
@@ -1,324 +0,0 @@
-#ifndef _PSERIES_PLPAR_WRAPPERS_H
-#define _PSERIES_PLPAR_WRAPPERS_H
-
-#include <linux/string.h>
-#include <linux/irqflags.h>
-
-#include <asm/hvcall.h>
-#include <asm/paca.h>
-#include <asm/page.h>
-
-/* Get state of physical CPU from query_cpu_stopped */
-int smp_query_cpu_stopped(unsigned int pcpu);
-#define QCSS_STOPPED 0
-#define QCSS_STOPPING 1
-#define QCSS_NOT_STOPPED 2
-#define QCSS_HARDWARE_ERROR -1
-#define QCSS_HARDWARE_BUSY -2
-
-static inline long poll_pending(void)
-{
- return plpar_hcall_norets(H_POLL_PENDING);
-}
-
-static inline u8 get_cede_latency_hint(void)
-{
- return get_lppaca()->cede_latency_hint;
-}
-
-static inline void set_cede_latency_hint(u8 latency_hint)
-{
- get_lppaca()->cede_latency_hint = latency_hint;
-}
-
-static inline long cede_processor(void)
-{
- return plpar_hcall_norets(H_CEDE);
-}
-
-static inline long extended_cede_processor(unsigned long latency_hint)
-{
- long rc;
- u8 old_latency_hint = get_cede_latency_hint();
-
- set_cede_latency_hint(latency_hint);
-
- rc = cede_processor();
-#ifdef CONFIG_TRACE_IRQFLAGS
- /* Ensure that H_CEDE returns with IRQs on */
- if (WARN_ON(!(mfmsr() & MSR_EE)))
- __hard_irq_enable();
-#endif
-
- set_cede_latency_hint(old_latency_hint);
-
- return rc;
-}
-
-static inline long vpa_call(unsigned long flags, unsigned long cpu,
- unsigned long vpa)
-{
- flags = flags << H_VPA_FUNC_SHIFT;
-
- return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);
-}
-
-static inline long unregister_vpa(unsigned long cpu)
-{
- return vpa_call(H_VPA_DEREG_VPA, cpu, 0);
-}
-
-static inline long register_vpa(unsigned long cpu, unsigned long vpa)
-{
- return vpa_call(H_VPA_REG_VPA, cpu, vpa);
-}
-
-static inline long unregister_slb_shadow(unsigned long cpu)
-{
- return vpa_call(H_VPA_DEREG_SLB, cpu, 0);
-}
-
-static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)
-{
- return vpa_call(H_VPA_REG_SLB, cpu, vpa);
-}
-
-static inline long unregister_dtl(unsigned long cpu)
-{
- return vpa_call(H_VPA_DEREG_DTL, cpu, 0);
-}
-
-static inline long register_dtl(unsigned long cpu, unsigned long vpa)
-{
- return vpa_call(H_VPA_REG_DTL, cpu, vpa);
-}
-
-static inline long plpar_page_set_loaned(unsigned long vpa)
-{
- unsigned long cmo_page_sz = cmo_get_page_size();
- long rc = 0;
- int i;
-
- for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
- rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0);
-
- for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
- plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE,
- vpa + i - cmo_page_sz, 0);
-
- return rc;
-}
-
-static inline long plpar_page_set_active(unsigned long vpa)
-{
- unsigned long cmo_page_sz = cmo_get_page_size();
- long rc = 0;
- int i;
-
- for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
- rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0);
-
- for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
- plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED,
- vpa + i - cmo_page_sz, 0);
-
- return rc;
-}
-
-extern void vpa_init(int cpu);
-
-static inline long plpar_pte_enter(unsigned long flags,
- unsigned long hpte_group, unsigned long hpte_v,
- unsigned long hpte_r, unsigned long *slot)
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
-
- rc = plpar_hcall(H_ENTER, retbuf, flags, hpte_group, hpte_v, hpte_r);
-
- *slot = retbuf[0];
-
- return rc;
-}
-
-static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,
- unsigned long avpn, unsigned long *old_pteh_ret,
- unsigned long *old_ptel_ret)
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
-
- rc = plpar_hcall(H_REMOVE, retbuf, flags, ptex, avpn);
-
- *old_pteh_ret = retbuf[0];
- *old_ptel_ret = retbuf[1];
-
- return rc;
-}
-
-/* plpar_pte_remove_raw can be called in real mode. It calls plpar_hcall_raw */
-static inline long plpar_pte_remove_raw(unsigned long flags, unsigned long ptex,
- unsigned long avpn, unsigned long *old_pteh_ret,
- unsigned long *old_ptel_ret)
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
-
- rc = plpar_hcall_raw(H_REMOVE, retbuf, flags, ptex, avpn);
-
- *old_pteh_ret = retbuf[0];
- *old_ptel_ret = retbuf[1];
-
- return rc;
-}
-
-static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,
- unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
-
- rc = plpar_hcall(H_READ, retbuf, flags, ptex);
-
- *old_pteh_ret = retbuf[0];
- *old_ptel_ret = retbuf[1];
-
- return rc;
-}
-
-/* plpar_pte_read_raw can be called in real mode. It calls plpar_hcall_raw */
-static inline long plpar_pte_read_raw(unsigned long flags, unsigned long ptex,
- unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
-
- rc = plpar_hcall_raw(H_READ, retbuf, flags, ptex);
-
- *old_pteh_ret = retbuf[0];
- *old_ptel_ret = retbuf[1];
-
- return rc;
-}
-
-/*
- * plpar_pte_read_4_raw can be called in real mode.
- * ptes must be 8*sizeof(unsigned long)
- */
-static inline long plpar_pte_read_4_raw(unsigned long flags, unsigned long ptex,
- unsigned long *ptes)
-
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
-
- rc = plpar_hcall9_raw(H_READ, retbuf, flags | H_READ_4, ptex);
-
- memcpy(ptes, retbuf, 8*sizeof(unsigned long));
-
- return rc;
-}
-
-static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,
- unsigned long avpn)
-{
- return plpar_hcall_norets(H_PROTECT, flags, ptex, avpn);
-}
-
-static inline long plpar_tce_get(unsigned long liobn, unsigned long ioba,
- unsigned long *tce_ret)
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
-
- rc = plpar_hcall(H_GET_TCE, retbuf, liobn, ioba);
-
- *tce_ret = retbuf[0];
-
- return rc;
-}
-
-static inline long plpar_tce_put(unsigned long liobn, unsigned long ioba,
- unsigned long tceval)
-{
- return plpar_hcall_norets(H_PUT_TCE, liobn, ioba, tceval);
-}
-
-static inline long plpar_tce_put_indirect(unsigned long liobn,
- unsigned long ioba, unsigned long page, unsigned long count)
-{
- return plpar_hcall_norets(H_PUT_TCE_INDIRECT, liobn, ioba, page, count);
-}
-
-static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,
- unsigned long tceval, unsigned long count)
-{
- return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);
-}
-
-static inline long plpar_get_term_char(unsigned long termno,
- unsigned long *len_ret, char *buf_ret)
-{
- long rc;
- unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
- unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */
-
- rc = plpar_hcall(H_GET_TERM_CHAR, retbuf, termno);
-
- *len_ret = retbuf[0];
- lbuf[0] = retbuf[1];
- lbuf[1] = retbuf[2];
-
- return rc;
-}
-
-static inline long plpar_put_term_char(unsigned long termno, unsigned long len,
- const char *buffer)
-{
- unsigned long *lbuf = (unsigned long *)buffer; /* TODO: alignment? */
- return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],
- lbuf[1]);
-}
-
-/* Set various resource mode parameters */
-static inline long plpar_set_mode(unsigned long mflags, unsigned long resource,
- unsigned long value1, unsigned long value2)
-{
- return plpar_hcall_norets(H_SET_MODE, mflags, resource, value1, value2);
-}
-
-/*
- * Enable relocation on exceptions on this partition
- *
- * Note: this call has a partition wide scope and can take a while to complete.
- * If it returns H_LONG_BUSY_* it should be retried periodically until it
- * returns H_SUCCESS.
- */
-static inline long enable_reloc_on_exceptions(void)
-{
- /* mflags = 3: Exceptions at 0xC000000000004000 */
- return plpar_set_mode(3, 3, 0, 0);
-}
-
-/*
- * Disable relocation on exceptions on this partition
- *
- * Note: this call has a partition wide scope and can take a while to complete.
- * If it returns H_LONG_BUSY_* it should be retried periodically until it
- * returns H_SUCCESS.
- */
-static inline long disable_reloc_on_exceptions(void) {
- return plpar_set_mode(0, 3, 0, 0);
-}
-
-static inline long plapr_set_ciabr(unsigned long ciabr)
-{
- return plpar_set_mode(0, 1, ciabr, 0);
-}
-
-static inline long plapr_set_watchpoint0(unsigned long dawr0, unsigned long dawrx0)
-{
- return plpar_set_mode(0, 2, dawr0, dawrx0);
-}
-
-#endif /* _PSERIES_PLPAR_WRAPPERS_H */
diff --git a/arch/powerpc/platforms/pseries/processor_idle.c b/arch/powerpc/platforms/pseries/processor_idle.c
index 64da5cc..0d75a54 100644
--- a/arch/powerpc/platforms/pseries/processor_idle.c
+++ b/arch/powerpc/platforms/pseries/processor_idle.c
@@ -18,8 +18,7 @@
#include <asm/machdep.h>
#include <asm/firmware.h>
#include <asm/runlatch.h>
-
-#include "plpar_wrappers.h"
+#include <asm/plpar_wrappers.h>
/* Snooze Delay, pseries_idle */
DECLARE_PER_CPU(long, smt_snooze_delay);
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index c11c823..4291589 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -66,8 +66,8 @@
#include <asm/firmware.h>
#include <asm/eeh.h>
#include <asm/reg.h>
+#include <asm/plpar_wrappers.h>
-#include "plpar_wrappers.h"
#include "pseries.h"
int CMO_PrPSP = -1;
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c
index 306643c..1c79af7 100644
--- a/arch/powerpc/platforms/pseries/smp.c
+++ b/arch/powerpc/platforms/pseries/smp.c
@@ -43,8 +43,8 @@
#include <asm/cputhreads.h>
#include <asm/xics.h>
#include <asm/dbell.h>
+#include <asm/plpar_wrappers.h>
-#include "plpar_wrappers.h"
#include "pseries.h"
#include "offline_states.h"
^ permalink raw reply related
* [PATCH V2 4/6] cpuidle/pseries: Move the pseries_idle backend driver to sysdev.
From: Deepthi Dharwar @ 2013-07-31 2:59 UTC (permalink / raw)
To: benh, daniel.lezcano, linux-kernel, michael, srivatsa.bhat,
preeti, svaidy, linuxppc-dev
Cc: rjw, dongsheng.wang, linux-pm
In-Reply-To: <20130731025840.19448.24468.stgit@deepthi>
Move pseries_idle backend driver code to arch/powerpc/sysdev
so that the code can be used for a common driver for powernv
and pseries. This removes a lot of code duplicacy.
Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
---
arch/powerpc/platforms/pseries/Kconfig | 9 -
arch/powerpc/platforms/pseries/Makefile | 1
arch/powerpc/platforms/pseries/processor_idle.c | 384 -----------------------
arch/powerpc/sysdev/Kconfig | 9 +
arch/powerpc/sysdev/Makefile | 1
arch/powerpc/sysdev/processor_idle.c | 384 +++++++++++++++++++++++
6 files changed, 394 insertions(+), 394 deletions(-)
delete mode 100644 arch/powerpc/platforms/pseries/processor_idle.c
create mode 100644 arch/powerpc/sysdev/processor_idle.c
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig
index 62b4f80..bb59bb0 100644
--- a/arch/powerpc/platforms/pseries/Kconfig
+++ b/arch/powerpc/platforms/pseries/Kconfig
@@ -119,12 +119,3 @@ config DTL
which are accessible through a debugfs file.
Say N if you are unsure.
-
-config PSERIES_IDLE
- bool "Cpuidle driver for pSeries platforms"
- depends on CPU_IDLE
- depends on PPC_PSERIES
- default y
- help
- Select this option to enable processor idle state management
- through cpuidle subsystem.
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile
index 8ae0103..4b22379 100644
--- a/arch/powerpc/platforms/pseries/Makefile
+++ b/arch/powerpc/platforms/pseries/Makefile
@@ -21,7 +21,6 @@ obj-$(CONFIG_HCALL_STATS) += hvCall_inst.o
obj-$(CONFIG_CMM) += cmm.o
obj-$(CONFIG_DTL) += dtl.o
obj-$(CONFIG_IO_EVENT_IRQ) += io_event_irq.o
-obj-$(CONFIG_PSERIES_IDLE) += processor_idle.o
ifeq ($(CONFIG_PPC_PSERIES),y)
obj-$(CONFIG_SUSPEND) += suspend.o
diff --git a/arch/powerpc/platforms/pseries/processor_idle.c b/arch/powerpc/platforms/pseries/processor_idle.c
deleted file mode 100644
index 0d75a54..0000000
--- a/arch/powerpc/platforms/pseries/processor_idle.c
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * processor_idle - idle state cpuidle driver.
- * Adapted from drivers/idle/intel_idle.c and
- * drivers/acpi/processor_idle.c
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/moduleparam.h>
-#include <linux/cpuidle.h>
-#include <linux/cpu.h>
-#include <linux/notifier.h>
-
-#include <asm/paca.h>
-#include <asm/reg.h>
-#include <asm/machdep.h>
-#include <asm/firmware.h>
-#include <asm/runlatch.h>
-#include <asm/plpar_wrappers.h>
-
-/* Snooze Delay, pseries_idle */
-DECLARE_PER_CPU(long, smt_snooze_delay);
-
-struct cpuidle_driver pseries_idle_driver = {
- .name = "pseries_idle",
- .owner = THIS_MODULE,
-};
-
-#define MAX_IDLE_STATE_COUNT 2
-
-static int max_idle_state = MAX_IDLE_STATE_COUNT - 1;
-static struct cpuidle_device __percpu *pseries_cpuidle_devices;
-static struct cpuidle_state *cpuidle_state_table;
-
-static inline void idle_loop_prolog(unsigned long *in_purr)
-{
- *in_purr = mfspr(SPRN_PURR);
- /*
- * Indicate to the HV that we are idle. Now would be
- * a good time to find other work to dispatch.
- */
- get_lppaca()->idle = 1;
-}
-
-static inline void idle_loop_epilog(unsigned long in_purr)
-{
- get_lppaca()->wait_state_cycles += mfspr(SPRN_PURR) - in_purr;
- get_lppaca()->idle = 0;
-}
-
-static int snooze_loop(struct cpuidle_device *dev,
- struct cpuidle_driver *drv,
- int index)
-{
- unsigned long in_purr;
- int cpu = dev->cpu;
-
- idle_loop_prolog(&in_purr);
- local_irq_enable();
- set_thread_flag(TIF_POLLING_NRFLAG);
-
- while ((!need_resched()) && cpu_online(cpu)) {
- ppc64_runlatch_off();
- HMT_low();
- HMT_very_low();
- }
-
- HMT_medium();
- clear_thread_flag(TIF_POLLING_NRFLAG);
- smp_mb();
-
- idle_loop_epilog(in_purr);
-
- return index;
-}
-
-static void check_and_cede_processor(void)
-{
- /*
- * Ensure our interrupt state is properly tracked,
- * also checks if no interrupt has occurred while we
- * were soft-disabled
- */
- if (prep_irq_for_idle()) {
- cede_processor();
-#ifdef CONFIG_TRACE_IRQFLAGS
- /* Ensure that H_CEDE returns with IRQs on */
- if (WARN_ON(!(mfmsr() & MSR_EE)))
- __hard_irq_enable();
-#endif
- }
-}
-
-static int dedicated_cede_loop(struct cpuidle_device *dev,
- struct cpuidle_driver *drv,
- int index)
-{
- unsigned long in_purr;
-
- idle_loop_prolog(&in_purr);
- get_lppaca()->donate_dedicated_cpu = 1;
-
- ppc64_runlatch_off();
- HMT_medium();
- check_and_cede_processor();
-
- get_lppaca()->donate_dedicated_cpu = 0;
-
- idle_loop_epilog(in_purr);
-
- return index;
-}
-
-static int shared_cede_loop(struct cpuidle_device *dev,
- struct cpuidle_driver *drv,
- int index)
-{
- unsigned long in_purr;
-
- idle_loop_prolog(&in_purr);
-
- /*
- * Yield the processor to the hypervisor. We return if
- * an external interrupt occurs (which are driven prior
- * to returning here) or if a prod occurs from another
- * processor. When returning here, external interrupts
- * are enabled.
- */
- check_and_cede_processor();
-
- idle_loop_epilog(in_purr);
-
- return index;
-}
-
-/*
- * States for dedicated partition case.
- */
-static struct cpuidle_state dedicated_states[MAX_IDLE_STATE_COUNT] = {
- { /* Snooze */
- .name = "snooze",
- .desc = "snooze",
- .flags = CPUIDLE_FLAG_TIME_VALID,
- .exit_latency = 0,
- .target_residency = 0,
- .enter = &snooze_loop },
- { /* CEDE */
- .name = "CEDE",
- .desc = "CEDE",
- .flags = CPUIDLE_FLAG_TIME_VALID,
- .exit_latency = 10,
- .target_residency = 100,
- .enter = &dedicated_cede_loop },
-};
-
-/*
- * States for shared partition case.
- */
-static struct cpuidle_state shared_states[MAX_IDLE_STATE_COUNT] = {
- { /* Shared Cede */
- .name = "Shared Cede",
- .desc = "Shared Cede",
- .flags = CPUIDLE_FLAG_TIME_VALID,
- .exit_latency = 0,
- .target_residency = 0,
- .enter = &shared_cede_loop },
-};
-
-void update_smt_snooze_delay(int cpu, int residency)
-{
- struct cpuidle_driver *drv = cpuidle_get_driver();
- struct cpuidle_device *dev;
-
- if (cpuidle_state_table != dedicated_states)
- return;
-
- if (!drv)
- return;
-
- if (cpu == -1) {
- if (residency < 0) {
- /* Disable NAP on all cpus */
- drv->states[1].disabled = true;
- return;
- } else {
- drv->states[1].target_residency = residency;
- drv->states[1].disabled = false;
- return;
- }
- }
-
- dev = per_cpu(cpuidle_devices, cpu);
- if (!dev)
- return;
-
- if (residency < 0)
- dev->states_usage[1].disable = 1;
- else {
- drv->states[1].target_residency = residency;
- drv->states[1].disabled = false;
- dev->states_usage[1].disable = 0;
- }
-}
-
-static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
- unsigned long action, void *hcpu)
-{
- int hotcpu = (unsigned long)hcpu;
- struct cpuidle_device *dev =
- per_cpu_ptr(pseries_cpuidle_devices, hotcpu);
-
- if (dev && cpuidle_get_driver()) {
- switch (action) {
- case CPU_ONLINE:
- case CPU_ONLINE_FROZEN:
- cpuidle_pause_and_lock();
- cpuidle_enable_device(dev);
- cpuidle_resume_and_unlock();
- break;
-
- case CPU_DEAD:
- case CPU_DEAD_FROZEN:
- cpuidle_pause_and_lock();
- cpuidle_disable_device(dev);
- cpuidle_resume_and_unlock();
- break;
-
- default:
- return NOTIFY_DONE;
- }
- }
- return NOTIFY_OK;
-}
-
-static struct notifier_block setup_hotplug_notifier = {
- .notifier_call = pseries_cpuidle_add_cpu_notifier,
-};
-
-/*
- * pseries_cpuidle_driver_init()
- */
-static int pseries_cpuidle_driver_init(void)
-{
- int idle_state;
- struct cpuidle_driver *drv = &pseries_idle_driver;
-
- drv->state_count = 0;
-
- for (idle_state = 0; idle_state < MAX_IDLE_STATE_COUNT; ++idle_state) {
-
- if (idle_state > max_idle_state)
- break;
-
- /* is the state not enabled? */
- if (cpuidle_state_table[idle_state].enter == NULL)
- continue;
-
- drv->states[drv->state_count] = /* structure copy */
- cpuidle_state_table[idle_state];
-
- drv->state_count += 1;
- }
-
- return 0;
-}
-
-/* pseries_idle_devices_uninit(void)
- * unregister cpuidle devices and de-allocate memory
- */
-static void pseries_idle_devices_uninit(void)
-{
- int i;
- struct cpuidle_device *dev;
-
- for_each_possible_cpu(i) {
- dev = per_cpu_ptr(pseries_cpuidle_devices, i);
- cpuidle_unregister_device(dev);
- }
-
- free_percpu(pseries_cpuidle_devices);
- return;
-}
-
-/* pseries_idle_devices_init()
- * allocate, initialize and register cpuidle device
- */
-static int pseries_idle_devices_init(void)
-{
- int i;
- struct cpuidle_driver *drv = &pseries_idle_driver;
- struct cpuidle_device *dev;
-
- pseries_cpuidle_devices = alloc_percpu(struct cpuidle_device);
- if (pseries_cpuidle_devices == NULL)
- return -ENOMEM;
-
- for_each_possible_cpu(i) {
- dev = per_cpu_ptr(pseries_cpuidle_devices, i);
- dev->state_count = drv->state_count;
- dev->cpu = i;
- if (cpuidle_register_device(dev)) {
- printk(KERN_DEBUG \
- "cpuidle_register_device %d failed!\n", i);
- return -EIO;
- }
- }
-
- return 0;
-}
-
-/*
- * pseries_idle_probe()
- * Choose state table for shared versus dedicated partition
- */
-static int pseries_idle_probe(void)
-{
-
- if (!firmware_has_feature(FW_FEATURE_SPLPAR))
- return -ENODEV;
-
- if (cpuidle_disable != IDLE_NO_OVERRIDE)
- return -ENODEV;
-
- if (max_idle_state == 0) {
- printk(KERN_DEBUG "pseries processor idle disabled.\n");
- return -EPERM;
- }
-
- if (get_lppaca()->shared_proc)
- cpuidle_state_table = shared_states;
- else
- cpuidle_state_table = dedicated_states;
-
- return 0;
-}
-
-static int __init pseries_processor_idle_init(void)
-{
- int retval;
-
- retval = pseries_idle_probe();
- if (retval)
- return retval;
-
- pseries_cpuidle_driver_init();
- retval = cpuidle_register_driver(&pseries_idle_driver);
- if (retval) {
- printk(KERN_DEBUG "Registration of pseries driver failed.\n");
- return retval;
- }
-
- update_smt_snooze_delay(-1, per_cpu(smt_snooze_delay, 0));
-
- retval = pseries_idle_devices_init();
- if (retval) {
- pseries_idle_devices_uninit();
- cpuidle_unregister_driver(&pseries_idle_driver);
- return retval;
- }
-
- register_cpu_notifier(&setup_hotplug_notifier);
- printk(KERN_DEBUG "pseries_idle_driver registered\n");
-
- return 0;
-}
-
-static void __exit pseries_processor_idle_exit(void)
-{
-
- unregister_cpu_notifier(&setup_hotplug_notifier);
- pseries_idle_devices_uninit();
- cpuidle_unregister_driver(&pseries_idle_driver);
-
- return;
-}
-
-module_init(pseries_processor_idle_init);
-module_exit(pseries_processor_idle_exit);
-
-MODULE_AUTHOR("Deepthi Dharwar <deepthi@linux.vnet.ibm.com>");
-MODULE_DESCRIPTION("Cpuidle driver for POWER");
-MODULE_LICENSE("GPL");
diff --git a/arch/powerpc/sysdev/Kconfig b/arch/powerpc/sysdev/Kconfig
index ab4cb54..8564a3f 100644
--- a/arch/powerpc/sysdev/Kconfig
+++ b/arch/powerpc/sysdev/Kconfig
@@ -34,3 +34,12 @@ config SCOM_DEBUGFS
config GE_FPGA
bool
default n
+
+config PSERIES_IDLE
+ bool "Cpuidle driver for pSeries platforms"
+ depends on CPU_IDLE
+ depends on PPC_PSERIES
+ default y
+ help
+ Select this option to enable processor idle state management
+ for pSeries through cpuidle subsystem.
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile
index f67ac90..93d2cdd 100644
--- a/arch/powerpc/sysdev/Makefile
+++ b/arch/powerpc/sysdev/Makefile
@@ -49,6 +49,7 @@ endif
obj-$(CONFIG_PPC4xx_MSI) += ppc4xx_msi.o
obj-$(CONFIG_PPC4xx_CPM) += ppc4xx_cpm.o
obj-$(CONFIG_PPC4xx_GPIO) += ppc4xx_gpio.o
+obj-$(CONFIG_PSERIES_IDLE) += processor_idle.o
obj-$(CONFIG_CPM) += cpm_common.o
obj-$(CONFIG_CPM2) += cpm2.o cpm2_pic.o
diff --git a/arch/powerpc/sysdev/processor_idle.c b/arch/powerpc/sysdev/processor_idle.c
new file mode 100644
index 0000000..0d75a54
--- /dev/null
+++ b/arch/powerpc/sysdev/processor_idle.c
@@ -0,0 +1,384 @@
+/*
+ * processor_idle - idle state cpuidle driver.
+ * Adapted from drivers/idle/intel_idle.c and
+ * drivers/acpi/processor_idle.c
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/moduleparam.h>
+#include <linux/cpuidle.h>
+#include <linux/cpu.h>
+#include <linux/notifier.h>
+
+#include <asm/paca.h>
+#include <asm/reg.h>
+#include <asm/machdep.h>
+#include <asm/firmware.h>
+#include <asm/runlatch.h>
+#include <asm/plpar_wrappers.h>
+
+/* Snooze Delay, pseries_idle */
+DECLARE_PER_CPU(long, smt_snooze_delay);
+
+struct cpuidle_driver pseries_idle_driver = {
+ .name = "pseries_idle",
+ .owner = THIS_MODULE,
+};
+
+#define MAX_IDLE_STATE_COUNT 2
+
+static int max_idle_state = MAX_IDLE_STATE_COUNT - 1;
+static struct cpuidle_device __percpu *pseries_cpuidle_devices;
+static struct cpuidle_state *cpuidle_state_table;
+
+static inline void idle_loop_prolog(unsigned long *in_purr)
+{
+ *in_purr = mfspr(SPRN_PURR);
+ /*
+ * Indicate to the HV that we are idle. Now would be
+ * a good time to find other work to dispatch.
+ */
+ get_lppaca()->idle = 1;
+}
+
+static inline void idle_loop_epilog(unsigned long in_purr)
+{
+ get_lppaca()->wait_state_cycles += mfspr(SPRN_PURR) - in_purr;
+ get_lppaca()->idle = 0;
+}
+
+static int snooze_loop(struct cpuidle_device *dev,
+ struct cpuidle_driver *drv,
+ int index)
+{
+ unsigned long in_purr;
+ int cpu = dev->cpu;
+
+ idle_loop_prolog(&in_purr);
+ local_irq_enable();
+ set_thread_flag(TIF_POLLING_NRFLAG);
+
+ while ((!need_resched()) && cpu_online(cpu)) {
+ ppc64_runlatch_off();
+ HMT_low();
+ HMT_very_low();
+ }
+
+ HMT_medium();
+ clear_thread_flag(TIF_POLLING_NRFLAG);
+ smp_mb();
+
+ idle_loop_epilog(in_purr);
+
+ return index;
+}
+
+static void check_and_cede_processor(void)
+{
+ /*
+ * Ensure our interrupt state is properly tracked,
+ * also checks if no interrupt has occurred while we
+ * were soft-disabled
+ */
+ if (prep_irq_for_idle()) {
+ cede_processor();
+#ifdef CONFIG_TRACE_IRQFLAGS
+ /* Ensure that H_CEDE returns with IRQs on */
+ if (WARN_ON(!(mfmsr() & MSR_EE)))
+ __hard_irq_enable();
+#endif
+ }
+}
+
+static int dedicated_cede_loop(struct cpuidle_device *dev,
+ struct cpuidle_driver *drv,
+ int index)
+{
+ unsigned long in_purr;
+
+ idle_loop_prolog(&in_purr);
+ get_lppaca()->donate_dedicated_cpu = 1;
+
+ ppc64_runlatch_off();
+ HMT_medium();
+ check_and_cede_processor();
+
+ get_lppaca()->donate_dedicated_cpu = 0;
+
+ idle_loop_epilog(in_purr);
+
+ return index;
+}
+
+static int shared_cede_loop(struct cpuidle_device *dev,
+ struct cpuidle_driver *drv,
+ int index)
+{
+ unsigned long in_purr;
+
+ idle_loop_prolog(&in_purr);
+
+ /*
+ * Yield the processor to the hypervisor. We return if
+ * an external interrupt occurs (which are driven prior
+ * to returning here) or if a prod occurs from another
+ * processor. When returning here, external interrupts
+ * are enabled.
+ */
+ check_and_cede_processor();
+
+ idle_loop_epilog(in_purr);
+
+ return index;
+}
+
+/*
+ * States for dedicated partition case.
+ */
+static struct cpuidle_state dedicated_states[MAX_IDLE_STATE_COUNT] = {
+ { /* Snooze */
+ .name = "snooze",
+ .desc = "snooze",
+ .flags = CPUIDLE_FLAG_TIME_VALID,
+ .exit_latency = 0,
+ .target_residency = 0,
+ .enter = &snooze_loop },
+ { /* CEDE */
+ .name = "CEDE",
+ .desc = "CEDE",
+ .flags = CPUIDLE_FLAG_TIME_VALID,
+ .exit_latency = 10,
+ .target_residency = 100,
+ .enter = &dedicated_cede_loop },
+};
+
+/*
+ * States for shared partition case.
+ */
+static struct cpuidle_state shared_states[MAX_IDLE_STATE_COUNT] = {
+ { /* Shared Cede */
+ .name = "Shared Cede",
+ .desc = "Shared Cede",
+ .flags = CPUIDLE_FLAG_TIME_VALID,
+ .exit_latency = 0,
+ .target_residency = 0,
+ .enter = &shared_cede_loop },
+};
+
+void update_smt_snooze_delay(int cpu, int residency)
+{
+ struct cpuidle_driver *drv = cpuidle_get_driver();
+ struct cpuidle_device *dev;
+
+ if (cpuidle_state_table != dedicated_states)
+ return;
+
+ if (!drv)
+ return;
+
+ if (cpu == -1) {
+ if (residency < 0) {
+ /* Disable NAP on all cpus */
+ drv->states[1].disabled = true;
+ return;
+ } else {
+ drv->states[1].target_residency = residency;
+ drv->states[1].disabled = false;
+ return;
+ }
+ }
+
+ dev = per_cpu(cpuidle_devices, cpu);
+ if (!dev)
+ return;
+
+ if (residency < 0)
+ dev->states_usage[1].disable = 1;
+ else {
+ drv->states[1].target_residency = residency;
+ drv->states[1].disabled = false;
+ dev->states_usage[1].disable = 0;
+ }
+}
+
+static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
+ unsigned long action, void *hcpu)
+{
+ int hotcpu = (unsigned long)hcpu;
+ struct cpuidle_device *dev =
+ per_cpu_ptr(pseries_cpuidle_devices, hotcpu);
+
+ if (dev && cpuidle_get_driver()) {
+ switch (action) {
+ case CPU_ONLINE:
+ case CPU_ONLINE_FROZEN:
+ cpuidle_pause_and_lock();
+ cpuidle_enable_device(dev);
+ cpuidle_resume_and_unlock();
+ break;
+
+ case CPU_DEAD:
+ case CPU_DEAD_FROZEN:
+ cpuidle_pause_and_lock();
+ cpuidle_disable_device(dev);
+ cpuidle_resume_and_unlock();
+ break;
+
+ default:
+ return NOTIFY_DONE;
+ }
+ }
+ return NOTIFY_OK;
+}
+
+static struct notifier_block setup_hotplug_notifier = {
+ .notifier_call = pseries_cpuidle_add_cpu_notifier,
+};
+
+/*
+ * pseries_cpuidle_driver_init()
+ */
+static int pseries_cpuidle_driver_init(void)
+{
+ int idle_state;
+ struct cpuidle_driver *drv = &pseries_idle_driver;
+
+ drv->state_count = 0;
+
+ for (idle_state = 0; idle_state < MAX_IDLE_STATE_COUNT; ++idle_state) {
+
+ if (idle_state > max_idle_state)
+ break;
+
+ /* is the state not enabled? */
+ if (cpuidle_state_table[idle_state].enter == NULL)
+ continue;
+
+ drv->states[drv->state_count] = /* structure copy */
+ cpuidle_state_table[idle_state];
+
+ drv->state_count += 1;
+ }
+
+ return 0;
+}
+
+/* pseries_idle_devices_uninit(void)
+ * unregister cpuidle devices and de-allocate memory
+ */
+static void pseries_idle_devices_uninit(void)
+{
+ int i;
+ struct cpuidle_device *dev;
+
+ for_each_possible_cpu(i) {
+ dev = per_cpu_ptr(pseries_cpuidle_devices, i);
+ cpuidle_unregister_device(dev);
+ }
+
+ free_percpu(pseries_cpuidle_devices);
+ return;
+}
+
+/* pseries_idle_devices_init()
+ * allocate, initialize and register cpuidle device
+ */
+static int pseries_idle_devices_init(void)
+{
+ int i;
+ struct cpuidle_driver *drv = &pseries_idle_driver;
+ struct cpuidle_device *dev;
+
+ pseries_cpuidle_devices = alloc_percpu(struct cpuidle_device);
+ if (pseries_cpuidle_devices == NULL)
+ return -ENOMEM;
+
+ for_each_possible_cpu(i) {
+ dev = per_cpu_ptr(pseries_cpuidle_devices, i);
+ dev->state_count = drv->state_count;
+ dev->cpu = i;
+ if (cpuidle_register_device(dev)) {
+ printk(KERN_DEBUG \
+ "cpuidle_register_device %d failed!\n", i);
+ return -EIO;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * pseries_idle_probe()
+ * Choose state table for shared versus dedicated partition
+ */
+static int pseries_idle_probe(void)
+{
+
+ if (!firmware_has_feature(FW_FEATURE_SPLPAR))
+ return -ENODEV;
+
+ if (cpuidle_disable != IDLE_NO_OVERRIDE)
+ return -ENODEV;
+
+ if (max_idle_state == 0) {
+ printk(KERN_DEBUG "pseries processor idle disabled.\n");
+ return -EPERM;
+ }
+
+ if (get_lppaca()->shared_proc)
+ cpuidle_state_table = shared_states;
+ else
+ cpuidle_state_table = dedicated_states;
+
+ return 0;
+}
+
+static int __init pseries_processor_idle_init(void)
+{
+ int retval;
+
+ retval = pseries_idle_probe();
+ if (retval)
+ return retval;
+
+ pseries_cpuidle_driver_init();
+ retval = cpuidle_register_driver(&pseries_idle_driver);
+ if (retval) {
+ printk(KERN_DEBUG "Registration of pseries driver failed.\n");
+ return retval;
+ }
+
+ update_smt_snooze_delay(-1, per_cpu(smt_snooze_delay, 0));
+
+ retval = pseries_idle_devices_init();
+ if (retval) {
+ pseries_idle_devices_uninit();
+ cpuidle_unregister_driver(&pseries_idle_driver);
+ return retval;
+ }
+
+ register_cpu_notifier(&setup_hotplug_notifier);
+ printk(KERN_DEBUG "pseries_idle_driver registered\n");
+
+ return 0;
+}
+
+static void __exit pseries_processor_idle_exit(void)
+{
+
+ unregister_cpu_notifier(&setup_hotplug_notifier);
+ pseries_idle_devices_uninit();
+ cpuidle_unregister_driver(&pseries_idle_driver);
+
+ return;
+}
+
+module_init(pseries_processor_idle_init);
+module_exit(pseries_processor_idle_exit);
+
+MODULE_AUTHOR("Deepthi Dharwar <deepthi@linux.vnet.ibm.com>");
+MODULE_DESCRIPTION("Cpuidle driver for POWER");
+MODULE_LICENSE("GPL");
^ permalink raw reply related
* [PATCH V2 0/6] cpuidle/powerpc: POWERPC cpuidle driver for POWER and POWERNV platforms
From: Deepthi Dharwar @ 2013-07-31 2:58 UTC (permalink / raw)
To: benh, daniel.lezcano, linux-kernel, michael, srivatsa.bhat,
preeti, svaidy, linuxppc-dev
Cc: rjw, dongsheng.wang, linux-pm
Following patch series consolidates backend cpuidle driver
for pseries and powernv platforms.
Current existing backend driver for pseries has been moved to
arch/powerpc/sysdev and has been extended to accommodate
powernv idle power mgmt states.
As seen in V1 of this patch series, too much code duplication persists
having separate back-end driver for individual platforms.
Moving the idle states over to cpuidle framework can take advantage
of advanced heuristics, tunables and features provided by cpuidle
framework. Additional idle states can be exploited using the cpuidle
framework. The statistics and tracing infrastructure provided by
the cpuidle framework also helps in enabling power management
related tools and help tune the system and applications.
This series aims to maintain compatibility and functionality to
existing pseries and powernv idle cpu management code.
There are no new functions or idle states added as part of this series.
This can be extended by adding more states to this existing framework.
With this patch series the powernv cpuidle functionalities
are on-par with pSeries idle management. Other POWERPC
platforms can use this to exploit CPUIDLE framework.
This patch mainly focus on an integrated CPUIDLE backend
driver for POWERPC. Minor cpuidle clean-ups will be
taken up going further.
One need to enable POWERPC_IDLE config option to exploit these
backend drivers.
V1 -> http://lkml.org/lkml/2013/7/23/143
Deepthi Dharwar (6):
cpuidle/pseries: Fix kernel command line parameter smt-snooze-delay
cpuidle/pseries: Remove dependency of pseries.h file
pseries: Move plpar_wrapper.h to powerpc common include/asm location.
cpuidle/pseries: Move the pseries_idle backend driver to sysdev.
cpuidle/powerpc: Backend-powerpc idle driver for powernv and pseries.
cpuidle/powernv: Enable idle powernv cpu to call into the cpuidle framework.
arch/powerpc/include/asm/plpar_wrappers.h | 324 ++++++++++++++++++
arch/powerpc/include/asm/processor.h | 2
arch/powerpc/platforms/powernv/setup.c | 12 +
arch/powerpc/platforms/pseries/Kconfig | 9
arch/powerpc/platforms/pseries/Makefile | 1
arch/powerpc/platforms/pseries/cmm.c | 3
arch/powerpc/platforms/pseries/dtl.c | 3
arch/powerpc/platforms/pseries/hotplug-cpu.c | 3
arch/powerpc/platforms/pseries/hvconsole.c | 2
arch/powerpc/platforms/pseries/iommu.c | 3
arch/powerpc/platforms/pseries/kexec.c | 2
arch/powerpc/platforms/pseries/lpar.c | 2
arch/powerpc/platforms/pseries/plpar_wrappers.h | 324 ------------------
arch/powerpc/platforms/pseries/processor_idle.c | 362 --------------------
arch/powerpc/platforms/pseries/pseries.h | 3
arch/powerpc/platforms/pseries/setup.c | 2
arch/powerpc/platforms/pseries/smp.c | 2
arch/powerpc/sysdev/Kconfig | 9
arch/powerpc/sysdev/Makefile | 1
arch/powerpc/sysdev/processor_idle.c | 424 +++++++++++++++++++++++
20 files changed, 780 insertions(+), 713 deletions(-)
create mode 100644 arch/powerpc/include/asm/plpar_wrappers.h
delete mode 100644 arch/powerpc/platforms/pseries/plpar_wrappers.h
delete mode 100644 arch/powerpc/platforms/pseries/processor_idle.c
create mode 100644 arch/powerpc/sysdev/processor_idle.c
-- Deepthi
^ permalink raw reply
* [PATCH V2 2/6] cpuidle/pseries: Remove dependency of pseries.h file
From: Deepthi Dharwar @ 2013-07-31 2:59 UTC (permalink / raw)
To: benh, daniel.lezcano, linux-kernel, michael, srivatsa.bhat,
preeti, svaidy, linuxppc-dev
Cc: rjw, dongsheng.wang, linux-pm
In-Reply-To: <20130731025840.19448.24468.stgit@deepthi>
As a part of pseries_idle cleanup to make the backend driver
code common to both pseries and powernv, this patch
is essential to remove the dependency of pseries.h
header file.
Move the declaration of smt_snooze_delay from pseries.h
to processor_idle.c. smt_snooze_delay variable is
needed for both pseries and powernv.
/* Snooze Delay, pseries_idle */
DECLARE_PER_CPU(long, smt_snooze_delay);
Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
---
arch/powerpc/platforms/pseries/processor_idle.c | 4 +++-
arch/powerpc/platforms/pseries/pseries.h | 3 ---
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/processor_idle.c b/arch/powerpc/platforms/pseries/processor_idle.c
index d6a1caa..64da5cc 100644
--- a/arch/powerpc/platforms/pseries/processor_idle.c
+++ b/arch/powerpc/platforms/pseries/processor_idle.c
@@ -20,7 +20,9 @@
#include <asm/runlatch.h>
#include "plpar_wrappers.h"
-#include "pseries.h"
+
+/* Snooze Delay, pseries_idle */
+DECLARE_PER_CPU(long, smt_snooze_delay);
struct cpuidle_driver pseries_idle_driver = {
.name = "pseries_idle",
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index c2a3a25..d1b07e6 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -60,9 +60,6 @@ extern struct device_node *dlpar_configure_connector(u32);
extern int dlpar_attach_node(struct device_node *);
extern int dlpar_detach_node(struct device_node *);
-/* Snooze Delay, pseries_idle */
-DECLARE_PER_CPU(long, smt_snooze_delay);
-
/* PCI root bridge prepare function override for pseries */
struct pci_host_bridge;
int pseries_root_bridge_prepare(struct pci_host_bridge *bridge);
^ permalink raw reply related
* [PATCH V2 1/6] cpuidle/pseries: Fix kernel command line parameter smt-snooze-delay
From: Deepthi Dharwar @ 2013-07-31 2:58 UTC (permalink / raw)
To: benh, daniel.lezcano, linux-kernel, michael, srivatsa.bhat,
preeti, svaidy, linuxppc-dev
Cc: rjw, dongsheng.wang, linux-pm
In-Reply-To: <20130731025840.19448.24468.stgit@deepthi>
smt-snooze-delay is tunable provided currently on powerpc to delay the
entry of an idle cpu to NAP state. By default, the value is 100us,
which is entry criteria for NAP state i.e only if the idle period is
above 100us it would enter NAP. Value of -1 disables entry into NAP.
This value can be set either through sysfs, ppc64_cpu util or by
passing it via kernel command line. Currently this feature is broken
when the value is passed via the kernel command line.
This patch aims to fix this, by taking the appropritate action
based on the value after the pseries driver is registered.
This check is carried on in the backend driver rather in
setup_smt_snooze_delay() as one is not sure if the cpuidle driver
is even registered when setup routine is executed.
Also, this fixes re-enabling of NAP states by setting appropriate
value without having to reboot.
Also, to note is, smt-snooze-delay is per-cpu variable.
This can be used to enable/disable NAP on per-cpu
basis using sysfs but when this variable is passed
via kernel command line or using the smt-snooze-delay
it applies to all the cpus. Per-cpu tuning can
only be done via sysfs.
Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com>
---
arch/powerpc/platforms/pseries/processor_idle.c | 35 ++++++++++++++++++-----
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/processor_idle.c b/arch/powerpc/platforms/pseries/processor_idle.c
index 4644efa0..d6a1caa 100644
--- a/arch/powerpc/platforms/pseries/processor_idle.c
+++ b/arch/powerpc/platforms/pseries/processor_idle.c
@@ -170,18 +170,37 @@ static struct cpuidle_state shared_states[MAX_IDLE_STATE_COUNT] = {
void update_smt_snooze_delay(int cpu, int residency)
{
struct cpuidle_driver *drv = cpuidle_get_driver();
- struct cpuidle_device *dev = per_cpu(cpuidle_devices, cpu);
+ struct cpuidle_device *dev;
if (cpuidle_state_table != dedicated_states)
return;
- if (residency < 0) {
- /* Disable the Nap state on that cpu */
- if (dev)
- dev->states_usage[1].disable = 1;
- } else
- if (drv)
+ if (!drv)
+ return;
+
+ if (cpu == -1) {
+ if (residency < 0) {
+ /* Disable NAP on all cpus */
+ drv->states[1].disabled = true;
+ return;
+ } else {
drv->states[1].target_residency = residency;
+ drv->states[1].disabled = false;
+ return;
+ }
+ }
+
+ dev = per_cpu(cpuidle_devices, cpu);
+ if (!dev)
+ return;
+
+ if (residency < 0)
+ dev->states_usage[1].disable = 1;
+ else {
+ drv->states[1].target_residency = residency;
+ drv->states[1].disabled = false;
+ dev->states_usage[1].disable = 0;
+ }
}
static int pseries_cpuidle_add_cpu_notifier(struct notifier_block *n,
@@ -331,6 +350,8 @@ static int __init pseries_processor_idle_init(void)
return retval;
}
+ update_smt_snooze_delay(-1, per_cpu(smt_snooze_delay, 0));
+
retval = pseries_idle_devices_init();
if (retval) {
pseries_idle_devices_uninit();
^ permalink raw reply related
* [PATCH] powerpc/dts: fix sRIO error interrupt for b4860
From: Minghuan Lian @ 2013-07-31 2:59 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Scott Wood, Minghuan Lian, Zang Roy-R61911
For B4 platform, MPIC EISR register is in reversed bitmap order,
instead of "Error interrupt source 0-31. Bit 0 represents SRC0."
the correct ordering is "Error interrupt source 0-31. Bit 0
represents SRC31." This patch is to fix sRIO EISR bit value
of error interrupt in dts node.
Signed-off-by: Minghuan Lian <Minghuan.Lian@freescale.com>
---
arch/powerpc/boot/dts/fsl/b4860si-post.dtsi | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
index e5cf6c8..9813975 100644
--- a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
@@ -41,7 +41,7 @@
&rio {
compatible = "fsl,srio";
- interrupts = <16 2 1 11>;
+ interrupts = <16 2 1 20>;
#address-cells = <2>;
#size-cells = <2>;
fsl,iommu-parent = <&pamu0>;
--
1.8.1.2
^ permalink raw reply related
* Re: [PATCH v2] powerpc/85xx: Add P1023RDB board support
From: Chunhe Lan @ 2013-07-31 2:57 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-dev, Chunhe Lan
In-Reply-To: <1375210628.30721.78@snotra>
On 07/31/2013 02:57 AM, Scott Wood wrote:
> On 07/30/2013 06:40:29 AM, Chunhe Lan wrote: +
>> + lbc: localbus@ff605000 {
>> + reg = <0 0xff605000 0 0x1000>;
>> +
>> + /* NOR, NAND Flashes */
>> + ranges = <0x0 0x0 0x0 0xec000000 0x04000000
>> + 0x1 0x0 0x0 0xffa00000 0x08000000>;
>
> Is there no FPGA attached to eLBC?
Yes, p1023rdb does not have FPGA attached to eLBC.
Thanks,
-Chunhe
^ permalink raw reply
* RE: [PATCH v3 2/3] powerpc/85xx: Add silicon device tree for C293
From: Liu Po-B43644 @ 2013-07-31 2:13 UTC (permalink / raw)
To: Wood Scott-B07421
Cc: linuxppc-dev@ozlabs.org, Hu Mingkai-B21284, Fleming Andy-AFLEMING
In-Reply-To: <1375208891.30721.74@snotra>
> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Wednesday, July 31, 2013 2:28 AM
> To: Liu Po-B43644
> Cc: linuxppc-dev@ozlabs.org; galak@kernel.crashing.org; Fleming Andy-
> AFLEMING; Hu Mingkai-B21284; Liu Po-B43644
> Subject: Re: [PATCH v3 2/3] powerpc/85xx: Add silicon device tree for
> C293
> =20
> On 07/30/2013 03:49:22 AM, Po Liu wrote:
> > From: Mingkai Hu <Mingkai.Hu@freescale.com>
> >
> > Signed-off-by: Mingkai Hu <Mingkai.Hu@freescale.com>
> > Signed-off-by: Po Liu <Po.Liu@freescale.com>
> > ---
> > Changes for v2:
> > - None
> > Changes for v3:
> > - None
> >
> > arch/powerpc/boot/dts/fsl/c293si-post.dtsi | 193
> > +++++++++++++++++++++++++++++
> > arch/powerpc/boot/dts/fsl/c293si-pre.dtsi | 63 ++++++++++
> > 2 files changed, 256 insertions(+)
> > create mode 100644 arch/powerpc/boot/dts/fsl/c293si-post.dtsi
> > create mode 100644 arch/powerpc/boot/dts/fsl/c293si-pre.dtsi
> >
> > diff --git a/arch/powerpc/boot/dts/fsl/c293si-post.dtsi
> > b/arch/powerpc/boot/dts/fsl/c293si-post.dtsi
> > new file mode 100644
> > index 0000000..bd20832
> > --- /dev/null
> > +++ b/arch/powerpc/boot/dts/fsl/c293si-post.dtsi
> > @@ -0,0 +1,193 @@
> > +/*
> > + * C293 Silicon/SoC Device Tree Source (post include)
> > + *
> > + * Copyright 2012 Freescale Semiconductor Inc.
> > + *
> > + * Redistribution and use in source and binary forms, with or without
> > + * modification, are permitted provided that the following
> > conditions are met:
> > + * * Redistributions of source code must retain the above
> > copyright
> > + * notice, this list of conditions and the following
> > disclaimer.
> > + * * Redistributions in binary form must reproduce the above
> > copyright
> > + * notice, this list of conditions and the following
> > disclaimer in the
> > + * documentation and/or other materials provided with the
> > distribution.
> > + * * Neither the name of Freescale Semiconductor nor the
> > + * names of its contributors may be used to endorse or promote
> > products
> > + * derived from this software without specific prior written
> > permission.
> > + *
> > + *
> > + * ALTERNATIVELY, this software may be distributed under the terms
> > of the
> > + * GNU General Public License ("GPL") as published by the Free
> > Software
> > + * Foundation, either version 2 of that License or (at your option)
> > any
> > + * later version.
> > + *
> > + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS''
> > AND ANY
> > + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> > IMPLIED
> > + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> > PURPOSE ARE
> > + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE
> > FOR ANY
> > + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> > CONSEQUENTIAL DAMAGES
> > + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> > OR SERVICES;
> > + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> > CAUSED AND
> > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> > LIABILITY, OR TORT
> > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> > USE OF THIS
> > + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> > + */
> > +
> > +&ifc {
> > + #address-cells =3D <2>;
> > + #size-cells =3D <1>;
> > + compatible =3D "fsl,ifc", "simple-bus";
> > + interrupts =3D <19 2 0 0>;
> > +};
> > +
> > +/* controller at 0xa000 */
> > +&pci0 {
> > + compatible =3D "fsl,qoriq-pcie-v2.2", "fsl,qoriq-pcie";
> > + device_type =3D "pci";
> > + #size-cells =3D <2>;
> > + #address-cells =3D <3>;
> > + bus-range =3D <0 255>;
> > + clock-frequency =3D <33333333>;
> > + interrupts =3D <16 2 0 0>;
> =20
> Remove clock-frequency (surely PCIe is not running at 33 MHz).
> =20
> > + crypto@80000 {
> > +/include/ "qoriq-sec6.0-0.dtsi"
> > + };
> > +
> > + crypto@80000 {
> > + reg =3D <0x80000 0x20000>;
> > + ranges =3D <0x0 0x80000 0x20000>;
> > +
> > + jr@1000{
> > + interrupts =3D <45 2 0 0>;
> > + };
> > + jr@2000{
> > + interrupts =3D <57 2 0 0>;
> > + };
> > + };
> =20
> Do these inline the way the example shows.
Sorry, Scott, I just remember in this way, the node can't be recognized by =
system when run Uboot. The include can't be in the crypto@80000. See the di=
scussion in http://git.am.freescale.net:8181/#/c/736/ .
Maybe I should re-modify the example file.
> =20
> -Scott
^ permalink raw reply
* Re: [4/4] Added device tree entries for Legerity SLIC node on various Freescale Platforms
From: Scott Wood @ 2013-07-30 22:40 UTC (permalink / raw)
To: Sandeep Singh; +Cc: Poonam Aggrwal, linuxppc-dev, linux-arm-kernel
In-Reply-To: <1362655668-26721-4-git-send-email-Sandeep@freescale.com>
On Thu, Mar 07, 2013 at 04:57:48PM +0530, Sandeep Singh wrote:
> diff --git a/arch/powerpc/boot/dts/p1024rdb.dtsi b/arch/powerpc/boot/dts/p1024rdb.dtsi
> index b05dcb4..cec36a3 100644
> --- a/arch/powerpc/boot/dts/p1024rdb.dtsi
> +++ b/arch/powerpc/boot/dts/p1024rdb.dtsi
> @@ -164,6 +164,19 @@
> label = "SPI JFFS2 RFS";
> };
> };
> +
> + tdm_phy_0: slic@0 {
> + compatible = "zarlink,le88266", "tdm-phy-slic";
> + reg = <1>;
> + spi-max-frequency = <8000000>;
> + };
> +
> + tdm_phy_1: slic@1 {
> + compatible = "zarlink,le88266", "tdm-phy-slic";
> + reg = <2>;
> + spi-max-frequency = <8000000>;
> + };
> +
> };
>
> i2c@3000 {
> @@ -173,6 +186,11 @@
> };
> };
>
> + tdm@16000 {
> + num-phy = <2>;
> + phy-handle = <&tdm_phy_0>, <&tdm_phy_1>;
> + };
> +
> usb@22000 {
> phy_type = "ulpi";
> };
Whitespace
What is "tdm-phy-slic"? "num-phy"? Document these in the binding and
use proper vendor prefixes.
Why "<&tdm_phy_0>, <&tdm_phy_1>" rather than "<&tdm_phy_0 &tdm_phy_1>"?
And can you just use the length of phy-handle rather than having a
separate num-phy property?
-Scott
^ permalink raw reply
* Re: [PATCH 1/3] mmc:core: parse voltage from device-tree
From: Scott Wood @ 2013-07-30 19:58 UTC (permalink / raw)
To: Zhang Haijun
Cc: linux-mmc, AFLEMING, Xie Xiaobo-R63061, cbouatmailru, cjb,
linuxppc-dev, Haijun Zhang
In-Reply-To: <51F71825.9000904@freescale.com>
On 07/29/2013 08:34:29 PM, Zhang Haijun wrote:
> On 07/30/2013 06:07 AM, Scott Wood wrote:
>> On 07/28/2013 09:56:33 PM, Haijun Zhang wrote:
>>> Add function to support get voltage from device-tree.
>>> If there are voltage-range specified in device-tree node, this =20
>>> function
>>> will parse it and return the avail voltage mask.
>>>=20
>>> Signed-off-by: Haijun Zhang <haijun.zhang@freescale.com>
>>> ---
>>> drivers/mmc/core/core.c | 48 =20
>>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>> include/linux/mmc/core.h | 1 +
>>> 2 files changed, 49 insertions(+)
>>=20
>> Move the code rather than copying it.
>>=20
>> -Scott
> Hi, Scott
>=20
> You mean?
The point of factoring this out is to avoid duplicating the code. If =20
you don't remove it from the place you copied it from (and have that =20
code call here instead), then you're not avoiding the duplication.
-Scott=
^ permalink raw reply
* Re: [PATCH] cpuidle: add freescale e500 family porcessors idle support
From: Scott Wood @ 2013-07-30 19:38 UTC (permalink / raw)
To: Dongsheng Wang; +Cc: chenhui.zhao, linux-pm, daniel.lezcano, rjw, linuxppc-dev
In-Reply-To: <1375167603-16722-1-git-send-email-dongsheng.wang@freescale.com>
On 07/30/2013 02:00:03 AM, Dongsheng Wang wrote:
> From: Wang Dongsheng <dongsheng.wang@freescale.com>
>=20
> Add cpuidle support for e500 family, using cpuidle framework to
> manage various low power modes. The new implementation will remain
> compatible with original idle method.
>=20
> Initially, this supports PW10, and subsequent patches will support
> PW20/DOZE/NAP.
Could you explain what the cpuidle framework does for us that the =20
current
idle code doesn't?
In particular, what scenario do you see where we would require a =20
software
governor to choose between idle states, and how much power is saved
compared to a simpler approach? There is timer that can be used to
automatically enter PW20 after a certain amount of time in PW10. How
much better results do you get from a software governor? Do we even =20
have
the right data to characterize each state so that a software governor
could make good decisions? Is cpuidle capable of governing the interval
of such a timer, rather than directly governing states?
As for doze/nap, why would we want to use those on newer cores? Do you
have numbers for how much power each mode saves?
Active governors may be useful on older cores that only have doze/nap, =20
to
select between them, but if that's the use case then why start with =20
pw10?
And I'd want to see numbers for how much power nap saves versus doze.
> Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com>
> ---
> This patch keep using cpuidle_register_device(), because we need to =20
> support cpu
> hotplug. I will fix "device" issue in this driver, after
> Deepthi Dharwar <deepthi@linux.vnet.ibm.com> add a hotplug handler =20
> into cpuidle
> freamwork.
Where's the diffstat?
> diff --git a/arch/powerpc/include/asm/machdep.h =20
> b/arch/powerpc/include/asm/machdep.h
> index 8b48090..cbdbe25 100644
> --- a/arch/powerpc/include/asm/machdep.h
> +++ b/arch/powerpc/include/asm/machdep.h
> @@ -271,6 +271,16 @@ extern void power7_idle(void);
> extern void ppc6xx_idle(void);
> extern void book3e_idle(void);
>=20
> +/* Wait for Interrupt */
> +static inline void fsl_cpuidle_wait(void)
> +{
> +#ifdef CONFIG_PPC64
> + book3e_idle();
> +#else
> + e500_idle();
> +#endif
> +}
Where is this used?
> +
> /*
> * ppc_md contains a copy of the machine description structure for =20
> the
> * current platform. machine_id contains the initial address where =20
> the
> diff --git a/drivers/cpuidle/Kconfig b/drivers/cpuidle/Kconfig
> index b3fb81d..7ed114b 100644
> --- a/drivers/cpuidle/Kconfig
> +++ b/drivers/cpuidle/Kconfig
> @@ -35,6 +35,11 @@ depends on ARM
> source "drivers/cpuidle/Kconfig.arm"
> endmenu
>=20
> +menu "PowerPC CPU Idle Drivers"
> +depends on PPC32 || PPC64
depends on PPC
> diff --git a/drivers/cpuidle/Kconfig.powerpc =20
> b/drivers/cpuidle/Kconfig.powerpc
> new file mode 100644
> index 0000000..9f3f5ef
> --- /dev/null
> +++ b/drivers/cpuidle/Kconfig.powerpc
> @@ -0,0 +1,9 @@
> +#
> +# PowerPC CPU Idle drivers
> +#
> +
> +config PPC_E500_CPUIDLE
> + bool "CPU Idle Driver for E500 family processors"
> + depends on FSL_SOC_BOOKE
> + help
> + Select this to enable cpuidle on e500 family processors.
FSL_SOC_BOOKE is more than just e500
> diff --git a/drivers/cpuidle/Makefile b/drivers/cpuidle/Makefile
> index 0b9d200..0dde3db 100644
> --- a/drivers/cpuidle/Makefile
> +++ b/drivers/cpuidle/Makefile
> @@ -11,3 +11,7 @@ obj-$(CONFIG_ARM_HIGHBANK_CPUIDLE) +=3D =20
> cpuidle-calxeda.o
> obj-$(CONFIG_ARM_KIRKWOOD_CPUIDLE) +=3D cpuidle-kirkwood.o
> obj-$(CONFIG_ARM_ZYNQ_CPUIDLE) +=3D cpuidle-zynq.o
> obj-$(CONFIG_ARM_U8500_CPUIDLE) +=3D cpuidle-ux500.o
> +
> +########################################################################=
##########
> +# PowerPC platform drivers
> +obj-$(CONFIG_PPC_E500_CPUIDLE) +=3D cpuidle-e500.o
> diff --git a/drivers/cpuidle/cpuidle-e500.c =20
> b/drivers/cpuidle/cpuidle-e500.c
> new file mode 100644
> index 0000000..1919cea
> --- /dev/null
> +++ b/drivers/cpuidle/cpuidle-e500.c
> @@ -0,0 +1,222 @@
> +/*
> + * Copyright 2013 Freescale Semiconductor, Inc.
> + *
> + * CPU Idle driver for Freescale PowerPC e500 family processors.
> + *
> + * This program is free software; you can redistribute it and/or =20
> modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * Author: Wang Dongsheng <dongsheng.wang@freescale.com>
> + */
Is this derived from some other file? It looks like it... Where's the
attribution?
> +#include <linux/cpu.h>
> +#include <linux/cpuidle.h>
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/notifier.h>
> +
> +#include <asm/machdep.h>
> +
> +static struct cpuidle_driver e500_idle_driver =3D {
> + .name =3D "e500_idle",
> + .owner =3D THIS_MODULE,
> +};
> +
> +static struct cpuidle_device __percpu *e500_cpuidle_devices;
> +
> +static void e500_cpuidle(void)
> +{
> + /*
> + * This would call on the cpuidle framework, and the back-end
> + * driver to go to idle states.
> + */
> + if (cpuidle_idle_call()) {
> + /*
> + * On error, execute default handler
> + * to go into low thread priority and possibly
> + * low power mode.
> + */
> + HMT_low();
> + HMT_very_low();
This HMT stuff doesn't do anything on e500 derivatives AFAIK.
> +static struct cpuidle_state fsl_pw_idle_states[] =3D {
> + {
> + .name =3D "pw10",
> + .desc =3D "pw10",
> + .flags =3D CPUIDLE_FLAG_TIME_VALID,
> + .exit_latency =3D 0,
> + .target_residency =3D 0,
> + .enter =3D &pw10_enter
Where is pw10_enter defined?
> +static int cpu_is_feature(unsigned long feature)
> +{
> + return (cur_cpu_spec->cpu_features =3D=3D feature);
> +}
> +
> +static int __init e500_idle_init(void)
> +{
> + struct cpuidle_state *cpuidle_state_table =3D NULL;
> + struct cpuidle_driver *drv =3D &e500_idle_driver;
> + int err;
> + unsigned int max_idle_state =3D 0;
> +
> + if (cpuidle_disable !=3D IDLE_NO_OVERRIDE)
> + return -ENODEV;
> +
> + if (cpu_is_feature(CPU_FTRS_E500MC) || =20
> cpu_is_feature(CPU_FTRS_E5500) ||
> + cpu_is_feature(CPU_FTRS_E6500)) {
There's no guarantee that a CPU with the same set of features is the
exact same CPU.
What specific feature are you looking for here?
> + cpuidle_state_table =3D fsl_pw_idle_states;
> + max_idle_state =3D ARRAY_SIZE(fsl_pw_idle_states);
> + }
> +
> + if (!cpuidle_state_table || !max_idle_state)
> + return -EPERM;
ENODEV?
-Scott=
^ permalink raw reply
* Re: [PATCH v2] powerpc/85xx: Add P1023RDB board support
From: Scott Wood @ 2013-07-30 18:57 UTC (permalink / raw)
To: Chunhe Lan; +Cc: linuxppc-dev, Chunhe Lan
In-Reply-To: <1375184429-22145-1-git-send-email-Chunhe.Lan@freescale.com>
On 07/30/2013 06:40:29 AM, Chunhe Lan wrote:
> P1023RDB Specification:
> -----------------------
> Memory subsystem:
> 512MB DDR3 (Fixed DDR on board)
> 64MB NOR flash
> 128MB NAND flash
>=20
> Ethernet:
> eTSEC1: Connected to Atheros AR8035 GETH PHY
> eTSEC2: Connected to Atheros AR8035 GETH PHY
>=20
> PCIe:
> Three mini-PCIe slots
>=20
> USB:
> Two USB2.0 Type A ports
>=20
> I2C:
> AT24C08 8K Board EEPROM (8 bit address)
>=20
> Signed-off-by: Chunhe Lan <Chunhe.Lan@freescale.com>
> Cc: Scott Wood <scottwood@freescale.com>
> ---
> arch/powerpc/boot/dts/p1023rdb.dts | 237 =20
> ++++++++++++++++++++++++++
> arch/powerpc/configs/85xx/p1023_defconfig | 183 =20
> ++++++++++++++++++++
> arch/powerpc/configs/85xx/p1023rds_defconfig | 169 =20
> ------------------
> arch/powerpc/platforms/85xx/Kconfig | 4 +-
> arch/powerpc/platforms/85xx/p1023_rds.c | 24 +++-
> 5 files changed, 445 insertions(+), 172 deletions(-)
> create mode 100644 arch/powerpc/boot/dts/p1023rdb.dts
> create mode 100644 arch/powerpc/configs/85xx/p1023_defconfig
> delete mode 100644 arch/powerpc/configs/85xx/p1023rds_defconfig
Please indicate changes from the previous version under the ---
>=20
> diff --git a/arch/powerpc/boot/dts/p1023rdb.dts =20
> b/arch/powerpc/boot/dts/p1023rdb.dts
> new file mode 100644
> index 0000000..107c676
> --- /dev/null
> +++ b/arch/powerpc/boot/dts/p1023rdb.dts
> @@ -0,0 +1,237 @@
> +/*
> + * P1023 RDB Device Tree Source
> + *
> + * Copyright 2013 Freescale Semiconductor Inc.
> + *
> + * Author: Chunhe Lan <Chunhe.Lan@freescale.com>
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following =20
> conditions are met:
> + * * Redistributions of source code must retain the above =20
> copyright
> + * notice, this list of conditions and the following =20
> disclaimer.
> + * * Redistributions in binary form must reproduce the above =20
> copyright
> + * notice, this list of conditions and the following =20
> disclaimer in the
> + * documentation and/or other materials provided with the =20
> distribution.
> + * * Neither the name of Freescale Semiconductor nor the
> + * names of its contributors may be used to endorse or promote =20
> products
> + * derived from this software without specific prior written =20
> permission.
> + *
> + *
> + * ALTERNATIVELY, this software may be distributed under the terms =20
> of the
> + * GNU General Public License ("GPL") as published by the Free =20
> Software
> + * Foundation, either version 2 of that License or (at your option) =20
> any
> + * later version.
> + *
> + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' =20
> AND ANY
> + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE =20
> IMPLIED
> + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR =20
> PURPOSE ARE
> + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE =20
> FOR ANY
> + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR =20
> CONSEQUENTIAL DAMAGES
> + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS =20
> OR SERVICES;
> + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER =20
> CAUSED AND
> + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT =20
> LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE =20
> USE OF THIS
> + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/include/ "fsl/p1023si-pre.dtsi"
> +
> +/ {
> + model =3D "fsl,P1023";
> + compatible =3D "fsl,P1023RDB";
> + #address-cells =3D <2>;
> + #size-cells =3D <2>;
> + interrupt-parent =3D <&mpic>;
> +
> + memory {
> + device_type =3D "memory";
> + };
> +
> + soc: soc@ff600000 {
> + ranges =3D <0x0 0x0 0xff600000 0x200000>;
> +
> + i2c@3000 {
> + eeprom@53 {
> + compatible =3D "at24,24c04";
> + reg =3D <0x53>;
> + };
> +
> + rtc@6f {
> + compatible =3D "microchip,mcp7941x";
> + reg =3D <0x6f>;
> + };
> + };
> +
> + usb@22000 {
> + dr_mode =3D "host";
> + phy_type =3D "ulpi";
> + };
> + };
> +
> + lbc: localbus@ff605000 {
> + reg =3D <0 0xff605000 0 0x1000>;
> +
> + /* NOR, NAND Flashes */
> + ranges =3D <0x0 0x0 0x0 0xec000000 0x04000000
> + 0x1 0x0 0x0 0xffa00000 0x08000000>;
Is there no FPGA attached to eLBC?
> + nor@0,0 {
> + #address-cells =3D <1>;
> + #size-cells =3D <1>;
> + compatible =3D "cfi-flash";
> + reg =3D <0x0 0x0 0x04000000>;
> + bank-width =3D <2>;
> + device-width =3D <1>;
> +
> + partition@0 {
> + /* 48MB for JFFS2 based Root file =20
> System */
> + reg =3D <0x00000000 0x03000000>;
> + label =3D "NOR JFFS2 Root File System";
> + };
Don't specify JFFS2.
> + partition@1000000 {
> + /* 32MB for Compressed Root file System =20
> Image */
> + reg =3D <0x01000000 0x02000000>;
> + label =3D "NAND Compressed RFS Image";
> + };
> +
> + partition@3000000 {
> + /* 64MB for JFFS2 based Root file =20
> System */
> + reg =3D <0x03000000 0x04000000>;
> + label =3D "NAND JFFS2 Root File System";
> + };
> +
> + partition@7000000 {
> + /* 16MB for User Writable Area */
> + reg =3D <0x07000000 0x01000000>;
> + label =3D "NAND Writable User area";
> + };
Don't specify JFFS2. Is there a good reason to have three separate =20
partitions here?
> diff --git a/arch/powerpc/configs/85xx/p1023_defconfig =20
> b/arch/powerpc/configs/85xx/p1023_defconfig
> new file mode 100644
> index 0000000..ac29fb8
> --- /dev/null
> +++ b/arch/powerpc/configs/85xx/p1023_defconfig
> @@ -0,0 +1,183 @@
> +CONFIG_PPC_85xx=3Dy
> +CONFIG_SMP=3Dy
> +CONFIG_NR_CPUS=3D2
> +CONFIG_EXPERIMENTAL=3Dy
CONFIG_EXPERIMENTAL doesn't exist anymore. Please only use "make =20
savedefconfig" output, not the direct results of hand-editing an old =20
config file.
Also please pass -M -C to git format-patch.
> diff --git a/arch/powerpc/platforms/85xx/Kconfig =20
> b/arch/powerpc/platforms/85xx/Kconfig
> index efdd37c..d6424e9 100644
> --- a/arch/powerpc/platforms/85xx/Kconfig
> +++ b/arch/powerpc/platforms/85xx/Kconfig
> @@ -112,10 +112,10 @@ config P1022_RDK
> reference board.
>=20
> config P1023_RDS
> - bool "Freescale P1023 RDS"
> + bool "Freescale P1023 RDS (P1023 RDB)"
bool "Freescale P1024 RDS/RDB"
> select DEFAULT_UIMAGE
> help
> - This option enables support for the P1023 RDS board
> + This option enables support for the P1023 RDS (P1023 RDB) =20
> board
"for the P1023 RDS and RDB boards"
-Scott=
^ permalink raw reply
* Re: [PATCH 4/4] kvm: powerpc: set cache coherency only for RAM pages
From: Scott Wood @ 2013-07-30 18:49 UTC (permalink / raw)
To: Bhushan Bharat-R65777
Cc: Wood Scott-B07421, kvm@vger.kernel.org, Alexander Graf,
kvm-ppc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org
In-Reply-To: <6A3DF150A5B70D4F9B66A25E3F7C888D070EBC3F@039-SN2MPN1-013.039d.mgd.msft.net>
On 07/30/2013 11:22:54 AM, Bhushan Bharat-R65777 wrote:
> diff --git a/arch/powerpc/kvm/e500_mmu_host.c =20
> b/arch/powerpc/kvm/e500_mmu_host.c
> index 5cbdc8f..a48c13f 100644
> --- a/arch/powerpc/kvm/e500_mmu_host.c
> +++ b/arch/powerpc/kvm/e500_mmu_host.c
> @@ -40,6 +40,84 @@
>=20
> static struct kvmppc_e500_tlb_params host_tlb_params[E500_TLB_NUM];
>=20
> +/*
> + * find_linux_pte returns the address of a linux pte for a given
> + * effective address and directory. If not found, it returns zero.
> + */
> +static inline pte_t *find_linux_pte(pgd_t *pgdir, unsigned long ea)
> +{
> + pgd_t *pg;
> + pud_t *pu;
> + pmd_t *pm;
> + pte_t *pt =3D NULL;
> +
> + pg =3D pgdir + pgd_index(ea);
> + if (!pgd_none(*pg)) {
> + pu =3D pud_offset(pg, ea);
> + if (!pud_none(*pu)) {
> + pm =3D pmd_offset(pu, ea);
> + if (pmd_present(*pm))
> + pt =3D pte_offset_kernel(pm, ea);
> + }
> + }
> + return pt;
> +}
How is this specific to KVM or e500?
> +#ifdef CONFIG_HUGETLB_PAGE
> +pte_t *find_linux_pte_or_hugepte(pgd_t *pgdir, unsigned long ea,
> + unsigned *shift);
> +#else
> +static inline pte_t *find_linux_pte_or_hugepte(pgd_t *pgdir, =20
> unsigned long ea,
> + unsigned *shift)
> +{
> + if (shift)
> + *shift =3D 0;
> + return find_linux_pte(pgdir, ea);
> +}
> +#endif /* !CONFIG_HUGETLB_PAGE */
This is already declared in asm/pgtable.h. If we need a non-hugepage =20
alternative, that should also go in asm/pgtable.h.
> +/*
> + * Lock and read a linux PTE. If it's present and writable, =20
> atomically
> + * set dirty and referenced bits and return the PTE, otherwise =20
> return 0.
> + */
> +static inline pte_t kvmppc_read_update_linux_pte(pte_t *p, int =20
> writing)
> +{
> + pte_t pte =3D pte_val(*p);
> +
> + if (pte_present(pte)) {
> + pte =3D pte_mkyoung(pte);
> + if (writing && pte_write(pte))
> + pte =3D pte_mkdirty(pte);
> + }
> +
> + *p =3D pte;
> +
> + return pte;
> +}
> +
> +static pte_t lookup_linux_pte(pgd_t *pgdir, unsigned long hva,
> + int writing, unsigned long *pte_sizep)
> +{
> + pte_t *ptep;
> + unsigned long ps =3D *pte_sizep;
> + unsigned int shift;
> +
> + ptep =3D find_linux_pte_or_hugepte(pgdir, hva, &shift);
> + if (!ptep)
> + return __pte(0);
> + if (shift)
> + *pte_sizep =3D 1ul << shift;
> + else
> + *pte_sizep =3D PAGE_SIZE;
> +
> + if (ps > *pte_sizep)
> + return __pte(0);
> + if (!pte_present(*ptep))
> + return __pte(0);
> +
> + return kvmppc_read_update_linux_pte(ptep, writing);
> +}
> +
None of this belongs in this file either.
> @@ -326,8 +405,8 @@ static void kvmppc_e500_setup_stlbe(
>=20
> /* Force IPROT=3D0 for all guest mappings. */
> stlbe->mas1 =3D MAS1_TSIZE(tsize) | get_tlb_sts(gtlbe) | =20
> MAS1_VALID;
> - stlbe->mas2 =3D (gvaddr & MAS2_EPN) |
> - e500_shadow_mas2_attrib(gtlbe->mas2, pfn);
> + stlbe->mas2 =3D (gvaddr & MAS2_EPN) | (ref->flags & =20
> E500_TLB_WIMGE_MASK);
> +// e500_shadow_mas2_attrib(gtlbe->mas2, pfn);
MAS2_E and MAS2_G should be safe to come from the guest.
How does this work for TLB1? One ref corresponds to one guest entry, =20
which may correspond to multiple host entries, potentially each with =20
different WIM settings.
> stlbe->mas7_3 =3D ((u64)pfn << PAGE_SHIFT) |
> e500_shadow_mas3_attrib(gtlbe->mas7_3, pr);
>=20
> @@ -346,6 +425,8 @@ static inline int kvmppc_e500_shadow_map(struct =20
> kvmppc_vcpu_e500 *vcpu_e500,
> unsigned long hva;
> int pfnmap =3D 0;
> int tsize =3D BOOK3E_PAGESZ_4K;
> + pte_t pte;
> + int wimg =3D 0;
>=20
> /*
> * Translate guest physical to true physical, acquiring
> @@ -451,6 +532,8 @@ static inline int kvmppc_e500_shadow_map(struct =20
> kvmppc_vcpu_e500 *vcpu_e500,
>=20
> if (likely(!pfnmap)) {
> unsigned long tsize_pages =3D 1 << (tsize + 10 - =20
> PAGE_SHIFT);
> + pgd_t *pgdir;
> +
> pfn =3D gfn_to_pfn_memslot(slot, gfn);
> if (is_error_noslot_pfn(pfn)) {
> printk(KERN_ERR "Couldn't get real page for =20
> gfn %lx!\n",
> @@ -461,9 +544,15 @@ static inline int kvmppc_e500_shadow_map(struct =20
> kvmppc_vcpu_e500 *vcpu_e500,
> /* Align guest and physical address to page map =20
> boundaries */
> pfn &=3D ~(tsize_pages - 1);
> gvaddr &=3D ~((tsize_pages << PAGE_SHIFT) - 1);
> + pgdir =3D vcpu_e500->vcpu.arch.pgdir;
> + pte =3D lookup_linux_pte(pgdir, hva, 1, &tsize_pages);
> + if (pte_present(pte))
> + wimg =3D (pte >> PTE_WIMGE_SHIFT) & =20
> MAS2_WIMGE_MASK;
> + else
> + wimg =3D MAS2_I | MAS2_G;
If the PTE is not present, then we can't map it, right? So why I+G?
-Scott=
^ permalink raw reply
* Re: [PATCH v3 3/3] powerpc/85xx: Add C293PCIE board support
From: Scott Wood @ 2013-07-30 18:29 UTC (permalink / raw)
To: Po Liu; +Cc: linuxppc-dev, Mingkai Hu, afleming, Po Liu
In-Reply-To: <1375174163-19246-3-git-send-email-Po.Liu@freescale.com>
On 07/30/2013 03:49:23 AM, Po Liu wrote:
> + nand@1,0 {
> + #address-cells =3D <1>;
> + #size-cells =3D <1>;
> + compatible =3D "fsl,ifc-nand";
> + reg =3D <0x1 0x0 0x10000>;
> +
> + partition@0 {
> + /* This location must not be altered */
> + /* 1MB for u-boot Bootloader Image */
> + reg =3D <0x0 0x00100000>;
> + label =3D "NAND U-Boot Image";
> + read-only;
> + };
> +
> + partition@100000 {
> + /* 1MB for DTB Image */
> + reg =3D <0x00100000 0x00100000>;
> + label =3D "NAND DTB Image";
> + };
> +
> + partition@200000 {
> + /* 4MB for Linux Kernel Image */
> + reg =3D <0x00200000 0x00400000>;
> + label =3D "NAND Linux Kernel Image";
> + };
> +
> + partition@600000 {
> + /* 4090MB for Root file System Image */
> + reg =3D <0x00600000 0xffa00000>;
> + label =3D "NAND RFS Image";
> + };
> + };
Might want to leave a bit more room for the kernel image, given the =20
size of NAND.
-Scott=
^ permalink raw reply
* Re: [PATCH v3 2/3] powerpc/85xx: Add silicon device tree for C293
From: Scott Wood @ 2013-07-30 18:28 UTC (permalink / raw)
To: Po Liu; +Cc: linuxppc-dev, Mingkai Hu, afleming, Po Liu
In-Reply-To: <1375174163-19246-2-git-send-email-Po.Liu@freescale.com>
On 07/30/2013 03:49:22 AM, Po Liu wrote:
> From: Mingkai Hu <Mingkai.Hu@freescale.com>
>=20
> Signed-off-by: Mingkai Hu <Mingkai.Hu@freescale.com>
> Signed-off-by: Po Liu <Po.Liu@freescale.com>
> ---
> Changes for v2:
> - None
> Changes for v3:
> - None
>=20
> arch/powerpc/boot/dts/fsl/c293si-post.dtsi | 193 =20
> +++++++++++++++++++++++++++++
> arch/powerpc/boot/dts/fsl/c293si-pre.dtsi | 63 ++++++++++
> 2 files changed, 256 insertions(+)
> create mode 100644 arch/powerpc/boot/dts/fsl/c293si-post.dtsi
> create mode 100644 arch/powerpc/boot/dts/fsl/c293si-pre.dtsi
>=20
> diff --git a/arch/powerpc/boot/dts/fsl/c293si-post.dtsi =20
> b/arch/powerpc/boot/dts/fsl/c293si-post.dtsi
> new file mode 100644
> index 0000000..bd20832
> --- /dev/null
> +++ b/arch/powerpc/boot/dts/fsl/c293si-post.dtsi
> @@ -0,0 +1,193 @@
> +/*
> + * C293 Silicon/SoC Device Tree Source (post include)
> + *
> + * Copyright 2012 Freescale Semiconductor Inc.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following =20
> conditions are met:
> + * * Redistributions of source code must retain the above =20
> copyright
> + * notice, this list of conditions and the following =20
> disclaimer.
> + * * Redistributions in binary form must reproduce the above =20
> copyright
> + * notice, this list of conditions and the following =20
> disclaimer in the
> + * documentation and/or other materials provided with the =20
> distribution.
> + * * Neither the name of Freescale Semiconductor nor the
> + * names of its contributors may be used to endorse or promote =20
> products
> + * derived from this software without specific prior written =20
> permission.
> + *
> + *
> + * ALTERNATIVELY, this software may be distributed under the terms =20
> of the
> + * GNU General Public License ("GPL") as published by the Free =20
> Software
> + * Foundation, either version 2 of that License or (at your option) =20
> any
> + * later version.
> + *
> + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' =20
> AND ANY
> + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE =20
> IMPLIED
> + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR =20
> PURPOSE ARE
> + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE =20
> FOR ANY
> + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR =20
> CONSEQUENTIAL DAMAGES
> + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS =20
> OR SERVICES;
> + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER =20
> CAUSED AND
> + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT =20
> LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE =20
> USE OF THIS
> + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +&ifc {
> + #address-cells =3D <2>;
> + #size-cells =3D <1>;
> + compatible =3D "fsl,ifc", "simple-bus";
> + interrupts =3D <19 2 0 0>;
> +};
> +
> +/* controller at 0xa000 */
> +&pci0 {
> + compatible =3D "fsl,qoriq-pcie-v2.2", "fsl,qoriq-pcie";
> + device_type =3D "pci";
> + #size-cells =3D <2>;
> + #address-cells =3D <3>;
> + bus-range =3D <0 255>;
> + clock-frequency =3D <33333333>;
> + interrupts =3D <16 2 0 0>;
Remove clock-frequency (surely PCIe is not running at 33 MHz).
> + crypto@80000 {
> +/include/ "qoriq-sec6.0-0.dtsi"
> + };
> +
> + crypto@80000 {
> + reg =3D <0x80000 0x20000>;
> + ranges =3D <0x0 0x80000 0x20000>;
> +
> + jr@1000{
> + interrupts =3D <45 2 0 0>;
> + };
> + jr@2000{
> + interrupts =3D <57 2 0 0>;
> + };
> + };
Do these inline the way the example shows.
-Scott=
^ permalink raw reply
* Re: powerpc/85xx: Add P1023RDB board support
From: Scott Wood @ 2013-07-30 16:27 UTC (permalink / raw)
To: Chunhe Lan; +Cc: linuxppc-dev, Chunhe Lan
In-Reply-To: <51F793D3.6080504@freescale.com>
On 07/30/2013 05:22:11 AM, Chunhe Lan wrote:
>=20
> On 07/30/2013 09:09 AM, Scott Wood wrote:
>> On Fri, Jun 14, 2013 at 04:26:20PM +0800, Chunhe Lan wrote:
>>> Ethernet:
>>> eTSEC1: Connected to Atheros AR8035 GETH PHY
>>> eTSEC2: Connected to Atheros AR8035 GETH PHY
>> Where are the PHYs in the device tree?
> "Atheros AR8035 GETH PHY" driver is module_init driver. It uses =20
> the two structs of "static struct phy_driver at8035_driver" and
> "static struct mdio_device_id __maybe_unused atheros_tbl" to =20
> register at8035_driver.
>=20
> So do not need to add PHYs in the device tree.
Huh? How does registering a driver eliminate the need to describe the =20
devices in the device tree? If you're trying to say that the device =20
can be probed (like a PCI device), how do you determine which PHY goes =20
to which MAC? I suspect the actual answer is "this chip has datapath =20
ethernet, and datapath stuff is not upstream (still!)". That's no =20
excuse for not describing it in the device tree, though. The device =20
tree describes the hardware, not what Linux has drivers for.
FWIW, I don't see the string "at8035_driver" anywhere in the kernel =20
(except in the SDK, which doesn't count here). Maybe you meant =20
at803x_driver?
-Scott=
^ permalink raw reply
* RE: [PATCH 4/4] kvm: powerpc: set cache coherency only for RAM pages
From: Bhushan Bharat-R65777 @ 2013-07-30 16:22 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Wood Scott-B07421, linuxppc-dev@lists.ozlabs.org, Alexander Graf,
kvm-ppc@vger.kernel.org, kvm@vger.kernel.org
In-Reply-To: <1374877600.9200.28.camel@pasglop>
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQmVuamFtaW4gSGVycmVu
c2NobWlkdCBbbWFpbHRvOmJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZ10NCj4gU2VudDogU2F0dXJk
YXksIEp1bHkgMjcsIDIwMTMgMzo1NyBBTQ0KPiBUbzogQmh1c2hhbiBCaGFyYXQtUjY1Nzc3DQo+
IENjOiBBbGV4YW5kZXIgR3JhZjsga3ZtLXBwY0B2Z2VyLmtlcm5lbC5vcmc7IGt2bUB2Z2VyLmtl
cm5lbC5vcmc7IGxpbnV4cHBjLQ0KPiBkZXZAbGlzdHMub3psYWJzLm9yZzsgV29vZCBTY290dC1C
MDc0MjENCj4gU3ViamVjdDogUmU6IFtQQVRDSCA0LzRdIGt2bTogcG93ZXJwYzogc2V0IGNhY2hl
IGNvaGVyZW5jeSBvbmx5IGZvciBSQU0gcGFnZXMNCj4gDQo+IE9uIEZyaSwgMjAxMy0wNy0yNiBh
dCAxNTowMyArMDAwMCwgQmh1c2hhbiBCaGFyYXQtUjY1Nzc3IHdyb3RlOg0KPiA+IFdpbGwgbm90
IHNlYXJjaGluZyB0aGUgTGludXggUFRFIGlzIGEgb3ZlcmtpbGw/DQo+IA0KPiBUaGF0J3MgdGhl
IGJlc3QgYXBwcm9hY2guIEFsc28gd2UgYXJlIHNlYXJjaGluZyBpdCBhbHJlYWR5IHRvIHJlc29s
dmUgdGhlIHBhZ2UNCj4gZmF1bHQuIFRoYXQgZG9lcyBtZWFuIHdlIHNlYXJjaCB0d2ljZSBidXQg
b24gdGhlIG90aGVyIGhhbmQgdGhhdCBhbHNvIG1lYW5zIGl0J3MNCj4gaG90IGluIHRoZSBjYWNo
ZS4NCg0KDQpCZWxvdyBpcyBlYXJseSBnaXQgZGlmZiAobm90IGEgcHJvcGVyIGNsZWFudXAgcGF0
Y2gpLCB0byBiZSBzdXJlIHRoYXQgdGhpcyBpcyB3aGF0IHdlIHdhbnQgb24gUG93ZXJQQyBhbmQg
dGFrZSBlYXJseSBmZWVkYmFjay4gQWxzbyBJIHJ1biBzb21lIGJlbmNobWFyayB0byB1bmRlcnN0
YW5kIHRoZSBvdmVyaGVhZCBpZiBhbnkuIA0KDQpVc2luZyBrdm1faXNfbW1pb19wZm4oKTsgd2hh
dCB0aGUgY3VycmVudCBwYXRjaCBkb2VzOgkJCQkJCQkJCQkJDQpSZWFsOiAwbTQ2LjYxNnMgKyAw
bTQ5LjUxN3MgKyAwbTQ5LjUxMHMgKyAwbTQ2LjkzNnMgKyAwbTQ2Ljg4OXMgKyAwbTQ2LjY4NHMg
PSBBdmc7IDQ3LjY5MnMNClVzZXI6IDBtMzEuNjM2cyArIDBtMzEuODE2cyArIDBtMzEuNDU2cyAr
IDBtMzEuNzUycyArIDBtMzIuMDI4cyArIDBtMzEuODQ4cyA9IEF2ZzsgMzEuNzU2cw0KU3lzOiAg
MG0xMS41OTZzICsgMG0xMS44NjhzICsgMG0xMi4yNDRzICsgMG0xMS42NzJzICsgMG0xMS4zNTZz
ICsgMG0xMS40MzJzID0gQXZnOyAxMS42OTVzDQoNCg0KVXNpbmcga2VybmVsIHBhZ2UgdGFibGUg
c2VhcmNoIChiZWxvdyBjaGFuZ2VzKToNClJlYWw6IDBtNDYuNDMxcyArIDBtNTAuMjY5cyArIDBt
NDYuNzI0cyArIDBtNDYuNjQ1cyArIDBtNDYuNjcwcyArIDBtNTAuMjU5cyA9IEF2ZzsgNDcuODMz
cw0KVXNlcjogMG0zMS41NjhzICsgMG0zMS44MTZzICsgMG0zMS40NDRzICsgMG0zMS44MDhzICsg
MG0zMS4zMTJzICsgMG0zMS43NDBzID0gQXZnOyAzMS42MTRzDQpTeXM6ICAwbTExLjUxNnMgKyAw
bTEyLjA2MHMgKyAwbTExLjg3MnMgKyAwbTExLjQ3NnMgKyAwbTEyLjAwMHMgKyAwbTEyLjE1MnMg
PSBBdmc7IDExLjg0NnMNCg0KLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvYXJjaC9w
b3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20v
a3ZtX2hvc3QuaA0KaW5kZXggMzMyODM1My4uZDZkMGRhYyAxMDA2NDQNCi0tLSBhL2FyY2gvcG93
ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oDQorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9h
c20va3ZtX2hvc3QuaA0KQEAgLTUzMiw2ICs1MzIsNyBAQCBzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCB7
DQogICAgICAgIHUzMiBlcHI7DQogICAgICAgIHUzMiBjcml0X3NhdmU7DQogICAgICAgIHN0cnVj
dCBrdm1wcGNfYm9va2VfZGVidWdfcmVnIGRiZ19yZWc7DQorICAgICAgIHBnZF90ICpwZ2RpcjsN
CiAjZW5kaWYNCiAgICAgICAgZ3BhX3QgcGFkZHJfYWNjZXNzZWQ7DQogICAgICAgIGd2YV90IHZh
ZGRyX2FjY2Vzc2VkOw0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYyBiL2Fy
Y2gvcG93ZXJwYy9rdm0vYm9va2UuYw0KaW5kZXggMTc3MjJkOC4uZWJjY2NjMiAxMDA2NDQNCi0t
LSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYw0KKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29r
ZS5jDQpAQCAtNjk3LDcgKzY5Nyw3IEBAIGludCBrdm1wcGNfdmNwdV9ydW4oc3RydWN0IGt2bV9y
dW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkNCiAjZW5kaWYNCiANCiAgICAgICAg
a3ZtcHBjX2ZpeF9lZV9iZWZvcmVfZW50cnkoKTsNCi0NCisgICAgICAgdmNwdS0+YXJjaC5wZ2Rp
ciA9IGN1cnJlbnQtPm1tLT5wZ2Q7DQogICAgICAgIHJldCA9IF9fa3ZtcHBjX3ZjcHVfcnVuKGt2
bV9ydW4sIHZjcHUpOw0KIA0KICAgICAgICAvKiBObyBuZWVkIGZvciBrdm1fZ3Vlc3RfZXhpdC4g
SXQncyBkb25lIGluIGhhbmRsZV9leGl0Lg0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0v
ZTUwMC5oIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwLmgNCmluZGV4IDRmZDk2NTAuLmZjNGIyZjYg
MTAwNjQ0DQotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDAuaA0KKysrIGIvYXJjaC9wb3dlcnBj
L2t2bS9lNTAwLmgNCkBAIC0zMSwxMSArMzEsMTMgQEAgZW51bSB2Y3B1X2Z0ciB7DQogI2RlZmlu
ZSBFNTAwX1RMQl9OVU0gICAyDQogDQogLyogZW50cnkgaXMgbWFwcGVkIHNvbWV3aGVyZSBpbiBo
b3N0IFRMQiAqLw0KLSNkZWZpbmUgRTUwMF9UTEJfVkFMSUQgICAgICAgICAoMSA8PCAwKQ0KKyNk
ZWZpbmUgRTUwMF9UTEJfVkFMSUQgICAgICAgICAoMSA8PCAzMSkNCiAvKiBUTEIxIGVudHJ5IGlz
IG1hcHBlZCBieSBob3N0IFRMQjEsIHRyYWNrZWQgYnkgYml0bWFwcyAqLw0KLSNkZWZpbmUgRTUw
MF9UTEJfQklUTUFQICAgICAgICAgICAgICAgICgxIDw8IDEpDQorI2RlZmluZSBFNTAwX1RMQl9C
SVRNQVAgICAgICAgICAgICAgICAgKDEgPDwgMzApDQogLyogVExCMSBlbnRyeSBpcyBtYXBwZWQg
YnkgaG9zdCBUTEIwICovDQotI2RlZmluZSBFNTAwX1RMQl9UTEIwICAgICAgICAgICgxIDw8IDIp
DQorI2RlZmluZSBFNTAwX1RMQl9UTEIwICAgICAgICAgICgxIDw8IDI5KQ0KKy8qIExvd2VyIDUg
Yml0cyBoYXZlIFdJTUdFIHZhbHVlICovDQorI2RlZmluZSBFNTAwX1RMQl9XSU1HRV9NQVNLICAg
ICgweDFmKQ0KIA0KIHN0cnVjdCB0bGJlX3JlZiB7DQogICAgICAgIHBmbl90IHBmbjsgICAgICAg
ICAgICAgIC8qIHZhbGlkIG9ubHkgZm9yIFRMQjAsIGV4Y2VwdCBicmllZmx5ICovDQpkaWZmIC0t
Z2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdV9ob3N0LmMgYi9hcmNoL3Bvd2VycGMva3Zt
L2U1MDBfbW11X2hvc3QuYw0KaW5kZXggNWNiZGM4Zi4uYTQ4YzEzZiAxMDA2NDQNCi0tLSBhL2Fy
Y2gvcG93ZXJwYy9rdm0vZTUwMF9tbXVfaG9zdC5jDQorKysgYi9hcmNoL3Bvd2VycGMva3ZtL2U1
MDBfbW11X2hvc3QuYw0KQEAgLTQwLDYgKzQwLDg0IEBADQogDQogc3RhdGljIHN0cnVjdCBrdm1w
cGNfZTUwMF90bGJfcGFyYW1zIGhvc3RfdGxiX3BhcmFtc1tFNTAwX1RMQl9OVU1dOw0KIA0KKy8q
DQorICogZmluZF9saW51eF9wdGUgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIGxpbnV4IHB0ZSBm
b3IgYSBnaXZlbg0KKyAqIGVmZmVjdGl2ZSBhZGRyZXNzIGFuZCBkaXJlY3RvcnkuICBJZiBub3Qg
Zm91bmQsIGl0IHJldHVybnMgemVyby4NCisgKi8NCitzdGF0aWMgaW5saW5lIHB0ZV90ICpmaW5k
X2xpbnV4X3B0ZShwZ2RfdCAqcGdkaXIsIHVuc2lnbmVkIGxvbmcgZWEpDQorew0KKyAgICAgICAg
cGdkX3QgKnBnOw0KKyAgICAgICAgcHVkX3QgKnB1Ow0KKyAgICAgICAgcG1kX3QgKnBtOw0KKyAg
ICAgICAgcHRlX3QgKnB0ID0gTlVMTDsNCisNCisgICAgICAgIHBnID0gcGdkaXIgKyBwZ2RfaW5k
ZXgoZWEpOw0KKyAgICAgICAgaWYgKCFwZ2Rfbm9uZSgqcGcpKSB7DQorICAgICAgICAgICAgICAg
IHB1ID0gcHVkX29mZnNldChwZywgZWEpOw0KKyAgICAgICAgICAgICAgICBpZiAoIXB1ZF9ub25l
KCpwdSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwbSA9IHBtZF9vZmZzZXQocHUsIGVh
KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG1kX3ByZXNlbnQoKnBtKSkNCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ID0gcHRlX29mZnNldF9rZXJuZWwocG0sIGVh
KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHB0Ow0K
K30NCisNCisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQ0KK3B0ZV90ICpmaW5kX2xpbnV4X3B0
ZV9vcl9odWdlcHRlKHBnZF90ICpwZ2RpciwgdW5zaWduZWQgbG9uZyBlYSwNCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqc2hpZnQpOw0KKyNlbHNlDQorc3RhdGlj
IGlubGluZSBwdGVfdCAqZmluZF9saW51eF9wdGVfb3JfaHVnZXB0ZShwZ2RfdCAqcGdkaXIsIHVu
c2lnbmVkIGxvbmcgZWEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bnNpZ25lZCAqc2hpZnQpDQorew0KKyAgICAgICAgaWYgKHNoaWZ0KQ0KKyAgICAg
ICAgICAgICAgICAqc2hpZnQgPSAwOw0KKyAgICAgICAgcmV0dXJuIGZpbmRfbGludXhfcHRlKHBn
ZGlyLCBlYSk7DQorfQ0KKyNlbmRpZiAvKiAhQ09ORklHX0hVR0VUTEJfUEFHRSAqLw0KKw0KKy8q
DQorICogTG9jayBhbmQgcmVhZCBhIGxpbnV4IFBURS4gIElmIGl0J3MgcHJlc2VudCBhbmQgd3Jp
dGFibGUsIGF0b21pY2FsbHkNCisgKiBzZXQgZGlydHkgYW5kIHJlZmVyZW5jZWQgYml0cyBhbmQg
cmV0dXJuIHRoZSBQVEUsIG90aGVyd2lzZSByZXR1cm4gMC4NCisgKi8NCitzdGF0aWMgaW5saW5l
IHB0ZV90IGt2bXBwY19yZWFkX3VwZGF0ZV9saW51eF9wdGUocHRlX3QgKnAsIGludCB3cml0aW5n
KQ0KK3sNCisgICAgICAgcHRlX3QgcHRlID0gcHRlX3ZhbCgqcCk7DQorDQorICAgICAgIGlmIChw
dGVfcHJlc2VudChwdGUpKSB7DQorICAgICAgICAgICAgICAgcHRlID0gcHRlX21reW91bmcocHRl
KTsNCisgICAgICAgICAgICAgICBpZiAod3JpdGluZyAmJiBwdGVfd3JpdGUocHRlKSkNCisgICAg
ICAgICAgICAgICAgICAgICAgIHB0ZSA9IHB0ZV9ta2RpcnR5KHB0ZSk7DQorICAgICAgIH0NCisN
CisgICAgICAgKnAgPSBwdGU7DQorDQorICAgICAgIHJldHVybiBwdGU7DQorfQ0KKw0KK3N0YXRp
YyBwdGVfdCBsb29rdXBfbGludXhfcHRlKHBnZF90ICpwZ2RpciwgdW5zaWduZWQgbG9uZyBodmEs
DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3JpdGluZywgdW5zaWduZWQgbG9u
ZyAqcHRlX3NpemVwKQ0KK3sNCisgICAgICAgcHRlX3QgKnB0ZXA7DQorICAgICAgIHVuc2lnbmVk
IGxvbmcgcHMgPSAqcHRlX3NpemVwOw0KKyAgICAgICB1bnNpZ25lZCBpbnQgc2hpZnQ7DQorDQor
ICAgICAgIHB0ZXAgPSBmaW5kX2xpbnV4X3B0ZV9vcl9odWdlcHRlKHBnZGlyLCBodmEsICZzaGlm
dCk7DQorICAgICAgIGlmICghcHRlcCkNCisgICAgICAgICAgICAgICByZXR1cm4gX19wdGUoMCk7
DQorICAgICAgIGlmIChzaGlmdCkNCisgICAgICAgICAgICAgICAqcHRlX3NpemVwID0gMXVsIDw8
IHNoaWZ0Ow0KKyAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgKnB0ZV9zaXplcCA9IFBBR0Vf
U0laRTsNCisNCisgICAgICAgaWYgKHBzID4gKnB0ZV9zaXplcCkNCisgICAgICAgICAgICAgICBy
ZXR1cm4gX19wdGUoMCk7DQorICAgICAgIGlmICghcHRlX3ByZXNlbnQoKnB0ZXApKQ0KKyAgICAg
ICAgICAgICAgIHJldHVybiBfX3B0ZSgwKTsNCisNCisgICAgICAgcmV0dXJuIGt2bXBwY19yZWFk
X3VwZGF0ZV9saW51eF9wdGUocHRlcCwgd3JpdGluZyk7DQorfQ0KKw0KIHN0YXRpYyBpbmxpbmUg
dW5zaWduZWQgaW50IHRsYjFfbWF4X3NoYWRvd19zaXplKHZvaWQpDQogew0KICAgICAgICAvKiBy
ZXNlcnZlIG9uZSBlbnRyeSBmb3IgbWFnaWMgcGFnZSAqLw0KQEAgLTI2MiwxMCArMzQwLDExIEBA
IHN0YXRpYyBpbmxpbmUgaW50IHRsYmVfaXNfd3JpdGFibGUoc3RydWN0IGt2bV9ib29rM2VfMjA2
X3RsYl9lbnRyeSAqdGxiZSkNCiANCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX2U1MDBfcmVm
X3NldHVwKHN0cnVjdCB0bGJlX3JlZiAqcmVmLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX2Jvb2szZV8yMDZfdGxiX2VudHJ5ICpndGxiZSwNCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZuX3QgcGZuKQ0KKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZm5fdCBwZm4sIGludCB3aW1nKQ0K
IHsNCiAgICAgICAgcmVmLT5wZm4gPSBwZm47DQogICAgICAgIHJlZi0+ZmxhZ3MgfD0gRTUwMF9U
TEJfVkFMSUQ7DQorICAgICAgIHJlZi0+ZmxhZ3MgfD0gKGd0bGJlLT5tYXMyICYgTUFTMl9BVFRS
SUJfTUFTSykgfCB3aW1nOw0KIA0KICAgICAgICBpZiAodGxiZV9pc193cml0YWJsZShndGxiZSkp
DQogICAgICAgICAgICAgICAga3ZtX3NldF9wZm5fZGlydHkocGZuKTsNCkBAIC0zMjYsOCArNDA1
LDggQEAgc3RhdGljIHZvaWQga3ZtcHBjX2U1MDBfc2V0dXBfc3RsYmUoDQogDQogICAgICAgIC8q
IEZvcmNlIElQUk9UPTAgZm9yIGFsbCBndWVzdCBtYXBwaW5ncy4gKi8NCiAgICAgICAgc3RsYmUt
Pm1hczEgPSBNQVMxX1RTSVpFKHRzaXplKSB8IGdldF90bGJfc3RzKGd0bGJlKSB8IE1BUzFfVkFM
SUQ7DQotICAgICAgIHN0bGJlLT5tYXMyID0gKGd2YWRkciAmIE1BUzJfRVBOKSB8DQotICAgICAg
ICAgICAgICAgICAgICAgZTUwMF9zaGFkb3dfbWFzMl9hdHRyaWIoZ3RsYmUtPm1hczIsIHBmbik7
DQorICAgICAgIHN0bGJlLT5tYXMyID0gKGd2YWRkciAmIE1BUzJfRVBOKSB8IChyZWYtPmZsYWdz
ICYgRTUwMF9UTEJfV0lNR0VfTUFTSyk7DQorLy8gICAgICAgICAgICAgICAgICAgZTUwMF9zaGFk
b3dfbWFzMl9hdHRyaWIoZ3RsYmUtPm1hczIsIHBmbik7DQogICAgICAgIHN0bGJlLT5tYXM3XzMg
PSAoKHU2NClwZm4gPDwgUEFHRV9TSElGVCkgfA0KICAgICAgICAgICAgICAgICAgICAgICAgZTUw
MF9zaGFkb3dfbWFzM19hdHRyaWIoZ3RsYmUtPm1hczdfMywgcHIpOw0KDQpAQCAtMzQ2LDYgKzQy
NSw4IEBAIHN0YXRpYyBpbmxpbmUgaW50IGt2bXBwY19lNTAwX3NoYWRvd19tYXAoc3RydWN0IGt2
bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMCwNCiAgICAgICAgdW5zaWduZWQgbG9uZyBodmE7DQog
ICAgICAgIGludCBwZm5tYXAgPSAwOw0KICAgICAgICBpbnQgdHNpemUgPSBCT09LM0VfUEFHRVNa
XzRLOw0KKyAgICAgICBwdGVfdCBwdGU7DQorICAgICAgIGludCB3aW1nID0gMDsNCiANCiAgICAg
ICAgLyoNCiAgICAgICAgICogVHJhbnNsYXRlIGd1ZXN0IHBoeXNpY2FsIHRvIHRydWUgcGh5c2lj
YWwsIGFjcXVpcmluZw0KQEAgLTQ1MSw2ICs1MzIsOCBAQCBzdGF0aWMgaW5saW5lIGludCBrdm1w
cGNfZTUwMF9zaGFkb3dfbWFwKHN0cnVjdCBrdm1wcGNfdmNwdV9lNTAwICp2Y3B1X2U1MDAsDQog
DQogICAgICAgIGlmIChsaWtlbHkoIXBmbm1hcCkpIHsNCiAgICAgICAgICAgICAgICB1bnNpZ25l
ZCBsb25nIHRzaXplX3BhZ2VzID0gMSA8PCAodHNpemUgKyAxMCAtIFBBR0VfU0hJRlQpOw0KKyAg
ICAgICAgICAgICAgIHBnZF90ICpwZ2RpcjsNCisNCiAgICAgICAgICAgICAgICBwZm4gPSBnZm5f
dG9fcGZuX21lbXNsb3Qoc2xvdCwgZ2ZuKTsNCiAgICAgICAgICAgICAgICBpZiAoaXNfZXJyb3Jf
bm9zbG90X3BmbihwZm4pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9F
UlIgIkNvdWxkbid0IGdldCByZWFsIHBhZ2UgZm9yIGdmbiAlbHghXG4iLA0KQEAgLTQ2MSw5ICs1
NDQsMTUgQEAgc3RhdGljIGlubGluZSBpbnQga3ZtcHBjX2U1MDBfc2hhZG93X21hcChzdHJ1Y3Qg
a3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwLA0KICAgICAgICAgICAgICAgIC8qIEFsaWduIGd1
ZXN0IGFuZCBwaHlzaWNhbCBhZGRyZXNzIHRvIHBhZ2UgbWFwIGJvdW5kYXJpZXMgKi8NCiAgICAg
ICAgICAgICAgICBwZm4gJj0gfih0c2l6ZV9wYWdlcyAtIDEpOw0KICAgICAgICAgICAgICAgIGd2
YWRkciAmPSB+KCh0c2l6ZV9wYWdlcyA8PCBQQUdFX1NISUZUKSAtIDEpOw0KKyAgICAgICAgICAg
ICAgIHBnZGlyID0gdmNwdV9lNTAwLT52Y3B1LmFyY2gucGdkaXI7DQorICAgICAgICAgICAgICAg
cHRlID0gbG9va3VwX2xpbnV4X3B0ZShwZ2RpciwgaHZhLCAxLCAmdHNpemVfcGFnZXMpOw0KKyAg
ICAgICAgICAgICAgIGlmIChwdGVfcHJlc2VudChwdGUpKQ0KKyAgICAgICAgICAgICAgICAgICAg
ICAgd2ltZyA9IChwdGUgPj4gUFRFX1dJTUdFX1NISUZUKSAmIE1BUzJfV0lNR0VfTUFTSzsNCisg
ICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICAgICB3aW1nID0gTUFTMl9J
IHwgTUFTMl9HOw0KICAgICAgICB9DQogDQotICAgICAgIGt2bXBwY19lNTAwX3JlZl9zZXR1cChy
ZWYsIGd0bGJlLCBwZm4pOw0KKyAgICAgICBrdm1wcGNfZTUwMF9yZWZfc2V0dXAocmVmLCBndGxi
ZSwgcGZuLCB3aW1nKTsNCiANCiAgICAgICAga3ZtcHBjX2U1MDBfc2V0dXBfc3RsYmUoJnZjcHVf
ZTUwMC0+dmNwdSwgZ3RsYmUsIHRzaXplLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZWYsIGd2YWRkciwgc3RsYmUpOw0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0NCg0KDQo+IA0KPiBDaGVlcnMsDQo+IEJlbg0KPiANCj4gDQoNCg==
^ permalink raw reply
* Re: [PATCH] cpuidle: fix unremovable issue for module driver
From: Rafael J. Wysocki @ 2013-07-30 13:33 UTC (permalink / raw)
To: Daniel Lezcano
Cc: Wang Dongsheng-B40534, linuxppc-dev@lists.ozlabs.org,
linux-pm@vger.kernel.org
In-Reply-To: <51F7A152.3030602@linaro.org>
On Tuesday, July 30, 2013 01:19:46 PM Daniel Lezcano wrote:
> On 07/30/2013 12:48 PM, Wang Dongsheng-B40534 wrote:
> >
> >
> >> -----Original Message-----
> >> From: Daniel Lezcano [mailto:daniel.lezcano@linaro.org]
> >> Sent: Tuesday, July 30, 2013 5:28 PM
> >> To: Wang Dongsheng-B40534
> >> Cc: rjw@sisk.pl; linux-pm@vger.kernel.org; linuxppc-dev@lists.ozlabs.org
> >> Subject: Re: [PATCH] cpuidle: fix unremovable issue for module driver
> >>
> >> On 07/30/2013 08:55 AM, Dongsheng Wang wrote:
> >>> From: Wang Dongsheng <dongsheng.wang@freescale.com>
> >>>
> >>> After __cpuidle_register_device, the cpu incs are added up, but decs
> >>> are not, thus the module refcount is not match. So the module "exit"
> >>> function can not be executed when we do remove operation. Move
> >>> module_put into __cpuidle_register_device to fix it.
> >>
> >> Sorry, I still don't get it :/
> >>
> >> register->module_get
> >> unregister->module_put
> >>
> >> you change it by:
> >>
> >> register->module_get
> >> register->module_put
> >> unregister->none
> >>
> >> which is wrong.
> >>
> > module_get->set per cpu incs=1
> > module_put->set per cpu decs=1
> >
> > module_refcount-> incs - decs;
> >
> > "unregister" usually call in module->exit function.
> > But if module_refcount is not zero, the module->exit() cannot be executed.
>
> Ok, IIUC, the refcount is decremented in the unregister function but
> this one is never called because the refcount is not zero.
>
> Funny, that means the module format was *never* used at all as it does
> not work.
>
> I am wondering if we shouldn't just remove the module support for
> cpuidle. Rafael ?
That would be the simplest thing to do and possibly the most correct one too,
but I need to double check how inte_idle/ACPI idle interactions depend on that.
Thanks,
Rafael
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
^ permalink raw reply
* [PATCH v3] powerpc: Update compilation flags with core specific options
From: Catalin Udma @ 2013-07-30 11:39 UTC (permalink / raw)
To: linuxppc-dev; +Cc: Catalin Udma
If CONFIG_E500 is enabled, the compilation flags are updated
specifying the target core -mcpu=e5500/e500mc/8540
Also remove -Wa,-me500, being incompatible with -mcpu=e5500/e6500
The assembler option is redundant if the -mcpu= flag is set.
The patch fixes the kernel compilation problem for e5500/e6500
when using gcc option -mcpu=e5500/e6500.
Signed-off-by: Catalin Udma <catalin.udma@freescale.com>
---
changes for v2:
- update also KBUILD_AFLAGS with -mcpu and -msoft-float flags
changes for v3:
- add -msoft-float to KBUILD_AFLAGS one time instead of adding it
for each e500 core.
arch/powerpc/Makefile | 18 ++++++++++++++++--
1 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 0624909..1893fb9 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -101,7 +101,7 @@ CFLAGS-$(CONFIG_POWER7_CPU) += $(call cc-option,-mcpu=power7)
CFLAGS-$(CONFIG_TUNE_CELL) += $(call cc-option,-mtune=cell)
KBUILD_CPPFLAGS += -Iarch/$(ARCH)
-KBUILD_AFLAGS += -Iarch/$(ARCH)
+KBUILD_AFLAGS += -msoft-float -Iarch/$(ARCH)
KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y)
CPP = $(CC) -E $(KBUILD_CFLAGS)
@@ -140,6 +140,21 @@ ifeq ($(CONFIG_6xx),y)
KBUILD_CFLAGS += -mcpu=powerpc
endif
+ifeq ($(CONFIG_E500),y)
+ifeq ($(CONFIG_64BIT),y)
+KBUILD_CFLAGS += -mcpu=e5500
+KBUILD_AFLAGS += -mcpu=e5500
+else
+ifeq ($(CONFIG_PPC_E500MC),y)
+KBUILD_CFLAGS += -mcpu=e500mc
+KBUILD_AFLAGS += -mcpu=e500mc
+else
+KBUILD_CFLAGS += -mcpu=8540
+KBUILD_AFLAGS += -mcpu=8540
+endif
+endif
+endif
+
# Work around a gcc code-gen bug with -fno-omit-frame-pointer.
ifeq ($(CONFIG_FUNCTION_TRACER),y)
KBUILD_CFLAGS += -mno-sched-epilog
@@ -147,7 +162,6 @@ endif
cpu-as-$(CONFIG_4xx) += -Wa,-m405
cpu-as-$(CONFIG_ALTIVEC) += -Wa,-maltivec
-cpu-as-$(CONFIG_E500) += -Wa,-me500
cpu-as-$(CONFIG_E200) += -Wa,-me200
KBUILD_AFLAGS += $(cpu-as-y)
--
1.7.8
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox