Skip to content

Commit e68b96b

Browse files
hoyin0722tiensung
authored andcommitted
HSD #15010087323-2 firmware: stratix10-svc: add FCS command with SMMU support (#96)
Add new FCS commands with SMMU support. New commands calls asynchronous SMC calls to prevent timing issues when processing large plaintext files. Update stratix10_svc_send to use the virtual address as the physical address when the commands supports SMMU. Signed-off-by: Adrian Ng Ho Yin <[email protected]>
1 parent 15805f4 commit e68b96b

File tree

3 files changed

+388
-11
lines changed

3 files changed

+388
-11
lines changed

drivers/firmware/stratix10-svc.c

Lines changed: 174 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -416,10 +416,12 @@ static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data,
416416
case COMMAND_FIRMWARE_VERSION:
417417
case COMMAND_HWMON_READTEMP:
418418
case COMMAND_HWMON_READVOLT:
419+
case COMMAND_READ_SECURE_REG:
419420
cb_data->status = BIT(SVC_STATUS_OK);
420421
cb_data->kaddr1 = &res.a1;
421422
break;
422423
case COMMAND_SMC_SVC_VERSION:
424+
case COMMAND_WRITE_TO_SECURE_REG:
423425
cb_data->status = BIT(SVC_STATUS_OK);
424426
cb_data->kaddr1 = &res.a1;
425427
cb_data->kaddr2 = &res.a2;
@@ -450,16 +452,26 @@ static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data,
450452
case COMMAND_FCS_CRYPTO_GET_KEY_INFO:
451453
case COMMAND_FCS_CRYPTO_AES_CRYPT_UPDATE:
452454
case COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE:
455+
case COMMAND_FCS_CRYPTO_AES_CRYPT_UPDATE_SMMU:
456+
case COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE_SMMU:
453457
case COMMAND_FCS_CRYPTO_GET_DIGEST_UPDATE:
454458
case COMMAND_FCS_CRYPTO_GET_DIGEST_FINALIZE:
459+
case COMMAND_FCS_CRYPTO_GET_DIGEST_UPDATE_SMMU:
460+
case COMMAND_FCS_CRYPTO_GET_DIGEST_FINALIZE_SMMU:
455461
case COMMAND_FCS_CRYPTO_MAC_VERIFY_UPDATE:
456462
case COMMAND_FCS_CRYPTO_MAC_VERIFY_FINALIZE:
463+
case COMMAND_FCS_CRYPTO_MAC_VERIFY_UPDATE_SMMU:
464+
case COMMAND_FCS_CRYPTO_MAC_VERIFY_FINALIZE_SMMU:
457465
case COMMAND_FCS_CRYPTO_ECDSA_HASH_SIGNING_FINALIZE:
458466
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_UPDATE:
459467
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_FINALIZE:
468+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_UPDATE_SMMU:
469+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_FINALIZE_SMMU:
460470
case COMMAND_FCS_CRYPTO_ECDSA_HASH_VERIFY_FINALIZE:
461471
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_UPDATE:
462472
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_FINALIZE:
473+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_UPDATE_SMMU:
474+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_FINALIZE_SMMU:
463475
case COMMAND_FCS_CRYPTO_ECDSA_GET_PUBLIC_KEY_FINALIZE:
464476
case COMMAND_FCS_CRYPTO_ECDH_REQUEST_FINALIZE:
465477
case COMMAND_FCS_RANDOM_NUMBER_GEN_EXT:
@@ -763,6 +775,24 @@ static int svc_normal_to_secure_thread(void *data)
763775
a5 = (unsigned long)pdata->paddr_output;
764776
a6 = (unsigned long)pdata->size_output;
765777
break;
778+
case COMMAND_FCS_CRYPTO_AES_CRYPT_UPDATE_SMMU:
779+
a0 = INTEL_SIP_SMC_FCS_AES_CRYPTO_UPDATE;
780+
a1 = pdata->arg[0];
781+
a2 = pdata->arg[1];
782+
a3 = (unsigned long)pdata->paddr;
783+
a4 = (unsigned long)pdata->size;
784+
a5 = (unsigned long)pdata->paddr_output;
785+
a6 = (unsigned long)pdata->size_output;
786+
break;
787+
case COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE_SMMU:
788+
a0 = INTEL_SIP_SMC_FCS_AES_CRYPTO_FINALIZE;
789+
a1 = pdata->arg[0];
790+
a2 = pdata->arg[1];
791+
a3 = (unsigned long)pdata->paddr;
792+
a4 = (unsigned long)pdata->size;
793+
a5 = (unsigned long)pdata->paddr_output;
794+
a6 = (unsigned long)pdata->size_output;
795+
break;
766796
case COMMAND_FCS_CRYPTO_GET_DIGEST_INIT:
767797
a0 = INTEL_SIP_SMC_FCS_GET_DIGEST_INIT;
768798
a1 = pdata->arg[0];
@@ -789,6 +819,24 @@ static int svc_normal_to_secure_thread(void *data)
789819
a5 = (unsigned long)pdata->paddr_output;
790820
a6 = (unsigned long)pdata->size_output;
791821
break;
822+
case COMMAND_FCS_CRYPTO_GET_DIGEST_UPDATE_SMMU:
823+
a0 = INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_UPDATE;
824+
a1 = pdata->arg[0];
825+
a2 = pdata->arg[1];
826+
a3 = (unsigned long)pdata->paddr;
827+
a4 = (unsigned long)pdata->size;
828+
a5 = (unsigned long)pdata->paddr_output;
829+
a6 = (unsigned long)pdata->size_output;
830+
break;
831+
case COMMAND_FCS_CRYPTO_GET_DIGEST_FINALIZE_SMMU:
832+
a0 = INTEL_SIP_SMC_FCS_GET_DIGEST_SMMU_FINALIZE;
833+
a1 = pdata->arg[0];
834+
a2 = pdata->arg[1];
835+
a3 = (unsigned long)pdata->paddr;
836+
a4 = (unsigned long)pdata->size;
837+
a5 = (unsigned long)pdata->paddr_output;
838+
a6 = (unsigned long)pdata->size_output;
839+
break;
792840
case COMMAND_FCS_CRYPTO_MAC_VERIFY_INIT:
793841
a0 = INTEL_SIP_SMC_FCS_MAC_VERIFY_INIT;
794842
a1 = pdata->arg[0];
@@ -817,6 +865,26 @@ static int svc_normal_to_secure_thread(void *data)
817865
a6 = (unsigned long)pdata->size_output;
818866
a7 = pdata->arg[2];
819867
break;
868+
case COMMAND_FCS_CRYPTO_MAC_VERIFY_UPDATE_SMMU:
869+
a0 = INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_UPDATE;
870+
a1 = pdata->arg[0];
871+
a2 = pdata->arg[1];
872+
a3 = (unsigned long)pdata->paddr;
873+
a4 = (unsigned long)pdata->size;
874+
a5 = (unsigned long)pdata->paddr_output;
875+
a6 = (unsigned long)pdata->size_output;
876+
a7 = pdata->arg[2];
877+
break;
878+
case COMMAND_FCS_CRYPTO_MAC_VERIFY_FINALIZE_SMMU:
879+
a0 = INTEL_SIP_SMC_FCS_MAC_VERIFY_SMMU_FINALIZE;
880+
a1 = pdata->arg[0];
881+
a2 = pdata->arg[1];
882+
a3 = (unsigned long)pdata->paddr;
883+
a4 = (unsigned long)pdata->size;
884+
a5 = (unsigned long)pdata->paddr_output;
885+
a6 = (unsigned long)pdata->size_output;
886+
a7 = pdata->arg[2];
887+
break;
820888
case COMMAND_FCS_CRYPTO_ECDSA_HASH_SIGNING_INIT:
821889
a0 = INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGNING_INIT;
822890
a1 = pdata->arg[0];
@@ -860,6 +928,24 @@ static int svc_normal_to_secure_thread(void *data)
860928
a5 = (unsigned long)pdata->paddr_output;
861929
a6 = (unsigned long)pdata->size_output;
862930
break;
931+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_UPDATE_SMMU:
932+
a0 = INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGNING_SMMU_UPDATE;
933+
a1 = pdata->arg[0];
934+
a2 = pdata->arg[1];
935+
a3 = (unsigned long)pdata->paddr;
936+
a4 = (unsigned long)pdata->size;
937+
a5 = (unsigned long)pdata->paddr_output;
938+
a6 = (unsigned long)pdata->size_output;
939+
break;
940+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_FINALIZE_SMMU:
941+
a0 = INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGNING_SMMU_FINALIZE;
942+
a1 = pdata->arg[0];
943+
a2 = pdata->arg[1];
944+
a3 = (unsigned long)pdata->paddr;
945+
a4 = (unsigned long)pdata->size;
946+
a5 = (unsigned long)pdata->paddr_output;
947+
a6 = (unsigned long)pdata->size_output;
948+
break;
863949
case COMMAND_FCS_CRYPTO_ECDSA_HASH_VERIFY_INIT:
864950
a0 = INTEL_SIP_SMC_FCS_ECDSA_HASH_SIGNATURE_VERIFY_INIT;
865951
a1 = pdata->arg[0];
@@ -905,6 +991,26 @@ static int svc_normal_to_secure_thread(void *data)
905991
a6 = (unsigned long)pdata->size_output;
906992
a7 = pdata->arg[2];
907993
break;
994+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_UPDATE_SMMU:
995+
a0 = INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGNATURE_VERIFY_SMMU_UPDATE;
996+
a1 = pdata->arg[0];
997+
a2 = pdata->arg[1];
998+
a3 = (unsigned long)pdata->paddr;
999+
a4 = (unsigned long)pdata->size;
1000+
a5 = (unsigned long)pdata->paddr_output;
1001+
a6 = (unsigned long)pdata->size_output;
1002+
a7 = pdata->arg[2];
1003+
break;
1004+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_FINALIZE_SMMU:
1005+
a0 = INTEL_SIP_SMC_FCS_ECDSA_SHA2_DATA_SIGNATURE_VERIFY_SMMU_FINALIZE;
1006+
a1 = pdata->arg[0];
1007+
a2 = pdata->arg[1];
1008+
a3 = (unsigned long)pdata->paddr;
1009+
a4 = (unsigned long)pdata->size;
1010+
a5 = (unsigned long)pdata->paddr_output;
1011+
a6 = (unsigned long)pdata->size_output;
1012+
a7 = pdata->arg[2];
1013+
break;
9081014
case COMMAND_FCS_CRYPTO_ECDSA_GET_PUBLIC_KEY_INIT:
9091015
a0 = INTEL_SIP_SMC_FCS_ECDSA_GET_PUBLIC_KEY_INIT;
9101016
a1 = pdata->arg[0];
@@ -985,6 +1091,15 @@ static int svc_normal_to_secure_thread(void *data)
9851091
a5 = (unsigned long)pdata->paddr_output;
9861092
a6 = (unsigned long)pdata->size_output / BYTE_TO_WORD_SIZE;
9871093
break;
1094+
case COMMAND_WRITE_TO_SECURE_REG:
1095+
a0 = INTEL_SIP_SMC_REG_WRITE;
1096+
a1 = pdata->arg[0];
1097+
a2 = pdata->arg[1];
1098+
break;
1099+
case COMMAND_READ_SECURE_REG:
1100+
a0 = INTEL_SIP_SMC_REG_READ;
1101+
a1 = pdata->arg[0];
1102+
break;
9881103
default:
9891104
pr_warn("it shouldn't happen\n");
9901105
break;
@@ -1075,22 +1190,32 @@ static int svc_normal_to_secure_thread(void *data)
10751190
case COMMAND_FCS_CRYPTO_AES_CRYPT_INIT:
10761191
case COMMAND_FCS_CRYPTO_AES_CRYPT_UPDATE:
10771192
case COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE:
1193+
case COMMAND_FCS_CRYPTO_AES_CRYPT_UPDATE_SMMU:
1194+
case COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE_SMMU:
10781195
case COMMAND_FCS_CRYPTO_GET_DIGEST_INIT:
10791196
case COMMAND_FCS_CRYPTO_GET_DIGEST_UPDATE:
10801197
case COMMAND_FCS_CRYPTO_GET_DIGEST_FINALIZE:
1198+
case COMMAND_FCS_CRYPTO_GET_DIGEST_UPDATE_SMMU:
1199+
case COMMAND_FCS_CRYPTO_GET_DIGEST_FINALIZE_SMMU:
10811200
case COMMAND_FCS_CRYPTO_MAC_VERIFY_INIT:
10821201
case COMMAND_FCS_CRYPTO_MAC_VERIFY_UPDATE:
10831202
case COMMAND_FCS_CRYPTO_MAC_VERIFY_FINALIZE:
1203+
case COMMAND_FCS_CRYPTO_MAC_VERIFY_UPDATE_SMMU:
1204+
case COMMAND_FCS_CRYPTO_MAC_VERIFY_FINALIZE_SMMU:
10841205
case COMMAND_FCS_CRYPTO_ECDSA_HASH_SIGNING_INIT:
10851206
case COMMAND_FCS_CRYPTO_ECDSA_HASH_SIGNING_FINALIZE:
10861207
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_INIT:
10871208
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_UPDATE:
10881209
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_FINALIZE:
1210+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_UPDATE_SMMU:
1211+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_FINALIZE_SMMU:
10891212
case COMMAND_FCS_CRYPTO_ECDSA_HASH_VERIFY_INIT:
10901213
case COMMAND_FCS_CRYPTO_ECDSA_HASH_VERIFY_FINALIZE:
10911214
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_INIT:
10921215
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_UPDATE:
10931216
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_FINALIZE:
1217+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_UPDATE_SMMU:
1218+
case COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_FINALIZE_SMMU:
10941219
case COMMAND_FCS_CRYPTO_ECDSA_GET_PUBLIC_KEY_INIT:
10951220
case COMMAND_FCS_CRYPTO_ECDSA_GET_PUBLIC_KEY_FINALIZE:
10961221
case COMMAND_FCS_CRYPTO_ECDH_REQUEST_INIT:
@@ -1450,6 +1575,8 @@ int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg)
14501575
struct stratix10_svc_data *p_data;
14511576
int ret = 0;
14521577
unsigned int cpu = 0;
1578+
phys_addr_t *src_addr;
1579+
phys_addr_t *dst_addr;
14531580

