/* * Driver Version Adaptation Layer * Handles interface differences between NVIDIA driver versions */ #include #include #include #include #include #include "version.h" MODULE_LICENSE("GPL"); MODULE_AUTHOR("Open-IOV"); MODULE_DESCRIPTION("Driver Version Adaptation Layer"); /* Version 550 interface */ static struct driver_interface interface_550 = { .version = "550", .major = 550, .minor = 0, .has_vgpu_vfio = true, .has_migration = true, .has_scheduling = true, .has_notifications = true, .has_wpr = true, }; /* Version 560 interface */ static struct driver_interface interface_560 = { .version = "560", .major = 560, .minor = 0, .has_vgpu_vfio = true, .has_migration = true, .has_scheduling = true, .has_notifications = true, .has_wpr = true, }; /* Version 570 interface */ static struct driver_interface interface_570 = { .version = "570", .major = 570, .minor = 0, .has_vgpu_vfio = true, .has_migration = true, .has_scheduling = true, .has_notifications = true, .has_wpr = true, }; /* Version 580 interface */ static struct driver_interface interface_580 = { .version = "580", .major = 580, .minor = 0, .has_vgpu_vfio = true, .has_migration = true, .has_scheduling = true, .has_notifications = true, .has_wpr = true, }; static struct driver_interface *interfaces[] = { &interface_550, &interface_560, &interface_570, &interface_580, NULL }; struct driver_interface *version_get_interface(const char *version_str) { int major = 0, minor = 0; if (version_str) { sscanf(version_str, "%d.%d", &major, &minor); } for (int i = 0; interfaces[i]; i++) { if (interfaces[i]->major == major) return interfaces[i]; } /* Default to latest known */ return &interface_570; } struct driver_interface *version_get_by_kernel_version(void) { /* Try to detect from kernel version or module version */ return &interface_570; } bool version_has_feature(struct driver_interface *iface, enum driver_feature feature) { if (!iface) return false; switch (feature) { case DRV_FEAT_VGPU_VFIO: return iface->has_vgpu_vfio; case DRV_FEAT_MIGRATION: return iface->has_migration; case DRV_FEAT_SCHEDULING: return iface->has_scheduling; case DRV_FEAT_NOTIFICATIONS: return iface->has_notifications; case DRV_FEAT_WPR: return iface->has_wpr; default: return false; } } const char *version_get_string(struct driver_interface *iface) { return iface ? iface->version : "unknown"; } EXPORT_SYMBOL_GPL(version_get_interface); EXPORT_SYMBOL_GPL(version_get_by_kernel_version); EXPORT_SYMBOL_GPL(version_has_feature); EXPORT_SYMBOL_GPL(version_get_string); MODULE_DESCRIPTION("Driver Version Adaptation Layer"); MODULE_LICENSE("GPL");