drivers/net/ipa/gsi.h
Source file repositories/reference/linux-study-clean/drivers/net/ipa/gsi.h
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ipa/gsi.h- Extension
.h- Size
- 8833 bytes
- Lines
- 278
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/completion.hlinux/mutex.hlinux/netdevice.hlinux/types.hipa_version.h
Detected Declarations
struct devicestruct platform_devicestruct gsistruct gsi_transstruct ipa_gsi_endpoint_datastruct gsi_ringstruct gsi_trans_poolstruct gsi_trans_infostruct gsi_channelstruct gsi_evt_ringstruct gsienum gsi_channel_stateenum gsi_evt_ring_state
Annotated Snippet
struct gsi_ring {
void *virt; /* ring array base address */
dma_addr_t addr; /* primarily low 32 bits used */
u32 count; /* number of elements in ring */
/* The ring index value indicates the next "open" entry in the ring.
*
* A channel ring consists of TRE entries filled by the AP and passed
* to the hardware for processing. For a channel ring, the ring index
* identifies the next unused entry to be filled by the AP. In this
* case the initial value is assumed by hardware to be 0.
*
* An event ring consists of event structures filled by the hardware
* and passed to the AP. For event rings, the ring index identifies
* the next ring entry that is not known to have been filled by the
* hardware. The initial value used is arbitrary (so we use 0).
*/
u32 index;
};
/* Transactions use several resources that can be allocated dynamically
* but taken from a fixed-size pool. The number of elements required for
* the pool is limited by the total number of TREs that can be outstanding.
*
* If sufficient TREs are available to reserve for a transaction,
* allocation from these pools is guaranteed to succeed. Furthermore,
* these resources are implicitly freed whenever the TREs in the
* transaction they're associated with are released.
*
* The result of a pool allocation of multiple elements is always
* contiguous.
*/
struct gsi_trans_pool {
void *base; /* base address of element pool */
u32 count; /* # elements in the pool */
u32 free; /* next free element in pool (modulo) */
u32 size; /* size (bytes) of an element */
u32 max_alloc; /* max allocation request */
dma_addr_t addr; /* DMA address if DMA pool (or 0) */
};
struct gsi_trans_info {
atomic_t tre_avail; /* TREs available for allocation */
u16 free_id; /* first free trans in array */
u16 allocated_id; /* first allocated transaction */
u16 committed_id; /* first committed transaction */
u16 pending_id; /* first pending transaction */
u16 completed_id; /* first completed transaction */
u16 polled_id; /* first polled transaction */
struct gsi_trans *trans; /* transaction array */
struct gsi_trans **map; /* TRE -> transaction map */
struct gsi_trans_pool sg_pool; /* scatterlist pool */
struct gsi_trans_pool cmd_pool; /* command payload DMA pool */
};
/* Hardware values signifying the state of a channel */
enum gsi_channel_state {
GSI_CHANNEL_STATE_NOT_ALLOCATED = 0x0,
GSI_CHANNEL_STATE_ALLOCATED = 0x1,
GSI_CHANNEL_STATE_STARTED = 0x2,
GSI_CHANNEL_STATE_STOPPED = 0x3,
GSI_CHANNEL_STATE_STOP_IN_PROC = 0x4,
GSI_CHANNEL_STATE_FLOW_CONTROLLED = 0x5, /* IPA v4.2-v4.9 */
GSI_CHANNEL_STATE_ERROR = 0xf,
};
/* We only care about channels between IPA and AP */
struct gsi_channel {
struct gsi *gsi;
bool toward_ipa;
bool command; /* AP command TX channel or not */
u8 trans_tre_max; /* max TREs in a transaction */
u16 tre_count;
u16 event_count;
struct gsi_ring tre_ring;
u32 evt_ring_id;
/* The following counts are used only for TX endpoints */
u64 byte_count; /* total # bytes transferred */
u64 trans_count; /* total # transactions */
u64 queued_byte_count; /* last reported queued byte count */
u64 queued_trans_count; /* ...and queued trans count */
u64 compl_byte_count; /* last reported completed byte count */
u64 compl_trans_count; /* ...and completed trans count */
struct gsi_trans_info trans_info;
Annotation
- Immediate include surface: `linux/completion.h`, `linux/mutex.h`, `linux/netdevice.h`, `linux/types.h`, `ipa_version.h`.
- Detected declarations: `struct device`, `struct platform_device`, `struct gsi`, `struct gsi_trans`, `struct ipa_gsi_endpoint_data`, `struct gsi_ring`, `struct gsi_trans_pool`, `struct gsi_trans_info`, `struct gsi_channel`, `struct gsi_evt_ring`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.