core::bc_unique_ptr< bcINT16 > bc_physics_system::convert_height_field_samples(bcUINT32 p_num_row, bcUINT32 p_num_column, bcFLOAT* p_samples) { bcUINT32 l_num_samples = p_num_row * p_num_column; core::bc_unique_ptr< bcINT16 > l_buffer(static_cast< bcINT16* >(bcAlloc(sizeof(bcINT16) * l_num_samples, core::bc_alloc_type::frame))); bcINT16* l_buffer_ptr = l_buffer.get(); for (bcUINT32 l_index = 0; l_index < l_num_samples; ++l_index) { l_buffer_ptr[l_index] = height_to_int16(p_samples[l_index]); } return l_buffer; }
// Process elog entry from OCC poll response void occProcessElog(Occ * i_occ, const uint8_t i_id, const uint32_t i_address, const uint16_t i_length) { errlHndl_t l_errlHndl = NULL; // Read data from SRAM (length must be multiple of 8 bytes) const uint16_t l_length = (i_length + 8) & 0xFFF8; uint8_t l_sram_data[8 + l_length]; ecmdDataBufferBase l_buffer(l_length*8); // convert to bits // HBOCC is only defined for HTMGT #ifdef CONFIG_HTMGT l_errlHndl = HBOCC::readSRAM(i_occ->getTarget(), i_address, l_buffer); #endif if (NULL == l_errlHndl) { const uint32_t l_flatSize = l_buffer.flattenSize(); l_buffer.flatten(l_sram_data, l_flatSize); // Skip 8 byte ecmd header const occErrlEntry_t *l_occElog=(occErrlEntry_t *)&l_sram_data[8]; TMGT_BIN("OCC ELOG", l_occElog, 64); const uint32_t l_occSrc = OCCC_COMP_ID | l_occElog->reasonCode; ERRORLOG::errlSeverity_t l_errlSeverity = ERRORLOG::ERRL_SEV_INFORMATIONAL; #if 0 // TODO: RTC 109224 - determine correct severity/actions // Process Severity const uint8_t l_occSeverity = l_occElog->severity; const uint8_t l_occActions = l_occElog->actions; if (l_occSeverity < OCC_SEV_ACTION_XLATE_SIZE) { l_errlSeverity = occSeverityErrorActionXlate[l_occSeverity].occErrlSeverity; } else { TMGT_ERR("occProcessElog: Severity translate failure" " (severity = 0x%02X)", l_occElog->severity); } // Process elog Actions bool l_occReset = false; elogProcessActions(l_occActions, l_occReset, l_errlSeverity); if (l_occReset == true) { iv_needsReset = true; UPDATE_SAFE_MODE_REASON(l_occSrc, iv_huid, true); } #endif // Create OCC error log // NOTE: word 4 (used by extended reason code) to save off OCC // sub component value which is needed to correctly parse // srcs which have similar uniqueness // NOTE: SRC tags are NOT required here as these logs will get // parsed with the OCC src tags const occErrlUsrDtls_t *l_usrDtls_ptr = (occErrlUsrDtls_t *) ((uint8_t*)l_occElog+sizeof(occErrlEntry_t)+ (l_occElog->numCallouts * sizeof(occErrlCallout_t)) ); bldErrLog(l_errlHndl, (htmgtModuleId)(l_usrDtls_ptr->modId & 0x00FF), (htmgtReasonCode)l_occSrc, // occ reason code l_usrDtls_ptr->userData1, l_usrDtls_ptr->userData2, l_usrDtls_ptr->userData3, ((l_usrDtls_ptr->modId & 0xFF00) << 16 ) | l_occElog->userData4, // extended reason code l_errlSeverity); #if 0 // TODO: RTC 109224 // Add callout information bool l_bad_fru_data = false; uint8_t l_callout_num = 0; if (! ((ERRL_SEV_INFORMATIONAL == l_errlSeverity) && (TMGT_ERRL_ACTIONS_MANUFACTURING_ERROR & l_occActions)) ) { // Only add callouts if this is MFG error and system not in // MFG (in MFG severity would not be Info) uint8_t l_index = 0; uint8_t l_count = 1; const uint8_t l_max_callout = l_occElog->numCallouts; // The beginning address of callout data l_index = sizeof(occErrlEntry_t); do { occErrlCallout_t *l_callout_ptr = NULL; l_callout_ptr = (occErrlCallout_t *) ((uint8_t*)l_occElog+l_index); if (l_callout_ptr->type != 0) { srciPriority l_priority; bool l_success = true; l_success = elogXlateSrciPriority(l_callout_ptr->priority, l_priority); if (l_success == true) { l_success = elogAddCallout(l_errlHndl, l_errlSeverity, l_priority, *l_callout_ptr, l_callout_num); if (l_success == false) { l_bad_fru_data = true; } } else { l_bad_fru_data = true; TMGT_ERR("occProcessElog: Priority translate" " failure (priority = 0x%02X)", l_callout_ptr->priority); } l_index += sizeof(occErrlCallout_t); } // if (l_type != 0) else { // make sure all the remaining callout data are zeros, // otherwise mark bad fru data uint8_t *l_ptr = (uint8_t*)l_occElog+l_index; uint8_t l_len = (l_max_callout-l_count+1)* sizeof(occErrlCallout_t); while (l_len != 0) { if (*l_ptr != 0x00) { TMGT_ERR("occProcessElog: The remaining" " callout data should be all zeros"); l_bad_fru_data = true; break; } l_len--; l_ptr++; } break; } l_count++; } while (l_count <= l_max_callout); } else { TMGT_ERR("MFG error found outside MFG; callouts will not be" " added to log (OCC severity=0x%02X, actions=0x%02X)", l_occSeverity, l_occActions); const uint8_t l_callout_length = l_occElog->numCallouts * 12; const char *l_callout_ptr = (char *)((uint8_t*)l_occElog+ sizeof(occErrlEntry_t)); // Add raw callout data from the OCC l_errlHndl->addUsrDtls(l_callout_ptr, l_callout_length, TMGT_COMP_ID, TMGT_VERSION, TMGT_ERROR_DATA_TYPE); } // Any bad fru data found ? errlHndl_t l_errlHndl2 = NULL; if (l_bad_fru_data == true) { /*@ * @errortype * @refcode LIC_REFCODE * @subsys EPUB_FIRMWARE_SP * @reasoncode HTMGT_RC_OCC_ERROR_LOG * @moduleid HTMGT_MOD_BAD_FRU_CALLOUTS * @userdata1 OCC elog id * @userdata2 Number of good callouts * @devdesc Bad FRU data received in OCC error log */ bldErrLog(l_errlHndl2, HTMGT_MOD_BAD_FRU_CALLOUTS, HTMGT_RC_OCC_ERROR_LOG, i_id, l_callout_num, 0, 0, ERRL_SEV_INFORMATIONAL); ERRORLOG::errlCommit(l_errlHndl2, HTMGT_COMP_ID); } // Check callout number and severity if ((l_callout_num == 0) && (l_errlSeverity != ERRL_SEV_INFORMATIONAL)) { TMGT_ERR("occProcessElog: No FRU callouts found for OCC%d" " elog_id:0x%02X, severity:0x%0X", iv_instance, i_id, l_errlSeverity); /*@ * @errortype * @refcode LIC_REFCODE * @subsys EPUB_FIRMWARE_SP * @reasoncode HTMGT_RC_OCC_ERROR_LOG * @moduleid HTMGT_MOD_MISMATCHING_SEVERITY * @userdata1 OCC elog id * @userdata2 OCC severity * @userdata3 * @userdata4 * @devdesc No FRU callouts found for non-info OCC Error Log */ bldErrLog(l_errlHndl2, HTMGT_MOD_MISMATCHING_SEVERITY, HTMGT_RC_OCC_ERROR_LOG, i_id, l_errlSeverity, 0, 0, ERRL_SEV_INFORMATIONAL); ERRORLOG::errlCommit(l_errlHndl2, HTMGT_COMP_ID); } #endif // Add full OCC error log data as a User Details section l_errlHndl->addFFDC(OCCC_COMP_ID, l_occElog, i_length, 1, // version 0); // subsection #if 0 // TODO: RTC 109224 // Add additional data addTmgtElogData(l_errlHndl); addThermalElogData(l_errlHndl); #endif // Commit Error (or terminate if required) ERRORLOG::errlCommit(l_errlHndl, HTMGT_COMP_ID); // Clear elog const uint8_t l_cmdData[1] = {i_id}; OccCmd l_cmd(i_occ, OCC_CMD_CLEAR_ERROR_LOG, sizeof(l_cmdData), l_cmdData); l_errlHndl = l_cmd.sendOccCmd(); if (l_errlHndl != NULL) { TMGT_ERR("occProcessElog: Failed to clear elog id %d to" " OCC%d (rc=0x%04X)", i_id, i_occ, l_errlHndl->reasonCode()); ERRORLOG::errlCommit(l_errlHndl, HTMGT_COMP_ID); } } else { TMGT_ERR("occProcessElog: Unable to read elog %d from SRAM" " address (0x%08X) length (0x%04X), rc=0x%04X", i_id, i_address, i_length, l_errlHndl->reasonCode()); ERRORLOG::errlCommit(l_errlHndl, HTMGT_COMP_ID); } } // end Occ::occProcessElog()