All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] ARM: rpi_b: query internal MAC address from firmware
@ 2014-09-24  3:45 Stephen Warren
  2014-09-24 19:27 ` [U-Boot] " Jeroen Hofstee
  0 siblings, 1 reply; 6+ messages in thread
From: Stephen Warren @ 2014-09-24  3:45 UTC (permalink / raw)
  To: u-boot

The built-in SMSC 95xx chip doesn't know its own MAC address. Instead,
we must query it from the VC firmware; it's probably encoded in fuses
on the BCM2835.

Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
---
This depends on "usb: dwc2: Add driver for Synopsis DWC2 USB IP block
from Marek Vasut".

 arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
 board/raspberrypi/rpi_b/rpi_b.c          | 26 ++++++++++++++++++++++++++
 include/configs/rpi_b.h                  |  1 +
 3 files changed, 41 insertions(+)

diff --git a/arch/arm/include/asm/arch-bcm2835/mbox.h b/arch/arm/include/asm/arch-bcm2835/mbox.h
index dded857..61f427d 100644
--- a/arch/arm/include/asm/arch-bcm2835/mbox.h
+++ b/arch/arm/include/asm/arch-bcm2835/mbox.h
@@ -119,6 +119,20 @@ struct bcm2835_mbox_tag_hdr {
  * };
  */
 
+#define BCM2835_MBOX_TAG_GET_MAC_ADDRESS	0x00010003
+
+struct bcm2835_mbox_tag_get_mac_address {
+	struct bcm2835_mbox_tag_hdr tag_hdr;
+	union {
+		struct {
+		} req;
+		struct {
+			u8 mac[6];
+			u8 pad[2];
+		} resp;
+	} body;
+};
+
 #define BCM2835_MBOX_TAG_GET_ARM_MEMORY		0x00010005
 
 struct bcm2835_mbox_tag_get_arm_mem {
diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c
index 220bb90..c80a934 100644
--- a/board/raspberrypi/rpi_b/rpi_b.c
+++ b/board/raspberrypi/rpi_b/rpi_b.c
@@ -31,6 +31,12 @@ struct msg_get_arm_mem {
 	u32 end_tag;
 };
 
+struct msg_get_mac_address {
+	struct bcm2835_mbox_hdr hdr;
+	struct bcm2835_mbox_tag_get_mac_address get_mac_address;
+	u32 end_tag;
+};
+
 struct msg_set_power_state {
 	struct bcm2835_mbox_hdr hdr;
 	struct bcm2835_mbox_tag_set_power_state set_power_state;
@@ -62,6 +68,26 @@ int dram_init(void)
 	return 0;
 }
 
+int misc_init_r(void)
+{
+	ALLOC_ALIGN_BUFFER(struct msg_get_mac_address, msg, 1, 16);
+	int ret;
+
+	BCM2835_MBOX_INIT_HDR(msg);
+	BCM2835_MBOX_INIT_TAG(&msg->get_mac_address, GET_MAC_ADDRESS);
+
+	ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
+	if (ret) {
+		printf("bcm2835: Could not query MAC address\n");
+		/* Ignore error; not critical */
+		return 0;
+	}
+
+	eth_setenv_enetaddr("usbethaddr", msg->get_mac_address.body.resp.mac);
+
+	return 0;
+}
+
 static int power_on_module(u32 module)
 {
 	ALLOC_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1, 16);
diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h
index 9a53232..3c3ba9a 100644
--- a/include/configs/rpi_b.h
+++ b/include/configs/rpi_b.h
@@ -182,6 +182,7 @@
 #define CONFIG_USB_STORAGE
 #define CONFIG_USB_HOST_ETHER
 #define CONFIG_USB_ETHER_SMSC95XX
+#define CONFIG_MISC_INIT_R
 #endif
 
 #endif
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [U-Boot] ARM: rpi_b: query internal MAC address from firmware
  2014-09-24  3:45 [U-Boot] [PATCH] ARM: rpi_b: query internal MAC address from firmware Stephen Warren
@ 2014-09-24 19:27 ` Jeroen Hofstee
  2014-09-24 19:44   ` Stephen Warren
  0 siblings, 1 reply; 6+ messages in thread
From: Jeroen Hofstee @ 2014-09-24 19:27 UTC (permalink / raw)
  To: u-boot

Hello Stephan,

On 24-09-14 05:45, Stephen Warren wrote:
> The built-in SMSC 95xx chip doesn't know its own MAC address. Instead,
> we must query it from the VC firmware; it's probably encoded in fuses
> on the BCM2835.
>
> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
> ---
> This depends on "usb: dwc2: Add driver for Synopsis DWC2 USB IP block
> from Marek Vasut".
>
>   arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
>   board/raspberrypi/rpi_b/rpi_b.c          | 26 ++++++++++++++++++++++++++
>   include/configs/rpi_b.h                  |  1 +
>   3 files changed, 41 insertions(+)
>
[snip]
>   
> +int misc_init_r(void)
> +{
> +	ALLOC_ALIGN_BUFFER(struct msg_get_mac_address, msg, 1, 16);
> +	int ret;
> +
> +	BCM2835_MBOX_INIT_HDR(msg);
> +	BCM2835_MBOX_INIT_TAG(&msg->get_mac_address, GET_MAC_ADDRESS);
> +
> +	ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
> +	if (ret) {
> +		printf("bcm2835: Could not query MAC address\n");
> +		/* Ignore error; not critical */
> +		return 0;
> +	}
> +
> +	eth_setenv_enetaddr("usbethaddr", msg->get_mac_address.body.resp.mac);
> +
> +	return 0;
> +}
> +

Normally this should be within a check for if (!getenv("usbethaddr")).
Any reason to deviate from that?

Regards,
Jeroen

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] ARM: rpi_b: query internal MAC address from firmware
  2014-09-24 19:27 ` [U-Boot] " Jeroen Hofstee
