Lines Matching full:view

189 /// Returns a view for a given `offset`, performing compile-time bound checks.
195 ) -> <IO::Backend as IoBackend>::View<'a, U> { in io_view_assert()
202 let view = this.as_view(); in io_view_assert() localVariable
203 let ptr = IO::Backend::as_ptr(view); in io_view_assert()
207 unsafe { IO::Backend::project_view(view, projected_ptr) } in io_view_assert()
210 /// Returns a view for a given `offset`, performing runtime bound checks.
215 ) -> Result<<IO::Backend as IoBackend>::View<'a, U>> { in io_view()
216 let view = this.as_view(); in io_view() localVariable
217 let ptr = IO::Backend::as_ptr(view); in io_view()
226 Ok(unsafe { IO::Backend::project_view(view, projected_ptr) }) in io_view()
242 /// View type for this I/O backend.
243 type View<'a, T: ?Sized + KnownSize>: IoBase<'a, Backend = Self, Target = T>; typedef
245 /// Convert a `view` to a raw pointer for projection.
249 fn as_ptr<'a, T: ?Sized + KnownSize>(view: Self::View<'a, T>) -> *mut T; in as_ptr()
251 /// Project `view` to its subregion indicated by `ptr`.
253 /// If input `view` is valid, returned view must also be valid.
257 /// `ptr` must be a projection of `Self::as_ptr(view)`.
259 view: Self::View<'a, T>, in project_view()
261 ) -> Self::View<'a, U>; in project_view()
273 /// Performs an I/O read of type `T` at `view` and returns the result.
274 fn io_read<'a>(view: Self::View<'a, T>) -> T; in io_read()
276 /// Performs an I/O write of `value` at `view`.
277 fn io_write<'a>(view: Self::View<'a, T>, value: T); in io_write()
282 /// Copy contents of `view` to `buffer`.
286 /// - `buffer` is valid for volatile write for `view.size()` bytes.
287 /// - `buffer` should not overlap with `view`.
288 unsafe fn copy_from_io(view: Self::View<'_, [u8]>, buffer: *mut u8); in copy_from_io()
290 /// Copy contents from `buffer` to `view`.
294 /// - `buffer` is valid for volatile read for `view.size()` bytes.
295 /// - `buffer` should not overlap with `view`.
296 unsafe fn copy_to_io(view: Self::View<'_, [u8]>, buffer: *const u8); in copy_to_io()
298 /// Copy from `view` and return the value.
300 fn copy_read<T: FromBytes>(view: Self::View<'_, T>) -> T { in copy_read()
302 let ptr = Self::as_ptr(view); in copy_read()
306 view, in copy_read()
320 /// Copy `value` to `view`.
324 fn copy_write<T: IntoBytes>(view: Self::View<'_, T>, value: T) { in copy_write()
326 let ptr = Self::as_ptr(view); in copy_write()
330 view, in copy_write()
393 /// convert into [`IoBackend::View`]. Users should use the [`Io`] trait which provides the actual
396 /// This should be implemented on cheaply copyable handles, such as references or view types.
404 /// Return a view that covers the full region.
405 fn as_view(self) -> <Self::Backend as IoBackend>::View<'a, Self::Target>; in as_view()
440 /// Try to convert into a different typed I/O view.
443 /// current type, and the current view is properly aligned for the target type. Returns
465 fn try_cast<U>(self) -> Result<<Self::Backend as IoBackend>::View<'a, U>> in try_cast()
470 let view = self.as_view(); in try_cast() localVariable
471 let ptr = Self::Backend::as_ptr(view); in try_cast()
482 Ok(unsafe { Self::Backend::project_view(view, ptr.cast()) }) in try_cast()
849 let view = io_view::<Self, L::IoType>(self, location.offset())?; in try_read() localVariable
850 Ok(Self::Backend::io_read(view).into()) in try_read()
882 let view = io_view::<Self, L::IoType>(self, location.offset())?; in try_write() localVariable
884 Self::Backend::io_write(view, io_value); in try_write()
961 let view = io_view::<Self, L::IoType>(self, location.offset())?; in try_update() localVariable
963 let value: T = Self::Backend::io_read(view).into(); in try_update()
965 Self::Backend::io_write(view, io_value); in try_update()
997 let view = io_view_assert::<Self, L::IoType>(self, location.offset()); in read() localVariable
998 Self::Backend::io_read(view).into() in read()
1028 let view = io_view_assert::<Self, L::IoType>(self, location.offset()); in write() localVariable
1030 Self::Backend::io_write(view, io_value); in write()
1105 let view = io_view_assert::<Self, L::IoType>(self, location.offset()); in update() localVariable
1106 let value: T = Self::Backend::io_read(view).into(); in update()
1108 Self::Backend::io_write(view, io_value); in update()
1116 /// A view of memory-mapped I/O region.
1170 type View<'a, T: ?Sized + KnownSize> = Mmio<'a, T>; typedef
1173 fn as_ptr<'a, T: ?Sized + KnownSize>(view: Self::View<'a, T>) -> *mut T { in as_ptr()
1174 view.ptr in as_ptr()
1179 _view: Self::View<'a, T>, in project_view()
1181 ) -> Self::View<'a, U> { in project_view()
1182 // INVARIANT: Per safety requirement, `ptr` is projection from `view`, so it is also a valid in project_view()
1196 fn io_read(view: <$backend as IoBackend>::View<'_, $ty>) -> $ty {
1197 // SAFETY: `$backend::as_ptr(view)` is a valid pointer for MMIO operations for both
1199 unsafe { bindings::$read_fn($backend::as_ptr(view).cast_const().cast()) }
1203 fn io_write(view: <$backend as IoBackend>::View<'_, $ty>, value: $ty) {
1204 // SAFETY: `$backend::as_ptr(view)` is a valid pointer for MMIO operations for both
1206 unsafe { bindings::$write_fn(value, $backend::as_ptr(view).cast()) }
1222 unsafe fn copy_from_io(view: Self::View<'_, [u8]>, buffer: *mut u8) { in copy_from_io()
1224 // - `view.ptr` is valid MMIO memory for `view.size()` bytes. in copy_from_io()
1225 // - `buffer` is valid for write for `view.size()` bytes. in copy_from_io()
1227 bindings::memcpy_fromio(buffer.cast(), view.ptr.cast(), view.size()); in copy_from_io()
1232 unsafe fn copy_to_io(view: Self::View<'_, [u8]>, buffer: *const u8) { in copy_to_io()
1234 // - `view.ptr` is valid MMIO memory for `view.size()` bytes. in copy_to_io()
1235 // - `buffer` is valid for read for `view.size()` bytes. in copy_to_io()
1237 bindings::memcpy_toio(view.ptr.cast(), buffer.cast(), view.size()); in copy_to_io()
1262 type View<'a, T: ?Sized + KnownSize> = RelaxedMmio<'a, T>; typedef
1265 fn as_ptr<'a, T: ?Sized + KnownSize>(view: Self::View<'a, T>) -> *mut T { in as_ptr()
1266 MmioBackend::as_ptr(view.0) in as_ptr()
1271 view: Self::View<'a, T>, in project_view()
1273 ) -> Self::View<'a, U> { in project_view()
1275 RelaxedMmio(unsafe { MmioBackend::project_view(view.0, ptr) }) in project_view()
1329 type View<'a, T: ?Sized + KnownSize> = SysMem<'a, T>; typedef
1332 fn as_ptr<'a, T: ?Sized + KnownSize>(view: Self::View<'a, T>) -> *mut T { in as_ptr()
1333 view.ptr in as_ptr()
1338 _view: Self::View<'a, T>, in project_view()
1340 ) -> Self::View<'a, U> { in project_view()
1341 // INVARIANT: Per safety requirement, `ptr` is projection from `view`, so it is also a valid in project_view()
1356 fn io_read(view: SysMem<'_, $ty>) -> $ty {
1363 unsafe { view.ptr.read_volatile() }
1367 fn io_write(view: SysMem<'_, $ty>, value: $ty) {
1373 unsafe { view.ptr.write_volatile(value) }
1387 unsafe fn copy_from_io(view: Self::View<'_, [u8]>, buffer: *mut u8) { in copy_from_io()
1390 // - `view.ptr` is in CPU address space and valid for read. in copy_from_io()
1391 // - `buffer` is valid for write for `view.size()` bytes which is equal to `view.ptr.len()`. in copy_from_io()
1392 unsafe { bindings::memcpy(buffer.cast(), view.ptr.cast(), view.ptr.len()) }; in copy_from_io()
1396 unsafe fn copy_to_io(view: Self::View<'_, [u8]>, buffer: *const u8) { in copy_to_io()
1399 // - `view.ptr` is in CPU address space and valid for write. in copy_to_io()
1400 // - `buffer` is valid for read for `view.size()` bytes which is equal to `view.ptr.len()`. in copy_to_io()
1401 unsafe { bindings::memcpy(view.ptr.cast(), buffer.cast(), view.ptr.len()) }; in copy_to_io()
1405 fn copy_read<T: FromBytes>(view: Self::View<'_, T>) -> T { in copy_read()
1412 unsafe { view.ptr.read_volatile() } in copy_read()
1416 fn copy_write<T: IntoBytes>(view: Self::View<'_, T>, value: T) { in copy_write()
1422 unsafe { view.ptr.write_volatile(value) } in copy_write()
1426 /// A view of a system memory region.
1483 fn as_view(self) -> <Self::Backend as IoBackend>::View<'a, Self::Target> { in as_view()
1502 /// The view is I/O memory.
1504 /// The view is system memory.
1531 type View<'a, T: ?Sized + KnownSize> = IoSysMap<'a, T>; typedef
1534 fn as_ptr<'a, T: ?Sized + KnownSize>(view: Self::View<'a, T>) -> *mut T { in as_ptr()
1535 match view { in as_ptr()
1543 view: Self::View<'a, T>, in project_view()
1545 ) -> Self::View<'a, U> { in project_view()
1546 match view { in project_view()
1561 fn io_read(view: Self::View<'_, T>) -> T { in io_read()
1562 match view { in io_read()
1569 fn io_write<'a>(view: Self::View<'a, T>, value: T) { in io_write()
1570 match view { in io_write()
1579 unsafe fn copy_from_io(view: Self::View<'_, [u8]>, buffer: *mut u8) { in copy_from_io()
1580 match view { in copy_from_io()
1589 unsafe fn copy_to_io(view: Self::View<'_, [u8]>, buffer: *const u8) { in copy_to_io()
1590 match view { in copy_to_io()
1599 fn copy_read<T: FromBytes>(view: Self::View<'_, T>) -> T { in copy_read()
1600 match view { in copy_read()
1607 fn copy_write<T: IntoBytes>(view: Self::View<'_, T>, value: T) { in copy_write()
1608 match view { in copy_write()
1633 T: Io<'a, Backend: IoBackend<View<'a, T::Target> = T>>,
1648 ) -> <T::Backend as IoBackend>::View<'a, U> { in project_view()
1682 let view = $crate::io::ProjectHelper($io.as_view()); localVariable
1684 mut view.as_ptr(), $($proj)*
1688 unsafe { view.project_view(ptr) }