Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1bac9381 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'mlxsw-cosmetics-plus-res-mgmt-rewrite'



Jiri Pirko says:

====================
mlxsw: Driver update

Mostly cosmetics and small resource values management rewrite.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 67dc1596 c1a38311
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -513,6 +513,11 @@ static inline int mlxsw_cmd_unmap_fa(struct mlxsw_core *mlxsw_core)
 * are no more sources in the table, will return resource id 0xFFF to indicate
 * it.
 */

#define MLXSW_CMD_QUERY_RESOURCES_TABLE_END_ID 0xffff
#define MLXSW_CMD_QUERY_RESOURCES_MAX_QUERIES 100
#define MLXSW_CMD_QUERY_RESOURCES_PER_QUERY 32

static inline int mlxsw_cmd_query_resources(struct mlxsw_core *mlxsw_core,
					    char *out_mbox, int index)
{
+21 −11
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@
#include "trap.h"
#include "emad.h"
#include "reg.h"
#include "resources.h"

static LIST_HEAD(mlxsw_core_driver_list);
static DEFINE_SPINLOCK(mlxsw_core_driver_list_lock);
@@ -111,7 +112,7 @@ struct mlxsw_core {
	struct {
		u8 *mapping; /* lag_id+port_index to local_port mapping */
	} lag;
	struct mlxsw_resources resources;
	struct mlxsw_res res;
	struct mlxsw_hwmon *hwmon;
	unsigned long driver_priv[0];
	/* driver_priv has to be always the last item */
@@ -1101,14 +1102,15 @@ int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,
	}

	err = mlxsw_bus->init(bus_priv, mlxsw_core, mlxsw_driver->profile,
			      &mlxsw_core->resources);
			      &mlxsw_core->res);
	if (err)
		goto err_bus_init;

	if (mlxsw_core->resources.max_lag_valid &&
	    mlxsw_core->resources.max_ports_in_lag_valid) {
		alloc_size = sizeof(u8) * mlxsw_core->resources.max_lag *
			mlxsw_core->resources.max_ports_in_lag;
	if (MLXSW_CORE_RES_VALID(mlxsw_core, MAX_LAG) &&
	    MLXSW_CORE_RES_VALID(mlxsw_core, MAX_LAG_MEMBERS)) {
		alloc_size = sizeof(u8) *
			MLXSW_CORE_RES_GET(mlxsw_core, MAX_LAG) *
			MLXSW_CORE_RES_GET(mlxsw_core, MAX_LAG_MEMBERS);
		mlxsw_core->lag.mapping = kzalloc(alloc_size, GFP_KERNEL);
		if (!mlxsw_core->lag.mapping) {
			err = -ENOMEM;
@@ -1615,7 +1617,7 @@ EXPORT_SYMBOL(mlxsw_core_skb_receive);
static int mlxsw_core_lag_mapping_index(struct mlxsw_core *mlxsw_core,
					u16 lag_id, u8 port_index)
{
	return mlxsw_core->resources.max_ports_in_lag * lag_id +
	return MLXSW_CORE_RES_GET(mlxsw_core, MAX_LAG_MEMBERS) * lag_id +
	       port_index;
}

@@ -1644,7 +1646,7 @@ void mlxsw_core_lag_mapping_clear(struct mlxsw_core *mlxsw_core,
{
	int i;

	for (i = 0; i < mlxsw_core->resources.max_ports_in_lag; i++) {
	for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_core, MAX_LAG_MEMBERS); i++) {
		int index = mlxsw_core_lag_mapping_index(mlxsw_core,
							 lag_id, i);

@@ -1654,11 +1656,19 @@ void mlxsw_core_lag_mapping_clear(struct mlxsw_core *mlxsw_core,
}
EXPORT_SYMBOL(mlxsw_core_lag_mapping_clear);

struct mlxsw_resources *mlxsw_core_resources_get(struct mlxsw_core *mlxsw_core)
bool mlxsw_core_res_valid(struct mlxsw_core *mlxsw_core,
			  enum mlxsw_res_id res_id)
{
	return &mlxsw_core->resources;
	return mlxsw_res_valid(&mlxsw_core->res, res_id);
}
EXPORT_SYMBOL(mlxsw_core_resources_get);
EXPORT_SYMBOL(mlxsw_core_res_valid);

u64 mlxsw_core_res_get(struct mlxsw_core *mlxsw_core,
		       enum mlxsw_res_id res_id)
{
	return mlxsw_res_get(&mlxsw_core->res, res_id);
}
EXPORT_SYMBOL(mlxsw_core_res_get);

int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core,
			 struct mlxsw_core_port *mlxsw_core_port, u8 local_port,
+11 −33
Original line number Diff line number Diff line
@@ -48,8 +48,8 @@

#include "trap.h"
#include "reg.h"

#include "cmd.h"
#include "resources.h"

#define MLXSW_MODULE_ALIAS_PREFIX "mlxsw-driver-"
#define MODULE_MLXSW_DRIVER_ALIAS(kind)	\
@@ -266,45 +266,23 @@ struct mlxsw_driver {
	const struct mlxsw_config_profile *profile;
};

struct mlxsw_resources {
	u32	max_span_valid:1,
		max_lag_valid:1,
		max_ports_in_lag_valid:1,
		kvd_size_valid:1,
		kvd_single_min_size_valid:1,
		kvd_double_min_size_valid:1,
		max_virtual_routers_valid:1,
		max_system_ports_valid:1,
		max_vlan_groups_valid:1,
		max_regions_valid:1,
		max_rif_valid:1;
	u8      max_span;
	u8	max_lag;
	u8	max_ports_in_lag;
	u32	kvd_size;
	u32	kvd_single_min_size;
	u32	kvd_double_min_size;
	u16     max_virtual_routers;
	u16	max_system_ports;
	u16	max_vlan_groups;
	u16	max_regions;
	u16	max_rif;
bool mlxsw_core_res_valid(struct mlxsw_core *mlxsw_core,
			  enum mlxsw_res_id res_id);

	/* Internal resources.
	 * Determined by the SW, not queried from the HW.
	 */
	u32	kvd_single_size;
	u32	kvd_double_size;
	u32	kvd_linear_size;
};
#define MLXSW_CORE_RES_VALID(res, short_res_id)			\
	mlxsw_core_res_valid(res, MLXSW_RES_ID_##short_res_id)

u64 mlxsw_core_res_get(struct mlxsw_core *mlxsw_core,
		       enum mlxsw_res_id res_id);

struct mlxsw_resources *mlxsw_core_resources_get(struct mlxsw_core *mlxsw_core);
#define MLXSW_CORE_RES_GET(res, short_res_id)			\
	mlxsw_core_res_get(res, MLXSW_RES_ID_##short_res_id)

struct mlxsw_bus {
	const char *kind;
	int (*init)(void *bus_priv, struct mlxsw_core *mlxsw_core,
		    const struct mlxsw_config_profile *profile,
		    struct mlxsw_resources *resources);
		    struct mlxsw_res *res);
	void (*fini)(void *bus_priv);
	bool (*skb_transmit_busy)(void *bus_priv,
				  const struct mlxsw_tx_info *tx_info);
+28 −22
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ struct mlxsw_item {
};

static inline unsigned int
__mlxsw_item_offset(struct mlxsw_item *item, unsigned short index,
__mlxsw_item_offset(const struct mlxsw_item *item, unsigned short index,
		    size_t typesize)
{
	BUG_ON(index && !item->step);
@@ -72,7 +72,8 @@ __mlxsw_item_offset(struct mlxsw_item *item, unsigned short index,
		typesize);
}

static inline u16 __mlxsw_item_get16(char *buf, struct mlxsw_item *item,
static inline u16 __mlxsw_item_get16(const char *buf,
				     const struct mlxsw_item *item,
				     unsigned short index)
{
	unsigned int offset = __mlxsw_item_offset(item, index, sizeof(u16));
@@ -87,7 +88,7 @@ static inline u16 __mlxsw_item_get16(char *buf, struct mlxsw_item *item,
	return tmp;
}

static inline void __mlxsw_item_set16(char *buf, struct mlxsw_item *item,
static inline void __mlxsw_item_set16(char *buf, const struct mlxsw_item *item,
				      unsigned short index, u16 val)
{
	unsigned int offset = __mlxsw_item_offset(item, index,
@@ -105,7 +106,8 @@ static inline void __mlxsw_item_set16(char *buf, struct mlxsw_item *item,
	b[offset] = cpu_to_be16(tmp);
}

static inline u32 __mlxsw_item_get32(char *buf, struct mlxsw_item *item,
static inline u32 __mlxsw_item_get32(const char *buf,
				     const struct mlxsw_item *item,
				     unsigned short index)
{
	unsigned int offset = __mlxsw_item_offset(item, index, sizeof(u32));
@@ -120,7 +122,7 @@ static inline u32 __mlxsw_item_get32(char *buf, struct mlxsw_item *item,
	return tmp;
}

static inline void __mlxsw_item_set32(char *buf, struct mlxsw_item *item,
static inline void __mlxsw_item_set32(char *buf, const struct mlxsw_item *item,
				      unsigned short index, u32 val)
{
	unsigned int offset = __mlxsw_item_offset(item, index,
@@ -138,7 +140,8 @@ static inline void __mlxsw_item_set32(char *buf, struct mlxsw_item *item,
	b[offset] = cpu_to_be32(tmp);
}

static inline u64 __mlxsw_item_get64(char *buf, struct mlxsw_item *item,
static inline u64 __mlxsw_item_get64(const char *buf,
				     const struct mlxsw_item *item,
				     unsigned short index)
{
	unsigned int offset = __mlxsw_item_offset(item, index, sizeof(u64));
@@ -153,7 +156,7 @@ static inline u64 __mlxsw_item_get64(char *buf, struct mlxsw_item *item,
	return tmp;
}

static inline void __mlxsw_item_set64(char *buf, struct mlxsw_item *item,
static inline void __mlxsw_item_set64(char *buf, const struct mlxsw_item *item,
				      unsigned short index, u64 val)
{
	unsigned int offset = __mlxsw_item_offset(item, index, sizeof(u64));
@@ -170,8 +173,8 @@ static inline void __mlxsw_item_set64(char *buf, struct mlxsw_item *item,
	b[offset] = cpu_to_be64(tmp);
}

static inline void __mlxsw_item_memcpy_from(char *buf, char *dst,
					    struct mlxsw_item *item,
static inline void __mlxsw_item_memcpy_from(const char *buf, char *dst,
					    const struct mlxsw_item *item,
					    unsigned short index)
{
	unsigned int offset = __mlxsw_item_offset(item, index, sizeof(char));
@@ -180,7 +183,7 @@ static inline void __mlxsw_item_memcpy_from(char *buf, char *dst,
}

static inline void __mlxsw_item_memcpy_to(char *buf, const char *src,
					  struct mlxsw_item *item,
					  const struct mlxsw_item *item,
					  unsigned short index)
{
	unsigned int offset = __mlxsw_item_offset(item, index, sizeof(char));
@@ -189,7 +192,8 @@ static inline void __mlxsw_item_memcpy_to(char *buf, const char *src,
}

static inline u16
__mlxsw_item_bit_array_offset(struct mlxsw_item *item, u16 index, u8 *shift)
__mlxsw_item_bit_array_offset(const struct mlxsw_item *item,
			      u16 index, u8 *shift)
{
	u16 max_index, be_index;
	u16 offset;		/* byte offset inside the array */
@@ -212,7 +216,8 @@ __mlxsw_item_bit_array_offset(struct mlxsw_item *item, u16 index, u8 *shift)
	return item->offset + offset;
}

static inline u8 __mlxsw_item_bit_array_get(char *buf, struct mlxsw_item *item,
static inline u8 __mlxsw_item_bit_array_get(const char *buf,
					    const struct mlxsw_item *item,
					    u16 index)
{
	u8 shift, tmp;
@@ -224,7 +229,8 @@ static inline u8 __mlxsw_item_bit_array_get(char *buf, struct mlxsw_item *item,
	return tmp;
}

static inline void __mlxsw_item_bit_array_set(char *buf, struct mlxsw_item *item,
static inline void __mlxsw_item_bit_array_set(char *buf,
					      const struct mlxsw_item *item,
					      u16 index, u8 val)
{
	u8 shift, tmp;
@@ -254,7 +260,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.size = {.bits = _sizebits,},						\
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline u16 mlxsw_##_type##_##_cname##_##_iname##_get(char *buf)		\
static inline u16 mlxsw_##_type##_##_cname##_##_iname##_get(const char *buf)	\
{										\
	return __mlxsw_item_get16(buf, &__ITEM_NAME(_type, _cname, _iname), 0);	\
}										\
@@ -275,7 +281,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline u16								\
mlxsw_##_type##_##_cname##_##_iname##_get(char *buf, unsigned short index)	\
mlxsw_##_type##_##_cname##_##_iname##_get(const char *buf, unsigned short index)\
{										\
	return __mlxsw_item_get16(buf, &__ITEM_NAME(_type, _cname, _iname),	\
				  index);					\
@@ -295,7 +301,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.size = {.bits = _sizebits,},						\
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline u32 mlxsw_##_type##_##_cname##_##_iname##_get(char *buf)		\
static inline u32 mlxsw_##_type##_##_cname##_##_iname##_get(const char *buf)	\
{										\
	return __mlxsw_item_get32(buf, &__ITEM_NAME(_type, _cname, _iname), 0);	\
}										\
@@ -316,7 +322,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline u32								\
mlxsw_##_type##_##_cname##_##_iname##_get(char *buf, unsigned short index)	\
mlxsw_##_type##_##_cname##_##_iname##_get(const char *buf, unsigned short index)\
{										\
	return __mlxsw_item_get32(buf, &__ITEM_NAME(_type, _cname, _iname),	\
				  index);					\
@@ -336,7 +342,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.size = {.bits = _sizebits,},						\
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline u64 mlxsw_##_type##_##_cname##_##_iname##_get(char *buf)		\
static inline u64 mlxsw_##_type##_##_cname##_##_iname##_get(const char *buf)	\
{										\
	return __mlxsw_item_get64(buf, &__ITEM_NAME(_type, _cname, _iname), 0);	\
}										\
@@ -357,7 +363,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline u64								\
mlxsw_##_type##_##_cname##_##_iname##_get(char *buf, unsigned short index)	\
mlxsw_##_type##_##_cname##_##_iname##_get(const char *buf, unsigned short index)\
{										\
	return __mlxsw_item_get64(buf, &__ITEM_NAME(_type, _cname, _iname),	\
				  index);					\
@@ -377,7 +383,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline void								\
mlxsw_##_type##_##_cname##_##_iname##_memcpy_from(char *buf, char *dst)		\
mlxsw_##_type##_##_cname##_##_iname##_memcpy_from(const char *buf, char *dst)	\
{										\
	__mlxsw_item_memcpy_from(buf, dst,					\
				 &__ITEM_NAME(_type, _cname, _iname), 0);	\
@@ -399,7 +405,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline void								\
mlxsw_##_type##_##_cname##_##_iname##_memcpy_from(char *buf,			\
mlxsw_##_type##_##_cname##_##_iname##_memcpy_from(const char *buf,		\
						  unsigned short index,		\
						  char *dst)			\
{										\
@@ -424,7 +430,7 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = { \
	.name = #_type "_" #_cname "_" #_iname,					\
};										\
static inline u8								\
mlxsw_##_type##_##_cname##_##_iname##_get(char *buf, u16 index)			\
mlxsw_##_type##_##_cname##_##_iname##_get(const char *buf, u16 index)		\
{										\
	return __mlxsw_item_bit_array_get(buf,					\
					  &__ITEM_NAME(_type, _cname, _iname),	\
+39 −103
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@
#include "core.h"
#include "cmd.h"
#include "port.h"
#include "resources.h"

static const char mlxsw_pci_driver_name[] = "mlxsw_pci";

@@ -238,8 +239,9 @@ static bool mlxsw_pci_elem_hw_owned(struct mlxsw_pci_queue *q, bool owner_bit)
	return owner_bit != !!(q->consumer_counter & q->count);
}

static char *mlxsw_pci_queue_sw_elem_get(struct mlxsw_pci_queue *q,
					 u32 (*get_elem_owner_func)(char *))
static char *
mlxsw_pci_queue_sw_elem_get(struct mlxsw_pci_queue *q,
			    u32 (*get_elem_owner_func)(const char *))
{
	struct mlxsw_pci_queue_elem_info *elem_info;
	char *elem;
@@ -1154,76 +1156,8 @@ mlxsw_pci_config_profile_swid_config(struct mlxsw_pci *mlxsw_pci,
	mlxsw_cmd_mbox_config_profile_swid_config_mask_set(mbox, index, mask);
}

#define MLXSW_RESOURCES_TABLE_END_ID 0xffff
#define MLXSW_MAX_SPAN_ID 0x2420
#define MLXSW_MAX_LAG_ID 0x2520
#define MLXSW_MAX_PORTS_IN_LAG_ID 0x2521
#define MLXSW_KVD_SIZE_ID 0x1001
#define MLXSW_KVD_SINGLE_MIN_SIZE_ID 0x1002
#define MLXSW_KVD_DOUBLE_MIN_SIZE_ID 0x1003
#define MLXSW_MAX_VIRTUAL_ROUTERS_ID 0x2C01
#define MLXSW_MAX_SYSTEM_PORT_ID 0x2502
#define MLXSW_MAX_VLAN_GROUPS_ID 0x2906
#define MLXSW_MAX_REGIONS_ID 0x2901
#define MLXSW_MAX_RIF_ID 0x2C02
#define MLXSW_RESOURCES_QUERY_MAX_QUERIES 100
#define MLXSW_RESOURCES_PER_QUERY 32

static void mlxsw_pci_resources_query_parse(int id, u64 val,
					    struct mlxsw_resources *resources)
{
	switch (id) {
	case MLXSW_MAX_SPAN_ID:
		resources->max_span = val;
		resources->max_span_valid = 1;
		break;
	case MLXSW_MAX_LAG_ID:
		resources->max_lag = val;
		resources->max_lag_valid = 1;
		break;
	case MLXSW_MAX_PORTS_IN_LAG_ID:
		resources->max_ports_in_lag = val;
		resources->max_ports_in_lag_valid = 1;
		break;
	case MLXSW_KVD_SIZE_ID:
		resources->kvd_size = val;
		resources->kvd_size_valid = 1;
		break;
	case MLXSW_KVD_SINGLE_MIN_SIZE_ID:
		resources->kvd_single_min_size = val;
		resources->kvd_single_min_size_valid = 1;
		break;
	case MLXSW_KVD_DOUBLE_MIN_SIZE_ID:
		resources->kvd_double_min_size = val;
		resources->kvd_double_min_size_valid = 1;
		break;
	case MLXSW_MAX_VIRTUAL_ROUTERS_ID:
		resources->max_virtual_routers = val;
		resources->max_virtual_routers_valid = 1;
		break;
	case MLXSW_MAX_SYSTEM_PORT_ID:
		resources->max_system_ports = val;
		resources->max_system_ports_valid = 1;
		break;
	case MLXSW_MAX_VLAN_GROUPS_ID:
		resources->max_vlan_groups = val;
		resources->max_vlan_groups_valid = 1;
		break;
	case MLXSW_MAX_REGIONS_ID:
		resources->max_regions = val;
		resources->max_regions_valid = 1;
		break;
	case MLXSW_MAX_RIF_ID:
		resources->max_rif = val;
		resources->max_rif_valid = 1;
		break;
	default:
		break;
	}
}

static int mlxsw_pci_resources_query(struct mlxsw_pci *mlxsw_pci, char *mbox,
				     struct mlxsw_resources *resources,
				     struct mlxsw_res *res,
				     u8 query_enabled)
{
	int index, i;
@@ -1237,19 +1171,20 @@ static int mlxsw_pci_resources_query(struct mlxsw_pci *mlxsw_pci, char *mbox,

	mlxsw_cmd_mbox_zero(mbox);

	for (index = 0; index < MLXSW_RESOURCES_QUERY_MAX_QUERIES; index++) {
	for (index = 0; index < MLXSW_CMD_QUERY_RESOURCES_MAX_QUERIES;
	     index++) {
		err = mlxsw_cmd_query_resources(mlxsw_pci->core, mbox, index);
		if (err)
			return err;

		for (i = 0; i < MLXSW_RESOURCES_PER_QUERY; i++) {
		for (i = 0; i < MLXSW_CMD_QUERY_RESOURCES_PER_QUERY; i++) {
			id = mlxsw_cmd_mbox_query_resource_id_get(mbox, i);
			data = mlxsw_cmd_mbox_query_resource_data_get(mbox, i);

			if (id == MLXSW_RESOURCES_TABLE_END_ID)
			if (id == MLXSW_CMD_QUERY_RESOURCES_TABLE_END_ID)
				return 0;

			mlxsw_pci_resources_query_parse(id, data, resources);
			mlxsw_res_parse(res, id, data);
		}
	}

@@ -1259,13 +1194,14 @@ static int mlxsw_pci_resources_query(struct mlxsw_pci *mlxsw_pci, char *mbox,
	return -EIO;
}

static int mlxsw_pci_profile_get_kvd_sizes(const struct mlxsw_config_profile *profile,
					   struct mlxsw_resources *resources)
static int
mlxsw_pci_profile_get_kvd_sizes(const struct mlxsw_config_profile *profile,
				struct mlxsw_res *res)
{
	u32 singles_size, doubles_size, linear_size;
	u32 single_size, double_size, linear_size;

	if (!resources->kvd_single_min_size_valid ||
	    !resources->kvd_double_min_size_valid ||
	if (!MLXSW_RES_VALID(res, KVD_SINGLE_MIN_SIZE) ||
	    !MLXSW_RES_VALID(res, KVD_DOUBLE_MIN_SIZE) ||
	    !profile->used_kvd_split_data)
		return -EIO;

@@ -1277,31 +1213,31 @@ static int mlxsw_pci_profile_get_kvd_sizes(const struct mlxsw_config_profile *pr
	 * Both sizes must be a multiplications of the
	 * granularity from the profile.
	 */
	doubles_size = (resources->kvd_size - linear_size);
	doubles_size *= profile->kvd_hash_double_parts;
	doubles_size /= (profile->kvd_hash_double_parts +
			 profile->kvd_hash_single_parts);
	doubles_size /= profile->kvd_hash_granularity;
	doubles_size *= profile->kvd_hash_granularity;
	singles_size = resources->kvd_size - doubles_size -
	double_size = MLXSW_RES_GET(res, KVD_SIZE) - linear_size;
	double_size *= profile->kvd_hash_double_parts;
	double_size /= profile->kvd_hash_double_parts +
		       profile->kvd_hash_single_parts;
	double_size /= profile->kvd_hash_granularity;
	double_size *= profile->kvd_hash_granularity;
	single_size = MLXSW_RES_GET(res, KVD_SIZE) - double_size -
		      linear_size;

	/* Check results are legal. */
	if (singles_size < resources->kvd_single_min_size ||
	    doubles_size < resources->kvd_double_min_size ||
	    resources->kvd_size < linear_size)
	if (single_size < MLXSW_RES_GET(res, KVD_SINGLE_MIN_SIZE) ||
	    double_size < MLXSW_RES_GET(res, KVD_DOUBLE_MIN_SIZE) ||
	    MLXSW_RES_GET(res, KVD_SIZE) < linear_size)
		return -EIO;

	resources->kvd_single_size = singles_size;
	resources->kvd_double_size = doubles_size;
	resources->kvd_linear_size = linear_size;
	MLXSW_RES_SET(res, KVD_SINGLE_SIZE, single_size);
	MLXSW_RES_SET(res, KVD_DOUBLE_SIZE, double_size);
	MLXSW_RES_SET(res, KVD_LINEAR_SIZE, linear_size);

	return 0;
}

static int mlxsw_pci_config_profile(struct mlxsw_pci *mlxsw_pci, char *mbox,
				    const struct mlxsw_config_profile *profile,
				    struct mlxsw_resources *resources)
				    struct mlxsw_res *res)
{
	int i;
	int err;
@@ -1390,22 +1326,22 @@ static int mlxsw_pci_config_profile(struct mlxsw_pci *mlxsw_pci, char *mbox,
		mlxsw_cmd_mbox_config_profile_adaptive_routing_group_cap_set(
			mbox, profile->adaptive_routing_group_cap);
	}
	if (resources->kvd_size_valid) {
		err = mlxsw_pci_profile_get_kvd_sizes(profile, resources);
	if (MLXSW_RES_VALID(res, KVD_SIZE)) {
		err = mlxsw_pci_profile_get_kvd_sizes(profile, res);
		if (err)
			return err;

		mlxsw_cmd_mbox_config_profile_set_kvd_linear_size_set(mbox, 1);
		mlxsw_cmd_mbox_config_profile_kvd_linear_size_set(mbox,
						resources->kvd_linear_size);
					MLXSW_RES_GET(res, KVD_LINEAR_SIZE));
		mlxsw_cmd_mbox_config_profile_set_kvd_hash_single_size_set(mbox,
									   1);
		mlxsw_cmd_mbox_config_profile_kvd_hash_single_size_set(mbox,
						resources->kvd_single_size);
					MLXSW_RES_GET(res, KVD_SINGLE_SIZE));
		mlxsw_cmd_mbox_config_profile_set_kvd_hash_double_size_set(
								mbox, 1);
		mlxsw_cmd_mbox_config_profile_kvd_hash_double_size_set(mbox,
						resources->kvd_double_size);
					MLXSW_RES_GET(res, KVD_DOUBLE_SIZE));
	}

	for (i = 0; i < MLXSW_CONFIG_PROFILE_SWID_COUNT; i++)
@@ -1543,7 +1479,7 @@ static void mlxsw_pci_mbox_free(struct mlxsw_pci *mlxsw_pci,

static int mlxsw_pci_init(void *bus_priv, struct mlxsw_core *mlxsw_core,
			  const struct mlxsw_config_profile *profile,
			  struct mlxsw_resources *resources)
			  struct mlxsw_res *res)
{
	struct mlxsw_pci *mlxsw_pci = bus_priv;
	struct pci_dev *pdev = mlxsw_pci->pdev;
@@ -1602,12 +1538,12 @@ static int mlxsw_pci_init(void *bus_priv, struct mlxsw_core *mlxsw_core,
	if (err)
		goto err_boardinfo;

	err = mlxsw_pci_resources_query(mlxsw_pci, mbox, resources,
	err = mlxsw_pci_resources_query(mlxsw_pci, mbox, res,
					profile->resource_query_enable);
	if (err)
		goto err_query_resources;

	err = mlxsw_pci_config_profile(mlxsw_pci, mbox, profile, resources);
	err = mlxsw_pci_config_profile(mlxsw_pci, mbox, profile, res);
	if (err)
		goto err_config_profile;

Loading