diff --git a/drivers/gpu/drm/rvkms/output.rs b/drivers/gpu/drm/rvkms/output.rs
index d5ee58cbfa5a329562095b6af9597c45d7ee022d..dc3c1285a0e4d4c23f6b9c163a04f7ba3ccd823d 100644
--- a/drivers/gpu/drm/rvkms/output.rs
+++ b/drivers/gpu/drm/rvkms/output.rs
@@ -1,3 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0
+use crate::{
+    crtc::UnregisteredCrtc,
+    plane::UnregisteredPlane,
+    connector::UnregisteredConnector,
+    encoder::UnregisteredEncoder,
+    RvkmsDevice,
+    RvkmsDriver
+};
+use kernel::{
+    drm::{
+        fourcc::*,
+        kms::{
+            connector,
+            encoder,
+            plane,
+            framebuffer::*,
+            UnregisteredKmsDevice,
+        },
+    },
+    sync::Arc,
+    prelude::*,
+    types::ARef,
+};
 
-Type
-Type
+pub(crate) fn create_output(dev: &UnregisteredKmsDevice<'_, RvkmsDriver>, index: u8) -> Result {
+    let possible_crtcs = 1 << index;
+
+    let primary = UnregisteredPlane::new(
+        dev,
+        possible_crtcs,
+        &[XRGB888],
+        None,
+        plane::Type::Primary,
+        None,
+        ()
+    )?;
+
+    let crtc = UnregisteredCrtc::new(dev, primary, Option::<&UnregisteredPlane>::None, None, ())?;
+
+    let connector = UnregisteredConnector::new(dev, connector::Type::Virtual, ())?;
+
+    let encoder = UnregisteredEncoder::new(
+        dev,
+        encoder::Type::Virtual,
+        possible_crtcs,
+        0,
+        None,
+        ()
+    )?;
+
+    connector.attach_encoder(encoder)
+}