diff --git a/include/spdk/idxd_spec.h b/include/spdk/idxd_spec.h index 419a5b11b..9d4a518f2 100644 --- a/include/spdk/idxd_spec.h +++ b/include/spdk/idxd_spec.h @@ -540,14 +540,14 @@ SPDK_STATIC_ASSERT(sizeof(struct idxd_registers) == 0xE0, "size mismatch"); union idxd_group_flags { struct { - uint32_t tc_a : 3; - uint32_t tc_b : 3; - uint32_t reserved0 : 1; - uint32_t global_read_buffer_limit : 1; - uint32_t read_buffers_reserved : 8; - uint32_t reserved1 : 4; - uint32_t read_buffers_allowed : 8; - uint32_t reserved2 : 4; + uint32_t tc_a: 3; + uint32_t tc_b: 3; + uint32_t rsvd: 1; + uint32_t use_token_limit: 1; + uint32_t tokens_reserved: 8; + uint32_t rsvd2: 4; + uint32_t tokens_allowed: 8; + uint32_t rsvd3: 4; }; uint32_t raw; }; diff --git a/lib/idxd/idxd_user.c b/lib/idxd/idxd_user.c index b3548c238..4b39beb9e 100644 --- a/lib/idxd/idxd_user.c +++ b/lib/idxd/idxd_user.c @@ -238,6 +238,10 @@ idxd_group_config(struct spdk_idxd_device *idxd) for (i = 0; i < g_user_dev_cfg.num_groups; i++) { idxd->groups[i].idxd = idxd; idxd->groups[i].id = i; + + /* Divide BW tokens evenly */ + idxd->groups[i].grpcfg.flags.tokens_allowed = + user_idxd->registers.groupcap.read_bufs / g_user_dev_cfg.num_groups; } /* diff --git a/test/unit/lib/idxd/idxd_user.c/idxd_user_ut.c b/test/unit/lib/idxd/idxd_user.c/idxd_user_ut.c index 989c2360f..c77bc89b4 100644 --- a/test/unit/lib/idxd/idxd_user.c/idxd_user_ut.c +++ b/test/unit/lib/idxd/idxd_user.c/idxd_user_ut.c @@ -41,6 +41,7 @@ #define FAKE_REG_SIZE 0x800 #define GRP_CFG_OFFSET 0x400 +#define MAX_TOKENS 0x40 #define MAX_ARRAY_SIZE 0x20 SPDK_LOG_REGISTER_COMPONENT(idxd); @@ -171,6 +172,7 @@ test_idxd_group_config(void) user_idxd.registers.groupcap.num_groups = g_user_dev_cfg.num_groups; user_idxd.registers.enginecap.num_engines = g_user_dev_cfg.total_engines; user_idxd.registers.wqcap.num_wqs = g_user_dev_cfg.total_wqs; + user_idxd.registers.groupcap.read_bufs = MAX_TOKENS; user_idxd.grpcfg_offset = GRP_CFG_OFFSET; rc = idxd_group_config(idxd); @@ -185,7 +187,7 @@ test_idxd_group_config(void) /* wqe and engine arrays are indexed by group id and are bitmaps of assigned elements. */ CU_ASSERT(wqs[0] == 0x1); CU_ASSERT(engines[0] == 0xf); - CU_ASSERT(flags[0].raw == 0); + CU_ASSERT(flags[0].tokens_allowed == MAX_TOKENS / g_user_dev_cfg.num_groups); /* groups allocated by code under test. */ free(idxd->groups);