From: pding <[email protected]>

Add amdgpu_device_alloc() which was part of previous
amdgpu_device_init(). Then it's flexible to handle init
sequence since kfd has dependency to amdgpu_device base
fields.

Signed-off-by: pding <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h        |  4 +--
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 54 +++++++++++++++++++++++-------
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c    | 18 +++-------
 3 files changed, 49 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 2730a75..6f2dc2b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1655,11 +1655,11 @@ static inline struct amdgpu_device 
*amdgpu_ttm_adev(struct ttm_bo_device *bdev)
 {
        return container_of(bdev, struct amdgpu_device, mman.bdev);
 }
-
-int amdgpu_device_init(struct amdgpu_device *adev,
+int amdgpu_device_alloc(struct amdgpu_device **padev,
                       struct drm_device *ddev,
                       struct pci_dev *pdev,
                       uint32_t flags);
+int amdgpu_device_init(struct amdgpu_device *adev);
 void amdgpu_device_fini(struct amdgpu_device *adev);
 int amdgpu_gpu_wait_for_idle(struct amdgpu_device *adev);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 068b56a..809e656 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -2092,25 +2092,33 @@ bool amdgpu_device_has_dc_support(struct amdgpu_device 
*adev)
 }
 
 /**
- * amdgpu_device_init - initialize the driver
+ * amdgpu_device_alloc - allocate/init amdgpu_device structure
  *
- * @adev: amdgpu_device pointer
+ * @padev: pointer to amdgpu_device pointer
  * @pdev: drm dev pointer
  * @pdev: pci dev pointer
  * @flags: driver flags
  *
- * Initializes the driver info and hw (all asics).
  * Returns 0 for success or an error on failure.
- * Called at driver startup.
  */
-int amdgpu_device_init(struct amdgpu_device *adev,
-                      struct drm_device *ddev,
-                      struct pci_dev *pdev,
-                      uint32_t flags)
+int amdgpu_device_alloc(struct amdgpu_device **padev,
+                       struct drm_device *ddev,
+                       struct pci_dev *pdev,
+                       uint32_t flags)
 {
-       int r, i;
-       bool runtime = false;
-       u32 max_MBps;
+       struct amdgpu_device *adev;
+
+       adev = kzalloc(sizeof(struct amdgpu_device), GFP_KERNEL);
+       if (adev == NULL)
+               return -ENOMEM;
+
+       if ((amdgpu_runtime_pm != 0) &&
+           amdgpu_has_atpx() &&
+           (amdgpu_is_atpx_hybrid() ||
+            amdgpu_has_atpx_dgpu_power_cntl()) &&
+           ((flags & AMD_IS_APU) == 0) &&
+           !pci_is_thunderbolt_attached(pdev))
+               flags |= AMD_IS_PX;
 
        adev->shutdown = false;
        adev->dev = &pdev->dev;
@@ -2183,6 +2191,28 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 
        INIT_DELAYED_WORK(&adev->late_init_work, amdgpu_late_init_func_handler);
 
+       *padev = adev;
+
+       return 0;
+}
+/**
+ * amdgpu_device_init - initialize the driver
+ *
+ * @adev: amdgpu_device pointer
+ * @pdev: drm dev pointer
+ * @pdev: pci dev pointer
+ * @flags: driver flags
+ *
+ * Initializes the driver info and hw (all asics).
+ * Returns 0 for success or an error on failure.
+ * Called at driver startup.
+ */
+int amdgpu_device_init(struct amdgpu_device *adev)
+{
+       int r, i;
+       bool runtime = false;
+       u32 max_MBps;
+
        /* Registers mapping */
        /* TODO: block userspace mapping of io register */
        if (adev->asic_type >= CHIP_BONAIRE) {
@@ -2226,7 +2256,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 
        if (amdgpu_runtime_pm == 1)
                runtime = true;
-       if (amdgpu_device_is_px(ddev))
+       if (amdgpu_device_is_px(adev->ddev))
                runtime = true;
        if (!pci_is_thunderbolt_attached(adev->pdev))
                vga_switcheroo_register_client(adev->pdev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 3e9760d..acdb010 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -124,19 +124,11 @@ int amdgpu_driver_load_kms(struct drm_device *dev, 
unsigned long flags)
 #endif
 retry_init:
 
-       adev = kzalloc(sizeof(struct amdgpu_device), GFP_KERNEL);
-       if (adev == NULL) {
-               return -ENOMEM;
-       }
-       dev->dev_private = (void *)adev;
+       r = amdgpu_device_alloc(&adev, dev, dev->pdev, flags);
+       if (r)
+               return r;
 
-       if ((amdgpu_runtime_pm != 0) &&
-           amdgpu_has_atpx() &&
-           (amdgpu_is_atpx_hybrid() ||
-            amdgpu_has_atpx_dgpu_power_cntl()) &&
-           ((flags & AMD_IS_APU) == 0) &&
-           !pci_is_thunderbolt_attached(dev->pdev))
-               flags |= AMD_IS_PX;
+       dev->dev_private = (void *)adev;
 
        /* amdgpu_device_init should report only fatal error
         * like memory allocation failure or iomapping failure,
@@ -144,7 +136,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned 
long flags)
         * properly initialize the GPU MC controller and permit
         * VRAM allocation
         */
-       r = amdgpu_device_init(adev, dev, dev->pdev, flags);
+       r = amdgpu_device_init(adev);
        if (r == -EAGAIN && ++retry <= 3) {
                adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME;
                adev->virt.ops = NULL;
-- 
2.9.5

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to