1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/aperture.h>
4 #include <linux/of_address.h>
6 #include <linux/platform_device.h>
8 #include <drm/drm_atomic.h>
9 #include <drm/drm_atomic_state_helper.h>
10 #include <drm/drm_client_setup.h>
11 #include <drm/drm_connector.h>
12 #include <drm/drm_damage_helper.h>
13 #include <drm/drm_device.h>
14 #include <drm/drm_drv.h>
15 #include <drm/drm_fbdev_shmem.h>
16 #include <drm/drm_format_helper.h>
17 #include <drm/drm_framebuffer.h>
18 #include <drm/drm_gem_atomic_helper.h>
19 #include <drm/drm_gem_framebuffer_helper.h>
20 #include <drm/drm_gem_shmem_helper.h>
21 #include <drm/drm_managed.h>
22 #include <drm/drm_modeset_helper_vtables.h>
23 #include <drm/drm_probe_helper.h>
24 #include <drm/drm_simple_kms_helper.h>
26 #define DRIVER_NAME "ofdrm"
27 #define DRIVER_DESC "DRM driver for OF platform devices"
28 #define DRIVER_DATE "20220501"
29 #define DRIVER_MAJOR 1
30 #define DRIVER_MINOR 0
32 #define PCI_VENDOR_ID_ATI_R520 0x7100
33 #define PCI_VENDOR_ID_ATI_R600 0x9400
35 #define OFDRM_GAMMA_LUT_SIZE 256
37 /* Definitions used by the Avivo palette */
38 #define AVIVO_DC_LUT_RW_SELECT 0x6480
39 #define AVIVO_DC_LUT_RW_MODE 0x6484
40 #define AVIVO_DC_LUT_RW_INDEX 0x6488
41 #define AVIVO_DC_LUT_SEQ_COLOR 0x648c
42 #define AVIVO_DC_LUT_PWL_DATA 0x6490
43 #define AVIVO_DC_LUT_30_COLOR 0x6494
44 #define AVIVO_DC_LUT_READ_PIPE_SELECT 0x6498
45 #define AVIVO_DC_LUT_WRITE_EN_MASK 0x649c
46 #define AVIVO_DC_LUT_AUTOFILL 0x64a0
47 #define AVIVO_DC_LUTA_CONTROL 0x64c0
48 #define AVIVO_DC_LUTA_BLACK_OFFSET_BLUE 0x64c4
49 #define AVIVO_DC_LUTA_BLACK_OFFSET_GREEN 0x64c8
50 #define AVIVO_DC_LUTA_BLACK_OFFSET_RED 0x64cc
51 #define AVIVO_DC_LUTA_WHITE_OFFSET_BLUE 0x64d0
52 #define AVIVO_DC_LUTA_WHITE_OFFSET_GREEN 0x64d4
53 #define AVIVO_DC_LUTA_WHITE_OFFSET_RED 0x64d8
54 #define AVIVO_DC_LUTB_CONTROL 0x6cc0
55 #define AVIVO_DC_LUTB_BLACK_OFFSET_BLUE 0x6cc4
56 #define AVIVO_DC_LUTB_BLACK_OFFSET_GREEN 0x6cc8
57 #define AVIVO_DC_LUTB_BLACK_OFFSET_RED 0x6ccc
58 #define AVIVO_DC_LUTB_WHITE_OFFSET_BLUE 0x6cd0
59 #define AVIVO_DC_LUTB_WHITE_OFFSET_GREEN 0x6cd4
60 #define AVIVO_DC_LUTB_WHITE_OFFSET_RED 0x6cd8
64 OFDRM_MODEL_MACH64
, /* ATI Mach64 */
65 OFDRM_MODEL_RAGE128
, /* ATI Rage128 */
66 OFDRM_MODEL_RAGE_M3A
, /* ATI Rage Mobility M3 Head A */
67 OFDRM_MODEL_RAGE_M3B
, /* ATI Rage Mobility M3 Head B */
68 OFDRM_MODEL_RADEON
, /* ATI Radeon */
69 OFDRM_MODEL_GXT2000
, /* IBM GXT2000 */
70 OFDRM_MODEL_AVIVO
, /* ATI R5xx */
71 OFDRM_MODEL_QEMU
, /* QEMU VGA */
75 * Helpers for display nodes
78 static int display_get_validated_int(struct drm_device
*dev
, const char *name
, uint32_t value
)
80 if (value
> INT_MAX
) {
81 drm_err(dev
, "invalid framebuffer %s of %u\n", name
, value
);
87 static int display_get_validated_int0(struct drm_device
*dev
, const char *name
, uint32_t value
)
90 drm_err(dev
, "invalid framebuffer %s of %u\n", name
, value
);
93 return display_get_validated_int(dev
, name
, value
);
96 static const struct drm_format_info
*display_get_validated_format(struct drm_device
*dev
,
97 u32 depth
, bool big_endian
)
99 const struct drm_format_info
*info
;
104 format
= drm_mode_legacy_fb_format(8, 8);
108 format
= drm_mode_legacy_fb_format(16, depth
);
111 format
= drm_mode_legacy_fb_format(32, 24);
114 drm_err(dev
, "unsupported framebuffer depth %u\n", depth
);
115 return ERR_PTR(-EINVAL
);
119 * DRM formats assume little-endian byte order. Update the format
120 * if the scanout buffer uses big-endian ordering.
124 case DRM_FORMAT_XRGB8888
:
125 format
= DRM_FORMAT_BGRX8888
;
127 case DRM_FORMAT_ARGB8888
:
128 format
= DRM_FORMAT_BGRA8888
;
130 case DRM_FORMAT_RGB565
:
131 format
= DRM_FORMAT_RGB565
| DRM_FORMAT_BIG_ENDIAN
;
133 case DRM_FORMAT_XRGB1555
:
134 format
= DRM_FORMAT_XRGB1555
| DRM_FORMAT_BIG_ENDIAN
;
141 info
= drm_format_info(format
);
143 drm_err(dev
, "cannot find framebuffer format for depth %u\n", depth
);
144 return ERR_PTR(-EINVAL
);
150 static int display_read_u32_of(struct drm_device
*dev
, struct device_node
*of_node
,
151 const char *name
, u32
*value
)
153 int ret
= of_property_read_u32(of_node
, name
, value
);
156 drm_err(dev
, "cannot parse framebuffer %s: error %d\n", name
, ret
);
160 static bool display_get_big_endian_of(struct drm_device
*dev
, struct device_node
*of_node
)
165 big_endian
= !of_property_read_bool(of_node
, "little-endian");
167 big_endian
= of_property_read_bool(of_node
, "big-endian");
173 static int display_get_width_of(struct drm_device
*dev
, struct device_node
*of_node
)
176 int ret
= display_read_u32_of(dev
, of_node
, "width", &width
);
180 return display_get_validated_int0(dev
, "width", width
);
183 static int display_get_height_of(struct drm_device
*dev
, struct device_node
*of_node
)
186 int ret
= display_read_u32_of(dev
, of_node
, "height", &height
);
190 return display_get_validated_int0(dev
, "height", height
);
193 static int display_get_depth_of(struct drm_device
*dev
, struct device_node
*of_node
)
196 int ret
= display_read_u32_of(dev
, of_node
, "depth", &depth
);
200 return display_get_validated_int0(dev
, "depth", depth
);
203 static int display_get_linebytes_of(struct drm_device
*dev
, struct device_node
*of_node
)
206 int ret
= display_read_u32_of(dev
, of_node
, "linebytes", &linebytes
);
210 return display_get_validated_int(dev
, "linebytes", linebytes
);
213 static u64
display_get_address_of(struct drm_device
*dev
, struct device_node
*of_node
)
219 * Not all devices provide an address property, it's not
220 * a bug if this fails. The driver will try to find the
221 * framebuffer base address from the device's memory regions.
223 ret
= of_property_read_u32(of_node
, "address", &address
);
230 static bool is_avivo(u32 vendor
, u32 device
)
232 /* This will match most R5xx */
233 return (vendor
== PCI_VENDOR_ID_ATI
) &&
234 ((device
>= PCI_VENDOR_ID_ATI_R520
&& device
< 0x7800) ||
235 (PCI_VENDOR_ID_ATI_R600
>= 0x9400));
238 static enum ofdrm_model
display_get_model_of(struct drm_device
*dev
, struct device_node
*of_node
)
240 enum ofdrm_model model
= OFDRM_MODEL_UNKNOWN
;
242 if (of_node_name_prefix(of_node
, "ATY,Rage128")) {
243 model
= OFDRM_MODEL_RAGE128
;
244 } else if (of_node_name_prefix(of_node
, "ATY,RageM3pA") ||
245 of_node_name_prefix(of_node
, "ATY,RageM3p12A")) {
246 model
= OFDRM_MODEL_RAGE_M3A
;
247 } else if (of_node_name_prefix(of_node
, "ATY,RageM3pB")) {
248 model
= OFDRM_MODEL_RAGE_M3B
;
249 } else if (of_node_name_prefix(of_node
, "ATY,Rage6")) {
250 model
= OFDRM_MODEL_RADEON
;
251 } else if (of_node_name_prefix(of_node
, "ATY,")) {
252 return OFDRM_MODEL_MACH64
;
253 } else if (of_device_is_compatible(of_node
, "pci1014,b7") ||
254 of_device_is_compatible(of_node
, "pci1014,21c")) {
255 model
= OFDRM_MODEL_GXT2000
;
256 } else if (of_node_name_prefix(of_node
, "vga,Display-")) {
257 struct device_node
*of_parent
;
258 const __be32
*vendor_p
, *device_p
;
260 /* Look for AVIVO initialized by SLOF */
261 of_parent
= of_get_parent(of_node
);
262 vendor_p
= of_get_property(of_parent
, "vendor-id", NULL
);
263 device_p
= of_get_property(of_parent
, "device-id", NULL
);
264 if (vendor_p
&& device_p
) {
265 u32 vendor
= be32_to_cpup(vendor_p
);
266 u32 device
= be32_to_cpup(device_p
);
268 if (is_avivo(vendor
, device
))
269 model
= OFDRM_MODEL_AVIVO
;
271 of_node_put(of_parent
);
272 } else if (of_device_is_compatible(of_node
, "qemu,std-vga")) {
273 model
= OFDRM_MODEL_QEMU
;
280 * Open Firmware display device
285 struct ofdrm_device_funcs
{
286 void __iomem
*(*cmap_ioremap
)(struct ofdrm_device
*odev
,
287 struct device_node
*of_node
,
289 void (*cmap_write
)(struct ofdrm_device
*odev
, unsigned char index
,
290 unsigned char r
, unsigned char g
, unsigned char b
);
293 struct ofdrm_device
{
294 struct drm_device dev
;
295 struct platform_device
*pdev
;
297 const struct ofdrm_device_funcs
*funcs
;
299 /* firmware-buffer settings */
300 struct iosys_map screen_base
;
301 struct drm_display_mode mode
;
302 const struct drm_format_info
*format
;
306 void __iomem
*cmap_base
;
310 struct drm_plane primary_plane
;
311 struct drm_crtc crtc
;
312 struct drm_encoder encoder
;
313 struct drm_connector connector
;
316 static struct ofdrm_device
*ofdrm_device_of_dev(struct drm_device
*dev
)
318 return container_of(dev
, struct ofdrm_device
, dev
);
325 #if defined(CONFIG_PCI)
326 static struct pci_dev
*display_get_pci_dev_of(struct drm_device
*dev
, struct device_node
*of_node
)
328 const __be32
*vendor_p
, *device_p
;
330 struct pci_dev
*pcidev
;
332 vendor_p
= of_get_property(of_node
, "vendor-id", NULL
);
334 return ERR_PTR(-ENODEV
);
335 vendor
= be32_to_cpup(vendor_p
);
337 device_p
= of_get_property(of_node
, "device-id", NULL
);
339 return ERR_PTR(-ENODEV
);
340 device
= be32_to_cpup(device_p
);
342 pcidev
= pci_get_device(vendor
, device
, NULL
);
344 return ERR_PTR(-ENODEV
);
349 static void ofdrm_pci_release(void *data
)
351 struct pci_dev
*pcidev
= data
;
353 pci_disable_device(pcidev
);
356 static int ofdrm_device_init_pci(struct ofdrm_device
*odev
)
358 struct drm_device
*dev
= &odev
->dev
;
359 struct platform_device
*pdev
= to_platform_device(dev
->dev
);
360 struct device_node
*of_node
= pdev
->dev
.of_node
;
361 struct pci_dev
*pcidev
;
365 * Never use pcim_ or other managed helpers on the returned PCI
366 * device. Otherwise, probing the native driver will fail for
367 * resource conflicts. PCI-device management has to be tied to
368 * the lifetime of the platform device until the native driver
371 pcidev
= display_get_pci_dev_of(dev
, of_node
);
373 return 0; /* no PCI device found; ignore the error */
375 ret
= pci_enable_device(pcidev
);
377 drm_err(dev
, "pci_enable_device(%s) failed: %d\n",
378 dev_name(&pcidev
->dev
), ret
);
381 ret
= devm_add_action_or_reset(&pdev
->dev
, ofdrm_pci_release
, pcidev
);
388 static int ofdrm_device_init_pci(struct ofdrm_device
*odev
)
395 * OF display settings
398 static struct resource
*ofdrm_find_fb_resource(struct ofdrm_device
*odev
,
399 struct resource
*fb_res
)
401 struct platform_device
*pdev
= to_platform_device(odev
->dev
.dev
);
402 struct resource
*res
, *max_res
= NULL
;
405 for (i
= 0; pdev
->num_resources
; ++i
) {
406 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, i
);
408 break; /* all resources processed */
409 if (resource_size(res
) < resource_size(fb_res
))
410 continue; /* resource too small */
411 if (fb_res
->start
&& resource_contains(res
, fb_res
))
412 return res
; /* resource contains framebuffer */
413 if (!max_res
|| resource_size(res
) > resource_size(max_res
))
414 max_res
= res
; /* store largest resource as fallback */
424 static void __iomem
*get_cmap_address_of(struct ofdrm_device
*odev
, struct device_node
*of_node
,
425 int bar_no
, unsigned long offset
, unsigned long size
)
427 struct drm_device
*dev
= &odev
->dev
;
428 const __be32
*addr_p
;
429 u64 max_size
, address
;
433 addr_p
= of_get_pci_address(of_node
, bar_no
, &max_size
, &flags
);
435 addr_p
= of_get_address(of_node
, bar_no
, &max_size
, &flags
);
437 return IOMEM_ERR_PTR(-ENODEV
);
439 if ((flags
& (IORESOURCE_IO
| IORESOURCE_MEM
)) == 0)
440 return IOMEM_ERR_PTR(-ENODEV
);
442 if ((offset
+ size
) >= max_size
)
443 return IOMEM_ERR_PTR(-ENODEV
);
445 address
= of_translate_address(of_node
, addr_p
);
446 if (address
== OF_BAD_ADDR
)
447 return IOMEM_ERR_PTR(-ENODEV
);
449 mem
= devm_ioremap(dev
->dev
, address
+ offset
, size
);
451 return IOMEM_ERR_PTR(-ENOMEM
);
456 static void __iomem
*ofdrm_mach64_cmap_ioremap(struct ofdrm_device
*odev
,
457 struct device_node
*of_node
,
460 struct drm_device
*dev
= &odev
->dev
;
462 void __iomem
*cmap_base
;
464 address
= fb_base
& 0xff000000ul
;
467 cmap_base
= devm_ioremap(dev
->dev
, address
, 0x1000);
469 return IOMEM_ERR_PTR(-ENOMEM
);
474 static void ofdrm_mach64_cmap_write(struct ofdrm_device
*odev
, unsigned char index
,
475 unsigned char r
, unsigned char g
, unsigned char b
)
477 void __iomem
*addr
= odev
->cmap_base
+ 0xcc0;
478 void __iomem
*data
= odev
->cmap_base
+ 0xcc0 + 1;
486 static void __iomem
*ofdrm_rage128_cmap_ioremap(struct ofdrm_device
*odev
,
487 struct device_node
*of_node
,
490 return get_cmap_address_of(odev
, of_node
, 2, 0, 0x1fff);
493 static void ofdrm_rage128_cmap_write(struct ofdrm_device
*odev
, unsigned char index
,
494 unsigned char r
, unsigned char g
, unsigned char b
)
496 void __iomem
*addr
= odev
->cmap_base
+ 0xb0;
497 void __iomem
*data
= odev
->cmap_base
+ 0xb4;
498 u32 color
= (r
<< 16) | (g
<< 8) | b
;
504 static void __iomem
*ofdrm_rage_m3a_cmap_ioremap(struct ofdrm_device
*odev
,
505 struct device_node
*of_node
,
508 return get_cmap_address_of(odev
, of_node
, 2, 0, 0x1fff);
511 static void ofdrm_rage_m3a_cmap_write(struct ofdrm_device
*odev
, unsigned char index
,
512 unsigned char r
, unsigned char g
, unsigned char b
)
514 void __iomem
*dac_ctl
= odev
->cmap_base
+ 0x58;
515 void __iomem
*addr
= odev
->cmap_base
+ 0xb0;
516 void __iomem
*data
= odev
->cmap_base
+ 0xb4;
517 u32 color
= (r
<< 16) | (g
<< 8) | b
;
520 /* Clear PALETTE_ACCESS_CNTL in DAC_CNTL */
521 val
= readl(dac_ctl
);
523 writel(val
, dac_ctl
);
525 /* Set color at palette index */
530 static void __iomem
*ofdrm_rage_m3b_cmap_ioremap(struct ofdrm_device
*odev
,
531 struct device_node
*of_node
,
534 return get_cmap_address_of(odev
, of_node
, 2, 0, 0x1fff);
537 static void ofdrm_rage_m3b_cmap_write(struct ofdrm_device
*odev
, unsigned char index
,
538 unsigned char r
, unsigned char g
, unsigned char b
)
540 void __iomem
*dac_ctl
= odev
->cmap_base
+ 0x58;
541 void __iomem
*addr
= odev
->cmap_base
+ 0xb0;
542 void __iomem
*data
= odev
->cmap_base
+ 0xb4;
543 u32 color
= (r
<< 16) | (g
<< 8) | b
;
546 /* Set PALETTE_ACCESS_CNTL in DAC_CNTL */
547 val
= readl(dac_ctl
);
549 writel(val
, dac_ctl
);
551 /* Set color at palette index */
556 static void __iomem
*ofdrm_radeon_cmap_ioremap(struct ofdrm_device
*odev
,
557 struct device_node
*of_node
,
560 return get_cmap_address_of(odev
, of_node
, 1, 0, 0x1fff);
563 static void __iomem
*ofdrm_gxt2000_cmap_ioremap(struct ofdrm_device
*odev
,
564 struct device_node
*of_node
,
567 return get_cmap_address_of(odev
, of_node
, 0, 0x6000, 0x1000);
570 static void ofdrm_gxt2000_cmap_write(struct ofdrm_device
*odev
, unsigned char index
,
571 unsigned char r
, unsigned char g
, unsigned char b
)
573 void __iomem
*data
= ((unsigned int __iomem
*)odev
->cmap_base
) + index
;
574 u32 color
= (r
<< 16) | (g
<< 8) | b
;
579 static void __iomem
*ofdrm_avivo_cmap_ioremap(struct ofdrm_device
*odev
,
580 struct device_node
*of_node
,
583 struct device_node
*of_parent
;
584 void __iomem
*cmap_base
;
586 of_parent
= of_get_parent(of_node
);
587 cmap_base
= get_cmap_address_of(odev
, of_parent
, 0, 0, 0x10000);
588 of_node_put(of_parent
);
593 static void ofdrm_avivo_cmap_write(struct ofdrm_device
*odev
, unsigned char index
,
594 unsigned char r
, unsigned char g
, unsigned char b
)
596 void __iomem
*lutsel
= odev
->cmap_base
+ AVIVO_DC_LUT_RW_SELECT
;
597 void __iomem
*addr
= odev
->cmap_base
+ AVIVO_DC_LUT_RW_INDEX
;
598 void __iomem
*data
= odev
->cmap_base
+ AVIVO_DC_LUT_30_COLOR
;
599 u32 color
= (r
<< 22) | (g
<< 12) | (b
<< 2);
601 /* Write to both LUTs for now */
612 static void __iomem
*ofdrm_qemu_cmap_ioremap(struct ofdrm_device
*odev
,
613 struct device_node
*of_node
,
616 static const __be32 io_of_addr
[3] = {
617 cpu_to_be32(0x01000000),
622 struct drm_device
*dev
= &odev
->dev
;
624 void __iomem
*cmap_base
;
626 address
= of_translate_address(of_node
, io_of_addr
);
627 if (address
== OF_BAD_ADDR
)
628 return IOMEM_ERR_PTR(-ENODEV
);
630 cmap_base
= devm_ioremap(dev
->dev
, address
+ 0x3c8, 2);
632 return IOMEM_ERR_PTR(-ENOMEM
);
637 static void ofdrm_qemu_cmap_write(struct ofdrm_device
*odev
, unsigned char index
,
638 unsigned char r
, unsigned char g
, unsigned char b
)
640 void __iomem
*addr
= odev
->cmap_base
;
641 void __iomem
*data
= odev
->cmap_base
+ 1;
649 static void ofdrm_device_set_gamma_linear(struct ofdrm_device
*odev
,
650 const struct drm_format_info
*format
)
652 struct drm_device
*dev
= &odev
->dev
;
655 switch (format
->format
) {
656 case DRM_FORMAT_RGB565
:
657 case DRM_FORMAT_RGB565
| DRM_FORMAT_BIG_ENDIAN
:
658 /* Use better interpolation, to take 32 values from 0 to 255 */
659 for (i
= 0; i
< OFDRM_GAMMA_LUT_SIZE
/ 8; i
++) {
660 unsigned char r
= i
* 8 + i
/ 4;
661 unsigned char g
= i
* 4 + i
/ 16;
662 unsigned char b
= i
* 8 + i
/ 4;
664 odev
->funcs
->cmap_write(odev
, i
, r
, g
, b
);
666 /* Green has one more bit, so add padding with 0 for red and blue. */
667 for (i
= OFDRM_GAMMA_LUT_SIZE
/ 8; i
< OFDRM_GAMMA_LUT_SIZE
/ 4; i
++) {
669 unsigned char g
= i
* 4 + i
/ 16;
672 odev
->funcs
->cmap_write(odev
, i
, r
, g
, b
);
675 case DRM_FORMAT_XRGB8888
:
676 case DRM_FORMAT_BGRX8888
:
677 for (i
= 0; i
< OFDRM_GAMMA_LUT_SIZE
; i
++)
678 odev
->funcs
->cmap_write(odev
, i
, i
, i
, i
);
681 drm_warn_once(dev
, "Unsupported format %p4cc for gamma correction\n",
687 static void ofdrm_device_set_gamma(struct ofdrm_device
*odev
,
688 const struct drm_format_info
*format
,
689 struct drm_color_lut
*lut
)
691 struct drm_device
*dev
= &odev
->dev
;
694 switch (format
->format
) {
695 case DRM_FORMAT_RGB565
:
696 case DRM_FORMAT_RGB565
| DRM_FORMAT_BIG_ENDIAN
:
697 /* Use better interpolation, to take 32 values from lut[0] to lut[255] */
698 for (i
= 0; i
< OFDRM_GAMMA_LUT_SIZE
/ 8; i
++) {
699 unsigned char r
= lut
[i
* 8 + i
/ 4].red
>> 8;
700 unsigned char g
= lut
[i
* 4 + i
/ 16].green
>> 8;
701 unsigned char b
= lut
[i
* 8 + i
/ 4].blue
>> 8;
703 odev
->funcs
->cmap_write(odev
, i
, r
, g
, b
);
705 /* Green has one more bit, so add padding with 0 for red and blue. */
706 for (i
= OFDRM_GAMMA_LUT_SIZE
/ 8; i
< OFDRM_GAMMA_LUT_SIZE
/ 4; i
++) {
708 unsigned char g
= lut
[i
* 4 + i
/ 16].green
>> 8;
711 odev
->funcs
->cmap_write(odev
, i
, r
, g
, b
);
714 case DRM_FORMAT_XRGB8888
:
715 case DRM_FORMAT_BGRX8888
:
716 for (i
= 0; i
< OFDRM_GAMMA_LUT_SIZE
; i
++) {
717 unsigned char r
= lut
[i
].red
>> 8;
718 unsigned char g
= lut
[i
].green
>> 8;
719 unsigned char b
= lut
[i
].blue
>> 8;
721 odev
->funcs
->cmap_write(odev
, i
, r
, g
, b
);
725 drm_warn_once(dev
, "Unsupported format %p4cc for gamma correction\n",
735 struct ofdrm_crtc_state
{
736 struct drm_crtc_state base
;
738 /* Primary-plane format; required for color mgmt. */
739 const struct drm_format_info
*format
;
742 static struct ofdrm_crtc_state
*to_ofdrm_crtc_state(struct drm_crtc_state
*base
)
744 return container_of(base
, struct ofdrm_crtc_state
, base
);
747 static void ofdrm_crtc_state_destroy(struct ofdrm_crtc_state
*ofdrm_crtc_state
)
749 __drm_atomic_helper_crtc_destroy_state(&ofdrm_crtc_state
->base
);
750 kfree(ofdrm_crtc_state
);
753 static const uint64_t ofdrm_primary_plane_format_modifiers
[] = {
754 DRM_FORMAT_MOD_LINEAR
,
755 DRM_FORMAT_MOD_INVALID
758 static int ofdrm_primary_plane_helper_atomic_check(struct drm_plane
*plane
,
759 struct drm_atomic_state
*new_state
)
761 struct drm_device
*dev
= plane
->dev
;
762 struct ofdrm_device
*odev
= ofdrm_device_of_dev(dev
);
763 struct drm_plane_state
*new_plane_state
= drm_atomic_get_new_plane_state(new_state
, plane
);
764 struct drm_shadow_plane_state
*new_shadow_plane_state
=
765 to_drm_shadow_plane_state(new_plane_state
);
766 struct drm_framebuffer
*new_fb
= new_plane_state
->fb
;
767 struct drm_crtc
*new_crtc
= new_plane_state
->crtc
;
768 struct drm_crtc_state
*new_crtc_state
= NULL
;
769 struct ofdrm_crtc_state
*new_ofdrm_crtc_state
;
773 new_crtc_state
= drm_atomic_get_new_crtc_state(new_state
, new_plane_state
->crtc
);
775 ret
= drm_atomic_helper_check_plane_state(new_plane_state
, new_crtc_state
,
776 DRM_PLANE_NO_SCALING
,
777 DRM_PLANE_NO_SCALING
,
781 else if (!new_plane_state
->visible
)
784 if (new_fb
->format
!= odev
->format
) {
787 /* format conversion necessary; reserve buffer */
788 buf
= drm_format_conv_state_reserve(&new_shadow_plane_state
->fmtcnv_state
,
789 odev
->pitch
, GFP_KERNEL
);
794 new_crtc_state
= drm_atomic_get_new_crtc_state(new_state
, new_plane_state
->crtc
);
796 new_ofdrm_crtc_state
= to_ofdrm_crtc_state(new_crtc_state
);
797 new_ofdrm_crtc_state
->format
= new_fb
->format
;
802 static void ofdrm_primary_plane_helper_atomic_update(struct drm_plane
*plane
,
803 struct drm_atomic_state
*state
)
805 struct drm_device
*dev
= plane
->dev
;
806 struct ofdrm_device
*odev
= ofdrm_device_of_dev(dev
);
807 struct drm_plane_state
*plane_state
= drm_atomic_get_new_plane_state(state
, plane
);
808 struct drm_plane_state
*old_plane_state
= drm_atomic_get_old_plane_state(state
, plane
);
809 struct drm_shadow_plane_state
*shadow_plane_state
= to_drm_shadow_plane_state(plane_state
);
810 struct drm_framebuffer
*fb
= plane_state
->fb
;
811 unsigned int dst_pitch
= odev
->pitch
;
812 const struct drm_format_info
*dst_format
= odev
->format
;
813 struct drm_atomic_helper_damage_iter iter
;
814 struct drm_rect damage
;
817 ret
= drm_gem_fb_begin_cpu_access(fb
, DMA_FROM_DEVICE
);
821 if (!drm_dev_enter(dev
, &idx
))
822 goto out_drm_gem_fb_end_cpu_access
;
824 drm_atomic_helper_damage_iter_init(&iter
, old_plane_state
, plane_state
);
825 drm_atomic_for_each_plane_damage(&iter
, &damage
) {
826 struct iosys_map dst
= odev
->screen_base
;
827 struct drm_rect dst_clip
= plane_state
->dst
;
829 if (!drm_rect_intersect(&dst_clip
, &damage
))
832 iosys_map_incr(&dst
, drm_fb_clip_offset(dst_pitch
, dst_format
, &dst_clip
));
833 drm_fb_blit(&dst
, &dst_pitch
, dst_format
->format
, shadow_plane_state
->data
, fb
,
834 &damage
, &shadow_plane_state
->fmtcnv_state
);
838 out_drm_gem_fb_end_cpu_access
:
839 drm_gem_fb_end_cpu_access(fb
, DMA_FROM_DEVICE
);
842 static void ofdrm_primary_plane_helper_atomic_disable(struct drm_plane
*plane
,
843 struct drm_atomic_state
*state
)
845 struct drm_device
*dev
= plane
->dev
;
846 struct ofdrm_device
*odev
= ofdrm_device_of_dev(dev
);
847 struct iosys_map dst
= odev
->screen_base
;
848 struct drm_plane_state
*plane_state
= drm_atomic_get_new_plane_state(state
, plane
);
849 void __iomem
*dst_vmap
= dst
.vaddr_iomem
; /* TODO: Use mapping abstraction */
850 unsigned int dst_pitch
= odev
->pitch
;
851 const struct drm_format_info
*dst_format
= odev
->format
;
852 struct drm_rect dst_clip
;
853 unsigned long lines
, linepixels
, i
;
856 drm_rect_init(&dst_clip
,
857 plane_state
->src_x
>> 16, plane_state
->src_y
>> 16,
858 plane_state
->src_w
>> 16, plane_state
->src_h
>> 16);
860 lines
= drm_rect_height(&dst_clip
);
861 linepixels
= drm_rect_width(&dst_clip
);
863 if (!drm_dev_enter(dev
, &idx
))
866 /* Clear buffer to black if disabled */
867 dst_vmap
+= drm_fb_clip_offset(dst_pitch
, dst_format
, &dst_clip
);
868 for (i
= 0; i
< lines
; ++i
) {
869 memset_io(dst_vmap
, 0, linepixels
* dst_format
->cpp
[0]);
870 dst_vmap
+= dst_pitch
;
876 static const struct drm_plane_helper_funcs ofdrm_primary_plane_helper_funcs
= {
877 DRM_GEM_SHADOW_PLANE_HELPER_FUNCS
,
878 .atomic_check
= ofdrm_primary_plane_helper_atomic_check
,
879 .atomic_update
= ofdrm_primary_plane_helper_atomic_update
,
880 .atomic_disable
= ofdrm_primary_plane_helper_atomic_disable
,
883 static const struct drm_plane_funcs ofdrm_primary_plane_funcs
= {
884 .update_plane
= drm_atomic_helper_update_plane
,
885 .disable_plane
= drm_atomic_helper_disable_plane
,
886 .destroy
= drm_plane_cleanup
,
887 DRM_GEM_SHADOW_PLANE_FUNCS
,
890 static enum drm_mode_status
ofdrm_crtc_helper_mode_valid(struct drm_crtc
*crtc
,
891 const struct drm_display_mode
*mode
)
893 struct ofdrm_device
*odev
= ofdrm_device_of_dev(crtc
->dev
);
895 return drm_crtc_helper_mode_valid_fixed(crtc
, mode
, &odev
->mode
);
898 static int ofdrm_crtc_helper_atomic_check(struct drm_crtc
*crtc
,
899 struct drm_atomic_state
*new_state
)
901 static const size_t gamma_lut_length
= OFDRM_GAMMA_LUT_SIZE
* sizeof(struct drm_color_lut
);
903 struct drm_device
*dev
= crtc
->dev
;
904 struct drm_crtc_state
*new_crtc_state
= drm_atomic_get_new_crtc_state(new_state
, crtc
);
907 if (!new_crtc_state
->enable
)
910 ret
= drm_atomic_helper_check_crtc_primary_plane(new_crtc_state
);
914 if (new_crtc_state
->color_mgmt_changed
) {
915 struct drm_property_blob
*gamma_lut
= new_crtc_state
->gamma_lut
;
917 if (gamma_lut
&& (gamma_lut
->length
!= gamma_lut_length
)) {
918 drm_dbg(dev
, "Incorrect gamma_lut length %zu\n", gamma_lut
->length
);
926 static void ofdrm_crtc_helper_atomic_flush(struct drm_crtc
*crtc
, struct drm_atomic_state
*state
)
928 struct ofdrm_device
*odev
= ofdrm_device_of_dev(crtc
->dev
);
929 struct drm_crtc_state
*crtc_state
= drm_atomic_get_new_crtc_state(state
, crtc
);
930 struct ofdrm_crtc_state
*ofdrm_crtc_state
= to_ofdrm_crtc_state(crtc_state
);
932 if (crtc_state
->enable
&& crtc_state
->color_mgmt_changed
) {
933 const struct drm_format_info
*format
= ofdrm_crtc_state
->format
;
935 if (crtc_state
->gamma_lut
)
936 ofdrm_device_set_gamma(odev
, format
, crtc_state
->gamma_lut
->data
);
938 ofdrm_device_set_gamma_linear(odev
, format
);
943 * The CRTC is always enabled. Screen updates are performed by
944 * the primary plane's atomic_update function. Disabling clears
945 * the screen in the primary plane's atomic_disable function.
947 static const struct drm_crtc_helper_funcs ofdrm_crtc_helper_funcs
= {
948 .mode_valid
= ofdrm_crtc_helper_mode_valid
,
949 .atomic_check
= ofdrm_crtc_helper_atomic_check
,
950 .atomic_flush
= ofdrm_crtc_helper_atomic_flush
,
953 static void ofdrm_crtc_reset(struct drm_crtc
*crtc
)
955 struct ofdrm_crtc_state
*ofdrm_crtc_state
=
956 kzalloc(sizeof(*ofdrm_crtc_state
), GFP_KERNEL
);
959 ofdrm_crtc_state_destroy(to_ofdrm_crtc_state(crtc
->state
));
961 if (ofdrm_crtc_state
)
962 __drm_atomic_helper_crtc_reset(crtc
, &ofdrm_crtc_state
->base
);
964 __drm_atomic_helper_crtc_reset(crtc
, NULL
);
967 static struct drm_crtc_state
*ofdrm_crtc_atomic_duplicate_state(struct drm_crtc
*crtc
)
969 struct drm_device
*dev
= crtc
->dev
;
970 struct drm_crtc_state
*crtc_state
= crtc
->state
;
971 struct ofdrm_crtc_state
*new_ofdrm_crtc_state
;
972 struct ofdrm_crtc_state
*ofdrm_crtc_state
;
974 if (drm_WARN_ON(dev
, !crtc_state
))
977 new_ofdrm_crtc_state
= kzalloc(sizeof(*new_ofdrm_crtc_state
), GFP_KERNEL
);
978 if (!new_ofdrm_crtc_state
)
981 ofdrm_crtc_state
= to_ofdrm_crtc_state(crtc_state
);
983 __drm_atomic_helper_crtc_duplicate_state(crtc
, &new_ofdrm_crtc_state
->base
);
984 new_ofdrm_crtc_state
->format
= ofdrm_crtc_state
->format
;
986 return &new_ofdrm_crtc_state
->base
;
989 static void ofdrm_crtc_atomic_destroy_state(struct drm_crtc
*crtc
,
990 struct drm_crtc_state
*crtc_state
)
992 ofdrm_crtc_state_destroy(to_ofdrm_crtc_state(crtc_state
));
995 static const struct drm_crtc_funcs ofdrm_crtc_funcs
= {
996 .reset
= ofdrm_crtc_reset
,
997 .destroy
= drm_crtc_cleanup
,
998 .set_config
= drm_atomic_helper_set_config
,
999 .page_flip
= drm_atomic_helper_page_flip
,
1000 .atomic_duplicate_state
= ofdrm_crtc_atomic_duplicate_state
,
1001 .atomic_destroy_state
= ofdrm_crtc_atomic_destroy_state
,
1004 static int ofdrm_connector_helper_get_modes(struct drm_connector
*connector
)
1006 struct ofdrm_device
*odev
= ofdrm_device_of_dev(connector
->dev
);
1008 return drm_connector_helper_get_modes_fixed(connector
, &odev
->mode
);
1011 static const struct drm_connector_helper_funcs ofdrm_connector_helper_funcs
= {
1012 .get_modes
= ofdrm_connector_helper_get_modes
,
1015 static const struct drm_connector_funcs ofdrm_connector_funcs
= {
1016 .reset
= drm_atomic_helper_connector_reset
,
1017 .fill_modes
= drm_helper_probe_single_connector_modes
,
1018 .destroy
= drm_connector_cleanup
,
1019 .atomic_duplicate_state
= drm_atomic_helper_connector_duplicate_state
,
1020 .atomic_destroy_state
= drm_atomic_helper_connector_destroy_state
,
1023 static const struct drm_mode_config_funcs ofdrm_mode_config_funcs
= {
1024 .fb_create
= drm_gem_fb_create_with_dirty
,
1025 .atomic_check
= drm_atomic_helper_check
,
1026 .atomic_commit
= drm_atomic_helper_commit
,
1033 static const struct ofdrm_device_funcs ofdrm_unknown_device_funcs
= {
1036 static const struct ofdrm_device_funcs ofdrm_mach64_device_funcs
= {
1037 .cmap_ioremap
= ofdrm_mach64_cmap_ioremap
,
1038 .cmap_write
= ofdrm_mach64_cmap_write
,
1041 static const struct ofdrm_device_funcs ofdrm_rage128_device_funcs
= {
1042 .cmap_ioremap
= ofdrm_rage128_cmap_ioremap
,
1043 .cmap_write
= ofdrm_rage128_cmap_write
,
1046 static const struct ofdrm_device_funcs ofdrm_rage_m3a_device_funcs
= {
1047 .cmap_ioremap
= ofdrm_rage_m3a_cmap_ioremap
,
1048 .cmap_write
= ofdrm_rage_m3a_cmap_write
,
1051 static const struct ofdrm_device_funcs ofdrm_rage_m3b_device_funcs
= {
1052 .cmap_ioremap
= ofdrm_rage_m3b_cmap_ioremap
,
1053 .cmap_write
= ofdrm_rage_m3b_cmap_write
,
1056 static const struct ofdrm_device_funcs ofdrm_radeon_device_funcs
= {
1057 .cmap_ioremap
= ofdrm_radeon_cmap_ioremap
,
1058 .cmap_write
= ofdrm_rage128_cmap_write
, /* same as Rage128 */
1061 static const struct ofdrm_device_funcs ofdrm_gxt2000_device_funcs
= {
1062 .cmap_ioremap
= ofdrm_gxt2000_cmap_ioremap
,
1063 .cmap_write
= ofdrm_gxt2000_cmap_write
,
1066 static const struct ofdrm_device_funcs ofdrm_avivo_device_funcs
= {
1067 .cmap_ioremap
= ofdrm_avivo_cmap_ioremap
,
1068 .cmap_write
= ofdrm_avivo_cmap_write
,
1071 static const struct ofdrm_device_funcs ofdrm_qemu_device_funcs
= {
1072 .cmap_ioremap
= ofdrm_qemu_cmap_ioremap
,
1073 .cmap_write
= ofdrm_qemu_cmap_write
,
1076 static struct drm_display_mode
ofdrm_mode(unsigned int width
, unsigned int height
)
1079 * Assume a monitor resolution of 96 dpi to
1080 * get a somewhat reasonable screen size.
1082 const struct drm_display_mode mode
= {
1083 DRM_MODE_INIT(60, width
, height
,
1084 DRM_MODE_RES_MM(width
, 96ul),
1085 DRM_MODE_RES_MM(height
, 96ul))
1091 static struct ofdrm_device
*ofdrm_device_create(struct drm_driver
*drv
,
1092 struct platform_device
*pdev
)
1094 struct device_node
*of_node
= pdev
->dev
.of_node
;
1095 struct ofdrm_device
*odev
;
1096 struct drm_device
*dev
;
1097 enum ofdrm_model model
;
1099 int width
, height
, depth
, linebytes
;
1100 const struct drm_format_info
*format
;
1102 resource_size_t fb_size
, fb_base
, fb_pgbase
, fb_pgsize
;
1103 struct resource
*res
, *mem
;
1104 void __iomem
*screen_base
;
1105 struct drm_plane
*primary_plane
;
1106 struct drm_crtc
*crtc
;
1107 struct drm_encoder
*encoder
;
1108 struct drm_connector
*connector
;
1109 unsigned long max_width
, max_height
;
1113 odev
= devm_drm_dev_alloc(&pdev
->dev
, drv
, struct ofdrm_device
, dev
);
1115 return ERR_CAST(odev
);
1117 platform_set_drvdata(pdev
, dev
);
1119 ret
= ofdrm_device_init_pci(odev
);
1121 return ERR_PTR(ret
);
1124 * OF display-node settings
1127 model
= display_get_model_of(dev
, of_node
);
1128 drm_dbg(dev
, "detected model %d\n", model
);
1131 case OFDRM_MODEL_UNKNOWN
:
1132 odev
->funcs
= &ofdrm_unknown_device_funcs
;
1134 case OFDRM_MODEL_MACH64
:
1135 odev
->funcs
= &ofdrm_mach64_device_funcs
;
1137 case OFDRM_MODEL_RAGE128
:
1138 odev
->funcs
= &ofdrm_rage128_device_funcs
;
1140 case OFDRM_MODEL_RAGE_M3A
:
1141 odev
->funcs
= &ofdrm_rage_m3a_device_funcs
;
1143 case OFDRM_MODEL_RAGE_M3B
:
1144 odev
->funcs
= &ofdrm_rage_m3b_device_funcs
;
1146 case OFDRM_MODEL_RADEON
:
1147 odev
->funcs
= &ofdrm_radeon_device_funcs
;
1149 case OFDRM_MODEL_GXT2000
:
1150 odev
->funcs
= &ofdrm_gxt2000_device_funcs
;
1152 case OFDRM_MODEL_AVIVO
:
1153 odev
->funcs
= &ofdrm_avivo_device_funcs
;
1155 case OFDRM_MODEL_QEMU
:
1156 odev
->funcs
= &ofdrm_qemu_device_funcs
;
1160 big_endian
= display_get_big_endian_of(dev
, of_node
);
1162 width
= display_get_width_of(dev
, of_node
);
1164 return ERR_PTR(width
);
1165 height
= display_get_height_of(dev
, of_node
);
1167 return ERR_PTR(height
);
1168 depth
= display_get_depth_of(dev
, of_node
);
1170 return ERR_PTR(depth
);
1171 linebytes
= display_get_linebytes_of(dev
, of_node
);
1173 return ERR_PTR(linebytes
);
1175 format
= display_get_validated_format(dev
, depth
, big_endian
);
1177 return ERR_CAST(format
);
1179 linebytes
= drm_format_info_min_pitch(format
, 0, width
);
1180 if (drm_WARN_ON(dev
, !linebytes
))
1181 return ERR_PTR(-EINVAL
);
1184 fb_size
= linebytes
* height
;
1187 * Try to figure out the address of the framebuffer. Unfortunately, Open
1188 * Firmware doesn't provide a standard way to do so. All we can do is a
1189 * dodgy heuristic that happens to work in practice.
1191 * On most machines, the "address" property contains what we need, though
1192 * not on Matrox cards found in IBM machines. What appears to give good
1193 * results is to go through the PCI ranges and pick one that encloses the
1194 * "address" property. If none match, we pick the largest.
1196 address
= display_get_address_of(dev
, of_node
);
1197 if (address
!= OF_BAD_ADDR
) {
1198 struct resource fb_res
= DEFINE_RES_MEM(address
, fb_size
);
1200 res
= ofdrm_find_fb_resource(odev
, &fb_res
);
1202 return ERR_PTR(-EINVAL
);
1203 if (resource_contains(res
, &fb_res
))
1206 fb_base
= res
->start
;
1208 struct resource fb_res
= DEFINE_RES_MEM(0u, fb_size
);
1210 res
= ofdrm_find_fb_resource(odev
, &fb_res
);
1212 return ERR_PTR(-EINVAL
);
1213 fb_base
= res
->start
;
1220 fb_pgbase
= round_down(fb_base
, PAGE_SIZE
);
1221 fb_pgsize
= fb_base
- fb_pgbase
+ round_up(fb_size
, PAGE_SIZE
);
1223 ret
= devm_aperture_acquire_for_platform_device(pdev
, fb_pgbase
, fb_pgsize
);
1225 drm_err(dev
, "could not acquire memory range %pr: error %d\n", &res
, ret
);
1226 return ERR_PTR(ret
);
1229 mem
= devm_request_mem_region(&pdev
->dev
, fb_pgbase
, fb_pgsize
, drv
->name
);
1231 drm_warn(dev
, "could not acquire memory region %pr\n", &res
);
1232 return ERR_PTR(-ENOMEM
);
1235 screen_base
= devm_ioremap(&pdev
->dev
, mem
->start
, resource_size(mem
));
1237 return ERR_PTR(-ENOMEM
);
1239 if (odev
->funcs
->cmap_ioremap
) {
1240 void __iomem
*cmap_base
= odev
->funcs
->cmap_ioremap(odev
, of_node
, fb_base
);
1242 if (IS_ERR(cmap_base
)) {
1243 /* Don't fail; continue without colormap */
1244 drm_warn(dev
, "could not find colormap: error %ld\n", PTR_ERR(cmap_base
));
1246 odev
->cmap_base
= cmap_base
;
1251 * Firmware framebuffer
1254 iosys_map_set_vaddr_iomem(&odev
->screen_base
, screen_base
);
1255 odev
->mode
= ofdrm_mode(width
, height
);
1256 odev
->format
= format
;
1257 odev
->pitch
= linebytes
;
1259 drm_dbg(dev
, "display mode={" DRM_MODE_FMT
"}\n", DRM_MODE_ARG(&odev
->mode
));
1260 drm_dbg(dev
, "framebuffer format=%p4cc, size=%dx%d, linebytes=%d byte\n",
1261 &format
->format
, width
, height
, linebytes
);
1264 * Mode-setting pipeline
1267 ret
= drmm_mode_config_init(dev
);
1269 return ERR_PTR(ret
);
1271 max_width
= max_t(unsigned long, width
, DRM_SHADOW_PLANE_MAX_WIDTH
);
1272 max_height
= max_t(unsigned long, height
, DRM_SHADOW_PLANE_MAX_HEIGHT
);
1274 dev
->mode_config
.min_width
= width
;
1275 dev
->mode_config
.max_width
= max_width
;
1276 dev
->mode_config
.min_height
= height
;
1277 dev
->mode_config
.max_height
= max_height
;
1278 dev
->mode_config
.funcs
= &ofdrm_mode_config_funcs
;
1279 dev
->mode_config
.preferred_depth
= format
->depth
;
1280 dev
->mode_config
.quirk_addfb_prefer_host_byte_order
= true;
1284 nformats
= drm_fb_build_fourcc_list(dev
, &format
->format
, 1,
1285 odev
->formats
, ARRAY_SIZE(odev
->formats
));
1287 primary_plane
= &odev
->primary_plane
;
1288 ret
= drm_universal_plane_init(dev
, primary_plane
, 0, &ofdrm_primary_plane_funcs
,
1289 odev
->formats
, nformats
,
1290 ofdrm_primary_plane_format_modifiers
,
1291 DRM_PLANE_TYPE_PRIMARY
, NULL
);
1293 return ERR_PTR(ret
);
1294 drm_plane_helper_add(primary_plane
, &ofdrm_primary_plane_helper_funcs
);
1295 drm_plane_enable_fb_damage_clips(primary_plane
);
1300 ret
= drm_crtc_init_with_planes(dev
, crtc
, primary_plane
, NULL
,
1301 &ofdrm_crtc_funcs
, NULL
);
1303 return ERR_PTR(ret
);
1304 drm_crtc_helper_add(crtc
, &ofdrm_crtc_helper_funcs
);
1306 if (odev
->cmap_base
) {
1307 drm_mode_crtc_set_gamma_size(crtc
, OFDRM_GAMMA_LUT_SIZE
);
1308 drm_crtc_enable_color_mgmt(crtc
, 0, false, OFDRM_GAMMA_LUT_SIZE
);
1313 encoder
= &odev
->encoder
;
1314 ret
= drm_simple_encoder_init(dev
, encoder
, DRM_MODE_ENCODER_NONE
);
1316 return ERR_PTR(ret
);
1317 encoder
->possible_crtcs
= drm_crtc_mask(crtc
);
1321 connector
= &odev
->connector
;
1322 ret
= drm_connector_init(dev
, connector
, &ofdrm_connector_funcs
,
1323 DRM_MODE_CONNECTOR_Unknown
);
1325 return ERR_PTR(ret
);
1326 drm_connector_helper_add(connector
, &ofdrm_connector_helper_funcs
);
1327 drm_connector_set_panel_orientation_with_quirk(connector
,
1328 DRM_MODE_PANEL_ORIENTATION_UNKNOWN
,
1331 ret
= drm_connector_attach_encoder(connector
, encoder
);
1333 return ERR_PTR(ret
);
1335 drm_mode_config_reset(dev
);
1344 DEFINE_DRM_GEM_FOPS(ofdrm_fops
);
1346 static struct drm_driver ofdrm_driver
= {
1347 DRM_GEM_SHMEM_DRIVER_OPS
,
1348 DRM_FBDEV_SHMEM_DRIVER_OPS
,
1349 .name
= DRIVER_NAME
,
1350 .desc
= DRIVER_DESC
,
1351 .date
= DRIVER_DATE
,
1352 .major
= DRIVER_MAJOR
,
1353 .minor
= DRIVER_MINOR
,
1354 .driver_features
= DRIVER_ATOMIC
| DRIVER_GEM
| DRIVER_MODESET
,
1355 .fops
= &ofdrm_fops
,
1362 static int ofdrm_probe(struct platform_device
*pdev
)
1364 struct ofdrm_device
*odev
;
1365 struct drm_device
*dev
;
1368 odev
= ofdrm_device_create(&ofdrm_driver
, pdev
);
1370 return PTR_ERR(odev
);
1373 ret
= drm_dev_register(dev
, 0);
1377 drm_client_setup(dev
, odev
->format
);
1382 static void ofdrm_remove(struct platform_device
*pdev
)
1384 struct drm_device
*dev
= platform_get_drvdata(pdev
);
1386 drm_dev_unplug(dev
);
1389 static const struct of_device_id ofdrm_of_match_display
[] = {
1390 { .compatible
= "display", },
1393 MODULE_DEVICE_TABLE(of
, ofdrm_of_match_display
);
1395 static struct platform_driver ofdrm_platform_driver
= {
1397 .name
= "of-display",
1398 .of_match_table
= ofdrm_of_match_display
,
1400 .probe
= ofdrm_probe
,
1401 .remove
= ofdrm_remove
,
1404 module_platform_driver(ofdrm_platform_driver
);
1406 MODULE_DESCRIPTION(DRIVER_DESC
);
1407 MODULE_LICENSE("GPL");