LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH] cpufreq: qoriq: Make the driver usable on all QorIQ platforms
From: Viresh Kumar @ 2014-10-21  9:03 UTC (permalink / raw)
  To: Yuantian Tang
  Cc: linuxppc-dev@ozlabs.org, Rafael J. Wysocki,
	Linux Kernel Mailing List, linux-pm@vger.kernel.org
In-Reply-To: <6aaa50ef5f234fe2896f1c66eb646dfb@DM2PR03MB574.namprd03.prod.outlook.com>

On 21 October 2014 14:29, Yuantian Tang <Yuantian.Tang@freescale.com> wrote:
> If I do so, menuconfig will display like this(on PPC):
>         PowerPC CPU frequency scaling drivers  ----
>     QorIQ CPU Frequency scaling  --->
>                 <*> CPU frequency scaling driver for Freescale QorIQ SoCs
> On ARM, there should be a similar problem.
> Isn't weird?

Similar is true for cpufreq-cpu0 driver as well.. Maybe we can create a
Kconfig.drivers configuration and include it from all architecture specific
ones ?

@ Rafael ?

^ permalink raw reply

* RE: [PATCH] cpufreq: qoriq: Make the driver usable on all QorIQ platforms
From: Yuantian Tang @ 2014-10-21  8:59 UTC (permalink / raw)
  To: Viresh Kumar
  Cc: linuxppc-dev@ozlabs.org, Rafael J. Wysocki,
	Linux Kernel Mailing List, linux-pm@vger.kernel.org
In-Reply-To: <CAKohpokotKSvQ13uU4MnCer+qzBUUbGVTd19y7xswCAEKk3nGQ@mail.gmail.com>

