Statistics
| Branch: | Revision:

root / hw / pci.c @ 71be0fc3

History | View | Annotate | Download (42.7 kB)

1 69b91039 bellard
/*
2 69b91039 bellard
 * QEMU PCI bus manager
3 69b91039 bellard
 *
4 69b91039 bellard
 * Copyright (c) 2004 Fabrice Bellard
5 69b91039 bellard
 * 
6 69b91039 bellard
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 69b91039 bellard
 * of this software and associated documentation files (the "Software"), to deal
8 69b91039 bellard
 * in the Software without restriction, including without limitation the rights
9 69b91039 bellard
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 69b91039 bellard
 * copies of the Software, and to permit persons to whom the Software is
11 69b91039 bellard
 * furnished to do so, subject to the following conditions:
12 69b91039 bellard
 *
13 69b91039 bellard
 * The above copyright notice and this permission notice shall be included in
14 69b91039 bellard
 * all copies or substantial portions of the Software.
15 69b91039 bellard
 *
16 69b91039 bellard
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 69b91039 bellard
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 69b91039 bellard
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 69b91039 bellard
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 69b91039 bellard
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 69b91039 bellard
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 69b91039 bellard
 * THE SOFTWARE.
23 69b91039 bellard
 */
24 69b91039 bellard
#include "vl.h"
25 69b91039 bellard
26 69b91039 bellard
//#define DEBUG_PCI
27 69b91039 bellard
28 0ac32c83 bellard
#define PCI_VENDOR_ID                0x00        /* 16 bits */
29 0ac32c83 bellard
#define PCI_DEVICE_ID                0x02        /* 16 bits */
30 0ac32c83 bellard
#define PCI_COMMAND                0x04        /* 16 bits */
31 0ac32c83 bellard
#define  PCI_COMMAND_IO                0x1        /* Enable response in I/O space */
32 0ac32c83 bellard
#define  PCI_COMMAND_MEMORY        0x2        /* Enable response in Memory space */
33 0ac32c83 bellard
#define PCI_CLASS_DEVICE        0x0a    /* Device class */
34 0ac32c83 bellard
#define PCI_INTERRUPT_LINE        0x3c        /* 8 bits */
35 0ac32c83 bellard
#define PCI_INTERRUPT_PIN        0x3d        /* 8 bits */
36 0ac32c83 bellard
#define PCI_MIN_GNT                0x3e        /* 8 bits */
37 0ac32c83 bellard
#define PCI_MAX_LAT                0x3f        /* 8 bits */
38 0ac32c83 bellard
39 0ac32c83 bellard
/* just used for simpler irq handling. */
40 0ac32c83 bellard
#define PCI_DEVICES_MAX 64
41 0ac32c83 bellard
#define PCI_IRQ_WORDS   ((PCI_DEVICES_MAX + 31) / 32)
42 0ac32c83 bellard
43 30468f78 bellard
struct PCIBus {
44 30468f78 bellard
    int bus_num;
45 30468f78 bellard
    int devfn_min;
46 30468f78 bellard
    void (*set_irq)(PCIDevice *pci_dev, int irq_num, int level);
47 30468f78 bellard
    uint32_t config_reg; /* XXX: suppress */
48 30468f78 bellard
    openpic_t *openpic; /* XXX: suppress */
49 30468f78 bellard
    PCIDevice *devices[256];
50 30468f78 bellard
};
51 69b91039 bellard
52 69b91039 bellard
target_phys_addr_t pci_mem_base;
53 0ac32c83 bellard
static int pci_irq_index;
54 0ac32c83 bellard
static uint32_t pci_irq_levels[4][PCI_IRQ_WORDS];
55 30468f78 bellard
static PCIBus *first_bus;
56 30468f78 bellard
57 30468f78 bellard
static PCIBus *pci_register_bus(void)
58 30468f78 bellard
{
59 30468f78 bellard
    PCIBus *bus;
60 30468f78 bellard
    bus = qemu_mallocz(sizeof(PCIBus));
61 30468f78 bellard
    first_bus = bus;
62 30468f78 bellard
    return bus;
63 30468f78 bellard
}
64 69b91039 bellard
65 30ca2aab bellard
void generic_pci_save(QEMUFile* f, void *opaque)
66 30ca2aab bellard
{
67 30ca2aab bellard
    PCIDevice* s=(PCIDevice*)opaque;
68 30ca2aab bellard
69 30ca2aab bellard
    qemu_put_buffer(f, s->config, 256);
70 30ca2aab bellard
}
71 30ca2aab bellard
72 30ca2aab bellard
int generic_pci_load(QEMUFile* f, void *opaque, int version_id)
73 30ca2aab bellard
{
74 30ca2aab bellard
    PCIDevice* s=(PCIDevice*)opaque;
75 30ca2aab bellard
76 30ca2aab bellard
    if (version_id != 1)
77 30ca2aab bellard
        return -EINVAL;
78 30ca2aab bellard
79 30ca2aab bellard
    qemu_get_buffer(f, s->config, 256);
80 30ca2aab bellard
    return 0;
81 30ca2aab bellard
}
82 30ca2aab bellard
83 69b91039 bellard
/* -1 for devfn means auto assign */
84 30468f78 bellard
PCIDevice *pci_register_device(PCIBus *bus, const char *name, 
85 30468f78 bellard
                               int instance_size, int devfn,
86 69b91039 bellard
                               PCIConfigReadFunc *config_read, 
87 69b91039 bellard
                               PCIConfigWriteFunc *config_write)
88 69b91039 bellard
{
89 30468f78 bellard
    PCIDevice *pci_dev;
90 69b91039 bellard
91 0ac32c83 bellard
    if (pci_irq_index >= PCI_DEVICES_MAX)
92 0ac32c83 bellard
        return NULL;
93 0ac32c83 bellard
    
94 69b91039 bellard
    if (devfn < 0) {
95 30468f78 bellard
        for(devfn = bus->devfn_min ; devfn < 256; devfn += 8) {
96 30468f78 bellard
            if (!bus->devices[devfn])
97 69b91039 bellard
                goto found;
98 69b91039 bellard
        }
99 69b91039 bellard
        return NULL;
100 69b91039 bellard
    found: ;
101 69b91039 bellard
    }
102 69b91039 bellard
    pci_dev = qemu_mallocz(instance_size);
103 69b91039 bellard
    if (!pci_dev)
104 69b91039 bellard
        return NULL;
105 30468f78 bellard
    pci_dev->bus = bus;
106 69b91039 bellard
    pci_dev->devfn = devfn;
107 69b91039 bellard
    pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
108 0ac32c83 bellard
109 0ac32c83 bellard
    if (!config_read)
110 0ac32c83 bellard
        config_read = pci_default_read_config;
111 0ac32c83 bellard
    if (!config_write)
112 0ac32c83 bellard
        config_write = pci_default_write_config;
113 69b91039 bellard
    pci_dev->config_read = config_read;
114 69b91039 bellard
    pci_dev->config_write = config_write;
115 0ac32c83 bellard
    pci_dev->irq_index = pci_irq_index++;
116 30468f78 bellard
    bus->devices[devfn] = pci_dev;
117 69b91039 bellard
    return pci_dev;
118 69b91039 bellard
}
119 69b91039 bellard
120 69b91039 bellard
void pci_register_io_region(PCIDevice *pci_dev, int region_num, 
121 69b91039 bellard
                            uint32_t size, int type, 
122 69b91039 bellard
                            PCIMapIORegionFunc *map_func)
123 69b91039 bellard
{
124 69b91039 bellard
    PCIIORegion *r;
125 69b91039 bellard
126 8a8696a3 bellard
    if ((unsigned int)region_num >= PCI_NUM_REGIONS)
127 69b91039 bellard
        return;
128 69b91039 bellard
    r = &pci_dev->io_regions[region_num];
129 69b91039 bellard
    r->addr = -1;
130 69b91039 bellard
    r->size = size;
131 69b91039 bellard
    r->type = type;
132 69b91039 bellard
    r->map_func = map_func;
133 69b91039 bellard
}
134 69b91039 bellard
135 0ac32c83 bellard
static void pci_addr_writel(void* opaque, uint32_t addr, uint32_t val)
136 69b91039 bellard
{
137 30468f78 bellard
    PCIBus *s = opaque;
138 69b91039 bellard
    s->config_reg = val;
139 69b91039 bellard
}
140 69b91039 bellard
141 0ac32c83 bellard
static uint32_t pci_addr_readl(void* opaque, uint32_t addr)
142 69b91039 bellard
{
143 30468f78 bellard
    PCIBus *s = opaque;
144 69b91039 bellard
    return s->config_reg;
145 69b91039 bellard
}
146 69b91039 bellard
147 0ac32c83 bellard
static void pci_update_mappings(PCIDevice *d)
148 0ac32c83 bellard
{
149 0ac32c83 bellard
    PCIIORegion *r;
150 0ac32c83 bellard
    int cmd, i;
151 8a8696a3 bellard
    uint32_t last_addr, new_addr, config_ofs;
152 0ac32c83 bellard
    
153 0ac32c83 bellard
    cmd = le16_to_cpu(*(uint16_t *)(d->config + PCI_COMMAND));
154 8a8696a3 bellard
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
155 0ac32c83 bellard
        r = &d->io_regions[i];
156 8a8696a3 bellard
        if (i == PCI_ROM_SLOT) {
157 8a8696a3 bellard
            config_ofs = 0x30;
158 8a8696a3 bellard
        } else {
159 8a8696a3 bellard
            config_ofs = 0x10 + i * 4;
160 8a8696a3 bellard
        }
161 0ac32c83 bellard
        if (r->size != 0) {
162 0ac32c83 bellard
            if (r->type & PCI_ADDRESS_SPACE_IO) {
163 0ac32c83 bellard
                if (cmd & PCI_COMMAND_IO) {
164 0ac32c83 bellard
                    new_addr = le32_to_cpu(*(uint32_t *)(d->config + 
165 8a8696a3 bellard
                                                         config_ofs));
166 0ac32c83 bellard
                    new_addr = new_addr & ~(r->size - 1);
167 0ac32c83 bellard
                    last_addr = new_addr + r->size - 1;
168 0ac32c83 bellard
                    /* NOTE: we have only 64K ioports on PC */
169 0ac32c83 bellard
                    if (last_addr <= new_addr || new_addr == 0 ||
170 0ac32c83 bellard
                        last_addr >= 0x10000) {
171 0ac32c83 bellard
                        new_addr = -1;
172 0ac32c83 bellard
                    }
173 0ac32c83 bellard
                } else {
174 0ac32c83 bellard
                    new_addr = -1;
175 0ac32c83 bellard
                }
176 0ac32c83 bellard
            } else {
177 0ac32c83 bellard
                if (cmd & PCI_COMMAND_MEMORY) {
178 0ac32c83 bellard
                    new_addr = le32_to_cpu(*(uint32_t *)(d->config + 
179 8a8696a3 bellard
                                                         config_ofs));
180 8a8696a3 bellard
                    /* the ROM slot has a specific enable bit */
181 8a8696a3 bellard
                    if (i == PCI_ROM_SLOT && !(new_addr & 1))
182 8a8696a3 bellard
                        goto no_mem_map;
183 0ac32c83 bellard
                    new_addr = new_addr & ~(r->size - 1);
184 0ac32c83 bellard
                    last_addr = new_addr + r->size - 1;
185 0ac32c83 bellard
                    /* NOTE: we do not support wrapping */
186 0ac32c83 bellard
                    /* XXX: as we cannot support really dynamic
187 0ac32c83 bellard
                       mappings, we handle specific values as invalid
188 0ac32c83 bellard
                       mappings. */
189 0ac32c83 bellard
                    if (last_addr <= new_addr || new_addr == 0 ||
190 0ac32c83 bellard
                        last_addr == -1) {
191 0ac32c83 bellard
                        new_addr = -1;
192 0ac32c83 bellard
                    }
193 0ac32c83 bellard
                } else {
194 8a8696a3 bellard
                no_mem_map:
195 0ac32c83 bellard
                    new_addr = -1;
196 0ac32c83 bellard
                }
197 0ac32c83 bellard
            }
198 0ac32c83 bellard
            /* now do the real mapping */
199 0ac32c83 bellard
            if (new_addr != r->addr) {
200 0ac32c83 bellard
                if (r->addr != -1) {
201 0ac32c83 bellard
                    if (r->type & PCI_ADDRESS_SPACE_IO) {
202 0ac32c83 bellard
                        int class;
203 0ac32c83 bellard
                        /* NOTE: specific hack for IDE in PC case:
204 0ac32c83 bellard
                           only one byte must be mapped. */
205 0ac32c83 bellard
                        class = d->config[0x0a] | (d->config[0x0b] << 8);
206 0ac32c83 bellard
                        if (class == 0x0101 && r->size == 4) {
207 0ac32c83 bellard
                            isa_unassign_ioport(r->addr + 2, 1);
208 0ac32c83 bellard
                        } else {
209 0ac32c83 bellard
                            isa_unassign_ioport(r->addr, r->size);
210 0ac32c83 bellard
                        }
211 0ac32c83 bellard
                    } else {
212 0ac32c83 bellard
                        cpu_register_physical_memory(r->addr + pci_mem_base, 
213 0ac32c83 bellard
                                                     r->size, 
214 0ac32c83 bellard
                                                     IO_MEM_UNASSIGNED);
215 0ac32c83 bellard
                    }
216 0ac32c83 bellard
                }
217 0ac32c83 bellard
                r->addr = new_addr;
218 0ac32c83 bellard
                if (r->addr != -1) {
219 0ac32c83 bellard
                    r->map_func(d, i, r->addr, r->size, r->type);
220 0ac32c83 bellard
                }
221 0ac32c83 bellard
            }
222 0ac32c83 bellard
        }
223 0ac32c83 bellard
    }
224 0ac32c83 bellard
}
225 0ac32c83 bellard
226 0ac32c83 bellard
uint32_t pci_default_read_config(PCIDevice *d, 
227 0ac32c83 bellard
                                 uint32_t address, int len)
228 69b91039 bellard
{
229 0ac32c83 bellard
    uint32_t val;
230 0ac32c83 bellard
    switch(len) {
231 0ac32c83 bellard
    case 1:
232 0ac32c83 bellard
        val = d->config[address];
233 0ac32c83 bellard
        break;
234 0ac32c83 bellard
    case 2:
235 0ac32c83 bellard
        val = le16_to_cpu(*(uint16_t *)(d->config + address));
236 0ac32c83 bellard
        break;
237 0ac32c83 bellard
    default:
238 0ac32c83 bellard
    case 4:
239 0ac32c83 bellard
        val = le32_to_cpu(*(uint32_t *)(d->config + address));
240 0ac32c83 bellard
        break;
241 0ac32c83 bellard
    }
242 0ac32c83 bellard
    return val;
243 0ac32c83 bellard
}
244 0ac32c83 bellard
245 0ac32c83 bellard
void pci_default_write_config(PCIDevice *d, 
246 0ac32c83 bellard
                              uint32_t address, uint32_t val, int len)
247 0ac32c83 bellard
{
248 0ac32c83 bellard
    int can_write, i;
249 7bf5be70 bellard
    uint32_t end, addr;
250 0ac32c83 bellard
251 8a8696a3 bellard
    if (len == 4 && ((address >= 0x10 && address < 0x10 + 4 * 6) || 
252 8a8696a3 bellard
                     (address >= 0x30 && address < 0x34))) {
253 0ac32c83 bellard
        PCIIORegion *r;
254 0ac32c83 bellard
        int reg;
255 0ac32c83 bellard
256 8a8696a3 bellard
        if ( address >= 0x30 ) {
257 8a8696a3 bellard
            reg = PCI_ROM_SLOT;
258 8a8696a3 bellard
        }else{
259 8a8696a3 bellard
            reg = (address - 0x10) >> 2;
260 8a8696a3 bellard
        }
261 0ac32c83 bellard
        r = &d->io_regions[reg];
262 0ac32c83 bellard
        if (r->size == 0)
263 0ac32c83 bellard
            goto default_config;
264 0ac32c83 bellard
        /* compute the stored value */
265 8a8696a3 bellard
        if (reg == PCI_ROM_SLOT) {
266 8a8696a3 bellard
            /* keep ROM enable bit */
267 8a8696a3 bellard
            val &= (~(r->size - 1)) | 1;
268 8a8696a3 bellard
        } else {
269 8a8696a3 bellard
            val &= ~(r->size - 1);
270 8a8696a3 bellard
            val |= r->type;
271 8a8696a3 bellard
        }
272 8a8696a3 bellard
        *(uint32_t *)(d->config + address) = cpu_to_le32(val);
273 0ac32c83 bellard
        pci_update_mappings(d);
274 69b91039 bellard
        return;
275 0ac32c83 bellard
    }
276 0ac32c83 bellard
 default_config:
277 0ac32c83 bellard
    /* not efficient, but simple */
278 7bf5be70 bellard
    addr = address;
279 0ac32c83 bellard
    for(i = 0; i < len; i++) {
280 0ac32c83 bellard
        /* default read/write accesses */
281 1f62d938 bellard
        switch(d->config[0x0e]) {
282 0ac32c83 bellard
        case 0x00:
283 1f62d938 bellard
        case 0x80:
284 1f62d938 bellard
            switch(addr) {
285 1f62d938 bellard
            case 0x00:
286 1f62d938 bellard
            case 0x01:
287 1f62d938 bellard
            case 0x02:
288 1f62d938 bellard
            case 0x03:
289 1f62d938 bellard
            case 0x08:
290 1f62d938 bellard
            case 0x09:
291 1f62d938 bellard
            case 0x0a:
292 1f62d938 bellard
            case 0x0b:
293 1f62d938 bellard
            case 0x0e:
294 1f62d938 bellard
            case 0x10 ... 0x27: /* base */
295 1f62d938 bellard
            case 0x30 ... 0x33: /* rom */
296 1f62d938 bellard
            case 0x3d:
297 1f62d938 bellard
                can_write = 0;
298 1f62d938 bellard
                break;
299 1f62d938 bellard
            default:
300 1f62d938 bellard
                can_write = 1;
301 1f62d938 bellard
                break;
302 1f62d938 bellard
            }
303 0ac32c83 bellard
            break;
304 0ac32c83 bellard
        default:
305 1f62d938 bellard
        case 0x01:
306 1f62d938 bellard
            switch(addr) {
307 1f62d938 bellard
            case 0x00:
308 1f62d938 bellard
            case 0x01:
309 1f62d938 bellard
            case 0x02:
310 1f62d938 bellard
            case 0x03:
311 1f62d938 bellard
            case 0x08:
312 1f62d938 bellard
            case 0x09:
313 1f62d938 bellard
            case 0x0a:
314 1f62d938 bellard
            case 0x0b:
315 1f62d938 bellard
            case 0x0e:
316 1f62d938 bellard
            case 0x38 ... 0x3b: /* rom */
317 1f62d938 bellard
            case 0x3d:
318 1f62d938 bellard
                can_write = 0;
319 1f62d938 bellard
                break;
320 1f62d938 bellard
            default:
321 1f62d938 bellard
                can_write = 1;
322 1f62d938 bellard
                break;
323 1f62d938 bellard
            }
324 0ac32c83 bellard
            break;
325 0ac32c83 bellard
        }
326 0ac32c83 bellard
        if (can_write) {
327 7bf5be70 bellard
            d->config[addr] = val;
328 0ac32c83 bellard
        }
329 7bf5be70 bellard
        addr++;
330 0ac32c83 bellard
        val >>= 8;
331 0ac32c83 bellard
    }
332 0ac32c83 bellard
333 0ac32c83 bellard
    end = address + len;
334 0ac32c83 bellard
    if (end > PCI_COMMAND && address < (PCI_COMMAND + 2)) {
335 0ac32c83 bellard
        /* if the command register is modified, we must modify the mappings */
336 0ac32c83 bellard
        pci_update_mappings(d);
337 69b91039 bellard
    }
338 69b91039 bellard
}
339 69b91039 bellard
340 69b91039 bellard
static void pci_data_write(void *opaque, uint32_t addr, 
341 69b91039 bellard
                           uint32_t val, int len)
342 69b91039 bellard
{
343 30468f78 bellard
    PCIBus *s = opaque;
344 30468f78 bellard
    PCIDevice *pci_dev;
345 30468f78 bellard
    int config_addr, bus_num;
346 69b91039 bellard
    
347 69b91039 bellard
#if defined(DEBUG_PCI) && 0
348 69b91039 bellard
    printf("pci_data_write: addr=%08x val=%08x len=%d\n",
349 69b91039 bellard
           s->config_reg, val, len);
350 69b91039 bellard
#endif
351 69b91039 bellard
    if (!(s->config_reg & (1 << 31))) {
352 69b91039 bellard
        return;
353 69b91039 bellard
    }
354 69b91039 bellard
    if ((s->config_reg & 0x3) != 0) {
355 69b91039 bellard
        return;
356 69b91039 bellard
    }
357 30468f78 bellard
    bus_num = (s->config_reg >> 16) & 0xff;
358 30468f78 bellard
    if (bus_num != 0)
359 69b91039 bellard
        return;
360 30468f78 bellard
    pci_dev = s->devices[(s->config_reg >> 8) & 0xff];
361 69b91039 bellard
    if (!pci_dev)
362 69b91039 bellard
        return;
363 69b91039 bellard
    config_addr = (s->config_reg & 0xfc) | (addr & 3);
364 69b91039 bellard
#if defined(DEBUG_PCI)
365 69b91039 bellard
    printf("pci_config_write: %s: addr=%02x val=%08x len=%d\n",
366 69b91039 bellard
           pci_dev->name, config_addr, val, len);
367 69b91039 bellard
#endif
368 0ac32c83 bellard
    pci_dev->config_write(pci_dev, config_addr, val, len);
369 69b91039 bellard
}
370 69b91039 bellard
371 69b91039 bellard
static uint32_t pci_data_read(void *opaque, uint32_t addr, 
372 69b91039 bellard
                              int len)
