resources.h 4.7 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
	MLXSW_RES_ID_MAX_BUFFER_SIZE,
28
	MLXSW_RES_ID_CELL_SIZE,
29
	MLXSW_RES_ID_MAX_HEADROOM_SIZE,
30 31 32 33 34 35 36 37
	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,
38 39
	MLXSW_RES_ID_ACL_MAX_ERPT_BANKS,
	MLXSW_RES_ID_ACL_MAX_ERPT_BANK_SIZE,
40
	MLXSW_RES_ID_ACL_MAX_LARGE_KEY_ID,
41 42 43 44
	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,
45
	MLXSW_RES_ID_ACL_MAX_BF_LOG,
46
	MLXSW_RES_ID_MAX_CPU_POLICERS,
J
Jiri Pirko 已提交
47 48
	MLXSW_RES_ID_MAX_VRS,
	MLXSW_RES_ID_MAX_RIFS,
49
	MLXSW_RES_ID_MC_ERIF_LIST_ENTRIES,
50
	MLXSW_RES_ID_MAX_LPM_TREES,
I
Ido Schimmel 已提交
51 52
	MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV4,
	MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV6,
J
Jiri Pirko 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

	/* 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,
68 69
	[MLXSW_RES_ID_MAX_KVD_LINEAR_RANGE] = 0x1005,
	[MLXSW_RES_ID_MAX_KVD_ACTION_SETS] = 0x1007,
70
	[MLXSW_RES_ID_MAX_TRAP_GROUPS] = 0x2201,
71 72 73
	[MLXSW_RES_ID_CQE_V0] = 0x2210,
	[MLXSW_RES_ID_CQE_V1] = 0x2211,
	[MLXSW_RES_ID_CQE_V2] = 0x2212,
74
	[MLXSW_RES_ID_COUNTER_POOL_SIZE] = 0x2410,
J
Jiri Pirko 已提交
75
	[MLXSW_RES_ID_MAX_SPAN] = 0x2420,
76
	[MLXSW_RES_ID_COUNTER_SIZE_PACKETS_BYTES] = 0x2443,
77
	[MLXSW_RES_ID_COUNTER_SIZE_ROUTER_BASIC] = 0x2449,
J
Jiri Pirko 已提交
78 79 80
	[MLXSW_RES_ID_MAX_SYSTEM_PORT] = 0x2502,
	[MLXSW_RES_ID_MAX_LAG] = 0x2520,
	[MLXSW_RES_ID_MAX_LAG_MEMBERS] = 0x2521,
81
	[MLXSW_RES_ID_MAX_BUFFER_SIZE] = 0x2802,	/* Bytes */
82
	[MLXSW_RES_ID_CELL_SIZE] = 0x2803,	/* Bytes */
83
	[MLXSW_RES_ID_MAX_HEADROOM_SIZE] = 0x2811,	/* Bytes */
84 85 86 87 88 89 90 91
	[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,
92 93
	[MLXSW_RES_ID_ACL_MAX_ERPT_BANKS] = 0x2940,
	[MLXSW_RES_ID_ACL_MAX_ERPT_BANK_SIZE] = 0x2941,
94
	[MLXSW_RES_ID_ACL_MAX_LARGE_KEY_ID] = 0x2942,
95 96 97 98
	[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,
99
	[MLXSW_RES_ID_ACL_MAX_BF_LOG] = 0x2960,
100
	[MLXSW_RES_ID_MAX_CPU_POLICERS] = 0x2A13,
J
Jiri Pirko 已提交
101 102
	[MLXSW_RES_ID_MAX_VRS] = 0x2C01,
	[MLXSW_RES_ID_MAX_RIFS] = 0x2C02,
103
	[MLXSW_RES_ID_MC_ERIF_LIST_ENTRIES] = 0x2C10,
104
	[MLXSW_RES_ID_MAX_LPM_TREES] = 0x2C30,
I
Ido Schimmel 已提交
105 106
	[MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV4] = 0x2E02,
	[MLXSW_RES_ID_MAX_NVE_MC_ENTRIES_IPV6] = 0x2E03,
J
Jiri Pirko 已提交
107 108 109 110 111 112 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
};

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