Statistics
| Branch: | Revision:

root / hw / pci.c @ 09b26c5e

History | View | Annotate | Download (50.7 kB)

1
/*
2
 * QEMU PCI bus manager
3
 *
4
 * Copyright (c) 2004 Fabrice Bellard
5
 * 
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#include "vl.h"
25

    
26
//#define DEBUG_PCI
27

    
28
#define PCI_VENDOR_ID                0x00        /* 16 bits */
29
#define PCI_DEVICE_ID                0x02        /* 16 bits */
30
#define PCI_COMMAND                0x04        /* 16 bits */
31
#define  PCI_COMMAND_IO                0x1        /* Enable response in I/O space */
32
#define  PCI_COMMAND_MEMORY        0x2        /* Enable response in Memory space */
33
#define PCI_CLASS_DEVICE        0x0a    /* Device class */
34
#define PCI_INTERRUPT_LINE        0x3c        /* 8 bits */
35
#define PCI_INTERRUPT_PIN        0x3d        /* 8 bits */
36
#define PCI_MIN_GNT                0x3e        /* 8 bits */
37
#define PCI_MAX_LAT                0x3f        /* 8 bits */
38

    
39
/* just used for simpler irq handling. */
40
#define PCI_DEVICES_MAX 64
41
#define PCI_IRQ_WORDS   ((PCI_DEVICES_MAX + 31) / 32)
42

    
43
struct PCIBus {
44
    int bus_num;
45
    int devfn_min;
46
    void (*set_irq)(PCIDevice *pci_dev, int irq_num, int level);
47
    uint32_t config_reg; /* XXX: suppress */
48
    /* low level pic */
49
    SetIRQFunc *low_set_irq;
50
    void *irq_opaque;
51
    PCIDevice *devices[256];
52
};
53

    
54
target_phys_addr_t pci_mem_base;
55
static int pci_irq_index;
56
static uint32_t pci_irq_levels[4][PCI_IRQ_WORDS];
57
static PCIBus *first_bus;
58

    
59
static PCIBus *pci_register_bus(void)
60
{
61
    PCIBus *bus;
62
    bus = qemu_mallocz(sizeof(PCIBus));
63
    first_bus = bus;
64
    return bus;
65
}
66

    
67
void generic_pci_save(QEMUFile* f, void *opaque)
68
{
69
    PCIDevice* s=(PCIDevice*)opaque;
70

    
71
    qemu_put_buffer(f, s->config, 256);
72
}
73

    
74
int generic_pci_load(QEMUFile* f, void *opaque, int version_id)
75
{
76
    PCIDevice* s=(PCIDevice*)opaque;
77

    
78
    if (version_id != 1)
79
        return -EINVAL;
80

    
81
    qemu_get_buffer(f, s->config, 256);
82
    return 0;
83
}
84

    
85
/* -1 for devfn means auto assign */
86
PCIDevice *pci_register_device(PCIBus *bus, const char *name, 
87
                               int instance_size, int devfn,
88
                               PCIConfigReadFunc *config_read, 
89
                               PCIConfigWriteFunc *config_write)
90
{
91
    PCIDevice *pci_dev;
92

    
93
    if (pci_irq_index >= PCI_DEVICES_MAX)
94
        return NULL;
95
    
96
    if (devfn < 0) {
97
        for(devfn = bus->devfn_min ; devfn < 256; devfn += 8) {
98
            if (!bus->devices[devfn])
99
                goto found;
100
        }
101
        return NULL;
102
    found: ;
103
    }
104
    pci_dev = qemu_mallocz(instance_size);
105
    if (!pci_dev)
106
        return NULL;
107
    pci_dev->bus = bus;
108
    pci_dev->devfn = devfn;
109
    pstrcpy(pci_dev->name, sizeof(pci_dev->name), name);
110

    
111
    if (!config_read)
112
        config_read = pci_default_read_config;
113
    if (!config_write)
114
        config_write = pci_default_write_config;
115
    pci_dev->config_read = config_read;
116
    pci_dev->config_write = config_write;
117
    pci_dev->irq_index = pci_irq_index++;
118
    bus->devices[devfn] = pci_dev;
119
    return pci_dev;
120
}
121

    
122
void pci_register_io_region(PCIDevice *pci_dev, int region_num, 
123
                            uint32_t size, int type, 
124
                            PCIMapIORegionFunc *map_func)
125
{
126
    PCIIORegion *r;
127

    
128
    if ((unsigned int)region_num >= PCI_NUM_REGIONS)
129
        return;
130
    r = &pci_dev->io_regions[region_num];
131
    r->addr = -1;
132
    r->size = size;
133
    r->type = type;
134
    r->map_func = map_func;
135
}
136

    
137
static void pci_addr_writel(void* opaque, uint32_t addr, uint32_t val)
138
{
139
    PCIBus *s = opaque;
140
    s->config_reg = val;
141
}
142

    
143
static uint32_t pci_addr_readl(void* opaque, uint32_t addr)
144
{
145
    PCIBus *s = opaque;
146
    return s->config_reg;
147
}
148

    
149
static void pci_update_mappings(PCIDevice *d)
150
{
151
    PCIIORegion *r;
152
    int cmd, i;
153
    uint32_t last_addr, new_addr, config_ofs;
154
    
155
    cmd = le16_to_cpu(*(uint16_t *)(d->config + PCI_COMMAND));
156
    for(i = 0; i < PCI_NUM_REGIONS; i++) {
157
        r = &d->io_regions[i];
158
        if (i == PCI_ROM_SLOT) {
159
            config_ofs = 0x30;
160
        } else {
161
            config_ofs = 0x10 + i * 4;
162
        }
163
        if (r->size != 0) {
164
            if (r->type & PCI_ADDRESS_SPACE_IO) {
165
                if (cmd & PCI_COMMAND_IO) {
166
                    new_addr = le32_to_cpu(*(uint32_t *)(d->config + 
167
                                                         config_ofs));
168
                    new_addr = new_addr & ~(r->size - 1);
169
                    last_addr = new_addr + r->size - 1;
170
                    /* NOTE: we have only 64K ioports on PC */
171
                    if (last_addr <= new_addr || new_addr == 0 ||
172
                        last_addr >= 0x10000) {
173
                        new_addr = -1;
174
                    }
175
                } else {
176
                    new_addr = -1;
177
                }
178
            } else {
179
                if (cmd & PCI_COMMAND_MEMORY) {
180
                    new_addr = le32_to_cpu(*(uint32_t *)(d->config + 
181
                                                         config_ofs));
182
                    /* the ROM slot has a specific enable bit */
183
                    if (i == PCI_ROM_SLOT && !(new_addr & 1))
184
                        goto no_mem_map;
185
                    new_addr = new_addr & ~(r->size - 1);
186
                    last_addr = new_addr + r->size - 1;
187
                    /* NOTE: we do not support wrapping */
188
                    /* XXX: as we cannot support really dynamic
189
                       mappings, we handle specific values as invalid
190
                       mappings. */
191
                    if (last_addr <= new_addr || new_addr == 0 ||
192
                        last_addr == -1) {
193
                        new_addr = -1;
194
                    }
195
                } else {
196
                no_mem_map:
197
                    new_addr = -1;
198
                }
199
            }
200
            /* now do the real mapping */
201
            if (new_addr != r->addr) {
202
                if (r->addr != -1) {
203
                    if (r->type & PCI_ADDRESS_SPACE_IO) {
204
                        int class;
205
                        /* NOTE: specific hack for IDE in PC case:
206
                           only one byte must be mapped. */
207
                        class = d->config[0x0a] | (d->config[0x0b] << 8);
208
                        if (class == 0x0101 && r->size == 4) {
209
                            isa_unassign_ioport(r->addr + 2, 1);
210
                        } else {
211
                            isa_unassign_ioport(r->addr, r->size);
212
                        }
213
                    } else {
214
                        cpu_register_physical_memory(r->addr + pci_mem_base, 
215
                                                     r->size, 
216
                                                     IO_MEM_UNASSIGNED);
217
                    }
218
                }
219
                r->addr = new_addr;
220
                if (r->addr != -1) {
221
                    r->map_func(d, i, r->addr, r->size, r->type);
222
                }
223
            }
224
        }
225
    }
226
}
227

    
228
uint32_t pci_default_read_config(PCIDevice *d, 
229
                                 uint32_t address, int len)
230
{
231
    uint32_t val;
232
    switch(len) {
233
    case 1:
234
        val = d->config[address];
235
        break;
236
    case 2:
237
        val = le16_to_cpu(*(uint16_t *)(d->config + address));
238
        break;
239
    default:
240
    case 4:
241
        val = le32_to_cpu(*(uint32_t *)(d->config + address));
242
        break;
243
    }
244
    return val;
245
}
246

    
247
void pci_default_write_config(PCIDevice *d, 
248
                              uint32_t address, uint32_t val, int len)