373 69b91039 bellard
{
374 30468f78 bellard
    PCIBus *s = opaque;
375 30468f78 bellard
    PCIDevice *pci_dev;
376 30468f78 bellard
    int config_addr, bus_num;
377 69b91039 bellard
    uint32_t val;
378 69b91039 bellard
379 69b91039 bellard
    if (!(s->config_reg & (1 << 31)))
380 69b91039 bellard
        goto fail;
381 69b91039 bellard
    if ((s->config_reg & 0x3) != 0)
382 69b91039 bellard
        goto fail;
383 30468f78 bellard
    bus_num = (s->config_reg >> 16) & 0xff;
384 30468f78 bellard
    if (bus_num != 0)
385 69b91039 bellard
        goto fail;
386 30468f78 bellard
    pci_dev = s->devices[(s->config_reg >> 8) & 0xff];
387 69b91039 bellard
    if (!pci_dev) {
388 69b91039 bellard
    fail:
389 63ce9e0a bellard
        switch(len) {
390 63ce9e0a bellard
        case 1:
391 63ce9e0a bellard
            val = 0xff;
392 63ce9e0a bellard
            break;
393 63ce9e0a bellard
        case 2:
394 63ce9e0a bellard
            val = 0xffff;
395 63ce9e0a bellard
            break;
396 63ce9e0a bellard
        default:
397 63ce9e0a bellard
        case 4:
398 63ce9e0a bellard
            val = 0xffffffff;
399 63ce9e0a bellard
            break;
400 63ce9e0a bellard
        }
401 69b91039 bellard
        goto the_end;
402 69b91039 bellard
    }
403 69b91039 bellard
    config_addr = (s->config_reg & 0xfc) | (addr & 3);
404 69b91039 bellard
    val = pci_dev->config_read(pci_dev, config_addr, len);
405 69b91039 bellard
#if defined(DEBUG_PCI)
406 69b91039 bellard
    printf("pci_config_read: %s: addr=%02x val=%08x len=%d\n",
407 69b91039 bellard
           pci_dev->name, config_addr, val, len);
408 69b91039 bellard
#endif
409 69b91039 bellard
 the_end:
410 69b91039 bellard
#if defined(DEBUG_PCI) && 0
411 69b91039 bellard
    printf("pci_data_read: addr=%08x val=%08x len=%d\n",
412 69b91039 bellard
           s->config_reg, val, len);
413 69b91039 bellard
#endif
414 69b91039 bellard
    return val;
415 69b91039 bellard
}
416 69b91039 bellard
417 69b91039 bellard
static void pci_data_writeb(void* opaque, uint32_t addr, uint32_t val)
418 69b91039 bellard
{
419 69b91039 bellard
    pci_data_write(opaque, addr, val, 1);
420 69b91039 bellard
}
421 69b91039 bellard
422 69b91039 bellard
static void pci_data_writew(void* opaque, uint32_t addr, uint32_t val)
423 69b91039 bellard
{
424 69b91039 bellard
    pci_data_write(opaque, addr, val, 2);
425 69b91039 bellard
}
426 69b91039 bellard
427 69b91039 bellard
static void pci_data_writel(void* opaque, uint32_t addr, uint32_t val)
428 69b91039 bellard
{
429 69b91039 bellard
    pci_data_write(opaque, addr, val, 4);
430 69b91039 bellard
}
431 69b91039 bellard
432 69b91039 bellard
static uint32_t pci_data_readb(void* opaque, uint32_t addr)
433 69b91039 bellard
{
434 69b91039 bellard
    return pci_data_read(opaque, addr, 1);
435 69b91039 bellard
}
436 69b91039 bellard
437 69b91039 bellard
static uint32_t pci_data_readw(void* opaque, uint32_t addr)
438 69b91039 bellard
{
439 69b91039 bellard
    return pci_data_read(opaque, addr, 2);
440 69b91039 bellard
}
441 69b91039 bellard
442 69b91039 bellard
static uint32_t pci_data_readl(void* opaque, uint32_t addr)
443 69b91039 bellard
{
444 69b91039 bellard
    return pci_data_read(opaque, addr, 4);
445 69b91039 bellard
}
446 69b91039 bellard
447 69b91039 bellard
/* i440FX PCI bridge */
448 69b91039 bellard
449 30468f78 bellard
static void piix3_set_irq(PCIDevice *pci_dev, int irq_num, int level);
450 30468f78 bellard
451 30468f78 bellard
PCIBus *i440fx_init(void)
452 69b91039 bellard
{
453 30468f78 bellard
    PCIBus *s;
454 69b91039 bellard
    PCIDevice *d;
455 69b91039 bellard
456 30468f78 bellard
    s = pci_register_bus();
457 30468f78 bellard
    s->set_irq = piix3_set_irq;
458 30468f78 bellard
459 0ac32c83 bellard
    register_ioport_write(0xcf8, 4, 4, pci_addr_writel, s);
460 0ac32c83 bellard
    register_ioport_read(0xcf8, 4, 4, pci_addr_readl, s);
461 69b91039 bellard
462 69b91039 bellard
    register_ioport_write(0xcfc, 4, 1, pci_data_writeb, s);
463 69b91039 bellard
    register_ioport_write(0xcfc, 4, 2, pci_data_writew, s);
464 69b91039 bellard
    register_ioport_write(0xcfc, 4, 4, pci_data_writel, s);
465 69b91039 bellard
    register_ioport_read(0xcfc, 4, 1, pci_data_readb, s);
466 69b91039 bellard
    register_ioport_read(0xcfc, 4, 2, pci_data_readw, s);
467 69b91039 bellard
    register_ioport_read(0xcfc, 4, 4, pci_data_readl, s);
468 69b91039 bellard
469 30468f78 bellard
    d = pci_register_device(s, "i440FX", sizeof(PCIDevice), 0, 
470 0ac32c83 bellard
                            NULL, NULL);
471 69b91039 bellard
472 69b91039 bellard
    d->config[0x00] = 0x86; // vendor_id
473 69b91039 bellard
    d->config[0x01] = 0x80;
474 69b91039 bellard
    d->config[0x02] = 0x37; // device_id
475 69b91039 bellard
    d->config[0x03] = 0x12;
476 69b91039 bellard
    d->config[0x08] = 0x02; // revision
477 358c6407 bellard
    d->config[0x0a] = 0x00; // class_sub = host2pci
478 69b91039 bellard
    d->config[0x0b] = 0x06; // class_base = PCI_bridge
479 358c6407 bellard
    d->config[0x0e] = 0x00; // header_type
480 30468f78 bellard
    return s;
481 69b91039 bellard
}
482 69b91039 bellard
483 0ac32c83 bellard
/* PIIX3 PCI to ISA bridge */
484 0ac32c83 bellard
485 0ac32c83 bellard
typedef struct PIIX3State {
486 0ac32c83 bellard
    PCIDevice dev;
487 0ac32c83 bellard
} PIIX3State;
488 0ac32c83 bellard
489 0ac32c83 bellard
PIIX3State *piix3_state;
490 0ac32c83 bellard
491 30468f78 bellard
/* return the global irq number corresponding to a given device irq
492 30468f78 bellard
   pin. We could also use the bus number to have a more precise
493 30468f78 bellard
   mapping. */
