blob: 52669ecfad7ad523d3cc3d680a192a8a48f59da6 [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.
#ifndef ZIRCON_SYSTEM_DEV_SYSMEM_SYSMEM_DEVICE_H_
#define ZIRCON_SYSTEM_DEV_SYSMEM_SYSMEM_DEVICE_H_
#include <ddk/binding.h>
#include <ddk/debug.h>
#include <ddk/device.h>
#include <ddk/driver.h>
#include <ddk/protocol/platform/device.h>
#include <ddk/protocol/sysmem.h>
#include <fbl/unique_ptr.h>
#include <fbl/vector.h>
#include <fuchsia/sysmem/c/fidl.h>
#include <lib/zx/bti.h>
#include <region-alloc/region-alloc.h>
#include "protected_memory_allocator.h"
#include <limits>
#include <map>
class Driver;
class BufferCollectionToken;
class Device {
public:
Device(zx_device_t* parent_device, Driver* parent_driver);
zx_status_t Bind();
//
// The rest of the methods are only valid to call after Bind().
//
zx_status_t Connect(zx_handle_t allocator_request);
const zx::bti& bti();
uint32_t pdev_device_info_vid();
uint32_t pdev_device_info_pid();
// Track/untrack the token by the koid of the server end of its FIDL
// channel. TrackToken() is only allowed after token->SerServerKoid().
// UntrackToken() is allowed even if there was never a
// token->SetServerKoid() (in which case it's a nop).
//
// While tracked, a token can be found with FindTokenByServerChannelKoid().
void TrackToken(BufferCollectionToken* token);
void UntrackToken(BufferCollectionToken* token);
// Find the BufferCollectionToken (if any) by the koid of the server end of
// its FIDL channel.
BufferCollectionToken* FindTokenByServerChannelKoid(
zx_koid_t token_server_koid);
ProtectedMemoryAllocator* protected_allocator() { return protected_allocator_.get(); }
private:
zx_device_t* parent_device_ = nullptr;
Driver* parent_driver_ = nullptr;
pdev_protocol_t pdev_{};
zx::bti bti_;
zx_device_t* device_ = nullptr;
// Initialize these to a value that won't be mistaken for a real vid or pid.
uint32_t pdev_device_info_vid_ = std::numeric_limits<uint32_t>::max();
uint32_t pdev_device_info_pid_ = std::numeric_limits<uint32_t>::max();
// In-proc sysmem interface. Essentially an in-proc version of
// fuchsia.sysmem.DriverConnector.
sysmem_protocol_t in_proc_sysmem_protocol_;
// This map allows us to look up the BufferCollectionToken by the koid of
// the server end of a BufferCollectionToken channel.
std::map<zx_koid_t, BufferCollectionToken*> tokens_by_koid_;
fbl::unique_ptr<ProtectedMemoryAllocator> protected_allocator_;
};
#endif // ZIRCON_SYSTEM_DEV_SYSMEM_SYSMEM_DEVICE_H_