14541581
p_data = kzalloc(sizeof(*p_data), GFP_KERNEL);
14551582
if (!p_data)
@@ -1484,21 +1611,57 @@ int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg)
14841611
p_data->flag = ct->flags;
14851612
}
14861613
} else {
1487-
list_for_each_entry(p_mem, &svc_data_mem, node)
1488-
if (p_mem->vaddr == p_msg->payload) {
1489-
p_data->paddr = p_mem->paddr;
1490-
p_data->size = p_msg->payload_length;
1491-
break;
1492-
}
1493-
if (p_msg->payload_output) {
1614+
if (p_msg->command == COMMAND_FCS_CRYPTO_AES_CRYPT_UPDATE_SMMU ||
1615+
p_msg->command == COMMAND_FCS_CRYPTO_AES_CRYPT_FINALIZE_SMMU){
1616+
src_addr = (phys_addr_t *)p_msg->payload;
1617+
p_data->paddr = *src_addr;
1618+
p_data->size = p_msg->payload_length;
1619+
dst_addr = (phys_addr_t *)p_msg->payload_output;
1620+
p_data->paddr_output = *dst_addr;
1621+
p_data->size_output = p_msg->payload_length_output;
1622+
} else if (
1623+
p_msg->command ==
1624+
COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_UPDATE_SMMU ||
1625+
p_msg->command ==
1626+
COMMAND_FCS_CRYPTO_ECDSA_SHA2_DATA_SIGNING_FINALIZE_SMMU ||
1627+
p_msg->command ==
1628+
COMMAND_FCS_CRYPTO_GET_DIGEST_UPDATE_SMMU ||
1629+
p_msg->command ==
1630+
COMMAND_FCS_CRYPTO_GET_DIGEST_FINALIZE_SMMU ||
1631+
p_msg->command ==
1632+
COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_UPDATE_SMMU ||
1633+
p_msg->command ==
1634+
COMMAND_FCS_CRYPTO_ECDSA_SHA2_VERIFY_FINALIZE_SMMU ||
1635+
p_msg->command ==
1636+
COMMAND_FCS_CRYPTO_MAC_VERIFY_UPDATE_SMMU ||
1637+
p_msg->command ==
1638+
COMMAND_FCS_CRYPTO_MAC_VERIFY_FINALIZE_SMMU) {
1639+
src_addr = (phys_addr_t *)p_msg->payload;
1640+
p_data->paddr = *src_addr;
1641+
p_data->size = p_msg->payload_length;
14941642
list_for_each_entry(p_mem, &svc_data_mem, node)
14951643
if (p_mem->vaddr == p_msg->payload_output) {
1496-
p_data->paddr_output =
1497-
p_mem->paddr;
1498-
p_data->size_output =
1499-
p_msg->payload_length_output;
1644+
p_data->paddr_output = p_mem->paddr;
1645+
p_data->size_output = p_msg->payload_length_output;
15001646
break;
15011647
}
1648+
} else {
1649+
list_for_each_entry(p_mem, &svc_data_mem, node)
1650+
if (p_mem->vaddr == p_msg->payload) {
1651+
p_data->paddr = p_mem->paddr;
1652+
p_data->size = p_msg->payload_length;
1653+
break;
1654+
}
1655+
if (p_msg->payload_output) {
1656+
list_for_each_entry(p_mem, &svc_data_mem, node)
1657+
if (p_mem->vaddr == p_msg->payload_output) {
1658+
p_data->paddr_output =
1659+
p_mem->paddr;
1660+
p_data->size_output =
1661+
p_msg->payload_length_output;
1662+
break;
1663+
}
1664+
}
15021665
}
15031666
}
15041667

0 commit comments

Comments
 (0)