122f90bcbSBeniamino Galvani /* 222f90bcbSBeniamino Galvani * Emulation of Allwinner EMAC Fast Ethernet controller and 322f90bcbSBeniamino Galvani * Realtek RTL8201CP PHY 422f90bcbSBeniamino Galvani * 522f90bcbSBeniamino Galvani * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com> 622f90bcbSBeniamino Galvani * 722f90bcbSBeniamino Galvani * Allwinner EMAC register definitions from Linux kernel are: 822f90bcbSBeniamino Galvani * Copyright 2012 Stefan Roese <sr@denx.de> 922f90bcbSBeniamino Galvani * Copyright 2013 Maxime Ripard <maxime.ripard@free-electrons.com> 1022f90bcbSBeniamino Galvani * Copyright 1997 Sten Wang 1122f90bcbSBeniamino Galvani * 1222f90bcbSBeniamino Galvani * This program is free software; you can redistribute it and/or 1322f90bcbSBeniamino Galvani * modify it under the terms of the GNU General Public License 1422f90bcbSBeniamino Galvani * version 2 as published by the Free Software Foundation. 1522f90bcbSBeniamino Galvani * 1622f90bcbSBeniamino Galvani * This program is distributed in the hope that it will be useful, 1722f90bcbSBeniamino Galvani * but WITHOUT ANY WARRANTY; without even the implied warranty of 1822f90bcbSBeniamino Galvani * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1922f90bcbSBeniamino Galvani * GNU General Public License for more details. 2022f90bcbSBeniamino Galvani * 2122f90bcbSBeniamino Galvani */ 22121d0712SMarkus Armbruster 23121d0712SMarkus Armbruster #ifndef ALLWINNER_EMAC_H 24121d0712SMarkus Armbruster #define ALLWINNER_EMAC_H 2522f90bcbSBeniamino Galvani 26872a2b7cSPhilippe Mathieu-Daudé #include "qemu/units.h" 2722f90bcbSBeniamino Galvani #include "net/net.h" 2822f90bcbSBeniamino Galvani #include "qemu/fifo8.h" 293e230569SGreg Ungerer #include "hw/net/mii.h" 30ec150c7eSMarkus Armbruster #include "hw/sysbus.h" 31db1015e9SEduardo Habkost #include "qom/object.h" 3222f90bcbSBeniamino Galvani 3322f90bcbSBeniamino Galvani #define TYPE_AW_EMAC "allwinner-emac" 34*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(AwEmacState, AW_EMAC) 3522f90bcbSBeniamino Galvani 3622f90bcbSBeniamino Galvani /* 3722f90bcbSBeniamino Galvani * Allwinner EMAC register list 3822f90bcbSBeniamino Galvani */ 3922f90bcbSBeniamino Galvani #define EMAC_CTL_REG 0x00 4022f90bcbSBeniamino Galvani 4122f90bcbSBeniamino Galvani #define EMAC_TX_MODE_REG 0x04 4222f90bcbSBeniamino Galvani #define EMAC_TX_FLOW_REG 0x08 4322f90bcbSBeniamino Galvani #define EMAC_TX_CTL0_REG 0x0C 4422f90bcbSBeniamino Galvani #define EMAC_TX_CTL1_REG 0x10 4522f90bcbSBeniamino Galvani #define EMAC_TX_INS_REG 0x14 4622f90bcbSBeniamino Galvani #define EMAC_TX_PL0_REG 0x18 4722f90bcbSBeniamino Galvani #define EMAC_TX_PL1_REG 0x1C 4822f90bcbSBeniamino Galvani #define EMAC_TX_STA_REG 0x20 4922f90bcbSBeniamino Galvani #define EMAC_TX_IO_DATA_REG 0x24 5022f90bcbSBeniamino Galvani #define EMAC_TX_IO_DATA1_REG 0x28 5122f90bcbSBeniamino Galvani #define EMAC_TX_TSVL0_REG 0x2C 5222f90bcbSBeniamino Galvani #define EMAC_TX_TSVH0_REG 0x30 5322f90bcbSBeniamino Galvani #define EMAC_TX_TSVL1_REG 0x34 5422f90bcbSBeniamino Galvani #define EMAC_TX_TSVH1_REG 0x38 5522f90bcbSBeniamino Galvani 5622f90bcbSBeniamino Galvani #define EMAC_RX_CTL_REG 0x3C 5722f90bcbSBeniamino Galvani #define EMAC_RX_HASH0_REG 0x40 5822f90bcbSBeniamino Galvani #define EMAC_RX_HASH1_REG 0x44 5922f90bcbSBeniamino Galvani #define EMAC_RX_STA_REG 0x48 6022f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_REG 0x4C 6122f90bcbSBeniamino Galvani #define EMAC_RX_FBC_REG 0x50 6222f90bcbSBeniamino Galvani 6322f90bcbSBeniamino Galvani #define EMAC_INT_CTL_REG 0x54 6422f90bcbSBeniamino Galvani #define EMAC_INT_STA_REG 0x58 6522f90bcbSBeniamino Galvani 6622f90bcbSBeniamino Galvani #define EMAC_MAC_CTL0_REG 0x5C 6722f90bcbSBeniamino Galvani #define EMAC_MAC_CTL1_REG 0x60 6822f90bcbSBeniamino Galvani #define EMAC_MAC_IPGT_REG 0x64 6922f90bcbSBeniamino Galvani #define EMAC_MAC_IPGR_REG 0x68 7022f90bcbSBeniamino Galvani #define EMAC_MAC_CLRT_REG 0x6C 7122f90bcbSBeniamino Galvani #define EMAC_MAC_MAXF_REG 0x70 7222f90bcbSBeniamino Galvani #define EMAC_MAC_SUPP_REG 0x74 7322f90bcbSBeniamino Galvani #define EMAC_MAC_TEST_REG 0x78 7422f90bcbSBeniamino Galvani #define EMAC_MAC_MCFG_REG 0x7C 7522f90bcbSBeniamino Galvani #define EMAC_MAC_MCMD_REG 0x80 7622f90bcbSBeniamino Galvani #define EMAC_MAC_MADR_REG 0x84 7722f90bcbSBeniamino Galvani #define EMAC_MAC_MWTD_REG 0x88 7822f90bcbSBeniamino Galvani #define EMAC_MAC_MRDD_REG 0x8C 7922f90bcbSBeniamino Galvani #define EMAC_MAC_MIND_REG 0x90 8022f90bcbSBeniamino Galvani #define EMAC_MAC_SSRR_REG 0x94 8122f90bcbSBeniamino Galvani #define EMAC_MAC_A0_REG 0x98 8222f90bcbSBeniamino Galvani #define EMAC_MAC_A1_REG 0x9C 8322f90bcbSBeniamino Galvani #define EMAC_MAC_A2_REG 0xA0 8422f90bcbSBeniamino Galvani 8522f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG0 0xA4 8622f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG0 0xA8 8722f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG1 0xAC 8822f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG1 0xB0 8922f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG2 0xB4 9022f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG2 0xB8 9122f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG3 0xBC 9222f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG3 0xC0 9322f90bcbSBeniamino Galvani 9422f90bcbSBeniamino Galvani /* CTL register fields */ 9522f90bcbSBeniamino Galvani #define EMAC_CTL_RESET (1 << 0) 9622f90bcbSBeniamino Galvani #define EMAC_CTL_TX_EN (1 << 1) 9722f90bcbSBeniamino Galvani #define EMAC_CTL_RX_EN (1 << 2) 9822f90bcbSBeniamino Galvani 9922f90bcbSBeniamino Galvani /* TX MODE register fields */ 10022f90bcbSBeniamino Galvani #define EMAC_TX_MODE_ABORTED_FRAME_EN (1 << 0) 10122f90bcbSBeniamino Galvani #define EMAC_TX_MODE_DMA_EN (1 << 1) 10222f90bcbSBeniamino Galvani 10322f90bcbSBeniamino Galvani /* RX CTL register fields */ 10422f90bcbSBeniamino Galvani #define EMAC_RX_CTL_AUTO_DRQ_EN (1 << 1) 10522f90bcbSBeniamino Galvani #define EMAC_RX_CTL_DMA_EN (1 << 2) 10622f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_ALL_EN (1 << 4) 10722f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_CTL_EN (1 << 5) 10822f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_CRC_ERR_EN (1 << 6) 10922f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_LEN_ERR_EN (1 << 7) 11022f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_LEN_OOR_EN (1 << 8) 11122f90bcbSBeniamino Galvani #define EMAC_RX_CTL_ACCEPT_UNICAST_EN (1 << 16) 11222f90bcbSBeniamino Galvani #define EMAC_RX_CTL_DA_FILTER_EN (1 << 17) 11322f90bcbSBeniamino Galvani #define EMAC_RX_CTL_ACCEPT_MULTICAST_EN (1 << 20) 11422f90bcbSBeniamino Galvani #define EMAC_RX_CTL_HASH_FILTER_EN (1 << 21) 11522f90bcbSBeniamino Galvani #define EMAC_RX_CTL_ACCEPT_BROADCAST_EN (1 << 22) 11622f90bcbSBeniamino Galvani #define EMAC_RX_CTL_SA_FILTER_EN (1 << 24) 11722f90bcbSBeniamino Galvani #define EMAC_RX_CTL_SA_FILTER_INVERT_EN (1 << 25) 11822f90bcbSBeniamino Galvani 11922f90bcbSBeniamino Galvani /* RX IO DATA register fields */ 12022f90bcbSBeniamino Galvani #define EMAC_RX_HEADER(len, status) (((len) & 0xffff) | ((status) << 16)) 12122f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_STATUS_CRC_ERR (1 << 4) 12222f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_STATUS_LEN_ERR (3 << 5) 12322f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_STATUS_OK (1 << 7) 12422f90bcbSBeniamino Galvani #define EMAC_UNDOCUMENTED_MAGIC 0x0143414d /* header for RX frames */ 12522f90bcbSBeniamino Galvani 12622f90bcbSBeniamino Galvani /* INT CTL and INT STA registers fields */ 12722f90bcbSBeniamino Galvani #define EMAC_INT_TX_CHAN(x) (1 << (x)) 12822f90bcbSBeniamino Galvani #define EMAC_INT_RX (1 << 8) 12922f90bcbSBeniamino Galvani 13022f90bcbSBeniamino Galvani /* Due to lack of specifications, size of fifos is chosen arbitrarily */ 131872a2b7cSPhilippe Mathieu-Daudé #define TX_FIFO_SIZE (4 * KiB) 132872a2b7cSPhilippe Mathieu-Daudé #define RX_FIFO_SIZE (32 * KiB) 13322f90bcbSBeniamino Galvani 13422f90bcbSBeniamino Galvani #define NUM_TX_FIFOS 2 13522f90bcbSBeniamino Galvani #define RX_HDR_SIZE 8 13622f90bcbSBeniamino Galvani #define CRC_SIZE 4 13722f90bcbSBeniamino Galvani 13822f90bcbSBeniamino Galvani #define PHY_REG_SHIFT 0 13922f90bcbSBeniamino Galvani #define PHY_ADDR_SHIFT 8 14022f90bcbSBeniamino Galvani 14122f90bcbSBeniamino Galvani typedef struct RTL8201CPState { 14222f90bcbSBeniamino Galvani uint16_t bmcr; 14322f90bcbSBeniamino Galvani uint16_t bmsr; 14422f90bcbSBeniamino Galvani uint16_t anar; 14522f90bcbSBeniamino Galvani uint16_t anlpar; 14622f90bcbSBeniamino Galvani } RTL8201CPState; 14722f90bcbSBeniamino Galvani 148db1015e9SEduardo Habkost struct AwEmacState { 14922f90bcbSBeniamino Galvani /*< private >*/ 15022f90bcbSBeniamino Galvani SysBusDevice parent_obj; 15122f90bcbSBeniamino Galvani /*< public >*/ 15222f90bcbSBeniamino Galvani 15322f90bcbSBeniamino Galvani MemoryRegion iomem; 15422f90bcbSBeniamino Galvani qemu_irq irq; 15522f90bcbSBeniamino Galvani NICState *nic; 15622f90bcbSBeniamino Galvani NICConf conf; 15722f90bcbSBeniamino Galvani RTL8201CPState mii; 15822f90bcbSBeniamino Galvani uint8_t phy_addr; 15922f90bcbSBeniamino Galvani 16022f90bcbSBeniamino Galvani uint32_t ctl; 16122f90bcbSBeniamino Galvani uint32_t tx_mode; 16222f90bcbSBeniamino Galvani uint32_t rx_ctl; 16322f90bcbSBeniamino Galvani uint32_t int_ctl; 16422f90bcbSBeniamino Galvani uint32_t int_sta; 16522f90bcbSBeniamino Galvani uint32_t phy_target; 16622f90bcbSBeniamino Galvani 16722f90bcbSBeniamino Galvani Fifo8 rx_fifo; 16822f90bcbSBeniamino Galvani uint32_t rx_num_packets; 16922f90bcbSBeniamino Galvani uint32_t rx_packet_size; 17022f90bcbSBeniamino Galvani uint32_t rx_packet_pos; 17122f90bcbSBeniamino Galvani 17222f90bcbSBeniamino Galvani Fifo8 tx_fifo[NUM_TX_FIFOS]; 17322f90bcbSBeniamino Galvani uint32_t tx_length[NUM_TX_FIFOS]; 17422f90bcbSBeniamino Galvani uint32_t tx_channel; 175db1015e9SEduardo Habkost }; 17622f90bcbSBeniamino Galvani 17722f90bcbSBeniamino Galvani #endif 178