Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1294027 > unrolled thread

Re: [PATCH 1/3] NTB: Add AMD PCI-Express NTB driver

Started byAllen Hubbe <allenbh@gmail.com>
First post2015-12-17 17:50 +0100
Last post2015-12-18 08:20 +0100
Articles 2 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: [PATCH 1/3] NTB: Add AMD PCI-Express NTB driver Allen Hubbe <allenbh@gmail.com> - 2015-12-17 17:50 +0100
    RE: [PATCH 1/3] NTB: Add AMD PCI-Express NTB driver "Yu, Xiangliang" <Xiangliang.Yu@amd.com> - 2015-12-18 08:20 +0100

#1294027 — Re: [PATCH 1/3] NTB: Add AMD PCI-Express NTB driver

FromAllen Hubbe <allenbh@gmail.com>
Date2015-12-17 17:50 +0100
SubjectRe: [PATCH 1/3] NTB: Add AMD PCI-Express NTB driver
Message-ID<qGJUC-1Y1-21@gated-at.bofh.it>
On Thu, Dec 17, 2015 at 3:17 AM, Xiangliang Yu <Xiangliang.Yu@amd.com> wrote:
> AMD NTB support following main features:
> (1) Three memory windows;
> (2) Sixteen 32-bit scratch pad;
> (3) Two 16-bit doorbell interrupt;
> (4) Five event interrupts;
> (5) One system can wake up opposite system of NTB;
> (6) Flush previous request to the opposite system;
> (7) There are reset and PME_TO mechanisms between two systems;
>
> Signed-off-by: Xiangliang Yu <Xiangliang.Yu@amd.com>

Is hardware available on which this can be tested?

> +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c

> +static u64 amd_ntb_db_read(struct ntb_dev *ntb)
> +{
> +       struct amd_ntb_dev *ndev = ntb_ndev(ntb);
> +
> +       return (u64)NTB_READ_REG(DBSTAT);
> +}

DBSTAT hides the use of ndev, or ndev is unused.  The code should be
more clear, here, and in other places where NTB_READ_REG and
NTB_WRITE_REG are used with a macro argument.

> +static void amd_ack_SMU(struct amd_ntb_dev *ndev, u32 bit)
> +{
> +       int reg;
> +
> +       reg = NTB_READ_REG(SMUACK);
> +       reg |= bit;
> +       NTB_WRITE_REG(reg, SMUACK);
> +
> +       ndev->peer_sta |= bit;
> +}
> +
> +/*
> + * flush the requests to peer side
> + */
> +static int amd_flush_peer_requests(struct amd_ntb_dev *ndev)
> +{
> +       u32 reg;
> +
> +       if (!amd_link_is_up(ndev)) {
> +               dev_err(ndev_dev(ndev), "link is down.\n");
> +               return -EINVAL;
> +       }
> +

Add reinit_completion, or this may already be "complete" from a previous flush.

> +       reg = NTB_READ_REG(FLUSHTRIG);
> +       reg |= 0x1;
> +       NTB_WRITE_REG(reg, FLUSHTRIG);
> +
> +       wait_for_completion(&ndev->flush_cmpl);

Because of wait_for_completion, that this can only be called in a
thread context.  This is unlike other functions of ntb.h, so there
should at least be a note in the api documentation.

> +
> +       return 0;
> +}
> +
> +/*
> + * wake up the peer side
> + */
> +static int amd_wakeup_peer_side(struct amd_ntb_dev *ndev)
> +{
> +       u32 reg;
> +
> +       if (!amd_link_is_up(ndev)) {
> +               dev_warn(ndev_dev(ndev), "link is down.\n");
> +               return -EINVAL;
> +       }
> +

See previous comment.

> +       NTB_READ_REG(PMSGTRIG);
> +       reg |= 0x1;
> +       NTB_WRITE_REG(reg, PMSGTRIG);
> +
> +       wait_for_completion(&ndev->wakeup_cmpl);
> +
> +       return 0;
> +}