494 30468f78 bellard
static inline int pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
495 30468f78 bellard
{
496 30468f78 bellard
    int slot_addend;
497 39d22439 bellard
    slot_addend = (pci_dev->devfn >> 3) - 1;
498 30468f78 bellard
    return (irq_num + slot_addend) & 3;
499 30468f78 bellard
}
500 30468f78 bellard
501 72cc6cfe bellard
static inline int get_pci_irq_level(int irq_num)
502 72cc6cfe bellard
{
503 72cc6cfe bellard
    int pic_level;
504 72cc6cfe bellard
#if (PCI_IRQ_WORDS == 2)
505 72cc6cfe bellard
    pic_level = ((pci_irq_levels[irq_num][0] | 
506 72cc6cfe bellard
                  pci_irq_levels[irq_num][1]) != 0);
507 72cc6cfe bellard
#else
508 72cc6cfe bellard
    {
509 72cc6cfe bellard
        int i;
510 72cc6cfe bellard
        pic_level = 0;
511 72cc6cfe bellard
        for(i = 0; i < PCI_IRQ_WORDS; i++) {
512 72cc6cfe bellard
            if (pci_irq_levels[irq_num][i]) {
513 72cc6cfe bellard
                pic_level = 1;
514 72cc6cfe bellard
                break;
515 72cc6cfe bellard
            }
516 72cc6cfe bellard
        }
517 72cc6cfe bellard
    }
518 72cc6cfe bellard
#endif
519 72cc6cfe bellard
    return pic_level;
520 72cc6cfe bellard
}
521 72cc6cfe bellard
522 30468f78 bellard
static void piix3_set_irq(PCIDevice *pci_dev, int irq_num, int level)
523 30468f78 bellard
{
524 30468f78 bellard
    int irq_index, shift, pic_irq, pic_level;
525 30468f78 bellard
    uint32_t *p;
526 30468f78 bellard
527 30468f78 bellard
    irq_num = pci_slot_get_pirq(pci_dev, irq_num);
528 30468f78 bellard
    irq_index = pci_dev->irq_index;
529 30468f78 bellard
    p = &pci_irq_levels[irq_num][irq_index >> 5];
530 30468f78 bellard
    shift = (irq_index & 0x1f);
531 30468f78 bellard
    *p = (*p & ~(1 << shift)) | (level << shift);
532 30468f78 bellard
533 30468f78 bellard
    /* now we change the pic irq level according to the piix irq mappings */
534 72cc6cfe bellard
    /* XXX: optimize */
535 30468f78 bellard
    pic_irq = piix3_state->dev.config[0x60 + irq_num];
536 30468f78 bellard
    if (pic_irq < 16) {
537 30468f78 bellard
        /* the pic level is the logical OR of all the PCI irqs mapped
538 30468f78 bellard
           to it */
539 30468f78 bellard
        pic_level = 0;
540 72cc6cfe bellard
        if (pic_irq == piix3_state->dev.config[0x60])
541 72cc6cfe bellard
            pic_level |= get_pci_irq_level(0);
542 72cc6cfe bellard
        if (pic_irq == piix3_state->dev.config[0x61])
543 72cc6cfe bellard
            pic_level |= get_pci_irq_level(1);
544 72cc6cfe bellard
        if (pic_irq == piix3_state->dev.config[0x62])
545 72cc6cfe bellard
            pic_level |= get_pci_irq_level(2);
546 72cc6cfe bellard
        if (pic_irq == piix3_state->dev.config[0x63])
547 72cc6cfe bellard
            pic_level |= get_pci_irq_level(3);
548 30468f78 bellard
        pic_set_irq(pic_irq, pic_level);
549 30468f78 bellard
    }
550 30468f78 bellard
}
551 30468f78 bellard
552 0ac32c83 bellard
static void piix3_reset(PIIX3State *d)
553 0ac32c83 bellard
{
554 0ac32c83 bellard
    uint8_t *pci_conf = d->dev.config;
555 0ac32c83 bellard
556 0ac32c83 bellard
    pci_conf[0x04] = 0x07; // master, memory and I/O
557 0ac32c83 bellard
    pci_conf[0x05] = 0x00;
558 0ac32c83 bellard
    pci_conf[0x06] = 0x00;
559 0ac32c83 bellard
    pci_conf[0x07] = 0x02; // PCI_status_devsel_medium
560 0ac32c83 bellard
    pci_conf[0x4c] = 0x4d;
561 0ac32c83 bellard
    pci_conf[0x4e] = 0x03;
562 0ac32c83 bellard
    pci_conf[0x4f] = 0x00;
563 0ac32c83 bellard
    pci_conf[0x60] = 0x80;
564 0ac32c83 bellard
    pci_conf[0x69] = 0x02;
565 0ac32c83 bellard
    pci_conf[0x70] = 0x80;
566 0ac32c83 bellard
    pci_conf[0x76] = 0x0c;
567 0ac32c83 bellard
    pci_conf[0x77] = 0x0c;
568 0ac32c83 bellard
    pci_conf[0x78] = 0x02;
569 0ac32c83 bellard
    pci_conf[0x79] = 0x00;
570 0ac32c83 bellard
    pci_conf[0x80] = 0x00;
571 0ac32c83 bellard
    pci_conf[0x82] = 0x00;
572 0ac32c83 bellard
    pci_conf[0xa0] = 0x08;
573 0ac32c83 bellard
    pci_conf[0xa0] = 0x08;
574 0ac32c83 bellard
    pci_conf[0xa2] = 0x00;
575 0ac32c83 bellard
    pci_conf[0xa3] = 0x00;
576 0ac32c83 bellard
    pci_conf[0xa4] = 0x00;
577 0ac32c83 bellard
    pci_conf[0xa5] = 0x00;
578 0ac32c83 bellard
    pci_conf[0xa6] = 0x00;
579 0ac32c83 bellard
    pci_conf[0xa7] = 0x00;
580 0ac32c83 bellard
    pci_conf[0xa8] = 0x0f;
581 0ac32c83 bellard
    pci_conf[0xaa] = 0x00;
582 0ac32c83 bellard
    pci_conf[0xab] = 0x00;
583 0ac32c83 bellard
    pci_conf[0xac] = 0x00;
584 0ac32c83 bellard
    pci_conf[0xae] = 0x00;
585 0ac32c83 bellard
}
586 0ac32c83 bellard
587 30468f78 bellard
void piix3_init(PCIBus *bus)
588 0ac32c83 bellard
{
589 0ac32c83 bellard
    PIIX3State *d;
590 0ac32c83 bellard
    uint8_t *pci_conf;
591 0ac32c83 bellard
592 30468f78 bellard
    d = (PIIX3State *)pci_register_device(bus, "PIIX3", sizeof(PIIX3State),
593 30468f78 bellard
                                          -1, NULL, NULL);
594 30ca2aab bellard
    register_savevm("PIIX3", 0, 1, generic_pci_save, generic_pci_load, d);
595 30ca2aab bellard
596 0ac32c83 bellard
    piix3_state = d;
597 0ac32c83 bellard
    pci_conf = d->dev.config;
598 0ac32c83 bellard
599 0ac32c83 bellard
    pci_conf[0x00] = 0x86; // Intel
600 0ac32c83 bellard
    pci_conf[0x01] = 0x80;
601 0ac32c83 bellard
    pci_conf[0x02] = 0x00; // 82371SB PIIX3 PCI-to-ISA bridge (Step A1)
602 0ac32c83 bellard
    pci_conf[0x03] = 0x70;
603 0ac32c83 bellard
    pci_conf[0x0a] = 0x01; // class_sub = PCI_ISA
604 0ac32c83 bellard
    pci_conf[0x0b] = 0x06; // class_base = PCI_bridge
605 0ac32c83 bellard
    pci_conf[0x0e] = 0x80; // header_type = PCI_multifunction, generic
606 0ac32c83 bellard
607 0ac32c83 bellard
    piix3_reset(d);
608 0ac32c83 bellard
}
609 0ac32c83 bellard
610 77d4bc34 bellard
/* PREP pci init */
611 77d4bc34 bellard
612 30468f78 bellard
static inline void set_config(PCIBus *s, target_phys_addr_t addr)
613 77d4bc34 bellard
{
614 77d4bc34 bellard
    int devfn, i;
615 77d4bc34 bellard
616 77d4bc34 bellard
    for(i = 0; i < 11; i++) {
617 77d4bc34 bellard
        if ((addr & (1 << (11 + i))) != 0)
618 77d4bc34 bellard
            break;
619 77d4bc34 bellard
    }
620 77d4bc34 bellard
    devfn = ((addr >> 8) & 7) | (i << 3);
621 77d4bc34 bellard
    s->config_reg = 0x80000000 | (addr & 0xfc) | (devfn << 8);
622 77d4bc34 bellard
}
623 77d4bc34 bellard
624 8a8696a3 bellard
static void PPC_PCIIO_writeb (void *opaque, target_phys_addr_t addr, uint32_t val)
625 77d4bc34 bellard
{
626 30468f78 bellard
    PCIBus *s = opaque;
627 77d4bc34 bellard
    set_config(s, addr);
628 77d4bc34 bellard
    pci_data_write(s, addr, val, 1);
629 77d4bc34 bellard
}
630 77d4bc34 bellard
631 8a8696a3 bellard
static void PPC_PCIIO_writew (void *opaque, target_phys_addr_t addr, uint32_t val)
632 77d4bc34 bellard
{
633 30468f78 bellard
    PCIBus *s = opaque;
634 77d4bc34 bellard
    set_config(s, addr);
635 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
636 77d4bc34 bellard
    val = bswap16(val);
637 77d4bc34 bellard
#endif
638 77d4bc34 bellard
    pci_data_write(s, addr, val, 2);
639 77d4bc34 bellard
}
640 77d4bc34 bellard
641 8a8696a3 bellard
static void PPC_PCIIO_writel (void *opaque, target_phys_addr_t addr, uint32_t val)
642 77d4bc34 bellard
{
643 30468f78 bellard
    PCIBus *s = opaque;
644 77d4bc34 bellard
    set_config(s, addr);
645 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
646 77d4bc34 bellard
    val = bswap32(val);
647 77d4bc34 bellard
#endif
648 77d4bc34 bellard
    pci_data_write(s, addr, val, 4);
649 77d4bc34 bellard
}
650 77d4bc34 bellard
651 8a8696a3 bellard
static uint32_t PPC_PCIIO_readb (void *opaque, target_phys_addr_t addr)
652 77d4bc34 bellard
{
653 30468f78 bellard
    PCIBus *s = opaque;
654 77d4bc34 bellard
    uint32_t val;
655 77d4bc34 bellard
    set_config(s, addr);
656 77d4bc34 bellard
    val = pci_data_read(s, addr, 1);
657 77d4bc34 bellard
    return val;
658 77d4bc34 bellard
}
659 77d4bc34 bellard
660 8a8696a3 bellard
static uint32_t PPC_PCIIO_readw (void *opaque, target_phys_addr_t addr)
661 77d4bc34 bellard
{
662 30468f78 bellard
    PCIBus *s = opaque;
663 77d4bc34 bellard
    uint32_t val;
664 77d4bc34 bellard
    set_config(s, addr);
665 77d4bc34 bellard
    val = pci_data_read(s, addr, 2);
666 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
667 77d4bc34 bellard
    val = bswap16(val);
668 77d4bc34 bellard
#endif
669 77d4bc34 bellard
    return val;
670 77d4bc34 bellard
}
671 77d4bc34 bellard
672 8a8696a3 bellard
static uint32_t PPC_PCIIO_readl (void *opaque, target_phys_addr_t addr)
673 77d4bc34 bellard
{
674 30468f78 bellard
    PCIBus *s = opaque;
675 77d4bc34 bellard
    uint32_t val;
676 77d4bc34 bellard
    set_config(s, addr);
677 77d4bc34 bellard
    val = pci_data_read(s, addr, 4);
678 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
679 77d4bc34 bellard
    val = bswap32(val);
680 77d4bc34 bellard
#endif
681 77d4bc34 bellard
    return val;
682 77d4bc34 bellard
}
683 77d4bc34 bellard
684 77d4bc34 bellard
static CPUWriteMemoryFunc *PPC_PCIIO_write[] = {
685 77d4bc34 bellard
    &PPC_PCIIO_writeb,
686 77d4bc34 bellard
    &PPC_PCIIO_writew,
687 77d4bc34 bellard
    &PPC_PCIIO_writel,
688 77d4bc34 bellard
};
689 77d4bc34 bellard
690 77d4bc34 bellard
static CPUReadMemoryFunc *PPC_PCIIO_read[] = {
691 77d4bc34 bellard
    &PPC_PCIIO_readb,
692 77d4bc34 bellard
    &PPC_PCIIO_readw,
693 77d4bc34 bellard
    &PPC_PCIIO_readl,
694 77d4bc34 bellard
};
695 77d4bc34 bellard
696 30468f78 bellard
static void prep_set_irq(PCIDevice *d, int irq_num, int level)
697 30468f78 bellard
{
698 30468f78 bellard
    /* XXX: we do not simulate the hardware - we rely on the BIOS to
699 30468f78 bellard
       set correctly for irq line field */
700 30468f78 bellard
    pic_set_irq(d->config[PCI_INTERRUPT_LINE], level);
701 30468f78 bellard
}
702 30468f78 bellard
703 30468f78 bellard
PCIBus *pci_prep_init(void)
704 77d4bc34 bellard
{
705 30468f78 bellard
    PCIBus *s;
706 77d4bc34 bellard
    PCIDevice *d;
707 77d4bc34 bellard
    int PPC_io_memory;
708 77d4bc34 bellard
709 30468f78 bellard
    s = pci_register_bus();
710 30468f78 bellard
    s->set_irq = prep_set_irq;
711 30468f78 bellard
712 da9b266b bellard
    register_ioport_write(0xcf8, 4, 4, pci_addr_writel, s);
713 da9b266b bellard
    register_ioport_read(0xcf8, 4, 4, pci_addr_readl, s);
714 da9b266b bellard
715 da9b266b bellard
    register_ioport_write(0xcfc, 4, 1, pci_data_writeb, s);
716 da9b266b bellard
    register_ioport_write(0xcfc, 4, 2, pci_data_writew, s);
717 da9b266b bellard
    register_ioport_write(0xcfc, 4, 4, pci_data_writel, s);
718 da9b266b bellard
    register_ioport_read(0xcfc, 4, 1, pci_data_readb, s);
719 da9b266b bellard
    register_ioport_read(0xcfc, 4, 2, pci_data_readw, s);
720 da9b266b bellard
    register_ioport_read(0xcfc, 4, 4, pci_data_readl, s);
721 da9b266b bellard
722 8a8696a3 bellard
    PPC_io_memory = cpu_register_io_memory(0, PPC_PCIIO_read, 
723 8a8696a3 bellard
                                           PPC_PCIIO_write, s);
724 77d4bc34 bellard
    cpu_register_physical_memory(0x80800000, 0x00400000, PPC_io_memory);
725 77d4bc34 bellard
726 30468f78 bellard
    d = pci_register_device(s, "PREP PCI Bridge", sizeof(PCIDevice), 0,
727 77d4bc34 bellard
                            NULL, NULL);
728 77d4bc34 bellard
729 77d4bc34 bellard
    /* XXX: put correct IDs */
730 77d4bc34 bellard
    d->config[0x00] = 0x11; // vendor_id
731 77d4bc34 bellard
    d->config[0x01] = 0x10;
732 77d4bc34 bellard
    d->config[0x02] = 0x26; // device_id
733 77d4bc34 bellard
    d->config[0x03] = 0x00;
734 77d4bc34 bellard
    d->config[0x08] = 0x02; // revision
735 77d4bc34 bellard
    d->config[0x0a] = 0x04; // class_sub = pci2pci
736 77d4bc34 bellard
    d->config[0x0b] = 0x06; // class_base = PCI_bridge
737 77d4bc34 bellard
    d->config[0x0e] = 0x01; // header_type
738 30468f78 bellard
    return s;
739 77d4bc34 bellard
}
740 77d4bc34 bellard
741 77d4bc34 bellard
742 77d4bc34 bellard
/* pmac pci init */
743 77d4bc34 bellard
744 30468f78 bellard
#if 0
745 f2aa58c6 bellard
/* Grackle PCI host */
746 f2aa58c6 bellard
static void pci_grackle_config_writel (void *opaque, target_phys_addr_t addr,
747 f2aa58c6 bellard
                                       uint32_t val)
748 77d4bc34 bellard
{
749 30468f78 bellard
    PCIBus *s = opaque;
750 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
751 77d4bc34 bellard
    val = bswap32(val);
752 77d4bc34 bellard
#endif
753 77d4bc34 bellard
    s->config_reg = val;
754 77d4bc34 bellard
}
755 77d4bc34 bellard
756 f2aa58c6 bellard
static uint32_t pci_grackle_config_readl (void *opaque, target_phys_addr_t addr)
757 77d4bc34 bellard
{
758 30468f78 bellard
    PCIBus *s = opaque;
759 77d4bc34 bellard
    uint32_t val;
760 77d4bc34 bellard
761 77d4bc34 bellard
    val = s->config_reg;
762 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
763 77d4bc34 bellard
    val = bswap32(val);
764 77d4bc34 bellard
#endif
765 77d4bc34 bellard
    return val;
766 77d4bc34 bellard
}
767 77d4bc34 bellard
768 f2aa58c6 bellard
static CPUWriteMemoryFunc *pci_grackle_config_write[] = {
769 f2aa58c6 bellard
    &pci_grackle_config_writel,
770 f2aa58c6 bellard
    &pci_grackle_config_writel,
771 f2aa58c6 bellard
    &pci_grackle_config_writel,
772 77d4bc34 bellard
};
773 77d4bc34 bellard
774 f2aa58c6 bellard
static CPUReadMemoryFunc *pci_grackle_config_read[] = {
775 f2aa58c6 bellard
    &pci_grackle_config_readl,
776 f2aa58c6 bellard
    &pci_grackle_config_readl,
777 f2aa58c6 bellard
    &pci_grackle_config_readl,
778 77d4bc34 bellard
};
779 77d4bc34 bellard
780 f2aa58c6 bellard
static void pci_grackle_writeb (void *opaque, target_phys_addr_t addr,
781 f2aa58c6 bellard
                                uint32_t val)
782 77d4bc34 bellard
{
783 30468f78 bellard
    PCIBus *s = opaque;
784 77d4bc34 bellard
    pci_data_write(s, addr, val, 1);
785 77d4bc34 bellard
}
786 77d4bc34 bellard
787 f2aa58c6 bellard
static void pci_grackle_writew (void *opaque, target_phys_addr_t addr,
788 f2aa58c6 bellard
                                uint32_t val)
789 77d4bc34 bellard
{
790 30468f78 bellard
    PCIBus *s = opaque;
791 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
792 77d4bc34 bellard
    val = bswap16(val);
793 77d4bc34 bellard
#endif
794 77d4bc34 bellard
    pci_data_write(s, addr, val, 2);
795 77d4bc34 bellard
}
796 77d4bc34 bellard
797 f2aa58c6 bellard
static void pci_grackle_writel (void *opaque, target_phys_addr_t addr,
798 f2aa58c6 bellard
                                uint32_t val)
