diff mbox

[RFC] sparc: fake idprom for leon

Message ID 20110102194024.GA31924@merkur.ravnborg.org
State RFC
Delegated to: David Miller
Headers show

Commit Message

Sam Ravnborg Jan. 2, 2011, 7:40 p.m. UTC
Hi Kristoffer & David.

Following is a very naive implementation of
a fake idprom for leon.

This is only for inspiration as I hope
that it is possible to find the MAC address
somehow so we present it correct.

One advantage of using a fake idprom is that all places
that do access idprom no longer needs to be ifdeffed out.
Today floppy.h reads idprom unconditionally.

	Sam

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

Comments

Kristoffer Glembo Jan. 3, 2011, 8:55 a.m. UTC | #1
Hi Sam,

Thanks for the patch. However we are actually faking the idprom in the bootloader instead. So there is an idprom property. 

We have released a new Linux "distribution" for LEON, see this message on the leon_sparc mailing list:
http://tech.groups.yahoo.com/group/leon_sparc/message/19138

It is a work in progress but it is probably of interest to you. It also includes new patches that has not yet been sent to this mailing list but will be soon.

How the get the MAC address is quite implementation dependent though. Our GRETH ethernet driver supports getting it from idprom, OF tree or as a module parameter. 

Happy hacking,
Kristoffer


Sam Ravnborg wrote:
> Hi Kristoffer & David.
> 
> Following is a very naive implementation of
> a fake idprom for leon.
> 
> This is only for inspiration as I hope
> that it is possible to find the MAC address
> somehow so we present it correct.
> 
> One advantage of using a fake idprom is that all places
> that do access idprom no longer needs to be ifdeffed out.
> Today floppy.h reads idprom unconditionally.
> 
> 	Sam
> 
> diff --git a/arch/sparc/prom/misc_32.c b/arch/sparc/prom/misc_32.c
> index 4d61c54..ee5fe45 100644
> --- a/arch/sparc/prom/misc_32.c
> +++ b/arch/sparc/prom/misc_32.c
> @@ -10,7 +10,9 @@
>  #include <linux/sched.h>
>  #include <linux/module.h>
>  
> +#include <asm/machines.h>
>  #include <asm/openprom.h>
> +#include <asm/idprom.h>
>  #include <asm/oplib.h>
>  #include <asm/auxio.h>
>  #include <asm/system.h>
> @@ -93,6 +95,42 @@ prom_setsync(sfunc_t funcp)
>  	*romvec->pv_synchook = funcp;
>  }
>  
> +#ifdef CONFIG_SPARC_LEON
> +/*
> + * leon do not have idprom support - so fake it.
> + * The machine type is hardcoded to M_LEON
> + * We do not know the ethernet address so it is all-zero.
> + */
> +
> +/* Calculate the IDPROM checksum (xor of the data bytes). */
> +static unsigned char calc_idprom_cksum(struct idprom *idprom)
> +{
> +        unsigned char cksum, i, *ptr = (unsigned char *)idprom;
> +
> +        for (i = cksum = 0; i <= 0x0E; i++)
> +                cksum ^= *ptr++;
> +
> +        return cksum;
> +}
> +
> +unsigned char
> +prom_get_idprom(char *idbuf, int num_bytes)
> +{
> +	struct idprom *idprom;
> +
> +	if (num_bytes < sizeof(struct idprom))
> +		return 0xff;
> +
> +	idprom = (struct idprom *)idbuf;
> +	memset(idprom, 0, sizeof(*idprom));
> +	idprom->id_format = 0x01;
> +	idprom->id_machtype = M_LEON | M_LEON3_SOC;
> +	idprom->id_cksum = calc_idprom_cksum(idprom);
> +
> +	return 0x01;
> +}
> +
> +#else
>  /* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
>   * format type.  'num_bytes' is the number of bytes that your idbuf
>   * has space for.  Returns 0xff on error.
> @@ -109,7 +147,7 @@ prom_get_idprom(char *idbuf, int num_bytes)
>  
>  	return 0xff;
>  }
> -
> +#endif
>  /* Get the major prom version number. */
>  int
>  prom_version(void)
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sam Ravnborg Jan. 3, 2011, 9:50 a.m. UTC | #2
Hi Kristoffer!
On Mon, Jan 03, 2011 at 09:55:05AM +0100, Kristoffer Glembo wrote:
> Hi Sam,
> 
> Thanks for the patch. However we are actually faking the idprom
> in the bootloader instead. So there is an idprom property. 
Much better!

