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