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

#ifndef INC_EXT_PROF_PROTOCOL_H_
#define INC_EXT_PROF_PROTOCOL_H_

#include <stdint.h>

// Traced API domains
typedef enum {
  ACTIVITY_DOMAIN_HSA_API = 0,                        // HSA API domain
  ACTIVITY_DOMAIN_HSA_OPS = 1,                        // HSA async activity domain
  ACTIVITY_DOMAIN_HIP_OPS = 2,                        // HIP async activity domain
  ACTIVITY_DOMAIN_HCC_OPS = ACTIVITY_DOMAIN_HIP_OPS,  // HCC async activity domain
  ACTIVITY_DOMAIN_HIP_VDI = ACTIVITY_DOMAIN_HIP_OPS,  // HIP VDI domain
  ACTIVITY_DOMAIN_HIP_API = 3,                        // HIP API domain
  ACTIVITY_DOMAIN_KFD_API = 4,                        // KFD API domain
  ACTIVITY_DOMAIN_EXT_API = 5,                        // External ID domain
  ACTIVITY_DOMAIN_ROCTX = 6,                          // ROCTX domain
  ACTIVITY_DOMAIN_NUMBER
} activity_domain_t;

// Extension API opcodes
typedef enum { ACTIVITY_EXT_OP_MARK = 0, ACTIVITY_EXT_OP_EXTERN_ID = 1 } activity_ext_op_t;

// API callback type
typedef void (*activity_rtapi_callback_t)(uint32_t domain, uint32_t cid, const void* data,
                                          void* arg);
typedef uint32_t activity_kind_t;
typedef uint32_t activity_op_t;

// API callback phase
typedef enum { ACTIVITY_API_PHASE_ENTER = 0, ACTIVITY_API_PHASE_EXIT = 1 } activity_api_phase_t;

// Trace record types
// Correlation id
typedef uint64_t activity_correlation_id_t;

// Activity record type
struct activity_record_t {
  uint32_t domain;                           // activity domain id
  activity_kind_t kind;                      // activity kind
  activity_op_t op;                          // activity op
  activity_correlation_id_t correlation_id;  // activity ID
  uint64_t begin_ns;                         // host begin timestamp
  uint64_t end_ns;                           // host end timestamp
  union {
    struct {
      int device_id;      // device id
      uint64_t queue_id;  // queue id
    };
    struct {
      uint32_t process_id;  // device id
      uint32_t thread_id;   // thread id
    };
    struct {
      activity_correlation_id_t external_id;  // external correlatino id
    };
  };
  union {
    size_t bytes;  // data size bytes
    const char* kernel_name;
  };
};

// Activity sync calback type
typedef void (*activity_sync_callback_t)(uint32_t cid, activity_record_t* record, const void* data,
                                         void* arg);
// Activity async calback type
typedef void (*activity_async_callback_t)(uint32_t op, activity_record_t* record, void* arg);

#endif  // INC_EXT_PROF_PROTOCOL_H_
