Commit 07abde54 authored by Alex Elder's avatar Alex Elder Committed by Jakub Kicinski

net: ipa: support more endpoints

Increase the number of endpoints supported by the driver to 36,
which IPA v5.0 supports.  This makes it impossible to check at build
time whether the supported number is too big to fit within the
(5-bit) PACKET_INIT destination endpoint field.  Instead, convert
the build time check to compare against what fits in 8 bits.

Add a check in ipa_endpoint_config() to also ensure the hardware
reports an endpoint count that's in the expected range.  Just
open-code 32 as the limit (the PACKET_INIT field mask is not
available where we'd want to use it).
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 71af6a2d
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
* Copyright (C) 2019-2022 Linaro Ltd. * Copyright (C) 2019-2023 Linaro Ltd.
*/ */
#include <linux/types.h> #include <linux/types.h>
...@@ -157,9 +157,14 @@ static void ipa_cmd_validate_build(void) ...@@ -157,9 +157,14 @@ static void ipa_cmd_validate_build(void)
BUILD_BUG_ON(field_max(IP_FLTRT_FLAGS_HASH_ADDR_FMASK) != BUILD_BUG_ON(field_max(IP_FLTRT_FLAGS_HASH_ADDR_FMASK) !=
field_max(IP_FLTRT_FLAGS_NHASH_ADDR_FMASK)); field_max(IP_FLTRT_FLAGS_NHASH_ADDR_FMASK));
/* Valid endpoint numbers must fit in the IP packet init command */ /* Prior to IPA v5.0, we supported no more than 32 endpoints,
BUILD_BUG_ON(field_max(IPA_PACKET_INIT_DEST_ENDPOINT_FMASK) < * and this was reflected in some 5-bit fields that held
IPA_ENDPOINT_MAX - 1); * endpoint numbers. Starting with IPA v5.0, the widths of
* these fields were extended to 8 bits, meaning up to 256
* endpoints. If the driver claims to support more than
* that it's an error.
*/
BUILD_BUG_ON(IPA_ENDPOINT_MAX - 1 > U8_MAX);
} }
/* Validate a memory region holding a table */ /* Validate a memory region holding a table */
......
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
* Copyright (C) 2019-2022 Linaro Ltd. * Copyright (C) 2019-2023 Linaro Ltd.
*/ */
#include <linux/types.h> #include <linux/types.h>
...@@ -1986,6 +1986,7 @@ int ipa_endpoint_config(struct ipa *ipa) ...@@ -1986,6 +1986,7 @@ int ipa_endpoint_config(struct ipa *ipa)
struct device *dev = &ipa->pdev->dev; struct device *dev = &ipa->pdev->dev;
const struct ipa_reg *reg; const struct ipa_reg *reg;
u32 endpoint_id; u32 endpoint_id;
u32 hw_limit;
u32 tx_count; u32 tx_count;
u32 rx_count; u32 rx_count;
u32 rx_base; u32 rx_base;
...@@ -2031,6 +2032,14 @@ int ipa_endpoint_config(struct ipa *ipa) ...@@ -2031,6 +2032,14 @@ int ipa_endpoint_config(struct ipa *ipa)
return -EINVAL; return -EINVAL;
} }
/* Until IPA v5.0, the max endpoint ID was 32 */
hw_limit = ipa->version < IPA_VERSION_5_0 ? 32 : U8_MAX + 1;
if (limit > hw_limit) {
dev_err(dev, "unexpected endpoint count, %u > %u\n",
limit, hw_limit);
return -EINVAL;
}
/* Allocate and initialize the available endpoint bitmap */ /* Allocate and initialize the available endpoint bitmap */
ipa->available = bitmap_zalloc(limit, GFP_KERNEL); ipa->available = bitmap_zalloc(limit, GFP_KERNEL);
if (!ipa->available) if (!ipa->available)
......
/* SPDX-License-Identifier: GPL-2.0 */ /* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
* Copyright (C) 2019-2022 Linaro Ltd. * Copyright (C) 2019-2023 Linaro Ltd.
*/ */
#ifndef _IPA_ENDPOINT_H_ #ifndef _IPA_ENDPOINT_H_
#define _IPA_ENDPOINT_H_ #define _IPA_ENDPOINT_H_
...@@ -38,7 +38,7 @@ enum ipa_endpoint_name { ...@@ -38,7 +38,7 @@ enum ipa_endpoint_name {
IPA_ENDPOINT_COUNT, /* Number of names (not an index) */ IPA_ENDPOINT_COUNT, /* Number of names (not an index) */
}; };
#define IPA_ENDPOINT_MAX 32 /* Max supported by driver */ #define IPA_ENDPOINT_MAX 36 /* Max supported by driver */
/** /**
* struct ipa_endpoint_tx - Endpoint configuration for TX endpoints * struct ipa_endpoint_tx - Endpoint configuration for TX endpoints
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment