summaryrefslogtreecommitdiff
path: root/common/ccd_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/ccd_config.c')
-rw-r--r--common/ccd_config.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/common/ccd_config.c b/common/ccd_config.c
index 12885926dd..01d8c8ae6f 100644
--- a/common/ccd_config.c
+++ b/common/ccd_config.c
@@ -1367,6 +1367,67 @@ static enum vendor_cmd_rc ccd_password(void *buf,
return VENDOR_RC_SUCCESS;
}
+static enum vendor_cmd_rc ccd_pp_poll(void *buf,
+ size_t input_size,
+ size_t *response_size)
+{
+ char *buffer = buf;
+
+ if ((ccd_state == CCD_STATE_OPENED) ||
+ (ccd_state == CCD_STATE_UNLOCKED)) {
+ buffer[0] = CCD_PP_DONE;
+ } else {
+ switch (physical_presense_fsm_state()) {
+ case PP_AWAITING_PRESS:
+ buffer[0] = CCD_PP_AWAITING_PRESS;
+ break;
+ case PP_BETWEEN_PRESSES:
+ buffer[0] = CCD_PP_BETWEEN_PRESSES;
+ break;
+ default:
+ buffer[0] = CCD_PP_CLOSED;
+ break;
+ }
+ }
+ *response_size = 1;
+ return VENDOR_RC_SUCCESS;
+}
+
+static enum vendor_cmd_rc ccd_pp_poll_unlock(void *buf,
+ size_t input_size,
+ size_t *response_size)
+{
+ char *buffer;
+
+ if ((ccd_state != CCD_STATE_OPENED) &&
+ (ccd_state != CCD_STATE_UNLOCKED))
+ return ccd_pp_poll(buf, input_size, response_size);
+
+
+ buffer = buf;
+ *response_size = 1;
+ buffer[0] = CCD_PP_DONE;
+
+ return VENDOR_RC_SUCCESS;
+}
+
+static enum vendor_cmd_rc ccd_pp_poll_open(void *buf,
+ size_t input_size,
+ size_t *response_size)
+{
+ char *buffer;
+
+ if (ccd_state != CCD_STATE_OPENED)
+ return ccd_pp_poll(buf, input_size, response_size);
+
+
+ buffer = buf;
+ *response_size = 1;
+ buffer[0] = CCD_PP_DONE;
+
+ return VENDOR_RC_SUCCESS;
+}
+
/*
* Common TPM Vendor command handler used to demultiplex various CCD commands
* which need to be available both throuh CLI and over /dev/tpm0.
@@ -1405,6 +1466,14 @@ static enum vendor_cmd_rc ccd_vendor(enum vendor_cmd_cc code,
handler = ccd_lock;
break;
+ case CCDV_PP_POLL_UNLOCK:
+ handler = ccd_pp_poll_unlock;
+ break;
+
+ case CCDV_PP_POLL_OPEN:
+ handler = ccd_pp_poll_open;
+ break;
+
default:
CPRINTS("%s:%d - unknown subcommand\n", __func__, __LINE__);
break;