nfp: bpf: parse function call and map capabilities
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 12 Jan 2018 04:29:13 +0000 (20:29 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Sun, 14 Jan 2018 22:36:30 +0000 (23:36 +0100)
Parse helper function and supported map FW TLV capabilities.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
drivers/net/ethernet/netronome/nfp/bpf/fw.h
drivers/net/ethernet/netronome/nfp/bpf/main.c
drivers/net/ethernet/netronome/nfp/bpf/main.h

index e0ff68f..cfcc7bc 100644 (file)
 #include <linux/types.h>
 
 enum bpf_cap_tlv_type {
+       NFP_BPF_CAP_TYPE_FUNC           = 1,
        NFP_BPF_CAP_TYPE_ADJUST_HEAD    = 2,
+       NFP_BPF_CAP_TYPE_MAPS           = 3,
+};
+
+struct nfp_bpf_cap_tlv_func {
+       __le32 func_id;
+       __le32 func_addr;
 };
 
 struct nfp_bpf_cap_tlv_adjust_head {
@@ -51,6 +58,15 @@ struct nfp_bpf_cap_tlv_adjust_head {
 
 #define NFP_BPF_ADJUST_HEAD_NO_META    BIT(0)
 
+struct nfp_bpf_cap_tlv_maps {
+       __le32 types;
+       __le32 max_maps;
+       __le32 max_elems;
+       __le32 max_key_sz;
+       __le32 max_val_sz;
+       __le32 max_elem_sz;
+};
+
 /*
  * Types defined for map related control messages
  */
index a14368c..7d5cc59 100644 (file)
@@ -251,6 +251,45 @@ nfp_bpf_parse_cap_adjust_head(struct nfp_app_bpf *bpf, void __iomem *value,
        return 0;
 }
 
+static int
+nfp_bpf_parse_cap_func(struct nfp_app_bpf *bpf, void __iomem *value, u32 length)
+{
+       struct nfp_bpf_cap_tlv_func __iomem *cap = value;
+
+       if (length < sizeof(*cap)) {
+               nfp_err(bpf->app->cpp, "truncated function TLV: %d\n", length);
+               return -EINVAL;
+       }
+
+       switch (readl(&cap->func_id)) {
+       case BPF_FUNC_map_lookup_elem:
+               bpf->helpers.map_lookup = readl(&cap->func_addr);
+               break;
+       }
+
+       return 0;
+}
+
+static int
+nfp_bpf_parse_cap_maps(struct nfp_app_bpf *bpf, void __iomem *value, u32 length)
+{
+       struct nfp_bpf_cap_tlv_maps __iomem *cap = value;
+
+       if (length < sizeof(*cap)) {
+               nfp_err(bpf->app->cpp, "truncated maps TLV: %d\n", length);
+               return -EINVAL;
+       }
+
+       bpf->maps.types = readl(&cap->types);
+       bpf->maps.max_maps = readl(&cap->max_maps);
+       bpf->maps.max_elems = readl(&cap->max_elems);
+       bpf->maps.max_key_sz = readl(&cap->max_key_sz);
+       bpf->maps.max_val_sz = readl(&cap->max_val_sz);
+       bpf->maps.max_elem_sz = readl(&cap->max_elem_sz);
+
+       return 0;
+}
+
 static int nfp_bpf_parse_capabilities(struct nfp_app *app)
 {
        struct nfp_cpp *cpp = app->pf->cpp;
@@ -276,11 +315,19 @@ static int nfp_bpf_parse_capabilities(struct nfp_app *app)
                        goto err_release_free;
 
                switch (type) {
+               case NFP_BPF_CAP_TYPE_FUNC:
+                       if (nfp_bpf_parse_cap_func(app->priv, value, length))
+                               goto err_release_free;
+                       break;
                case NFP_BPF_CAP_TYPE_ADJUST_HEAD:
                        if (nfp_bpf_parse_cap_adjust_head(app->priv, value,
                                                          length))
                                goto err_release_free;
                        break;
+               case NFP_BPF_CAP_TYPE_MAPS:
+                       if (nfp_bpf_parse_cap_maps(app->priv, value, length))
+                               goto err_release_free;
+                       break;
                default:
                        nfp_dbg(cpp, "unknown BPF capability: %d\n", type);
                        break;
index 047f253..d381ae8 100644 (file)
@@ -112,6 +112,17 @@ enum pkt_vec {
  * @off_max:           maximum packet offset within buffer required
  * @guaranteed_sub:    amount of negative adjustment guaranteed possible
  * @guaranteed_add:    amount of positive adjustment guaranteed possible
+ *
+ * @maps:              map capability
+ * @types:             supported map types
+ * @max_maps:          max number of maps supported
+ * @max_elems:         max number of entries in each map
+ * @max_key_sz:                max size of map key
+ * @max_val_sz:                max size of map value
+ * @max_elem_sz:       max size of map entry (key + value)
+ *
+ * @helpers:           helper addressess for various calls
+ * @map_lookup:                map lookup helper address
  */
 struct nfp_app_bpf {
        struct nfp_app *app;
@@ -132,6 +143,19 @@ struct nfp_app_bpf {
                int guaranteed_sub;
                int guaranteed_add;
        } adjust_head;
+
+       struct {
+               u32 types;
+               u32 max_maps;
+               u32 max_elems;
+               u32 max_key_sz;
+               u32 max_val_sz;
+               u32 max_elem_sz;
+       } maps;
+
+       struct {
+               u32 map_lookup;
+       } helpers;
 };
 
 /**