Commit 8e7c89d8 authored by Alex Elder's avatar Alex Elder Committed by Jakub Kicinski
Browse files

net: ipa: update table cache flushing



Update the code that causes filter and router table caches to be
flushed so that it supports IPA versions 5.0+.  It adds a comment in
ipa_hardware_config_hashing() that explains that cacheing does not
need to be enabled, just as before, because it's enabled by default.
(For the record, the FILT_ROUT_CACHE_CFG register would have been
used if we wanted to explicitly enable these.)

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 8ba59716
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -295,7 +295,11 @@ static bool ipa_cmd_register_write_valid(struct ipa *ipa)
	 * offset will fit in a register write IPA immediate command.
	 */
	if (ipa_table_hash_support(ipa)) {
		if (ipa->version < IPA_VERSION_5_0)
			reg = ipa_reg(ipa, FILT_ROUT_HASH_FLUSH);
		else
			reg = ipa_reg(ipa, FILT_ROUT_CACHE_FLUSH);

		offset = ipa_reg_offset(reg);
		name = "filter/route hash flush";
		if (!ipa_cmd_register_write_offset_valid(ipa, name, offset))
+6 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
 * Copyright (C) 2018-2022 Linaro Ltd.
 * Copyright (C) 2018-2023 Linaro Ltd.
 */

#include <linux/types.h>
@@ -432,6 +432,11 @@ static void ipa_hardware_config_hashing(struct ipa *ipa)
{
	const struct ipa_reg *reg;

	/* Other than IPA v4.2, all versions enable "hashing".  Starting
	 * with IPA v5.0, the filter and router tables are implemented
	 * differently, but the default configuration enables this feature
	 * (now referred to as "cacheing"), so there's nothing to do here.
	 */
	if (ipa->version != IPA_VERSION_4_2)
		return;

+16 −7
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
 * Copyright (C) 2018-2022 Linaro Ltd.
 * Copyright (C) 2018-2023 Linaro Ltd.
 */

#include <linux/types.h>
@@ -359,6 +359,7 @@ int ipa_table_hash_flush(struct ipa *ipa)
		return -EBUSY;
	}

	if (ipa->version < IPA_VERSION_5_0) {
		reg = ipa_reg(ipa, FILT_ROUT_HASH_FLUSH);
		offset = ipa_reg_offset(reg);

@@ -366,6 +367,14 @@ int ipa_table_hash_flush(struct ipa *ipa)
		val |= ipa_reg_bit(reg, IPV6_FILTER_HASH);
		val |= ipa_reg_bit(reg, IPV4_ROUTER_HASH);
		val |= ipa_reg_bit(reg, IPV4_FILTER_HASH);
	} else {
		reg = ipa_reg(ipa, FILT_ROUT_CACHE_FLUSH);
		offset = ipa_reg_offset(reg);

		/* IPA v5.0+ uses a unified cache (both IPv4 and IPv6) */
		val = ipa_reg_bit(reg, ROUTER_CACHE);
		val |= ipa_reg_bit(reg, FILTER_CACHE);
	}

	ipa_cmd_register_write_add(trans, offset, val, val, false);