Skip to content

Commit b08e1ad

Browse files
drm: initial implementation DRM_IOCTL_GET_ENCODER
Signed-off-by: Andy-Python-Programmer <andypythonappdeveloper@gmail.com>
1 parent 2ed85ec commit b08e1ad

File tree

2 files changed

+60
-4
lines changed

2 files changed

+60
-4
lines changed

src/aero_kernel/src/drivers/drm/mod.rs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ trait ModeObject: Send + Sync + Downcastable {
5656
fn as_connector(&self) -> Arc<Connector> {
5757
utils::downcast::<dyn ModeObject, Connector>(&self.object()).unwrap()
5858
}
59+
60+
/// Converts this mode object into an encoder.
61+
///
62+
/// # Panics
63+
/// * Called on a non-encoder mode object.
64+
fn as_encoder(&self) -> Arc<Encoder> {
65+
utils::downcast::<dyn ModeObject, Encoder>(&self.object()).unwrap()
66+
}
5967
}
6068

6169
trait DrmDevice: Send + Sync {
@@ -125,16 +133,34 @@ impl ModeObject for Crtc {
125133

126134
struct Encoder {
127135
sref: Weak<Self>,
136+
137+
/// The current CRTC for this encoder.
138+
current_crtc: Arc<Crtc>,
139+
/// A vector contaning all the possible CRTCs for this encoder.
140+
possible_crtcs: Vec<Arc<Crtc>>,
141+
/// A vector contaning all the possible sibling encoders for cloning.
142+
possible_clones: Vec<Arc<Encoder>>,
143+
128144
object_id: u32,
129-
// index: u32,
145+
index: u32,
130146
}
131147

132148
impl Encoder {
133-
pub fn new(object_id: u32) -> Arc<Self> {
149+
pub fn new(
150+
drm: &Drm,
151+
current_crtc: Arc<Crtc>,
152+
possible_crtcs: Vec<Arc<Crtc>>,
153+
object_id: u32,
154+
) -> Arc<Self> {
134155
Arc::new_cyclic(|sref| Self {
135156
sref: sref.clone(),
136157

158+
current_crtc,
159+
possible_crtcs,
160+
possible_clones: alloc::vec![], // todo: add self as possible clone.
161+
137162
object_id,
163+
index: drm.encoders.lock().len() as _,
138164
})
139165
}
140166
}
@@ -164,7 +190,6 @@ struct Connector {
164190
modes: Vec<DrmModeInfo>,
165191

166192
connector_typ: u32,
167-
168193
object_id: u32,
169194
}
170195

@@ -302,6 +327,12 @@ impl Drm {
302327
self.install_object(connector)
303328
}
304329

330+
/// Installs and initializes the encoder identifier.
331+
pub fn install_encoder(&self, encoder: Arc<Encoder>) {
332+
self.encoders.lock().push(encoder.clone());
333+
self.install_object(encoder)
334+
}
335+
305336
pub fn allocate_object_id(&self) -> u32 {
306337
self.id_alloc.alloc() as _
307338
}
@@ -409,6 +440,24 @@ impl INodeInterface for Drm {
409440
.read_mut::<DrmModeGetEncoder>()
410441
.unwrap();
411442

443+
let object = self.find_object(struc.encoder_id).unwrap().as_encoder();
444+
struc.crtc_id = object.current_crtc.id();
445+
446+
let mut crtc_mask = 0;
447+
for crtc in object.possible_crtcs.iter() {
448+
crtc_mask = 1 << crtc.index;
449+
}
450+
451+
struc.possible_crtcs = crtc_mask;
452+
453+
let mut clone_mask = 0;
454+
for clone in object.possible_clones.iter() {
455+
clone_mask = 1 << clone.index;
456+
}
457+
458+
struc.possible_clones = clone_mask;
459+
struc.encoder_typ = 0; // todo: fill in the encoder typ.
460+
412461
Ok(0)
413462
}
414463

src/aero_kernel/src/drivers/drm/rawfb.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,13 @@ fn init() {
5757
let rfb = Drm::new(Arc::new(RawFramebuffer {}));
5858

5959
let crtc = Crtc::new(&rfb, rfb.allocate_object_id());
60-
let encoder = Encoder::new(rfb.allocate_object_id());
60+
61+
let encoder = Encoder::new(
62+
&rfb,
63+
crtc.clone(),
64+
alloc::vec![crtc.clone()],
65+
rfb.allocate_object_id(),
66+
);
6167

6268
let connector = Connector::new(
6369
encoder.clone(),
@@ -78,6 +84,7 @@ fn init() {
7884

7985
rfb.install_crtc(crtc);
8086
rfb.install_connector(connector);
87+
rfb.install_encoder(encoder);
8188

8289
devfs::install_device_at(dri, rfb).expect("ramfs: failed to install DRM device");
8390
}

0 commit comments

Comments
 (0)