Commit 3563ff88 authored by Eli Sennesh's avatar Eli Sennesh Committed by Greg Kroah-Hartman

greybus: firmware and svc: detect the difference between ES2 and ES3 chips

The Greybus SVC code needs to read and clear the module boot status upon
hotplug; this requires reading two different attributes depending on whether
we're running on ES2 or ES3.  On Marti Bolivar's (mbolivar@leaflabs.com)
advice, we detect ES2 using the unique ES2_DDBL1_MFR_ID and ES2_DDBL1_PROD_ID
for ES2 hardware, and treat all other chips as ES3 appropriately.  This patch
detects the difference and adds the appropriate definitions for ES3 hardware.
Signed-off-by: default avatarEli Sennesh <esennesh@leaflabs.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 0e9403a0
...@@ -11,9 +11,6 @@ ...@@ -11,9 +11,6 @@
#include "greybus.h" #include "greybus.h"
#define ES2_DDBL1_MFR_ID 0x00000126
#define ES2_DDBL1_PROD_ID 0x00001000
struct gb_firmware { struct gb_firmware {
struct gb_connection *connection; struct gb_connection *connection;
const struct firmware *fw; const struct firmware *fw;
......
...@@ -160,6 +160,10 @@ struct gb_control_disconnected_request { ...@@ -160,6 +160,10 @@ struct gb_control_disconnected_request {
#define GB_FIRMWARE_TYPE_AP_READY 0x05 /* Request with no-payload */ #define GB_FIRMWARE_TYPE_AP_READY 0x05 /* Request with no-payload */
#define GB_FIRMWARE_TYPE_GET_VID_PID 0x06 /* Request with no-payload */ #define GB_FIRMWARE_TYPE_GET_VID_PID 0x06 /* Request with no-payload */
/* FIXME: remove all ES2-specific identifiers from the kernel */
#define ES2_DDBL1_MFR_ID 0x00000126
#define ES2_DDBL1_PROD_ID 0x00001000
/* Greybus firmware boot stages */ /* Greybus firmware boot stages */
#define GB_FIRMWARE_BOOT_STAGE_ONE 0x01 /* Reserved for the boot ROM */ #define GB_FIRMWARE_BOOT_STAGE_ONE 0x01 /* Reserved for the boot ROM */
#define GB_FIRMWARE_BOOT_STAGE_TWO 0x02 /* Firmware package to be loaded by the boot ROM */ #define GB_FIRMWARE_BOOT_STAGE_TWO 0x02 /* Firmware package to be loaded by the boot ROM */
...@@ -823,14 +827,16 @@ struct gb_svc_link_config_request { ...@@ -823,14 +827,16 @@ struct gb_svc_link_config_request {
/* Attributes for peer get/set operations */ /* Attributes for peer get/set operations */
#define DME_ATTR_SELECTOR_INDEX 0 #define DME_ATTR_SELECTOR_INDEX 0
/* FIXME: remove ES2 support and DME_ATTR_T_TST_SRC_INCREMENT */
#define DME_ATTR_T_TST_SRC_INCREMENT 0x4083 #define DME_ATTR_T_TST_SRC_INCREMENT 0x4083
#define DME_ATTR_ES3_INIT_STATUS 0x6101
/* Return value from TST_SRC_INCREMENT */
#define DME_TSI_SPI_BOOT_STARTED 0x02 /* Return value from init-status attributes listed above */
#define DME_TSI_TRUSTED_SPI_BOOT_FINISHED 0x03 #define DME_DIS_SPI_BOOT_STARTED 0x02
#define DME_TSI_UNTRUSTED_SPI_BOOT_FINISHED 0x04 #define DME_DIS_TRUSTED_SPI_BOOT_FINISHED 0x03
#define DME_TSI_UNIPRO_BOOT_STARTED 0x06 #define DME_DIS_UNTRUSTED_SPI_BOOT_FINISHED 0x04
#define DME_TSI_FALLBACK_UNIPRO_BOOT_STARTED 0x09 #define DME_DIS_UNIPRO_BOOT_STARTED 0x06
#define DME_DIS_FALLBACK_UNIPRO_BOOT_STARTED 0x09
struct gb_svc_route_create_request { struct gb_svc_route_create_request {
__u8 intf1_id; __u8 intf1_id;
......
...@@ -139,8 +139,8 @@ EXPORT_SYMBOL_GPL(gb_svc_dme_peer_set); ...@@ -139,8 +139,8 @@ EXPORT_SYMBOL_GPL(gb_svc_dme_peer_set);
/* /*
* T_TstSrcIncrement is written by the module on ES2 as a stand-in for boot * T_TstSrcIncrement is written by the module on ES2 as a stand-in for boot
* status attribute. AP needs to read and clear it, after reading a non-zero * status attribute ES3_INIT_STATUS. AP needs to read and clear it, after
* value from it. * reading a non-zero value from it.
* *
* FIXME: This is module-hardware dependent and needs to be extended for every * FIXME: This is module-hardware dependent and needs to be extended for every
* type of module we want to support. * type of module we want to support.
...@@ -150,10 +150,22 @@ static int gb_svc_read_and_clear_module_boot_status(struct gb_interface *intf) ...@@ -150,10 +150,22 @@ static int gb_svc_read_and_clear_module_boot_status(struct gb_interface *intf)
struct gb_host_device *hd = intf->hd; struct gb_host_device *hd = intf->hd;
int ret; int ret;
u32 value; u32 value;
u16 attr;
u8 init_status;
/* Read and clear boot status in T_TstSrcIncrement */ /*
ret = gb_svc_dme_peer_get(hd->svc, intf->interface_id, * Check if the module is ES2 or ES3, and choose attr number
DME_ATTR_T_TST_SRC_INCREMENT, * appropriately.
* FIXME: Remove ES2 support from the kernel entirely.
*/
if (intf->ddbl1_manufacturer_id == ES2_DDBL1_MFR_ID &&
intf->ddbl1_product_id == ES2_DDBL1_PROD_ID)
attr = DME_ATTR_T_TST_SRC_INCREMENT;
else
attr = DME_ATTR_ES3_INIT_STATUS;
/* Read and clear boot status in ES3_INIT_STATUS */
ret = gb_svc_dme_peer_get(hd->svc, intf->interface_id, attr,
DME_ATTR_SELECTOR_INDEX, &value); DME_ATTR_SELECTOR_INDEX, &value);
if (ret) if (ret)
...@@ -169,19 +181,22 @@ static int gb_svc_read_and_clear_module_boot_status(struct gb_interface *intf) ...@@ -169,19 +181,22 @@ static int gb_svc_read_and_clear_module_boot_status(struct gb_interface *intf)
} }
/* /*
* Check if the module needs to boot from unipro. * Check if the module needs to boot from UniPro.
* For ES2: We need to check lowest 8 bits of 'value'. * For ES2: We need to check lowest 8 bits of 'value'.
* For ES3: We need to check highest 8 bits out of 32 of 'value'. * For ES3: We need to check highest 8 bits out of 32 of 'value'.
* * FIXME: Remove ES2 support from the kernel entirely.
* FIXME: Add code to find if we are on ES2 or ES3 to have separate
* checks.
*/ */
if (value == DME_TSI_UNIPRO_BOOT_STARTED || if (intf->ddbl1_manufacturer_id == ES2_DDBL1_MFR_ID &&
value == DME_TSI_FALLBACK_UNIPRO_BOOT_STARTED) intf->ddbl1_product_id == ES2_DDBL1_PROD_ID)
init_status = value;
else
init_status = value >> 24;
if (init_status == DME_DIS_UNIPRO_BOOT_STARTED ||
init_status == DME_DIS_FALLBACK_UNIPRO_BOOT_STARTED)
intf->boot_over_unipro = true; intf->boot_over_unipro = true;
return gb_svc_dme_peer_set(hd->svc, intf->interface_id, return gb_svc_dme_peer_set(hd->svc, intf->interface_id, attr,
DME_ATTR_T_TST_SRC_INCREMENT,
DME_ATTR_SELECTOR_INDEX, 0); DME_ATTR_SELECTOR_INDEX, 0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment