[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2c29cdfc-a5b7-4b12-b254-c01b48e30663@linux.ibm.com>
Date: Tue, 20 Jul 2021 20:12:58 +0200
From: Frederic Barrat <fbarrat@...ux.ibm.com>
To: Leonardo Bras <leobras.c@...il.com>,
Michael Ellerman <mpe@...erman.id.au>,
Benjamin Herrenschmidt <benh@...nel.crashing.org>,
Paul Mackerras <paulus@...ba.org>,
Alexey Kardashevskiy <aik@...abs.ru>,
David Gibson <david@...son.dropbear.id.au>,
kernel test robot <lkp@...el.com>,
Nicolin Chen <nicoleotsuka@...il.com>
Cc: linuxppc-dev@...ts.ozlabs.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v5 11/11] powerpc/pseries/iommu: Rename "direct window" to
"dma window"
On 16/07/2021 10:27, Leonardo Bras wrote:
> A previous change introduced the usage of DDW as a bigger indirect DMA
> mapping when the DDW available size does not map the whole partition.
>
> As most of the code that manipulates direct mappings was reused for
> indirect mappings, it's necessary to rename all names and debug/info
> messages to reflect that it can be used for both kinds of mapping.
>
> This should cause no behavioural change, just adjust naming.
>
> Signed-off-by: Leonardo Bras <leobras.c@...il.com>
> ---
LGTM:
Reviewed-by: Frederic Barrat <fbarrat@...ux.ibm.com>
> arch/powerpc/platforms/pseries/iommu.c | 91 +++++++++++++-------------
> 1 file changed, 47 insertions(+), 44 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
> index a67e71c49aeb..52548dfb8b45 100644
> --- a/arch/powerpc/platforms/pseries/iommu.c
> +++ b/arch/powerpc/platforms/pseries/iommu.c
> @@ -349,7 +349,7 @@ struct dynamic_dma_window_prop {
> __be32 window_shift; /* ilog2(tce_window_size) */
> };
>
> -struct direct_window {
> +struct dma_win {
> struct device_node *device;
> const struct dynamic_dma_window_prop *prop;
> struct list_head list;
> @@ -369,11 +369,11 @@ struct ddw_create_response {
> u32 addr_lo;
> };
>
> -static LIST_HEAD(direct_window_list);
> +static LIST_HEAD(dma_win_list);
> /* prevents races between memory on/offline and window creation */
> -static DEFINE_SPINLOCK(direct_window_list_lock);
> +static DEFINE_SPINLOCK(dma_win_list_lock);
> /* protects initializing window twice for same device */
> -static DEFINE_MUTEX(direct_window_init_mutex);
> +static DEFINE_MUTEX(dma_win_init_mutex);
> #define DIRECT64_PROPNAME "linux,direct64-ddr-window-info"
> #define DMA64_PROPNAME "linux,dma64-ddr-window-info"
>
> @@ -713,7 +713,10 @@ static void pci_dma_bus_setup_pSeriesLP(struct pci_bus *bus)
> pr_debug("pci_dma_bus_setup_pSeriesLP: setting up bus %pOF\n",
> dn);
>
> - /* Find nearest ibm,dma-window, walking up the device tree */
> + /*
> + * Find nearest ibm,dma-window (default DMA window), walking up the
> + * device tree
> + */
> for (pdn = dn; pdn != NULL; pdn = pdn->parent) {
> dma_window = of_get_property(pdn, "ibm,dma-window", NULL);
> if (dma_window != NULL)
> @@ -822,11 +825,11 @@ static void remove_dma_window(struct device_node *np, u32 *ddw_avail,
>
> ret = rtas_call(ddw_avail[DDW_REMOVE_PE_DMA_WIN], 1, 1, NULL, liobn);
> if (ret)
> - pr_warn("%pOF: failed to remove direct window: rtas returned "
> + pr_warn("%pOF: failed to remove DMA window: rtas returned "
> "%d to ibm,remove-pe-dma-window(%x) %llx\n",
> np, ret, ddw_avail[DDW_REMOVE_PE_DMA_WIN], liobn);
> else
> - pr_debug("%pOF: successfully removed direct window: rtas returned "
> + pr_debug("%pOF: successfully removed DMA window: rtas returned "
> "%d to ibm,remove-pe-dma-window(%x) %llx\n",
> np, ret, ddw_avail[DDW_REMOVE_PE_DMA_WIN], liobn);
> }
> @@ -854,37 +857,37 @@ static int remove_ddw(struct device_node *np, bool remove_prop, const char *win_
>
> ret = of_remove_property(np, win);
> if (ret)
> - pr_warn("%pOF: failed to remove direct window property: %d\n",
> + pr_warn("%pOF: failed to remove DMA window property: %d\n",
> np, ret);
> return 0;
> }
>
> static bool find_existing_ddw(struct device_node *pdn, u64 *dma_addr, int *window_shift)
> {
> - struct direct_window *window;
> - const struct dynamic_dma_window_prop *direct64;
> + struct dma_win *window;
> + const struct dynamic_dma_window_prop *dma64;
> bool found = false;
>
> - spin_lock(&direct_window_list_lock);
> + spin_lock(&dma_win_list_lock);
> /* check if we already created a window and dupe that config if so */
> - list_for_each_entry(window, &direct_window_list, list) {
> + list_for_each_entry(window, &dma_win_list, list) {
> if (window->device == pdn) {
> - direct64 = window->prop;
> - *dma_addr = be64_to_cpu(direct64->dma_base);
> - *window_shift = be32_to_cpu(direct64->window_shift);
> + dma64 = window->prop;
> + *dma_addr = be64_to_cpu(dma64->dma_base);
> + *window_shift = be32_to_cpu(dma64->window_shift);
> found = true;
> break;
> }
> }
> - spin_unlock(&direct_window_list_lock);
> + spin_unlock(&dma_win_list_lock);
>
> return found;
> }
>
> -static struct direct_window *ddw_list_new_entry(struct device_node *pdn,
> - const struct dynamic_dma_window_prop *dma64)
> +static struct dma_win *ddw_list_new_entry(struct device_node *pdn,
> + const struct dynamic_dma_window_prop *dma64)
> {
> - struct direct_window *window;
> + struct dma_win *window;
>
> window = kzalloc(sizeof(*window), GFP_KERNEL);
> if (!window)
> @@ -900,7 +903,7 @@ static void find_existing_ddw_windows_named(const char *name)
> {
> int len;
> struct device_node *pdn;
> - struct direct_window *window;
> + struct dma_win *window;
> const struct dynamic_dma_window_prop *dma64;
>
> for_each_node_with_property(pdn, name) {
> @@ -914,9 +917,9 @@ static void find_existing_ddw_windows_named(const char *name)
> if (!window)
> break;
>
> - spin_lock(&direct_window_list_lock);
> - list_add(&window->list, &direct_window_list);
> - spin_unlock(&direct_window_list_lock);
> + spin_lock(&dma_win_list_lock);
> + list_add(&window->list, &dma_win_list);
> + spin_unlock(&dma_win_list_lock);
> }
> }
>
> @@ -1216,7 +1219,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
> const char *win_name;
> struct device_node *dn;
> u32 ddw_avail[DDW_APPLICABLE_SIZE];
> - struct direct_window *window;
> + struct dma_win *window;
> struct property *win64;
> bool ddw_enabled = false;
> struct failed_ddw_pdn *fpdn;
> @@ -1229,7 +1232,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
> pmem_present = dn != NULL;
> of_node_put(dn);
>
> - mutex_lock(&direct_window_init_mutex);
> + mutex_lock(&dma_win_init_mutex);
>
> if (find_existing_ddw(pdn, &dev->dev.archdata.dma_offset, &len)) {
> direct_mapping = (len >= max_ram_len);
> @@ -1309,8 +1312,8 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
>
> page_shift = iommu_get_page_shift(query.page_size);
> if (!page_shift) {
> - dev_dbg(&dev->dev, "no supported direct page size in mask %x",
> - query.page_size);
> + dev_dbg(&dev->dev, "no supported page size in mask %x",
> + query.page_size);
> goto out_failed;
> }
>
> @@ -1367,7 +1370,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
>
> ret = of_add_property(pdn, win64);
> if (ret) {
> - dev_err(&dev->dev, "unable to add dma window property for %pOF: %d",
> + dev_err(&dev->dev, "unable to add DMA window property for %pOF: %d",
> pdn, ret);
> goto out_free_prop;
> }
> @@ -1381,7 +1384,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
> ret = walk_system_ram_range(0, memblock_end_of_DRAM() >> PAGE_SHIFT,
> win64->value, tce_setrange_multi_pSeriesLP_walk);
> if (ret) {
> - dev_info(&dev->dev, "failed to map direct window for %pOF: %d\n",
> + dev_info(&dev->dev, "failed to map DMA window for %pOF: %d\n",
> dn, ret);
> goto out_del_list;
> }
> @@ -1423,9 +1426,9 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
> set_iommu_table_base(&dev->dev, newtbl);
> }
>
> - spin_lock(&direct_window_list_lock);
> - list_add(&window->list, &direct_window_list);
> - spin_unlock(&direct_window_list_lock);
> + spin_lock(&dma_win_list_lock);
> + list_add(&window->list, &dma_win_list);
> + spin_unlock(&dma_win_list_lock);
>
> dev->dev.archdata.dma_offset = win_addr;
> ddw_enabled = true;
> @@ -1456,7 +1459,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
> list_add(&fpdn->list, &failed_ddw_pdn_list);
>
> out_unlock:
> - mutex_unlock(&direct_window_init_mutex);
> + mutex_unlock(&dma_win_init_mutex);
>
> /*
> * If we have persistent memory and the window size is only as big
> @@ -1554,29 +1557,29 @@ static bool iommu_bypass_supported_pSeriesLP(struct pci_dev *pdev, u64 dma_mask)
> static int iommu_mem_notifier(struct notifier_block *nb, unsigned long action,
> void *data)
> {
> - struct direct_window *window;
> + struct dma_win *window;
> struct memory_notify *arg = data;
> int ret = 0;
>
> switch (action) {
> case MEM_GOING_ONLINE:
> - spin_lock(&direct_window_list_lock);
> - list_for_each_entry(window, &direct_window_list, list) {
> + spin_lock(&dma_win_list_lock);
> + list_for_each_entry(window, &dma_win_list, list) {
> ret |= tce_setrange_multi_pSeriesLP(arg->start_pfn,
> arg->nr_pages, window->prop);
> /* XXX log error */
> }
> - spin_unlock(&direct_window_list_lock);
> + spin_unlock(&dma_win_list_lock);
> break;
> case MEM_CANCEL_ONLINE:
> case MEM_OFFLINE:
> - spin_lock(&direct_window_list_lock);
> - list_for_each_entry(window, &direct_window_list, list) {
> + spin_lock(&dma_win_list_lock);
> + list_for_each_entry(window, &dma_win_list, list) {
> ret |= tce_clearrange_multi_pSeriesLP(arg->start_pfn,
> arg->nr_pages, window->prop);
> /* XXX log error */
> }
> - spin_unlock(&direct_window_list_lock);
> + spin_unlock(&dma_win_list_lock);
> break;
> default:
> break;
> @@ -1597,7 +1600,7 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
> struct of_reconfig_data *rd = data;
> struct device_node *np = rd->dn;
> struct pci_dn *pci = PCI_DN(np);
> - struct direct_window *window;
> + struct dma_win *window;
>
> switch (action) {
> case OF_RECONFIG_DETACH_NODE:
> @@ -1615,15 +1618,15 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
> iommu_pseries_free_group(pci->table_group,
> np->full_name);
>
> - spin_lock(&direct_window_list_lock);
> - list_for_each_entry(window, &direct_window_list, list) {
> + spin_lock(&dma_win_list_lock);
> + list_for_each_entry(window, &dma_win_list, list) {
> if (window->device == np) {
> list_del(&window->list);
> kfree(window);
> break;
> }
> }
> - spin_unlock(&direct_window_list_lock);
> + spin_unlock(&dma_win_list_lock);
> break;
> default:
> err = NOTIFY_DONE;
>
Powered by blists - more mailing lists