cros_ec: Support reading EC features

The EC can support a variety of features and provides a way to find out
what is available. Add support for this.

Also update the feature list to the lastest available while we are here.
This is at:

   https://chromium.googlesource.com/chromiumos/platform/ec/+/refs/heads/master/include/ec_commands.h

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2021-01-16 14:52:26 -07:00
parent 7791df576c
commit 8aec32f6ab
6 changed files with 195 additions and 10 deletions

View File

@@ -1344,19 +1344,33 @@ int cros_ec_i2c_tunnel(struct udevice *dev, int port, struct i2c_msg *in,
return 0;
}
int cros_ec_check_feature(struct udevice *dev, int feature)
int cros_ec_get_features(struct udevice *dev, u64 *featuresp)
{
struct ec_response_get_features r;
int rv;
rv = ec_command(dev, EC_CMD_GET_FEATURES, 0, &r, sizeof(r), NULL, 0);
if (rv)
return rv;
rv = ec_command(dev, EC_CMD_GET_FEATURES, 0, NULL, 0, &r, sizeof(r));
if (rv != sizeof(r))
return -EIO;
*featuresp = r.flags[0] | (u64)r.flags[1] << 32;
return 0;
}
int cros_ec_check_feature(struct udevice *dev, uint feature)
{
struct ec_response_get_features r;
int rv;
rv = ec_command(dev, EC_CMD_GET_FEATURES, 0, NULL, 0, &r, sizeof(r));
if (rv != sizeof(r))
return -EIO;
if (feature >= 8 * sizeof(r.flags))
return -1;
return -EINVAL;
return r.flags[feature / 32] & EC_FEATURE_MASK_0(feature);
return r.flags[feature / 32] & EC_FEATURE_MASK_0(feature) ? true :
false;
}
/*

View File

@@ -480,6 +480,17 @@ static int process_cmd(struct ec_state *ec,
len = sizeof(*resp);
break;
}
case EC_CMD_GET_FEATURES: {
struct ec_response_get_features *resp = resp_data;
resp->flags[0] = EC_FEATURE_MASK_0(EC_FEATURE_FLASH) |
EC_FEATURE_MASK_0(EC_FEATURE_I2C);
resp->flags[1] =
EC_FEATURE_MASK_1(EC_FEATURE_UNIFIED_WAKE_MASKS) |
EC_FEATURE_MASK_1(EC_FEATURE_ISH);
len = sizeof(*resp);
break;
}
default:
printf(" ** Unknown EC command %#02x\n", req_hdr->command);
return -1;