1 // SPDX-License-Identifier: GPL-2.0+ 2 #include "sparx5_main.h" 3 4 void sparx5_pgid_init(struct sparx5 *spx5) 5 { 6 int i; 7 8 for (i = 0; i < PGID_TABLE_SIZE; i++) 9 spx5->pgid_map[i] = SPX5_PGID_FREE; 10 11 /* Reserved for unicast, flood control, broadcast, and CPU. 12 * These cannot be freed. 13 */ 14 for (i = 0; i <= PGID_CPU; i++) 15 spx5->pgid_map[i] = SPX5_PGID_RESERVED; 16 } 17 18 int sparx5_pgid_alloc_mcast(struct sparx5 *spx5, u16 *idx) 19 { 20 int i; 21 22 /* The multicast area starts at index 65, but the first 7 23 * are reserved for flood masks and CPU. Start alloc after that. 24 */ 25 for (i = PGID_MCAST_START; i < PGID_TABLE_SIZE; i++) { 26 if (spx5->pgid_map[i] == SPX5_PGID_FREE) { 27 spx5->pgid_map[i] = SPX5_PGID_MULTICAST; 28 *idx = i; 29 return 0; 30 } 31 } 32 33 return -EBUSY; 34 } 35 36 int sparx5_pgid_free(struct sparx5 *spx5, u16 idx) 37 { 38 if (idx <= PGID_CPU || idx >= PGID_TABLE_SIZE) 39 return -EINVAL; 40 41 if (spx5->pgid_map[idx] == SPX5_PGID_FREE) 42 return -EINVAL; 43 44 spx5->pgid_map[idx] = SPX5_PGID_FREE; 45 return 0; 46 } 47