xref: /linux/arch/powerpc/platforms/pseries/plpks.c (revision 1fd1dc41724319406b0aff221a352a400b0ddfc5)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * POWER LPAR Platform KeyStore(PLPKS)
4  * Copyright (C) 2022 IBM Corporation
5  * Author: Nayna Jain <nayna@linux.ibm.com>
6  *
7  * Provides access to variables stored in Power LPAR Platform KeyStore(PLPKS).
8  */
9 
10 #define pr_fmt(fmt) "plpks: " fmt
11 
12 #define PLPKS_WRAPKEY_COMPONENT	"PLPKSWR"
13 #define PLPKS_WRAPKEY_NAME	"default-wrapping-key"
14 
15 /*
16  * To 4K align the {input, output} buffers to the {UN}WRAP H_CALLs
17  */
18 #define PLPKS_WRAPPING_BUF_ALIGN	4096
19 
20 /*
21  * To ensure the output buffer's length is at least 1024 bytes greater
22  * than the input buffer's length during the WRAP H_CALL
23  */
24 #define PLPKS_WRAPPING_BUF_DIFF	1024
25 
26 #define PLPKS_WRAP_INTERFACE_BIT	3
27 #define PLPKS_WRAPPING_KEY_LENGTH	32
28 
29 #define WRAPFLAG_BE_BIT_SET(be_bit) \
30 	BIT_ULL(63 - (be_bit))
31 
32 #define WRAPFLAG_BE_GENMASK(be_bit_hi, be_bit_lo) \
33 	GENMASK_ULL(63 - (be_bit_hi), 63 - (be_bit_lo))
34 
35 #define WRAPFLAG_BE_FIELD_PREP(be_bit_hi, be_bit_lo, val) \
36 	FIELD_PREP(WRAPFLAG_BE_GENMASK(be_bit_hi, be_bit_lo), (val))
37 
38 #include <linux/delay.h>
39 #include <linux/errno.h>
40 #include <linux/io.h>
41 #include <linux/printk.h>
42 #include <linux/slab.h>
43 #include <linux/string.h>
44 #include <linux/types.h>
45 #include <linux/of_fdt.h>
46 #include <linux/libfdt.h>
47 #include <linux/memblock.h>
48 #include <linux/bitfield.h>
49 #include <asm/hvcall.h>
50 #include <asm/machdep.h>
51 #include <asm/plpks.h>
52 #include <asm/firmware.h>
53 
54 static u8 *ospassword;
55 static u16 ospasswordlength;
56 
57 // Retrieved with H_PKS_GET_CONFIG
58 static u8 version;
59 static u16 objoverhead;
60 static u16 maxpwsize;
61 static u16 maxobjsize;
62 static s16 maxobjlabelsize;
63 static u32 totalsize;
64 static u32 usedspace;
65 static u32 supportedpolicies;
66 static u32 maxlargeobjectsize;
67 static u64 signedupdatealgorithms;
68 static u64 wrappingfeatures;
69 static bool wrapsupport;
70 
71 struct plpks_auth {
72 	u8 version;
73 	u8 consumer;
74 	__be64 rsvd0;
75 	__be32 rsvd1;
76 	__be16 passwordlength;
77 	u8 password[];
78 } __packed __aligned(16);
79 
80 struct label_attr {
81 	u8 prefix[8];
82 	u8 version;
83 	u8 os;
84 	u8 length;
85 	u8 reserved[5];
86 };
87 
88 struct label {
89 	struct label_attr attr;
90 	u8 name[PLPKS_MAX_NAME_SIZE];
91 	size_t size;
92 };
93 
94 static int pseries_status_to_err(int rc)
95 {
96 	int err;
97 
98 	switch (rc) {
99 	case H_SUCCESS:
100 		err = 0;
101 		break;
102 	case H_FUNCTION:
103 		err = -ENXIO;
104 		break;
105 	case H_PARAMETER:
106 	case H_P2:
107 	case H_P3:
108 	case H_P4:
109 	case H_P5:
110 	case H_P6:
111 		err = -EINVAL;
112 		break;
113 	case H_NOT_FOUND:
114 		err = -ENOENT;
115 		break;
116 	case H_BUSY:
117 	case H_LONG_BUSY_ORDER_1_MSEC:
118 	case H_LONG_BUSY_ORDER_10_MSEC:
119 	case H_LONG_BUSY_ORDER_100_MSEC:
120 	case H_LONG_BUSY_ORDER_1_SEC:
121 	case H_LONG_BUSY_ORDER_10_SEC:
122 	case H_LONG_BUSY_ORDER_100_SEC:
123 		err = -EBUSY;
124 		break;
125 	case H_AUTHORITY:
126 		err = -EPERM;
127 		break;
128 	case H_NO_MEM:
129 		err = -ENOMEM;
130 		break;
131 	case H_RESOURCE:
132 		err = -EEXIST;
133 		break;
134 	case H_TOO_BIG:
135 		err = -EFBIG;
136 		break;
137 	case H_STATE:
138 		err = -EIO;
139 		break;
140 	case H_R_STATE:
141 		err = -EIO;
142 		break;
143 	case H_IN_USE:
144 		err = -EEXIST;
145 		break;
146 	case H_ABORTED:
147 		err = -EIO;
148 		break;
149 	default:
150 		err = -EINVAL;
151 	}
152 
153 	pr_debug("Converted hypervisor code %d to Linux %d\n", rc, err);
154 
155 	return err;
156 }
157 
158 static int plpks_gen_password(void)
159 {
160 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
161 	u8 *password, consumer = PLPKS_OS_OWNER;
162 	int rc;
163 
164 	// If we booted from kexec, we could be reusing an existing password already
165 	if (ospassword) {
166 		pr_debug("Password of length %u already in use\n", ospasswordlength);
167 		return 0;
168 	}
169 
170 	// The password must not cross a page boundary, so we align to the next power of 2
171 	password = kzalloc(roundup_pow_of_two(maxpwsize), GFP_KERNEL);
172 	if (!password)
173 		return -ENOMEM;
174 
175 	rc = plpar_hcall(H_PKS_GEN_PASSWORD, retbuf, consumer, 0,
176 			 virt_to_phys(password), maxpwsize);
177 
178 	if (!rc) {
179 		ospasswordlength = maxpwsize;
180 		ospassword = kzalloc(maxpwsize, GFP_KERNEL);
181 		if (!ospassword) {
182 			kfree_sensitive(password);
183 			return -ENOMEM;
184 		}
185 		memcpy(ospassword, password, ospasswordlength);
186 	} else {
187 		if (rc == H_IN_USE) {
188 			pr_warn("Password already set - authenticated operations will fail\n");
189 			rc = 0;
190 		} else {
191 			goto out;
192 		}
193 	}
194 out:
195 	kfree_sensitive(password);
196 
197 	return pseries_status_to_err(rc);
198 }
199 
200 static struct plpks_auth *construct_auth(u8 consumer)
201 {
202 	struct plpks_auth *auth;
203 
204 	if (consumer > PLPKS_OS_OWNER)
205 		return ERR_PTR(-EINVAL);
206 
207 	// The auth structure must not cross a page boundary and must be
208 	// 16 byte aligned. We align to the next largest power of 2
209 	auth = kzalloc(roundup_pow_of_two(struct_size(auth, password, maxpwsize)), GFP_KERNEL);
210 	if (!auth)
211 		return ERR_PTR(-ENOMEM);
212 
213 	auth->version = 1;
214 	auth->consumer = consumer;
215 
216 	if (consumer == PLPKS_FW_OWNER || consumer == PLPKS_BOOTLOADER_OWNER)
217 		return auth;
218 
219 	memcpy(auth->password, ospassword, ospasswordlength);
220 
221 	auth->passwordlength = cpu_to_be16(ospasswordlength);
222 
223 	return auth;
224 }
225 
226 /*
227  * Label is combination of label attributes + name.
228  * Label attributes are used internally by kernel and not exposed to the user.
229  */
230 static struct label *construct_label(char *component, u8 varos, u8 *name,
231 				     u16 namelen)
232 {
233 	struct label *label;
234 	size_t slen = 0;
235 
236 	if (!name || namelen > PLPKS_MAX_NAME_SIZE)
237 		return ERR_PTR(-EINVAL);
238 
239 	// Support NULL component for signed updates
240 	if (component) {
241 		slen = strlen(component);
242 		if (slen > sizeof(label->attr.prefix))
243 			return ERR_PTR(-EINVAL);
244 	}
245 
246 	// The label structure must not cross a page boundary, so we align to the next power of 2
247 	label = kzalloc(roundup_pow_of_two(sizeof(*label)), GFP_KERNEL);
248 	if (!label)
249 		return ERR_PTR(-ENOMEM);
250 
251 	if (component)
252 		memcpy(&label->attr.prefix, component, slen);
253 
254 	label->attr.version = PLPKS_LABEL_VERSION;
255 	label->attr.os = varos;
256 	label->attr.length = PLPKS_MAX_LABEL_ATTR_SIZE;
257 	memcpy(&label->name, name, namelen);
258 
259 	label->size = sizeof(struct label_attr) + namelen;
260 
261 	return label;
262 }
263 
264 static int _plpks_get_config(void)
265 {
266 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
267 	struct config {
268 		u8 version;
269 		u8 flags;
270 		__be16 rsvd0;
271 		__be16 objoverhead;
272 		__be16 maxpwsize;
273 		__be16 maxobjlabelsize;
274 		__be16 maxobjsize;
275 		__be32 totalsize;
276 		__be32 usedspace;
277 		__be32 supportedpolicies;
278 		__be32 maxlargeobjectsize;
279 		__be64 signedupdatealgorithms;
280 		__be64 wrappingfeatures;
281 		u8 rsvd1[476];
282 	} __packed * config;
283 	size_t size;
284 	int rc = 0;
285 
286 	size = sizeof(*config);
287 
288 	// Config struct must not cross a page boundary. So long as the struct
289 	// size is a power of 2, this should be fine as alignment is guaranteed
290 	config = kzalloc(size, GFP_KERNEL);
291 	if (!config) {
292 		rc = -ENOMEM;
293 		goto err;
294 	}
295 
296 	rc = plpar_hcall(H_PKS_GET_CONFIG, retbuf, virt_to_phys(config), size);
297 
298 	if (rc != H_SUCCESS) {
299 		rc = pseries_status_to_err(rc);
300 		goto err;
301 	}
302 
303 	version = config->version;
304 	objoverhead = be16_to_cpu(config->objoverhead);
305 	maxpwsize = be16_to_cpu(config->maxpwsize);
306 	maxobjsize = be16_to_cpu(config->maxobjsize);
307 	maxobjlabelsize = be16_to_cpu(config->maxobjlabelsize);
308 	totalsize = be32_to_cpu(config->totalsize);
309 	usedspace = be32_to_cpu(config->usedspace);
310 	supportedpolicies = be32_to_cpu(config->supportedpolicies);
311 	maxlargeobjectsize = be32_to_cpu(config->maxlargeobjectsize);
312 	signedupdatealgorithms = be64_to_cpu(config->signedupdatealgorithms);
313 	wrappingfeatures = be64_to_cpu(config->wrappingfeatures);
314 	wrapsupport = config->flags & PPC_BIT8(PLPKS_WRAP_INTERFACE_BIT);
315 
316 	// Validate that the numbers we get back match the requirements of the spec
317 	if (maxpwsize < 32) {
318 		pr_err("Invalid Max Password Size received from hypervisor (%d < 32)\n", maxpwsize);
319 		rc = -EIO;
320 		goto err;
321 	}
322 
323 	if (maxobjlabelsize < 255) {
324 		pr_err("Invalid Max Object Label Size received from hypervisor (%d < 255)\n",
325 		       maxobjlabelsize);
326 		rc = -EIO;
327 		goto err;
328 	}
329 
330 	if (totalsize < 4096) {
331 		pr_err("Invalid Total Size received from hypervisor (%d < 4096)\n", totalsize);
332 		rc = -EIO;
333 		goto err;
334 	}
335 
336 	if (version >= 3 && maxlargeobjectsize >= 65536 && maxobjsize != 0xFFFF) {
337 		pr_err("Invalid Max Object Size (0x%x != 0xFFFF)\n", maxobjsize);
338 		rc = -EIO;
339 		goto err;
340 	}
341 
342 err:
343 	kfree(config);
344 	return rc;
345 }
346 
347 /**
348  * plpks_get_version() - Get the version of the PLPKS config structure.
349  *
350  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
351  * reads the PLPKS config structure version and saves it in a file local static
352  * version variable.
353  *
354  * Returns: On success the saved PLPKS config structure version is returned, 0
355  * if not.
356  */
357 u8 plpks_get_version(void)
358 {
359 	return version;
360 }
361 
362 /**
363  * plpks_get_objoverhead() - Get the hypervisor storage overhead per object.
364  *
365  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
366  * reads the per object hypervisor storage overhead in bytes into the local
367  * static objoverhead variable, excluding the size of the object or the label.
368  * This value can be treated as valid only when the PLPKS config structure
369  * version >= 2.
370  *
371  * Returns: If PLPKS config structure version >= 2 then the storage overhead is
372  * returned, 0 otherwise.
373  */
374 u16 plpks_get_objoverhead(void)
375 {
376 	return objoverhead;
377 }
378 
379 /**
380  * plpks_get_maxpwsize() - Get the maximum password size.
381  *
382  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
383  * reads the maximum password size and checks if it is 32 bytes at the least
384  * before storing it in the local static maxpwsize variable.
385  *
386  * Returns: On success the maximum password size is returned, 0 if not.
387  */
388 u16 plpks_get_maxpwsize(void)
389 {
390 	return maxpwsize;
391 }
392 
393 /**
394  * plpks_get_maxobjectsize() - Get the maximum object size supported by the
395  * PLPKS.
396  *
397  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
398  * reads the maximum object size into the file local static maxobjsize variable.
399  *
400  * Returns: On success the maximum object size is returned, 0 if not.
401  */
402 u16 plpks_get_maxobjectsize(void)
403 {
404 	return maxobjsize;
405 }
406 
407 /**
408  * plpks_get_maxobjectlabelsize() - Get the maximum object label size supported
409  * by the PLPKS.
410  *
411  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
412  * reads the maximum object label size into the local static maxobjlabelsize
413  * variable.
414  *
415  * Returns: On success the maximum object label size is returned, 0 if not.
416  */
417 u16 plpks_get_maxobjectlabelsize(void)
418 {
419 	return maxobjlabelsize;
420 }
421 
422 /**
423  * plpks_get_totalsize() - Get the total size of the PLPKS that is configured.
424  *
425  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
426  * reads the total size of the PLPKS that is configured for the LPAR into the
427  * file local static totalsize variable.
428  *
429  * Returns: On success the total size of the PLPKS configured is returned, 0 if
430  * not.
431  */
432 u32 plpks_get_totalsize(void)
433 {
434 	return totalsize;
435 }
436 
437 /**
438  * plpks_get_usedspace() - Get the used space from the total size of the PLPKS.
439  *
440  * Invoke the H_PKS_GET_CONFIG HCALL to refresh the latest value for the used
441  * space as this keeps changing with the creation and removal of objects in the
442  * PLPKS.
443  *
444  * Returns: On success the used space is returned, 0 if not.
445  */
446 u32 plpks_get_usedspace(void)
447 {
448 	int rc = _plpks_get_config();
449 	if (rc) {
450 		pr_err("Couldn't get config, rc: %d\n", rc);
451 		return 0;
452 	}
453 	return usedspace;
454 }
455 
456 /**
457  * plpks_get_supportedpolicies() - Get a bitmask of the policies supported by
458  * the hypervisor.
459  *
460  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
461  * reads a bitmask of the policies supported by the hypervisor into the file
462  * local static supportedpolicies variable.
463  *
464  * Returns: On success the bitmask of the policies supported by the hypervisor
465  * are returned, 0 if not.
466  */
467 u32 plpks_get_supportedpolicies(void)
468 {
469 	return supportedpolicies;
470 }
471 
472 /**
473  * plpks_get_maxlargeobjectsize() - Get the maximum object size supported for
474  * PLPKS config structure version >= 3
475  *
476  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
477  * reads the maximum object size into the local static maxlargeobjectsize
478  * variable for PLPKS config structure version >= 3. This was introduced
479  * starting with PLPKS config structure version 3 to allow for objects of
480  * size >= 64K.
481  *
482  * Returns: If PLPKS config structure version >= 3 then the new maximum object
483  * size is returned, 0 if not.
484  */
485 u32 plpks_get_maxlargeobjectsize(void)
486 {
487 	return maxlargeobjectsize;
488 }
489 
490 /**
491  * plpks_get_signedupdatealgorithms() - Get a bitmask of the signature
492  * algorithms supported for signed updates.
493  *
494  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
495  * reads a bitmask of the signature algorithms supported for signed updates into
496  * the file local static signedupdatealgorithms variable. This is valid only
497  * when the PLPKS config structure version >= 3.
498  *
499  * Returns: On success the bitmask of the signature algorithms supported for
500  * signed updates is returned, 0 if not.
501  */
502 u64 plpks_get_signedupdatealgorithms(void)
503 {
504 	return signedupdatealgorithms;
505 }
506 
507 /**
508  * plpks_get_wrappingfeatures() - Returns a bitmask of the wrapping features
509  * supported by the hypervisor.
510  *
511  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
512  * reads a bitmask of the wrapping features supported by the hypervisor into the
513  * file local static wrappingfeatures variable. This is valid only when the
514  * PLPKS config structure version >= 3.
515  *
516  * Return:
517  *	bitmask of the wrapping features supported by the hypervisor
518  */
519 u64 plpks_get_wrappingfeatures(void)
520 {
521 	return wrappingfeatures;
522 }
523 
524 /**
525  * plpks_get_passwordlen() - Get the length of the PLPKS password in bytes.
526  *
527  * The H_PKS_GEN_PASSWORD HCALL makes the hypervisor generate a random password
528  * for the specified consumer, apply that password to the PLPKS and return it to
529  * the caller. In this process, the password length for the OS consumer is
530  * stored in the local static ospasswordlength variable.
531  *
532  * Returns: On success the password length for the OS consumer in bytes is
533  * returned, 0 if not.
534  */
535 u16 plpks_get_passwordlen(void)
536 {
537 	return ospasswordlength;
538 }
539 
540 /**
541  * plpks_is_available() - Get the PLPKS availability status for the LPAR.
542  *
543  * The availability of PLPKS is inferred based upon the successful execution of
544  * the H_PKS_GET_CONFIG HCALL provided the firmware supports this feature. The
545  * H_PKS_GET_CONFIG HCALL reads the configuration and status information related
546  * to the PLPKS. The configuration structure provides a version number to inform
547  * the caller of the supported features.
548  *
549  * Returns: true is returned if PLPKS is available, false if not.
550  */
551 bool plpks_is_available(void)
552 {
553 	int rc;
554 
555 	if (!firmware_has_feature(FW_FEATURE_PLPKS))
556 		return false;
557 
558 	rc = _plpks_get_config();
559 	if (rc)
560 		return false;
561 
562 	return true;
563 }
564 
565 static int plpks_confirm_object_flushed(struct label *label,
566 					struct plpks_auth *auth)
567 {
568 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
569 	bool timed_out = true;
570 	u64 timeout = 0;
571 	u8 status;
572 	int rc;
573 
574 	do {
575 		rc = plpar_hcall(H_PKS_CONFIRM_OBJECT_FLUSHED, retbuf,
576 				 virt_to_phys(auth), virt_to_phys(label),
577 				 label->size);
578 
579 		status = retbuf[0];
580 		if (rc) {
581 			timed_out = false;
582 			if (rc == H_NOT_FOUND && status == 1)
583 				rc = 0;
584 			break;
585 		}
586 
587 		if (!rc && status == 1) {
588 			timed_out = false;
589 			break;
590 		}
591 
592 		fsleep(PLPKS_FLUSH_SLEEP);
593 		timeout = timeout + PLPKS_FLUSH_SLEEP;
594 	} while (timeout < PLPKS_MAX_TIMEOUT);
595 
596 	if (timed_out)
597 		return -ETIMEDOUT;
598 
599 	return pseries_status_to_err(rc);
600 }
601 
602 /**
603  * plpks_signed_update_var() - Update the specified authenticated variable.
604  * @var: authenticated variable to be updated
605  * @flags: signed update request operation flags
606  *
607  * The H_PKS_SIGNED_UPDATE HCALL performs a signed update to an object in the
608  * PLPKS. The object must have the signed update policy flag set.
609  *
610  * Possible reasons for the returned errno values:
611  *
612  * -ENXIO	if PLPKS is not supported
613  * -EIO		if PLPKS access is blocked due to the LPAR's state
614  *		if PLPKS modification is blocked due to the LPAR's state
615  *		if an error occurred while processing the request
616  * -EINVAL	if invalid authorization parameter
617  *		if invalid object label parameter
618  *		if invalid object label len parameter
619  *		if invalid or unsupported policy declaration
620  *		if invalid signed update flags
621  *		if invalid input data parameter
622  *		if invalid input data len parameter
623  *		if invalid continue token parameter
624  * -EPERM	if access is denied
625  * -ENOMEM	if there is inadequate memory to perform the operation
626  * -EBUSY	if unable to handle the request or long running operation
627  *		initiated, retry later
628  *
629  * Returns: On success 0 is returned, a negative errno if not.
630  */
631 int plpks_signed_update_var(struct plpks_var *var, u64 flags)
632 {
633 	unsigned long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
634 	int rc;
635 	struct label *label;
636 	struct plpks_auth *auth;
637 	u64 continuetoken = 0;
638 	u64 timeout = 0;
639 
640 	if (!var->data || var->datalen <= 0 || var->namelen > PLPKS_MAX_NAME_SIZE)
641 		return -EINVAL;
642 
643 	if (!(var->policy & PLPKS_SIGNEDUPDATE))
644 		return -EINVAL;
645 
646 	if (var->policy & PLPKS_WRAPPINGKEY)
647 		return -EINVAL;
648 
649 	// Signed updates need the component to be NULL.
650 	if (var->component)
651 		return -EINVAL;
652 
653 	auth = construct_auth(PLPKS_OS_OWNER);
654 	if (IS_ERR(auth))
655 		return PTR_ERR(auth);
656 
657 	label = construct_label(var->component, var->os, var->name, var->namelen);
658 	if (IS_ERR(label)) {
659 		rc = PTR_ERR(label);
660 		goto out;
661 	}
662 
663 	do {
664 		rc = plpar_hcall9(H_PKS_SIGNED_UPDATE, retbuf,
665 				  virt_to_phys(auth), virt_to_phys(label),
666 				  label->size, var->policy, flags,
667 				  virt_to_phys(var->data), var->datalen,
668 				  continuetoken);
669 
670 		continuetoken = retbuf[0];
671 		if (pseries_status_to_err(rc) == -EBUSY) {
672 			int delay_us = get_longbusy_msecs(rc) * 1000;
673 
674 			fsleep(delay_us);
675 			timeout += delay_us;
676 		}
677 		rc = pseries_status_to_err(rc);
678 	} while (rc == -EBUSY && timeout < PLPKS_MAX_TIMEOUT);
679 
680 	if (!rc)
681 		rc = plpks_confirm_object_flushed(label, auth);
682 
683 	kfree(label);
684 out:
685 	kfree(auth);
686 
687 	return rc;
688 }
689 
690 /**
691  * plpks_write_var() - Write the specified variable and its data to PLPKS.
692  * @var: variable to be written into the PLPKS
693  *
694  * The H_PKS_WRITE_OBJECT HCALL writes an object into the PLPKS. The caller must
695  * provide a valid component type for the variable, and the signed update policy
696  * flag must not be set.
697  *
698  * Possible reasons for the returned errno values:
699  *
700  * -ENXIO	if PLPKS is not supported
701  * -EIO		if PLPKS access is blocked due to the LPAR's state
702  *		if PLPKS modification is blocked due to the LPAR's state
703  *		if an error occurred while processing the request
704  * -EINVAL	if invalid authorization parameter
705  *		if invalid object label parameter
706  *		if invalid object label len parameter
707  *		if invalid or unsupported policy declaration
708  *		if invalid input data parameter
709  *		if invalid input data len parameter
710  * -EPERM	if access is denied
711  * -ENOMEM	if unable to store the requested object in the space available
712  * -EBUSY	if unable to handle the request
713  * -EEXIST	if the object label already exists
714  *
715  * Returns: On success 0 is returned, a negative errno if not.
716  */
717 int plpks_write_var(struct plpks_var var)
718 {
719 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
720 	struct plpks_auth *auth;
721 	struct label *label;
722 	int rc;
723 
724 	if (!var.component || !var.data || var.datalen <= 0 ||
725 	    var.namelen > PLPKS_MAX_NAME_SIZE || var.datalen > PLPKS_MAX_DATA_SIZE)
726 		return -EINVAL;
727 
728 	if (var.policy & PLPKS_SIGNEDUPDATE)
729 		return -EINVAL;
730 
731 	if (var.policy & PLPKS_WRAPPINGKEY)
732 		return -EINVAL;
733 
734 	auth = construct_auth(PLPKS_OS_OWNER);
735 	if (IS_ERR(auth))
736 		return PTR_ERR(auth);
737 
738 	label = construct_label(var.component, var.os, var.name, var.namelen);
739 	if (IS_ERR(label)) {
740 		rc = PTR_ERR(label);
741 		goto out;
742 	}
743 
744 	rc = plpar_hcall(H_PKS_WRITE_OBJECT, retbuf, virt_to_phys(auth),
745 			 virt_to_phys(label), label->size, var.policy,
746 			 virt_to_phys(var.data), var.datalen);
747 
748 	if (!rc)
749 		rc = plpks_confirm_object_flushed(label, auth);
750 
751 	rc = pseries_status_to_err(rc);
752 	kfree(label);
753 out:
754 	kfree(auth);
755 
756 	return rc;
757 }
758 
759 /**
760  * plpks_remove_var() - Remove the specified variable and its data from PLPKS.
761  * @component: metadata prefix in the object label metadata structure
762  * @varos: metadata OS flags in the object label metadata structure
763  * @vname: object label for the object that needs to be removed
764  *
765  * The H_PKS_REMOVE_OBJECT HCALL removes an object from the PLPKS. The removal
766  * is independent of the policy bits that are set.
767  *
768  * Possible reasons for the returned errno values:
769  *
770  * -ENXIO	if PLPKS is not supported
771  * -EIO		if PLPKS access is blocked due to the LPAR's state
772  *		if PLPKS modification is blocked due to the LPAR's state
773  *		if an error occurred while processing the request
774  * -EINVAL	if invalid authorization parameter
775  *		if invalid object label parameter
776  *		if invalid object label len parameter
777  * -EPERM	if access is denied
778  * -ENOENT	if the requested object was not found
779  * -EBUSY	if unable to handle the request
780  *
781  * Returns: On success 0 is returned, a negative errno if not.
782  */
783 int plpks_remove_var(char *component, u8 varos, struct plpks_var_name vname)
784 {
785 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
786 	struct plpks_auth *auth;
787 	struct label *label;
788 	int rc;
789 
790 	if (vname.namelen > PLPKS_MAX_NAME_SIZE)
791 		return -EINVAL;
792 
793 	auth = construct_auth(PLPKS_OS_OWNER);
794 	if (IS_ERR(auth))
795 		return PTR_ERR(auth);
796 
797 	label = construct_label(component, varos, vname.name, vname.namelen);
798 	if (IS_ERR(label)) {
799 		rc = PTR_ERR(label);
800 		goto out;
801 	}
802 
803 	rc = plpar_hcall(H_PKS_REMOVE_OBJECT, retbuf, virt_to_phys(auth),
804 			 virt_to_phys(label), label->size);
805 
806 	if (!rc)
807 		rc = plpks_confirm_object_flushed(label, auth);
808 
809 	rc = pseries_status_to_err(rc);
810 	kfree(label);
811 out:
812 	kfree(auth);
813 
814 	return rc;
815 }
816 
817 static int plpks_read_var(u8 consumer, struct plpks_var *var)
818 {
819 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
820 	struct plpks_auth *auth;
821 	struct label *label = NULL;
822 	u8 *output;
823 	int rc;
824 
825 	if (var->namelen > PLPKS_MAX_NAME_SIZE)
826 		return -EINVAL;
827 
828 	if (var->policy & PLPKS_WRAPPINGKEY)
829 		return -EINVAL;
830 
831 	auth = construct_auth(consumer);
832 	if (IS_ERR(auth))
833 		return PTR_ERR(auth);
834 
835 	if (consumer == PLPKS_OS_OWNER) {
836 		label = construct_label(var->component, var->os, var->name,
837 					var->namelen);
838 		if (IS_ERR(label)) {
839 			rc = PTR_ERR(label);
840 			goto out_free_auth;
841 		}
842 	}
843 
844 	output = kzalloc(maxobjsize, GFP_KERNEL);
845 	if (!output) {
846 		rc = -ENOMEM;
847 		goto out_free_label;
848 	}
849 
850 	if (consumer == PLPKS_OS_OWNER)
851 		rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
852 				 virt_to_phys(label), label->size, virt_to_phys(output),
853 				 maxobjsize);
854 	else
855 		rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
856 				 virt_to_phys(var->name), var->namelen, virt_to_phys(output),
857 				 maxobjsize);
858 
859 
860 	if (rc != H_SUCCESS) {
861 		rc = pseries_status_to_err(rc);
862 		goto out_free_output;
863 	}
864 
865 	if (!var->data || var->datalen > retbuf[0])
866 		var->datalen = retbuf[0];
867 
868 	var->policy = retbuf[1];
869 
870 	if (var->data)
871 		memcpy(var->data, output, var->datalen);
872 
873 	rc = 0;
874 
875 out_free_output:
876 	kfree(output);
877 out_free_label:
878 	kfree(label);
879 out_free_auth:
880 	kfree(auth);
881 
882 	return rc;
883 }
884 
885 /**
886  * plpks_wrapping_is_supported() - Get the H_PKS_WRAP_OBJECT interface
887  * availability status for the LPAR.
888  *
889  * Successful execution of the H_PKS_GET_CONFIG HCALL during initialization
890  * sets bit 3 of the flags variable in the PLPKS config structure if the
891  * H_PKS_WRAP_OBJECT interface is supported.
892  *
893  * Returns: true if the H_PKS_WRAP_OBJECT interface is supported, false if not.
894  */
895 bool plpks_wrapping_is_supported(void)
896 {
897 	return wrapsupport;
898 }
899 EXPORT_SYMBOL_GPL(plpks_wrapping_is_supported);
900 
901 /**
902  * plpks_gen_wrapping_key() - Generate a new random key with the 'wrapping key'
903  * policy set.
904  *
905  * The H_PKS_GEN_KEY HCALL makes the hypervisor generate a new random key and
906  * store the key in a PLPKS object with the provided object label. With the
907  * 'wrapping key' policy set, only the label to the newly generated random key
908  * would be visible to the user.
909  *
910  * Possible reasons for the returned errno values:
911  *
912  * -ENXIO	if PLPKS is not supported
913  * -EIO		if PLPKS access is blocked due to the LPAR's state
914  *		if PLPKS modification is blocked due to the LPAR's state
915  *		if an error occurred while processing the request
916  * -EINVAL	if invalid authorization parameter
917  *		if invalid object label parameter
918  *		if invalid object label len parameter
919  *		if invalid or unsupported policy declaration
920  *		if invalid output buffer parameter
921  *		if invalid output buffer length parameter
922  * -EPERM	if access is denied
923  * -ENOMEM	if there is inadequate memory to perform this operation
924  * -EBUSY	if unable to handle the request
925  * -EEXIST	if the object label already exists
926  *
927  * Returns: On success 0 is returned, a negative errno if not.
928  */
929 int plpks_gen_wrapping_key(void)
930 {
931 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
932 	struct plpks_auth *auth;
933 	struct label *label;
934 	int rc = 0, pseries_status = 0;
935 	struct plpks_var var = {
936 		.name = PLPKS_WRAPKEY_NAME,
937 		.namelen = strlen(var.name),
938 		.policy = PLPKS_WRAPPINGKEY,
939 		.os = PLPKS_VAR_LINUX,
940 		.component = PLPKS_WRAPKEY_COMPONENT
941 	};
942 
943 	auth = construct_auth(PLPKS_OS_OWNER);
944 	if (IS_ERR(auth))
945 		return PTR_ERR(auth);
946 
947 	label = construct_label(var.component, var.os, var.name, var.namelen);
948 	if (IS_ERR(label)) {
949 		rc = PTR_ERR(label);
950 		goto out;
951 	}
952 
953 	rc = plpar_hcall(H_PKS_GEN_KEY, retbuf,
954 			 virt_to_phys(auth), virt_to_phys(label),
955 			 label->size, var.policy,
956 			 NULL, PLPKS_WRAPPING_KEY_LENGTH);
957 
958 	if (!rc)
959 		rc = plpks_confirm_object_flushed(label, auth);
960 
961 	pseries_status = rc;
962 	rc = pseries_status_to_err(rc);
963 
964 	if (rc && rc != -EEXIST) {
965 		pr_err("H_PKS_GEN_KEY failed. pseries_status=%d, rc=%d",
966 		       pseries_status, rc);
967 	} else {
968 		rc = 0;
969 	}
970 
971 	kfree(label);
972 out:
973 	kfree(auth);
974 	return rc;
975 }
976 EXPORT_SYMBOL_GPL(plpks_gen_wrapping_key);
977 
978 /**
979  * plpks_wrap_object() - Wrap an object using the default wrapping key stored in
980  * the PLPKS.
981  * @input_buf: buffer containing the data to be wrapped
982  * @input_len: length of the input buffer
983  * @wrap_flags: object wrapping flags
984  * @output_buf: buffer to store the wrapped data
985  * @output_len: length of the output buffer
986  *
987  * The H_PKS_WRAP_OBJECT HCALL wraps an object using a wrapping key stored in
988  * the PLPKS and returns the wrapped object to the caller. The caller provides a
989  * label to the wrapping key with the 'wrapping key' policy set that must have
990  * been previously created with the H_PKS_GEN_KEY HCALL. The provided object is
991  * then encrypted with the wrapping key and additional metadata and the result
992  * is returned to the user. The metadata includes the wrapping algorithm and the
993  * wrapping key name so those parameters are not required during unwrap.
994  *
995  * Possible reasons for the returned errno values:
996  *
997  * -ENXIO	if PLPKS is not supported
998  * -EIO		if PLPKS access is blocked due to the LPAR's state
999  *		if PLPKS modification is blocked due to the LPAR's state
1000  *		if an error occurred while processing the request
1001  * -EINVAL	if invalid authorization parameter
1002  *		if invalid wrapping key label parameter
1003  *		if invalid wrapping key label length parameter
1004  *		if invalid or unsupported object wrapping flags
1005  *		if invalid input buffer parameter
1006  *		if invalid input buffer length parameter
1007  *		if invalid output buffer parameter
1008  *		if invalid output buffer length parameter
1009  *		if invalid continue token parameter
1010  *		if the wrapping key is not compatible with the wrapping
1011  *		algorithm
1012  * -EPERM	if access is denied
1013  * -ENOENT	if the requested wrapping key was not found
1014  * -EBUSY	if unable to handle the request or long running operation
1015  *		initiated, retry later.
1016  *
1017  * Returns: On success 0 is returned, a negative errno if not.
1018  */
1019 int plpks_wrap_object(u8 **input_buf, u32 input_len, u16 wrap_flags,
1020 		      u8 **output_buf, u32 *output_len)
1021 {
1022 	unsigned long retbuf[PLPAR_HCALL9_BUFSIZE] = { 0 };
1023 	struct plpks_auth *auth;
1024 	struct label *label;
1025 	u64 continuetoken = 0;
1026 	u64 objwrapflags = 0;
1027 	int rc = 0, pseries_status = 0;
1028 	bool sb_audit_or_enforce_bit = wrap_flags & BIT(0);
1029 	bool sb_enforce_bit = wrap_flags & BIT(1);
1030 	struct plpks_var var = {
1031 		.name = PLPKS_WRAPKEY_NAME,
1032 		.namelen = strlen(var.name),
1033 		.os = PLPKS_VAR_LINUX,
1034 		.component = PLPKS_WRAPKEY_COMPONENT
1035 	};
1036 
1037 	auth = construct_auth(PLPKS_OS_OWNER);
1038 	if (IS_ERR(auth))
1039 		return PTR_ERR(auth);
1040 
1041 	label = construct_label(var.component, var.os, var.name, var.namelen);
1042 	if (IS_ERR(label)) {
1043 		rc = PTR_ERR(label);
1044 		goto out;
1045 	}
1046 
1047 	/* Set the consumer password requirement bit. A must have. */
1048 	objwrapflags |= WRAPFLAG_BE_BIT_SET(3);
1049 
1050 	/* Set the wrapping algorithm bit. Just one algorithm option for now */
1051 	objwrapflags |= WRAPFLAG_BE_FIELD_PREP(60, 63, 0x1);
1052 
1053 	if (sb_audit_or_enforce_bit & sb_enforce_bit) {
1054 		pr_err("Cannot set both audit/enforce and enforce bits.");
1055 		rc = -EINVAL;
1056 		goto out_free_label;
1057 	} else if (sb_audit_or_enforce_bit) {
1058 		objwrapflags |= WRAPFLAG_BE_BIT_SET(1);
1059 	} else if (sb_enforce_bit) {
1060 		objwrapflags |= WRAPFLAG_BE_BIT_SET(2);
1061 	}
1062 
1063 	*output_len = input_len + PLPKS_WRAPPING_BUF_DIFF;
1064 
1065 	*output_buf = kzalloc(ALIGN(*output_len, PLPKS_WRAPPING_BUF_ALIGN),
1066 			      GFP_KERNEL);
1067 	if (!(*output_buf)) {
1068 		pr_err("Output buffer allocation failed. Returning -ENOMEM.");
1069 		rc = -ENOMEM;
1070 		goto out_free_label;
1071 	}
1072 
1073 	do {
1074 		rc = plpar_hcall9(H_PKS_WRAP_OBJECT, retbuf,
1075 				  virt_to_phys(auth), virt_to_phys(label),
1076 				  label->size, objwrapflags,
1077 				  virt_to_phys(*input_buf), input_len,
1078 				  virt_to_phys(*output_buf), *output_len,
1079 				  continuetoken);
1080 
1081 		continuetoken = retbuf[0];
1082 		pseries_status = rc;
1083 		rc = pseries_status_to_err(rc);
1084 	} while (rc == -EBUSY);
1085 
1086 	if (rc) {
1087 		pr_err("H_PKS_WRAP_OBJECT failed. pseries_status=%d, rc=%d",
1088 		       pseries_status, rc);
1089 		kfree(*output_buf);
1090 		*output_buf = NULL;
1091 	} else {
1092 		*output_len = retbuf[1];
1093 	}
1094 
1095 out_free_label:
1096 	kfree(label);
1097 out:
1098 	kfree(auth);
1099 	return rc;
1100 }
1101 EXPORT_SYMBOL_GPL(plpks_wrap_object);
1102 
1103 /**
1104  * plpks_unwrap_object() - Unwrap an object using the default wrapping key
1105  * stored in the PLPKS.
1106  * @input_buf: buffer containing the data to be unwrapped
1107  * @input_len: length of the input buffer
1108  * @output_buf: buffer to store the unwrapped data
1109  * @output_len: length of the output buffer
1110  *
1111  * The H_PKS_UNWRAP_OBJECT HCALL unwraps an object that was previously wrapped
1112  * using the H_PKS_WRAP_OBJECT HCALL.
1113  *
1114  * Possible reasons for the returned errno values:
1115  *
1116  * -ENXIO	if PLPKS is not supported
1117  * -EIO		if PLPKS access is blocked due to the LPAR's state
1118  *		if PLPKS modification is blocked due to the LPAR's state
1119  *		if an error occurred while processing the request
1120  * -EINVAL	if invalid authorization parameter
1121  *		if invalid or unsupported object unwrapping flags
1122  *		if invalid input buffer parameter
1123  *		if invalid input buffer length parameter
1124  *		if invalid output buffer parameter
1125  *		if invalid output buffer length parameter
1126  *		if invalid continue token parameter
1127  *		if the wrapping key is not compatible with the wrapping
1128  *		algorithm
1129  *		if the wrapped object's format is not supported
1130  *		if the wrapped object is invalid
1131  * -EPERM	if access is denied
1132  * -ENOENT	if the wrapping key for the provided object was not found
1133  * -EBUSY	if unable to handle the request or long running operation
1134  *		initiated, retry later.
1135  *
1136  * Returns: On success 0 is returned, a negative errno if not.
1137  */
1138 int plpks_unwrap_object(u8 **input_buf, u32 input_len, u8 **output_buf,
1139 			u32 *output_len)
1140 {
1141 	unsigned long retbuf[PLPAR_HCALL9_BUFSIZE] = { 0 };
1142 	struct plpks_auth *auth;
1143 	u64 continuetoken = 0;
1144 	u64 objwrapflags = 0;
1145 	int rc = 0, pseries_status = 0;
1146 
1147 	auth = construct_auth(PLPKS_OS_OWNER);
1148 	if (IS_ERR(auth))
1149 		return PTR_ERR(auth);
1150 
1151 	*output_len = input_len - PLPKS_WRAPPING_BUF_DIFF;
1152 	*output_buf = kzalloc(ALIGN(*output_len, PLPKS_WRAPPING_BUF_ALIGN),
1153 			      GFP_KERNEL);
1154 	if (!(*output_buf)) {
1155 		pr_err("Output buffer allocation failed. Returning -ENOMEM.");
1156 		rc = -ENOMEM;
1157 		goto out;
1158 	}
1159 
1160 	do {
1161 		rc = plpar_hcall9(H_PKS_UNWRAP_OBJECT, retbuf,
1162 				  virt_to_phys(auth), objwrapflags,
1163 				  virt_to_phys(*input_buf), input_len,
1164 				  virt_to_phys(*output_buf), *output_len,
1165 				  continuetoken);
1166 
1167 		continuetoken = retbuf[0];
1168 		pseries_status = rc;
1169 		rc = pseries_status_to_err(rc);
1170 	} while (rc == -EBUSY);
1171 
1172 	if (rc) {
1173 		pr_err("H_PKS_UNWRAP_OBJECT failed. pseries_status=%d, rc=%d",
1174 		       pseries_status, rc);
1175 		kfree(*output_buf);
1176 		*output_buf = NULL;
1177 	} else {
1178 		*output_len = retbuf[1];
1179 	}
1180 
1181 out:
1182 	kfree(auth);
1183 	return rc;
1184 }
1185 EXPORT_SYMBOL_GPL(plpks_unwrap_object);
1186 
1187 /**
1188  * plpks_read_os_var() - Fetch the data for the specified variable that is owned
1189  * by the OS consumer.
1190  * @var: variable to be read from the PLPKS
1191  *
1192  * The consumer or the owner of the object is the os kernel. The
1193  * H_PKS_READ_OBJECT HCALL reads an object from the PLPKS. The caller must
1194  * allocate the buffer var->data and specify the length for this buffer in
1195  * var->datalen. If no buffer is provided, var->datalen will be populated with
1196  * the requested object's size.
1197  *
1198  * Possible reasons for the returned errno values:
1199  *
1200  * -ENXIO	if PLPKS is not supported
1201  * -EIO		if PLPKS access is blocked due to the LPAR's state
1202  *		if an error occurred while processing the request
1203  * -EINVAL	if invalid authorization parameter
1204  *		if invalid object label parameter
1205  *		if invalid object label len parameter
1206  *		if invalid output data parameter
1207  *		if invalid output data len parameter
1208  * -EPERM	if access is denied
1209  * -ENOENT	if the requested object was not found
1210  * -EFBIG	if the requested object couldn't be
1211  *		stored in the buffer provided
1212  * -EBUSY	if unable to handle the request
1213  *
1214  * Returns: On success 0 is returned, a negative errno if not.
1215  */
1216 int plpks_read_os_var(struct plpks_var *var)
1217 {
1218 	return plpks_read_var(PLPKS_OS_OWNER, var);
1219 }
1220 
1221 /**
1222  * plpks_read_fw_var() - Fetch the data for the specified variable that is
1223  * owned by the firmware consumer.
1224  * @var: variable to be read from the PLPKS
1225  *
1226  * The consumer or the owner of the object is the firmware. The
1227  * H_PKS_READ_OBJECT HCALL reads an object from the PLPKS. The caller must
1228  * allocate the buffer var->data and specify the length for this buffer in
1229  * var->datalen. If no buffer is provided, var->datalen will be populated with
1230  * the requested object's size.
1231  *
1232  * Possible reasons for the returned errno values:
1233  *
1234  * -ENXIO	if PLPKS is not supported
1235  * -EIO		if PLPKS access is blocked due to the LPAR's state
1236  *		if an error occurred while processing the request
1237  * -EINVAL	if invalid authorization parameter
1238  *		if invalid object label parameter
1239  *		if invalid object label len parameter
1240  *		if invalid output data parameter
1241  *		if invalid output data len parameter
1242  * -EPERM	if access is denied
1243  * -ENOENT	if the requested object was not found
1244  * -EFBIG	if the requested object couldn't be
1245  *		stored in the buffer provided
1246  * -EBUSY	if unable to handle the request
1247  *
1248  * Returns: On success 0 is returned, a negative errno if not.
1249  */
1250 int plpks_read_fw_var(struct plpks_var *var)
1251 {
1252 	return plpks_read_var(PLPKS_FW_OWNER, var);
1253 }
1254 
1255 /**
1256  * plpks_read_bootloader_var() - Fetch the data for the specified variable
1257  * owned by the bootloader consumer.
1258  * @var: variable to be read from the PLPKS
1259  *
1260  * The consumer or the owner of the object is the bootloader. The
1261  * H_PKS_READ_OBJECT HCALL reads an object from the PLPKS. The caller must
1262  * allocate the buffer var->data and specify the length for this buffer in
1263  * var->datalen. If no buffer is provided, var->datalen will be populated with
1264  * the requested object's size.
1265  *
1266  * Possible reasons for the returned errno values:
1267  *
1268  * -ENXIO	if PLPKS is not supported
1269  * -EIO		if PLPKS access is blocked due to the LPAR's state
1270  *		if an error occurred while processing the request
1271  * -EINVAL	if invalid authorization parameter
1272  *		if invalid object label parameter
1273  *		if invalid object label len parameter
1274  *		if invalid output data parameter
1275  *		if invalid output data len parameter
1276  * -EPERM	if access is denied
1277  * -ENOENT	if the requested object was not found
1278  * -EFBIG	if the requested object couldn't be
1279  *		stored in the buffer provided
1280  * -EBUSY	if unable to handle the request
1281  *
1282  * Returns: On success 0 is returned, a negative errno if not.
1283  */
1284 int plpks_read_bootloader_var(struct plpks_var *var)
1285 {
1286 	return plpks_read_var(PLPKS_BOOTLOADER_OWNER, var);
1287 }
1288 
1289 /**
1290  * plpks_populate_fdt(): Populates the FDT with the PLPKS password to prepare
1291  * for kexec.
1292  * @fdt: pointer to the device tree blob
1293  *
1294  * Upon confirming the existence of the chosen node, invoke fdt_setprop to
1295  * populate the device tree with the PLPKS password in order to prepare for
1296  * kexec.
1297  *
1298  * Returns: On success 0 is returned, a negative value if not.
1299  */
1300 int plpks_populate_fdt(void *fdt)
1301 {
1302 	int chosen_offset = fdt_path_offset(fdt, "/chosen");
1303 
1304 	if (chosen_offset < 0) {
1305 		pr_err("Can't find chosen node: %s\n",
1306 		       fdt_strerror(chosen_offset));
1307 		return chosen_offset;
1308 	}
1309 
1310 	return fdt_setprop(fdt, chosen_offset, "ibm,plpks-pw", ospassword, ospasswordlength);
1311 }
1312 
1313 /**
1314  * plpks_early_init_devtree() - Retrieves and clears the PLPKS password from the
1315  * DT in early init.
1316  *
1317  * Once a password is registered with the hypervisor it cannot be cleared
1318  * without rebooting the LPAR, so to keep using the PLPKS across kexec boots we
1319  * need to recover the previous password from the FDT.
1320  *
1321  * There are a few challenges here.  We don't want the password to be visible to
1322  * users, so we need to clear it from the FDT.  This has to be done in early
1323  * boot. Clearing it from the FDT would make the FDT's checksum invalid, so we
1324  * have to manually cause the checksum to be recalculated.
1325  */
1326 void __init plpks_early_init_devtree(void)
1327 {
1328 	void *fdt = initial_boot_params;
1329 	int chosen_node = fdt_path_offset(fdt, "/chosen");
1330 	const u8 *password;
1331 	int len;
1332 
1333 	if (chosen_node < 0)
1334 		return;
1335 
1336 	password = fdt_getprop(fdt, chosen_node, "ibm,plpks-pw", &len);
1337 	if (len <= 0) {
1338 		pr_debug("Couldn't find ibm,plpks-pw node.\n");
1339 		return;
1340 	}
1341 
1342 	ospassword = memblock_alloc_raw(len, SMP_CACHE_BYTES);
1343 	if (!ospassword) {
1344 		pr_err("Error allocating memory for password.\n");
1345 		goto out;
1346 	}
1347 
1348 	memcpy(ospassword, password, len);
1349 	ospasswordlength = (u16)len;
1350 
1351 out:
1352 	fdt_nop_property(fdt, chosen_node, "ibm,plpks-pw");
1353 	// Since we've cleared the password, we must update the FDT checksum
1354 	early_init_dt_verify(fdt, __pa(fdt));
1355 }
1356 
1357 static __init int pseries_plpks_init(void)
1358 {
1359 	int rc;
1360 
1361 	if (!firmware_has_feature(FW_FEATURE_PLPKS))
1362 		return -ENODEV;
1363 
1364 	rc = _plpks_get_config();
1365 
1366 	if (rc) {
1367 		pr_err("POWER LPAR Platform KeyStore is not supported or enabled\n");
1368 		return rc;
1369 	}
1370 
1371 	rc = plpks_gen_password();
1372 	if (rc)
1373 		pr_err("Failed setting POWER LPAR Platform KeyStore Password\n");
1374 	else
1375 		pr_info("POWER LPAR Platform KeyStore initialized successfully\n");
1376 
1377 	return rc;
1378 }
1379 machine_arch_initcall(pseries, pseries_plpks_init);
1380