blob: c6ab9af66a480bcf384a6ef232a9d9fa28f03f2e [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.sysmem2;
using zx;
/// Sysmem Heaps can have different support for different coherency
/// domains. This table contains the support status for each coherency
/// domain of a Heap.
///
/// Each member property should correspond to a coherency domain defined
/// in the CoherencyDomain enum.
table CoherencyDomainSupport {
1: bool cpu_supported;
2: bool ram_supported;
3: bool inaccessible_supported;
};
/// Memory properties for a sysmem Heap.
/// Heaps send its properties to sysmem device at registration time based
/// on which sysmem can select the correct Heap to use.
table HeapProperties {
/// Status of support for coherency domains.
1: CoherencyDomainSupport coherency_domain_support;
/// Indicates whether sysmem needs to clear VMOs allocated by the Heap.
2: bool need_clear;
};
/// Manages resources on a specific sysmem heap.
protocol Heap {
/// Request a new memory allocation of `size` on heap.
/// For heaps which don't permit CPU access to the buffer data, this
/// will create a VMO with an official size, but which never has any
/// physical pages. For such heaps, the VMO is effectively used as
/// an opaque buffer identifier.
///
/// Heaps should defer allocation of any associated resources until
/// CreateResource(), because the caller of AllocateVmo() may simply
/// delete the returned VMO with no further notification to the heap.
/// In contrast, after CreateResource(), the caller guarantees that
/// DestroyResource() or heap channel closure will occur.
///
/// The caller guarantees that CreateResource() will be called prior
/// to the returned VMO or any associated child VMO being used.
AllocateVmo(uint64 size) -> (zx.status s, zx.handle:VMO? vmo);
/// Create resources and associate heap-specific resources with the
/// passed-in VMO. Resources can be hardware specific and their
/// lifetime don't have to be tied to `vmo`. `vmo` must be a VMO
/// (or a direct or indirect child of a VMO) acquired through a call
/// to AllocateVmo method above. If the passed-in vmo is a child VMO,
/// its size must match the size of the parent VMO created by
/// AllocateVmo(). For heaps that permit CPU access, the passed-in
/// VMO must not have a copy-on-write relationship with the parent
/// VMO, but rather a pass-through relationship. Successful return
/// status indicate that Heap has established a mapping between
/// VMO and hardware specific resources.
///
/// The returned id must be passed to DestroyResource() later when
/// resources associated with VMO are no longer needed, unless the
/// heap channel closes first.
///
/// The heap must not own/keep a handle to VMO, or any derived child
/// VMO, or any VMAR mapping to VMO, as any of those would keep VMO
/// alive beyond all sysmem participant usages of the vmo; instead
/// the heap can get the vmo's koid for the heap's mapping.
CreateResource(zx.handle:VMO vmo, SingleBufferSettings buffer_settings)
-> (zx.status s, uint64 id);
/// Destroy previously created resources.
DestroyResource(uint64 id) -> ();
/// This event is triggered when the Heap is registered. Properties
/// of this Heap will be sent to the sysmem device in the event.
///
/// Implementations should guarantee that this event should be sent
/// immediately when it binds to a channel, and this event should be
/// triggered only once per Heap instance.
// TODO(fxbug.dev/57690): Remove this event and pass in HeapProperties when
// registering sysmem Heaps after we migrate sysmem banjo proxying
// to FIDL.
-> OnRegister(HeapProperties properties);
};