mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-08-22 00:42:01 +02:00

Hotunplugging the device seems to result in stuff like: kobject_add_internal failed for tile0 with -EEXIST, don't try to register things with the same name in the same directory. We only remove the sysfs as part of drmm, however that is tied to the lifetime of the driver instance and not the device underneath. Attempt to fix by using devm for all of the remaining sysfs stuff related to the device. Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/1667 Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/1432 Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240522102143.128069-20-matthew.auld@intel.com
90 lines
2.1 KiB
C
90 lines
2.1 KiB
C
// SPDX-License-Identifier: MIT
|
|
/*
|
|
* Copyright © 2023 Intel Corporation
|
|
*/
|
|
|
|
#include <linux/kobject.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/sysfs.h>
|
|
|
|
#include <drm/drm_managed.h>
|
|
|
|
#include "xe_device.h"
|
|
#include "xe_device_sysfs.h"
|
|
#include "xe_pm.h"
|
|
|
|
/**
|
|
* DOC: Xe device sysfs
|
|
* Xe driver requires exposing certain tunable knobs controlled by user space for
|
|
* each graphics device. Considering this, we need to add sysfs attributes at device
|
|
* level granularity.
|
|
* These sysfs attributes will be available under pci device kobj directory.
|
|
*
|
|
* vram_d3cold_threshold - Report/change vram used threshold(in MB) below
|
|
* which vram save/restore is permissible during runtime D3cold entry/exit.
|
|
*/
|
|
|
|
static ssize_t
|
|
vram_d3cold_threshold_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
struct xe_device *xe = pdev_to_xe_device(pdev);
|
|
int ret;
|
|
|
|
if (!xe)
|
|
return -EINVAL;
|
|
|
|
xe_pm_runtime_get(xe);
|
|
ret = sysfs_emit(buf, "%d\n", xe->d3cold.vram_threshold);
|
|
xe_pm_runtime_put(xe);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static ssize_t
|
|
vram_d3cold_threshold_store(struct device *dev, struct device_attribute *attr,
|
|
const char *buff, size_t count)
|
|
{
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
struct xe_device *xe = pdev_to_xe_device(pdev);
|
|
u32 vram_d3cold_threshold;
|
|
int ret;
|
|
|
|
if (!xe)
|
|
return -EINVAL;
|
|
|
|
ret = kstrtou32(buff, 0, &vram_d3cold_threshold);
|
|
if (ret)
|
|
return ret;
|
|
|
|
drm_dbg(&xe->drm, "vram_d3cold_threshold: %u\n", vram_d3cold_threshold);
|
|
|
|
xe_pm_runtime_get(xe);
|
|
ret = xe_pm_set_vram_threshold(xe, vram_d3cold_threshold);
|
|
xe_pm_runtime_put(xe);
|
|
|
|
return ret ?: count;
|
|
}
|
|
|
|
static DEVICE_ATTR_RW(vram_d3cold_threshold);
|
|
|
|
static void xe_device_sysfs_fini(void *arg)
|
|
{
|
|
struct xe_device *xe = arg;
|
|
|
|
sysfs_remove_file(&xe->drm.dev->kobj, &dev_attr_vram_d3cold_threshold.attr);
|
|
}
|
|
|
|
int xe_device_sysfs_init(struct xe_device *xe)
|
|
{
|
|
struct device *dev = xe->drm.dev;
|
|
int ret;
|
|
|
|
ret = sysfs_create_file(&dev->kobj, &dev_attr_vram_d3cold_threshold.attr);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return devm_add_action_or_reset(dev, xe_device_sysfs_fini, xe);
|
|
}
|