// SPDX-License-Identifier: GPL-2.0 /*! ****************************************************************************** @file host_port_if.c @brief Hosport communication utils @author Nordic Semiconductor ASA @date 2017 ******************************************************************************/ #include "lmac_if.h" #include "lmac_if_common.h" void RPU_read_mem(unsigned char *src, unsigned char *dst, unsigned int size); void RPU_write_mem(unsigned char *dst, unsigned char *data, unsigned int size); unsigned int RPU_read_word(unsigned int *src); void RPU_write_word(unsigned int *src , unsigned int data); void hpqm_init (unsigned long rpu_gram_base_addr, struct lmac_fw_config_params *params) { RPU_read_mem( (unsigned char *)(RPU_MEM_LMAC_BOOT_SIG), (unsigned char *)params, (sizeof (struct lmac_fw_config_params))) ; } void hpqm_rpu_isr_en (unsigned long rpu_sysbus_base_addr, struct lmac_fw_config_params *params ) { unsigned int data = 0x80000000; RPU_write_word ( (unsigned int *)(rpu_sysbus_base_addr + params->HP_lmac_to_host_isr_en), data ); } void hpqm_rpu_assert_isr (unsigned long rpu_sysbus_base_addr, struct lmac_fw_config_params *params ) { unsigned int data = 0x7fff; RPU_write_word ( (unsigned int *)(rpu_sysbus_base_addr + params->HP_set_lmac_isr),data ); } void hpqm_rpu_isr_clear (unsigned long rpu_sysbus_base_addr, struct lmac_fw_config_params *params ) { unsigned int data = 0x80000000; RPU_write_word ( (unsigned int *)(rpu_sysbus_base_addr + params->HP_lmac_to_host_isr_clear), data ); } unsigned int hpqm_get_cmd_buf_ptr (unsigned long rpu_perip_base_addr, struct lmac_fw_config_params *params) { unsigned int data; data = RPU_read_word( (unsigned int *)(rpu_perip_base_addr + params->FreeCmdPtrQ.pop_addr) ); if (data != 0) RPU_write_word((unsigned int *)(rpu_perip_base_addr + params->FreeCmdPtrQ.pop_addr),data); return data & 0xffffff; } void hpqm_submit_cmd_buf_ptr (unsigned long rpu_sysbus_base_addr, unsigned long rpu_perip_base_addr, unsigned int gramCmdPtr, struct lmac_fw_config_params *params) { /* Push GRAM address to command buffer queue and assert host port isr */ RPU_write_word((unsigned int *)(rpu_perip_base_addr + params->cmdPtrQ.push_addr), (0xb7000000 | gramCmdPtr)); hpqm_rpu_assert_isr (rpu_sysbus_base_addr,params ); } unsigned int hpqm_get_event_ptr(unsigned long rpu_perip_base_addr, struct lmac_fw_config_params *params) { unsigned int data; data = RPU_read_word((unsigned int *)(rpu_perip_base_addr +params->eventPtrQ.pop_addr )); if (data != 0) RPU_write_word((unsigned int *)(rpu_perip_base_addr +params->eventPtrQ.pop_addr), data); return data & 0x00ffffff; } void hpqm_free_event_ptr (unsigned long rpu_perip_base_addr, unsigned long rpu_gram_base_addr, unsigned int event_ptr) { struct lmac_msg_hdr hdr; RPU_read_mem ((unsigned char * )((event_ptr + rpu_gram_base_addr) + sizeof(struct host_rpu_msg_hdr)), (unsigned char * )&hdr, sizeof(struct lmac_msg_hdr)); RPU_write_word((unsigned int *)(rpu_perip_base_addr + hdr.push_addr), (event_ptr | 0XB7000000)); } #ifdef RX_HDR_CACHE unsigned int HP_submit_macHdr_ptr ( unsigned long rpu_perip_base_addr, struct lmac_fw_config_params *params, unsigned long *skb_ptr) { RPU_write_word((unsigned int *)(rpu_perip_base_addr +params->macHdrPtrQ.push_addr), (unsigned long )skb_ptr); return 0; } #endif /* RX_HDR_CACHE */