quic/qbox
Loading...
Searching...
No Matches
xgmac.h
1/*
2 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
3 * Author: GreenSocs 2022
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#pragma once
9
10#include "tlm.h"
11#include "tlm_utils/simple_initiator_socket.h"
12#include "tlm_utils/simple_target_socket.h"
13#include <systemc>
14
15#include <backends/net-backend.h>
16#include "macs/dma.h"
17#include "macs/mac.h"
18
19#include <deque>
20#include <tlm_sockets_buswidth.h>
21
22struct XGmacDesc {
23 uint32_t ctl_stat;
24 uint16_t buffer1_size;
25 uint16_t buffer2_size;
26 uint64_t buffer1_addr;
27 uint64_t buffer2_addr;
28 uint32_t ext_stat;
29 uint32_t res[3];
30};
31
32struct RxTxStats {
33 uint64_t rx_bytes;
34 uint64_t tx_bytes;
35
36 uint64_t rx;
37 uint64_t rx_bcast;
38 uint64_t rx_mcast;
39};
40
41#define R_MAX 0x400
42
43class xgmac : public sc_core::sc_module
44{
45public:
46 sc_core::sc_out<bool> sbd_irq, pmt_irq, mci_irq;
47 tlm_utils::simple_target_socket<xgmac, DEFAULT_TLM_BUSWIDTH> socket;
48
49 dma m_dma;
50
51protected:
52 RxTxStats m_stats;
53 uint32_t m_regs[R_MAX];
54
55 bool eth_can_rx() const;
56 ssize_t eth_rx(const uint8_t* buf, size_t size);
57 void xgmac_read_desc(XGmacDesc* d, int rx);
58 void xgmac_write_desc(XGmacDesc* d, int rx);
59 void xgmac_enet_send();
60 void enet_update_irq();
61 void enet_update_irq_sysc();
62 uint64_t enet_read(uint64_t addr, unsigned size);
63 void enet_write(uint64_t addr, uint64_t value, unsigned size);
64
65private:
66 Payload m_tx_frame;
67
68 MACAddress m_mac;
69
70 sc_core::sc_event update_event;
71
72public:
73 xgmac(sc_core::sc_module_name name);
74 virtual ~xgmac();
75
76 NetworkBackend* m_backend;
77 void set_backend(NetworkBackend* backend)
78 {
79 m_backend = backend;
80 m_backend->register_receive(this, eth_rx_sc, eth_can_rx_sc);
81 }
82
83 static void eth_rx_sc(void* opaque, Payload& frame) { ((xgmac*)opaque)->eth_rx(frame.data(), frame.size()); }
84
85 static int eth_can_rx_sc(void* opaque) { return ((xgmac*)opaque)->eth_can_rx(); }
86
87 void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay)
88 {
89 unsigned char* ptr = trans.get_data_ptr();
90 uint64_t addr = trans.get_address();
91
92 trans.set_dmi_allowed(false);
93 trans.set_response_status(tlm::TLM_OK_RESPONSE);
94
95 switch (trans.get_command()) {
96 case tlm::TLM_WRITE_COMMAND:
97 enet_write(addr, *(uint32_t*)ptr, 4);
98 break;
99 case tlm::TLM_READ_COMMAND:
100 *(uint32_t*)ptr = enet_read(addr, 4);
101 break;
102 default:
103 break;
104 }
105 }
106
107 virtual void payload_recv(Payload& frame);
108};
109
110extern "C" void module_register();
Definition mac.h:18
Definition net-backend.h:13
Definition payload.h:15
Definition target.h:160
Definition dma.h:13
Definition xgmac.h:44
Definition xgmac.h:32
Definition xgmac.h:22