162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci#include "sparx5_main.h" 362306a36Sopenharmony_ci 462306a36Sopenharmony_civoid sparx5_pgid_init(struct sparx5 *spx5) 562306a36Sopenharmony_ci{ 662306a36Sopenharmony_ci int i; 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci for (i = 0; i < PGID_TABLE_SIZE; i++) 962306a36Sopenharmony_ci spx5->pgid_map[i] = SPX5_PGID_FREE; 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci /* Reserved for unicast, flood control, broadcast, and CPU. 1262306a36Sopenharmony_ci * These cannot be freed. 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci for (i = 0; i <= PGID_CPU; i++) 1562306a36Sopenharmony_ci spx5->pgid_map[i] = SPX5_PGID_RESERVED; 1662306a36Sopenharmony_ci} 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciint sparx5_pgid_alloc_mcast(struct sparx5 *spx5, u16 *idx) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci int i; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci /* The multicast area starts at index 65, but the first 7 2362306a36Sopenharmony_ci * are reserved for flood masks and CPU. Start alloc after that. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci for (i = PGID_MCAST_START; i < PGID_TABLE_SIZE; i++) { 2662306a36Sopenharmony_ci if (spx5->pgid_map[i] == SPX5_PGID_FREE) { 2762306a36Sopenharmony_ci spx5->pgid_map[i] = SPX5_PGID_MULTICAST; 2862306a36Sopenharmony_ci *idx = i; 2962306a36Sopenharmony_ci return 0; 3062306a36Sopenharmony_ci } 3162306a36Sopenharmony_ci } 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci return -EBUSY; 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciint sparx5_pgid_free(struct sparx5 *spx5, u16 idx) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci if (idx <= PGID_CPU || idx >= PGID_TABLE_SIZE) 3962306a36Sopenharmony_ci return -EINVAL; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci if (spx5->pgid_map[idx] == SPX5_PGID_FREE) 4262306a36Sopenharmony_ci return -EINVAL; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci spx5->pgid_map[idx] = SPX5_PGID_FREE; 4562306a36Sopenharmony_ci return 0; 4662306a36Sopenharmony_ci} 47