> +static void amd_handle_event(struct amd_ntb_dev *ndev, int vec)
> +{
> +       u32 status;
> +
> +       status = NTB_READ_REG(INTSTAT);
> +       if (!(status & AMD_EVENT_INTMASK))
> +               return;
> +
> +       dev_dbg(ndev_dev(ndev), "status = 0x%x and vec = %d\n", status, vec);
> +
> +       status &= AMD_EVENT_INTMASK;
> +       switch (status) {
> +       case AMD_PEER_FLUSH_EVENT:
> +               complete(&ndev->flush_cmpl);
> +               break;
> +       case AMD_PEER_RESET_EVENT:
> +               amd_ack_SMU(ndev, AMD_PEER_RESET_EVENT);
> +
> +               /* link down first */
> +               ntb_link_event(&ndev->ntb);
> +               /* polling peer status */
> +               schedule_delayed_work(&ndev->hb_timer, AMD_LINK_HB_TIMEOUT);
> +
> +               break;
> +       case AMD_PEER_D3_EVENT:
> +       case AMD_PEER_PMETO_EVENT:
> +               amd_ack_SMU(ndev, status);
> +
> +               /* link down */
> +               ntb_link_event(&ndev->ntb);
> +
> +               break;
> +       case AMD_PEER_D0_EVENT:
> +               status = NTB_READ_PEER_REG(PMESTAT);
> +               /* check if this is WAKEUP event */
> +               if (status & 0x1)
> +                       complete(&ndev->wakeup_cmpl);
> +
> +               amd_ack_SMU(ndev, AMD_PEER_D0_EVENT);
> +
> +               if (amd_link_is_up(ndev))
> +                       ntb_link_event(&ndev->ntb);
> +               else
> +                       schedule_delayed_work(&ndev->hb_timer,
> +                                               AMD_LINK_HB_TIMEOUT);
> +               break;
> +       default:
> +               pr_err("Unsupported interrupt.\n");
> +               break;
> +       }
> +}
> +
> +static irqreturn_t ndev_interrupt(struct amd_ntb_dev *ndev, int vec)
> +{
> +       dev_dbg(ndev_dev(ndev), "vec %d\n", vec);
> +
> +       if (vec > 20) {

This duplicates the "default" case of amd_handle_event.

> +               dev_err(ndev_dev(ndev), "Invalid interrupt.\n");
> +               return IRQ_HANDLED;
> +       }
> +
> +       if (vec > 16 || (ndev->msix_vec_count == 1))
> +               amd_handle_event(ndev, vec);
> +
> +       if (vec < 16)
> +               ntb_db_event(&ndev->ntb, vec);
> +
> +       return IRQ_HANDLED;
> +}
--
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/

[toc] | [next] | [standalone]


#1294466

