STRUCT NTB_DEV_OPS(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… struct ntb_dev_ops(9) πŸ’…

okay so this is from the Kernel API Manual, section 9, and it's literally the blueprint for how an NTB device (that's Non-Transparent Bridge, iykyk) does its thing. it's a big ol' struct full of function pointers and bestie, there are so many of them. buckle up. πŸŽ€


✨ NAME ✨

struct ntb_dev_ops β€” ntb device operations. that's the whole vibe. it's the ops table. the main character of the NTB world. πŸ‘‘


πŸ¦‹ SYNOPSIS πŸ¦‹

here's the whole struct, no cap, every single pointer, exactly as it lives:

struct ntb_dev_ops {
    int (*port_number)(struct ntb_dev *ntb);
    int (*peer_port_count)(struct ntb_dev *ntb);
    int (*peer_port_number)(struct ntb_dev *ntb, int pidx);
    int (*peer_port_idx)(struct ntb_dev *ntb, int port);
    u64 (*link_is_up)(struct ntb_dev *ntb, enum ntb_speed *speed, enum
ntb_width *width);
    int (*link_enable)(struct ntb_dev *ntb, enum ntb_speed max_speed,
enum ntb_width max_width);
    int (*link_disable)(struct ntb_dev *ntb);
    int (*mw_count)(struct ntb_dev *ntb, int pidx);
    int (*mw_get_align)(struct ntb_dev *ntb, int pidx, int widx,
resource_size_t *addr_align, resource_size_t *size_align,
resource_size_t *size_max);
    int (*mw_set_trans)(struct ntb_dev *ntb, int pidx, int widx,
dma_addr_t addr, resource_size_t size);
    int (*mw_clear_trans)(struct ntb_dev *ntb, int pidx, int widx);
    int (*peer_mw_count)(struct ntb_dev *ntb);
    int (*peer_mw_get_addr)(struct ntb_dev *ntb, int widx, phys_addr_t
*base, resource_size_t *size);
    int (*peer_mw_set_trans)(struct ntb_dev *ntb, int pidx, int widx,
u64 addr, resource_size_t size);
    int (*peer_mw_clear_trans)(struct ntb_dev *ntb, int pidx, int widx);
    int (*db_is_unsafe)(struct ntb_dev *ntb);
    u64 (*db_valid_mask)(struct ntb_dev *ntb);
    int (*db_vector_count)(struct ntb_dev *ntb);
    u64 (*db_vector_mask)(struct ntb_dev *ntb, int db_vector);
    u64 (*db_read)(struct ntb_dev *ntb);
    int (*db_set)(struct ntb_dev *ntb, u64 db_bits);
    int (*db_clear)(struct ntb_dev *ntb, u64 db_bits);
    u64 (*db_read_mask)(struct ntb_dev *ntb);
    int (*db_set_mask)(struct ntb_dev *ntb, u64 db_bits);
    int (*db_clear_mask)(struct ntb_dev *ntb, u64 db_bits);
    int (*peer_db_addr)(struct ntb_dev *ntb, phys_addr_t *db_addr,
resource_size_t *db_size, u64 *db_data, int db_bit);
    u64 (*peer_db_read)(struct ntb_dev *ntb);
    int (*peer_db_set)(struct ntb_dev *ntb, u64 db_bits);
    int (*peer_db_clear)(struct ntb_dev *ntb, u64 db_bits);
    u64 (*peer_db_read_mask)(struct ntb_dev *ntb);
    int (*peer_db_set_mask)(struct ntb_dev *ntb, u64 db_bits);
    int (*peer_db_clear_mask)(struct ntb_dev *ntb, u64 db_bits);
    int (*spad_is_unsafe)(struct ntb_dev *ntb);
    int (*spad_count)(struct ntb_dev *ntb);
    u32 (*spad_read)(struct ntb_dev *ntb, int sidx);
    int (*spad_write)(struct ntb_dev *ntb, int sidx, u32 val);
    int (*peer_spad_addr)(struct ntb_dev *ntb, int pidx, int sidx,
phys_addr_t *spad_addr);
    u32 (*peer_spad_read)(struct ntb_dev *ntb, int pidx, int sidx);
    int (*peer_spad_write)(struct ntb_dev *ntb, int pidx, int sidx, u32
val);
    int (*msg_count)(struct ntb_dev *ntb);
    u64 (*msg_inbits)(struct ntb_dev *ntb);
    u64 (*msg_outbits)(struct ntb_dev *ntb);
    u64 (*msg_read_sts)(struct ntb_dev *ntb);
    int (*msg_clear_sts)(struct ntb_dev *ntb, u64 sts_bits);
    int (*msg_set_mask)(struct ntb_dev *ntb, u64 mask_bits);
    int (*msg_clear_mask)(struct ntb_dev *ntb, u64 mask_bits);
    u32 (*msg_read)(struct ntb_dev *ntb, int *pidx, int midx);
    int (*peer_msg_write)(struct ntb_dev *ntb, int pidx, int midx, u32
msg);
    struct device *(*get_dma_dev)(struct ntb_dev *ntb);
 };