PiA+IC1jb25maWcgUFBDX0NPUkVORVRfQ1BVRlJFUQ0KPiA+IC0gICAgICAgdHJpc3RhdGUgIkNQ
VSBmcmVxdWVuY3kgc2NhbGluZyBkcml2ZXIgZm9yIEZyZWVzY2FsZSBFNTAwTUMgU29DcyINCj4g
PiAtICAgICAgIGRlcGVuZHMgb24gUFBDX0U1MDBNQyAmJiBPRiAmJiBDT01NT05fQ0xLDQo+ID4g
K2NvbmZpZyBRT1JJUV9DUFVGUkVRDQo+ID4gKyAgICAgICB0cmlzdGF0ZSAiQ1BVIGZyZXF1ZW5j
eSBzY2FsaW5nIGRyaXZlciBmb3IgRnJlZXNjYWxlIFFvcklRIFNvQ3MiDQo+ID4gKyAgICAgICBk
ZXBlbmRzIG9uIE9GICYmIENPTU1PTl9DTEsNCj4gPiAgICAgICAgIHNlbGVjdCBDTEtfUFBDX0NP
UkVORVQNCj4gPiAgICAgICAgIGhlbHANCj4gPiAtICAgICAgICAgVGhpcyBhZGRzIHRoZSBDUFVG
cmVxIGRyaXZlciBzdXBwb3J0IGZvciBGcmVlc2NhbGUgZTUwMG1jLA0KPiA+IC0gICAgICAgICBl
NTUwMCBhbmQgZTY1MDAgc2VyaWVzIFNvQ3Mgd2hpY2ggYXJlIGNhcGFibGUgb2YgY2hhbmdpbmcN
Cj4gPiAtICAgICAgICAgdGhlIENQVSdzIGZyZXF1ZW5jeSBkeW5hbWljYWxseS4NCj4gPiArICAg
ICAgICAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBzdXBwb3J0IGZvciBGcmVlc2NhbGUg
UW9ySVEgU29Dcw0KPiA+ICsgICAgICAgICB3aGljaCBhcmUgY2FwYWJsZSBvZiBjaGFuZ2luZyB0
aGUgQ1BVJ3MgZnJlcXVlbmN5IGR5bmFtaWNhbGx5Lg0KPiA+DQo+ID4gIGNvbmZpZyBDUFVfRlJF
UV9QTUFDDQo+ID4gICAgICAgICBib29sICJTdXBwb3J0IGZvciBBcHBsZSBQb3dlckJvb2tzIg0K
PiANCj4gRG9uJ3QgbmVlZCB0aGlzIGR1cGxpY2F0aW9uIGF0IGFsbC4gSnVzdCBtb3ZlIHRoaXMg
dG8gS2NvbmZpZyBpbnN0ZWFkIG9mIC5hcm0gYW5kDQo+IHBwYy4NCj4gDQpJZiBJIGRvIHNvLCBt
ZW51Y29uZmlnIHdpbGwgZGlzcGxheSBsaWtlIHRoaXMob24gUFBDKToNCglQb3dlclBDIENQVSBm
cmVxdWVuY3kgc2NhbGluZyBkcml2ZXJzICAtLS0tICANCiAgICBRb3JJUSBDUFUgRnJlcXVlbmN5
IHNjYWxpbmcgIC0tLT4gICAgDQogIAkJPCo+IENQVSBmcmVxdWVuY3kgc2NhbGluZyBkcml2ZXIg
Zm9yIEZyZWVzY2FsZSBRb3JJUSBTb0NzDQpPbiBBUk0sIHRoZXJlIHNob3VsZCBiZSBhIHNpbWls
YXIgcHJvYmxlbS4NCklzbid0IHdlaXJkPw0KDQpSZWdhcmRzLA0KWXVhbnRpYW4NCgkJDQo+ID4g
ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9wcGMtY29yZW5ldC1jcHVmcmVxLmMNCj4gPiBi
L2RyaXZlcnMvY3B1ZnJlcS9xb3JpcS1jcHVmcmVxLmMNCj4gDQo+ID4gIC8qKg0KPiA+ICAgKiBz
dHJ1Y3QgY3B1X2RhdGEgLSBwZXIgQ1BVIGRhdGEgc3RydWN0IEBAIC02OSw5ICs2OCw2IEBAIHN0
YXRpYw0KPiA+IGNvbnN0IHUzMiAqZm1hc2s7DQo+ID4NCj4gPiAgc3RhdGljIERFRklORV9QRVJf
Q1BVKHN0cnVjdCBjcHVfZGF0YSAqLCBjcHVfZGF0YSk7DQo+ID4NCj4gPiAtLyogY3B1bWFzayBp
biBhIGNsdXN0ZXIgKi8NCj4gPiAtc3RhdGljIERFRklORV9QRVJfQ1BVKGNwdW1hc2tfdmFyX3Qs
IGNwdV9tYXNrKTsNCj4gPiAtDQo+ID4gICNpZm5kZWYgQ09ORklHX1NNUA0KPiA+ICBzdGF0aWMg
aW5saW5lIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfY29yZV9tYXNrKGludCBjcHUpICB7IEBA
DQo+ID4gLTc5LDYgKzc1LDc5IEBAIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNwdW1hc2sg
KmNwdV9jb3JlX21hc2soaW50DQo+ID4gY3B1KSAgfSAgI2VuZGlmDQo+ID4NCj4gPiArI2lmIGRl
ZmluZWQoQ09ORklHX1BQQ19FNTAwTUMpDQo+ID4gK3N0YXRpYyBpbnQgZ2V0X2NwdV9waHlzaWNh
bF9pZChpbnQgY3B1KSB7DQo+ID4gKyAgICAgICByZXR1cm4gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nv
cl9pZChjcHUpOyB9ICNlbGlmDQo+ID4gK2RlZmluZWQoQ09ORklHX0FSTSkNCj4gDQo+IFdvdWxk
bid0IGEgI2Vsc2Ugd29yayBoZXJlIGFzIHRoZXJlIGFyZSBqdXN0IHR3byBwbGF0Zm9ybXMgd2Ug
YXJlIHRhbGtpbmcgYWJvdXQgPw0KPiANCj4gPiArc3RhdGljIGludCBnZXRfY3B1X3BoeXNpY2Fs
X2lkKGludCBjcHUpIHsNCj4gPiArICAgICAgIHJldHVybiB0b3BvbG9neV9jb3JlX2lkKGNwdSk7
DQo+ID4gK30NCj4gPiArI2VuZGlmDQo+ID4gKw0KPiA+ICtzdGF0aWMgdTMyIGdldF9idXNfZnJl
cSh2b2lkKQ0KPiA+ICt7DQo+ID4gKyAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvYzsNCj4g
PiArICAgICAgIHUzMiBzeXNmcmVxOw0KPiA+ICsNCj4gPiArICAgICAgIHNvYyA9IG9mX2ZpbmRf
bm9kZV9ieV90eXBlKE5VTEwsICJzb2MiKTsNCj4gPiArICAgICAgIGlmICghc29jKQ0KPiA+ICsg
ICAgICAgICAgICAgICByZXR1cm4gMDsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAob2ZfcHJvcGVy
dHlfcmVhZF91MzIoc29jLCAiYnVzLWZyZXF1ZW5jeSIsICZzeXNmcmVxKSkNCj4gPiArICAgICAg
ICAgICAgICAgc3lzZnJlcSA9IDA7DQo+ID4gKw0KPiA+ICsgICAgICAgb2Zfbm9kZV9wdXQoc29j
KTsNCj4gPiArDQo+ID4gKyAgICAgICByZXR1cm4gc3lzZnJlcTsNCj4gPiArfQ0KPiA+ICsNCj4g
PiArc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1X3RvX2Nsa19ub2RlKGludCBjcHUpIHsN
Cj4gPiArICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpjbGtfbnA7DQo+ID4gKw0KPiA+
ICsgICAgICAgaWYgKCFjcHVfcHJlc2VudChjcHUpKQ0KPiA+ICsgICAgICAgICAgICAgICByZXR1
cm4gTlVMTDsNCj4gPiArDQo+ID4gKyAgICAgICBucCA9IG9mX2dldF9jcHVfbm9kZShjcHUsIE5V
TEwpOw0KPiA+ICsgICAgICAgaWYgKCFucCkNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIE5V
TEw7DQo+ID4gKw0KPiA+ICsgICAgICAgY2xrX25wID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgImNs
b2NrcyIsIDApOw0KPiA+ICsgICAgICAgaWYgKCFjbGtfbnApDQo+ID4gKyAgICAgICAgICAgICAg
IHJldHVybiBOVUxMOw0KPiA+ICsNCj4gPiArICAgICAgIG9mX25vZGVfcHV0KG5wKTsNCj4gPiAr
DQo+ID4gKyAgICAgICByZXR1cm4gY2xrX25wOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKiB0cmF2
ZXJzZSBjcHUgbm9kZXMgdG8gZ2V0IGNwdSBtYXNrIG9mIHNoYXJpbmcgY2xvY2sgd2lyZSAqLyBz
dGF0aWMNCj4gPiArdm9pZCBzZXRfYWZmZWN0ZWRfY3B1cyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kg
KnBvbGljeSkgew0KPiA+ICsgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCwgKmNsa19ucDsN
Cj4gPiArICAgICAgIHN0cnVjdCBjcHVtYXNrICpkc3RwID0gcG9saWN5LT5jcHVzOw0KPiA+ICsg
ICAgICAgaW50IGk7DQo+ID4gKw0KPiA+ICsgICAgICAgbnAgPSBjcHVfdG9fY2xrX25vZGUocG9s
aWN5LT5jcHUpOw0KPiA+ICsgICAgICAgaWYgKCFucCkNCj4gPiArICAgICAgICAgICAgICAgcmV0
dXJuOw0KPiA+ICsNCj4gPiArICAgICAgIGZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsNCj4gPiAr
ICAgICAgICAgICAgICAgY2xrX25wID0gY3B1X3RvX2Nsa19ub2RlKGkpOw0KPiA+ICsgICAgICAg
ICAgICAgICBpZiAoIWNsa19ucCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIGlmIChjbGtfbnAgPT0gbnApDQo+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgY3B1bWFza19zZXRfY3B1KGksIGRzdHApOw0KPiANCj4gU28g
eW91IGFyZSBkZXBlbmRpbmcgb24gbWF0Y2hpbmcgdGhlIGNsb2NrLW5vZGVzIGZyb20gRFQgZm9y
IGdldHRpbmcgdGhpcw0KPiBpbmZvcm1hdGlvbiwgcmlnaHQgPyBUaGVyZSBpcyBub3RoaW5nIHRo
YXQgdGhlIGFyY2hpdGVjdHVyZSBnaXZlcz8NCj4gDQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAg
ICBvZl9ub2RlX3B1dChjbGtfbnApOw0KPiA+ICsgICAgICAgfQ0KPiA+ICsgICAgICAgb2Zfbm9k
ZV9wdXQobnApOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICAvKiByZWR1Y2UgdGhlIGR1cGxpY2F0ZWQg
ZnJlcXVlbmNpZXMgaW4gZnJlcXVlbmN5IHRhYmxlICovICBzdGF0aWMNCj4gPiB2b2lkIGZyZXFf
dGFibGVfcmVkdXAoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLA0K
PiA+ICAgICAgICAgICAgICAgICBpbnQgY291bnQpDQo+ID4gQEAgLTEwNSw2ICsxNzQsNyBAQCBz
dGF0aWMgdm9pZCBmcmVxX3RhYmxlX3NvcnQoc3RydWN0DQo+IGNwdWZyZXFfZnJlcXVlbmN5X3Rh
YmxlICpmcmVxX3RhYmxlLA0KPiA+ICAgICAgICAgaW50IGksIGosIGluZDsNCj4gPiAgICAgICAg
IHVuc2lnbmVkIGludCBmcmVxLCBtYXhfZnJlcTsNCj4gPiAgICAgICAgIHN0cnVjdCBjcHVmcmVx
X2ZyZXF1ZW5jeV90YWJsZSB0YWJsZTsNCj4gPiArDQo+ID4gICAgICAgICBmb3IgKGkgPSAwOyBp
IDwgY291bnQgLSAxOyBpKyspIHsNCj4gPiAgICAgICAgICAgICAgICAgbWF4X2ZyZXEgPSBmcmVx
X3RhYmxlW2ldLmZyZXF1ZW5jeTsNCj4gPiAgICAgICAgICAgICAgICAgaW5kID0gaTsNCj4gPiBA
QCAtMTI5LDcgKzE5OSw3IEBAIHN0YXRpYyB2b2lkIGZyZXFfdGFibGVfc29ydChzdHJ1Y3QNCj4g
Y3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXFfdGFibGUsDQo+ID4gICAgICAgICB9DQo+ID4g
IH0NCj4gPg0KPiA+IC1zdGF0aWMgaW50IGNvcmVuZXRfY3B1ZnJlcV9jcHVfaW5pdChzdHJ1Y3Qg
Y3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkNCj4gPiArc3RhdGljIGludCBxb3JpcV9jcHVmcmVxX2Nw
dV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQ0KPiA+ICB7DQo+ID4gICAgICAg
ICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOw0KPiA+ICAgICAgICAgaW50IGksIGNvdW50LCByZXQ7
DQo+ID4gQEAgLTE0NSwxMCArMjE1LDggQEAgc3RhdGljIGludCBjb3JlbmV0X2NwdWZyZXFfY3B1
X2luaXQoc3RydWN0DQo+IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpDQo+ID4gICAgICAgICAgICAg
ICAgIHJldHVybiAtRU5PREVWOw0KPiA+DQo+ID4gICAgICAgICBkYXRhID0ga3phbGxvYyhzaXpl
b2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsNCj4gPiAtICAgICAgIGlmICghZGF0YSkgew0KPiA+IC0g
ICAgICAgICAgICAgICBwcl9lcnIoIiVzOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsNCj4gDQo+
IFdhc24ndCB0aGlzIHVzZWZ1bCA/DQo+IA0KPiA+ICsgICAgICAgaWYgKCFkYXRhKQ0KPiA+ICAg
ICAgICAgICAgICAgICBnb3RvIGVycl9ucDsNCj4gPiAtICAgICAgIH0NCj4gPg0KPiA+ICAgICAg
ICAgcG9saWN5LT5jbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsNCj4gPiAgICAgICAgIGlmIChJU19F
UlIocG9saWN5LT5jbGspKSB7DQo+ID4gQEAgLTE3MCw3ICsyMzgsNyBAQCBzdGF0aWMgaW50IGNv
cmVuZXRfY3B1ZnJlcV9jcHVfaW5pdChzdHJ1Y3QNCj4gY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkN
Cj4gPiAgICAgICAgIH0NCj4gPg0KPiA+ICAgICAgICAgaWYgKGZtYXNrKQ0KPiA+IC0gICAgICAg
ICAgICAgICBtYXNrID0gZm1hc2tbZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpXTsNCj4g
PiArICAgICAgICAgICAgICAgbWFzayA9IGZtYXNrW2dldF9jcHVfcGh5c2ljYWxfaWQoY3B1KV07
DQo+ID4gICAgICAgICBlbHNlDQo+ID4gICAgICAgICAgICAgICAgIG1hc2sgPSAweDA7DQo+ID4N
Cj4gPiBAQCAtMjAxLDEzICsyNjksMTMgQEAgc3RhdGljIGludCBjb3JlbmV0X2NwdWZyZXFfY3B1
X2luaXQoc3RydWN0DQo+IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpDQo+ID4gICAgICAgICBkYXRh
LT50YWJsZSA9IHRhYmxlOw0KPiA+DQo+ID4gICAgICAgICAvKiB1cGRhdGUgLT5jcHVzIGlmIHdl
IGhhdmUgY2x1c3Rlciwgbm8gaGFybSBpZiBub3QgKi8NCj4gPiAtICAgICAgIGNwdW1hc2tfY29w
eShwb2xpY3ktPmNwdXMsIHBlcl9jcHUoY3B1X21hc2ssIGNwdSkpOw0KPiA+IC0gICAgICAgZm9y
X2VhY2hfY3B1KGksIHBlcl9jcHUoY3B1X21hc2ssIGNwdSkpDQo+ID4gKyAgICAgICBzZXRfYWZm
ZWN0ZWRfY3B1cyhwb2xpY3kpOw0KPiA+ICsgICAgICAgZm9yX2VhY2hfY3B1KGksIHBvbGljeS0+
Y3B1cykNCj4gPiAgICAgICAgICAgICAgICAgcGVyX2NwdShjcHVfZGF0YSwgaSkgPSBkYXRhOw0K
PiANCj4gR2V0IHJpZCBvZiB0aGlzIHBlci1jcHUgZGF0YSBhbmQgdXNlIHBvbGljeS0+ZHJpdmVy
X2RhdGEgaW5zdGVhZC4NCj4gDQo+ID4NCj4gPiAgICAgICAgIC8qIE1pbmltdW0gdHJhbnNpdGlv
biBsYXRlbmN5IGlzIDEyIHBsYXRmb3JtIGNsb2NrcyAqLw0KPiA+ICAgICAgICAgdTY0dGVtcCA9
IDEyVUxMICogTlNFQ19QRVJfU0VDOw0KPiA+IC0gICAgICAgZG9fZGl2KHU2NHRlbXAsIGZzbF9n
ZXRfc3lzX2ZyZXEoKSk7DQo+ID4gKyAgICAgICBkb19kaXYodTY0dGVtcCwgZ2V0X2J1c19mcmVx
KCkpOw0KPiA+ICAgICAgICAgcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IHU2
NHRlbXAgKyAxOw0KPiA+DQo+ID4gICAgICAgICBvZl9ub2RlX3B1dChucCk7DQo+ID4gQEAgLTIy
Nyw3ICsyOTUsNyBAQCBlcnJfbnA6DQo+ID4gICAgICAgICByZXR1cm4gLUVOT0RFVjsNCj4gPiAg
fQ0KPiA+DQo+ID4gLXN0YXRpYyBpbnQgX19leGl0IGNvcmVuZXRfY3B1ZnJlcV9jcHVfZXhpdChz
dHJ1Y3QgY3B1ZnJlcV9wb2xpY3kNCj4gPiAqcG9saWN5KQ0KPiA+ICtzdGF0aWMgaW50IF9fZXhp
dCBxb3JpcV9jcHVmcmVxX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeQ0KPiA+ICsqcG9s
aWN5KQ0KPiA+ICB7DQo+ID4gICAgICAgICBzdHJ1Y3QgY3B1X2RhdGEgKmRhdGEgPSBwZXJfY3B1
KGNwdV9kYXRhLCBwb2xpY3ktPmNwdSk7DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgY3B1Ow0K
PiA+IEBAIC0yMzYsMTMgKzMwNCwxMyBAQCBzdGF0aWMgaW50IF9fZXhpdCBjb3JlbmV0X2NwdWZy
ZXFfY3B1X2V4aXQoc3RydWN0DQo+IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpDQo+ID4gICAgICAg
ICBrZnJlZShkYXRhLT50YWJsZSk7DQo+ID4gICAgICAgICBrZnJlZShkYXRhKTsNCj4gPg0KPiA+
IC0gICAgICAgZm9yX2VhY2hfY3B1KGNwdSwgcGVyX2NwdShjcHVfbWFzaywgcG9saWN5LT5jcHUp
KQ0KPiA+ICsgICAgICAgZm9yX2VhY2hfY3B1KGNwdSwgcG9saWN5LT5jcHVzKQ0KPiA+ICAgICAg
ICAgICAgICAgICBwZXJfY3B1KGNwdV9kYXRhLCBjcHUpID0gTlVMTDsNCj4gPg0KPiA+ICAgICAg
ICAgcmV0dXJuIDA7DQo+ID4gIH0NCj4gPg0KPiA+IC1zdGF0aWMgaW50IGNvcmVuZXRfY3B1ZnJl
cV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksDQo+ID4gK3N0YXRpYyBpbnQg
cW9yaXFfY3B1ZnJlcV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksDQo+ID4g
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCkNCj4gPiAgew0KPiA+ICAgICAgICAg
c3RydWN0IGNsayAqcGFyZW50Ow0KPiA+IEBAIC0yNTIsMTggKzMyMCwxOCBAQCBzdGF0aWMgaW50
IGNvcmVuZXRfY3B1ZnJlcV90YXJnZXQoc3RydWN0DQo+IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ks
DQo+ID4gICAgICAgICByZXR1cm4gY2xrX3NldF9wYXJlbnQocG9saWN5LT5jbGssIHBhcmVudCk7
ICB9DQo+ID4NCj4gPiAtc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwcGNfY29yZW5ldF9j
cHVmcmVxX2RyaXZlciA9IHsNCj4gPiAtICAgICAgIC5uYW1lICAgICAgICAgICA9ICJwcGNfY3B1
ZnJlcSIsDQo+ID4gK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgcW9yaXFfY3B1ZnJlcV9k
cml2ZXIgPSB7DQo+ID4gKyAgICAgICAubmFtZSAgICAgICAgICAgPSAicW9yaXFfY3B1ZnJlcSIs
DQo+ID4gICAgICAgICAuZmxhZ3MgICAgICAgICAgPSBDUFVGUkVRX0NPTlNUX0xPT1BTLA0KPiA+
IC0gICAgICAgLmluaXQgICAgICAgICAgID0gY29yZW5ldF9jcHVmcmVxX2NwdV9pbml0LA0KPiA+
IC0gICAgICAgLmV4aXQgICAgICAgICAgID0gX19leGl0X3AoY29yZW5ldF9jcHVmcmVxX2NwdV9l
eGl0KSwNCj4gPiArICAgICAgIC5pbml0ICAgICAgICAgICA9IHFvcmlxX2NwdWZyZXFfY3B1X2lu
aXQsDQo+ID4gKyAgICAgICAuZXhpdCAgICAgICAgICAgPSBfX2V4aXRfcChxb3JpcV9jcHVmcmVx
X2NwdV9leGl0KSwNCj4gPiAgICAgICAgIC52ZXJpZnkgICAgICAgICA9IGNwdWZyZXFfZ2VuZXJp
Y19mcmVxdWVuY3lfdGFibGVfdmVyaWZ5LA0KPiA+IC0gICAgICAgLnRhcmdldF9pbmRleCAgID0g
Y29yZW5ldF9jcHVmcmVxX3RhcmdldCwNCj4gPiArICAgICAgIC50YXJnZXRfaW5kZXggICA9IHFv
cmlxX2NwdWZyZXFfdGFyZ2V0LA0KPiA+ICAgICAgICAgLmdldCAgICAgICAgICAgID0gY3B1ZnJl
cV9nZW5lcmljX2dldCwNCj4gPiAgICAgICAgIC5hdHRyICAgICAgICAgICA9IGNwdWZyZXFfZ2Vu
ZXJpY19hdHRyLA0KPiA+ICB9Ow0KPiA+DQo+ID4gLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2
aWNlX2lkIG5vZGVfbWF0Y2hlc1tdIF9faW5pdGRhdGEgPSB7DQo+ID4gK3N0YXRpYyBjb25zdCBz
dHJ1Y3Qgb2ZfZGV2aWNlX2lkIG5vZGVfbWF0Y2hlc1tdIF9faW5pdGNvbnN0ID0gew0KPiA+ICAg
ICAgICAgeyAuY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtY2xvY2tnZW4iLCAuZGF0YSA9ICZzZGF0
YVswXSwgfSwNCj4gPiAgICAgICAgIHsgLmNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWNsb2NrZ2Vu
IiwgLmRhdGEgPSAmc2RhdGFbMF0sIH0sDQo+ID4gICAgICAgICB7IC5jb21wYXRpYmxlID0gImZz
bCxwNTAyMC1jbG9ja2dlbiIsIC5kYXRhID0gJnNkYXRhWzFdLCB9LCBAQA0KPiA+IC0yNzMsNjEg
KzM0MSw0MyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBub2RlX21hdGNoZXNb
XQ0KPiBfX2luaXRkYXRhID0gew0KPiA+ICAgICAgICAge30NCj4gPiAgfTsNCj4gPg0KPiA+IC1z
dGF0aWMgaW50IF9faW5pdCBwcGNfY29yZW5ldF9jcHVmcmVxX2luaXQodm9pZCkNCj4gPiArc3Rh
dGljIGludCBfX2luaXQgcW9yaXFfY3B1ZnJlcV9pbml0KHZvaWQpDQo+ID4gIHsNCj4gPiAgICAg
ICAgIGludCByZXQ7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgICpucDsNCj4gPiAg
ICAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOw0KPiA+ICAgICAgICAgY29u
c3Qgc3RydWN0IHNvY19kYXRhICpkYXRhOw0KPiA+IC0gICAgICAgdW5zaWduZWQgaW50IGNwdTsN
Cj4gPg0KPiA+ICAgICAgICAgbnAgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgbm9kZV9t
YXRjaGVzKTsNCj4gPiAgICAgICAgIGlmICghbnApDQo+ID4gICAgICAgICAgICAgICAgIHJldHVy
biAtRU5PREVWOw0KPiA+DQo+ID4gLSAgICAgICBmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7
DQo+ID4gLSAgICAgICAgICAgICAgIGlmICghYWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1
X21hc2ssIGNwdSksDQo+IEdGUF9LRVJORUwpKQ0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAg
IGdvdG8gZXJyX21hc2s7DQo+ID4gLSAgICAgICAgICAgICAgIGNwdW1hc2tfY29weShwZXJfY3B1
KGNwdV9tYXNrLCBjcHUpLA0KPiBjcHVfY29yZV9tYXNrKGNwdSkpOw0KPiA+IC0gICAgICAgfQ0K
PiA+IC0NCj4gPiAgICAgICAgIG1hdGNoID0gb2ZfbWF0Y2hfbm9kZShub2RlX21hdGNoZXMsIG5w
KTsNCj4gPiAgICAgICAgIGRhdGEgPSBtYXRjaC0+ZGF0YTsNCj4gPiAgICAgICAgIGlmIChkYXRh
KSB7DQo+ID4gICAgICAgICAgICAgICAgIGlmIChkYXRhLT5mbGFnKQ0KPiA+ICAgICAgICAgICAg
ICAgICAgICAgICAgIGZtYXNrID0gZGF0YS0+ZnJlcV9tYXNrOw0KPiA+IC0gICAgICAgICAgICAg
ICBtaW5fY3B1ZnJlcSA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsNCj4gPiArICAgICAgICAgICAgICAg
bWluX2NwdWZyZXEgPSBnZXRfYnVzX2ZyZXEoKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4g
LSAgICAgICAgICAgICAgIG1pbl9jcHVmcmVxID0gZnNsX2dldF9zeXNfZnJlcSgpIC8gMjsNCj4g
PiArICAgICAgICAgICAgICAgbWluX2NwdWZyZXEgPSBnZXRfYnVzX2ZyZXEoKSAvIDI7DQo+ID4g
ICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIG9mX25vZGVfcHV0KG5wKTsNCj4gPg0KPiA+IC0g
ICAgICAgcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBwY19jb3JlbmV0X2NwdWZyZXFf
ZHJpdmVyKTsNCj4gPiArICAgICAgIHJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZxb3Jp
cV9jcHVmcmVxX2RyaXZlcik7DQo+ID4gICAgICAgICBpZiAoIXJldCkNCj4gPiAtICAgICAgICAg
ICAgICAgcHJfaW5mbygiRnJlZXNjYWxlIFBvd2VyUEMgY29yZW5ldCBDUFUgZnJlcXVlbmN5IHNj
YWxpbmcNCj4gZHJpdmVyXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgcHJfaW5mbygiRnJlZXNj
YWxlIFFvcklRIENQVSBmcmVxdWVuY3kgc2NhbGluZw0KPiA+ICsgZHJpdmVyXG4iKTsNCj4gPg0K
PiA+ICAgICAgICAgcmV0dXJuIHJldDsNCj4gPiAtDQo+ID4gLWVycl9tYXNrOg0KPiA+IC0gICAg
ICAgZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkNCj4gPiAtICAgICAgICAgICAgICAgZnJlZV9j
cHVtYXNrX3ZhcihwZXJfY3B1KGNwdV9tYXNrLCBjcHUpKTsNCj4gPiAtDQo+ID4gLSAgICAgICBy
ZXR1cm4gLUVOT01FTTsNCj4gPiAgfQ0KPiA+IC1tb2R1bGVfaW5pdChwcGNfY29yZW5ldF9jcHVm
cmVxX2luaXQpOw0KPiA+ICttb2R1bGVfaW5pdChxb3JpcV9jcHVmcmVxX2luaXQpOw0KPiA+DQo+
ID4gLXN0YXRpYyB2b2lkIF9fZXhpdCBwcGNfY29yZW5ldF9jcHVmcmVxX2V4aXQodm9pZCkNCj4g
PiArc3RhdGljIHZvaWQgX19leGl0IHFvcmlxX2NwdWZyZXFfZXhpdCh2b2lkKQ0KPiA+ICB7DQo+
ID4gLSAgICAgICB1bnNpZ25lZCBpbnQgY3B1Ow0KPiA+IC0NCj4gPiAtICAgICAgIGZvcl9lYWNo
X3Bvc3NpYmxlX2NwdShjcHUpDQo+ID4gLSAgICAgICAgICAgICAgIGZyZWVfY3B1bWFza192YXIo
cGVyX2NwdShjcHVfbWFzaywgY3B1KSk7DQo+ID4gLQ0KPiA+IC0gICAgICAgY3B1ZnJlcV91bnJl
Z2lzdGVyX2RyaXZlcigmcHBjX2NvcmVuZXRfY3B1ZnJlcV9kcml2ZXIpOw0KPiA+ICsgICAgICAg
Y3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcW9yaXFfY3B1ZnJlcV9kcml2ZXIpOw0KPiA+ICB9
DQo+ID4gLW1vZHVsZV9leGl0KHBwY19jb3JlbmV0X2NwdWZyZXFfZXhpdCk7DQo+ID4gK21vZHVs
ZV9leGl0KHFvcmlxX2NwdWZyZXFfZXhpdCk7DQo+ID4NCj4gPiAgTU9EVUxFX0xJQ0VOU0UoIkdQ
TCIpOw0KPiA+ICBNT0RVTEVfQVVUSE9SKCJUYW5nIFl1YW50aWFuIDxZdWFudGlhbi5UYW5nQGZy
ZWVzY2FsZS5jb20+Iik7DQo+ID4gLU1PRFVMRV9ERVNDUklQVElPTigiY3B1ZnJlcSBkcml2ZXIg
Zm9yIEZyZWVzY2FsZSBlNTAwbWMgc2VyaWVzDQo+ID4gU29DcyIpOw0KPiA+ICtNT0RVTEVfREVT
Q1JJUFRJT04oImNwdWZyZXEgZHJpdmVyIGZvciBGcmVlc2NhbGUgUW9ySVEgc2VyaWVzIFNvQ3Mi
KTsNCj4gDQo+ICsgY29tbWVudHMgZnJvbSBLdW1hciBHYWxhIDopDQo=

