@@ -424,6 +424,7 @@ bool cxl_decoder_is_volatile_capable(struct cxl_decoder *decoder);
bool cxl_decoder_is_mem_capable(struct cxl_decoder *decoder);
bool cxl_decoder_is_accelmem_capable(struct cxl_decoder *decoder);
bool cxl_decoder_is_locked(struct cxl_decoder *decoder);
+bool cxl_decoder_is_committed(struct cxl_decoder *decoder);
----
The kernel protects the enumeration of the physical address layout of
the system. Without CAP_SYS_ADMIN cxl_decoder_get_resource() returns
@@ -449,6 +450,9 @@ Platform firmware may setup the CXL decode hierarchy before the OS
boots, and may additionally require that the OS not change the decode
settings. This property is indicated by the cxl_decoder_is_locked() API.
+cxl_decoder_is_committed() provides a snapshot of the decoder state
+from the OS indicating if the decoder is committed or free.
+
When a decoder is associated with a region cxl_decoder_get_region()
returns that region object. Note that it is only applicable to switch
and endpoint decoders as root decoders have a 1:N relationship with
@@ -857,6 +857,10 @@ struct json_object *util_cxl_decoder_to_json(struct cxl_decoder *decoder,
jobj);
}
+ jobj = json_object_new_boolean(cxl_decoder_is_committed(decoder));
+ if (jobj)
+ json_object_object_add(jdecoder, "committed", jobj);
+
json_object_set_userdata(jdecoder, decoder, NULL);
return jdecoder;
}
@@ -2116,6 +2116,10 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base)
else
decoder->interleave_ways = strtoul(buf, NULL, 0);
+ sprintf(path, "%s/committed", cxldecoder_base);
+ if (sysfs_read_attr(ctx, path, buf) == 0)
+ decoder->committed = !!strtoul(buf, NULL, 0);
+
switch (port->type) {
case CXL_PORT_ENDPOINT:
sprintf(path, "%s/dpa_resource", cxldecoder_base);
@@ -2464,6 +2468,11 @@ CXL_EXPORT bool cxl_decoder_is_locked(struct cxl_decoder *decoder)
return decoder->locked;
}
+CXL_EXPORT bool cxl_decoder_is_committed(struct cxl_decoder *decoder)
+{
+ return decoder->committed;
+}
+
CXL_EXPORT unsigned int
cxl_decoder_get_interleave_granularity(struct cxl_decoder *decoder)
{
@@ -264,3 +264,8 @@ global:
cxl_memdev_update_fw;
cxl_memdev_cancel_fw_update;
} LIBCXL_5;
+
+LIBCXL_7 {
+global:
+ cxl_decoder_is_committed;
+} LIBCXL_6;
@@ -139,6 +139,7 @@ struct cxl_decoder {
bool mem_capable;
bool accelmem_capable;
bool locked;
+ bool committed;
enum cxl_decoder_target_type target_type;
int regions_init;
struct list_head targets;
@@ -245,6 +245,7 @@ bool cxl_decoder_is_volatile_capable(struct cxl_decoder *decoder);
bool cxl_decoder_is_mem_capable(struct cxl_decoder *decoder);
bool cxl_decoder_is_accelmem_capable(struct cxl_decoder *decoder);
bool cxl_decoder_is_locked(struct cxl_decoder *decoder);
+bool cxl_decoder_is_committed(struct cxl_decoder *decoder);
unsigned int
cxl_decoder_get_interleave_granularity(struct cxl_decoder *decoder);
unsigned int cxl_decoder_get_interleave_ways(struct cxl_decoder *decoder);
Save the decoder committed state exported by the kernel to the libcxl decoder context. The attribute is helpful for determing if a region is active. Add libcxl API to determine if decoder is committed. Add the committed state to the decoder for cxl list command. Links: https://lore.kernel.org/linux-cxl/169566515694.3697523.714600762835841180.stgit@djiang5-mobl3/ Signed-off-by: Dave Jiang <dave.jiang@intel.com> --- Documentation/cxl/lib/libcxl.txt | 4 ++++ cxl/json.c | 4 ++++ cxl/lib/libcxl.c | 9 +++++++++ cxl/lib/libcxl.sym | 5 +++++ cxl/lib/private.h | 1 + cxl/libcxl.h | 1 + 6 files changed, 24 insertions(+)