11a965706SJon Chesterfield //===--- amdgpu/dynamic_hsa/hsa.cpp ------------------------------- C++ -*-===// 21a965706SJon Chesterfield // 31a965706SJon Chesterfield // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41a965706SJon Chesterfield // See https://llvm.org/LICENSE.txt for license information. 51a965706SJon Chesterfield // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61a965706SJon Chesterfield // 71a965706SJon Chesterfield //===----------------------------------------------------------------------===// 81a965706SJon Chesterfield // 91a965706SJon Chesterfield // Implement subset of hsa api by calling into hsa library via dlopen 101a965706SJon Chesterfield // Does the dlopen/dlsym calls as part of the call to hsa_init 111a965706SJon Chesterfield // 121a965706SJon Chesterfield //===----------------------------------------------------------------------===// 131a965706SJon Chesterfield #include "hsa.h" 141a965706SJon Chesterfield #include "Debug.h" 151a965706SJon Chesterfield #include "dlwrap.h" 161a965706SJon Chesterfield #include "hsa_ext_amd.h" 171a965706SJon Chesterfield 181a965706SJon Chesterfield #include <dlfcn.h> 191a965706SJon Chesterfield 20*38af5b4fSJon Chesterfield DLWRAP_INITIALIZE(); 21*38af5b4fSJon Chesterfield 221a965706SJon Chesterfield DLWRAP_INTERNAL(hsa_init, 0); 231a965706SJon Chesterfield 241a965706SJon Chesterfield DLWRAP(hsa_status_string, 2); 251a965706SJon Chesterfield DLWRAP(hsa_shut_down, 0); 261a965706SJon Chesterfield DLWRAP(hsa_agent_get_info, 3); 271a965706SJon Chesterfield DLWRAP(hsa_iterate_agents, 2); 281a965706SJon Chesterfield DLWRAP(hsa_signal_create, 4); 291a965706SJon Chesterfield DLWRAP(hsa_signal_destroy, 1); 301a965706SJon Chesterfield DLWRAP(hsa_signal_store_relaxed, 2); 311a965706SJon Chesterfield DLWRAP(hsa_signal_store_screlease, 2); 321a965706SJon Chesterfield DLWRAP(hsa_signal_wait_scacquire, 5); 331a965706SJon Chesterfield DLWRAP(hsa_queue_create, 8); 348cf93a35SJon Chesterfield DLWRAP(hsa_queue_destroy, 1); 351a965706SJon Chesterfield DLWRAP(hsa_queue_load_read_index_scacquire, 1); 361a965706SJon Chesterfield DLWRAP(hsa_queue_add_write_index_relaxed, 2); 371a965706SJon Chesterfield DLWRAP(hsa_memory_copy, 3); 381a965706SJon Chesterfield DLWRAP(hsa_executable_create, 4); 391a965706SJon Chesterfield DLWRAP(hsa_executable_destroy, 1); 401a965706SJon Chesterfield DLWRAP(hsa_executable_freeze, 2); 411a965706SJon Chesterfield DLWRAP(hsa_executable_symbol_get_info, 3); 421a965706SJon Chesterfield DLWRAP(hsa_executable_iterate_symbols, 3); 431a965706SJon Chesterfield DLWRAP(hsa_code_object_deserialize, 4); 441a965706SJon Chesterfield DLWRAP(hsa_executable_load_code_object, 4); 451a965706SJon Chesterfield DLWRAP(hsa_amd_agent_memory_pool_get_info, 4); 461a965706SJon Chesterfield DLWRAP(hsa_amd_agent_iterate_memory_pools, 3); 471a965706SJon Chesterfield DLWRAP(hsa_amd_memory_pool_allocate, 4); 481a965706SJon Chesterfield DLWRAP(hsa_amd_memory_pool_free, 1); 491a965706SJon Chesterfield DLWRAP(hsa_amd_memory_async_copy, 8); 501a965706SJon Chesterfield DLWRAP(hsa_amd_memory_pool_get_info, 3); 511a965706SJon Chesterfield DLWRAP(hsa_amd_agents_allow_access, 4); 52cc8dc5e2SCarlo Bertolli DLWRAP(hsa_amd_memory_lock, 5); 53cc8dc5e2SCarlo Bertolli DLWRAP(hsa_amd_memory_unlock, 1); 541a965706SJon Chesterfield DLWRAP(hsa_amd_memory_fill, 3); 551a965706SJon Chesterfield DLWRAP(hsa_amd_register_system_event_handler, 2); 561a965706SJon Chesterfield 571a965706SJon Chesterfield DLWRAP_FINALIZE(); 581a965706SJon Chesterfield 591a965706SJon Chesterfield #ifndef DYNAMIC_HSA_PATH 601a965706SJon Chesterfield #define DYNAMIC_HSA_PATH "libhsa-runtime64.so" 611a965706SJon Chesterfield #endif 621a965706SJon Chesterfield 631a965706SJon Chesterfield #ifndef TARGET_NAME 64a90da62aSJon Chesterfield #error "Missing TARGET_NAME macro" 651a965706SJon Chesterfield #endif 661a965706SJon Chesterfield #define DEBUG_PREFIX "Target " GETNAME(TARGET_NAME) " RTL" 671a965706SJon Chesterfield 681a965706SJon Chesterfield static bool checkForHSA() { 691a965706SJon Chesterfield // return true if dlopen succeeded and all functions found 701a965706SJon Chesterfield 711a965706SJon Chesterfield const char *HsaLib = DYNAMIC_HSA_PATH; 721a965706SJon Chesterfield void *DynlibHandle = dlopen(HsaLib, RTLD_NOW); 731a965706SJon Chesterfield if (!DynlibHandle) { 741a965706SJon Chesterfield DP("Unable to load library '%s': %s!\n", HsaLib, dlerror()); 751a965706SJon Chesterfield return false; 761a965706SJon Chesterfield } 771a965706SJon Chesterfield 781a965706SJon Chesterfield for (size_t I = 0; I < dlwrap::size(); I++) { 791a965706SJon Chesterfield const char *Sym = dlwrap::symbol(I); 801a965706SJon Chesterfield 811a965706SJon Chesterfield void *P = dlsym(DynlibHandle, Sym); 821a965706SJon Chesterfield if (P == nullptr) { 831a965706SJon Chesterfield DP("Unable to find '%s' in '%s'!\n", Sym, HsaLib); 841a965706SJon Chesterfield return false; 851a965706SJon Chesterfield } 861a965706SJon Chesterfield DP("Implementing %s with dlsym(%s) -> %p\n", Sym, Sym, P); 871a965706SJon Chesterfield 881a965706SJon Chesterfield *dlwrap::pointer(I) = P; 891a965706SJon Chesterfield } 901a965706SJon Chesterfield 911a965706SJon Chesterfield return true; 921a965706SJon Chesterfield } 931a965706SJon Chesterfield 941a965706SJon Chesterfield hsa_status_t hsa_init() { 951a965706SJon Chesterfield if (!checkForHSA()) { 961a965706SJon Chesterfield return HSA_STATUS_ERROR; 971a965706SJon Chesterfield } 981a965706SJon Chesterfield return dlwrap_hsa_init(); 991a965706SJon Chesterfield } 100