blob: 6e18757c3da56ba33d25fb0815f1e4881670c9b3 [file] [log] [blame]
// 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_CAPABILITIES_H_
#define SRC_DEVICES_BUS_DRIVERS_PCI_CAPABILITIES_H_
#include <memory>
#include <fbl/intrusive_double_list.h>
#include <hwreg/bitfields.h>
#include "config.h"
namespace pci {
// General PCI/PCIe capability classes. Final calculated address
// for config corresponds to cfg's base plus cap's base along with
// the specific register's offset.
class Capability : public fbl::DoublyLinkedListable<std::unique_ptr<Capability>> {
public:
using BaseClass = Capability;
using RegType = uint8_t;
// PCI Code and ID Assignment Specification Revision 1.9 section 2.
enum class Id : RegType {
/* 0x00 */ kNull = 0,
/* 0x01 */ kPciPowerManagement,
/* 0x02 */ kAgp,
/* 0x03 */ kVitalProductData,
/* 0x04 */ kSlotIdentification,
/* 0x05 */ kMsi,
/* 0x06 */ kCompactPciHotSwap,
/* 0x07 */ kPciX,
/* 0x08 */ kHyperTransport,
/* 0x09 */ kVendor,
/* 0x0a */ kDebugPort,
/* 0x0b */ kCompactPciCrc,
/* 0x0c */ kPciHotplug,
/* 0x0d */ kPciBridgeSubsystemVendorId,
/* 0x0e */ kAgp8x,
/* 0x0f */ kSecureDevice,
/* 0x10 */ kPciExpress,
/* 0x11 */ kMsiX,
/* 0x12 */ kSataDataNdxCfg,
/* 0x13 */ kAdvancedFeatures,
/* 0x14 */ kEnhancedAllocation,
/* 0x15 */ kFlatteningPortalBridge,
};
Capability(uint8_t id, uint8_t base, const char* addr = nullptr)
: id_(id), base_(base), addr_(addr) {}
[[nodiscard]] uint8_t id() const { return id_; }
[[nodiscard]] uint8_t base() const { return base_; }
const char* addr() { return addr_; }
private:
uint8_t id_;
uint8_t base_;
const char* addr_;
};
using CapabilityList = fbl::DoublyLinkedList<std::unique_ptr<Capability>>;
static_assert(static_cast<uint8_t>(Capability::Id::kFlatteningPortalBridge) == 0x15);
// General PCIe Extended capability classes. Final calculated address
// for capability register corresponds to cfg's base plus cap's base along with
// the specific register's offset.
class ExtCapability : public fbl::DoublyLinkedListable<std::unique_ptr<ExtCapability>> {
public:
using BaseClass = ExtCapability;
using RegType = uint16_t;
// PCI Code and ID Assignment Specification Revision 1.9 section 3.
enum class Id : RegType {
/* 0x00 */ kNull = 0,
/* 0x01 */ kAdvancedErrorReporting,
/* 0x02 */ kVirtualChannelNoMFVC,
/* 0x03 */ kDeviceSerialNumber,
/* 0x04 */ kPowerBudgeting,
/* 0x05 */ kRootComplexLinkDeclaration,
/* 0x06 */ kRootComplexInternalLinkControl,
/* 0x07 */ kRootComplexEventCollectorEndpointAssociation,
/* 0x08 */ kMultiFunctionVirtualChannel,
/* 0x09 */ kVirtualChannel,
/* 0x0a */ kRCRB,
/* 0x0b */ kVendor,
/* 0x0c */ kCAC,
/* 0x0d */ kACS,
/* 0x0e */ kARI,
/* 0x0f */ kATS,
/* 0x10 */ kSR_IOV,
/* 0x11 */ kMR_IOV,
/* 0x12 */ kMulticast,
/* 0x13 */ kPRI,
/* 0x14 */ kEnhancedAllocation,
/* 0x15 */ kResizableBAR,
/* 0x16 */ kDynamicPowerAllocation,
/* 0x17 */ kTPHRequester,
/* 0x18 */ kLatencyToleranceReporting,
/* 0x19 */ kSecondaryPCIExpress,
/* 0x1a */ kPMUX,
/* 0x1b */ kPASID,
/* 0x1c */ kLNR,
/* 0x1d */ kDPC,
/* 0x1e */ kL1PMSubstates,
/* 0x1f */ kPrecisionTimeMeasurement,
/* 0x20 */ kMPCIe,
/* 0x21 */ kFRSQueueing,
/* 0x22 */ kReadinessTimeReporting,
/* 0x23 */ kDesignatedVendor,
/* 0x24 */ kVFResizableBAR,
/* 0x25 */ kDataLinkFeature,
/* 0x26 */ kPhysicalLayer16,
/* 0x27 */ kLaneMarginingAtReceiver,
/* 0x28 */ kHierarchyId,
/* 0x29 */ kNativePCIeEnclosure,
/* 0x2a */ kPhysicalLayer32,
/* 0x2b */ kAlternateProtocol,
/* 0x2c */ kSystemFirmwareIntermediary,
};
ExtCapability(uint16_t id, uint8_t version, uint16_t base)
: id_(id), base_(base), version_(version) {}
[[nodiscard]] uint16_t id() const { return id_; }
[[nodiscard]] uint16_t base() const { return base_; }
[[nodiscard]] uint8_t version() const { return version_; }
private:
uint16_t id_;
uint16_t base_;
uint8_t version_;
};
using ExtCapabilityList = fbl::DoublyLinkedList<std::unique_ptr<ExtCapability>>;
static_assert(static_cast<uint16_t>(ExtCapability::Id::kSystemFirmwareIntermediary) == 0x2c);
const char* CapabilityIdToName(Capability::Id id);
const char* ExtCapabilityIdToName(ExtCapability::Id id);
} // namespace pci
#endif // SRC_DEVICES_BUS_DRIVERS_PCI_CAPABILITIES_H_