]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/PCIEdit.js
1 Ext
.define('PVE.qemu.PCIInputPanel', {
2 extend
: 'Proxmox.panel.InputPanel',
4 onlineHelp
: 'qm_pci_passthrough_vm_config',
6 setVMConfig: function(vmconfig
) {
8 me
.vmconfig
= vmconfig
;
10 var hostpci
= me
.vmconfig
[me
.confid
] || '';
12 var values
= PVE
.Parser
.parsePropertyString(hostpci
, 'host');
14 if (!values
.host
.match(/^[0-9a-f]{4}:/i)) { // add optional domain
15 values
.host
= "0000:" + values
.host
;
17 if (values
.host
.length
< 11) { // 0000:00:00 format not 0000:00:00.0
19 values
.multifunction
= true;
23 values
['x-vga'] = PVE
.Parser
.parseBoolean(values
['x-vga'], 0);
24 values
.pcie
= PVE
.Parser
.parseBoolean(values
.pcie
, 0);
25 values
.rombar
= PVE
.Parser
.parseBoolean(values
.rombar
, 1);
28 if (!me
.vmconfig
.machine
|| me
.vmconfig
.machine
.indexOf('q35') === -1) {
29 // machine is not set to some variant of q35, so we disable pcie
30 var pcie
= me
.down('field[name=pcie]');
31 pcie
.setDisabled(true);
32 pcie
.setBoxLabel(gettext('Q35 only'));
36 me
.down('field[name=romfile]').setVisible(true);
40 onGetValues: function(values
) {
43 for (let i
= 0; i
< PVE
.Utils
.hardware_counts
.hostpci
; i
++) {
44 if (!me
.vmconfig
['hostpci' + i
.toString()]) {
45 me
.confid
= 'hostpci' + i
.toString();
49 // FIXME: what if no confid was found??
51 values
.host
.replace(/^0000:/, ''); // remove optional '0000' domain
53 if (values
.multifunction
) {
54 values
.host
= values
.host
.substring(0, values
.host
.indexOf('.')); // skip the '.X'
55 delete values
.multifunction
;
64 if (!values
.romfile
) {
65 delete values
.romfile
;
69 ret
[me
.confid
] = PVE
.Parser
.printPropertyString(values
, 'host');
73 initComponent: function() {
76 me
.nodename
= me
.pveSelNode
.data
.node
;
78 throw "no node name specified";
83 xtype
: 'pvePCISelector',
84 fieldLabel
: gettext('Device'),
86 nodename
: me
.nodename
,
88 onLoadCallBack: function(store
, records
, success
) {
89 if (!success
|| !records
.length
) {
92 if (records
.every((val
) => val
.data
.iommugroup
=== -1)) { // no IOMMU groups
93 let warning
= Ext
.create('Ext.form.field.Display', {
96 value
: 'No IOMMU detected, please activate it.' +
97 'See Documentation for further information.',
100 me
.items
.insert(0, warning
);
101 me
.updateLayout(); // insert does not trigger that
105 change: function(pcisel
, value
) {
109 let pciDev
= pcisel
.getStore().getById(value
);
110 let mdevfield
= me
.down('field[name=mdev]');
111 mdevfield
.setDisabled(!pciDev
|| !pciDev
.data
.mdev
);
115 if (pciDev
.data
.mdev
) {
116 mdevfield
.setPciID(value
);
118 let iommu
= pciDev
.data
.iommugroup
;
122 // try to find out if there are more devices in that iommu group
123 let id
= pciDev
.data
.id
.substring(0, 5); // 00:00
125 pcisel
.getStore().each(({ data
}) => {
126 if (data
.iommugroup
=== iommu
&& data
.id
.substring(0, 5) !== id
) {
132 let warning
= me
.down('#iommuwarning');
133 if (count
&& !warning
) {
134 warning
= Ext
.create('Ext.form.field.Display', {
137 itemId
: 'iommuwarning',
138 value
: 'The selected Device is not in a seperate IOMMU group, make sure this is intended.',
141 me
.items
.insert(0, warning
);
142 me
.updateLayout(); // insert does not trigger that
143 } else if (!count
&& warning
) {
150 xtype
: 'proxmoxcheckbox',
151 fieldLabel
: gettext('All Functions'),
152 name
: 'multifunction',
158 xtype
: 'pveMDevSelector',
161 fieldLabel
: gettext('MDev Type'),
162 nodename
: me
.nodename
,
164 change: function(field
, value
) {
165 let multiFunction
= me
.down('field[name=multifunction]');
167 multiFunction
.setValue(false);
169 multiFunction
.setDisabled(!!value
);
174 xtype
: 'proxmoxcheckbox',
175 fieldLabel
: gettext('Primary GPU'),
180 me
.advancedColumn1
= [
182 xtype
: 'proxmoxcheckbox',
183 fieldLabel
: 'ROM-Bar',
187 xtype
: 'displayfield',
190 fieldLabel
: 'ROM-File',
196 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Vendor')),
197 emptyText
: gettext('From Device'),
205 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Device')),
206 emptyText
: gettext('From Device'),
213 me
.advancedColumn2
= [
215 xtype
: 'proxmoxcheckbox',
216 fieldLabel
: 'PCI-Express',
221 name
: 'sub-vendor-id',
222 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Sub-Vendor')),
223 emptyText
: gettext('From Device'),
230 name
: 'sub-device-id',
231 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Sub-Device')),
232 emptyText
: gettext('From Device'),
243 Ext
.define('PVE.qemu.PCIEdit', {
244 extend
: 'Proxmox.window.Edit',
246 subject
: gettext('PCI Device'),
251 initComponent: function() {
254 me
.isCreate
= !me
.confid
;
256 let ipanel
= Ext
.create('PVE.qemu.PCIInputPanel', {
258 pveSelNode
: me
.pveSelNode
,
268 success
: ({ result
}) => ipanel
.setVMConfig(result
.data
),