// Copyright 2019 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

#ifndef ZIRCON_KERNEL_VM_INCLUDE_VM_PAGE_REQUEST_H_
#define ZIRCON_KERNEL_VM_INCLUDE_VM_PAGE_REQUEST_H_

#include <zircon/listnode.h>
#include <zircon/types.h>

// Callback from the pmm invoked when pages become available. Note that this callback
// is not given any information about how many pages are available. The callback should
// try to fulfill the request starting from |offset| and should populate |actual_supplied|
// with the amount that was actually able to be allocated. If this value is not equal to
// |length|, then the callback will be invoked again with updated args when more pages
// become available.
typedef void (*pages_available_cb_t)(void* ctx, uint64_t offset, uint64_t length,
                                     uint64_t* actual_supplied);
// Callback from the pmm invoked when the pmm will no longer make any calls using |ctx|.
typedef void (*drop_ref_cb_t)(void* ctx);

// Struct used for making delayed page requests to a page provider.
//
// Currently, the two types of page providers are the pmm and PagerProxy.
typedef struct page_request {
  // Offset and length of the request. These should be initialized before being
  // passed to the provider, and should not be accessed after being passed to the provider.
  //
  // The pmm does not care about the units (i.e. bytes vs pages), as long as these fields are
  // consistent with each other and the implementation of |pages_available_cb|. PagerProxy
  // expects units of pages.
  uint64_t offset;
  uint64_t length;

  // Members only used by the pmm provider. Callbacks are executed on a dedicated
  // thread with no locks held.
  pages_available_cb_t pages_available_cb;
  drop_ref_cb_t drop_ref_cb;
  // ctx to use when invoking the above callbacks. The pmm may temporarily retain a
  // reference to cb_ctx even after the request is completed or cancelled, so the caller
  // needs to ensure that cb_ctx remains valid until drop_ref_cb is invoked.
  void* cb_ctx;

  // List node used by the page provider.
  list_node_t provider_node;
} page_request_t;

#endif  // ZIRCON_KERNEL_VM_INCLUDE_VM_PAGE_REQUEST_H_