799 77d4bc34 bellard
{
800 30468f78 bellard
    PCIBus *s = opaque;
801 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
802 77d4bc34 bellard
    val = bswap32(val);
803 77d4bc34 bellard
#endif
804 77d4bc34 bellard
    pci_data_write(s, addr, val, 4);
805 77d4bc34 bellard
}
806 77d4bc34 bellard
807 f2aa58c6 bellard
static uint32_t pci_grackle_readb (void *opaque, target_phys_addr_t addr)
808 77d4bc34 bellard
{
809 30468f78 bellard
    PCIBus *s = opaque;
810 77d4bc34 bellard
    uint32_t val;
811 77d4bc34 bellard
    val = pci_data_read(s, addr, 1);
812 77d4bc34 bellard
    return val;
813 77d4bc34 bellard
}
814 77d4bc34 bellard
815 f2aa58c6 bellard
static uint32_t pci_grackle_readw (void *opaque, target_phys_addr_t addr)
816 77d4bc34 bellard
{
817 30468f78 bellard
    PCIBus *s = opaque;
818 77d4bc34 bellard
    uint32_t val;
819 77d4bc34 bellard
    val = pci_data_read(s, addr, 2);
820 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
821 77d4bc34 bellard
    val = bswap16(val);
822 77d4bc34 bellard
#endif
823 77d4bc34 bellard
    return val;
824 77d4bc34 bellard
}
825 77d4bc34 bellard
826 f2aa58c6 bellard
static uint32_t pci_grackle_readl (void *opaque, target_phys_addr_t addr)
827 f2aa58c6 bellard
{
828 30468f78 bellard
    PCIBus *s = opaque;
829 f2aa58c6 bellard
    uint32_t val;
830 f2aa58c6 bellard
831 f2aa58c6 bellard
    val = pci_data_read(s, addr, 4);
832 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
833 f2aa58c6 bellard
    val = bswap32(val);
834 f2aa58c6 bellard
#endif
835 f2aa58c6 bellard
    return val;
836 f2aa58c6 bellard
}
837 f2aa58c6 bellard
838 f2aa58c6 bellard
static CPUWriteMemoryFunc *pci_grackle_write[] = {
839 f2aa58c6 bellard
    &pci_grackle_writeb,
840 f2aa58c6 bellard
    &pci_grackle_writew,
841 f2aa58c6 bellard
    &pci_grackle_writel,
842 f2aa58c6 bellard
};
843 f2aa58c6 bellard
844 f2aa58c6 bellard
static CPUReadMemoryFunc *pci_grackle_read[] = {
845 f2aa58c6 bellard
    &pci_grackle_readb,
846 f2aa58c6 bellard
    &pci_grackle_readw,
847 f2aa58c6 bellard
    &pci_grackle_readl,
848 f2aa58c6 bellard
};
849 30468f78 bellard
#endif
850 f2aa58c6 bellard
851 f2aa58c6 bellard
/* Uninorth PCI host (for all Mac99 and newer machines */
852 f2aa58c6 bellard
static void pci_unin_main_config_writel (void *opaque, target_phys_addr_t addr,
853 f2aa58c6 bellard
                                         uint32_t val)
854 f2aa58c6 bellard
{
855 30468f78 bellard
    PCIBus *s = opaque;
856 f2aa58c6 bellard
    int i;
857 f2aa58c6 bellard
858 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
859 f2aa58c6 bellard
    val = bswap32(val);
860 f2aa58c6 bellard
#endif
861 f2aa58c6 bellard
862 f2aa58c6 bellard
    for (i = 11; i < 32; i++) {
863 f2aa58c6 bellard
        if ((val & (1 << i)) != 0)
864 f2aa58c6 bellard
            break;
865 f2aa58c6 bellard
    }
866 f2aa58c6 bellard
#if 0
867 f2aa58c6 bellard
    s->config_reg = 0x80000000 | (1 << 16) | (val & 0x7FC) | (i << 11);
868 f2aa58c6 bellard
#else
869 f2aa58c6 bellard
    s->config_reg = 0x80000000 | (0 << 16) | (val & 0x7FC) | (i << 11);
870 f2aa58c6 bellard
#endif
871 f2aa58c6 bellard
}
872 f2aa58c6 bellard
873 f2aa58c6 bellard
static uint32_t pci_unin_main_config_readl (void *opaque,
874 f2aa58c6 bellard
                                            target_phys_addr_t addr)
875 f2aa58c6 bellard
{
876 30468f78 bellard
    PCIBus *s = opaque;
877 f2aa58c6 bellard
    uint32_t val;
878 f2aa58c6 bellard
    int devfn;
879 f2aa58c6 bellard
880 f2aa58c6 bellard
    devfn = (s->config_reg >> 8) & 0xFF;
881 f2aa58c6 bellard
    val = (1 << (devfn >> 3)) | ((devfn & 0x07) << 8) | (s->config_reg & 0xFC);
882 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
883 f2aa58c6 bellard
    val = bswap32(val);
884 f2aa58c6 bellard
#endif
885 f2aa58c6 bellard
886 f2aa58c6 bellard
    return val;
887 f2aa58c6 bellard
}
888 f2aa58c6 bellard
889 f2aa58c6 bellard
static CPUWriteMemoryFunc *pci_unin_main_config_write[] = {
890 f2aa58c6 bellard
    &pci_unin_main_config_writel,
891 f2aa58c6 bellard
    &pci_unin_main_config_writel,
892 f2aa58c6 bellard
    &pci_unin_main_config_writel,
893 f2aa58c6 bellard
};
894 f2aa58c6 bellard
895 f2aa58c6 bellard
static CPUReadMemoryFunc *pci_unin_main_config_read[] = {
896 f2aa58c6 bellard
    &pci_unin_main_config_readl,
897 f2aa58c6 bellard
    &pci_unin_main_config_readl,
898 f2aa58c6 bellard
    &pci_unin_main_config_readl,
899 f2aa58c6 bellard
};
900 f2aa58c6 bellard
901 f2aa58c6 bellard
static void pci_unin_main_writeb (void *opaque, target_phys_addr_t addr,
902 f2aa58c6 bellard
                                  uint32_t val)
903 f2aa58c6 bellard
{
904 30468f78 bellard
    PCIBus *s = opaque;
905 f2aa58c6 bellard
    pci_data_write(s, addr & 7, val, 1);
906 f2aa58c6 bellard
}
907 f2aa58c6 bellard
908 f2aa58c6 bellard
static void pci_unin_main_writew (void *opaque, target_phys_addr_t addr,
909 f2aa58c6 bellard
                                  uint32_t val)
910 f2aa58c6 bellard
{
911 30468f78 bellard
    PCIBus *s = opaque;
912 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
913 f2aa58c6 bellard
    val = bswap16(val);
914 f2aa58c6 bellard
#endif
915 f2aa58c6 bellard
    pci_data_write(s, addr & 7, val, 2);
916 f2aa58c6 bellard
}
917 f2aa58c6 bellard
918 f2aa58c6 bellard
static void pci_unin_main_writel (void *opaque, target_phys_addr_t addr,
919 f2aa58c6 bellard
                                uint32_t val)
920 f2aa58c6 bellard
{
921 30468f78 bellard
    PCIBus *s = opaque;
922 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
923 f2aa58c6 bellard
    val = bswap32(val);
924 f2aa58c6 bellard
#endif
925 f2aa58c6 bellard
    pci_data_write(s, addr & 7, val, 4);
926 f2aa58c6 bellard
}
927 f2aa58c6 bellard
928 f2aa58c6 bellard
static uint32_t pci_unin_main_readb (void *opaque, target_phys_addr_t addr)
929 f2aa58c6 bellard
{
930 30468f78 bellard
    PCIBus *s = opaque;
931 f2aa58c6 bellard
    uint32_t val;
932 f2aa58c6 bellard
933 f2aa58c6 bellard
    val = pci_data_read(s, addr & 7, 1);
934 f2aa58c6 bellard
935 f2aa58c6 bellard
    return val;
936 f2aa58c6 bellard
}
937 f2aa58c6 bellard
938 f2aa58c6 bellard
static uint32_t pci_unin_main_readw (void *opaque, target_phys_addr_t addr)
939 f2aa58c6 bellard
{
940 30468f78 bellard
    PCIBus *s = opaque;
941 f2aa58c6 bellard
    uint32_t val;
942 f2aa58c6 bellard
943 f2aa58c6 bellard
    val = pci_data_read(s, addr & 7, 2);
944 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
945 f2aa58c6 bellard
    val = bswap16(val);
946 f2aa58c6 bellard
#endif
947 f2aa58c6 bellard
948 f2aa58c6 bellard
    return val;
949 f2aa58c6 bellard
}
950 f2aa58c6 bellard
951 f2aa58c6 bellard
static uint32_t pci_unin_main_readl (void *opaque, target_phys_addr_t addr)
952 77d4bc34 bellard
{
953 30468f78 bellard
    PCIBus *s = opaque;
954 77d4bc34 bellard
    uint32_t val;
955 77d4bc34 bellard
956 77d4bc34 bellard
    val = pci_data_read(s, addr, 4);
957 77d4bc34 bellard
#ifdef TARGET_WORDS_BIGENDIAN
958 77d4bc34 bellard
    val = bswap32(val);
959 77d4bc34 bellard
#endif
960 f2aa58c6 bellard
961 f2aa58c6 bellard
    return val;
962 f2aa58c6 bellard
}
963 f2aa58c6 bellard
964 f2aa58c6 bellard
static CPUWriteMemoryFunc *pci_unin_main_write[] = {
965 f2aa58c6 bellard
    &pci_unin_main_writeb,
966 f2aa58c6 bellard
    &pci_unin_main_writew,
967 f2aa58c6 bellard
    &pci_unin_main_writel,
968 f2aa58c6 bellard
};
969 f2aa58c6 bellard
970 f2aa58c6 bellard
static CPUReadMemoryFunc *pci_unin_main_read[] = {
971 f2aa58c6 bellard
    &pci_unin_main_readb,
972 f2aa58c6 bellard
    &pci_unin_main_readw,
973 f2aa58c6 bellard
    &pci_unin_main_readl,
974 f2aa58c6 bellard
};
975 f2aa58c6 bellard
976 30468f78 bellard
#if 0
977 30468f78 bellard

978 f2aa58c6 bellard
static void pci_unin_config_writel (void *opaque, target_phys_addr_t addr,
979 f2aa58c6 bellard
                                    uint32_t val)
980 f2aa58c6 bellard
{
981 30468f78 bellard
    PCIBus *s = opaque;
982 f2aa58c6 bellard

983 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
984 f2aa58c6 bellard
    val = bswap32(val);
985 f2aa58c6 bellard
#endif
986 f2aa58c6 bellard
    s->config_reg = 0x80000000 | (val & ~0x00000001);
987 f2aa58c6 bellard
}
988 f2aa58c6 bellard
989 f2aa58c6 bellard
static uint32_t pci_unin_config_readl (void *opaque,
990 f2aa58c6 bellard
                                       target_phys_addr_t addr)
991 f2aa58c6 bellard
{
992 30468f78 bellard
    PCIBus *s = opaque;
993 f2aa58c6 bellard
    uint32_t val;
994 f2aa58c6 bellard
995 f2aa58c6 bellard
    val = (s->config_reg | 0x00000001) & ~0x80000000;
996 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
997 f2aa58c6 bellard
    val = bswap32(val);
998 f2aa58c6 bellard
#endif
999 f2aa58c6 bellard
1000 f2aa58c6 bellard
    return val;
1001 f2aa58c6 bellard
}
1002 f2aa58c6 bellard
1003 f2aa58c6 bellard
static CPUWriteMemoryFunc *pci_unin_config_write[] = {
1004 f2aa58c6 bellard
    &pci_unin_config_writel,
1005 f2aa58c6 bellard
    &pci_unin_config_writel,
1006 f2aa58c6 bellard
    &pci_unin_config_writel,
1007 f2aa58c6 bellard
};
1008 f2aa58c6 bellard
1009 f2aa58c6 bellard
static CPUReadMemoryFunc *pci_unin_config_read[] = {
1010 f2aa58c6 bellard
    &pci_unin_config_readl,
1011 f2aa58c6 bellard
    &pci_unin_config_readl,
1012 f2aa58c6 bellard
    &pci_unin_config_readl,
1013 f2aa58c6 bellard
};
1014 f2aa58c6 bellard
1015 f2aa58c6 bellard
static void pci_unin_writeb (void *opaque, target_phys_addr_t addr,
1016 f2aa58c6 bellard
                             uint32_t val)
1017 f2aa58c6 bellard
{
1018 30468f78 bellard
    PCIBus *s = opaque;
1019 f2aa58c6 bellard
    pci_data_write(s, addr & 3, val, 1);
1020 f2aa58c6 bellard
}
1021 f2aa58c6 bellard
1022 f2aa58c6 bellard
static void pci_unin_writew (void *opaque, target_phys_addr_t addr,
1023 f2aa58c6 bellard
                             uint32_t val)
1024 f2aa58c6 bellard
{
1025 30468f78 bellard
    PCIBus *s = opaque;
1026 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
1027 f2aa58c6 bellard
    val = bswap16(val);
1028 f2aa58c6 bellard
#endif
1029 f2aa58c6 bellard
    pci_data_write(s, addr & 3, val, 2);
1030 f2aa58c6 bellard
}
1031 f2aa58c6 bellard
1032 f2aa58c6 bellard
static void pci_unin_writel (void *opaque, target_phys_addr_t addr,
1033 f2aa58c6 bellard
                             uint32_t val)
1034 f2aa58c6 bellard
{
1035 30468f78 bellard
    PCIBus *s = opaque;
1036 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
1037 f2aa58c6 bellard
    val = bswap32(val);
1038 f2aa58c6 bellard
#endif
1039 f2aa58c6 bellard
    pci_data_write(s, addr & 3, val, 4);
1040 f2aa58c6 bellard
}
1041 f2aa58c6 bellard
1042 f2aa58c6 bellard
static uint32_t pci_unin_readb (void *opaque, target_phys_addr_t addr)
1043 f2aa58c6 bellard
{
1044 30468f78 bellard
    PCIBus *s = opaque;
1045 f2aa58c6 bellard
    uint32_t val;
1046 f2aa58c6 bellard
1047 f2aa58c6 bellard
    val = pci_data_read(s, addr & 3, 1);
1048 f2aa58c6 bellard
1049 f2aa58c6 bellard
    return val;
1050 f2aa58c6 bellard
}
1051 f2aa58c6 bellard
1052 f2aa58c6 bellard
static uint32_t pci_unin_readw (void *opaque, target_phys_addr_t addr)
1053 f2aa58c6 bellard
{
1054 30468f78 bellard
    PCIBus *s = opaque;
1055 f2aa58c6 bellard
    uint32_t val;
1056 f2aa58c6 bellard
1057 f2aa58c6 bellard
    val = pci_data_read(s, addr & 3, 2);
1058 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
1059 f2aa58c6 bellard
    val = bswap16(val);
1060 f2aa58c6 bellard
#endif
1061 f2aa58c6 bellard
1062 f2aa58c6 bellard
    return val;
1063 f2aa58c6 bellard
}
1064 f2aa58c6 bellard
1065 f2aa58c6 bellard
static uint32_t pci_unin_readl (void *opaque, target_phys_addr_t addr)
1066 f2aa58c6 bellard
{
1067 30468f78 bellard
    PCIBus *s = opaque;
1068 f2aa58c6 bellard
    uint32_t val;
1069 f2aa58c6 bellard
1070 f2aa58c6 bellard
    val = pci_data_read(s, addr & 3, 4);
1071 f2aa58c6 bellard
#ifdef TARGET_WORDS_BIGENDIAN
1072 f2aa58c6 bellard
    val = bswap32(val);
1073 f2aa58c6 bellard
#endif
1074 f2aa58c6 bellard
1075 77d4bc34 bellard
    return val;
1076 77d4bc34 bellard
}
1077 77d4bc34 bellard
1078 f2aa58c6 bellard
static CPUWriteMemoryFunc *pci_unin_write[] = {
1079 f2aa58c6 bellard
    &pci_unin_writeb,
1080 f2aa58c6 bellard
    &pci_unin_writew,
1081 f2aa58c6 bellard
    &pci_unin_writel,
1082 77d4bc34 bellard
};
1083 77d4bc34 bellard
1084 f2aa58c6 bellard
static CPUReadMemoryFunc *pci_unin_read[] = {
1085 f2aa58c6 bellard
    &pci_unin_readb,
1086 f2aa58c6 bellard
    &pci_unin_readw,
1087 f2aa58c6 bellard
    &pci_unin_readl,
1088 77d4bc34 bellard
};
1089 30468f78 bellard
#endif
1090 30468f78 bellard
1091 30468f78 bellard
static void pmac_set_irq(PCIDevice *d, int irq_num, int level)
1092 30468f78 bellard
{
1093 30468f78 bellard
    openpic_t *openpic;
1094 30468f78 bellard
    /* XXX: we do not simulate the hardware - we rely on the BIOS to
1095 30468f78 bellard
       set correctly for irq line field */
1096 30468f78 bellard
    openpic = d->bus->openpic;
1097 30468f78 bellard
#ifdef TARGET_PPC
1098 30468f78 bellard
    if (openpic)
1099 30468f78 bellard
        openpic_set_irq(openpic, d->config[PCI_INTERRUPT_LINE], level);
1100 30468f78 bellard
#endif
1101 30468f78 bellard
}
1102 30468f78 bellard
1103 30468f78 bellard
void pci_pmac_set_openpic(PCIBus *bus, openpic_t *openpic)
1104 30468f78 bellard
{
1105 30468f78 bellard
    bus->openpic = openpic;
1106 30468f78 bellard
}
1107 77d4bc34 bellard
1108 30468f78 bellard
PCIBus *pci_pmac_init(void)
1109 77d4bc34 bellard
{
1110 30468f78 bellard
    PCIBus *s;
1111 77d4bc34 bellard
    PCIDevice *d;
1112 77d4bc34 bellard
    int pci_mem_config, pci_mem_data;
1113 77d4bc34 bellard
1114 f2aa58c6 bellard
    /* Use values found on a real PowerMac */
1115 f2aa58c6 bellard
    /* Uninorth main bus */
1116 30468f78 bellard
    s = pci_register_bus();
1117 30468f78 bellard
    s->set_irq = pmac_set_irq;
1118 30468f78 bellard
1119 f2aa58c6 bellard
    pci_mem_config = cpu_register_io_memory(0, pci_unin_main_config_read, 
1120 f2aa58c6 bellard
                                            pci_unin_main_config_write, s);
1121 f2aa58c6 bellard
    pci_mem_data = cpu_register_io_memory(0, pci_unin_main_read,
1122 f2aa58c6 bellard
                                          pci_unin_main_write, s);
1123 f2aa58c6 bellard
    cpu_register_physical_memory(0xf2800000, 0x1000, pci_mem_config);
1124 f2aa58c6 bellard
    cpu_register_physical_memory(0xf2c00000, 0x1000, pci_mem_data);
1125 30468f78 bellard
    s->devfn_min = 11 << 3;
1126 30468f78 bellard
    d = pci_register_device(s, "Uni-north main", sizeof(PCIDevice), 
1127 30468f78 bellard
                            11 << 3, NULL, NULL);
1128 f2aa58c6 bellard
    d->config[0x00] = 0x6b; // vendor_id : Apple
1129 f2aa58c6 bellard
    d->config[0x01] = 0x10;
1130 f2aa58c6 bellard
    d->config[0x02] = 0x1F; // device_id
1131 f2aa58c6 bellard
    d->config[0x03] = 0x00;
1132 f2aa58c6 bellard
    d->config[0x08] = 0x00; // revision
1133 f2aa58c6 bellard
    d->config[0x0A] = 0x00; // class_sub = pci host
1134 f2aa58c6 bellard
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1135 f2aa58c6 bellard
    d->config[0x0C] = 0x08; // cache_line_size
1136 f2aa58c6 bellard
    d->config[0x0D] = 0x10; // latency_timer
1137 f2aa58c6 bellard
    d->config[0x0E] = 0x00; // header_type
1138 f2aa58c6 bellard
    d->config[0x34] = 0x00; // capabilities_pointer
1139 f2aa58c6 bellard
1140 f2aa58c6 bellard
#if 0 // XXX: not activated as PPC BIOS doesn't handle mutiple buses properly
1141 f2aa58c6 bellard
    /* pci-to-pci bridge */
1142 f2aa58c6 bellard
    d = pci_register_device("Uni-north bridge", sizeof(PCIDevice), 0, 13 << 3,
1143 f2aa58c6 bellard
                            NULL, NULL);
1144 f2aa58c6 bellard
    d->config[0x00] = 0x11; // vendor_id : TI
1145 f2aa58c6 bellard
    d->config[0x01] = 0x10;
1146 f2aa58c6 bellard
    d->config[0x02] = 0x26; // device_id
1147 f2aa58c6 bellard
    d->config[0x03] = 0x00;
1148 f2aa58c6 bellard
    d->config[0x08] = 0x05; // revision
1149 f2aa58c6 bellard
    d->config[0x0A] = 0x04; // class_sub = pci2pci
1150 f2aa58c6 bellard
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1151 f2aa58c6 bellard
    d->config[0x0C] = 0x08; // cache_line_size
1152 f2aa58c6 bellard
    d->config[0x0D] = 0x20; // latency_timer
1153 f2aa58c6 bellard
    d->config[0x0E] = 0x01; // header_type
1154 f2aa58c6 bellard

1155 f2aa58c6 bellard
    d->config[0x18] = 0x01; // primary_bus
1156 f2aa58c6 bellard
    d->config[0x19] = 0x02; // secondary_bus
1157 f2aa58c6 bellard
    d->config[0x1A] = 0x02; // subordinate_bus
1158 f2aa58c6 bellard
    d->config[0x1B] = 0x20; // secondary_latency_timer
1159 f2aa58c6 bellard
    d->config[0x1C] = 0x11; // io_base
1160 f2aa58c6 bellard
    d->config[0x1D] = 0x01; // io_limit
1161 f2aa58c6 bellard
    d->config[0x20] = 0x00; // memory_base
1162 f2aa58c6 bellard
    d->config[0x21] = 0x80;
1163 f2aa58c6 bellard
    d->config[0x22] = 0x00; // memory_limit
1164 f2aa58c6 bellard
    d->config[0x23] = 0x80;
1165 f2aa58c6 bellard
    d->config[0x24] = 0x01; // prefetchable_memory_base
1166 f2aa58c6 bellard
    d->config[0x25] = 0x80;
1167 f2aa58c6 bellard
    d->config[0x26] = 0xF1; // prefectchable_memory_limit
1168 f2aa58c6 bellard
    d->config[0x27] = 0x7F;
1169 f2aa58c6 bellard
    // d->config[0x34] = 0xdc // capabilities_pointer
1170 f2aa58c6 bellard
#endif
1171 f2aa58c6 bellard
#if 0 // XXX: not needed for now
1172 f2aa58c6 bellard
    /* Uninorth AGP bus */
1173 f2aa58c6 bellard
    s = &pci_bridge[1];
1174 f2aa58c6 bellard
    pci_mem_config = cpu_register_io_memory(0, pci_unin_config_read, 
1175 f2aa58c6 bellard
                                            pci_unin_config_write, s);
1176 f2aa58c6 bellard
    pci_mem_data = cpu_register_io_memory(0, pci_unin_read,
1177 f2aa58c6 bellard
                                          pci_unin_write, s);
1178 f2aa58c6 bellard
    cpu_register_physical_memory(0xf0800000, 0x1000, pci_mem_config);
1179 f2aa58c6 bellard
    cpu_register_physical_memory(0xf0c00000, 0x1000, pci_mem_data);
1180 f2aa58c6 bellard

1181 f2aa58c6 bellard
    d = pci_register_device("Uni-north AGP", sizeof(PCIDevice), 0, 11 << 3,
1182 f2aa58c6 bellard
                            NULL, NULL);
1183 f2aa58c6 bellard
    d->config[0x00] = 0x6b; // vendor_id : Apple
1184 f2aa58c6 bellard
    d->config[0x01] = 0x10;
1185 f2aa58c6 bellard
    d->config[0x02] = 0x20; // device_id
1186 f2aa58c6 bellard
    d->config[0x03] = 0x00;
1187 f2aa58c6 bellard
    d->config[0x08] = 0x00; // revision
1188 f2aa58c6 bellard
    d->config[0x0A] = 0x00; // class_sub = pci host
1189 f2aa58c6 bellard
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1190 f2aa58c6 bellard
    d->config[0x0C] = 0x08; // cache_line_size
1191 f2aa58c6 bellard
    d->config[0x0D] = 0x10; // latency_timer
1192 f2aa58c6 bellard
    d->config[0x0E] = 0x00; // header_type
1193 f2aa58c6 bellard
    //    d->config[0x34] = 0x80; // capabilities_pointer
1194 f2aa58c6 bellard
#endif
1195 77d4bc34 bellard
1196 f2aa58c6 bellard
#if 0 // XXX: not needed for now
1197 f2aa58c6 bellard
    /* Uninorth internal bus */
1198 f2aa58c6 bellard
    s = &pci_bridge[2];
1199 f2aa58c6 bellard
    pci_mem_config = cpu_register_io_memory(0, pci_unin_config_read, 
1200 f2aa58c6 bellard
                                            pci_unin_config_write, s);
1201 f2aa58c6 bellard
    pci_mem_data = cpu_register_io_memory(0, pci_unin_read,
1202 f2aa58c6 bellard
                                          pci_unin_write, s);
1203 f2aa58c6 bellard
    cpu_register_physical_memory(0xf4800000, 0x1000, pci_mem_config);
1204 f2aa58c6 bellard
    cpu_register_physical_memory(0xf4c00000, 0x1000, pci_mem_data);
1205 f2aa58c6 bellard

1206 f2aa58c6 bellard
    d = pci_register_device("Uni-north internal", sizeof(PCIDevice),
1207 f2aa58c6 bellard
                            3, 11 << 3, NULL, NULL);
1208 f2aa58c6 bellard
    d->config[0x00] = 0x6b; // vendor_id : Apple
1209 f2aa58c6 bellard
    d->config[0x01] = 0x10;
1210 f2aa58c6 bellard
    d->config[0x02] = 0x1E; // device_id
1211 f2aa58c6 bellard
    d->config[0x03] = 0x00;
1212 f2aa58c6 bellard
    d->config[0x08] = 0x00; // revision
1213 f2aa58c6 bellard
    d->config[0x0A] = 0x00; // class_sub = pci host
1214 f2aa58c6 bellard
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1215 f2aa58c6 bellard
    d->config[0x0C] = 0x08; // cache_line_size
1216 f2aa58c6 bellard
    d->config[0x0D] = 0x10; // latency_timer
1217 f2aa58c6 bellard
    d->config[0x0E] = 0x00; // header_type
1218 f2aa58c6 bellard
    d->config[0x34] = 0x00; // capabilities_pointer
1219 f2aa58c6 bellard
#endif
1220 f2aa58c6 bellard
1221 f2aa58c6 bellard
#if 0 // Grackle ?
1222 77d4bc34 bellard
    /* same values as PearPC - check this */
1223 77d4bc34 bellard
    d->config[0x00] = 0x11; // vendor_id
1224 77d4bc34 bellard
    d->config[0x01] = 0x10;
1225 77d4bc34 bellard
    d->config[0x02] = 0x26; // device_id
1226 77d4bc34 bellard
    d->config[0x03] = 0x00;
1227 77d4bc34 bellard
    d->config[0x08] = 0x02; // revision
1228 77d4bc34 bellard
    d->config[0x0a] = 0x04; // class_sub = pci2pci
1229 77d4bc34 bellard
    d->config[0x0b] = 0x06; // class_base = PCI_bridge
1230 77d4bc34 bellard
    d->config[0x0e] = 0x01; // header_type
1231 77d4bc34 bellard

1232 77d4bc34 bellard
    d->config[0x18] = 0x0;  // primary_bus
1233 77d4bc34 bellard
    d->config[0x19] = 0x1;  // secondary_bus
1234 77d4bc34 bellard
    d->config[0x1a] = 0x1;  // subordinate_bus
1235 77d4bc34 bellard
    d->config[0x1c] = 0x10; // io_base
1236 77d4bc34 bellard
    d->config[0x1d] = 0x20; // io_limit
1237 77d4bc34 bellard
    
1238 77d4bc34 bellard
    d->config[0x20] = 0x80; // memory_base
1239 77d4bc34 bellard
    d->config[0x21] = 0x80;
1240 77d4bc34 bellard
    d->config[0x22] = 0x90; // memory_limit
1241 77d4bc34 bellard
    d->config[0x23] = 0x80;
1242 77d4bc34 bellard
    
1243 77d4bc34 bellard
    d->config[0x24] = 0x00; // prefetchable_memory_base
1244 77d4bc34 bellard
    d->config[0x25] = 0x84;
1245 77d4bc34 bellard
    d->config[0x26] = 0x00; // prefetchable_memory_limit
1246 77d4bc34 bellard
    d->config[0x27] = 0x85;
1247 f2aa58c6 bellard
#endif
1248 30468f78 bellard
    return s;
1249 77d4bc34 bellard
}
1250 77d4bc34 bellard
1251 0ac32c83 bellard
/***********************************************************/
1252 0ac32c83 bellard
/* generic PCI irq support */
1253 0ac32c83 bellard
1254 0ac32c83 bellard
/* 0 <= irq_num <= 3. level must be 0 or 1 */
1255 77d4bc34 bellard
void pci_set_irq(PCIDevice *pci_dev, int irq_num, int level)
1256 77d4bc34 bellard
{
1257 30468f78 bellard
    PCIBus *bus = pci_dev->bus;
1258 30468f78 bellard
    bus->set_irq(pci_dev, irq_num, level);
1259 77d4bc34 bellard
}
1260 0ac32c83 bellard
1261 0ac32c83 bellard
/***********************************************************/
1262 0ac32c83 bellard
/* monitor info on PCI */
1263 0ac32c83 bellard
1264 0ac32c83 bellard
static void pci_info_device(PCIDevice *d)
1265 0ac32c83 bellard
{
1266 0ac32c83 bellard
    int i, class;
1267 0ac32c83 bellard
    PCIIORegion *r;
1268 0ac32c83 bellard
1269 8e3a9fd2 bellard
    term_printf("  Bus %2d, device %3d, function %d:\n",
1270 30468f78 bellard
           d->bus->bus_num, d->devfn >> 3, d->devfn & 7);
1271 0ac32c83 bellard
    class = le16_to_cpu(*((uint16_t *)(d->config + PCI_CLASS_DEVICE)));
1272 8e3a9fd2 bellard
    term_printf("    ");
1273 0ac32c83 bellard
    switch(class) {
1274 0ac32c83 bellard
    case 0x0101:
1275 8e3a9fd2 bellard
        term_printf("IDE controller");
1276 0ac32c83 bellard
        break;
1277 0ac32c83 bellard
    case 0x0200:
1278 8e3a9fd2 bellard
        term_printf("Ethernet controller");
1279 0ac32c83 bellard
        break;
1280 0ac32c83 bellard
    case 0x0300:
1281 8e3a9fd2 bellard
        term_printf("VGA controller");
1282 0ac32c83 bellard
        break;
1283 0ac32c83 bellard
    default:
1284 8e3a9fd2 bellard
        term_printf("Class %04x", class);
1285 0ac32c83 bellard
        break;
1286 0ac32c83 bellard
    }
1287 8e3a9fd2 bellard
    term_printf(": PCI device %04x:%04x\n",
1288 0ac32c83 bellard
           le16_to_cpu(*((uint16_t *)(d->config + PCI_VENDOR_ID))),
1289 0ac32c83 bellard
           le16_to_cpu(*((uint16_t *)(d->config + PCI_DEVICE_ID))));
1290 0ac32c83 bellard
1291 0ac32c83 bellard
    if (d->config[PCI_INTERRUPT_PIN] != 0) {
1292 8e3a9fd2 bellard
        term_printf("      IRQ %d.\n", d->config[PCI_INTERRUPT_LINE]);
1293 0ac32c83 bellard
    }
1294 8a8696a3 bellard
    for(i = 0;i < PCI_NUM_REGIONS; i++) {
1295 0ac32c83 bellard
        r = &d->io_regions[i];
1296 0ac32c83 bellard
        if (r->size != 0) {
1297 8e3a9fd2 bellard
            term_printf("      BAR%d: ", i);
1298 0ac32c83 bellard
            if (r->type & PCI_ADDRESS_SPACE_IO) {
1299 8e3a9fd2 bellard
                term_printf("I/O at 0x%04x [0x%04x].\n", 
1300 0ac32c83 bellard
                       r->addr, r->addr + r->size - 1);
1301 0ac32c83 bellard
            } else {
1302 8e3a9fd2 bellard
                term_printf("32 bit memory at 0x%08x [0x%08x].\n", 
1303 0ac32c83 bellard
                       r->addr, r->addr + r->size - 1);
1304 0ac32c83 bellard
            }
1305 0ac32c83 bellard
        }
1306 0ac32c83 bellard
    }
1307 0ac32c83 bellard
}
1308 0ac32c83 bellard
1309 0ac32c83 bellard
void pci_info(void)
1310 0ac32c83 bellard
{
1311 30468f78 bellard
    PCIBus *bus = first_bus;
1312 30468f78 bellard
    PCIDevice *d;
1313 30468f78 bellard
    int devfn;
1314 0ac32c83 bellard
    
1315 30468f78 bellard
    if (bus) {
1316 30468f78 bellard
        for(devfn = 0; devfn < 256; devfn++) {
1317 30468f78 bellard
            d = bus->devices[devfn];
1318 30468f78 bellard
            if (d)
1319 30468f78 bellard
                pci_info_device(d);
1320 0ac32c83 bellard
        }
1321 0ac32c83 bellard
    }
1322 0ac32c83 bellard
}
1323 0ac32c83 bellard
1324 0ac32c83 bellard
/***********************************************************/
1325 0ac32c83 bellard
/* XXX: the following should be moved to the PC BIOS */
1326 0ac32c83 bellard
1327 30468f78 bellard
static __attribute__((unused)) uint32_t isa_inb(uint32_t addr)
1328 0ac32c83 bellard
{
1329 0ac32c83 bellard
    return cpu_inb(cpu_single_env, addr);
1330 0ac32c83 bellard
}
1331 0ac32c83 bellard
1332 0ac32c83 bellard
static void isa_outb(uint32_t val, uint32_t addr)
1333 0ac32c83 bellard
{
1334 0ac32c83 bellard
    cpu_outb(cpu_single_env, addr, val);
1335 0ac32c83 bellard
}
1336 0ac32c83 bellard
1337 30468f78 bellard
static __attribute__((unused)) uint32_t isa_inw(uint32_t addr)
1338 0ac32c83 bellard
{
1339 0ac32c83 bellard
    return cpu_inw(cpu_single_env, addr);
1340 0ac32c83 bellard
}
1341 0ac32c83 bellard
1342 30468f78 bellard
static __attribute__((unused)) void isa_outw(uint32_t val, uint32_t addr)
1343 0ac32c83 bellard
{
1344 0ac32c83 bellard
    cpu_outw(cpu_single_env, addr, val);
1345 0ac32c83 bellard
}
1346 0ac32c83 bellard
1347 30468f78 bellard
static __attribute__((unused)) uint32_t isa_inl(uint32_t addr)
1348 0ac32c83 bellard
{
1349 0ac32c83 bellard
    return cpu_inl(cpu_single_env, addr);
1350 0ac32c83 bellard
}
1351 0ac32c83 bellard
1352 30468f78 bellard
static __attribute__((unused)) void isa_outl(uint32_t val, uint32_t addr)
1353 0ac32c83 bellard
{
1354 0ac32c83 bellard
    cpu_outl(cpu_single_env, addr, val);
1355 0ac32c83 bellard
}
1356 0ac32c83 bellard
1357 0ac32c83 bellard
static void pci_config_writel(PCIDevice *d, uint32_t addr, uint32_t val)
1358 0ac32c83 bellard
{
1359 30468f78 bellard
    PCIBus *s = d->bus;
1360 30468f78 bellard
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1361 0ac32c83 bellard
        (d->devfn << 8) | addr;
1362 0ac32c83 bellard
    pci_data_write(s, 0, val, 4);
1363 0ac32c83 bellard
}
1364 0ac32c83 bellard
1365 0ac32c83 bellard
static void pci_config_writew(PCIDevice *d, uint32_t addr, uint32_t val)
1366 0ac32c83 bellard
{
1367 30468f78 bellard
    PCIBus *s = d->bus;
1368 30468f78 bellard
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1369 0ac32c83 bellard
        (d->devfn << 8) | (addr & ~3);
1370 0ac32c83 bellard
    pci_data_write(s, addr & 3, val, 2);
1371 0ac32c83 bellard
}
1372 0ac32c83 bellard
1373 0ac32c83 bellard
static void pci_config_writeb(PCIDevice *d, uint32_t addr, uint32_t val)
1374 0ac32c83 bellard
{
1375 30468f78 bellard
    PCIBus *s = d->bus;
1376 30468f78 bellard
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1377 0ac32c83 bellard
        (d->devfn << 8) | (addr & ~3);
1378 0ac32c83 bellard
    pci_data_write(s, addr & 3, val, 1);
1379 0ac32c83 bellard
}
1380 0ac32c83 bellard
1381 30468f78 bellard
static __attribute__((unused)) uint32_t pci_config_readl(PCIDevice *d, uint32_t addr)
1382 0ac32c83 bellard
{
1383 30468f78 bellard
    PCIBus *s = d->bus;
1384 30468f78 bellard
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1385 0ac32c83 bellard
        (d->devfn << 8) | addr;
1386 0ac32c83 bellard
    return pci_data_read(s, 0, 4);
1387 0ac32c83 bellard
}
1388 0ac32c83 bellard
1389 0ac32c83 bellard
static uint32_t pci_config_readw(PCIDevice *d, uint32_t addr)
1390 0ac32c83 bellard
{
1391 30468f78 bellard
    PCIBus *s = d->bus;
1392 30468f78 bellard
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1393 0ac32c83 bellard
        (d->devfn << 8) | (addr & ~3);
1394 0ac32c83 bellard
    return pci_data_read(s, addr & 3, 2);
1395 0ac32c83 bellard
}
1396 0ac32c83 bellard
1397 0ac32c83 bellard
static uint32_t pci_config_readb(PCIDevice *d, uint32_t addr)
1398 0ac32c83 bellard
{
1399 30468f78 bellard
    PCIBus *s = d->bus;
1400 30468f78 bellard
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1401 0ac32c83 bellard
        (d->devfn << 8) | (addr & ~3);
1402 0ac32c83 bellard
    return pci_data_read(s, addr & 3, 1);
1403 0ac32c83 bellard
}
1404 69b91039 bellard
1405 69b91039 bellard
static uint32_t pci_bios_io_addr;
1406 69b91039 bellard
static uint32_t pci_bios_mem_addr;
1407 0ac32c83 bellard
/* host irqs corresponding to PCI irqs A-D */
1408 0ac32c83 bellard
static uint8_t pci_irqs[4] = { 11, 9, 11, 9 };
1409 69b91039 bellard
1410 69b91039 bellard
static void pci_set_io_region_addr(PCIDevice *d, int region_num, uint32_t addr)
1411 69b91039 bellard
{
1412 69b91039 bellard
    PCIIORegion *r;
1413 0ac32c83 bellard
    uint16_t cmd;
1414 8a8696a3 bellard
    uint32_t ofs;
1415 8a8696a3 bellard
1416 8a8696a3 bellard
    if ( region_num == PCI_ROM_SLOT ) {
1417 8a8696a3 bellard
        ofs = 0x30;
1418 8a8696a3 bellard
    }else{
1419 8a8696a3 bellard
        ofs = 0x10 + region_num * 4;
1420 8a8696a3 bellard
    }
1421 69b91039 bellard
1422 8a8696a3 bellard
    pci_config_writel(d, ofs, addr);
1423 69b91039 bellard
    r = &d->io_regions[region_num];
1424 69b91039 bellard
1425 69b91039 bellard
    /* enable memory mappings */
1426 0ac32c83 bellard
    cmd = pci_config_readw(d, PCI_COMMAND);
1427 8a8696a3 bellard
    if ( region_num == PCI_ROM_SLOT )
1428 8a8696a3 bellard
        cmd |= 2;
1429 8a8696a3 bellard
    else if (r->type & PCI_ADDRESS_SPACE_IO)
1430 0ac32c83 bellard
        cmd |= 1;
1431 69b91039 bellard
    else
1432 0ac32c83 bellard
        cmd |= 2;
1433 0ac32c83 bellard
    pci_config_writew(d, PCI_COMMAND, cmd);
1434 69b91039 bellard
}
1435 69b91039 bellard
1436 69b91039 bellard
static void pci_bios_init_device(PCIDevice *d)
1437 69b91039 bellard
{
1438 69b91039 bellard
    int class;
1439 69b91039 bellard
    PCIIORegion *r;
1440 69b91039 bellard
    uint32_t *paddr;
1441 63ce9e0a bellard
    int i, pin, pic_irq, vendor_id, device_id;
1442 69b91039 bellard
1443 63ce9e0a bellard
    class = pci_config_readw(d, PCI_CLASS_DEVICE);
1444 1f62d938 bellard
    vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
1445 1f62d938 bellard
    device_id = pci_config_readw(d, PCI_DEVICE_ID);
1446 69b91039 bellard
    switch(class) {
1447 69b91039 bellard
    case 0x0101:
1448 63ce9e0a bellard
        if (vendor_id == 0x8086 && device_id == 0x7010) {
1449 63ce9e0a bellard
            /* PIIX3 IDE */
1450 63ce9e0a bellard
            pci_config_writew(d, 0x40, 0x8000); // enable IDE0
1451 7f647cf6 bellard
            pci_config_writew(d, 0x42, 0x8000); // enable IDE1
1452 d187d4b2 bellard
            goto default_map;
1453 63ce9e0a bellard
        } else {
1454 63ce9e0a bellard
            /* IDE: we map it as in ISA mode */
1455 63ce9e0a bellard
            pci_set_io_region_addr(d, 0, 0x1f0);
1456 63ce9e0a bellard
            pci_set_io_region_addr(d, 1, 0x3f4);
1457 63ce9e0a bellard
            pci_set_io_region_addr(d, 2, 0x170);
1458 63ce9e0a bellard
            pci_set_io_region_addr(d, 3, 0x374);
1459 63ce9e0a bellard
        }
1460 69b91039 bellard
        break;
1461 0ac32c83 bellard
    case 0x0300:
1462 4c7634bc bellard
        if (vendor_id != 0x1234)
1463 4c7634bc bellard
            goto default_map;
1464 0ac32c83 bellard
        /* VGA: map frame buffer to default Bochs VBE address */
1465 0ac32c83 bellard
        pci_set_io_region_addr(d, 0, 0xE0000000);
1466 0ac32c83 bellard
        break;
1467 f2aa58c6 bellard
    case 0x0800:
1468 f2aa58c6 bellard
        /* PIC */
1469 f2aa58c6 bellard
        vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
1470 f2aa58c6 bellard
        device_id = pci_config_readw(d, PCI_DEVICE_ID);
1471 f2aa58c6 bellard
        if (vendor_id == 0x1014) {
1472 f2aa58c6 bellard
            /* IBM */
1473 f2aa58c6 bellard
            if (device_id == 0x0046 || device_id == 0xFFFF) {
1474 f2aa58c6 bellard
                /* MPIC & MPIC2 */
1475 f2aa58c6 bellard
                pci_set_io_region_addr(d, 0, 0x80800000 + 0x00040000);
1476 f2aa58c6 bellard
            }
1477 f2aa58c6 bellard
        }
1478 f2aa58c6 bellard
        break;
1479 1f62d938 bellard
    case 0xff00:
1480 f2aa58c6 bellard
        if (vendor_id == 0x0106b &&
1481 f2aa58c6 bellard
            (device_id == 0x0017 || device_id == 0x0022)) {
1482 1f62d938 bellard
            /* macio bridge */
1483 1f62d938 bellard
            pci_set_io_region_addr(d, 0, 0x80800000);
1484 1f62d938 bellard
        }
1485 1f62d938 bellard
        break;
1486 69b91039 bellard
    default:
1487 4c7634bc bellard
    default_map:
1488 69b91039 bellard
        /* default memory mappings */
1489 8a8696a3 bellard
        for(i = 0; i < PCI_NUM_REGIONS; i++) {
1490 69b91039 bellard
            r = &d->io_regions[i];
1491 69b91039 bellard
            if (r->size) {
1492 69b91039 bellard
                if (r->type & PCI_ADDRESS_SPACE_IO)
1493 69b91039 bellard
                    paddr = &pci_bios_io_addr;
1494 69b91039 bellard
                else
1495 69b91039 bellard
                    paddr = &pci_bios_mem_addr;
1496 69b91039 bellard
                *paddr = (*paddr + r->size - 1) & ~(r->size - 1);
1497 69b91039 bellard
                pci_set_io_region_addr(d, i, *paddr);
1498 69b91039 bellard
                *paddr += r->size;
1499 69b91039 bellard
            }
1500 69b91039 bellard
        }
1501 69b91039 bellard
        break;
1502 69b91039 bellard
    }
1503 0ac32c83 bellard
1504 0ac32c83 bellard
    /* map the interrupt */
1505 0ac32c83 bellard
    pin = pci_config_readb(d, PCI_INTERRUPT_PIN);
1506 0ac32c83 bellard
    if (pin != 0) {
1507 0ac32c83 bellard
        pin = pci_slot_get_pirq(d, pin - 1);
1508 0ac32c83 bellard
        pic_irq = pci_irqs[pin];
1509 0ac32c83 bellard
        pci_config_writeb(d, PCI_INTERRUPT_LINE, pic_irq);
1510 0ac32c83 bellard
    }
1511 69b91039 bellard
}
1512 69b91039 bellard
1513 69b91039 bellard
/*
1514 69b91039 bellard
 * This function initializes the PCI devices as a normal PCI BIOS
1515 69b91039 bellard
 * would do. It is provided just in case the BIOS has no support for
1516 69b91039 bellard
 * PCI.
1517 69b91039 bellard
 */
