L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
device.h
1/*
2 * Copyright (C) 2018-2020, 2024 Kernkonzept GmbH.
3 * Author(s): Sarah Hoffmann <sarah.hoffmann@kernkonzept.com>
4 *
5 * License: see LICENSE.spdx (in this directory or the directories above)
6 */
7#pragma once
8
9#include <l4/cxx/ref_ptr>
10#include <l4/cxx/string>
11#include <l4/re/dataspace>
12#include <l4/re/dma_space>
13
14#include <l4/libblock-device/errand.h>
15#include <l4/libblock-device/types.h>
16
17namespace Block_device {
18
33{
34};
35
36struct Device : public cxx::Ref_obj
37{
38 virtual ~Device() = 0;
39
41 virtual Notification_domain const *notification_domain() const = 0;
42
44 virtual bool is_read_only() const = 0;
46 virtual bool match_hid(cxx::String const &hid) const = 0;
48 virtual l4_uint64_t capacity() const = 0;
50 virtual l4_size_t sector_size() const = 0;
52 virtual l4_size_t max_size() const = 0;
54 virtual unsigned max_segments() const = 0;
57 virtual bool supports_flush() const { return true; }
58
60 virtual void reset() = 0;
61
63 virtual int dma_map(Block_device::Mem_region *region, l4_addr_t offset,
66
68 virtual int dma_unmap(L4Re::Dma_space::Dma_addr phys, l4_size_t num_sectors,
70
85 virtual int inout_data(l4_uint64_t sector,
86 Block_device::Inout_block const &blocks,
87 Block_device::Inout_callback const &cb,
89
100 virtual int flush(Block_device::Inout_callback const &cb) = 0;
101
103 virtual void start_device_scan(Block_device::Errand::Callback const &callback) = 0;
104};
105
106inline Device::~Device() = default;
107
111template <typename DEV>
113{
115 Notification_domain const *notification_domain() const override
116 { return &dom; }
117};
118
123{
124 struct Discard_info
125 {
126 unsigned max_discard_sectors = 0;
127 unsigned max_discard_seg = 0;
128 unsigned discard_sector_alignment = 1;
129 unsigned max_write_zeroes_sectors = 0;
130 unsigned max_write_zeroes_seg = 0;
131 bool write_zeroes_may_unmap = false;
132 };
133
134 virtual Discard_info discard_info() const = 0;
135
137 virtual int discard(l4_uint64_t offset,
138 Block_device::Inout_block const &blocks,
139 Block_device::Inout_callback const &cb, bool discard) = 0;
140
141protected:
142 ~Device_discard_feature() = default;
143};
144
145} // name space
l4_uint64_t Dma_addr
Data type for DMA addresses.
Definition dma_space:59
Direction
Direction of the DMA transfers.
Definition dma_space:65
Allocation free string class with explicit length field.
Definition string:31
Dataspace interface.
unsigned int l4_size_t
Unsigned size type.
Definition l4int.h:22
unsigned long l4_addr_t
Address type.
Definition l4int.h:34
unsigned long long l4_uint64_t
Unsigned 64bit value.
Definition l4int.h:31
Partial interface for devices that offer discard functionality.
Definition device.h:123
virtual int discard(l4_uint64_t offset, Block_device::Inout_block const &blocks, Block_device::Inout_callback const &cb, bool discard)=0
Issues one or more WRITE_ZEROES or DISCARD commands.
Device with a per-device notification domain.
Definition device.h:113
Description of an inout block to be sent to the device.
Definition types.h:67
Opaque type for representing a notification domain.
Definition device.h:33