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