1 #include <OTUS/OTUS_soc.h>
4 #include <Magpie_api.h>
11 fwd_tgt_softc_t fwd_sc;
13 void fwd_tgt_recv(VBUF *hdr_buf, VBUF *buf, void *ctx );
14 void fwd_retbuf_handler(VBUF *buf, void *ServiceCtx);
16 hif_handle_t fwd_init()
18 HIF_CALLBACK hifconfig;
19 A_UINT32 size, res_headroom;
21 hifconfig.send_buf_done = fwd_retbuf_handler;
22 hifconfig.recv_buf = fwd_tgt_recv;
23 hifconfig.context = &fwd_sc;
25 res_headroom = HIF_get_reserved_headroom(NULL);
27 size = sizeof(fwd_rsp_t) + res_headroom;
29 HIF_register_callback(NULL, &hifconfig);
31 HIF_get_default_pipe(NULL, &fwd_sc.rx_pipe, &fwd_sc.tx_pipe);
37 fwd_retbuf_handler(VBUF *buf, void *ServiceCtx)
39 HIF_return_recv_buf(fwd_sc.hif_handle, fwd_sc.rx_pipe, buf);
43 fwd_tgt_process_last(A_UINT32 size, A_UINT32 cksum)
46 A_UINT32 *image = (A_UINT32 *)fwd_sc.addr;
48 for (i = 0 ; i < size; i += 4, image++)
49 checksum = checksum ^ *image;
51 if (checksum == cksum)
54 return A_STATUS_FAILED;
60 fwd_tgt_recv(VBUF *hdr_buf, VBUF *buf, void *ctx )
62 volatile a_uint8_t *data;
63 A_UINT32 len, seglen, offset, i, more, eloc;
64 volatile A_UINT32 *image, *daddr;
65 volatile fwd_cmd_t *c;
66 volatile fwd_rsp_t *r;
71 data = buf->desc_list->buf_addr + buf->desc_list->data_offset;
72 seglen = buf->desc_list->data_size;
74 c = (fwd_cmd_t *)data;
78 image = (A_UINT32 *)(c + 1);
81 fwd_sc.addr = (A_UINT32)(*image);
85 daddr = (A_UINT32 *)(fwd_sc.addr + offset);
91 for (i = 0 ; i < len; i += 4) {
97 desc = buf->desc_list;
98 while(desc->next_desc != NULL)
99 desc = desc->next_desc;
100 desc->data_size -= seglen;
101 buf->buf_length -= seglen;
103 r = (fwd_rsp_t *)(desc->buf_addr + desc->data_offset + desc->data_size);
104 desc->data_size += sizeof(fwd_rsp_t);
105 buf->buf_length += sizeof(fwd_rsp_t);
107 r->offset = c->offset;
110 r->rsp = FWD_RSP_ACK;
114 status = fwd_tgt_process_last(offset + len, *image);
116 /* reach to the jump location */
120 if (status == A_STATUS_OK)
121 r->rsp = FWD_RSP_SUCCESS;
123 r->rsp = FWD_RSP_FAILED;
127 HIF_send_buffer(fwd_sc.hif_handle, fwd_sc.tx_pipe, buf);
129 if (!more && (status == A_STATUS_OK)) {
130 funcptr = (jmp_func)eloc;