^ permalink raw reply

* RE: [PATCH] cpufreq: qoriq: Make the driver usable on all QorIQ platforms
From: Yuantian Tang @ 2014-10-21  8:25 UTC (permalink / raw)
  To: Kumar Gala
  Cc: linuxppc-dev@ozlabs.org, viresh.kumar@linaro.org,
	rjw@rjwysocki.net, linux-kernel@vger.kernel.org,
	linux-pm@vger.kernel.org
In-Reply-To: <8F5E4DA7-8A64-4614-91E7-BFB28D91C737@kernel.crashing.org>

> > #ifndef CONFIG_SMP
> > static inline const struct cpumask *cpu_core_mask(int cpu) { @@ -79,6
> > +75,79 @@ static inline const struct cpumask *cpu_core_mask(int cpu) }
> > #endif
> >
> > +#if defined(CONFIG_PPC_E500MC)
>=20
> Probably should just be CONFIG_PPC, but do we need this at all.  Can't we=
 just
> use topology_core_id() on both ARM & PPC?
>=20
topology_core_id() doesn't work on PPC.
This function only supports PPC64 and non-thread SOCs.

I can make it work on PPC, but we are used to use get_hard_smp_processor_id=
() on ppc.

Regards,
Yuantian

> > +static int get_cpu_physical_id(int cpu) {
> > +	return get_hard_smp_processor_id(cpu); } #elif defined(CONFIG_ARM)
> > +static int get_cpu_physical_id(int cpu) {
> > +	return topology_core_id(cpu);
> > +}
> > +#endif
> > +

^ permalink raw reply

* kernel 3.17 - perf build failure
From: leroy christophe @ 2014-10-21  8:12 UTC (permalink / raw)
  To: linux-kernel@vger.kernel.org, LinuxPPC-dev

   LINK     perf
libperf.a(skip-callchain-idx.o): In function `arch_skip_callchain_idx':
/root/gen/trunk/knl/tools/perf/arch/powerpc/util/skip-callchain-idx.c:250: 
undefined reference to `pr_debug'
libperf.a(skip-callchain-idx.o): In function `check_return_addr':
/root/gen/trunk/knl/tools/perf/arch/powerpc/util/skip-callchain-idx.c:188: 
undefined reference to `pr_debug'
libperf.a(skip-callchain-idx.o): In function `arch_skip_callchain_idx':
/root/gen/trunk/knl/tools/perf/arch/powerpc/util/skip-callchain-idx.c:250: 
undefined reference to `pr_debug'
libperf.a(skip-callchain-idx.o): In function `check_return_addr':
/root/gen/trunk/knl/tools/perf/arch/powerpc/util/skip-callchain-idx.c:165: 
undefined reference to `pr_debug'
/root/gen/trunk/knl/tools/perf/arch/powerpc/util/skip-callchain-idx.c:171: 
undefined reference to `pr_debug'
libperf.a(skip-callchain-idx.o):/root/gen/trunk/knl/tools/perf/arch/powerpc/util/skip-callchain-idx.c:101: 
more undefined references to `pr_debug' follow
collect2: ld returned 1 exit status
make[1]: *** [perf] Error 1
make: *** [install] Error 2

^ permalink raw reply

* [PATCH] powerpc, pseries: All events of EPOW_SYSTEM_SHUTDOWN must initiate shutdown
From: Anshuman Khandual @ 2014-10-21  8:11 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: mikey, anton

The current handling of EPOW_SHUTDOWN_ON_UPS event does not shutdown the
system after logging the message. All the events of EPOW_SYSTEM_SHUTDOWN
action code (EPOW_SHUTDOWN_ON_UPS is a part of it) must initiate system
shutdown as per the SPAPR spec. If the LPAR does not shutdown after
receiving this rtas based event, it will expose itself to a forced abrupt
shutdown initiated by the platform firmware. This patch fixes the situation.

Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
 arch/powerpc/platforms/pseries/ras.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c
index 5a4d0fc..b46cab8 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -89,6 +89,8 @@ static void handle_system_shutdown(char event_modifier)
 	case EPOW_SHUTDOWN_ON_UPS:
 		pr_emerg("Loss of power reported by firmware, system is "
 			"running on UPS/battery");
+		pr_emerg("Check RTAS error log for details");
+		orderly_poweroff(true);
 		break;
 
 	case EPOW_SHUTDOWN_LOSS_OF_CRITICAL_FUNCTIONS:
-- 
1.9.3

^ permalink raw reply related

* Re: [PATCH v2 0/3] fix a kernel panic on fsl corenet board when CONFIG_CLK_PPC_CORENET is enabled
From: Kevin Hao @ 2014-10-21  8:10 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Scott Wood, Gerhard Sittig, Mike Turquette, Jingchang Lu
In-Reply-To: <1413699099-25743-1-git-send-email-haokexin@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 307 bytes --]

On Sun, Oct 19, 2014 at 02:11:36PM +0800, Kevin Hao wrote:
> Hi,
> 
> I have done a boot test on p2014rdb and t4240qds boards. I don't have an access
> to mpc512x board, so only build test for that.

I do find a mpc5121ads board in our lab, the kernel boot well with these changes.

Thanks,
Kevin

