blob: 74518dcbd896afb246cdbc0878fdc8cf0d67a10b [file]
/** @file
RISC-V IO Mapping Table (RIMT) definitions
Copyright (C) 2025, plasteli.net. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Reference(s):
- RISC-V IO Mapping Table (RIMT) Specification, Version v1.0
(https://github.com/riscv-non-isa/riscv-acpi-rimt/releases/download/v1.0/rimt-spec.pdf)
- Advanced Configuration and Power Interface (ACPI) specification, Version 6.6
(https://uefi.org/specs/ACPI/6.6/)
**/
#ifndef RISCV_IO_MAPPING_TABLE_H_
#define RISCV_IO_MAPPING_TABLE_H_
#include <IndustryStandard/Acpi.h>
//
// Ensure proper structure formats
//
#pragma pack(1)
///
/// RISC-V RIMT Interrupt Wire Node
///
typedef struct {
UINT32 InterruptNumber;
UINT32 Flags;
} EFI_ACPI_6_6_RIMT_INTERRUPT_WIRE_STRUCTURE;
#define EFI_ACPI_6_6_RIMT_INTERRUPT_WIRE_STRUCTURE_VERSION 1
///
/// RISC-V RIMT Header
///
typedef struct {
UINT8 Type;
UINT8 Revision;
UINT16 Length;
UINT16 Reserved;
UINT16 Id;
} EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE;
#define EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE_VERSION 1
///
/// RISC-V IOMMU Node (RIMT)
///
typedef struct {
EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE Header;
UINT64 HardwareId;
UINT64 BaseAddress;
UINT32 Flags;
UINT32 ProximityDomain;
UINT16 PcieSegmentNumber;
UINT16 PcieBdf;
UINT16 NumberOfInterruptWires;
UINT16 InterruptWireArrayOffset;
} EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE;
#define EFI_ACPI_6_6_RIMT_IOMMU_NODE_STRUCTURE_VERSION 1
///
/// RISC-V PCIe Root Complex Node (RIMT)
///
typedef struct {
EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE Header;
UINT32 Flags;
UINT16 Reserved;
UINT16 PcieSegmentNumber;
UINT16 IdMappingArrayOffset;
UINT16 NumberOfIdMappings;
} EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE;
#define EFI_ACPI_6_6_RIMT_PCIE_ROOT_COMPLEX_NODE_STRUCTURE_VERSION 1
///
/// RISC-V RIMT ID Mapping Structure
///
typedef struct {
UINT32 SourceIdBase;
UINT32 NumberOfIDs;
UINT32 DestinationDeviceIdBase;
UINT32 DestinationIommuOffset;
UINT32 Flags;
} EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE;
#define EFI_ACPI_6_6_RIMT_ID_MAPPING_STRUCTURE_VERSION 1
///
/// RISC-V Platform Device Node (RIMT)
///
typedef struct {
EFI_ACPI_6_6_RIMT_NODE_HEADER_STRUCTURE Header;
UINT16 IdMappingArrayOffset;
UINT16 NumberOfIdMappings;
CHAR8 DeviceObjectName[];
} EFI_ACPI_6_6_RIMT_PLATFORM_DEVICE_NODE_STRUCTURE;
#define EFI_ACPI_6_6_RIMT_PLATFORM_DEVICE_NODE_STRUCTURE_VERSION 1
///
/// RISC-V RIMT
///
typedef struct {
EFI_ACPI_DESCRIPTION_HEADER Header;
UINT32 NumberOfRimtNodes;
UINT32 OffsetToRimtNodeArray;
UINT32 Reserved;
} EFI_ACPI_6_6_RIMT_STRUCTURE;
#define EFI_ACPI_6_6_RIMT_STRUCTURE_VERSION 1
#pragma pack()
///
/// RIMT node structure types as defined in RIMT spec, Chapter 2.1
///
typedef enum {
RimtNodeIommu = 0,
RimtNodePcieRc,
RimtNodePlatform,
RimtNodeUnsupported
} RimtNodeTypes;
/// Minimal number of nodes allowed
/// According to RIMT spec, Chapter 2.1, system with a single IOMMU,
/// should have at least two RIMT nodes
#define RIMT_MINIMAL_NUMBER_OF_NODES_ALLOWED 2
#define RIMT_IOMMU_FLAGS_TYPE_BIT_OFFSET 0
#define RIMT_IOMMU_FLAGS_TYPE_BIT_COUNT 1
#define RIMT_IOMMU_FLAGS_PROXIMITY_DOMAIN_BIT_OFFSET 1
#define RIMT_IOMMU_FLAGS_PROXIMITY_DOMAIN_BIT_COUNT 1
#define RIMT_ID_MAPPING_FLAGS_ATS_BIT_OFFSET 0
#define RIMT_ID_MAPPING_FLAGS_ATS_BIT_COUNT 1
#define RIMT_ID_MAPPING_FLAGS_PRI_BIT_OFFSET 1
#define RIMT_ID_MAPPING_FLAGS_PRI_BIT_COUNT 1
#define RIMT_PCIERC_FLAGS_ATS_BIT_OFFSET 0
#define RIMT_PCIERC_FLAGS_ATS_BIT_COUNT 1
#define RIMT_PCIERC_FLAGS_PRI_BIT_OFFSET 1
#define RIMT_PCIERC_FLAGS_PRI_BIT_COUNT 1
#endif