枚举类型如何用于分配寄存器



我无法理解下面代码的用途。当我读取八位字节的sdk时,枚举类型是如何分配寄存器的?如何使用cvmx_fau_reg_64_t?

/*************************  FAU allocation ********************************/
/* The fetch and add registers are allocated here.  They are arranged
    in order of descending size so that all alignment constraints are
    automatically met.
    The enums are linked so that the following enum continues allocating
    where the previous one left off, so the numbering within each
    enum always starts with zero.  The macros take care of the address
    increment size, so the values entered always increase by 1.
    FAU registers are accessed with byte addresses. */
#define CVMX_FAU_REG_64_ADDR(x) ((x <<3) + CVMX_FAU_REG_64_START)
typedef enum
{
    CVMX_FAU_REG_64_START          = 0, 
    CVMX_FAU_REG_64_END            = CVMX_FAU_REG_64_ADDR(0),
} cvmx_fau_reg_64_t;
#define CVMX_FAU_REG_32_ADDR(x) ((x <<2) + CVMX_FAU_REG_32_START)
typedef enum
{
    CVMX_FAU_REG_32_START          = CVMX_FAU_REG_64_END,
    CVMX_FAU_REG_32_END            = CVMX_FAU_REG_32_ADDR(0),
} cvmx_fau_reg_32_t;
#define CVMX_FAU_REG_16_ADDR(x) ((x <<1) + CVMX_FAU_REG_16_START)
typedef enum
{
    CVMX_FAU_REG_16_START          = CVMX_FAU_REG_32_END,
    CVMX_FAU_REG_16_END            = CVMX_FAU_REG_16_ADDR(0),
} cvmx_fau_reg_16_t;
#define CVMX_FAU_REG_8_ADDR(x) ((x) + CVMX_FAU_REG_8_START)
typedef enum {
    CVMX_FAU_REG_8_START           = CVMX_FAU_REG_16_END,
    CVMX_FAU_REG_8_END             = CVMX_FAU_REG_8_ADDR(0),
} cvmx_fau_reg_8_t;
/* The name CVMX_FAU_REG_AVAIL_BASE is provided to indicate the first available
   FAU address that is not allocated in cvmx-config.h. This is 64 bit aligned. */
#define CVMX_FAU_REG_AVAIL_BASE ((CVMX_FAU_REG_8_END + 0x7) & (~0x7ULL))
#define CVMX_FAU_REG_END (2048)

在C中,枚举类型类似于有符号整数数据类型。这就是您应该如何使用cvmx_fau_reg_64_t:

cvmx_fau_reg_64_t myRegister;
myRegister=CVMX_FAU_REG_64_START;
//Do something with the *myRegister* variable
myRegister=CVMX_FAU_REG_64_END;

Cavium OCTEON FAU寄存器实际上由一系列特殊内存支持,这些内存通过标记操作强制为Atomic,并通过IOBDMA访问。

因此,您只需要指定寄存器编号和大小。您应该使用cvmx-fau API,如cvmx_fau_fetch_and_add64(fau_reg_64_t reg,value)或类似的Add、Increment。OCTEON体系结构将使用Tag操作和IOBDMA总线来保证所有读/写都是Atomic

您的代码应该只选择并引用特定的FAU索引,并决定将其用于64/32/16/8位值/计数器。其余的都是通过SDK提供的FAU函数

cvmx-config可以为您定义最初的几个,然后如果需要,您可以在代码中添加更多。这些将在FAU_AVAIL_BASE之后进行。

在任何时候都不应该直接定义/操作/取消对这些内存位置的引用。这些正常的64/32位变量或指针不同。

Paxym

最新更新