diff --git a/.github/workflows/gen_linux_patches.yml b/.github/workflows/gen_linux_patches.yml new file mode 100644 index 0000000..87d20cb --- /dev/null +++ b/.github/workflows/gen_linux_patches.yml @@ -0,0 +1,153 @@ +name: Generate Linux patches + +on: + workflow_dispatch: + inputs: + version: + description: 'Driver Version' + required: true + type: string + old_version: + description: 'Old Driver Version' + required: false + type: string + driver_url: + description: 'Driver URL' + required: false + type: string + mode: + description: 'Mode' + required: true + type: choice + default: search + options: + - copy + - search + description: + description: 'Commit description' + required: false + type: string + +permissions: + contents: write + +jobs: + build: + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Check Input + id: check_input + run: | + version="${{ inputs.version }}" + mode="${{ inputs.mode }}" + driver_url="${{ inputs.driver_url }}" + + echo "Version: $version" + echo "Mode: $mode" + + if [[ $version =~ ([0-9]+\.[0-9]+(-[a-zA-Z]+)?)(-.+)? ]]; then + echo "Valid version" + else + echo "Invalid driver version." + exit 1 + fi + + if [[ ! -n $driver_url ]]; then + driver_url="http://international.download.nvidia.com/XFree86/Linux-x86_64/$version/NVIDIA-Linux-x86_64-$version.run" + fi + echo "Driver URL: $driver_url" + + echo "DRIVER_URL=$driver_url" >> $GITHUB_ENV + echo "VERSION=$version" >> $GITHUB_ENV + + + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: master + + - name: Find Bytecode + if: ${{ inputs.mode == 'search' }} + run: | + + echo "Running find_bytecode.sh for version ${{ env.VERSION }}" + + cd "${{ github.workspace }}/tools/autopatch" + ./find_bytecode.sh ${{ env.VERSION }} ${{ env.DRIVER_URL }} + + echo "find_bytecode.sh executed successfully" + + - name: Update NVENC + run: | + + echo "Running update_patch.sh for version ${{ env.VERSION }}" + cd "${{ github.workspace }}/tools/autopatch" + + old_version="${{ inputs.old_version }}" + + case "${{ inputs.mode }}" in + search) + if [[ -z $old_version ]]; then + ./update_patch.sh -f ../../patch.sh -b $(./find_bytecode.sh ${{ env.VERSION }} ${{ env.DRIVER_URL }}) + else + ./update_patch.sh -f ../../patch.sh -b $(./find_bytecode.sh ${{ env.VERSION }} ${{ env.DRIVER_URL }}) -o $old_version + fi + ;; + copy) + if [[ -z $old_version ]]; then + ./update_patch.sh -f ../../patch.sh -v ${{ env.VERSION }} + else + ./update_patch.sh -f ../../patch.sh -v ${{ env.VERSION }} -o $old_version + fi + ;; + *) + echo "ERROR: Wrong mode" + ;; + esac + + echo "update_patch.sh executed successfully" + + - name: Update NVFBC + run: | + + echo "Running update_patch.sh for FBC for version ${{ env.VERSION }}" + cd "${{ github.workspace }}/tools/autopatch" + + old_version="${{ inputs.old_version }}" + + if [[ -z $old_version ]]; then + ./update_patch.sh -f ../../patch-fbc.sh -v ${{ env.VERSION }} + else + ./update_patch.sh -f ../../patch-fbc.sh -v ${{ env.VERSION }} -o $old_version + fi + + echo "update_patch.sh for FBC executed successfully" + + - name: Run add_driver.py + run: | + echo "Running add_driver.py with version ${{ env.VERSION }}" + cd "${{ github.workspace }}/tools/readme-autogen" + python add_driver.py -L -U ${{ env.DRIVER_URL }} ${{ env.VERSION }} + echo "add_driver.py executed successfully" + + - name: Run readme_autogen.py + run: | + echo "Running readme_autogen.py" + cd "${{ github.workspace }}/tools/readme-autogen" + python readme_autogen.py + echo "readme_autogen.py executed successfully" + + - name: Commit and push changes + run: | + echo "Committing and pushing changes" + branch=autopatch_${{ env.VERSION }} + cd "${{ github.workspace }}" + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git checkout -b $branch + git add -A + git diff --quiet --exit-code --cached || git commit -m "linux: add support for driver ${{ env.VERSION }}" -m "${{ inputs.description }}" + git push origin $branch + echo "Committed and pushed changes" diff --git a/tools/autopatch/find_bytecode.sh b/tools/autopatch/find_bytecode.sh index 66b0c9d..d4c2cbf 100755 --- a/tools/autopatch/find_bytecode.sh +++ b/tools/autopatch/find_bytecode.sh @@ -13,19 +13,22 @@ driver_url=$2 driver_file=NVIDIA-Linux-x86_64-$driver_version.run download_driver() { - wget -c $driver_url -O $driver_file 1>&2 + wget -nv -c $driver_url -O $driver_file 1>&2 chmod +x $driver_file + >&2 echo "Successfully Downloaded Driver $driver_file" } extract_driver() { if [[ ! -e ${driver_file%".run"} ]]; then ./$driver_file -x fi + >&2 echo "Successfully Extracted Driver $driver_file" } search_bytecode() { nvenc_file=${driver_file%".run"}/libnvidia-encode.so.$driver_version - bytecode=$(xxd -c0 -ps $nvenc_file | grep -oP ".{0,6}$MATCH_STR") + bytecode=$(xxd -c10000000 -ps $nvenc_file | grep -oP ".{0,6}$MATCH_STR") + >&2 echo "Found bytecode $bytecode" echo $bytecode }