diff mbox

[kvm-unit-tests,v3,16/17] powerpc/ppc64: add RTAS support

Message ID 1455380910-30604-17-git-send-email-drjones@redhat.com
State Superseded
Headers show

Commit Message

Andrew Jones Feb. 13, 2016, 4:28 p.m. UTC
Add enough RTAS support to start adding RTAS commands. Just add
power-off for now.

Signed-off-by: Andrew Jones <drjones@redhat.com>
---
 lib/powerpc/asm/rtas.h  |  26 +++++++++
 lib/powerpc/io.c        |   2 +
 lib/powerpc/rtas.c      | 139 ++++++++++++++++++++++++++++++++++++++++++++++++
 lib/ppc64/asm/rtas.h    |   1 +
 powerpc/Makefile.common |   1 +
 5 files changed, 169 insertions(+)
 create mode 100644 lib/powerpc/asm/rtas.h
 create mode 100644 lib/powerpc/rtas.c
 create mode 100644 lib/ppc64/asm/rtas.h

Comments

Andrew Jones Feb. 13, 2016, 5:18 p.m. UTC | #1
On Sat, Feb 13, 2016 at 05:28:29PM +0100, Andrew Jones wrote:
> Add enough RTAS support to start adding RTAS commands. Just add
> power-off for now.
> 
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
>  lib/powerpc/asm/rtas.h  |  26 +++++++++
>  lib/powerpc/io.c        |   2 +
>  lib/powerpc/rtas.c      | 139 ++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/ppc64/asm/rtas.h    |   1 +
>  powerpc/Makefile.common |   1 +
>  5 files changed, 169 insertions(+)
>  create mode 100644 lib/powerpc/asm/rtas.h
>  create mode 100644 lib/powerpc/rtas.c
>  create mode 100644 lib/ppc64/asm/rtas.h
> 
> diff --git a/lib/powerpc/asm/rtas.h b/lib/powerpc/asm/rtas.h
> new file mode 100644
> index 0000000000000..522225bcb6de3
> --- /dev/null
> +++ b/lib/powerpc/asm/rtas.h
> @@ -0,0 +1,26 @@
> +#ifndef _ASMPOWERPC_RTAS_H_
> +#define _ASMPOWERPC_RTAS_H_
> +/*
> + * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2.
> + */
> +#include <libcflat.h>
> +
> +#define RTAS_UNKNOWN_SERVICE	(-1)
> +
> +struct rtas_args {
> +	u32 token;
> +	u32 nargs;
> +	u32 nret;
> +	u32 args[16];
> +	u32 *rets;
> +};
> +
> +extern void rtas_init(void);
> +extern int rtas_token(const char *service);
> +extern int rtas_call(int token, int nargs, int nret, int *outputs, ...);
> +
> +extern void rtas_power_off(void);
> +
> +#endif /* _ASMPOWERPC_RTAS_H_ */
> diff --git a/lib/powerpc/io.c b/lib/powerpc/io.c
> index 5e1fa8dd96ab6..e57a28c583eb0 100644
> --- a/lib/powerpc/io.c
> +++ b/lib/powerpc/io.c
> @@ -7,6 +7,7 @@
>   */
>  #include <libcflat.h>
>  #include <asm/spinlock.h>
> +#include <asm/rtas.h>
>  
>  extern void halt(int code);
>  extern void putchar(int c);
> @@ -15,6 +16,7 @@ static struct spinlock uart_lock;
>  
>  void io_init(void)
>  {
> +	rtas_init();
>  }
>  
>  void puts(const char *s)
> diff --git a/lib/powerpc/rtas.c b/lib/powerpc/rtas.c
> new file mode 100644
> index 0000000000000..b6ae7391181f9
> --- /dev/null
> +++ b/lib/powerpc/rtas.c
> @@ -0,0 +1,139 @@
> +/*
> + * powerpc RTAS
> + *
> + * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2.
> + */
> +#include <libcflat.h>
> +#include <libfdt/libfdt.h>
> +#include <devicetree.h>
> +#include <asm/spinlock.h>
> +#include <asm/hcall.h>
> +#include <asm/io.h>
> +#include <asm/rtas.h>
> +
> +#if defined(__powerpc64__)
> +struct func_ptr {
> +	unsigned long ptr;
> +	unsigned long toc;
> +};
> +static struct func_ptr rtas_entry_funcptr;
> +#endif
> +typedef void (*rtas_entry_t)(unsigned long);
> +static rtas_entry_t enter_rtas;
> +static struct rtas_args rtas_args;
> +static struct spinlock lock;
> +
> +static int rtas_node(void)
> +{
> +	int node = fdt_path_offset(dt_fdt(), "/rtas");
> +
> +	if (node < 0) {
> +		printf("%s: /rtas: %s\n", __func__, fdt_strerror(node));
> +		abort();
> +	}
> +
> +	return node;
> +}
> +
> +void rtas_init(void)
> +{
> +	const struct fdt_property *prop;
> +	int node = rtas_node(), len;
> +	unsigned long entry;
> +	u32 *data;
> +
> +	if (!dt_available()) {
> +		printf("%s: No device tree!\n", __func__);
> +		abort();
> +	}
> +
> +	prop = fdt_get_property(dt_fdt(), node,
> +				"linux,rtas-entry", &len);
> +	if (!prop) {
> +		printf("%s: /rtas/linux,rtas-entry: %s\n",
> +				__func__, fdt_strerror(len));
> +		abort();
> +	}
> +
> +	data = (u32 *)prop->data;
> +	entry = (unsigned long)fdt32_to_cpu(*data);
> +
> +	if (hcall_have_broken_sc1()) {
> +		u32 *insn = (u32 *)entry;
> +		int size, i;
> +
> +		prop = fdt_get_property(dt_fdt(), node,
> +					"rtas-size", &len);
> +		if (!prop) {
> +			printf("%s: /rtas/rtas-size: %s\n",
> +					__func__, fdt_strerror(len));
> +			abort();
> +		}
> +		data = (u32 *)prop->data;
> +		size = (int)fdt32_to_cpu(*data);
> +
> +		for (i = 0; i < size; ++i, ++insn)

Darn. Looking over these patches doing a quick self review I see a bug.
This i < size should be i < size/4. I've fixed the branch on github.

> +			if (*insn == SC1)
> +				*insn = SC1_REPLACEMENT;
> +	}
> +
> +#if defined(__powerpc64__)
> +	rtas_entry_funcptr.ptr = entry;
> +	enter_rtas = (rtas_entry_t)&rtas_entry_funcptr;
> +#else
> +	enter_rtas = (rtas_entry_t)entry;
> +#endif
> +}
> +
> +int rtas_token(const char *service)
> +{
> +	const struct fdt_property *prop;
> +	u32 *token;
> +
> +	prop = fdt_get_property(dt_fdt(), rtas_node(), service, NULL);
> +	if (prop) {
> +		token = (u32 *)prop->data;
> +		return fdt32_to_cpu(*token);
> +	}
> +	return RTAS_UNKNOWN_SERVICE;
> +}
> +
> +int rtas_call(int token, int nargs, int nret, int *outputs, ...)
> +{
> +	va_list list;
> +	int ret, i;
> +
> +	spin_lock(&lock);
> +
> +	rtas_args.token = cpu_to_be32(token);
> +	rtas_args.nargs = cpu_to_be32(nargs);
> +	rtas_args.nret = cpu_to_be32(nret);
> +	rtas_args.rets = &rtas_args.args[nargs];
> +
> +	va_start(list, outputs);
> +	for (i = 0; i < nargs; ++i)
> +		rtas_args.args[i] = cpu_to_be32(va_arg(list, u32));
> +	va_end(list);
> +
> +	for (i = 0; i < nret; ++i)
> +		rtas_args.rets[i] = 0;
> +
> +	enter_rtas(__pa(&rtas_args));
> +
> +	if (nret > 1 && outputs != NULL)
> +		for (i = 0; i < nret - 1; ++i)
> +			outputs[i] = be32_to_cpu(rtas_args.rets[i + 1]);
> +
> +	ret = nret > 0 ? be32_to_cpu(rtas_args.rets[0]) : 0;
> +
> +	spin_unlock(&lock);
> +	return ret;
> +}
> +
> +void rtas_power_off(void)
> +{
> +	int ret = rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1);
> +	printf("RTAS power-off returned %d\n", ret);
> +}
> diff --git a/lib/ppc64/asm/rtas.h b/lib/ppc64/asm/rtas.h
> new file mode 100644
> index 0000000000000..fe77f635cd860
> --- /dev/null
> +++ b/lib/ppc64/asm/rtas.h
> @@ -0,0 +1 @@
> +#include "../../powerpc/asm/rtas.h"
> diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common
> index 9654bce1752eb..3a03ab6dfc3e9 100644
> --- a/powerpc/Makefile.common
> +++ b/powerpc/Makefile.common
> @@ -33,6 +33,7 @@ cflatobjs += lib/devicetree.o
>  cflatobjs += lib/powerpc/io.o
>  cflatobjs += lib/powerpc/hcall.o
>  cflatobjs += lib/powerpc/setup.o
> +cflatobjs += lib/powerpc/rtas.o
>  
>  libgcc := $(shell $(CC) $(machine) --print-libgcc-file-name)
>  start_addr := $(shell printf "%x\n" $$(( $(phys_base) + $(kernel_offset) )))
> -- 
> 2.4.3
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thomas Huth Feb. 15, 2016, 9:59 a.m. UTC | #2
On 13.02.2016 17:28, Andrew Jones wrote:
> Add enough RTAS support to start adding RTAS commands. Just add
> power-off for now.
> 
> Signed-off-by: Andrew Jones <drjones@redhat.com>
> ---
>  lib/powerpc/asm/rtas.h  |  26 +++++++++
>  lib/powerpc/io.c        |   2 +
>  lib/powerpc/rtas.c      | 139 ++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/ppc64/asm/rtas.h    |   1 +
>  powerpc/Makefile.common |   1 +
>  5 files changed, 169 insertions(+)
>  create mode 100644 lib/powerpc/asm/rtas.h
>  create mode 100644 lib/powerpc/rtas.c
>  create mode 100644 lib/ppc64/asm/rtas.h
...
> diff --git a/lib/powerpc/rtas.c b/lib/powerpc/rtas.c
> new file mode 100644
> index 0000000000000..b6ae7391181f9
> --- /dev/null
> +++ b/lib/powerpc/rtas.c
> @@ -0,0 +1,139 @@
> +/*
> + * powerpc RTAS
> + *
> + * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2.
> + */
> +#include <libcflat.h>
> +#include <libfdt/libfdt.h>
> +#include <devicetree.h>
> +#include <asm/spinlock.h>
> +#include <asm/hcall.h>
> +#include <asm/io.h>
> +#include <asm/rtas.h>
> +
> +#if defined(__powerpc64__)
> +struct func_ptr {
> +	unsigned long ptr;
> +	unsigned long toc;
> +};
> +static struct func_ptr rtas_entry_funcptr;
> +#endif
> +typedef void (*rtas_entry_t)(unsigned long);
> +static rtas_entry_t enter_rtas;
> +static struct rtas_args rtas_args;
> +static struct spinlock lock;

