Skip to content

Commit ab536b6

Browse files
committed
drm/asahi: Move unsafe data initialization to driver code
Keep the drm_device private data initialization after device creation hacks out of rust/drm/device.rs. This will hopefully soon be solved by device context for drm::device::Device. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 2698fa4 commit ab536b6

1 file changed

Lines changed: 16 additions & 9 deletions

File tree

drivers/gpu/drm/asahi/driver.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -178,25 +178,31 @@ impl platform::Driver for AsahiDriver {
178178
.property_read_array_vec(c_str!("apple,firmware-compat"), 3)?
179179
.required_by(pdev.as_ref())?;
180180

181-
let raw_drm = unsafe { drm::device::Device::<AsahiDriver>::new_uninit(pdev.as_ref())? };
182-
183-
let drm: AsahiDevRef = unsafe { ARef::from_raw(raw_drm) };
181+
// TODO: This is very temporary
182+
// SAFETY: This should be safe as data is not touched by the driver
183+
// untill it gets fully initialised.
184+
// Additionally drm::device::Device::release() will not drop data and
185+
// leaks instead.
186+
let uninit = unsafe {
187+
pin_init::pin_init_from_closure::<AsahiData, kernel::error::Error>(|_slot| Ok(()))
188+
};
189+
let drm: ARef<AsahiDevice> = drm::device::Device::new(pdev.as_ref(), uninit)?;
184190

185191
let gpu = match (cfg.gpu_gen, cfg.gpu_variant, compat.as_slice()) {
186192
(hw::GpuGen::G13, _, &[12, 3, 0]) => {
187-
gpu::GpuManagerG13V12_3::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
193+
gpu::GpuManagerG13V12_3::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
188194
}
189195
(hw::GpuGen::G14, hw::GpuVariant::G, &[12, 4, 0]) => {
190-
gpu::GpuManagerG14V12_4::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
196+
gpu::GpuManagerG14V12_4::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
191197
}
192198
(hw::GpuGen::G13, _, &[13, 5, 0]) => {
193-
gpu::GpuManagerG13V13_5::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
199+
gpu::GpuManagerG13V13_5::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
194200
}
195201
(hw::GpuGen::G14, hw::GpuVariant::G, &[13, 5, 0]) => {
196-
gpu::GpuManagerG14V13_5::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
202+
gpu::GpuManagerG14V13_5::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
197203
}
198204
(hw::GpuGen::G14, _, &[13, 5, 0]) => {
199-
gpu::GpuManagerG14XV13_5::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
205+
gpu::GpuManagerG14XV13_5::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
200206
}
201207
_ => {
202208
dev_info!(
@@ -216,7 +222,8 @@ impl platform::Driver for AsahiDriver {
216222
resources: res,
217223
});
218224

219-
let drm = unsafe { AsahiDevice::init_data(raw_drm, data)? };
225+
let ptr: *const AsahiData = &raw const **drm;
226+
unsafe { data.__pinned_init(ptr as *mut AsahiData)?; }
220227

221228
(*drm).gpu.init()?;
222229

0 commit comments

Comments
 (0)