From: Jun Yang <[email protected]> Calculate the maximum BPID dynamically from the device tree configuration instead of using a hardcoded value. This ensures correct operation across different DPAA hardware configurations.
Also update the default BMAN HW version for Layerscape devices. Signed-off-by: Jun Yang <[email protected]> --- drivers/bus/dpaa/base/qbman/bman_driver.c | 51 ++++++++++++++++------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/drivers/bus/dpaa/base/qbman/bman_driver.c b/drivers/bus/dpaa/base/qbman/bman_driver.c index 71a2028383..f80069c674 100644 --- a/drivers/bus/dpaa/base/qbman/bman_driver.c +++ b/drivers/bus/dpaa/base/qbman/bman_driver.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 * * Copyright 2008-2016 Freescale Semiconductor Inc. - * Copyright 2017 NXP + * Copyright 2017,2026 NXP * */ @@ -17,7 +17,7 @@ * Global variables of the max portal/pool number this bman version supported */ static u16 bman_ip_rev; -u16 bman_pool_max; +u16 bman_pool_max = 64; static void *bman_ccsr_map; /*****************/ @@ -180,9 +180,16 @@ int bman_init_ccsr(const struct device_node *node) return 0; } +#define BPID_RANGE_START_INDEX 0 +#define BPID_RANGE_COUNT_INDEX 1 + int bman_global_init(void) { const struct device_node *dt_node; + const rte_be32_t *range; + uint32_t start = 0, count = 0; + int ret; + size_t len; static int done; if (done) @@ -198,7 +205,6 @@ int bman_global_init(void) if (of_device_is_compatible(dt_node, "fsl,bman-portal-1.0") || of_device_is_compatible(dt_node, "fsl,bman-portal-1.0.0")) { bman_ip_rev = BMAN_REV10; - bman_pool_max = 64; } else if (of_device_is_compatible(dt_node, "fsl,bman-portal-2.0") || of_device_is_compatible(dt_node, "fsl,bman-portal-2.0.8")) { bman_ip_rev = BMAN_REV20; @@ -208,26 +214,39 @@ int bman_global_init(void) of_device_is_compatible(dt_node, "fsl,bman-portal-2.1.2") || of_device_is_compatible(dt_node, "fsl,bman-portal-2.1.3")) { bman_ip_rev = BMAN_REV21; - bman_pool_max = 64; } else { - pr_warn("unknown BMan version in portal node,default " - "to rev1.0"); - bman_ip_rev = BMAN_REV10; - bman_pool_max = 64; + pr_warn("unknown bman version in portal node, default to rev2.1.0"); + bman_ip_rev = BMAN_REV21; } if (!bman_ip_rev) { pr_err("Unknown bman portal version\n"); return -ENODEV; } - { - const struct device_node *dn = of_find_compatible_node(NULL, - NULL, "fsl,bman"); - if (!dn) - pr_err("No bman device node available"); - - if (bman_init_ccsr(dn)) - pr_err("BMan CCSR map failed."); + + for_each_compatible_node(dt_node, NULL, "fsl,bpid-range") { + range = of_get_property(dt_node, "fsl,bpid-range", &len); + if (!range || len < (int)(2 * sizeof(rte_be32_t))) + continue; + start = rte_be_to_cpu_32(range[BPID_RANGE_START_INDEX]); + count = rte_be_to_cpu_32(range[BPID_RANGE_COUNT_INDEX]); + bman_pool_max = start + count; + pr_info("Max BPID: %d, fixed BPID < %d", bman_pool_max, start); + break; + } + if (!(start + count)) + pr_warn("No BPID range found in DTS, using default pool max\n"); + + dt_node = of_find_compatible_node(NULL, NULL, "fsl,bman"); + if (!dt_node) { + pr_err("No bman device node available"); + return -ENODEV; + } + + ret = bman_init_ccsr(dt_node); + if (ret) { + pr_err("Failed(%d) to init bman ccsr", ret); + return ret; } done = 1; -- 2.25.1

