Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
msi.h File Reference
#include <kernel.h>
#include <zephyr/types.h>
#include <stdbool.h>
#include <drivers/pcie/pcie.h>

Go to the source code of this file.

Data Structures

struct  msix_vector
 
struct  msi_vector
 

Macros

#define PCIE_MSI_MCR   0U
 
#define PCIE_MSI_MCR_EN   0x00010000U /* enable MSI */
 
#define PCIE_MSI_MCR_MMC   0x000E0000U /* Multi Messages Capable mask */
 
#define PCIE_MSI_MCR_MMC_SHIFT   17
 
#define PCIE_MSI_MCR_MME   0x00700000U /* mask of # of enabled IRQs */
 
#define PCIE_MSI_MCR_MME_SHIFT   20
 
#define PCIE_MSI_MCR_64   0x00800000U /* 64-bit MSI */
 
#define PCIE_MSI_MAP0   1U
 
#define PCIE_MSI_MAP1_64   2U
 
#define PCIE_MSI_MDR_32   2U
 
#define PCIE_MSI_MDR_64   3U
 
#define PCIE_MSIX_MCR   0U
 
#define PCIE_MSIX_MCR_EN   0x80000000U /* Enable MSI-X */
 
#define PCIE_MSIX_MCR_FMASK   0x40000000U /* Function Mask */
 
#define PCIE_MSIX_MCR_TSIZE   0x07FF0000U /* Table size mask */
 
#define PCIE_MSIX_MCR_TSIZE_SHIFT   16
 
#define PCIE_MSIR_TABLE_ENTRY_SIZE   16
 
#define PCIE_MSIX_TR   1U
 
#define PCIE_MSIX_TR_BIR   0x00000007U /* Table BIR mask */
 
#define PCIE_MSIX_TR_OFFSET   0xFFFFFFF8U /* Offset mask */
 
#define PCIE_MSIX_PBA   2U
 
#define PCIE_MSIX_PBA_BIR   0x00000007U /* PBA BIR mask */
 
#define PCIE_MSIX_PBA_OFFSET   0xFFFFFFF8U /* Offset mask */
 
#define PCIE_VTBL_MA   0U /* Msg Address offset */
 
#define PCIE_VTBL_MUA   4U /* Msg Upper Address offset */
 
#define PCIE_VTBL_MD   8U /* Msg Data offset */
 
#define PCIE_VTBL_VCTRL   12U /* Vector control offset */
 

Typedefs

typedef struct msi_vector msi_vector_t
 

Functions

uint32_t pcie_msi_map (unsigned int irq, msi_vector_t *vector)
 Compute the target address for an MSI posted write. More...
 
uint16_t pcie_msi_mdr (unsigned int irq, msi_vector_t *vector)
 Compute the data for an MSI posted write. More...
 
bool pcie_msi_enable (pcie_bdf_t bdf, msi_vector_t *vectors, uint8_t n_vector, unsigned int irq)
 Configure the given PCI endpoint to generate MSIs. More...
 

Macro Definition Documentation

◆ PCIE_MSI_MAP0

#define PCIE_MSI_MAP0   1U

◆ PCIE_MSI_MAP1_64

#define PCIE_MSI_MAP1_64   2U

◆ PCIE_MSI_MCR

#define PCIE_MSI_MCR   0U

◆ PCIE_MSI_MCR_64

#define PCIE_MSI_MCR_64   0x00800000U /* 64-bit MSI */

◆ PCIE_MSI_MCR_EN

#define PCIE_MSI_MCR_EN   0x00010000U /* enable MSI */

◆ PCIE_MSI_MCR_MMC

#define PCIE_MSI_MCR_MMC   0x000E0000U /* Multi Messages Capable mask */

◆ PCIE_MSI_MCR_MMC_SHIFT

#define PCIE_MSI_MCR_MMC_SHIFT   17

◆ PCIE_MSI_MCR_MME

