diff options
Diffstat (limited to 'src/core/hle/service')
-rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | 49 | ||||
-rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h | 27 |
2 files changed, 49 insertions, 27 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 6b062e10e..485ac5f50 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -39,7 +39,7 @@ NvResult nvhost_as_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, case 0x8: return GetVARegions(input, output); case 0x9: - return InitalizeEx(input, output); + return AllocAsEx(input, output); case 0x14: return Remap(input, output); default: @@ -78,11 +78,16 @@ NvResult nvhost_as_gpu::Ioctl3(Ioctl command, const std::vector<u8>& input, std: return NvResult::NotImplemented; } -NvResult nvhost_as_gpu::InitalizeEx(const std::vector<u8>& input, std::vector<u8>& output) { - IoctlInitalizeEx params{}; +NvResult nvhost_as_gpu::AllocAsEx(const std::vector<u8>& input, std::vector<u8>& output) { + IoctlAllocAsEx params{}; std::memcpy(¶ms, input.data(), input.size()); LOG_WARNING(Service_NVDRV, "(STUBBED) called, big_page_size=0x{:X}", params.big_page_size); + if (params.big_page_size == 0) { + params.big_page_size = DEFAULT_BIG_PAGE_SIZE; + } + + big_page_size = params.big_page_size; return NvResult::Success; } @@ -276,13 +281,18 @@ NvResult nvhost_as_gpu::GetVARegions(const std::vector<u8>& input, std::vector<u params.buf_size); params.buf_size = 0x30; - params.regions[0].offset = 0x04000000; - params.regions[0].page_size = 0x1000; - params.regions[0].pages = 0x3fbfff; - params.regions[1].offset = 0x04000000; - params.regions[1].page_size = 0x10000; - params.regions[1].pages = 0x1bffff; + params.small = IoctlVaRegion{ + .offset = 0x04000000, + .page_size = DEFAULT_SMALL_PAGE_SIZE, + .pages = 0x3fbfff, + }; + + params.big = IoctlVaRegion{ + .offset = 0x04000000, + .page_size = big_page_size, + .pages = 0x1bffff, + }; // TODO(ogniK): This probably can stay stubbed but should add support way way later @@ -299,18 +309,25 @@ NvResult nvhost_as_gpu::GetVARegions(const std::vector<u8>& input, std::vector<u params.buf_size); params.buf_size = 0x30; - params.regions[0].offset = 0x04000000; - params.regions[0].page_size = 0x1000; - params.regions[0].pages = 0x3fbfff; - params.regions[1].offset = 0x04000000; - params.regions[1].page_size = 0x10000; - params.regions[1].pages = 0x1bffff; + params.small = IoctlVaRegion{ + .offset = 0x04000000, + .page_size = 0x1000, + .pages = 0x3fbfff, + }; + + params.big = IoctlVaRegion{ + .offset = 0x04000000, + .page_size = big_page_size, + .pages = 0x1bffff, + }; // TODO(ogniK): This probably can stay stubbed but should add support way way later std::memcpy(output.data(), ¶ms, output.size()); - std::memcpy(inline_output.data(), ¶ms.regions, inline_output.size()); + std::memcpy(inline_output.data(), ¶ms.small, sizeof(IoctlVaRegion)); + std::memcpy(inline_output.data() + sizeof(IoctlVaRegion), ¶ms.big, sizeof(IoctlVaRegion)); + return NvResult::Success; } diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h index 08035fa0e..9ee60e060 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h @@ -16,6 +16,9 @@ namespace Service::Nvidia::Devices { +constexpr u32 DEFAULT_BIG_PAGE_SIZE = 1 << 16; +constexpr u32 DEFAULT_SMALL_PAGE_SIZE = 1 << 12; + class nvmap; enum class AddressSpaceFlags : u32 { @@ -76,16 +79,16 @@ private: bool is_allocated{}; }; - struct IoctlInitalizeEx { - u32_le big_page_size{}; // depends on GPU's available_big_page_sizes; 0=default - s32_le as_fd{}; // ignored; passes 0 - u32_le flags{}; // passes 0 - u32_le reserved{}; // ignored; passes 0 - u64_le unk0{}; - u64_le unk1{}; - u64_le unk2{}; + struct IoctlAllocAsEx { + u32_le flags{}; // usually passes 1 + s32_le as_fd{}; // ignored; passes 0 + u32_le big_page_size{}; + u32_le reserved{}; // ignored; passes 0 + u64_le va_range_start{}; + u64_le va_range_end{}; + u64_le va_range_split{}; }; - static_assert(sizeof(IoctlInitalizeEx) == 40, "IoctlInitalizeEx is incorrect size"); + static_assert(sizeof(IoctlAllocAsEx) == 40, "IoctlAllocAsEx is incorrect size"); struct IoctlAllocSpace { u32_le pages{}; @@ -149,14 +152,16 @@ private: u64_le buf_addr{}; // (contained output user ptr on linux, ignored) u32_le buf_size{}; // forced to 2*sizeof(struct va_region) u32_le reserved{}; - IoctlVaRegion regions[2]{}; + IoctlVaRegion small{}; + IoctlVaRegion big{}; }; static_assert(sizeof(IoctlGetVaRegions) == 16 + sizeof(IoctlVaRegion) * 2, "IoctlGetVaRegions is incorrect size"); s32 channel{}; + u32 big_page_size{DEFAULT_BIG_PAGE_SIZE}; - NvResult InitalizeEx(const std::vector<u8>& input, std::vector<u8>& output); + NvResult AllocAsEx(const std::vector<u8>& input, std::vector<u8>& output); NvResult AllocateSpace(const std::vector<u8>& input, std::vector<u8>& output); NvResult Remap(const std::vector<u8>& input, std::vector<u8>& output); NvResult MapBufferEx(const std::vector<u8>& input, std::vector<u8>& output); |