Home | History | Annotate | Line # | Download | only in include
      1 /*	$NetBSD: dig64.h,v 1.4 2022/07/21 14:27:46 andvar Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2002 Marcel Moolenaar
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  * $FreeBSD$
     29  */
     30 
     31 #ifndef _MACHINE_DIG64_H_
     32 #define	_MACHINE_DIG64_H_
     33 
     34 /*
     35  * This header file written refer to 'DIG64 Descriptions for Primary Console &
     36  * Debug Port Devices'.
     37  */
     38 
     39 /* ACPI GAS (Generic Address Structure) */
     40 struct dig64_gas {
     41 	uint8_t		addr_space;
     42 	uint8_t		bit_width;
     43 	uint8_t		bit_offset;
     44 	uint8_t		_reserved_;
     45 	/*
     46 	 * XXX using a 64-bit type for the address would cause padding and
     47 	 * using __packed would cause unaligned accesses...
     48 	 */
     49 	uint32_t	addr_low;
     50 	uint32_t	addr_high;
     51 };
     52 
     53 struct dig64_hcdp_entry {
     54 	uint8_t		type;
     55 #define	DIG64_HCDP_CONSOLE		DIG64_ENTRYTYPE_TYPE0
     56 #define	DIG64_HCDP_DBGPORT		DIG64_ENTRYTYPE_TYPE1
     57 	uint8_t		databits;
     58 	uint8_t		parity;
     59 #define	DIG64_HCDP_PARITY_NO		1
     60 #define	DIG64_HCDP_PARITY_EVEN		2
     61 #define	DIG64_HCDP_PARITY_ODD		3
     62 #define	DIG64_HCDP_PARITY_MARK		4
     63 #define	DIG64_HCDP_PARITY_SPACE		5
     64 	uint8_t		stopbits;
     65 #define	DIG64_HCDP_STOPBITS_1		1
     66 #define	DIG64_HCDP_STOPBITS_15		2
     67 #define	DIG64_HCDP_STOPBITS_2		3
     68 	uint8_t		pci_segment;
     69 	uint8_t		pci_bus;
     70 	uint8_t		pci_device:5;
     71 	uint8_t		_reserved1_:3;
     72 	uint8_t		pci_function:3;
     73 	uint8_t		_reserved2_:3;
     74 	uint8_t		interrupt:1;
     75 	uint8_t		pci_flag:1;
     76 	/*
     77 	 * XXX using a 64-bit type for the baudrate would cause padding and
     78 	 * using __packed would cause unaligned accesses...
     79 	 */
     80 	uint32_t	baud_low;
     81 	uint32_t	baud_high;
     82 	struct dig64_gas address;
     83 	uint16_t	pci_devid;
     84 	uint16_t	pci_vendor;
     85 	uint32_t	irq;
     86 	uint32_t	pclock;
     87 	uint8_t		pci_interface;
     88 	uint8_t		_reserved3_[7];
     89 };
     90 
     91 
     92 /* Device Specific Structures */
     93 
     94 struct dig64_vga_spec {
     95 	uint8_t		num;	/*Number of Extended Address Space Descriptors*/
     96 	struct {
     97 		uint8_t	data[56];
     98 	} edesc[0];
     99 } __packed;
    100 
    101 
    102 /* Interconnect Specific Structure */
    103 
    104 #define DIG64_FLAGS_INTR_LEVEL		(0 << 0)	/* Level Triggered */
    105 #define DIG64_FLAGS_INTR_EDGE		(1 << 0)	/* Edge Triggered */
    106 #define DIG64_FLAGS_INTR_ACTH		(0 << 1)	/* Intr Active High */
    107 #define DIG64_FLAGS_INTR_ACTL		(1 << 1)	/* Intr Active Low */
    108 #define DIG64_FLAGS_TRANS_DENSE		(0 << 3)	/* Dense Translation */
    109 #define DIG64_FLAGS_TRANS_SPARSE	(1 << 3)	/* Sparse Translation */
    110 #define DIG64_FLAGS_TYPE_STATIC		(0 << 4)	/* Type Static */
    111 #define DIG64_FLAGS_TYPE_TRANS		(1 << 4)	/* Type Translation */
    112 #define DIG64_FLAGS_INTR_SUPP		(1 << 6)	/* Interrupt supported */
    113 #define DIG64_FLAGS_MMIO_TRA_VALID	(1 << 8)
    114 #define DIG64_FLAGS_IOPORT_TRA_VALID	(1 << 9)
    115 
    116 struct dig64_acpi_spec {
    117 	uint8_t		type;		/* = 0 indicating ACPI */
    118 	uint8_t		resv;		/* must be 0 */
    119 	uint16_t	length;		/* of the ACPI Specific Structure */
    120 	uint32_t	uid;
    121 	uint32_t	hid;
    122 	uint32_t	acpi_gsi;	/* ACPI Global System Interrupt */
    123 	uint64_t	mmio_tra;
    124 	uint64_t	ioport_tra;
    125 	uint16_t	flags;
    126 } __packed;
    127 
    128 struct dig64_pci_spec {
    129 	uint8_t		type;		/* = 1 indicating PCI */
    130 	uint8_t		resv;		/* must be 0 */
    131 	uint16_t	length;		/* of the PCI Specific Structure */
    132 	uint8_t		sgn;		/* PCI Segment Group Number */
    133 	uint8_t		bus;		/* PCI Bus Number */
    134 	uint8_t		device;		/* PCI Device Number */
    135 	uint8_t		function;	/* PCI Function Number */
    136 	uint16_t	device_id;
    137 	uint16_t	vendor_id;
    138 	uint32_t	acpi_gsi;	/* ACPI Global System Interrupt */
    139 	uint64_t	mmio_tra;
    140 	uint64_t	ioport_tra;
    141 	uint16_t	flags;
    142 } __packed;
    143 
    144 
    145 struct dig64_pcdp_entry {
    146 	uint8_t		type;
    147 	uint8_t		primary;
    148 	uint16_t	length;		/* in bytes */
    149 	uint16_t	index;
    150 #define	DIG64_PCDP_CONOUTDEV		0
    151 #define	DIG64_PCDP_NOT_VALID		1
    152 #define	DIG64_PCDP_CONOUTDEV2		2
    153 #define	DIG64_PCDP_CONINDEV		3
    154 
    155 	union {
    156 		/*
    157 		 * Interconnect Specific Structure,
    158 		 *   and Device Specific Structure(s)
    159 		 */
    160 		uint8_t	type;
    161 #define DIG64_PCDP_SPEC_ACPI		0
    162 		struct dig64_acpi_spec acpi;
    163 #define DIG64_PCDP_SPEC_PCI		1
    164 		struct dig64_pci_spec pci;
    165 	} specs;
    166 } __packed;
    167 
    168 struct dig64_hcdp_table {
    169 	char		signature[4];
    170 #define	HCDP_SIGNATURE	"HCDP"
    171 	uint32_t	length;
    172 	uint8_t		revision;	/* It is PCDP, if '3' or greater. */
    173 	uint8_t		checksum;
    174 	char		oem_id[6];
    175 	char		oem_tbl_id[8];
    176 	uint32_t	oem_rev;
    177 	char		creator_id[4];
    178 	uint32_t	creator_rev;
    179 	uint32_t	entries;	/* Number of Type0 and Type1 Entries. */
    180 	union dev_desc {	/* Device Descriptor */
    181 		uint8_t type;
    182 #define	DIG64_ENTRYTYPE_TYPE0		0	/* (UART | Bidirect) */
    183 #define	DIG64_ENTRYTYPE_TYPE1		1	/* (UART | Debug Port) */
    184 #define	DIG64_ENTRYTYPE_BIDIRECT	(0<<0)	/* bidirectional console */
    185 #define	DIG64_ENTRYTYPE_DEBUGPORT	(1<<0)	/* debug port */
    186 #define	DIG64_ENTRYTYPE_OUTONLY		(2<<0)	/* console output-only */
    187 #define	DIG64_ENTRYTYPE_INONLY		(3<<0)	/* console input-only */
    188 #define	DIG64_ENTRYTYPE_UART		(0<<3)
    189 #define	DIG64_ENTRYTYPE_VGA		(1<<3)
    190 #define	DIG64_ENTRYTYPE_VENDOR		(1<<7)	/* Vendor specific */
    191 		struct dig64_hcdp_entry uart;
    192 		struct dig64_pcdp_entry pcdp;
    193 	} entry[0];
    194 };
    195 
    196 #endif
    197