// SPDX-FileCopyrightText: 2021 yuzu emulator team and Skyline Team and Contributors // (https://github.com/skyline-emu/) // SPDX-License-Identifier: GPL-3.0-or-later Licensed under GPLv3 // or any later version Refer to the license.txt file included. #pragma once #include #include #include #include #include #include "common/common_types.h" #include "core/hle/service/kernel_helpers.h" #include "core/hle/service/nvdrv/core/container.h" #include "core/hle/service/nvdrv/nvdata.h" #include "core/hle/service/nvflinger/ui/fence.h" #include "core/hle/service/service.h" namespace Core { class System; } namespace Kernel { class KEvent; } namespace Service::NVFlinger { class NVFlinger; } namespace Service::Nvidia { namespace NvCore { class Container; class SyncpointManager; } // namespace NvCore namespace Devices { class nvdevice; class nvhost_ctrl; } // namespace Devices class Module; class EventInterface { public: EventInterface(Module& module_); ~EventInterface(); void RegisterForSignal(Devices::nvhost_ctrl*); void UnregisterForSignal(Devices::nvhost_ctrl*); void Signal(u32 syncpoint_id, u32 value); Kernel::KEvent* CreateEvent(std::string name); void FreeEvent(Kernel::KEvent* event); private: Module& module; std::mutex guard; std::list on_signal; }; class Module final { public: explicit Module(Core::System& system_); ~Module(); /// Returns a pointer to one of the available devices, identified by its name. template std::shared_ptr GetDevice(DeviceFD fd) { auto itr = open_files.find(fd); if (itr == open_files.end()) return nullptr; return std::static_pointer_cast(itr->second); } NvResult VerifyFD(DeviceFD fd) const; /// Opens a device node and returns a file descriptor to it. DeviceFD Open(const std::string& device_name); /// Sends an ioctl command to the specified file descriptor. NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector& input, std::vector& output); NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector& input, const std::vector& inline_input, std::vector& output); NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector& input, std::vector& output, std::vector& inline_output); /// Closes a device file descriptor and returns operation success. NvResult Close(DeviceFD fd); void SignalSyncpt(const u32 syncpoint_id, const u32 value); NvResult QueryEvent(DeviceFD fd, u32 event_id, Kernel::KEvent*& event); private: friend class EventInterface; /// Id to use for the next open file descriptor. DeviceFD next_fd = 1; using FilesContainerType = std::unordered_map>; /// Mapping of file descriptors to the devices they reference. FilesContainerType open_files; /// Mapping of device node names to their implementation. std::unordered_map> devices; KernelHelpers::ServiceContext service_context; EventInterface events_interface; /// Manages syncpoints on the host NvCore::Container container; void CreateEvent(u32 event_id); void FreeEvent(u32 event_id); std::unordered_map> builders; }; /// Registers all NVDRV services with the specified service manager. void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger, Core::System& system); } // namespace Service::Nvidia