\ *****************************************************************************
\ * Copyright (c) 2015-2020 IBM Corporation
\ * All rights reserved.
\ * This program and the accompanying materials
\ * are made available under the terms of the BSD License
\ * which accompanies this distribution, and is available at
\ * http://www.opensource.org/licenses/bsd-license.php
\ *
\ * Contributors:
\ *     IBM Corporation - initial implementation
\ ****************************************************************************/

." Populating " pwd cr

false VALUE vtpm-debug?
0     VALUE vtpm-unit

0     VALUE    log-base
40000 CONSTANT LOG-SIZE   \ 256k per VTPM FW spec.

e     CONSTANT VTPM_DRV_ERROR_SML_HANDED_OVER

LOG-SIZE BUFFER: log-base

\ firmware API call
: sml-get-allocated-size ( -- buffer-size)
   LOG-SIZE
;

\ firmware API call
: sml-get-handover-size ( -- size)
   tpm-get-logsize
;

\ firmware API call
: sml-handover ( dest size -- )
   log-base    ( dest size src )
   -rot        ( src dest size )
   move

   VTPM_DRV_ERROR_SML_HANDED_OVER tpm-driver-set-failure-reason
;

\ firmware API call
: get-failure-reason ( -- reason )
   tpm-driver-get-failure-reason           ( reason )
;

0 0 s" ibm,sml-efi-reformat-supported" property

\ firmware API call
: reformat-sml-to-efi-alignment ( -- success )
   true
;

: open true ;
: close ;

: vtpm-cleanup ( -- )
   vtpm-debug? IF ." VTPM: Disabling RTAS bypass" cr THEN
   tpm-finalize
   \ Disable TCE bypass
   vtpm-unit 0 rtas-set-tce-bypass
;

: vtpm-init ( -- success )
   0 0 get-node open-node ?dup 0= IF false EXIT THEN
   my-self >r
   dup to my-self

   vtpm-debug? IF ." VTPM: Initializing for c-driver" cr THEN

   my-unit to vtpm-unit

   \ Enable TCE bypass special qemu feature
   vtpm-unit 1 rtas-set-tce-bypass

   \ Have TCE bypass cleaned up
   ['] vtpm-cleanup add-quiesce-xt

   \ close temporary node
   close-node
   r> to my-self

   tpm-start ?dup 0= IF
      vtpm-debug? IF ." VTPM: Success from tpm-start" cr THEN
      true
   ELSE
      ." VTPM: Error code from tpm-start: " . cr
      false
   THEN
;

\ inititialize unit and set RTAS bypass
vtpm-init IF
   \ pass logbase and size to the C driver; we may only do this after
   \ init of the lower levels since this calls needs to know the PCR banks
   \ when setting up the log
   log-base LOG-SIZE tpm-set-log-parameters
   s" vtpm-sml.fs" included
ELSE
   ." VTPM: vtpm-init failed" cr
THEN
