/*
 * Copyright © 2025 Intel Corporation
 * SPDX-License-Identifier: MIT
 */

#include "intel_tools.h"

#include "compiler/brw_disasm.h"
#include "compiler/brw_isa_info.h"
#ifdef INTEL_USE_ELK
#include "compiler/elk/elk_disasm.h"
#include "compiler/elk/elk_isa_info.h"
#endif
#include "dev/intel_device_info.h"

static void
not_supported(const struct intel_device_info *devinfo)
{
   fprintf(stderr, "ERROR: Tool compiled without support for Gfx version %d.\n",
           devinfo->ver);
   exit(EXIT_FAILURE);
}

void
intel_disassemble(const struct intel_device_info *devinfo,
                  const void *assembly, int start, FILE *out)
{
      if (devinfo->ver >= 9) {
         struct brw_isa_info isa;
         brw_init_isa_info(&isa, devinfo);
         brw_disassemble_with_errors(&isa, assembly, start, NULL, out);
      } else {
#ifdef INTEL_USE_ELK
         struct elk_isa_info isa;
         elk_init_isa_info(&isa, devinfo);
         elk_disassemble_with_errors(&isa, assembly, start, out);
#else
         not_supported(devinfo);
#endif
      }
}

void
intel_decoder_init(struct intel_batch_decode_ctx *ctx,
                   struct intel_isa_info *isa_info,
                   const struct intel_device_info *devinfo,
                   FILE *fp, enum intel_batch_decode_flags flags,
                   const char *xml_path,
                   struct intel_batch_decode_bo (*get_bo)(void *, bool, uint64_t),
                   unsigned (*get_state_size)(void *, uint64_t, uint64_t),
                   void *user_data)
{
   if (devinfo->ver >= 9) {
      struct brw_isa_info *isa = &isa_info->brw_isa;
      brw_init_isa_info(isa, devinfo);
      intel_batch_decode_ctx_init_brw(ctx, isa, devinfo, fp,
                                      flags, xml_path, get_bo, get_state_size, user_data);
   } else {
#ifdef INTEL_USE_ELK
      struct elk_isa_info *isa = &isa_info->elk_isa;
      elk_init_isa_info(isa, devinfo);
      intel_batch_decode_ctx_init_elk(ctx, isa, devinfo, fp,
                                      flags, xml_path, get_bo, get_state_size, user_data);
#else
      not_supported(devinfo);
#endif
   }
}