I'd maybe name the lock variable "rtas_lock" instead (in case we ever
use more locks in this file, it's then more obvious what this lock is
about) ... but apart from that, and the bug in the sc1 loop that you
already mentioned, the patch looks fine to me.

 Thomas

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andrew Jones Feb. 15, 2016, noon UTC | #3
On Mon, Feb 15, 2016 at 10:59:31AM +0100, Thomas Huth wrote:
> On 13.02.2016 17:28, Andrew Jones wrote:
> > Add enough RTAS support to start adding RTAS commands. Just add
> > power-off for now.
> > 
> > Signed-off-by: Andrew Jones <drjones@redhat.com>
> > ---
> >  lib/powerpc/asm/rtas.h  |  26 +++++++++
> >  lib/powerpc/io.c        |   2 +
> >  lib/powerpc/rtas.c      | 139 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  lib/ppc64/asm/rtas.h    |   1 +
> >  powerpc/Makefile.common |   1 +
> >  5 files changed, 169 insertions(+)
> >  create mode 100644 lib/powerpc/asm/rtas.h
> >  create mode 100644 lib/powerpc/rtas.c
> >  create mode 100644 lib/ppc64/asm/rtas.h
> ...
> > diff --git a/lib/powerpc/rtas.c b/lib/powerpc/rtas.c
> > new file mode 100644
> > index 0000000000000..b6ae7391181f9
> > --- /dev/null
> > +++ b/lib/powerpc/rtas.c
> > @@ -0,0 +1,139 @@
> > +/*
> > + * powerpc RTAS
> > + *
> > + * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
> > + *
> > + * This work is licensed under the terms of the GNU LGPL, version 2.
> > + */
> > +#include <libcflat.h>
> > +#include <libfdt/libfdt.h>
> > +#include <devicetree.h>
> > +#include <asm/spinlock.h>
> > +#include <asm/hcall.h>
> > +#include <asm/io.h>
> > +#include <asm/rtas.h>
> > +
> > +#if defined(__powerpc64__)
> > +struct func_ptr {
> > +	unsigned long ptr;
> > +	unsigned long toc;
> > +};
> > +static struct func_ptr rtas_entry_funcptr;
> > +#endif
> > +typedef void (*rtas_entry_t)(unsigned long);
> > +static rtas_entry_t enter_rtas;
> > +static struct rtas_args rtas_args;
> > +static struct spinlock lock;
> 
> I'd maybe name the lock variable "rtas_lock" instead (in case we ever
> use more locks in this file, it's then more obvious what this lock is
> about) ... but apart from that, and the bug in the sc1 loop that you

I'll rename lock, and v4 will have the size/4 fix.

> already mentioned, the patch looks fine to me.

Can I add your r-b?

Thanks,
drew
--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thomas Huth Feb. 15, 2016, 12:15 p.m. UTC | #4
On 15.02.2016 13:00, Andrew Jones wrote:
> On Mon, Feb 15, 2016 at 10:59:31AM +0100, Thomas Huth wrote:
>> On 13.02.2016 17:28, Andrew Jones wrote:
>>> Add enough RTAS support to start adding RTAS commands. Just add
>>> power-off for now.
>>>
>>> Signed-off-by: Andrew Jones <drjones@redhat.com>
>>> ---
>>>  lib/powerpc/asm/rtas.h  |  26 +++++++++
>>>  lib/powerpc/io.c        |   2 +
>>>  lib/powerpc/rtas.c      | 139 ++++++++++++++++++++++++++++++++++++++++++++++++
>>>  lib/ppc64/asm/rtas.h    |   1 +
>>>  powerpc/Makefile.common |   1 +
>>>  5 files changed, 169 insertions(+)
>>>  create mode 100644 lib/powerpc/asm/rtas.h
>>>  create mode 100644 lib/powerpc/rtas.c
>>>  create mode 100644 lib/ppc64/asm/rtas.h
>> ...
>>> diff --git a/lib/powerpc/rtas.c b/lib/powerpc/rtas.c
>>> new file mode 100644
>>> index 0000000000000..b6ae7391181f9
>>> --- /dev/null
>>> +++ b/lib/powerpc/rtas.c
>>> @@ -0,0 +1,139 @@
>>> +/*
>>> + * powerpc RTAS
>>> + *
>>> + * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
>>> + *
>>> + * This work is licensed under the terms of the GNU LGPL, version 2.
>>> + */
>>> +#include <libcflat.h>
>>> +#include <libfdt/libfdt.h>
>>> +#include <devicetree.h>
>>> +#include <asm/spinlock.h>
>>> +#include <asm/hcall.h>
>>> +#include <asm/io.h>
>>> +#include <asm/rtas.h>
>>> +
>>> +#if defined(__powerpc64__)
>>> +struct func_ptr {
>>> +	unsigned long ptr;
>>> +	unsigned long toc;
>>> +};
>>> +static struct func_ptr rtas_entry_funcptr;
>>> +#endif
>>> +typedef void (*rtas_entry_t)(unsigned long);
>>> +static rtas_entry_t enter_rtas;
>>> +static struct rtas_args rtas_args;
>>> +static struct spinlock lock;
>>
>> I'd maybe name the lock variable "rtas_lock" instead (in case we ever
>> use more locks in this file, it's then more obvious what this lock is
>> about) ... but apart from that, and the bug in the sc1 loop that you
> 
> I'll rename lock, and v4 will have the size/4 fix.
> 
>> already mentioned, the patch looks fine to me.
> 
> Can I add your r-b?

