2121#include <stdio.h>
2222#include <limits.h>
2323#include <sys/select.h>
24+ #include <sys/mman.h> // Required for PROT_* for MMIO map calls
25+ #include <endian.h> // Required for htobe32 & friends in MMIO access wrappers
2426
2527#ifdef __cplusplus
2628extern "C" {
@@ -40,6 +42,14 @@ typedef enum {
4042 OCXL_MMIO_HOST_ENDIAN = 2 , /**< AFU data is the same endianess as the host */
4143} ocxl_endian ;
4244
45+ /**
46+ * Defines the type of an MMIO area
47+ */
48+ typedef enum {
49+ OCXL_GLOBAL_MMIO ,
50+ OCXL_PER_PASID_MMIO
51+ } ocxl_mmio_type ;
52+
4353#define AFU_NAME_MAX 24 /**< The maximum length of an AFU name */
4454
4555/**
@@ -62,6 +72,12 @@ typedef void *ocxl_afu_h;
6272 */
6373typedef uint16_t ocxl_irq_h ;
6474
75+ /**
76+ * A handle for an MMIO region on an AFU
77+ */
78+ typedef void * ocxl_mmio_h ;
79+
80+
6581/**
6682 * Potential return values from ocxl_* functions
6783 */
@@ -75,6 +91,7 @@ typedef enum {
7591 OCXL_ALREADY_DONE = -6 , /**< The action requested has already been performed */
7692 OCXL_OUT_OF_BOUNDS = -7 , /**< The action requested falls outside the permitted area */
7793 OCXL_NO_MORE_CONTEXTS = -8 , /**< No more contexts can be opened on the AFU */
94+ OCXL_INVALID_ARGS = -9 , /**< One or more arguments are invalid */
7895 /* Adding something? Update setup.c: ocxl_err_to_string too */
7996} ocxl_err ;
8097
@@ -134,9 +151,6 @@ const ocxl_identifier *ocxl_afu_get_identifier(ocxl_afu_h afu);
134151const char * ocxl_afu_get_device_path (ocxl_afu_h afu );
135152const char * ocxl_afu_get_sysfs_path (ocxl_afu_h afu );
136153void ocxl_afu_get_version (ocxl_afu_h afu , uint8_t * major , uint8_t * minor );
137- int ocxl_afu_get_fd (ocxl_afu_h afu );
138- size_t ocxl_afu_get_global_mmio_size (ocxl_afu_h afu );
139- size_t ocxl_afu_get_mmio_size (ocxl_afu_h afu );
140154uint32_t ocxl_afu_get_pasid (ocxl_afu_h afu );
141155
142156/* AFU operations */
@@ -154,6 +168,7 @@ ocxl_err ocxl_afu_attach(ocxl_afu_h afu);
154168/* AFU IRQ functions */
155169ocxl_err ocxl_afu_irq_alloc (ocxl_afu_h afu , void * info , ocxl_irq_h * irq_handle );
156170uint64_t ocxl_afu_irq_get_id (ocxl_afu_h afu , ocxl_irq_h irq );
171+ int ocxl_afu_get_event_fd (ocxl_afu_h afu );
157172int ocxl_afu_event_check_versioned (ocxl_afu_h afu , int timeout , ocxl_event * events , uint16_t event_count ,
158173 uint16_t event_api_version );
159174
@@ -188,22 +203,18 @@ ocxl_err ocxl_afu_set_ppc64_amr(ocxl_afu_h afu, uint64_t amr);
188203#endif
189204
190205/* mmio.c */
191- ocxl_err ocxl_global_mmio_map (ocxl_afu_h afu , ocxl_endian endian );
192- ocxl_err ocxl_mmio_map (ocxl_afu_h afu , ocxl_endian endian );
193-
194- ocxl_err ocxl_global_mmio_read32 (ocxl_afu_h afu , size_t offset , uint32_t * out );
195- ocxl_err ocxl_global_mmio_read64 (ocxl_afu_h afu , size_t offset , uint64_t * out );
196- ocxl_err ocxl_global_mmio_write32 (ocxl_afu_h afu , size_t offset , uint32_t val );
197- ocxl_err ocxl_global_mmio_write64 (ocxl_afu_h afu , size_t offset , uint64_t val );
198-
199- ocxl_err ocxl_mmio_read32 (ocxl_afu_h afu , size_t offset , uint32_t * out );
200- ocxl_err ocxl_mmio_read64 (ocxl_afu_h afu , size_t offset , uint64_t * out );
201- ocxl_err ocxl_mmio_write32 (ocxl_afu_h afu , size_t offset , uint32_t val );
202- ocxl_err ocxl_mmio_write64 (ocxl_afu_h afu , size_t offset , uint64_t val );
203-
204- /* MMIO low level API */
205- void ocxl_global_mmio_unmap (ocxl_afu_h afu );
206- void ocxl_mmio_unmap (ocxl_afu_h afu );
206+ size_t ocxl_afu_get_mmio_size (ocxl_afu_h afu , ocxl_mmio_type type );
207+ ocxl_err ocxl_mmio_map_advanced (ocxl_afu_h afu , ocxl_mmio_type type , size_t size , int prot , uint64_t flags ,
208+ off_t offset , ocxl_mmio_h * region );
209+ ocxl_err ocxl_mmio_map (ocxl_afu_h afu , ocxl_mmio_type type , ocxl_mmio_h * region );
210+ void ocxl_mmio_unmap (ocxl_mmio_h region );
211+ int ocxl_mmio_get_fd (ocxl_afu_h afu , ocxl_mmio_type type );
212+ size_t ocxl_mmio_size (ocxl_afu_h afu , ocxl_mmio_type type );
213+ ocxl_err ocxl_mmio_get_info (ocxl_mmio_h region , void * * address , size_t * size );
214+ ocxl_err ocxl_mmio_read32 (ocxl_mmio_h mmio , off_t offset , ocxl_endian endian , uint32_t * out );
215+ ocxl_err ocxl_mmio_read64 (ocxl_mmio_h mmio , off_t offset , ocxl_endian endian , uint64_t * out );
216+ ocxl_err ocxl_mmio_write32 (ocxl_mmio_h mmio , off_t offset , ocxl_endian endian , uint32_t value );
217+ ocxl_err ocxl_mmio_write64 (ocxl_mmio_h mmio , off_t offset , ocxl_endian endian , uint64_t value );
207218
208219#ifdef __cplusplus
209220}
0 commit comments