mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 03:11:11 -04:00
gpu: nova-core: create GSP-RM logging buffers debugfs entries
Create read-only debugfs entries for LOGINIT, LOGRM, and LOGINTR, which are the three primary printf logging buffers from GSP-RM. LOGPMU will be added at a later date, as it requires support for its RPC message first. This patch uses the `pin_init_scope` feature to create the entries. `pin_init_scope` solves the lifetime issue over the `DEBUGFS_ROOT` reference by delaying its acquisition until the time the entry is actually initialized. Co-developed-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Timur Tabi <ttabi@nvidia.com> Tested-by: John Hubbard <jhubbard@nvidia.com> Tested-by: Eliot Courtney <ecourtney@nvidia.com> Link: https://patch.msgid.link/20260319212658.2541610-7-ttabi@nvidia.com [ Rebase onto Coherent<T> changes. - Danilo ] Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
committed by
Danilo Krummrich
parent
09691f5d80
commit
dff8302ca1
@@ -3,6 +3,7 @@
|
||||
mod boot;
|
||||
|
||||
use kernel::{
|
||||
debugfs,
|
||||
device,
|
||||
dma::{
|
||||
Coherent,
|
||||
@@ -106,17 +107,23 @@ fn new(dev: &device::Device<device::Bound>) -> Result<Self> {
|
||||
}
|
||||
}
|
||||
|
||||
/// GSP runtime data.
|
||||
#[pin_data]
|
||||
pub(crate) struct Gsp {
|
||||
/// Libos arguments.
|
||||
pub(crate) libos: Coherent<[LibosMemoryRegionInitArgument]>,
|
||||
struct LogBuffers {
|
||||
/// Init log buffer.
|
||||
loginit: LogBuffer,
|
||||
/// Interrupts log buffer.
|
||||
logintr: LogBuffer,
|
||||
/// RM log buffer.
|
||||
logrm: LogBuffer,
|
||||
}
|
||||
|
||||
/// GSP runtime data.
|
||||
#[pin_data]
|
||||
pub(crate) struct Gsp {
|
||||
/// Libos arguments.
|
||||
pub(crate) libos: Coherent<[LibosMemoryRegionInitArgument]>,
|
||||
/// Log buffers, optionally exposed via debugfs.
|
||||
#[pin]
|
||||
logs: debugfs::Scope<LogBuffers>,
|
||||
/// Command queue.
|
||||
#[pin]
|
||||
pub(crate) cmdq: Cmdq,
|
||||
@@ -130,13 +137,14 @@ pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> impl PinInit<Self, Error
|
||||
pin_init::pin_init_scope(move || {
|
||||
let dev = pdev.as_ref();
|
||||
|
||||
let loginit = LogBuffer::new(dev)?;
|
||||
let logintr = LogBuffer::new(dev)?;
|
||||
let logrm = LogBuffer::new(dev)?;
|
||||
|
||||
// Initialise the logging structures. The OpenRM equivalents are in:
|
||||
// _kgspInitLibosLoggingStructures (allocates memory for buffers)
|
||||
// kgspSetupLibosInitArgs_IMPL (creates pLibosInitArgs[] array)
|
||||
Ok(try_pin_init!(Self {
|
||||
loginit: LogBuffer::new(dev)?,
|
||||
logintr: LogBuffer::new(dev)?,
|
||||
logrm: LogBuffer::new(dev)?,
|
||||
cmdq <- Cmdq::new(dev),
|
||||
rmargs: Coherent::init(dev, GFP_KERNEL, GspArgumentsPadded::new(&cmdq))?,
|
||||
libos: {
|
||||
@@ -153,6 +161,29 @@ pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> impl PinInit<Self, Error
|
||||
|
||||
libos.into()
|
||||
},
|
||||
logs <- {
|
||||
let log_buffers = LogBuffers {
|
||||
loginit,
|
||||
logintr,
|
||||
logrm,
|
||||
};
|
||||
|
||||
#[allow(static_mut_refs)]
|
||||
// SAFETY: `DEBUGFS_ROOT` is created before driver registration and cleared
|
||||
// after driver unregistration, so no probe() can race with its modification.
|
||||
//
|
||||
// PANIC: `DEBUGFS_ROOT` cannot be `None` here. It is set before driver
|
||||
// registration and cleared after driver unregistration, so it is always
|
||||
// `Some` for the entire lifetime that probe() can be called.
|
||||
let log_parent: &debugfs::Dir = unsafe { crate::DEBUGFS_ROOT.as_ref() }
|
||||
.expect("DEBUGFS_ROOT not initialized");
|
||||
|
||||
log_parent.scope(log_buffers, dev.name(), |logs, dir| {
|
||||
dir.read_binary_file(c"loginit", &logs.loginit.0);
|
||||
dir.read_binary_file(c"logintr", &logs.logintr.0);
|
||||
dir.read_binary_file(c"logrm", &logs.logrm.0);
|
||||
})
|
||||
},
|
||||
}))
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user