From cf0f7b4ccc43c6c42d26e17cdc384e3afe7b7fb4 Mon Sep 17 00:00:00 2001 From: "xianfeng.du" Date: Mon, 30 Oct 2023 10:00:20 +0800 Subject: [PATCH] updated handshake flow for customers --- app/inc/ucp_handshake.h | 3 +++ app/src/ucp_handshake.c | 52 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/app/inc/ucp_handshake.h b/app/inc/ucp_handshake.h index 8eb9eb0..0d00f46 100644 --- a/app/inc/ucp_handshake.h +++ b/app/inc/ucp_handshake.h @@ -31,6 +31,9 @@ typedef struct tUcpHandshake{ } UcpHandshake_t; void ucp_handshake(void); +void send_handshake_request(void); +void receive_handshake_response(void); +uint32_t get_handshake_status(void); #endif diff --git a/app/src/ucp_handshake.c b/app/src/ucp_handshake.c index 4f83e44..8013c55 100644 --- a/app/src/ucp_handshake.c +++ b/app/src/ucp_handshake.c @@ -42,3 +42,55 @@ void ucp_handshake(void) return; } +void send_handshake_request(void) +{ + uint32_t core_id = NPU_CORE_ID; + uint32_t request= (core_id + HANDSHKAE_REQ_VALUE); + //volatile uint32_t response; + + PetSmLocalMgt_t* pPetSmLocalMgt = get_pet_sm_local_mgt(); + UcpHandshake_t* pHandshake = pPetSmLocalMgt->pHandshake; + + pHandshake->request[core_id] = request; + UCP_PRINT_DEBUG("core[0x%08x] send handshake request message,value[0x%08x].",core_id,request); + + return; +} + +uint32_t get_handshake_status(void) +{ + volatile uint32_t response; + uint32_t core_id = NPU_CORE_ID; + uint32_t coreReadyBitMap = SUCCESS;//0:ready, 1:not ready + uint32_t handshake_coremask = 0x6FF; + + PetSmLocalMgt_t* pPetSmLocalMgt = get_pet_sm_local_mgt(); + UcpHandshake_t* pHandshake = pPetSmLocalMgt->pHandshake; + + response = pHandshake->response[core_id]; + if (response == (core_id + HANDSHKAE_RESP_VALUE)) { + return coreReadyBitMap; + } else { + for(uint32_t i = 0; i < MAX_NUM_SPU; i++) { + response = pHandshake->response[i]; + if (response != (i + HANDSHKAE_RESP_VALUE)) { + coreReadyBitMap |= (1 << i); + } + } + coreReadyBitMap &= handshake_coremask; + return coreReadyBitMap; + } + + //return; +} + +void receive_handshake_response(void) +{ + uint32_t stauts = SUCCESS; + do { + stauts = get_handshake_status(); + } while(SUCCESS != stauts); + + return; +} +