| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Copyright (C) 2020 Marvell International Ltd. |
| */ |
| |
| #ifndef _CVMX_GLOBAL_RESOURCES_T_ |
| #define _CVMX_GLOBAL_RESOURCES_T_ |
| |
| #define CVMX_GLOBAL_RESOURCES_DATA_NAME "cvmx-global-resources" |
| |
| /*In macros below abbreviation GR stands for global resources. */ |
| #define CVMX_GR_TAG_INVALID \ |
| cvmx_get_gr_tag('i', 'n', 'v', 'a', 'l', 'i', 'd', '.', '.', '.', '.', '.', '.', '.', '.', \ |
| '.') |
| /*Tag for pko que table range. */ |
| #define CVMX_GR_TAG_PKO_QUEUES \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'p', 'k', 'o', '_', 'q', 'u', 'e', 'u', 's', '.', '.', \ |
| '.') |
| /*Tag for a pko internal ports range */ |
| #define CVMX_GR_TAG_PKO_IPORTS \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'p', 'k', 'o', '_', 'i', 'p', 'o', 'r', 't', '.', '.', \ |
| '.') |
| #define CVMX_GR_TAG_FPA \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'f', 'p', 'a', '.', '.', '.', '.', '.', '.', '.', '.', \ |
| '.') |
| #define CVMX_GR_TAG_FAU \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'f', 'a', 'u', '.', '.', '.', '.', '.', '.', '.', '.', \ |
| '.') |
| #define CVMX_GR_TAG_SSO_GRP(n) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 's', 's', 'o', '_', '0', (n) + '0', '.', '.', '.', \ |
| '.', '.', '.'); |
| #define CVMX_GR_TAG_TIM(n) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 't', 'i', 'm', '_', (n) + '0', '.', '.', '.', '.', \ |
| '.', '.', '.') |
| #define CVMX_GR_TAG_CLUSTERS(x) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', (x + '0'), \ |
| '.', '.', '.') |
| #define CVMX_GR_TAG_CLUSTER_GRP(x) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'l', 'g', 'r', 'p', '_', (x + '0'), '.', '.', \ |
| '.', '.', '.') |
| #define CVMX_GR_TAG_STYLE(x) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 's', 't', 'y', 'l', 'e', '_', (x + '0'), '.', '.', \ |
| '.', '.', '.') |
| #define CVMX_GR_TAG_QPG_ENTRY(x) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'q', 'p', 'g', 'e', 't', '_', (x + '0'), '.', '.', \ |
| '.', '.', '.') |
| #define CVMX_GR_TAG_BPID(x) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'b', 'p', 'i', 'd', 's', '_', (x + '0'), '.', '.', \ |
| '.', '.', '.') |
| #define CVMX_GR_TAG_MTAG_IDX(x) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'm', 't', 'a', 'g', 'x', '_', (x + '0'), '.', '.', \ |
| '.', '.', '.') |
| #define CVMX_GR_TAG_PCAM(x, y, z) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'p', 'c', 'a', 'm', '_', (x + '0'), (y + '0'), \ |
| (z + '0'), '.', '.', '.', '.') |
| |
| #define CVMX_GR_TAG_CIU3_IDT(_n) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'i', 'u', '3', '_', ((_n) + '0'), '_', 'i', 'd', \ |
| 't', '.', '.') |
| |
| /* Allocation of the 512 SW INTSTs (in the 12 bit SW INTSN space) */ |
| #define CVMX_GR_TAG_CIU3_SWINTSN(_n) \ |
| cvmx_get_gr_tag('c', 'v', 'm', '_', 'c', 'i', 'u', '3', '_', ((_n) + '0'), '_', 's', 'w', \ |
| 'i', 's', 'n') |
| |
| #define TAG_INIT_PART(A, B, C, D, E, F, G, H) \ |
| ((((u64)(A) & 0xff) << 56) | (((u64)(B) & 0xff) << 48) | (((u64)(C) & 0xff) << 40) | \ |
| (((u64)(D) & 0xff) << 32) | (((u64)(E) & 0xff) << 24) | (((u64)(F) & 0xff) << 16) | \ |
| (((u64)(G) & 0xff) << 8) | (((u64)(H) & 0xff))) |
| |
| struct global_resource_tag { |
| u64 lo; |
| u64 hi; |
| }; |
| |
| enum cvmx_resource_err { CVMX_RESOURCE_ALLOC_FAILED = -1, CVMX_RESOURCE_ALREADY_RESERVED = -2 }; |
| |
| /* |
| * @INTERNAL |
| * Creates a tag from the specified characters. |
| */ |
| static inline struct global_resource_tag cvmx_get_gr_tag(char a, char b, char c, char d, char e, |
| char f, char g, char h, char i, char j, |
| char k, char l, char m, char n, char o, |
| char p) |
| { |
| struct global_resource_tag tag; |
| |
| tag.lo = TAG_INIT_PART(a, b, c, d, e, f, g, h); |
| tag.hi = TAG_INIT_PART(i, j, k, l, m, n, o, p); |
| return tag; |
| } |
| |
| static inline int cvmx_gr_same_tag(struct global_resource_tag gr1, struct global_resource_tag gr2) |
| { |
| return (gr1.hi == gr2.hi) && (gr1.lo == gr2.lo); |
| } |
| |
| /* |
| * @INTERNAL |
| * Creates a global resource range that can hold the specified number of |
| * elements |
| * @param tag is the tag of the range. The taga is created using the method |
| * cvmx_get_gr_tag() |
| * @param nelements is the number of elements to be held in the resource range. |
| */ |
| int cvmx_create_global_resource_range(struct global_resource_tag tag, int nelements); |
| |
| /* |
| * @INTERNAL |
| * Allocate nelements in the global resource range with the specified tag. It |
| * is assumed that prior |
| * to calling this the global resource range has already been created using |
| * cvmx_create_global_resource_range(). |
| * @param tag is the tag of the global resource range. |
| * @param nelements is the number of elements to be allocated. |
| * @param owner is a 64 bit number that identifes the owner of this range. |
| * @aligment specifes the required alignment of the returned base number. |
| * Return: returns the base of the allocated range. -1 return value indicates |
| * failure. |
| */ |
| int cvmx_allocate_global_resource_range(struct global_resource_tag tag, u64 owner, int nelements, |
| int alignment); |
| |
| /* |
| * @INTERNAL |
| * Allocate nelements in the global resource range with the specified tag. |
| * The elements allocated need not be contiguous. It is assumed that prior to |
| * calling this the global resource range has already |
| * been created using cvmx_create_global_resource_range(). |
| * @param tag is the tag of the global resource range. |
| * @param nelements is the number of elements to be allocated. |
| * @param owner is a 64 bit number that identifes the owner of the allocated |
| * elements. |
| * @param allocated_elements returns indexs of the allocated entries. |
| * Return: returns 0 on success and -1 on failure. |
| */ |
| int cvmx_resource_alloc_many(struct global_resource_tag tag, u64 owner, int nelements, |
| int allocated_elements[]); |
| int cvmx_resource_alloc_reverse(struct global_resource_tag, u64 owner); |
| /* |
| * @INTERNAL |
| * Reserve nelements starting from base in the global resource range with the |
| * specified tag. |
| * It is assumed that prior to calling this the global resource range has |
| * already been created using cvmx_create_global_resource_range(). |
| * @param tag is the tag of the global resource range. |
| * @param nelements is the number of elements to be allocated. |
| * @param owner is a 64 bit number that identifes the owner of this range. |
| * @base specifies the base start of nelements. |
| * Return: returns the base of the allocated range. -1 return value indicates |
| * failure. |
| */ |
| int cvmx_reserve_global_resource_range(struct global_resource_tag tag, u64 owner, int base, |
| int nelements); |
| /* |
| * @INTERNAL |
| * Free nelements starting at base in the global resource range with the |
| * specified tag. |
| * @param tag is the tag of the global resource range. |
| * @param base is the base number |
| * @param nelements is the number of elements that are to be freed. |
| * Return: returns 0 if successful and -1 on failure. |
| */ |
| int cvmx_free_global_resource_range_with_base(struct global_resource_tag tag, int base, |
| int nelements); |
| |
| /* |
| * @INTERNAL |
| * Free nelements with the bases specified in bases[] with the |
| * specified tag. |
| * @param tag is the tag of the global resource range. |
| * @param bases is an array containing the bases to be freed. |
| * @param nelements is the number of elements that are to be freed. |
| * Return: returns 0 if successful and -1 on failure. |
| */ |
| int cvmx_free_global_resource_range_multiple(struct global_resource_tag tag, int bases[], |
| int nelements); |
| /* |
| * @INTERNAL |
| * Free elements from the specified owner in the global resource range with the |
| * specified tag. |
| * @param tag is the tag of the global resource range. |
| * @param owner is the owner of resources that are to be freed. |
| * Return: returns 0 if successful and -1 on failure. |
| */ |
| int cvmx_free_global_resource_range_with_owner(struct global_resource_tag tag, int owner); |
| |
| /* |
| * @INTERNAL |
| * Frees all the global resources that have been created. |
| * For use only from the bootloader, when it shutdown and boots up the |
| * application or kernel. |
| */ |
| int free_global_resources(void); |
| |
| u64 cvmx_get_global_resource_owner(struct global_resource_tag tag, int base); |
| /* |
| * @INTERNAL |
| * Shows the global resource range with the specified tag. Use mainly for debug. |
| */ |
| void cvmx_show_global_resource_range(struct global_resource_tag tag); |
| |
| /* |
| * @INTERNAL |
| * Shows all the global resources. Used mainly for debug. |
| */ |
| void cvmx_global_resources_show(void); |
| |
| u64 cvmx_allocate_app_id(void); |
| u64 cvmx_get_app_id(void); |
| |
| #endif |