The limit is 16 pages for a single command sent to the GSP. Return an
error if `allocate_command` is called with a too large size.

Signed-off-by: Eliot Courtney <[email protected]>
---
 drivers/gpu/nova-core/gsp/cmdq.rs | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs 
b/drivers/gpu/nova-core/gsp/cmdq.rs
index baae06de0e09..dbc9e95f1b17 100644
--- a/drivers/gpu/nova-core/gsp/cmdq.rs
+++ b/drivers/gpu/nova-core/gsp/cmdq.rs
@@ -122,6 +122,11 @@ fn read(
 /// Number of GSP pages making the [`Msgq`].
 pub(crate) const MSGQ_NUM_PAGES: u32 = 0x3f;
 
+/// Maximum size of a single GSP command in bytes.
+///
+/// A single command can span up to 16 GSP pages.
+pub(crate) const MSGQ_MSG_SIZE_MAX: usize = GSP_PAGE_SIZE * 16;
+
 /// Circular buffer of a [`Msgq`].
 ///
 /// This area of memory is to be shared between the driver and the GSP to 
exchange commands or
@@ -329,8 +334,11 @@ fn allocate_command(&mut self, size: usize) -> 
Result<GspCommand<'_>> {
     /// # Errors
     ///
     /// - `ETIMEDOUT` if space does not become available within the timeout.
-    /// - `EIO` if the command header is not properly aligned.
+    /// - `EIO` if the command header is not properly aligned or sizing is 
impossible.
     fn allocate_command_with_timeout(&mut self, size: usize) -> 
Result<GspCommand<'_>> {
+        if size_of::<GspMsgElement>() + size > MSGQ_MSG_SIZE_MAX {
+            return Err(EIO);
+        }
         read_poll_timeout(
             || Ok(self.driver_bytes_available_to_write()),
             |available_bytes| *available_bytes >= size_of::<GspMsgElement>() + 
size,

-- 
2.53.0

Reply via email to