| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- /* 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 */
|