@ 2014-09-24 19:44   ` Stephen Warren
  2014-09-24 19:45     ` Marek Vasut
  2014-09-25  2:25     ` Stephen Warren
  0 siblings, 2 replies; 6+ messages in thread
From: Stephen Warren @ 2014-09-24 19:44 UTC (permalink / raw)
  To: u-boot

On 09/24/2014 01:27 PM, Jeroen Hofstee wrote:
> Hello Stephan,
>
> On 24-09-14 05:45, Stephen Warren wrote:
>> The built-in SMSC 95xx chip doesn't know its own MAC address. Instead,
>> we must query it from the VC firmware; it's probably encoded in fuses
>> on the BCM2835.
>>
>> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
>> ---
>> This depends on "usb: dwc2: Add driver for Synopsis DWC2 USB IP block
>> from Marek Vasut".
>>
>>   arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
>>   board/raspberrypi/rpi_b/rpi_b.c          | 26
>> ++++++++++++++++++++++++++
>>   include/configs/rpi_b.h                  |  1 +
>>   3 files changed, 41 insertions(+)
>>
> [snip]
>> +int misc_init_r(void)
>> +{
>> +    ALLOC_ALIGN_BUFFER(struct msg_get_mac_address, msg, 1, 16);
>> +    int ret;
>> +
>> +    BCM2835_MBOX_INIT_HDR(msg);
>> +    BCM2835_MBOX_INIT_TAG(&msg->get_mac_address, GET_MAC_ADDRESS);
>> +
>> +    ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
>> +    if (ret) {
>> +        printf("bcm2835: Could not query MAC address\n");
>> +        /* Ignore error; not critical */
>> +        return 0;
>> +    }
>> +
>> +    eth_setenv_enetaddr("usbethaddr",
>> msg->get_mac_address.body.resp.mac);
>> +
>> +    return 0;
>> +}
>> +
>
> Normally this should be within a check for if (!getenv("usbethaddr")).
> Any reason to deviate from that?

That makes sense. I simply wasn't aware of the convention. I'll amend 
the patch.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] ARM: rpi_b: query internal MAC address from firmware
  2014-09-24 19:44   ` Stephen Warren
@ 2014-09-24 19:45     ` Marek Vasut
  2014-09-25  2:25     ` Stephen Warren
  1 sibling, 0 replies; 6+ messages in thread
From: Marek Vasut @ 2014-09-24 19:45 UTC (permalink / raw)
  To: u-boot

On Wednesday, September 24, 2014 at 09:44:40 PM, Stephen Warren wrote:
> On 09/24/2014 01:27 PM, Jeroen Hofstee wrote:
> > Hello Stephan,
> > 
> > On 24-09-14 05:45, Stephen Warren wrote:
> >> The built-in SMSC 95xx chip doesn't know its own MAC address. Instead,
> >> we must query it from the VC firmware; it's probably encoded in fuses
> >> on the BCM2835.
> >> 
> >> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
> >> ---
> >> This depends on "usb: dwc2: Add driver for Synopsis DWC2 USB IP block
> >> from Marek Vasut".
> >> 
> >>   arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
> >>   board/raspberrypi/rpi_b/rpi_b.c          | 26
> >> 
> >> ++++++++++++++++++++++++++
> >> 
> >>   include/configs/rpi_b.h                  |  1 +
> >>   3 files changed, 41 insertions(+)
> > 
> > [snip]
> > 
> >> +int misc_init_r(void)
> >> +{
> >> +    ALLOC_ALIGN_BUFFER(struct msg_get_mac_address, msg, 1, 16);
> >> +    int ret;
> >> +
> >> +    BCM2835_MBOX_INIT_HDR(msg);
> >> +    BCM2835_MBOX_INIT_TAG(&msg->get_mac_address, GET_MAC_ADDRESS);
> >> +
> >> +    ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
> >> +    if (ret) {
> >> +        printf("bcm2835: Could not query MAC address\n");
> >> +        /* Ignore error; not critical */
> >> +        return 0;
> >> +    }
> >> +
> >> +    eth_setenv_enetaddr("usbethaddr",
> >> msg->get_mac_address.body.resp.mac);
> >> +
> >> +    return 0;
> >> +}
> >> +
> > 
> > Normally this should be within a check for if (!getenv("usbethaddr")).
> > Any reason to deviate from that?
> 
> That makes sense. I simply wasn't aware of the convention. I'll amend
> the patch.

