forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /* Hisilicon Hibmc SoC drm driver
23 *
34 * Based on the bochs drm driver.
....@@ -8,36 +9,24 @@
89 * Rongrong Zou <zourongrong@huawei.com>
910 * Rongrong Zou <zourongrong@gmail.com>
1011 * Jianhua Li <lijianhua@huawei.com>
11
- *
12
- * This program is free software; you can redistribute it and/or modify
13
- * it under the terms of the GNU General Public License as published by
14
- * the Free Software Foundation; either version 2 of the License, or
15
- * (at your option) any later version.
16
- *
1712 */
1813
19
-#include <linux/console.h>
2014 #include <linux/module.h>
15
+#include <linux/pci.h>
2116
2217 #include <drm/drm_atomic_helper.h>
23
-#include <drm/drm_crtc_helper.h>
18
+#include <drm/drm_drv.h>
19
+#include <drm/drm_gem_vram_helper.h>
20
+#include <drm/drm_irq.h>
21
+#include <drm/drm_managed.h>
22
+#include <drm/drm_vblank.h>
2423
2524 #include "hibmc_drm_drv.h"
2625 #include "hibmc_drm_regs.h"
2726
28
-static const struct file_operations hibmc_fops = {
29
- .owner = THIS_MODULE,
30
- .open = drm_open,
31
- .release = drm_release,
32
- .unlocked_ioctl = drm_ioctl,
33
- .compat_ioctl = drm_compat_ioctl,
34
- .mmap = hibmc_mmap,
35
- .poll = drm_poll,
36
- .read = drm_read,
37
- .llseek = no_llseek,
38
-};
27
+DEFINE_DRM_GEM_FOPS(hibmc_fops);
3928
40
-irqreturn_t hibmc_drm_interrupt(int irq, void *arg)
29
+static irqreturn_t hibmc_drm_interrupt(int irq, void *arg)
4130 {
4231 struct drm_device *dev = (struct drm_device *)arg;
4332 struct hibmc_drm_private *priv =
....@@ -56,48 +45,32 @@
5645 }
5746
5847 static struct drm_driver hibmc_driver = {
59
- .driver_features = DRIVER_GEM | DRIVER_MODESET |
60
- DRIVER_ATOMIC | DRIVER_HAVE_IRQ,
48
+ .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
6149 .fops = &hibmc_fops,
6250 .name = "hibmc",
6351 .date = "20160828",
6452 .desc = "hibmc drm driver",
6553 .major = 1,
6654 .minor = 0,
67
- .gem_free_object_unlocked = hibmc_gem_free_object,
55
+ .debugfs_init = drm_vram_mm_debugfs_init,
6856 .dumb_create = hibmc_dumb_create,
69
- .dumb_map_offset = hibmc_dumb_mmap_offset,
57
+ .dumb_map_offset = drm_gem_vram_driver_dumb_mmap_offset,
58
+ .gem_prime_mmap = drm_gem_prime_mmap,
7059 .irq_handler = hibmc_drm_interrupt,
7160 };
7261
7362 static int __maybe_unused hibmc_pm_suspend(struct device *dev)
7463 {
75
- struct pci_dev *pdev = to_pci_dev(dev);
76
- struct drm_device *drm_dev = pci_get_drvdata(pdev);
77
- struct hibmc_drm_private *priv = drm_dev->dev_private;
64
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
7865
79
- drm_kms_helper_poll_disable(drm_dev);
80
- priv->suspend_state = drm_atomic_helper_suspend(drm_dev);
81
- if (IS_ERR(priv->suspend_state)) {
82
- DRM_ERROR("drm_atomic_helper_suspend failed: %ld\n",
83
- PTR_ERR(priv->suspend_state));
84
- drm_kms_helper_poll_enable(drm_dev);
85
- return PTR_ERR(priv->suspend_state);
86
- }
87
-
88
- return 0;
66
+ return drm_mode_config_helper_suspend(drm_dev);
8967 }
9068
9169 static int __maybe_unused hibmc_pm_resume(struct device *dev)
9270 {
93
- struct pci_dev *pdev = to_pci_dev(dev);
94
- struct drm_device *drm_dev = pci_get_drvdata(pdev);
95
- struct hibmc_drm_private *priv = drm_dev->dev_private;
71
+ struct drm_device *drm_dev = dev_get_drvdata(dev);
9672
97
- drm_atomic_helper_resume(drm_dev, priv->suspend_state);
98
- drm_kms_helper_poll_enable(drm_dev);
99
-
100
- return 0;
73
+ return drm_mode_config_helper_resume(drm_dev);
10174 }
10275
10376 static const struct dev_pm_ops hibmc_pm_ops = {
....@@ -115,23 +88,23 @@
11588 priv->dev->mode_config.min_width = 0;
11689 priv->dev->mode_config.min_height = 0;
11790 priv->dev->mode_config.max_width = 1920;
118
- priv->dev->mode_config.max_height = 1440;
91
+ priv->dev->mode_config.max_height = 1200;
11992
12093 priv->dev->mode_config.fb_base = priv->fb_base;
121
- priv->dev->mode_config.preferred_depth = 24;
122
- priv->dev->mode_config.prefer_shadow = 0;
94
+ priv->dev->mode_config.preferred_depth = 32;
95
+ priv->dev->mode_config.prefer_shadow = 1;
12396
12497 priv->dev->mode_config.funcs = (void *)&hibmc_mode_funcs;
12598
12699 ret = hibmc_de_init(priv);
127100 if (ret) {
128
- DRM_ERROR("failed to init de: %d\n", ret);
101
+ drm_err(priv->dev, "failed to init de: %d\n", ret);
129102 return ret;
130103 }
131104
132105 ret = hibmc_vdac_init(priv);
133106 if (ret) {
134
- DRM_ERROR("failed to init vdac: %d\n", ret);
107
+ drm_err(priv->dev, "failed to init vdac: %d\n", ret);
135108 return ret;
136109 }
137110
....@@ -237,9 +210,9 @@
237210
238211 ioaddr = pci_resource_start(pdev, 1);
239212 iosize = pci_resource_len(pdev, 1);
240
- priv->mmio = devm_ioremap_nocache(dev->dev, ioaddr, iosize);
213
+ priv->mmio = devm_ioremap(dev->dev, ioaddr, iosize);
241214 if (!priv->mmio) {
242
- DRM_ERROR("Cannot map mmio region\n");
215
+ drm_err(dev, "Cannot map mmio region\n");
243216 return -ENOMEM;
244217 }
245218
....@@ -247,7 +220,7 @@
247220 size = pci_resource_len(pdev, 0);
248221 priv->fb_map = devm_ioremap(dev->dev, addr, size);
249222 if (!priv->fb_map) {
250
- DRM_ERROR("Cannot map framebuffer\n");
223
+ drm_err(dev, "Cannot map framebuffer\n");
251224 return -ENOMEM;
252225 }
253226 priv->fb_base = addr;
....@@ -273,15 +246,12 @@
273246 {
274247 struct hibmc_drm_private *priv = dev->dev_private;
275248
276
- hibmc_fbdev_fini(priv);
277
-
278249 drm_atomic_helper_shutdown(dev);
279250
280251 if (dev->irq_enabled)
281252 drm_irq_uninstall(dev);
282
- if (priv->msi_enabled)
283
- pci_disable_msi(dev->pdev);
284253
254
+ pci_disable_msi(dev->pdev);
285255 hibmc_kms_fini(priv);
286256 hibmc_mm_fini(priv);
287257 dev->dev_private = NULL;
....@@ -293,9 +263,9 @@
293263 struct hibmc_drm_private *priv;
294264 int ret;
295265
296
- priv = devm_kzalloc(dev->dev, sizeof(*priv), GFP_KERNEL);
266
+ priv = drmm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
297267 if (!priv) {
298
- DRM_ERROR("no memory to allocate for hibmc_drm_private\n");
268
+ drm_err(dev, "no memory to allocate for hibmc_drm_private\n");
299269 return -ENOMEM;
300270 }
301271 dev->dev_private = priv;
....@@ -315,35 +285,27 @@
315285
316286 ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
317287 if (ret) {
318
- DRM_ERROR("failed to initialize vblank: %d\n", ret);
288
+ drm_err(dev, "failed to initialize vblank: %d\n", ret);
319289 goto err;
320290 }
321291
322
- priv->msi_enabled = 0;
323292 ret = pci_enable_msi(dev->pdev);
324293 if (ret) {
325
- DRM_WARN("enabling MSI failed: %d\n", ret);
294
+ drm_warn(dev, "enabling MSI failed: %d\n", ret);
326295 } else {
327
- priv->msi_enabled = 1;
328296 ret = drm_irq_install(dev, dev->pdev->irq);
329297 if (ret)
330
- DRM_WARN("install irq failed: %d\n", ret);
298
+ drm_warn(dev, "install irq failed: %d\n", ret);
331299 }
332300
333301 /* reset all the states of crtc/plane/encoder/connector */
334302 drm_mode_config_reset(dev);
335303
336
- ret = hibmc_fbdev_init(priv);
337
- if (ret) {
338
- DRM_ERROR("failed to initialize fbdev: %d\n", ret);
339
- goto err;
340
- }
341
-
342304 return 0;
343305
344306 err:
345307 hibmc_unload(dev);
346
- DRM_ERROR("failed to initialize drm driver: %d\n", ret);
308
+ drm_err(dev, "failed to initialize drm driver: %d\n", ret);
347309 return ret;
348310 }
349311
....@@ -352,6 +314,11 @@
352314 {
353315 struct drm_device *dev;
354316 int ret;
317
+
318
+ ret = drm_fb_helper_remove_conflicting_pci_framebuffers(pdev,
319
+ "hibmcdrmfb");
320
+ if (ret)
321
+ return ret;
355322
356323 dev = drm_dev_alloc(&hibmc_driver, &pdev->dev);
357324 if (IS_ERR(dev)) {
....@@ -364,22 +331,25 @@
364331
365332 ret = pci_enable_device(pdev);
366333 if (ret) {
367
- DRM_ERROR("failed to enable pci device: %d\n", ret);
334
+ drm_err(dev, "failed to enable pci device: %d\n", ret);
368335 goto err_free;
369336 }
370337
371338 ret = hibmc_load(dev);
372339 if (ret) {
373
- DRM_ERROR("failed to load hibmc: %d\n", ret);
340
+ drm_err(dev, "failed to load hibmc: %d\n", ret);
374341 goto err_disable;
375342 }
376343
377344 ret = drm_dev_register(dev, 0);
378345 if (ret) {
379
- DRM_ERROR("failed to register drv for userspace access: %d\n",
346
+ drm_err(dev, "failed to register drv for userspace access: %d\n",
380347 ret);
381348 goto err_unload;
382349 }
350
+
351
+ drm_fbdev_generic_setup(dev, dev->mode_config.preferred_depth);
352
+
383353 return 0;
384354
385355 err_unload:
....@@ -387,7 +357,7 @@
387357 err_disable:
388358 pci_disable_device(pdev);
389359 err_free:
390
- drm_dev_unref(dev);
360
+ drm_dev_put(dev);
391361
392362 return ret;
393363 }
....@@ -398,11 +368,10 @@
398368
399369 drm_dev_unregister(dev);
400370 hibmc_unload(dev);
401
- drm_dev_unref(dev);
402371 }
403372
404373 static struct pci_device_id hibmc_pci_table[] = {
405
- {0x19e5, 0x1711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
374
+ { PCI_VDEVICE(HUAWEI, 0x1711) },
406375 {0,}
407376 };
408377
....@@ -414,18 +383,7 @@
414383 .driver.pm = &hibmc_pm_ops,
415384 };
416385
417
-static int __init hibmc_init(void)
418
-{
419
- return pci_register_driver(&hibmc_pci_driver);
420
-}
421
-
422
-static void __exit hibmc_exit(void)
423
-{
424
- return pci_unregister_driver(&hibmc_pci_driver);
425
-}
426
-
427
-module_init(hibmc_init);
428
-module_exit(hibmc_exit);
386
+module_pci_driver(hibmc_pci_driver);
429387
430388 MODULE_DEVICE_TABLE(pci, hibmc_pci_table);
431389 MODULE_AUTHOR("RongrongZou <zourongrong@huawei.com>");