drm/amd: Use attribute groups for PSP flashing attributes
authorMario Limonciello <mario.limonciello@amd.com>
Mon, 26 Jun 2023 15:04:04 +0000 (10:04 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 7 Jul 2023 17:51:46 +0000 (13:51 -0400)
Individually creating attributes can be racy, instead make attributes
using attribute groups and control their visibility with an is_visible
callback to only show when using appropriate products.

v2: squash in fix for PSP 13.0.10

Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h

index 2f9c14a..41b3f20 100644 (file)
@@ -1034,7 +1034,6 @@ struct amdgpu_device {
        bool                            has_pr3;
 
        bool                            ucode_sysfs_en;
-       bool                            psp_sysfs_en;
 
        /* Chip product information */
        char                            product_number[20];
index a92c618..7f069e1 100644 (file)
@@ -4050,14 +4050,6 @@ fence_driver_init:
        } else
                adev->ucode_sysfs_en = true;
 
-       r = amdgpu_psp_sysfs_init(adev);
-       if (r) {
-               adev->psp_sysfs_en = false;
-               if (!amdgpu_sriov_vf(adev))
-                       DRM_ERROR("Creating psp sysfs failed\n");
-       } else
-               adev->psp_sysfs_en = true;
-
        /*
         * Register gpu instance before amdgpu_device_enable_mgpu_fan_boost.
         * Otherwise the mgpu fan boost feature will be skipped due to the
@@ -4207,8 +4199,6 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
                amdgpu_pm_sysfs_fini(adev);
        if (adev->ucode_sysfs_en)
                amdgpu_ucode_sysfs_fini(adev);
-       if (adev->psp_sysfs_en)
-               amdgpu_psp_sysfs_fini(adev);
        sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);
 
        /* disable ras feature must before hw fini */
index 0593ef8..ae1369c 100644 (file)
@@ -2899,10 +2899,12 @@ static struct pci_error_handlers amdgpu_pci_err_handler = {
 
 extern const struct attribute_group amdgpu_vram_mgr_attr_group;
 extern const struct attribute_group amdgpu_gtt_mgr_attr_group;
+extern const struct attribute_group amdgpu_flash_attr_group;
 
 static const struct attribute_group *amdgpu_sysfs_groups[] = {
        &amdgpu_vram_mgr_attr_group,
        &amdgpu_gtt_mgr_attr_group,
+       &amdgpu_flash_attr_group,
        NULL,
 };
 
index 6d676bd..8753e13 100644 (file)
@@ -202,7 +202,6 @@ static int psp_early_init(void *handle)
        case IP_VERSION(13, 0, 3):
        case IP_VERSION(13, 0, 5):
        case IP_VERSION(13, 0, 8):
-       case IP_VERSION(13, 0, 10):
        case IP_VERSION(13, 0, 11):
                psp_v13_0_set_psp_funcs(psp);
                psp->autoload_supported = true;
@@ -215,6 +214,7 @@ static int psp_early_init(void *handle)
                break;
        case IP_VERSION(13, 0, 0):
        case IP_VERSION(13, 0, 7):
+       case IP_VERSION(13, 0, 10):
                psp_v13_0_set_psp_funcs(psp);
                psp->autoload_supported = true;
                break;
@@ -3677,6 +3677,13 @@ rel_buf:
        return 0;
 }
 
+static struct bin_attribute psp_vbflash_bin_attr = {
+       .attr = {.name = "psp_vbflash", .mode = 0660},
+       .size = 0,
+       .write = amdgpu_psp_vbflash_write,
+       .read = amdgpu_psp_vbflash_read,
+};
+
 static ssize_t amdgpu_psp_vbflash_status(struct device *dev,
                                         struct device_attribute *attr,
                                         char *buf)
@@ -3693,39 +3700,39 @@ static ssize_t amdgpu_psp_vbflash_status(struct device *dev,
 
        return sysfs_emit(buf, "0x%x\n", vbflash_status);
 }
+static DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL);
 
-static const struct bin_attribute psp_vbflash_bin_attr = {
-       .attr = {.name = "psp_vbflash", .mode = 0660},
-       .size = 0,
-       .write = amdgpu_psp_vbflash_write,
-       .read = amdgpu_psp_vbflash_read,
+static struct attribute *flash_attrs[] = {
+       &dev_attr_psp_vbflash_status.attr,
+       &psp_vbflash_bin_attr.attr,
+       NULL
 };
 
-static DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL);
-
-int amdgpu_psp_sysfs_init(struct amdgpu_device *adev)
+static umode_t amdgpu_flash_attr_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
 {
-       int ret = 0;
+       struct device *dev = kobj_to_dev(kobj);
+       struct drm_device *ddev = dev_get_drvdata(dev);
+       struct amdgpu_device *adev = drm_to_adev(ddev);
 
        if (amdgpu_sriov_vf(adev))
-               return -EINVAL;
+               return 0;
 
        switch (adev->ip_versions[MP0_HWIP][0]) {
        case IP_VERSION(13, 0, 0):
        case IP_VERSION(13, 0, 7):
-       case IP_VERSION(13, 0, 10):
-               ret = sysfs_create_bin_file(&adev->dev->kobj, &psp_vbflash_bin_attr);
-               if (ret)
-                       dev_err(adev->dev, "Failed to create device file psp_vbflash");
-               ret = device_create_file(adev->dev, &dev_attr_psp_vbflash_status);
-               if (ret)
-                       dev_err(adev->dev, "Failed to create device file psp_vbflash_status");
-               return ret;
+               if (attr == &psp_vbflash_bin_attr.attr)
+                       return 0660;
+               return 0440;
        default:
                return 0;
        }
 }
 
+const struct attribute_group amdgpu_flash_attr_group = {
+       .attrs = flash_attrs,
+       .is_visible = amdgpu_flash_attr_is_visible,
+};
+
 const struct amd_ip_funcs psp_ip_funcs = {
        .name = "psp",
        .early_init = psp_early_init,
@@ -3754,12 +3761,6 @@ static int psp_sysfs_init(struct amdgpu_device *adev)
        return ret;
 }
 
-void amdgpu_psp_sysfs_fini(struct amdgpu_device *adev)
-{
-       sysfs_remove_bin_file(&adev->dev->kobj, &psp_vbflash_bin_attr);
-       device_remove_file(adev->dev, &dev_attr_psp_vbflash_status);
-}
-
 static void psp_sysfs_fini(struct amdgpu_device *adev)
 {
        device_remove_file(adev->dev, &dev_attr_usbc_pd_fw);
index 2cae0b1..4847aac 100644 (file)
@@ -525,6 +525,4 @@ int psp_spatial_partition(struct psp_context *psp, int mode);
 
 int is_psp_fw_valid(struct psp_bin_desc bin);
 
-int amdgpu_psp_sysfs_init(struct amdgpu_device *adev);
-void amdgpu_psp_sysfs_fini(struct amdgpu_device *adev);
 #endif