// 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.

#ifndef SRC_DEVICES_BUS_DRIVERS_PCI_UPSTREAM_NODE_H_
#define SRC_DEVICES_BUS_DRIVERS_PCI_UPSTREAM_NODE_H_

#include <sys/types.h>
#include <zircon/types.h>

#include <fbl/intrusive_double_list.h>
#include <fbl/macros.h>

#include "src/devices/bus/drivers/pci/allocation.h"
#include "src/devices/bus/drivers/pci/device.h"
#include "src/devices/bus/drivers/pci/ref_counted.h"

// UpstreamNode
//
// A class responsible for maintaining the state of a node in the graph of
// PCI/PCIe devices which can have downstream children.  UpstreamNodes are
// not instantiated directly, instead they serve as the base class of
// PCI/PCIe bridges and roots.

namespace pci {

class FakeBusDriver;
class PciAllocator;
class UpstreamNode {
 public:
  using DownstreamList = fbl::TaggedDoublyLinkedList<Device*, DownstreamListTag>;
  enum class Type { ROOT, BRIDGE };
  // UpstreamNode must have refcounting implemented by its derived classes Root or Bridge
  PCI_REQUIRE_REFCOUNTED;

  // Disallow copying, assigning and moving.
  UpstreamNode(const UpstreamNode&) = delete;
  UpstreamNode(UpstreamNode&&) = delete;
  UpstreamNode& operator=(const UpstreamNode&) = delete;
  UpstreamNode& operator=(UpstreamNode&&) = delete;

  Type type() const { return type_; }
  uint32_t managed_bus_id() const { return managed_bus_id_; }

  virtual PciAllocator& pf_mmio_regions() = 0;
  virtual PciAllocator& mmio_regions() = 0;
  virtual PciAllocator& pio_regions() = 0;

  void LinkDevice(pci::Device* device) { downstream_.push_back(device); }
  void UnlinkDevice(pci::Device* device) { downstream_.erase(*device); }
  virtual zx_status_t EnableBusMasterUpstream(bool enabled) = 0;

 protected:
  friend FakeBusDriver;
  UpstreamNode(Type type, uint32_t mbus_id) : type_(type), managed_bus_id_(mbus_id) {}

  virtual ~UpstreamNode() = default;

  // Configure / late-initialization any devices downstream of this node.
  virtual void ConfigureDownstreamDevices();
  // Disable all devices directly connected to this bridge.
  virtual void DisableDownstream();
  // Unplug all devices directly connected to this bridge.
  virtual void UnplugDownstream();
  DownstreamList& downstream() { return downstream_; }

 private:
  // The list of all devices immediately under this root/bridge.
  DownstreamList downstream_;
  const Type type_;
  const uint32_t managed_bus_id_;  // The ID of the downstream bus which this node manages.
};

}  // namespace pci

#endif  // SRC_DEVICES_BUS_DRIVERS_PCI_UPSTREAM_NODE_H_
