Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
On 7/9/25 4:34 AM, Thomas Huth wrote:
> From: Thomas Huth <thuth@redhat.com>
>
> Since we're linking the network booting code into the main firmware
> binary nowadays, we can support the "loadparm" parameter now quite
> easily for pxelinux.cfg config files that contain multiple entries.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> pc-bios/s390-ccw/netmain.c | 32 ++++++++++++++++++++++++--------
> 1 file changed, 24 insertions(+), 8 deletions(-)
>
> diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
> index 719a547ada0..c0aafca22d2 100644
> --- a/pc-bios/s390-ccw/netmain.c
> +++ b/pc-bios/s390-ccw/netmain.c
> @@ -332,6 +332,27 @@ static int load_kernel_with_initrd(filename_ip_t *fn_ip,
> return rc;
> }
>
> +static int net_select_and_load_kernel(filename_ip_t *fn_ip,
> + int num_ent, int selected,
> + struct pl_cfg_entry *entries)
> +{
> + unsigned int loadparm = get_loadparm_index();
> +
> + if (num_ent <= 0) {
> + return -1;
> + }
> +
> + IPL_assert(loadparm <= num_ent,
> + "loadparm is set to an entry that is not available in the "
> + "pxelinux.cfg file!");
> +
> + if (loadparm > 0) {
> + selected = loadparm - 1;
> + }
> +
> + return load_kernel_with_initrd(fn_ip, &entries[selected]);
> +}
> +
> #define MAX_PXELINUX_ENTRIES 16
>
> static int net_try_pxelinux_cfg(filename_ip_t *fn_ip)
> @@ -343,11 +364,8 @@ static int net_try_pxelinux_cfg(filename_ip_t *fn_ip)
> DEFAULT_TFTP_RETRIES,
> cfgbuf, sizeof(cfgbuf),
> entries, MAX_PXELINUX_ENTRIES, &def_ent);
> - if (num_ent > 0) {
> - return load_kernel_with_initrd(fn_ip, &entries[def_ent]);
> - }
>
> - return -1;
> + return net_select_and_load_kernel(fn_ip, num_ent, def_ent, entries);
> }
>
> /**
> @@ -433,10 +451,8 @@ static int net_try_direct_tftp_load(filename_ip_t *fn_ip)
>
> num_ent = pxelinux_parse_cfg(cfgbuf, sizeof(cfgbuf), entries,
> MAX_PXELINUX_ENTRIES, &def_ent);
> - if (num_ent <= 0) {
> - return -1;
> - }
> - return load_kernel_with_initrd(fn_ip, &entries[def_ent]);
> + return net_select_and_load_kernel(fn_ip, num_ent, def_ent,
> + entries);
> }
> }
>