Message ID | 1435743817-19083-3-git-send-email-wangzhou1@hisilicon.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
QWRkaW5nIHRvIHRoZSByZWNpcGllbnRzIGxpc3QgdGhlIGF1dGhvcnMgb2YgdGhlIGRyaXZlcnMg dGhhdCBkZXBlbmQgb24gU3lub3BzeXMgRGVzaWdud2FyZSBhbmQgdGhhdCBhcmUgbm90IGluY2x1 ZGVkDQoNClJlc3BlY3RpdmVseToNCnBjaS1kcmE3eHggS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8 a2lzaG9uQHRpLmNvbT4NCnBjaS1pbXg2IFNlYW4gQ3Jvc3MgPHhvYnNAa29zYWdpLmNvbT4NCnBj aS1rZXlzdG9uZSBNdXJhbGkgS2FyaWNoZXJpIDxtLWthcmljaGVyaTJAdGkuY29tPg0KcGNpLWxh eWVyc2NhcGUgTWluZ2h1YW4gTGlhbiA8TWluZ2h1YW4uTGlhbkBmcmVlc2NhbGUuY29tPg0KDQpE cml2ZXIgQXV0aG9ycyBhbHJlYWR5IGluY2x1ZGVkOg0KcGNpLWV4eW5vcyBKaW5nb28gSGFuIDxq ZzEuaGFuQHNhbXN1bmcuY29tPg0KcGNpZS1zcGVhcjEzeHggUHJhdHl1c2ggQW5hbmQgPHByYXR5 dXNoLmFuYW5kQHN0LmNvbT4NCg0KQ2hlZXJzDQoNCkdhYg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVz c2FnZS0tLS0tDQo+IEZyb206IFdhbmd6aG91IChCKQ0KPiBTZW50OiBXZWRuZXNkYXksIEp1bHkg MDEsIDIwMTUgMTA6NDQgQU0NCj4gVG86IEJqb3JuIEhlbGdhYXM7IEppbmdvbyBIYW47IFByYXR5 dXNoIEFuYW5kOyBBcm5kIEJlcmdtYW5uOyBHYWJyaWVsZQ0KPiBQYW9sb25pOyBKYW1lcyBNb3Jz ZTsgTGl2aXUgRHVkYXUNCj4gQ2M6IGxpbnV4LXBjaUB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWFy bS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZzsNCj4gZGV2aWNldHJlZUB2Z2VyLmtlcm5lbC5v cmc7IFl1YW56aGljaGFuZzsgWmh1ZGFjYWk7IHpoYW5nanVrdW87DQo+IHFpdXpoZW5mYTsgTGln dW96aHUgKEtlbm5ldGgpOyBXYW5nemhvdSAoQikNCj4gU3ViamVjdDogW1BBVENIIHYzIDIvNV0g UENJOiBkZXNpZ253YXJlOiBBZGQgQVJNNjQgc3VwcG9ydA0KPiANCj4gVGhpcyBwYXRjaCB0cmll cyB0byB1bmlmeSBBUk0zMiBhbmQgQVJNNjQgUENJZSBpbiBkZXNpZ253YXJlIGRyaXZlci4NCj4g RGVsZXRlDQo+IGZ1bmN0aW9uIGR3X3BjaWVfc2V0dXAsIGR3X3BjaWVfc2Nhbl9idXMsIGR3X3Bj aWVfbWFwX2lycSBhbmQgc3RydWN0DQo+IGh3X3BjaSwNCj4gbW92ZSByZWxhdGVkIG9wZXJhdGlv bnMgdG8gZHdfcGNpZV9ob3N0X2luaXQuIEFsc28gc2V0IHBwLT5yb290X2J1c19ucg0KPiA9IDAg aW4NCj4gZWFjaCBQQ0llIGhvc3QgZHJpdmVyIHdoaWNoIGlzIGJhc2VkIG9uIHBjaWUtZGVzaWdu d2FyZS4gVGhpcyBwYXRjaA0KPiBhbHNvIHRyeQ0KPiB0byB1c2Ugb2ZfcGNpX2dldF9ob3N0X2Jy aWRnZV9yZXNvdXJjZXMgZm9yIEFSTTMyIGFuZCBBUk02NCBhY2NvcmRpbmcNCj4gdG8gdGhlDQo+ IHN1Z2dlc3Rpb24gZm9yIEdhYnJpZWxlWzFdDQo+IA0KPiBJIHRlc3RlZCB0aGlzIHBhdGNoIG9u IEQwMiBib2FyZCBvZiBIaXNpbGljb24uIEl0IHdvcmtzIHdlbGwuDQo+IEkgaGF2ZSBjb21waWxl ZCB0aGUgZHJpdmVyIHdpdGggbXVsdGlfdjdfZGVmY29uZmlnLiBIb3dldmVyLCBJIGRvbid0DQo+ IGhhdmUNCj4gQVJNMzIgUENJZSByZWxhdGVkIGJvYXJkIHRvIGRvIHRlc3QuIEl0IHdpbGwgYmUg YXBwcmVjaWF0ZWQgaWYgc29tZW9uZQ0KPiBjb3VsZA0KPiBoZWxwIHRvIHRlc3QgaXQuDQo+IA0K PiBTaWduZWQtb2ZmLWJ5OiBaaG91IFdhbmcgPHdhbmd6aG91MUBoaXNpbGljb24uY29tPg0KPiBT aWduZWQtb2ZmLWJ5OiBBcm5kIEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPg0KPiBTaWduZWQtb2Zm LWJ5OiBHYWJyaWVsZSBQYW9sb25pIDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+DQo+IFRl c3RlZC1ieTogRmFicmljZSBHYXNuaWVyIDxmYWJyaWNlLmdhc25pZXJAc3QuY29tPg0KPiBUZXN0 ZWQtYnk6IEphbWVzIE1vcnNlIDxqYW1lcy5tb3JzZUBhcm0uY29tPg0KPiANCj4gWzFdIGh0dHA6 Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvbGludXgtcGNpL21zZzQyMTk0Lmh0bWwNCj4gLS0tDQo+ ICBkcml2ZXJzL3BjaS9ob3N0L3BjaS1kcmE3eHguYyAgICAgIHwgICAxICsNCj4gIGRyaXZlcnMv cGNpL2hvc3QvcGNpLWV4eW5vcy5jICAgICAgfCAgIDIgKy0NCj4gIGRyaXZlcnMvcGNpL2hvc3Qv cGNpLWlteDYuYyAgICAgICAgfCAgIDIgKy0NCj4gIGRyaXZlcnMvcGNpL2hvc3QvcGNpLWtleXN0 b25lLWR3LmMgfCAgIDIgKy0NCj4gIGRyaXZlcnMvcGNpL2hvc3QvcGNpLWtleXN0b25lLmMgICAg fCAgIDIgKy0NCj4gIGRyaXZlcnMvcGNpL2hvc3QvcGNpLWxheWVyc2NhcGUuYyAgfCAgIDIgKy0N Cj4gIGRyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMgfCAyNDIgKysrKysrKysrKysr KysrLS0tLS0tLS0tLS0tLS0NCj4gLS0tLS0tLS0NCj4gIGRyaXZlcnMvcGNpL2hvc3QvcGNpZS1k ZXNpZ253YXJlLmggfCAgMTAgKy0NCj4gIGRyaXZlcnMvcGNpL2hvc3QvcGNpZS1zcGVhcjEzeHgu YyAgfCAgIDIgKy0NCj4gIDkgZmlsZXMgY2hhbmdlZCwgMTEwIGluc2VydGlvbnMoKyksIDE1NSBk ZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1kcmE3 eHguYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLQ0KPiBkcmE3eHguYw0KPiBpbmRleCAyZDU3ZTE5 Li41YzhiNmFiIDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1kcmE3eHguYw0K PiArKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1kcmE3eHguYw0KPiBAQCAtMjgwLDYgKzI4MCw3 IEBAIHN0YXRpYyBpbnQgX19pbml0IGRyYTd4eF9hZGRfcGNpZV9wb3J0KHN0cnVjdA0KPiBkcmE3 eHhfcGNpZSAqZHJhN3h4LA0KPiANCj4gIAlwcCA9ICZkcmE3eHgtPnBwOw0KPiAgCXBwLT5kZXYg PSBkZXY7DQo+ICsJcHAtPnJvb3RfYnVzX25yID0gMDsNCj4gIAlwcC0+b3BzID0gJmRyYTd4eF9w Y2llX2hvc3Rfb3BzOw0KPiANCj4gIAlwcC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAx KTsNCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jIGIvZHJpdmVy cy9wY2kvaG9zdC9wY2ktDQo+IGV4eW5vcy5jDQo+IGluZGV4IGMxMzkyMzcuLjRiNmRiNmMgMTAw NjQ0DQo+IC0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jDQo+ICsrKyBiL2RyaXZl cnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jDQo+IEBAIC01MzQsNyArNTM0LDcgQEAgc3RhdGljIGlu dCBfX2luaXQgZXh5bm9zX2FkZF9wY2llX3BvcnQoc3RydWN0DQo+IHBjaWVfcG9ydCAqcHAsDQo+ ICAJCX0NCj4gIAl9DQo+IA0KPiAtCXBwLT5yb290X2J1c19uciA9IC0xOw0KPiArCXBwLT5yb290 X2J1c19uciA9IDA7DQo+ICAJcHAtPm9wcyA9ICZleHlub3NfcGNpZV9ob3N0X29wczsNCj4gDQo+ ICAJcmV0ID0gZHdfcGNpZV9ob3N0X2luaXQocHApOw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9w Y2kvaG9zdC9wY2ktaW14Ni5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jDQo+IGluZGV4 IGZkYjk1MzYuLmM0YTgwYzUgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlt eDYuYw0KPiArKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMNCj4gQEAgLTU0MSw3ICs1 NDEsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBpbXg2X2FkZF9wY2llX3BvcnQoc3RydWN0DQo+IHBj aWVfcG9ydCAqcHAsDQo+ICAJCX0NCj4gIAl9DQo+IA0KPiAtCXBwLT5yb290X2J1c19uciA9IC0x Ow0KPiArCXBwLT5yb290X2J1c19uciA9IDA7DQo+ICAJcHAtPm9wcyA9ICZpbXg2X3BjaWVfaG9z dF9vcHM7DQo+IA0KPiAgCXJldCA9IGR3X3BjaWVfaG9zdF9pbml0KHBwKTsNCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWtleXN0b25lLWR3LmMgYi9kcml2ZXJzL3BjaS9ob3N0 L3BjaS0NCj4ga2V5c3RvbmUtZHcuYw0KPiBpbmRleCBmMzQ4OTJlLi5iMWU0MTM1IDEwMDY0NA0K PiAtLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1rZXlzdG9uZS1kdy5jDQo+ICsrKyBiL2RyaXZl cnMvcGNpL2hvc3QvcGNpLWtleXN0b25lLWR3LmMNCj4gQEAgLTMyNyw3ICszMjcsNyBAQCBzdGF0 aWMgdm9pZCBrc19kd19wY2llX2NsZWFyX2RiaV9tb2RlKHZvaWQgX19pb21lbQ0KPiAqcmVnX3Zp cnQpDQo+ICB2b2lkIGtzX2R3X3BjaWVfc2V0dXBfcmNfYXBwX3JlZ3Moc3RydWN0IGtleXN0b25l X3BjaWUgKmtzX3BjaWUpDQo+ICB7DQo+ICAJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSAma3NfcGNp ZS0+cHA7DQo+IC0JdTMyIHN0YXJ0ID0gcHAtPm1lbS5zdGFydCwgZW5kID0gcHAtPm1lbS5lbmQ7 DQo+ICsJdTMyIHN0YXJ0ID0gcHAtPm1lbS0+c3RhcnQsIGVuZCA9IHBwLT5tZW0tPmVuZDsNCj4g IAlpbnQgaSwgdHJfc2l6ZTsNCj4gDQo+ICAJLyogRGlzYWJsZSBCQVJzIGZvciBpbmJvdW5kIGFj Y2VzcyAqLw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2kta2V5c3RvbmUuYyBi L2RyaXZlcnMvcGNpL2hvc3QvcGNpLQ0KPiBrZXlzdG9uZS5jDQo+IGluZGV4IDc1MzMzYjAuLmRm OTFmNWUgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWtleXN0b25lLmMNCj4g KysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2kta2V5c3RvbmUuYw0KPiBAQCAtMzEyLDcgKzMxMiw3 IEBAIHN0YXRpYyBpbnQgX19pbml0IGtzX2FkZF9wY2llX3BvcnQoc3RydWN0DQo+IGtleXN0b25l X3BjaWUgKmtzX3BjaWUsDQo+ICAJCQlyZXR1cm4gcmV0Ow0KPiAgCX0NCj4gDQo+IC0JcHAtPnJv b3RfYnVzX25yID0gLTE7DQo+ICsJcHAtPnJvb3RfYnVzX25yID0gMDsNCj4gIAlwcC0+b3BzID0g JmtleXN0b25lX3BjaWVfaG9zdF9vcHM7DQo+ICAJcmV0ID0ga3NfZHdfcGNpZV9ob3N0X2luaXQo a3NfcGNpZSwga3NfcGNpZS0+bXNpX2ludGNfbnApOw0KPiAgCWlmIChyZXQpIHsNCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWxheWVyc2NhcGUuYyBiL2RyaXZlcnMvcGNpL2hv c3QvcGNpLQ0KPiBsYXllcnNjYXBlLmMNCj4gaW5kZXggNGE2ZTYyZi4uNWM3YTljNCAxMDA2NDQN Cj4gLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktbGF5ZXJzY2FwZS5jDQo+ICsrKyBiL2RyaXZl cnMvcGNpL2hvc3QvcGNpLWxheWVyc2NhcGUuYw0KPiBAQCAtMTAxLDcgKzEwMSw3IEBAIHN0YXRp YyBpbnQgbHNfYWRkX3BjaWVfcG9ydChzdHJ1Y3QgbHNfcGNpZSAqcGNpZSkNCj4gIAlwcCA9ICZw Y2llLT5wcDsNCj4gIAlwcC0+ZGV2ID0gcGNpZS0+ZGV2Ow0KPiAgCXBwLT5kYmlfYmFzZSA9IHBj aWUtPmRiaTsNCj4gLQlwcC0+cm9vdF9idXNfbnIgPSAtMTsNCj4gKwlwcC0+cm9vdF9idXNfbnIg PSAwOw0KPiAgCXBwLT5vcHMgPSAmbHNfcGNpZV9ob3N0X29wczsNCj4gDQo+ICAJcmV0ID0gZHdf cGNpZV9ob3N0X2luaXQocHApOw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ll LWRlc2lnbndhcmUuYw0KPiBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMNCj4g aW5kZXggMmU5Zjg0Zi4uODQ0ZmViZWUgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvcGNpL2hvc3Qv cGNpZS1kZXNpZ253YXJlLmMNCj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndh cmUuYw0KPiBAQCAtMTEsNiArMTEsNyBAQA0KPiAgICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uDQo+ICAgKi8NCj4gDQo+ICsjaW5jbHVkZSA8bGludXgvaGFyZGly cS5oPg0KPiAgI2luY2x1ZGUgPGxpbnV4L2lycS5oPg0KPiAgI2luY2x1ZGUgPGxpbnV4L2lycWRv bWFpbi5oPg0KPiAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPg0KPiBAQCAtNjcsMTYgKzY4LDcg QEANCj4gICNkZWZpbmUgUENJRV9BVFVfRlVOQyh4KQkJKCgoeCkgJiAweDcpIDw8IDE2KQ0KPiAg I2RlZmluZSBQQ0lFX0FUVV9VUFBFUl9UQVJHRVQJCTB4OTFDDQo+IA0KPiAtc3RhdGljIHN0cnVj dCBod19wY2kgZHdfcGNpOw0KPiAtDQo+IC1zdGF0aWMgdW5zaWduZWQgbG9uZyBnbG9iYWxfaW9f b2Zmc2V0Ow0KPiAtDQo+IC1zdGF0aWMgaW5saW5lIHN0cnVjdCBwY2llX3BvcnQgKnN5c190b19w Y2llKHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykNCj4gLXsNCj4gLQlCVUdfT04oIXN5cy0+cHJp dmF0ZV9kYXRhKTsNCj4gLQ0KPiAtCXJldHVybiBzeXMtPnByaXZhdGVfZGF0YTsNCj4gLX0NCj4g K3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBkd19wY2llX29wczsNCj4gDQo+ICBpbnQgZHdfcGNpZV9j ZmdfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFs KQ0KPiAgew0KPiBAQCAtMjM4LDcgKzIzMCw3IEBAIHN0YXRpYyB2b2lkIGR3X3BjaWVfbXNpX3Nl dF9pcnEoc3RydWN0IHBjaWVfcG9ydA0KPiAqcHAsIGludCBpcnEpDQo+ICBzdGF0aWMgaW50IGFz c2lnbl9pcnEoaW50IG5vX2lycXMsIHN0cnVjdCBtc2lfZGVzYyAqZGVzYywgaW50ICpwb3MpDQo+ ICB7DQo+ICAJaW50IGlycSwgcG9zMCwgaTsNCj4gLQlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IHN5 c190b19wY2llKGRlc2MtPmRldi0+YnVzLT5zeXNkYXRhKTsNCj4gKwlzdHJ1Y3QgcGNpZV9wb3J0 ICpwcCA9IGRlc2MtPmRldi0+YnVzLT5zeXNkYXRhOw0KPiANCj4gIAlwb3MwID0gYml0bWFwX2Zp bmRfZnJlZV9yZWdpb24ocHAtPm1zaV9pcnFfaW5fdXNlLCBNQVhfTVNJX0lSUVMsDQo+ICAJCQkJ ICAgICAgIG9yZGVyX2Jhc2VfMihub19pcnFzKSk7DQo+IEBAIC0yODEsNyArMjczLDcgQEAgc3Rh dGljIGludCBkd19tc2lfc2V0dXBfaXJxKHN0cnVjdCBtc2lfY29udHJvbGxlcg0KPiAqY2hpcCwg c3RydWN0IHBjaV9kZXYgKnBkZXYsDQo+ICB7DQo+ICAJaW50IGlycSwgcG9zOw0KPiAgCXN0cnVj dCBtc2lfbXNnIG1zZzsNCj4gLQlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IHN5c190b19wY2llKHBk ZXYtPmJ1cy0+c3lzZGF0YSk7DQo+ICsJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBwZGV2LT5idXMt PnN5c2RhdGE7DQo+IA0KPiAgCWlmIChkZXNjLT5tc2lfYXR0cmliLmlzX21zaXgpDQo+ICAJCXJl dHVybiAtRUlOVkFMOw0KPiBAQCAtMzEwLDcgKzMwMiw3IEBAIHN0YXRpYyB2b2lkIGR3X21zaV90 ZWFyZG93bl9pcnEoc3RydWN0DQo+IG1zaV9jb250cm9sbGVyICpjaGlwLCB1bnNpZ25lZCBpbnQg aXJxKQ0KPiAgew0KPiAgCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEo aXJxKTsNCj4gIAlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaSA9IGlycV9kYXRhX2dldF9tc2koZGF0YSk7 DQo+IC0Jc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBzeXNfdG9fcGNpZShtc2ktPmRldi0+YnVzLT5z eXNkYXRhKTsNCj4gKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IG1zaS0+ZGV2LT5idXMtPnN5c2Rh dGE7DQo+IA0KPiAgCWNsZWFyX2lycV9yYW5nZShwcCwgaXJxLCAxLCBkYXRhLT5od2lycSk7DQo+ ICB9DQo+IEBAIC0zNDIsMTYgKzMzNCwyNCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21h aW5fb3BzIG1zaV9kb21haW5fb3BzDQo+ID0gew0KPiAgCS5tYXAgPSBkd19wY2llX21zaV9tYXAs DQo+ICB9Ow0KPiANCj4gLWludCBkd19wY2llX2hvc3RfaW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpw cCkNCj4gK2ludCBfX2luaXQgZHdfcGNpZV9ob3N0X2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHAp DQo+ICB7DQo+ICAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBwLT5kZXYtPm9mX25vZGU7DQo+ ICAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShwcC0+ ZGV2KTsNCj4gLQlzdHJ1Y3Qgb2ZfcGNpX3JhbmdlIHJhbmdlOw0KPiAtCXN0cnVjdCBvZl9wY2lf cmFuZ2VfcGFyc2VyIHBhcnNlcjsNCj4gKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOw0KPiAgCXN0cnVj dCByZXNvdXJjZSAqY2ZnX3JlczsNCj4gKwlMSVNUX0hFQUQocmVzKTsNCj4gIAl1MzIgdmFsLCBu YSwgbnM7DQo+ICAJY29uc3QgX19iZTMyICphZGRycDsNCj4gIAlpbnQgaSwgaW5kZXgsIHJldDsN Cj4gKwlpbnQgcmxlbjsNCj4gKwlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKndpbjsNCj4gKwljb25z dCBfX2JlMzIgKnBhcnNlcl9yYW5nZV9lbmQgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyYW5nZXMi LA0KPiAmcmxlbik7DQo+ICsNCj4gKwlpZiAocGFyc2VyX3JhbmdlX2VuZCA9PSBOVUxMKQ0KPiAr CQkJcmV0dXJuIC1FTk9FTlQ7DQo+ICsJcGFyc2VyX3JhbmdlX2VuZCArPSBybGVuL3NpemVvZihf X2JlMzIpOw0KPiArDQo+IA0KPiAgCS8qIEZpbmQgdGhlIGFkZHJlc3MgY2VsbCBzaXplIGFuZCB0 aGUgbnVtYmVyIG9mIGNlbGxzIGluIG9yZGVyIHRvDQo+IGdldA0KPiAgCSAqIHRoZSB1bnRyYW5z bGF0ZWQgYWRkcmVzcy4NCj4gQEAgLTM3NSw3OCArMzc1LDY3IEBAIGludCBkd19wY2llX2hvc3Rf aW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkNCj4gIAkJZGV2X2VycihwcC0+ZGV2LCAibWlzc2lu ZyAqY29uZmlnKiByZWcgc3BhY2VcbiIpOw0KPiAgCX0NCj4gDQo+IC0JaWYgKG9mX3BjaV9yYW5n ZV9wYXJzZXJfaW5pdCgmcGFyc2VyLCBucCkpIHsNCj4gLQkJZGV2X2VycihwcC0+ZGV2LCAibWlz c2luZyByYW5nZXMgcHJvcGVydHlcbiIpOw0KPiAtCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQl9DQo+ ICsJcmV0ID0gb2ZfcGNpX2dldF9ob3N0X2JyaWRnZV9yZXNvdXJjZXMobnAsIDAsIDB4ZmYsICZy ZXMsICZwcC0NCj4gPmlvX2Jhc2UpOw0KPiArCWlmIChyZXQpDQo+ICsJCXJldHVybiByZXQ7DQo+ IA0KPiAgCS8qIEdldCB0aGUgSS9PIGFuZCBtZW1vcnkgcmFuZ2VzIGZyb20gRFQgKi8NCj4gLQlm b3JfZWFjaF9vZl9wY2lfcmFuZ2UoJnBhcnNlciwgJnJhbmdlKSB7DQo+IC0JCXVuc2lnbmVkIGxv bmcgcmVzdHlwZSA9IHJhbmdlLmZsYWdzICYgSU9SRVNPVVJDRV9UWVBFX0JJVFM7DQo+IC0NCj4g LQkJaWYgKHJlc3R5cGUgPT0gSU9SRVNPVVJDRV9JTykgew0KPiAtCQkJb2ZfcGNpX3JhbmdlX3Rv X3Jlc291cmNlKCZyYW5nZSwgbnAsICZwcC0+aW8pOw0KPiAtCQkJcHAtPmlvLm5hbWUgPSAiSS9P IjsNCj4gLQkJCXBwLT5pby5zdGFydCA9IG1heF90KHJlc291cmNlX3NpemVfdCwNCj4gLQkJCQkJ ICAgICBQQ0lCSU9TX01JTl9JTywNCj4gLQkJCQkJICAgICByYW5nZS5wY2lfYWRkciArIGdsb2Jh bF9pb19vZmZzZXQpOw0KPiAtCQkJcHAtPmlvLmVuZCA9IG1pbl90KHJlc291cmNlX3NpemVfdCwN Cj4gLQkJCQkJICAgSU9fU1BBQ0VfTElNSVQsDQo+IC0JCQkJCSAgIHJhbmdlLnBjaV9hZGRyICsg cmFuZ2Uuc2l6ZQ0KPiAtCQkJCQkgICArIGdsb2JhbF9pb19vZmZzZXQgLSAxKTsNCj4gLQkJCXBw LT5pb19zaXplID0gcmVzb3VyY2Vfc2l6ZSgmcHAtPmlvKTsNCj4gLQkJCXBwLT5pb19idXNfYWRk ciA9IHJhbmdlLnBjaV9hZGRyOw0KPiAtCQkJcHAtPmlvX2Jhc2UgPSByYW5nZS5jcHVfYWRkcjsN Cj4gLQ0KPiAtCQkJLyogRmluZCB0aGUgdW50cmFuc2xhdGVkIElPIHNwYWNlIGFkZHJlc3MgKi8N Cj4gLQkJCXBwLT5pb19tb2RfYmFzZSA9IG9mX3JlYWRfbnVtYmVyKHBhcnNlci5yYW5nZSAtDQo+ IC0JCQkJCQkJIHBhcnNlci5ucCArIG5hLCBucyk7DQo+IC0JCX0NCj4gLQkJaWYgKHJlc3R5cGUg PT0gSU9SRVNPVVJDRV9NRU0pIHsNCj4gLQkJCW9mX3BjaV9yYW5nZV90b19yZXNvdXJjZSgmcmFu Z2UsIG5wLCAmcHAtPm1lbSk7DQo+IC0JCQlwcC0+bWVtLm5hbWUgPSAiTUVNIjsNCj4gLQkJCXBw LT5tZW1fc2l6ZSA9IHJlc291cmNlX3NpemUoJnBwLT5tZW0pOw0KPiAtCQkJcHAtPm1lbV9idXNf YWRkciA9IHJhbmdlLnBjaV9hZGRyOw0KPiAtDQo+IC0JCQkvKiBGaW5kIHRoZSB1bnRyYW5zbGF0 ZWQgTUVNIHNwYWNlIGFkZHJlc3MgKi8NCj4gLQkJCXBwLT5tZW1fbW9kX2Jhc2UgPSBvZl9yZWFk X251bWJlcihwYXJzZXIucmFuZ2UgLQ0KPiAtCQkJCQkJCSAgcGFyc2VyLm5wICsgbmEsIG5zKTsN Cj4gLQkJfQ0KPiAtCQlpZiAocmVzdHlwZSA9PSAwKSB7DQo+IC0JCQlvZl9wY2lfcmFuZ2VfdG9f cmVzb3VyY2UoJnJhbmdlLCBucCwgJnBwLT5jZmcpOw0KPiAtCQkJcHAtPmNmZzBfc2l6ZSA9IHJl c291cmNlX3NpemUoJnBwLT5jZmcpLzI7DQo+IC0JCQlwcC0+Y2ZnMV9zaXplID0gcmVzb3VyY2Vf c2l6ZSgmcHAtPmNmZykvMjsNCj4gLQkJCXBwLT5jZmcwX2Jhc2UgPSBwcC0+Y2ZnLnN0YXJ0Ow0K PiAtCQkJcHAtPmNmZzFfYmFzZSA9IHBwLT5jZmcuc3RhcnQgKyBwcC0+Y2ZnMF9zaXplOw0KPiAr CXJlc291cmNlX2xpc3RfZm9yX2VhY2hfZW50cnkod2luLCAmcmVzKSB7DQo+ICsJCXN3aXRjaCAo cmVzb3VyY2VfdHlwZSh3aW4tPnJlcykpIHsNCj4gKwkJY2FzZSBJT1JFU09VUkNFX0lPOg0KPiAr CQkJcHAtPmlvID0gd2luLT5yZXM7DQo+ICsJCQlwcC0+aW8tPm5hbWUgPSAiSS9PIjsNCj4gKwkJ CXBwLT5pb19zaXplID0gcmVzb3VyY2Vfc2l6ZShwcC0+aW8pOw0KPiArCQkJcHAtPmlvX2J1c19h ZGRyID0gcHAtPmlvLT5zdGFydCAtIHdpbi0+b2Zmc2V0Ow0KPiArCQkJLyogbWFnaWMgNSBiZWxv dyBjb21lcyBmcm9tIG1hZ2ljIG5hIGFuZCBucyBpbg0KPiArCQkJICogb2ZfcGNpX3JhbmdlX3Bh cnNlcl9pbml0KCkgICAgICAgICAgICAgICAgICovDQo+ICsJCQlwcC0+aW9fbW9kX2Jhc2UgPSBv Zl9yZWFkX251bWJlcihwYXJzZXJfcmFuZ2VfZW5kIC0NCj4gKwkJCQkJb2Zfbl9hZGRyX2NlbGxz KG5wKSAtIDUgKyBuYSwgbnMpOw0KPiArCQkJcmV0ID0gcGNpX3JlbWFwX2lvc3BhY2UocHAtPmlv LCBwcC0+aW9fYmFzZSk7DQo+ICsJCQlpZiAocmV0KSB7DQo+ICsJCQkJZGV2X3dhcm4ocHAtPmRl diwgImVycm9yICVkOiBmYWlsZWQgdG8gbWFwDQo+IHJlc291cmNlICVwUlxuIiwNCj4gKwkJCQly ZXQsIHBwLT5pbyk7DQo+ICsJCQljb250aW51ZTsNCj4gKwkJCX0NCj4gKwkJCWJyZWFrOw0KPiAr CQljYXNlIElPUkVTT1VSQ0VfTUVNOg0KPiArCQkJcHAtPm1lbSA9IHdpbi0+cmVzOw0KPiArCQkJ cHAtPm1lbS0+bmFtZSA9ICJNRU0iOw0KPiArCQkJcHAtPm1lbV9zaXplID0gcmVzb3VyY2Vfc2l6 ZShwcC0+bWVtKTsNCj4gKwkJCXBwLT5tZW1fYnVzX2FkZHIgPSBwcC0+bWVtLT5zdGFydCAtIHdp bi0+b2Zmc2V0Ow0KPiArCQkJcHAtPm1lbV9tb2RfYmFzZSA9IG9mX3JlYWRfbnVtYmVyKHBhcnNl cl9yYW5nZV9lbmQgLQ0KPiArCQkJCQlvZl9uX2FkZHJfY2VsbHMobnApIC0gNSArIG5hLCBucyk7 DQo+ICsJCQlicmVhazsNCj4gKwkJY2FzZSAwOg0KPiArCQkJcHAtPmNmZyA9IHdpbi0+cmVzOw0K PiArCQkJcHAtPmNmZzBfc2l6ZSA9IHJlc291cmNlX3NpemUocHAtPmNmZykvMjsNCj4gKwkJCXBw LT5jZmcxX3NpemUgPSByZXNvdXJjZV9zaXplKHBwLT5jZmcpLzI7DQo+ICsJCQlwcC0+Y2ZnMF9i YXNlID0gcHAtPmNmZy0+c3RhcnQ7DQo+ICsJCQlwcC0+Y2ZnMV9iYXNlID0gcHAtPmNmZy0+c3Rh cnQgKyBwcC0+Y2ZnMF9zaXplOw0KPiANCj4gIAkJCS8qIEZpbmQgdGhlIHVudHJhbnNsYXRlZCBj b25maWd1cmF0aW9uIHNwYWNlIGFkZHJlc3MNCj4gKi8NCj4gLQkJCXBwLT5jZmcwX21vZF9iYXNl ID0gb2ZfcmVhZF9udW1iZXIocGFyc2VyLnJhbmdlIC0NCj4gLQkJCQkJCQkgICBwYXJzZXIubnAg KyBuYSwgbnMpOw0KPiAtCQkJcHAtPmNmZzFfbW9kX2Jhc2UgPSBwcC0+Y2ZnMF9tb2RfYmFzZSAr DQo+IC0JCQkJCSAgICBwcC0+Y2ZnMF9zaXplOw0KPiArCQkJcHAtPmNmZzBfbW9kX2Jhc2UgPSBv Zl9yZWFkX251bWJlcihwYXJzZXJfcmFuZ2VfZW5kIC0NCj4gKwkJCQkJb2Zfbl9hZGRyX2NlbGxz KG5wKSAtIDUgKyBuYSwgbnMpOw0KPiArCQkJcHAtPmNmZzFfbW9kX2Jhc2UgPSBwcC0+Y2ZnMF9t b2RfYmFzZSArIHBwLT5jZmcwX3NpemU7DQo+ICsJCQlicmVhazsNCj4gKwkJY2FzZSBJT1JFU09V UkNFX0JVUzoNCj4gKwkJCXBwLT5idXNuID0gd2luLT5yZXM7DQo+ICsJCQlicmVhazsNCj4gKwkJ ZGVmYXVsdDoNCj4gKwkJCWNvbnRpbnVlOw0KPiAgCQl9DQo+ICAJfQ0KPiANCj4gLQlyZXQgPSBv Zl9wY2lfcGFyc2VfYnVzX3JhbmdlKG5wLCAmcHAtPmJ1c24pOw0KPiAtCWlmIChyZXQgPCAwKSB7 DQo+IC0JCXBwLT5idXNuLm5hbWUgPSBucC0+bmFtZTsNCj4gLQkJcHAtPmJ1c24uc3RhcnQgPSAw Ow0KPiAtCQlwcC0+YnVzbi5lbmQgPSAweGZmOw0KPiAtCQlwcC0+YnVzbi5mbGFncyA9IElPUkVT T1VSQ0VfQlVTOw0KPiAtCQlkZXZfZGJnKHBwLT5kZXYsICJmYWlsZWQgdG8gcGFyc2UgYnVzLXJh bmdlIHByb3BlcnR5OiAlZCwNCj4gdXNpbmcgZGVmYXVsdCAlcFJcbiIsDQo+IC0JCQlyZXQsICZw cC0+YnVzbik7DQo+IC0JfQ0KPiAtDQo+ICAJaWYgKCFwcC0+ZGJpX2Jhc2UpIHsNCj4gLQkJcHAt PmRiaV9iYXNlID0gZGV2bV9pb3JlbWFwKHBwLT5kZXYsIHBwLT5jZmcuc3RhcnQsDQo+IC0JCQkJ CXJlc291cmNlX3NpemUoJnBwLT5jZmcpKTsNCj4gKwkJcHAtPmRiaV9iYXNlID0gZGV2bV9pb3Jl bWFwKHBwLT5kZXYsIHBwLT5jZmctPnN0YXJ0LA0KPiArCQkJCQlyZXNvdXJjZV9zaXplKHBwLT5j ZmcpKTsNCj4gIAkJaWYgKCFwcC0+ZGJpX2Jhc2UpIHsNCj4gIAkJCWRldl9lcnIocHAtPmRldiwg ImVycm9yIHdpdGggaW9yZW1hcFxuIik7DQo+ICAJCQlyZXR1cm4gLUVOT01FTTsNCj4gIAkJfQ0K PiAgCX0NCj4gDQo+IC0JcHAtPm1lbV9iYXNlID0gcHAtPm1lbS5zdGFydDsNCj4gKwlwcC0+bWVt X2Jhc2UgPSBwcC0+bWVtLT5zdGFydDsNCj4gDQo+ICAJaWYgKCFwcC0+dmFfY2ZnMF9iYXNlKSB7 DQo+ICAJCXBwLT52YV9jZmcwX2Jhc2UgPSBkZXZtX2lvcmVtYXAocHAtPmRldiwgcHAtPmNmZzBf YmFzZSwNCj4gQEAgLTQ5MywyNCArNDgyLDQ3IEBAIGludCBkd19wY2llX2hvc3RfaW5pdChzdHJ1 Y3QgcGNpZV9wb3J0ICpwcCkNCj4gIAlpZiAocHAtPm9wcy0+aG9zdF9pbml0KQ0KPiAgCQlwcC0+ b3BzLT5ob3N0X2luaXQocHApOw0KPiANCj4gLQlkd19wY2llX3dyX293bl9jb25mKHBwLCBQQ0lf QkFTRV9BRERSRVNTXzAsIDQsIDApOw0KPiArCWlmIChkd19wY2llX3dyX293bl9jb25mKHBwLCBQ Q0lfQkFTRV9BRERSRVNTXzAsIDQsIDApDQo+ICsJCQkhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpDQo+ ICsJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAkvKiBwcm9ncmFtIGNvcnJlY3QgY2xhc3MgZm9y IFJDICovDQo+IC0JZHdfcGNpZV93cl9vd25fY29uZihwcCwgUENJX0NMQVNTX0RFVklDRSwgMiwN Cj4gUENJX0NMQVNTX0JSSURHRV9QQ0kpOw0KPiArCWlmIChkd19wY2llX3dyX293bl9jb25mKHBw LCBQQ0lfQ0xBU1NfREVWSUNFLCAyLA0KPiBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkNCj4gKwkJCSE9 IFBDSUJJT1NfU1VDQ0VTU0ZVTCkNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4gKwlpZiAo ZHdfcGNpZV9yZF9vd25fY29uZihwcCwgUENJRV9MSU5LX1dJRFRIX1NQRUVEX0NPTlRST0wsIDQs DQo+ICZ2YWwpDQo+ICsJCQkhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpDQo+ICsJCXJldHVybiAtRUlO VkFMOw0KPiANCj4gLQlkd19wY2llX3JkX293bl9jb25mKHBwLCBQQ0lFX0xJTktfV0lEVEhfU1BF RURfQ09OVFJPTCwgNCwgJnZhbCk7DQo+ICAJdmFsIHw9IFBPUlRfTE9HSUNfU1BFRURfQ0hBTkdF Ow0KPiAtCWR3X3BjaWVfd3Jfb3duX2NvbmYocHAsIFBDSUVfTElOS19XSURUSF9TUEVFRF9DT05U Uk9MLCA0LCB2YWwpOw0KPiANCj4gLSNpZmRlZiBDT05GSUdfUENJX01TSQ0KPiAtCWR3X3BjaWVf bXNpX2NoaXAuZGV2ID0gcHAtPmRldjsNCj4gLQlkd19wY2kubXNpX2N0cmwgPSAmZHdfcGNpZV9t c2lfY2hpcDsNCj4gKwlpZiAoZHdfcGNpZV93cl9vd25fY29uZihwcCwgUENJRV9MSU5LX1dJRFRI X1NQRUVEX0NPTlRST0wsIDQsIHZhbCkNCj4gKwkJCSE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkNCj4g KwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsNCj4gKwlidXMgPSBwY2lfY3JlYXRlX3Jvb3RfYnVzKHBw LT5kZXYsIHBwLT5yb290X2J1c19uciwgJmR3X3BjaWVfb3BzLA0KPiArCQkJICAgICAgcHAsICZy ZXMpOw0KPiArCWlmICghYnVzKQ0KPiArCQlyZXR1cm4gLUVOT01FTTsNCj4gKw0KPiArI2lmZGVm IENPTkZJR19HRU5FUklDX01TSV9JUlFfRE9NQUlODQo+ICsJYnVzLT5tc2kgPSBjb250YWluZXJf b2YoJnBwLT5pcnFfZG9tYWluLCBzdHJ1Y3QgbXNpX2NvbnRyb2xsZXIsDQo+IGRvbWFpbik7DQo+ ICsjZWxzZQ0KPiArCWJ1cy0+bXNpID0gJmR3X3BjaWVfbXNpX2NoaXA7DQo+ICAjZW5kaWYNCj4g DQo+IC0JZHdfcGNpLm5yX2NvbnRyb2xsZXJzID0gMTsNCj4gLQlkd19wY2kucHJpdmF0ZV9kYXRh ID0gKHZvaWQgKiopJnBwOw0KPiArCXBjaV9zY2FuX2NoaWxkX2J1cyhidXMpOw0KPiArCWlmIChw cC0+b3BzLT5zY2FuX2J1cykNCj4gKwkJcHAtPm9wcy0+c2Nhbl9idXMocHApOw0KPiANCj4gLQlw Y2lfY29tbW9uX2luaXRfZGV2KHBwLT5kZXYsICZkd19wY2kpOw0KPiArI2lmZGVmIENPTkZJR19B Uk0NCj4gKwkvKiBzdXBwb3J0IG9sZCBkdGJzIHRoYXQgaW5jb3JyZWN0bHkgZGVzY3JpYmUgSVJR cyAqLw0KPiArCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgb2ZfaXJxX3BhcnNl X2FuZF9tYXBfcGNpKTsNCj4gKyNlbmRpZg0KPiArDQo+ICsJcGNpX2Fzc2lnbl91bmFzc2lnbmVk X2J1c19yZXNvdXJjZXMoYnVzKTsNCj4gKwlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7DQo+IA0K PiAgCXJldHVybiAwOw0KPiAgfQ0KPiBAQCAtNjUzLDcgKzY2NSw3IEBAIHN0YXRpYyBpbnQgZHdf cGNpZV92YWxpZF9jb25maWcoc3RydWN0IHBjaWVfcG9ydA0KPiAqcHAsDQo+ICBzdGF0aWMgaW50 IGR3X3BjaWVfcmRfY29uZihzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sIGludCB3aGVy ZSwNCj4gIAkJCWludCBzaXplLCB1MzIgKnZhbCkNCj4gIHsNCj4gLQlzdHJ1Y3QgcGNpZV9wb3J0 ICpwcCA9IHN5c190b19wY2llKGJ1cy0+c3lzZGF0YSk7DQo+ICsJc3RydWN0IHBjaWVfcG9ydCAq cHAgPSBidXMtPnN5c2RhdGE7DQo+ICAJaW50IHJldDsNCj4gDQo+ICAJaWYgKGR3X3BjaWVfdmFs aWRfY29uZmlnKHBwLCBidXMsIFBDSV9TTE9UKGRldmZuKSkgPT0gMCkgew0KPiBAQCAtNjc3LDcg KzY4OSw3IEBAIHN0YXRpYyBpbnQgZHdfcGNpZV9yZF9jb25mKHN0cnVjdCBwY2lfYnVzICpidXMs IHUzMg0KPiBkZXZmbiwgaW50IHdoZXJlLA0KPiAgc3RhdGljIGludCBkd19wY2llX3dyX2NvbmYo c3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRldmZuLA0KPiAgCQkJaW50IHdoZXJlLCBpbnQgc2l6 ZSwgdTMyIHZhbCkNCj4gIHsNCj4gLQlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IHN5c190b19wY2ll KGJ1cy0+c3lzZGF0YSk7DQo+ICsJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBidXMtPnN5c2RhdGE7 DQo+ICAJaW50IHJldDsNCj4gDQo+ICAJaWYgKGR3X3BjaWVfdmFsaWRfY29uZmlnKHBwLCBidXMs IFBDSV9TTE9UKGRldmZuKSkgPT0gMCkNCj4gQEAgLTcwMSw2NCArNzEzLDYgQEAgc3RhdGljIHN0 cnVjdCBwY2lfb3BzIGR3X3BjaWVfb3BzID0gew0KPiAgCS53cml0ZSA9IGR3X3BjaWVfd3JfY29u ZiwNCj4gIH07DQo+IA0KPiAtc3RhdGljIGludCBkd19wY2llX3NldHVwKGludCBuciwgc3RydWN0 IHBjaV9zeXNfZGF0YSAqc3lzKQ0KPiAtew0KPiAtCXN0cnVjdCBwY2llX3BvcnQgKnBwOw0KPiAt DQo+IC0JcHAgPSBzeXNfdG9fcGNpZShzeXMpOw0KPiAtDQo+IC0JaWYgKGdsb2JhbF9pb19vZmZz ZXQgPCBTWl8xTSAmJiBwcC0+aW9fc2l6ZSA+IDApIHsNCj4gLQkJc3lzLT5pb19vZmZzZXQgPSBn bG9iYWxfaW9fb2Zmc2V0IC0gcHAtPmlvX2J1c19hZGRyOw0KPiAtCQlwY2lfaW9yZW1hcF9pbyhn bG9iYWxfaW9fb2Zmc2V0LCBwcC0+aW9fYmFzZSk7DQo+IC0JCWdsb2JhbF9pb19vZmZzZXQgKz0g U1pfNjRLOw0KPiAtCQlwY2lfYWRkX3Jlc291cmNlX29mZnNldCgmc3lzLT5yZXNvdXJjZXMsICZw cC0+aW8sDQo+IC0JCQkJCXN5cy0+aW9fb2Zmc2V0KTsNCj4gLQl9DQo+IC0NCj4gLQlzeXMtPm1l bV9vZmZzZXQgPSBwcC0+bWVtLnN0YXJ0IC0gcHAtPm1lbV9idXNfYWRkcjsNCj4gLQlwY2lfYWRk X3Jlc291cmNlX29mZnNldCgmc3lzLT5yZXNvdXJjZXMsICZwcC0+bWVtLCBzeXMtDQo+ID5tZW1f b2Zmc2V0KTsNCj4gLQlwY2lfYWRkX3Jlc291cmNlKCZzeXMtPnJlc291cmNlcywgJnBwLT5idXNu KTsNCj4gLQ0KPiAtCXJldHVybiAxOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgc3RydWN0IHBjaV9i dXMgKmR3X3BjaWVfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhDQo+ICpzeXMp DQo+IC17DQo+IC0Jc3RydWN0IHBjaV9idXMgKmJ1czsNCj4gLQlzdHJ1Y3QgcGNpZV9wb3J0ICpw cCA9IHN5c190b19wY2llKHN5cyk7DQo+IC0NCj4gLQlwcC0+cm9vdF9idXNfbnIgPSBzeXMtPmJ1 c25yOw0KPiAtCWJ1cyA9IHBjaV9jcmVhdGVfcm9vdF9idXMocHAtPmRldiwgc3lzLT5idXNuciwN Cj4gLQkJCQkgICZkd19wY2llX29wcywgc3lzLCAmc3lzLT5yZXNvdXJjZXMpOw0KPiAtCWlmICgh YnVzKQ0KPiAtCQlyZXR1cm4gTlVMTDsNCj4gLQ0KPiAtCXBjaV9zY2FuX2NoaWxkX2J1cyhidXMp Ow0KPiAtDQo+IC0JaWYgKGJ1cyAmJiBwcC0+b3BzLT5zY2FuX2J1cykNCj4gLQkJcHAtPm9wcy0+ c2Nhbl9idXMocHApOw0KPiAtDQo+IC0JcmV0dXJuIGJ1czsNCj4gLX0NCj4gLQ0KPiAtc3RhdGlj IGludCBkd19wY2llX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwg dTggcGluKQ0KPiAtew0KPiAtCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gc3lzX3RvX3BjaWUoZGV2 LT5idXMtPnN5c2RhdGEpOw0KPiAtCWludCBpcnE7DQo+IC0NCj4gLQlpcnEgPSBvZl9pcnFfcGFy c2VfYW5kX21hcF9wY2koZGV2LCBzbG90LCBwaW4pOw0KPiAtCWlmICghaXJxKQ0KPiAtCQlpcnEg PSBwcC0+aXJxOw0KPiAtDQo+IC0JcmV0dXJuIGlycTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIHN0 cnVjdCBod19wY2kgZHdfcGNpID0gew0KPiAtCS5zZXR1cAkJPSBkd19wY2llX3NldHVwLA0KPiAt CS5zY2FuCQk9IGR3X3BjaWVfc2Nhbl9idXMsDQo+IC0JLm1hcF9pcnEJPSBkd19wY2llX21hcF9p cnEsDQo+IC19Ow0KPiAtDQo+ICB2b2lkIGR3X3BjaWVfc2V0dXBfcmMoc3RydWN0IHBjaWVfcG9y dCAqcHApDQo+ICB7DQo+ICAJdTMyIHZhbDsNCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hv c3QvcGNpZS1kZXNpZ253YXJlLmgNCj4gYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2Fy ZS5oDQo+IGluZGV4IGQwYmJkMjcuLmFiNzg3MTAgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvcGNp L2hvc3QvcGNpZS1kZXNpZ253YXJlLmgNCj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRl c2lnbndhcmUuaA0KPiBAQCAtMzQsNyArMzQsNyBAQCBzdHJ1Y3QgcGNpZV9wb3J0IHsNCj4gIAl1 NjQJCQljZmcxX21vZF9iYXNlOw0KPiAgCXZvaWQgX19pb21lbQkJKnZhX2NmZzFfYmFzZTsNCj4g IAl1MzIJCQljZmcxX3NpemU7DQo+IC0JdTY0CQkJaW9fYmFzZTsNCj4gKwlyZXNvdXJjZV9zaXpl X3QJCQlpb19iYXNlOw0KPiAgCXU2NAkJCWlvX21vZF9iYXNlOw0KPiAgCXBoeXNfYWRkcl90CQlp b19idXNfYWRkcjsNCj4gIAl1MzIJCQlpb19zaXplOw0KPiBAQCAtNDIsMTAgKzQyLDEwIEBAIHN0 cnVjdCBwY2llX3BvcnQgew0KPiAgCXU2NAkJCW1lbV9tb2RfYmFzZTsNCj4gIAlwaHlzX2FkZHJf dAkJbWVtX2J1c19hZGRyOw0KPiAgCXUzMgkJCW1lbV9zaXplOw0KPiAtCXN0cnVjdCByZXNvdXJj ZQkJY2ZnOw0KPiAtCXN0cnVjdCByZXNvdXJjZQkJaW87DQo+IC0Jc3RydWN0IHJlc291cmNlCQlt ZW07DQo+IC0Jc3RydWN0IHJlc291cmNlCQlidXNuOw0KPiArCXN0cnVjdCByZXNvdXJjZQkJKmNm ZzsNCj4gKwlzdHJ1Y3QgcmVzb3VyY2UJCSppbzsNCj4gKwlzdHJ1Y3QgcmVzb3VyY2UJCSptZW07 DQo+ICsJc3RydWN0IHJlc291cmNlCQkqYnVzbjsNCj4gIAlpbnQJCQlpcnE7DQo+ICAJdTMyCQkJ bGFuZXM7DQo+ICAJc3RydWN0IHBjaWVfaG9zdF9vcHMJKm9wczsNCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcGNpL2hvc3QvcGNpZS1zcGVhcjEzeHguYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS0N Cj4gc3BlYXIxM3h4LmMNCj4gaW5kZXggMDIwZDc4OC4uZTc4ZGRmOCAxMDA2NDQNCj4gLS0tIGEv ZHJpdmVycy9wY2kvaG9zdC9wY2llLXNwZWFyMTN4eC5jDQo+ICsrKyBiL2RyaXZlcnMvcGNpL2hv c3QvcGNpZS1zcGVhcjEzeHguYw0KPiBAQCAtMjg3LDcgKzI4Nyw3IEBAIHN0YXRpYyBpbnQgc3Bl YXIxM3h4X2FkZF9wY2llX3BvcnQoc3RydWN0IHBjaWVfcG9ydA0KPiAqcHAsDQo+ICAJCXJldHVy biByZXQ7DQo+ICAJfQ0KPiANCj4gLQlwcC0+cm9vdF9idXNfbnIgPSAtMTsNCj4gKwlwcC0+cm9v dF9idXNfbnIgPSAwOw0KPiAgCXBwLT5vcHMgPSAmc3BlYXIxM3h4X3BjaWVfaG9zdF9vcHM7DQo+ IA0KPiAgCXJldCA9IGR3X3BjaWVfaG9zdF9pbml0KHBwKTsNCj4gLS0NCj4gMS45LjENCg0K -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Zhou Wang wrote: > I tested this patch on D02 board of Hisilicon. It works well. > I have compiled the driver with multi_v7_defconfig. However, I don't > have > ARM32 PCIe related board to do test. It will be appreciated if someone > could > help to test it. > > Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com> > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> > Tested-by: Fabrice Gasnier <fabrice.gasnier@st.com> > Tested-by: James Morse <james.morse@arm.com> Tests on this new series, using the same i.MX 6Quad board, are not working. The network card is no longer detected, and I get a lockup when removing the root bridge and rescanning. Partial dmesg output below. Significantly, the lines: > [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: > [ 0.152142] No bus range found for /soc/pcie@0x01000000, using [bus 00-ff] are new. Both series are applied to v4.1, use the same .config file, and the same dtb. I will investigate further. (Re-testing v2 works, so this isn't an interim hardware failure) Thanks, James root@localhost:~# dmesg | grep -i pci [ 0.126184] PCI: CLS 0 bytes, default 64 [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: [ 0.152142] No bus range found for /soc/pcie@0x01000000, using [bus 00-ff] [ 0.154183] imx6q-pcie 1ffc000.pcie: PCI host bridge to bus 0000:00 [ 0.154201] pci_bus 0000:00: root bus resource [bus 00-ff] [ 0.154215] pci_bus 0000:00: root bus resource [??? 0x01f00000-0x01f7ffff flags 0x0] [ 0.154228] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] [ 0.154270] pci_bus 0000:00: root bus resource [mem 0x01000000-0x01efffff] [ 0.154306] pci 0000:00:00.0: [16c3:abcd] type 01 class 0x060400 [ 0.154333] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x000fffff] [ 0.154352] pci 0000:00:00.0: reg 0x38: [mem 0x00000000-0x0000ffff pref] [ 0.154377] pci 0000:00:00.0: IOMMU is currently not supported for PCI [ 0.154429] pci 0000:00:00.0: supports D1 [ 0.154440] pci 0000:00:00.0: PME# supported from D0 D1 D3hot D3cold [ 0.154683] PCI: bus0: Fast back to back transfers disabled [ 0.154806] PCI: bus1: Fast back to back transfers enabled [ 0.154884] pci 0000:00:00.0: BAR 0: assigned [mem 0x01000000-0x010fffff] [ 0.154903] pci 0000:00:00.0: BAR 6: assigned [mem 0x01100000-0x0110ffff pref] [ 0.154917] pci 0000:00:00.0: PCI bridge to [bus 01] [ 0.155145] pcieport 0000:00:00.0: Signaling PME through PCIe PME interrupt [ 0.155161] pcie_pme 0000:00:00.0:pcie01: service driver pcie_pme loaded [ 0.155279] aer 0000:00:00.0:pcie02: service driver aer loaded [ 1.188840] ehci-pci: EHCI PCI platform driver [ 1.232518] ohci-pci: OHCI PCI platform driver -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBsaW51eC1wY2ktb3duZXJAdmdl ci5rZXJuZWwub3JnIFttYWlsdG86bGludXgtcGNpLQ0KPiBvd25lckB2Z2VyLmtlcm5lbC5vcmdd IE9uIEJlaGFsZiBPZiBKYW1lcyBNb3JzZQ0KPiBTZW50OiBXZWRuZXNkYXksIEp1bHkgMDEsIDIw MTUgMzoyNyBQTQ0KPiBUbzogR2FicmllbGUgUGFvbG9uaTsgV2FuZ3pob3UgKEIpOyBCam9ybiBI ZWxnYWFzOyBKaW5nb28gSGFuOyBQcmF0eXVzaA0KPiBBbmFuZDsgQXJuZCBCZXJnbWFubjsgTGl2 aXUgRHVkYXU7IGtpc2hvbkB0aS5jb207IHhvYnNAa29zYWdpLmNvbTsgbS0NCj4ga2FyaWNoZXJp MkB0aS5jb207IE1pbmdodWFuLkxpYW5AZnJlZXNjYWxlLmNvbQ0KPiBDYzogbGludXgtcGNpQHZn ZXIua2VybmVsLm9yZzsgbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOw0KPiBk ZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZzsgWXVhbnpoaWNoYW5nOyBaaHVkYWNhaTsgemhhbmdq dWt1bzsNCj4gcWl1emhlbmZhOyBMaWd1b3podSAoS2VubmV0aCkNCj4gU3ViamVjdDogUmU6IFtQ QVRDSCB2MyAyLzVdIFBDSTogZGVzaWdud2FyZTogQWRkIEFSTTY0IHN1cHBvcnQNCj4gDQo+IFpo b3UgV2FuZyB3cm90ZToNCj4gPiBJIHRlc3RlZCB0aGlzIHBhdGNoIG9uIEQwMiBib2FyZCBvZiBI aXNpbGljb24uIEl0IHdvcmtzIHdlbGwuDQo+ID4gSSBoYXZlIGNvbXBpbGVkIHRoZSBkcml2ZXIg d2l0aCBtdWx0aV92N19kZWZjb25maWcuIEhvd2V2ZXIsIEkgZG9uJ3QNCj4gPiBoYXZlDQo+ID4g QVJNMzIgUENJZSByZWxhdGVkIGJvYXJkIHRvIGRvIHRlc3QuIEl0IHdpbGwgYmUgYXBwcmVjaWF0 ZWQgaWYNCj4gc29tZW9uZQ0KPiA+IGNvdWxkDQo+ID4gaGVscCB0byB0ZXN0IGl0Lg0KPiA+DQo+ ID4gU2lnbmVkLW9mZi1ieTogWmhvdSBXYW5nIDx3YW5nemhvdTFAaGlzaWxpY29uLmNvbT4NCj4g PiBTaWduZWQtb2ZmLWJ5OiBBcm5kIEJlcmdtYW5uIDxhcm5kQGFybmRiLmRlPg0KPiA+IFNpZ25l ZC1vZmYtYnk6IEdhYnJpZWxlIFBhb2xvbmkgPGdhYnJpZWxlLnBhb2xvbmlAaHVhd2VpLmNvbT4N Cj4gPiBUZXN0ZWQtYnk6IEZhYnJpY2UgR2FzbmllciA8ZmFicmljZS5nYXNuaWVyQHN0LmNvbT4N Cj4gPiBUZXN0ZWQtYnk6IEphbWVzIE1vcnNlIDxqYW1lcy5tb3JzZUBhcm0uY29tPg0KPiANCj4g VGVzdHMgb24gdGhpcyBuZXcgc2VyaWVzLCB1c2luZyB0aGUgc2FtZSBpLk1YIDZRdWFkIGJvYXJk LCBhcmUgbm90DQo+IHdvcmtpbmcuDQo+IA0KPiBUaGUgbmV0d29yayBjYXJkIGlzIG5vIGxvbmdl ciBkZXRlY3RlZCwgYW5kIEkgZ2V0IGEgbG9ja3VwIHdoZW4NCj4gcmVtb3ZpbmcNCj4gdGhlIHJv b3QgYnJpZGdlIGFuZCByZXNjYW5uaW5nLg0KPiANCj4gUGFydGlhbCBkbWVzZyBvdXRwdXQgYmVs b3cuIFNpZ25pZmljYW50bHksIHRoZSBsaW5lczoNCj4gPiBbICAgIDAuMTUyMTI4XSBQQ0kgaG9z dCBicmlkZ2UgL3NvYy9wY2llQDB4MDEwMDAwMDAgcmFuZ2VzOg0KPiA+IFsgICAgMC4xNTIxNDJd ICAgTm8gYnVzIHJhbmdlIGZvdW5kIGZvciAvc29jL3BjaWVAMHgwMTAwMDAwMCwgdXNpbmcNCj4g W2J1cw0KPiAwMC1mZl0NCj4gYXJlIG5ldy4NCj4gDQo+IEJvdGggc2VyaWVzIGFyZSBhcHBsaWVk IHRvIHY0LjEsIHVzZSB0aGUgc2FtZSAuY29uZmlnIGZpbGUsIGFuZCB0aGUNCj4gc2FtZSBkdGIu DQo+IEkgd2lsbCBpbnZlc3RpZ2F0ZSBmdXJ0aGVyLg0KPiANCj4gKFJlLXRlc3RpbmcgdjIgd29y a3MsIHNvIHRoaXMgaXNuJ3QgYW4gaW50ZXJpbSBoYXJkd2FyZSBmYWlsdXJlKQ0KDQpUaGlzIGlz IGEgYml0IHdlaXJkLi4uLg0KDQpQYXRjaCAyLzUgaXMgdGhlIG9ubHkgb25lIHRoYXQgYWZmZWN0 IHBsYXRmb3JtcyBkaWZmZXJlbnQgZnJvbSBIaXNpbGljb24NCg0KVGhlIG9ubHkgZGlmZmVyZW5j ZSBiZXR3ZWVuIFYzIHBhdGNoWzIvNV0gYW5kIHYyIHBhdGNoWzIvNF0gaXMNCg0KKioqKioqKioq KioqKg0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWtleXN0b25lLWR3LmMgYi9k cml2ZXJzL3BjaS9ob3N0L3BjaS1rZXlzdG9uZS1kdy5jDQppbmRleCBmMzQ4OTJlLi5iMWU0MTM1 IDEwMDY0NA0KLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2kta2V5c3RvbmUtZHcuYw0KKysrIGIv ZHJpdmVycy9wY2kvaG9zdC9wY2kta2V5c3RvbmUtZHcuYw0KQEAgLTMyNyw3ICszMjcsNyBAQCBz dGF0aWMgdm9pZCBrc19kd19wY2llX2NsZWFyX2RiaV9tb2RlKHZvaWQgX19pb21lbSAqcmVnX3Zp cnQpDQogdm9pZCBrc19kd19wY2llX3NldHVwX3JjX2FwcF9yZWdzKHN0cnVjdCBrZXlzdG9uZV9w Y2llICprc19wY2llKQ0KIHsNCiAJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSAma3NfcGNpZS0+cHA7 DQotCXUzMiBzdGFydCA9IHBwLT5tZW0uc3RhcnQsIGVuZCA9IHBwLT5tZW0uZW5kOw0KKwl1MzIg c3RhcnQgPSBwcC0+bWVtLT5zdGFydCwgZW5kID0gcHAtPm1lbS0+ZW5kOw0KIAlpbnQgaSwgdHJf c2l6ZTsNCiANCiAJLyogRGlzYWJsZSBCQVJzIGZvciBpbmJvdW5kIGFjY2VzcyAqLw0KKioqKioq KioqKioqKioNClRoYXQgaXMgcHJlc2VudCBpbiB2MyBidXQgbm90IGluIHYyLiBBbmQgaXQgc2hv dWxkIGFmZmVjdCBrZXlzdG9uZSBvbmx5Li4uLnNvIHVzaW5nIHBhdGNoIHYzIG9uIHRoZSBzYW1l IGJyYW5jaCB3aGVyZSB5b3UgYXBwbGllZCBwYXRjaCB2MiBJIHdvdWxkIGV4cGVjdCB0aGUgc2Ft ZSByZXN1bHRzLi4uDQoNCj4gDQo+IFRoYW5rcywNCj4gDQo+IEphbWVzDQo+IA0KPiANCj4gDQo+ IHJvb3RAbG9jYWxob3N0On4jIGRtZXNnIHwgZ3JlcCAtaSBwY2kNCj4gWyAgICAwLjEyNjE4NF0g UENJOiBDTFMgMCBieXRlcywgZGVmYXVsdCA2NA0KPiBbICAgIDAuMTUyMTI4XSBQQ0kgaG9zdCBi cmlkZ2UgL3NvYy9wY2llQDB4MDEwMDAwMDAgcmFuZ2VzOg0KPiBbICAgIDAuMTUyMTQyXSAgIE5v IGJ1cyByYW5nZSBmb3VuZCBmb3IgL3NvYy9wY2llQDB4MDEwMDAwMDAsIHVzaW5nDQo+IFtidXMg MDAtZmZdDQo+IFsgICAgMC4xNTQxODNdIGlteDZxLXBjaWUgMWZmYzAwMC5wY2llOiBQQ0kgaG9z dCBicmlkZ2UgdG8gYnVzIDAwMDA6MDANCj4gWyAgICAwLjE1NDIwMV0gcGNpX2J1cyAwMDAwOjAw OiByb290IGJ1cyByZXNvdXJjZSBbYnVzIDAwLWZmXQ0KPiBbICAgIDAuMTU0MjE1XSBwY2lfYnVz IDAwMDA6MDA6IHJvb3QgYnVzIHJlc291cmNlIFs/Pz8NCj4gMHgwMWYwMDAwMC0weDAxZjdmZmZm IGZsYWdzIDB4MF0NCj4gWyAgICAwLjE1NDIyOF0gcGNpX2J1cyAwMDAwOjAwOiByb290IGJ1cyBy ZXNvdXJjZSBbaW8gIDB4MDAwMC0weGZmZmZdDQo+IFsgICAgMC4xNTQyNzBdIHBjaV9idXMgMDAw MDowMDogcm9vdCBidXMgcmVzb3VyY2UgW21lbSAweDAxMDAwMDAwLQ0KPiAweDAxZWZmZmZmXQ0K PiBbICAgIDAuMTU0MzA2XSBwY2kgMDAwMDowMDowMC4wOiBbMTZjMzphYmNkXSB0eXBlIDAxIGNs YXNzIDB4MDYwNDAwDQo+IFsgICAgMC4xNTQzMzNdIHBjaSAwMDAwOjAwOjAwLjA6IHJlZyAweDEw OiBbbWVtIDB4MDAwMDAwMDAtMHgwMDBmZmZmZl0NCj4gWyAgICAwLjE1NDM1Ml0gcGNpIDAwMDA6 MDA6MDAuMDogcmVnIDB4Mzg6IFttZW0gMHgwMDAwMDAwMC0weDAwMDBmZmZmDQo+IHByZWZdDQo+ IFsgICAgMC4xNTQzNzddIHBjaSAwMDAwOjAwOjAwLjA6IElPTU1VIGlzIGN1cnJlbnRseSBub3Qg c3VwcG9ydGVkIGZvcg0KPiBQQ0kNCj4gWyAgICAwLjE1NDQyOV0gcGNpIDAwMDA6MDA6MDAuMDog c3VwcG9ydHMgRDENCj4gWyAgICAwLjE1NDQ0MF0gcGNpIDAwMDA6MDA6MDAuMDogUE1FIyBzdXBw b3J0ZWQgZnJvbSBEMCBEMSBEM2hvdCBEM2NvbGQNCj4gWyAgICAwLjE1NDY4M10gUENJOiBidXMw OiBGYXN0IGJhY2sgdG8gYmFjayB0cmFuc2ZlcnMgZGlzYWJsZWQNCj4gWyAgICAwLjE1NDgwNl0g UENJOiBidXMxOiBGYXN0IGJhY2sgdG8gYmFjayB0cmFuc2ZlcnMgZW5hYmxlZA0KPiBbICAgIDAu MTU0ODg0XSBwY2kgMDAwMDowMDowMC4wOiBCQVIgMDogYXNzaWduZWQgW21lbSAweDAxMDAwMDAw LQ0KPiAweDAxMGZmZmZmXQ0KPiBbICAgIDAuMTU0OTAzXSBwY2kgMDAwMDowMDowMC4wOiBCQVIg NjogYXNzaWduZWQgW21lbSAweDAxMTAwMDAwLQ0KPiAweDAxMTBmZmZmDQo+IHByZWZdDQo+IFsg ICAgMC4xNTQ5MTddIHBjaSAwMDAwOjAwOjAwLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMV0NCj4g WyAgICAwLjE1NTE0NV0gcGNpZXBvcnQgMDAwMDowMDowMC4wOiBTaWduYWxpbmcgUE1FIHRocm91 Z2ggUENJZSBQTUUNCj4gaW50ZXJydXB0DQo+IFsgICAgMC4xNTUxNjFdIHBjaWVfcG1lIDAwMDA6 MDA6MDAuMDpwY2llMDE6IHNlcnZpY2UgZHJpdmVyIHBjaWVfcG1lDQo+IGxvYWRlZA0KPiBbICAg IDAuMTU1Mjc5XSBhZXIgMDAwMDowMDowMC4wOnBjaWUwMjogc2VydmljZSBkcml2ZXIgYWVyIGxv YWRlZA0KPiBbICAgIDEuMTg4ODQwXSBlaGNpLXBjaTogRUhDSSBQQ0kgcGxhdGZvcm0gZHJpdmVy DQo+IFsgICAgMS4yMzI1MThdIG9oY2ktcGNpOiBPSENJIFBDSSBwbGF0Zm9ybSBkcml2ZXINCj4g DQo+IC0tDQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1 bnN1YnNjcmliZSBsaW51eC1wY2kiIGluDQo+IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpv cmRvbW9Admdlci5rZXJuZWwub3JnDQo+IE1vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92 Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbA0K -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Gabriele Paoloni wrote: >> Both series are applied to v4.1, use the same .config file, and the >> same dtb. >> I will investigate further. >> >> (Re-testing v2 works, so this isn't an interim hardware failure) > > This is a bit weird.... > > Patch 2/5 is the only one that affect platforms different from Hisilicon > > The only difference between V3 patch[2/5] and v2 patch[2/4] is Between v3:2/5 and your replacement for v2:2/4, which arrived after I had tested the v2 series. As the patch has been replaced with a different one - neither 'tested-by' is true any more. It looks like the BAR containing the bridge window is not being assigned, so no devices on bus 1 are discovered. I will send the full v2 and v3 dmesg output separately. Thanks, James -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2015/7/1 21:29, Gabriele Paoloni wrote: > Adding to the recipients list the authors of the drivers that depend on Synopsys Designware and that are not included > > Respectively: > pci-dra7xx Kishon Vijay Abraham I <kishon@ti.com> > pci-imx6 Sean Cross <xobs@kosagi.com> > pci-keystone Murali Karicheri <m-karicheri2@ti.com> > pci-layerscape Minghuan Lian <Minghuan.Lian@freescale.com> > > Driver Authors already included: > pci-exynos Jingoo Han <jg1.han@samsung.com> > pcie-spear13xx Pratyush Anand <pratyush.anand@st.com> > > Cheers > > Gab > Hi Gab, Many thanks for adding the related guys. Regards, Zhou >> -----Original Message----- >> From: Wangzhou (B) >> Sent: Wednesday, July 01, 2015 10:44 AM >> To: Bjorn Helgaas; Jingoo Han; Pratyush Anand; Arnd Bergmann; Gabriele >> Paoloni; James Morse; Liviu Dudau >> Cc: linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; >> devicetree@vger.kernel.org; Yuanzhichang; Zhudacai; zhangjukuo; >> qiuzhenfa; Liguozhu (Kenneth); Wangzhou (B) >> Subject: [PATCH v3 2/5] PCI: designware: Add ARM64 support >> >> This patch tries to unify ARM32 and ARM64 PCIe in designware driver. >> Delete >> function dw_pcie_setup, dw_pcie_scan_bus, dw_pcie_map_irq and struct >> hw_pci, >> move related operations to dw_pcie_host_init. Also set pp->root_bus_nr >> = 0 in >> each PCIe host driver which is based on pcie-designware. This patch >> also try >> to use of_pci_get_host_bridge_resources for ARM32 and ARM64 according >> to the >> suggestion for Gabriele[1] >> >> I tested this patch on D02 board of Hisilicon. It works well. >> I have compiled the driver with multi_v7_defconfig. However, I don't >> have >> ARM32 PCIe related board to do test. It will be appreciated if someone >> could >> help to test it. >> >> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com> >> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> >> Tested-by: Fabrice Gasnier <fabrice.gasnier@st.com> >> Tested-by: James Morse <james.morse@arm.com> >> >> [1] http://www.spinics.net/lists/linux-pci/msg42194.html >> --- >> drivers/pci/host/pci-dra7xx.c | 1 + >> drivers/pci/host/pci-exynos.c | 2 +- >> drivers/pci/host/pci-imx6.c | 2 +- >> drivers/pci/host/pci-keystone-dw.c | 2 +- >> drivers/pci/host/pci-keystone.c | 2 +- >> drivers/pci/host/pci-layerscape.c | 2 +- >> drivers/pci/host/pcie-designware.c | 242 +++++++++++++++-------------- >> -------- >> drivers/pci/host/pcie-designware.h | 10 +- >> drivers/pci/host/pcie-spear13xx.c | 2 +- >> 9 files changed, 110 insertions(+), 155 deletions(-) >> >> diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci- >> dra7xx.c >> index 2d57e19..5c8b6ab 100644 >> --- a/drivers/pci/host/pci-dra7xx.c >> +++ b/drivers/pci/host/pci-dra7xx.c >> @@ -280,6 +280,7 @@ static int __init dra7xx_add_pcie_port(struct >> dra7xx_pcie *dra7xx, >> >> pp = &dra7xx->pp; >> pp->dev = dev; >> + pp->root_bus_nr = 0; >> pp->ops = &dra7xx_pcie_host_ops; >> >> pp->irq = platform_get_irq(pdev, 1); >> diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci- >> exynos.c >> index c139237..4b6db6c 100644 >> --- a/drivers/pci/host/pci-exynos.c >> +++ b/drivers/pci/host/pci-exynos.c >> @@ -534,7 +534,7 @@ static int __init exynos_add_pcie_port(struct >> pcie_port *pp, >> } >> } >> >> - pp->root_bus_nr = -1; >> + pp->root_bus_nr = 0; >> pp->ops = &exynos_pcie_host_ops; >> >> ret = dw_pcie_host_init(pp); >> diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c >> index fdb9536..c4a80c5 100644 >> --- a/drivers/pci/host/pci-imx6.c >> +++ b/drivers/pci/host/pci-imx6.c >> @@ -541,7 +541,7 @@ static int __init imx6_add_pcie_port(struct >> pcie_port *pp, >> } >> } >> >> - pp->root_bus_nr = -1; >> + pp->root_bus_nr = 0; >> pp->ops = &imx6_pcie_host_ops; >> >> ret = dw_pcie_host_init(pp); >> diff --git a/drivers/pci/host/pci-keystone-dw.c b/drivers/pci/host/pci- >> keystone-dw.c >> index f34892e..b1e4135 100644 >> --- a/drivers/pci/host/pci-keystone-dw.c >> +++ b/drivers/pci/host/pci-keystone-dw.c >> @@ -327,7 +327,7 @@ static void ks_dw_pcie_clear_dbi_mode(void __iomem >> *reg_virt) >> void ks_dw_pcie_setup_rc_app_regs(struct keystone_pcie *ks_pcie) >> { >> struct pcie_port *pp = &ks_pcie->pp; >> - u32 start = pp->mem.start, end = pp->mem.end; >> + u32 start = pp->mem->start, end = pp->mem->end; >> int i, tr_size; >> >> /* Disable BARs for inbound access */ >> diff --git a/drivers/pci/host/pci-keystone.c b/drivers/pci/host/pci- >> keystone.c >> index 75333b0..df91f5e 100644 >> --- a/drivers/pci/host/pci-keystone.c >> +++ b/drivers/pci/host/pci-keystone.c >> @@ -312,7 +312,7 @@ static int __init ks_add_pcie_port(struct >> keystone_pcie *ks_pcie, >> return ret; >> } >> >> - pp->root_bus_nr = -1; >> + pp->root_bus_nr = 0; >> pp->ops = &keystone_pcie_host_ops; >> ret = ks_dw_pcie_host_init(ks_pcie, ks_pcie->msi_intc_np); >> if (ret) { >> diff --git a/drivers/pci/host/pci-layerscape.c b/drivers/pci/host/pci- >> layerscape.c >> index 4a6e62f..5c7a9c4 100644 >> --- a/drivers/pci/host/pci-layerscape.c >> +++ b/drivers/pci/host/pci-layerscape.c >> @@ -101,7 +101,7 @@ static int ls_add_pcie_port(struct ls_pcie *pcie) >> pp = &pcie->pp; >> pp->dev = pcie->dev; >> pp->dbi_base = pcie->dbi; >> - pp->root_bus_nr = -1; >> + pp->root_bus_nr = 0; >> pp->ops = &ls_pcie_host_ops; >> >> ret = dw_pcie_host_init(pp); >> diff --git a/drivers/pci/host/pcie-designware.c >> b/drivers/pci/host/pcie-designware.c >> index 2e9f84f..844febee 100644 >> --- a/drivers/pci/host/pcie-designware.c >> +++ b/drivers/pci/host/pcie-designware.c >> @@ -11,6 +11,7 @@ >> * published by the Free Software Foundation. >> */ >> >> +#include <linux/hardirq.h> >> #include <linux/irq.h> >> #include <linux/irqdomain.h> >> #include <linux/kernel.h> >> @@ -67,16 +68,7 @@ >> #define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16) >> #define PCIE_ATU_UPPER_TARGET 0x91C >> >> -static struct hw_pci dw_pci; >> - >> -static unsigned long global_io_offset; >> - >> -static inline struct pcie_port *sys_to_pcie(struct pci_sys_data *sys) >> -{ >> - BUG_ON(!sys->private_data); >> - >> - return sys->private_data; >> -} >> +static struct pci_ops dw_pcie_ops; >> >> int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) >> { >> @@ -238,7 +230,7 @@ static void dw_pcie_msi_set_irq(struct pcie_port >> *pp, int irq) >> static int assign_irq(int no_irqs, struct msi_desc *desc, int *pos) >> { >> int irq, pos0, i; >> - struct pcie_port *pp = sys_to_pcie(desc->dev->bus->sysdata); >> + struct pcie_port *pp = desc->dev->bus->sysdata; >> >> pos0 = bitmap_find_free_region(pp->msi_irq_in_use, MAX_MSI_IRQS, >> order_base_2(no_irqs)); >> @@ -281,7 +273,7 @@ static int dw_msi_setup_irq(struct msi_controller >> *chip, struct pci_dev *pdev, >> { >> int irq, pos; >> struct msi_msg msg; >> - struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); >> + struct pcie_port *pp = pdev->bus->sysdata; >> >> if (desc->msi_attrib.is_msix) >> return -EINVAL; >> @@ -310,7 +302,7 @@ static void dw_msi_teardown_irq(struct >> msi_controller *chip, unsigned int irq) >> { >> struct irq_data *data = irq_get_irq_data(irq); >> struct msi_desc *msi = irq_data_get_msi(data); >> - struct pcie_port *pp = sys_to_pcie(msi->dev->bus->sysdata); >> + struct pcie_port *pp = msi->dev->bus->sysdata; >> >> clear_irq_range(pp, irq, 1, data->hwirq); >> } >> @@ -342,16 +334,24 @@ static const struct irq_domain_ops msi_domain_ops >> = { >> .map = dw_pcie_msi_map, >> }; >> >> -int dw_pcie_host_init(struct pcie_port *pp) >> +int __init dw_pcie_host_init(struct pcie_port *pp) >> { >> struct device_node *np = pp->dev->of_node; >> struct platform_device *pdev = to_platform_device(pp->dev); >> - struct of_pci_range range; >> - struct of_pci_range_parser parser; >> + struct pci_bus *bus; >> struct resource *cfg_res; >> + LIST_HEAD(res); >> u32 val, na, ns; >> const __be32 *addrp; >> int i, index, ret; >> + int rlen; >> + struct resource_entry *win; >> + const __be32 *parser_range_end = of_get_property(np, "ranges", >> &rlen); >> + >> + if (parser_range_end == NULL) >> + return -ENOENT; >> + parser_range_end += rlen/sizeof(__be32); >> + >> >> /* Find the address cell size and the number of cells in order to >> get >> * the untranslated address. >> @@ -375,78 +375,67 @@ int dw_pcie_host_init(struct pcie_port *pp) >> dev_err(pp->dev, "missing *config* reg space\n"); >> } >> >> - if (of_pci_range_parser_init(&parser, np)) { >> - dev_err(pp->dev, "missing ranges property\n"); >> - return -EINVAL; >> - } >> + ret = of_pci_get_host_bridge_resources(np, 0, 0xff, &res, &pp- >>> io_base); >> + if (ret) >> + return ret; >> >> /* Get the I/O and memory ranges from DT */ >> - for_each_of_pci_range(&parser, &range) { >> - unsigned long restype = range.flags & IORESOURCE_TYPE_BITS; >> - >> - if (restype == IORESOURCE_IO) { >> - of_pci_range_to_resource(&range, np, &pp->io); >> - pp->io.name = "I/O"; >> - pp->io.start = max_t(resource_size_t, >> - PCIBIOS_MIN_IO, >> - range.pci_addr + global_io_offset); >> - pp->io.end = min_t(resource_size_t, >> - IO_SPACE_LIMIT, >> - range.pci_addr + range.size >> - + global_io_offset - 1); >> - pp->io_size = resource_size(&pp->io); >> - pp->io_bus_addr = range.pci_addr; >> - pp->io_base = range.cpu_addr; >> - >> - /* Find the untranslated IO space address */ >> - pp->io_mod_base = of_read_number(parser.range - >> - parser.np + na, ns); >> - } >> - if (restype == IORESOURCE_MEM) { >> - of_pci_range_to_resource(&range, np, &pp->mem); >> - pp->mem.name = "MEM"; >> - pp->mem_size = resource_size(&pp->mem); >> - pp->mem_bus_addr = range.pci_addr; >> - >> - /* Find the untranslated MEM space address */ >> - pp->mem_mod_base = of_read_number(parser.range - >> - parser.np + na, ns); >> - } >> - if (restype == 0) { >> - of_pci_range_to_resource(&range, np, &pp->cfg); >> - pp->cfg0_size = resource_size(&pp->cfg)/2; >> - pp->cfg1_size = resource_size(&pp->cfg)/2; >> - pp->cfg0_base = pp->cfg.start; >> - pp->cfg1_base = pp->cfg.start + pp->cfg0_size; >> + resource_list_for_each_entry(win, &res) { >> + switch (resource_type(win->res)) { >> + case IORESOURCE_IO: >> + pp->io = win->res; >> + pp->io->name = "I/O"; >> + pp->io_size = resource_size(pp->io); >> + pp->io_bus_addr = pp->io->start - win->offset; >> + /* magic 5 below comes from magic na and ns in >> + * of_pci_range_parser_init() */ >> + pp->io_mod_base = of_read_number(parser_range_end - >> + of_n_addr_cells(np) - 5 + na, ns); >> + ret = pci_remap_iospace(pp->io, pp->io_base); >> + if (ret) { >> + dev_warn(pp->dev, "error %d: failed to map >> resource %pR\n", >> + ret, pp->io); >> + continue; >> + } >> + break; >> + case IORESOURCE_MEM: >> + pp->mem = win->res; >> + pp->mem->name = "MEM"; >> + pp->mem_size = resource_size(pp->mem); >> + pp->mem_bus_addr = pp->mem->start - win->offset; >> + pp->mem_mod_base = of_read_number(parser_range_end - >> + of_n_addr_cells(np) - 5 + na, ns); >> + break; >> + case 0: >> + pp->cfg = win->res; >> + pp->cfg0_size = resource_size(pp->cfg)/2; >> + pp->cfg1_size = resource_size(pp->cfg)/2; >> + pp->cfg0_base = pp->cfg->start; >> + pp->cfg1_base = pp->cfg->start + pp->cfg0_size; >> >> /* Find the untranslated configuration space address >> */ >> - pp->cfg0_mod_base = of_read_number(parser.range - >> - parser.np + na, ns); >> - pp->cfg1_mod_base = pp->cfg0_mod_base + >> - pp->cfg0_size; >> + pp->cfg0_mod_base = of_read_number(parser_range_end - >> + of_n_addr_cells(np) - 5 + na, ns); >> + pp->cfg1_mod_base = pp->cfg0_mod_base + pp->cfg0_size; >> + break; >> + case IORESOURCE_BUS: >> + pp->busn = win->res; >> + break; >> + default: >> + continue; >> } >> } >> >> - ret = of_pci_parse_bus_range(np, &pp->busn); >> - if (ret < 0) { >> - pp->busn.name = np->name; >> - pp->busn.start = 0; >> - pp->busn.end = 0xff; >> - pp->busn.flags = IORESOURCE_BUS; >> - dev_dbg(pp->dev, "failed to parse bus-range property: %d, >> using default %pR\n", >> - ret, &pp->busn); >> - } >> - >> if (!pp->dbi_base) { >> - pp->dbi_base = devm_ioremap(pp->dev, pp->cfg.start, >> - resource_size(&pp->cfg)); >> + pp->dbi_base = devm_ioremap(pp->dev, pp->cfg->start, >> + resource_size(pp->cfg)); >> if (!pp->dbi_base) { >> dev_err(pp->dev, "error with ioremap\n"); >> return -ENOMEM; >> } >> } >> >> - pp->mem_base = pp->mem.start; >> + pp->mem_base = pp->mem->start; >> >> if (!pp->va_cfg0_base) { >> pp->va_cfg0_base = devm_ioremap(pp->dev, pp->cfg0_base, >> @@ -493,24 +482,47 @@ int dw_pcie_host_init(struct pcie_port *pp) >> if (pp->ops->host_init) >> pp->ops->host_init(pp); >> >> - dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0); >> + if (dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0) >> + != PCIBIOS_SUCCESSFUL) >> + return -EINVAL; >> >> /* program correct class for RC */ >> - dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, >> PCI_CLASS_BRIDGE_PCI); >> + if (dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, >> PCI_CLASS_BRIDGE_PCI) >> + != PCIBIOS_SUCCESSFUL) >> + return -EINVAL; >> + >> + if (dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, >> &val) >> + != PCIBIOS_SUCCESSFUL) >> + return -EINVAL; >> >> - dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val); >> val |= PORT_LOGIC_SPEED_CHANGE; >> - dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val); >> >> -#ifdef CONFIG_PCI_MSI >> - dw_pcie_msi_chip.dev = pp->dev; >> - dw_pci.msi_ctrl = &dw_pcie_msi_chip; >> + if (dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val) >> + != PCIBIOS_SUCCESSFUL) >> + return -EINVAL; >> + >> + bus = pci_create_root_bus(pp->dev, pp->root_bus_nr, &dw_pcie_ops, >> + pp, &res); >> + if (!bus) >> + return -ENOMEM; >> + >> +#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN >> + bus->msi = container_of(&pp->irq_domain, struct msi_controller, >> domain); >> +#else >> + bus->msi = &dw_pcie_msi_chip; >> #endif >> >> - dw_pci.nr_controllers = 1; >> - dw_pci.private_data = (void **)&pp; >> + pci_scan_child_bus(bus); >> + if (pp->ops->scan_bus) >> + pp->ops->scan_bus(pp); >> >> - pci_common_init_dev(pp->dev, &dw_pci); >> +#ifdef CONFIG_ARM >> + /* support old dtbs that incorrectly describe IRQs */ >> + pci_fixup_irqs(pci_common_swizzle, of_irq_parse_and_map_pci); >> +#endif >> + >> + pci_assign_unassigned_bus_resources(bus); >> + pci_bus_add_devices(bus); >> >> return 0; >> } >> @@ -653,7 +665,7 @@ static int dw_pcie_valid_config(struct pcie_port >> *pp, >> static int dw_pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where, >> int size, u32 *val) >> { >> - struct pcie_port *pp = sys_to_pcie(bus->sysdata); >> + struct pcie_port *pp = bus->sysdata; >> int ret; >> >> if (dw_pcie_valid_config(pp, bus, PCI_SLOT(devfn)) == 0) { >> @@ -677,7 +689,7 @@ static int dw_pcie_rd_conf(struct pci_bus *bus, u32 >> devfn, int where, >> static int dw_pcie_wr_conf(struct pci_bus *bus, u32 devfn, >> int where, int size, u32 val) >> { >> - struct pcie_port *pp = sys_to_pcie(bus->sysdata); >> + struct pcie_port *pp = bus->sysdata; >> int ret; >> >> if (dw_pcie_valid_config(pp, bus, PCI_SLOT(devfn)) == 0) >> @@ -701,64 +713,6 @@ static struct pci_ops dw_pcie_ops = { >> .write = dw_pcie_wr_conf, >> }; >> >> -static int dw_pcie_setup(int nr, struct pci_sys_data *sys) >> -{ >> - struct pcie_port *pp; >> - >> - pp = sys_to_pcie(sys); >> - >> - if (global_io_offset < SZ_1M && pp->io_size > 0) { >> - sys->io_offset = global_io_offset - pp->io_bus_addr; >> - pci_ioremap_io(global_io_offset, pp->io_base); >> - global_io_offset += SZ_64K; >> - pci_add_resource_offset(&sys->resources, &pp->io, >> - sys->io_offset); >> - } >> - >> - sys->mem_offset = pp->mem.start - pp->mem_bus_addr; >> - pci_add_resource_offset(&sys->resources, &pp->mem, sys- >>> mem_offset); >> - pci_add_resource(&sys->resources, &pp->busn); >> - >> - return 1; >> -} >> - >> -static struct pci_bus *dw_pcie_scan_bus(int nr, struct pci_sys_data >> *sys) >> -{ >> - struct pci_bus *bus; >> - struct pcie_port *pp = sys_to_pcie(sys); >> - >> - pp->root_bus_nr = sys->busnr; >> - bus = pci_create_root_bus(pp->dev, sys->busnr, >> - &dw_pcie_ops, sys, &sys->resources); >> - if (!bus) >> - return NULL; >> - >> - pci_scan_child_bus(bus); >> - >> - if (bus && pp->ops->scan_bus) >> - pp->ops->scan_bus(pp); >> - >> - return bus; >> -} >> - >> -static int dw_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) >> -{ >> - struct pcie_port *pp = sys_to_pcie(dev->bus->sysdata); >> - int irq; >> - >> - irq = of_irq_parse_and_map_pci(dev, slot, pin); >> - if (!irq) >> - irq = pp->irq; >> - >> - return irq; >> -} >> - >> -static struct hw_pci dw_pci = { >> - .setup = dw_pcie_setup, >> - .scan = dw_pcie_scan_bus, >> - .map_irq = dw_pcie_map_irq, >> -}; >> - >> void dw_pcie_setup_rc(struct pcie_port *pp) >> { >> u32 val; >> diff --git a/drivers/pci/host/pcie-designware.h >> b/drivers/pci/host/pcie-designware.h >> index d0bbd27..ab78710 100644 >> --- a/drivers/pci/host/pcie-designware.h >> +++ b/drivers/pci/host/pcie-designware.h >> @@ -34,7 +34,7 @@ struct pcie_port { >> u64 cfg1_mod_base; >> void __iomem *va_cfg1_base; >> u32 cfg1_size; >> - u64 io_base; >> + resource_size_t io_base; >> u64 io_mod_base; >> phys_addr_t io_bus_addr; >> u32 io_size; >> @@ -42,10 +42,10 @@ struct pcie_port { >> u64 mem_mod_base; >> phys_addr_t mem_bus_addr; >> u32 mem_size; >> - struct resource cfg; >> - struct resource io; >> - struct resource mem; >> - struct resource busn; >> + struct resource *cfg; >> + struct resource *io; >> + struct resource *mem; >> + struct resource *busn; >> int irq; >> u32 lanes; >> struct pcie_host_ops *ops; >> diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie- >> spear13xx.c >> index 020d788..e78ddf8 100644 >> --- a/drivers/pci/host/pcie-spear13xx.c >> +++ b/drivers/pci/host/pcie-spear13xx.c >> @@ -287,7 +287,7 @@ static int spear13xx_add_pcie_port(struct pcie_port >> *pp, >> return ret; >> } >> >> - pp->root_bus_nr = -1; >> + pp->root_bus_nr = 0; >> pp->ops = &spear13xx_pcie_host_ops; >> >> ret = dw_pcie_host_init(pp); >> -- >> 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2015/7/2 1:32, James Morse wrote: > Gabriele Paoloni wrote: >>> Both series are applied to v4.1, use the same .config file, and the >>> same dtb. >>> I will investigate further. >>> >>> (Re-testing v2 works, so this isn't an interim hardware failure) >> >> This is a bit weird.... >> >> Patch 2/5 is the only one that affect platforms different from Hisilicon >> >> The only difference between V3 patch[2/5] and v2 patch[2/4] is > > Between v3:2/5 and your replacement for v2:2/4, which arrived after I had > tested the v2 series. As the patch has been replaced with a different one - > neither 'tested-by' is true any more. > Hi James, Firstly, many thanks for your test! Yes. v3:2/5 had merged Gabriele's codes in. So if you made test on original v2 patchset and v3 patchset, I think the differences include Gabriele's codes and codes in pci-keystone-dw.c. As the patch has been replaced with a different one, I think I should have added 'tested-by' after it passes your test, is this right? > It looks like the BAR containing the bridge window is not being assigned, > so no devices on bus 1 are discovered. > > I will send the full v2 and v3 dmesg output separately. > Thanks, I will debug the problem according your log. Regards, Zhou > > Thanks, > > James > > > . > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> -----Original Message----- > From: linux-pci-owner@vger.kernel.org [mailto:linux-pci- > owner@vger.kernel.org] On Behalf Of James Morse > Sent: 01 July 2015 18:33 > To: Gabriele Paoloni; Wangzhou (B); Bjorn Helgaas; Jingoo Han; Pratyush > Anand; Arnd Bergmann; Liviu Dudau; kishon@ti.com; xobs@kosagi.com; m- > karicheri2@ti.com; Minghuan.Lian@freescale.com > Cc: linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > devicetree@vger.kernel.org; Yuanzhichang; Zhudacai; zhangjukuo; > qiuzhenfa; Liguozhu (Kenneth) > Subject: Re: [PATCH v3 2/5] PCI: designware: Add ARM64 support > > Gabriele Paoloni wrote: > >> Both series are applied to v4.1, use the same .config file, and the > >> same dtb. > >> I will investigate further. > >> > >> (Re-testing v2 works, so this isn't an interim hardware failure) > > > > This is a bit weird.... > > > > Patch 2/5 is the only one that affect platforms different from > Hisilicon > > > > The only difference between V3 patch[2/5] and v2 patch[2/4] is > > Between v3:2/5 and your replacement for v2:2/4, which arrived after I > had > tested the v2 series. As the patch has been replaced with a different > one - > neither 'tested-by' is true any more. Sorry I misread your previous email > > It looks like the BAR containing the bridge window is not being assigned, > so no devices on bus 1 are discovered. Can you confirm the dtsi you are using..."imx6qdl.dtsi" ? Thanks Gab > > I will send the full v2 and v3 dmesg output separately. > > > Thanks, > > James > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
On 02/07/15 08:24, Gabriele Paoloni wrote: >> It looks like the BAR containing the bridge window is not being assigned, >> so no devices on bus 1 are discovered. > > Can you confirm the dtsi you are using..."imx6qdl.dtsi" ? Yes, that looks right. The on-disk file was 'imx6q-sabrelite.dtb' when I received the board, I replaced it with the one from the v4.1 kernel tree. Decompiled from /sys/firmware/fdt (to eliminate bootloader trickery), the pcie section reads: pcie@0x01000000 { compatible = "fsl,imx6q-pcie", "snps,dw-pcie"; reg = <0x1ffc000 0x4000 0x1f00000 0x80000>; reg-names = "dbi", "config"; #address-cells = <0x3>; #size-cells = <0x2>; device_type = "pci"; ranges = <0x800 0x0 0x1f00000 0x1f00000 0x0 0x80000 0x81000000 0x0 0x0 0x1f80000 0x0 0x10000 0x82000000 0x0 0x1000000 0x1000000 0x0 0xf00000>; num-lanes = <0x1>; interrupts = <0x0 0x78 0x4>; interrupt-names = "msi"; #interrupt-cells = <0x1>; interrupt-map-mask = <0x0 0x0 0x0 0x7>; interrupt-map = <0x0 0x0 0x0 0x1 0x1 0x0 0x7b 0x4 0x0 0x0 0x0 0x2 0x1 0x0 0x7a 0x4 0x0 0x0 0x0 0x3 0x1 0x0 0x79 0x4 0x0 0x0 0x0 0x4 0x1 0x0 0x78 0x4>; clocks = <0x3 0x90 0x3 0xce 0x3 0xbd>; clock-names = "pcie", "pcie_bus", "pcie_phy"; status = "okay"; }; James -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2015/7/1 22:26, James Morse wrote: > Zhou Wang wrote: >> I tested this patch on D02 board of Hisilicon. It works well. >> I have compiled the driver with multi_v7_defconfig. However, I don't >> have >> ARM32 PCIe related board to do test. It will be appreciated if someone >> could >> help to test it. >> >> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com> >> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> >> Tested-by: Fabrice Gasnier <fabrice.gasnier@st.com> >> Tested-by: James Morse <james.morse@arm.com> > > Tests on this new series, using the same i.MX 6Quad board, are not working. > > The network card is no longer detected, and I get a lockup when removing > the root bridge and rescanning. > > Partial dmesg output below. Significantly, the lines: >> [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: >> [ 0.152142] No bus range found for /soc/pcie@0x01000000, using [bus > 00-ff] > are new. > > Both series are applied to v4.1, use the same .config file, and the same dtb. > I will investigate further. > > (Re-testing v2 works, so this isn't an interim hardware failure) > > Thanks, > > James > Hi James, There are something wrong with v3 patch. pp->io_mod_base = of_read_number(parser_range_end - of_n_addr_cells(np) - 5 + na, ns); pp->mem_mod_base = of_read_number(parser_range_end - of_n_addr_cells(np) - 5 + na, ns); pp->cfg0_mod_base = of_read_number(parser_range_end - of_n_addr_cells(np) - 5 + na, ns); are wrong. The ranges item in your dts is: ranges = <0x800 0x0 0x1f00000 0x1f00000 0x0 0x80000 0x81000000 0x0 0x0 0x1f80000 0x0 0x10000 0x82000000 0x0 0x1000000 0x1000000 0x0 0xf00000>; parser_range_end points to the end of ranges(0xf00000) directly. In v2 patch, of_read_number is of_read_number(parser.range - parser.np + na, ns); parser.range points to the end of each line in ranges item. When I did test on D02 board with intel82599 card, I set ranges item as: ranges = <0x03000000 0 0xb0000000 0x220 0x00000000 0 0xf000000>; It is just one line. In this case, parser_range_end is same with parser.range. That is why it happened to work well on D02 board. very sorry to bother you about this problem. Thanks, Zhou > > > root@localhost:~# dmesg | grep -i pci > [ 0.126184] PCI: CLS 0 bytes, default 64 > [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: > [ 0.152142] No bus range found for /soc/pcie@0x01000000, using [bus 00-ff] > [ 0.154183] imx6q-pcie 1ffc000.pcie: PCI host bridge to bus 0000:00 > [ 0.154201] pci_bus 0000:00: root bus resource [bus 00-ff] > [ 0.154215] pci_bus 0000:00: root bus resource [??? > 0x01f00000-0x01f7ffff flags 0x0] > [ 0.154228] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] > [ 0.154270] pci_bus 0000:00: root bus resource [mem 0x01000000-0x01efffff] > [ 0.154306] pci 0000:00:00.0: [16c3:abcd] type 01 class 0x060400 > [ 0.154333] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x000fffff] > [ 0.154352] pci 0000:00:00.0: reg 0x38: [mem 0x00000000-0x0000ffff pref] > [ 0.154377] pci 0000:00:00.0: IOMMU is currently not supported for PCI > [ 0.154429] pci 0000:00:00.0: supports D1 > [ 0.154440] pci 0000:00:00.0: PME# supported from D0 D1 D3hot D3cold > [ 0.154683] PCI: bus0: Fast back to back transfers disabled > [ 0.154806] PCI: bus1: Fast back to back transfers enabled > [ 0.154884] pci 0000:00:00.0: BAR 0: assigned [mem 0x01000000-0x010fffff] > [ 0.154903] pci 0000:00:00.0: BAR 6: assigned [mem 0x01100000-0x0110ffff > pref] > [ 0.154917] pci 0000:00:00.0: PCI bridge to [bus 01] > [ 0.155145] pcieport 0000:00:00.0: Signaling PME through PCIe PME interrupt > [ 0.155161] pcie_pme 0000:00:00.0:pcie01: service driver pcie_pme loaded > [ 0.155279] aer 0000:00:00.0:pcie02: service driver aer loaded > [ 1.188840] ehci-pci: EHCI PCI platform driver > [ 1.232518] ohci-pci: OHCI PCI platform driver > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > . > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
I have just sent this patch "[PATCH] Store PCIe controllers address in struct of_pci_range". It would be needed by "pcie_designware.c" to retrieve the PCI controller addresses from "win->__res.start". So we do not need to retrieve info from the DT parser anymore and we can use the new PCI DT parsing API This problem was already discussed in this thread: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html > -----Original Message----- > From: Wangzhou (B) > Sent: Tuesday, July 07, 2015 4:44 AM > To: James Morse > Cc: Gabriele Paoloni; Bjorn Helgaas; Jingoo Han; Pratyush Anand; Arnd > Bergmann; Liviu Dudau; kishon@ti.com; xobs@kosagi.com; m- > karicheri2@ti.com; Minghuan.Lian@freescale.com; linux- > pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > devicetree@vger.kernel.org; Yuanzhichang; Zhudacai; zhangjukuo; > qiuzhenfa; Liguozhu (Kenneth) > Subject: Re: [PATCH v3 2/5] PCI: designware: Add ARM64 support > > On 2015/7/1 22:26, James Morse wrote: > > Zhou Wang wrote: > >> I tested this patch on D02 board of Hisilicon. It works well. > >> I have compiled the driver with multi_v7_defconfig. However, I don't > >> have > >> ARM32 PCIe related board to do test. It will be appreciated if > someone > >> could > >> help to test it. > >> > >> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com> > >> Signed-off-by: Arnd Bergmann <arnd@arndb.de> > >> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> > >> Tested-by: Fabrice Gasnier <fabrice.gasnier@st.com> > >> Tested-by: James Morse <james.morse@arm.com> > > > > Tests on this new series, using the same i.MX 6Quad board, are not > working. > > > > The network card is no longer detected, and I get a lockup when > removing > > the root bridge and rescanning. > > > > Partial dmesg output below. Significantly, the lines: > >> [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: > >> [ 0.152142] No bus range found for /soc/pcie@0x01000000, using > [bus > > 00-ff] > > are new. > > > > Both series are applied to v4.1, use the same .config file, and the > same dtb. > > I will investigate further. > > > > (Re-testing v2 works, so this isn't an interim hardware failure) > > > > Thanks, > > > > James > > > > Hi James, > > There are something wrong with v3 patch. > > pp->io_mod_base = of_read_number(parser_range_end - > of_n_addr_cells(np) - 5 + na, ns); > pp->mem_mod_base = of_read_number(parser_range_end - > of_n_addr_cells(np) - 5 + na, ns); > pp->cfg0_mod_base = of_read_number(parser_range_end - > of_n_addr_cells(np) - 5 + na, ns); > are wrong. > > The ranges item in your dts is: > ranges = <0x800 0x0 0x1f00000 0x1f00000 0x0 0x80000 > 0x81000000 0x0 0x0 0x1f80000 0x0 0x10000 > 0x82000000 0x0 0x1000000 0x1000000 0x0 0xf00000>; > parser_range_end points to the end of ranges(0xf00000) directly. In v2 > patch, > of_read_number is of_read_number(parser.range - parser.np + na, ns); > parser.range > points to the end of each line in ranges item. > > When I did test on D02 board with intel82599 card, I set ranges item as: > ranges = <0x03000000 0 0xb0000000 0x220 0x00000000 0 0xf000000>; > It is just one line. In this case, parser_range_end is same with > parser.range. > That is why it happened to work well on D02 board. > > very sorry to bother you about this problem. > > Thanks, > Zhou > > > > > > > root@localhost:~# dmesg | grep -i pci > > [ 0.126184] PCI: CLS 0 bytes, default 64 > > [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: > > [ 0.152142] No bus range found for /soc/pcie@0x01000000, using > [bus 00-ff] > > [ 0.154183] imx6q-pcie 1ffc000.pcie: PCI host bridge to bus > 0000:00 > > [ 0.154201] pci_bus 0000:00: root bus resource [bus 00-ff] > > [ 0.154215] pci_bus 0000:00: root bus resource [??? > > 0x01f00000-0x01f7ffff flags 0x0] > > [ 0.154228] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] > > [ 0.154270] pci_bus 0000:00: root bus resource [mem 0x01000000- > 0x01efffff] > > [ 0.154306] pci 0000:00:00.0: [16c3:abcd] type 01 class 0x060400 > > [ 0.154333] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x000fffff] > > [ 0.154352] pci 0000:00:00.0: reg 0x38: [mem 0x00000000-0x0000ffff > pref] > > [ 0.154377] pci 0000:00:00.0: IOMMU is currently not supported for > PCI > > [ 0.154429] pci 0000:00:00.0: supports D1 > > [ 0.154440] pci 0000:00:00.0: PME# supported from D0 D1 D3hot > D3cold > > [ 0.154683] PCI: bus0: Fast back to back transfers disabled > > [ 0.154806] PCI: bus1: Fast back to back transfers enabled > > [ 0.154884] pci 0000:00:00.0: BAR 0: assigned [mem 0x01000000- > 0x010fffff] > > [ 0.154903] pci 0000:00:00.0: BAR 6: assigned [mem 0x01100000- > 0x0110ffff > > pref] > > [ 0.154917] pci 0000:00:00.0: PCI bridge to [bus 01] > > [ 0.155145] pcieport 0000:00:00.0: Signaling PME through PCIe PME > interrupt > > [ 0.155161] pcie_pme 0000:00:00.0:pcie01: service driver pcie_pme > loaded > > [ 0.155279] aer 0000:00:00.0:pcie02: service driver aer loaded > > [ 1.188840] ehci-pci: EHCI PCI platform driver > > [ 1.232518] ohci-pci: OHCI PCI platform driver > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-pci" > in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > > . > > >
On 2015/7/10 16:53, Gabriele Paoloni wrote: > I have just sent this patch "[PATCH] Store PCIe controllers address in struct of_pci_range". > > It would be needed by "pcie_designware.c" to retrieve the PCI controller addresses from "win->__res.start". > > So we do not need to retrieve info from the DT parser anymore and we can use the new PCI DT parsing API > > This problem was already discussed in this thread: > http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html > > Hi Gab, Thanks for your patch. That means I can use something like: pp->io_mod_base = win->__res.start to get io_mod_base, mem_mod_base and cfg0_mod_base. will send my v4 series based on your patch. Best regards, Zhou >> -----Original Message----- >> From: Wangzhou (B) >> Sent: Tuesday, July 07, 2015 4:44 AM >> To: James Morse >> Cc: Gabriele Paoloni; Bjorn Helgaas; Jingoo Han; Pratyush Anand; Arnd >> Bergmann; Liviu Dudau; kishon@ti.com; xobs@kosagi.com; m- >> karicheri2@ti.com; Minghuan.Lian@freescale.com; linux- >> pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; >> devicetree@vger.kernel.org; Yuanzhichang; Zhudacai; zhangjukuo; >> qiuzhenfa; Liguozhu (Kenneth) >> Subject: Re: [PATCH v3 2/5] PCI: designware: Add ARM64 support >> >> On 2015/7/1 22:26, James Morse wrote: >>> Zhou Wang wrote: >>>> I tested this patch on D02 board of Hisilicon. It works well. >>>> I have compiled the driver with multi_v7_defconfig. However, I don't >>>> have >>>> ARM32 PCIe related board to do test. It will be appreciated if >> someone >>>> could >>>> help to test it. >>>> >>>> Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com> >>>> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >>>> Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> >>>> Tested-by: Fabrice Gasnier <fabrice.gasnier@st.com> >>>> Tested-by: James Morse <james.morse@arm.com> >>> >>> Tests on this new series, using the same i.MX 6Quad board, are not >> working. >>> >>> The network card is no longer detected, and I get a lockup when >> removing >>> the root bridge and rescanning. >>> >>> Partial dmesg output below. Significantly, the lines: >>>> [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: >>>> [ 0.152142] No bus range found for /soc/pcie@0x01000000, using >> [bus >>> 00-ff] >>> are new. >>> >>> Both series are applied to v4.1, use the same .config file, and the >> same dtb. >>> I will investigate further. >>> >>> (Re-testing v2 works, so this isn't an interim hardware failure) >>> >>> Thanks, >>> >>> James >>> >> >> Hi James, >> >> There are something wrong with v3 patch. >> >> pp->io_mod_base = of_read_number(parser_range_end - >> of_n_addr_cells(np) - 5 + na, ns); >> pp->mem_mod_base = of_read_number(parser_range_end - >> of_n_addr_cells(np) - 5 + na, ns); >> pp->cfg0_mod_base = of_read_number(parser_range_end - >> of_n_addr_cells(np) - 5 + na, ns); >> are wrong. >> >> The ranges item in your dts is: >> ranges = <0x800 0x0 0x1f00000 0x1f00000 0x0 0x80000 >> 0x81000000 0x0 0x0 0x1f80000 0x0 0x10000 >> 0x82000000 0x0 0x1000000 0x1000000 0x0 0xf00000>; >> parser_range_end points to the end of ranges(0xf00000) directly. In v2 >> patch, >> of_read_number is of_read_number(parser.range - parser.np + na, ns); >> parser.range >> points to the end of each line in ranges item. >> >> When I did test on D02 board with intel82599 card, I set ranges item as: >> ranges = <0x03000000 0 0xb0000000 0x220 0x00000000 0 0xf000000>; >> It is just one line. In this case, parser_range_end is same with >> parser.range. >> That is why it happened to work well on D02 board. >> >> very sorry to bother you about this problem. >> >> Thanks, >> Zhou >> >>> >>> >>> root@localhost:~# dmesg | grep -i pci >>> [ 0.126184] PCI: CLS 0 bytes, default 64 >>> [ 0.152128] PCI host bridge /soc/pcie@0x01000000 ranges: >>> [ 0.152142] No bus range found for /soc/pcie@0x01000000, using >> [bus 00-ff] >>> [ 0.154183] imx6q-pcie 1ffc000.pcie: PCI host bridge to bus >> 0000:00 >>> [ 0.154201] pci_bus 0000:00: root bus resource [bus 00-ff] >>> [ 0.154215] pci_bus 0000:00: root bus resource [??? >>> 0x01f00000-0x01f7ffff flags 0x0] >>> [ 0.154228] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] >>> [ 0.154270] pci_bus 0000:00: root bus resource [mem 0x01000000- >> 0x01efffff] >>> [ 0.154306] pci 0000:00:00.0: [16c3:abcd] type 01 class 0x060400 >>> [ 0.154333] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x000fffff] >>> [ 0.154352] pci 0000:00:00.0: reg 0x38: [mem 0x00000000-0x0000ffff >> pref] >>> [ 0.154377] pci 0000:00:00.0: IOMMU is currently not supported for >> PCI >>> [ 0.154429] pci 0000:00:00.0: supports D1 >>> [ 0.154440] pci 0000:00:00.0: PME# supported from D0 D1 D3hot >> D3cold >>> [ 0.154683] PCI: bus0: Fast back to back transfers disabled >>> [ 0.154806] PCI: bus1: Fast back to back transfers enabled >>> [ 0.154884] pci 0000:00:00.0: BAR 0: assigned [mem 0x01000000- >> 0x010fffff] >>> [ 0.154903] pci 0000:00:00.0: BAR 6: assigned [mem 0x01100000- >> 0x0110ffff >>> pref] >>> [ 0.154917] pci 0000:00:00.0: PCI bridge to [bus 01] >>> [ 0.155145] pcieport 0000:00:00.0: Signaling PME through PCIe PME >> interrupt >>> [ 0.155161] pcie_pme 0000:00:00.0:pcie01: service driver pcie_pme >> loaded >>> [ 0.155279] aer 0000:00:00.0:pcie02: service driver aer loaded >>> [ 1.188840] ehci-pci: EHCI PCI platform driver >>> [ 1.232518] ohci-pci: OHCI PCI platform driver >>> >>> -- >>> To unsubscribe from this list: send the line "unsubscribe linux-pci" >> in >>> the body of a message to majordomo@vger.kernel.org >>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>> >>> . >>> >> > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/pci/host/pci-dra7xx.c b/drivers/pci/host/pci-dra7xx.c index 2d57e19..5c8b6ab 100644 --- a/drivers/pci/host/pci-dra7xx.c +++ b/drivers/pci/host/pci-dra7xx.c @@ -280,6 +280,7 @@ static int __init dra7xx_add_pcie_port(struct dra7xx_pcie *dra7xx, pp = &dra7xx->pp; pp->dev = dev; + pp->root_bus_nr = 0; pp->ops = &dra7xx_pcie_host_ops; pp->irq = platform_get_irq(pdev, 1); diff --git a/drivers/pci/host/pci-exynos.c b/drivers/pci/host/pci-exynos.c index c139237..4b6db6c 100644 --- a/drivers/pci/host/pci-exynos.c +++ b/drivers/pci/host/pci-exynos.c @@ -534,7 +534,7 @@ static int __init exynos_add_pcie_port(struct pcie_port *pp, } } - pp->root_bus_nr = -1; + pp->root_bus_nr = 0; pp->ops = &exynos_pcie_host_ops; ret = dw_pcie_host_init(pp); diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index fdb9536..c4a80c5 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c @@ -541,7 +541,7 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp, } } - pp->root_bus_nr = -1; + pp->root_bus_nr = 0; pp->ops = &imx6_pcie_host_ops; ret = dw_pcie_host_init(pp); diff --git a/drivers/pci/host/pci-keystone-dw.c b/drivers/pci/host/pci-keystone-dw.c index f34892e..b1e4135 100644 --- a/drivers/pci/host/pci-keystone-dw.c +++ b/drivers/pci/host/pci-keystone-dw.c @@ -327,7 +327,7 @@ static void ks_dw_pcie_clear_dbi_mode(void __iomem *reg_virt) void ks_dw_pcie_setup_rc_app_regs(struct keystone_pcie *ks_pcie) { struct pcie_port *pp = &ks_pcie->pp; - u32 start = pp->mem.start, end = pp->mem.end; + u32 start = pp->mem->start, end = pp->mem->end; int i, tr_size; /* Disable BARs for inbound access */ diff --git a/drivers/pci/host/pci-keystone.c b/drivers/pci/host/pci-keystone.c index 75333b0..df91f5e 100644 --- a/drivers/pci/host/pci-keystone.c +++ b/drivers/pci/host/pci-keystone.c @@ -312,7 +312,7 @@ static int __init ks_add_pcie_port(struct keystone_pcie *ks_pcie, return ret; } - pp->root_bus_nr = -1; + pp->root_bus_nr = 0; pp->ops = &keystone_pcie_host_ops; ret = ks_dw_pcie_host_init(ks_pcie, ks_pcie->msi_intc_np); if (ret) { diff --git a/drivers/pci/host/pci-layerscape.c b/drivers/pci/host/pci-layerscape.c index 4a6e62f..5c7a9c4 100644 --- a/drivers/pci/host/pci-layerscape.c +++ b/drivers/pci/host/pci-layerscape.c @@ -101,7 +101,7 @@ static int ls_add_pcie_port(struct ls_pcie *pcie) pp = &pcie->pp; pp->dev = pcie->dev; pp->dbi_base = pcie->dbi; - pp->root_bus_nr = -1; + pp->root_bus_nr = 0; pp->ops = &ls_pcie_host_ops; ret = dw_pcie_host_init(pp); diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 2e9f84f..844febee 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c @@ -11,6 +11,7 @@ * published by the Free Software Foundation. */ +#include <linux/hardirq.h> #include <linux/irq.h> #include <linux/irqdomain.h> #include <linux/kernel.h> @@ -67,16 +68,7 @@ #define PCIE_ATU_FUNC(x) (((x) & 0x7) << 16) #define PCIE_ATU_UPPER_TARGET 0x91C -static struct hw_pci dw_pci; - -static unsigned long global_io_offset; - -static inline struct pcie_port *sys_to_pcie(struct pci_sys_data *sys) -{ - BUG_ON(!sys->private_data); - - return sys->private_data; -} +static struct pci_ops dw_pcie_ops; int dw_pcie_cfg_read(void __iomem *addr, int where, int size, u32 *val) { @@ -238,7 +230,7 @@ static void dw_pcie_msi_set_irq(struct pcie_port *pp, int irq) static int assign_irq(int no_irqs, struct msi_desc *desc, int *pos) { int irq, pos0, i; - struct pcie_port *pp = sys_to_pcie(desc->dev->bus->sysdata); + struct pcie_port *pp = desc->dev->bus->sysdata; pos0 = bitmap_find_free_region(pp->msi_irq_in_use, MAX_MSI_IRQS, order_base_2(no_irqs)); @@ -281,7 +273,7 @@ static int dw_msi_setup_irq(struct msi_controller *chip, struct pci_dev *pdev, { int irq, pos; struct msi_msg msg; - struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); + struct pcie_port *pp = pdev->bus->sysdata; if (desc->msi_attrib.is_msix) return -EINVAL; @@ -310,7 +302,7 @@ static void dw_msi_teardown_irq(struct msi_controller *chip, unsigned int irq) { struct irq_data *data = irq_get_irq_data(irq); struct msi_desc *msi = irq_data_get_msi(data); - struct pcie_port *pp = sys_to_pcie(msi->dev->bus->sysdata); + struct pcie_port *pp = msi->dev->bus->sysdata; clear_irq_range(pp, irq, 1, data->hwirq); } @@ -342,16 +334,24 @@ static const struct irq_domain_ops msi_domain_ops = { .map = dw_pcie_msi_map, }; -int dw_pcie_host_init(struct pcie_port *pp) +int __init dw_pcie_host_init(struct pcie_port *pp) { struct device_node *np = pp->dev->of_node; struct platform_device *pdev = to_platform_device(pp->dev); - struct of_pci_range range; - struct of_pci_range_parser parser; + struct pci_bus *bus; struct resource *cfg_res; + LIST_HEAD(res); u32 val, na, ns; const __be32 *addrp; int i, index, ret; + int rlen; + struct resource_entry *win; + const __be32 *parser_range_end = of_get_property(np, "ranges", &rlen); + + if (parser_range_end == NULL) + return -ENOENT; + parser_range_end += rlen/sizeof(__be32); + /* Find the address cell size and the number of cells in order to get * the untranslated address. @@ -375,78 +375,67 @@ int dw_pcie_host_init(struct pcie_port *pp) dev_err(pp->dev, "missing *config* reg space\n"); } - if (of_pci_range_parser_init(&parser, np)) { - dev_err(pp->dev, "missing ranges property\n"); - return -EINVAL; - } + ret = of_pci_get_host_bridge_resources(np, 0, 0xff, &res, &pp->io_base); + if (ret) + return ret; /* Get the I/O and memory ranges from DT */ - for_each_of_pci_range(&parser, &range) { - unsigned long restype = range.flags & IORESOURCE_TYPE_BITS; - - if (restype == IORESOURCE_IO) { - of_pci_range_to_resource(&range, np, &pp->io); - pp->io.name = "I/O"; - pp->io.start = max_t(resource_size_t, - PCIBIOS_MIN_IO, - range.pci_addr + global_io_offset); - pp->io.end = min_t(resource_size_t, - IO_SPACE_LIMIT, - range.pci_addr + range.size - + global_io_offset - 1); - pp->io_size = resource_size(&pp->io); - pp->io_bus_addr = range.pci_addr; - pp->io_base = range.cpu_addr; - - /* Find the untranslated IO space address */ - pp->io_mod_base = of_read_number(parser.range - - parser.np + na, ns); - } - if (restype == IORESOURCE_MEM) { - of_pci_range_to_resource(&range, np, &pp->mem); - pp->mem.name = "MEM"; - pp->mem_size = resource_size(&pp->mem); - pp->mem_bus_addr = range.pci_addr; - - /* Find the untranslated MEM space address */ - pp->mem_mod_base = of_read_number(parser.range - - parser.np + na, ns); - } - if (restype == 0) { - of_pci_range_to_resource(&range, np, &pp->cfg); - pp->cfg0_size = resource_size(&pp->cfg)/2; - pp->cfg1_size = resource_size(&pp->cfg)/2; - pp->cfg0_base = pp->cfg.start; - pp->cfg1_base = pp->cfg.start + pp->cfg0_size; + resource_list_for_each_entry(win, &res) { + switch (resource_type(win->res)) { + case IORESOURCE_IO: + pp->io = win->res; + pp->io->name = "I/O"; + pp->io_size = resource_size(pp->io); + pp->io_bus_addr = pp->io->start - win->offset; + /* magic 5 below comes from magic na and ns in + * of_pci_range_parser_init() */ + pp->io_mod_base = of_read_number(parser_range_end - + of_n_addr_cells(np) - 5 + na, ns); + ret = pci_remap_iospace(pp->io, pp->io_base); + if (ret) { + dev_warn(pp->dev, "error %d: failed to map resource %pR\n", + ret, pp->io); + continue; + } + break; + case IORESOURCE_MEM: + pp->mem = win->res; + pp->mem->name = "MEM"; + pp->mem_size = resource_size(pp->mem); + pp->mem_bus_addr = pp->mem->start - win->offset; + pp->mem_mod_base = of_read_number(parser_range_end - + of_n_addr_cells(np) - 5 + na, ns); + break; + case 0: + pp->cfg = win->res; + pp->cfg0_size = resource_size(pp->cfg)/2; + pp->cfg1_size = resource_size(pp->cfg)/2; + pp->cfg0_base = pp->cfg->start; + pp->cfg1_base = pp->cfg->start + pp->cfg0_size; /* Find the untranslated configuration space address */ - pp->cfg0_mod_base = of_read_number(parser.range - - parser.np + na, ns); - pp->cfg1_mod_base = pp->cfg0_mod_base + - pp->cfg0_size; + pp->cfg0_mod_base = of_read_number(parser_range_end - + of_n_addr_cells(np) - 5 + na, ns); + pp->cfg1_mod_base = pp->cfg0_mod_base + pp->cfg0_size; + break; + case IORESOURCE_BUS: + pp->busn = win->res; + break; + default: + continue; } } - ret = of_pci_parse_bus_range(np, &pp->busn); - if (ret < 0) { - pp->busn.name = np->name; - pp->busn.start = 0; - pp->busn.end = 0xff; - pp->busn.flags = IORESOURCE_BUS; - dev_dbg(pp->dev, "failed to parse bus-range property: %d, using default %pR\n", - ret, &pp->busn); - } - if (!pp->dbi_base) { - pp->dbi_base = devm_ioremap(pp->dev, pp->cfg.start, - resource_size(&pp->cfg)); + pp->dbi_base = devm_ioremap(pp->dev, pp->cfg->start, + resource_size(pp->cfg)); if (!pp->dbi_base) { dev_err(pp->dev, "error with ioremap\n"); return -ENOMEM; } } - pp->mem_base = pp->mem.start; + pp->mem_base = pp->mem->start; if (!pp->va_cfg0_base) { pp->va_cfg0_base = devm_ioremap(pp->dev, pp->cfg0_base, @@ -493,24 +482,47 @@ int dw_pcie_host_init(struct pcie_port *pp) if (pp->ops->host_init) pp->ops->host_init(pp); - dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0); + if (dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0) + != PCIBIOS_SUCCESSFUL) + return -EINVAL; /* program correct class for RC */ - dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI); + if (dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI) + != PCIBIOS_SUCCESSFUL) + return -EINVAL; + + if (dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val) + != PCIBIOS_SUCCESSFUL) + return -EINVAL; - dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val); val |= PORT_LOGIC_SPEED_CHANGE; - dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val); -#ifdef CONFIG_PCI_MSI - dw_pcie_msi_chip.dev = pp->dev; - dw_pci.msi_ctrl = &dw_pcie_msi_chip; + if (dw_pcie_wr_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, val) + != PCIBIOS_SUCCESSFUL) + return -EINVAL; + + bus = pci_create_root_bus(pp->dev, pp->root_bus_nr, &dw_pcie_ops, + pp, &res); + if (!bus) + return -ENOMEM; + +#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN + bus->msi = container_of(&pp->irq_domain, struct msi_controller, domain); +#else + bus->msi = &dw_pcie_msi_chip; #endif - dw_pci.nr_controllers = 1; - dw_pci.private_data = (void **)&pp; + pci_scan_child_bus(bus); + if (pp->ops->scan_bus) + pp->ops->scan_bus(pp); - pci_common_init_dev(pp->dev, &dw_pci); +#ifdef CONFIG_ARM + /* support old dtbs that incorrectly describe IRQs */ + pci_fixup_irqs(pci_common_swizzle, of_irq_parse_and_map_pci); +#endif + + pci_assign_unassigned_bus_resources(bus); + pci_bus_add_devices(bus); return 0; } @@ -653,7 +665,7 @@ static int dw_pcie_valid_config(struct pcie_port *pp, static int dw_pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where, int size, u32 *val) { - struct pcie_port *pp = sys_to_pcie(bus->sysdata); + struct pcie_port *pp = bus->sysdata; int ret; if (dw_pcie_valid_config(pp, bus, PCI_SLOT(devfn)) == 0) { @@ -677,7 +689,7 @@ static int dw_pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where, static int dw_pcie_wr_conf(struct pci_bus *bus, u32 devfn, int where, int size, u32 val) { - struct pcie_port *pp = sys_to_pcie(bus->sysdata); + struct pcie_port *pp = bus->sysdata; int ret; if (dw_pcie_valid_config(pp, bus, PCI_SLOT(devfn)) == 0) @@ -701,64 +713,6 @@ static struct pci_ops dw_pcie_ops = { .write = dw_pcie_wr_conf, }; -static int dw_pcie_setup(int nr, struct pci_sys_data *sys) -{ - struct pcie_port *pp; - - pp = sys_to_pcie(sys); - - if (global_io_offset < SZ_1M && pp->io_size > 0) { - sys->io_offset = global_io_offset - pp->io_bus_addr; - pci_ioremap_io(global_io_offset, pp->io_base); - global_io_offset += SZ_64K; - pci_add_resource_offset(&sys->resources, &pp->io, - sys->io_offset); - } - - sys->mem_offset = pp->mem.start - pp->mem_bus_addr; - pci_add_resource_offset(&sys->resources, &pp->mem, sys->mem_offset); - pci_add_resource(&sys->resources, &pp->busn); - - return 1; -} - -static struct pci_bus *dw_pcie_scan_bus(int nr, struct pci_sys_data *sys) -{ - struct pci_bus *bus; - struct pcie_port *pp = sys_to_pcie(sys); - - pp->root_bus_nr = sys->busnr; - bus = pci_create_root_bus(pp->dev, sys->busnr, - &dw_pcie_ops, sys, &sys->resources); - if (!bus) - return NULL; - - pci_scan_child_bus(bus); - - if (bus && pp->ops->scan_bus) - pp->ops->scan_bus(pp); - - return bus; -} - -static int dw_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) -{ - struct pcie_port *pp = sys_to_pcie(dev->bus->sysdata); - int irq; - - irq = of_irq_parse_and_map_pci(dev, slot, pin); - if (!irq) - irq = pp->irq; - - return irq; -} - -static struct hw_pci dw_pci = { - .setup = dw_pcie_setup, - .scan = dw_pcie_scan_bus, - .map_irq = dw_pcie_map_irq, -}; - void dw_pcie_setup_rc(struct pcie_port *pp) { u32 val; diff --git a/drivers/pci/host/pcie-designware.h b/drivers/pci/host/pcie-designware.h index d0bbd27..ab78710 100644 --- a/drivers/pci/host/pcie-designware.h +++ b/drivers/pci/host/pcie-designware.h @@ -34,7 +34,7 @@ struct pcie_port { u64 cfg1_mod_base; void __iomem *va_cfg1_base; u32 cfg1_size; - u64 io_base; + resource_size_t io_base; u64 io_mod_base; phys_addr_t io_bus_addr; u32 io_size; @@ -42,10 +42,10 @@ struct pcie_port { u64 mem_mod_base; phys_addr_t mem_bus_addr; u32 mem_size; - struct resource cfg; - struct resource io; - struct resource mem; - struct resource busn; + struct resource *cfg; + struct resource *io; + struct resource *mem; + struct resource *busn; int irq; u32 lanes; struct pcie_host_ops *ops; diff --git a/drivers/pci/host/pcie-spear13xx.c b/drivers/pci/host/pcie-spear13xx.c index 020d788..e78ddf8 100644 --- a/drivers/pci/host/pcie-spear13xx.c +++ b/drivers/pci/host/pcie-spear13xx.c @@ -287,7 +287,7 @@ static int spear13xx_add_pcie_port(struct pcie_port *pp, return ret; } - pp->root_bus_nr = -1; + pp->root_bus_nr = 0; pp->ops = &spear13xx_pcie_host_ops; ret = dw_pcie_host_init(pp);