mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 14:23:49 +01:00
GSP boot needs a stable view of vGPU state before it starts building the boot-time data structures that depend on SR-IOV and firmware policy. That state must be derived once from the PCI VF count and the FSP PRC vGPU mode knob before booting GSP. Add VgpuManager to detect and retain the vGPU state during GPU construction. Keep the manager separate from the detected state because later vGPU milestones will add vGPU resources and lifecycle state to it. Keep the vGPU capability gate local to the vGPU module with per-chip HAL modules. Treat failures to detect the optional vGPU state as disabled so they do not prevent a bare-metal probe, and log both the failure and the detected state where the manager is constructed. Cc: Alexandre Courbot <[email protected]> Signed-off-by: Zhi Wang <[email protected]> Reviewed-by: Alexandre Courbot <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Danilo Krummrich <[email protected]>
78 lines
1.8 KiB
Rust
78 lines
1.8 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Nova Core GPU Driver
|
|
|
|
use kernel::{
|
|
debugfs,
|
|
driver::Registration,
|
|
pci,
|
|
prelude::*,
|
|
InPlaceModule, //
|
|
};
|
|
|
|
mod driver;
|
|
mod falcon;
|
|
mod fb;
|
|
mod firmware;
|
|
mod fsp;
|
|
mod gpu;
|
|
mod gsp;
|
|
mod mctp;
|
|
#[macro_use]
|
|
mod num;
|
|
mod regs;
|
|
mod sbuffer;
|
|
mod vbios;
|
|
mod vgpu;
|
|
|
|
pub(crate) const MODULE_NAME: &core::ffi::CStr = <LocalModule as kernel::ModuleMetadata>::NAME;
|
|
|
|
// TODO: Move this into per-module data once that exists.
|
|
static mut DEBUGFS_ROOT: Option<debugfs::Dir> = None;
|
|
|
|
/// Guard that clears `DEBUGFS_ROOT` when dropped.
|
|
struct DebugfsRootGuard;
|
|
|
|
impl Drop for DebugfsRootGuard {
|
|
fn drop(&mut self) {
|
|
// SAFETY: This guard is dropped after `_driver` (due to field order),
|
|
// so the driver is unregistered and no probe() can be running.
|
|
unsafe { DEBUGFS_ROOT = None };
|
|
}
|
|
}
|
|
|
|
#[pin_data]
|
|
struct NovaCoreModule {
|
|
// Fields are dropped in declaration order, so `_driver` is dropped first,
|
|
// then `_debugfs_guard` clears `DEBUGFS_ROOT`.
|
|
#[pin]
|
|
_driver: Registration<pci::Adapter<driver::NovaCoreDriver>>,
|
|
_debugfs_guard: DebugfsRootGuard,
|
|
}
|
|
|
|
impl InPlaceModule for NovaCoreModule {
|
|
fn init(module: &'static kernel::ThisModule) -> impl PinInit<Self, Error> {
|
|
let dir = debugfs::Dir::new(c"nova-core");
|
|
|
|
// SAFETY: We are the only driver code running during init, so there
|
|
// cannot be any concurrent access to `DEBUGFS_ROOT`.
|
|
unsafe { DEBUGFS_ROOT = Some(dir) };
|
|
|
|
try_pin_init!(Self {
|
|
_driver <- Registration::new(MODULE_NAME, module),
|
|
_debugfs_guard: DebugfsRootGuard,
|
|
})
|
|
}
|
|
}
|
|
|
|
module! {
|
|
type: NovaCoreModule,
|
|
name: "nova-core",
|
|
authors: ["Danilo Krummrich"],
|
|
description: "Nova Core GPU driver",
|
|
license: "GPL v2",
|
|
firmware: [],
|
|
}
|
|
|
|
kernel::module_firmware!(firmware::ModInfoBuilder);
|