diff --git a/projects/rocr-runtime/runtime/hsa-runtime/CMakeLists.txt b/projects/rocr-runtime/runtime/hsa-runtime/CMakeLists.txt index 64122a3765..1020f30388 100644 --- a/projects/rocr-runtime/runtime/hsa-runtime/CMakeLists.txt +++ b/projects/rocr-runtime/runtime/hsa-runtime/CMakeLists.txt @@ -154,7 +154,8 @@ set_property(TARGET ${CORE_RUNTIME_TARGET} PROPERTY LINK_FLAGS ${HSA_SHARED_LINK ## ------------------------- End Compiler and Linker options ---------------------------- ## Source files. -set ( SRCS core/util/lnx/os_linux.cpp +set ( SRCS core/driver/driver.cpp + core/util/lnx/os_linux.cpp core/util/small_heap.cpp core/util/timer.cpp core/util/flag.cpp diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/driver/driver.cpp b/projects/rocr-runtime/runtime/hsa-runtime/core/driver/driver.cpp new file mode 100644 index 0000000000..02407e6b2a --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/driver/driver.cpp @@ -0,0 +1,79 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// The University of Illinois/NCSA +// Open Source License (NCSA) +// +// Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved. +// +// Developed by: +// +// AMD Research and AMD HSA Software Development +// +// Advanced Micro Devices, Inc. +// +// www.amd.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal with the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimers. +// - Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimers in +// the documentation and/or other materials provided with the distribution. +// - Neither the names of Advanced Micro Devices, Inc, +// nor the names of its contributors may be used to endorse or promote +// products derived from this Software without specific prior written +// permission. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS WITH THE SOFTWARE. +// +//////////////////////////////////////////////////////////////////////////////// + +#include "core/inc/driver.h" + +#include +#include + +#include "inc/hsa.h" + +namespace rocr { +namespace core { + +Driver::Driver(const std::string devnode_name, Agent::DeviceType agent_device_type) + : agent_device_type_(agent_device_type), devnode_name_(devnode_name) { } + +hsa_status_t Driver::Open() +{ + fd_ = open(devnode_name_.c_str(), O_RDWR | O_CLOEXEC); + if (fd_ < 0) { + return HSA_STATUS_ERROR_OUT_OF_RESOURCES; + } + return HSA_STATUS_SUCCESS; +} + +hsa_status_t Driver::Close() +{ + int ret(0); + if (fd_ > 0) { + ret = close(fd_); + fd_ = -1; + } + if (ret) { + return HSA_STATUS_ERROR; + } + return HSA_STATUS_SUCCESS; +} + +} // namespace core +} // namespace rocr diff --git a/projects/rocr-runtime/runtime/hsa-runtime/core/inc/driver.h b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/driver.h new file mode 100644 index 0000000000..c6b7ffac11 --- /dev/null +++ b/projects/rocr-runtime/runtime/hsa-runtime/core/inc/driver.h @@ -0,0 +1,109 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// The University of Illinois/NCSA +// Open Source License (NCSA) +// +// Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved. +// +// Developed by: +// +// AMD Research and AMD HSA Software Development +// +// Advanced Micro Devices, Inc. +// +// www.amd.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal with the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimers. +// - Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimers in +// the documentation and/or other materials provided with the distribution. +// - Neither the names of Advanced Micro Devices, Inc, +// nor the names of its contributors may be used to endorse or promote +// products derived from this Software without specific prior written +// permission. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS WITH THE SOFTWARE. +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef HSA_RUNTME_CORE_INC_DRIVER_H_ +#define HSA_RUNTME_CORE_INC_DRIVER_H_ + +#include + +#include "core/inc/agent.h" +#include "core/inc/memory_region.h" +#include "inc/hsa.h" + +namespace rocr { +namespace core { + +using MemFlags = uint32_t; + +struct MemProperties { + MemFlags flags_; + size_t size_bytes_; + uint64_t virtual_base_addr_; +}; + +/// @brief Kernel driver interface. +/// +/// @details A class used to provide an interface between the core runtime +/// and agent kernel drivers. It also maintains state associated with active +/// kernel drivers. +class Driver { + public: + Driver() = delete; + Driver(const std::string devnode_name, Agent::DeviceType agent_device_type); + virtual ~Driver() {} + + /// @brief Open a connection to the driver using name_. + /// @retval HSA_STATUS_SUCCESS if the driver was opened successfully. + hsa_status_t Open(); + /// @brief Close a connection to the open driver using fd_. + /// @retval HSA_STATUS_SUCCESS if the driver was opened successfully. + hsa_status_t Close(); + + virtual hsa_status_t GetMemoryProperties(uint32_t node_id, MemProperties &mprops) const = 0; + + /// @brief Allocate agent-accessible memory (system or agent-local memory). + /// + /// @param[out] pointer to newly allocated memory. + /// + /// @retval HSA_STATUS_SUCCESS if memory was successfully allocated or + /// hsa_status_t error code if the memory allocation failed. + virtual hsa_status_t AllocateMemory(void** mem, size_t size, uint32_t node_id, + MemFlags flags) = 0; + + virtual hsa_status_t FreeMemory(void* mem, uint32_t node_id) = 0; + + virtual hsa_status_t CreateQueue(Queue &queue) = 0; + + virtual hsa_status_t DestroyQueue(Queue &queue) const = 0; + + /// Specify the agent device type this driver is for. + const Agent::DeviceType agent_device_type_; + + protected: + const std::string devnode_name_; + int fd_ = -1; +}; + +} // namespace core +} // namespace rocr + +#endif // header guard