2012-08-06 75 views
1

我無法理解下面的代碼的目的。當我讀取octeon的sdk時,用於分配寄存器的枚舉類型如何?我怎樣才能使用cvmx_fau_reg_64_t?如何使用enum類型來分配寄存器

/************************* 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) 

回答

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; 
0

的Cavium公司OCTEON FAU寄存器是由一系列的強制執行是原子的特殊的記憶通過標籤操作實際支持,並通過IOBDMA acessed。

所以你只能指定註冊號碼和大小。您應該使用cvmx-fau API,如cvmx_fau_fetch_and_add64(fau_reg_64_t reg,value)或Add,Increment類似的API。 OCTEON架構將保證所有的讀/寫都是原子使用標記操作和IOBDMA總線。

您的代碼應該選擇並引用特定的FAU索引,並決定將它們用於64/32/16/8位值/計數器。剩下的都是通過SDK提供的FAU功能只有

cvmx-config可以爲您定義最初的幾個,然後您可以在代碼中添加更多內容(如果需要的話)。這些將在FAU_AVAIL_BASE後進行。

在任何時候你都不應該直接定義/操作/去除這些內存位置。這些是不像正常的64/32位變量或指針。

Paxym