1
2
3
4
5
6
7#include <console/console.h>
8#include <device/pci.h>
9#include <string.h>
10#include <stdint.h>
11#include <arch/pirq_routing.h>
12
13#include <cpu/amd/amdk8_sysconf.h>
14
15static void write_pirq_info(struct irq_info *pirq_info, uint8_t bus, uint8_t devfn, uint8_t link0, uint16_t bitmap0,
16 uint8_t link1, uint16_t bitmap1, uint8_t link2, uint16_t bitmap2,uint8_t link3, uint16_t bitmap3,
17 uint8_t slot, uint8_t rfu)
18{
19 pirq_info->bus = bus;
20 pirq_info->devfn = devfn;
21
22 pirq_info->irq[0].link = link0;
23 pirq_info->irq[0].bitmap = bitmap0;
24 pirq_info->irq[1].link = link1;
25 pirq_info->irq[1].bitmap = bitmap1;
26 pirq_info->irq[2].link = link2;
27 pirq_info->irq[2].bitmap = bitmap2;
28 pirq_info->irq[3].link = link3;
29 pirq_info->irq[3].bitmap = bitmap3;
30
31 pirq_info->slot = slot;
32 pirq_info->rfu = rfu;
33}
34
35extern unsigned char bus_bcm5780[7];
36extern unsigned char bus_bcm5785_0;
37extern unsigned char bus_bcm5785_1;
38extern unsigned apicid_bcm5785[3];
39
40extern unsigned sbdn2;
41
42
43
44unsigned long write_pirq_routing_table(unsigned long addr)
45{
46
47 struct irq_routing_table *pirq;
48 struct irq_info *pirq_info;
49 unsigned slot_num;
50 uint8_t *v;
51
52 uint8_t sum=0;
53 int i;
54
55 get_bus_conf();
56
57
58 addr += 15;
59 addr &= ~15;
60
61
62 printk(BIOS_INFO, "Writing IRQ routing tables to 0x%lx...", addr);
63
64 pirq = (void *)(addr);
65 v = (uint8_t *)(addr);
66
67 pirq->signature = PIRQ_SIGNATURE;
68 pirq->version = PIRQ_VERSION;
69
70 pirq->rtr_bus = bus_bcm5785_0;
71 pirq->rtr_devfn = (sysconf.sbdn<<3)|0;
72
73 pirq->exclusive_irqs = 0;
74
75 pirq->rtr_vendor = 0x1166;
76 pirq->rtr_device = 0x0036;
77
78 pirq->miniport_data = 0;
79
80 memset(pirq->rfu, 0, sizeof(pirq->rfu));
81
82 get_bus_conf();
83
84 pirq_info = (void *) ( &pirq->checksum + 1);
85 slot_num = 0;
86
87 write_pirq_info(pirq_info, bus_bcm5785_0, (sysconf.sbdn<<3)|0, 0x1, 0xdef8, 0x2, 0xdef8, 0x3, 0xdef8, 0x4, 0xdef8, 0, 0);
88 pirq_info++; slot_num++;
89
90 pirq->size = 32 + 16 * slot_num;
91
92 for (i = 0; i < pirq->size; i++)
93 sum += v[i];
94
95 sum = pirq->checksum - sum;
96
97 if (sum != pirq->checksum) {
98 pirq->checksum = sum;
99 }
100
101 printk(BIOS_INFO, "done.\n");
102
103 return (unsigned long) pirq_info;
104
105}
106