[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply

* [PATCH] powerpc: Enable NUMA balancing in pseries[_le]_defconfig
From: Michael Neuling @ 2014-10-21  5:32 UTC (permalink / raw)
  To: Michael Ellerman, Benjamin Herrenschmidt; +Cc: linuxppc-dev, Anton Blanchard

This enables NUMA balancing in pseries[_le]_defconfig.

NUMA balancing can do some nasty things with the low level mm code and
has been causing some issues with the cxl driver.  Also distros are
enabling it (eg Ubuntu), so it would be good to get some more test
coverage with it.

Signed-off-by: Michael Neuling <mikey@neuling.org>
--
mpe: This might help us find some bugs in v3.18, but it's probably
     better suited for your next tree.

diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/=
pseries_defconfig
index dd2a9ca..de51828 100644
--- a/arch/powerpc/configs/pseries_defconfig
+++ b/arch/powerpc/configs/pseries_defconfig
@@ -17,6 +17,8 @@ CONFIG_TASK_XACCT=3Dy
 CONFIG_TASK_IO_ACCOUNTING=3Dy
 CONFIG_IKCONFIG=3Dy
 CONFIG_IKCONFIG_PROC=3Dy
+CONFIG_NUMA_BALANCING=3Dy
+CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=3Dy
 CONFIG_CGROUPS=3Dy
 CONFIG_CGROUP_FREEZER=3Dy
 CONFIG_CGROUP_DEVICE=3Dy
diff --git a/arch/powerpc/configs/pseries_le_defconfig b/arch/powerpc/confi=
gs/pseries_le_defconfig
index 63392f4..db0b636 100644
--- a/arch/powerpc/configs/pseries_le_defconfig
+++ b/arch/powerpc/configs/pseries_le_defconfig
@@ -18,6 +18,8 @@ CONFIG_TASK_XACCT=3Dy
 CONFIG_TASK_IO_ACCOUNTING=3Dy
 CONFIG_IKCONFIG=3Dy
 CONFIG_IKCONFIG_PROC=3Dy
+CONFIG_NUMA_BALANCING=3Dy
+CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=3Dy
 CONFIG_CGROUPS=3Dy
 CONFIG_CGROUP_FREEZER=3Dy
 CONFIG_CGROUP_DEVICE=3Dy

^ permalink raw reply related

* Re: powerpc: Wire up sys_bpf() syscall
From: Denis Kirjanov @ 2014-10-21  5:12 UTC (permalink / raw)
  To: Michael Ellerman
  Cc: linux-kernel, Fabian Frederick, Paul Mackerras, Anton Blanchard,
	David Herrmann, Pranith Kumar, linuxppc-dev, Andrew Morton
In-Reply-To: <1413867285.5498.2.camel@concordia>

I don't see any problems with it

On 10/21/14, Michael Ellerman <mpe@ellerman.id.au> wrote:
> On Tue, 2014-10-21 at 08:52 +0400, Denis Kirjanov wrote:
>> We have a test suite under samples/bpf/
>
> Thanks.
>
> I looked under tools/testing/selftests, could it move in there?
>
> cheers
>
>
>


-- 
Regards,
Denis

^ permalink raw reply

* Re: powerpc: Wire up sys_bpf() syscall
From: Denis Kirjanov @ 2014-10-21  5:12 UTC (permalink / raw)
  To: Michael Ellerman
  Cc: linux-kernel, Fabian Frederick, Paul Mackerras, Anton Blanchard,
	David Herrmann, Pranith Kumar, linuxppc-dev, Andrew Morton
In-Reply-To: <1413867285.5498.2.camel@concordia>

I don't see any problems with it

On 10/21/14, Michael Ellerman <mpe@ellerman.id.au> wrote:
> On Tue, 2014-10-21 at 08:52 +0400, Denis Kirjanov wrote:
>> We have a test suite under samples/bpf/
>
> Thanks.
>
> I looked under tools/testing/selftests, could it move in there?
>
> cheers
>
>
>


-- 
Regards,
Denis

^ permalink raw reply

* Re: powerpc: Wire up sys_bpf() syscall
From: Michael Ellerman @ 2014-10-21  4:54 UTC (permalink / raw)
  To: Denis Kirjanov
  Cc: linux-kernel, Fabian Frederick, Paul Mackerras, Anton Blanchard,
	David Herrmann, Pranith Kumar, linuxppc-dev, Andrew Morton
In-Reply-To: <CAHj3AVnj4Etu71egZ30a-KHYdLHjd2S4J8TY0mjHX_Q+BLvLMA@mail.gmail.com>

On Tue, 2014-10-21 at 08:52 +0400, Denis Kirjanov wrote:
> We have a test suite under samples/bpf/

Thanks.

I looked under tools/testing/selftests, could it move in there?

cheers

^ permalink raw reply

* Re: powerpc: Wire up sys_bpf() syscall
From: Denis Kirjanov @ 2014-10-21  4:52 UTC (permalink / raw)
  To: Michael Ellerman
  Cc: linux-kernel, Fabian Frederick, Paul Mackerras, Anton Blanchard,
	David Herrmann, Pranith Kumar, linuxppc-dev, Andrew Morton
In-Reply-To: <20141021043846.8E5D4140092@ozlabs.org>

We have a test suite under samples/bpf/


On 10/21/14, Michael Ellerman <mpe@ellerman.id.au> wrote:
> On Fri, 2014-10-10 at 05:53:45 UTC, Pranith Kumar wrote:
>> This patch wires up the new syscall sys_bpf() on powerpc.
>
> Is there a test suite we can run to verify it works?
>
> cheers
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev


-- 
Regards,
Denis

^ permalink raw reply

* Re: powerpc: Wire up sys_bpf() syscall
From: Michael Ellerman @ 2014-10-21  4:38 UTC (permalink / raw)
  To: Pranith Kumar, Benjamin Herrenschmidt, Paul Mackerras,
	Anton Blanchard, David Herrmann, Andrew Morton, Fabian Frederick,
	linuxppc-dev, linux-kernel
In-Reply-To: <1412920428-29263-1-git-send-email-bobby.prani@gmail.com>

On Fri, 2014-10-10 at 05:53:45 UTC, Pranith Kumar wrote:
> This patch wires up the new syscall sys_bpf() on powerpc.

Is there a test suite we can run to verify it works?

cheers

^ permalink raw reply

* Re: [2/2] powerpc/numa: ensure per-cpu NUMA mappings are correct on topology update
From: Michael Ellerman @ 2014-10-21  4:36 UTC (permalink / raw)
  To: Nishanth Aravamudan
  Cc: linuxppc-dev, Paul Mackerras, Michael Wang, Li Zhong, jstancek
In-Reply-To: <20141018005040.GB3969@linux.vnet.ibm.com>

On Sat, 2014-18-10 at 00:50:40 UTC, Nishanth Aravamudan wrote:
> We received a report of warning in kernel/sched/core.c where the sched
> group was NULL on an LPAR after a topology update. This seems to occur
> because after the topology update has moved the CPUs, cpu_to_node is
> returning the old value still, which ends up breaking the consistency of
> the NUMA topology in the per-cpu maps. Ensure that we update the per-cpu
> fields when we re-map CPUs.

This looks like a bug fix, I assume you want it to go in for 3.18 ?

cheers

^ permalink raw reply

* [PATCH v2 08/47] kernel: Move pm_power_off to common code
From: Guenter Roeck @ 2014-10-21  4:12 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-mips, linux-ia64, linux-sh, linux, sparclinux, linux-s390,
	linux-am33-list, linux-c6x-dev, linux-hexagon, x86, xen-devel,
	Guenter Roeck, linux-xtensa, user-mode-linux-devel, linux-pm,
	adi-buildroot-devel, linux-m68k, user-mode-linux-user,
	linux-metag, linux-arm-kernel, linux-parisc, linux-cris-kernel,
	linux-alpha, linux390, linuxppc-dev
In-Reply-To: <1413864783-3271-1-git-send-email-linux@roeck-us.net>

pm_power_off is defined for all architectures. Move it to common code.

Have all architectures call do_kernel_power_off instead of pm_power_off.
Some architectures point pm_power_off to machine_power_off. For those,
call do_kernel_power_off from machine_power_off instead.

Acked-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Hirokazu Takata <takata@linux-m32r.org>
Acked-by: Jesper Nilsson <jesper.nilsson@axis.com>
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
Acked-by: Rafael J. Wysocki <rjw@rjwysocki.net>
Acked-by: Richard Weinberger <richard@nod.at>
Acked-by: Xuetao Guan <gxt@mprc.pku.edu.cn>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v2:
- do_kernel_poweroff -> do_kernel_power_off
- have_kernel_poweroff -> have_kernel_power_off

 arch/alpha/kernel/process.c        |  9 +++------
 arch/arc/kernel/reset.c            |  5 +----
 arch/arm/kernel/process.c          |  5 +----
 arch/arm64/kernel/process.c        |  5 +----
 arch/avr32/kernel/process.c        |  6 +-----
 arch/blackfin/kernel/process.c     |  3 ---
 arch/blackfin/kernel/reboot.c      |  2 ++
 arch/c6x/kernel/process.c          |  9 +--------
 arch/cris/kernel/process.c         |  4 +---
 arch/frv/kernel/process.c          |  5 ++---
 arch/hexagon/kernel/reset.c        |  5 ++---
 arch/ia64/kernel/process.c         |  5 +----
 arch/m32r/kernel/process.c         |  8 ++++----
 arch/m68k/kernel/process.c         |  6 +-----
 arch/metag/kernel/process.c        |  6 +-----
 arch/microblaze/kernel/process.c   |  3 ---
 arch/microblaze/kernel/reset.c     |  1 +
 arch/mips/kernel/reset.c           |  6 +-----
 arch/mn10300/kernel/process.c      |  8 ++------
 arch/openrisc/kernel/process.c     |  8 +++++---
 arch/parisc/kernel/process.c       |  8 ++++----
 arch/powerpc/kernel/setup-common.c |  6 +++---
 arch/s390/kernel/setup.c           |  8 ++------
 arch/score/kernel/process.c        |  8 ++++----
 arch/sh/kernel/reboot.c            |  6 +-----
 arch/sparc/kernel/process_32.c     | 10 ++--------
 arch/sparc/kernel/reboot.c         |  8 ++------
 arch/tile/kernel/reboot.c          |  7 +++----
 arch/um/kernel/reboot.c            |  2 --
 arch/unicore32/kernel/process.c    |  9 +--------
 arch/x86/kernel/reboot.c           | 11 +++--------
 arch/x86/xen/enlighten.c           |  3 +--
 arch/xtensa/kernel/process.c       |  4 ----
 drivers/parisc/power.c             |  3 +--
 kernel/power/poweroff_handler.c    |  8 ++++++++
 kernel/reboot.c                    |  4 ++--
 36 files changed, 68 insertions(+), 146 deletions(-)

diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
index 1941a07..81c43f8 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -24,6 +24,7 @@
 #include <linux/vt.h>
 #include <linux/mman.h>
 #include <linux/elfcore.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
 #include <linux/tty.h>
 #include <linux/console.h>
@@ -40,12 +41,6 @@
 #include "proto.h"
 #include "pci_impl.h"
 
-/*
- * Power off function, if any
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 #ifdef CONFIG_ALPHA_WTINT
 /*
  * Sleep the CPU.
@@ -184,6 +179,8 @@ machine_halt(void)
 void
 machine_power_off(void)
 {
+	do_kernel_power_off();
+
 	common_shutdown(LINUX_REBOOT_CMD_POWER_OFF, NULL);
 }
 
diff --git a/arch/arc/kernel/reset.c b/arch/arc/kernel/reset.c
index 2768fa1..0758d9d 100644
--- a/arch/arc/kernel/reset.c
+++ b/arch/arc/kernel/reset.c
@@ -26,9 +26,6 @@ void machine_restart(char *__unused)
 
 void machine_power_off(void)
 {
-	/* FIXME ::  power off ??? */
+	do_kernel_power_off();
 	machine_halt();
 }
-
-void (*pm_power_off) (void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index fe972a2..aa3f656 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -117,8 +117,6 @@ void soft_restart(unsigned long addr)
 /*
  * Function pointers to optional machine specific functions
  */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
 
 void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
 
@@ -205,8 +203,7 @@ void machine_power_off(void)
 	local_irq_disable();
 	smp_send_stop();
 
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 /*
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index c3065db..46a483a 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -68,8 +68,6 @@ void soft_restart(unsigned long addr)
 /*
  * Function pointers to optional machine specific functions
  */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL_GPL(pm_power_off);
 
 void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
 
@@ -129,8 +127,7 @@ void machine_power_off(void)
 {
 	local_irq_disable();
 	smp_send_stop();
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 /*
diff --git a/arch/avr32/kernel/process.c b/arch/avr32/kernel/process.c
index 42a53e74..529c1f6 100644
--- a/arch/avr32/kernel/process.c
+++ b/arch/avr32/kernel/process.c
@@ -23,9 +23,6 @@
 
 #include <mach/pm.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * This file handles the architecture-dependent parts of process handling..
  */
@@ -48,8 +45,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 void machine_restart(char *cmd)
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c
index 4aa5545..812dd83 100644
--- a/arch/blackfin/kernel/process.c
+++ b/arch/blackfin/kernel/process.c
@@ -39,9 +39,6 @@ int nr_l1stack_tasks;
 void *l1_stack_base;
 unsigned long l1_stack_len;
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * The idle loop on BFIN
  */
diff --git a/arch/blackfin/kernel/reboot.c b/arch/blackfin/kernel/reboot.c
index c4f50a3..387d610 100644
--- a/arch/blackfin/kernel/reboot.c
+++ b/arch/blackfin/kernel/reboot.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/interrupt.h>
+#include <linux/pm.h>
 #include <asm/bfin-global.h>
 #include <asm/reboot.h>
 #include <asm/bfrom.h>
@@ -106,6 +107,7 @@ void machine_halt(void)
 __attribute__((weak))
 void native_machine_power_off(void)
 {
+	do_kernel_power_off();
 	idle_with_irq_disabled();
 }
 
diff --git a/arch/c6x/kernel/process.c b/arch/c6x/kernel/process.c
index 57d2ea8..edf7e5a 100644
--- a/arch/c6x/kernel/process.c
+++ b/arch/c6x/kernel/process.c
@@ -27,12 +27,6 @@ void	(*c6x_halt)(void);
 extern asmlinkage void ret_from_fork(void);
 extern asmlinkage void ret_from_kernel_thread(void);
 
-/*
- * power off function, if any
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 void arch_cpu_idle(void)
 {
 	unsigned long tmp;
@@ -73,8 +67,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	halt_loop();
 }
 
diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
index b78498e..9ebd76b 100644
--- a/arch/cris/kernel/process.c
+++ b/arch/cris/kernel/process.c
@@ -31,9 +31,6 @@
 
 extern void default_idle(void);
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 void arch_cpu_idle(void)
 {
 	default_idle();
@@ -60,6 +57,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
+	do_kernel_power_off();
 }
 
 /*
diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
index 5d40aeb77..502dabb 100644
--- a/arch/frv/kernel/process.c
+++ b/arch/frv/kernel/process.c
@@ -42,9 +42,6 @@ asmlinkage void ret_from_kernel_thread(void);
 
 #include <asm/pgalloc.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 static void core_sleep_idle(void)
 {
 #ifdef LED_DEBUG_SLEEP
@@ -107,6 +104,8 @@ void machine_power_off(void)
 	gdbstub_exit(0);
 #endif
 
+	do_kernel_power_off();
+
 	for (;;);
 }
 
diff --git a/arch/hexagon/kernel/reset.c b/arch/hexagon/kernel/reset.c
index 76483c1..6f607b6 100644
--- a/arch/hexagon/kernel/reset.c
+++ b/arch/hexagon/kernel/reset.c
@@ -16,11 +16,13 @@
  * 02110-1301, USA.
  */
 
+#include <linux/pm.h>
 #include <linux/smp.h>
 #include <asm/hexagon_vm.h>
 
 void machine_power_off(void)
 {
+	do_kernel_power_off();
 	smp_send_stop();
 	__vmstop();
 }
@@ -32,6 +34,3 @@ void machine_halt(void)
 void machine_restart(char *cmd)
 {
 }
-
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
index b515149..88121a2 100644
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -57,8 +57,6 @@ void (*ia64_mark_idle)(int);
 
 unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;
 EXPORT_SYMBOL(boot_option_idle_override);
-void (*pm_power_off) (void);
-EXPORT_SYMBOL(pm_power_off);
 
 void
 ia64_do_show_stack (struct unw_frame_info *info, void *arg)
@@ -675,8 +673,7 @@ machine_halt (void)
 void
 machine_power_off (void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	machine_halt();
 }
 
diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c
index e69221d..65a037e 100644
--- a/arch/m32r/kernel/process.c
+++ b/arch/m32r/kernel/process.c
@@ -23,6 +23,7 @@
 #include <linux/fs.h>
 #include <linux/slab.h>
 #include <linux/module.h>
+#include <linux/pm.h>
 #include <linux/ptrace.h>
 #include <linux/unistd.h>
 #include <linux/hardirq.h>
@@ -44,9 +45,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
 	return tsk->thread.lr;
 }
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 void machine_restart(char *__unused)
 {
 #if defined(CONFIG_PLAT_MAPPI3)
@@ -67,7 +65,9 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	/* M32R_FIXME */
+	do_kernel_power_off();
+	for (;;)
+		;
 }
 
 void show_regs(struct pt_regs * regs)
diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
index afe3d6e..bbc0a63 100644
--- a/arch/m68k/kernel/process.c
+++ b/arch/m68k/kernel/process.c
@@ -78,14 +78,10 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	for (;;);
 }
 
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 void show_regs(struct pt_regs * regs)
 {
 	printk("\n");
diff --git a/arch/metag/kernel/process.c b/arch/metag/kernel/process.c
index 483dff9..8d95773 100644
--- a/arch/metag/kernel/process.c
+++ b/arch/metag/kernel/process.c
@@ -67,9 +67,6 @@ void arch_cpu_idle_dead(void)
 }
 #endif
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 void (*soc_restart)(char *cmd);
 void (*soc_halt)(void);
 
@@ -90,8 +87,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	smp_send_stop();
 	hard_processor_halt(HALT_OK);
 }
diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c
index b2dd371..0ebca36 100644
--- a/arch/microblaze/kernel/process.c
+++ b/arch/microblaze/kernel/process.c
@@ -44,9 +44,6 @@ void show_regs(struct pt_regs *regs)
 				regs->msr, regs->ear, regs->esr, regs->fsr);
 }
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 void flush_thread(void)
 {
 }
diff --git a/arch/microblaze/kernel/reset.c b/arch/microblaze/kernel/reset.c
index fbe58c6..2c6b32c 100644
--- a/arch/microblaze/kernel/reset.c
+++ b/arch/microblaze/kernel/reset.c
@@ -103,6 +103,7 @@ void machine_halt(void)
 void machine_power_off(void)
 {
 	pr_notice("Machine power off...\n");
+	do_kernel_power_off();
 	while (1)
 		;
 }
diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
index 07fc524..09e74d2 100644
--- a/arch/mips/kernel/reset.c
+++ b/arch/mips/kernel/reset.c
@@ -21,9 +21,6 @@
  */
 void (*_machine_restart)(char *command);
 void (*_machine_halt)(void);
-void (*pm_power_off)(void);
-
-EXPORT_SYMBOL(pm_power_off);
 
 void machine_restart(char *command)
 {
@@ -39,6 +36,5 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c
index 3707da5..c78b2eb 100644
--- a/arch/mn10300/kernel/process.c
+++ b/arch/mn10300/kernel/process.c
@@ -20,6 +20,7 @@
 #include <linux/user.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
 #include <linux/percpu.h>
 #include <linux/err.h>
@@ -45,12 +46,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
 }
 
 /*
- * power off function, if any
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
-/*
  * On SMP it's slightly faster (but much more power-consuming!)
  * to poll the ->work.need_resched flag instead of waiting for the
  * cross-CPU IPI to arrive. Use this option with caution.
@@ -93,6 +88,7 @@ void machine_power_off(void)
 #ifdef CONFIG_KERNEL_DEBUGGER
 	gdbstub_exit(0);
 #endif
+	do_kernel_power_off();
 }
 
 void show_regs(struct pt_regs *regs)
diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
index 386af25..494afd2 100644
--- a/arch/openrisc/kernel/process.c
+++ b/arch/openrisc/kernel/process.c
@@ -25,6 +25,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/mm.h>
+#include <linux/pm.h>
 #include <linux/stddef.h>
 #include <linux/unistd.h>
 #include <linux/ptrace.h>
@@ -51,7 +52,7 @@
  */
 struct thread_info *current_thread_info_set[NR_CPUS] = { &init_thread_info, };
 
-void machine_restart(void)
+void machine_restart(char *cmd)
 {
 	printk(KERN_INFO "*** MACHINE RESTART ***\n");
 	__asm__("l.nop 1");
@@ -72,11 +73,12 @@ void machine_halt(void)
 void machine_power_off(void)
 {
 	printk(KERN_INFO "*** MACHINE POWER OFF ***\n");
+
+	do_kernel_power_off();
+
 	__asm__("l.nop 1");
 }
 
-void (*pm_power_off) (void) = machine_power_off;
-
 /*
  * When a process does an "exec", machine state like FPU and debug
  * registers need to be reset.  This is a hook function for that.
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
index 0bbbf0d..3f5d14a 100644
--- a/arch/parisc/kernel/process.c
+++ b/arch/parisc/kernel/process.c
@@ -41,6 +41,7 @@
 #include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/personality.h>
+#include <linux/pm.h>
 #include <linux/ptrace.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
@@ -133,7 +134,9 @@ void machine_power_off(void)
 	pdc_soft_power_button(0);
 	
 	pdc_chassis_send_status(PDC_CHASSIS_DIRECT_SHUTDOWN);
-		
+
+	do_kernel_power_off();
+
 	/* It seems we have no way to power the system off via
 	 * software. The user has to press the button himself. */
 
@@ -141,9 +144,6 @@ void machine_power_off(void)
 	       "Please power this system off now.");
 }
 
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * Free current thread data structures etc..
  */
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index 1362cd6..5b7a851 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -141,6 +141,9 @@ void machine_power_off(void)
 	machine_shutdown();
 	if (ppc_md.power_off)
 		ppc_md.power_off();
+
+	do_kernel_power_off();
+
 #ifdef CONFIG_SMP
 	smp_send_stop();
 #endif
@@ -151,9 +154,6 @@ void machine_power_off(void)
 /* Used by the G5 thermal driver */
 EXPORT_SYMBOL_GPL(machine_power_off);
 
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL_GPL(pm_power_off);
-
 void machine_halt(void)
 {
 	machine_shutdown();
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index e80d9ff..267e025 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -263,13 +263,9 @@ void machine_power_off(void)
 		 */
 		console_unblank();
 	_machine_power_off();
-}
 
-/*
- * Dummy power off function.
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL_GPL(pm_power_off);
+	do_kernel_power_off();
+}
 
 static int __init early_parse_mem(char *p)
 {
diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c
index a1519ad3..b76ea67 100644
--- a/arch/score/kernel/process.c
+++ b/arch/score/kernel/process.c
@@ -29,9 +29,6 @@
 #include <linux/pm.h>
 #include <linux/rcupdate.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 /* If or when software machine-restart is implemented, add code here. */
 void machine_restart(char *command) {}
 
@@ -39,7 +36,10 @@ void machine_restart(char *command) {}
 void machine_halt(void) {}
 
 /* If or when software machine-power-off is implemented, add code here. */
-void machine_power_off(void) {}
+void machine_power_off(void)
+{
+	do_kernel_power_off();
+}
 
 void ret_from_fork(void);
 void ret_from_kernel_thread(void);
diff --git a/arch/sh/kernel/reboot.c b/arch/sh/kernel/reboot.c
index 04afe5b..065de12 100644
--- a/arch/sh/kernel/reboot.c
+++ b/arch/sh/kernel/reboot.c
@@ -11,9 +11,6 @@
 #include <asm/tlbflush.h>
 #include <asm/traps.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 #ifdef CONFIG_SUPERH32
 static void watchdog_trigger_immediate(void)
 {
@@ -51,8 +48,7 @@ static void native_machine_shutdown(void)
 
 static void native_machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 static void native_machine_halt(void)
diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c
index 50e7b62..cb8148a 100644
--- a/arch/sparc/kernel/process_32.c
+++ b/arch/sparc/kernel/process_32.c
@@ -48,14 +48,6 @@
  */
 void (*sparc_idle)(void);
 
-/* 
- * Power-off handler instantiation for pm.h compliance
- * This is done via auxio, but could be used as a fallback
- * handler when auxio is not present-- unused for now...
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * sysctl - toggle power-off restriction for serial console 
  * systems in machine_power_off()
@@ -112,6 +104,8 @@ void machine_power_off(void)
 		sbus_writeb(power_register, auxio_power_register);
 	}
 
+	do_kernel_power_off();
+
 	machine_halt();
 }
 
diff --git a/arch/sparc/kernel/reboot.c b/arch/sparc/kernel/reboot.c
index eba7d91..3c0bb03 100644
--- a/arch/sparc/kernel/reboot.c
+++ b/arch/sparc/kernel/reboot.c
@@ -16,17 +16,13 @@
  */
 int scons_pwroff = 1;
 
-/* This isn't actually used, it exists merely to satisfy the
- * reference in kernel/sys.c
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 void machine_power_off(void)
 {
 	if (strcmp(of_console_device->type, "serial") || scons_pwroff)
 		prom_halt_power_off();
 
+	do_kernel_power_off();
+
 	prom_halt();
 }
 
diff --git a/arch/tile/kernel/reboot.c b/arch/tile/kernel/reboot.c
index 6c5d2c0..8ff4a7f 100644
--- a/arch/tile/kernel/reboot.c
+++ b/arch/tile/kernel/reboot.c
@@ -36,6 +36,9 @@ void machine_power_off(void)
 {
 	arch_local_irq_disable_all();
 	smp_send_stop();
+
+	do_kernel_power_off();
+
 	hv_power_off();
 }
 
@@ -45,7 +48,3 @@ void machine_restart(char *cmd)
 	smp_send_stop();
 	hv_restart((HV_VirtAddr) "vmlinux", (HV_VirtAddr) cmd);
 }
-
-/* No interesting distinction to be made here. */
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/um/kernel/reboot.c b/arch/um/kernel/reboot.c
index ced8903..a82ef28 100644
--- a/arch/um/kernel/reboot.c
+++ b/arch/um/kernel/reboot.c
@@ -11,8 +11,6 @@
 #include <os.h>
 #include <skas.h>
 
-void (*pm_power_off)(void);
-
 static void kill_off_processes(void)
 {
 	if (proc_mm)
diff --git a/arch/unicore32/kernel/process.c b/arch/unicore32/kernel/process.c
index b008e99..9490dd5 100644
--- a/arch/unicore32/kernel/process.c
+++ b/arch/unicore32/kernel/process.c
@@ -56,16 +56,9 @@ void machine_halt(void)
 	gpio_set_value(GPO_SOFT_OFF, 0);
 }
 
-/*
- * Function pointers to optional machine specific functions
- */
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	machine_halt();
 }
 
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index 17962e6..5c09e28 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -30,12 +30,6 @@
 #include <asm/x86_init.h>
 #include <asm/efi.h>
 
-/*
- * Power off function, if any
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 static const struct desc_ptr no_idt = {};
 
 /*
@@ -647,11 +641,12 @@ static void native_machine_halt(void)
 
 static void native_machine_power_off(void)
 {
-	if (pm_power_off) {
+	if (have_kernel_power_off()) {
 		if (!reboot_force)
 			machine_shutdown();
-		pm_power_off();
+		do_kernel_power_off();
 	}
+
 	/* A fallback in case there is no PM info available */
 	tboot_shutdown(TB_SHUTDOWN_HALT);
 }
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 1a3f044..c2c1d74 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -1320,8 +1320,7 @@ static void xen_machine_halt(void)
 
 static void xen_machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	xen_reboot(SHUTDOWN_poweroff);
 }
 
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
index 1c85323..c487296 100644
--- a/arch/xtensa/kernel/process.c
+++ b/arch/xtensa/kernel/process.c
@@ -49,10 +49,6 @@ extern void ret_from_kernel_thread(void);
 
 struct task_struct *current_set[NR_CPUS] = {&init_task, };
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
-
 #if XTENSA_HAVE_COPROCESSORS
 
 void coprocessor_release_all(struct thread_info *ti)
diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c
index ef31b77..f10cf92 100644
--- a/drivers/parisc/power.c
+++ b/drivers/parisc/power.c
@@ -95,8 +95,7 @@ static void process_shutdown(void)
 		/* send kill signal */
 		if (kill_cad_pid(SIGINT, 1)) {
 			/* just in case killing init process failed */
-			if (pm_power_off)
-				pm_power_off();
+			kernel_power_off();
 		}
 	}
 }
diff --git a/kernel/power/poweroff_handler.c b/kernel/power/poweroff_handler.c
index aeb4736..37f0b88 100644
--- a/kernel/power/poweroff_handler.c
+++ b/kernel/power/poweroff_handler.c
@@ -22,6 +22,12 @@
 #include <linux/types.h>
 
 /*
+ * If set, calling this function will power off the system immediately.
+ */
+void (*pm_power_off)(void);
+EXPORT_SYMBOL(pm_power_off);
+
+/*
  *	Notifier list for kernel code which wants to be called
  *	to power off the system.
  */
@@ -236,6 +242,8 @@ EXPORT_SYMBOL(devm_register_power_off_handler);
 void do_kernel_power_off(void)
 {
 	spin_lock(&power_off_handler_lock);
+	if (pm_power_off)
+		pm_power_off();
 	raw_notifier_call_chain(&power_off_handler_list, 0, NULL);
 	spin_unlock(&power_off_handler_lock);
 }
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 5925f5a..0930851 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -306,9 +306,9 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
 		return ret;
 
 	/* Instead of trying to make the power_off code look like
-	 * halt when pm_power_off is not set do it the easy way.
+	 * halt when no poweroff handler exists do it the easy way.
 	 */
-	if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
+	if (cmd == LINUX_REBOOT_CMD_POWER_OFF && !have_kernel_power_off())
 		cmd = LINUX_REBOOT_CMD_HALT;
 
 	mutex_lock(&reboot_mutex);
-- 
1.9.1

^ permalink raw reply related

* Re: [PATCH v3 04/27] arm/MSI: Save MSI chip in pci_sys_data
From: Yijing Wang @ 2014-10-21  1:32 UTC (permalink / raw)
  To: Lorenzo Pieralisi
  Cc: linux-mips@linux-mips.org, linux-ia64@vger.kernel.org,
	linux-pci@vger.kernel.org, Bharat.Bhushan@freescale.com,
	Thierry Reding, sparclinux@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-s390@vger.kernel.org,
	Russell King, Joerg Roedel, x86@kernel.org, Sebastian Ott,
	xen-devel@lists.xenproject.org, arnab.basu@freescale.com,
	Liviu Dudau, Arnd Bergmann, Konrad Rzeszutek Wilk, Chris Metcalf,
	Bjorn Helgaas, Thomas Gleixner,
	linux-arm-kernel@lists.infradead.org, Thomas Petazzoni,
	huxinwei@huawei.com, Tony Luck, Sergei Shtylyov,
	linux-kernel@vger.kernel.org, Ralf Baechle,
	iommu@lists.linux-foundation.org, David Vrabel, Wuyun,
	linuxppc-dev@lists.ozlabs.org, David S. Miller, Lucas Stach
In-Reply-To: <20141020172158.GA8017@e102568-lin.cambridge.arm.com>