it's giving "wall of function pointers" and honestly? iconic. πŸ’€


🌸 Members 🌸

okay so every single member, and what it points at. and the answer is basically "go read the other page" for all of them β€” that's not me being lazy, that's literally what the man page says. I'm just the messenger. 🫢

  • port_number β€” See ntb_port_number.
  • peer_port_count β€” See ntb_peer_port_count.
  • peer_port_number β€” See ntb_peer_port_number.
  • peer_port_idx β€” See ntb_peer_port_idx.
  • link_is_up β€” See ntb_link_is_up.
  • link_enable β€” See ntb_link_enable.
  • link_disable β€” See ntb_link_disable.
  • mw_count β€” See ntb_mw_count.
  • mw_get_align β€” See ntb_mw_get_align.
  • mw_set_trans β€” See ntb_mw_set_trans.
  • mw_clear_trans β€” See ntb_mw_clear_trans.
  • peer_mw_count β€” See ntb_peer_mw_count.
  • peer_mw_get_addr β€” See ntb_peer_mw_get_addr.
  • peer_mw_set_trans β€” See ntb_peer_mw_set_trans.
  • peer_mw_clear_trans β€” See ntb_peer_mw_clear_trans.
  • db_is_unsafe β€” See ntb_db_is_unsafe.
  • db_valid_mask β€” See ntb_db_valid_mask.
  • db_vector_count β€” See ntb_db_vector_count.
  • db_vector_mask β€” See ntb_db_vector_mask.
  • db_read β€” See ntb_db_read.
  • db_set β€” See ntb_db_set.
  • db_clear β€” See ntb_db_clear.
  • db_read_mask β€” See ntb_db_read_mask.
  • db_set_mask β€” See ntb_db_set_mask.
  • db_clear_mask β€” See ntb_db_clear_mask.
  • peer_db_addr β€” See ntb_peer_db_addr.
  • peer_db_read β€” See ntb_peer_db_read.
  • peer_db_set β€” See ntb_peer_db_set.
  • peer_db_clear β€” See ntb_peer_db_clear.
  • peer_db_read_mask β€” See ntb_peer_db_read_mask.
  • peer_db_set_mask β€” See ntb_peer_db_set_mask.
  • peer_db_clear_mask β€” See ntb_peer_db_clear_mask.
  • spad_is_unsafe β€” See ntb_spad_is_unsafe.
  • spad_count β€” See ntb_spad_count.
  • spad_read β€” See ntb_spad_read.
  • spad_write β€” See ntb_spad_write.
  • peer_spad_addr β€” See ntb_peer_spad_addr.
  • peer_spad_read β€” See ntb_peer_spad_read.
  • peer_spad_write β€” See ntb_peer_spad_write.
  • msg_count β€” See ntb_msg_count.
  • msg_inbits β€” See ntb_msg_inbits.
  • msg_outbits β€” See ntb_msg_outbits.
  • msg_read_sts β€” See ntb_msg_read_sts.
  • msg_clear_sts β€” See ntb_msg_clear_sts.
  • msg_set_mask β€” See ntb_msg_set_mask.
  • msg_clear_mask β€” See ntb_msg_clear_mask.
  • msg_read β€” See ntb_msg_read.
  • peer_msg_write β€” See ntb_peer_msg_write.
  • get_dma_dev β€” See ntb_get_dma_dev.

like… every single one is a redirect. it's a struct of "please see also". the way that this struct is basically a table of contents? obsessed. πŸ“š


πŸ”₯ SEE ALSO πŸ”₯

bestie there are so many friends. the whole kernel family showed up. also pls note the kernel file: Kernel file ./include/linux/ntb.h

the enums and structs first, because they're the ✨foundation✨:

  • enum ntb_topo(9), enum ntb_speed(9), enum ntb_width(9), enum ntb_default_port(9)
  • struct ntb_client_ops(9), struct ntb_ctx_ops(9), struct ntb_client(9), struct ntb_dev(9)

then the register/unregister + context + event girlies:

the port number crew (defaults + real ones):

the link squad:

the memory window besties:

the doorbell section (it's long, it's loud, it's slaying):

the scratchpad squad:

the messaging crew:

and the last three, saving the finale for the end:


fr fr that's the whole page. 49 member redirects and 77 see-alsos later, you're basically an NTB expert. go read the friends next, they've got the actual tea. πŸ“

and that's a wrap bestie!! this page lives in ./include/linux and the version notes say October 2026 β€” so yes, it's giving future-iconic. go forth and slay those function pointers. πŸ’–βœ¨πŸ‘‘

πŸ“¦ where this page comes from