249
{
250
    int can_write, i;
251
    uint32_t end, addr;
252

    
253
    if (len == 4 && ((address >= 0x10 && address < 0x10 + 4 * 6) || 
254
                     (address >= 0x30 && address < 0x34))) {
255
        PCIIORegion *r;
256
        int reg;
257

    
258
        if ( address >= 0x30 ) {
259
            reg = PCI_ROM_SLOT;
260
        }else{
261
            reg = (address - 0x10) >> 2;
262
        }
263
        r = &d->io_regions[reg];
264
        if (r->size == 0)
265
            goto default_config;
266
        /* compute the stored value */
267
        if (reg == PCI_ROM_SLOT) {
268
            /* keep ROM enable bit */
269
            val &= (~(r->size - 1)) | 1;
270
        } else {
271
            val &= ~(r->size - 1);
272
            val |= r->type;
273
        }
274
        *(uint32_t *)(d->config + address) = cpu_to_le32(val);
275
        pci_update_mappings(d);
276
        return;
277
    }
278
 default_config:
279
    /* not efficient, but simple */
280
    addr = address;
281
    for(i = 0; i < len; i++) {
282
        /* default read/write accesses */
283
        switch(d->config[0x0e]) {
284
        case 0x00:
285
        case 0x80:
286
            switch(addr) {
287
            case 0x00:
288
            case 0x01:
289
            case 0x02:
290
            case 0x03:
291
            case 0x08:
292
            case 0x09:
293
            case 0x0a:
294
            case 0x0b:
295
            case 0x0e:
296
            case 0x10 ... 0x27: /* base */
297
            case 0x30 ... 0x33: /* rom */
298
            case 0x3d:
299
                can_write = 0;
300
                break;
301
            default:
302
                can_write = 1;
303
                break;
304
            }
305
            break;
306
        default:
307
        case 0x01:
308
            switch(addr) {
309
            case 0x00:
310
            case 0x01:
311
            case 0x02:
312
            case 0x03:
313
            case 0x08:
314
            case 0x09:
315
            case 0x0a:
316
            case 0x0b:
317
            case 0x0e:
318
            case 0x38 ... 0x3b: /* rom */
319
            case 0x3d:
320
                can_write = 0;
321
                break;
322
            default:
323
                can_write = 1;
324
                break;
325
            }
326
            break;
327
        }
328
        if (can_write) {
329
            d->config[addr] = val;
330
        }
331
        addr++;
332
        val >>= 8;
333
    }
334

    
335
    end = address + len;
336
    if (end > PCI_COMMAND && address < (PCI_COMMAND + 2)) {
337
        /* if the command register is modified, we must modify the mappings */
338
        pci_update_mappings(d);
339
    }
340
}
341

    
342
static void pci_data_write(void *opaque, uint32_t addr, 
343
                           uint32_t val, int len)
344
{
345
    PCIBus *s = opaque;
346
    PCIDevice *pci_dev;
347
    int config_addr, bus_num;
348
    
349
#if defined(DEBUG_PCI) && 0
350
    printf("pci_data_write: addr=%08x val=%08x len=%d\n",
351
           s->config_reg, val, len);
352
#endif
353
    if (!(s->config_reg & (1 << 31))) {
354
        return;
355
    }
356
    bus_num = (s->config_reg >> 16) & 0xff;
357
    if (bus_num != 0)
358
        return;
359
    pci_dev = s->devices[(s->config_reg >> 8) & 0xff];
360
    if (!pci_dev)
361
        return;
362
    config_addr = (s->config_reg & 0xfc) | (addr & 3);
363
#if defined(DEBUG_PCI)
364
    printf("pci_config_write: %s: addr=%02x val=%08x len=%d\n",
365
           pci_dev->name, config_addr, val, len);
366
#endif
367
    pci_dev->config_write(pci_dev, config_addr, val, len);
368
}
369

    
370
static uint32_t pci_data_read(void *opaque, uint32_t addr, 
371
                              int len)
372
{
373
    PCIBus *s = opaque;
374
    PCIDevice *pci_dev;
375
    int config_addr, bus_num;
376
    uint32_t val;
377

    
378
    if (!(s->config_reg & (1 << 31)))
379
        goto fail;
380
    bus_num = (s->config_reg >> 16) & 0xff;
381
    if (bus_num != 0)
382
        goto fail;
383
    pci_dev = s->devices[(s->config_reg >> 8) & 0xff];
384
    if (!pci_dev) {
385
    fail:
386
        switch(len) {
387
        case 1:
388
            val = 0xff;
389
            break;
390
        case 2:
391
            val = 0xffff;
392
            break;
393
        default:
394
        case 4:
395
            val = 0xffffffff;
396
            break;
397
        }
398
        goto the_end;
399
    }
400
    config_addr = (s->config_reg & 0xfc) | (addr & 3);
401
    val = pci_dev->config_read(pci_dev, config_addr, len);
402
#if defined(DEBUG_PCI)
403
    printf("pci_config_read: %s: addr=%02x val=%08x len=%d\n",
404
           pci_dev->name, config_addr, val, len);
405
#endif
406
 the_end:
407
#if defined(DEBUG_PCI) && 0
408
    printf("pci_data_read: addr=%08x val=%08x len=%d\n",
409
           s->config_reg, val, len);
410
#endif
411
    return val;
412
}
413

    
414
static void pci_data_writeb(void* opaque, uint32_t addr, uint32_t val)
415
{
416
    pci_data_write(opaque, addr, val, 1);
417
}
418

    
419
static void pci_data_writew(void* opaque, uint32_t addr, uint32_t val)
420
{
421
    pci_data_write(opaque, addr, val, 2);
422
}
423

    
424
static void pci_data_writel(void* opaque, uint32_t addr, uint32_t val)
425
{
426
    pci_data_write(opaque, addr, val, 4);
427
}
428

    
429
static uint32_t pci_data_readb(void* opaque, uint32_t addr)
430
{
431
    return pci_data_read(opaque, addr, 1);
432
}
433

    
434
static uint32_t pci_data_readw(void* opaque, uint32_t addr)
435
{
436
    return pci_data_read(opaque, addr, 2);
437
}
438

    
439
static uint32_t pci_data_readl(void* opaque, uint32_t addr)
440
{
441
    return pci_data_read(opaque, addr, 4);
442
}
443

    
444
/* i440FX PCI bridge */
445

    
446
static void piix3_set_irq(PCIDevice *pci_dev, int irq_num, int level);
447

    
448
PCIBus *i440fx_init(void)
449
{
450
    PCIBus *s;
451
    PCIDevice *d;
452

    
453
    s = pci_register_bus();
454
    s->set_irq = piix3_set_irq;
455

    
456
    register_ioport_write(0xcf8, 4, 4, pci_addr_writel, s);
457
    register_ioport_read(0xcf8, 4, 4, pci_addr_readl, s);
458

    
459
    register_ioport_write(0xcfc, 4, 1, pci_data_writeb, s);
460
    register_ioport_write(0xcfc, 4, 2, pci_data_writew, s);
461
    register_ioport_write(0xcfc, 4, 4, pci_data_writel, s);
462
    register_ioport_read(0xcfc, 4, 1, pci_data_readb, s);
463
    register_ioport_read(0xcfc, 4, 2, pci_data_readw, s);
464
    register_ioport_read(0xcfc, 4, 4, pci_data_readl, s);
465

    
466
    d = pci_register_device(s, "i440FX", sizeof(PCIDevice), 0, 
467
                            NULL, NULL);
468

    
469
    d->config[0x00] = 0x86; // vendor_id
470
    d->config[0x01] = 0x80;
471
    d->config[0x02] = 0x37; // device_id
472
    d->config[0x03] = 0x12;
473
    d->config[0x08] = 0x02; // revision
474
    d->config[0x0a] = 0x00; // class_sub = host2pci
475
    d->config[0x0b] = 0x06; // class_base = PCI_bridge
476
    d->config[0x0e] = 0x00; // header_type
477
    return s;
478
}
479

    
480
/* PIIX3 PCI to ISA bridge */
481

    
482
typedef struct PIIX3State {
483
    PCIDevice dev;
484
} PIIX3State;
485

    
486
PIIX3State *piix3_state;
487

    
488
/* return the global irq number corresponding to a given device irq
489
   pin. We could also use the bus number to have a more precise
490
   mapping. */
