# 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",
    "//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",
      "//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",
      "//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",
  ]
}
