]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cros_ec: Correct collection of EC hash
authorSimon Glass <sjg@chromium.org>
Mon, 9 Nov 2020 14:14:43 +0000 (07:14 -0700)
committerSimon Glass <sjg@chromium.org>
Sat, 14 Nov 2020 22:23:41 +0000 (15:23 -0700)
The EC now requires that the offset field be set correctly when checking
on hash status. Update the code to handle this. Use the same message
struct in both functions to reduce stack space.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/misc/cros_ec.c

index c3674908ee82c1bbfe892794d8cfba4439573a1b..1b22f1883eeca9ad73f4df16d3e9c4af9cff7e48 100644 (file)
@@ -495,18 +495,18 @@ int cros_ec_read_current_image(struct udevice *dev,
 }
 
 static int cros_ec_wait_on_hash_done(struct udevice *dev,
+                                    struct ec_params_vboot_hash *p,
                                     struct ec_response_vboot_hash *hash)
 {
-       struct ec_params_vboot_hash p;
        ulong start;
 
        start = get_timer(0);
        while (hash->status == EC_VBOOT_HASH_STATUS_BUSY) {
                mdelay(50);     /* Insert some reasonable delay */
 
-               p.cmd = EC_VBOOT_HASH_GET;
-               if (ec_command(dev, EC_CMD_VBOOT_HASH, 0, &p, sizeof(p),
-                      hash, sizeof(*hash)) < 0)
+               p->cmd = EC_VBOOT_HASH_GET;
+               if (ec_command(dev, EC_CMD_VBOOT_HASH, 0, p, sizeof(*p), hash,
+                              sizeof(*hash)) < 0)
                        return -1;
 
                if (get_timer(start) > CROS_EC_CMD_HASH_TIMEOUT_MS) {
@@ -530,7 +530,7 @@ int cros_ec_read_hash(struct udevice *dev, uint hash_offset,
                return -1;
 
        /* If the EC is busy calculating the hash, fidget until it's done. */
-       rv = cros_ec_wait_on_hash_done(dev, hash);
+       rv = cros_ec_wait_on_hash_done(dev, &p, hash);
        if (rv)
                return rv;
 
@@ -553,9 +553,13 @@ int cros_ec_read_hash(struct udevice *dev, uint hash_offset,
                       hash, sizeof(*hash)) < 0)
                return -1;
 
-       rv = cros_ec_wait_on_hash_done(dev, hash);
+       rv = cros_ec_wait_on_hash_done(dev, &p, hash);
        if (rv)
                return rv;
+       if (hash->status != EC_VBOOT_HASH_STATUS_DONE) {
+               log_err("Hash did not complete, status=%d\n", hash->status);
+               return -EIO;
+       }
 
        debug("%s: hash done\n", __func__);