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
parent
3da8290b90
commit
3d64db930d
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue