Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/ipl: support NVMe IPL kernel parameters

Enable extracting of extra kernel command-line parameters
from the NVMe IPL block passed by the firmware to the kernel
at boot.

Signed-off-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
Reviewed-by: Philipp Rudo <prudo@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>

authored by

Alexander Egorenkov and committed by
Vasily Gorbik
d9f12e48 d70e38cb

+23 -8
+23 -8
arch/s390/boot/ipl_parm.c
··· 70 70 static size_t ipl_block_get_ascii_scpdata(char *dest, size_t size, 71 71 const struct ipl_parameter_block *ipb) 72 72 { 73 - size_t count; 74 - size_t i; 73 + const __u8 *scp_data; 74 + __u32 scp_data_len; 75 75 int has_lowercase; 76 + size_t count = 0; 77 + size_t i; 76 78 77 - count = min(size - 1, scpdata_length(ipb->fcp.scp_data, 78 - ipb->fcp.scp_data_len)); 79 + switch (ipb->pb0_hdr.pbt) { 80 + case IPL_PBT_FCP: 81 + scp_data_len = ipb->fcp.scp_data_len; 82 + scp_data = ipb->fcp.scp_data; 83 + break; 84 + case IPL_PBT_NVME: 85 + scp_data_len = ipb->nvme.scp_data_len; 86 + scp_data = ipb->nvme.scp_data; 87 + break; 88 + default: 89 + goto out; 90 + } 91 + 92 + count = min(size - 1, scpdata_length(scp_data, scp_data_len)); 79 93 if (!count) 80 94 goto out; 81 95 82 96 has_lowercase = 0; 83 97 for (i = 0; i < count; i++) { 84 - if (!isascii(ipb->fcp.scp_data[i])) { 98 + if (!isascii(scp_data[i])) { 85 99 count = 0; 86 100 goto out; 87 101 } 88 - if (!has_lowercase && islower(ipb->fcp.scp_data[i])) 102 + if (!has_lowercase && islower(scp_data[i])) 89 103 has_lowercase = 1; 90 104 } 91 105 92 106 if (has_lowercase) 93 - memcpy(dest, ipb->fcp.scp_data, count); 107 + memcpy(dest, scp_data, count); 94 108 else 95 109 for (i = 0; i < count; i++) 96 - dest[i] = tolower(ipb->fcp.scp_data[i]); 110 + dest[i] = tolower(scp_data[i]); 97 111 out: 98 112 dest[count] = '\0'; 99 113 return count; ··· 129 115 parm, COMMAND_LINE_SIZE - len - 1, &ipl_block); 130 116 break; 131 117 case IPL_PBT_FCP: 118 + case IPL_PBT_NVME: 132 119 rc = ipl_block_get_ascii_scpdata( 133 120 parm, COMMAND_LINE_SIZE - len - 1, &ipl_block); 134 121 break;