491
static inline int pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
492
{
493
    int slot_addend;
494
    slot_addend = (pci_dev->devfn >> 3) - 1;
495
    return (irq_num + slot_addend) & 3;
496
}
497

    
498
static inline int get_pci_irq_level(int irq_num)
499
{
500
    int pic_level;
501
#if (PCI_IRQ_WORDS == 2)
502
    pic_level = ((pci_irq_levels[irq_num][0] | 
503
                  pci_irq_levels[irq_num][1]) != 0);
504
#else
505
    {
506
        int i;
507
        pic_level = 0;
508
        for(i = 0; i < PCI_IRQ_WORDS; i++) {
509
            if (pci_irq_levels[irq_num][i]) {
510
                pic_level = 1;
511
                break;
512
            }
513
        }
514
    }
515
#endif
516
    return pic_level;
517
}
518

    
519
static void piix3_set_irq(PCIDevice *pci_dev, int irq_num, int level)
520
{
521
    int irq_index, shift, pic_irq, pic_level;
522
    uint32_t *p;
523

    
524
    irq_num = pci_slot_get_pirq(pci_dev, irq_num);
525
    irq_index = pci_dev->irq_index;
526
    p = &pci_irq_levels[irq_num][irq_index >> 5];
527
    shift = (irq_index & 0x1f);
528
    *p = (*p & ~(1 << shift)) | (level << shift);
529

    
530
    /* now we change the pic irq level according to the piix irq mappings */
531
    /* XXX: optimize */
532
    pic_irq = piix3_state->dev.config[0x60 + irq_num];
533
    if (pic_irq < 16) {
534
        /* the pic level is the logical OR of all the PCI irqs mapped
535
           to it */
536
        pic_level = 0;
537
        if (pic_irq == piix3_state->dev.config[0x60])
538
            pic_level |= get_pci_irq_level(0);
539
        if (pic_irq == piix3_state->dev.config[0x61])
540
            pic_level |= get_pci_irq_level(1);
541
        if (pic_irq == piix3_state->dev.config[0x62])
542
            pic_level |= get_pci_irq_level(2);
543
        if (pic_irq == piix3_state->dev.config[0x63])
544
            pic_level |= get_pci_irq_level(3);
545
        pic_set_irq(pic_irq, pic_level);
546
    }
547
}
548

    
549
static void piix3_reset(PIIX3State *d)
550
{
551
    uint8_t *pci_conf = d->dev.config;
552

    
553
    pci_conf[0x04] = 0x07; // master, memory and I/O
554
    pci_conf[0x05] = 0x00;
555
    pci_conf[0x06] = 0x00;
556
    pci_conf[0x07] = 0x02; // PCI_status_devsel_medium
557
    pci_conf[0x4c] = 0x4d;
558
    pci_conf[0x4e] = 0x03;
559
    pci_conf[0x4f] = 0x00;
560
    pci_conf[0x60] = 0x80;
561
    pci_conf[0x69] = 0x02;
562
    pci_conf[0x70] = 0x80;
563
    pci_conf[0x76] = 0x0c;
564
    pci_conf[0x77] = 0x0c;
565
    pci_conf[0x78] = 0x02;
566
    pci_conf[0x79] = 0x00;
567
    pci_conf[0x80] = 0x00;
568
    pci_conf[0x82] = 0x00;
569
    pci_conf[0xa0] = 0x08;
570
    pci_conf[0xa0] = 0x08;
571
    pci_conf[0xa2] = 0x00;
572
    pci_conf[0xa3] = 0x00;
573
    pci_conf[0xa4] = 0x00;
574
    pci_conf[0xa5] = 0x00;
575
    pci_conf[0xa6] = 0x00;
576
    pci_conf[0xa7] = 0x00;
577
    pci_conf[0xa8] = 0x0f;
578
    pci_conf[0xaa] = 0x00;
579
    pci_conf[0xab] = 0x00;
580
    pci_conf[0xac] = 0x00;
581
    pci_conf[0xae] = 0x00;
582
}
583

    
584
void piix3_init(PCIBus *bus)
585
{
586
    PIIX3State *d;
587
    uint8_t *pci_conf;
588

    
589
    d = (PIIX3State *)pci_register_device(bus, "PIIX3", sizeof(PIIX3State),
590
                                          -1, NULL, NULL);
591
    register_savevm("PIIX3", 0, 1, generic_pci_save, generic_pci_load, d);
592

    
593
    piix3_state = d;
594
    pci_conf = d->dev.config;
595

    
596
    pci_conf[0x00] = 0x86; // Intel
597
    pci_conf[0x01] = 0x80;
598
    pci_conf[0x02] = 0x00; // 82371SB PIIX3 PCI-to-ISA bridge (Step A1)
599
    pci_conf[0x03] = 0x70;
600
    pci_conf[0x0a] = 0x01; // class_sub = PCI_ISA
601
    pci_conf[0x0b] = 0x06; // class_base = PCI_bridge
602
    pci_conf[0x0e] = 0x80; // header_type = PCI_multifunction, generic
603

    
604
    piix3_reset(d);
605
}
606

    
607
/* PREP pci init */
608

    
609
static inline void set_config(PCIBus *s, target_phys_addr_t addr)
610
{
611
    int devfn, i;
612

    
613
    for(i = 0; i < 11; i++) {
614
        if ((addr & (1 << (11 + i))) != 0)
615
            break;
616
    }
617
    devfn = ((addr >> 8) & 7) | (i << 3);
618
    s->config_reg = 0x80000000 | (addr & 0xfc) | (devfn << 8);
619
}
620

    
621
static void PPC_PCIIO_writeb (void *opaque, target_phys_addr_t addr, uint32_t val)
622
{
623
    PCIBus *s = opaque;
624
    set_config(s, addr);
625
    pci_data_write(s, addr, val, 1);
626
}
627

    
628
static void PPC_PCIIO_writew (void *opaque, target_phys_addr_t addr, uint32_t val)
629
{
630
    PCIBus *s = opaque;
631
    set_config(s, addr);
632
#ifdef TARGET_WORDS_BIGENDIAN
633
    val = bswap16(val);
634
#endif
635
    pci_data_write(s, addr, val, 2);
636
}
637

    
638
static void PPC_PCIIO_writel (void *opaque, target_phys_addr_t addr, uint32_t val)
639
{
640
    PCIBus *s = opaque;
641
    set_config(s, addr);
642
#ifdef TARGET_WORDS_BIGENDIAN
643
    val = bswap32(val);
644
#endif
645
    pci_data_write(s, addr, val, 4);
646
}
647

    
648
static uint32_t PPC_PCIIO_readb (void *opaque, target_phys_addr_t addr)
649
{
650
    PCIBus *s = opaque;
651
    uint32_t val;
652
    set_config(s, addr);
653
    val = pci_data_read(s, addr, 1);
654
    return val;
655
}
656

    
657
static uint32_t PPC_PCIIO_readw (void *opaque, target_phys_addr_t addr)
658
{
659
    PCIBus *s = opaque;
660
    uint32_t val;
661
    set_config(s, addr);
662
    val = pci_data_read(s, addr, 2);
663
#ifdef TARGET_WORDS_BIGENDIAN
664
    val = bswap16(val);
665
#endif
666
    return val;
667
}
668

    
669
static uint32_t PPC_PCIIO_readl (void *opaque, target_phys_addr_t addr)
670
{
671
    PCIBus *s = opaque;
672
    uint32_t val;
673
    set_config(s, addr);
674
    val = pci_data_read(s, addr, 4);
675
#ifdef TARGET_WORDS_BIGENDIAN
676
    val = bswap32(val);
677
#endif
678
    return val;
679
}
680

    
681
static CPUWriteMemoryFunc *PPC_PCIIO_write[] = {
682
    &PPC_PCIIO_writeb,
683
    &PPC_PCIIO_writew,
684
    &PPC_PCIIO_writel,
685
};
686

    
687
static CPUReadMemoryFunc *PPC_PCIIO_read[] = {
688
    &PPC_PCIIO_readb,
689
    &PPC_PCIIO_readw,
690
    &PPC_PCIIO_readl,
691
};
692

    
693
static void prep_set_irq(PCIDevice *d, int irq_num, int level)
694
{
695
    /* XXX: we do not simulate the hardware - we rely on the BIOS to
696
       set correctly for irq line field */
697
    pic_set_irq(d->config[PCI_INTERRUPT_LINE], level);
698
}
699

    
700
PCIBus *pci_prep_init(void)
701
{
702
    PCIBus *s;
703
    PCIDevice *d;
704
    int PPC_io_memory;
705

    
706
    s = pci_register_bus();
707
    s->set_irq = prep_set_irq;
708

    
709
    register_ioport_write(0xcf8, 4, 4, pci_addr_writel, s);
710
    register_ioport_read(0xcf8, 4, 4, pci_addr_readl, s);
711

    
712
    register_ioport_write(0xcfc, 4, 1, pci_data_writeb, s);
713
    register_ioport_write(0xcfc, 4, 2, pci_data_writew, s);
714
    register_ioport_write(0xcfc, 4, 4, pci_data_writel, s);
715
    register_ioport_read(0xcfc, 4, 1, pci_data_readb, s);
716
    register_ioport_read(0xcfc, 4, 2, pci_data_readw, s);
717
    register_ioport_read(0xcfc, 4, 4, pci_data_readl, s);
718

    
719
    PPC_io_memory = cpu_register_io_memory(0, PPC_PCIIO_read, 
720
                                           PPC_PCIIO_write, s);
721
    cpu_register_physical_memory(0x80800000, 0x00400000, PPC_io_memory);
722

    
723
    /* PCI host bridge */ 
724
    d = pci_register_device(s, "PREP Host Bridge - Motorola Raven", 
725
                            sizeof(PCIDevice), 0, NULL, NULL);
726
    d->config[0x00] = 0x57; // vendor_id : Motorola
727
    d->config[0x01] = 0x10;
728
    d->config[0x02] = 0x01; // device_id : Raven
729
    d->config[0x03] = 0x48;
730
    d->config[0x08] = 0x00; // revision
731
    d->config[0x0A] = 0x00; // class_sub = pci host
732
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
733
    d->config[0x0C] = 0x08; // cache_line_size
734
    d->config[0x0D] = 0x10; // latency_timer
735
    d->config[0x0E] = 0x00; // header_type
736
    d->config[0x34] = 0x00; // capabilities_pointer
737

    
738
    return s;
739
}
740

    
741

    
742
/* Grackle PCI host */
743
static void pci_grackle_config_writel (void *opaque, target_phys_addr_t addr,
744
                                       uint32_t val)
