Skip to content

Commit

Permalink
powerpc/pseries/iommu: Find existing DDW with given property name
Browse files Browse the repository at this point in the history
At the moment pseries stores information about created directly mapped
DDW window in DIRECT64_PROPNAME.

With the objective of implementing indirect DMA mapping with DDW, it's
necessary to have another propriety name to make sure kexec'ing into older
kernels does not break, as it would if we reuse DIRECT64_PROPNAME.

In order to have this, find_existing_ddw_windows() needs to be able to
look for different property names.

Extract find_existing_ddw_windows() into find_existing_ddw_windows_named()
and calls it with current property name.

Signed-off-by: Leonardo Bras <leobras.c@gmail.com>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: Frederic Barrat <fbarrat@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210817063929.38701-10-leobras.c@gmail.com
  • Loading branch information
LeoBras authored and mpe committed Aug 26, 2021
1 parent a5fd951 commit 8599395
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions arch/powerpc/platforms/pseries/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -910,31 +910,36 @@ static struct direct_window *ddw_list_new_entry(struct device_node *pdn,
return window;
}

static int find_existing_ddw_windows(void)
static void find_existing_ddw_windows_named(const char *name)
{
int len;
struct device_node *pdn;
struct direct_window *window;
const struct dynamic_dma_window_prop *direct64;

if (!firmware_has_feature(FW_FEATURE_LPAR))
return 0;
const struct dynamic_dma_window_prop *dma64;

for_each_node_with_property(pdn, DIRECT64_PROPNAME) {
direct64 = of_get_property(pdn, DIRECT64_PROPNAME, &len);
if (!direct64 || len < sizeof(*direct64)) {
remove_ddw(pdn, true, DIRECT64_PROPNAME);
for_each_node_with_property(pdn, name) {
dma64 = of_get_property(pdn, name, &len);
if (!dma64 || len < sizeof(*dma64)) {
remove_ddw(pdn, true, name);
continue;
}

window = ddw_list_new_entry(pdn, direct64);
window = ddw_list_new_entry(pdn, dma64);
if (!window)
break;

spin_lock(&direct_window_list_lock);
list_add(&window->list, &direct_window_list);
spin_unlock(&direct_window_list_lock);
}
}

static int find_existing_ddw_windows(void)
{
if (!firmware_has_feature(FW_FEATURE_LPAR))
return 0;

find_existing_ddw_windows_named(DIRECT64_PROPNAME);

return 0;
}
Expand Down

0 comments on commit 8599395

Please sign in to comment.