1

我无法理解下面代码的目的。阅读octeon的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)
4

2 回答 2

0

在 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;
于 2012-08-06T05:50:22.270 回答
0

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

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

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

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

在任何时候,您都不应该直接定义/操作/取消引用这些内存位置。这些不像普通的 64 / 32 位变量或指针。

派克西姆

于 2016-07-21T05:04:39.023 回答