745
{
746
    PCIBus *s = opaque;
747
#ifdef TARGET_WORDS_BIGENDIAN
748
    val = bswap32(val);
749
#endif
750
    s->config_reg = val;
751
}
752

    
753
static uint32_t pci_grackle_config_readl (void *opaque, target_phys_addr_t addr)
754
{
755
    PCIBus *s = opaque;
756
    uint32_t val;
757

    
758
    val = s->config_reg;
759
#ifdef TARGET_WORDS_BIGENDIAN
760
    val = bswap32(val);
761
#endif
762
    return val;
763
}
764

    
765
static CPUWriteMemoryFunc *pci_grackle_config_write[] = {
766
    &pci_grackle_config_writel,
767
    &pci_grackle_config_writel,
768
    &pci_grackle_config_writel,
769
};
770

    
771
static CPUReadMemoryFunc *pci_grackle_config_read[] = {
772
    &pci_grackle_config_readl,
773
    &pci_grackle_config_readl,
774
    &pci_grackle_config_readl,
775
};
776

    
777
static void pci_grackle_writeb (void *opaque, target_phys_addr_t addr,
778
                                uint32_t val)
779
{
780
    PCIBus *s = opaque;
781
    pci_data_write(s, addr, val, 1);
782
}
783

    
784
static void pci_grackle_writew (void *opaque, target_phys_addr_t addr,
785
                                uint32_t val)
786
{
787
    PCIBus *s = opaque;
788
#ifdef TARGET_WORDS_BIGENDIAN
789
    val = bswap16(val);
790
#endif
791
    pci_data_write(s, addr, val, 2);
792
}
793

    
794
static void pci_grackle_writel (void *opaque, target_phys_addr_t addr,
795
                                uint32_t val)
796
{
797
    PCIBus *s = opaque;
798
#ifdef TARGET_WORDS_BIGENDIAN
799
    val = bswap32(val);
800
#endif
801
    pci_data_write(s, addr, val, 4);
802
}
803

    
804
static uint32_t pci_grackle_readb (void *opaque, target_phys_addr_t addr)
805
{
806
    PCIBus *s = opaque;
807
    uint32_t val;
808
    val = pci_data_read(s, addr, 1);
809
    return val;
810
}
811

    
812
static uint32_t pci_grackle_readw (void *opaque, target_phys_addr_t addr)
813
{
814
    PCIBus *s = opaque;
815
    uint32_t val;
816
    val = pci_data_read(s, addr, 2);
817
#ifdef TARGET_WORDS_BIGENDIAN
818
    val = bswap16(val);
819
#endif
820
    return val;
821
}
822

    
823
static uint32_t pci_grackle_readl (void *opaque, target_phys_addr_t addr)
824
{
825
    PCIBus *s = opaque;
826
    uint32_t val;
827

    
828
    val = pci_data_read(s, addr, 4);
829
#ifdef TARGET_WORDS_BIGENDIAN
830
    val = bswap32(val);
831
#endif
832
    return val;
833
}
834

    
835
static CPUWriteMemoryFunc *pci_grackle_write[] = {
836
    &pci_grackle_writeb,
837
    &pci_grackle_writew,
838
    &pci_grackle_writel,
839
};
840

    
841
static CPUReadMemoryFunc *pci_grackle_read[] = {
842
    &pci_grackle_readb,
843
    &pci_grackle_readw,
844
    &pci_grackle_readl,
845
};
846

    
847
void pci_set_pic(PCIBus *bus, SetIRQFunc *set_irq, void *irq_opaque)
848
{
849
    bus->low_set_irq = set_irq;
850
    bus->irq_opaque = irq_opaque;
851
}
852

    
853
/* XXX: we do not simulate the hardware - we rely on the BIOS to
854
   set correctly for irq line field */
855
static void pci_set_irq_simple(PCIDevice *d, int irq_num, int level)
856
{
857
    PCIBus *s = d->bus;
858
    s->low_set_irq(s->irq_opaque, d->config[PCI_INTERRUPT_LINE], level);
859
}
860

    
861
PCIBus *pci_grackle_init(uint32_t base)
862
{
863
    PCIBus *s;
864
    PCIDevice *d;
865
    int pci_mem_config, pci_mem_data;
866

    
867
    s = pci_register_bus();
868
    s->set_irq = pci_set_irq_simple;
869

    
870
    pci_mem_config = cpu_register_io_memory(0, pci_grackle_config_read, 
871
                                            pci_grackle_config_write, s);
872
    pci_mem_data = cpu_register_io_memory(0, pci_grackle_read,
873
                                          pci_grackle_write, s);
874
    cpu_register_physical_memory(base, 0x1000, pci_mem_config);
875
    cpu_register_physical_memory(base + 0x00200000, 0x1000, pci_mem_data);
876
    d = pci_register_device(s, "Grackle host bridge", sizeof(PCIDevice), 
877
                            0, NULL, NULL);
878
    d->config[0x00] = 0x57; // vendor_id
879
    d->config[0x01] = 0x10;
880
    d->config[0x02] = 0x02; // device_id
881
    d->config[0x03] = 0x00;
882
    d->config[0x08] = 0x00; // revision
883
    d->config[0x09] = 0x01;
884
    d->config[0x0a] = 0x00; // class_sub = host
885
    d->config[0x0b] = 0x06; // class_base = PCI_bridge
886
    d->config[0x0e] = 0x00; // header_type
887

    
888
    d->config[0x18] = 0x00;  // primary_bus
889
    d->config[0x19] = 0x01;  // secondary_bus
890
    d->config[0x1a] = 0x00;  // subordinate_bus
891
    d->config[0x1c] = 0x00;
892
    d->config[0x1d] = 0x00;
893
    
894
    d->config[0x20] = 0x00; // memory_base
895
    d->config[0x21] = 0x00;
896
    d->config[0x22] = 0x01; // memory_limit
897
    d->config[0x23] = 0x00;
898
    
899
    d->config[0x24] = 0x00; // prefetchable_memory_base
900
    d->config[0x25] = 0x00;
901
    d->config[0x26] = 0x00; // prefetchable_memory_limit
902
    d->config[0x27] = 0x00;
903

    
904
#if 0
905
    /* PCI2PCI bridge same values as PearPC - check this */
906
    d->config[0x00] = 0x11; // vendor_id
907
    d->config[0x01] = 0x10;
908
    d->config[0x02] = 0x26; // device_id
909
    d->config[0x03] = 0x00;
910
    d->config[0x08] = 0x02; // revision
911
    d->config[0x0a] = 0x04; // class_sub = pci2pci
912
    d->config[0x0b] = 0x06; // class_base = PCI_bridge
913
    d->config[0x0e] = 0x01; // header_type
914

915
    d->config[0x18] = 0x0;  // primary_bus
916
    d->config[0x19] = 0x1;  // secondary_bus
917
    d->config[0x1a] = 0x1;  // subordinate_bus
918
    d->config[0x1c] = 0x10; // io_base
919
    d->config[0x1d] = 0x20; // io_limit
920
    
921
    d->config[0x20] = 0x80; // memory_base
922
    d->config[0x21] = 0x80;
923
    d->config[0x22] = 0x90; // memory_limit
924
    d->config[0x23] = 0x80;
925
    
926
    d->config[0x24] = 0x00; // prefetchable_memory_base
927
    d->config[0x25] = 0x84;
928
    d->config[0x26] = 0x00; // prefetchable_memory_limit
929
    d->config[0x27] = 0x85;
930
#endif
931
    return s;
932
}
933

    
934
/* Uninorth PCI host (for all Mac99 and newer machines */
935
static void pci_unin_main_config_writel (void *opaque, target_phys_addr_t addr,
936
                                         uint32_t val)
937
{
938
    PCIBus *s = opaque;
939
    int i;
940

    
941
#ifdef TARGET_WORDS_BIGENDIAN
942
    val = bswap32(val);
943
#endif
944

    
945
    for (i = 11; i < 32; i++) {
946
        if ((val & (1 << i)) != 0)
947
            break;
948
    }
949
#if 0
950
    s->config_reg = 0x80000000 | (1 << 16) | (val & 0x7FC) | (i << 11);
951
#else
952
    s->config_reg = 0x80000000 | (0 << 16) | (val & 0x7FC) | (i << 11);
953
#endif
954
}
955

    
956
static uint32_t pci_unin_main_config_readl (void *opaque,
957
                                            target_phys_addr_t addr)
