diff options
author | Thanos Makatos <thanos.makatos@nutanix.com> | 2021-07-12 09:20:54 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-12 09:20:54 +0100 |
commit | f44091db918d54211cb43683b091c61a6177d450 (patch) | |
tree | c15a7fbeaec11ad86bc77a5e4ed141e1348d239c | |
parent | b5164c73125ab4bbb6e3e7742efbeb358e85e872 (diff) | |
download | libvfio-user-f44091db918d54211cb43683b091c61a6177d450.zip libvfio-user-f44091db918d54211cb43683b091c61a6177d450.tar.gz libvfio-user-f44091db918d54211cb43683b091c61a6177d450.tar.bz2 |
basic write support for PXLC, PXSC, PXRS, and PXSC2 (#575)
Signed-off-by: Thanos Makatos <thanos.makatos@nutanix.com>
Reviewed-by: John Levon <john.levon@nutanix.com>
-rw-r--r-- | include/pci_caps/px.h | 22 | ||||
-rw-r--r-- | lib/pci_caps.c | 32 |
2 files changed, 50 insertions, 4 deletions
diff --git a/include/pci_caps/px.h b/include/pci_caps/px.h index e2eb36c..cd3c2f7 100644 --- a/include/pci_caps/px.h +++ b/include/pci_caps/px.h @@ -98,10 +98,24 @@ struct pxlcap { } __attribute__((packed)); _Static_assert(sizeof(struct pxlcap) == 0x4, "bad PXLCAP size"); -struct pxlc { - uint16_t stuff:16; +union pxlc { + uint16_t raw; + struct { + uint16_t aspmc:2; /* Active State Power Management Control */ + uint16_t rsvdp1:1; + uint16_t rcb:1; /* Read Completion Boundary */ + uint16_t ld:1; /* Link Disable */ + uint16_t rl:1; /* Retrain Link */ + uint16_t ccc:1; /* Common Clock Configuration */ + uint16_t es:1; /* Extended Synch */ + uint16_t clkreq_en:1; /* Enable Clock Power Management */ + uint16_t hawd:1; /* Hardware Autonomous Width Disable */ + uint16_t lbmie:1; /* Link Bandwidth Management Interrupt Enable */ + uint16_t labie:1; /* Link Autonomous Bandwidth Interrupt Enable */ + uint16_t rsvdp2:4; + }; } __attribute__((packed)); -_Static_assert(sizeof(struct pxlc) == 0x2, "bad PXLC size"); +_Static_assert(sizeof(union pxlc) == 0x2, "bad PXLC size"); struct pxls { uint16_t stuff:16; @@ -239,7 +253,7 @@ struct pxcap { /* Link Capabilities */ struct pxlcap pxlcap; /* Link Control */ - struct pxlc pxlc; + union pxlc pxlc; /* Link Status */ struct pxls pxls; /* Slot Capabilities */ diff --git a/lib/pci_caps.c b/lib/pci_caps.c index d7d312f..ec0dbd8 100644 --- a/lib/pci_caps.c +++ b/lib/pci_caps.c @@ -292,6 +292,30 @@ handle_px_pxdc_write(vfu_ctx_t *vfu_ctx, struct pxcap *px, return 0; } +/* TODO implement */ +static int +handle_px_pxlc_write(vfu_ctx_t *vfu_ctx UNUSED, struct pxcap *px UNUSED, + const union pxlc *const p UNUSED) +{ + return 0; +} + +/* TODO implement */ +static int +handle_px_pxsc_write(vfu_ctx_t *vfu_ctx UNUSED, struct pxcap *px UNUSED, + const struct pxsc *const p UNUSED) +{ + return 0; +} + +/* TODO implement */ +static int +handle_px_pxrc_write(vfu_ctx_t *vfu_ctx UNUSED, struct pxcap *px UNUSED, + const struct pxrc *const p UNUSED) +{ + return 0; +} + static int handle_px_pxdc2_write(vfu_ctx_t *vfu_ctx, struct pxcap *px, const union pxdc2 *const p) @@ -327,10 +351,18 @@ handle_px_write_2_bytes(vfu_ctx_t *vfu_ctx, struct pxcap *px, char *buf, switch (off) { case offsetof(struct pxcap, pxdc): return handle_px_pxdc_write(vfu_ctx, px, (union pxdc *)buf); + case offsetof(struct pxcap, pxlc): + return handle_px_pxlc_write(vfu_ctx, px, (union pxlc *)buf); + case offsetof(struct pxcap, pxsc): + return handle_px_pxsc_write(vfu_ctx, px, (struct pxsc *)buf); + case offsetof(struct pxcap, pxrc): + return handle_px_pxrc_write(vfu_ctx, px, (struct pxrc *)buf); case offsetof(struct pxcap, pxdc2): return handle_px_pxdc2_write(vfu_ctx, px, (union pxdc2 *)buf); case offsetof(struct pxcap, pxlc2): return handle_px_pxlc2_write(vfu_ctx, px, (struct pxlc2 *)buf); + case offsetof(struct pxcap, pxsc2): /* RsvdZ */ + return 0; } return ERROR_INT(EINVAL); } |