diff --git a/projects/amdsmi/.gitmodules b/projects/amdsmi/.gitmodules new file mode 100644 index 0000000000..05cff9fbab --- /dev/null +++ b/projects/amdsmi/.gitmodules @@ -0,0 +1,4 @@ +[submodule "include/unified_amdsmi"] + path = include/unified_amdsmi + url = git@github.com:AMD-ROCm-Internal/amdsmi_unified.git + branch = amd-mainline diff --git a/projects/amdsmi/CMakeLists.txt b/projects/amdsmi/CMakeLists.txt index dff1326def..a9d9dda7a1 100644 --- a/projects/amdsmi/CMakeLists.txt +++ b/projects/amdsmi/CMakeLists.txt @@ -216,6 +216,27 @@ set(CMN_INC_LIST add_subdirectory("rocm_smi") add_subdirectory("src") +# By default, try to build amdsmi.h header file from the Unified Header repository. +# Allow the User to bypass building amdsmi.h by setting BUILD_HEADER=OFF on the +# command line. Cannot build amdsmi.h if the Unified Header submodule # has not +# been initiated. +set(UH_DIR "${PROJECT_SOURCE_DIR}/include/unified_amdsmi/scripts") +if(NOT DEFINED BUILD_HEADER) + if(EXISTS "${UH_DIR}") + set(BUILD_HEADER "ON") + endif() +elseif(${BUILD_HEADER} STREQUAL "OFF") + unset(BUILD_HEADER CACHE) +elseif(NOT EXISTS "${UH_DIR}") + message("Unified Header will not be generated") + message("Must initiate Unified Header submodule") + unset(BUILD_HEADER CACHE) +endif() + +if(BUILD_HEADER) + add_subdirectory("include") +endif() + if(BUILD_TESTS) set(TESTS_COMPONENT "tests") #add_subdirectory("tests/rocm_smi_test") @@ -270,12 +291,12 @@ install( set(CPACK_RPM_PACKAGE_LICENSE "MIT") if(ENABLE_ASAN_PACKAGING) -# install license file in share/doc/amd_smi-asan folder -install( - FILES ${CPACK_RESOURCE_FILE_LICENSE} - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${CPACK_PACKAGE_NAME}-asan - RENAME LICENSE.txt - COMPONENT asan) + # install license file in share/doc/amd_smi-asan folder + install( + FILES ${CPACK_RESOURCE_FILE_LICENSE} + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${CPACK_PACKAGE_NAME}-asan + RENAME LICENSE.txt + COMPONENT asan) endif() # docs are installed into different share directory from tests and examples install( diff --git a/projects/amdsmi/README.md b/projects/amdsmi/README.md index 1913f76f49..9e38c6c516 100644 --- a/projects/amdsmi/README.md +++ b/projects/amdsmi/README.md @@ -252,6 +252,88 @@ be found at `build/tests/amd_smi_test/`. To build the documentation, follow the instructions at [Building documentation](https://rocm.docs.amd.com/en/latest/contribute/building.html). +## Development only + +This section describes the prerequisites and steps to build Unified Header from source. + +### The Unified Header submodule in the Linux BM repository + +The steps needed to setup and initialize the Unified Header submodule is as follows: + + 1. The script has the command line option, --help, which displays all command line options and defaults. + + Ex. tools/config_unified_header_submodule.sh --help + ``` shell + Usage: tools/config_unified_header_submodule.sh --option --opt + option + --help : Prints usage and exit + --remove : Removes existing Unified Header submodule + + opt + --dir : Directory that contains the Unified Header dir + Default is "include" + --name : Directory Name of the Unified Header + Default is "unified_amdsmi" + Note: + Must run script from repository root directory + ``` + + 2. Initialize submodule + + Ex. Use command line options to specify Unified Header directory + ``` shell + tools/config_unified_header_submodule.sh --dir include --name unified_amdsmi + ``` + + Ex. The arguments in the above example are the defaults, so running the script with no arguments will produce the same results + ``` shell + tools/config_unified_header_submodule.sh + ``` + + 3. Un-initialize submodule when no longer needed + ``` shell + tools/config_unified_header_submodule.sh --remove + ``` + +>[!NOTE] +>Complete this section only if the User needs to create the Unified Header amdsmi.h file and use +>this header when building. Otherwise, the build will use the existing amdsmi.h file which is +>already included in the repository. + +### Build and install the Unified Header amdsmi.h + +If the User has initialized the Unified Header submodule, the Unified Header amdsmi.h will automatically be generated +and used when the Linux driver is being built. The User can also explicitly use the Unified Header by setting the +command line option when building via cmake. + +Building with the unified header using CMAKE flag: + Ex. Building without a cmake command line option builds and uses the Unified Header amdsmi.h + + ```bash + mkdir -p build + cd build + cmake .. + make -j $(nproc) + ``` + + OR Building with a cmake command line option. Change BUILD_HEADER Option to either On or OFF: + -DBUILD_HEADER=On builds and uses the Unified Header amdsmi.h + -DBUILD_HEADER=OFF uses the existing include/amd_smi/amdsmi.h + + ```bash + mkdir -p build + cd build + cmake -DBUILD_HEADER=[ON|OFF] .. + make -j $(nproc) + ``` + +Once the build successfully completes: + 1. Commit any changes in the Unified Header submodule + 2. Commit any changes in the amd-smi repo as needed for fixes or new feature submissions + +>[!NOTE] +>Prerequisite: Install the Unified Header submodule in the Linux BM repository + ## DISCLAIMER The information contained herein is for informational purposes only, and is subject to change without notice. In diff --git a/projects/amdsmi/include/CMakeLists.txt b/projects/amdsmi/include/CMakeLists.txt new file mode 100644 index 0000000000..7c7c6c29ef --- /dev/null +++ b/projects/amdsmi/include/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.20) + +# Generate Unified Header amdsmi.h +if(BUILD_HEADER) + set(UNIFIED_DIR "unified_amdsmi") + set(UNIFIED_H "${UNIFIED_DIR}/amdsmi.h") + set(AMDSMI_H "amd_smi/amdsmi.h") + execute_process( + COMMAND ./create_header.py linguest_gpu_cpu + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${UNIFIED_DIR}/scripts + OUTPUT_VARIABLE pyout + OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process( + COMMAND mv -f ${UNIFIED_H} ${AMDSMI_H} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE lsout + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() diff --git a/projects/amdsmi/include/unified_amdsmi b/projects/amdsmi/include/unified_amdsmi new file mode 160000 index 0000000000..e095c13f44 --- /dev/null +++ b/projects/amdsmi/include/unified_amdsmi @@ -0,0 +1 @@ +Subproject commit e095c13f447650c57642598c4fce6a16ea2aa3e0 diff --git a/projects/amdsmi/tools/config_unified_header_submodule.sh b/projects/amdsmi/tools/config_unified_header_submodule.sh new file mode 100755 index 0000000000..485a81125c --- /dev/null +++ b/projects/amdsmi/tools/config_unified_header_submodule.sh @@ -0,0 +1,146 @@ +#!/usr/bin/env bash + +# Script creates and/or configures the Unified Header submodule +# to work with the Unified Header repository. +# +# User must have access to the Unified Header repository, +# ssh credentials, which resides in the repository. +# +# Should only be run once + +# Exit script immediately on any error +set -eu + +# Prerequisite: Cloning github amdsmi repository: +# git clone git@github.com:AMD-ROCm-Internal/amdsmi.git + +# Defaults: +UH_DIR="include" +UH_NAME="unified_amdsmi" +show_help="False" +remove_module="False" +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + show_help="True" + shift + ;; + -r|--remove) + remove_module="True" + shift + ;; + -d|--dir) + UH_DIR=$2 + shift + shift + ;; + -n|--name) + UH_NAME=$2 + shift + shift + ;; + *|-*|--*) + echo "Unknown option $1" + show_help="True" + shift + ;; + esac +done + +if [ "${show_help}" == "True" ] +then + echo "" + echo "Usage: $0 --option --opt " + echo " option" + echo " --help : Prints usage and exit" + echo " --remove : Removes existing Unified Header submodule" + echo "" + echo " opt " + echo " --dir : Directory that contains the Unified Header dir" + echo " Default is \"${UH_DIR}\"" + echo " --name : Directory Name of the Unified Header" + echo " Default is \"${UH_NAME}\"" + echo " Note:" + echo " Must run script from repository root directory" + echo "" + exit 0 +fi + +if [ "${remove_module}" == "True" ] +then + git submodule deinit -f "${UH_DIR}/${UH_NAME}/" + exit 0 +fi + +# Find repository root dir +REPO_ROOT_DIR=$PWD +while [[ ! -d "${REPO_ROOT_DIR}/.git" ]] +do + REPO_ROOT_DIR=$(dirname ${REPO_ROOT_DIR}) + if [[ "${REPO_ROOT_DIR}" == "/" ]] + then + echo "Repository root dir not found" + exit 0 + fi +done + +# Determine whether to create or configure the submodule +action="Config" +if [ ! -d "${REPO_ROOT_DIR}/${UH_DIR}/${UH_NAME}" ] +then + action="Create" +else + if [ -f "${REPO_ROOT_DIR}/${UH_DIR}/${UH_NAME}/.git" ] + then + echo "Unified Header submodule is already configured" + exit 1 + fi + + if [ ! -f ".git/modules/${UH_DIR}/${UH_NAME}/config" ] + then + rmdir"${UH_DIR}/${UH_NAME}" + action="Create" + fi +fi +echo "$action Unified Header submodule" + +# Directory where the Unified Header is created +if [ "$action" == "Create" ] +then + if [ ! -d "${REPO_ROOT_DIR}/${UH_DIR}" ] + then + mkdir -p ${REPO_ROOT_DIR}/${UH_DIR} + fi + cd ${REPO_ROOT_DIR}/${UH_DIR} + git submodule add -f -b amd-mainline git@github.com:AMD-ROCm-Internal/amdsmi_unified.git ${UH_NAME} +fi + +# Changes "username" in 3 git files to your Unified Header username +# amdsmi/.gitmodules +# amdsmi/.git/config +# amdsmi/.git/modules/${UH_DIR}/${UH_NAME}/config +cd ${REPO_ROOT_DIR} + +if [ "$action" == "Config" ] +then + # Initializes the submodule + git submodule init + git submodule update +fi + +cd ${REPO_ROOT_DIR}/${UH_DIR}/${UH_NAME} +SUBMODULE_BRANCH=$(git config -f ${REPO_ROOT_DIR}/.gitmodules submodule.${UH_DIR}/${UH_NAME}.branch || echo "amd-mainline") +git checkout ${SUBMODULE_BRANCH} +cd ${REPO_ROOT_DIR} + +if [ "$action" == "Create" ] +then + echo "Unified Header submodule has been created" + echo "Commit and push changes to github repository" + echo " git commit -s -m \"[ticket-id] Awesome Unified Header submodule addition\"" + echo " git push" +else + echo "Unified Header submodule has been configured" +fi + +exit 0