958
{
959
    PCIBus *s = opaque;
960
    uint32_t val;
961
    int devfn;
962

    
963
    devfn = (s->config_reg >> 8) & 0xFF;
964
    val = (1 << (devfn >> 3)) | ((devfn & 0x07) << 8) | (s->config_reg & 0xFC);
965
#ifdef TARGET_WORDS_BIGENDIAN
966
    val = bswap32(val);
967
#endif
968

    
969
    return val;
970
}
971

    
972
static CPUWriteMemoryFunc *pci_unin_main_config_write[] = {
973
    &pci_unin_main_config_writel,
974
    &pci_unin_main_config_writel,
975
    &pci_unin_main_config_writel,
976
};
977

    
978
static CPUReadMemoryFunc *pci_unin_main_config_read[] = {
979
    &pci_unin_main_config_readl,
980
    &pci_unin_main_config_readl,
981
    &pci_unin_main_config_readl,
982
};
983

    
984
static void pci_unin_main_writeb (void *opaque, target_phys_addr_t addr,
985
                                  uint32_t val)
986
{
987
    PCIBus *s = opaque;
988
    pci_data_write(s, addr & 7, val, 1);
989
}
990

    
991
static void pci_unin_main_writew (void *opaque, target_phys_addr_t addr,
992
                                  uint32_t val)
993
{
994
    PCIBus *s = opaque;
995
#ifdef TARGET_WORDS_BIGENDIAN
996
    val = bswap16(val);
997
#endif
998
    pci_data_write(s, addr & 7, val, 2);
999
}
1000

    
1001
static void pci_unin_main_writel (void *opaque, target_phys_addr_t addr,
1002
                                uint32_t val)
1003
{
1004
    PCIBus *s = opaque;
1005
#ifdef TARGET_WORDS_BIGENDIAN
1006
    val = bswap32(val);
1007
#endif
1008
    pci_data_write(s, addr & 7, val, 4);
1009
}
1010

    
1011
static uint32_t pci_unin_main_readb (void *opaque, target_phys_addr_t addr)
1012
{
1013
    PCIBus *s = opaque;
1014
    uint32_t val;
1015

    
1016
    val = pci_data_read(s, addr & 7, 1);
1017

    
1018
    return val;
1019
}
1020

    
1021
static uint32_t pci_unin_main_readw (void *opaque, target_phys_addr_t addr)
1022
{
1023
    PCIBus *s = opaque;
1024
    uint32_t val;
1025

    
1026
    val = pci_data_read(s, addr & 7, 2);
1027
#ifdef TARGET_WORDS_BIGENDIAN
1028
    val = bswap16(val);
1029
#endif
1030

    
1031
    return val;
1032
}
1033

    
1034
static uint32_t pci_unin_main_readl (void *opaque, target_phys_addr_t addr)
1035
{
1036
    PCIBus *s = opaque;
1037
    uint32_t val;
1038

    
1039
    val = pci_data_read(s, addr, 4);
1040
#ifdef TARGET_WORDS_BIGENDIAN
1041
    val = bswap32(val);
1042
#endif
1043

    
1044
    return val;
1045
}
1046

    
1047
static CPUWriteMemoryFunc *pci_unin_main_write[] = {
1048
    &pci_unin_main_writeb,
1049
    &pci_unin_main_writew,
1050
    &pci_unin_main_writel,
1051
};
1052

    
1053
static CPUReadMemoryFunc *pci_unin_main_read[] = {
1054
    &pci_unin_main_readb,
1055
    &pci_unin_main_readw,
1056
    &pci_unin_main_readl,
1057
};
1058

    
1059
#if 0
1060

1061
static void pci_unin_config_writel (void *opaque, target_phys_addr_t addr,
1062
                                    uint32_t val)
1063
{
1064
    PCIBus *s = opaque;
1065

1066
#ifdef TARGET_WORDS_BIGENDIAN
1067
    val = bswap32(val);
1068
#endif
1069
    s->config_reg = 0x80000000 | (val & ~0x00000001);
1070
}
1071

    
1072
static uint32_t pci_unin_config_readl (void *opaque,
1073
                                       target_phys_addr_t addr)
1074
{
1075
    PCIBus *s = opaque;
1076
    uint32_t val;
1077

    
1078
    val = (s->config_reg | 0x00000001) & ~0x80000000;
1079
#ifdef TARGET_WORDS_BIGENDIAN
1080
    val = bswap32(val);
1081
#endif
1082

    
1083
    return val;
1084
}
1085

    
1086
static CPUWriteMemoryFunc *pci_unin_config_write[] = {
1087
    &pci_unin_config_writel,
1088
    &pci_unin_config_writel,
1089
    &pci_unin_config_writel,
1090
};
1091

    
1092
static CPUReadMemoryFunc *pci_unin_config_read[] = {
1093
    &pci_unin_config_readl,
1094
    &pci_unin_config_readl,
1095
    &pci_unin_config_readl,
1096
};
1097

    
1098
static void pci_unin_writeb (void *opaque, target_phys_addr_t addr,
1099
                             uint32_t val)
1100
{
1101
    PCIBus *s = opaque;
1102
    pci_data_write(s, addr & 3, val, 1);
1103
}
1104

    
1105
static void pci_unin_writew (void *opaque, target_phys_addr_t addr,
1106
                             uint32_t val)
1107
{
1108
    PCIBus *s = opaque;
1109
#ifdef TARGET_WORDS_BIGENDIAN
1110
    val = bswap16(val);
1111
#endif
1112
    pci_data_write(s, addr & 3, val, 2);
1113
}
1114

    
1115
static void pci_unin_writel (void *opaque, target_phys_addr_t addr,
1116
                             uint32_t val)