On 2014/10/21 1:21, Lorenzo Pieralisi wrote:
> On Wed, Oct 15, 2014 at 04:06:52AM +0100, Yijing Wang wrote:
>> Saving msi chip in pci_sys_data can make pci bus and
>> devices don't need to know msi chip detail, it also
>> make pci enumeration code be decoupled from msi chip.
>> In fact, all pci devices under the same pci hostbridge
>> share same msi chip. So msi chip should be seen as one
>> of resources or attributes to be initialized in pci host
>> bridge driver. Currently, pci hostbridge drivers create
>> pci_host_bridge in pci_create_root_bus(), and pass arch
>> specific pci sysdata to core pci scan functions. So pci
>> arch sysdata is good place to save msi chip.
>>
>> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
>> ---
>>  arch/arm/include/asm/mach/pci.h |    6 ++++++
>>  arch/arm/include/asm/pci.h      |    9 +++++++++
>>  arch/arm/kernel/bios32.c        |    3 +++
>>  drivers/pci/msi.c               |    6 ++++++
>>  include/linux/pci.h             |    9 +++++++++
>>  5 files changed, 33 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/pci.h
>> index 7fc4278..59b0d87 100644
>> --- a/arch/arm/include/asm/mach/pci.h
>> +++ b/arch/arm/include/asm/mach/pci.h
>> @@ -22,6 +22,9 @@ struct hw_pci {
>>  #ifdef CONFIG_PCI_DOMAINS
>>  	int		domain;
>>  #endif
>> +#ifdef CONFIG_PCI_MSI
>> +	struct msi_chip *msi_chip;
>> +#endif
>>  	struct pci_ops	*ops;
>>  	int		nr_controllers;
>>  	void		**private_data;
>> @@ -47,6 +50,9 @@ struct pci_sys_data {
>>  #ifdef CONFIG_PCI_DOMAINS
>>  	int		domain;
>>  #endif
>> +#ifdef CONFIG_PCI_MSI
>> +	struct msi_chip *msi_chip;
>> +#endif
> 
> This struct is defined for ARM only. We are trying to remove dependency on it
> so that we can have a single driver for ARM32 and ARM64 systems without
> pcibios dependency. Why can't we add this msi chip data to the host
> bridge struct instead ? I understand it is all a matter of how to pass
> the pointer to pci_scan_root_bus(), where the bridge is created.
> We could initialize the msi chip on the bridge through the bus pointer
> returned by the pci_scan_root_bus() function.

As mentioned in Patch 0, I will refactor generic pci hostbridge in another series,
We need not only save msi_chip into pci_host_bridge, and other common info, like domain_nr,
resources.

Thanks!
Yijing.

> 
> Thanks,
> Lorenzo
> 
>>  	struct list_head node;
>>  	int		busnr;		/* primary bus number			*/
>>  	u64		mem_offset;	/* bus->cpu memory mapping offset	*/
>> diff --git a/arch/arm/include/asm/pci.h b/arch/arm/include/asm/pci.h
>> index 7e95d85..b562c09 100644
>> --- a/arch/arm/include/asm/pci.h
>> +++ b/arch/arm/include/asm/pci.h
>> @@ -31,6 +31,15 @@ static inline int pci_proc_domain(struct pci_bus *bus)
>>  }
>>  #endif /* CONFIG_PCI_DOMAINS */
>>  
>> +#ifdef CONFIG_PCI_MSI
>> +static inline struct msi_chip *pci_msi_chip(struct pci_bus *bus)
>> +{
>> +	struct pci_sys_data *root = bus->sysdata;
>> +
>> +	return root->msi_chip;
>> +}
>> +#endif
>> +
>>  /*
>>   * The PCI address space does equal the physical memory address space.
>>   * The networking and block device layers use this boolean for bounce
>> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
>> index 17a26c1..a19038d 100644
>> --- a/arch/arm/kernel/bios32.c
>> +++ b/arch/arm/kernel/bios32.c
>> @@ -471,6 +471,9 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
>>  #ifdef CONFIG_PCI_DOMAINS
>>  		sys->domain  = hw->domain;
>>  #endif
>> +#ifdef CONFIG_PCI_MSI
>> +		sys->msi_chip = hw->msi_chip;
>> +#endif
>>  		sys->busnr   = busnr;
>>  		sys->swizzle = hw->swizzle;
>>  		sys->map_irq = hw->map_irq;
>> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
>> index 22e413c..f11108c 100644
>> --- a/drivers/pci/msi.c
>> +++ b/drivers/pci/msi.c
>> @@ -35,6 +35,9 @@ int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
>>  	struct msi_chip *chip = dev->bus->msi;
>>  	int err;
>>  
>> +	if (!chip)
>> +		chip = pci_msi_chip(dev->bus);
>> +
>>  	if (!chip || !chip->setup_irq)
>>  		return -EINVAL;
>>  
>> @@ -50,6 +53,9 @@ void __weak arch_teardown_msi_irq(unsigned int irq)
>>  	struct msi_desc *entry = irq_get_msi_desc(irq);
>>  	struct msi_chip *chip = entry->dev->bus->msi;
>>  
>> +	if (!chip)
>> +		chip = pci_msi_chip(entry->dev->bus);
>> +
>>  	if (!chip || !chip->teardown_irq)
>>  		return;
>>  
>> diff --git a/include/linux/pci.h b/include/linux/pci.h
>> index 9cd2721..7a48b40 100644
>> --- a/include/linux/pci.h
>> +++ b/include/linux/pci.h
>> @@ -1433,6 +1433,15 @@ static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }
>>  
>>  #include <asm/pci.h>
>>  
>> +/* Just avoid compile error, will be clean up later */
>> +#ifdef CONFIG_PCI_MSI
>> +
>> +#ifndef pci_msi_chip
>> +#define pci_msi_chip(bus)	NULL
>> +#endif
>> +
>> +#endif
>> +
>>  /* these helpers provide future and backwards compatibility
>>   * for accessing popular PCI BAR info */
>>  #define pci_resource_start(dev, bar)	((dev)->resource[(bar)].start)
>> -- 
>> 1.7.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
>>
> 
> 
> .
> 


-- 
Thanks!
Yijing

^ permalink raw reply

* Re: [POWERPC] 4xx: EP405 boards support for arch/powerpc
From: Wolfgang Denk @ 2014-10-20 19:02 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev, Dan Carpenter
In-Reply-To: <1413802359.18300.7.camel@pasglop>

Dear Ben,

In message <1413802359.18300.7.camel@pasglop> you wrote:
>
> Ah, I even forgot I wrote that ... I'll have to dig out the docs of
> that chip, maybe later this week. Thanks !
...
> >    565          cbdv = ((pllmr & 0x00060000) >> 17) + 1; /* CPU:PLB */
> >    566          opdv = ((pllmr & 0x00018000) >> 15) + 1; /* PLB:OPB */
> >    567          ppdv = ((pllmr & 0x00001800) >> 13) + 1; /* PLB:PCI */
> >                          ^^^^^^^^^^^^^^^^^^^^^^^^^
> > This mask and shift means that ppdv is always 1.

See 7.7.1 PLL Mode Register (CPC0_PLLMR) page 7.10f:

Bits 17:18 PPDV PCI­PLB Frequency Divisor

So that should be (... & 0x00006000) >> 13 ?

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
Only in our dreams we are free.  The rest of the time we need  wages.
                                    - Terry Pratchett, _Wyrd Sisters_

^ permalink raw reply

* Re: [PATCH v3 04/27] arm/MSI: Save MSI chip in pci_sys_data
From: Lorenzo Pieralisi @ 2014-10-20 17:21 UTC (permalink / raw)
  To: Yijing Wang
  Cc: linux-mips@linux-mips.org, linux-ia64@vger.kernel.org,
	linux-pci@vger.kernel.org, Bharat.Bhushan@freescale.com,
	Thierry Reding, sparclinux@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-s390@vger.kernel.org,
	Russell King, Joerg Roedel, x86@kernel.org, Sebastian Ott,
	xen-devel@lists.xenproject.org, arnab.basu@freescale.com,
	Liviu Dudau, Arnd Bergmann, Konrad Rzeszutek Wilk, Chris Metcalf,
	Bjorn Helgaas, Thomas Gleixner,
	linux-arm-kernel@lists.infradead.org, Thomas Petazzoni,
	huxinwei@huawei.com, Tony Luck, Sergei Shtylyov,
	linux-kernel@vger.kernel.org, Ralf Baechle,
	iommu@lists.linux-foundation.org, David Vrabel, Wuyun,
	linuxppc-dev@lists.ozlabs.org, David S. Miller, Lucas Stach
In-Reply-To: <1413342435-7876-5-git-send-email-wangyijing@huawei.com>

On Wed, Oct 15, 2014 at 04:06:52AM +0100, Yijing Wang wrote:
> Saving msi chip in pci_sys_data can make pci bus and
> devices don't need to know msi chip detail, it also
> make pci enumeration code be decoupled from msi chip.
> In fact, all pci devices under the same pci hostbridge
> share same msi chip. So msi chip should be seen as one
> of resources or attributes to be initialized in pci host
> bridge driver. Currently, pci hostbridge drivers create
> pci_host_bridge in pci_create_root_bus(), and pass arch
> specific pci sysdata to core pci scan functions. So pci
> arch sysdata is good place to save msi chip.
>=20
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> ---
>  arch/arm/include/asm/mach/pci.h |    6 ++++++
>  arch/arm/include/asm/pci.h      |    9 +++++++++
>  arch/arm/kernel/bios32.c        |    3 +++
>  drivers/pci/msi.c               |    6 ++++++
>  include/linux/pci.h             |    9 +++++++++
>  5 files changed, 33 insertions(+), 0 deletions(-)
>=20
> diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/=
pci.h
> index 7fc4278..59b0d87 100644
> --- a/arch/arm/include/asm/mach/pci.h
> +++ b/arch/arm/include/asm/mach/pci.h
> @@ -22,6 +22,9 @@ struct hw_pci {
>  #ifdef CONFIG_PCI_DOMAINS
>  =09int=09=09domain;
>  #endif
> +#ifdef CONFIG_PCI_MSI
> +=09struct msi_chip *msi_chip;
> +#endif
>  =09struct pci_ops=09*ops;
>  =09int=09=09nr_controllers;
>  =09void=09=09**private_data;
> @@ -47,6 +50,9 @@ struct pci_sys_data {
>  #ifdef CONFIG_PCI_DOMAINS
>  =09int=09=09domain;
>  #endif
> +#ifdef CONFIG_PCI_MSI
> +=09struct msi_chip *msi_chip;
> +#endif

This struct is defined for ARM only. We are trying to remove dependency on =
it
so that we can have a single driver for ARM32 and ARM64 systems without
pcibios dependency. Why can't we add this msi chip data to the host
bridge struct instead ? I understand it is all a matter of how to pass
the pointer to pci_scan_root_bus(), where the bridge is created.
We could initialize the msi chip on the bridge through the bus pointer
returned by the pci_scan_root_bus() function.

Thanks,
Lorenzo

>  =09struct list_head node;
>  =09int=09=09busnr;=09=09/* primary bus number=09=09=09*/
>  =09u64=09=09mem_offset;=09/* bus->cpu memory mapping offset=09*/
> diff --git a/arch/arm/include/asm/pci.h b/arch/arm/include/asm/pci.h
> index 7e95d85..b562c09 100644
> --- a/arch/arm/include/asm/pci.h
> +++ b/arch/arm/include/asm/pci.h
> @@ -31,6 +31,15 @@ static inline int pci_proc_domain(struct pci_bus *bus)
>  }
>  #endif /* CONFIG_PCI_DOMAINS */
> =20
> +#ifdef CONFIG_PCI_MSI
> +static inline struct msi_chip *pci_msi_chip(struct pci_bus *bus)
> +{
> +=09struct pci_sys_data *root =3D bus->sysdata;
> +
> +=09return root->msi_chip;
> +}
> +#endif
> +
>  /*
>   * The PCI address space does equal the physical memory address space.
>   * The networking and block device layers use this boolean for bounce
> diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
> index 17a26c1..a19038d 100644
> --- a/arch/arm/kernel/bios32.c
> +++ b/arch/arm/kernel/bios32.c
> @@ -471,6 +471,9 @@ static void pcibios_init_hw(struct device *parent, st=
ruct hw_pci *hw,
>  #ifdef CONFIG_PCI_DOMAINS
>  =09=09sys->domain  =3D hw->domain;
>  #endif
> +#ifdef CONFIG_PCI_MSI
> +=09=09sys->msi_chip =3D hw->msi_chip;
> +#endif
>  =09=09sys->busnr   =3D busnr;
>  =09=09sys->swizzle =3D hw->swizzle;
>  =09=09sys->map_irq =3D hw->map_irq;
> diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
> index 22e413c..f11108c 100644
> --- a/drivers/pci/msi.c
> +++ b/drivers/pci/msi.c
> @@ -35,6 +35,9 @@ int __weak arch_setup_msi_irq(struct pci_dev *dev, stru=
ct msi_desc *desc)
>  =09struct msi_chip *chip =3D dev->bus->msi;
>  =09int err;
> =20
> +=09if (!chip)
> +=09=09chip =3D pci_msi_chip(dev->bus);
> +
>  =09if (!chip || !chip->setup_irq)
>  =09=09return -EINVAL;
> =20
> @@ -50,6 +53,9 @@ void __weak arch_teardown_msi_irq(unsigned int irq)
>  =09struct msi_desc *entry =3D irq_get_msi_desc(irq);
>  =09struct msi_chip *chip =3D entry->dev->bus->msi;
> =20
> +=09if (!chip)
> +=09=09chip =3D pci_msi_chip(entry->dev->bus);
> +
>  =09if (!chip || !chip->teardown_irq)
>  =09=09return;
> =20
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 9cd2721..7a48b40 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1433,6 +1433,15 @@ static inline int pci_get_new_domain_nr(void) { re=
turn -ENOSYS; }
> =20
>  #include <asm/pci.h>
> =20
> +/* Just avoid compile error, will be clean up later */
> +#ifdef CONFIG_PCI_MSI
> +
> +#ifndef pci_msi_chip
> +#define pci_msi_chip(bus)=09NULL
> +#endif
> +
> +#endif
> +
>  /* these helpers provide future and backwards compatibility
>   * for accessing popular PCI BAR info */
>  #define pci_resource_start(dev, bar)=09((dev)->resource[(bar)].start)
> --=20
> 1.7.1
>=20
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" i=
n
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>=20

^ permalink raw reply

* [PATCH 1/3] KVM: PPC: BOOK3S: HV: Add helpers for lock/unlock hpte
From: Aneesh Kumar K.V @ 2014-10-20 14:28 UTC (permalink / raw)
  To: agraf, benh, paulus; +Cc: linuxppc-dev, kvm, kvm-ppc, Aneesh Kumar K.V

This patch adds helper routine for lock and unlock hpte and use
the same for rest of the code. We don't change any locking rules in this
patch. In the next patch we switch some of the unlock usage to use
the api with barrier and also document the usage without barriers.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/kvm_book3s_64.h | 14 ++++++++++++++
 arch/powerpc/kvm/book3s_64_mmu_hv.c      | 25 ++++++++++---------------
 arch/powerpc/kvm/book3s_hv_rm_mmu.c      | 27 ++++++++++-----------------
 3 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h
index 0aa817933e6a..ec9fb6085843 100644
--- a/arch/powerpc/include/asm/kvm_book3s_64.h
+++ b/arch/powerpc/include/asm/kvm_book3s_64.h
@@ -86,6 +86,20 @@ static inline long try_lock_hpte(__be64 *hpte, unsigned long bits)
 	return old == 0;
 }
 
+static inline void unlock_hpte(__be64 *hpte, unsigned long hpte_v)
+{
+	hpte_v &= ~HPTE_V_HVLOCK;
+	asm volatile(PPC_RELEASE_BARRIER "" : : : "memory");
+	hpte[0] = cpu_to_be64(hpte_v);
+}
+
+/* Without barrier */
+static inline void __unlock_hpte(__be64 *hpte, unsigned long hpte_v)
+{
+	hpte_v &= ~HPTE_V_HVLOCK;
+	hpte[0] = cpu_to_be64(hpte_v);
+}
+
 static inline int __hpte_actual_psize(unsigned int lp, int psize)
 {
 	int i, shift;
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index cebb86bc4a37..5ea4b2b6a157 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -475,9 +475,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
 	v = be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK;
 	gr = kvm->arch.revmap[index].guest_rpte;
 
-	/* Unlock the HPTE */
-	asm volatile("lwsync" : : : "memory");
-	hptep[0] = cpu_to_be64(v);
+	unlock_hpte(hptep, v);
 	preempt_enable();
 
 	gpte->eaddr = eaddr;
@@ -606,8 +604,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	hpte[0] = be64_to_cpu(hptep[0]) & ~HPTE_V_HVLOCK;
 	hpte[1] = be64_to_cpu(hptep[1]);
 	hpte[2] = r = rev->guest_rpte;
-	asm volatile("lwsync" : : : "memory");
-	hptep[0] = cpu_to_be64(hpte[0]);
+	unlock_hpte(hptep, hpte[0]);
 	preempt_enable();
 
 	if (hpte[0] != vcpu->arch.pgfault_hpte[0] ||
@@ -758,7 +755,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
 
 	hptep[1] = cpu_to_be64(r);
 	eieio();
-	hptep[0] = cpu_to_be64(hpte[0]);
+	__unlock_hpte(hptep, hpte[0]);
 	asm volatile("ptesync" : : : "memory");
 	preempt_enable();
 	if (page && hpte_is_writable(r))
@@ -777,7 +774,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	return ret;
 
  out_unlock:
-	hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
+	__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 	preempt_enable();
 	goto out_put;
 }
@@ -907,7 +904,7 @@ static int kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp,
 			}
 		}
 		unlock_rmap(rmapp);
