# Copyright 2019 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.

import("//build/bind/bind.gni")
import("//build/config/fuchsia/rules.gni")
import("pci.gni")

group("pci") {
  deps = [
    ":bus-pci",
    ":bus-pci.proxy",
  ]
}

# The userspace PCI bus driver uses this set, as well as the
# automated tests.
source_set("user_pci") {
  visibility = [
    ":*",
    "test/:*",
  ]

  sources = [
    "allocation.cc",
    "bridge.cc",
    "bus.cc",
    "bus_device_interface.cc",
    "config.cc",
    "device.cc",
    "device_caps.cc",
    "device_irqs.cc",
    "device_protocol.cc",
    "service.cc",
    "upstream_node.cc",
  ]
  public_deps = [
    ":pci_bind",
    "//sdk/banjo/fuchsia.hardware.pci",
    "//sdk/banjo/fuchsia.hardware.pciroot",
    "//sdk/fidl/fuchsia.hardware.pci:fuchsia.hardware.pci_llcpp",
    "//src/devices/lib/driver",
    "//src/devices/pci/lib/pci",
    "//src/lib/ddk",
    "//src/lib/ddktl",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/hwreg",
    "//zircon/public/lib/pretty",
    "//zircon/public/lib/zircon-internal",
    "//zircon/public/lib/zx",
    "//zircon/public/lib/zxc",
    "//zircon/system/ulib/inspect",
    "//zircon/system/ulib/region-alloc",

    # TODO(fxbug.dev/33846): This shouldn't be here if the mmio code is actually
    # used in the test too.  Anything using that needs to be separately
    # compiled for the test using the mock version.
    "//src/devices/lib/mmio",
  ]
}

source_set("pci.proxy") {
  sources = [ "proxy.cc" ]
  public_deps = [
    ":pci_proxy_bind",
    "//sdk/banjo/fuchsia.hardware.pci",
    "//sdk/banjo/fuchsia.hardware.sysmem:fuchsia.hardware.sysmem_banjo_cpp",
    "//src/devices/lib/driver",
    "//src/devices/pci/lib/pci",
    "//src/lib/ddk",
    "//src/lib/ddktl",
    "//zircon/public/lib/hwreg",
    "//zircon/public/lib/pretty",
  ]
}

bind_rules("pci_proxy_bind") {
  disable_autobind = true
  output = "pci_proxy_bind.h"
}

bind_rules("pci_bind") {
  rules = "pci.bind"
  output = "pci_bind.h"
  tests = "pci_bind_tests.json"
  deps = [
    "//src/devices/bind/fuchsia.pciroot",
    "//src/devices/bind/fuchsia.platform",
  ]
}

if (platform_enable_user_pci) {
  driver_module("bus-pci") {
    configs += [
      "//build/config:all_source",
      "//build/config/fuchsia:enable_zircon_asserts",
    ]
    if (is_fuchsia) {
      configs += [ "//build/unification/config:zircon-migrated" ]
    }
    sources = [
      # The driver needs bind glue, unlike tests.
      "bind.cc",
    ]
    deps = [
      ":pci_bind",
      ":user_pci",
    ]
  }
} else {  # Kernel PCI
  driver_module("bus-pci") {
    configs += [
      "//build/config:all_source",
      "//build/config/fuchsia:enable_zircon_asserts",
    ]
    if (is_fuchsia) {
      configs += [ "//build/unification/config:zircon-migrated" ]
    }
    sources = [ "kpci.cc" ]
    deps = [
      ":pci_bind",
      "//sdk/banjo/fuchsia.hardware.pci",
      "//sdk/banjo/fuchsia.hardware.pciroot",
      "//sdk/banjo/fuchsia.hardware.platform.device:fuchsia.hardware.platform.device_banjo_cpp",
      "//sdk/banjo/fuchsia.hardware.sysmem:fuchsia.hardware.sysmem_banjo_cpp",
      "//src/devices/lib/driver",
      "//src/devices/lib/pci",
      "//src/devices/pci/lib/pci",
      "//src/lib/ddk",
      "//src/lib/ddktl",
      "//zircon/public/lib/fidl",
      "//zircon/public/lib/pretty",
    ]
  }
}

driver_module("bus-pci.proxy") {
  if (platform_enable_user_pci) {
    defines = [ "USERSPACE_PCI" ]
  }
  configs += [
    "//build/config:all_source",
    "//build/config/fuchsia:enable_zircon_asserts",
  ]
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  deps = [
    ":pci.proxy",
    ":pci_proxy_bind",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":pci_bind_test",
    "test:pci-driver-test",
    "test:pci-unit-test",
  ]
}
