Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cdx: Split mcdi.h and reorganize headers

Move bitfield.h from the CDX controller directory to include/linux/cdx to make
them accessible to other drivers.

As part of this refactoring, split mcdi.h into two headers:

- mcdi.h: retains interface-level declarations
- mcdid.h: contains internal definitions and macros

This is in preparation for VersalNET EDAC driver that relies on it.

Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Acked-by: Nikhil Agarwal <nikhil.agarwal@amd.com>
Link: https://lore.kernel.org/20250908115649.22903-1-shubhrajyoti.datta@amd.com

authored by

Shubhrajyoti Datta and committed by
Borislav Petkov (AMD)
54fd6bd4 2292c806

+71 -57
drivers/cdx/controller/bitfield.h include/linux/cdx/bitfield.h
+1 -1
drivers/cdx/controller/cdx_controller.c
··· 14 14 #include "cdx_controller.h" 15 15 #include "../cdx.h" 16 16 #include "mcdi_functions.h" 17 - #include "mcdi.h" 17 + #include "mcdid.h" 18 18 19 19 static unsigned int cdx_mcdi_rpc_timeout(struct cdx_mcdi *cdx, unsigned int cmd) 20 20 {
+1 -1
drivers/cdx/controller/cdx_rpmsg.c
··· 15 15 #include "../cdx.h" 16 16 #include "cdx_controller.h" 17 17 #include "mcdi_functions.h" 18 - #include "mcdi.h" 18 + #include "mcdid.h" 19 19 20 20 static struct rpmsg_device_id cdx_rpmsg_id_table[] = { 21 21 { .name = "mcdi_ipc" },
+3 -2
drivers/cdx/controller/mcdi.c
··· 23 23 #include <linux/log2.h> 24 24 #include <linux/net_tstamp.h> 25 25 #include <linux/wait.h> 26 + #include <linux/cdx/bitfield.h> 26 27 27 - #include "bitfield.h" 28 - #include "mcdi.h" 28 + #include <linux/cdx/mcdi.h> 29 + #include "mcdid.h" 29 30 30 31 static void cdx_mcdi_cancel_cmd(struct cdx_mcdi *cdx, struct cdx_mcdi_cmd *cmd); 31 32 static void cdx_mcdi_wait_for_cleanup(struct cdx_mcdi *cdx);
+1 -51
drivers/cdx/controller/mcdi.h include/linux/cdx/mcdi.h
··· 11 11 #include <linux/kref.h> 12 12 #include <linux/rpmsg.h> 13 13 14 - #include "bitfield.h" 15 - #include "mc_cdx_pcol.h" 16 - 17 - #ifdef DEBUG 18 - #define CDX_WARN_ON_ONCE_PARANOID(x) WARN_ON_ONCE(x) 19 - #define CDX_WARN_ON_PARANOID(x) WARN_ON(x) 20 - #else 21 - #define CDX_WARN_ON_ONCE_PARANOID(x) do {} while (0) 22 - #define CDX_WARN_ON_PARANOID(x) do {} while (0) 23 - #endif 14 + #include "linux/cdx/bitfield.h" 24 15 25 16 /** 26 17 * enum cdx_mcdi_mode - MCDI transaction mode ··· 26 35 #define MCDI_RPC_TIMEOUT (10 * HZ) 27 36 #define MCDI_RPC_LONG_TIMEOU (60 * HZ) 28 37 #define MCDI_RPC_POST_RST_TIME (10 * HZ) 29 - 30 - #define MCDI_BUF_LEN (8 + MCDI_CTL_SDU_LEN_MAX) 31 38 32 39 /** 33 40 * enum cdx_mcdi_cmd_state - State for an individual MCDI command ··· 169 180 u32 fn_flags; 170 181 }; 171 182 172 - static inline struct cdx_mcdi_iface *cdx_mcdi_if(struct cdx_mcdi *cdx) 173 - { 174 - return cdx->mcdi ? &cdx->mcdi->iface : NULL; 175 - } 176 - 177 - int cdx_mcdi_init(struct cdx_mcdi *cdx); 178 - void cdx_mcdi_finish(struct cdx_mcdi *cdx); 179 - 180 - void cdx_mcdi_process_cmd(struct cdx_mcdi *cdx, struct cdx_dword *outbuf, int len); 181 - int cdx_mcdi_rpc(struct cdx_mcdi *cdx, unsigned int cmd, 182 - const struct cdx_dword *inbuf, size_t inlen, 183 - struct cdx_dword *outbuf, size_t outlen, size_t *outlen_actual); 184 - int cdx_mcdi_rpc_async(struct cdx_mcdi *cdx, unsigned int cmd, 185 - const struct cdx_dword *inbuf, size_t inlen, 186 - cdx_mcdi_async_completer *complete, 187 - unsigned long cookie); 188 - int cdx_mcdi_wait_for_quiescence(struct cdx_mcdi *cdx, 189 - unsigned int timeout_jiffies); 190 - 191 183 /* 192 184 * We expect that 16- and 32-bit fields in MCDI requests and responses 193 185 * are appropriately aligned, but 64-bit fields are only ··· 185 215 #define _MCDI_DWORD(_buf, _field) \ 186 216 ((_buf) + (_MCDI_CHECK_ALIGN(MC_CMD_ ## _field ## _OFST, 4) >> 2)) 187 217 188 - #define MCDI_BYTE(_buf, _field) \ 189 - ((void)BUILD_BUG_ON_ZERO(MC_CMD_ ## _field ## _LEN != 1), \ 190 - *MCDI_PTR(_buf, _field)) 191 - #define MCDI_WORD(_buf, _field) \ 192 - ((void)BUILD_BUG_ON_ZERO(MC_CMD_ ## _field ## _LEN != 2), \ 193 - le16_to_cpu(*(__force const __le16 *)MCDI_PTR(_buf, _field))) 194 218 #define MCDI_SET_DWORD(_buf, _field, _value) \ 195 219 CDX_POPULATE_DWORD_1(*_MCDI_DWORD(_buf, _field), CDX_DWORD, _value) 196 220 #define MCDI_DWORD(_buf, _field) \ 197 221 CDX_DWORD_FIELD(*_MCDI_DWORD(_buf, _field), CDX_DWORD) 198 - #define MCDI_POPULATE_DWORD_1(_buf, _field, _name1, _value1) \ 199 - CDX_POPULATE_DWORD_1(*_MCDI_DWORD(_buf, _field), \ 200 - MC_CMD_ ## _name1, _value1) 201 - #define MCDI_SET_QWORD(_buf, _field, _value) \ 202 - do { \ 203 - CDX_POPULATE_DWORD_1(_MCDI_DWORD(_buf, _field)[0], \ 204 - CDX_DWORD, (u32)(_value)); \ 205 - CDX_POPULATE_DWORD_1(_MCDI_DWORD(_buf, _field)[1], \ 206 - CDX_DWORD, (u64)(_value) >> 32); \ 207 - } while (0) 208 - #define MCDI_QWORD(_buf, _field) \ 209 - (CDX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[0], CDX_DWORD) | \ 210 - (u64)CDX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[1], CDX_DWORD) << 32) 211 - 212 222 #endif /* CDX_MCDI_H */
-1
drivers/cdx/controller/mcdi_functions.c
··· 5 5 6 6 #include <linux/module.h> 7 7 8 - #include "mcdi.h" 9 8 #include "mcdi_functions.h" 10 9 11 10 int cdx_mcdi_get_num_buses(struct cdx_mcdi *cdx)
+2 -1
drivers/cdx/controller/mcdi_functions.h
··· 8 8 #ifndef CDX_MCDI_FUNCTIONS_H 9 9 #define CDX_MCDI_FUNCTIONS_H 10 10 11 - #include "mcdi.h" 11 + #include <linux/cdx/mcdi.h> 12 + #include "mcdid.h" 12 13 #include "../cdx.h" 13 14 14 15 /**
+63
drivers/cdx/controller/mcdid.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 2 + * 3 + * Copyright 2008-2013 Solarflare Communications Inc. 4 + * Copyright (C) 2022-2025, Advanced Micro Devices, Inc. 5 + */ 6 + 7 + #ifndef CDX_MCDID_H 8 + #define CDX_MCDID_H 9 + 10 + #include <linux/mutex.h> 11 + #include <linux/kref.h> 12 + #include <linux/rpmsg.h> 13 + 14 + #include "mc_cdx_pcol.h" 15 + 16 + #ifdef DEBUG 17 + #define CDX_WARN_ON_ONCE_PARANOID(x) WARN_ON_ONCE(x) 18 + #define CDX_WARN_ON_PARANOID(x) WARN_ON(x) 19 + #else 20 + #define CDX_WARN_ON_ONCE_PARANOID(x) do {} while (0) 21 + #define CDX_WARN_ON_PARANOID(x) do {} while (0) 22 + #endif 23 + 24 + #define MCDI_BUF_LEN (8 + MCDI_CTL_SDU_LEN_MAX) 25 + 26 + static inline struct cdx_mcdi_iface *cdx_mcdi_if(struct cdx_mcdi *cdx) 27 + { 28 + return cdx->mcdi ? &cdx->mcdi->iface : NULL; 29 + } 30 + 31 + int cdx_mcdi_rpc_async(struct cdx_mcdi *cdx, unsigned int cmd, 32 + const struct cdx_dword *inbuf, size_t inlen, 33 + cdx_mcdi_async_completer *complete, 34 + unsigned long cookie); 35 + int cdx_mcdi_wait_for_quiescence(struct cdx_mcdi *cdx, 36 + unsigned int timeout_jiffies); 37 + 38 + /* 39 + * We expect that 16- and 32-bit fields in MCDI requests and responses 40 + * are appropriately aligned, but 64-bit fields are only 41 + * 32-bit-aligned. 42 + */ 43 + #define MCDI_BYTE(_buf, _field) \ 44 + ((void)BUILD_BUG_ON_ZERO(MC_CMD_ ## _field ## _LEN != 1), \ 45 + *MCDI_PTR(_buf, _field)) 46 + #define MCDI_WORD(_buf, _field) \ 47 + ((void)BUILD_BUG_ON_ZERO(MC_CMD_ ## _field ## _LEN != 2), \ 48 + le16_to_cpu(*(__force const __le16 *)MCDI_PTR(_buf, _field))) 49 + #define MCDI_POPULATE_DWORD_1(_buf, _field, _name1, _value1) \ 50 + CDX_POPULATE_DWORD_1(*_MCDI_DWORD(_buf, _field), \ 51 + MC_CMD_ ## _name1, _value1) 52 + #define MCDI_SET_QWORD(_buf, _field, _value) \ 53 + do { \ 54 + CDX_POPULATE_DWORD_1(_MCDI_DWORD(_buf, _field)[0], \ 55 + CDX_DWORD, (u32)(_value)); \ 56 + CDX_POPULATE_DWORD_1(_MCDI_DWORD(_buf, _field)[1], \ 57 + CDX_DWORD, (u64)(_value) >> 32); \ 58 + } while (0) 59 + #define MCDI_QWORD(_buf, _field) \ 60 + (CDX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[0], CDX_DWORD) | \ 61 + (u64)CDX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[1], CDX_DWORD) << 32) 62 + 63 + #endif /* CDX_MCDID_H */