1117
{
1118
    PCIBus *s = opaque;
1119
#ifdef TARGET_WORDS_BIGENDIAN
1120
    val = bswap32(val);
1121
#endif
1122
    pci_data_write(s, addr & 3, val, 4);
1123
}
1124

    
1125
static uint32_t pci_unin_readb (void *opaque, target_phys_addr_t addr)
1126
{
1127
    PCIBus *s = opaque;
1128
    uint32_t val;
1129

    
1130
    val = pci_data_read(s, addr & 3, 1);
1131

    
1132
    return val;
1133
}
1134

    
1135
static uint32_t pci_unin_readw (void *opaque, target_phys_addr_t addr)
1136
{
1137
    PCIBus *s = opaque;
1138
    uint32_t val;
1139

    
1140
    val = pci_data_read(s, addr & 3, 2);
1141
#ifdef TARGET_WORDS_BIGENDIAN
1142
    val = bswap16(val);
1143
#endif
1144

    
1145
    return val;
1146
}
1147

    
1148
static uint32_t pci_unin_readl (void *opaque, target_phys_addr_t addr)
1149
{
1150
    PCIBus *s = opaque;
1151
    uint32_t val;
1152

    
1153
    val = pci_data_read(s, addr & 3, 4);
1154
#ifdef TARGET_WORDS_BIGENDIAN
1155
    val = bswap32(val);
1156
#endif
1157

    
1158
    return val;
1159
}
1160

    
1161
static CPUWriteMemoryFunc *pci_unin_write[] = {
1162
    &pci_unin_writeb,
1163
    &pci_unin_writew,
1164
    &pci_unin_writel,
1165
};
1166

    
1167
static CPUReadMemoryFunc *pci_unin_read[] = {
1168
    &pci_unin_readb,
1169
    &pci_unin_readw,
1170
    &pci_unin_readl,
1171
};
1172
#endif
1173

    
1174
PCIBus *pci_pmac_init(void)
1175
{
1176
    PCIBus *s;
1177
    PCIDevice *d;
1178
    int pci_mem_config, pci_mem_data;
1179

    
1180
    /* Use values found on a real PowerMac */
1181
    /* Uninorth main bus */
1182
    s = pci_register_bus();
1183
    s->set_irq = pci_set_irq_simple;
1184

    
1185
    pci_mem_config = cpu_register_io_memory(0, pci_unin_main_config_read, 
1186
                                            pci_unin_main_config_write, s);
1187
    pci_mem_data = cpu_register_io_memory(0, pci_unin_main_read,
1188
                                          pci_unin_main_write, s);
1189
    cpu_register_physical_memory(0xf2800000, 0x1000, pci_mem_config);
1190
    cpu_register_physical_memory(0xf2c00000, 0x1000, pci_mem_data);
1191
    s->devfn_min = 11 << 3;
1192
    d = pci_register_device(s, "Uni-north main", sizeof(PCIDevice), 
1193
                            11 << 3, NULL, NULL);
1194
    d->config[0x00] = 0x6b; // vendor_id : Apple
1195
    d->config[0x01] = 0x10;
1196
    d->config[0x02] = 0x1F; // device_id
1197
    d->config[0x03] = 0x00;
1198
    d->config[0x08] = 0x00; // revision
1199
    d->config[0x0A] = 0x00; // class_sub = pci host
1200
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1201
    d->config[0x0C] = 0x08; // cache_line_size
1202
    d->config[0x0D] = 0x10; // latency_timer
1203
    d->config[0x0E] = 0x00; // header_type
1204
    d->config[0x34] = 0x00; // capabilities_pointer
1205

    
1206
#if 0 // XXX: not activated as PPC BIOS doesn't handle mutiple buses properly
1207
    /* pci-to-pci bridge */
1208
    d = pci_register_device("Uni-north bridge", sizeof(PCIDevice), 0, 13 << 3,
1209
                            NULL, NULL);
1210
    d->config[0x00] = 0x11; // vendor_id : TI
1211
    d->config[0x01] = 0x10;
1212
    d->config[0x02] = 0x26; // device_id
1213
    d->config[0x03] = 0x00;
1214
    d->config[0x08] = 0x05; // revision
1215
    d->config[0x0A] = 0x04; // class_sub = pci2pci
1216
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1217
    d->config[0x0C] = 0x08; // cache_line_size
1218
    d->config[0x0D] = 0x20; // latency_timer
1219
    d->config[0x0E] = 0x01; // header_type
1220

1221
    d->config[0x18] = 0x01; // primary_bus
1222
    d->config[0x19] = 0x02; // secondary_bus
1223
    d->config[0x1A] = 0x02; // subordinate_bus
1224
    d->config[0x1B] = 0x20; // secondary_latency_timer
1225
    d->config[0x1C] = 0x11; // io_base
1226
    d->config[0x1D] = 0x01; // io_limit
1227
    d->config[0x20] = 0x00; // memory_base
1228
    d->config[0x21] = 0x80;
1229
    d->config[0x22] = 0x00; // memory_limit
1230
    d->config[0x23] = 0x80;
1231
    d->config[0x24] = 0x01; // prefetchable_memory_base
1232
    d->config[0x25] = 0x80;
1233
    d->config[0x26] = 0xF1; // prefectchable_memory_limit
1234
    d->config[0x27] = 0x7F;
1235
    // d->config[0x34] = 0xdc // capabilities_pointer
1236
#endif
1237
#if 0 // XXX: not needed for now
1238
    /* Uninorth AGP bus */
1239
    s = &pci_bridge[1];
1240
    pci_mem_config = cpu_register_io_memory(0, pci_unin_config_read, 
1241
                                            pci_unin_config_write, s);
1242
    pci_mem_data = cpu_register_io_memory(0, pci_unin_read,
1243
                                          pci_unin_write, s);
1244
    cpu_register_physical_memory(0xf0800000, 0x1000, pci_mem_config);
1245
    cpu_register_physical_memory(0xf0c00000, 0x1000, pci_mem_data);
1246

1247
    d = pci_register_device("Uni-north AGP", sizeof(PCIDevice), 0, 11 << 3,
1248
                            NULL, NULL);
1249
    d->config[0x00] = 0x6b; // vendor_id : Apple
1250
    d->config[0x01] = 0x10;
1251
    d->config[0x02] = 0x20; // device_id
1252
    d->config[0x03] = 0x00;
1253
    d->config[0x08] = 0x00; // revision
1254
    d->config[0x0A] = 0x00; // class_sub = pci host
1255
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1256
    d->config[0x0C] = 0x08; // cache_line_size
1257
    d->config[0x0D] = 0x10; // latency_timer
1258
    d->config[0x0E] = 0x00; // header_type
1259
    //    d->config[0x34] = 0x80; // capabilities_pointer
1260
#endif
1261

    
1262
#if 0 // XXX: not needed for now
1263
    /* Uninorth internal bus */
1264
    s = &pci_bridge[2];
1265
    pci_mem_config = cpu_register_io_memory(0, pci_unin_config_read, 
1266
                                            pci_unin_config_write, s);
1267
    pci_mem_data = cpu_register_io_memory(0, pci_unin_read,
1268
                                          pci_unin_write, s);
1269
    cpu_register_physical_memory(0xf4800000, 0x1000, pci_mem_config);
1270
    cpu_register_physical_memory(0xf4c00000, 0x1000, pci_mem_data);
1271

1272
    d = pci_register_device("Uni-north internal", sizeof(PCIDevice),
1273
                            3, 11 << 3, NULL, NULL);
1274
    d->config[0x00] = 0x6b; // vendor_id : Apple
1275
    d->config[0x01] = 0x10;
1276
    d->config[0x02] = 0x1E; // device_id
1277
    d->config[0x03] = 0x00;
1278
    d->config[0x08] = 0x00; // revision
1279
    d->config[0x0A] = 0x00; // class_sub = pci host
1280
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1281
    d->config[0x0C] = 0x08; // cache_line_size
1282
    d->config[0x0D] = 0x10; // latency_timer
1283
    d->config[0x0E] = 0x00; // header_type
1284
    d->config[0x34] = 0x00; // capabilities_pointer
1285
#endif
1286
    return s;
1287
}
1288

    
1289
/* Ultrasparc APB PCI host */
1290
static void pci_apb_config_writel (void *opaque, target_phys_addr_t addr,
1291
                                         uint32_t val)
1292
{
1293
    PCIBus *s = opaque;
1294
    int i;
1295

    
1296
    for (i = 11; i < 32; i++) {
1297
        if ((val & (1 << i)) != 0)
1298
            break;
1299
    }
1300
    s->config_reg = 0x80000000 | (1 << 16) | (val & 0x7FC) | (i << 11);
1301
}
1302

    
1303
static uint32_t pci_apb_config_readl (void *opaque,
1304
                                            target_phys_addr_t addr)
1305
{
1306
    PCIBus *s = opaque;
1307
    uint32_t val;
1308
    int devfn;
1309

    
1310
    devfn = (s->config_reg >> 8) & 0xFF;
1311
    val = (1 << (devfn >> 3)) | ((devfn & 0x07) << 8) | (s->config_reg & 0xFC);
1312
    return val;
1313
}
1314

    
1315
static CPUWriteMemoryFunc *pci_apb_config_write[] = {
1316
    &pci_apb_config_writel,
1317
    &pci_apb_config_writel,
1318
    &pci_apb_config_writel,
1319
};
1320

    
1321
static CPUReadMemoryFunc *pci_apb_config_read[] = {
1322
    &pci_apb_config_readl,
1323
    &pci_apb_config_readl,
1324
    &pci_apb_config_readl,
1325
};
1326

    
1327
static void apb_config_writel (void *opaque, target_phys_addr_t addr,
1328
                               uint32_t val)
1329
{
1330
    //PCIBus *s = opaque;
1331

    
1332
    switch (addr & 0x3f) {
1333
    case 0x00: // Control/Status
1334
    case 0x10: // AFSR
1335
    case 0x18: // AFAR
1336
    case 0x20: // Diagnostic
1337
    case 0x28: // Target address space
1338
        // XXX
1339
    default:
1340
        break;
1341
    }
1342
}
1343

    
1344
static uint32_t apb_config_readl (void *opaque,
1345
                                  target_phys_addr_t addr)
1346
{
1347
    //PCIBus *s = opaque;
1348
    uint32_t val;
1349

    
1350
    switch (addr & 0x3f) {
1351
    case 0x00: // Control/Status
1352
    case 0x10: // AFSR
1353
    case 0x18: // AFAR
1354
    case 0x20: // Diagnostic
1355
    case 0x28: // Target address space
1356
        // XXX
1357
    default:
1358
        val = 0;
1359
        break;
1360
    }
1361
    return val;
1362
}
1363

    
1364
static CPUWriteMemoryFunc *apb_config_write[] = {
1365
    &apb_config_writel,
1366
    &apb_config_writel,
1367
    &apb_config_writel,
1368
};
1369

    
1370
static CPUReadMemoryFunc *apb_config_read[] = {
1371
    &apb_config_readl,
1372
    &apb_config_readl,
1373
    &apb_config_readl,
1374
};
1375

    
1376
static void pci_apb_writeb (void *opaque, target_phys_addr_t addr,
1377
                                  uint32_t val)
1378
{
1379
    PCIBus *s = opaque;
1380

    
1381
    pci_data_write(s, addr & 7, val, 1);
1382
}
1383

    
1384
static void pci_apb_writew (void *opaque, target_phys_addr_t addr,
1385
                                  uint32_t val)
1386
{
1387
    PCIBus *s = opaque;
1388

    
1389
    pci_data_write(s, addr & 7, val, 2);
1390
}
1391

    
1392
static void pci_apb_writel (void *opaque, target_phys_addr_t addr,
1393
                                uint32_t val)
