Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/*	$NetBSD: dig64.h,v 1.2 2009/07/20 04:41:37 kiyohara Exp $	*/

/*-
 * Copyright (c) 2002 Marcel Moolenaar
 * 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. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 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.
 *
 * $FreeBSD$
 */

#ifndef _MACHINE_DIG64_H_
#define	_MACHINE_DIG64_H_

/*
 * This header file written refer to 'DIG64 Desriptions for Primary Console &
 * Debug Port Devices'.
 */

/* ACPI GAS (Generic Address Structure) */
struct dig64_gas {
	uint8_t		addr_space;
	uint8_t		bit_width;
	uint8_t		bit_offset;
	uint8_t		_reserved_;
	/*
	 * XXX using a 64-bit type for the address would cause padding and
	 * using __packed would cause unaligned accesses...
	 */
	uint32_t	addr_low;
	uint32_t	addr_high;
};

struct dig64_hcdp_entry {
	uint8_t		type;
#define	DIG64_HCDP_CONSOLE		DIG64_ENTRYTYPE_TYPE0
#define	DIG64_HCDP_DBGPORT		DIG64_ENTRYTYPE_TYPE1
	uint8_t		databits;
	uint8_t		parity;
#define	DIG64_HCDP_PARITY_NO		1
#define	DIG64_HCDP_PARITY_EVEN		2
#define	DIG64_HCDP_PARITY_ODD		3
#define	DIG64_HCDP_PARITY_MARK		4
#define	DIG64_HCDP_PARITY_SPACE		5
	uint8_t		stopbits;
#define	DIG64_HCDP_STOPBITS_1		1
#define	DIG64_HCDP_STOPBITS_15		2
#define	DIG64_HCDP_STOPBITS_2		3
	uint8_t		pci_segment;
	uint8_t		pci_bus;
	uint8_t		pci_device:5;
	uint8_t		_reserved1_:3;
	uint8_t		pci_function:3;
	uint8_t		_reserved2_:3;
	uint8_t		interrupt:1;
	uint8_t		pci_flag:1;
	/*
	 * XXX using a 64-bit type for the baudrate would cause padding and
	 * using __packed would cause unaligned accesses...
	 */
	uint32_t	baud_low;
	uint32_t	baud_high;
	struct dig64_gas address;
	uint16_t	pci_devid;
	uint16_t	pci_vendor;
	uint32_t	irq;
	uint32_t	pclock;
	uint8_t		pci_interface;
	uint8_t		_reserved3_[7];
};


/* Device Specific Structures */

struct dig64_vga_spec {
	uint8_t		num;	/*Number of Extended Address Space Descriptors*/
	struct {
		uint8_t	data[56];
	} edesc[0];
} __packed;


/* Interconnect Specific Structure */

#define DIG64_FLAGS_INTR_LEVEL		(0 << 0)	/* Level Triggered */
#define DIG64_FLAGS_INTR_EDGE		(1 << 0)	/* Edge Triggered */
#define DIG64_FLAGS_INTR_ACTH		(0 << 1)	/* Intr Active High */
#define DIG64_FLAGS_INTR_ACTL		(1 << 1)	/* Intr Active Low */
#define DIG64_FLAGS_TRANS_DENSE		(0 << 3)	/* Dense Transration */
#define DIG64_FLAGS_TRANS_SPARSE	(1 << 3)	/* Sparse Transration */
#define DIG64_FLAGS_TYPE_STATIC		(0 << 4)	/* Type Static */
#define DIG64_FLAGS_TYPE_TRANS		(1 << 4)	/* Type Translation */
#define DIG64_FLAGS_INTR_SUPP		(1 << 6)	/* Intrrupt supported */
#define DIG64_FLAGS_MMIO_TRA_VALID	(1 << 8)
#define DIG64_FLAGS_IOPORT_TRA_VALID	(1 << 9)

struct dig64_acpi_spec {
	uint8_t		type;		/* = 0 indicating ACPI */
	uint8_t		resv;		/* must be 0 */
	uint16_t	length;		/* of the ACPI Specific Structure */
	uint32_t	uid;
	uint32_t	hid;
	uint32_t	acpi_gsi;	/* ACPI Global System Interrupt */
	uint64_t	mmio_tra;
	uint64_t	ioport_tra;
	uint16_t	flags;
} __packed;

struct dig64_pci_spec {
	uint8_t		type;		/* = 1 indicating PCI */
	uint8_t		resv;		/* must be 0 */
	uint16_t	length;		/* of the PCI Specific Structure */
	uint8_t		sgn;		/* PCI Segment Group Number */
	uint8_t		bus;		/* PCI Bus Number */
	uint8_t		device;		/* PCI Device Number */
	uint8_t		function;	/* PCI Function Number */
	uint16_t	device_id;
	uint16_t	vendor_id;
	uint32_t	acpi_gsi;	/* ACPI Global System Interrupt */
	uint64_t	mmio_tra;
	uint64_t	ioport_tra;
	uint16_t	flags;
} __packed;


struct dig64_pcdp_entry {
	uint8_t		type;
	uint8_t		primary;
	uint16_t	length;		/* in bytes */
	uint16_t	index;
#define	DIG64_PCDP_CONOUTDEV		0
#define	DIG64_PCDP_NOT_VALID		1
#define	DIG64_PCDP_CONOUTDEV2		2
#define	DIG64_PCDP_CONINDEV		3

	union {
		/*
		 * Interconnect Specific Structure,
		 *   and Device Specific Structure(s)
		 */
		uint8_t	type;
#define DIG64_PCDP_SPEC_ACPI		0
		struct dig64_acpi_spec acpi;
#define DIG64_PCDP_SPEC_PCI		1
		struct dig64_pci_spec pci;
	} specs;
} __packed;

struct dig64_hcdp_table {
	char		signature[4];
#define	HCDP_SIGNATURE	"HCDP"
	uint32_t	length;
	uint8_t		revision;	/* It is PCDP, if '3' or greater. */
	uint8_t		checksum;
	char		oem_id[6];
	char		oem_tbl_id[8];
	uint32_t	oem_rev;
	char		creator_id[4];
	uint32_t	creator_rev;
	uint32_t	entries;	/* Number of Type0 and Type1 Entries. */
	union dev_desc {	/* Device Descriptor */
		uint8_t type;
#define	DIG64_ENTRYTYPE_TYPE0		0	/* (UART | Bidirect) */
#define	DIG64_ENTRYTYPE_TYPE1		1	/* (UART | Debug Port) */
#define	DIG64_ENTRYTYPE_BIDIRECT	(0<<0)	/* bidirectional console */
#define	DIG64_ENTRYTYPE_DEBUGPORT	(1<<0)	/* debug port */
#define	DIG64_ENTRYTYPE_OUTONLY		(2<<0)	/* console output-only */
#define	DIG64_ENTRYTYPE_INONLY		(3<<0)	/* console input-only */
#define	DIG64_ENTRYTYPE_UART		(0<<3)
#define	DIG64_ENTRYTYPE_VGA		(1<<3)
#define	DIG64_ENTRYTYPE_VENDOR		(1<<7)	/* Vendor specific */
		struct dig64_hcdp_entry uart;
		struct dig64_pcdp_entry pcdp;
	} entry[0];
};

#endif