[PATCH v2 30/31] gpu: nova-core: print GMC command names in debug logs
John Hubbard <[email protected]>
| Newsgroups | dev.linux.lists.nova-gpu,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Each GMC command has a name and a numeric ID. Nova-core has been printing a bare numeric ID for GMC send and receive debug lines. For example, 0x10001 instead of GSP_INIT. Add Display formatting and decoding, so that we print the command name, in addition to the ID. Example output: nova-core 0000:c2:00.0: GSP GMC: send: seq# 0, command=GSP_INIT (0x10001), length=0xf8 nova-core 0000:c2:00.0: GSP GMC: event: seq# 0, command=GSP_INIT (0x10001), length=0x550 Assisted-by: Cursor:grok-4.6 Signed-off-by: John Hubbard <[email protected]> --- drivers/gpu/nova-core/gsp/boot.rs | 5 ++- drivers/gpu/nova-core/gsp/cmdq.rs | 9 +++-- drivers/gpu/nova-core/gsp/fw.rs | 67 +++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/boot.rs index e66e8e454e27..51c5b2522408 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -45,6 +45,7 @@ commands, fw::{ BindataArgs, + GmcCommand, GspArgumentsPadded, GMCAPI_CMD_EXEC_GENERIC_BOOTLOADER, GMCAPI_CMD_EXEC_HS_BINARY, // @@ -278,8 +279,8 @@ fn dispatch_gmc_boot_event( _ => { dev_err!( dev, - "Unexpected GMC boot event: command_id={:#010x}\n", - command_id + "Unexpected GMC boot event: command={}\n", + GmcCommand(command_id) ); Err(EINVAL) } diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/cmdq.rs index fb7f000a5a7d..8e97cc71f2b6 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -52,6 +52,7 @@ driver::Bar0, gsp::{ fw::{ + GmcCommand, GspGmcMsgElement, GspMsgElement, MsgFunction, @@ -898,9 +899,9 @@ fn send_gmc( dev_dbg!( &self.dev, - "GSP GMC: send: seq# {}, command_id=0x{:x}, length=0x{:x}\n", + "GSP GMC: send: seq# {}, command={}, length=0x{:x}\n", rpc_seq, - command_id, + GmcCommand(command_id), dst.header.length(), ); @@ -1301,9 +1302,9 @@ fn receive_gmc_and_dispatch<R>( dev_dbg!( &self.dev, - "GSP GMC: event: seq# {}, command_id=0x{:x}, length=0x{:x}\n", + "GSP GMC: event: seq# {}, command={}, length=0x{:x}\n", header.gmc.sequence, - command_id, + GmcCommand(command_id), length, ); diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw.rs index 4f34c246cb3f..927332203a43 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -12,6 +12,7 @@ use kernel::{ bitfield, dma::Coherent, + fmt, io::io_write, prelude::*, ptr::{ @@ -722,6 +723,72 @@ unsafe impl AsBytes for GmcApiHeader {} // SAFETY: All fields are integer types for which all bit patterns are valid. unsafe impl FromBytes for GmcApiHeader {} +/// [`fmt::Display`] writes the command name and the numeric id, for example +/// `GSP_INIT (0x10001)`. An unrecognized id writes `UNKNOWN` and the same numeric form. +#[derive(Copy, Clone)] +pub(crate) struct GmcCommand(pub(crate) u32); + +impl GmcCommand { + fn name(self) -> &'static str { + match self.0 { + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_GSP_INIT => "GSP_INIT", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_EXEC_GENERIC_BOOTLOADER => { + "EXEC_GENERIC_BOOTLOADER" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_EXEC_HS_BINARY => "EXEC_HS_BINARY", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_GSP_SUSPEND => "GSP_SUSPEND", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_GSP_RESUME_DONE => "GSP_RESUME_DONE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_ADD_VGPU_TYPE => "ADD_VGPU_TYPE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_SUPPORTED_VGPU_TYPES => { + "QUERY_SUPPORTED_VGPU_TYPES" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_CREATABLE_VGPU_TYPES => { + "QUERY_CREATABLE_VGPU_TYPES" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_ASSIGN_VGPU_TYPE => "ASSIGN_VGPU_TYPE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_DEASSIGN_VGPU_TYPE => "DEASSIGN_VGPU_TYPE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_VGPU_PROPERTIES => "QUERY_VGPU_PROPERTIES", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE => { + "QUERY_ASSIGNED_VF_VGPU_TYPE" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_BOOTLOAD_GSP_VGPU_PLUGIN_TASK => { + "BOOTLOAD_GSP_VGPU_PLUGIN_TASK" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK => { + "SHUTDOWN_GSP_VGPU_PLUGIN_TASK" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_COMPLETE => { + "SHUTDOWN_GSP_VGPU_PLUGIN_TASK_COMPLETE" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES => { + "CLEANUP_GSP_VGPU_PLUGIN_RESOURCES" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_PLUGIN_TRIGGERED_EVENT => { + "VGPU_PLUGIN_TRIGGERED_EVENT" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_SCRUB_GUEST_FB => { + "VGPU_MGR_SCRUB_GUEST_FB" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_ALLOC_GSP_CEUTILS => { + "VGPU_MGR_ALLOC_GSP_CEUTILS" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_FREE_GSP_CEUTILS => { + "VGPU_MGR_FREE_GSP_CEUTILS" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SCHED_CONTROL => "SCHED_CONTROL", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_MMU_FAULT_QUEUED => "MMU_FAULT_QUEUED", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_INVALID => "INVALID", + _ => "UNKNOWN", + } + } +} + +impl fmt::Display for GmcCommand { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{} (0x{:x})", self.name(), self.0) + } +} + /// Header for an unencrypted GMC API message in the GSP command queue. /// /// The fields before `gmc` match `GSP_MSG_QUEUE_ELEMENT` through its -- 2.55.0