pcivar.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 258 行
H
258 行
/****************************************************************************** $\Id: pcivar.h,v 1.6.4.1 1996/06/26 04:36:54 davidg Exp $**** Declarations for pci device drivers.**** FreeBSD****-------------------------------------------------------------------------**** Copyright (c) 1994 Wolfgang Stanglmeier. 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.** 3. The name of the author may not be used to endorse or promote products** derived from this software without 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.******************************************************************************/#ifndef __PCI_VAR_H__#define __PCI_VAR_H__ "pl2 95/03/21"/*-----------------------------------------------------------------**** main pci initialization function.** called at boot time from autoconf.c****-----------------------------------------------------------------*/void pci_configure (void);/*-----------------------------------------------------------------**** The pci configuration id describes a pci device on the bus.** It is constructed from: bus, device & function numbers.****-----------------------------------------------------------------*/typedef union { u_long cfg1; struct { u_char enable; u_char forward; u_short port; } cfg2; unsigned tag; } pcici_t;#define sametag(x,y) ((x).tag == (y).tag)/*-----------------------------------------------------------------**** Each pci device has an unique device id.** It is used to find a matching driver.****-----------------------------------------------------------------*/typedef u_long pcidi_t;/*-----------------------------------------------------------------**** The following functions are provided for the device driver** to read/write the configuration space.**** pci_conf_read():** Read a long word from the pci configuration space.** Requires a tag (from pcitag) and the register** number (should be a long word alligned one).**** pci_conf_write():** Writes a long word to the pci configuration space.** Requires a tag (from pcitag), the register number** (should be a long word alligned one), and a value.****-----------------------------------------------------------------*/u_long pci_conf_read (pcici_t tag, u_long reg );void pci_conf_write (pcici_t tag, u_long reg, u_long data);/*-----------------------------------------------------------------**** The pci driver structure.**** name: The short device name.**** probe: Checks if the driver can support a device** with this type. The tag may be used to get** more info with pci_read_conf(). See below.** It returns a string with the devices name,** or a NULL pointer, if the driver cannot** support this device.**** attach: Allocate a control structure and prepare** it. This function may use the pci mapping** functions. See below.** (configuration id) or type.**** count: A pointer to a unit counter.** It's used by the pci configurator to** allocate unit numbers.****-----------------------------------------------------------------*/struct kern_devconf;struct pci_device { char* pd_name; char* (*pd_probe ) (pcici_t tag, pcidi_t type); void (*pd_attach) (pcici_t tag, int unit); u_long *pd_count; int (*pd_shutdown) (struct kern_devconf *, int);};/*-----------------------------------------------------------------**** This table includes pointers to all pci device drivers.** It should be generated by the linker.****-----------------------------------------------------------------*/extern struct linker_set pcidevice_set;extern unsigned pci_max_burst_len; /* log2 of safe burst transfer length */extern unsigned pci_mechanism;extern unsigned pci_maxdevice;/*-----------------------------------------------------------------**** The pci-devconf interface.****-----------------------------------------------------------------*/struct pci_info { u_char pi_bus; u_char pi_device; u_char pi_func; u_char pi_dummy;};#define PCI_EXT_CONF_LEN (16)#define PCI_EXTERNAL_LEN (sizeof(struct pci_externalize_buffer))struct pci_externalize_buffer { struct pci_info peb_pci_info; u_long peb_config[PCI_EXT_CONF_LEN];};/*-----------------------------------------------------------------**** Map a pci device to physical and virtual memory.**** Entry selects the register in the pci configuration** space, which supplies the size of the region, and** receives the physical address.**** In case of success the function sets the addresses** in *va and *pa, and returns 1.** In case of errors a message is written,** and the function returns 0.****-----------------------------------------------------------------*/int pci_map_mem (pcici_t tag, u_long entry, u_long * va, u_long * pa);/*-----------------------------------------------------------------**** Map a pci device to an io port area.**** Entry selects the register in the pci configuration** space, which supplies the size of the region, and** receives the port number.**** In case of success the function sets the port number in pa,** and returns 1.** In case of errors a message is written,** and the function returns 0.****-----------------------------------------------------------------*/int pci_map_port (pcici_t tag, u_long entry, u_short * pa);/*-----------------------------------------------------------------**** Map a pci interrupt to an isa irq line, and enable the interrupt.**** -----------------**** func is the interrupt handler, arg is the argument** to the handler (usually a pointer to a softc).**** The maskptr argument should be &bio_imask,** &net_imask etc. or NULL.**** If there is any error, a message is written, and** the function returns with zero.** Else it returns with a value different to zero.**** -----------------**** The irq number is read from the configuration space.** (Should have been set by the bios).**** Supports multiple handlers per irq (shared interrupts).**** -----------------**** There is code to support shared edge triggered ints.** This relies on the cooperation of the interrupt handlers:** they have to return a value <>0 if and only if something** was done. Beware of the performance penalty.****-----------------------------------------------------------------*/struct pci_int_desc { struct pci_int_desc * pcid_next; pcici_t pcid_tag; int (*pcid_handler)(); void* pcid_argument; unsigned * pcid_maskptr; unsigned pcid_tally; unsigned pcid_mask;};int pci_map_int (pcici_t tag, int (*func)(), void* arg, unsigned * maskptr);int pci_unmap_int (pcici_t tag);#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?