Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / drivers / net / ethernet / microchip / sparx5 / sparx5_pgid.c
blobeae819fa9486febba3587f89e09a14d8d3883183
1 // SPDX-License-Identifier: GPL-2.0+
2 #include "sparx5_main.h"
4 void sparx5_pgid_init(struct sparx5 *spx5)
6 int i;
8 for (i = 0; i < spx5->data->consts->n_pgids; i++)
9 spx5->pgid_map[i] = SPX5_PGID_FREE;
11 /* Reserved for unicast, flood control, broadcast, and CPU.
12 * These cannot be freed.
14 for (i = 0; i <= sparx5_get_pgid(spx5, PGID_CPU); i++)
15 spx5->pgid_map[i] = SPX5_PGID_RESERVED;
18 int sparx5_pgid_alloc_mcast(struct sparx5 *spx5, u16 *idx)
20 int i;
22 /* The multicast area starts at index 65, but the first 7
23 * are reserved for flood masks and CPU. Start alloc after that.
25 for (i = sparx5_get_pgid(spx5, PGID_MCAST_START);
26 i < spx5->data->consts->n_pgids; i++) {
27 if (spx5->pgid_map[i] == SPX5_PGID_FREE) {
28 spx5->pgid_map[i] = SPX5_PGID_MULTICAST;
29 *idx = i;
30 return 0;
34 return -EBUSY;
37 int sparx5_pgid_free(struct sparx5 *spx5, u16 idx)
39 if (idx <= sparx5_get_pgid(spx5, PGID_CPU) ||
40 idx >= spx5->data->consts->n_pgids)
41 return -EINVAL;
43 if (spx5->pgid_map[idx] == SPX5_PGID_FREE)
44 return -EINVAL;
46 spx5->pgid_map[idx] = SPX5_PGID_FREE;
47 return 0;
50 int sparx5_get_pgid(struct sparx5 *sparx5, int pgid)
52 return sparx5->data->consts->n_ports + pgid;