Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Jul 2020 11:32:45 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r363647 - head/sys/arm/broadcom/bcm2835
Message-ID:  <202007281132.06SBWjBH060188@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Tue Jul 28 11:32:45 2020
New Revision: 363647
URL: https://svnweb.freebsd.org/changeset/base/363647

Log:
  Add a workaround for a bug when setting the Raspberry GIO config and state
  
  The Raspberry Pi GPIO config and state messages incorrectly return with
  the tag length set to 0. We then check this value to have the response
  flag set. Work around this by setting the response flag when setting the
  GPIO config or state and this value is zero.
  
  Sponsored by:	Innovate UK

Modified:
  head/sys/arm/broadcom/bcm2835/bcm2835_mbox.c

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_mbox.c	Tue Jul 28 11:23:37 2020	(r363646)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_mbox.c	Tue Jul 28 11:32:45 2020	(r363647)
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
 
+#include <arm/broadcom/bcm2835/bcm2835_firmware.h>
 #include <arm/broadcom/bcm2835/bcm2835_mbox.h>
 #include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
 #include <arm/broadcom/bcm2835/bcm2835_vcbus.h>
@@ -362,6 +363,16 @@ bcm2835_mbox_err(device_t dev, bus_addr_t msg_phys, ui
 	tag = (struct bcm2835_mbox_tag_hdr *)(msg + 1);
 	last = (uint8_t *)msg + len;
 	for (idx = 0; tag->tag != 0; idx++) {
+		/*
+		 * When setting the GPIO config or state the firmware doesn't
+		 * set tag->val_len correctly.
+		 */
+		if ((tag->tag == BCM2835_FIRMWARE_TAG_SET_GPIO_CONFIG ||
+		     tag->tag == BCM2835_FIRMWARE_TAG_SET_GPIO_STATE) &&
+		    tag->val_len == 0) {
+			tag->val_len = BCM2835_MBOX_TAG_VAL_LEN_RESPONSE |
+			    tag->val_buf_size;
+		}
 		if ((tag->val_len & BCM2835_MBOX_TAG_VAL_LEN_RESPONSE) == 0) {
 			device_printf(dev, "tag %d response error\n", idx);
 			return (EIO);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007281132.06SBWjBH060188>