From"Yu, Xiangliang" <Xiangliang.Yu@amd.com>
Date2015-12-18 08:20 +0100
Message-ID<qGXux-2u7-5@gated-at.bofh.it>
In reply to#1294027
PiBGcm9tOiBBbGxlbiBIdWJiZSBbbWFpbHRvOmFsbGVuYmhAZ21haWwuY29tXQ0KPiBTZW50OiBG
cmlkYXksIERlY2VtYmVyIDE4LCAyMDE1IDEyOjQ2IEFNDQo+IFRvOiBZdSwgWGlhbmdsaWFuZw0K
PiBDYzogamRtYXNvbkBrdWR6dS51czsgZGF2ZS5qaWFuZ0BpbnRlbC5jb207IGxpbnV4LW50YkBn
b29nbGVncm91cHMuY29tOw0KPiBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOyBTUEdfTGlu
dXhfS2VybmVsDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggMS8zXSBOVEI6IEFkZCBBTUQgUENJLUV4
cHJlc3MgTlRCIGRyaXZlcg0KPiANCj4gT24gVGh1LCBEZWMgMTcsIDIwMTUgYXQgMzoxNyBBTSwg
WGlhbmdsaWFuZyBZdSA8WGlhbmdsaWFuZy5ZdUBhbWQuY29tPg0KPiB3cm90ZToNCj4gPiBBTUQg
TlRCIHN1cHBvcnQgZm9sbG93aW5nIG1haW4gZmVhdHVyZXM6DQo+ID4gKDEpIFRocmVlIG1lbW9y
eSB3aW5kb3dzOw0KPiA+ICgyKSBTaXh0ZWVuIDMyLWJpdCBzY3JhdGNoIHBhZDsNCj4gPiAoMykg
VHdvIDE2LWJpdCBkb29yYmVsbCBpbnRlcnJ1cHQ7DQo+ID4gKDQpIEZpdmUgZXZlbnQgaW50ZXJy
dXB0czsNCj4gPiAoNSkgT25lIHN5c3RlbSBjYW4gd2FrZSB1cCBvcHBvc2l0ZSBzeXN0ZW0gb2Yg
TlRCOw0KPiA+ICg2KSBGbHVzaCBwcmV2aW91cyByZXF1ZXN0IHRvIHRoZSBvcHBvc2l0ZSBzeXN0
ZW07DQo+ID4gKDcpIFRoZXJlIGFyZSByZXNldCBhbmQgUE1FX1RPIG1lY2hhbmlzbXMgYmV0d2Vl
biB0d28gc3lzdGVtczsNCj4gPg0KPiA+IFNpZ25lZC1vZmYtYnk6IFhpYW5nbGlhbmcgWXUgPFhp
YW5nbGlhbmcuWXVAYW1kLmNvbT4NCj4gDQo+IElzIGhhcmR3YXJlIGF2YWlsYWJsZSBvbiB3aGlj
aCB0aGlzIGNhbiBiZSB0ZXN0ZWQ/DQoNCk5vIHlldC4gUmlnaHQgbm93LCB2ZXJpZmllZCB0aGUg
ZHJpdmVyIG9uIGVtdWxhdG9yLg0KDQo+IA0KPiA+ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2FtZC9u
dGJfaHdfYW1kLmMNCj4gDQo+ID4gK3N0YXRpYyB1NjQgYW1kX250Yl9kYl9yZWFkKHN0cnVjdCBu
dGJfZGV2ICpudGIpIHsNCj4gPiArICAgICAgIHN0cnVjdCBhbWRfbnRiX2RldiAqbmRldiA9IG50
Yl9uZGV2KG50Yik7DQo+ID4gKw0KPiA+ICsgICAgICAgcmV0dXJuICh1NjQpTlRCX1JFQURfUkVH
KERCU1RBVCk7IH0NCj4gDQo+IERCU1RBVCBoaWRlcyB0aGUgdXNlIG9mIG5kZXYsIG9yIG5kZXYg
aXMgdW51c2VkLiAgVGhlIGNvZGUgc2hvdWxkIGJlIG1vcmUNCj4gY2xlYXIsIGhlcmUsIGFuZCBp
biBvdGhlciBwbGFjZXMgd2hlcmUgTlRCX1JFQURfUkVHIGFuZCBOVEJfV1JJVEVfUkVHDQo+IGFy
ZSB1c2VkIHdpdGggYSBtYWNybyBhcmd1bWVudC4NCg0KR290IGl0LCBJIHdpbGwgYWRkIG5kZXYg
aW50byBtYWNybyBhcmd1bWVudHMuDQoNCj4gDQo+ID4gK3N0YXRpYyB2b2lkIGFtZF9hY2tfU01V
KHN0cnVjdCBhbWRfbnRiX2RldiAqbmRldiwgdTMyIGJpdCkgew0KPiA+ICsgICAgICAgaW50IHJl
ZzsNCj4gPiArDQo+ID4gKyAgICAgICByZWcgPSBOVEJfUkVBRF9SRUcoU01VQUNLKTsNCj4gPiAr
ICAgICAgIHJlZyB8PSBiaXQ7DQo+ID4gKyAgICAgICBOVEJfV1JJVEVfUkVHKHJlZywgU01VQUNL
KTsNCj4gPiArDQo+ID4gKyAgICAgICBuZGV2LT5wZWVyX3N0YSB8PSBiaXQ7DQo+ID4gK30NCj4g
PiArDQo+ID4gKy8qDQo+ID4gKyAqIGZsdXNoIHRoZSByZXF1ZXN0cyB0byBwZWVyIHNpZGUNCj4g
PiArICovDQo+ID4gK3N0YXRpYyBpbnQgYW1kX2ZsdXNoX3BlZXJfcmVxdWVzdHMoc3RydWN0IGFt
ZF9udGJfZGV2ICpuZGV2KSB7DQo+ID4gKyAgICAgICB1MzIgcmVnOw0KPiA+ICsNCj4gPiArICAg
ICAgIGlmICghYW1kX2xpbmtfaXNfdXAobmRldikpIHsNCj4gPiArICAgICAgICAgICAgICAgZGV2
X2VycihuZGV2X2RldihuZGV2KSwgImxpbmsgaXMgZG93bi5cbiIpOw0KPiA+ICsgICAgICAgICAg
ICAgICByZXR1cm4gLUVJTlZBTDsNCj4gPiArICAgICAgIH0NCj4gPiArDQo+IA0KPiBBZGQgcmVp
bml0X2NvbXBsZXRpb24sIG9yIHRoaXMgbWF5IGFscmVhZHkgYmUgImNvbXBsZXRlIiBmcm9tIGEg
cHJldmlvdXMNCj4gZmx1c2guDQoNCk9rLg0KDQo+IA0KPiA+ICsgICAgICAgcmVnID0gTlRCX1JF
QURfUkVHKEZMVVNIVFJJRyk7DQo+ID4gKyAgICAgICByZWcgfD0gMHgxOw0KPiA+ICsgICAgICAg
TlRCX1dSSVRFX1JFRyhyZWcsIEZMVVNIVFJJRyk7DQo+ID4gKw0KPiA+ICsgICAgICAgd2FpdF9m
b3JfY29tcGxldGlvbigmbmRldi0+Zmx1c2hfY21wbCk7DQo+IA0KPiBCZWNhdXNlIG9mIHdhaXRf
Zm9yX2NvbXBsZXRpb24sIHRoYXQgdGhpcyBjYW4gb25seSBiZSBjYWxsZWQgaW4gYSB0aHJlYWQN
Cj4gY29udGV4dC4gIFRoaXMgaXMgdW5saWtlIG90aGVyIGZ1bmN0aW9ucyBvZiBudGIuaCwgc28g
dGhlcmUgc2hvdWxkIGF0IGxlYXN0IGJlIGENCj4gbm90ZSBpbiB0aGUgYXBpIGRvY3VtZW50YXRp
b24uDQoNCk9rLg0KPiANCj4gPiArDQo+ID4gKyAgICAgICByZXR1cm4gMDsNCj4gPiArfQ0KPiA+
ICsNCj4gPiArLyoNCj4gPiArICogd2FrZSB1cCB0aGUgcGVlciBzaWRlDQo+ID4gKyAqLw0KPiA+
ICtzdGF0aWMgaW50IGFtZF93YWtldXBfcGVlcl9zaWRlKHN0cnVjdCBhbWRfbnRiX2RldiAqbmRl
dikgew0KPiA+ICsgICAgICAgdTMyIHJlZzsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoIWFtZF9s
aW5rX2lzX3VwKG5kZXYpKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRldl93YXJuKG5kZXZfZGV2
KG5kZXYpLCAibGluayBpcyBkb3duLlxuIik7DQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAt
RUlOVkFMOw0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gDQo+IFNlZSBwcmV2aW91cyBjb21tZW50
Lg0KPiANCj4gPiArICAgICAgIE5UQl9SRUFEX1JFRyhQTVNHVFJJRyk7DQo+ID4gKyAgICAgICBy
ZWcgfD0gMHgxOw0KPiA+ICsgICAgICAgTlRCX1dSSVRFX1JFRyhyZWcsIFBNU0dUUklHKTsNCj4g
PiArDQo+ID4gKyAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uKCZuZGV2LT53YWtldXBfY21wbCk7
DQo+ID4gKw0KPiA+ICsgICAgICAgcmV0dXJuIDA7DQo+ID4gK30NCj4gDQo+IA0KPiA+ICtzdGF0
aWMgdm9pZCBhbWRfaGFuZGxlX2V2ZW50KHN0cnVjdCBhbWRfbnRiX2RldiAqbmRldiwgaW50IHZl
Yykgew0KPiA+ICsgICAgICAgdTMyIHN0YXR1czsNCj4gPiArDQo+ID4gKyAgICAgICBzdGF0dXMg
PSBOVEJfUkVBRF9SRUcoSU5UU1RBVCk7DQo+ID4gKyAgICAgICBpZiAoIShzdGF0dXMgJiBBTURf
RVZFTlRfSU5UTUFTSykpDQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybjsNCj4gPiArDQo+ID4g
KyAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAic3RhdHVzID0gMHgleCBhbmQgdmVjID0g
JWRcbiIsDQo+ID4gKyBzdGF0dXMsIHZlYyk7DQo+ID4gKw0KPiA+ICsgICAgICAgc3RhdHVzICY9
IEFNRF9FVkVOVF9JTlRNQVNLOw0KPiA+ICsgICAgICAgc3dpdGNoIChzdGF0dXMpIHsNCj4gPiAr
ICAgICAgIGNhc2UgQU1EX1BFRVJfRkxVU0hfRVZFTlQ6DQo+ID4gKyAgICAgICAgICAgICAgIGNv
bXBsZXRlKCZuZGV2LT5mbHVzaF9jbXBsKTsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+
ID4gKyAgICAgICBjYXNlIEFNRF9QRUVSX1JFU0VUX0VWRU5UOg0KPiA+ICsgICAgICAgICAgICAg
ICBhbWRfYWNrX1NNVShuZGV2LCBBTURfUEVFUl9SRVNFVF9FVkVOVCk7DQo+ID4gKw0KPiA+ICsg
ICAgICAgICAgICAgICAvKiBsaW5rIGRvd24gZmlyc3QgKi8NCj4gPiArICAgICAgICAgICAgICAg
bnRiX2xpbmtfZXZlbnQoJm5kZXYtPm50Yik7DQo+ID4gKyAgICAgICAgICAgICAgIC8qIHBvbGxp
bmcgcGVlciBzdGF0dXMgKi8NCj4gPiArICAgICAgICAgICAgICAgc2NoZWR1bGVfZGVsYXllZF93
b3JrKCZuZGV2LT5oYl90aW1lciwNCj4gPiArIEFNRF9MSU5LX0hCX1RJTUVPVVQpOw0KPiA+ICsN
Cj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICBjYXNlIEFNRF9QRUVSX0Qz
X0VWRU5UOg0KPiA+ICsgICAgICAgY2FzZSBBTURfUEVFUl9QTUVUT19FVkVOVDoNCj4gPiArICAg
ICAgICAgICAgICAgYW1kX2Fja19TTVUobmRldiwgc3RhdHVzKTsNCj4gPiArDQo+ID4gKyAgICAg
ICAgICAgICAgIC8qIGxpbmsgZG93biAqLw0KPiA+ICsgICAgICAgICAgICAgICBudGJfbGlua19l
dmVudCgmbmRldi0+bnRiKTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+
ICsgICAgICAgY2FzZSBBTURfUEVFUl9EMF9FVkVOVDoNCj4gPiArICAgICAgICAgICAgICAgc3Rh
dHVzID0gTlRCX1JFQURfUEVFUl9SRUcoUE1FU1RBVCk7DQo+ID4gKyAgICAgICAgICAgICAgIC8q
IGNoZWNrIGlmIHRoaXMgaXMgV0FLRVVQIGV2ZW50ICovDQo+ID4gKyAgICAgICAgICAgICAgIGlm
IChzdGF0dXMgJiAweDEpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoJm5k
ZXYtPndha2V1cF9jbXBsKTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIGFtZF9hY2tfU01V
KG5kZXYsIEFNRF9QRUVSX0QwX0VWRU5UKTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIGlm
IChhbWRfbGlua19pc191cChuZGV2KSkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBudGJf
bGlua19ldmVudCgmbmRldi0+bnRiKTsNCj4gPiArICAgICAgICAgICAgICAgZWxzZQ0KPiA+ICsg
ICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmRldi0+aGJfdGlt
ZXIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
QU1EX0xJTktfSEJfVElNRU9VVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsg
ICAgICAgZGVmYXVsdDoNCj4gPiArICAgICAgICAgICAgICAgcHJfZXJyKCJVbnN1cHBvcnRlZCBp
bnRlcnJ1cHQuXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9
DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpcnFyZXR1cm5fdCBuZGV2X2ludGVycnVwdChz
dHJ1Y3QgYW1kX250Yl9kZXYgKm5kZXYsIGludCB2ZWMpDQo+ID4gK3sNCj4gPiArICAgICAgIGRl
dl9kYmcobmRldl9kZXYobmRldiksICJ2ZWMgJWRcbiIsIHZlYyk7DQo+ID4gKw0KPiA+ICsgICAg
ICAgaWYgKHZlYyA+IDIwKSB7DQo+IA0KPiBUaGlzIGR1cGxpY2F0ZXMgdGhlICJkZWZhdWx0IiBj
YXNlIG9mIGFtZF9oYW5kbGVfZXZlbnQuDQpPaywgSSdsbCByZWZpbmUgdGhlIGNvZGUuDQoNCj4g
DQo+ID4gKyAgICAgICAgICAgICAgIGRldl9lcnIobmRldl9kZXYobmRldiksICJJbnZhbGlkIGlu
dGVycnVwdC5cbiIpOw0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7DQo+
ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKHZlYyA+IDE2IHx8IChuZGV2LT5t
c2l4X3ZlY19jb3VudCA9PSAxKSkNCj4gPiArICAgICAgICAgICAgICAgYW1kX2hhbmRsZV9ldmVu
dChuZGV2LCB2ZWMpOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICh2ZWMgPCAxNikNCj4gPiArICAg
ICAgICAgICAgICAgbnRiX2RiX2V2ZW50KCZuZGV2LT5udGIsIHZlYyk7DQo+ID4gKw0KPiA+ICsg
ICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOw0KPiA+ICt9DQo=
--
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/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web