Commit 087451f3 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

drm/amdgpu: use generic fb helpers instead of setting up AMD own's.

With the shadow buffer support from generic framebuffer emulation, it's
possible now to have runpm kicked when no update for console.
Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b5d1d755
...@@ -45,7 +45,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \ ...@@ -45,7 +45,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \
amdgpu_atombios.o atombios_crtc.o amdgpu_connectors.o \ amdgpu_atombios.o atombios_crtc.o amdgpu_connectors.o \
atom.o amdgpu_fence.o amdgpu_ttm.o amdgpu_object.o amdgpu_gart.o \ atom.o amdgpu_fence.o amdgpu_ttm.o amdgpu_object.o amdgpu_gart.o \
amdgpu_encoders.o amdgpu_display.o amdgpu_i2c.o \ amdgpu_encoders.o amdgpu_display.o amdgpu_i2c.o \
amdgpu_fb.o amdgpu_gem.o amdgpu_ring.o \ amdgpu_gem.o amdgpu_ring.o \
amdgpu_cs.o amdgpu_bios.o amdgpu_benchmark.o amdgpu_test.o \ amdgpu_cs.o amdgpu_bios.o amdgpu_benchmark.o amdgpu_test.o \
atombios_dp.o amdgpu_afmt.o amdgpu_trace_points.o \ atombios_dp.o amdgpu_afmt.o amdgpu_trace_points.o \
atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ atombios_encoders.o amdgpu_sa.o atombios_i2c.o \
......
...@@ -3684,8 +3684,6 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -3684,8 +3684,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
/* Get a log2 for easy divisions. */ /* Get a log2 for easy divisions. */
adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps)); adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
amdgpu_fbdev_init(adev);
r = amdgpu_pm_sysfs_init(adev); r = amdgpu_pm_sysfs_init(adev);
if (r) { if (r) {
adev->pm_sysfs_en = false; adev->pm_sysfs_en = false;
...@@ -3843,8 +3841,6 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev) ...@@ -3843,8 +3841,6 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
amdgpu_ucode_sysfs_fini(adev); amdgpu_ucode_sysfs_fini(adev);
sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes); sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);
amdgpu_fbdev_fini(adev);
amdgpu_device_ip_fini_early(adev); amdgpu_device_ip_fini_early(adev);
amdgpu_irq_fini_hw(adev); amdgpu_irq_fini_hw(adev);
...@@ -3939,7 +3935,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon) ...@@ -3939,7 +3935,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
drm_kms_helper_poll_disable(dev); drm_kms_helper_poll_disable(dev);
if (fbcon) if (fbcon)
amdgpu_fbdev_set_suspend(adev, 1); drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, true);
cancel_delayed_work_sync(&adev->delayed_init_work); cancel_delayed_work_sync(&adev->delayed_init_work);
...@@ -4016,7 +4012,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon) ...@@ -4016,7 +4012,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)
flush_delayed_work(&adev->delayed_init_work); flush_delayed_work(&adev->delayed_init_work);
if (fbcon) if (fbcon)
amdgpu_fbdev_set_suspend(adev, 0); drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, false);
drm_kms_helper_poll_enable(dev); drm_kms_helper_poll_enable(dev);
...@@ -4646,7 +4642,7 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle, ...@@ -4646,7 +4642,7 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle,
if (r) if (r)
goto out; goto out;
amdgpu_fbdev_set_suspend(tmp_adev, 0); drm_fb_helper_set_suspend_unlocked(adev_to_drm(tmp_adev)->fb_helper, false);
/* /*
* The GPU enters bad state once faulty pages * The GPU enters bad state once faulty pages
...@@ -5036,7 +5032,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev, ...@@ -5036,7 +5032,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
*/ */
amdgpu_unregister_gpu_instance(tmp_adev); amdgpu_unregister_gpu_instance(tmp_adev);
amdgpu_fbdev_set_suspend(tmp_adev, 1); drm_fb_helper_set_suspend_unlocked(adev_to_drm(adev)->fb_helper, true);
/* disable ras on ALL IPs */ /* disable ras on ALL IPs */
if (!need_emergency_restart && if (!need_emergency_restart &&
......
...@@ -1603,13 +1603,10 @@ int amdgpu_display_suspend_helper(struct amdgpu_device *adev) ...@@ -1603,13 +1603,10 @@ int amdgpu_display_suspend_helper(struct amdgpu_device *adev)
continue; continue;
} }
robj = gem_to_amdgpu_bo(fb->obj[0]); robj = gem_to_amdgpu_bo(fb->obj[0]);
/* don't unpin kernel fb objects */ r = amdgpu_bo_reserve(robj, true);
if (!amdgpu_fbdev_robj_is_fb(adev, robj)) { if (r == 0) {
r = amdgpu_bo_reserve(robj, true); amdgpu_bo_unpin(robj);
if (r == 0) { amdgpu_bo_unreserve(robj);
amdgpu_bo_unpin(robj);
amdgpu_bo_unreserve(robj);
}
} }
} }
return 0; return 0;
......
...@@ -2002,6 +2002,19 @@ static int amdgpu_pci_probe(struct pci_dev *pdev, ...@@ -2002,6 +2002,19 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
goto err_pci; goto err_pci;
} }
/*
* 1. don't init fbdev on hw without DCE
* 2. don't init fbdev if there are no connectors
*/
if (adev->mode_info.mode_config_initialized &&
!list_empty(&adev_to_drm(adev)->mode_config.connector_list)) {
/* select 8 bpp console on low vram cards */
if (adev->gmc.real_vram_size <= (32*1024*1024))
drm_fbdev_generic_setup(adev_to_drm(adev), 8);
else
drm_fbdev_generic_setup(adev_to_drm(adev), 32);
}
ret = amdgpu_debugfs_init(adev); ret = amdgpu_debugfs_init(adev);
if (ret) if (ret)
DRM_ERROR("Creating debugfs files failed (%d).\n", ret); DRM_ERROR("Creating debugfs files failed (%d).\n", ret);
......
This diff is collapsed.
...@@ -877,6 +877,32 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data, ...@@ -877,6 +877,32 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
return r; return r;
} }
static int amdgpu_gem_align_pitch(struct amdgpu_device *adev,
int width,
int cpp,
bool tiled)
{
int aligned = width;
int pitch_mask = 0;
switch (cpp) {
case 1:
pitch_mask = 255;
break;
case 2:
pitch_mask = 127;
break;
case 3:
case 4:
pitch_mask = 63;
break;
}
aligned += pitch_mask;
aligned &= ~pitch_mask;
return aligned * cpp;
}
int amdgpu_mode_dumb_create(struct drm_file *file_priv, int amdgpu_mode_dumb_create(struct drm_file *file_priv,
struct drm_device *dev, struct drm_device *dev,
struct drm_mode_create_dumb *args) struct drm_mode_create_dumb *args)
...@@ -897,8 +923,8 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv, ...@@ -897,8 +923,8 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
if (adev->mman.buffer_funcs_enabled) if (adev->mman.buffer_funcs_enabled)
flags |= AMDGPU_GEM_CREATE_VRAM_CLEARED; flags |= AMDGPU_GEM_CREATE_VRAM_CLEARED;
args->pitch = amdgpu_align_pitch(adev, args->width, args->pitch = amdgpu_gem_align_pitch(adev, args->width,
DIV_ROUND_UP(args->bpp, 8), 0); DIV_ROUND_UP(args->bpp, 8), 0);
args->size = (u64)args->pitch * args->height; args->size = (u64)args->pitch * args->height;
args->size = ALIGN(args->size, PAGE_SIZE); args->size = ALIGN(args->size, PAGE_SIZE);
domain = amdgpu_bo_get_preferred_domain(adev, domain = amdgpu_bo_get_preferred_domain(adev,
......
...@@ -232,8 +232,6 @@ struct amdgpu_i2c_chan { ...@@ -232,8 +232,6 @@ struct amdgpu_i2c_chan {
struct mutex mutex; struct mutex mutex;
}; };
struct amdgpu_fbdev;
struct amdgpu_afmt { struct amdgpu_afmt {
bool enabled; bool enabled;
int offset; int offset;
...@@ -309,13 +307,6 @@ struct amdgpu_framebuffer { ...@@ -309,13 +307,6 @@ struct amdgpu_framebuffer {
uint64_t address; uint64_t address;
}; };
struct amdgpu_fbdev {
struct drm_fb_helper helper;
struct amdgpu_framebuffer rfb;
struct list_head fbdev_list;
struct amdgpu_device *adev;
};
struct amdgpu_mode_info { struct amdgpu_mode_info {
struct atom_context *atom_context; struct atom_context *atom_context;
struct card_info *atom_card_info; struct card_info *atom_card_info;
...@@ -341,8 +332,6 @@ struct amdgpu_mode_info { ...@@ -341,8 +332,6 @@ struct amdgpu_mode_info {
struct edid *bios_hardcoded_edid; struct edid *bios_hardcoded_edid;
int bios_hardcoded_edid_size; int bios_hardcoded_edid_size;
/* pointer to fbdev info structure */
struct amdgpu_fbdev *rfbdev;
/* firmware flags */ /* firmware flags */
u32 firmware_flags; u32 firmware_flags;
/* pointer to backlight encoder */ /* pointer to backlight encoder */
...@@ -631,15 +620,6 @@ bool amdgpu_crtc_get_scanout_position(struct drm_crtc *crtc, ...@@ -631,15 +620,6 @@ bool amdgpu_crtc_get_scanout_position(struct drm_crtc *crtc,
int *hpos, ktime_t *stime, ktime_t *etime, int *hpos, ktime_t *stime, ktime_t *etime,
const struct drm_display_mode *mode); const struct drm_display_mode *mode);
/* fbdev layer */
int amdgpu_fbdev_init(struct amdgpu_device *adev);
void amdgpu_fbdev_fini(struct amdgpu_device *adev);
void amdgpu_fbdev_set_suspend(struct amdgpu_device *adev, int state);
int amdgpu_fbdev_total_size(struct amdgpu_device *adev);
bool amdgpu_fbdev_robj_is_fb(struct amdgpu_device *adev, struct amdgpu_bo *robj);
int amdgpu_align_pitch(struct amdgpu_device *adev, int width, int bpp, bool tiled);
/* amdgpu_display.c */ /* amdgpu_display.c */
void amdgpu_display_print_display_setup(struct drm_device *dev); void amdgpu_display_print_display_setup(struct drm_device *dev);
int amdgpu_display_modeset_create_props(struct amdgpu_device *adev); int amdgpu_display_modeset_create_props(struct amdgpu_device *adev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment