Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 926e6940 authored by Cédric Le Goater's avatar Cédric Le Goater Committed by Benjamin Herrenschmidt
Browse files

powerpc/boot: Add byteswapping routines in oflib



Values will need to be byte-swapped when calling prom (big endian) from
a little endian boot wrapper.

Signed-off-by: default avatarCédric Le Goater <clg@fr.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 163bed77
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -20,4 +20,7 @@ void of_console_init(void);

typedef u32			__be32;

#define cpu_to_be32(x) (x)
#define be32_to_cpu(x) (x)

#endif /* _PPC_BOOT_OF_H_ */
+4 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@

#include "of.h"

static void *of_stdout_handle;
static unsigned int of_stdout_handle;

static int of_console_open(void)
{
@@ -27,8 +27,10 @@ static int of_console_open(void)
	if (((devp = of_finddevice("/chosen")) != NULL)
	    && (of_getprop(devp, "stdout", &of_stdout_handle,
			   sizeof(of_stdout_handle))
		== sizeof(of_stdout_handle)))
		== sizeof(of_stdout_handle))) {
		of_stdout_handle = be32_to_cpu(of_stdout_handle);
		return 0;
	}

	return -1;
}
+11 −11
Original line number Diff line number Diff line
@@ -42,13 +42,13 @@ int of_call_prom(const char *service, int nargs, int nret, ...)
	struct prom_args args;
	va_list list;

	args.service = ADDR(service);
	args.nargs = nargs;
	args.nret = nret;
	args.service = cpu_to_be32(ADDR(service));
	args.nargs = cpu_to_be32(nargs);
	args.nret = cpu_to_be32(nret);

	va_start(list, nret);
	for (i = 0; i < nargs; i++)
		args.args[i] = va_arg(list, prom_arg_t);
		args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
	va_end(list);

	for (i = 0; i < nret; i++)
@@ -57,7 +57,7 @@ int of_call_prom(const char *service, int nargs, int nret, ...)
	if (prom(&args) < 0)
		return -1;

	return (nret > 0)? args.args[nargs]: 0;
	return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
}

static int of_call_prom_ret(const char *service, int nargs, int nret,
@@ -67,13 +67,13 @@ static int of_call_prom_ret(const char *service, int nargs, int nret,
	struct prom_args args;
	va_list list;

	args.service = ADDR(service);
	args.nargs = nargs;
	args.nret = nret;
	args.service = cpu_to_be32(ADDR(service));
	args.nargs = cpu_to_be32(nargs);
	args.nret = cpu_to_be32(nret);

	va_start(list, rets);
	for (i = 0; i < nargs; i++)
		args.args[i] = va_arg(list, prom_arg_t);
		args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
	va_end(list);

	for (i = 0; i < nret; i++)
@@ -84,9 +84,9 @@ static int of_call_prom_ret(const char *service, int nargs, int nret,

	if (rets != (void *) 0)
		for (i = 1; i < nret; ++i)
			rets[i-1] = args.args[nargs+i];
			rets[i-1] = be32_to_cpu(args.args[nargs+i]);

	return (nret > 0)? args.args[nargs]: 0;
	return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
}

/* returns true if s2 is a prefix of s1 */