[gpu/NVDRV] Finalize AllocObjCtx #308
1 changed files with 23 additions and 3 deletions
|
@ -132,6 +132,8 @@ void nvhost_gpu::OnOpen(NvCore::SessionId session_id, DeviceFD fd) {
|
||||||
|
|
||||||
void nvhost_gpu::OnClose(DeviceFD fd) {
|
void nvhost_gpu::OnClose(DeviceFD fd) {
|
||||||
sessions.erase(fd);
|
sessions.erase(fd);
|
||||||
|
std::scoped_lock lk(channel_mutex);
|
||||||
|
ctxObj_params.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
NvResult nvhost_gpu::SetNVMAPfd(IoctlSetNvmapFD& params) {
|
NvResult nvhost_gpu::SetNVMAPfd(IoctlSetNvmapFD& params) {
|
||||||
|
@ -220,14 +222,32 @@ NvResult nvhost_gpu::AllocGPFIFOEx2(IoctlAllocGpfifoEx& params, DeviceFD fd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) {
|
NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) {
|
||||||
LOG_DEBUG(Service_NVDRV, "called, class_num={:X}, flags={:X}, obj_id={:X}", params.class_num,
|
LOG_DEBUG(Service_NVDRV, "called, class_num={:#X}, flags={:#X}, obj_id={:#X}", params.class_num,
|
||||||
params.flags, params.obj_id);
|
params.flags, params.obj_id);
|
||||||
|
|
||||||
if (!channel_state->initialized) {
|
if (!channel_state || !channel_state->initialized) {
|
||||||
LOG_CRITICAL(Service_NVDRV, "No address space bound to allocate a object context!");
|
LOG_CRITICAL(Service_NVDRV, "No address space bound to allocate a object context!");
|
||||||
return NvResult::NotInitialized;
|
return NvResult::NotInitialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::scoped_lock lk(channel_mutex);
|
||||||
|
|
||||||
|
if (params.flags) {
|
||||||
|
LOG_WARNING(Service_NVDRV, "non-zero flags={:#X} for class={:#X}",
|
||||||
|
params.flags, params.class_num);
|
||||||
|
|
||||||
|
constexpr u32 allowed_mask{};
|
||||||
|
params.flags = allowed_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &ctx_obj : ctxObj_params) {
|
||||||
|
if (ctx_obj.class_num == params.class_num) {
|
||||||
|
LOG_ERROR(Service_NVDRV, "Object context for class {:#X} already allocated on this channel",
|
||||||
|
params.class_num);
|
||||||
|
return NvResult::AlreadyAllocated;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (static_cast<CtxClasses>(params.class_num)) {
|
switch (static_cast<CtxClasses>(params.class_num)) {
|
||||||
case CtxClasses::Ctx2D:
|
case CtxClasses::Ctx2D:
|
||||||
case CtxClasses::Ctx3D:
|
case CtxClasses::Ctx3D:
|
||||||
|
@ -238,7 +258,7 @@ NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) {
|
||||||
ctxObj_params.push_back(params);
|
ctxObj_params.push_back(params);
|
||||||
return NvResult::Success;
|
return NvResult::Success;
|
||||||
default:
|
default:
|
||||||
LOG_ERROR(Service_NVDRV, "Invalid class number for object context: {:X}", params.class_num);
|
LOG_ERROR(Service_NVDRV, "Invalid class number for object context: {:#X}", params.class_num);
|
||||||
return NvResult::BadParameter;
|
return NvResult::BadParameter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue