1 /******************************************************************************
2  *
3  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4  * Analog Devices, Inc.),
5  * Copyright (C) 2023-2024 Analog Devices, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************************/
20 
21 #ifndef LIBRARIES_PERIPHDRIVERS_SOURCE_EMAC_EMAC_REVA_H_
22 #define LIBRARIES_PERIPHDRIVERS_SOURCE_EMAC_EMAC_REVA_H_
23 
24 /* **** Includes **** */
25 #include <stddef.h>
26 #include "emac.h"
27 #include "emac_reva_regs.h"
28 
29 /* **** Definitions **** */
30 #define MAX_SYS_EMAC_RX_BUFFER_SIZE 16384
31 #define MAX_SYS_EMAC_RX_RING_SIZE 128
32 #define MAX_SYS_EMAC_TX_RING_SIZE 16
33 #define EMAC_RX_BUFFER_SIZE 128
34 #define CONFIG_SYS_EMAC_TX_TIMEOUT 1000 /**! Transmission Timeout in Microseconds     */
35 #define CONFIG_SYS_EMAC_AUTONEG_TIMEOUT 500000 /**! Auto Negotiation Timeout in Microseconds */
36 
37 #define RXADDR_USED 0x00000001
38 #define RXADDR_WRAP 0x00000002
39 #define RXBUF_FRMLEN_MASK 0x00000fff
40 #define RXBUF_FRAME_START 0x00004000
41 #define RXBUF_FRAME_END 0x00008000
42 #define RXBUF_TYPEID_MATCH 0x00400000
43 #define RXBUF_ADDR4_MATCH 0x00800000
44 #define RXBUF_ADDR3_MATCH 0x01000000
45 #define RXBUF_ADDR2_MATCH 0x02000000
46 #define RXBUF_ADDR1_MATCH 0x04000000
47 #define RXBUF_BROADCAST 0x80000000
48 #define TXBUF_FRMLEN_MASK 0x000007ff
49 #define TXBUF_FRAME_END 0x00008000
50 #define TXBUF_NOCRC 0x00010000
51 #define TXBUF_EXHAUSTED 0x08000000
52 #define TXBUF_UNDERRUN 0x10000000
53 #define TXBUF_MAXRETRY 0x20000000
54 #define TXBUF_WRAP 0x40000000
55 #define TXBUF_USED 0x80000000
56 
57 /* Definitions for MII-Compatible Transceivers */
58 #define MII_BMCR 0x00 /**! Basic Mode Control Register    */
59 #define MII_BMSR 0x01 /**! Basic Mode Status Register     */
60 #define MII_PHYSID1 0x02 /**! PHYS ID 1                      */
61 #define MII_PHYSID2 0x03 /**! PHYS ID 2                      */
62 #define MII_ADVERTISE 0x04 /**! Advertisement Control Register */
63 #define MII_LPA 0x05 /**! Link Partner Ability Register  */
64 
65 /* Basic Mode Control Register */
66 #define BMCR_ANRESTART 0x0200 /**! Auto Negotiation Restart       */
67 #define BMCR_ANENABLE 0x1000 /**! Enable Auto Negotiation        */
68 
69 /* Basic Mode Status Register */
70 #define BMSR_LSTATUS 0x0004 /**! Link Status                    */
71 #define BMSR_ANEGCOMPLETE 0x0020 /**! Auto Negotiation Complete      */
72 
73 /* Advertisement Control Register */
74 #define ADVERTISE_CSMA 0x0001
75 #define ADVERTISE_10HALF 0x0020
76 #define ADVERTISE_10FULL 0x0040
77 #define ADVERTISE_100HALF 0x0080
78 #define ADVERTISE_100FULL 0x0100
79 #define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | ADVERTISE_CSMA)
80 #define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF | ADVERTISE_100FULL)
81 
82 /* Link Partner Ability Register */
83 #define LPA_10HALF 0x0020
84 #define LPA_10FULL 0x0040
85 #define LPA_100HALF 0x0080
86 #define LPA_100FULL 0x0100
87 #define LPA_100BASE4 0x0200
88 
89 /* Constants for CLK */
90 #define EMAC_CLK_DIV8 0
91 #define EMAC_CLK_DIV16 1
92 #define EMAC_CLK_DIV32 2
93 #define EMAC_CLK_DIV64 3
94 
95 /* **** Macros **** */
96 /* Bit Manipulation */
97 #define EMAC_BIT(reg, name) (1 << MXC_F_EMAC_REVA_##reg##_##name##_POS)
98 #define EMAC_BF(reg, name, value)                                                         \
99     (((value) & (MXC_F_EMAC_REVA_##reg##_##name >> MXC_F_EMAC_REVA_##reg##_##name##_POS)) \
100      << MXC_F_EMAC_REVA_##reg##_##name##_POS)
101 #define EMAC_BFEXT(reg, name, value)                     \
102     (((value) >> MXC_F_EMAC_REVA_##reg##_##name##_POS) & \
103      (MXC_F_EMAC_REVA_##reg##_##name >> MXC_F_EMAC_REVA_##reg##_##name##_POS))
104 
105 /* Register Access */
106 #define REG_READL(a) (*(volatile uint32_t *)(a))
107 #define REG_WRITEL(v, a) (*(volatile uint32_t *)(a) = (v))
108 #define EMAC_READL(port, reg) REG_READL(&(port)->regs->reg)
109 #define EMAC_WRITEL(port, reg, value) REG_WRITEL((value), &(port)->regs->reg)
110 
111 /* Misc */
112 #define barrier() asm volatile("" ::: "memory")
113 
114 /** @brief   Enumeration for the EMAC interrupt events */
115 typedef enum {
116     MXC_EMAC_REVA_EVENT_MPS =
117         MXC_F_EMAC_REVA_INT_EN_MPS, /**! Management Packet Sent Interrupt                   */
118     MXC_EMAC_REVA_EVENT_RXCMPL =
119         MXC_F_EMAC_REVA_INT_EN_RXCMPL, /**! Receive Complete Interrupt                         */
120     MXC_EMAC_REVA_EVENT_RXUBR =
121         MXC_F_EMAC_REVA_INT_EN_RXUBR, /**! RX Used Bit Read Interrupt                         */
122     MXC_EMAC_REVA_EVENT_TXUBR =
123         MXC_F_EMAC_REVA_INT_EN_TXUBR, /**! TX Used Bit Read Interrupt                         */
124     MXC_EMAC_REVA_EVENT_TXUR =
125         MXC_F_EMAC_REVA_INT_EN_TXUR, /**! Ethernet Transmit Underrun Interrupt               */
126     MXC_EMAC_REVA_EVENT_RLE =
127         MXC_F_EMAC_REVA_INT_EN_RLE, /**! Retry Limit Exceeded Interrupt                     */
128     MXC_EMAC_REVA_EVENT_TXERR =
129         MXC_F_EMAC_REVA_INT_EN_TXERR, /**! Transmit Buffers Exhausted In Mid-Frame Interrupt  */
130     MXC_EMAC_REVA_EVENT_TXCMPL =
131         MXC_F_EMAC_REVA_INT_EN_TXCMPL, /**! Transmit Complete Interrupt                        */
132     MXC_EMAC_REVA_EVENT_LC =
133         MXC_F_EMAC_REVA_INT_EN_LC, /**! Link Change Interrupt                              */
134     MXC_EMAC_REVA_EVENT_RXOR =
135         MXC_F_EMAC_REVA_INT_EN_RXOR, /**! Receive Overrun Interrupt                          */
136     MXC_EMAC_REVA_EVENT_HRESPNO =
137         MXC_F_EMAC_REVA_INT_EN_HRESPNO, /**! HRESP Not OK Interrupt                             */
138     MXC_EMAC_REVA_EVENT_PPR =
139         MXC_F_EMAC_REVA_INT_EN_PPR, /**! Pause Packet Received Interrupt                    */
140     MXC_EMAC_REVA_EVENT_PTZ =
141         MXC_F_EMAC_REVA_INT_EN_PTZ /**! Pause Time Zero Interrupt                          */
142 } mxc_emac_reva_events_t;
143 
144 /* **** Structures **** */
145 
146 /**
147  * @brief   The information needed for an EMAC buffer descriptor
148  *
149  */
150 typedef struct {
151     unsigned int addr;
152     unsigned int ctrl;
153 } mxc_emac_reva_dma_desc_t;
154 
155 /**
156  * @brief   The information needed by the EMAC driver to operate
157  *
158  */
159 typedef struct {
160     mxc_emac_reva_regs_t *regs;
161     unsigned int rx_tail;
162     unsigned int tx_head;
163     unsigned int tx_tail;
164     void *rx_buffer;
165     void *tx_buffer;
166     mxc_emac_reva_dma_desc_t *rx_ring;
167     mxc_emac_reva_dma_desc_t *tx_ring;
168     unsigned int rx_buffer_dma;
169     unsigned int rx_ring_dma;
170     unsigned int tx_ring_dma;
171     uint16_t phy_addr;
172 
173     unsigned int first_init;
174     unsigned int rx_buffer_size;
175     unsigned int rx_ring_size;
176     unsigned int tx_ring_size;
177     mxc_emac_delay_func_t delay_us;
178     mxc_emac_cb_funcs_tbl_t cb_funcs;
179 } mxc_emac_reva_device_t;
180 
181 /**
182  * @brief   The basic configuration information to set up EMAC module
183  *
184  */
185 typedef struct {
186     unsigned char *rx_buff;
187     unsigned char *rx_ring_buff;
188     unsigned char *tx_ring_buff;
189     unsigned int rx_buff_size;
190     unsigned int rx_ring_buff_size;
191     unsigned int tx_ring_buff_size;
192     uint16_t phy_addr;
193     unsigned int interrupt_mode;
194     unsigned int interrupt_events;
195     mxc_emac_delay_func_t delay_us;
196     mxc_emac_cb_funcs_tbl_t conf_cb_funcs;
197 } mxc_emac_reva_config_t;
198 
199 /* **** Function Prototypes **** */
200 /* ************************************************************************* */
201 /* Control/Configuration Functions                                           */
202 /* ************************************************************************* */
203 int MXC_EMAC_RevA_Init(mxc_emac_reva_config_t *config);
204 int MXC_EMAC_RevA_SetConfiguration(mxc_emac_reva_config_t *config);
205 int MXC_EMAC_RevA_SetHwAddr(unsigned char *enetaddr);
206 int MXC_EMAC_RevA_EnableInterruptEvents(unsigned int events);
207 int MXC_EMAC_RevA_DisableInterruptEvents(unsigned int events);
208 
209 /* ************************************************************************* */
210 /* Low-Level Functions                                                       */
211 /* ************************************************************************* */
212 int MXC_EMAC_RevA_Start(void);
213 int MXC_EMAC_RevA_Stop(void);
214 int MXC_EMAC_RevA_ReadLinkStatus(void);
215 
216 /* ************************************************************************* */
217 /* Transaction-Level Functions                                               */
218 /* ************************************************************************* */
219 int MXC_EMAC_RevA_SendSync(const void *packet, unsigned int length);
220 int MXC_EMAC_RevA_SendAsync(const void *packet, unsigned int length);
221 int MXC_EMAC_RevA_Recv(void *rx_buff, unsigned int max_len);
222 void MXC_EMAC_RevA_IrqHandler(void);
223 
224 #endif // LIBRARIES_PERIPHDRIVERS_SOURCE_EMAC_EMAC_REVA_H_
225