// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_FIRMWARE_BLOB_H_
#define SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_FIRMWARE_BLOB_H_

#include <lib/ddk/device.h>
#include <lib/ddk/driver.h>
#include <lib/zx/vmo.h>

#include <map>
#include <string>
#include <tuple>

#include "device_type.h"
#include "macros.h"

namespace amlogic_decoder {

class FirmwareBlob {
 public:
  // Some of these values are used in communicating with the TEE to switch firmware; these values
  // must not change (other than possibly adding more at the end as appropriate).  These values are
  // for the first parameter to the SMC call that switches firmware via the TEE.
  enum class FirmwareType {
    // The driver code internally has some limited partial experimental support for Mpeg2, but it's
    // not exposed / accessible outside the driver.
    kDec_Mpeg12 = 0,

    // These are not used so far:
    kDec_Mpeg4_3 = 1,
    kDec_Mpeg4_4 = 2,
    kDec_Mpeg4_5 = 3,
    kDec_H263 = 4,
    kDec_Mjpeg = 5,
    kDec_Mjpeg_Multi = 6,
    kDec_Real_v8 = 7,
    kDec_Real_v9 = 8,
    kDec_Vc1 = 9,
    kDec_Avs = 10,

    // Used by this driver (for now):
    kDec_H264 = 11,

    // These are not used so far:
    kDec_H264_4k2k = 12,
    kDec_H264_4k2k_Single = 13,
    kDec_H264_Mvc = 14,

    // Used by this driver:
    kDec_H264_Multi = 15,

    // These are not used so far:
    kDec_Hevc = 16,
    kDec_Hevc_Mmu = 17,
    kDec_Vp9 = 18,

    // Used by this driver:
    kDec_Vp9_Mmu = 19,

    // These are not used so far:
    kEnc_H264 = 20,
    kEnc_Jpeg = 21,
    // kPackage = 22,  // not a firmware
    kDec_H264_Multi_Mmu = 23,
    kDec_Hevc_G12a = 24,

    // Used by this driver (for now):
    kDec_Vp9_G12a = 25,

    // These are not used so far:
    kDec_Avs2 = 26,
    kDec_Avs2_Mmu = 27,
    kDec_Avs_Gxm = 28,
    kDec_Avs_NoCabac = 29,

    // Used by this driver (for now):
    kDec_H264_Multi_Gxm = 30,

    // These are not used so far:
    kDec_H264_Mvc_Gxm = 31,
    kDec_Vc1_G12a = 32,

    kCount = 33,  // count of above packed values
  };

  // The SMC call to switch firmware via the TEE takes a second parameter that controls how the
  // firmware is specified to the HW by the TEE.
  enum class FirmwareVdecLoadMode {
    kCompatible = 0,  // Used by h264 decoder.
    kLegacy = 1,      // Not used so far.  Spelled "legency" in some other places.
    kHevc = 2,        // Used by VP9 decoder.
  };

  explicit FirmwareBlob(DeviceType device_type) : device_type_(device_type) {}
  ~FirmwareBlob();

  zx_status_t LoadFirmware(zx_device_t* device);

  zx_status_t GetFirmwareData(FirmwareType firmware_type, uint8_t** data_out, uint32_t* size_out);

  // When pre-loading the firmware via video_firmware TA, we need the whole blob.
  //
  // Requires: LoadFirmware() succeeded.
  void GetWholeBlob(uint8_t** data_out, uint32_t* size_out);

  void LoadFakeFirmwareForTesting(FirmwareType firmware_type, uint8_t* data, uint32_t size);

 private:
  struct FirmwareCode {
    uint64_t offset;
    uint32_t size;
  };

  DeviceType device_type_;
  zx::vmo vmo_;
  uintptr_t ptr_ = 0;
  uint64_t fw_size_ = 0;
  struct FirmwareKey {
    std::string cpu;
    std::string format;

    bool operator==(const FirmwareKey& other) const {
      return cpu == other.cpu && format == other.format;
    }

    bool operator<(const FirmwareKey& other) const {
      if (cpu != other.cpu) {
        return cpu < other.cpu;
      }
      return format < other.format;
    }
  };
  std::map<FirmwareKey, FirmwareCode> firmware_code_;
};

}  // namespace amlogic_decoder

#endif  // SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_FIRMWARE_BLOB_H_
