enum esif_rc esif_get_action_systemio( const struct esif_lp *lp_ptr, const struct esif_lp_primitive *primitive_ptr, const struct esif_lp_action *action_ptr, struct esif_data *req_data_ptr, struct esif_data *rsp_data_ptr ) { enum esif_rc rc = ESIF_OK; u32 val = 1234; UNREFERENCED_PARAMETER(lp_ptr); UNREFERENCED_PARAMETER(primitive_ptr); UNREFERENCED_PARAMETER(action_ptr); UNREFERENCED_PARAMETER(req_data_ptr); if (NULL == rsp_data_ptr) { rc = ESIF_E_PARAMETER_IS_NULL; goto exit; } ESIF_TRACE_DYN_GET("val = %d\n", val); switch (rsp_data_ptr->type) { case ESIF_DATA_UINT8: rsp_data_ptr->data_len = sizeof(u8); if (rsp_data_ptr->buf_len >= sizeof(u8)) *((u8 *)rsp_data_ptr->buf_ptr) = (u8)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; case ESIF_DATA_UINT16: rsp_data_ptr->data_len = sizeof(u16); if (rsp_data_ptr->buf_len >= sizeof(u16)) *((u16 *)rsp_data_ptr->buf_ptr) = (u16)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; case ESIF_DATA_UINT32: rsp_data_ptr->data_len = sizeof(u32); if (rsp_data_ptr->buf_len >= sizeof(u32)) *((u32 *)rsp_data_ptr->buf_ptr) = (u32)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; default: ESIF_TRACE_DYN_GET("Data Type Not Implemented = %s\n", esif_data_type_str(rsp_data_ptr->type)); rc = ESIF_E_NOT_IMPLEMENTED; break; } exit: ESIF_TRACE_DYN_GET("RC: %s(%d)\n", esif_rc_str(rc), rc); return rc; }
enum esif_rc esif_get_action_systemio( const struct esif_data *req_data_ptr, struct esif_data *rsp_data_ptr ) { enum esif_rc rc = ESIF_OK; u32 val = 1234; UNREFERENCED_PARAMETER(req_data_ptr); ESIF_TRACE_DYN_GET("%s: io_port = %d, val = %d\n", ESIF_FUNC, 0, val); switch (rsp_data_ptr->type) { case ESIF_DATA_UINT8: rsp_data_ptr->data_len = sizeof(u8); if (rsp_data_ptr->buf_len >= sizeof(u8)) *((u8 *)rsp_data_ptr->buf_ptr) = (u8)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; case ESIF_DATA_UINT16: rsp_data_ptr->data_len = sizeof(u16); if (rsp_data_ptr->buf_len >= sizeof(u16)) *((u16 *)rsp_data_ptr->buf_ptr) = (u16)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; case ESIF_DATA_UINT32: rsp_data_ptr->data_len = sizeof(u32); if (rsp_data_ptr->buf_len >= sizeof(u32)) *((u32 *)rsp_data_ptr->buf_ptr) = (u32)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; default: ESIF_TRACE_DYN_GET("%s: Data Type Not Implemented = %d\n", ESIF_FUNC, rsp_data_ptr->type); rc = ESIF_E_NOT_IMPLEMENTED; break; } return rc; }
/* Get */ enum esif_rc esif_get_action_mmio( const struct esif_lp *lp_ptr, const struct esif_lp_primitive *primitive_ptr, const struct esif_lp_action *action_ptr, struct esif_data *req_data_ptr, struct esif_data *rsp_data_ptr ) { enum esif_rc rc = ESIF_OK; void __iomem *base_addr = NULL; u32 offset; u8 bit_from; u8 bit_to; int i = 0; /* Loop Counter */ u32 val = 0; /* Temporary MMIO Value MMIO Always 32 Bit */ u32 bit_mask = 0; /* Bit Mask For MMIO Value */ UNREFERENCED_PARAMETER(primitive_ptr); UNREFERENCED_PARAMETER(req_data_ptr); if ((NULL == lp_ptr) || (NULL == action_ptr) || (NULL == rsp_data_ptr)) { rc = ESIF_E_PARAMETER_IS_NULL; goto exit; } base_addr = lp_ptr->pi_ptr->mem_base; if (NULL == base_addr) { rc = ESIF_E_NO_MMIO_SUPPORT; goto exit; } offset = action_ptr->get_p1_u32(action_ptr); bit_from = (u8)action_ptr->get_p3_u32(action_ptr); bit_to = (u8)action_ptr->get_p2_u32(action_ptr); #ifdef ESIF_ATTR_OS_WINDOWS if ((offset + MMIO_ACCESS_SIZE) > lp_ptr->pi_ptr->mem_size) { rc = ESIF_E_PARAMETER_IS_OUT_OF_BOUNDS; goto exit; } #endif /* Read MMIO 32-Bit Always */ esif_ccb_read_lock(&g_esif_action_mmio_lock); esif_ccb_mmio_read(base_addr, offset, &val); esif_ccb_read_unlock(&g_esif_action_mmio_lock); /* Mask Bits */ for (bit_mask = 0, i = bit_from; i <= bit_to; i++) bit_mask |= (1 << i); val = val & bit_mask; val = val >> bit_from; ESIF_TRACE_DYN_GET("Base %p offset 0x%x[%d:%d] = 0x%x\n", base_addr, offset, bit_to, bit_from, val); switch (rsp_data_ptr->type) { case ESIF_DATA_UINT8: rsp_data_ptr->data_len = sizeof(u8); if (rsp_data_ptr->buf_len >= sizeof(u8)) *((u8 *)rsp_data_ptr->buf_ptr) = (u8)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; case ESIF_DATA_UINT16: rsp_data_ptr->data_len = sizeof(u16); if (rsp_data_ptr->buf_len >= sizeof(u16)) *((u16 *)rsp_data_ptr->buf_ptr) = (u16)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; case ESIF_DATA_UINT32: case ESIF_DATA_TIME: rsp_data_ptr->data_len = sizeof(u32); if (rsp_data_ptr->buf_len >= sizeof(u32)) *((u32 *)rsp_data_ptr->buf_ptr) = (u32)val; else rc = ESIF_E_OVERFLOWED_RESULT_TYPE; break; default: rc = ESIF_E_UNSUPPORTED_RESULT_DATA_TYPE; break; } exit: ESIF_TRACE_DYN_GET("RC: %s(%d)\n", esif_rc_str(rc), rc); return rc; }