1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * drm kms/fb cma (contiguous memory allocator) helper functions
5 * Copyright (C) 2012 Analog Devices Inc.
6 * Author: Lars-Peter Clausen <lars@metafoo.de>
9 * Copyright (C) 2012 Red Hat
12 #include <drm/drm_fb_cma_helper.h>
13 #include <drm/drm_fourcc.h>
14 #include <drm/drm_framebuffer.h>
15 #include <drm/drm_gem_cma_helper.h>
16 #include <drm/drm_gem_framebuffer_helper.h>
17 #include <drm/drm_plane.h>
18 #include <linux/module.h>
21 * DOC: framebuffer cma helper functions
23 * Provides helper functions for creating a cma (contiguous memory allocator)
26 * drm_gem_fb_create() is used in the &drm_mode_config_funcs.fb_create
27 * callback function to create a cma backed framebuffer.
31 * drm_fb_cma_get_gem_obj() - Get CMA GEM object for framebuffer
32 * @fb: The framebuffer
35 * Return the CMA GEM object for given framebuffer.
37 * This function will usually be called from the CRTC callback functions.
39 struct drm_gem_cma_object
*drm_fb_cma_get_gem_obj(struct drm_framebuffer
*fb
,
42 struct drm_gem_object
*gem
;
44 gem
= drm_gem_fb_get_obj(fb
, plane
);
48 return to_drm_gem_cma_obj(gem
);
50 EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_obj
);
53 * drm_fb_cma_get_gem_addr() - Get physical address for framebuffer, for pixel
54 * formats where values are grouped in blocks this will get you the beginning of
56 * @fb: The framebuffer
57 * @state: Which state of drm plane
59 * Return the CMA GEM address for given framebuffer.
61 * This function will usually be called from the PLANE callback functions.
63 dma_addr_t
drm_fb_cma_get_gem_addr(struct drm_framebuffer
*fb
,
64 struct drm_plane_state
*state
,
67 struct drm_gem_cma_object
*obj
;
69 u8 h_div
= 1, v_div
= 1;
70 u32 block_w
= drm_format_info_block_width(fb
->format
, plane
);
71 u32 block_h
= drm_format_info_block_height(fb
->format
, plane
);
72 u32 block_size
= fb
->format
->char_per_block
[plane
];
78 obj
= drm_fb_cma_get_gem_obj(fb
, plane
);
82 paddr
= obj
->paddr
+ fb
->offsets
[plane
];
85 h_div
= fb
->format
->hsub
;
86 v_div
= fb
->format
->vsub
;
89 sample_x
= (state
->src_x
>> 16) / h_div
;
90 sample_y
= (state
->src_y
>> 16) / v_div
;
91 block_start_y
= (sample_y
/ block_h
) * block_h
;
92 num_hblocks
= sample_x
/ block_w
;
94 paddr
+= fb
->pitches
[plane
] * block_start_y
;
95 paddr
+= block_size
* num_hblocks
;
99 EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_addr
);