1 // Copyright 2018 The Fuchsia Authors
2 //
3 // Use of this source code is governed by a MIT-style
4 // license that can be found in the LICENSE file or at
5 // https://opensource.org/licenses/MIT
6 
7 #pragma once
8 
9 #include <err.h>
10 #include <stdint.h>
11 
12 #include <fbl/macros.h>
13 
14 namespace intel_iommu {
15 
16 // Manages the domain ID space for a given IOMMU.  This is not thread-safe.
17 class DomainAllocator {
18 public:
19     DomainAllocator();
20 
21     // Get an unused domain ID.
22     // Returns ZX_ERR_NO_RESOURCES if one cannot be found.
23     zx_status_t Allocate(uint32_t* domain_id);
24 
25     // Set the number of domain IDs this instance manages.  Panics if this call
26     // would reduce the max domain ID to below the current highest allocated one.
27     void set_num_domains(uint32_t num);
28 
29 private:
30     DISALLOW_COPY_ASSIGN_AND_MOVE(DomainAllocator);
31 
32     uint32_t num_domains_;
33     uint32_t next_domain_id_;
34 };
35 
36 } // namespace intel_iommu
37