fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/devices/pci.h *
7 * Created: 2004-06-05 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2004-2009 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#ifndef PCE_DEVICES_PCI_H
24#define PCE_DEVICES_PCI_H 1
25
26
27#include <stdio.h>
28
29#include <devices/memory.h>
30
31
32#define PCI_REG_MAX 8
33#define PCI_MEM_MAX 8
34
35#define PCIID_VENDOR_INTEL 0x8086
36#define PCIID_VENDOR_OPTI 0x1045
37#define PCIID_VENDOR_NS 0x100b
38#define PCIID_VENDOR_VIA 0x1106
39
40
41struct pci_bus_t;
42
43
44typedef struct {
45 unsigned index;
46
47 struct pci_bus_t *pci;
48
49 mem_blk_t *reg[PCI_REG_MAX];
50 mem_blk_t *mem[PCI_MEM_MAX];
51
52 unsigned char config[256];
53 unsigned char wrmask[256];
54
55 void *cfg_ext;
56
57 mem_get_uint8_f get_cfg8;
58 mem_get_uint16_f get_cfg16;
59 mem_get_uint32_f get_cfg32;
60
61 mem_set_uint8_f set_cfg8;
62 mem_set_uint16_f set_cfg16;
63 mem_set_uint32_f set_cfg32;
64
65 void (*intr[4]) (void *ext, unsigned char val);
66 void *intr_ext[4];
67 unsigned char intr_val[4];
68
69 void *ext;
70} pci_dev_t;
71
72
73typedef struct pci_bus_t {
74 pci_dev_t *dev[32];
75
76 memory_t *asio;
77 memory_t *asmem;
78
79 unsigned long cfgaddr;
80 unsigned long cfgdata;
81
82 void (*irq[32][4]) (void *ext, unsigned char val);
83 void *irq_ext[32][4];
84 unsigned char irq_val[32][4];
85} pci_bus_t;
86
87
88void pci_dev_init (pci_dev_t *dev);
89void pci_dev_free (pci_dev_t *dev);
90
91void pci_dev_set_intr_fct (pci_dev_t *dev, unsigned intr, void *ext, void *fct);
92void pci_dev_set_intr (pci_dev_t *dev, unsigned intr, unsigned char val);
93void pci_dev_set_inta (pci_dev_t *dev, unsigned char val);
94void pci_dev_set_intb (pci_dev_t *dev, unsigned char val);
95void pci_dev_set_intc (pci_dev_t *dev, unsigned char val);
96void pci_dev_set_intd (pci_dev_t *dev, unsigned char val);
97
98void pci_dev_set_device_id (pci_dev_t *dev, unsigned vendor, unsigned id);
99
100void pci_dev_set_cfg_mask (pci_dev_t *dev, unsigned i, unsigned n, int val);
101
102unsigned char pci_dev_get_cfg8 (pci_dev_t *dev, unsigned long addr);
103unsigned short pci_dev_get_cfg16 (pci_dev_t *dev, unsigned long addr);
104unsigned long pci_dev_get_cfg32 (pci_dev_t *dev, unsigned long addr);
105
106void pci_dev_set_cfg8 (pci_dev_t *dev, unsigned long addr, unsigned char val);
107void pci_dev_set_cfg16 (pci_dev_t *dev, unsigned long addr, unsigned short val);
108void pci_dev_set_cfg32 (pci_dev_t *dev, unsigned long addr, unsigned long val);
109
110
111void pci_init (pci_bus_t *pci);
112void pci_free (pci_bus_t *pci);
113
114void pci_set_device (pci_bus_t *pci, pci_dev_t *dev, unsigned i);
115
116void pci_set_asio (pci_bus_t *pci, memory_t *as);
117void pci_set_asmem (pci_bus_t *pci, memory_t *as);
118
119void pci_set_irq_fct (pci_bus_t *pci, unsigned dev, unsigned intr, void *ext, void *fct);
120
121void pci_set_cfg8 (pci_bus_t *pci, unsigned dev, unsigned long addr, unsigned char val);
122void pci_set_cfg16 (pci_bus_t *pci, unsigned dev, unsigned long addr, unsigned short val);
123void pci_set_cfg32 (pci_bus_t *pci, unsigned dev, unsigned long addr, unsigned long val);
124
125unsigned char pci_get_cfg8 (pci_bus_t *pci, unsigned dev, unsigned long addr);
126unsigned short pci_get_cfg16 (pci_bus_t *pci, unsigned dev, unsigned long addr);
127unsigned long pci_get_cfg32 (pci_bus_t *pci, unsigned dev, unsigned long addr);
128
129void pci_set_intr (pci_bus_t *pci, unsigned dev, unsigned intr, unsigned char val);
130void pci_set_inta (pci_bus_t *pci, unsigned dev, unsigned char val);
131void pci_set_intb (pci_bus_t *pci, unsigned dev, unsigned char val);
132void pci_set_intc (pci_bus_t *pci, unsigned dev, unsigned char val);
133void pci_set_intd (pci_bus_t *pci, unsigned dev, unsigned char val);
134
135unsigned long pci_get_config_addr (pci_bus_t *pci);
136unsigned char pci_get_config_data8 (pci_bus_t *pci, unsigned addr);
137unsigned short pci_get_config_data16 (pci_bus_t *pci, unsigned addr);
138unsigned long pci_get_config_data32 (pci_bus_t *pci);
139
140void pci_set_config_addr (pci_bus_t *pci, unsigned long val);
141void pci_set_config_data8 (pci_bus_t *pci, unsigned addr, unsigned char val);
142void pci_set_config_data16 (pci_bus_t *pci, unsigned addr, unsigned short val);
143void pci_set_config_data32 (pci_bus_t *pci, unsigned long val);
144
145
146#endif