diff --git a/tmp/ynl_build-tmp.DYxvvL/old-code/devlink-user.c b/tmp/ynl_build-tmp.DYxvvL/new-code/devlink-user.c index 0203f2d5e97e..e3cfdae378e2 100644 --- a/tmp/ynl_build-tmp.DYxvvL/old-code/devlink-user.c +++ b/tmp/ynl_build-tmp.DYxvvL/new-code/devlink-user.c @@ -256,6 +256,18 @@ const char *devlink_resource_unit_str(enum devlink_resource_unit value) return devlink_resource_unit_strmap[value]; } +static const char * const devlink_resource_scope_strmap[] = { + [0] = "dev", + [1] = "port", +}; + +const char *devlink_resource_scope_str(enum devlink_resource_scope value) +{ + if (value < 0 || value >= (int)YNL_ARRAY_SIZE(devlink_resource_scope_strmap)) + return NULL; + return devlink_resource_scope_strmap[value]; +} + static const char * const devlink_reload_action_strmap[] = { [1] = "driver-reinit", [2] = "fw-activate", @@ -915,6 +927,7 @@ const struct ynl_policy_attr devlink_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD] = { .name = "health-reporter-burst-period", .type = YNL_PT_U64, }, [DEVLINK_ATTR_PARAM_RESET_DEFAULT] = { .name = "param-reset-default", .type = YNL_PT_FLAG, }, [DEVLINK_ATTR_INDEX] = { .name = "index", .type = YNL_PT_UINT, }, + [DEVLINK_ATTR_RESOURCE_SCOPE_MASK] = { .name = "resource-scope-mask", .type = YNL_PT_BITFIELD32, }, }; const struct ynl_policy_nest devlink_nest = { @@ -4430,6 +4443,11 @@ int devlink_resource_dump_rsp_parse(const struct nlmsghdr *nlh, return YNL_PARSE_CB_ERROR; dst->_present.index = 1; dst->index = ynl_attr_get_uint(attr); + } else if (type == DEVLINK_ATTR_PORT_INDEX) { + if (ynl_attr_validate(yarg, attr)) + return YNL_PARSE_CB_ERROR; + dst->_present.port_index = 1; + dst->port_index = ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_RESOURCE_LIST) { if (ynl_attr_validate(yarg, attr)) return YNL_PARSE_CB_ERROR; @@ -4465,6 +4483,8 @@ devlink_resource_dump(struct ynl_sock *ys, ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); if (req->_present.index) ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req->index); + if (req->_present.port_index) + ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); rsp = calloc(1, sizeof(*rsp)); yrs.yarg.data = rsp; @@ -4482,6 +4502,69 @@ devlink_resource_dump(struct ynl_sock *ys, return NULL; } +/* DEVLINK_CMD_RESOURCE_DUMP - dump */ +void +devlink_resource_dump_req_dump_free(struct devlink_resource_dump_req_dump *req) +{ + free(req->bus_name); + free(req->dev_name); + free(req); +} + +void devlink_resource_dump_list_free(struct devlink_resource_dump_list *rsp) +{ + struct devlink_resource_dump_list *next = rsp; + + while ((void *)next != YNL_LIST_END) { + rsp = next; + next = rsp->next; + + free(rsp->obj.bus_name); + free(rsp->obj.dev_name); + devlink_dl_resource_list_free(&rsp->obj.resource_list); + free(rsp); + } +} + +struct devlink_resource_dump_list * +devlink_resource_dump_dump(struct ynl_sock *ys, + struct devlink_resource_dump_req_dump *req) +{ + struct ynl_dump_state yds = {}; + struct nlmsghdr *nlh; + int err; + + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &devlink_nest; + yds.yarg.data = NULL; + yds.alloc_sz = sizeof(struct devlink_resource_dump_list); + yds.cb = devlink_resource_dump_rsp_parse; + yds.rsp_cmd = DEVLINK_CMD_RESOURCE_DUMP; + + nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_RESOURCE_DUMP, 1); + ys->req_policy = &devlink_nest; + ys->req_hdr_len = ys->family->hdr_len; + + if (req->_len.bus_name) + ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); + if (req->_len.dev_name) + ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); + if (req->_present.index) + ynl_attr_put_uint(nlh, DEVLINK_ATTR_INDEX, req->index); + if (req->_present.resource_scope_mask) + ynl_attr_put(nlh, DEVLINK_ATTR_RESOURCE_SCOPE_MASK, &req->resource_scope_mask, sizeof(struct nla_bitfield32)); + + err = ynl_exec_dump(ys, nlh, &yds); + if (err < 0) + goto free_list; + + return yds.first; + +free_list: + devlink_resource_dump_list_free(yds.first); + return NULL; +} + /* ============== DEVLINK_CMD_RELOAD ============== */ /* DEVLINK_CMD_RELOAD - do */ void devlink_reload_req_free(struct devlink_reload_req *req) diff --git a/tmp/ynl_build-tmp.DYxvvL/old-code/devlink-user.h b/tmp/ynl_build-tmp.DYxvvL/new-code/devlink-user.h index 1ca91e30bd6b..a3859a3e1804 100644 --- a/tmp/ynl_build-tmp.DYxvvL/old-code/devlink-user.h +++ b/tmp/ynl_build-tmp.DYxvvL/new-code/devlink-user.h @@ -40,6 +40,7 @@ devlink_dpipe_action_type_str(enum devlink_dpipe_action_type value); const char * devlink_dpipe_field_mapping_type_str(enum devlink_dpipe_field_mapping_type value); const char *devlink_resource_unit_str(enum devlink_resource_unit value); +const char *devlink_resource_scope_str(enum devlink_resource_scope value); const char *devlink_reload_action_str(enum devlink_reload_action value); const char *devlink_param_cmode_str(enum devlink_param_cmode value); const char *devlink_flash_overwrite_str(enum devlink_flash_overwrite value); @@ -2847,6 +2848,7 @@ int devlink_resource_set(struct ynl_sock *ys, struct devlink_resource_dump_req { struct { __u32 index:1; + __u32 port_index:1; } _present; struct { __u32 bus_name; @@ -2856,6 +2858,7 @@ struct devlink_resource_dump_req { char *bus_name; char *dev_name; __u64 index; + __u32 port_index; }; static inline struct devlink_resource_dump_req * @@ -2892,10 +2895,18 @@ devlink_resource_dump_req_set_index(struct devlink_resource_dump_req *req, req->_present.index = 1; req->index = index; } +static inline void +devlink_resource_dump_req_set_port_index(struct devlink_resource_dump_req *req, + __u32 port_index) +{ + req->_present.port_index = 1; + req->port_index = port_index; +} struct devlink_resource_dump_rsp { struct { __u32 index:1; + __u32 port_index:1; __u32 resource_list:1; } _present; struct { @@ -2906,6 +2917,7 @@ struct devlink_resource_dump_rsp { char *bus_name; char *dev_name; __u64 index; + __u32 port_index; struct devlink_dl_resource_list resource_list; }; @@ -2918,6 +2930,77 @@ struct devlink_resource_dump_rsp * devlink_resource_dump(struct ynl_sock *ys, struct devlink_resource_dump_req *req); +/* DEVLINK_CMD_RESOURCE_DUMP - dump */ +struct devlink_resource_dump_req_dump { + struct { + __u32 index:1; + __u32 resource_scope_mask:1; + } _present; + struct { + __u32 bus_name; + __u32 dev_name; + } _len; + + char *bus_name; + char *dev_name; + __u64 index; + struct nla_bitfield32 resource_scope_mask; +}; + +static inline struct devlink_resource_dump_req_dump * +devlink_resource_dump_req_dump_alloc(void) +{ + return calloc(1, sizeof(struct devlink_resource_dump_req_dump)); +} +void +devlink_resource_dump_req_dump_free(struct devlink_resource_dump_req_dump *req); + +static inline void +devlink_resource_dump_req_dump_set_bus_name(struct devlink_resource_dump_req_dump *req, + const char *bus_name) +{ + free(req->bus_name); + req->_len.bus_name = strlen(bus_name); + req->bus_name = malloc(req->_len.bus_name + 1); + memcpy(req->bus_name, bus_name, req->_len.bus_name); + req->bus_name[req->_len.bus_name] = 0; +} +static inline void +devlink_resource_dump_req_dump_set_dev_name(struct devlink_resource_dump_req_dump *req, + const char *dev_name) +{ + free(req->dev_name); + req->_len.dev_name = strlen(dev_name); + req->dev_name = malloc(req->_len.dev_name + 1); + memcpy(req->dev_name, dev_name, req->_len.dev_name); + req->dev_name[req->_len.dev_name] = 0; +} +static inline void +devlink_resource_dump_req_dump_set_index(struct devlink_resource_dump_req_dump *req, + __u64 index) +{ + req->_present.index = 1; + req->index = index; +} +static inline void +devlink_resource_dump_req_dump_set_resource_scope_mask(struct devlink_resource_dump_req_dump *req, + struct nla_bitfield32 *resource_scope_mask) +{ + req->_present.resource_scope_mask = 1; + memcpy(&req->resource_scope_mask, resource_scope_mask, sizeof(struct nla_bitfield32)); +} + +struct devlink_resource_dump_list { + struct devlink_resource_dump_list *next; + struct devlink_resource_dump_rsp obj __attribute__((aligned(8))); +}; + +void devlink_resource_dump_list_free(struct devlink_resource_dump_list *rsp); + +struct devlink_resource_dump_list * +devlink_resource_dump_dump(struct ynl_sock *ys, + struct devlink_resource_dump_req_dump *req); + /* ============== DEVLINK_CMD_RELOAD ============== */ /* DEVLINK_CMD_RELOAD - do */ struct devlink_reload_req {