@@ -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