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 */ 2222f90bcbSBeniamino Galvani #ifndef AW_EMAC_H 2322f90bcbSBeniamino Galvani #define AW_EMAC_H 2422f90bcbSBeniamino Galvani 2522f90bcbSBeniamino Galvani #include "net/net.h" 2622f90bcbSBeniamino Galvani #include "qemu/fifo8.h" 27*3e230569SGreg Ungerer #include "hw/net/mii.h" 2822f90bcbSBeniamino Galvani 2922f90bcbSBeniamino Galvani #define TYPE_AW_EMAC "allwinner-emac" 3022f90bcbSBeniamino Galvani #define AW_EMAC(obj) OBJECT_CHECK(AwEmacState, (obj), TYPE_AW_EMAC) 3122f90bcbSBeniamino Galvani 3222f90bcbSBeniamino Galvani /* 3322f90bcbSBeniamino Galvani * Allwinner EMAC register list 3422f90bcbSBeniamino Galvani */ 3522f90bcbSBeniamino Galvani #define EMAC_CTL_REG 0x00 3622f90bcbSBeniamino Galvani 3722f90bcbSBeniamino Galvani #define EMAC_TX_MODE_REG 0x04 3822f90bcbSBeniamino Galvani #define EMAC_TX_FLOW_REG 0x08 3922f90bcbSBeniamino Galvani #define EMAC_TX_CTL0_REG 0x0C 4022f90bcbSBeniamino Galvani #define EMAC_TX_CTL1_REG 0x10 4122f90bcbSBeniamino Galvani #define EMAC_TX_INS_REG 0x14 4222f90bcbSBeniamino Galvani #define EMAC_TX_PL0_REG 0x18 4322f90bcbSBeniamino Galvani #define EMAC_TX_PL1_REG 0x1C 4422f90bcbSBeniamino Galvani #define EMAC_TX_STA_REG 0x20 4522f90bcbSBeniamino Galvani #define EMAC_TX_IO_DATA_REG 0x24 4622f90bcbSBeniamino Galvani #define EMAC_TX_IO_DATA1_REG 0x28 4722f90bcbSBeniamino Galvani #define EMAC_TX_TSVL0_REG 0x2C 4822f90bcbSBeniamino Galvani #define EMAC_TX_TSVH0_REG 0x30 4922f90bcbSBeniamino Galvani #define EMAC_TX_TSVL1_REG 0x34 5022f90bcbSBeniamino Galvani #define EMAC_TX_TSVH1_REG 0x38 5122f90bcbSBeniamino Galvani 5222f90bcbSBeniamino Galvani #define EMAC_RX_CTL_REG 0x3C 5322f90bcbSBeniamino Galvani #define EMAC_RX_HASH0_REG 0x40 5422f90bcbSBeniamino Galvani #define EMAC_RX_HASH1_REG 0x44 5522f90bcbSBeniamino Galvani #define EMAC_RX_STA_REG 0x48 5622f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_REG 0x4C 5722f90bcbSBeniamino Galvani #define EMAC_RX_FBC_REG 0x50 5822f90bcbSBeniamino Galvani 5922f90bcbSBeniamino Galvani #define EMAC_INT_CTL_REG 0x54 6022f90bcbSBeniamino Galvani #define EMAC_INT_STA_REG 0x58 6122f90bcbSBeniamino Galvani 6222f90bcbSBeniamino Galvani #define EMAC_MAC_CTL0_REG 0x5C 6322f90bcbSBeniamino Galvani #define EMAC_MAC_CTL1_REG 0x60 6422f90bcbSBeniamino Galvani #define EMAC_MAC_IPGT_REG 0x64 6522f90bcbSBeniamino Galvani #define EMAC_MAC_IPGR_REG 0x68 6622f90bcbSBeniamino Galvani #define EMAC_MAC_CLRT_REG 0x6C 6722f90bcbSBeniamino Galvani #define EMAC_MAC_MAXF_REG 0x70 6822f90bcbSBeniamino Galvani #define EMAC_MAC_SUPP_REG 0x74 6922f90bcbSBeniamino Galvani #define EMAC_MAC_TEST_REG 0x78 7022f90bcbSBeniamino Galvani #define EMAC_MAC_MCFG_REG 0x7C 7122f90bcbSBeniamino Galvani #define EMAC_MAC_MCMD_REG 0x80 7222f90bcbSBeniamino Galvani #define EMAC_MAC_MADR_REG 0x84 7322f90bcbSBeniamino Galvani #define EMAC_MAC_MWTD_REG 0x88 7422f90bcbSBeniamino Galvani #define EMAC_MAC_MRDD_REG 0x8C 7522f90bcbSBeniamino Galvani #define EMAC_MAC_MIND_REG 0x90 7622f90bcbSBeniamino Galvani #define EMAC_MAC_SSRR_REG 0x94 7722f90bcbSBeniamino Galvani #define EMAC_MAC_A0_REG 0x98 7822f90bcbSBeniamino Galvani #define EMAC_MAC_A1_REG 0x9C 7922f90bcbSBeniamino Galvani #define EMAC_MAC_A2_REG 0xA0 8022f90bcbSBeniamino Galvani 8122f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG0 0xA4 8222f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG0 0xA8 8322f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG1 0xAC 8422f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG1 0xB0 8522f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG2 0xB4 8622f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG2 0xB8 8722f90bcbSBeniamino Galvani #define EMAC_SAFX_L_REG3 0xBC 8822f90bcbSBeniamino Galvani #define EMAC_SAFX_H_REG3 0xC0 8922f90bcbSBeniamino Galvani 9022f90bcbSBeniamino Galvani /* CTL register fields */ 9122f90bcbSBeniamino Galvani #define EMAC_CTL_RESET (1 << 0) 9222f90bcbSBeniamino Galvani #define EMAC_CTL_TX_EN (1 << 1) 9322f90bcbSBeniamino Galvani #define EMAC_CTL_RX_EN (1 << 2) 9422f90bcbSBeniamino Galvani 9522f90bcbSBeniamino Galvani /* TX MODE register fields */ 9622f90bcbSBeniamino Galvani #define EMAC_TX_MODE_ABORTED_FRAME_EN (1 << 0) 9722f90bcbSBeniamino Galvani #define EMAC_TX_MODE_DMA_EN (1 << 1) 9822f90bcbSBeniamino Galvani 9922f90bcbSBeniamino Galvani /* RX CTL register fields */ 10022f90bcbSBeniamino Galvani #define EMAC_RX_CTL_AUTO_DRQ_EN (1 << 1) 10122f90bcbSBeniamino Galvani #define EMAC_RX_CTL_DMA_EN (1 << 2) 10222f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_ALL_EN (1 << 4) 10322f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_CTL_EN (1 << 5) 10422f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_CRC_ERR_EN (1 << 6) 10522f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_LEN_ERR_EN (1 << 7) 10622f90bcbSBeniamino Galvani #define EMAC_RX_CTL_PASS_LEN_OOR_EN (1 << 8) 10722f90bcbSBeniamino Galvani #define EMAC_RX_CTL_ACCEPT_UNICAST_EN (1 << 16) 10822f90bcbSBeniamino Galvani #define EMAC_RX_CTL_DA_FILTER_EN (1 << 17) 10922f90bcbSBeniamino Galvani #define EMAC_RX_CTL_ACCEPT_MULTICAST_EN (1 << 20) 11022f90bcbSBeniamino Galvani #define EMAC_RX_CTL_HASH_FILTER_EN (1 << 21) 11122f90bcbSBeniamino Galvani #define EMAC_RX_CTL_ACCEPT_BROADCAST_EN (1 << 22) 11222f90bcbSBeniamino Galvani #define EMAC_RX_CTL_SA_FILTER_EN (1 << 24) 11322f90bcbSBeniamino Galvani #define EMAC_RX_CTL_SA_FILTER_INVERT_EN (1 << 25) 11422f90bcbSBeniamino Galvani 11522f90bcbSBeniamino Galvani /* RX IO DATA register fields */ 11622f90bcbSBeniamino Galvani #define EMAC_RX_HEADER(len, status) (((len) & 0xffff) | ((status) << 16)) 11722f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_STATUS_CRC_ERR (1 << 4) 11822f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_STATUS_LEN_ERR (3 << 5) 11922f90bcbSBeniamino Galvani #define EMAC_RX_IO_DATA_STATUS_OK (1 << 7) 12022f90bcbSBeniamino Galvani #define EMAC_UNDOCUMENTED_MAGIC 0x0143414d /* header for RX frames */ 12122f90bcbSBeniamino Galvani 12222f90bcbSBeniamino Galvani /* INT CTL and INT STA registers fields */ 12322f90bcbSBeniamino Galvani #define EMAC_INT_TX_CHAN(x) (1 << (x)) 12422f90bcbSBeniamino Galvani #define EMAC_INT_RX (1 << 8) 12522f90bcbSBeniamino Galvani 12622f90bcbSBeniamino Galvani /* Due to lack of specifications, size of fifos is chosen arbitrarily */ 12722f90bcbSBeniamino Galvani #define TX_FIFO_SIZE (4 * 1024) 12822f90bcbSBeniamino Galvani #define RX_FIFO_SIZE (32 * 1024) 12922f90bcbSBeniamino Galvani 13022f90bcbSBeniamino Galvani #define NUM_TX_FIFOS 2 13122f90bcbSBeniamino Galvani #define RX_HDR_SIZE 8 13222f90bcbSBeniamino Galvani #define CRC_SIZE 4 13322f90bcbSBeniamino Galvani 13422f90bcbSBeniamino Galvani #define PHY_REG_SHIFT 0 13522f90bcbSBeniamino Galvani #define PHY_ADDR_SHIFT 8 13622f90bcbSBeniamino Galvani 13722f90bcbSBeniamino Galvani typedef struct RTL8201CPState { 13822f90bcbSBeniamino Galvani uint16_t bmcr; 13922f90bcbSBeniamino Galvani uint16_t bmsr; 14022f90bcbSBeniamino Galvani uint16_t anar; 14122f90bcbSBeniamino Galvani uint16_t anlpar; 14222f90bcbSBeniamino Galvani } RTL8201CPState; 14322f90bcbSBeniamino Galvani 14422f90bcbSBeniamino Galvani typedef struct AwEmacState { 14522f90bcbSBeniamino Galvani /*< private >*/ 14622f90bcbSBeniamino Galvani SysBusDevice parent_obj; 14722f90bcbSBeniamino Galvani /*< public >*/ 14822f90bcbSBeniamino Galvani 14922f90bcbSBeniamino Galvani MemoryRegion iomem; 15022f90bcbSBeniamino Galvani qemu_irq irq; 15122f90bcbSBeniamino Galvani NICState *nic; 15222f90bcbSBeniamino Galvani NICConf conf; 15322f90bcbSBeniamino Galvani RTL8201CPState mii; 15422f90bcbSBeniamino Galvani uint8_t phy_addr; 15522f90bcbSBeniamino Galvani 15622f90bcbSBeniamino Galvani uint32_t ctl; 15722f90bcbSBeniamino Galvani uint32_t tx_mode; 15822f90bcbSBeniamino Galvani uint32_t rx_ctl; 15922f90bcbSBeniamino Galvani uint32_t int_ctl; 16022f90bcbSBeniamino Galvani uint32_t int_sta; 16122f90bcbSBeniamino Galvani uint32_t phy_target; 16222f90bcbSBeniamino Galvani 16322f90bcbSBeniamino Galvani Fifo8 rx_fifo; 16422f90bcbSBeniamino Galvani uint32_t rx_num_packets; 16522f90bcbSBeniamino Galvani uint32_t rx_packet_size; 16622f90bcbSBeniamino Galvani uint32_t rx_packet_pos; 16722f90bcbSBeniamino Galvani 16822f90bcbSBeniamino Galvani Fifo8 tx_fifo[NUM_TX_FIFOS]; 16922f90bcbSBeniamino Galvani uint32_t tx_length[NUM_TX_FIFOS]; 17022f90bcbSBeniamino Galvani uint32_t tx_channel; 17122f90bcbSBeniamino Galvani } AwEmacState; 17222f90bcbSBeniamino Galvani 17322f90bcbSBeniamino Galvani #endif 174