-		hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
+		__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 	}
 	return 0;
 }
@@ -995,7 +992,7 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
 			}
 			ret = 1;
 		}
-		hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
+		__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 	} while ((i = j) != head);
 
 	unlock_rmap(rmapp);
@@ -1118,8 +1115,7 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
 
 		/* Now check and modify the HPTE */
 		if (!(hptep[0] & cpu_to_be64(HPTE_V_VALID))) {
-			/* unlock and continue */
-			hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
+			__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 			continue;
 		}
 		/* need to make it temporarily absent so C is stable */
@@ -1139,9 +1135,9 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
 				npages_dirty = n;
 			eieio();
 		}
-		v &= ~(HPTE_V_ABSENT | HPTE_V_HVLOCK);
+		v &= ~HPTE_V_ABSENT;
 		v |= HPTE_V_VALID;
-		hptep[0] = cpu_to_be64(v);
+		__unlock_hpte(hptep, v);
 	} while ((i = j) != head);
 
 	unlock_rmap(rmapp);
@@ -1379,8 +1375,7 @@ static long record_hpte(unsigned long flags, __be64 *hptp,
 			r &= ~HPTE_GR_MODIFIED;
 			revp->guest_rpte = r;
 		}
-		asm volatile(PPC_RELEASE_BARRIER "" : : : "memory");
-		hptp[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
+		unlock_hpte(hptp, be64_to_cpu(hptp[0]));
 		preempt_enable();
 		if (!(valid == want_valid && (first_pass || dirty)))
 			ok = 0;
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
index 084ad54c73cd..769a5d4c0430 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
@@ -154,12 +154,6 @@ static pte_t lookup_linux_pte_and_update(pgd_t *pgdir, unsigned long hva,
 	return kvmppc_read_update_linux_pte(ptep, writing, hugepage_shift);
 }
 
-static inline void unlock_hpte(__be64 *hpte, unsigned long hpte_v)
-{
-	asm volatile(PPC_RELEASE_BARRIER "" : : : "memory");
-	hpte[0] = cpu_to_be64(hpte_v);
-}
-
 long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
 		       long pte_index, unsigned long pteh, unsigned long ptel,
 		       pgd_t *pgdir, bool realmode, unsigned long *pte_idx_ret)
@@ -295,10 +289,10 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
 				u64 pte;
 				while (!try_lock_hpte(hpte, HPTE_V_HVLOCK))
 					cpu_relax();
-				pte = be64_to_cpu(*hpte);
+				pte = be64_to_cpu(hpte[0]);
 				if (!(pte & (HPTE_V_VALID | HPTE_V_ABSENT)))
 					break;
-				*hpte &= ~cpu_to_be64(HPTE_V_HVLOCK);
+				__unlock_hpte(hpte, pte);
 				hpte += 2;
 			}
 			if (i == 8)
@@ -314,9 +308,9 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
 
 			while (!try_lock_hpte(hpte, HPTE_V_HVLOCK))
 				cpu_relax();
-			pte = be64_to_cpu(*hpte);
+			pte = be64_to_cpu(hpte[0]);
 			if (pte & (HPTE_V_VALID | HPTE_V_ABSENT)) {
-				*hpte &= ~cpu_to_be64(HPTE_V_HVLOCK);
+				__unlock_hpte(hpte, pte);
 				return H_PTEG_FULL;
 			}
 		}
@@ -356,7 +350,7 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
 
 	/* Write the first HPTE dword, unlocking the HPTE and making it valid */
 	eieio();
-	hpte[0] = cpu_to_be64(pteh);
+	__unlock_hpte(hpte, pteh);
 	asm volatile("ptesync" : : : "memory");
 
 	*pte_idx_ret = pte_index;
@@ -487,7 +481,7 @@ long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags,
 	if ((pte & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
 	    ((flags & H_AVPN) && (pte & ~0x7fUL) != avpn) ||
 	    ((flags & H_ANDCOND) && (pte & avpn) != 0)) {
-		hpte[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
+		__unlock_hpte(hpte, pte);
 		return H_NOT_FOUND;
 	}
 
@@ -623,7 +617,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
 				be64_to_cpu(hp[0]), be64_to_cpu(hp[1]));
 			rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C);
 			args[j] |= rcbits << (56 - 5);
-			hp[0] = 0;
+			__unlock_hpte(hp, 0);
 		}
 	}
 
@@ -649,7 +643,7 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags,
 	pte = be64_to_cpu(hpte[0]);
 	if ((pte & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
 	    ((flags & H_AVPN) && (pte & ~0x7fUL) != avpn)) {
-		hpte[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
+		__unlock_hpte(hpte, pte);
 		return H_NOT_FOUND;
 	}
 
@@ -700,7 +694,7 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags,
 	}
 	hpte[1] = cpu_to_be64(r);
 	eieio();
-	hpte[0] = cpu_to_be64(v & ~HPTE_V_HVLOCK);
+	__unlock_hpte(hpte, v);
 	asm volatile("ptesync" : : : "memory");
 	return H_SUCCESS;
 }
@@ -841,8 +835,7 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
 				/* Return with the HPTE still locked */
 				return (hash << 3) + (i >> 1);
 
-			/* Unlock and move on */
-			hpte[i] = cpu_to_be64(v);
+			__unlock_hpte(&hpte[i], v);
 		}
 
 		if (val & HPTE_V_SECONDARY)
-- 
1.9.1

^ permalink raw reply related

* [PATCH 3/3] KVM: PPC: BOOK3S: HV: Rename variable for better readability
From: Aneesh Kumar K.V @ 2014-10-20 14:29 UTC (permalink / raw)
  To: agraf, benh, paulus; +Cc: linuxppc-dev, kvm, kvm-ppc, Aneesh Kumar K.V
In-Reply-To: <1413815340-22426-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

Minor cleanup

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/kvm/book3s_hv_rm_mmu.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
index 78e689b066f1..2922f8d127ff 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
@@ -523,7 +523,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
 	unsigned long *args = &vcpu->arch.gpr[4];
 	__be64 *hp, *hptes[4];
 	unsigned long tlbrb[4];
-	long int i, j, k, n, found, indexes[4];
+	long int i, j, k, collected_hpte, found, indexes[4];
 	unsigned long flags, req, pte_index, rcbits;
 	int global;
 	long int ret = H_SUCCESS;
@@ -532,7 +532,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
 
 	global = global_invalidates(kvm, 0);
 	for (i = 0; i < 4 && ret == H_SUCCESS; ) {
-		n = 0;
+		collected_hpte = 0;
 		for (; i < 4; ++i) {
 			j = i * 2;
 			pte_index = args[j];
@@ -554,7 +554,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
 			hp = (__be64 *) (kvm->arch.hpt_virt + (pte_index << 4));
 			/* to avoid deadlock, don't spin except for first */
 			if (!try_lock_hpte(hp, HPTE_V_HVLOCK)) {
-				if (n)
+				if (collected_hpte)
 					break;
 				while (!try_lock_hpte(hp, HPTE_V_HVLOCK))
 					cpu_relax();
@@ -596,22 +596,23 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
 
 			/* leave it locked */
 			hp[0] &= ~cpu_to_be64(HPTE_V_VALID);
-			tlbrb[n] = compute_tlbie_rb(be64_to_cpu(hp[0]),
-				be64_to_cpu(hp[1]), pte_index);
-			indexes[n] = j;
-			hptes[n] = hp;
-			revs[n] = rev;
-			++n;
+			tlbrb[collected_hpte] = compute_tlbie_rb(be64_to_cpu(hp[0]),
+								 be64_to_cpu(hp[1]),
+								 pte_index);
+			indexes[collected_hpte] = j;
+			hptes[collected_hpte] = hp;
+			revs[collected_hpte] = rev;
+			++collected_hpte;
 		}
 
-		if (!n)
+		if (!collected_hpte)
 			break;
 
 		/* Now that we've collected a batch, do the tlbies */
-		do_tlbies(kvm, tlbrb, n, global, true);
+		do_tlbies(kvm, tlbrb, collected_hpte, global, true);
 
 		/* Read PTE low words after tlbie to get final R/C values */
-		for (k = 0; k < n; ++k) {
+		for (k = 0; k < collected_hpte; ++k) {
 			j = indexes[k];
 			pte_index = args[j] & ((1ul << 56) - 1);
 			hp = hptes[k];
-- 
1.9.1

^ permalink raw reply related

* [PATCH 2/3] KVM: PPC: BOOK3S: HV: Use unlock variant with memory barrier
From: Aneesh Kumar K.V @ 2014-10-20 14:28 UTC (permalink / raw)
  To: agraf, benh, paulus; +Cc: linuxppc-dev, kvm, kvm-ppc, Aneesh Kumar K.V
In-Reply-To: <1413815340-22426-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

We switch to unlock variant with memory barriers in the error path
and also in code path where we had implicit dependency on previous
functions calling lwsync/ptesync. In most of the cases we don't really
need an explicit barrier, but using the variant make sure we don't make
mistakes later with code movements. We also document why a
non-barrier variant is ok in performance critical path.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/kvm/book3s_64_mmu_hv.c | 10 +++++-----
 arch/powerpc/kvm/book3s_hv_rm_mmu.c | 15 ++++++++++-----
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index 5ea4b2b6a157..c97690ffb5f6 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -774,7 +774,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	return ret;
 
  out_unlock:
-	__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
+	unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 	preempt_enable();
 	goto out_put;
 }
@@ -903,8 +903,8 @@ static int kvm_unmap_rmapp(struct kvm *kvm, unsigned long *rmapp,
 				note_hpte_modification(kvm, &rev[i]);
 			}
 		}
+		unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 		unlock_rmap(rmapp);
-		__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 	}
 	return 0;
 }
@@ -992,7 +992,7 @@ static int kvm_age_rmapp(struct kvm *kvm, unsigned long *rmapp,
 			}
 			ret = 1;
 		}
-		__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
+		unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 	} while ((i = j) != head);
 
 	unlock_rmap(rmapp);
@@ -1115,7 +1115,7 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
 
 		/* Now check and modify the HPTE */
 		if (!(hptep[0] & cpu_to_be64(HPTE_V_VALID))) {
-			__unlock_hpte(hptep, be64_to_cpu(hptep[0]));
+			unlock_hpte(hptep, be64_to_cpu(hptep[0]));
 			continue;
 		}
 		/* need to make it temporarily absent so C is stable */
@@ -1137,7 +1137,7 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
 		}
 		v &= ~HPTE_V_ABSENT;
 		v |= HPTE_V_VALID;
-		__unlock_hpte(hptep, v);
+		unlock_hpte(hptep, v);
 	} while ((i = j) != head);
 
 	unlock_rmap(rmapp);
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
index 769a5d4c0430..78e689b066f1 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
@@ -292,6 +292,9 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
 				pte = be64_to_cpu(hpte[0]);
 				if (!(pte & (HPTE_V_VALID | HPTE_V_ABSENT)))
 					break;
+				/*
+				 * Data dependency will avoid re-ordering
+				 */
 				__unlock_hpte(hpte, pte);
 				hpte += 2;
 			}
@@ -310,7 +313,7 @@ long kvmppc_do_h_enter(struct kvm *kvm, unsigned long flags,
 				cpu_relax();
 			pte = be64_to_cpu(hpte[0]);
 			if (pte & (HPTE_V_VALID | HPTE_V_ABSENT)) {
-				__unlock_hpte(hpte, pte);
+				unlock_hpte(hpte, pte);
 				return H_PTEG_FULL;
 			}
 		}
@@ -481,7 +484,7 @@ long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags,
 	if ((pte & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
 	    ((flags & H_AVPN) && (pte & ~0x7fUL) != avpn) ||
 	    ((flags & H_ANDCOND) && (pte & avpn) != 0)) {
-		__unlock_hpte(hpte, pte);
+		unlock_hpte(hpte, pte);
 		return H_NOT_FOUND;
 	}
 
@@ -617,7 +620,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
 				be64_to_cpu(hp[0]), be64_to_cpu(hp[1]));
 			rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C);
 			args[j] |= rcbits << (56 - 5);
