]>
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',
7 xclass
: 'Ext.app.ViewController',
9 setVMConfig: function(vmconfig
) {
11 let view
= me
.getView();
12 me
.vmconfig
= vmconfig
;
14 let hostpci
= me
.vmconfig
[view
.confid
] || '';
16 let values
= PVE
.Parser
.parsePropertyString(hostpci
, 'host');
18 if (!values
.host
.match(/^[0-9a-f]{4}:/i)) { // add optional domain
19 values
.host
= "0000:" + values
.host
;
21 if (values
.host
.length
< 11) { // 0000:00:00 format not 0000:00:00.0
23 values
.multifunction
= true;
26 } else if (values
.mapping
) {
27 values
.type
= 'mapped';
30 values
['x-vga'] = PVE
.Parser
.parseBoolean(values
['x-vga'], 0);
31 values
.pcie
= PVE
.Parser
.parseBoolean(values
.pcie
, 0);
32 values
.rombar
= PVE
.Parser
.parseBoolean(values
.rombar
, 1);
34 view
.setValues(values
);
35 if (!me
.vmconfig
.machine
|| me
.vmconfig
.machine
.indexOf('q35') === -1) {
36 // machine is not set to some variant of q35, so we disable pcie
37 let pcie
= me
.lookup('pcie');
38 pcie
.setDisabled(true);
39 pcie
.setBoxLabel(gettext('Q35 only'));
43 me
.lookup('romfile').setVisible(true);
47 selectorEnable: function(selector
) {
49 me
.pciDevChange(selector
, selector
.getValue());
52 pciDevChange: function(pcisel
, value
) {
54 let mdevfield
= me
.lookup('mdev');
56 if (!pcisel
.isDisabled()) {
57 mdevfield
.setDisabled(true);
61 let pciDev
= pcisel
.getStore().getById(value
);
63 mdevfield
.setDisabled(!pciDev
|| !pciDev
.data
.mdev
);
69 if (pciDev
.data
.map
) {
71 for (const entry
of pciDev
.data
.map
) {
72 let mapping
= PVE
.Parser
.parsePropertyString(entry
);
73 if (mapping
.node
=== pcisel
.up('inputpanel').nodename
) {
74 path
= mapping
.path
.split(';')[0];
78 if (path
.indexOf('.') === -1) {
83 if (pciDev
.data
.mdev
) {
84 mdevfield
.setPciID(path
);
86 if (pcisel
.reference
=== 'selector') {
87 let iommu
= pciDev
.data
.iommugroup
;
91 // try to find out if there are more devices in that iommu group
92 let id
= path
.substring(0, 5); // 00:00
94 pcisel
.getStore().each(({ data
}) => {
95 if (data
.iommugroup
=== iommu
&& data
.id
.substring(0, 5) !== id
) {
101 me
.lookup('group_warning').setVisible(count
> 0);
105 onGetValues: function(values
) {
107 let view
= me
.getView();
109 for (let i
= 0; i
< PVE
.Utils
.hardware_counts
.hostpci
; i
++) {
110 if (!me
.vmconfig
['hostpci' + i
.toString()]) {
111 view
.confid
= 'hostpci' + i
.toString();
115 // FIXME: what if no confid was found??
118 values
.host
?.replace(/^0000:/, ''); // remove optional '0000' domain
120 if (values
.multifunction
&& values
.host
) {
121 values
.host
= values
.host
.substring(0, values
.host
.indexOf('.')); // skip the '.X'
122 delete values
.multifunction
;
126 delete values
.rombar
;
131 if (!values
.romfile
) {
132 delete values
.romfile
;
138 ret
[view
.confid
] = PVE
.Parser
.printPropertyString(values
, 'host');
149 setVMConfig: function(vmconfig
) {
150 return this.getController().setVMConfig(vmconfig
);
153 onGetValues: function(values
) {
154 return this.getController().onGetValues(values
);
157 initComponent: function() {
160 me
.nodename
= me
.pveSelNode
.data
.node
;
162 throw "no node name specified";
167 xtype
: 'displayfield',
168 reference
: 'iommu_warning',
172 value
: 'No IOMMU detected, please activate it.' +
173 'See Documentation for further information.',
177 xtype
: 'displayfield',
178 reference
: 'group_warning',
182 itemId
: 'iommuwarning',
183 value
: 'The selected Device is not in a seperate IOMMU group, make sure this is intended.',
192 inputValue
: 'mapped',
193 boxLabel
: gettext('Mapped Device'),
199 xtype
: 'pvePCIMapSelector',
200 fieldLabel
: gettext('Device'),
201 reference
: 'mapped_selector',
204 nodename
: me
.nodename
,
207 disabled
: '{!isMapped}',
210 change
: 'pciDevChange',
211 enable
: 'selectorEnable',
219 boxLabel
: gettext('Raw Device'),
222 xtype
: 'pvePCISelector',
223 fieldLabel
: gettext('Device'),
225 reference
: 'selector',
226 nodename
: me
.nodename
,
231 disabled
: '{isMapped}',
233 onLoadCallBack: function(store
, records
, success
) {
234 if (!success
|| !records
.length
) {
237 me
.lookup('iommu_warning').setVisible(
238 records
.every((val
) => val
.data
.iommugroup
=== -1),
242 change
: 'pciDevChange',
243 enable
: 'selectorEnable',
247 xtype
: 'proxmoxcheckbox',
248 fieldLabel
: gettext('All Functions'),
249 reference
: 'all_functions',
252 name
: 'multifunction',
254 disabled
: '{isMapped}',
261 xtype
: 'pveMDevSelector',
265 fieldLabel
: gettext('MDev Type'),
266 nodename
: me
.nodename
,
268 change: function(field
, value
) {
269 let multiFunction
= me
.down('field[name=multifunction]');
271 multiFunction
.setValue(false);
273 multiFunction
.setDisabled(!!value
);
278 xtype
: 'proxmoxcheckbox',
279 fieldLabel
: gettext('Primary GPU'),
284 me
.advancedColumn1
= [
286 xtype
: 'proxmoxcheckbox',
287 fieldLabel
: 'ROM-Bar',
291 xtype
: 'displayfield',
294 fieldLabel
: 'ROM-File',
295 reference
: 'romfile',
301 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Vendor')),
302 emptyText
: gettext('From Device'),
310 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Device')),
311 emptyText
: gettext('From Device'),
318 me
.advancedColumn2
= [
320 xtype
: 'proxmoxcheckbox',
321 fieldLabel
: 'PCI-Express',
327 name
: 'sub-vendor-id',
328 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Sub-Vendor')),
329 emptyText
: gettext('From Device'),
336 name
: 'sub-device-id',
337 fieldLabel
: Ext
.String
.format(gettext('{0} ID'), gettext('Sub-Device')),
338 emptyText
: gettext('From Device'),
349 Ext
.define('PVE.qemu.PCIEdit', {
350 extend
: 'Proxmox.window.Edit',
352 subject
: gettext('PCI Device'),
357 initComponent: function() {
360 me
.isCreate
= !me
.confid
;
362 let ipanel
= Ext
.create('PVE.qemu.PCIInputPanel', {
364 pveSelNode
: me
.pveSelNode
,
374 success
: ({ result
}) => ipanel
.setVMConfig(result
.data
),