| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * Copyright (C) 2023-2024, Advanced Micro Devices, Inc. | |
| */ | |
| #ifndef _AIE2_SOLVER_H | |
| #define _AIE2_SOLVER_H | |
| #define XRS_MAX_COL 128 | |
| /* | |
| * Structure used to describe a partition. A partition is column based | |
| * allocation unit described by its start column and number of columns. | |
| */ | |
| struct aie_part { | |
| u32 start_col; | |
| u32 ncols; | |
| }; | |
| /* | |
| * The QoS capabilities of a given AIE partition. | |
| */ | |
| struct aie_qos_cap { | |
| u32 opc; /* operations per cycle */ | |
| u32 dma_bw; /* DMA bandwidth */ | |
| }; | |
| /* | |
| * QoS requirement of a resource allocation. | |
| */ | |
| struct aie_qos { | |
| u32 gops; /* Giga operations */ | |
| u32 fps; /* Frames per second */ | |
| u32 dma_bw; /* DMA bandwidth */ | |
| u32 latency; /* Frame response latency */ | |
| u32 exec_time; /* Frame execution time */ | |
| u32 priority; /* Request priority */ | |
| }; | |
| /* | |
| * Structure used to describe a relocatable CDO (Configuration Data Object). | |
| */ | |
| struct cdo_parts { | |
| u32 *start_cols; /* Start column array */ | |
| u32 cols_len; /* Length of start column array */ | |
| u32 ncols; /* # of column */ | |
| struct aie_qos_cap qos_cap; /* CDO QoS capabilities */ | |
| }; | |
| /* | |
| * Structure used to describe a request to allocate. | |
| */ | |
| struct alloc_requests { | |
| u64 rid; | |
| struct cdo_parts cdo; | |
| struct aie_qos rqos; /* Requested QoS */ | |
| }; | |
| /* | |
| * Load callback argument | |
| */ | |
| struct xrs_action_load { | |
| u32 rid; | |
| struct aie_part part; | |
| }; | |
| /* | |
| * Define the power level available | |
| * | |
| * POWER_LEVEL_MIN: | |
| * Lowest power level. Usually set when all actions are unloaded. | |
| * | |
| * POWER_LEVEL_n | |
| * Power levels 0 - n, is a step increase in system frequencies | |
| */ | |
| enum power_level { | |
| POWER_LEVEL_MIN = 0x0, | |
| POWER_LEVEL_0 = 0x1, | |
| POWER_LEVEL_1 = 0x2, | |
| POWER_LEVEL_2 = 0x3, | |
| POWER_LEVEL_3 = 0x4, | |
| POWER_LEVEL_4 = 0x5, | |
| POWER_LEVEL_5 = 0x6, | |
| POWER_LEVEL_6 = 0x7, | |
| POWER_LEVEL_7 = 0x8, | |
| POWER_LEVEL_NUM, | |
| }; | |
| /* | |
| * Structure used to describe the frequency table. | |
| * Resource solver chooses the frequency from the table | |
| * to meet the QOS requirements. | |
| */ | |
| struct clk_list_info { | |
| u32 num_levels; /* available power levels */ | |
| u32 cu_clk_list[POWER_LEVEL_NUM]; /* available aie clock frequencies in Mhz*/ | |
| }; | |
| struct xrs_action_ops { | |
| int (*load)(void *cb_arg, struct xrs_action_load *action); | |
| int (*unload)(void *cb_arg); | |
| int (*set_dft_dpm_level)(struct drm_device *ddev, u32 level); | |
| }; | |
| /* | |
| * Structure used to describe information for solver during initialization. | |
| */ | |
| struct init_config { | |
| u32 total_col; | |
| u32 sys_eff_factor; /* system efficiency factor */ | |
| u32 latency_adj; /* latency adjustment in ms */ | |
| struct clk_list_info clk_list; /* List of frequencies available in system */ | |
| struct drm_device *ddev; | |
| struct xrs_action_ops *actions; | |
| }; | |
| /* | |
| * xrsm_init() - Register resource solver. Resource solver client needs | |
| * to call this function to register itself. | |
| * | |
| * @cfg: The system metrics for resource solver to use | |
| * | |
| * Return: A resource solver handle | |
| * | |
| * Note: We should only create one handle per AIE array to be managed. | |
| */ | |
| void *xrsm_init(struct init_config *cfg); | |
| /* | |
| * xrs_allocate_resource() - Request to allocate resources for a given context | |
| * and a partition metadata. (See struct part_meta) | |
| * | |
| * @hdl: Resource solver handle obtained from xrs_init() | |
| * @req: Input to the Resource solver including request id | |
| * and partition metadata. | |
| * @cb_arg: callback argument pointer | |
| * | |
| * Return: 0 when successful. | |
| * Or standard error number when failing | |
| * | |
| * Note: | |
| * There is no lock mechanism inside resource solver. So it is | |
| * the caller's responsibility to lock down XCLBINs and grab | |
| * necessary lock. | |
| */ | |
| int xrs_allocate_resource(void *hdl, struct alloc_requests *req, void *cb_arg); | |
| /* | |
| * xrs_release_resource() - Request to free resources for a given context. | |
| * | |
| * @hdl: Resource solver handle obtained from xrs_init() | |
| * @rid: The Request ID to identify the requesting context | |
| */ | |
| int xrs_release_resource(void *hdl, u64 rid); | |
| #endif /* _AIE2_SOLVER_H */ |