1518 69b91039 bellard
void pci_bios_init(void)
1519 69b91039 bellard
{
1520 30468f78 bellard
    PCIBus *bus;
1521 30468f78 bellard
    PCIDevice *d;
1522 30468f78 bellard
    int devfn, i, irq;
1523 0ac32c83 bellard
    uint8_t elcr[2];
1524 69b91039 bellard
1525 69b91039 bellard
    pci_bios_io_addr = 0xc000;
1526 69b91039 bellard
    pci_bios_mem_addr = 0xf0000000;
1527 69b91039 bellard
1528 0ac32c83 bellard
    /* activate IRQ mappings */
1529 0ac32c83 bellard
    elcr[0] = 0x00;
1530 0ac32c83 bellard
    elcr[1] = 0x00;
1531 0ac32c83 bellard
    for(i = 0; i < 4; i++) {
1532 0ac32c83 bellard
        irq = pci_irqs[i];
1533 0ac32c83 bellard
        /* set to trigger level */
1534 0ac32c83 bellard
        elcr[irq >> 3] |= (1 << (irq & 7));
1535 0ac32c83 bellard
        /* activate irq remapping in PIIX */
1536 0ac32c83 bellard
        pci_config_writeb((PCIDevice *)piix3_state, 0x60 + i, irq);
1537 0ac32c83 bellard
    }
1538 0ac32c83 bellard
    isa_outb(elcr[0], 0x4d0);
1539 0ac32c83 bellard
    isa_outb(elcr[1], 0x4d1);
1540 0ac32c83 bellard
1541 30468f78 bellard
    bus = first_bus;
1542 30468f78 bellard
    if (bus) {
1543 30468f78 bellard
        for(devfn = 0; devfn < 256; devfn++) {
1544 30468f78 bellard
            d = bus->devices[devfn];
1545 30468f78 bellard
            if (d)
1546 30468f78 bellard
                pci_bios_init_device(d);
1547 77d4bc34 bellard
        }
1548 77d4bc34 bellard
    }
1549 77d4bc34 bellard
}