resources.h 4.9 KB
Newer Older
1 2
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
/* Copyright (c) 2016-2018 Mellanox Technologies. All rights reserved */
J
Jiri Pirko 已提交
3 4 5 6 7 8 9 10 11 12 13

#ifndef _MLXSW_RESOURCES_H
#define _MLXSW_RESOURCES_H

#include <linux/kernel.h>
#include <linux/types.h>

enum mlxsw_res_id {
	MLXSW_RES_ID_KVD_SIZE,
	MLXSW_RES_ID_KVD_SINGLE_MIN_SIZE,
	MLXSW_RES_ID_KVD_DOUBLE_MIN_SIZE,
14 15
	MLXSW_RES_ID_MAX_KVD_LINEAR_RANGE,
	MLXSW_RES_ID_MAX_KVD_ACTION_SETS,
16
	MLXSW_RES_ID_MAX_TRAP_GROUPS,
17 18 19
	MLXSW_RES_ID_CQE_V0,
	MLXSW_RES_ID_CQE_V1,
	MLXSW_RES_ID_CQE_V2,
20
	MLXSW_RES_ID_COUNTER_POOL_SIZE,
J
Jiri Pirko 已提交
21
	MLXSW_RES_ID_MAX_SPAN,
22
	MLXSW_RES_ID_COUNTER_SIZE_PACKETS_BYTES,
23
	MLXSW_RES_ID_COUNTER_SIZE_ROUTER_BASIC,
J
Jiri Pirko 已提交
24 25 26
	MLXSW_RES_ID_MAX_SYSTEM_PORT,
	MLXSW_RES_ID_MAX_LAG,
	MLXSW_RES_ID_MAX_LAG_MEMBERS,
27 28
	MLXSW_RES_ID_LOCAL_PORTS_IN_1X,
	MLXSW_RES_ID_LOCAL_PORTS_IN_2X,
29
	MLXSW_RES_ID_LOCAL_PORTS_IN_4X,
30
	MLXSW_RES_ID_GUARANTEED_SHARED_BUFFER,
31
	MLXSW_RES_ID_CELL_SIZE,
32
	MLXSW_RES_ID_MAX_HEADROOM_SIZE,
33 34 35 36 37 38 39 40
	MLXSW_RES_ID_ACL_MAX_TCAM_REGIONS,
	MLXSW_RES_ID_ACL_MAX_TCAM_RULES,
	MLXSW_RES_ID_ACL_MAX_REGIONS,
	MLXSW_RES_ID_ACL_MAX_GROUPS,
	MLXSW_RES_ID_ACL_MAX_GROUP_SIZE,
	MLXSW_RES_ID_ACL_FLEX_KEYS,
	MLXSW_RES_ID_ACL_MAX_ACTION_PER_RULE,
	MLXSW_RES_ID_ACL_ACTIONS_PER_SET,
41 42
	MLXSW_RES_ID_ACL_MAX_ERPT_BANKS,
	MLXSW_RES_ID_ACL_MAX_ERPT_BANK_SIZE,
43
	MLXSW_RES_ID_ACL_MAX_LARGE_KEY_ID,
44 45 46 47
	MLXSW_RES_ID_ACL_ERPT_ENTRIES_2KB,
	MLXSW_RES_ID_ACL_ERPT_ENTRIES_4KB,
	MLXSW_RES_ID_ACL_ERPT_ENTRIES_8KB,
	MLXSW_RES_ID_ACL_ERPT_ENTRIES_12KB,
48
	MLXSW_RES_ID_ACL_MAX_BF_LOG,
49
	MLXSW_RES_ID_MAX_CPU_POLICERS,
J
Jiri Pirko 已提交
50 51
	MLXSW_RES_ID_MAX_VRS,
	MLXSW_RES_ID_MAX_RIFS,
52
	MLXSW_RES_ID_MC_ERIF_LIST_ENTRIES,
53
	MLXSW_RES_ID_MAX_LPM_TREES,
I
Ido Schimmel 已提交
54 55
	MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV4,
	MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV6,
J
Jiri Pirko 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

	/* Internal resources.
	 * Determined by the SW, not queried from the HW.
	 */
	MLXSW_RES_ID_KVD_SINGLE_SIZE,
	MLXSW_RES_ID_KVD_DOUBLE_SIZE,
	MLXSW_RES_ID_KVD_LINEAR_SIZE,

	__MLXSW_RES_ID_MAX,
};

