.. _program_listing_file_device.hpp: Program Listing for File device.hpp =================================== |exhale_lsh| :ref:`Return to documentation for file ` (``device.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef DEVICE_H_ #define DEVICE_H_ #include #include #include #include "flxcard/FlxCard.h" #include "cmem_buffer.hpp" #include "config/config.hpp" #include "elink.hpp" #define MAX_BROADCAST_CHANNELS (32) #define MAX_BROADCAST_ELINKS (1 + 32 + 64) #define TOFLX_EOM_MASK_RM4 0x0001 #define TOFLX_EOM_SHIFT_RM4 0 #define TOFLX_LENGTH_MASK_RM4 0x001E #define TOFLX_LENGTH_SHIFT_RM4 1 #define TOFLX_ELINK_MASK_RM4 0xFFE0 #define TOFLX_ELINK_SHIFT_RM4 5 #define TOFLX_LENGTH_MASK 0x001F #define TOFLX_ELINK_SHIFT 5 #define TOFLX_LENGTH_MASK_HDR32 0x003F #define TOFLX_ELINK_SHIFT_HDR32 6 #define TOFLX_LENGTH_MASK_HDR32_8B 0x000000FF #define TOFLX_ELINK_SHIFT_HDR32_8B 8 enum flx_fromhost_format { FROMHOST_FORMAT_REGMAP4, FROMHOST_FORMAT_5BIT_LENGTH, FROMHOST_FORMAT_HDR32_PACKET32, FROMHOST_FORMAT_HDR32_PACKET64, // Header with 8-bit fields (see FLX-2294): FROMHOST_FORMAT_HDR32_PACKET32_8B, FROMHOST_FORMAT_HDR32_PACKET64_8B, FROMHOST_FORMAT_HDR32_PACKET128_8B, UN_INITIALIZED }; enum flx_tohost_format { TOHOST_SUBCHUNK_TRAILER, TOHOST_SUBCHUNK_HEADER }; class Device { protected: unsigned m_device_number; uint8_t m_vid; uint16_t m_did, m_cid; u_int m_firmware_type; flx_fromhost_format m_fromHostDataFormat {UN_INITIALIZED}; flx_tohost_format m_toHostDataFormat {TOHOST_SUBCHUNK_TRAILER}; virtual uint64_t get_broadcast_enable_gen(u_int channel) = 0; virtual bool elink_has_stream_id(u_int channel, u_int egroup, u_int epath) = 0; public: Device(unsigned dev_no, uint8_t vid, uint16_t did, uint16_t cid); virtual int open_device(u_int lock_mask) = 0; virtual void close_device() = 0; virtual bool is_primary() = 0; virtual unsigned int get_card_model() = 0; virtual unsigned int get_card_endpoints() = 0; virtual u_int get_regmap_version() = 0; virtual u_int get_firmware_type(){return m_firmware_type;} virtual u_int get_number_of_channels() = 0; virtual bool get_wide_mode() = 0; virtual u_int get_block_size() = 0; virtual u_int get_trailer_size() = 0; virtual flx_fromhost_format get_fromhost_data_format() = 0; virtual flx_tohost_format get_tohost_data_format() = 0; virtual int get_fromhost_dmaid() = 0; virtual int get_trickle_dmaid() = 0; virtual int dma_max_tlp_bytes() = 0; virtual void set_register(const char *key, uint64_t value) = 0; virtual uint64_t get_register(const char *key) = 0; virtual bool check_register(const char *key) = 0; virtual void cancel_irq(int i) = 0; virtual void irq_wait(int i) = 0; virtual void irq_enable(int i) = 0; virtual void irq_disable(int i) = 0; virtual std::vector read_enabled_elinks(int dmaid) = 0; std::vector get_enabled_elinks_of_type(int dmaid, elink_type_t t); unsigned get_device_number(){return m_device_number;} unsigned int make_dma_lock_mask(const std::vector& dmaids); u_int get_broadcast_elinks(uint64_t broadcast_elinks[], uint32_t num_of_channels); static int64_t broadcast_for(uint64_t elink); static int broadcast_type(uint64_t elink); static const std::string broadcast_type_str(uint64_t elink); static u_int broadcast_elinks(uint64_t broadcast_elinks[], const uint64_t broadcast_enable_registers[], uint32_t num_of_channels); static const std::string get_elink_type_str(elink_type_t encoding); bool has_wrong_rm(); bool is_full_mode(); bool is_lpgbt_mode(); uint64_t get_elink(u_int channel, u_int egroup, u_int epath); uint32_t get_channel(uint32_t elink); uint32_t get_egroup(uint32_t elink); uint32_t get_epath(uint32_t elink); u_int get_egroups_per_channel(u_int is_to_flx); u_int get_epaths_per_egroup(u_int is_to_flx); u_int get_ctrl_elinks_per_channel(); virtual bool dma_enabled(int dmaid) = 0; virtual void dma_to_host(DmaBuffer* buf, int dmaid) = 0; virtual void dma_from_host(DmaBuffer* buf, int dmaid) = 0; virtual void dma_from_host_trickle(DmaBuffer* buf, int dmaid, size_t config_size) = 0; virtual void dma_set_oneshot(DmaBuffer* buf, int dmaid, size_t config_size) = 0; virtual uint64_t dma_get_fw_ptr(int dmaid) = 0; virtual uint64_t dma_get_sw_ptr(int dmaid) = 0; virtual void dma_set_sw_ptr(int dmaid, uint64_t p_absolute) = 0; virtual bool dma_cmp_even_bits(int dmaid) = 0; virtual void dma_stop(unsigned int dmaid) = 0; virtual monitoring_data_t hw_get_monitoring_data( unsigned int mon_mask = 0xFFF ) = 0; }; class FlxDevice : public Device { private: FlxCard m_dev; encoding_t elink_get_encoding(u_int channel, u_int egroup, u_int epath, bool is_to_flx); bool elink_is_in_dma(local_elink_t elink, int dmaid); bool elink_is_enabled(u_int channel, u_int egroup, u_int epath, bool is_to_flx); local_elink_t get_ec_elink(bool is_to_flx, u_int channel); local_elink_t get_ic_elink(bool is_to_flx, u_int channel); local_elink_t get_aux_elink(bool is_to_flx, u_int channel); bool elink_is_ic_enabled(bool is_to_flx, u_int channel); bool elink_is_ec_enabled(bool is_to_flx, u_int channel); bool elink_is_aux_enabled(bool is_to_flx, u_int channel); uint64_t get_broadcast_enable_gen(u_int channel) override; bool elink_has_stream_id(u_int channel, u_int egroup, u_int epath) override; public: FlxDevice(Config& cfg, unsigned device); explicit FlxDevice(unsigned dev_no); int open_device(u_int lock_mask) override; void close_device() override; bool is_primary() override; unsigned int get_card_model() override; unsigned int get_card_endpoints() override; u_int get_regmap_version() override; u_int get_number_of_channels() override; bool get_wide_mode() override; u_int get_block_size() override; u_int get_trailer_size() override; flx_fromhost_format get_fromhost_data_format() override; flx_tohost_format get_tohost_data_format() override; int get_fromhost_dmaid() override; int get_trickle_dmaid() override; int dma_max_tlp_bytes() override; //Registers void set_register(const char *key, uint64_t value) override; uint64_t get_register(const char *key) override; bool check_register(const char *key) override; //Interrupts void cancel_irq(int i) override; void irq_wait(int i) override; void irq_enable(int i) override; void irq_disable(int i) override; //Elinks std::vector read_enabled_elinks(int dmaid) override; //DMA operations bool dma_enabled(int dmaid) override; void dma_to_host(DmaBuffer* buf, int dmaid) override; //start_circular_dma void dma_from_host(DmaBuffer* buf, int dmaid) override; void dma_from_host_trickle(DmaBuffer* buf, int dmaid, size_t config_size) override; void dma_set_oneshot(DmaBuffer* buf, int dmaid, size_t config_size) override; uint64_t dma_get_fw_ptr(int dmaid) override; //dma_get_current_address uint64_t dma_get_sw_ptr(int dmaid) override; void dma_set_sw_ptr(int dmaid, uint64_t p_phys) override; //dma_set_ptr bool dma_cmp_even_bits(int dmaid) override; void dma_stop(unsigned int dmaid) override; //HW monitor monitoring_data_t hw_get_monitoring_data( unsigned int mon_mask = 0xFFF ) override; }; class FileDevice : public Device { private: u_int m_locks; u_int m_regmap; u_int m_channels; u_int m_block_size; u_int m_trailer_size; //determined in open_device bool m_wide_mode; int m_max_tlp_bytes; int m_toflx_dmaid; int m_trickle_dmaid; uint32_t m_status_leds; int m_busy; std::map> m_enabled_elinks; uint64_t get_broadcast_enable_gen(u_int channel) override; bool elink_has_stream_id(u_int channel, u_int egroup, u_int epath) override; public: FileDevice(ConfigFile& cfg, unsigned device); explicit FileDevice(unsigned dev_no); int open_device(u_int lock_mask) override; void close_device() override {return;} bool is_primary() override {return not (m_device_number % 2);} unsigned int get_card_endpoints() override {return 2;} unsigned int get_card_model() override {return 712;} u_int get_regmap_version() override {return m_regmap;} u_int get_number_of_channels() override {return m_channels;} bool get_wide_mode() override {return m_wide_mode;} u_int get_block_size() override {return m_block_size;} u_int get_trailer_size() override {return m_trailer_size;} flx_fromhost_format get_fromhost_data_format() override {return m_fromHostDataFormat;} flx_tohost_format get_tohost_data_format() override {return m_toHostDataFormat;} int get_fromhost_dmaid() override {return m_toflx_dmaid;} int get_trickle_dmaid() override {return m_trickle_dmaid;} int dma_max_tlp_bytes() override {return m_max_tlp_bytes;} //Used for felix-register tests void set_register(const char *key, uint64_t value) override; uint64_t get_register(const char *key) override; bool check_register(const char *key) override {return true;} //Interrupts void cancel_irq(int i) override {return;} void irq_wait(int i) override {return;} void irq_enable(int i) override {return;} void irq_disable(int i) override {return;} //Elinks std::vector read_enabled_elinks(int dmaid) override; void add_enabled_elink(Elink e, int dmaid); //DMA operations bool dma_enabled(int dmaid) override; void dma_to_host(DmaBuffer* buf, int dmaid) override; //start_circular_dma // Remaining functions not implemented, // buffer to be managed by DmaBufferReader/Writer void dma_from_host(DmaBuffer* buf, int dmaid) override {return;}; void dma_from_host_trickle(DmaBuffer* buf, int dmaid, size_t config_size) override {return;}; void dma_set_oneshot(DmaBuffer* buf, int dmaid, size_t config_size) override {return;}; uint64_t dma_get_fw_ptr(int dmaid) override {return 0;} //dma_get_current_address uint64_t dma_get_sw_ptr(int dmaid) override {return 0;} void dma_set_sw_ptr(int dmaid, uint64_t p_phys) override {return;}//dma_set_ptr bool dma_cmp_even_bits(int dmaid) override {return false;} void dma_stop(unsigned int dmaid) override {return;} //HW monitor monitoring_data_t hw_get_monitoring_data( unsigned int mon_mask = 0xFFF ) override; }; #endif /* DEVICE_H_ */