mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
coco/tdx-host: Introduce a "tdx_host" device
TDX depends on a platform firmware module that runs on the CPU. Unlike other CoCo architectures, TDX has no hardware "device" running the show, just a blob on the CPU. Create a virtual device to anchor interactions with this platform firmware. This lets later code: - expose metadata: TDX module version, seamldr version, to userspace as device attributes - implement firmware uploader APIs (which are tied to a device) to support TDX module runtime updates Use a faux device because the TDX module is singular within the system and has no platform resources. Using a faux device eliminates the need to create a stub bus. The call to tdx_get_sysinfo() ensures that the TDX module is ready to provide services. Note that AMD has a PCI device for the PSP for SEV and ARM CCA will likely have a faux device [1]. Thanks to Dan and Yilun for all the help on this one. [ dhansen: trim changelog ] Signed-off-by: Chao Gao <chao.gao@intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Reviewed-by: Tony Lindgren <tony.lindgren@linux.intel.com> Reviewed-by: Xu Yilun <yilun.xu@linux.intel.com> Reviewed-by: Kai Huang <kai.huang@intel.com> Reviewed-by: Kiryl Shutsemau (Meta) <kas@kernel.org> Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> Link: https://lore.kernel.org/all/2025073035-bulginess-rematch-b92e@gregkh/ # [1] Link: https://patch.msgid.link/20260520133909.409394-7-chao.gao@intel.com
This commit is contained in:
@@ -1527,7 +1527,7 @@ const struct tdx_sys_info *tdx_get_sysinfo(void)
|
||||
|
||||
return (const struct tdx_sys_info *)&tdx_sysinfo;
|
||||
}
|
||||
EXPORT_SYMBOL_FOR_KVM(tdx_get_sysinfo);
|
||||
EXPORT_SYMBOL_FOR_MODULES(tdx_get_sysinfo, "kvm-intel,tdx-host");
|
||||
|
||||
u32 tdx_get_nr_guest_keyids(void)
|
||||
{
|
||||
|
||||
@@ -17,5 +17,7 @@ source "drivers/virt/coco/arm-cca-guest/Kconfig"
|
||||
source "drivers/virt/coco/guest/Kconfig"
|
||||
endif
|
||||
|
||||
source "drivers/virt/coco/tdx-host/Kconfig"
|
||||
|
||||
config TSM
|
||||
bool
|
||||
|
||||
@@ -6,6 +6,7 @@ obj-$(CONFIG_EFI_SECRET) += efi_secret/
|
||||
obj-$(CONFIG_ARM_PKVM_GUEST) += pkvm-guest/
|
||||
obj-$(CONFIG_SEV_GUEST) += sev-guest/
|
||||
obj-$(CONFIG_INTEL_TDX_GUEST) += tdx-guest/
|
||||
obj-$(CONFIG_INTEL_TDX_HOST) += tdx-host/
|
||||
obj-$(CONFIG_ARM_CCA_GUEST) += arm-cca-guest/
|
||||
obj-$(CONFIG_TSM) += tsm-core.o
|
||||
obj-$(CONFIG_TSM_GUEST) += guest/
|
||||
|
||||
4
drivers/virt/coco/tdx-host/Kconfig
Normal file
4
drivers/virt/coco/tdx-host/Kconfig
Normal file
@@ -0,0 +1,4 @@
|
||||
config TDX_HOST_SERVICES
|
||||
tristate
|
||||
depends on INTEL_TDX_HOST
|
||||
default m
|
||||
1
drivers/virt/coco/tdx-host/Makefile
Normal file
1
drivers/virt/coco/tdx-host/Makefile
Normal file
@@ -0,0 +1 @@
|
||||
obj-$(CONFIG_TDX_HOST_SERVICES) += tdx-host.o
|
||||
43
drivers/virt/coco/tdx-host/tdx-host.c
Normal file
43
drivers/virt/coco/tdx-host/tdx-host.c
Normal file
@@ -0,0 +1,43 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* TDX host user interface driver
|
||||
*
|
||||
* Copyright (C) 2025 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/device/faux.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
#include <asm/cpu_device_id.h>
|
||||
#include <asm/tdx.h>
|
||||
|
||||
static const struct x86_cpu_id tdx_host_ids[] = {
|
||||
X86_MATCH_FEATURE(X86_FEATURE_TDX_HOST_PLATFORM, NULL),
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(x86cpu, tdx_host_ids);
|
||||
|
||||
static struct faux_device *fdev;
|
||||
|
||||
static int __init tdx_host_init(void)
|
||||
{
|
||||
if (!x86_match_cpu(tdx_host_ids) || !tdx_get_sysinfo())
|
||||
return -ENODEV;
|
||||
|
||||
fdev = faux_device_create(KBUILD_MODNAME, NULL, NULL);
|
||||
if (!fdev)
|
||||
return -ENODEV;
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(tdx_host_init);
|
||||
|
||||
static void __exit tdx_host_exit(void)
|
||||
{
|
||||
faux_device_destroy(fdev);
|
||||
}
|
||||
module_exit(tdx_host_exit);
|
||||
|
||||
MODULE_DESCRIPTION("TDX Host Services");
|
||||
MODULE_LICENSE("GPL");
|
||||
Reference in New Issue
Block a user