static u16 mlxsw_res_ids[] = {
	[MLXSW_RES_ID_KVD_SIZE] = 0x1001,
	[MLXSW_RES_ID_KVD_SINGLE_MIN_SIZE] = 0x1002,
	[MLXSW_RES_ID_KVD_DOUBLE_MIN_SIZE] = 0x1003,
71 72
	[MLXSW_RES_ID_MAX_KVD_LINEAR_RANGE] = 0x1005,
	[MLXSW_RES_ID_MAX_KVD_ACTION_SETS] = 0x1007,
73
	[MLXSW_RES_ID_MAX_TRAP_GROUPS] = 0x2201,
74 75 76
	[MLXSW_RES_ID_CQE_V0] = 0x2210,
	[MLXSW_RES_ID_CQE_V1] = 0x2211,
	[MLXSW_RES_ID_CQE_V2] = 0x2212,
77
	[MLXSW_RES_ID_COUNTER_POOL_SIZE] = 0x2410,
J
Jiri Pirko 已提交
78
	[MLXSW_RES_ID_MAX_SPAN] = 0x2420,
79
	[MLXSW_RES_ID_COUNTER_SIZE_PACKETS_BYTES] = 0x2443,
80
	[MLXSW_RES_ID_COUNTER_SIZE_ROUTER_BASIC] = 0x2449,
J
Jiri Pirko 已提交
81 82 83
	[MLXSW_RES_ID_MAX_SYSTEM_PORT] = 0x2502,
	[MLXSW_RES_ID_MAX_LAG] = 0x2520,
	[MLXSW_RES_ID_MAX_LAG_MEMBERS] = 0x2521,
84 85
	[MLXSW_RES_ID_LOCAL_PORTS_IN_1X] = 0x2610,
	[MLXSW_RES_ID_LOCAL_PORTS_IN_2X] = 0x2611,
86
	[MLXSW_RES_ID_LOCAL_PORTS_IN_4X] = 0x2612,
87
	[MLXSW_RES_ID_GUARANTEED_SHARED_BUFFER] = 0x2805,	/* Bytes */
88
	[MLXSW_RES_ID_CELL_SIZE] = 0x2803,	/* Bytes */
89
	[MLXSW_RES_ID_MAX_HEADROOM_SIZE] = 0x2811,	/* Bytes */
90 91 92 93 94 95 96 97
	[MLXSW_RES_ID_ACL_MAX_TCAM_REGIONS] = 0x2901,
	[MLXSW_RES_ID_ACL_MAX_TCAM_RULES] = 0x2902,
	[MLXSW_RES_ID_ACL_MAX_REGIONS] = 0x2903,
	[MLXSW_RES_ID_ACL_MAX_GROUPS] = 0x2904,
	[MLXSW_RES_ID_ACL_MAX_GROUP_SIZE] = 0x2905,
	[MLXSW_RES_ID_ACL_FLEX_KEYS] = 0x2910,
	[MLXSW_RES_ID_ACL_MAX_ACTION_PER_RULE] = 0x2911,
	[MLXSW_RES_ID_ACL_ACTIONS_PER_SET] = 0x2912,
98 99
	[MLXSW_RES_ID_ACL_MAX_ERPT_BANKS] = 0x2940,
	[MLXSW_RES_ID_ACL_MAX_ERPT_BANK_SIZE] = 0x2941,
100
	[MLXSW_RES_ID_ACL_MAX_LARGE_KEY_ID] = 0x2942,
101 102 103 104
	[MLXSW_RES_ID_ACL_ERPT_ENTRIES_2KB] = 0x2950,
	[MLXSW_RES_ID_ACL_ERPT_ENTRIES_4KB] = 0x2951,
	[MLXSW_RES_ID_ACL_ERPT_ENTRIES_8KB] = 0x2952,
	[MLXSW_RES_ID_ACL_ERPT_ENTRIES_12KB] = 0x2953,
105
	[MLXSW_RES_ID_ACL_MAX_BF_LOG] = 0x2960,
106
	[MLXSW_RES_ID_MAX_CPU_POLICERS] = 0x2A13,
J
Jiri Pirko 已提交
107 108
	[MLXSW_RES_ID_MAX_VRS] = 0x2C01,
	[MLXSW_RES_ID_MAX_RIFS] = 0x2C02,
109
	[MLXSW_RES_ID_MC_ERIF_LIST_ENTRIES] = 0x2C10,
110
	[MLXSW_RES_ID_MAX_LPM_TREES] = 0x2C30,
I
Ido Schimmel 已提交
111 112
	[MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV4] = 0x2E02,
	[MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV6] = 0x2E03,
J
Jiri Pirko 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
};

struct mlxsw_res {
	bool valid[__MLXSW_RES_ID_MAX];
	u64 values[__MLXSW_RES_ID_MAX];
};

static inline bool mlxsw_res_valid(struct mlxsw_res *res,
				   enum mlxsw_res_id res_id)
{
	return res->valid[res_id];
}

#define MLXSW_RES_VALID(res, short_res_id)			\
	mlxsw_res_valid(res, MLXSW_RES_ID_##short_res_id)

static inline u64 mlxsw_res_get(struct mlxsw_res *res,
				enum mlxsw_res_id res_id)
{
	if (WARN_ON(!res->valid[res_id]))
		return 0;
	return res->values[res_id];
}

#define MLXSW_RES_GET(res, short_res_id)			\
	mlxsw_res_get(res, MLXSW_RES_ID_##short_res_id)

static inline void mlxsw_res_set(struct mlxsw_res *res,
				 enum mlxsw_res_id res_id, u64 value)
{
	res->valid[res_id] = true;
	res->values[res_id] = value;
}

#define MLXSW_RES_SET(res, short_res_id, value)			\
	mlxsw_res_set(res, MLXSW_RES_ID_##short_res_id, value)

static inline void mlxsw_res_parse(struct mlxsw_res *res, u16 id, u64 value)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(mlxsw_res_ids); i++) {
		if (mlxsw_res_ids[i] == id) {
			mlxsw_res_set(res, i, value);
			return;
		}
	}
}

#endif