19b8e73cdSDave Jiang /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 29b8e73cdSDave Jiang /* 39b8e73cdSDave Jiang * Copyright (c) 2024,2025, Intel Corporation 49b8e73cdSDave Jiang * 59b8e73cdSDave Jiang * These are definitions for the mailbox command interface of CXL subsystem. 69b8e73cdSDave Jiang */ 79b8e73cdSDave Jiang #ifndef _UAPI_CXL_FEATURES_H_ 89b8e73cdSDave Jiang #define _UAPI_CXL_FEATURES_H_ 99b8e73cdSDave Jiang 109b8e73cdSDave Jiang #include <linux/types.h> 11*7bdd8f75SDan Williams 12*7bdd8f75SDan Williams typedef unsigned char __uapi_uuid_t[16]; 13*7bdd8f75SDan Williams 14*7bdd8f75SDan Williams #ifdef __KERNEL__ 159b8e73cdSDave Jiang #include <linux/uuid.h> 16*7bdd8f75SDan Williams /* 17*7bdd8f75SDan Williams * Note, __uapi_uuid_t is 1-byte aligned on modern compilers and 4-byte 18*7bdd8f75SDan Williams * aligned on others. Ensure that __uapi_uuid_t in a struct is placed at 19*7bdd8f75SDan Williams * a 4-byte aligned offset, or the structure is packed, to ensure 20*7bdd8f75SDan Williams * consistent padding. 21*7bdd8f75SDan Williams */ 22*7bdd8f75SDan Williams static_assert(sizeof(__uapi_uuid_t) == sizeof(uuid_t)); 23*7bdd8f75SDan Williams #define __uapi_uuid_t uuid_t 249b8e73cdSDave Jiang #endif 259b8e73cdSDave Jiang 269b8e73cdSDave Jiang /* 279b8e73cdSDave Jiang * struct cxl_mbox_get_sup_feats_in - Get Supported Features input 289b8e73cdSDave Jiang * 299b8e73cdSDave Jiang * @count: bytes of Feature data to return in output 309b8e73cdSDave Jiang * @start_idx: index of first requested Supported Feature Entry, 0 based. 319b8e73cdSDave Jiang * @reserved: reserved field, must be 0s. 329b8e73cdSDave Jiang * 339b8e73cdSDave Jiang * Get Supported Features (0x500h) CXL r3.2 8.2.9.6.1 command. 349b8e73cdSDave Jiang * Input block for Get support Feature 359b8e73cdSDave Jiang */ 369b8e73cdSDave Jiang struct cxl_mbox_get_sup_feats_in { 379b8e73cdSDave Jiang __le32 count; 389b8e73cdSDave Jiang __le16 start_idx; 399b8e73cdSDave Jiang __u8 reserved[2]; 409b8e73cdSDave Jiang } __attribute__ ((__packed__)); 419b8e73cdSDave Jiang 429b8e73cdSDave Jiang /* CXL spec r3.2 Table 8-87 command effects */ 439b8e73cdSDave Jiang #define CXL_CMD_CONFIG_CHANGE_COLD_RESET BIT(0) 449b8e73cdSDave Jiang #define CXL_CMD_CONFIG_CHANGE_IMMEDIATE BIT(1) 459b8e73cdSDave Jiang #define CXL_CMD_DATA_CHANGE_IMMEDIATE BIT(2) 469b8e73cdSDave Jiang #define CXL_CMD_POLICY_CHANGE_IMMEDIATE BIT(3) 479b8e73cdSDave Jiang #define CXL_CMD_LOG_CHANGE_IMMEDIATE BIT(4) 489b8e73cdSDave Jiang #define CXL_CMD_SECURITY_STATE_CHANGE BIT(5) 499b8e73cdSDave Jiang #define CXL_CMD_BACKGROUND BIT(6) 509b8e73cdSDave Jiang #define CXL_CMD_BGCMD_ABORT_SUPPORTED BIT(7) 519b8e73cdSDave Jiang #define CXL_CMD_EFFECTS_VALID BIT(9) 529b8e73cdSDave Jiang #define CXL_CMD_CONFIG_CHANGE_CONV_RESET BIT(10) 539b8e73cdSDave Jiang #define CXL_CMD_CONFIG_CHANGE_CXL_RESET BIT(11) 544d1c09ceSDave Jiang #define CXL_CMD_EFFECTS_RESERVED GENMASK(15, 12) 559b8e73cdSDave Jiang 569b8e73cdSDave Jiang /* 579b8e73cdSDave Jiang * struct cxl_feat_entry - Supported Feature Entry 589b8e73cdSDave Jiang * @uuid: UUID of the Feature 599b8e73cdSDave Jiang * @id: id to identify the feature. 0 based 609b8e73cdSDave Jiang * @get_feat_size: max bytes required for Get Feature command for this Feature 619b8e73cdSDave Jiang * @set_feat_size: max bytes required for Set Feature command for this Feature 629b8e73cdSDave Jiang * @flags: attribute flags 639b8e73cdSDave Jiang * @get_feat_ver: Get Feature version 649b8e73cdSDave Jiang * @set_feat_ver: Set Feature version 659b8e73cdSDave Jiang * @effects: Set Feature command effects 669b8e73cdSDave Jiang * @reserved: reserved, must be 0 679b8e73cdSDave Jiang * 689b8e73cdSDave Jiang * CXL spec r3.2 Table 8-109 699b8e73cdSDave Jiang * Get Supported Features Supported Feature Entry 709b8e73cdSDave Jiang */ 719b8e73cdSDave Jiang struct cxl_feat_entry { 72*7bdd8f75SDan Williams __uapi_uuid_t uuid; 739b8e73cdSDave Jiang __le16 id; 749b8e73cdSDave Jiang __le16 get_feat_size; 759b8e73cdSDave Jiang __le16 set_feat_size; 769b8e73cdSDave Jiang __le32 flags; 779b8e73cdSDave Jiang __u8 get_feat_ver; 789b8e73cdSDave Jiang __u8 set_feat_ver; 799b8e73cdSDave Jiang __le16 effects; 809b8e73cdSDave Jiang __u8 reserved[18]; 819b8e73cdSDave Jiang } __attribute__ ((__packed__)); 829b8e73cdSDave Jiang 839b8e73cdSDave Jiang /* @flags field for 'struct cxl_feat_entry' */ 849b8e73cdSDave Jiang #define CXL_FEATURE_F_CHANGEABLE BIT(0) 859b8e73cdSDave Jiang #define CXL_FEATURE_F_PERSIST_FW_UPDATE BIT(4) 869b8e73cdSDave Jiang #define CXL_FEATURE_F_DEFAULT_SEL BIT(5) 879b8e73cdSDave Jiang #define CXL_FEATURE_F_SAVED_SEL BIT(6) 889b8e73cdSDave Jiang 899b8e73cdSDave Jiang /* 909b8e73cdSDave Jiang * struct cxl_mbox_get_sup_feats_out - Get Supported Features output 919b8e73cdSDave Jiang * @num_entries: number of Supported Feature Entries returned 929b8e73cdSDave Jiang * @supported_feats: number of supported Features 939b8e73cdSDave Jiang * @reserved: reserved, must be 0s. 949b8e73cdSDave Jiang * @ents: Supported Feature Entries array 959b8e73cdSDave Jiang * 969b8e73cdSDave Jiang * CXL spec r3.2 Table 8-108 979b8e73cdSDave Jiang * Get supported Features Output Payload 989b8e73cdSDave Jiang */ 999b8e73cdSDave Jiang struct cxl_mbox_get_sup_feats_out { 1009b8e73cdSDave Jiang __struct_group(cxl_mbox_get_sup_feats_out_hdr, hdr, /* no attrs */, 1019b8e73cdSDave Jiang __le16 num_entries; 1029b8e73cdSDave Jiang __le16 supported_feats; 1039b8e73cdSDave Jiang __u8 reserved[4]; 1049b8e73cdSDave Jiang ); 1059b8e73cdSDave Jiang struct cxl_feat_entry ents[] __counted_by_le(num_entries); 1069b8e73cdSDave Jiang } __attribute__ ((__packed__)); 1079b8e73cdSDave Jiang 1089b8e73cdSDave Jiang /* 1099b8e73cdSDave Jiang * Get Feature CXL spec r3.2 Spec 8.2.9.6.2 1109b8e73cdSDave Jiang */ 1119b8e73cdSDave Jiang 1129b8e73cdSDave Jiang /* 1139b8e73cdSDave Jiang * struct cxl_mbox_get_feat_in - Get Feature input 1149b8e73cdSDave Jiang * @uuid: UUID for Feature 1159b8e73cdSDave Jiang * @offset: offset of the first byte in Feature data for output payload 1169b8e73cdSDave Jiang * @count: count in bytes of Feature data returned 1179b8e73cdSDave Jiang * @selection: 0 current value, 1 default value, 2 saved value 1189b8e73cdSDave Jiang * 1199b8e73cdSDave Jiang * CXL spec r3.2 section 8.2.9.6.2 Table 8-99 1209b8e73cdSDave Jiang */ 1219b8e73cdSDave Jiang struct cxl_mbox_get_feat_in { 122*7bdd8f75SDan Williams __uapi_uuid_t uuid; 1239b8e73cdSDave Jiang __le16 offset; 1249b8e73cdSDave Jiang __le16 count; 1259b8e73cdSDave Jiang __u8 selection; 1269b8e73cdSDave Jiang } __attribute__ ((__packed__)); 1279b8e73cdSDave Jiang 1289b8e73cdSDave Jiang /* 1299b8e73cdSDave Jiang * enum cxl_get_feat_selection - selection field of Get Feature input 1309b8e73cdSDave Jiang */ 1319b8e73cdSDave Jiang enum cxl_get_feat_selection { 1329b8e73cdSDave Jiang CXL_GET_FEAT_SEL_CURRENT_VALUE, 1339b8e73cdSDave Jiang CXL_GET_FEAT_SEL_DEFAULT_VALUE, 1349b8e73cdSDave Jiang CXL_GET_FEAT_SEL_SAVED_VALUE, 1359b8e73cdSDave Jiang CXL_GET_FEAT_SEL_MAX 1369b8e73cdSDave Jiang }; 1379b8e73cdSDave Jiang 1389b8e73cdSDave Jiang /* 1399b8e73cdSDave Jiang * Set Feature CXL spec r3.2 8.2.9.6.3 1409b8e73cdSDave Jiang */ 1419b8e73cdSDave Jiang 1429b8e73cdSDave Jiang /* 1439b8e73cdSDave Jiang * struct cxl_mbox_set_feat_in - Set Features input 1449b8e73cdSDave Jiang * @uuid: UUID for Feature 1459b8e73cdSDave Jiang * @flags: set feature flags 1469b8e73cdSDave Jiang * @offset: byte offset of Feature data to update 1479b8e73cdSDave Jiang * @version: Feature version of the data in Feature Data 1489b8e73cdSDave Jiang * @rsvd: reserved, must be 0s. 1499b8e73cdSDave Jiang * @feat_data: raw byte stream of Features data to update 1509b8e73cdSDave Jiang * 1519b8e73cdSDave Jiang * CXL spec r3.2 section 8.2.9.6.3 Table 8-101 1529b8e73cdSDave Jiang */ 1539b8e73cdSDave Jiang struct cxl_mbox_set_feat_in { 1549b8e73cdSDave Jiang __struct_group(cxl_mbox_set_feat_hdr, hdr, /* no attrs */, 155*7bdd8f75SDan Williams __uapi_uuid_t uuid; 1569b8e73cdSDave Jiang __le32 flags; 1579b8e73cdSDave Jiang __le16 offset; 1589b8e73cdSDave Jiang __u8 version; 1599b8e73cdSDave Jiang __u8 rsvd[9]; 1609b8e73cdSDave Jiang ); 1619b8e73cdSDave Jiang __u8 feat_data[]; 1629b8e73cdSDave Jiang } __packed; 1639b8e73cdSDave Jiang 1649b8e73cdSDave Jiang /* 1659b8e73cdSDave Jiang * enum cxl_set_feat_flag_data_transfer - Set Feature flags field 1669b8e73cdSDave Jiang */ 1679b8e73cdSDave Jiang enum cxl_set_feat_flag_data_transfer { 1689b8e73cdSDave Jiang CXL_SET_FEAT_FLAG_FULL_DATA_TRANSFER = 0, 1699b8e73cdSDave Jiang CXL_SET_FEAT_FLAG_INITIATE_DATA_TRANSFER, 1709b8e73cdSDave Jiang CXL_SET_FEAT_FLAG_CONTINUE_DATA_TRANSFER, 1719b8e73cdSDave Jiang CXL_SET_FEAT_FLAG_FINISH_DATA_TRANSFER, 1729b8e73cdSDave Jiang CXL_SET_FEAT_FLAG_ABORT_DATA_TRANSFER, 1739b8e73cdSDave Jiang CXL_SET_FEAT_FLAG_DATA_TRANSFER_MAX 1749b8e73cdSDave Jiang }; 1759b8e73cdSDave Jiang 1769b8e73cdSDave Jiang #define CXL_SET_FEAT_FLAG_DATA_TRANSFER_MASK GENMASK(2, 0) 1779b8e73cdSDave Jiang #define CXL_SET_FEAT_FLAG_DATA_SAVED_ACROSS_RESET BIT(3) 1789b8e73cdSDave Jiang 1799b8e73cdSDave Jiang #endif 180