]>
Commit | Line | Data |
---|---|---|
de9768f0 DC |
1 | package PVE::QemuServer::PCI; |
2 | ||
3 | use base 'Exporter'; | |
4 | ||
5 | our @EXPORT_OK = qw( | |
6 | print_pci_addr | |
7 | print_pcie_addr | |
8 | ); | |
9 | ||
10 | my $devices = { | |
11 | piix3 => { bus => 0, addr => 1 }, | |
d559309f | 12 | ehci => { bus => 0, addr => 1 }, # instead of piix3 on arm |
55655ebc | 13 | vga => { bus => 0, addr => 2 }, |
de9768f0 DC |
14 | balloon0 => { bus => 0, addr => 3 }, |
15 | watchdog => { bus => 0, addr => 4 }, | |
16 | scsihw0 => { bus => 0, addr => 5 }, | |
17 | 'pci.3' => { bus => 0, addr => 5 }, #can also be used for virtio-scsi-single bridge | |
18 | scsihw1 => { bus => 0, addr => 6 }, | |
19 | ahci0 => { bus => 0, addr => 7 }, | |
20 | qga0 => { bus => 0, addr => 8 }, | |
21 | spice => { bus => 0, addr => 9 }, | |
22 | virtio0 => { bus => 0, addr => 10 }, | |
23 | virtio1 => { bus => 0, addr => 11 }, | |
24 | virtio2 => { bus => 0, addr => 12 }, | |
25 | virtio3 => { bus => 0, addr => 13 }, | |
26 | virtio4 => { bus => 0, addr => 14 }, | |
27 | virtio5 => { bus => 0, addr => 15 }, | |
28 | hostpci0 => { bus => 0, addr => 16 }, | |
29 | hostpci1 => { bus => 0, addr => 17 }, | |
30 | net0 => { bus => 0, addr => 18 }, | |
31 | net1 => { bus => 0, addr => 19 }, | |
32 | net2 => { bus => 0, addr => 20 }, | |
33 | net3 => { bus => 0, addr => 21 }, | |
34 | net4 => { bus => 0, addr => 22 }, | |
35 | net5 => { bus => 0, addr => 23 }, | |
36 | vga1 => { bus => 0, addr => 24 }, | |
37 | vga2 => { bus => 0, addr => 25 }, | |
38 | vga3 => { bus => 0, addr => 26 }, | |
39 | hostpci2 => { bus => 0, addr => 27 }, | |
40 | hostpci3 => { bus => 0, addr => 28 }, | |
41 | #addr29 : usb-host (pve-usb.cfg) | |
42 | 'pci.1' => { bus => 0, addr => 30 }, | |
43 | 'pci.2' => { bus => 0, addr => 31 }, | |
44 | 'net6' => { bus => 1, addr => 1 }, | |
45 | 'net7' => { bus => 1, addr => 2 }, | |
46 | 'net8' => { bus => 1, addr => 3 }, | |
47 | 'net9' => { bus => 1, addr => 4 }, | |
48 | 'net10' => { bus => 1, addr => 5 }, | |
49 | 'net11' => { bus => 1, addr => 6 }, | |
50 | 'net12' => { bus => 1, addr => 7 }, | |
51 | 'net13' => { bus => 1, addr => 8 }, | |
52 | 'net14' => { bus => 1, addr => 9 }, | |
53 | 'net15' => { bus => 1, addr => 10 }, | |
54 | 'net16' => { bus => 1, addr => 11 }, | |
55 | 'net17' => { bus => 1, addr => 12 }, | |
56 | 'net18' => { bus => 1, addr => 13 }, | |
57 | 'net19' => { bus => 1, addr => 14 }, | |
58 | 'net20' => { bus => 1, addr => 15 }, | |
59 | 'net21' => { bus => 1, addr => 16 }, | |
60 | 'net22' => { bus => 1, addr => 17 }, | |
61 | 'net23' => { bus => 1, addr => 18 }, | |
62 | 'net24' => { bus => 1, addr => 19 }, | |
63 | 'net25' => { bus => 1, addr => 20 }, | |
64 | 'net26' => { bus => 1, addr => 21 }, | |
65 | 'net27' => { bus => 1, addr => 22 }, | |
66 | 'net28' => { bus => 1, addr => 23 }, | |
67 | 'net29' => { bus => 1, addr => 24 }, | |
68 | 'net30' => { bus => 1, addr => 25 }, | |
69 | 'net31' => { bus => 1, addr => 26 }, | |
70 | 'xhci' => { bus => 1, addr => 27 }, | |
71 | 'virtio6' => { bus => 2, addr => 1 }, | |
72 | 'virtio7' => { bus => 2, addr => 2 }, | |
73 | 'virtio8' => { bus => 2, addr => 3 }, | |
74 | 'virtio9' => { bus => 2, addr => 4 }, | |
75 | 'virtio10' => { bus => 2, addr => 5 }, | |
76 | 'virtio11' => { bus => 2, addr => 6 }, | |
77 | 'virtio12' => { bus => 2, addr => 7 }, | |
78 | 'virtio13' => { bus => 2, addr => 8 }, | |
79 | 'virtio14' => { bus => 2, addr => 9 }, | |
80 | 'virtio15' => { bus => 2, addr => 10 }, | |
6dbcb073 | 81 | 'ivshmem' => { bus => 2, addr => 11 }, |
de9768f0 DC |
82 | 'virtioscsi0' => { bus => 3, addr => 1 }, |
83 | 'virtioscsi1' => { bus => 3, addr => 2 }, | |
84 | 'virtioscsi2' => { bus => 3, addr => 3 }, | |
85 | 'virtioscsi3' => { bus => 3, addr => 4 }, | |
86 | 'virtioscsi4' => { bus => 3, addr => 5 }, | |
87 | 'virtioscsi5' => { bus => 3, addr => 6 }, | |
88 | 'virtioscsi6' => { bus => 3, addr => 7 }, | |
89 | 'virtioscsi7' => { bus => 3, addr => 8 }, | |
90 | 'virtioscsi8' => { bus => 3, addr => 9 }, | |
91 | 'virtioscsi9' => { bus => 3, addr => 10 }, | |
92 | 'virtioscsi10' => { bus => 3, addr => 11 }, | |
93 | 'virtioscsi11' => { bus => 3, addr => 12 }, | |
94 | 'virtioscsi12' => { bus => 3, addr => 13 }, | |
95 | 'virtioscsi13' => { bus => 3, addr => 14 }, | |
96 | 'virtioscsi14' => { bus => 3, addr => 15 }, | |
97 | 'virtioscsi15' => { bus => 3, addr => 16 }, | |
98 | 'virtioscsi16' => { bus => 3, addr => 17 }, | |
99 | 'virtioscsi17' => { bus => 3, addr => 18 }, | |
100 | 'virtioscsi18' => { bus => 3, addr => 19 }, | |
101 | 'virtioscsi19' => { bus => 3, addr => 20 }, | |
102 | 'virtioscsi20' => { bus => 3, addr => 21 }, | |
103 | 'virtioscsi21' => { bus => 3, addr => 22 }, | |
104 | 'virtioscsi22' => { bus => 3, addr => 23 }, | |
105 | 'virtioscsi23' => { bus => 3, addr => 24 }, | |
106 | 'virtioscsi24' => { bus => 3, addr => 25 }, | |
107 | 'virtioscsi25' => { bus => 3, addr => 26 }, | |
108 | 'virtioscsi26' => { bus => 3, addr => 27 }, | |
109 | 'virtioscsi27' => { bus => 3, addr => 28 }, | |
110 | 'virtioscsi28' => { bus => 3, addr => 29 }, | |
111 | 'virtioscsi29' => { bus => 3, addr => 30 }, | |
112 | 'virtioscsi30' => { bus => 3, addr => 31 }, | |
113 | }; | |
114 | ||
115 | sub print_pci_addr { | |
d559309f | 116 | my ($id, $bridges, $arch, $machine) = @_; |
de9768f0 DC |
117 | |
118 | my $res = ''; | |
119 | ||
d559309f WB |
120 | # We use the same bus slots on all hardware, so we need to check special |
121 | # cases here: | |
122 | my $busname = 'pci'; | |
123 | if ($arch eq 'aarch64' && $machine =~ /^virt/) { | |
124 | die "aarch64/virt cannot use IDE devices\n" | |
125 | if $id =~ /^ide/; | |
126 | $busname = 'pcie'; | |
127 | } | |
128 | ||
de9768f0 DC |
129 | if (defined($devices->{$id}->{bus}) && defined($devices->{$id}->{addr})) { |
130 | my $addr = sprintf("0x%x", $devices->{$id}->{addr}); | |
131 | my $bus = $devices->{$id}->{bus}; | |
d559309f | 132 | $res = ",bus=$busname.$bus,addr=$addr"; |
de9768f0 DC |
133 | $bridges->{$bus} = 1 if $bridges; |
134 | } | |
135 | return $res; | |
136 | ||
137 | } | |
138 | ||
139 | sub print_pcie_addr { | |
140 | my ($id) = @_; | |
141 | ||
142 | my $res = ''; | |
143 | my $devices = { | |
55655ebc | 144 | vga => { bus => 'pcie.0', addr => 1 }, |
de9768f0 DC |
145 | hostpci0 => { bus => "ich9-pcie-port-1", addr => 0 }, |
146 | hostpci1 => { bus => "ich9-pcie-port-2", addr => 0 }, | |
147 | hostpci2 => { bus => "ich9-pcie-port-3", addr => 0 }, | |
148 | hostpci3 => { bus => "ich9-pcie-port-4", addr => 0 }, | |
739ba340 DC |
149 | # win7 is picky about pcie assignments |
150 | hostpci0bus0 => { bus => "pcie.0", addr => 16 }, | |
151 | hostpci1bus0 => { bus => "pcie.0", addr => 17 }, | |
152 | hostpci2bus0 => { bus => "pcie.0", addr => 18 }, | |
153 | hostpci3bus0 => { bus => "pcie.0", addr => 19 }, | |
6dbcb073 | 154 | ivshmem => { bus => 'pcie.0', addr => 20 }, |
de9768f0 DC |
155 | }; |
156 | ||
157 | if (defined($devices->{$id}->{bus}) && defined($devices->{$id}->{addr})) { | |
158 | my $addr = sprintf("0x%x", $devices->{$id}->{addr}); | |
159 | my $bus = $devices->{$id}->{bus}; | |
160 | $res = ",bus=$bus,addr=$addr"; | |
161 | } | |
162 | return $res; | |
163 | ||
164 | } | |
b71351a7 DC |
165 | |
166 | 1; |