17568cb4eSPaul Mackerras // SPDX-License-Identifier: GPL-2.0-or-later
27568cb4eSPaul Mackerras /*
37568cb4eSPaul Mackerras  * hvconsole.c
47568cb4eSPaul Mackerras  * Copyright (C) 2004 Hollis Blanchard, IBM Corporation
57568cb4eSPaul Mackerras  * Copyright (C) 2004 IBM Corporation
67568cb4eSPaul Mackerras  *
77568cb4eSPaul Mackerras  * Additional Author(s):
87568cb4eSPaul Mackerras  *  Ryan S. Arnold <rsa@us.ibm.com>
97568cb4eSPaul Mackerras  *
107568cb4eSPaul Mackerras  * LPAR console support.
117568cb4eSPaul Mackerras  */
127568cb4eSPaul Mackerras 
137568cb4eSPaul Mackerras #include <linux/kernel.h>
147568cb4eSPaul Mackerras #include <linux/export.h>
157568cb4eSPaul Mackerras #include <linux/errno.h>
167568cb4eSPaul Mackerras #include <asm/hvcall.h>
177568cb4eSPaul Mackerras #include <asm/hvconsole.h>
187568cb4eSPaul Mackerras #include <asm/plpar_wrappers.h>
197568cb4eSPaul Mackerras 
207568cb4eSPaul Mackerras /**
217568cb4eSPaul Mackerras  * hvc_get_chars - retrieve characters from firmware for denoted vterm adapter
227568cb4eSPaul Mackerras  * @vtermno: The vtermno or unit_address of the adapter from which to fetch the
237568cb4eSPaul Mackerras  *	data.
247568cb4eSPaul Mackerras  * @buf: The character buffer into which to put the character data fetched from
257568cb4eSPaul Mackerras  *	firmware.
267568cb4eSPaul Mackerras  * @count: not used?
27e9848d62SPaul Gortmaker  */
hvc_get_chars(uint32_t vtermno,char * buf,int count)28e9848d62SPaul Gortmaker int hvc_get_chars(uint32_t vtermno, char *buf, int count)
297568cb4eSPaul Mackerras {
307568cb4eSPaul Mackerras 	long ret;
31212bebb4SDeepthi Dharwar 	unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
327568cb4eSPaul Mackerras 	unsigned long *lbuf = (unsigned long *)buf;
337568cb4eSPaul Mackerras 
34446957baSAdam Buchbinder 	ret = plpar_hcall(H_GET_TERM_CHAR, retbuf, vtermno);
357568cb4eSPaul Mackerras 	lbuf[0] = be64_to_cpu(retbuf[1]);
367568cb4eSPaul Mackerras 	lbuf[1] = be64_to_cpu(retbuf[2]);
377568cb4eSPaul Mackerras 
387568cb4eSPaul Mackerras 	if (ret == H_SUCCESS)
397568cb4eSPaul Mackerras 		return retbuf[0];
407568cb4eSPaul Mackerras 
417568cb4eSPaul Mackerras 	return 0;
427568cb4eSPaul Mackerras }
43a0a96ee9SAnton Blanchard 
44a0a96ee9SAnton Blanchard EXPORT_SYMBOL(hvc_get_chars);
45a0a96ee9SAnton Blanchard 
467568cb4eSPaul Mackerras 
47a0a96ee9SAnton Blanchard /**
48a02f6dfcSAnton Blanchard  * hvc_put_chars: send characters to firmware for denoted vterm adapter
49a02f6dfcSAnton Blanchard  * @vtermno: The vtermno or unit_address of the adapter from which the data
50a0a96ee9SAnton Blanchard  *	originated.
51a0a96ee9SAnton Blanchard  * @buf: The character buffer that contains the character data to send to
52a0a96ee9SAnton Blanchard  *	firmware. Must be at least 16 bytes, even if count is less than 16.
53b9377ffcSAnton Blanchard  * @count: Send this number of characters.
547568cb4eSPaul Mackerras  */
hvc_put_chars(uint32_t vtermno,const char * buf,int count)557568cb4eSPaul Mackerras int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
567568cb4eSPaul Mackerras {
577568cb4eSPaul Mackerras 	unsigned long *lbuf = (unsigned long *) buf;
587568cb4eSPaul Mackerras 	long ret;
597568cb4eSPaul Mackerras 
607568cb4eSPaul Mackerras 
617568cb4eSPaul Mackerras 	/* hcall will ret H_PARAMETER if 'count' exceeds firmware max.*/
627568cb4eSPaul Mackerras 	if (count > MAX_VIO_PUT_CHARS)
637568cb4eSPaul Mackerras 		count = MAX_VIO_PUT_CHARS;
647568cb4eSPaul Mackerras 
65934bda59SDaniel Axtens 	ret = plpar_hcall_norets(H_PUT_TERM_CHAR, vtermno, count,
667568cb4eSPaul Mackerras 				 cpu_to_be64(lbuf[0]),
677568cb4eSPaul Mackerras 				 cpu_to_be64(lbuf[1]));
687568cb4eSPaul Mackerras 	if (ret == H_SUCCESS)
697568cb4eSPaul Mackerras 		return count;
707568cb4eSPaul Mackerras 	if (ret == H_BUSY)
717568cb4eSPaul Mackerras 		return -EAGAIN;
727568cb4eSPaul Mackerras 	return -EIO;
7345d607edSRyan S. Arnold }
7445d607edSRyan S. Arnold 
7545d607edSRyan S. Arnold EXPORT_SYMBOL(hvc_put_chars);
7645d607edSRyan S. Arnold