Module Name: src Committed By: nisimura Date: Thu Dec 16 11:32:23 UTC 2021
Modified Files: src/sys/arch/arm/sociox: if_scx.c Log Message: improve SC2A11 hardware register description. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/arch/arm/sociox/if_scx.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/sociox/if_scx.c diff -u src/sys/arch/arm/sociox/if_scx.c:1.25 src/sys/arch/arm/sociox/if_scx.c:1.26 --- src/sys/arch/arm/sociox/if_scx.c:1.25 Mon Aug 2 12:56:22 2021 +++ src/sys/arch/arm/sociox/if_scx.c Thu Dec 16 11:32:22 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if_scx.c,v 1.25 2021/08/02 12:56:22 andvar Exp $ */ +/* $NetBSD: if_scx.c,v 1.26 2021/12/16 11:32:22 nisimura Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -46,7 +46,7 @@ #define NOT_MP_SAFE 0 #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.25 2021/08/02 12:56:22 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.26 2021/12/16 11:32:22 nisimura Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -73,7 +73,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1 #include <dev/acpi/acpivar.h> #include <dev/acpi/acpi_intr.h> -/* Socionext SC2A11 descriptor format */ +/* SC2A11 GbE 64-bit paddr descriptor */ struct tdes { uint32_t t0, t1, t2, t3; }; @@ -84,103 +84,131 @@ struct rdes { #define T0_OWN (1U<<31) /* desc is ready to Tx */ #define T0_EOD (1U<<30) /* end of descriptor array */ -#define T0_DRID (24) /* 29:24 D-RID */ -#define T0_PT (1U<<21) /* 23:21 PT */ -#define T0_TRID (16) /* 20:16 T-RID */ +#define T0_DRID (24) /* 29:24 desc ring id */ +#define T0_PT (1U<<21) /* 23:21 "pass-through" */ +#define T0_TDRID (16) /* 20:16 target desc ring id: GMAC=15 */ #define T0_FS (1U<<9) /* first segment of frame */ #define T0_LS (1U<<8) /* last segment of frame */ #define T0_CSUM (1U<<7) /* enable check sum offload */ -#define T0_SGOL (1U<<6) /* enable TCP segment offload */ -#define T0_TRS (1U<<4) /* 5:4 TRS */ -#define T0_IOC (0) /* XXX TBD interrupt when completed */ -/* T1 segment address 63:32 */ -/* T2 segment address 31:0 */ -/* T3 31:16 TCP segment length, 15:0 segment length to transmit */ +#define T0_TSO (1U<<6) /* enable TCP segment offload */ +#define T0_TRS (1U<<4) /* 5:4 "TRS" */ +/* T1 frame segment address 63:32 */ +/* T2 frame segment address 31:0 */ +/* T3 31:16 TCP segment length, 15:0 frame segment length to transmit */ #define R0_OWN (1U<<31) /* desc is empty */ #define R0_EOD (1U<<30) /* end of descriptor array */ -#define R0_SRID (24) /* 29:24 S-RID */ -#define R0_FR (1U<<23) /* FR */ +#define R0_SDRID (24) /* 29:24 source desc ring id */ +#define R0_FR (1U<<23) /* found fragmented */ #define R0_ER (1U<<21) /* Rx error indication */ #define R0_ERR (3U<<16) /* 18:16 receive error code */ -#define R0_TDRID (14) /* 15:14 TD-RID */ +#define R0_TDRID (12) /* 15:12 target desc ring id */ #define R0_FS (1U<<9) /* first segment of frame */ #define R0_LS (1U<<8) /* last segment of frame */ #define R0_CSUM (3U<<6) /* 7:6 checksum status */ -#define R0_CERR (2U<<6) /* 0 (undone), 1 (found ok), 2 (bad) */ +#define R0_CERR (2U<<6) /* 0: undone, 1: found ok, 2: bad */ /* R1 frame address 63:32 */ /* R2 frame address 31:0 */ /* R3 31:16 received frame length, 15:0 buffer length to receive */ /* - * SC2A11 NetSec registers. 0x100 - 1204 + * SC2A11 registers. 0x100 - 1204 */ #define SWRESET 0x104 +#define SRST_RUN (1U<<31) /* instruct start, 0 to stop */ #define COMINIT 0x120 +#define INIT_DB (1U<<2) /* ???; self clear when done */ +#define INIT_CLS (1U<<1) /* ???; self clear when done */ +#define PKTCTRL 0x140 /* pkt engine control */ +#define MODENRM (1U<<28) /* change mode to normal */ +#define ENJUMBO (1U<<27) /* allow jumbo frame */ +#define RPTCSUMERR (1U<<3) /* log Rx checksum error */ +#define RPTHDCOMP (1U<<2) /* log HD imcomplete condition */ +#define RPTHDERR (1U<<1) /* log HD error */ +#define DROPNOMATCH (1U<<0) /* drop no match frames */ #define xINTSR 0x200 /* aggregated interrupt status report */ #define IRQ_RX (1U<<1) /* top level Rx interrupt */ #define IRQ_TX (1U<<0) /* top level Rx interrupt */ +#define IRQ_UCODE (1U<<20) /* ucode load completed */ #define xINTAEN 0x204 /* INT_A enable */ -#define xINTA_SET 0x234 /* bit to set */ -#define xINTA_CLR 0x238 /* bit to clr */ +#define xINTAE_SET 0x234 /* bit to set */ +#define xINTAE_CLR 0x238 /* bit to clr */ #define xINTBEN 0x23c /* INT_B enable */ -#define xINTB_SET 0x240 /* bit to set */ -#define xINTB_CLR 0x244 /* bit to clr */ -/* 0x00c - 048 */ /* pkt,tls,s0,s1 SR/IE/SET/CLR */ -#define TXISR 0x400 -#define TXIEN 0x404 -#define TXI_SET 0x428 -#define TXI_CLR 0x42c -#define TXI_NTOWNR (1U<<17) -#define TXI_TR_ERR (1U<<16) -#define TXI_TXDONE (1U<<15) -#define TXI_TMREXP (1U<<14) -#define RXISR 0x440 -#define RXIEN 0x444 -#define RXI_SET 0x468 -#define RXI_CLR 0x46c -#define RXI_RC_ERR (1U<<16) -#define RXI_PKTCNT (1U<<15) -#define RXI_TMREXP (1U<<14) -#define TXTIMER 0x41c -#define RXTIMER 0x45c -#define TXCOUNT 0x410 -#define RXCOUNT 0x454 -#define H2MENG 0x210 /* DMAC host2media ucode port */ -#define M2HENG 0x21c /* DMAC media2host ucode port */ -#define PKTENG 0x0d0 /* packet engine ucode port */ +#define xINTBE_SET 0x240 /* bit to set */ +#define xINTBE_CLR 0x244 /* bit to clr */ +#define TXISR 0x400 /* transmit status */ +#define TXIEN 0x404 /* tx interrupt enable */ +#define TXIE_SET 0x428 /* bit to set */ +#define TXIE_CLR 0x42c /* bit to clr */ +#define TXI_NTOWNR (1U<<17) /* ready desc got empty */ +#define TXI_TR_ERR (1U<<16) /* tx error */ +#define TXI_TXDONE (1U<<15) /* tx completed */ +#define TXI_TMREXP (1U<<14) /* coalesce timer expired */ +#define RXISR 0x440 /* receipt status */ +#define RXIEN 0x444 /* rx interrupt enable */ +#define RXIE_SET 0x468 /* bit to set */ +#define RXIE_CLR 0x46c /* bit to clr */ +#define RXI_RC_ERR (1U<<16) /* rx error */ +#define RXI_PKTCNT (1U<<15) /* rx counter has new value report */ +#define RXI_TMREXP (1U<<14) /* coalesce timer expired */ +#define TDBA_LO 0x408 /* tdes array base addr 31:0 */ +#define TDBA_HI 0x434 /* tdes array base addr 63:32 */ +#define RDBA_LO 0x448 /* rdes array base addr 31:0 */ +#define RDBA_HI 0x474 /* rdes array base addr 63:32 */ +/* 13 pairs of special purpose desc array address registers exit */ +#define TXCONF 0x430 +#define RXCONF 0x470 +#define DESCNF_UP (1U<<31) /* up-and-running */ +#define DESCNF_CHRST (1U<<30) /* channel reset */ +#define DESCNF_TMR (1U<<4) /* coalesce timer mode select */ +#define DESCNF_LE (1) /* little endian desc format */ +#define TXCOLMAX 0x410 /* tx intr coalesce upper bound */ +#define RXCOLMAX 0x454 /* rx intr coalesce upper bound */ +#define TXITIMER 0x420 /* coalesce timer usec, MSB to use */ +#define RXITIMER 0x460 /* coalesce timer usec, MSB to use */ +#define TXDONECNT 0x424 /* tx completion report, auto-clear */ +#define RXDONECNT 0x458 /* rx completion report, auto-clear */ +#define UCODE_H2M 0x210 /* host2media engine ucode port */ +#define UCODE_M2H 0x21c /* media2host engine ucode port */ +#define CORESTAT 0x218 /* engine run state */ +#define PKTSTOP (1U<<2) +#define M2HSTOP (1U<<1) +#define H2MSTOP (1U<<0) +#define DMACTL_H2M 0x214 /* host2media engine control */ +#define DMACTL_M2H 0x220 /* media2host engine control */ +#define DMACTL_STOP (1U<<0) /* instruct stop; self-clear */ +#define UCODE_PKT 0x0d0 /* packet engine ucode port */ #define CLKEN 0x100 /* clock distribution enable */ -#define CLK_G (1U<<5) -#define CLK_ALL 0x13 /* 0x24 ??? */ +#define CLK_G (1U<<5) /* feed clk domain E */ +#define CLK_C (1U<<1) /* feed clk domain C */ +#define CLK_D (1U<<0) /* feed clk domain D */ +#define CLK_ALL 0x23 /* all above; 0x24 ??? 0x3f ??? */ + +/* GMAC register indirect access. thru MACCMD/MACDATA operation */ +#define MACDATA 0x11c0 /* gmac register rd/wr data */ +#define MACCMD 0x11c4 /* gmac register operation */ +#define CMD_IOWR (1U<<28) /* write op */ +#define CMD_BUSY (1U<<31) /* busy bit */ +#define MACSTAT 0x1024 /* gmac status; ??? */ +#define MACINTE 0x1028 /* interrupt enable; ??? */ + +#define FLOWTHR 0x11cc /* flow control threshold */ +/* 31:16 pause threshold, 15:0 resume threshold */ +#define INTF_SEL 0x11d4 /* ??? */ + +#define DESC_INIT 0x11fc /* write 1 for desc init, SC */ +#define DESC_SRST 0x1204 /* write 1 for desc sw reset, SC */ +#define MODE_TRANS 0x500 /* mode change completion status */ +#define N2T_DONE (1U<<20) /* normal->taiki change completed */ +#define T2N_DONE (1U<<19) /* taiki->normal change completed */ #define MACADRH 0x10c /* ??? */ #define MACADRL 0x110 /* ??? */ #define MCVER 0x22c /* micro controller version */ #define HWVER 0x230 /* hardware version */ -/* 0x800 */ /* dec Tx SR/EN/SET/CLR */ -/* 0x840 */ /* enc Rx SR/EN/SET/CLR */ -/* 0x880 */ /* enc TLS Tx SR/IE/SET/CLR */ -/* 0x8c0 */ /* dec TLS Tx SR/IE/SET/CLR */ -/* 0x900 */ /* enc TLS Rx SR/IE/SET/CLR */ -/* 0x940 */ /* dec TLS Rx SR/IE/SET/CLR */ -/* 0x980 */ /* enc RAW Tx SR/IE/SET/CLR */ -/* 0x9c0 */ /* dec RAW Tx SR/IE/SET/CLR */ -/* 0xA00 */ /* enc RAW Rx SR/IE/SET/CLR */ -/* 0xA40 */ /* dec RAW Rx SR/IE/SET/CLR */ - -/* indirect GMAC registers. accessed thru MACCMD/MACDATA operation */ -#define MACCMD 0x11c4 /* gmac operation */ -#define CMD_IOWR (1U<<28) /* write op */ -#define CMD_BUSY (1U<<31) /* busy bit */ -#define MACSTAT 0x1024 /* gmac status */ -#define MACDATA 0x11c0 /* gmac rd/wr data */ -#define MACINTE 0x1028 /* interrupt enable */ -#define DESC_INIT 0x11fc /* desc engine init */ -#define DESC_SRST 0x1204 /* desc engine sw reset */ - /* - * GMAC registers. not memory mapped, but handled by indirect access. - * Mostly identical to Synopsys DesignWare Core Ethernet. + * GMAC registers are mostly identical to Synopsys DesignWare Core + * Ethernet. These must be handled by indirect access. */ #define GMACMCR 0x0000 /* MAC configuration */ #define MCR_IBN (1U<<30) /* ??? */ @@ -191,8 +219,8 @@ struct rdes { #define MCR_DRCS (1U<<16) /* ignore (G)MII HDX Tx error */ #define MCR_USEMII (1U<<15) /* 1: RMII/MII, 0: RGMII (_PS) */ #define MCR_SPD100 (1U<<14) /* force speed 100 (_FES) */ -#define MCR_DO (1U<<13) /* */ -#define MCR_LOOP (1U<<12) /* */ +#define MCR_DO (1U<<13) /* ??? don't receive my own Tx frames */ +#define MCR_LOOP (1U<<12) /* run loop back */ #define MCR_USEFDX (1U<<11) /* force full duplex */ #define MCR_IPCEN (1U<<10) /* handle checksum */ #define MCR_ACS (1U<<7) /* auto pad strip CRC */ @@ -206,7 +234,7 @@ struct rdes { #define AFR_HPF (1U<<10) /* hash+perfect filter, or hash only */ #define AFR_SAF (1U<<9) /* source address filter */ #define AFR_SAIF (1U<<8) /* SA inverse filtering */ -#define AFR_PCF (2U<<6) /* */ +#define AFR_PCF (2U<<6) /* ??? */ #define AFR_DBF (1U<<5) /* reject broadcast frame */ #define AFR_PM (1U<<4) /* accept all multicast frame */ #define AFR_DAIF (1U<<3) /* DA inverse filtering */ @@ -214,20 +242,26 @@ struct rdes { #define AFR_UHTE (1U<<1) /* use hash table for unicast */ #define AFR_PR (1U<<0) /* run promisc mode */ #define GMACGAR 0x0010 /* MDIO operation */ -#define GAR_PHY (11) /* mii phy 15:11 */ -#define GAR_REG (6) /* mii reg 10:6 */ -#define GAR_CTL (2) /* control 5:2 */ +#define GAR_PHY (11) /* 15:11 mii phy */ +#define GAR_REG (6) /* 10:6 mii reg */ +#define GAR_CLK (2) /* 5:2 mdio clock tick ratio */ #define GAR_IOWR (1U<<1) /* MDIO write op */ -#define GAR_BUSY (1U) /* busy bit */ +#define GAR_BUSY (1U<<0) /* busy bit */ +#define GAR_MDIO_25_35MHZ 2 +#define GAR_MDIO_35_60MHZ 3 +#define GAR_MDIO_60_100MHZ 0 +#define GAR_MDIO_100_150MHZ 1 +#define GAR_MDIO_150_250MHZ 4 +#define GAR_MDIO_250_300MHZ 5 #define GMACGDR 0x0014 /* MDIO rd/wr data */ #define GMACFCR 0x0018 /* 802.3x flowcontrol */ -/* 31:16 pause timer value, 5:4 pause timer threthold */ +/* 31:16 pause timer value, 5:4 pause timer threshold */ #define FCR_RFE (1U<<2) /* accept PAUSE to throttle Tx */ #define FCR_TFE (1U<<1) /* generate PAUSE to moderate Rx lvl */ #define GMACVTAG 0x001c /* VLAN tag control */ #define GMACIMPL 0x0020 /* implementation number XX.YY */ -#define GMACLPIS 0x0030 /* AXI LPI control */ -#define GMACLPIC 0x0034 /* AXI LPI control */ +#define GMACLPIS 0x0030 /* ??? AXI LPI control */ +#define GMACLPIC 0x0034 /* ??? AXI LPI control */ #define GMACISR 0x0038 /* interrupt status, clear when read */ #define GMACIMR 0x003c /* interrupt enable */ #define ISR_TS (1U<<9) /* time stamp operation detected */ @@ -257,15 +291,15 @@ struct rdes { /* 24 4PBL 8??? * 23 USP * 22:17 RPBL - * 16 fixed burst, or undefined b. + * 16 fixed burst * 15:14 priority between Rx and Tx * 3 rxtx ratio 41 * 2 rxtx ratio 31 * 1 rxtx ratio 21 * 0 rxtx ratio 11 - * 13:8 PBL packet burst len + * 13:8 PBL possible DMA burst length * 7 alternative des8 - * 0 reset op. (SC) + * 0 GMAC reset op. self-clear */ #define _BMR 0x00412080 /* XXX TBD */ #define _BMR0 0x00020181 /* XXX TBD */ @@ -274,47 +308,46 @@ struct rdes { #define GMACRPD 0x1008 /* write any to resume rdes */ #define GMACRDLA 0x100c /* rdes base address 32bit paddr */ #define GMACTDLA 0x1010 /* tdes base address 32bit paddr */ -#define _RDLA 0x18000 /* XXX TBD system SRAM ? */ -#define _TDLA 0x1c000 /* XXX TBD system SRAM ? */ +#define _RDLA 0x18000 /* system RAM for GMAC rdes */ +#define _TDLA 0x1c000 /* system RAM for GMAC tdes */ #define GMACDSR 0x1014 /* DMA status detail report; W1C */ -#define GMACOMR 0x1018 /* DMA operation */ +#define GMACOMR 0x1018 /* DMA operation mode */ #define OMR_TSF (1U<<25) /* 1: Tx store&forword, 0: immed. */ #define OMR_RSF (1U<<21) /* 1: Rx store&forward, 0: immed. */ #define OMR_ST (1U<<13) /* run Tx DMA engine, 0 to stop */ #define OMR_EFC (1U<<8) /* transmit PAUSE to throttle Rx lvl. */ #define OMR_FEF (1U<<7) /* allow to receive error frames */ -#define OMR_RS (1U<<1) /* run Rx DMA engine, 0 to stop */ +#define OMR_SR (1U<<1) /* run Rx DMA engine, 0 to stop */ #define GMACIE 0x101c /* interrupt enable */ #define GMACEVCS 0x1020 /* missed frame or ovf detected */ #define GMACRWDT 0x1024 /* receive watchdog timer count */ #define GMACAXIB 0x1028 /* AXI bus mode control */ #define GMACAXIS 0x102c /* AXI status report */ -/* 0x1048 - 1054 */ /* descriptor and buffer cur. address */ -#define HWFEA 0x1058 /* feature report */ +/* 0x1048 current tx desc address */ +/* 0x104c current rx desc address */ +/* 0x1050 current tx buffer address */ +/* 0x1054 current rx buffer address */ +#define HWFEA 0x1058 /* DWC feature report */ #define GMACEVCTL 0x0100 /* event counter control */ -#define GMACEVCNT(i) ((i)*4+0x114) /* event counter 0x114 - 0x284 */ - -/* memory mapped CSR register */ -#define CSR_READ(sc,off) \ - bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (off)) -#define CSR_WRITE(sc,off,val) \ - bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (off), (val)) - -/* flash memory access */ -#define EE_READ(sc,off) \ - bus_space_read_4((sc)->sc_st, (sc)->sc_eesh, (off)) +#define EVC_FHP (1U<<5) /* full-half preset */ +#define EVC_CP (1U<<4) /* counters preset */ +#define EVC_MCF (1U<<3) /* MMC counter freeze */ +#define EVC_ROR (1U<<2) /* auto-zero on counter read */ +#define EVC_CSR (1U<<1) /* counter stop rollover */ +#define EVC_CR (1U<<0) /* reset counters */ +#define GMACEVCNT(i) ((i)*4+0x114) /* 80 event counters 0x114 - 0x284 */ /* * flash memory layout * 0x00 - 07 48-bit MAC station address. 4 byte wise in BE order. - * 0x08 - 0b H->MAC xfer uengine program start addr 63:32. - * 0x0c - 0f H2M program addr 31:0 (these are absolute addr, not relative) + * 0x08 - 0b H->MAC xfer engine program start addr 63:32. + * 0x0c - 0f H2M program addr 31:0 (these are absolute addr, not offset) * 0x10 - 13 H2M program length in 4 byte count. - * 0x14 - 0b M->HOST xfer uengine program start addr 63:32. - * 0x18 - 0f M2H program addr 31:0 (absolute, not relative) + * 0x14 - 0b M->HOST xfer engine program start addr 63:32. + * 0x18 - 0f M2H program addr 31:0 (absolute addr, not relative) * 0x1c - 13 M2H program length in 4 byte count. - * 0x20 - 23 packet uengine program addr 31:0, (absolute, not relative) + * 0x20 - 23 packet engine program addr 31:0, (absolute addr, not offset) * 0x24 - 27 packet program length in 4 byte count. * * above ucode are loaded via mapped reg 0x210, 0x21c and 0x0c0.