master
  1/*	$NetBSD: agpio.h,v 1.13 2021/12/19 01:51:17 riastradh Exp $	*/
  2
  3/*-
  4 * Copyright (c) 2000 Doug Rabson
  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 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 *
 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 26 * SUCH DAMAGE.
 27 *
 28 *	$FreeBSD: src/sys/sys/agpio.h,v 1.1 2000/06/09 16:04:30 dfr Exp $
 29 */
 30
 31#ifndef _SYS_AGPIO_H_
 32#define _SYS_AGPIO_H_
 33
 34#include <sys/types.h>
 35#include <sys/ioccom.h>
 36
 37/*
 38 * The AGP gatt uses 4k pages irrespective of the host page size.
 39 */
 40#define AGP_PAGE_SIZE		4096
 41#define AGP_PAGE_SHIFT		12
 42
 43/*
 44 * Macros to manipulate AGP mode words.
 45 */
 46#define AGP_MODE_GET_RQ(x)		__SHIFTOUT((x), AGP_MODE_RQ)
 47#define AGP_MODE_GET_ARQSZ(x)		__SHIFTOUT((x), AGP_MODE_ARQSZ)
 48#define AGP_MODE_GET_CAL(x)		__SHIFTOUT((x), AGP_MODE_CAL)
 49#define AGP_MODE_GET_SBA(x)		__SHIFTOUT((x), AGP_MODE_SBA)
 50#define AGP_MODE_GET_AGP(x)		__SHIFTOUT((x), AGP_MODE_AGP)
 51#define AGP_MODE_GET_4G(x)		__SHIFTOUT((x), AGP_MODE_4G)
 52#define AGP_MODE_GET_FW(x)		__SHIFTOUT((x), AGP_MODE_FW)
 53#define AGP_MODE_GET_MODE_3(x)		__SHIFTOUT((x), AGP_MODE_MODE_3)
 54#define AGP_MODE_GET_RATE(x)		__SHIFTOUT((x), AGP_MODE_RATE)
 55#define AGP_MODE_SET_RQ(x, v)		(((x) & ~AGP_MODE_RQ)		\
 56					 | __SHIFTIN((v), AGP_MODE_RQ))
 57#define AGP_MODE_SET_ARQSZ(x, v)	(((x) & ~AGP_MODE_ARQSZ)	\
 58					 | __SHIFTIN((v), AGP_MODE_ARQSZ))
 59#define AGP_MODE_SET_CAL(x, v)		(((x) & ~AGP_MODE_CAL)		\
 60					 | __SHIFTIN((v), ~AGP_MODE_CAL))
 61#define AGP_MODE_SET_SBA(x, v)		(((x) & ~AGP_MODE_SBA)		\
 62					 | __SHIFTIN((v), AGP_MODE_SBA))
 63#define AGP_MODE_SET_AGP(x, v)		(((x) & ~AGP_MODE_AGP)		\
 64					 | __SHIFTIN((v), AGP_MODE_AGP))
 65#define AGP_MODE_SET_4G(x, v)		(((x) & ~AGP_MODE_4G)		\
 66					 | __SHIFTIN((v), AGP_MODE_4G))
 67#define AGP_MODE_SET_FW(x, v)		(((x) & ~AGP_MODE_FW)		\
 68					 | __SHIFTIN((v), AGP_MODE_FW))
 69#define AGP_MODE_SET_MODE_3(x, v)	(((x) & ~AGP_MODE_MODE_3)	\
 70					 | __SHIFTIN((v), AGP_MODE_MODE_3))
 71#define AGP_MODE_SET_RATE(x, v)		(((x) & ~AGP_MODE_RATE)		\
 72					 | __SHIFTIN((v), AGP_MODE_RATE))
 73
 74/* compat */
 75#define AGP_MODE_RATE_1x		AGP_MODE_V2_RATE_1x
 76#define AGP_MODE_RATE_2x		AGP_MODE_V2_RATE_2x
 77#define AGP_MODE_RATE_4x		AGP_MODE_V2_RATE_4x
 78
 79#define AGPIOC_BASE       'A'
 80#define AGPIOC_INFO       _IOR (AGPIOC_BASE, 0, agp_info)
 81#define AGPIOC_ACQUIRE    _IO  (AGPIOC_BASE, 1)
 82#define AGPIOC_RELEASE    _IO  (AGPIOC_BASE, 2)
 83#define AGPIOC_SETUP      _IOW (AGPIOC_BASE, 3, agp_setup)
 84#if 0
 85#define AGPIOC_RESERVE    _IOW (AGPIOC_BASE, 4, agp_region)
 86#define AGPIOC_PROTECT    _IOW (AGPIOC_BASE, 5, agp_region)
 87#endif
 88#define AGPIOC_ALLOCATE   _IOWR(AGPIOC_BASE, 6, agp_allocate)
 89#define AGPIOC_DEALLOCATE _IOW (AGPIOC_BASE, 7, int)
 90#define AGPIOC_BIND       _IOW (AGPIOC_BASE, 8, agp_bind)
 91#define AGPIOC_UNBIND     _IOW (AGPIOC_BASE, 9, agp_unbind)
 92
 93typedef struct _agp_version {
 94	uint16_t major;
 95	uint16_t minor;
 96} agp_version;
 97
 98typedef struct _agp_info {
 99	agp_version version;	/* version of the driver        */
100	uint32_t bridge_id;	/* bridge vendor/device         */
101	uint32_t agp_mode;	/* mode info of bridge          */
102	off_t aper_base;	/* base of aperture             */
103	size_t aper_size;	/* size of aperture             */
104	size_t pg_total;	/* max pages (swap + system)    */
105	size_t pg_system;	/* max pages (system)           */
106	size_t pg_used;		/* current pages used           */
107} agp_info;
108
109typedef struct _agp_setup {
110	uint32_t agp_mode;		/* mode info of bridge          */
111} agp_setup;
112
113#if 0
114/*
115 * The "prot" down below needs still a "sleep" flag somehow ...
116 */
117typedef struct _agp_segment {
118	off_t pg_start;		/* starting page to populate    */
119	size_t pg_count;	/* number of pages              */
120	int prot;		/* prot flags for mmap          */
121} agp_segment;
122
123typedef struct _agp_region {
124	pid_t pid;		/* pid of process               */
125	size_t seg_count;	/* number of segments           */
126	struct _agp_segment *seg_list;
127} agp_region;
128#endif
129
130typedef struct _agp_allocate {
131	int key;		/* tag of allocation            */
132	size_t pg_count;	/* number of pages              */
133	uint32_t type;		/* 0 == normal, other devspec   */
134	uint32_t physical;	/* device specific (some devices
135				 * need a phys address of the
136				 * actual page behind the gatt
137				 * table)                        */
138} agp_allocate;
139
140typedef struct _agp_bind {
141	int key;		/* tag of allocation            */
142	off_t pg_start;		/* starting page to populate    */
143} agp_bind;
144
145typedef struct _agp_unbind {
146	int key;		/* tag of allocation            */
147	uint32_t priority;	/* priority for paging out      */
148} agp_unbind;
149
150#endif /* !_SYS_AGPIO_H_ */