1394
{
1395
    PCIBus *s = opaque;
1396

    
1397
    pci_data_write(s, addr & 7, val, 4);
1398
}
1399

    
1400
static uint32_t pci_apb_readb (void *opaque, target_phys_addr_t addr)
1401
{
1402
    PCIBus *s = opaque;
1403
    uint32_t val;
1404

    
1405
    val = pci_data_read(s, addr & 7, 1);
1406
    return val;
1407
}
1408

    
1409
static uint32_t pci_apb_readw (void *opaque, target_phys_addr_t addr)
1410
{
1411
    PCIBus *s = opaque;
1412
    uint32_t val;
1413

    
1414
    val = pci_data_read(s, addr & 7, 2);
1415
    return val;
1416
}
1417

    
1418
static uint32_t pci_apb_readl (void *opaque, target_phys_addr_t addr)
1419
{
1420
    PCIBus *s = opaque;
1421
    uint32_t val;
1422

    
1423
    val = pci_data_read(s, addr, 4);
1424
    return val;
1425
}
1426

    
1427
static CPUWriteMemoryFunc *pci_apb_write[] = {
1428
    &pci_apb_writeb,
1429
    &pci_apb_writew,
1430
    &pci_apb_writel,
1431
};
1432

    
1433
static CPUReadMemoryFunc *pci_apb_read[] = {
1434
    &pci_apb_readb,
1435
    &pci_apb_readw,
1436
    &pci_apb_readl,
1437
};
1438

    
1439
static void pci_apb_iowriteb (void *opaque, target_phys_addr_t addr,
1440
                                  uint32_t val)
1441
{
1442
    cpu_outb(NULL, addr & 0xffff, val);
1443
}
1444

    
1445
static void pci_apb_iowritew (void *opaque, target_phys_addr_t addr,
1446
                                  uint32_t val)
1447
{
1448
    cpu_outw(NULL, addr & 0xffff, val);
1449
}
1450

    
1451
static void pci_apb_iowritel (void *opaque, target_phys_addr_t addr,
1452
                                uint32_t val)
1453
{
1454
    cpu_outl(NULL, addr & 0xffff, val);
1455
}
1456

    
1457
static uint32_t pci_apb_ioreadb (void *opaque, target_phys_addr_t addr)
1458
{
1459
    uint32_t val;
1460

    
1461
    val = cpu_inb(NULL, addr & 0xffff);
1462
    return val;
1463
}
1464

    
1465
static uint32_t pci_apb_ioreadw (void *opaque, target_phys_addr_t addr)
1466
{
1467
    uint32_t val;
1468

    
1469
    val = cpu_inw(NULL, addr & 0xffff);
1470
    return val;
1471
}
1472

    
1473
static uint32_t pci_apb_ioreadl (void *opaque, target_phys_addr_t addr)
1474
{
1475
    uint32_t val;
1476

    
1477
    val = cpu_inl(NULL, addr & 0xffff);
1478
    return val;
1479
}
1480

    
1481
static CPUWriteMemoryFunc *pci_apb_iowrite[] = {
1482
    &pci_apb_iowriteb,
1483
    &pci_apb_iowritew,
1484
    &pci_apb_iowritel,
1485
};
1486

    
1487
static CPUReadMemoryFunc *pci_apb_ioread[] = {
1488
    &pci_apb_ioreadb,
1489
    &pci_apb_ioreadw,
1490
    &pci_apb_ioreadl,
1491
};
1492

    
1493
PCIBus *pci_apb_init(target_ulong special_base, target_ulong mem_base)
1494
{
1495
    PCIBus *s;
1496
    PCIDevice *d;
1497
    int pci_mem_config, pci_mem_data, apb_config, pci_ioport;
1498

    
1499
    /* Ultrasparc APB main bus */
1500
    s = pci_register_bus();
1501
    s->set_irq = pci_set_irq_simple;
1502

    
1503
    pci_mem_config = cpu_register_io_memory(0, pci_apb_config_read,
1504
                                            pci_apb_config_write, s);
1505
    apb_config = cpu_register_io_memory(0, apb_config_read,
1506
                                        apb_config_write, s);
1507
    pci_mem_data = cpu_register_io_memory(0, pci_apb_read,
1508
                                          pci_apb_write, s);
1509
    pci_ioport = cpu_register_io_memory(0, pci_apb_ioread,
1510
                                          pci_apb_iowrite, s);
1511

    
1512
    cpu_register_physical_memory(special_base + 0x2000ULL, 0x40, apb_config);
1513
    cpu_register_physical_memory(special_base + 0x1000000ULL, 0x10, pci_mem_config);
1514
    cpu_register_physical_memory(special_base + 0x2000000ULL, 0x10000, pci_ioport);
1515
    cpu_register_physical_memory(mem_base, 0x10000000, pci_mem_data); // XXX size should be 4G-prom
1516

    
1517
    d = pci_register_device(s, "Advanced PCI Bus", sizeof(PCIDevice), 
1518
                            -1, NULL, NULL);
1519
    d->config[0x00] = 0x8e; // vendor_id : Sun
1520
    d->config[0x01] = 0x10;
1521
    d->config[0x02] = 0x00; // device_id
1522
    d->config[0x03] = 0xa0;
1523
    d->config[0x04] = 0x06; // command = bus master, pci mem
1524
    d->config[0x05] = 0x00;
1525
    d->config[0x06] = 0xa0; // status = fast back-to-back, 66MHz, no error
1526
    d->config[0x07] = 0x03; // status = medium devsel
1527
    d->config[0x08] = 0x00; // revision
1528
    d->config[0x09] = 0x00; // programming i/f
1529
    d->config[0x0A] = 0x00; // class_sub = pci host
1530
    d->config[0x0B] = 0x06; // class_base = PCI_bridge
1531
    d->config[0x0D] = 0x10; // latency_timer
1532
    d->config[0x0E] = 0x00; // header_type
1533
    return s;
1534
}
1535

    
1536
/***********************************************************/
1537
/* generic PCI irq support */
1538

    
1539
/* 0 <= irq_num <= 3. level must be 0 or 1 */
1540
void pci_set_irq(PCIDevice *pci_dev, int irq_num, int level)
1541
{
1542
    PCIBus *bus = pci_dev->bus;
1543
    bus->set_irq(pci_dev, irq_num, level);
1544
}
1545

    
1546
/***********************************************************/
1547
/* monitor info on PCI */
1548

    
1549
static void pci_info_device(PCIDevice *d)
1550
{
1551
    int i, class;
1552
    PCIIORegion *r;
1553

    
1554
    term_printf("  Bus %2d, device %3d, function %d:\n",
1555
           d->bus->bus_num, d->devfn >> 3, d->devfn & 7);
1556
    class = le16_to_cpu(*((uint16_t *)(d->config + PCI_CLASS_DEVICE)));
1557
    term_printf("    ");
1558
    switch(class) {
1559
    case 0x0101:
1560
        term_printf("IDE controller");
1561
        break;
1562
    case 0x0200:
1563
        term_printf("Ethernet controller");
1564
        break;
1565
    case 0x0300:
1566
        term_printf("VGA controller");
1567
        break;
1568
    default:
1569
        term_printf("Class %04x", class);
1570
        break;
1571
    }
1572
    term_printf(": PCI device %04x:%04x\n",
1573
           le16_to_cpu(*((uint16_t *)(d->config + PCI_VENDOR_ID))),
1574
           le16_to_cpu(*((uint16_t *)(d->config + PCI_DEVICE_ID))));
1575

    
1576
    if (d->config[PCI_INTERRUPT_PIN] != 0) {
1577
        term_printf("      IRQ %d.\n", d->config[PCI_INTERRUPT_LINE]);
1578
    }
1579
    for(i = 0;i < PCI_NUM_REGIONS; i++) {
1580
        r = &d->io_regions[i];
1581
        if (r->size != 0) {
1582
            term_printf("      BAR%d: ", i);
1583
            if (r->type & PCI_ADDRESS_SPACE_IO) {
1584
                term_printf("I/O at 0x%04x [0x%04x].\n", 
1585
                       r->addr, r->addr + r->size - 1);
1586
            } else {
1587
                term_printf("32 bit memory at 0x%08x [0x%08x].\n", 
1588
                       r->addr, r->addr + r->size - 1);
1589
            }
1590
        }
1591
    }
1592
}
1593

    
1594
void pci_info(void)
1595
{
1596
    PCIBus *bus = first_bus;
1597
    PCIDevice *d;
1598
    int devfn;
1599
    
1600
    if (bus) {
1601
        for(devfn = 0; devfn < 256; devfn++) {
1602
            d = bus->devices[devfn];
1603
            if (d)
1604
                pci_info_device(d);
1605
        }
1606
    }
1607
}
1608

    
1609
/***********************************************************/
1610
/* XXX: the following should be moved to the PC BIOS */
1611

    
1612
static __attribute__((unused)) uint32_t isa_inb(uint32_t addr)
1613
{
1614
    return cpu_inb(NULL, addr);
1615
}
1616

    
1617
static void isa_outb(uint32_t val, uint32_t addr)
1618
{
1619
    cpu_outb(NULL, addr, val);
1620
}
1621

    
1622
static __attribute__((unused)) uint32_t isa_inw(uint32_t addr)
1623
{
1624
    return cpu_inw(NULL, addr);
1625
}
1626

    
1627
static __attribute__((unused)) void isa_outw(uint32_t val, uint32_t addr)
1628
{
1629
    cpu_outw(NULL, addr, val);
1630
}
1631

    
1632
static __attribute__((unused)) uint32_t isa_inl(uint32_t addr)
1633
{
1634
    return cpu_inl(NULL, addr);
1635
}
1636

    
1637
static __attribute__((unused)) void isa_outl(uint32_t val, uint32_t addr)
1638
{
1639
    cpu_outl(NULL, addr, val);
1640
}
1641

    
1642
static void pci_config_writel(PCIDevice *d, uint32_t addr, uint32_t val)
1643
{
1644
    PCIBus *s = d->bus;
1645
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1646
        (d->devfn << 8) | addr;
1647
    pci_data_write(s, 0, val, 4);
1648
}
1649

    
1650
static void pci_config_writew(PCIDevice *d, uint32_t addr, uint32_t val)
1651
{
1652
    PCIBus *s = d->bus;
1653
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1654
        (d->devfn << 8) | (addr & ~3);
1655
    pci_data_write(s, addr & 3, val, 2);
1656
}
1657

    
1658
static void pci_config_writeb(PCIDevice *d, uint32_t addr, uint32_t val)
1659
{
1660
    PCIBus *s = d->bus;
1661
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1662
        (d->devfn << 8) | (addr & ~3);
1663
    pci_data_write(s, addr & 3, val, 1);
1664
}
1665

    
1666
static __attribute__((unused)) uint32_t pci_config_readl(PCIDevice *d, uint32_t addr)
1667
{
1668
    PCIBus *s = d->bus;
1669
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1670
        (d->devfn << 8) | addr;
1671
    return pci_data_read(s, 0, 4);
1672
}
1673

    
1674
static uint32_t pci_config_readw(PCIDevice *d, uint32_t addr)
1675
{
1676
    PCIBus *s = d->bus;
1677
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1678
        (d->devfn << 8) | (addr & ~3);
1679
    return pci_data_read(s, addr & 3, 2);
1680
}
1681

    
1682
static uint32_t pci_config_readb(PCIDevice *d, uint32_t addr)
1683
{
1684
    PCIBus *s = d->bus;
1685
    s->config_reg = 0x80000000 | (s->bus_num << 16) | 
1686
        (d->devfn << 8) | (addr & ~3);
1687
    return pci_data_read(s, addr & 3, 1);
1688
}
1689

    
1690
static uint32_t pci_bios_io_addr;
1691
static uint32_t pci_bios_mem_addr;
1692
/* host irqs corresponding to PCI irqs A-D */
1693
static uint8_t pci_irqs[4] = { 11, 9, 11, 9 };
1694

    
1695
static void pci_set_io_region_addr(PCIDevice *d, int region_num, uint32_t addr)
1696
{
1697
    PCIIORegion *r;
1698
    uint16_t cmd;
1699
    uint32_t ofs;
1700

    
1701
    if ( region_num == PCI_ROM_SLOT ) {
1702
        ofs = 0x30;
1703
    }else{
1704
        ofs = 0x10 + region_num * 4;
1705
    }
1706

    
1707
    pci_config_writel(d, ofs, addr);
1708
    r = &d->io_regions[region_num];
1709

    
1710
    /* enable memory mappings */
1711
    cmd = pci_config_readw(d, PCI_COMMAND);
1712
    if ( region_num == PCI_ROM_SLOT )
1713
        cmd |= 2;
1714
    else if (r->type & PCI_ADDRESS_SPACE_IO)
1715
        cmd |= 1;
1716
    else
1717
        cmd |= 2;
1718
    pci_config_writew(d, PCI_COMMAND, cmd);
1719
}
1720

    
1721
static void pci_bios_init_device(PCIDevice *d)
1722
{
1723
    int class;
1724
    PCIIORegion *r;
1725
    uint32_t *paddr;
1726
    int i, pin, pic_irq, vendor_id, device_id;
1727

    
1728
    class = pci_config_readw(d, PCI_CLASS_DEVICE);
1729
    vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
1730
    device_id = pci_config_readw(d, PCI_DEVICE_ID);
1731
    switch(class) {
1732
    case 0x0101:
1733
        if (vendor_id == 0x8086 && device_id == 0x7010) {
1734
            /* PIIX3 IDE */
1735
            pci_config_writew(d, 0x40, 0x8000); // enable IDE0
1736
            pci_config_writew(d, 0x42, 0x8000); // enable IDE1
1737
            goto default_map;
1738
        } else {
1739
            /* IDE: we map it as in ISA mode */
1740
            pci_set_io_region_addr(d, 0, 0x1f0);
1741
            pci_set_io_region_addr(d, 1, 0x3f4);
1742
            pci_set_io_region_addr(d, 2, 0x170);
1743
            pci_set_io_region_addr(d, 3, 0x374);
1744
        }
1745
        break;
1746
    case 0x0300:
1747
        if (vendor_id != 0x1234)
1748
            goto default_map;
1749
        /* VGA: map frame buffer to default Bochs VBE address */
1750
        pci_set_io_region_addr(d, 0, 0xE0000000);
1751
        break;
1752
    case 0x0800:
1753
        /* PIC */
1754
        vendor_id = pci_config_readw(d, PCI_VENDOR_ID);
1755
        device_id = pci_config_readw(d, PCI_DEVICE_ID);
1756
        if (vendor_id == 0x1014) {
1757
            /* IBM */
1758
            if (device_id == 0x0046 || device_id == 0xFFFF) {
1759
                /* MPIC & MPIC2 */
1760
                pci_set_io_region_addr(d, 0, 0x80800000 + 0x00040000);
1761
            }
1762
        }
1763
        break;
1764
    case 0xff00:
1765
        if (vendor_id == 0x0106b &&
1766
            (device_id == 0x0017 || device_id == 0x0022)) {
1767
            /* macio bridge */
1768
            pci_set_io_region_addr(d, 0, 0x80800000);
1769
        }
1770
        break;
1771
    default:
1772
    default_map:
1773
        /* default memory mappings */
1774
        for(i = 0; i < PCI_NUM_REGIONS; i++) {
1775
            r = &d->io_regions[i];
1776
            if (r->size) {
1777
                if (r->type & PCI_ADDRESS_SPACE_IO)
1778
                    paddr = &pci_bios_io_addr;
1779
                else
1780
                    paddr = &pci_bios_mem_addr;
1781
                *paddr = (*paddr + r->size - 1) & ~(r->size - 1);
1782
                pci_set_io_region_addr(d, i, *paddr);
1783
                *paddr += r->size;
1784
            }
1785
        }
1786
        break;
1787
    }
1788

    
1789
    /* map the interrupt */
1790
    pin = pci_config_readb(d, PCI_INTERRUPT_PIN);
1791
    if (pin != 0) {
1792
        pin = pci_slot_get_pirq(d, pin - 1);
1793
        pic_irq = pci_irqs[pin];
1794
        pci_config_writeb(d, PCI_INTERRUPT_LINE, pic_irq);
1795
    }
1796
}
1797

    
1798
/*
1799
 * This function initializes the PCI devices as a normal PCI BIOS
1800
 * would do. It is provided just in case the BIOS has no support for
1801
 * PCI.
1802
 */
