driver: Add a core driver interface component

Add a new driver interface as a core ROCr component.

The driver component provides an interface for ROCr to interact with
agent kernel-model drivers in a generic way. This interface will be used
to interact with the XDNA NPU driver. Eventually, the ROCt library's
functionality should be implemented behind this interface.

For now the interface provides basic queue and memory allocation
for supporting HSA queues and signals and matches the thunk API
closely.

Change-Id: I37ac9f2dcbadc86ce45999f76b0e9ce753fd0c06
Signed-off-by: Chris Freehill <cfreehil@amd.com>


[ROCm/ROCR-Runtime commit: 69ba32fa95]
Этот коммит содержится в:
Tony Gutierrez
2023-05-25 14:53:41 -06:00
коммит произвёл Chris Freehill
родитель fdad9350fb
Коммит 30d4499b2a
3 изменённых файлов: 190 добавлений и 1 удалений
+2 -1
Просмотреть файл
@@ -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
+79
Просмотреть файл
@@ -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 <fcntl.h>
#include <unistd.h>
#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
+109
Просмотреть файл
@@ -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 <string>
#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