> We have released a new Linux "distribution" for LEON, see this message on the leon_sparc mailing list:
> http://tech.groups.yahoo.com/group/leon_sparc/message/19138
Great stuff. I missed that mail.
I am especially glad to see that you have announced buildroot support :-)
I hope this is the right way to go.
 
> It is a work in progress but it is probably of interest to you.
> It also includes new patches that has not yet been sent to this mailing list but will be soon.
I will take a look at the stuff I know about.

Do you prefer comments cc: to sparclinux or the leon list for the general kernel stuff?
I will not cross-post as the leon list is subscribers only (IIRC).

	Sam
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kristoffer Glembo Jan. 3, 2011, 10:36 a.m. UTC | #3
Hi,


>  
>> It is a work in progress but it is probably of interest to you.
>> It also includes new patches that has not yet been sent to this mailing list but will be soon.
> I will take a look at the stuff I know about.
> 
> Do you prefer comments cc: to sparclinux or the leon list for the general kernel stuff?
> I will not cross-post as the leon list is subscribers only (IIRC).
>

For general kernel stuff use this list. Please send feedback on all non-kernel stuff to leon_sparc!

Happy new year by the way! (to all you sparclinux readers)

Best regards,
Kristoffer
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" 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/arch/sparc/prom/misc_32.c b/arch/sparc/prom/misc_32.c
index 4d61c54..ee5fe45 100644
--- a/arch/sparc/prom/misc_32.c
+++ b/arch/sparc/prom/misc_32.c
@@ -10,7 +10,9 @@ 
 #include <linux/sched.h>
 #include <linux/module.h>
 
+#include <asm/machines.h>
 #include <asm/openprom.h>
+#include <asm/idprom.h>
 #include <asm/oplib.h>
 #include <asm/auxio.h>
 #include <asm/system.h>
@@ -93,6 +95,42 @@  prom_setsync(sfunc_t funcp)
 	*romvec->pv_synchook = funcp;
 }
 
+#ifdef CONFIG_SPARC_LEON
+/*
+ * leon do not have idprom support - so fake it.
+ * The machine type is hardcoded to M_LEON
+ * We do not know the ethernet address so it is all-zero.
+ */
+
+/* Calculate the IDPROM checksum (xor of the data bytes). */
+static unsigned char calc_idprom_cksum(struct idprom *idprom)
+{
+        unsigned char cksum, i, *ptr = (unsigned char *)idprom;
+
+        for (i = cksum = 0; i <= 0x0E; i++)
+                cksum ^= *ptr++;
+
+        return cksum;
+}
+
+unsigned char
+prom_get_idprom(char *idbuf, int num_bytes)
+{
+	struct idprom *idprom;
+
+	if (num_bytes < sizeof(struct idprom))
+		return 0xff;
+
+	idprom = (struct idprom *)idbuf;
+	memset(idprom, 0, sizeof(*idprom));
+	idprom->id_format = 0x01;
+	idprom->id_machtype = M_LEON | M_LEON3_SOC;
+	idprom->id_cksum = calc_idprom_cksum(idprom);
+
+	return 0x01;
+}
+
+#else
 /* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
  * format type.  'num_bytes' is the number of bytes that your idbuf
  * has space for.  Returns 0xff on error.
@@ -109,7 +147,7 @@  prom_get_idprom(char *idbuf, int num_bytes)
 
 	return 0xff;
 }
-
+#endif
 /* Get the major prom version number. */
 int
 prom_version(void)