1803
void pci_bios_init(void)
1804
{
1805
    PCIBus *bus;
1806
    PCIDevice *d;
1807
    int devfn, i, irq;
1808
    uint8_t elcr[2];
1809

    
1810
    pci_bios_io_addr = 0xc000;
1811
    pci_bios_mem_addr = 0xf0000000;
1812

    
1813
    /* activate IRQ mappings */
1814
    elcr[0] = 0x00;
1815
    elcr[1] = 0x00;
1816
    for(i = 0; i < 4; i++) {
1817
        irq = pci_irqs[i];
1818
        /* set to trigger level */
1819
        elcr[irq >> 3] |= (1 << (irq & 7));
1820
        /* activate irq remapping in PIIX */
1821
        pci_config_writeb((PCIDevice *)piix3_state, 0x60 + i, irq);
1822
    }
1823
    isa_outb(elcr[0], 0x4d0);
1824
    isa_outb(elcr[1], 0x4d1);
1825

    
1826
    bus = first_bus;
1827
    if (bus) {
1828
        for(devfn = 0; devfn < 256; devfn++) {
1829
            d = bus->devices[devfn];
1830
            if (d)
1831
                pci_bios_init_device(d);
1832
        }
1833
    }
1834
}
1835

    
1836
/* Initialize a PCI NIC.  */
1837
void pci_nic_init(PCIBus *bus, NICInfo *nd)
1838
{
1839
    if (strcmp(nd->model, "ne2k_pci") == 0) {
1840
        pci_ne2000_init(bus, nd);
1841
    } else if (strcmp(nd->model, "rtl8139") == 0) {
1842
        pci_rtl8139_init(bus, nd);
1843
    } else {
1844
        fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd->model);
1845
        exit (1);
1846
    }
1847
}
1848