/*
 * Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
 *
 * SPDX-License-Identifier: MIT
 */

#ifndef __CL_KERNEL_INFO_AMD_H
#define __CL_KERNEL_INFO_AMD_H

#include "CL/cl_platform.h"

#ifdef __cplusplus
extern "C" {
#endif /*__cplusplus*/

typedef cl_uint cl_kernel_info_amd;

/* cl_kernel_info */
enum KernelInfoAMD {
  CL_KERNELINFO_NONE = 0x0,
  CL_KERNELINFO_SCRATCH_REGS,
  CL_KERNELINFO_WAVEFRONT_PER_SIMD,
  CL_KERNELINFO_WAVEFRONT_SIZE,
  CL_KERNELINFO_AVAILABLE_GPRS,
  CL_KERNELINFO_USED_GPRS,
  CL_KERNELINFO_AVAILABLE_LDS_SIZE,
  CL_KERNELINFO_USED_LDS_SIZE,
  CL_KERNELINFO_AVAILABLE_STACK_SIZE,
  CL_KERNELINFO_USED_STACK_SIZE,
  CL_KERNELINFO_AVAILABLE_SGPRS,
  CL_KERNELINFO_USED_SGPRS,
  CL_KERNELINFO_AVAILABLE_VGPRS,
  CL_KERNELINFO_USED_VGPRS,
  CL_KERNELINFO_LAST
};

/*! \brief Retrieves the kernel information.
 *
 *  \param kernel specifies the kernel object being queried.
 *
 *  \param device identifies a specific device in the list of devices associated
 *  with \a kernel. The list of devices is the list of devices in the OpenCL
 *  context that is associated with \a kernel. If the list of devices associated
 *  with kernel is a single device, \a device can be a NULL value.
 *
 *  \param param_name specifies the information to query.
 *
 *  \param param_value is a pointer to memory where the appropriate result
 *  being queried is returned. If \a param_value is NULL, it is ignored.
 *
 *  \param param_value_size is used to specify the size in bytes of memory
 *  pointed to by \a param_value. This size must be >= size of return type.
 *
 *  \param param_value_size_ret returns the actual size in bytes of data copied
 *  to \a param_value. If \a param_value_size_ret is NULL, it is ignored.
 *
 *  \return One of the following values:
 *  - CL_SUCCESS if the function is executed successfully
 *  - CL_INVALID_VALUE if \a param_name is not valid, or if size in bytes
 *    specified by \a param_value_size is < size of return type and
 *    \a param_value is not NULL
 *  - CL_INVALID_KERNEL if \a kernel is a not a valid program object
 */
extern CL_API_ENTRY cl_int CL_API_CALL clGetKernelInfoAMD(
    cl_kernel /* kernel */, cl_device_id /* device */, cl_kernel_info_amd /* param_name */,
    size_t /* param_value_size */, void* /* param_value */, size_t* /* param_value_size_ret */
    ) CL_API_SUFFIX__VERSION_1_0;

#ifdef __cplusplus
} /*extern "C"*/
#endif /*__cplusplus*/

#endif /*__CL_KERNEL_INFO_AMD_H*/