-			__unlock_hpte(hp, 0);
+			unlock_hpte(hp, 0);
 		}
 	}
 
@@ -643,7 +646,7 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags,
 	pte = be64_to_cpu(hpte[0]);
 	if ((pte & (HPTE_V_ABSENT | HPTE_V_VALID)) == 0 ||
 	    ((flags & H_AVPN) && (pte & ~0x7fUL) != avpn)) {
-		__unlock_hpte(hpte, pte);
+		unlock_hpte(hpte, pte);
 		return H_NOT_FOUND;
 	}
 
@@ -834,7 +837,9 @@ long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
 			    hpte_base_page_size(v, r) == (1ul << pshift))
 				/* Return with the HPTE still locked */
 				return (hash << 3) + (i >> 1);
-
+			/*
+			 * Data dependency should avoid re-ordering
+			 */
 			__unlock_hpte(&hpte[i], v);
 		}
 
-- 
1.9.1

^ permalink raw reply related

* Re: [POWERPC] 4xx: EP405 boards support for arch/powerpc
From: Benjamin Herrenschmidt @ 2014-10-20 10:52 UTC (permalink / raw)
  To: Dan Carpenter; +Cc: linuxppc-dev
In-Reply-To: <20141020090627.GA24768@mwanda>

On Mon, 2014-10-20 at 12:06 +0300, Dan Carpenter wrote:
> Hello Benjamin Herrenschmidt,
> 
> The patch 619740384ceb: "[POWERPC] 4xx: EP405 boards support for
> arch/powerpc" from Dec 21, 2007, leads to the following static
> checker warning:

Ah, I even forgot I wrote that ... I'll have to dig out the docs of
that chip, maybe later this week. Thanks !

Cheers,
Ben.

> 	arch/powerpc/boot/4xx.c:567 ibm405gp_fixup_clocks()
> 	warn: shifting and masking to zero
> 
> arch/powerpc/boot/4xx.c
>    562          fbdv = (pllmr & 0x1e000000) >> 25;
>    563          if (fbdv == 0)
>    564                  fbdv = 16;
>    565          cbdv = ((pllmr & 0x00060000) >> 17) + 1; /* CPU:PLB */
>    566          opdv = ((pllmr & 0x00018000) >> 15) + 1; /* PLB:OPB */
>    567          ppdv = ((pllmr & 0x00001800) >> 13) + 1; /* PLB:PCI */
>                          ^^^^^^^^^^^^^^^^^^^^^^^^^
> This mask and shift means that ppdv is always 1.
> 
>    568          epdv = ((pllmr & 0x00001800) >> 11) + 2; /* PLB:EBC */
>    569          udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
>    570  
>    571          /* check for 405GPr */
>    572          if ((mfpvr() & 0xfffffff0) == (0x50910951 & 0xfffffff0)) {
>    573                  fwdvb = 8 - (pllmr & 0x00000007);
>    574                  if (!(psr & 0x00001000)) /* PCI async mode enable == 0 */
>    575                          if (psr & 0x00000020) /* New mode enable */
>    576                                  m = fwdvb * 2 * ppdv;
>    577                          else
>    578                                  m = fwdvb * cbdv * ppdv;
> 
> regards,
> dan carpenter

^ permalink raw reply

* [PATCH v17 4/7] powerpc: add pmd_[dirty|mkclean] for THP
From: Minchan Kim @ 2014-10-20 10:12 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Jason Evans, Rik van Riel, Minchan Kim, Aneesh Kumar K.V,
	linux-api, Hugh Dickins, linux-kernel, linux-mm, zhangyanfei,
	Michael Kerrisk, KOSAKI Motohiro, Johannes Weiner,
	Kirill A. Shutemov, linuxppc-dev, Paul Mackerras, Mel Gorman
In-Reply-To: <1413799924-17946-1-git-send-email-minchan@kernel.org>

MADV_FREE needs pmd_dirty and pmd_mkclean for detecting recent
overwrite of the contents since MADV_FREE syscall is called for
THP page.

This patch adds pmd_dirty and pmd_mkclean for THP page MADV_FREE
support.

Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: linuxppc-dev@lists.ozlabs.org
Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
 arch/powerpc/include/asm/pgtable-ppc64.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h
index 889c6fa9ee01..7c07e5975871 100644
--- a/arch/powerpc/include/asm/pgtable-ppc64.h
+++ b/arch/powerpc/include/asm/pgtable-ppc64.h
@@ -468,9 +468,11 @@ static inline pte_t *pmdp_ptep(pmd_t *pmd)
 
 #define pmd_pfn(pmd)		pte_pfn(pmd_pte(pmd))
 #define pmd_young(pmd)		pte_young(pmd_pte(pmd))
+#define pmd_dirty(pmd)		pte_dirty(pmd_pte(pmd))
 #define pmd_mkold(pmd)		pte_pmd(pte_mkold(pmd_pte(pmd)))
 #define pmd_wrprotect(pmd)	pte_pmd(pte_wrprotect(pmd_pte(pmd)))
 #define pmd_mkdirty(pmd)	pte_pmd(pte_mkdirty(pmd_pte(pmd)))
+#define pmd_mkclean(pmd)	pte_pmd(pte_mkclean(pmd_pte(pmd)))
 #define pmd_mkyoung(pmd)	pte_pmd(pte_mkyoung(pmd_pte(pmd)))
 #define pmd_mkwrite(pmd)	pte_pmd(pte_mkwrite(pmd_pte(pmd)))
 
-- 
2.0.0

^ permalink raw reply related

* [PATCH] KVM: PPC: Book3S HV: Add missing HPTE unlock
From: Aneesh Kumar K.V @ 2014-10-20  9:25 UTC (permalink / raw)
  To: agraf, benh, paulus; +Cc: linuxppc-dev, kvm, kvm-ppc, Aneesh Kumar K.V

In kvm_test_clear_dirty_npages(), if we find an invalid HPTE we move on to the
next HPTE without unlocking the invalid one.  In fact we should never
find an invalid and unlocked HPTE in the rmap chain, but for robustness
we should unlock it.  This adds the missing unlock.

Reported-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/kvm/book3s_64_mmu_hv.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index d40770248b6a..cebb86bc4a37 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -1117,9 +1117,11 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
 		}
 
 		/* Now check and modify the HPTE */
-		if (!(hptep[0] & cpu_to_be64(HPTE_V_VALID)))
+		if (!(hptep[0] & cpu_to_be64(HPTE_V_VALID))) {
+			/* unlock and continue */
+			hptep[0] &= ~cpu_to_be64(HPTE_V_HVLOCK);
 			continue;
-
+		}
 		/* need to make it temporarily absent so C is stable */
 		hptep[0] |= cpu_to_be64(HPTE_V_ABSENT);
 		kvmppc_invalidate_hpte(kvm, hptep, i);
-- 
1.9.1

^ permalink raw reply related

* [PATCH] arch/powerpc: Fix build error with hugetlfs disabled
From: Aneesh Kumar K.V @ 2014-10-20  9:19 UTC (permalink / raw)
  To: benh, paulus, mpe; +Cc: linuxppc-dev, Aneesh Kumar K.V

arch/powerpc/mm/slice.c:704:5: error: expected identifier or ‘(’ before numeric constant
 int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
     ^
make[1]: *** [arch/powerpc/mm/slice.o] Error 1
make: *** [arch/powerpc/mm/slice.o] Error 2

This got introduced via 1217d34b531c76362217057ca70a8ce8950574e0
"powerpc: Ensure global functions include their prototype". We
started including linux/hugetlb.h with that patch and now we have

 #define is_hugepage_only_range(mm, addr, len)	0

with hugetlbfs disabled

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/hugetlb.h | 2 +-
 arch/powerpc/mm/slice.c            | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/include/asm/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h
index 623f2971ce0e..766b77d527ac 100644
--- a/arch/powerpc/include/asm/hugetlb.h
+++ b/arch/powerpc/include/asm/hugetlb.h
@@ -71,7 +71,7 @@ pte_t *huge_pte_offset_and_shift(struct mm_struct *mm,
 
 void flush_dcache_icache_hugepage(struct page *page);
 
-#if defined(CONFIG_PPC_MM_SLICES) || defined(CONFIG_PPC_SUBPAGE_PROT)
+#if defined(CONFIG_PPC_MM_SLICES)
 int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
 			   unsigned long len);
 #else
diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c
index 8d7bda94d196..ded0ea1afde4 100644
--- a/arch/powerpc/mm/slice.c
+++ b/arch/powerpc/mm/slice.c
@@ -682,6 +682,7 @@ void slice_set_range_psize(struct mm_struct *mm, unsigned long start,
 	slice_convert(mm, mask, psize);
 }
 
+#ifdef CONFIG_HUGETLB_PAGE
 /*
  * is_hugepage_only_range() is used by generic code to verify whether
  * a normal mmap mapping (non hugetlbfs) is valid on a given area.
@@ -726,4 +727,4 @@ int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
 #endif
 	return !slice_check_fit(mask, available);
 }
-
+#endif
-- 
1.9.1

^ permalink raw reply related

* [git pull] Please pull mpe.git for-linus branch (for powerpc)
From: Michael Ellerman @ 2014-10-20  9:15 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linuxppc-dev list, LKML

[-- Attachment #1: Type: text/plain, Size: 4480 bytes --]

Hi Linus,

Here's some more updates for powerpc for 3.18.

They are a bit late I know, though must are actually bug fixes. In my defence I
nearly cut the top of my finger off last weekend in a gruesome bike maintenance
accident, so I spent a good part of the week waiting around for doctors. True
story, I can send photos if you like :)


Probably the most interesting fix is the sys_call_table one, which enables
syscall tracing for powerpc. There's a fix for HMI handling for old firmware,
more endian fixes for firmware interfaces, more EEH fixes, Anton fixed our
routine that gets the current stack pointer, and a few other misc bits.


The following changes since commit d53ba6b3bba33432cc37b7101a86f8f3392c46e7:

  cxl: Fix afu_read() not doing finish_wait() on signal or non-blocking (2014-10-09 11:29:57 +1100)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux.git for-linus

for you to fetch changes up to e89dafb5ca5022d3bc63602018adfc766c73bc2b:

  powerpc: Only do dynamic DMA zone limits on platforms that need it (2014-10-17 09:21:44 +1100)

----------------------------------------------------------------
Anton Blanchard (5):
      powerpc: Reimplement __get_SP() as a function not a define
      powerpc: Rename __get_SP() to current_stack_pointer()
      powerpc/pseries: Use dump_stack instead of show_stack
      powerpc: Add printk levels to setup_system output
      powerpc: sync pseries_le_defconfig with pseries_defconfig

Bharata B Rao (1):
      powerpc/pseries: Make CPU hotplug path endian safe

Gavin Shan (7):
      powerpc/eeh: Fix condition for isolated state
      powerpc/eeh: Rename flag EEH_PE_RESET to EEH_PE_CFG_BLOCKED
      powerpc/powernv: Drop config requests in EEH accessors
      powerpc/pseries: Drop config requests in EEH accessors
      powerpc/eeh: Block PCI config access upon frozen PE
      powerpc/eeh: Don't collect logs on PE with blocked config space
      powerpc/eeh: Block CFG upon frozen Shiner adapter

Greg Kurz (1):
      powerpc/vphn: NUMA node code expects big-endian

Mahesh Salgaonkar (2):
      powerpc/book3s: Don't clear MSR_RI in hmi handler.
      powerpc/powernv: Fallback to old HMI handling behavior for old firmware

Michael Ellerman (3):
      powerpc/msi: Fix the msi bitmap alignment tests
      powerpc/msi: Use WARN_ON() in msi bitmap selftests
      powerpc: Only do dynamic DMA zone limits on platforms that need it

Nishanth Aravamudan (2):
      powerpc/numa: check error return from proc_create
      powerpc/numa: Add ability to disable and debug topology updates

Romeo Cane (1):
      powerpc: Fix sys_call_table declaration to enable syscall tracing

 Documentation/kernel-parameters.txt          |  6 +++
 arch/powerpc/configs/pseries_le_defconfig    |  7 ++-
 arch/powerpc/include/asm/eeh.h               |  3 +-
 arch/powerpc/include/asm/perf_event.h        |  2 +-
 arch/powerpc/include/asm/reg.h               |  3 +-
 arch/powerpc/include/asm/syscall.h           |  2 +-
 arch/powerpc/kernel/dma.c                    |  8 ++++
 arch/powerpc/kernel/eeh.c                    | 19 +++++---
 arch/powerpc/kernel/eeh_driver.c             | 12 ++---
 arch/powerpc/kernel/eeh_pe.c                 | 10 ++++-
 arch/powerpc/kernel/exceptions-64s.S         |  5 ---
 arch/powerpc/kernel/irq.c                    |  2 +-
 arch/powerpc/kernel/misc.S                   |  4 ++
 arch/powerpc/kernel/ppc_ksyms.c              |  2 +
 arch/powerpc/kernel/process.c                |  2 +-
 arch/powerpc/kernel/rtas_pci.c               | 30 +++++--------
 arch/powerpc/kernel/setup_64.c               | 32 +++++++-------
 arch/powerpc/kernel/stacktrace.c             |  2 +-
 arch/powerpc/mm/numa.c                       | 41 ++++++++++++++++-
 arch/powerpc/platforms/powernv/eeh-ioda.c    |  2 +-
 arch/powerpc/platforms/powernv/eeh-powernv.c | 57 +++++++++++++++++++++++-
 arch/powerpc/platforms/powernv/opal.c        | 21 +++++++++
 arch/powerpc/platforms/powernv/pci.c         |  2 +-
 arch/powerpc/platforms/pseries/dlpar.c       | 22 +++++-----
 arch/powerpc/platforms/pseries/hotplug-cpu.c |  4 +-
 arch/powerpc/platforms/pseries/iommu.c       | 11 +++--
 arch/powerpc/platforms/pseries/pseries.h     |  3 +-
 arch/powerpc/sysdev/msi_bitmap.c             | 66 +++++++++++++++-------------
 28 files changed, 261 insertions(+), 119 deletions(-)



[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox