1 // SPDX-License-Identifier: GPL-2.0+
2 #include "sparx5_main.h"
4 void sparx5_pgid_init(struct sparx5
*spx5
)
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
)
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
;
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
)
43 if (spx5
->pgid_map
[idx
] == SPX5_PGID_FREE
)
46 spx5
->pgid_map
[idx
] = SPX5_PGID_FREE
;
50 int sparx5_get_pgid(struct sparx5
*sparx5
, int pgid
)
52 return sparx5
->data
->consts
->n_ports
+ pgid
;