diff options
Diffstat (limited to 'utils/hwstub/lib/hwstub.cpp')
-rw-r--r-- | utils/hwstub/lib/hwstub.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/utils/hwstub/lib/hwstub.cpp b/utils/hwstub/lib/hwstub.cpp index 9dd2915903..5e708c3bb8 100644 --- a/utils/hwstub/lib/hwstub.cpp +++ b/utils/hwstub/lib/hwstub.cpp | |||
@@ -45,6 +45,8 @@ std::string error_string(error err) | |||
45 | case error::PROTOCOL_ERROR: return "network protocol error"; | 45 | case error::PROTOCOL_ERROR: return "network protocol error"; |
46 | case error::TIMEOUT: return "timeout"; | 46 | case error::TIMEOUT: return "timeout"; |
47 | case error::OVERFLW: return "overflow"; | 47 | case error::OVERFLW: return "overflow"; |
48 | case error::UNIMPLEMENTED: return "operation is not implemented"; | ||
49 | case error::UNSUPPORTED: return "operation unsupported"; | ||
48 | default: return "unknown error"; | 50 | default: return "unknown error"; |
49 | } | 51 | } |
50 | } | 52 | } |
@@ -457,6 +459,38 @@ error handle::write(uint32_t addr, const void *buf, size_t& sz, bool atomic) | |||
457 | return error::SUCCESS; | 459 | return error::SUCCESS; |
458 | } | 460 | } |
459 | 461 | ||
462 | error handle::cop_op(uint8_t op, uint8_t args[HWSTUB_COP_ARGS], const void *out_data, | ||
463 | size_t out_size, void *in_data, size_t *in_size) | ||
464 | { | ||
465 | std::unique_lock<std::recursive_mutex> lock(m_mutex); | ||
466 | /* get a pointer so that it's not destroyed during the runtime of the function, | ||
467 | * the pointer will be released at the end of the function */ | ||
468 | std::shared_ptr<context> ctx = m_dev->get_context(); | ||
469 | if(!ctx) | ||
470 | return error::NO_CONTEXT; | ||
471 | /* ensure valid status */ | ||
472 | error err = status(); | ||
473 | if(err != error::SUCCESS) | ||
474 | return err; | ||
475 | return cop_dev(op, args, out_data, out_size, in_data, in_size); | ||
476 | } | ||
477 | |||
478 | error handle::read32_cop(uint8_t args[HWSTUB_COP_ARGS], uint32_t& value) | ||
479 | { | ||
480 | size_t sz = sizeof(value); | ||
481 | error err = cop_op(HWSTUB_COP_READ, args, nullptr, 0, &value, &sz); | ||
482 | if(err != error::SUCCESS) | ||
483 | return err; | ||
484 | if(sz != sizeof(value)) | ||
485 | return error::ERROR; | ||
486 | return error::SUCCESS; | ||
487 | } | ||
488 | |||
489 | error handle::write32_cop(uint8_t args[HWSTUB_COP_ARGS], uint32_t value) | ||
490 | { | ||
491 | return cop_op(HWSTUB_COP_WRITE, args, &value, sizeof(value), nullptr, nullptr); | ||
492 | } | ||
493 | |||
460 | error handle::status() const | 494 | error handle::status() const |
461 | { | 495 | { |
462 | /* check context */ | 496 | /* check context */ |
@@ -616,6 +650,18 @@ error dummy_handle::exec_dev(uint32_t addr, uint16_t flags) | |||
616 | return error::DUMMY; | 650 | return error::DUMMY; |
617 | } | 651 | } |
618 | 652 | ||
653 | error dummy_handle::cop_dev(uint8_t op, uint8_t args[HWSTUB_COP_ARGS], | ||
654 | const void *out_data, size_t out_size, void *in_data, size_t *in_size) | ||
655 | { | ||
656 | (void) op; | ||
657 | (void) args; | ||
658 | (void) out_data; | ||
659 | (void) out_size; | ||
660 | (void) in_data; | ||
661 | (void) in_size; | ||
662 | return error::DUMMY; | ||
663 | } | ||
664 | |||
619 | error dummy_handle::status() const | 665 | error dummy_handle::status() const |
620 | { | 666 | { |
621 | error err = handle::status(); | 667 | error err = handle::status(); |