pdqreg.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 1,066 行 · 第 1/3 页
H
1,066 行
/*- * Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. The name of the author may not be used to endorse or promote products * derived from this software withough specific prior written permission * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: pdqreg.h,v 1.1.1.1 1997/01/17 23:19:49 joerg Exp $ * *//* * DEC PDQ FDDI Controller; PDQ port driver definitions * */#ifndef _PDQREG_H#define _PDQREG_H#include <stddef.h>#if defined(PDQTEST) && !defined(PDQ_NDEBUG)#include <assert.h>#define PDQ_ASSERT assert#else#define PDQ_ASSERT(x) do { } while(0)#endif#define PDQ_RING_SIZE(array) ((sizeof(array) / sizeof(array[0])))#define PDQ_ARRAY_SIZE(array) ((sizeof(array) / sizeof(array[0])))#define PDQ_RING_MASK(array) (PDQ_RING_SIZE(array) - 1)#define PDQ_BITMASK(n) (1L << (pdq_uint32_t) (n))#define PDQ_FDDI_MAX 4495#define PDQ_FDDI_LLC_MIN 20#define PDQ_FDDI_SMT_MIN 37#define PDQ_FDDI_SMT 0x40#define PDQ_FDDI_LLC_ASYNC 0x50#define PDQ_FDDI_LLC_SYNC 0xD0#define PDQ_FDDI_IMP_ASYNC 0x60#define PDQ_FDDI_IMP_SYNC 0xE0#define PDQ_FDDIFC_C 0x80#define PDQ_FDDIFC_L 0x40#define PDQ_FDDIFC_F 0x30#define PDQ_FDDIFC_Z 0x0F#define PDQ_FDDI_PH0 0x20#define PDQ_FDDI_PH1 0x38#define PDQ_FDDI_PH2 0x00typedef pdq_uint32_t pdq_physaddr_t;struct _pdq_lanaddr_t { pdq_uint8_t lanaddr_bytes[8];};typedef struct { pdq_uint8_t fwrev_bytes[4];} pdq_fwrev_t;enum _pdq_state_t { PDQS_RESET=0, PDQS_UPGRADE=1, PDQS_DMA_UNAVAILABLE=2, PDQS_DMA_AVAILABLE=3, PDQS_LINK_AVAILABLE=4, PDQS_LINK_UNAVAILABLE=5, PDQS_HALTED=6, PDQS_RING_MEMBER=7};struct _pdq_csrs_t { pdq_bus_memoffset_t csr_port_reset; /* 0x00 [RW] */ pdq_bus_memoffset_t csr_host_data; /* 0x04 [R] */ pdq_bus_memoffset_t csr_port_control; /* 0x08 [RW] */ pdq_bus_memoffset_t csr_port_data_a; /* 0x0C [RW] */ pdq_bus_memoffset_t csr_port_data_b; /* 0x10 [RW] */ pdq_bus_memoffset_t csr_port_status; /* 0x14 [R] */ pdq_bus_memoffset_t csr_host_int_type_0; /* 0x18 [RW] */ pdq_bus_memoffset_t csr_host_int_enable; /* 0x1C [RW] */ pdq_bus_memoffset_t csr_type_2_producer; /* 0x20 [RW] */ pdq_bus_memoffset_t csr_cmd_response_producer; /* 0x28 [RW] */ pdq_bus_memoffset_t csr_cmd_request_producer; /* 0x2C [RW] */ pdq_bus_memoffset_t csr_host_smt_producer; /* 0x30 [RW] */ pdq_bus_memoffset_t csr_unsolicited_producer; /* 0x34 [RW] */ pdq_bus_t csr_bus; pdq_bus_memaddr_t csr_base;};struct _pdq_pci_csrs_t { pdq_bus_memoffset_t csr_pfi_mode_control; /* 0x40 [RW] */ pdq_bus_memoffset_t csr_pfi_status; /* 0x44 [RW] */ pdq_bus_memoffset_t csr_fifo_write; /* 0x48 [RW] */ pdq_bus_memoffset_t csr_fifo_read; /* 0x4C [RW] */ pdq_bus_t csr_bus; pdq_bus_memaddr_t csr_base;};#define PDQ_PFI_MODE_DMA_ENABLE 0x01 /* DMA Enable */#define PDQ_PFI_MODE_PFI_PCI_INTR 0x02 /* PFI-to-PCI Int Enable */#define PDQ_PFI_MODE_PDQ_PCI_INTR 0x04 /* PDQ-to-PCI Int Enable */#define PDQ_PFI_STATUS_PDQ_INTR 0x10 /* PDQ Int received */#define PDQ_PFI_STATUS_DMA_ABORT 0x08 /* PDQ DMA Abort asserted */#define PDQ_EISA_BURST_HOLDOFF 0x0040#define PDQ_EISA_SLOT_ID 0x0C80#define PDQ_EISA_SLOT_CTRL 0x0C84#define PDQ_EISA_MEM_ADD_CMP_0 0x0C85#define PDQ_EISA_MEM_ADD_CMP_1 0x0C86#define PDQ_EISA_MEM_ADD_CMP_2 0x0C87#define PDQ_EISA_MEM_ADD_HI_CMP_0 0x0C88#define PDQ_EISA_MEM_ADD_HI_CMP_1 0x0C89#define PDQ_EISA_MEM_ADD_HI_CMP_2 0x0C8A#define PDQ_EISA_MEM_ADD_MASK_0 0x0C8B#define PDQ_EISA_MEM_ADD_MASK_1 0x0C8C#define PDQ_EISA_MEM_ADD_MASK_2 0x0C8D#define PDQ_EISA_MEM_ADD_LO_CMP_0 0x0C8E#define PDQ_EISA_MEM_ADD_LO_CMP_1 0x0C8F#define PDQ_EISA_MEM_ADD_LO_CMP_2 0x0C90#define PDQ_EISA_IO_CMP_0_0 0x0C91#define PDQ_EISA_IO_CMP_0_1 0x0C92#define PDQ_EISA_IO_CMP_1_0 0x0C93#define PDQ_EISA_IO_CMP_1_1 0x0C94#define PDQ_EISA_IO_CMP_2_0 0x0C95#define PDQ_EISA_IO_CMP_2_1 0x0C96#define PDQ_EISA_IO_CMP_3_0 0x0C97#define PDQ_EISA_IO_CMP_3_1 0x0C98#define PDQ_EISA_IO_ADD_MASK_0_0 0x0C99#define PDQ_EISA_IO_ADD_MASK_0_1 0x0C9A#define PDQ_EISA_IO_ADD_MASK_1_0 0x0C9B#define PDQ_EISA_IO_ADD_MASK_1_1 0x0C9C#define PDQ_EISA_IO_ADD_MASK_2_0 0x0C9D#define PDQ_EISA_IO_ADD_MASK_2_1 0x0C9E#define PDQ_EISA_IO_ADD_MASK_3_0 0x0C9F#define PDQ_EISA_IO_ADD_MASK_3_1 0x0CA0#define PDQ_EISA_MOD_CONFIG_1 0x0CA1#define PDQ_EISA_MOD_CONFIG_2 0x0CA2#define PDQ_EISA_MOD_CONFIG_3 0x0CA3#define PDQ_EISA_MOD_CONFIG_4 0x0CA4#define PDQ_EISA_MOD_CONFIG_5 0x0CA5#define PDQ_EISA_MOD_CONFIG_6 0x0CA6#define PDQ_EISA_MOD_CONFIG_7 0x0CA7#define PDQ_EISA_DIP_SWITCH 0x0CA8#define PDQ_EISA_IO_CONFIG_STAT_0 0x0CA9#define PDQ_EISA_IO_CONFIG_STAT_1 0x0CAA#define PDQ_EISA_DMA_CONFIG 0x0CAB#define PDQ_EISA_INPUT_PORT 0x0CAC#define PDQ_EISA_OUTPUT_PORT 0x0CAD#define PDQ_EISA_FUNCTION_CTRL 0x0CAE#define PDQ_TC_CSR_OFFSET 0x00100000#define PDQ_TC_CSR_SPACE 0x0040#define PDQ_FBUS_CSR_OFFSET 0x00200000#define PDQ_FBUS_CSR_SPACE 0x0080/* * Port Reset Data A Definitions */#define PDQ_PRESET_SKIP_SELFTEST 0x0004#define PDQ_PRESET_SOFT_RESET 0x0002#define PDQ_PRESET_UPGRADE 0x0001/* * Port Control Register Definitions */#define PDQ_PCTL_CMD_ERROR 0x8000#define PDQ_PCTL_FLASH_BLAST 0x4000#define PDQ_PCTL_HALT 0x2000#define PDQ_PCTL_COPY_DATA 0x1000#define PDQ_PCTL_ERROR_LOG_START 0x0800#define PDQ_PCTL_ERROR_LOG_READ 0x0400#define PDQ_PCTL_XMT_DATA_FLUSH_DONE 0x0200#define PDQ_PCTL_DMA_INIT 0x0100#define PDQ_DMA_INIT_LW_BSWAP_DATA 0x02#define PDQ_DMA_INIT_LW_BSWAP_LITERAL 0x01#define PDQ_PCTL_INIT_START 0x0080#define PDQ_PCTL_CONSUMER_BLOCK 0x0040#define PDQ_PCTL_DMA_UNINIT 0x0020#define PDQ_PCTL_RING_MEMBER 0x0010#define PDQ_PCTL_MLA_READ 0x0008#define PDQ_PCTL_FW_REV_READ 0x0004#define PDQ_PCTL_DEVICE_SPECIFIC 0x0002#define PDQ_PCTL_SUB_CMD 0x0001typedef enum { PDQ_SUB_CMD_LINK_UNINIT=1, PDQ_SUB_CMD_DMA_BURST_SIZE_SET=2, PDQ_SUB_CMD_PDQ_REV_GET=4} pdq_sub_cmd_t;typedef enum { PDQ_DMA_BURST_4LW=0, PDQ_DMA_BURST_8LW=1, PDQ_DMA_BURST_16LW=2, PDQ_DMA_BURST_32LW=3} pdq_dma_burst_size_t;typedef enum { PDQ_CHIP_REV_A_B_OR_C=0, PDQ_CHIP_REV_D=2, PDQ_CHIP_REV_E=4} pdq_chip_rev_t;/* * Port Status Register Definitions */#define PDQ_PSTS_RCV_DATA_PENDING 0x80000000ul#define PDQ_PSTS_XMT_DATA_PENDING 0x40000000ul#define PDQ_PSTS_HOST_SMT_PENDING 0x20000000ul#define PDQ_PSTS_UNSOL_PENDING 0x10000000ul#define PDQ_PSTS_CMD_RSP_PENDING 0x08000000ul#define PDQ_PSTS_CMD_REQ_PENDING 0x04000000ul#define PDQ_PSTS_TYPE_0_PENDING 0x02000000ul#define PDQ_PSTS_INTR_PENDING 0xFE000000ul#define PDQ_PSTS_ADAPTER_STATE(sts) ((pdq_state_t) (((sts) >> 8) & 0x07))#define PDQ_PSTS_HALT_ID(sts) ((pdq_halt_code_t) ((sts) & 0xFF))/* * Host Interrupt Register Definitions */#define PDQ_HOST_INT_TX_ENABLE 0x80000000ul#define PDQ_HOST_INT_RX_ENABLE 0x40000000ul#define PDQ_HOST_INT_UNSOL_ENABLE 0x20000000ul#define PDQ_HOST_INT_HOST_SMT_ENABLE 0x10000000ul#define PDQ_HOST_INT_CMD_RSP_ENABLE 0x08000000ul#define PDQ_HOST_INT_CMD_RQST_ENABLE 0x04000000ul#define PDQ_HOST_INT_1MS 0x80#define PDQ_HOST_INT_20MS 0x40#define PDQ_HOST_INT_CSR_CMD_DONE 0x20#define PDQ_HOST_INT_STATE_CHANGE 0x10#define PDQ_HOST_INT_XMT_DATA_FLUSH 0x08#define PDQ_HOST_INT_NXM 0x04#define PDQ_HOST_INT_PM_PARITY_ERROR 0x02#define PDQ_HOST_INT_HOST_BUS_PARITY_ERROR 0x01#define PDQ_HOST_INT_FATAL_ERROR 0x07typedef enum { PDQH_SELFTEST_TIMEOUT=0, PDQH_HOST_BUS_PARITY_ERROR=1, PDQH_HOST_DIRECTED_HALT=2, PDQH_SOFTWARE_FAULT=3, PDQH_HARDWARE_FAULT=4, PDQH_PC_TRACE_PATH_TEST=5, PDQH_DMA_ERROR=6, PDQH_IMAGE_CRC_ERROR=7, PDQH_ADAPTER_PROCESSOR_ERROR=8, PDQH_MAX=9} pdq_halt_code_t;typedef struct { pdq_uint16_t pdqcb_receives; pdq_uint16_t pdqcb_transmits; pdq_uint32_t pdqcb__filler1; pdq_uint32_t pdqcb_host_smt; pdq_uint32_t pdqcb__filler2; pdq_uint32_t pdqcb_unsolicited_event; pdq_uint32_t pdqcb__filler3; pdq_uint32_t pdqcb_command_response; pdq_uint32_t pdqcb__filler4; pdq_uint32_t pdqcb_command_request; pdq_uint32_t pdqcb__filler5[7];} pdq_consumer_block_t;#if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN#define PDQ_BITFIELD2(a, b) b, a#define PDQ_BITFIELD3(a, b, c) c, b, a#define PDQ_BITFIELD4(a, b, c, d) d, c, b, a#define PDQ_BITFIELD5(a, b, c, d, e) e, d, c, b, a#define PDQ_BITFIELD12(a, b, c, d, e, f, g, h, i, j, k, l) \ l, k, j, i, h, g, f, e, d, c, b, a#else#define PDQ_BITFIELD2(a, b) a, b#define PDQ_BITFIELD3(a, b, c) a, b, c#define PDQ_BITFIELD4(a, b, c, d) a, b, c, d#define PDQ_BITFIELD5(a, b, c, d, e) a, b, c, d, e#define PDQ_BITFIELD12(a, b, c, d, e, f, g, h, i, j, k, l) \ a, b, c, d, e, f, g, h, i, j, k, l#endiftypedef struct { pdq_uint32_t PDQ_BITFIELD5(rxd_pa_hi : 16, rxd_seg_cnt : 4, rxd_seg_len_hi : 9, rxd_seg_len_lo : 2, rxd_sop : 1); pdq_uint32_t rxd_pa_lo;} pdq_rxdesc_t;typedef union { pdq_uint32_t rxs_status; pdq_uint32_t PDQ_BITFIELD12(rxs_len : 13, rxs_rcc_ss : 2, rxs_rcc_dd : 2, rxs_rcc_reason : 3, rxs_rcc_badcrc : 1, rxs_rcc_badpdu : 1, rxs_fsb__reserved : 2, rxs_fsb_c : 1, rxs_fsb_a : 1, rxs_fsb_e : 1, rxs_fsc : 3, rxs__reserved : 2);} pdq_rxstatus_t;typedef struct { pdq_uint32_t PDQ_BITFIELD5(txd_pa_hi : 16, txd_seg_len : 13, txd_mbz : 1, txd_eop : 1, txd_sop : 1); pdq_uint32_t txd_pa_lo;} pdq_txdesc_t;typedef struct { pdq_rxdesc_t pdqdb_receives[256]; /* 2048; 0x0000..0x07FF */ pdq_txdesc_t pdqdb_transmits[256]; /* 2048; 0x0800..0x0FFF */ pdq_rxdesc_t pdqdb_host_smt[64]; /* 512; 0x1000..0x11FF */ pdq_rxdesc_t pdqdb_unsolicited_events[16]; /* 128; 0x1200..0x127F */ pdq_rxdesc_t pdqdb_command_responses[16]; /* 128; 0x1280..0x12FF */ pdq_txdesc_t pdqdb_command_requests[16]; /* 128; 0x1300..0x137F */ /* * The rest of the descriptor block is unused. * As such we could use it for other things. */ pdq_consumer_block_t pdqdb_consumer; /* 64; 0x1380..0x13BF */ void *pdqdb_receive_buffers[256]; /* 1024/2048; 0x13C0..0x17BF 0x13C0..0x1BBF */ void *pdqdb_host_smt_buffers[64]; /* 256/ 512; 0x17C0..0x18BF 0x1BC0..0x1DBF */ /* * The maximum command size is 512 so as long as thes * command is at least that long all will be fine. */#if defined(__alpha) || defined(__alpha__) pdq_uint32_t pdqdb_command_pool[144];#else pdq_uint32_t pdqdb_command_pool[464];#endif} pdq_descriptor_block_t;typedef struct { /*
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?