11ed5f7a6SRashmica Gupta #include "common/transport.hpp" 21ed5f7a6SRashmica Gupta 3c453e164SGeorge Liu #include <libpldm/base.h> 4c453e164SGeorge Liu #include <libpldm/platform.h> 59d494bbeSDeepak Kodihalli 66492f524SGeorge Liu #include <CLI/CLI.hpp> 749cfb138SRiya Dixit #include <phosphor-logging/lg2.hpp> 86492f524SGeorge Liu #include <sdeventplus/event.hpp> 96492f524SGeorge Liu #include <sdeventplus/source/io.hpp> 106492f524SGeorge Liu 116492f524SGeorge Liu #include <array> 126492f524SGeorge Liu #include <iostream> 136492f524SGeorge Liu 149d494bbeSDeepak Kodihalli using namespace sdeventplus; 159d494bbeSDeepak Kodihalli using namespace sdeventplus::source; 1649cfb138SRiya Dixit PHOSPHOR_LOG2_USING; 179d494bbeSDeepak Kodihalli 189d494bbeSDeepak Kodihalli int main(int argc, char** argv) 199d494bbeSDeepak Kodihalli { 209d494bbeSDeepak Kodihalli CLI::App app{"Send PLDM command SetStateEffecterStates"}; 219d494bbeSDeepak Kodihalli uint8_t mctpEid{}; 229d494bbeSDeepak Kodihalli app.add_option("-m,--mctp_eid", mctpEid, "MCTP EID")->required(); 239d494bbeSDeepak Kodihalli uint16_t effecterId{}; 249d494bbeSDeepak Kodihalli app.add_option("-e,--effecter", effecterId, "Effecter Id")->required(); 259d494bbeSDeepak Kodihalli uint8_t state{}; 269d494bbeSDeepak Kodihalli app.add_option("-s,--state", state, "New state value")->required(); 279d494bbeSDeepak Kodihalli CLI11_PARSE(app, argc, argv); 289d494bbeSDeepak Kodihalli 291ed5f7a6SRashmica Gupta pldm_tid_t dstTid = static_cast<pldm_tid_t>(mctpEid); 301ed5f7a6SRashmica Gupta 319d494bbeSDeepak Kodihalli // Encode PLDM Request message 329d494bbeSDeepak Kodihalli uint8_t effecterCount = 1; 339d494bbeSDeepak Kodihalli std::array<uint8_t, sizeof(pldm_msg_hdr) + sizeof(effecterId) + 349d494bbeSDeepak Kodihalli sizeof(effecterCount) + 359d494bbeSDeepak Kodihalli sizeof(set_effecter_state_field)> 369d494bbeSDeepak Kodihalli requestMsg{}; 379d494bbeSDeepak Kodihalli auto request = reinterpret_cast<pldm_msg*>(requestMsg.data()); 389d494bbeSDeepak Kodihalli set_effecter_state_field stateField{PLDM_REQUEST_SET, state}; 399d494bbeSDeepak Kodihalli auto rc = encode_set_state_effecter_states_req(0, effecterId, effecterCount, 409d494bbeSDeepak Kodihalli &stateField, request); 419d494bbeSDeepak Kodihalli if (rc != PLDM_SUCCESS) 429d494bbeSDeepak Kodihalli { 4349cfb138SRiya Dixit error("Message encode failure. PLDM error code = {RC}", "RC", lg2::hex, 4449cfb138SRiya Dixit rc); 459d494bbeSDeepak Kodihalli return -1; 469d494bbeSDeepak Kodihalli } 479d494bbeSDeepak Kodihalli 481ed5f7a6SRashmica Gupta PldmTransport pldmTransport{}; 499d494bbeSDeepak Kodihalli 509d494bbeSDeepak Kodihalli // Create event loop and add a callback to handle EPOLLIN on fd 519d494bbeSDeepak Kodihalli auto event = Event::get_default(); 52*a675662cSPatrick Williams auto callback = [=, &pldmTransport](IO& io, int fd, 53*a675662cSPatrick Williams uint32_t revents) mutable { 549d494bbeSDeepak Kodihalli if (!(revents & EPOLLIN)) 559d494bbeSDeepak Kodihalli { 569d494bbeSDeepak Kodihalli return; 579d494bbeSDeepak Kodihalli } 589d494bbeSDeepak Kodihalli 591ed5f7a6SRashmica Gupta if (pldmTransport.getEventSource() != fd) 609d494bbeSDeepak Kodihalli { 611ed5f7a6SRashmica Gupta return; 621ed5f7a6SRashmica Gupta } 631ed5f7a6SRashmica Gupta 641ed5f7a6SRashmica Gupta void* responseMsg = nullptr; 651ed5f7a6SRashmica Gupta size_t responseMsgSize{}; 661ed5f7a6SRashmica Gupta pldm_tid_t srcTid; 671ed5f7a6SRashmica Gupta auto rc = pldmTransport.recvMsg(srcTid, responseMsg, responseMsgSize); 689d494bbeSDeepak Kodihalli pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg); 691ed5f7a6SRashmica Gupta if (rc || dstTid != srcTid || 701ed5f7a6SRashmica Gupta !pldm_msg_hdr_correlate_response(&request->hdr, &response->hdr)) 711ed5f7a6SRashmica Gupta { 721ed5f7a6SRashmica Gupta return; 731ed5f7a6SRashmica Gupta } 741ed5f7a6SRashmica Gupta 751ed5f7a6SRashmica Gupta // We've got the response meant for the PLDM request msg that was sent 761ed5f7a6SRashmica Gupta // out 771ed5f7a6SRashmica Gupta io.set_enabled(Enabled::Off); 7849cfb138SRiya Dixit info("Done. PLDM RC = {RC}", "RC", lg2::hex, 7949cfb138SRiya Dixit static_cast<uint16_t>(response->payload[0])); 809d494bbeSDeepak Kodihalli free(responseMsg); 819d494bbeSDeepak Kodihalli exit(EXIT_SUCCESS); 829d494bbeSDeepak Kodihalli }; 831ed5f7a6SRashmica Gupta IO io(event, pldmTransport.getEventSource(), EPOLLIN, std::move(callback)); 849d494bbeSDeepak Kodihalli 851ed5f7a6SRashmica Gupta rc = pldmTransport.sendMsg(dstTid, requestMsg.data(), requestMsg.size()); 869f8d2b0aSSampa Misra if (0 > rc) 879d494bbeSDeepak Kodihalli { 8849cfb138SRiya Dixit error( 8949cfb138SRiya Dixit "Failed to send message/receive response. RC = {RC} errno = {ERR}", 9049cfb138SRiya Dixit "RC", rc, "ERR", errno); 919d494bbeSDeepak Kodihalli return -1; 929d494bbeSDeepak Kodihalli } 939d494bbeSDeepak Kodihalli 949d494bbeSDeepak Kodihalli event.loop(); 959d494bbeSDeepak Kodihalli 969d494bbeSDeepak Kodihalli return 0; 979d494bbeSDeepak Kodihalli } 98