mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 14:51:51 -04:00
UAPI Changes: - restrict multi-lrc to VCS/VECS engines (Xin Wang) - Introduce a flag to disallow vm overcommit in fault mode (Thomas) - update used tracking kernel-doc (Auld, Fixes) - Some bind queue fixes (Auld, Fixes) Cross-subsystem Changes: - Split drm_suballoc_new() into SA alloc and init helpers (Satya, Fixes) - pass pagemap_addr by reference (Arnd, Fixes) - Revert "drm/pagemap: Disable device-to-device migration" (Thomas) - Fix unbalanced unlock in drm_gpusvm_scan_mm (Maciej, Fixes) - Small GPUSVM fixes (Brost, Fixes) - Fix xe SVM configs (Thomas, Fixes) Core Changes: - Fix a hmm_range_fault() livelock / starvation problem (Thomas, Fixes) Driver Changes: - Fix leak on xa_store failure (Shuicheng, Fixes) - Correct implementation of Wa_16025250150 (Roper, Fixes) - Refactor context init into xe_lrc_ctx_init (Raag) - Fix GSC proxy cleanup on early initialization failure (Zhanjun) - Fix exec queue creation during post-migration recovery (Tomasz, Fixes) - Apply windower hardware filtering setting on Xe3 and Xe3p (Roper) - Free ctx_restore_mid_bb in release (Shuicheng, Fixes) - Drop stale MCR steering TODO comment (Roper) - dGPU memory optimizations (Brost) - Do not preempt fence signaling CS instructions (Brost, Fixes) - Revert "drm/xe/compat: Remove unused i915_reg.h from compat header" (Uma) - Don't expose display modparam if no display support (Wajdeczko) - Some VRAM flag improvements (Wajdeczko) - Misc fix for xe_guc_ct.c (Shuicheng, Fixes) - Remove unused i915_reg.h from compat header (Uma) - Workaround cleanup & simplification (Roper) - Add prefetch pagefault support for Xe3p (Varun) - Fix fs_reclaim deadlock caused by CCS save/restore (Satya, Fixes) - Cleanup partially initialized sync on parse failure (Shuicheng, Fixes) - Allow to change VFs VRAM quota using sysfs (Michal) - Increase GuC log sizes in debug builds (Tomasz) - Wa_18041344222 changes (Harish) - Add Wa_14026781792 (Niton) - Add debugfs facility to catch RTP mistakes (Roper) - Convert GT stats to per-cpu counters (Brost) - Prevent unintended VRAM channel creation (Karthik) - Privatize struct xe_ggtt (Maarten) - remove unnecessary struct dram_info forward declaration (Jani) - pagefault refactors (Brost) - Apply Wa_14024997852 (Arvind) - Redirect faults to dummy page for wedged device (Raag, Fixes) - Force EXEC_QUEUE_FLAG_KERNEL for kernel internal VMs (Piotr) - Stop applying Wa_16018737384 from Xe3 onward (Roper) - Add new XeCore fuse registers to VF runtime regs (Roper) - Update xe_device_declare_wedged() error log (Raag) - Make xe_modparam.force_vram_bar_size signed (Shuicheng, Fixes) - Avoid reading media version when media GT is disabled (Piotr, Fixes) - Fix handling of Wa_14019988906 & Wa_14019877138 (Roper, Fixes) - Basic enabling patches for Xe3p_LPG and NVL-P (Gustavo, Roper, Shekhar) - Avoid double-adjust in 64-bit reads (Shuicheng, Fixes) - Allow VF to initialize MCR tables (Wajdeczko) - Add Wa_14025883347 for GuC DMA failure on reset (Anirban) - Add bounds check on pat_index to prevent OOB kernel read in madvise (Jia, Fixes) - Fix the address range assert in ggtt_get_pte helper (Winiarski) - XeCore fuse register changes (Roper) - Add more info to powergate_info debugfs (Vinay) - Separate out GuC RC code (Vinay) - Fix g2g_test_array indexing (Pallavi) - Mutual exclusivity between CCS-mode and PF (Nareshkumar, Fixes) - Some more _types.h cleanups (Wajdeczko) - Fix sysfs initialization (Wajdeczko, Fixes) - Drop unnecessary goto in xe_device_create (Roper) - Disable D3Cold for BMG only on specific platforms (Karthik, Fixes) - Add sriov.admin_only_pf attribute (Wajdeczko) - replace old wq(s), add WQ_PERCPU to alloc_workqueue (Marco) - Make MMIO communication more robust (Wajdeczko) - Fix warning of kerneldoc (Shuicheng, Fixes) - Fix topology query pointer advance (Shuicheng, Fixes) - use entry_dump callbacks for xe2+ PAT dumps (Xin Wang) - Fix kernel-doc warning in GuC scheduler ABI header (Chaitanya, Fixes) - Fix CFI violation in debugfs access (Daniele, Fixes) - Apply WA_16028005424 to Media (Balasubramani) - Fix typo in function kernel-doc (Wajdeczko) - Protect priority against concurrent access (Niranjana) - Fix nvm aux resource cleanup (Shuicheng, Fixes) - Fix is_bound() pci_dev lifetime (Shuicheng, Fixes) - Use CLASS() for forcewake in xe_gt_enable_comp_1wcoh (Shuicheng) - Reset VF GuC state on fini (Wajdeczko) - Move _THIS_IP_ usage from xe_vm_create() to dedicated function (Nathan Chancellor, Fixes) - Unregister drm device on probe error (Shuicheng, Fixes) - Disable DCC on PTL (Vinay, Fixes) - Fix Wa_18022495364 (Tvrtko, Fixes) - Skip address copy for sync-only execs (Shuicheng, Fixes) - derive mem copy capability from graphics version (Nitin, Fixes) - Use DRM_BUDDY_CONTIGUOUS_ALLOCATION for contiguous allocations (Sanjay) - Context based TLB invalidations (Brost) - Enable multi_queue on xe3p_xpc (Brost, Niranjana) - Remove check for gt in xe_query (Nakshtra) - Reduce LRC timestamp stuck message on VFs to notice (Brost, Fixes) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Matthew Brost <matthew.brost@intel.com> Link: https://patch.msgid.link/aaYR5G2MHjOEMXPW@lstrano-desk.jf.intel.com
179 lines
4.3 KiB
C
179 lines
4.3 KiB
C
// SPDX-License-Identifier: MIT
|
|
/*
|
|
* Copyright(c) 2019-2025, Intel Corporation. All rights reserved.
|
|
*/
|
|
|
|
#include <linux/intel_dg_nvm_aux.h>
|
|
#include <linux/pci.h>
|
|
|
|
#include "xe_device.h"
|
|
#include "xe_mmio.h"
|
|
#include "xe_nvm.h"
|
|
#include "xe_pcode_api.h"
|
|
#include "regs/xe_gsc_regs.h"
|
|
#include "xe_sriov.h"
|
|
|
|
#define GEN12_GUNIT_NVM_BASE 0x00102040
|
|
#define GEN12_DEBUG_NVM_BASE 0x00101018
|
|
|
|
#define GEN12_CNTL_PROTECTED_NVM_REG 0x0010100C
|
|
|
|
#define GEN12_GUNIT_NVM_SIZE 0x80
|
|
#define GEN12_DEBUG_NVM_SIZE 0x4
|
|
|
|
#define NVM_NON_POSTED_ERASE_CHICKEN_BIT BIT(13)
|
|
|
|
#define HECI_FW_STATUS_2_NVM_ACCESS_MODE BIT(3)
|
|
|
|
static const struct intel_dg_nvm_region regions[INTEL_DG_NVM_REGIONS] = {
|
|
[0] = { .name = "DESCRIPTOR", },
|
|
[2] = { .name = "GSC", },
|
|
[9] = { .name = "PADDING", },
|
|
[11] = { .name = "OptionROM", },
|
|
[12] = { .name = "DAM", },
|
|
};
|
|
|
|
static void xe_nvm_release_dev(struct device *dev)
|
|
{
|
|
struct auxiliary_device *aux = container_of(dev, struct auxiliary_device, dev);
|
|
struct intel_dg_nvm_dev *nvm = container_of(aux, struct intel_dg_nvm_dev, aux_dev);
|
|
|
|
kfree(nvm);
|
|
}
|
|
|
|
static bool xe_nvm_non_posted_erase(struct xe_device *xe)
|
|
{
|
|
struct xe_mmio *mmio = xe_root_tile_mmio(xe);
|
|
|
|
switch (xe->info.platform) {
|
|
case XE_CRESCENTISLAND:
|
|
case XE_BATTLEMAGE:
|
|
return !(xe_mmio_read32(mmio, XE_REG(GEN12_CNTL_PROTECTED_NVM_REG)) &
|
|
NVM_NON_POSTED_ERASE_CHICKEN_BIT);
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static bool xe_nvm_writable_override(struct xe_device *xe)
|
|
{
|
|
struct xe_mmio *mmio = xe_root_tile_mmio(xe);
|
|
bool writable_override;
|
|
struct xe_reg reg;
|
|
u32 test_bit;
|
|
|
|
switch (xe->info.platform) {
|
|
case XE_CRESCENTISLAND:
|
|
reg = PCODE_SCRATCH(0);
|
|
test_bit = FDO_MODE;
|
|
break;
|
|
case XE_BATTLEMAGE:
|
|
reg = HECI_FWSTS2(DG2_GSC_HECI2_BASE);
|
|
test_bit = HECI_FW_STATUS_2_NVM_ACCESS_MODE;
|
|
break;
|
|
case XE_PVC:
|
|
reg = HECI_FWSTS2(PVC_GSC_HECI2_BASE);
|
|
test_bit = HECI_FW_STATUS_2_NVM_ACCESS_MODE;
|
|
break;
|
|
case XE_DG2:
|
|
reg = HECI_FWSTS2(DG2_GSC_HECI2_BASE);
|
|
test_bit = HECI_FW_STATUS_2_NVM_ACCESS_MODE;
|
|
break;
|
|
case XE_DG1:
|
|
reg = HECI_FWSTS2(DG1_GSC_HECI2_BASE);
|
|
test_bit = HECI_FW_STATUS_2_NVM_ACCESS_MODE;
|
|
break;
|
|
default:
|
|
drm_err(&xe->drm, "Unknown platform\n");
|
|
return true;
|
|
}
|
|
|
|
writable_override = !(xe_mmio_read32(mmio, reg) & test_bit);
|
|
if (writable_override)
|
|
drm_info(&xe->drm, "NVM access overridden by jumper\n");
|
|
return writable_override;
|
|
}
|
|
|
|
static void xe_nvm_fini(void *arg)
|
|
{
|
|
struct xe_device *xe = arg;
|
|
struct intel_dg_nvm_dev *nvm = xe->nvm;
|
|
|
|
if (!xe->info.has_gsc_nvm)
|
|
return;
|
|
|
|
/* No access to internal NVM from VFs */
|
|
if (IS_SRIOV_VF(xe))
|
|
return;
|
|
|
|
/* Nvm pointer should not be NULL here */
|
|
if (WARN_ON(!nvm))
|
|
return;
|
|
|
|
auxiliary_device_delete(&nvm->aux_dev);
|
|
auxiliary_device_uninit(&nvm->aux_dev);
|
|
xe->nvm = NULL;
|
|
}
|
|
|
|
int xe_nvm_init(struct xe_device *xe)
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
|
|
struct auxiliary_device *aux_dev;
|
|
struct intel_dg_nvm_dev *nvm;
|
|
int ret;
|
|
|
|
if (!xe->info.has_gsc_nvm)
|
|
return 0;
|
|
|
|
/* No access to internal NVM from VFs */
|
|
if (IS_SRIOV_VF(xe))
|
|
return 0;
|
|
|
|
/* Nvm pointer should be NULL here */
|
|
if (WARN_ON(xe->nvm))
|
|
return -EFAULT;
|
|
|
|
nvm = kzalloc_obj(*nvm);
|
|
if (!nvm)
|
|
return -ENOMEM;
|
|
|
|
nvm->writable_override = xe_nvm_writable_override(xe);
|
|
nvm->non_posted_erase = xe_nvm_non_posted_erase(xe);
|
|
nvm->bar.parent = &pdev->resource[0];
|
|
nvm->bar.start = GEN12_GUNIT_NVM_BASE + pdev->resource[0].start;
|
|
nvm->bar.end = nvm->bar.start + GEN12_GUNIT_NVM_SIZE - 1;
|
|
nvm->bar.flags = IORESOURCE_MEM;
|
|
nvm->bar.desc = IORES_DESC_NONE;
|
|
nvm->regions = regions;
|
|
|
|
nvm->bar2.parent = &pdev->resource[0];
|
|
nvm->bar2.start = GEN12_DEBUG_NVM_BASE + pdev->resource[0].start;
|
|
nvm->bar2.end = nvm->bar2.start + GEN12_DEBUG_NVM_SIZE - 1;
|
|
nvm->bar2.flags = IORESOURCE_MEM;
|
|
nvm->bar2.desc = IORES_DESC_NONE;
|
|
|
|
aux_dev = &nvm->aux_dev;
|
|
|
|
aux_dev->name = "nvm";
|
|
aux_dev->id = (pci_domain_nr(pdev->bus) << 16) | pci_dev_id(pdev);
|
|
aux_dev->dev.parent = &pdev->dev;
|
|
aux_dev->dev.release = xe_nvm_release_dev;
|
|
|
|
ret = auxiliary_device_init(aux_dev);
|
|
if (ret) {
|
|
drm_err(&xe->drm, "xe-nvm aux init failed %d\n", ret);
|
|
kfree(nvm);
|
|
return ret;
|
|
}
|
|
|
|
ret = auxiliary_device_add(aux_dev);
|
|
if (ret) {
|
|
drm_err(&xe->drm, "xe-nvm aux add failed %d\n", ret);
|
|
auxiliary_device_uninit(aux_dev);
|
|
return ret;
|
|
}
|
|
|
|
xe->nvm = nvm;
|
|
return devm_add_action_or_reset(xe->drm.dev, xe_nvm_fini, xe);
|
|
}
|