// Copyright 2018 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 ZIRCON_HW_PCI_H_
#define ZIRCON_HW_PCI_H_

#include <stdint.h>
#include <zircon/compiler.h>

__BEGIN_CDECLS;

// Structure for passing around PCI address information
typedef struct pci_bdf {
    uint8_t bus_id;
    uint8_t device_id;
    uint8_t function_id;
} pci_bdf_t;

// TODO(cja): This header is used for the transition of these defines from
// kernel to userspace, but due to pci_bdf_t some of the kernel includes it.
// Make sure defines here don't clash with those in pci_common.h by having this
// guard, but remove it after the transition.
#ifndef WITH_KERNEL_PCIE

#define PCI_MAX_BUSES (256u)
#define PCI_MAX_DEVICES_PER_BUS (32u)
#define PCI_MAX_FUNCTIONS_PER_DEVICE (8u)
#define PCI_MAX_FUNCTIONS_PER_BUS (PCI_MAX_DEVICES_PER_BUS * PCI_MAX_FUNCTIONS_PER_DEVICE)

#define PCI_STANDARD_CONFIG_HDR_SIZE (64u)
#define PCI_BASE_CONFIG_SIZE (256u)
#define PCIE_EXTENDED_CONFIG_SIZE (4096u)
#define PCIE_ECAM_BYTES_PER_BUS (PCIE_EXTENDED_CONFIG_SIZE * PCI_MAX_FUNCTIONS_PER_BUS)

#define PCI_BAR_REGS_PER_BRIDGE (2u)
#define PCI_BAR_REGS_PER_DEVICE (6u)
#define PCI_MAX_BAR_REGS (6u)

#define PCI_MAX_LEGACY_IRQ_PINS (4u)
#define PCI_MAX_MSI_IRQS (32u)
#define PCIE_MAX_MSIX_IRQS (2048u)

#define PCI_INVALID_VENDOR_ID (0xFFFF)

#endif // WITH_KERNEL_PCIE

__END_CDECLS;

#endif // ZIRCON_HW_PCI_H_