diff mbox

[U-Boot,V2,1/2] ARM: rpi_b: query internal MAC address from firmware

Message ID 1411786300-22149-1-git-send-email-swarren@wwwdotorg.org
State Accepted
Delegated to: Albert ARIBAUD
Headers show

Commit Message

Stephen Warren Sept. 27, 2014, 2:51 a.m. UTC
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>
---
v2: Don't set usbethaddr if it's already set
---
 arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
 board/raspberrypi/rpi_b/rpi_b.c          | 29 +++++++++++++++++++++++++++++
 include/configs/rpi_b.h                  |  1 +
 3 files changed, 44 insertions(+)

Comments

Marek Vasut Sept. 27, 2014, 7:43 p.m. UTC | #1
On Saturday, September 27, 2014 at 04:51:39 AM, 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>
> ---
> v2: Don't set usbethaddr if it's already set
> ---
>  arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
>  board/raspberrypi/rpi_b/rpi_b.c          | 29
> +++++++++++++++++++++++++++++ include/configs/rpi_b.h                  | 
> 1 +
>  3 files changed, 44 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;

Well, can't this be a simple u32 here ?

[...]

Who will pick this series , shall I pick it ?

Best regards,
Marek Vasut
Stephen Warren Sept. 30, 2014, 4:21 a.m. UTC | #2
On 09/27/2014 01:43 PM, Marek Vasut wrote:
> On Saturday, September 27, 2014 at 04:51:39 AM, 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>
>> ---
>> v2: Don't set usbethaddr if it's already set
>> ---
>>  arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
>>  board/raspberrypi/rpi_b/rpi_b.c          | 29
>> +++++++++++++++++++++++++++++ include/configs/rpi_b.h                  | 
>> 1 +
>>  3 files changed, 44 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;
> 
> Well, can't this be a simple u32 here ?

If you ignore the fact the message format really is 6 individual bytes,
sure:-P.

> [...]
> 
> Who will pick this series , shall I pick it ?

That sounds reasonable to me; they depend on your patches. I suppose
Albert might want to ack that.
Marek Vasut Sept. 30, 2014, 12:49 p.m. UTC | #3
On Tuesday, September 30, 2014 at 06:21:46 AM, Stephen Warren wrote:
> On 09/27/2014 01:43 PM, Marek Vasut wrote:
> > On Saturday, September 27, 2014 at 04:51:39 AM, 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>
> >> ---
> >> v2: Don't set usbethaddr if it's already set
> >> ---
> >> 
> >>  arch/arm/include/asm/arch-bcm2835/mbox.h | 14 ++++++++++++++
> >>  board/raspberrypi/rpi_b/rpi_b.c          | 29
> >> 
> >> +++++++++++++++++++++++++++++ include/configs/rpi_b.h                  |
> >> 1 +
> >> 
> >>  3 files changed, 44 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;
> > 
> > Well, can't this be a simple u32 here ?
> 
> If you ignore the fact the message format really is 6 individual bytes,
> sure:-P.

Aw, u64 then. Anyway, it's not critical, it's just that the code looks a bit 
iffy, that's all.

> > [...]
> > 
> > Who will pick this series , shall I pick it ?
> 
> That sounds reasonable to me; they depend on your patches. I suppose
> Albert might want to ack that.

OK, I placed it into u-boot-usb/topic/dwc2-20140930 for now.

Best regards,
Marek Vasut
diff mbox

Patch

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..a92c1ec 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,29 @@  int dram_init(void)
 	return 0;
 }
 
+int misc_init_r(void)
+{
+	ALLOC_ALIGN_BUFFER(struct msg_get_mac_address, msg, 1, 16);
+	int ret;
+
+	if (getenv("usbethaddr"))
+		return 0;
+
+	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