mirror of
https://git.citron-emu.org/Citron/Citron.git
synced 2025-01-22 08:36:32 +01:00
service/nvdrv: Relax GPU validation and improve error handling
Relaxes validation checks in the NVDRV GPU service and improves error notifier handling to prevent potential hangs. Key changes: - Remove strict size validation in SetErrorNotifier - Relax GPFIFO entry count validation to only check for non-zero values - Add proper error notifier state tracking in GPU class - Improve debug logging messages The previous strict validation was causing issues with some games like ACNH. These changes maintain necessary checks while being more permissive with edge cases that don't impact functionality. Technical changes: - Store error notifier state in GPU class for future implementation - Remove upper bound check on GPFIFO entries - Simplify error notifier setup flow This should resolve hanging issues while maintaining core functionality.
This commit is contained in:
parent
d7dc87bbf3
commit
774d8d9eba
2 changed files with 16 additions and 12 deletions
|
@ -159,17 +159,11 @@ NvResult nvhost_gpu::SetErrorNotifier(IoctlSetErrorNotifier& params) {
|
||||||
LOG_DEBUG(Service_NVDRV, "called, offset={:X}, size={:X}, mem={:X}", params.offset,
|
LOG_DEBUG(Service_NVDRV, "called, offset={:X}, size={:X}, mem={:X}", params.offset,
|
||||||
params.size, params.mem);
|
params.size, params.mem);
|
||||||
|
|
||||||
// Validate parameters
|
|
||||||
if (params.size == 0) {
|
|
||||||
return NvResult::BadParameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store error notifier configuration
|
|
||||||
error_notifier_offset = params.offset;
|
error_notifier_offset = params.offset;
|
||||||
error_notifier_size = params.size;
|
error_notifier_size = params.size;
|
||||||
error_notifier_memory = static_cast<u32_le>(params.mem); // Explicit conversion
|
error_notifier_memory = static_cast<u32_le>(params.mem);
|
||||||
|
|
||||||
// Enable error notifications in the GPU
|
// Always enable error notifier in GPU
|
||||||
system.GPU().EnableErrorNotifier(static_cast<u32>(error_notifier_memory),
|
system.GPU().EnableErrorNotifier(static_cast<u32>(error_notifier_memory),
|
||||||
static_cast<u32>(error_notifier_offset),
|
static_cast<u32>(error_notifier_offset),
|
||||||
static_cast<u32>(error_notifier_size));
|
static_cast<u32>(error_notifier_size));
|
||||||
|
@ -193,9 +187,9 @@ NvResult nvhost_gpu::AllocGPFIFOEx2(IoctlAllocGpfifoEx2& params, DeviceFD fd) {
|
||||||
return NvResult::AlreadyAllocated;
|
return NvResult::AlreadyAllocated;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate parameters
|
// Relax validation to allow any non-zero value
|
||||||
if (params.num_entries == 0 || params.num_entries > 0x10000) {
|
if (params.num_entries == 0) {
|
||||||
LOG_ERROR(Service_NVDRV, "Invalid GPFIFO entry count!");
|
LOG_WARNING(Service_NVDRV, "Zero GPFIFO entries requested");
|
||||||
return NvResult::BadParameter;
|
return NvResult::BadParameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -261,9 +261,14 @@ public:
|
||||||
|
|
||||||
/// Enables error notifier for the GPU channel
|
/// Enables error notifier for the GPU channel
|
||||||
void EnableErrorNotifier(u32 memory, u32 offset, u32 size) {
|
void EnableErrorNotifier(u32 memory, u32 offset, u32 size) {
|
||||||
// Implementation depends on specific GPU requirements
|
|
||||||
LOG_DEBUG(HW_GPU, "Error notifier enabled: memory={:X}, offset={:X}, size={:X}",
|
LOG_DEBUG(HW_GPU, "Error notifier enabled: memory={:X}, offset={:X}, size={:X}",
|
||||||
memory, offset, size);
|
memory, offset, size);
|
||||||
|
|
||||||
|
// For now, just store the values and return
|
||||||
|
// TODO: Implement proper error notification handling
|
||||||
|
error_notifier_memory = memory;
|
||||||
|
error_notifier_offset = offset;
|
||||||
|
error_notifier_size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the timeout for the GPU channel
|
/// Sets the timeout for the GPU channel
|
||||||
|
@ -287,6 +292,11 @@ public:
|
||||||
private:
|
private:
|
||||||
struct Impl;
|
struct Impl;
|
||||||
mutable std::unique_ptr<Impl> impl;
|
mutable std::unique_ptr<Impl> impl;
|
||||||
|
|
||||||
|
// Add these member variables to store error notifier state
|
||||||
|
u32 error_notifier_memory{};
|
||||||
|
u32 error_notifier_offset{};
|
||||||
|
u32 error_notifier_size{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Tegra
|
} // namespace Tegra
|
||||||
|
|
Loading…
Reference in a new issue