forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/i915/gvt/cfg_space.c
....@@ -56,6 +56,10 @@
5656
5757 /**
5858 * vgpu_pci_cfg_mem_write - write virtual cfg space memory
59
+ * @vgpu: target vgpu
60
+ * @off: offset
61
+ * @src: src ptr to write
62
+ * @bytes: number of bytes
5963 *
6064 * Use this function to write virtual cfg space memory.
6165 * For standard cfg space, only RW bits can be changed,
....@@ -66,6 +70,7 @@
6670 {
6771 u8 *cfg_base = vgpu_cfg_space(vgpu);
6872 u8 mask, new, old;
73
+ pci_power_t pwr;
6974 int i = 0;
7075
7176 for (; i < bytes && (off + i < sizeof(pci_cfg_space_rw_bmp)); i++) {
....@@ -87,10 +92,23 @@
8792 /* For other configuration space directly copy as it is. */
8893 if (i < bytes)
8994 memcpy(cfg_base + off + i, src + i, bytes - i);
95
+
96
+ if (off == vgpu->cfg_space.pmcsr_off && vgpu->cfg_space.pmcsr_off) {
97
+ pwr = (pci_power_t __force)(*(u16*)(&vgpu_cfg_space(vgpu)[off])
98
+ & PCI_PM_CTRL_STATE_MASK);
99
+ if (pwr == PCI_D3hot)
100
+ vgpu->d3_entered = true;
101
+ gvt_dbg_core("vgpu-%d power status changed to %d\n",
102
+ vgpu->id, pwr);
103
+ }
90104 }
91105
92106 /**
93107 * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space read
108
+ * @vgpu: target vgpu
109
+ * @offset: offset
110
+ * @p_data: return data ptr
111
+ * @bytes: number of bytes to read
94112 *
95113 * Returns:
96114 * Zero on success, negative error code if failed.
....@@ -98,10 +116,13 @@
98116 int intel_vgpu_emulate_cfg_read(struct intel_vgpu *vgpu, unsigned int offset,
99117 void *p_data, unsigned int bytes)
100118 {
101
- if (WARN_ON(bytes > 4))
119
+ struct drm_i915_private *i915 = vgpu->gvt->gt->i915;
120
+
121
+ if (drm_WARN_ON(&i915->drm, bytes > 4))
102122 return -EINVAL;
103123
104
- if (WARN_ON(offset + bytes > vgpu->gvt->device_info.cfg_space_size))
124
+ if (drm_WARN_ON(&i915->drm,
125
+ offset + bytes > vgpu->gvt->device_info.cfg_space_size))
105126 return -EINVAL;
106127
107128 memcpy(p_data, vgpu_cfg_space(vgpu) + offset, bytes);
....@@ -278,6 +299,10 @@
278299
279300 /**
280301 * intel_vgpu_emulate_cfg_read - emulate vGPU configuration space write
302
+ * @vgpu: target vgpu
303
+ * @offset: offset
304
+ * @p_data: write data ptr
305
+ * @bytes: number of bytes to write
281306 *
282307 * Returns:
283308 * Zero on success, negative error code if failed.
....@@ -285,34 +310,36 @@
285310 int intel_vgpu_emulate_cfg_write(struct intel_vgpu *vgpu, unsigned int offset,
286311 void *p_data, unsigned int bytes)
287312 {
313
+ struct drm_i915_private *i915 = vgpu->gvt->gt->i915;
288314 int ret;
289315
290
- if (WARN_ON(bytes > 4))
316
+ if (drm_WARN_ON(&i915->drm, bytes > 4))
291317 return -EINVAL;
292318
293
- if (WARN_ON(offset + bytes > vgpu->gvt->device_info.cfg_space_size))
319
+ if (drm_WARN_ON(&i915->drm,
320
+ offset + bytes > vgpu->gvt->device_info.cfg_space_size))
294321 return -EINVAL;
295322
296323 /* First check if it's PCI_COMMAND */
297324 if (IS_ALIGNED(offset, 2) && offset == PCI_COMMAND) {
298
- if (WARN_ON(bytes > 2))
325
+ if (drm_WARN_ON(&i915->drm, bytes > 2))
299326 return -EINVAL;
300327 return emulate_pci_command_write(vgpu, offset, p_data, bytes);
301328 }
302329
303330 switch (rounddown(offset, 4)) {
304331 case PCI_ROM_ADDRESS:
305
- if (WARN_ON(!IS_ALIGNED(offset, 4)))
332
+ if (drm_WARN_ON(&i915->drm, !IS_ALIGNED(offset, 4)))
306333 return -EINVAL;
307334 return emulate_pci_rom_bar_write(vgpu, offset, p_data, bytes);
308335
309336 case PCI_BASE_ADDRESS_0 ... PCI_BASE_ADDRESS_5:
310
- if (WARN_ON(!IS_ALIGNED(offset, 4)))
337
+ if (drm_WARN_ON(&i915->drm, !IS_ALIGNED(offset, 4)))
311338 return -EINVAL;
312339 return emulate_pci_bar_write(vgpu, offset, p_data, bytes);
313340
314341 case INTEL_GVT_PCI_SWSCI:
315
- if (WARN_ON(!IS_ALIGNED(offset, 4)))
342
+ if (drm_WARN_ON(&i915->drm, !IS_ALIGNED(offset, 4)))
316343 return -EINVAL;
317344 ret = intel_vgpu_emulate_opregion_request(vgpu, *(u32 *)p_data);
318345 if (ret)
....@@ -320,7 +347,7 @@
320347 break;
321348
322349 case INTEL_GVT_PCI_OPREGION:
323
- if (WARN_ON(!IS_ALIGNED(offset, 4)))
350
+ if (drm_WARN_ON(&i915->drm, !IS_ALIGNED(offset, 4)))
324351 return -EINVAL;
325352 ret = intel_vgpu_opregion_base_write_handler(vgpu,
326353 *(u32 *)p_data);
....@@ -349,6 +376,7 @@
349376 struct intel_gvt *gvt = vgpu->gvt;
350377 const struct intel_gvt_device_info *info = &gvt->device_info;
351378 u16 *gmch_ctl;
379
+ u8 next;
352380
353381 memcpy(vgpu_cfg_space(vgpu), gvt->firmware.cfg_space,
354382 info->cfg_space_size);
....@@ -379,11 +407,24 @@
379407 memset(vgpu_cfg_space(vgpu) + INTEL_GVT_PCI_OPREGION, 0, 4);
380408
381409 vgpu->cfg_space.bar[INTEL_GVT_PCI_BAR_GTTMMIO].size =
382
- pci_resource_len(gvt->dev_priv->drm.pdev, 0);
410
+ pci_resource_len(gvt->gt->i915->drm.pdev, 0);
383411 vgpu->cfg_space.bar[INTEL_GVT_PCI_BAR_APERTURE].size =
384
- pci_resource_len(gvt->dev_priv->drm.pdev, 2);
412
+ pci_resource_len(gvt->gt->i915->drm.pdev, 2);
385413
386414 memset(vgpu_cfg_space(vgpu) + PCI_ROM_ADDRESS, 0, 4);
415
+
416
+ /* PM Support */
417
+ vgpu->cfg_space.pmcsr_off = 0;
418
+ if (vgpu_cfg_space(vgpu)[PCI_STATUS] & PCI_STATUS_CAP_LIST) {
419
+ next = vgpu_cfg_space(vgpu)[PCI_CAPABILITY_LIST];
420
+ do {
421
+ if (vgpu_cfg_space(vgpu)[next + PCI_CAP_LIST_ID] == PCI_CAP_ID_PM) {
422
+ vgpu->cfg_space.pmcsr_off = next + PCI_PM_CTRL;
423
+ break;
424
+ }
425
+ next = vgpu_cfg_space(vgpu)[next + PCI_CAP_LIST_NEXT];
426
+ } while (next);
427
+ }
387428 }
388429
389430 /**