20#include "experimental/xrt_bo.h"
21#include "experimental/xrt_device.h"
22#include "experimental/xrt_ip.h"
23#include "experimental/xrt_xclbin.h"
37std::unique_ptr<AcceleratorConnection>
40 std::string device_id;
42 size_t colon = connectionString.find(
':');
43 if (colon == std::string::npos) {
44 xclbin = connectionString;
46 xclbin = connectionString.substr(0, colon);
47 device_id = connectionString.substr(colon + 1);
50 return make_unique<XrtAccelerator>(
ctxt, xclbin, device_id);
56 Impl(std::string xclbin, std::string device_id) {
57 if (device_id.empty())
60 device = ::xrt::device(device_id);
63 ::xrt::xclbin xcl(xclbin);
64 std::optional<::xrt::xclbin::mem> host_mem;
65 for (
auto mem : xcl.get_mems()) {
68 if (mem.get_tag().starts_with(
"HOST")) {
69 if (host_mem.has_value())
70 throw std::runtime_error(
"Multiple host memories found in xclbin");
76 throw std::runtime_error(
"No host memory found in xclbin");
80 auto uuid =
device.load_xclbin(xcl);
56 Impl(std::string xclbin, std::string device_id) {
…}
91 std::string device_id)
93 impl = make_unique<Impl>(xclbin, device_id);
101class XrtMMIO :
public MMIO {
104 constexpr static uint32_t IndirectLocation = 0x18;
107 constexpr static uint32_t IndirectMMIOReg = 0x20;
111 :
MMIO(conn, clients), ip(ip) {}
113 uint64_t read(uint32_t addr)
const override {
114 std::lock_guard<std::mutex> lock(m);
117 xrt_write(IndirectLocation, addr);
119 uint64_t ret = xrt_read(IndirectMMIOReg);
121 getConnection().getLogger().debug(
122 [addr, ret](std::string &subsystem, std::string &msg,
123 std::unique_ptr<std::map<std::string, std::any>> &details) {
124 subsystem =
"xrt_mmio";
125 msg =
"MMIO[0x" +
toHex(addr) +
"] = 0x" +
toHex(ret);
129 void write(uint32_t addr, uint64_t data)
override {
130 std::lock_guard<std::mutex> lock(m);
133 xrt_write(IndirectLocation, addr);
135 xrt_write(IndirectMMIOReg, data);
137 conn.getLogger().debug(
139 data](std::string &subsystem, std::string &msg,
140 std::unique_ptr<std::map<std::string, std::any>> &details) {
141 subsystem =
"xrt_mmio";
142 msg =
"MMIO[0x" +
toHex(addr) +
"] <- 0x" +
toHex(data);
147 uint64_t xrt_read(uint32_t addr)
const {
148 auto lo =
static_cast<uint64_t
>(ip.read_register(addr));
149 auto hi =
static_cast<uint64_t
>(ip.read_register(addr + 0x4));
150 return (hi << 32) | lo;
153 void xrt_write(uint32_t addr, uint64_t data)
const {
154 ip.write_register(addr, data);
155 ip.write_register(addr + 0x4, data >> 32);
160 mutable std::mutex m;
166class XrtHostMem :
public HostMem {
168 XrtHostMem(
XrtAccelerator &conn, ::xrt::device &device, int32_t memoryGroup)
169 :
HostMem(conn), device(device), memoryGroup(memoryGroup) {}
171 struct XrtHostMemRegion :
public HostMemRegion {
172 XrtHostMemRegion(::xrt::device &device, std::size_t size,
174 bo = ::xrt::bo(device, size, ::xrt::bo::flags::host_only, memoryGroup);
179 virtual void *getPtr()
const override {
return ptr; }
182 virtual void *getDevicePtr()
const override {
return (
void *)bo.address(); }
183 virtual std::size_t getSize()
const override {
return bo.size(); }
186 virtual void flush()
override { bo.sync(XCL_BO_SYNC_BO_TO_DEVICE); }
193 std::unique_ptr<HostMemRegion>
195 return std::unique_ptr<HostMemRegion>(
196 new XrtHostMemRegion(device, size, opts, memoryGroup));
200 ::xrt::device &device;
206 std::string implName,
209 if (svcType ==
typeid(
MMIO))
210 return new XrtMMIO(*
this,
impl->ip, clients);
211 else if (svcType ==
typeid(
HostMem))
212 return new XrtHostMem(*
this,
impl->device,
impl->memoryGroup);
213 else if (svcType ==
typeid(
SysInfo))
#define REGISTER_ACCELERATOR(Name, TAccelerator)
Abstract class representing a connection to an accelerator.
virtual void disconnect()
Disconnect from the accelerator cleanly.
Context & ctxt
ESI accelerator context.
AcceleratorConnections, Accelerators, and Manifests must all share a context.
Connect to an ESI simulation.
XrtAccelerator(Context &, std::string xclbin, std::string kernelName)
Construct and connect to a cosim server.
static std::unique_ptr< AcceleratorConnection > connect(Context &, std::string connectionString)
Parse the connection std::string and instantiate the accelerator.
std::unique_ptr< Impl > impl
virtual Service * createService(Service::Type service, AppIDPath path, std::string implName, const ServiceImplDetails &details, const HWClientDetails &clients) override
Called by getServiceImpl exclusively.
Implement the SysInfo API for a standard MMIO protocol.
Parent class of all APIs modeled as 'services'.
const std::type_info & Type
Information about the Accelerator system.
std::map< std::string, std::any > ServiceImplDetails
std::string toHex(void *val)
std::vector< HWClientDetail > HWClientDetails
static constexpr char kernel_name[]
Impl(std::string xclbin, std::string device_id)
Options for allocating host memory.