1
0
Fork 0

media: pxp device: fix kernel dump when run pxp_test

In 5.x, the first parameter of dma_alloc_coherent() can't be 0, otherwise
the following dump will arise when run the command:
`/unit_tests/Display/pxp_test.out -I "-o 1.yuv" '. This patch fixed this.
And also, use register_chrdev instead of misc_register to make it clean.

[   53.838653] Internal error: Oops: 17 [#1] SMP ARM
[   53.844538] Modules linked in:
[   53.847610] CPU: 0 PID: 754 Comm: pxp_test.out Not tainted 5.4.0-rc5-03564-g9792b86 #46
[   53.855620] Hardware name: Freescale i.MX6 SoloX (Device Tree)
[   53.861473] PC is at dma_alloc_attrs+0x10/0x114
[   53.866015] LR is at pxp_device_ioctl+0x90c/0xe98
[   53.870728] pc : [<c01bf1e8>]    lr : [<c05eb360>]    psr: a0070013
[   53.877001] sp : ed4e7e74  ip : 00000001  fp : b6591f9c
[   53.882232] r10: 00000000  r9 : e47efd40  r8 : ed4e7ecc
[   53.887463] r7 : ed508cc0  r6 : c1408b08  r5 : 00000000  r4 : 00000051
[   53.893997] r3 : 00000cc1  r2 : e47efd4c  r1 : 00055000  r0 : 00000240
[   53.900533] Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
[   53.907675] Control: 10c5387d  Table: ad14804a  DAC: 00000051
[   53.913428] Process pxp_test.out (pid: 754, stack limit = 0x(ptrval))
[   53.919878] Stack: (0xed4e7e74 to 0xed4e8000)
[   53.924245] 7e60:                                              00000051 b6591cf4 c1408b08
[   53.932434] 7e80: ed508cc0 ed4e7ecc e47efd40 00000000 b6591f9c c05eb360 00000000 c0605e08
[   53.940622] 7ea0: ed42ac00 c0607e3c 00000034 e47fe3c0 ed4e6000 00000034 c1408b08 c0605cc0
[   53.948810] 7ec0: ed4e7f78 00000000 ed4e6000 00000000 00054600 00000000 00000000 00000000
[   53.956998] 7ee0: c1408b08 0479b828 00000000 c1408b08 b6591cf4 e47fb640 c02b7b8c b6591cf4
[   53.965187] 7f00: ed4e6000 eca65e00 b6591f9c c02b71e0 c02c4bbc c0192be8 ec2dc380 c018dc54
[   53.973374] 7f20: c1408b08 00000001 00000000 0479b828 c15344fd 00000004 00004000 e47fb3c0
[   53.981562] 7f40: c15344fd c112a1d4 c110a05c c02c4bcc 00000000 00000000 c02c4aa8 00000000
[   53.989750] 7f60: e47fab41 0479b828 bee8aad0 e47fb641 e47fb640 00000004 c0145004 b6591cf4
[   53.997938] 7f80: ed4e6000 00000036 b6591f9c c02b7b8c b6591cf4 bee8aad0 b6591ce8 00000036
[   54.006125] 7fa0: c01011c4 c0101000 b6591cf4 bee8aad0 00000004 c0145004 b6591cf4 b6ee603c
[   54.014313] 7fc0: b6591cf4 bee8aad0 b6591ce8 00000036 00077858 00000000 bee8aad0 b6591f9c
[   54.022502] 7fe0: b6ee6018 b6591cac b6ed5848 b6e604bc 60070010 00000004 00000000 00000000
[   54.030699] [<c01bf1e8>] (dma_alloc_attrs) from [<00000034>] (0x34)
[   54.036981] Code: e92d4ff0 e1a05000 e2800d09 e59f60ec (e140a0d8)
[   54.043222] ---[ end trace d872f4c07e2464bf ]---

Signed-off-by: Robby Cai <robby.cai@nxp.com>
5.4-rM2-2.2.x-imx-squashed
Robby Cai 2019-10-30 22:40:23 +08:00 committed by Dong Aisheng
parent 3da8290b90
commit 3d64db930d
1 changed files with 48 additions and 15 deletions

View File

@ -3,7 +3,6 @@
* Copyright (C) 2010-2015 Freescale Semiconductor, Inc. All Rights Reserved.
*/
#include <linux/interrupt.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include <linux/fs.h>
#include <linux/slab.h>
@ -21,6 +20,9 @@
static struct pxp_buffer_hash bufhash;
static struct pxp_irq_info irq_info[NR_PXP_VIRT_CHANNEL];
static int major;
static struct class *pxp_class;
static struct device *pxp_dev;
static int pxp_ht_create(struct pxp_buffer_hash *hash, int order)
{
@ -214,7 +216,7 @@ static int pxp_channel_handle_delete(struct pxp_file *file_priv,
static int pxp_alloc_dma_buffer(struct pxp_buf_obj *obj)
{
obj->virtual = dma_alloc_coherent(NULL, PAGE_ALIGN(obj->size),
obj->virtual = dma_alloc_coherent(pxp_dev, PAGE_ALIGN(obj->size),
(dma_addr_t *) (&obj->offset),
GFP_DMA | GFP_KERNEL);
pr_debug("[ALLOC] mem alloc phys_addr = 0x%lx\n", obj->offset);
@ -230,7 +232,7 @@ static int pxp_alloc_dma_buffer(struct pxp_buf_obj *obj)
static void pxp_free_dma_buffer(struct pxp_buf_obj *obj)
{
if (obj->virtual != NULL) {
dma_free_coherent(0, PAGE_ALIGN(obj->size),
dma_free_coherent(pxp_dev, PAGE_ALIGN(obj->size),
obj->virtual, (dma_addr_t)obj->offset);
}
}
@ -834,31 +836,62 @@ static const struct file_operations pxp_device_fops = {
.mmap = pxp_device_mmap,
};
static struct miscdevice pxp_device_miscdev = {
.minor = MISC_DYNAMIC_MINOR,
.name = "pxp_device",
.fops = &pxp_device_fops,
};
int register_pxp_device(void)
{
int ret;
ret = misc_register(&pxp_device_miscdev);
if (ret)
return ret;
if (!major) {
major = register_chrdev(0, "pxp_device", &pxp_device_fops);
if (major < 0) {
printk(KERN_ERR "Unable to register pxp device\n");
ret = major;
goto register_cdev_fail;
}
pxp_class = class_create(THIS_MODULE, "pxp_device");
if (IS_ERR(pxp_class)) {
ret = PTR_ERR(pxp_class);
goto pxp_class_fail;
}
pxp_dev = device_create(pxp_class, NULL, MKDEV(major, 0),
NULL, "pxp_device");
if (IS_ERR(pxp_dev)) {
ret = PTR_ERR(pxp_dev);
goto dev_create_fail;
}
pxp_dev->dma_mask = kmalloc(sizeof(*pxp_dev->dma_mask),
GFP_KERNEL);
*pxp_dev->dma_mask = DMA_BIT_MASK(32);
pxp_dev->coherent_dma_mask = DMA_BIT_MASK(32);
}
ret = pxp_ht_create(&bufhash, BUFFER_HASH_ORDER);
if (ret)
return ret;
if (ret) {
goto ht_create_fail;
}
spin_lock_init(&(bufhash.hash_lock));
pr_debug("PxP_Device registered Successfully\n");
return 0;
ht_create_fail:
device_destroy(pxp_class, MKDEV(major, 0));
dev_create_fail:
class_destroy(pxp_class);
pxp_class_fail:
unregister_chrdev(major, "pxp_device");
register_cdev_fail:
return ret;
}
void unregister_pxp_device(void)
{
pxp_ht_destroy(&bufhash);
misc_deregister(&pxp_device_miscdev);
if (major) {
device_destroy(pxp_class, MKDEV(major, 0));
class_destroy(pxp_class);
unregister_chrdev(major, "pxp_device");
major = 0;
}
}