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

library fuchsia.hardware.pci;

using fuchsia.hardware.syscalls.pci;
using zx;

enum PciCfg : uint16 {
    VENDOR_ID = 0x00;
    DEVICE_ID = 0x02;
    COMMAND = 0x04;
    STATUS = 0x06;
    REVISION_ID = 0x08;
    CLASS_CODE_INTR = 0x09;
    CLASS_CODE_SUB = 0x0a;
    CLASS_CODE_BASE = 0x0b;
    CACHE_LINE_SIZE = 0x0c;
    LATENCY_TIMER = 0x0d;
    HEADER_TYPE = 0x0e;
    BIST = 0x0f;
    BASE_ADDRESSES = 0x10;
    CARDBUS_CIS_PTR = 0x28;
    SUBSYSTEM_VENDOR_ID = 0x2c;
    SUBSYSTEM_ID = 0x2e;
    EXP_ROM_ADDRESS = 0x30;
    CAPABILITIES_PTR = 0x34;
    INTERRUPT_LINE = 0x3c;
    INTERRUPT_PIN = 0x3d;
    MIN_GRANT = 0x3e;
    MAX_LATENCY = 0x3f;
};

enum PciCapId : uint8 {
    NULL = 0x00;
    PCI_PWR_MGMT = 0x01;
    AGP = 0x02;
    VITAL_PRODUCT_DATA = 0x03;
    SLOT_IDENTIFICATION = 0x04;
    MSI = 0x05;
    COMPACT_PCI_HOTSWAP = 0x06;
    PCIX = 0x07;
    HYPERTRANSPORT = 0x08;
    VENDOR = 0x09;
    DEBUG_PORT = 0x0a;
    COMPACT_PCI_CRC = 0x0b;
    PCI_HOT_PLUG = 0x0c;
    PCI_BRIDGE_SUBSYSTEM_VID = 0x0d;
    AGP8X = 0x0e;
    SECURE_DEVICE = 0x0f;
    PCI_EXPRESS = 0x10;
    MSIX = 0x11;
    SATA_DATA_NDX_CFG = 0x12;
    ADVANCED_FEATURES = 0x13;
    ENHANCED_ALLOCATION = 0x14;
    FLATTENING_PORTAL_BRIDGE = 0x15;
};

enum PciExtCapId : uint16 {
    NULL = 0x00;
    ADVANCED_ERROR_REPORTING = 0x01;
    VIRTUAL_CHANNEL_NO_MFVC = 0x02;
    DEVICE_SERIAL_NUMBER = 0x03;
    POWER_BUDGETING = 0x04;
    ROOT_COMPLEX_LINK_DECLARATION = 0x05;
    ROOT_COMPLEX_INTERNAL_LINK_CONTROL = 0x06;
    ROOT_COMPLEX_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION = 0x07;
    MULTI_FUNCTION_VIRTUAL_CHANNEL = 0x08;
    VIRTUAL_CHANNEL = 0x09;
    RCRB = 0x0a;
    VENDOR = 0x0b;
    CAC = 0x0c;
    ACS = 0x0d;
    ARI = 0x0e;
    ATS = 0x0f;
    SR_IOV = 0x10;
    MR_IOV = 0x11;
    MULTICAST = 0x12;
    PRI = 0x13;
    ENHANCED_ALLOCATION = 0x14;
    RESIZABLE_BAR = 0x15;
    DYNAMIC_POWER_ALLOCATION = 0x16;
    TPH = 0x17;
    LATENCY_TOLERANCE_REPORTING = 0x18;
    SECONDARY_PCI_EXPRESS = 0x19;
    PMUX = 0x1a;
    PASID = 0x1b;
    LNR = 0x1c;
    DPC = 0x1d;
    L1PM_SUBSTATES = 0x1e;
    PRECISION_TIME_MEASUREMENT = 0x1f;
    MPCIE = 0x20;
    FRS_QUEUEING = 0x21;
    READINESS_TIME_REPORTING = 0x22;
    DESIGNATED_VENDOR = 0x23;
    VF_RESIZABLE_BAR = 0x24;
    DATA_LINK_FEATURE = 0x25;
    PHYSICAL_LAYER_16 = 0x26;
    LANE_MARGINING_AT_RECEIVER = 0x27;
    HIERARCHY_ID = 0x28;
    NATIVE_PCIE_ENCLOSURE = 0x29;
    PHYSICAL_LAYER_32 = 0x2a;
    ALTERNATE_PROTOCOL = 0x2b;
    SYSTEM_FIRMWARE_INTERMEDIARY = 0x2c;
};

enum PciIrqMode : uint8 {
    DISABLED = 0;
    LEGACY = 1;
    LEGACY_NOACK = 2;
    MSI = 3;
    MSI_X = 4;
    COUNT = 5;
};

/// fxbug.dev/33713: Remove the zx_pcie types and implement them here
[Transport = "Banjo", BanjoLayout = "ddk-protocol"]
protocol Pci {
    GetBar(uint32 bar_id) -> (zx.status s, fuchsia.hardware.syscalls.pci.PciBar res);
    EnableBusMaster(bool enable) -> (zx.status s);
    ResetDevice() -> (zx.status s);
    AckInterrupt() -> (zx.status s);
    MapInterrupt(uint32 which_irq) -> (zx.status s, zx.handle:INTERRUPT handle);
    QueryIrqMode(fuchsia.hardware.syscalls.pci.PciIrqMode mode) -> (zx.status s, uint32 max_irqs);
    SetIrqMode(fuchsia.hardware.syscalls.pci.PciIrqMode mode, uint32 requested_irq_count) -> (zx.status s);
    ConfigureIrqMode(uint32 requested_irq_count) -> (zx.status s, PciIrqMode mode);
    GetDeviceInfo() -> (zx.status s, fuchsia.hardware.syscalls.pci.PcieDeviceInfo info);
    ConfigRead8(uint16 offset) -> (zx.status s, uint8 value);
    ConfigRead16(uint16 offset) -> (zx.status s, uint16 value);
    ConfigRead32(uint16 offset) -> (zx.status s, uint32 value);
    ConfigWrite8(uint16 offset, uint8 value) -> (zx.status s);
    ConfigWrite16(uint16 offset, uint16 value) -> (zx.status s);
    ConfigWrite32(uint16 offset, uint32 value) -> (zx.status s);
    GetFirstCapability(uint8 id) -> (zx.status s, uint8 offset);
    GetNextCapability(uint8 id, uint8 offset) -> (zx.status s, uint8 offset);
    GetFirstExtendedCapability(uint16 id) -> (zx.status s, uint16 offset);
    GetNextExtendedCapability(uint16 id, uint16 offset) -> (zx.status s, uint16 offset);
    GetBti(uint32 index) -> (zx.status s, zx.handle:BTI bti);
};