Yes, with the two changes:

Reviewed-by: Thomas Huth <thuth@redhat.com>

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/lib/powerpc/asm/rtas.h b/lib/powerpc/asm/rtas.h
new file mode 100644
index 0000000000000..522225bcb6de3
--- /dev/null
+++ b/lib/powerpc/asm/rtas.h
@@ -0,0 +1,26 @@ 
+#ifndef _ASMPOWERPC_RTAS_H_
+#define _ASMPOWERPC_RTAS_H_
+/*
+ * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.
+ */
+#include <libcflat.h>
+
+#define RTAS_UNKNOWN_SERVICE	(-1)
+
+struct rtas_args {
+	u32 token;
+	u32 nargs;
+	u32 nret;
+	u32 args[16];
+	u32 *rets;
+};
+
+extern void rtas_init(void);
+extern int rtas_token(const char *service);
+extern int rtas_call(int token, int nargs, int nret, int *outputs, ...);
+
+extern void rtas_power_off(void);
+
+#endif /* _ASMPOWERPC_RTAS_H_ */
diff --git a/lib/powerpc/io.c b/lib/powerpc/io.c
index 5e1fa8dd96ab6..e57a28c583eb0 100644
--- a/lib/powerpc/io.c
+++ b/lib/powerpc/io.c
@@ -7,6 +7,7 @@ 
  */
 #include <libcflat.h>
 #include <asm/spinlock.h>
