#
# Copyright (c) 2018 The Fuchsia Authors.
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

import("//build/config/fuchsia/rules.gni")
import("//build/package.gni")
import("//garnet/tools/cipd.gni")

driver_module("ath10k_driver") {
  output_name = "ath10k"

  sources = [
    "ahb.h",
    "bmi.c",
    "bmi.h",
    "ce.c",
    "ce.h",
    "core.c",
    "core.h",
    "debug.h",
    "hif.h",
    "htc.c",
    "htc.h",
    "htt_rx.c",
    "htt_tx.c",
    "htt.c",
    "htt.h",
    "hw.c",
    "hw.h",
    "ieee80211.h",
    "mac.c",
    "mac.h",
    "macros.h",
    "msg_buf.c",
    "msg_buf.h",
    "p2p.h",
    "pci.c",
    "pci.h",
    "rx_desc.h",
    "sparse_array.c",
    "sparse_array.h",
    "swap.c",
    "swap.h",
    "targaddrs.h",
    "testmode.h",
    "thermal.h",
    "txrx.c",
    "txrx.h",
    "wmi.c",
    "wmi.h",
    "wmi-ops.h",
    "wmi-tlv.c",
    "wmi-tlv.h",
    "wow.h",
  ]

  deps = [
    "//garnet/lib/wlan/protocol",
    "//zircon/public/lib/ddk",
    "//zircon/public/lib/driver",
    "//zircon/public/lib/sync",
    "//zircon/public/lib/zx",
  ]

  configs += [ "//build/config/fuchsia:enable_zircon_asserts" ]
}

if (internal_access) {
  all_fw_files = [
    "QCA4019/hw1.0/board-2.bin",
    "QCA4019/hw1.0/firmware-5.bin",
    "QCA6174/hw2.1/board-2.bin",
    "QCA6174/hw2.1/board.bin",
    "QCA6174/hw2.1/firmware-5.bin",
    "QCA6174/hw3.0/board-2.bin",
    "QCA6174/hw3.0/board.bin",
    "QCA6174/hw3.0/firmware-4.bin",
    "QCA6174/hw3.0/firmware-6.bin",
    "QCA9377/hw1.0/board-2.bin",
    "QCA9377/hw1.0/board.bin",
    "QCA9377/hw1.0/firmware-5.bin",
    "QCA9887/hw1.0/board.bin",
    "QCA9887/hw1.0/firmware-5.bin",
    "QCA9888/hw2.0/board-2.bin",
    "QCA9888/hw2.0/firmware-5.bin",
    "QCA988X/hw2.0/board.bin",
    "QCA988X/hw2.0/firmware-4.bin",
    "QCA988X/hw2.0/firmware-5.bin",
    "QCA9984/hw1.0/board-2.bin",
    "QCA9984/hw1.0/firmware-5.bin",
    "QCA99X0/hw2.0/board.bin",
    "QCA99X0/hw2.0/firmware-5.bin",
  ]

  foreach(fw_file, all_fw_files) {
    copy("ath10k-firmware-copy-" + fw_file) {
      sources = [
        "firmware/" + fw_file
      ]
      outputs = [
        "$root_out_dir/firmware/ath10k/" + fw_file
      ]
    }
  }
}

package("ath10k") {
  deprecated_system_image = true

  deps = [
    ":ath10k_driver",
  ]

  drivers = [ {
        name = "ath10k.so"
      } ]

  if (internal_access) {
    libraries = []

    foreach(fw_file, all_fw_files) {
      deps += [
        # The copy step has to be in the shared-library toolchain to use the
        # expected output directory, since we treat firmware blobs as if they
        # were libraries which always use the shared-library toolchain to build.
        ":ath10k-firmware-copy-" + fw_file + "($shlib_toolchain)",
      ]

      libraries += [
        {
          name = "firmware/ath10k/" + fw_file
        }
      ]
    }
  }
}

executable("sparse_array_tests") {
  output_name = "sparse_array_tests"
  testonly = true
  sources = [
    "sparse_array.c",
    "sparse_array.h",
    "sparse_array_tests.cc",
  ]

  deps = [
    "//third_party/googletest:gtest_main",
  ]
}

package("ath10k_test") {
  testonly = true
  deprecated_system_image = true

  package_name = "ath10k_test"

  deps = [
    ":sparse_array_tests",
  ]

  tests = [
    {
      name = "sparse_array_tests"
    },
  ]
}
