From: Jiyoung Jeong Date: Thu, 14 Mar 2019 15:00:01 +0000 (+0900) Subject: [RAMEN9610-19622] Save CP crash infomation when occured reset without dump X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=92dc4140ca366d09fde06c86683bdd5b974b36b7;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git [RAMEN9610-19622] Save CP crash infomation when occured reset without dump Change-Id: I2e087a78a4a33f8092b0d4b34d0e6dd70488f47d Signed-off-by: Jiyoung Jeong Signed-off-by: Kim Gunho --- diff --git a/drivers/misc/modem_if/modem_link_device_shmem.c b/drivers/misc/modem_if/modem_link_device_shmem.c index d83ed81d323f..527e63b99968 100644 --- a/drivers/misc/modem_if/modem_link_device_shmem.c +++ b/drivers/misc/modem_if/modem_link_device_shmem.c @@ -2360,6 +2360,66 @@ static void shmem_link_terminate(struct link_device *ld, struct io_device *iod) } } +static char *shmem_get_srinfo_address(struct link_device *ld) +{ + struct shmem_link_device *shmd = to_shmem_link_device(ld); + char *base = (u8 __iomem *)shmd->base + SHMEM_SRINFO_OFFSET; + + return base; +} + +static int shmem_ioctl(struct link_device *ld, struct io_device *iod, + unsigned int cmd, unsigned long arg) +{ + mif_err("%s: cmd 0x%08X\n", ld->name, cmd); + + switch (cmd) { + case IOCTL_MODEM_GET_SHMEM_SRINFO: + { + struct shmem_srinfo __user *sr_arg = + (struct shmem_srinfo __user *)arg; + unsigned count, size = SHMEM_SRINFO_SIZE; + + if (copy_from_user(&count, &sr_arg->size, sizeof(unsigned))) + return -EFAULT; + + mif_info("get srinfo:%s, size = %d\n", iod->name, count); + + size = min(size, count); + if (copy_to_user(&sr_arg->size, &size, sizeof(unsigned))) + return -EFAULT; + + if (copy_to_user(sr_arg->buf, shmem_get_srinfo_address(ld), + size)) + return -EFAULT; + break; + } + + case IOCTL_MODEM_SET_SHMEM_SRINFO: + { + struct shmem_srinfo __user *sr_arg = + (struct shmem_srinfo __user *)arg; + unsigned count, size = SHMEM_SRINFO_SIZE; + + if (copy_from_user(&count, &sr_arg->size, sizeof(unsigned))) + return -EFAULT; + + mif_info("set srinfo:%s, size = %d\n", iod->name, count); + + if (copy_from_user(shmem_get_srinfo_address(ld), sr_arg->buf, + min(count, size))) + return -EFAULT; + break; + } + + default: + mif_err("%s: ERR! invalid cmd 0x%08X\n", ld->name, cmd); + return -EINVAL; + } + + return 0; +} + static inline bool valid_bin_range(struct modem_data *modem, struct data_info *di) { u32 resmem_start, resmem_end; @@ -2837,7 +2897,6 @@ static const struct attribute_group napi_group = { \ .name = "napi", }; #endif /* CONFIG_LINK_DEVICE_NAPI */ - struct link_device *shmem_create_link_device(struct platform_device *pdev) { struct shmem_link_device *shmd = NULL; @@ -2878,6 +2937,9 @@ struct link_device *shmem_create_link_device(struct platform_device *pdev) ld->aligned = 1; ld->max_ipc_dev = MAX_EXYNOS_DEVICES; + /* Set up link device methods */ + ld->ioctl = shmem_ioctl; + /* Set attributes as a link device */ ld->terminate_comm = shmem_link_terminate; ld->send = shmem_send; diff --git a/drivers/misc/modem_if/modem_link_device_shmem.h b/drivers/misc/modem_if/modem_link_device_shmem.h index b65518ee9a1d..2586b7c53987 100644 --- a/drivers/misc/modem_if/modem_link_device_shmem.h +++ b/drivers/misc/modem_if/modem_link_device_shmem.h @@ -53,6 +53,9 @@ #define SHM_RX_MAX_QOS_TRIGGER_BYTES 6250000 /* Express 100Mbps as Bytes per 0.5ms */ #define SHM_RX_MIN_QOS_HOLD_MS 500 /* 500ms */ +#define SHMEM_SRINFO_OFFSET 0x800 /* 4KB - 2KB */ +#define SHMEM_SRINFO_SIZE 0x400 /* 1KB */ + #define TIMER_INTERVAL_NS 500000000 /* 500ms */ struct crash_reason { @@ -60,6 +63,11 @@ struct crash_reason { char string[MEM_CRASH_REASON_SIZE]; }; +struct shmem_srinfo { + unsigned int size; + char buf[0]; +}; + struct shmem_4mb_phys_map { u32 magic; u32 access; diff --git a/drivers/misc/modem_if/modem_prj.h b/drivers/misc/modem_if/modem_prj.h index 0bbf7f1d4fe3..4356cc426ba9 100644 --- a/drivers/misc/modem_if/modem_prj.h +++ b/drivers/misc/modem_if/modem_prj.h @@ -78,6 +78,9 @@ #define IOCTL_MODEM_XMIT_BOOT _IO('o', 0x40) #define IOCTL_MODEM_GET_SHMEM_INFO _IO('o', 0x41) +#define IOCTL_MODEM_GET_SHMEM_SRINFO _IO('o', 0x45) +#define IOCTL_MODEM_SET_SHMEM_SRINFO _IO('o', 0x46) + /* ioctl command for IPC Logger */ #define IOCTL_MIF_LOG_DUMP _IO('o', 0x51)