diff options
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/service/nvdrv/nvdrv.cpp | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index c874e6395..9b73886bb 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -2,19 +2,62 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "core/hle/ipc_helpers.h" +#include "core/hle/service/nvdrv/devices/nvdevice.h" +#include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" +#include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h" +#include "core/hle/service/nvdrv/devices/nvmap.h" #include "core/hle/service/nvdrv/nvdrv.h" -#include "core/hle/service/nvdrv/nvdrv_a.h" +#include "core/hle/service/nvdrv/interface.h" namespace Service { -namespace NVDRV { +namespace Nvidia { -std::weak_ptr<NVDRV_A> nvdrv_a; +std::weak_ptr<Module> nvdrv; void InstallInterfaces(SM::ServiceManager& service_manager) { - auto nvdrv = std::make_shared<NVDRV_A>(); - nvdrv->InstallAsService(service_manager); - nvdrv_a = nvdrv; + auto module_ = std::make_shared<Module>(); + std::make_shared<NVDRV>(module_, "nvdrv")->InstallAsService(service_manager); + std::make_shared<NVDRV>(module_, "nvdrv:a")->InstallAsService(service_manager); + nvdrv = module_; } -} // namespace NVDRV +Module::Module() { + auto nvmap_dev = std::make_shared<Devices::nvmap>(); + devices["/dev/nvhost-as-gpu"] = std::make_shared<Devices::nvhost_as_gpu>(); + devices["/dev/nvmap"] = nvmap_dev; + devices["/dev/nvdisp_disp0"] = std::make_shared<Devices::nvdisp_disp0>(nvmap_dev); +} + +u32 Module::Open(std::string device_name) { + ASSERT_MSG(devices.find(device_name) != devices.end(), "Trying to open unknown device %s", + device_name.c_str()); + + auto device = devices[device_name]; + u32 fd = next_fd++; + + open_files[fd] = device; + + return fd; +} + +u32 Module::Ioctl(u32 fd, u32 command, const std::vector<u8>& input, std::vector<u8>& output) { + auto itr = open_files.find(fd); + ASSERT_MSG(itr != open_files.end(), "Tried to talk to an invalid device"); + + auto device = itr->second; + return device->ioctl(command, input, output); +} + +ResultCode Module::Close(u32 fd) { + auto itr = open_files.find(fd); + ASSERT_MSG(itr != open_files.end(), "Tried to talk to an invalid device"); + + open_files.erase(itr); + + // TODO(flerovium): return correct result code if operation failed. + return RESULT_SUCCESS; +} + +} // namespace Nvidia } // namespace Service |