drm: sync solution from seabrook to kernel6.12 [1/1]

PD#SWPL-216053

Problem:
osd fail to alloc memory from heap-fb/heap-gfx,
so alloc memory from codec-mm

Solution:
1.set afbc_aligned_size is 1 in drm_dtsi file instead of drm code
2.osd alloc memory only from heap-fb/heap-gfx and
not alloc memory from codec-mm

Verify:
S7D

Test:
DRM-OSD-69

Change-Id: I08f964311e8d34cf91ae3e0f6e228b7d73247f57
Signed-off-by: linfang.zhao <linfang.zhao@amlogic.com>
This commit is contained in:
linfang.zhao
2025-06-30 02:16:54 +00:00
committed by gerrit autosubmit
parent a04ad3ea6d
commit 2910738b68
32 changed files with 41 additions and 47 deletions
@@ -92,6 +92,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -92,6 +92,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -67,6 +67,7 @@
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
gamma_ctl = <0>; /*0:skip gamma init 1:gamma init*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -69,6 +69,7 @@
gamma_ctl = <0>; /*0:skip gamma init 1:gamma init*/
pxp_mode = <0>;
gfcd_enable = /bits/ 8 <0>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -98,6 +98,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -59,6 +59,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -59,6 +59,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -61,6 +61,7 @@
osd_afbc_mask = <3>;
memory-region = <&logo_reserved>;
crtc_masks = <0 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -40,6 +40,8 @@
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
/* OSD1&OSD2 with afbc, OSD3 has no afbc */
osd_afbc_mask = <3>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
osd1_block: block@0 {
@@ -44,6 +44,7 @@
osd_afbc_mask = <3>;
memory-region = <&logo_reserved>;
crtc_masks = <0 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -67,6 +67,7 @@
crtcmask_of_osd = <0 0 0>; /* indicate the crtc mask of osd plane */
crtcmask_of_video = <0 0>; /* indicate the crtc mask of video plane */
crtc_masks = <1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -82,6 +82,8 @@
crtcmask_of_osd = <0 0 0>; /* indicate the crtc mask of osd plane */
crtcmask_of_video = <0 0>; /* indicate the crtc mask of video plane */
crtc_masks = <1 2 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
osd1_block: block@0 {
@@ -92,6 +92,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -93,6 +93,7 @@
panel2logo = <0 2 3>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -68,6 +68,8 @@
crtcmask_of_video = <0 0>; /* indicate the crtc mask of video plane */
logo_skip = <0>;
pref_mode = "2160p"; /* indicate support 4k UI of recovery system */
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
osd1_block: block@0 {
@@ -69,6 +69,7 @@
gamma_ctl = <0>; /*0:skip gamma init 1:gamma init*/
pxp_mode = <0>;
gfcd_enable = /bits/ 8 <1>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -74,6 +74,7 @@
gamma_ctl = <0>; /*0:skip gamma init 1:gamma init*/
pxp_mode = <0>;
gfcd_enable = /bits/ 8 <0>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -67,6 +67,7 @@
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
gamma_ctl = <0>; /*0:skip gamma init 1:gamma init*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -69,6 +69,7 @@
gamma_ctl = <0>; /*0:skip gamma init 1:gamma init*/
pxp_mode = <0>;
gfcd_enable = /bits/ 8 <0>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -98,6 +98,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -70,6 +70,8 @@
crtcmask_of_osd = <0 0>; /* indicate the crtc mask of osd plane */
crtcmask_of_video = <0 0>; /* indicate the crtc mask of video plane */
crtc_masks = <1 2 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
osd1_block: block@0 {
@@ -59,6 +59,7 @@
memory-region = <&logo_reserved>;
primary_plane_index = <0>; /* primary plane index for crtcs */
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -44,6 +44,7 @@
crtcmask_of_video = <0 0>; /* indicate the crtc mask of video plane */
logo_skip = <0>;
force_slice = <1>; /*1: enable force slice 0: disable force slice */
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -47,6 +47,7 @@
crtcmask_of_osd = <0 0 1>; /* indicate the crtc mask of osd plane */
crtcmask_of_video = <0 0>; /* indicate the crtc mask of video plane */
logo_skip = <0>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -61,6 +61,7 @@
osd_afbc_mask = <3>;
memory-region = <&logo_reserved>;
crtc_masks = <0 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -40,6 +40,7 @@
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
/* OSD1&OSD2 with afbc, OSD3 has no afbc */
osd_afbc_mask = <3>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -44,6 +44,7 @@
osd_afbc_mask = <3>;
memory-region = <&logo_reserved>;
crtc_masks = <0 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
@@ -90,6 +90,7 @@
crtcmask_of_osd = <0 0 1 2>; /* indicate the crtc mask of osd plane */
crtcmask_of_video = <0 1 2>; /* indicate the crtc mask of video plane */
vpu_block_select = <&vpu_blocks>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
/* 3 vpp output */
@@ -90,6 +90,7 @@
crtcmask_of_osd = <0 0 1 2>; /* indicate the crtc mask of osd plane */
crtcmask_of_video = <0 1 2>; /* indicate the crtc mask of video plane */
vpu_block_select = <&vpu_blocks>;
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
/* 3 vpp output */
@@ -63,6 +63,7 @@
crtc_masks = <1 1 1>; /*for encoder: 0:hdmi 1:lcd 2:cvbs*/
crtcmask_of_osd = <0 0 0>; /* indicate the crtc mask of osd plane */
crtcmask_of_video = <0 0>; /* indicate the crtc mask of video plane */
afbc_aligned_size = <1>; /*0:fbdev alloc non-afbc memory 1:fbdev alloc afbc memory*/
vpu_topology: vpu_topology {
vpu_blocks {
+6 -46
View File
@@ -27,38 +27,7 @@
#define uvm_to_gem_obj(x) container_of(x, struct am_meson_gem_object, ubo)
#define MESON_GEM_NAME "meson_gem"
#if (defined CONFIG_AMLOGIC_HEAP_CMA) || (defined CONFIG_AMLOGIC_HEAP_CODEC_MM)
static void zap_dma_buf_range(struct page *dma_page, unsigned long len)
{
struct page *page;
void *vaddr;
int num_pages = len / PAGE_SIZE;
if (PageHighMem(dma_page)) {
page = dma_page;
while (num_pages > 0) {
vaddr = kmap_atomic(page);
memset(vaddr, 0, PAGE_SIZE);
kunmap_atomic(vaddr);
/*
*Avoid wasting time zeroing memory if the process
*has been killed by SIGKILL
*/
if (fatal_signal_pending(current))
return;
page++;
num_pages--;
}
} else {
memset(page_address(dma_page), 0, PAGE_ALIGN(len));
}
}
#endif
static int am_meson_gem_alloc_ion_buff(struct am_meson_gem_object *
static int am_meson_gem_alloc_buff(struct am_meson_gem_object *
meson_gem_obj, int flags)
{
#if (defined CONFIG_AMLOGIC_HEAP_CMA) || (defined CONFIG_AMLOGIC_HEAP_CODEC_MM)
@@ -67,8 +36,7 @@ static int am_meson_gem_alloc_ion_buff(struct am_meson_gem_object *
struct dma_buf_attachment *attachment = NULL;
struct sg_table *sg_table = NULL;
struct page *page;
bool from_heap_codecmm = false;
char DMAHEAP[][20] = {"heap-fb", "heap-gfx", "heap-codecmm"};
char DMAHEAP[][20] = {"heap-fb", "heap-gfx"};
#endif
#ifdef CONFIG_AMLOGIC_ION_DEV
size_t len;
@@ -99,24 +67,19 @@ static int am_meson_gem_alloc_ion_buff(struct am_meson_gem_object *
#endif
} else if (((flags & (MESON_USE_SCANOUT | MESON_USE_CURSOR)) != 0) || flags == 0) {
#if (defined CONFIG_AMLOGIC_HEAP_CMA) || (defined CONFIG_AMLOGIC_HEAP_CODEC_MM)
for (i = 0; i < 3; i++) {
for (i = 0; i < 2; i++) {
heap = dma_heap_find(DMAHEAP[i]);
if (!IS_ERR_OR_NULL(heap)) {
dmabuf = dma_heap_buffer_alloc(heap, meson_gem_obj->base.size,
O_RDWR, DMA_HEAP_VALID_HEAP_FLAGS);
if (!IS_ERR_OR_NULL(dmabuf)) {
DRM_DEBUG("%s alloc success.\n", DMAHEAP[i]);
if (i == 2)
from_heap_codecmm = true;
meson_gem_obj->is_dma = true;
break;
} else {
DRM_DEBUG("%s:%s alloc fail\n", __func__, DMAHEAP[i]);
}
if (IS_ERR_OR_NULL(dmabuf) && i == 2)
DRM_ERROR("%s: dma_heap_alloc fail.\n", __func__);
} else {
DRM_DEBUG("%s: dma_heap_find %s fail.\n", __func__, DMAHEAP[i]);
if (i == 2)
DRM_ERROR("%s: dma_heap_find fail.\n", __func__);
}
}
DRM_DEBUG("%s: dmabuf(%p) dma_heap_alloc success. size = %zu\n",
@@ -218,9 +181,6 @@ static int am_meson_gem_alloc_ion_buff(struct am_meson_gem_object *
sg_dma_address(sg_table->sgl) = sg_phys(sg_table->sgl);
page = sg_page(sg_table->sgl);
if (from_heap_codecmm)
zap_dma_buf_range(page, meson_gem_obj->base.size);
dma_sync_sg_for_device(meson_gem_obj->base.dev->dev,
sg_table->sgl,
sg_table->nents,
@@ -722,7 +682,7 @@ struct am_meson_gem_object *am_meson_gem_object_create(struct drm_device *dev,
if ((flags & MESON_USE_VIDEO_PLANE) && (flags & MESON_USE_PROTECTED))
ret = am_meson_gem_alloc_video_secure_buff(meson_gem_obj);
else
ret = am_meson_gem_alloc_ion_buff(meson_gem_obj, flags);
ret = am_meson_gem_alloc_buff(meson_gem_obj, flags);
if (ret < 0) {
drm_gem_object_release(&meson_gem_obj->base);
goto error;
+1 -1
View File
@@ -66,7 +66,7 @@ static void meson_osd_parse_config(struct drm_device *dev, struct meson_of_conf
{
u32 osd_afbc_mask = 0xff;
u32 osd_force_slice = 0;
u32 afbc_aligned_size = 1;
u32 afbc_aligned_size = 0;
int ret;
ret = of_property_read_u32(dev->dev->of_node,