diff --git a/drivers/misc/mods/mods.dts b/drivers/misc/mods/mods.dts index 21950a06..673eeaf1 100644 --- a/drivers/misc/mods/mods.dts +++ b/drivers/misc/mods/mods.dts @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods.dts - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2015-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2015-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, diff --git a/drivers/misc/mods/mods.h b/drivers/misc/mods/mods.h index b8503e4e..adb43beb 100644 --- a/drivers/misc/mods/mods.h +++ b/drivers/misc/mods/mods.h @@ -1,8 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * mods_internal.h - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2020-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, @@ -18,8 +18,4 @@ * If not, see . */ -/* Note: the original mods.h which contains ioctls is located in - * include/uapi/misc/mods.h. - */ - #include diff --git a/drivers/misc/mods/mods_acpi.c b/drivers/misc/mods/mods_acpi.c index e43ae78e..f73189ee 100644 --- a/drivers/misc/mods/mods_acpi.c +++ b/drivers/misc/mods/mods_acpi.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_acpi.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved. * @@ -579,7 +579,7 @@ static int mods_acpi_get_ddc(struct mods_client *client, int esc_mods_eval_acpi_method(struct mods_client *client, struct MODS_EVAL_ACPI_METHOD *p) { - return mods_eval_acpi_method(client, p, 0, ACPI_MODS_IGNORE_ACPI_ID); + return mods_eval_acpi_method(client, p, NULL, ACPI_MODS_IGNORE_ACPI_ID); } int esc_mods_eval_dev_acpi_method_3(struct mods_client *client, diff --git a/drivers/misc/mods/mods_adsp.c b/drivers/misc/mods/mods_adsp.c index 34258f53..2e78d504 100644 --- a/drivers/misc/mods/mods_adsp.c +++ b/drivers/misc/mods/mods_adsp.c @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_adsp.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2014-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, diff --git a/drivers/misc/mods/mods_clock.c b/drivers/misc/mods/mods_clock.c index 61a9dc7b..96784965 100644 --- a/drivers/misc/mods/mods_clock.c +++ b/drivers/misc/mods/mods_clock.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_clock.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2011-2022, NVIDIA CORPORATION. All rights reserved. * @@ -70,8 +70,8 @@ static struct device_node *find_clocks_node(const char *name) void mods_init_clock_api(void) { const char *okay_value = "okay"; - struct device_node *mods_np = 0; - struct property *pp = 0; + struct device_node *mods_np = NULL; + struct property *pp = NULL; int size_value = 0; mods_np = find_clocks_node("mods-clocks"); @@ -137,7 +137,7 @@ static u32 mods_get_clock_handle(struct clk *pclk) { struct list_head *head = &mods_clock_handles; struct list_head *iter; - struct clock_entry *entry = 0; + struct clock_entry *entry = NULL; u32 handle = 0; spin_lock(&mods_clock_lock); @@ -171,7 +171,7 @@ static struct clk *mods_get_clock(u32 handle) { struct list_head *head = &mods_clock_handles; struct list_head *iter = NULL; - struct clk *pclk = 0; + struct clk *pclk = NULL; spin_lock(&mods_clock_lock); @@ -247,11 +247,11 @@ failed: int esc_mods_get_clock_handle(struct mods_client *client, struct MODS_GET_CLOCK_HANDLE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; - struct device_node *mods_np = 0; - struct property *pp = 0; + struct device_node *mods_np = NULL; + struct property *pp = NULL; LOG_ENT(); @@ -337,7 +337,7 @@ err: int esc_mods_set_clock_rate(struct mods_client *client, struct MODS_CLOCK_RATE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -367,7 +367,7 @@ int esc_mods_set_clock_rate(struct mods_client *client, int esc_mods_get_clock_rate(struct mods_client *client, struct MODS_CLOCK_RATE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -391,7 +391,7 @@ int esc_mods_get_clock_rate(struct mods_client *client, int esc_mods_get_clock_max_rate(struct mods_client *client, struct MODS_CLOCK_RATE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -417,7 +417,7 @@ int esc_mods_get_clock_max_rate(struct mods_client *client, int esc_mods_set_clock_max_rate(struct mods_client *client, struct MODS_CLOCK_RATE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -453,8 +453,8 @@ int esc_mods_set_clock_max_rate(struct mods_client *client, int esc_mods_set_clock_parent(struct mods_client *client, struct MODS_CLOCK_PARENT *p) { - struct clk *pclk = 0; - struct clk *pparent = 0; + struct clk *pclk = NULL; + struct clk *pparent = NULL; int ret = -EINVAL; LOG_ENT(); @@ -487,7 +487,7 @@ int esc_mods_set_clock_parent(struct mods_client *client, int esc_mods_get_clock_parent(struct mods_client *client, struct MODS_CLOCK_PARENT *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -513,7 +513,7 @@ int esc_mods_get_clock_parent(struct mods_client *client, int esc_mods_enable_clock(struct mods_client *client, struct MODS_CLOCK_HANDLE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -546,7 +546,7 @@ int esc_mods_enable_clock(struct mods_client *client, int esc_mods_disable_clock(struct mods_client *client, struct MODS_CLOCK_HANDLE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -570,7 +570,7 @@ int esc_mods_disable_clock(struct mods_client *client, int esc_mods_is_clock_enabled(struct mods_client *client, struct MODS_CLOCK_ENABLED *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -632,7 +632,7 @@ error: int esc_mods_clock_reset_assert(struct mods_client *client, struct MODS_CLOCK_HANDLE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -642,10 +642,10 @@ int esc_mods_clock_reset_assert(struct mods_client *client, if (!pclk) { cl_error("unrecognized clock handle: 0x%x\n", p->clock_handle); } else { - const char *clk_name = 0; - struct reset_control *prst = 0; - struct device_node *mods_np = 0; - struct property *pp = 0; + const char *clk_name = NULL; + struct reset_control *prst = NULL; + struct device_node *mods_np = NULL; + struct property *pp = NULL; mods_np = find_clocks_node("mods-clocks"); if (!mods_np || !of_device_is_available(mods_np)) { @@ -685,7 +685,7 @@ err: int esc_mods_clock_reset_deassert(struct mods_client *client, struct MODS_CLOCK_HANDLE *p) { - struct clk *pclk = 0; + struct clk *pclk = NULL; int ret = -EINVAL; LOG_ENT(); @@ -695,10 +695,10 @@ int esc_mods_clock_reset_deassert(struct mods_client *client, if (!pclk) { cl_error("unrecognized clock handle: 0x%x\n", p->clock_handle); } else { - const char *clk_name = 0; - struct reset_control *prst = 0; - struct device_node *mods_np = 0; - struct property *pp = 0; + const char *clk_name = NULL; + struct reset_control *prst = NULL; + struct device_node *mods_np = NULL; + struct property *pp = NULL; mods_np = find_clocks_node("mods-clocks"); if (!mods_np || !of_device_is_available(mods_np)) { diff --git a/drivers/misc/mods/mods_config.h b/drivers/misc/mods/mods_config.h index 4024f8b4..2b2bffb7 100644 --- a/drivers/misc/mods/mods_config.h +++ b/drivers/misc/mods/mods_config.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * mods_config.h - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved. * @@ -24,8 +24,8 @@ #define MODS_KERNEL_VERSION LINUX_VERSION_CODE #if KERNEL_VERSION(2, 6, 30) <= MODS_KERNEL_VERSION && \ - KERNEL_VERSION(4, 16, 0) > MODS_KERNEL_VERSION && \ - defined(CONFIG_X86) + KERNEL_VERSION(4, 16, 0) > MODS_KERNEL_VERSION && \ + defined(CONFIG_X86) # define MODS_HAS_DMA_OPS 1 #endif @@ -65,7 +65,7 @@ #endif #if KERNEL_VERSION(3, 16, 0) <= MODS_KERNEL_VERSION && \ - defined(CONFIG_VT_HW_CONSOLE_BINDING) + defined(CONFIG_VT_HW_CONSOLE_BINDING) # define MODS_HAS_CONSOLE_BINDING 1 #endif @@ -74,8 +74,8 @@ #endif #if KERNEL_VERSION(4, 12, 0) <= MODS_KERNEL_VERSION && \ - KERNEL_VERSION(4, 13, 0) > MODS_KERNEL_VERSION && \ - defined(CONFIG_X86) + KERNEL_VERSION(4, 13, 0) > MODS_KERNEL_VERSION && \ + defined(CONFIG_X86) # define MODS_HAS_ASM_SET_MEMORY_HEADER 1 #endif @@ -88,6 +88,10 @@ # define MODS_HAS_KERNEL_WRITE #endif +#if KERNEL_VERSION(4, 16, 0) <= MODS_KERNEL_VERSION +# define MODS_HAS_POLL_T 1 +#endif + #if KERNEL_VERSION(4, 17, 0) <= MODS_KERNEL_VERSION # define MODS_PCIE_FLR_HAS_ERR #endif diff --git a/drivers/misc/mods/mods_debugfs.c b/drivers/misc/mods/mods_debugfs.c index 4c16d83d..8177a3a0 100644 --- a/drivers/misc/mods/mods_debugfs.c +++ b/drivers/misc/mods/mods_debugfs.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_debugfs.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved. * @@ -606,14 +606,14 @@ int mods_create_debugfs(struct miscdevice *modsdev) #endif retval = debugfs_create_file("debug", 0644, - mods_debugfs_dir, 0, &mods_debug_fops); + mods_debugfs_dir, NULL, &mods_debug_fops); if (IS_ERR(retval)) { err = -EIO; goto remove_out; } retval = debugfs_create_file("multi_instance", 0644, - mods_debugfs_dir, 0, &mods_mi_fops); + mods_debugfs_dir, NULL, &mods_mi_fops); if (IS_ERR(retval)) { err = -EIO; goto remove_out; @@ -621,7 +621,7 @@ int mods_create_debugfs(struct miscdevice *modsdev) #if defined(MODS_HAS_TEGRA) && defined(CONFIG_TEGRA_KFUSE) retval = debugfs_create_file("kfuse_data", 0444, - mods_debugfs_dir, 0, &mods_kfuse_fops); + mods_debugfs_dir, NULL, &mods_kfuse_fops); if (IS_ERR(retval)) { err = -EIO; goto remove_out; diff --git a/drivers/misc/mods/mods_dma.c b/drivers/misc/mods/mods_dma.c index b63b1664..4e2a9bdd 100644 --- a/drivers/misc/mods/mods_dma.c +++ b/drivers/misc/mods/mods_dma.c @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_dma.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2017-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2017-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, @@ -35,7 +35,7 @@ static DECLARE_BITMAP(dma_info_mask, MODS_DMA_MAX_CHANNEL); static struct mods_dma_chan_info dma_info_chan_list[MODS_DMA_MAX_CHANNEL]; static DEFINE_SPINLOCK(dma_info_lock); -int mods_get_dma_id(u32 *p_id) +static int mods_get_dma_id(u32 *p_id) { u32 id; @@ -52,14 +52,14 @@ int mods_get_dma_id(u32 *p_id) return OK; } -void mods_release_dma_id(u32 id) +static void mods_release_dma_id(u32 id) { spin_lock(&dma_info_lock); clear_bit(id, dma_info_mask); spin_unlock(&dma_info_lock); } -int mods_get_chan_by_id(u32 id, struct mods_dma_chan_info **p_dma_chan) +static int mods_get_chan_by_id(u32 id, struct mods_dma_chan_info **p_dma_chan) { if (id > MODS_DMA_MAX_CHANNEL) return -ERANGE; @@ -69,7 +69,7 @@ int mods_get_chan_by_id(u32 id, struct mods_dma_chan_info **p_dma_chan) return OK; } -int mods_init_dma(void) +void mods_init_dma(void) { struct mods_dma_chan_info *p_chan_info; int i; @@ -79,14 +79,12 @@ int mods_init_dma(void) rwlock_init(&(p_chan_info->lock)); p_chan_info->in_use = false; } - - return OK; } -void mods_release_channel(u32 id) +static void mods_release_channel(u32 id) { struct mods_dma_chan_info *p_mods_chan; - struct dma_chan *pch = 0; + struct dma_chan *pch = NULL; if (mods_get_chan_by_id(id, &p_mods_chan) != OK) { mods_error_printk("get dma channel failed, id %d\n", id); @@ -117,7 +115,7 @@ void mods_exit_dma(void) mods_release_channel(i); } -bool mods_chan_is_inuse(struct mods_dma_chan_info *p_mods_chan) +static bool mods_chan_is_inuse(struct mods_dma_chan_info *p_mods_chan) { bool in_use = false; @@ -129,8 +127,8 @@ bool mods_chan_is_inuse(struct mods_dma_chan_info *p_mods_chan) return in_use; } -int mods_get_inuse_chan_by_handle(struct MODS_DMA_HANDLE *p_handle, - struct mods_dma_chan_info **p_mods_chan) +static int mods_get_inuse_chan_by_handle(struct MODS_DMA_HANDLE *p_handle, + struct mods_dma_chan_info **p_mods_chan) { int ret; bool in_use; @@ -153,8 +151,8 @@ int mods_get_inuse_chan_by_handle(struct MODS_DMA_HANDLE *p_handle, return OK; } -int mods_dma_sync_wait(struct MODS_DMA_HANDLE *p_handle, - mods_dma_cookie_t cookie) +static int mods_dma_sync_wait(struct MODS_DMA_HANDLE *p_handle, + mods_dma_cookie_t cookie) { int ret = OK; struct mods_dma_chan_info *p_mods_chan; @@ -173,9 +171,9 @@ int mods_dma_sync_wait(struct MODS_DMA_HANDLE *p_handle, return ret; } -int mods_dma_async_is_tx_complete(struct MODS_DMA_HANDLE *p_handle, - mods_dma_cookie_t cookie, - __u32 *p_is_complete) +static int mods_dma_async_is_tx_complete(struct MODS_DMA_HANDLE *p_handle, + mods_dma_cookie_t cookie, + __u32 *p_is_complete) { int ret = OK; struct mods_dma_chan_info *p_mods_chan; @@ -486,9 +484,9 @@ int esc_mods_dma_copy_to_user(struct mods_client *client, (void *)(p->memory_handle_src), p->num_bytes); - retval = copy_to_user((void *)(p->memory_handle_dst), - (void *)(p->memory_handle_src), - p->num_bytes); + retval = copy_to_user((void __user *)p->memory_handle_dst, + (void *)p->memory_handle_src, + p->num_bytes); LOG_EXT(); diff --git a/drivers/misc/mods/mods_dmabuf.c b/drivers/misc/mods/mods_dmabuf.c index f632869b..b55ab093 100644 --- a/drivers/misc/mods/mods_dmabuf.c +++ b/drivers/misc/mods/mods_dmabuf.c @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_dmabuf.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2014-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, diff --git a/drivers/misc/mods/mods_internal.h b/drivers/misc/mods/mods_internal.h index 71df031e..a7eface5 100644 --- a/drivers/misc/mods/mods_internal.h +++ b/drivers/misc/mods/mods_internal.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * mods_internal.h - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved. * @@ -306,24 +306,24 @@ struct NVL_TRAINED { pr_notice("mods [%u] warning: " fmt, client->client_id, ##args) struct irq_mask_info { - u32 *dev_irq_mask_reg; /*IRQ mask register, read-only reg*/ - u32 *dev_irq_state; /* IRQ status register*/ - u32 *dev_irq_disable_reg; /* potentionally a write-only reg*/ - u64 irq_and_mask; - u64 irq_or_mask; - u8 mask_type; + void __iomem *dev_irq_mask_reg; /*IRQ mask register, read-only reg*/ + void __iomem *dev_irq_state; /* IRQ status register*/ + void __iomem *dev_irq_disable_reg; /* potentionally a write-only reg*/ + u64 irq_and_mask; + u64 irq_or_mask; + u8 mask_type; }; struct dev_irq_map { - void *dev_irq_aperture; - u32 apic_irq; - u32 entry; - u8 type; - u8 client_id; - u8 mask_info_cnt; - struct irq_mask_info mask_info[MODS_IRQ_MAX_MASKS]; - struct pci_dev *dev; - struct list_head list; + u8 __iomem *dev_irq_aperture; + u32 apic_irq; + u32 entry; + u8 type; + u8 client_id; + u8 mask_info_cnt; + struct irq_mask_info mask_info[MODS_IRQ_MAX_MASKS]; + struct pci_dev *dev; + struct list_head list; }; struct mods_priv { @@ -337,6 +337,12 @@ struct mods_priv { struct mutex mtx; }; +#ifdef MODS_HAS_POLL_T +# define POLL_TYPE __poll_t +#else +# define POLL_TYPE unsigned int +#endif + #if ((defined(CONFIG_ARM) || defined(CONFIG_ARM64)) && \ !defined(CONFIG_CPA)) || defined(CONFIG_PPC64) # define MODS_SET_MEMORY_UC(addr, pages) 0 @@ -397,7 +403,7 @@ struct mutex *mods_get_irq_mutex(void); struct mods_client *mods_alloc_client(void); void mods_free_client_interrupts(struct mods_client *client); void mods_free_client(u8 client_id); -int mods_irq_event_check(u8 client_id); +POLL_TYPE mods_irq_event_check(u8 client_id); /* mem */ const char *mods_get_prot_str(u8 mem_type); @@ -643,6 +649,8 @@ int esc_mods_oist_status(struct mods_client *client, struct MODS_TEGRA_OIST_STATUS *p); #ifdef CONFIG_DMA_ENGINE +void mods_init_dma(void); +void mods_exit_dma(void); int esc_mods_dma_request_channel(struct mods_client *client, struct MODS_DMA_HANDLE *p); int esc_mods_dma_release_channel(struct mods_client *client, diff --git a/drivers/misc/mods/mods_irq.c b/drivers/misc/mods/mods_irq.c index 4eff6f9a..96ebf4d6 100644 --- a/drivers/misc/mods/mods_irq.c +++ b/drivers/misc/mods/mods_irq.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_irq.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved. * @@ -152,9 +152,42 @@ static unsigned int get_cur_time(void) return jiffies_to_usecs(jiffies); } -static inline int mods_check_interrupt(struct dev_irq_map *t) +static u64 irq_reg_read(const struct irq_mask_info *m, void __iomem *reg) { - int ii = 0; + if (m->mask_type == MODS_MASK_TYPE_IRQ_DISABLE64) + return readq(reg); + else + return readl(reg); +} + +static void irq_reg_write(const struct irq_mask_info *m, + u64 value, + void __iomem *reg) +{ + if (m->mask_type == MODS_MASK_TYPE_IRQ_DISABLE64) + writeq(value, reg); + else + writel((u32)value, reg); +} + +static u64 read_irq_state(const struct irq_mask_info *m) +{ + return irq_reg_read(m, m->dev_irq_state); +} + +static u64 read_irq_mask(const struct irq_mask_info *m) +{ + return irq_reg_read(m, m->dev_irq_mask_reg); +} + +static void write_irq_disable(u64 value, const struct irq_mask_info *m) +{ + irq_reg_write(m, value, m->dev_irq_disable_reg); +} + +static int mods_check_interrupt(struct dev_irq_map *t) +{ + int ii = 0; int valid = 0; /* For MSI - we always treat it as pending (must rearm later). */ @@ -163,18 +196,15 @@ static inline int mods_check_interrupt(struct dev_irq_map *t) return true; for (ii = 0; ii < t->mask_info_cnt; ii++) { - if (!t->mask_info[ii].dev_irq_state || - !t->mask_info[ii].dev_irq_mask_reg) + const struct irq_mask_info *const m = &t->mask_info[ii]; + + if (!m->dev_irq_state || !m->dev_irq_mask_reg) continue; /* GPU device */ - if (t->mask_info[ii].mask_type == MODS_MASK_TYPE_IRQ_DISABLE64) - valid |= ((*(u64 *)t->mask_info[ii].dev_irq_state && - *(u64 *)t->mask_info[ii].dev_irq_mask_reg) != 0); - else - valid |= ((*t->mask_info[ii].dev_irq_state && - *t->mask_info[ii].dev_irq_mask_reg) != 0); + valid |= (read_irq_state(m) && read_irq_mask(m)) != 0; } + return valid; } @@ -183,28 +213,23 @@ static void mods_disable_interrupts(struct dev_irq_map *t) u32 ii = 0; for (ii = 0; ii < t->mask_info_cnt; ii++) { - if (t->mask_info[ii].dev_irq_disable_reg && - t->mask_info[ii].mask_type == MODS_MASK_TYPE_IRQ_DISABLE64) { - if (t->mask_info[ii].irq_and_mask == 0) - *(u64 *)t->mask_info[ii].dev_irq_disable_reg = - t->mask_info[ii].irq_or_mask; - else - *(u64 *)t->mask_info[ii].dev_irq_disable_reg = - (*(u64 *)t->mask_info[ii].dev_irq_mask_reg & - t->mask_info[ii].irq_and_mask) | - t->mask_info[ii].irq_or_mask; - } else if (t->mask_info[ii].dev_irq_disable_reg) { - if (t->mask_info[ii].irq_and_mask == 0) { - *t->mask_info[ii].dev_irq_disable_reg = - t->mask_info[ii].irq_or_mask; - } else { - *t->mask_info[ii].dev_irq_disable_reg = - (*t->mask_info[ii].dev_irq_mask_reg & - t->mask_info[ii].irq_and_mask) | - t->mask_info[ii].irq_or_mask; - } + const struct irq_mask_info *const m = &t->mask_info[ii]; + u64 cur_mask = 0; + + if (!m->dev_irq_disable_reg) + continue; + + if (m->irq_and_mask == 0) { + write_irq_disable(m->irq_or_mask, m); + continue; } + + cur_mask = read_irq_mask(m); + cur_mask &= m->irq_and_mask; + cur_mask |= m->irq_or_mask; + write_irq_disable(cur_mask, m); } + if ((ii == 0) && t->type == MODS_IRQ_TYPE_CPU) { mods_debug_printk(DEBUG_ISR, "disable_irq_nosync %u", @@ -390,38 +415,43 @@ static int is_nvidia_gpu(struct pci_dev *dev) } return false; } -#endif -#ifdef CONFIG_PCI static void setup_mask_info(struct dev_irq_map *newmap, struct MODS_REGISTER_IRQ_4 *p, struct pci_dev *dev) { /* account for legacy adapters */ - char *bar = newmap->dev_irq_aperture; - u32 ii = 0; + u8 __iomem *bar = newmap->dev_irq_aperture; + u32 ii = 0; if ((p->mask_info_cnt == 0) && is_nvidia_gpu(dev)) { + struct irq_mask_info *const m = &newmap->mask_info[0]; + newmap->mask_info_cnt = 1; - newmap->mask_info[0].dev_irq_mask_reg = (u32 *)(bar+0x140); - newmap->mask_info[0].dev_irq_disable_reg = (u32 *)(bar+0x140); - newmap->mask_info[0].dev_irq_state = (u32 *)(bar+0x100); - newmap->mask_info[0].irq_and_mask = 0; - newmap->mask_info[0].irq_or_mask = 0; + m->dev_irq_mask_reg = (void __iomem *)(bar + 0x140); + m->dev_irq_disable_reg = (void __iomem *)(bar + 0x140); + m->dev_irq_state = (void __iomem *)(bar + 0x100); + m->irq_and_mask = 0; + m->irq_or_mask = 0; return; } + /* setup for new adapters */ newmap->mask_info_cnt = p->mask_info_cnt; for (ii = 0; ii < p->mask_info_cnt; ii++) { - newmap->mask_info[ii].dev_irq_state = - (u32 *)(bar + p->mask_info[ii].irq_pending_offset); - newmap->mask_info[ii].dev_irq_mask_reg = - (u32 *)(bar + p->mask_info[ii].irq_enabled_offset); - newmap->mask_info[ii].dev_irq_disable_reg = - (u32 *)(bar + p->mask_info[ii].irq_disable_offset); - newmap->mask_info[ii].irq_and_mask = p->mask_info[ii].and_mask; - newmap->mask_info[ii].irq_or_mask = p->mask_info[ii].or_mask; - newmap->mask_info[ii].mask_type = p->mask_info[ii].mask_type; + struct irq_mask_info *const m = &newmap->mask_info[ii]; + const struct mods_mask_info2 *const in_m = &p->mask_info[ii]; + + const u32 pend_offs = in_m->irq_pending_offset; + const u32 stat_offs = in_m->irq_enabled_offset; + const u32 dis_offs = in_m->irq_disable_offset; + + m->dev_irq_state = (void __iomem *)(bar + pend_offs); + m->dev_irq_mask_reg = (void __iomem *)(bar + stat_offs); + m->dev_irq_disable_reg = (void __iomem *)(bar + dis_offs); + m->irq_and_mask = in_m->and_mask; + m->irq_or_mask = in_m->or_mask; + m->mask_type = in_m->mask_type; } } #endif @@ -475,7 +505,7 @@ static int add_irq_map(struct mods_client *client, newmap->apic_irq = irq; newmap->dev = dev; newmap->client_id = client->client_id; - newmap->dev_irq_aperture = 0; + newmap->dev_irq_aperture = NULL; newmap->mask_info_cnt = 0; newmap->type = irq_type; newmap->entry = entry; @@ -503,7 +533,7 @@ static int add_irq_map(struct mods_client *client, if ((irq_type == MODS_IRQ_TYPE_INT) && (p->aperture_addr != 0) && (p->aperture_size != 0)) { - char *bar = ioremap(p->aperture_addr, p->aperture_size); + u8 __iomem *bar = ioremap(p->aperture_addr, p->aperture_size); if (!bar) { cl_debug(DEBUG_ISR, @@ -635,7 +665,7 @@ void mods_cleanup_irq(void) LOG_EXT(); } -int mods_irq_event_check(u8 client_id) +POLL_TYPE mods_irq_event_check(u8 client_id) { struct irq_q_info *q = &client_from_id(client_id)->irq_queue; unsigned int pos = (1 << (client_id - 1)); @@ -772,7 +802,7 @@ static int mods_free_irqs(struct mods_client *client, kfree(dpriv->msix_entries); if (dpriv->msix_entries) atomic_dec(&client->num_allocs); - dpriv->msix_entries = 0; + dpriv->msix_entries = NULL; } else if (irq_type == MODS_IRQ_TYPE_MSI) { pci_disable_msi(dev); } @@ -1125,7 +1155,7 @@ static int mods_register_cpu_irq(struct mods_client *client, } /* Register interrupt */ - err = add_irq_map(client, 0, p, irq, 0); + err = add_irq_map(client, NULL, p, irq, 0); mutex_unlock(&mp.mtx); LOG_EXT(); @@ -1182,7 +1212,7 @@ static int mods_unregister_cpu_irq(struct mods_client *client, /* Delete device interrupt from the list */ list_for_each_entry_safe(del, next, &client->irq_list, list) { - if ((irq == del->apic_irq) && (del->dev == 0)) { + if ((irq == del->apic_irq) && (del->dev == NULL)) { if (del->type != p->type) { cl_error("wrong IRQ type passed\n"); mutex_unlock(&mp.mtx); @@ -1539,7 +1569,7 @@ int esc_mods_map_irq(struct mods_client *client, void __iomem *wdt_tke = NULL; int wdt_index; - if (res_tke && res_src) { + if (res_tke && res_src) { wdt_tke = devm_ioremap(&pdev->dev, res_tke->start, resource_size(res_tke)); wdt_index = ((res_src->start >> 16) & 0xF) - 0xc; diff --git a/drivers/misc/mods/mods_krnl.c b/drivers/misc/mods/mods_krnl.c index eca6a2c7..65df7238 100644 --- a/drivers/misc/mods/mods_krnl.c +++ b/drivers/misc/mods/mods_krnl.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_krnl.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved. * @@ -46,7 +46,7 @@ ***********************************************************************/ static int mods_krnl_open(struct inode *, struct file *); static int mods_krnl_close(struct inode *, struct file *); -static unsigned int mods_krnl_poll(struct file *, poll_table *); +static POLL_TYPE mods_krnl_poll(struct file *, poll_table *); static int mods_krnl_mmap(struct file *, struct vm_area_struct *); static long mods_krnl_ioctl(struct file *, unsigned int, unsigned long); @@ -65,7 +65,7 @@ static const struct file_operations mods_fops = { #define DEVICE_NAME "mods" -struct miscdevice mods_dev = { +static struct miscdevice mods_dev = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &mods_fops @@ -77,7 +77,7 @@ static pci_ers_result_t mods_pci_error_detected(struct pci_dev *, static pci_ers_result_t mods_pci_mmio_enabled(struct pci_dev *); static void mods_pci_resume(struct pci_dev *); -struct pci_error_handlers mods_pci_error_handlers = { +static struct pci_error_handlers mods_pci_error_handlers = { .error_detected = mods_pci_error_detected, .mmio_enabled = mods_pci_mmio_enabled, .resume = mods_pci_resume, @@ -128,7 +128,7 @@ static int mods_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) static int mods_pci_sriov_configure(struct pci_dev *dev, int numvfs); #endif -struct pci_driver mods_pci_driver = { +static struct pci_driver mods_pci_driver = { .name = DEVICE_NAME, .id_table = mods_pci_table, .probe = mods_pci_probe, @@ -467,6 +467,10 @@ static int __init mods_init_module(void) /* tegra prod */ mods_tegra_prod_init(&mods_dev); + +#if defined(CONFIG_DMA_ENGINE) + mods_init_dma(); +#endif #endif mods_info_printk("*** WARNING: DIAGNOSTIC DRIVER LOADED ***\n"); @@ -492,6 +496,9 @@ static void __exit mods_exit_module(void) mods_cleanup_irq(); #if defined(MODS_HAS_TEGRA) +#if defined(CONFIG_DMA_ENGINE) + mods_exit_dma(); +#endif smmu_driver_exit(); #endif @@ -1053,18 +1060,18 @@ static int mods_krnl_close(struct inode *ip, struct file *fp) return final_err; } -static unsigned int mods_krnl_poll(struct file *fp, poll_table *wait) +static POLL_TYPE mods_krnl_poll(struct file *fp, poll_table *wait) { - unsigned int mask = 0; struct mods_client *client = fp->private_data; - int err; + POLL_TYPE mask = 0; + int err; if (!validate_client(client)) - return -EINVAL; + return POLLERR; err = mods_check_access_token(client); if (err < 0) - return err; + return POLLERR; if (!(fp->f_flags & O_NONBLOCK)) { cl_debug(DEBUG_ISR_DETAILED, "poll wait\n"); diff --git a/drivers/misc/mods/mods_mem.c b/drivers/misc/mods/mods_mem.c index 886bb54b..c4f9a889 100644 --- a/drivers/misc/mods/mods_mem.c +++ b/drivers/misc/mods/mods_mem.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_mem.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved. * @@ -562,7 +562,7 @@ static void mods_free_pages(struct mods_client *client, __free_pages(chunk->p_page, chunk->order); atomic_sub(1u << chunk->order, &client->num_pages); - chunk->p_page = 0; + chunk->p_page = NULL; } } @@ -1017,9 +1017,9 @@ static int get_addr_range(struct mods_client *client, /* Returns an offset within an allocation deduced from physical address. * If dma address doesn't belong to the allocation, returns non-zero. */ -int mods_get_alloc_offset(struct MODS_MEM_INFO *p_mem_info, - u64 dma_addr, - u64 *ret_offs) +static int get_alloc_offset(struct MODS_MEM_INFO *p_mem_info, + u64 dma_addr, + u64 *ret_offs) { u32 i; u64 offset = 0; @@ -1053,7 +1053,7 @@ struct MODS_MEM_INFO *mods_find_alloc(struct mods_client *client, u64 phys_addr) p_mem_info = list_entry(plist_iter, struct MODS_MEM_INFO, list); - if (!mods_get_alloc_offset(p_mem_info, phys_addr, &offset)) + if (!get_alloc_offset(p_mem_info, phys_addr, &offset)) return p_mem_info; } @@ -1835,9 +1835,9 @@ int esc_mods_virtual_to_phys(struct mods_client *client, return OK; } - if (mods_get_alloc_offset(p_map_mem->p_mem_info, - p_map_mem->dma_addr, - &phys_offs) != OK) + if (get_alloc_offset(p_map_mem->p_mem_info, + p_map_mem->dma_addr, + &phys_offs) != OK) break; get_phys_addr.memory_handle = @@ -1920,15 +1920,15 @@ int esc_mods_phys_to_virtual(struct mods_client *client, } /* offset from the beginning of the allocation */ - if (mods_get_alloc_offset(p_map_mem->p_mem_info, - p->physical_address, - &offset)) + if (get_alloc_offset(p_map_mem->p_mem_info, + p->physical_address, + &offset)) continue; /* offset from the beginning of the mapping */ - if (mods_get_alloc_offset(p_map_mem->p_mem_info, - p_map_mem->dma_addr, - &map_offset)) + if (get_alloc_offset(p_map_mem->p_mem_info, + p_map_mem->dma_addr, + &map_offset)) continue; if ((offset >= map_offset) && diff --git a/drivers/misc/mods/mods_netdevice.c b/drivers/misc/mods/mods_netdevice.c index 42f221f8..65c6e602 100644 --- a/drivers/misc/mods/mods_netdevice.c +++ b/drivers/misc/mods/mods_netdevice.c @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_net.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2015-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2015-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, diff --git a/drivers/misc/mods/mods_pci.c b/drivers/misc/mods/mods_pci.c index 7140fac8..9c438105 100644 --- a/drivers/misc/mods/mods_pci.c +++ b/drivers/misc/mods/mods_pci.c @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_pci.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2008-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2008-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, diff --git a/drivers/misc/mods/mods_ras.h b/drivers/misc/mods/mods_ras.h index d063d417..4fd9d851 100644 --- a/drivers/misc/mods/mods_ras.h +++ b/drivers/misc/mods/mods_ras.h @@ -1,8 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * mods_ras.h - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, diff --git a/drivers/misc/mods/mods_smmu_drv.c b/drivers/misc/mods/mods_smmu_drv.c index f03e2f5e..b8878071 100644 --- a/drivers/misc/mods/mods_smmu_drv.c +++ b/drivers/misc/mods/mods_smmu_drv.c @@ -1,7 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0 /* - * mods_dma_mapping.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, @@ -72,12 +73,11 @@ static int mods_smmu_driver_probe(struct platform_device *pdev) err = of_property_read_string(node, "dev-names", &dev_name); if (err < 0) { mods_error_printk( - "mods_smmu_driver_probe failed to read dev-names, ret=%d\n", - err); + "smmu probe failed to read dev-names, ret=%d\n", err); LOG_EXT(); return err; } - mods_debug_printk(DEBUG_MEM, "mods_smmu_driver_probe: dev-names=%s, dev_idx=%d\n", + mods_debug_printk(DEBUG_MEM, "smmu probe: dev-names=%s, dev_idx=%d\n", dev_name, mods_smmu_dev_num); if (mods_smmu_dev_num < MODS_MAX_SMMU_DEVICES) { diff --git a/drivers/misc/mods/mods_tegradc.c b/drivers/misc/mods/mods_tegradc.c index 15cc58cd..57d0e06c 100644 --- a/drivers/misc/mods/mods_tegradc.c +++ b/drivers/misc/mods/mods_tegradc.c @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_tegradc.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * - * Copyright (c) 2014-2020, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2014-2022, NVIDIA CORPORATION. All rights reserved. * * NVIDIA MODS kernel driver is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License, @@ -144,9 +144,3 @@ int esc_mods_tegra_dc_config_possible(struct mods_client *client, LOG_EXT(); return 0; } - -int mods_init_tegradc(void) -{ - return 0; -} - diff --git a/drivers/misc/mods/mods_tegraprod.c b/drivers/misc/mods/mods_tegraprod.c index 057312d1..2a2e83f1 100644 --- a/drivers/misc/mods/mods_tegraprod.c +++ b/drivers/misc/mods/mods_tegraprod.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 /* - * mods_tegraprod.c - This file is part of NVIDIA MODS kernel driver. + * This file is part of NVIDIA MODS kernel driver. * * Copyright (c) 2017-2022, NVIDIA CORPORATION. All rights reserved. * @@ -663,7 +663,7 @@ static int tegra_pcie_bpmp_set_ctrl_state(struct mods_smmu_dev *pcie_dev, return tegra_bpmp_transfer(pcie_dev->bpmp, &msg); } -int uphy_bpmp_pcie_controller_state_set(int controller, int enable) +static int uphy_bpmp_pcie_controller_state_set(int controller, int enable) { #define MAX_DEV_NAME_LEN 32 char dev_name[MAX_DEV_NAME_LEN]; @@ -686,7 +686,7 @@ int uphy_bpmp_pcie_controller_state_set(int controller, int enable) } #else -int uphy_bpmp_pcie_controller_state_set(int controller, int enable) +static int uphy_bpmp_pcie_controller_state_set(int controller, int enable) { mods_error_printk("bpmp mrq api is not supported\n"); return -ENODEV; @@ -731,7 +731,7 @@ static int tegra_pcie_bpmp_set_pll_state(struct mods_smmu_dev *pcie_dev, return tegra_bpmp_transfer(pcie_dev->bpmp, &msg); } -int uphy_bpmp_pcie_set_pll_state(int controller, int enable) +static int uphy_bpmp_pcie_set_pll_state(int controller, int enable) { #define MAX_DEV_NAME_LEN 32 char dev_name[MAX_DEV_NAME_LEN]; @@ -754,7 +754,7 @@ int uphy_bpmp_pcie_set_pll_state(int controller, int enable) } #else -int uphy_bpmp_pcie_set_pll_state(int controller, int enable) +static int uphy_bpmp_pcie_set_pll_state(int controller, int enable) { mods_error_printk("bpmp mrq api is not supported\n"); return -ENODEV;