From patchwork Fri Jan 12 04:29:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 859491 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="JuT5CYqk"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zHqY235N6z9sQm for ; Fri, 12 Jan 2018 15:30:14 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933180AbeALE35 (ORCPT ); Thu, 11 Jan 2018 23:29:57 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:33200 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932976AbeALE3z (ORCPT ); Thu, 11 Jan 2018 23:29:55 -0500 Received: by mail-pf0-f194.google.com with SMTP id y89so3537546pfk.0 for ; Thu, 11 Jan 2018 20:29:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ArSQHRhMjMTpLJoVjOrK897K9RnDVxC0GAaGBb3J9ho=; b=JuT5CYqkfzoGfaMc8iM8a17iHEYjBu1mumzvI7KtffN5aL0fp4ujAFDc1hgFmkUjEg qHoeQsGav5JGtj7X2qk0AZacf7tY3YJZMkRrVMgmxIWfdYPCb2m0+8c56hGMeryN0LBl ZcXrsRSMpxU3A2U6ZpG3nYX49A8Ggkd+NaNY/KRCOiHPszs1dzMCJGlwpr9co8NLqlMW JUh/25PT23yXIAbemsjBIc20NmVQzkTLo1tqxro4qho+u3g4ay40JXDZiHzez1hq0Fhw Ia6WQN5sym4rgJLkblni6eHfq7O/98g68hlnlmNuAx9JO8wkz6m1FiUXUQag351lMUSx hv1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ArSQHRhMjMTpLJoVjOrK897K9RnDVxC0GAaGBb3J9ho=; b=LZyERAPxffZp+16q+XwDSutJ/ubeAXN6fOAyr4wYlnaGfntgmGQdYBeFzB5UeTSudo Fv8qJlxxpa5rOz4vxW61/rnILbDX+MA3JnBQ7OhPb7II6ZDosBl0JyUK5QfPiG98eTHq RieQL662QGML4V2njZXuauIjUS7E7DWh3fv+y+6rk43stHMWhPkdw77p+MpNdswBM/Nj tz01fGvuSfruJjDcjIc3CPRHUyMp9UPCLnM9POa64r4BCvUwOqb2x3oBaOwDjz821a65 CXy5glGwxYw/dqz2gs0Ki9tQDGSoUsrVaxfz85sE8wfPu2uqtQvp7032PskrF0WfAZ3p eXdQ== X-Gm-Message-State: AKGB3mJNdJFkAjWhiWIldVsOZfAM+YcZ2sjjvAbGJfPctsSRIopxbUIm jkqLQxppY5MgyU9ThNB3HYKphlK3 X-Google-Smtp-Source: ACJfBouuwkC48nEmpxHiKSfrwKSVMixnJPekaF7a0od4EJ/tNl76T4ZyX/O/E/1wnnSOig3QqEf9wQ== X-Received: by 10.84.131.40 with SMTP id 37mr24721370pld.58.1515731394827; Thu, 11 Jan 2018 20:29:54 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id e8sm45863875pfk.6.2018.01.11.20.29.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 11 Jan 2018 20:29:54 -0800 (PST) From: Jakub Kicinski To: alexei.starovoitov@gmail.com, daniel@iogearbox.net, davem@davemloft.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, tehnerd@fb.com, Jakub Kicinski Subject: [PATCH bpf-next v2 11/15] nfp: bpf: parse function call and map capabilities Date: Thu, 11 Jan 2018 20:29:13 -0800 Message-Id: <20180112042917.10348-12-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180112042917.10348-1-jakub.kicinski@netronome.com> References: <20180112042917.10348-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Parse helper function and supported map FW TLV capabilities. Signed-off-by: Jakub Kicinski Reviewed-by: Quentin Monnet --- drivers/net/ethernet/netronome/nfp/bpf/fw.h | 16 +++++++++ drivers/net/ethernet/netronome/nfp/bpf/main.c | 47 +++++++++++++++++++++++++++ drivers/net/ethernet/netronome/nfp/bpf/main.h | 24 ++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/fw.h b/drivers/net/ethernet/netronome/nfp/bpf/fw.h index e0ff68fc9562..cfcc7bcb2c67 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/fw.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/fw.h @@ -38,7 +38,14 @@ #include 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 */ diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c index a14368c6449f..7d5cc59feb7e 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c @@ -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; diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index 047f253fc581..d381ae8629a2 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h @@ -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; }; /**