# 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("user_pci.proxy") {
  sources = [ "device_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",
    ]
  }
  driver_module("bus-pci.proxy") {
    configs += [
      "//build/config:all_source",
      "//build/config/fuchsia:enable_zircon_asserts",
    ]
    if (is_fuchsia) {
      configs += [ "//build/unification/config:zircon-migrated" ]
    }
    deps = [
      ":pci_proxy_bind",
      ":user_pci.proxy",
    ]
  }
} else {
  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/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",
    ]
  }
  driver_module("bus-pci.proxy") {
    configs += [
      "//build/config:all_source",
      "//build/config/fuchsia:enable_zircon_asserts",
    ]
    if (is_fuchsia) {
      configs += [ "//build/unification/config:zircon-migrated" ]
    }
    sources = [ "kpci/proxy.c" ]
    deps = [
      ":pci_proxy_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",
    ]
  }
}

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