On Thu, 6 Mar 2025, Jason Andryuk wrote:
> Add domain capabilities to creating disaggregated systems.
>
> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> ---
> README.md | 16 ++++++++++++++
> scripts/uboot-script-gen | 47 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 63 insertions(+)
>
> diff --git a/README.md b/README.md
> index ae2fdfd..25c9b6e 100644
> --- a/README.md
> +++ b/README.md
> @@ -250,6 +250,22 @@ Where:
> Set driver_domain in xl config file. This option is only available for
> the disk_image script.
>
> +- DOMU_CAPS[number] = "string" or "hex" (optional)
> + A "|"-concatentated string of capabilities:
> + - control
> + - hardware
> + - xenstore
> + - dom0 (All of the above)
> + - none
> +
> + e.g. "control|hardware"
> +
> + Or a numeric bitwise flags to specify domain capabilities:
> + 0: None
> + 1: Control
> + 2: Hardware
> + 4: Xenstore
> +
> - LINUX is optional but specifies the Linux kernel for when Xen is NOT
> used. To enable this set any LINUX\_\* variables and do NOT set the
> XEN variable.
> diff --git a/scripts/uboot-script-gen b/scripts/uboot-script-gen
> index db2c011..397d73b 100755
> --- a/scripts/uboot-script-gen
> +++ b/scripts/uboot-script-gen
> @@ -309,6 +309,43 @@ function add_device_tree_cpupools()
> done
> }
>
> +function parse_domain_caps()
> +{
> + local caps_str="$1"
> + local caps=0
> +
> + for x in $( echo $caps_str | sed 's/|/ /g' | tr '[:upper:]' '[:lower:]' )
> + do
> + case "$x" in
> + none)
> + caps=$(( caps | 0 ))
> + ;;
> + control)
> + caps=$(( caps | 0x1 ))
> + ;;
> + hardware)
> + caps=$(( caps | 0x2 ))
> + ;;
> + xenstore)
> + caps=$(( caps | 0x4 ))
> + ;;
> + dom0|domain0)
> + caps=$(( caps | 0x7 ))
> + ;;
> + [0-9]*|0x[0-9a-fA-f]*)
> + caps=$(( caps | $x ))
> + ;;
> + *)
> + return 1
> + ;;
> + esac
> + done
> +
> + echo "$caps"
> +
> + return 0
> +}
> +
> function xen_device_tree_editing()
> {
> dt_set "/chosen" "#address-cells" "hex" "0x2"
> @@ -386,6 +423,16 @@ function xen_device_tree_editing()
> then
> dt_set "/chosen/domU$i" "max_maptrack_frames" "int" "${DOMU_MAPTRACK_FRAMES[i]}"
> fi
> + if test -n "${DOMU_CAPS[i]}"
> + then
> + local caps
> +
> + if ! caps=$( parse_domain_caps ${DOMU_CAPS[i]} ) ; then
> + echo "Invalid DOMU_CAPS[$i] \"${DOMU_CAPS[i]}\""
> + cleanup_and_return_err
> + fi
> + dt_set "/chosen/domU$i" "capabilities" "int" "$caps"
> + fi
>
> if test -n "${DOMU_SHARED_MEM[i]}"
> then
> --
> 2.48.1
>