+#include <asm/rtas.h>
 
 extern void halt(int code);
 extern void putchar(int c);
@@ -15,6 +16,7 @@  static struct spinlock uart_lock;
 
 void io_init(void)
 {
+	rtas_init();
 }
 
 void puts(const char *s)
diff --git a/lib/powerpc/rtas.c b/lib/powerpc/rtas.c
new file mode 100644
index 0000000000000..b6ae7391181f9
--- /dev/null
+++ b/lib/powerpc/rtas.c
@@ -0,0 +1,139 @@ 
+/*
+ * powerpc RTAS
+ *
+ * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.
+ */
+#include <libcflat.h>
+#include <libfdt/libfdt.h>
+#include <devicetree.h>
+#include <asm/spinlock.h>
+#include <asm/hcall.h>
+#include <asm/io.h>
+#include <asm/rtas.h>
+
+#if defined(__powerpc64__)
+struct func_ptr {
+	unsigned long ptr;
+	unsigned long toc;
+};
+static struct func_ptr rtas_entry_funcptr;
+#endif
+typedef void (*rtas_entry_t)(unsigned long);
+static rtas_entry_t enter_rtas;
+static struct rtas_args rtas_args;
+static struct spinlock lock;
+
+static int rtas_node(void)
+{
+	int node = fdt_path_offset(dt_fdt(), "/rtas");
+
+	if (node < 0) {
+		printf("%s: /rtas: %s\n", __func__, fdt_strerror(node));
+		abort();
+	}
+
+	return node;
+}
+
+void rtas_init(void)
+{
+	const struct fdt_property *prop;
+	int node = rtas_node(), len;
+	unsigned long entry;
+	u32 *data;
+
+	if (!dt_available()) {
+		printf("%s: No device tree!\n", __func__);
+		abort();
+	}
+
+	prop = fdt_get_property(dt_fdt(), node,
+				"linux,rtas-entry", &len);
+	if (!prop) {
+		printf("%s: /rtas/linux,rtas-entry: %s\n",
+				__func__, fdt_strerror(len));
+		abort();
+	}
+
+	data = (u32 *)prop->data;
+	entry = (unsigned long)fdt32_to_cpu(*data);
+
+	if (hcall_have_broken_sc1()) {
+		u32 *insn = (u32 *)entry;
+		int size, i;
+
+		prop = fdt_get_property(dt_fdt(), node,
+					"rtas-size", &len);
+		if (!prop) {
+			printf("%s: /rtas/rtas-size: %s\n",
+					__func__, fdt_strerror(len));
+			abort();
+		}
+		data = (u32 *)prop->data;
+		size = (int)fdt32_to_cpu(*data);
+
+		for (i = 0; i < size; ++i, ++insn)
+			if (*insn == SC1)
+				*insn = SC1_REPLACEMENT;
+	}
+
+#if defined(__powerpc64__)
+	rtas_entry_funcptr.ptr = entry;
+	enter_rtas = (rtas_entry_t)&rtas_entry_funcptr;
+#else
+	enter_rtas = (rtas_entry_t)entry;
+#endif
+}
+
+int rtas_token(const char *service)
+{
+	const struct fdt_property *prop;
+	u32 *token;
+
+	prop = fdt_get_property(dt_fdt(), rtas_node(), service, NULL);
+	if (prop) {
+		token = (u32 *)prop->data;
+		return fdt32_to_cpu(*token);
+	}
+	return RTAS_UNKNOWN_SERVICE;
+}
+
+int rtas_call(int token, int nargs, int nret, int *outputs, ...)
+{
+	va_list list;
+	int ret, i;
+
+	spin_lock(&lock);
+
+	rtas_args.token = cpu_to_be32(token);
+	rtas_args.nargs = cpu_to_be32(nargs);
+	rtas_args.nret = cpu_to_be32(nret);
+	rtas_args.rets = &rtas_args.args[nargs];
+
+	va_start(list, outputs);
+	for (i = 0; i < nargs; ++i)
+		rtas_args.args[i] = cpu_to_be32(va_arg(list, u32));
+	va_end(list);
+
+	for (i = 0; i < nret; ++i)
+		rtas_args.rets[i] = 0;
+
+	enter_rtas(__pa(&rtas_args));
+
+	if (nret > 1 && outputs != NULL)
+		for (i = 0; i < nret - 1; ++i)
+			outputs[i] = be32_to_cpu(rtas_args.rets[i + 1]);
+
+	ret = nret > 0 ? be32_to_cpu(rtas_args.rets[0]) : 0;
+
+	spin_unlock(&lock);
+	return ret;
+}
+
+void rtas_power_off(void)
+{
+	int ret = rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1);
+	printf("RTAS power-off returned %d\n", ret);
+}
diff --git a/lib/ppc64/asm/rtas.h b/lib/ppc64/asm/rtas.h
new file mode 100644
index 0000000000000..fe77f635cd860
--- /dev/null
+++ b/lib/ppc64/asm/rtas.h
@@ -0,0 +1 @@ 
+#include "../../powerpc/asm/rtas.h"
diff --git a/powerpc/Makefile.common b/powerpc/Makefile.common
index 9654bce1752eb..3a03ab6dfc3e9 100644
--- a/powerpc/Makefile.common
+++ b/powerpc/Makefile.common
@@ -33,6 +33,7 @@  cflatobjs += lib/devicetree.o
 cflatobjs += lib/powerpc/io.o
 cflatobjs += lib/powerpc/hcall.o
 cflatobjs += lib/powerpc/setup.o
+cflatobjs += lib/powerpc/rtas.o
 
 libgcc := $(shell $(CC) $(machine) --print-libgcc-file-name)
 start_addr := $(shell printf "%x\n" $$(( $(phys_base) + $(kernel_offset) )))