From nobody Wed Apr 8 12:34:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 60132FA373E for ; Tue, 25 Oct 2022 19:52:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232440AbiJYTwD (ORCPT ); Tue, 25 Oct 2022 15:52:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53502 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232438AbiJYTv6 (ORCPT ); Tue, 25 Oct 2022 15:51:58 -0400 Received: from mail-io1-xd2e.google.com (mail-io1-xd2e.google.com [IPv6:2607:f8b0:4864:20::d2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 58F9D106A6C for ; Tue, 25 Oct 2022 12:51:52 -0700 (PDT) Received: by mail-io1-xd2e.google.com with SMTP id h203so11439354iof.1 for ; Tue, 25 Oct 2022 12:51:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=l133zv+Dip4+RVfo1hNbK6ZAuTDbPpUv6wOODnCUtFU=; b=wtLM9Ns/jhaQnCQdl/vOr8eYMTtqTnnamG9PlzaLFmyAlerQ7Mnaa6o8H5ozhq/2CU 5z++B95jLsiNl2EAJ3NhGwvdx/TYDMxKs3ewOfFFU+H9qVLPBpqYGVRDl9fIDsGp6/FH tbpRL6KF/OVeAtXYutYcVkb0+0pQTVvU+8T4GrMtYfIebGIHycj9Hikernak6+8FdQai 0fAZJTY4iP/KV7asVxxw4SGWZjQz4YvZYdbQ831Xtbe618HSeAoFGFPvm6S0RC2wNo+d G9hDIDbgPWwy4yk3R+1/H4AxHegL1YTKRDSxcaPa78tDKCPVC5F1gffLa2HXV7l5/FLR hspg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=l133zv+Dip4+RVfo1hNbK6ZAuTDbPpUv6wOODnCUtFU=; b=aCVi601RzEdCWFAufTfA5MdGq1Zvg1OIdBm/l9/KW7aLps6F/AKOLwPQKuw2Y3meAg L6zOfvxaptS4YdH+VspOU021MvaZllNRAPnS+hWRBUr2grgqH5HdJk7wklYU6wEfwTru EsSbWO/+GQXwoVNPQMUy70K5jnwyV7TzvF67DC1ZrP6yGu99El7+TACdt8JmJEV/hacJ T8ar5z9KLotekkV1WVQZODPse7dltFCS6A/gyNjyWm975iuK3Xld8gxnjbQkMhbzLniQ eQxLNTKeTcrBmFiTjE2el+gJ2HWBErHgGqLXrgttxRMDqoetD+JKzM9Z0W7KKpbeEs3M 69WA== X-Gm-Message-State: ACrzQf03f+tL+vYWgf295oulmA46biIWSp4stAze1sg4cPA9mMaP0mfi DD2RAvouCz/h4zabB9M0eIIHkg== X-Google-Smtp-Source: AMsMyM47lpMf/Gs4woUPVfGEJlhiU2Ve+I0QJuf2x1OErrrrrUHiHRgUStjqDR1qi+mDyEee2Aq/sg== X-Received: by 2002:a05:6638:35a2:b0:364:451:9969 with SMTP id v34-20020a05663835a200b0036404519969mr26740834jal.245.1666727511779; Tue, 25 Oct 2022 12:51:51 -0700 (PDT) Received: from localhost.localdomain ([98.61.227.136]) by smtp.gmail.com with ESMTPSA id y10-20020a056638014a00b00349d2d52f6asm1211719jao.37.2022.10.25.12.51.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Oct 2022 12:51:50 -0700 (PDT) From: Alex Elder To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: mka@chromium.org, evgreen@chromium.org, andersson@kernel.org, quic_cpratapa@quicinc.com, quic_avuyyuru@quicinc.com, quic_jponduru@quicinc.com, quic_subashab@quicinc.com, elder@kernel.org, netdev@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next 1/4] net: ipa: record the route table size in the IPA structure Date: Tue, 25 Oct 2022 14:51:40 -0500 Message-Id: <20221025195143.255934-2-elder@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221025195143.255934-1-elder@linaro.org> References: <20221025195143.255934-1-elder@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The non-hashed routing tables for IPv4 and IPv6 will be the same size. And if supported, the hashed routing tables will be the same size as the non-hashed tables. Record the size (number of entries) of all routing tables in the IPA structure. For now, initialize this field using IPA_ROUTE_TABLE_MAX, and just do so when the first route table is validated. Signed-off-by: Alex Elder --- drivers/net/ipa/ipa.h | 2 ++ drivers/net/ipa/ipa_table.c | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/net/ipa/ipa.h b/drivers/net/ipa/ipa.h index 09ead433ec38e..aa39509e209a3 100644 --- a/drivers/net/ipa/ipa.h +++ b/drivers/net/ipa/ipa.h @@ -39,6 +39,7 @@ struct ipa_interrupt; * @power: IPA power information * @table_addr: DMA address of filter/route table content * @table_virt: Virtual address of filter/route table content + * @route_count: Total number of entries in a routing table * @interrupt: IPA Interrupt information * @uc_powered: true if power is active by proxy for microcontroller * @uc_loaded: true after microcontroller has reported it's ready @@ -84,6 +85,7 @@ struct ipa { =20 dma_addr_t table_addr; __le64 *table_virt; + u32 route_count; =20 struct ipa_interrupt *interrupt; bool uc_powered; diff --git a/drivers/net/ipa/ipa_table.c b/drivers/net/ipa/ipa_table.c index 58a1a9da3133e..0815c8967e914 100644 --- a/drivers/net/ipa/ipa_table.c +++ b/drivers/net/ipa/ipa_table.c @@ -185,7 +185,7 @@ static dma_addr_t ipa_table_addr(struct ipa *ipa, bool = filter_mask, u16 count) if (!count) return 0; =20 - WARN_ON(count > max_t(u32, IPA_FILTER_COUNT_MAX, IPA_ROUTE_COUNT_MAX)); + WARN_ON(count > max_t(u32, IPA_FILTER_COUNT_MAX, ipa->route_count)); =20 /* Skip over the zero rule and possibly the filter mask */ skip =3D filter_mask ? 1 : 2; @@ -302,7 +302,7 @@ static int ipa_route_reset(struct ipa *ipa, bool modem) count =3D IPA_ROUTE_MODEM_COUNT; } else { first =3D IPA_ROUTE_MODEM_COUNT; - count =3D IPA_ROUTE_COUNT_MAX - IPA_ROUTE_MODEM_COUNT; + count =3D ipa->route_count - IPA_ROUTE_MODEM_COUNT; } =20 ipa_table_reset_add(trans, false, first, count, IPA_MEM_V4_ROUTE); @@ -552,7 +552,7 @@ static void ipa_route_config(struct ipa *ipa, bool mode= m) if (!ipa_table_hash_support(ipa)) return; =20 - for (route_id =3D 0; route_id < IPA_ROUTE_COUNT_MAX; route_id++) + for (route_id =3D 0; route_id < ipa->route_count; route_id++) if (ipa_route_id_modem(route_id) =3D=3D modem) ipa_route_tuple_zero(ipa, route_id); } @@ -566,7 +566,9 @@ void ipa_table_config(struct ipa *ipa) ipa_route_config(ipa, true); } =20 -/* Zero modem_route_count means filter table memory check */ +/* Verify the sizes of all IPA table filter or routing table memory regions + * are valid. If valid, this records the size of the routing table. + */ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) { bool hash_support =3D ipa_table_hash_support(ipa); @@ -591,6 +593,10 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_r= oute_count) if (mem_ipv4->size !=3D mem_ipv6->size) return false; =20 + /* Record the number of routing table entries */ + if (!filter) + ipa->route_count =3D IPA_ROUTE_COUNT_MAX; + /* Table offset and size must fit in TABLE_INIT command fields */ if (!ipa_cmd_table_init_valid(ipa, mem_ipv4, !filter)) return false; @@ -671,7 +677,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_ro= ute_count) * | ---- zero rule address | \ * |\ |-------------------| | * | ---- zero rule address | | IPA_FILTER_COUNT_MAX - * | |-------------------| > or IPA_ROUTE_COUNT_MAX, + * | |-------------------| > or IPA route count, * | ... | whichever is greater * \ |-------------------| | * ---- zero rule address | / @@ -679,15 +685,17 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_= route_count) */ int ipa_table_init(struct ipa *ipa) { - u32 count =3D max_t(u32, IPA_FILTER_COUNT_MAX, IPA_ROUTE_COUNT_MAX); struct device *dev =3D &ipa->pdev->dev; dma_addr_t addr; __le64 le_addr; __le64 *virt; size_t size; + u32 count; =20 ipa_table_validate_build(); =20 + count =3D max_t(u32, IPA_FILTER_COUNT_MAX, ipa->route_count); + /* The IPA hardware requires route and filter table rules to be * aligned on a 128-byte boundary. We put the "zero rule" at the * base of the table area allocated here. The DMA address returned @@ -722,7 +730,7 @@ int ipa_table_init(struct ipa *ipa) =20 void ipa_table_exit(struct ipa *ipa) { - u32 count =3D max_t(u32, 1 + IPA_FILTER_COUNT_MAX, IPA_ROUTE_COUNT_MAX); + u32 count =3D max_t(u32, 1 + IPA_FILTER_COUNT_MAX, ipa->route_count); struct device *dev =3D &ipa->pdev->dev; size_t size; =20 --=20 2.34.1 From nobody Wed Apr 8 12:34:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78D3EFA3741 for ; Tue, 25 Oct 2022 19:52:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232464AbiJYTwH (ORCPT ); Tue, 25 Oct 2022 15:52:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53506 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232447AbiJYTv6 (ORCPT ); Tue, 25 Oct 2022 15:51:58 -0400 Received: from mail-io1-xd33.google.com (mail-io1-xd33.google.com [IPv6:2607:f8b0:4864:20::d33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A208106E0E for ; Tue, 25 Oct 2022 12:51:54 -0700 (PDT) Received: by mail-io1-xd33.google.com with SMTP id h203so11439476iof.1 for ; Tue, 25 Oct 2022 12:51:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=edo2LzRaJRftF/iqZOQNJxw3dQUUkViR6y/aHrA9w2E=; b=T6Ycp3vIxUxmes1zXRChfYjP10CvMxnbVcBj1faRsM3tX7dTXttF7H4vVLpGnuqGRi m6X1geF/Jpn95cBDu+WpP/TbghIiZ7NuF5qKs7Ngo/5r4JXsanWFGfURZFhubnks/MaB 9jxiMh/3oEyS0YY5xcLnAHIsaarLphlMBNegeVNdZh3rw8VRAJW5o0d7td8o7cGxEJXh RNf9xZAVllRoQnboHC5PcXU8I8oLo0ZOGXH4Dmybirs03GBZ8xoFqc1YvEvVX17t9jzY XkuVRqblDOYAaPbrZFxm1wR1vOVEsCLRlwQIc7sVNiYL7yLqMJo9naR1q3yllM+KNiS9 GXrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=edo2LzRaJRftF/iqZOQNJxw3dQUUkViR6y/aHrA9w2E=; b=DvBrwW+xmayzrrlwBmOFkyuQz5U4e2iz7nfYqLaCdjZhmctrpv59ueRpcj6F5jjEL7 VtM2pBamKsA9TCQsH08tdPLDqm1MdjHuTZqPTLhRZCCNMZlNp2u2wzNDLvYllmf9Q6pz Jqa4bP07lV8+u/o5lnI2vlgZasu27K7u/3RuGTfG+RUMnq/Ge8KQ/A+NTyWufWQUGx3c EMtu4w7YF1oeymvaEOfZscetLlROcaypNNqH1JvkUL8gO/mx2CYs6OWtbStOrdNzGYwj FQC84PnFBpRlitYgfninSkoCjkdEmC+oUXfFLLG/pFORbkmBttUp2C0o+Nshf0AM/lGs 3GYA== X-Gm-Message-State: ACrzQf0jf7YC/GekKZFtivmgdA8guepHIz2shR5OLp9RXKE1FXxIUUqA WCecBfEtJEagm/6Bawe4N8sLkQ== X-Google-Smtp-Source: AMsMyM5Zqo5AtdY2yKJ45uK9uI6lNwB0myFWzjvW/4VsDq+n8s2UawfYneI8XQrq1JuDgNart12pQA== X-Received: by 2002:a05:6602:491:b0:672:18ce:8189 with SMTP id y17-20020a056602049100b0067218ce8189mr24199288iov.170.1666727514041; Tue, 25 Oct 2022 12:51:54 -0700 (PDT) Received: from localhost.localdomain ([98.61.227.136]) by smtp.gmail.com with ESMTPSA id y10-20020a056638014a00b00349d2d52f6asm1211719jao.37.2022.10.25.12.51.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Oct 2022 12:51:52 -0700 (PDT) From: Alex Elder To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: mka@chromium.org, evgreen@chromium.org, andersson@kernel.org, quic_cpratapa@quicinc.com, quic_avuyyuru@quicinc.com, quic_jponduru@quicinc.com, quic_subashab@quicinc.com, elder@kernel.org, netdev@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next 2/4] net: ipa: determine route table size from memory region Date: Tue, 25 Oct 2022 14:51:41 -0500 Message-Id: <20221025195143.255934-3-elder@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221025195143.255934-1-elder@linaro.org> References: <20221025195143.255934-1-elder@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently we assume that any routing table contains a fixed number of entries. The number of entries in a routing table can actually vary, depending only on the size of the IPA-local memory region used to hold the table. Stop assuming that a routing table has exactly 15 entries. Instead, determine the number of entries in a routing table by dividing its memory region size by the size of an entry. The number of entries is computed early, when ipa_table_mem_valid() is called by ipa_table_init(). Signed-off-by: Alex Elder --- drivers/net/ipa/ipa_cmd.c | 17 ++++++++--------- drivers/net/ipa/ipa_table.c | 14 +++++--------- drivers/net/ipa/ipa_table.h | 3 --- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/drivers/net/ipa/ipa_cmd.c b/drivers/net/ipa/ipa_cmd.c index de2cd86aa9e28..08e3f395a9453 100644 --- a/drivers/net/ipa/ipa_cmd.c +++ b/drivers/net/ipa/ipa_cmd.c @@ -145,18 +145,15 @@ union ipa_cmd_payload { =20 static void ipa_cmd_validate_build(void) { - /* The sizes of a filter and route tables need to fit into fields - * in the ipa_cmd_hw_ip_fltrt_init structure. Although hashed tables + /* The size of a filter table needs to fit into fields in the + * ipa_cmd_hw_ip_fltrt_init structure. Although hashed tables * might not be used, non-hashed and hashed tables have the same * maximum size. IPv4 and IPv6 filter tables have the same number - * of entries, as and IPv4 and IPv6 route tables have the same number * of entries. */ -#define TABLE_SIZE (TABLE_COUNT_MAX * sizeof(__le64)) -#define TABLE_COUNT_MAX max_t(u32, IPA_ROUTE_COUNT_MAX, IPA_FILTER_COUNT_M= AX) +#define TABLE_SIZE (IPA_FILTER_COUNT_MAX * sizeof(__le64)) BUILD_BUG_ON(TABLE_SIZE > field_max(IP_FLTRT_FLAGS_HASH_SIZE_FMASK)); BUILD_BUG_ON(TABLE_SIZE > field_max(IP_FLTRT_FLAGS_NHASH_SIZE_FMASK)); -#undef TABLE_COUNT_MAX #undef TABLE_SIZE =20 /* Hashed and non-hashed fields are assumed to be the same size */ @@ -178,12 +175,14 @@ bool ipa_cmd_table_init_valid(struct ipa *ipa, const = struct ipa_mem *mem, u32 size_max =3D field_max(IP_FLTRT_FLAGS_NHASH_SIZE_FMASK); const char *table =3D route ? "route" : "filter"; struct device *dev =3D &ipa->pdev->dev; + u32 size; + + size =3D route ? ipa->route_count * sizeof(__le64) : mem->size; =20 /* Size must fit in the immediate command field that holds it */ - if (mem->size > size_max) { + if (size > size_max) { dev_err(dev, "%s table region size too large\n", table); - dev_err(dev, " (0x%04x > 0x%04x)\n", - mem->size, size_max); + dev_err(dev, " (0x%04x > 0x%04x)\n", size, size_max); =20 return false; } diff --git a/drivers/net/ipa/ipa_table.c b/drivers/net/ipa/ipa_table.c index 0815c8967e914..23d3f081ac8e1 100644 --- a/drivers/net/ipa/ipa_table.c +++ b/drivers/net/ipa/ipa_table.c @@ -130,12 +130,8 @@ static void ipa_table_validate_build(void) */ BUILD_BUG_ON(IPA_ZERO_RULE_SIZE !=3D sizeof(__le64)); =20 - /* Impose a practical limit on the number of routes */ - BUILD_BUG_ON(IPA_ROUTE_COUNT_MAX > 32); /* The modem must be allotted at least one route table entry */ BUILD_BUG_ON(!IPA_ROUTE_MODEM_COUNT); - /* AP must too, but we can't use more than what is available */ - BUILD_BUG_ON(IPA_ROUTE_MODEM_COUNT >=3D IPA_ROUTE_COUNT_MAX); } =20 static const struct ipa_mem * @@ -593,18 +589,18 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_= route_count) if (mem_ipv4->size !=3D mem_ipv6->size) return false; =20 - /* Record the number of routing table entries */ + /* Compute the number of entries, and for routing tables, record it */ + count =3D mem_ipv4->size / sizeof(__le64); + if (count < 2) + return false; if (!filter) - ipa->route_count =3D IPA_ROUTE_COUNT_MAX; + ipa->route_count =3D count; =20 /* Table offset and size must fit in TABLE_INIT command fields */ if (!ipa_cmd_table_init_valid(ipa, mem_ipv4, !filter)) return false; =20 /* Make sure the regions are big enough */ - count =3D mem_ipv4->size / sizeof(__le64); - if (count < 2) - return false; if (filter) { /* Filter tables must able to hold the endpoint bitmap plus * an entry for each endpoint that supports filtering diff --git a/drivers/net/ipa/ipa_table.h b/drivers/net/ipa/ipa_table.h index 65d96debd3917..31363292dc1db 100644 --- a/drivers/net/ipa/ipa_table.h +++ b/drivers/net/ipa/ipa_table.h @@ -16,9 +16,6 @@ struct ipa; /* The number of route table entries allotted to the modem */ #define IPA_ROUTE_MODEM_COUNT 8 =20 -/* The maximum number of route table entries (IPv4, IPv6; hashed or not) */ -#define IPA_ROUTE_COUNT_MAX 15 - /** * ipa_filter_map_valid() - Validate a filter table endpoint bitmap * @ipa: IPA pointer --=20 2.34.1 From nobody Wed Apr 8 12:34:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8666FFA373E for ; Tue, 25 Oct 2022 19:52:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232577AbiJYTwM (ORCPT ); Tue, 25 Oct 2022 15:52:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53636 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232403AbiJYTv7 (ORCPT ); Tue, 25 Oct 2022 15:51:59 -0400 Received: from mail-io1-xd2b.google.com (mail-io1-xd2b.google.com [IPv6:2607:f8b0:4864:20::d2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 158FB106E14 for ; Tue, 25 Oct 2022 12:51:57 -0700 (PDT) Received: by mail-io1-xd2b.google.com with SMTP id q75so1648608iod.7 for ; Tue, 25 Oct 2022 12:51:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7B4T5dUVw6etXvayl+cOcjo1M7wurOEEeDstMQ8ZtZg=; b=hUaVsWOGWyaSIosq63z4jw7GX1Bn5s1AHfIlC9ZMChVn0NEjUE3wDtV26cX10TYgd7 dCf1bPomRKPwcqnRyuIiiilrbEwJE6MiHjO7HsQ1RAwZRfRoF9ORG8YYpCfZYErqX2Bs mv2wFmzF+JU3najiQ4H4jaZhHplgRwmIAOG+hPQgTLXbJu362FT+cz3Rqwdm5TvPeLqH ELARFOmsjXAvGAbBA5esRoeRkK+LJt68khYDskA2GTML79dKOk0fzkqWl9/gKqeJ3IKY 16VMFDeoqjEheVnegvtGvymC70FJ8TlfIFG7TT84RPXM3OxvLXL9usIeRaXDACXyYglV 7OGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7B4T5dUVw6etXvayl+cOcjo1M7wurOEEeDstMQ8ZtZg=; b=GA87z5UtBjTXiJy8Kczn6OGtiswk3c0k0xYCz33rJ6zd8mFAv14KEo82W4EAKzEqlM UrNNFz41eQdnZ89SMQ49JRwia0vY3lYbiBGy9vrYTjAqJBt38A1SVvttR7gLGkdBrnkV bEu+Z3vfGUeSo173Ztwpf4+SZg93zL0v50nRkWZtfDcEg+7/ihWrTx50sdBeNENeOAwV TgX75lu147oGXvslSnZ4thISArtApQSYhkIhevYxmqzNNxUe/yApc3vC+Jc9pW5m3dM/ RJbw0w2cKHSZukWMPUkbCaq+wK6YwoOfVjiju70pfGL2vVivZ/ffm1I4TMYxGxCrVuox /WkA== X-Gm-Message-State: ACrzQf12mB6Ef9plIQD8T1g5YITuy4zgqfD8k0gUTNhzhqvUKc5QeNVN IBCkEGJxvXSprJASo/kou4d2jQ== X-Google-Smtp-Source: AMsMyM4+ZJRfXCySfhnxPi41jW74/C8HppkdHfX+jpY7PNUKYZ/4vhAvApphk0hFMQHa+/I2QKQsIA== X-Received: by 2002:a05:6638:144a:b0:364:5a1:d54d with SMTP id l10-20020a056638144a00b0036405a1d54dmr25032063jad.42.1666727516327; Tue, 25 Oct 2022 12:51:56 -0700 (PDT) Received: from localhost.localdomain ([98.61.227.136]) by smtp.gmail.com with ESMTPSA id y10-20020a056638014a00b00349d2d52f6asm1211719jao.37.2022.10.25.12.51.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Oct 2022 12:51:55 -0700 (PDT) From: Alex Elder To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: mka@chromium.org, evgreen@chromium.org, andersson@kernel.org, quic_cpratapa@quicinc.com, quic_avuyyuru@quicinc.com, quic_jponduru@quicinc.com, quic_subashab@quicinc.com, elder@kernel.org, netdev@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next 3/4] net: ipa: don't assume 8 modem routing table entries Date: Tue, 25 Oct 2022 14:51:42 -0500 Message-Id: <20221025195143.255934-4-elder@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221025195143.255934-1-elder@linaro.org> References: <20221025195143.255934-1-elder@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently all platforms are assumed allot 8 routing table entries for use by the modem. Instead, add a new configuration data entry that defines the number of modem routing table entries, and record that in the IPA structure. Signed-off-by: Alex Elder --- drivers/net/ipa/data/ipa_data-v3.1.c | 19 +++++++++--------- drivers/net/ipa/data/ipa_data-v3.5.1.c | 27 +++++++++++++------------- drivers/net/ipa/data/ipa_data-v4.11.c | 17 ++++++++-------- drivers/net/ipa/data/ipa_data-v4.2.c | 17 ++++++++-------- drivers/net/ipa/data/ipa_data-v4.5.c | 17 ++++++++-------- drivers/net/ipa/data/ipa_data-v4.9.c | 17 ++++++++-------- drivers/net/ipa/ipa.h | 2 ++ drivers/net/ipa/ipa_data.h | 2 ++ drivers/net/ipa/ipa_main.c | 6 ++++++ drivers/net/ipa/ipa_mem.c | 4 ++-- drivers/net/ipa/ipa_qmi.c | 9 +++++---- drivers/net/ipa/ipa_table.c | 21 +++++++++----------- drivers/net/ipa/ipa_table.h | 7 ++----- 13 files changed, 88 insertions(+), 77 deletions(-) diff --git a/drivers/net/ipa/data/ipa_data-v3.1.c b/drivers/net/ipa/data/ip= a_data-v3.1.c index e0d71f6092729..3380fb3483b2c 100644 --- a/drivers/net/ipa/data/ipa_data-v3.1.c +++ b/drivers/net/ipa/data/ipa_data-v3.1.c @@ -525,13 +525,14 @@ static const struct ipa_power_data ipa_power_data =3D= { =20 /* Configuration data for an SoC having IPA v3.1 */ const struct ipa_data ipa_data_v3_1 =3D { - .version =3D IPA_VERSION_3_1, - .backward_compat =3D BIT(BCR_CMDQ_L_LACK_ONE_ENTRY), - .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), - .qsb_data =3D ipa_qsb_data, - .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), - .endpoint_data =3D ipa_gsi_endpoint_data, - .resource_data =3D &ipa_resource_data, - .mem_data =3D &ipa_mem_data, - .power_data =3D &ipa_power_data, + .version =3D IPA_VERSION_3_1, + .backward_compat =3D BIT(BCR_CMDQ_L_LACK_ONE_ENTRY), + .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), + .qsb_data =3D ipa_qsb_data, + .modem_route_count =3D 8, + .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), + .endpoint_data =3D ipa_gsi_endpoint_data, + .resource_data =3D &ipa_resource_data, + .mem_data =3D &ipa_mem_data, + .power_data =3D &ipa_power_data, }; diff --git a/drivers/net/ipa/data/ipa_data-v3.5.1.c b/drivers/net/ipa/data/= ipa_data-v3.5.1.c index 383ef18900654..47591faf8bd62 100644 --- a/drivers/net/ipa/data/ipa_data-v3.5.1.c +++ b/drivers/net/ipa/data/ipa_data-v3.5.1.c @@ -406,17 +406,18 @@ static const struct ipa_power_data ipa_power_data =3D= { =20 /* Configuration data for an SoC having IPA v3.5.1 */ const struct ipa_data ipa_data_v3_5_1 =3D { - .version =3D IPA_VERSION_3_5_1, - .backward_compat =3D BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) | - BIT(BCR_TX_NOT_USING_BRESP) | - BIT(BCR_SUSPEND_L2_IRQ) | - BIT(BCR_HOLB_DROP_L2_IRQ) | - BIT(BCR_DUAL_TX), - .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), - .qsb_data =3D ipa_qsb_data, - .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), - .endpoint_data =3D ipa_gsi_endpoint_data, - .resource_data =3D &ipa_resource_data, - .mem_data =3D &ipa_mem_data, - .power_data =3D &ipa_power_data, + .version =3D IPA_VERSION_3_5_1, + .backward_compat =3D BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) | + BIT(BCR_TX_NOT_USING_BRESP) | + BIT(BCR_SUSPEND_L2_IRQ) | + BIT(BCR_HOLB_DROP_L2_IRQ) | + BIT(BCR_DUAL_TX), + .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), + .qsb_data =3D ipa_qsb_data, + .modem_route_count =3D 8, + .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), + .endpoint_data =3D ipa_gsi_endpoint_data, + .resource_data =3D &ipa_resource_data, + .mem_data =3D &ipa_mem_data, + .power_data =3D &ipa_power_data, }; diff --git a/drivers/net/ipa/data/ipa_data-v4.11.c b/drivers/net/ipa/data/i= pa_data-v4.11.c index a204e439c23d3..1b4b52501ee33 100644 --- a/drivers/net/ipa/data/ipa_data-v4.11.c +++ b/drivers/net/ipa/data/ipa_data-v4.11.c @@ -394,12 +394,13 @@ static const struct ipa_power_data ipa_power_data =3D= { =20 /* Configuration data for an SoC having IPA v4.11 */ const struct ipa_data ipa_data_v4_11 =3D { - .version =3D IPA_VERSION_4_11, - .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), - .qsb_data =3D ipa_qsb_data, - .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), - .endpoint_data =3D ipa_gsi_endpoint_data, - .resource_data =3D &ipa_resource_data, - .mem_data =3D &ipa_mem_data, - .power_data =3D &ipa_power_data, + .version =3D IPA_VERSION_4_11, + .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), + .qsb_data =3D ipa_qsb_data, + .modem_route_count =3D 8, + .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), + .endpoint_data =3D ipa_gsi_endpoint_data, + .resource_data =3D &ipa_resource_data, + .mem_data =3D &ipa_mem_data, + .power_data =3D &ipa_power_data, }; diff --git a/drivers/net/ipa/data/ipa_data-v4.2.c b/drivers/net/ipa/data/ip= a_data-v4.2.c index 04f574fe006f0..199ed0ed868b9 100644 --- a/drivers/net/ipa/data/ipa_data-v4.2.c +++ b/drivers/net/ipa/data/ipa_data-v4.2.c @@ -372,13 +372,14 @@ static const struct ipa_power_data ipa_power_data =3D= { =20 /* Configuration data for an SoC having IPA v4.2 */ const struct ipa_data ipa_data_v4_2 =3D { - .version =3D IPA_VERSION_4_2, + .version =3D IPA_VERSION_4_2, /* backward_compat value is 0 */ - .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), - .qsb_data =3D ipa_qsb_data, - .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), - .endpoint_data =3D ipa_gsi_endpoint_data, - .resource_data =3D &ipa_resource_data, - .mem_data =3D &ipa_mem_data, - .power_data =3D &ipa_power_data, + .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), + .qsb_data =3D ipa_qsb_data, + .modem_route_count =3D 8, + .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), + .endpoint_data =3D ipa_gsi_endpoint_data, + .resource_data =3D &ipa_resource_data, + .mem_data =3D &ipa_mem_data, + .power_data =3D &ipa_power_data, }; diff --git a/drivers/net/ipa/data/ipa_data-v4.5.c b/drivers/net/ipa/data/ip= a_data-v4.5.c index 684239e71f46a..19b549f2998b8 100644 --- a/drivers/net/ipa/data/ipa_data-v4.5.c +++ b/drivers/net/ipa/data/ipa_data-v4.5.c @@ -450,12 +450,13 @@ static const struct ipa_power_data ipa_power_data =3D= { =20 /* Configuration data for an SoC having IPA v4.5 */ const struct ipa_data ipa_data_v4_5 =3D { - .version =3D IPA_VERSION_4_5, - .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), - .qsb_data =3D ipa_qsb_data, - .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), - .endpoint_data =3D ipa_gsi_endpoint_data, - .resource_data =3D &ipa_resource_data, - .mem_data =3D &ipa_mem_data, - .power_data =3D &ipa_power_data, + .version =3D IPA_VERSION_4_5, + .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), + .qsb_data =3D ipa_qsb_data, + .modem_route_count =3D 8, + .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), + .endpoint_data =3D ipa_gsi_endpoint_data, + .resource_data =3D &ipa_resource_data, + .mem_data =3D &ipa_mem_data, + .power_data =3D &ipa_power_data, }; diff --git a/drivers/net/ipa/data/ipa_data-v4.9.c b/drivers/net/ipa/data/ip= a_data-v4.9.c index 2333e15f95338..d30fc1fe6ca22 100644 --- a/drivers/net/ipa/data/ipa_data-v4.9.c +++ b/drivers/net/ipa/data/ipa_data-v4.9.c @@ -444,12 +444,13 @@ static const struct ipa_power_data ipa_power_data =3D= { =20 /* Configuration data for an SoC having IPA v4.9. */ const struct ipa_data ipa_data_v4_9 =3D { - .version =3D IPA_VERSION_4_9, - .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), - .qsb_data =3D ipa_qsb_data, - .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), - .endpoint_data =3D ipa_gsi_endpoint_data, - .resource_data =3D &ipa_resource_data, - .mem_data =3D &ipa_mem_data, - .power_data =3D &ipa_power_data, + .version =3D IPA_VERSION_4_9, + .qsb_count =3D ARRAY_SIZE(ipa_qsb_data), + .qsb_data =3D ipa_qsb_data, + .modem_route_count =3D 8, + .endpoint_count =3D ARRAY_SIZE(ipa_gsi_endpoint_data), + .endpoint_data =3D ipa_gsi_endpoint_data, + .resource_data =3D &ipa_resource_data, + .mem_data =3D &ipa_mem_data, + .power_data =3D &ipa_power_data, }; diff --git a/drivers/net/ipa/ipa.h b/drivers/net/ipa/ipa.h index aa39509e209a3..5c95acc70bb33 100644 --- a/drivers/net/ipa/ipa.h +++ b/drivers/net/ipa/ipa.h @@ -40,6 +40,7 @@ struct ipa_interrupt; * @table_addr: DMA address of filter/route table content * @table_virt: Virtual address of filter/route table content * @route_count: Total number of entries in a routing table + * @modem_route_count: Number of modem entries in a routing table * @interrupt: IPA Interrupt information * @uc_powered: true if power is active by proxy for microcontroller * @uc_loaded: true after microcontroller has reported it's ready @@ -86,6 +87,7 @@ struct ipa { dma_addr_t table_addr; __le64 *table_virt; u32 route_count; + u32 modem_route_count; =20 struct ipa_interrupt *interrupt; bool uc_powered; diff --git a/drivers/net/ipa/ipa_data.h b/drivers/net/ipa/ipa_data.h index e5a6ce75c7ddd..412edbfac7862 100644 --- a/drivers/net/ipa/ipa_data.h +++ b/drivers/net/ipa/ipa_data.h @@ -222,6 +222,7 @@ struct ipa_power_data { * @backward_compat: BCR register value (prior to IPA v4.5 only) * @qsb_count: number of entries in the qsb_data array * @qsb_data: Qualcomm System Bus configuration data + * @modem_route_count: number of modem entries in a routing table * @endpoint_count: number of entries in the endpoint_data array * @endpoint_data: IPA endpoint/GSI channel data * @resource_data: IPA resource configuration data @@ -233,6 +234,7 @@ struct ipa_data { u32 backward_compat; u32 qsb_count; /* number of entries in qsb_data[] */ const struct ipa_qsb_data *qsb_data; + u32 modem_route_count; u32 endpoint_count; /* number of entries in endpoint_data[] */ const struct ipa_gsi_endpoint_data *endpoint_data; const struct ipa_resource_data *resource_data; diff --git a/drivers/net/ipa/ipa_main.c b/drivers/net/ipa/ipa_main.c index 3461ad3029ab8..ce5eadad671f3 100644 --- a/drivers/net/ipa/ipa_main.c +++ b/drivers/net/ipa/ipa_main.c @@ -739,6 +739,11 @@ static int ipa_probe(struct platform_device *pdev) return -EINVAL; } =20 + if (!data->modem_route_count) { + dev_err(dev, "modem_route_count cannot be zero\n"); + return -EINVAL; + } + /* If we need Trust Zone, make sure it's available */ modem_init =3D of_property_read_bool(dev->of_node, "modem-init"); if (!modem_init) @@ -763,6 +768,7 @@ static int ipa_probe(struct platform_device *pdev) dev_set_drvdata(dev, ipa); ipa->power =3D power; ipa->version =3D data->version; + ipa->modem_route_count =3D data->modem_route_count; init_completion(&ipa->completion); =20 ret =3D ipa_reg_init(ipa); diff --git a/drivers/net/ipa/ipa_mem.c b/drivers/net/ipa/ipa_mem.c index a3d2317452ac6..cb95402018394 100644 --- a/drivers/net/ipa/ipa_mem.c +++ b/drivers/net/ipa/ipa_mem.c @@ -618,9 +618,9 @@ int ipa_mem_init(struct ipa *ipa, const struct ipa_mem_= data *mem_data) ipa->mem =3D mem_data->local; =20 /* Check the route and filter table memory regions */ - if (!ipa_table_mem_valid(ipa, 0)) + if (!ipa_table_mem_valid(ipa, false)) return -EINVAL; - if (!ipa_table_mem_valid(ipa, IPA_ROUTE_MODEM_COUNT)) + if (!ipa_table_mem_valid(ipa, true)) return -EINVAL; =20 ret =3D dma_set_mask_and_coherent(&ipa->pdev->dev, DMA_BIT_MASK(64)); diff --git a/drivers/net/ipa/ipa_qmi.c b/drivers/net/ipa/ipa_qmi.c index 8295fd4b70d16..f70f0a1d1cdac 100644 --- a/drivers/net/ipa/ipa_qmi.c +++ b/drivers/net/ipa/ipa_qmi.c @@ -284,6 +284,7 @@ static const struct ipa_init_modem_driver_req * init_modem_driver_req(struct ipa_qmi *ipa_qmi) { struct ipa *ipa =3D container_of(ipa_qmi, struct ipa, qmi); + u32 modem_route_count =3D ipa->modem_route_count; static struct ipa_init_modem_driver_req req; const struct ipa_mem *mem; =20 @@ -308,12 +309,12 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi) mem =3D ipa_mem_find(ipa, IPA_MEM_V4_ROUTE); req.v4_route_tbl_info_valid =3D 1; req.v4_route_tbl_info.start =3D ipa->mem_offset + mem->offset; - req.v4_route_tbl_info.end =3D IPA_ROUTE_MODEM_COUNT - 1; + req.v4_route_tbl_info.end =3D modem_route_count - 1; =20 mem =3D ipa_mem_find(ipa, IPA_MEM_V6_ROUTE); req.v6_route_tbl_info_valid =3D 1; req.v6_route_tbl_info.start =3D ipa->mem_offset + mem->offset; - req.v6_route_tbl_info.end =3D IPA_ROUTE_MODEM_COUNT - 1; + req.v6_route_tbl_info.end =3D modem_route_count - 1; =20 mem =3D ipa_mem_find(ipa, IPA_MEM_V4_FILTER); req.v4_filter_tbl_start_valid =3D 1; @@ -352,7 +353,7 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi) req.v4_hash_route_tbl_info_valid =3D 1; req.v4_hash_route_tbl_info.start =3D ipa->mem_offset + mem->offset; - req.v4_hash_route_tbl_info.end =3D IPA_ROUTE_MODEM_COUNT - 1; + req.v4_hash_route_tbl_info.end =3D modem_route_count - 1; } =20 mem =3D ipa_mem_find(ipa, IPA_MEM_V6_ROUTE_HASHED); @@ -360,7 +361,7 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi) req.v6_hash_route_tbl_info_valid =3D 1; req.v6_hash_route_tbl_info.start =3D ipa->mem_offset + mem->offset; - req.v6_hash_route_tbl_info.end =3D IPA_ROUTE_MODEM_COUNT - 1; + req.v6_hash_route_tbl_info.end =3D modem_route_count - 1; } =20 mem =3D ipa_mem_find(ipa, IPA_MEM_V4_FILTER_HASHED); diff --git a/drivers/net/ipa/ipa_table.c b/drivers/net/ipa/ipa_table.c index 23d3f081ac8e1..c9ab6a3fabbc3 100644 --- a/drivers/net/ipa/ipa_table.c +++ b/drivers/net/ipa/ipa_table.c @@ -129,9 +129,6 @@ static void ipa_table_validate_build(void) * assumes that it can be written using a pointer to __le64. */ BUILD_BUG_ON(IPA_ZERO_RULE_SIZE !=3D sizeof(__le64)); - - /* The modem must be allotted at least one route table entry */ - BUILD_BUG_ON(!IPA_ROUTE_MODEM_COUNT); } =20 static const struct ipa_mem * @@ -281,6 +278,7 @@ static int ipa_filter_reset(struct ipa *ipa, bool modem) * */ static int ipa_route_reset(struct ipa *ipa, bool modem) { + u32 modem_route_count =3D ipa->modem_route_count; struct gsi_trans *trans; u16 first; u16 count; @@ -295,10 +293,10 @@ static int ipa_route_reset(struct ipa *ipa, bool mode= m) =20 if (modem) { first =3D 0; - count =3D IPA_ROUTE_MODEM_COUNT; + count =3D modem_route_count; } else { - first =3D IPA_ROUTE_MODEM_COUNT; - count =3D ipa->route_count - IPA_ROUTE_MODEM_COUNT; + first =3D modem_route_count; + count =3D ipa->route_count - modem_route_count; } =20 ipa_table_reset_add(trans, false, first, count, IPA_MEM_V4_ROUTE); @@ -511,9 +509,9 @@ static void ipa_filter_config(struct ipa *ipa, bool mod= em) } } =20 -static bool ipa_route_id_modem(u32 route_id) +static bool ipa_route_id_modem(struct ipa *ipa, u32 route_id) { - return route_id < IPA_ROUTE_MODEM_COUNT; + return route_id < ipa->modem_route_count; } =20 /** @@ -549,7 +547,7 @@ static void ipa_route_config(struct ipa *ipa, bool mode= m) return; =20 for (route_id =3D 0; route_id < ipa->route_count; route_id++) - if (ipa_route_id_modem(route_id) =3D=3D modem) + if (ipa_route_id_modem(ipa, route_id) =3D=3D modem) ipa_route_tuple_zero(ipa, route_id); } =20 @@ -565,10 +563,9 @@ void ipa_table_config(struct ipa *ipa) /* Verify the sizes of all IPA table filter or routing table memory regions * are valid. If valid, this records the size of the routing table. */ -bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) +bool ipa_table_mem_valid(struct ipa *ipa, bool filter) { bool hash_support =3D ipa_table_hash_support(ipa); - bool filter =3D !modem_route_count; const struct ipa_mem *mem_hashed; const struct ipa_mem *mem_ipv4; const struct ipa_mem *mem_ipv6; @@ -611,7 +608,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_ro= ute_count) /* Routing tables must be able to hold all modem entries, * plus at least one entry for the AP. */ - if (count < modem_route_count + 1) + if (count < ipa->modem_route_count + 1) return false; } =20 diff --git a/drivers/net/ipa/ipa_table.h b/drivers/net/ipa/ipa_table.h index 31363292dc1db..79583b16f363f 100644 --- a/drivers/net/ipa/ipa_table.h +++ b/drivers/net/ipa/ipa_table.h @@ -13,9 +13,6 @@ struct ipa; /* The maximum number of filter table entries (IPv4, IPv6; hashed or not) = */ #define IPA_FILTER_COUNT_MAX 14 =20 -/* The number of route table entries allotted to the modem */ -#define IPA_ROUTE_MODEM_COUNT 8 - /** * ipa_filter_map_valid() - Validate a filter table endpoint bitmap * @ipa: IPA pointer @@ -78,8 +75,8 @@ void ipa_table_exit(struct ipa *ipa); /** * ipa_table_mem_valid() - Validate sizes of table memory regions * @ipa: IPA pointer - * @modem_route_count: Number of modem route table entries + * @filter: Whether to check filter or routing tables */ -bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count); +bool ipa_table_mem_valid(struct ipa *ipa, bool filter); =20 #endif /* _IPA_TABLE_H_ */ --=20 2.34.1 From nobody Wed Apr 8 12:34:46 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 34477FA373E for ; Tue, 25 Oct 2022 19:52:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229800AbiJYTwQ (ORCPT ); Tue, 25 Oct 2022 15:52:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54200 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232546AbiJYTwF (ORCPT ); Tue, 25 Oct 2022 15:52:05 -0400 Received: from mail-io1-xd32.google.com (mail-io1-xd32.google.com [IPv6:2607:f8b0:4864:20::d32]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 540B3106E06 for ; Tue, 25 Oct 2022 12:51:59 -0700 (PDT) Received: by mail-io1-xd32.google.com with SMTP id y80so11430199iof.3 for ; Tue, 25 Oct 2022 12:51:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kzxGUpzbXxImm84chnls9JcE5FMkEnfBOo4eTdKEFsk=; b=d7vJizjehnoLsN4v+Aizmx7Y1q2iL54jeFUJWrbcm4/2ynOw1RDegLc409znFarKsw HE9OKWnp9eW4nJnTnie9nMmTs+2rO4s2vMBmcmG7yaFlbqIBxdK8pUOh6ygb+d4M6qxy ljle91MMhrF1omsAOxXQJJvBcA7JTAvRMQUrJA0Zpehe7rSrEKQOMGB+6k/TTmxdB5Ox 8rmLW0Q89Ta5FD10PT/GpJOcbdsgBq3IsiTVnIBHyyxDwd7+ulg9orZkRoUh0vhRs4Ke O9B4Xi4a7aBDBFAMagF2rgxg8zYoLO2aPJzKJnxg/RW9/kERYCV+qxKY7wsJrDr5AqE2 kAzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kzxGUpzbXxImm84chnls9JcE5FMkEnfBOo4eTdKEFsk=; b=WV8WJyuMdOx1oVngnR+90Rh4+PQTTr7+K75KRDbnwaPJnRzWbMAqZWlaX9nk4v9oj+ Z/kR3wAAHVuxmiw21TgCDUZPSTczgpXkmjiCdGaVXYuRn9oxo7Fo9cbdUZk3trHCEVDn bmznz6LTii1+V9ZWInTry6ewvXv5d2gCgX2DZbC8/tLTtColV4PRKeggOglOTX9hDhE6 +cXFB4I5EJ4xadiYdP214nh0J+CNtWONRSehWuYxH6IrYKwi053pi/T5EDhNpKwvUnvS uc3hIx03DKO92sVkiRrZJXW3jBRGVGhyu/Dvj4wh4eqfR5rv0S42gkqH7QQtZGBdIsWH 3f0A== X-Gm-Message-State: ACrzQf3nRv8iD/owE8uJIDO6vXJbxC48fh9sH2rSpykg85Kbr8m+EXUO m83OazrUT1Lu6o1ll1Ij6P/gUQ== X-Google-Smtp-Source: AMsMyM5ljODGAxjMX1WHPCX8qeMMu35WtxFHsuESq6U44Gy7kpGxTVEzLOVKi7fg8V97Z2L5irPFQw== X-Received: by 2002:a05:6638:1687:b0:374:fbbd:6617 with SMTP id f7-20020a056638168700b00374fbbd6617mr4754988jat.201.1666727518613; Tue, 25 Oct 2022 12:51:58 -0700 (PDT) Received: from localhost.localdomain ([98.61.227.136]) by smtp.gmail.com with ESMTPSA id y10-20020a056638014a00b00349d2d52f6asm1211719jao.37.2022.10.25.12.51.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Oct 2022 12:51:57 -0700 (PDT) From: Alex Elder To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: mka@chromium.org, evgreen@chromium.org, andersson@kernel.org, quic_cpratapa@quicinc.com, quic_avuyyuru@quicinc.com, quic_jponduru@quicinc.com, quic_subashab@quicinc.com, elder@kernel.org, netdev@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next 4/4] net: ipa: determine filter table size from memory region Date: Tue, 25 Oct 2022 14:51:43 -0500 Message-Id: <20221025195143.255934-5-elder@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221025195143.255934-1-elder@linaro.org> References: <20221025195143.255934-1-elder@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently we assume that any filter table contains a fixed number of entries. Like routing tables, the number of entries in a filter table is limited only by the size of the IPA-local memory region used to hold the table. Stop assuming that a filter table has exactly 14 entries. Instead, determine the number of entries in a routing table by dividing its memory region size by the size of an entry. (Note that the first "entry" in a filter table contains an endpoint bitmap.) Signed-off-by: Alex Elder --- drivers/net/ipa/ipa.h | 2 ++ drivers/net/ipa/ipa_cmd.c | 8 ++------ drivers/net/ipa/ipa_table.c | 20 +++++++++++--------- drivers/net/ipa/ipa_table.h | 3 --- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/drivers/net/ipa/ipa.h b/drivers/net/ipa/ipa.h index 5c95acc70bb33..82225316a2e25 100644 --- a/drivers/net/ipa/ipa.h +++ b/drivers/net/ipa/ipa.h @@ -41,6 +41,7 @@ struct ipa_interrupt; * @table_virt: Virtual address of filter/route table content * @route_count: Total number of entries in a routing table * @modem_route_count: Number of modem entries in a routing table + * @filter_count: Maximum number of entries in a filter table * @interrupt: IPA Interrupt information * @uc_powered: true if power is active by proxy for microcontroller * @uc_loaded: true after microcontroller has reported it's ready @@ -88,6 +89,7 @@ struct ipa { __le64 *table_virt; u32 route_count; u32 modem_route_count; + u32 filter_count; =20 struct ipa_interrupt *interrupt; bool uc_powered; diff --git a/drivers/net/ipa/ipa_cmd.c b/drivers/net/ipa/ipa_cmd.c index 08e3f395a9453..bb3dfa9a2bc81 100644 --- a/drivers/net/ipa/ipa_cmd.c +++ b/drivers/net/ipa/ipa_cmd.c @@ -151,11 +151,6 @@ static void ipa_cmd_validate_build(void) * maximum size. IPv4 and IPv6 filter tables have the same number * of entries. */ -#define TABLE_SIZE (IPA_FILTER_COUNT_MAX * sizeof(__le64)) - BUILD_BUG_ON(TABLE_SIZE > field_max(IP_FLTRT_FLAGS_HASH_SIZE_FMASK)); - BUILD_BUG_ON(TABLE_SIZE > field_max(IP_FLTRT_FLAGS_NHASH_SIZE_FMASK)); -#undef TABLE_SIZE - /* Hashed and non-hashed fields are assumed to be the same size */ BUILD_BUG_ON(field_max(IP_FLTRT_FLAGS_HASH_SIZE_FMASK) !=3D field_max(IP_FLTRT_FLAGS_NHASH_SIZE_FMASK)); @@ -177,7 +172,8 @@ bool ipa_cmd_table_init_valid(struct ipa *ipa, const st= ruct ipa_mem *mem, struct device *dev =3D &ipa->pdev->dev; u32 size; =20 - size =3D route ? ipa->route_count * sizeof(__le64) : mem->size; + size =3D route ? ipa->route_count : ipa->filter_count + 1; + size *=3D sizeof(__le64); =20 /* Size must fit in the immediate command field that holds it */ if (size > size_max) { diff --git a/drivers/net/ipa/ipa_table.c b/drivers/net/ipa/ipa_table.c index c9ab6a3fabbc3..db1992eaafaa9 100644 --- a/drivers/net/ipa/ipa_table.c +++ b/drivers/net/ipa/ipa_table.c @@ -160,9 +160,9 @@ bool ipa_filter_map_valid(struct ipa *ipa, u32 filter_m= ap) } =20 count =3D hweight32(filter_map); - if (count > IPA_FILTER_COUNT_MAX) { + if (count > ipa->filter_count) { dev_err(dev, "too many filtering endpoints (%u, max %u)\n", - count, IPA_FILTER_COUNT_MAX); + count, ipa->filter_count); =20 return false; } @@ -178,7 +178,7 @@ static dma_addr_t ipa_table_addr(struct ipa *ipa, bool = filter_mask, u16 count) if (!count) return 0; =20 - WARN_ON(count > max_t(u32, IPA_FILTER_COUNT_MAX, ipa->route_count)); + WARN_ON(count > max_t(u32, ipa->filter_count, ipa->route_count)); =20 /* Skip over the zero rule and possibly the filter mask */ skip =3D filter_mask ? 1 : 2; @@ -586,11 +586,13 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool filter) if (mem_ipv4->size !=3D mem_ipv6->size) return false; =20 - /* Compute the number of entries, and for routing tables, record it */ + /* Compute and record the number of entries for each table type */ count =3D mem_ipv4->size / sizeof(__le64); if (count < 2) return false; - if (!filter) + if (filter) + ipa->filter_count =3D count - 1; /* Filter map in first entry */ + else ipa->route_count =3D count; =20 /* Table offset and size must fit in TABLE_INIT command fields */ @@ -645,7 +647,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool filter) * * The first entry in a filter table contains a bitmap indicating which * endpoints contain entries in the table. In addition to that first entr= y, - * there are at most IPA_FILTER_COUNT_MAX entries that follow. Filter tab= le + * there is a fixed maximum number of entries that follow. Filter table * entries are 64 bits wide, and (other than the bitmap) contain the DMA * address of a filter rule. A "zero rule" indicates no filtering, and * consists of 64 bits of zeroes. When a filter table is initialized (or @@ -669,7 +671,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool filter) * |\ |-------------------| * | ---- zero rule address | \ * |\ |-------------------| | - * | ---- zero rule address | | IPA_FILTER_COUNT_MAX + * | ---- zero rule address | | Max IPA filter count * | |-------------------| > or IPA route count, * | ... | whichever is greater * \ |-------------------| | @@ -687,7 +689,7 @@ int ipa_table_init(struct ipa *ipa) =20 ipa_table_validate_build(); =20 - count =3D max_t(u32, IPA_FILTER_COUNT_MAX, ipa->route_count); + count =3D max_t(u32, ipa->filter_count, ipa->route_count); =20 /* The IPA hardware requires route and filter table rules to be * aligned on a 128-byte boundary. We put the "zero rule" at the @@ -723,7 +725,7 @@ int ipa_table_init(struct ipa *ipa) =20 void ipa_table_exit(struct ipa *ipa) { - u32 count =3D max_t(u32, 1 + IPA_FILTER_COUNT_MAX, ipa->route_count); + u32 count =3D max_t(u32, 1 + ipa->filter_count, ipa->route_count); struct device *dev =3D &ipa->pdev->dev; size_t size; =20 diff --git a/drivers/net/ipa/ipa_table.h b/drivers/net/ipa/ipa_table.h index 79583b16f363f..8a4dcd7df4c0f 100644 --- a/drivers/net/ipa/ipa_table.h +++ b/drivers/net/ipa/ipa_table.h @@ -10,9 +10,6 @@ =20 struct ipa; =20 -/* The maximum number of filter table entries (IPv4, IPv6; hashed or not) = */ -#define IPA_FILTER_COUNT_MAX 14 - /** * ipa_filter_map_valid() - Validate a filter table endpoint bitmap * @ipa: IPA pointer --=20 2.34.1