blob: c13bc9f0f5358d0c265e1d361485d35704b022a2 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include "domain_allocator.h"
#include <assert.h>
namespace intel_iommu {
DomainAllocator::DomainAllocator()
// Note that next_domain_id_ starts at 1, since under some conditions 0 is
// an invalid domain ID (i.e. if CM is set in the capability register).
: num_domains_(0), next_domain_id_(1) {}
zx_status_t DomainAllocator::Allocate(uint32_t* domain_id) {
if (next_domain_id_ >= num_domains_) {
return ZX_ERR_NO_RESOURCES;
}
// This allocator should be enough, since the hardware should have enough
// domain IDs for each device hanging off of it. If we start deallocating
// Context Entries, we'll need to make this allocator more sophisticated to
// manage the ID reuse.
*domain_id = next_domain_id_++;
return ZX_OK;
}
void DomainAllocator::set_num_domains(uint32_t num) {
ASSERT(num >= next_domain_id_);
num_domains_ = num;
}
} // namespace intel_iommu