#define PCIE_MSI_MCR_MME   0x00700000U /* mask of # of enabled IRQs */

◆ PCIE_MSI_MCR_MME_SHIFT

#define PCIE_MSI_MCR_MME_SHIFT   20

◆ PCIE_MSI_MDR_32

#define PCIE_MSI_MDR_32   2U

◆ PCIE_MSI_MDR_64

#define PCIE_MSI_MDR_64   3U

◆ PCIE_MSIR_TABLE_ENTRY_SIZE

#define PCIE_MSIR_TABLE_ENTRY_SIZE   16

◆ PCIE_MSIX_MCR

#define PCIE_MSIX_MCR   0U

◆ PCIE_MSIX_MCR_EN

#define PCIE_MSIX_MCR_EN   0x80000000U /* Enable MSI-X */

◆ PCIE_MSIX_MCR_FMASK

#define PCIE_MSIX_MCR_FMASK   0x40000000U /* Function Mask */

◆ PCIE_MSIX_MCR_TSIZE

#define PCIE_MSIX_MCR_TSIZE   0x07FF0000U /* Table size mask */

◆ PCIE_MSIX_MCR_TSIZE_SHIFT

#define PCIE_MSIX_MCR_TSIZE_SHIFT   16

◆ PCIE_MSIX_PBA

#define PCIE_MSIX_PBA   2U

◆ PCIE_MSIX_PBA_BIR

#define PCIE_MSIX_PBA_BIR   0x00000007U /* PBA BIR mask */

◆ PCIE_MSIX_PBA_OFFSET

#define PCIE_MSIX_PBA_OFFSET   0xFFFFFFF8U /* Offset mask */

◆ PCIE_MSIX_TR

#define PCIE_MSIX_TR   1U

◆ PCIE_MSIX_TR_BIR

#define PCIE_MSIX_TR_BIR   0x00000007U /* Table BIR mask */

◆ PCIE_MSIX_TR_OFFSET

#define PCIE_MSIX_TR_OFFSET   0xFFFFFFF8U /* Offset mask */

◆ PCIE_VTBL_MA

#define PCIE_VTBL_MA   0U /* Msg Address offset */

◆ PCIE_VTBL_MD

#define PCIE_VTBL_MD   8U /* Msg Data offset */

◆ PCIE_VTBL_MUA

#define PCIE_VTBL_MUA   4U /* Msg Upper Address offset */

◆ PCIE_VTBL_VCTRL

#define PCIE_VTBL_VCTRL   12U /* Vector control offset */

Typedef Documentation

◆ msi_vector_t

typedef struct msi_vector msi_vector_t

Function Documentation

◆ pcie_msi_enable()

bool pcie_msi_enable ( pcie_bdf_t  bdf,
msi_vector_t vectors,
uint8_t  n_vector,
unsigned int  irq 
)

Configure the given PCI endpoint to generate MSIs.

Parameters
bdfthe target PCI endpoint
vectorsan array of allocated vector(s)
n_vectorthe size of the vector array
irqThe IRQ we wish to trigger via MSI.
Returns
true if the endpoint supports MSI, false otherwise.

◆ pcie_msi_map()

uint32_t pcie_msi_map ( unsigned int  irq,
msi_vector_t vector 
)

Compute the target address for an MSI posted write.

This function is exported by the arch, board or SoC code.

Parameters
irqThe IRQ we wish to trigger via MSI.
vectorThe vector for which you want the address (or NULL)
Returns
A (32-bit) value for the MSI MAP register.

◆ pcie_msi_mdr()

uint16_t pcie_msi_mdr ( unsigned int  irq,
msi_vector_t vector 
)

Compute the data for an MSI posted write.

This function is exported by the arch, board or SoC code.

Parameters
irqThe IRQ we wish to trigger via MSI.
vectorThe vector for which you want the data (or NULL)
Returns
A (16-bit) value for MSI MDR register.