OK, waiting for V2

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] ARM: rpi_b: query internal MAC address from firmware
  2014-09-24 19:44   ` Stephen Warren
  2014-09-24 19:45     ` Marek Vasut
@ 2014-09-25  2:25     ` Stephen Warren
  2014-09-25  8:06       ` Marek Vasut
  1 sibling, 1 reply; 6+ messages in thread
From: Stephen Warren @ 2014-09-25  2:25 UTC (permalink / raw)
  To: u-boot

On 09/24/2014 01:44 PM, Stephen Warren wrote:
> On 09/24/2014 01:27 PM, Jeroen Hofstee wrote:
>> Hello Stephan,
>>
>> On 24-09-14 05:45, Stephen Warren wrote:
>>> The built-in SMSC 95xx chip doesn't know its own MAC address. Instead,
>>> we must query it from the VC firmware; it's probably encoded in fuses
>>> on the BCM2835.
>>>
>>> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
>>> ---
>>> This depends on "usb: dwc2: Add driver for Synopsis DWC2 USB IP block
>>> from Marek Vasut".
>>>
>>>   arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
>>>   board/raspberrypi/rpi_b/rpi_b.c          | 26
>>> ++++++++++++++++++++++++++
>>>   include/configs/rpi_b.h                  |  1 +
>>>   3 files changed, 41 insertions(+)
>>>
>> [snip]
>>> +int misc_init_r(void)
>>> +{
>>> +    ALLOC_ALIGN_BUFFER(struct msg_get_mac_address, msg, 1, 16);
>>> +    int ret;
>>> +
>>> +    BCM2835_MBOX_INIT_HDR(msg);
>>> +    BCM2835_MBOX_INIT_TAG(&msg->get_mac_address, GET_MAC_ADDRESS);
>>> +
>>> +    ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
>>> +    if (ret) {
>>> +        printf("bcm2835: Could not query MAC address\n");
>>> +        /* Ignore error; not critical */
>>> +        return 0;
>>> +    }
>>> +
>>> +    eth_setenv_enetaddr("usbethaddr",
>>> msg->get_mac_address.body.resp.mac);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>
>> Normally this should be within a check for if (!getenv("usbethaddr")).
>> Any reason to deviate from that?
> 
> That makes sense. I simply wasn't aware of the convention. I'll amend
> the patch.

Oh, actually...

When this code runs, there's no way that usbethaddr can already be set.
There's no usbethaddr value set in the default environment, there is no
persistent environment storage on this board so the default environment
is always used, and misc_init_r() happens well before any kind script
that the user might modify (such as uEnv.txt or boot.scr) can run. If
the user wants to override usbethaddr, they can just set a new value in
uEnv.txt.

Does it still make sense to add this guard anyway, or does this justify
the existing version of the patch?

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] ARM: rpi_b: query internal MAC address from firmware
  2014-09-25  2:25     ` Stephen Warren
@ 2014-09-25  8:06       ` Marek Vasut
  0 siblings, 0 replies; 6+ messages in thread
From: Marek Vasut @ 2014-09-25  8:06 UTC (permalink / raw)
  To: u-boot

On Thursday, September 25, 2014 at 04:25:37 AM, Stephen Warren wrote:
[...]
> >> Normally this should be within a check for if (!getenv("usbethaddr")).
> >> Any reason to deviate from that?
> > 
> > That makes sense. I simply wasn't aware of the convention. I'll amend
> > the patch.
> 
> Oh, actually...
> 
> When this code runs, there's no way that usbethaddr can already be set.
> There's no usbethaddr value set in the default environment

Unless you place it there because you know what you're doing ...

> , there is no
> persistent environment storage on this board

There is SD/MMC slot, that's enough to implement persistent storage.

> so the default environment
> is always used, and misc_init_r() happens well before any kind script
> that the user might modify (such as uEnv.txt or boot.scr) can run. If
> the user wants to override usbethaddr, they can just set a new value in
> uEnv.txt.
> 
> Does it still make sense to add this guard anyway, or does this justify
> the existing version of the patch?

I'd guard it to be future proof.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-09-25  8:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-24  3:45 [U-Boot] [PATCH] ARM: rpi_b: query internal MAC address from firmware Stephen Warren
2014-09-24 19:27 ` [U-Boot] " Jeroen Hofstee
2014-09-24 19:44   ` Stephen Warren
2014-09-24 19:45     ` Marek Vasut
2014-09-25  2:25     ` Stephen Warren
2014-09-25  8:06       ` Marek Vasut

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.