lkml.org 
[lkml]   [2021]   [Aug]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 07/11] powerpc/pseries/iommu: Reorganize iommu_table_setparms*() with new helper
    Date
    Add a new helper _iommu_table_setparms(), and use it in
    iommu_table_setparms() and iommu_table_setparms_lpar() to avoid duplicated
    code.

    Also, setting tbl->it_ops was happening outsite iommu_table_setparms*(),
    so move it to the new helper. Since we need the iommu_table_ops to be
    declared before used, declare iommu_table_lpar_multi_ops and
    iommu_table_pseries_ops to before their respective iommu_table_setparms*().

    Signed-off-by: Leonardo Bras <leobras.c@gmail.com>
    Reviewed-by: Frederic Barrat <fbarrat@linux.ibm.com>
    ---
    arch/powerpc/platforms/pseries/iommu.c | 72 ++++++++++++++------------
    1 file changed, 38 insertions(+), 34 deletions(-)

    diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
    index 00392582fe10..a47f59a8f107 100644
    --- a/arch/powerpc/platforms/pseries/iommu.c
    +++ b/arch/powerpc/platforms/pseries/iommu.c
    @@ -501,6 +501,24 @@ static int tce_setrange_multi_pSeriesLP_walk(unsigned long start_pfn,
    return tce_setrange_multi_pSeriesLP(start_pfn, num_pfn, arg);
    }

    +static void iommu_table_setparms_common(struct iommu_table *tbl, unsigned long busno,
    + unsigned long liobn, unsigned long win_addr,
    + unsigned long window_size, unsigned long page_shift,
    + void *base, struct iommu_table_ops *table_ops)
    +{
    + tbl->it_busno = busno;
    + tbl->it_index = liobn;
    + tbl->it_offset = win_addr >> page_shift;
    + tbl->it_size = window_size >> page_shift;
    + tbl->it_page_shift = page_shift;
    + tbl->it_base = (unsigned long)base;
    + tbl->it_blocksize = 16;
    + tbl->it_type = TCE_PCI;
    + tbl->it_ops = table_ops;
    +}
    +
    +struct iommu_table_ops iommu_table_pseries_ops;
    +
    static void iommu_table_setparms(struct pci_controller *phb,
    struct device_node *dn,
    struct iommu_table *tbl)
    @@ -509,8 +527,13 @@ static void iommu_table_setparms(struct pci_controller *phb,
    const unsigned long *basep;
    const u32 *sizep;

    - node = phb->dn;
    + /* Test if we are going over 2GB of DMA space */
    + if (phb->dma_window_base_cur + phb->dma_window_size > SZ_2G) {
    + udbg_printf("PCI_DMA: Unexpected number of IOAs under this PHB.\n");
    + panic("PCI_DMA: Unexpected number of IOAs under this PHB.\n");
    + }

    + node = phb->dn;
    basep = of_get_property(node, "linux,tce-base", NULL);
    sizep = of_get_property(node, "linux,tce-size", NULL);
    if (basep == NULL || sizep == NULL) {
    @@ -519,33 +542,18 @@ static void iommu_table_setparms(struct pci_controller *phb,
    return;
    }

    - tbl->it_base = (unsigned long)__va(*basep);
    + iommu_table_setparms_common(tbl, phb->bus->number, 0, phb->dma_window_base_cur,
    + phb->dma_window_size, IOMMU_PAGE_SHIFT_4K,
    + __va(*basep), &iommu_table_pseries_ops);

    if (!is_kdump_kernel())
    memset((void *)tbl->it_base, 0, *sizep);

    - tbl->it_busno = phb->bus->number;
    - tbl->it_page_shift = IOMMU_PAGE_SHIFT_4K;
    -
    - /* Units of tce entries */
    - tbl->it_offset = phb->dma_window_base_cur >> tbl->it_page_shift;
    -
    - /* Test if we are going over 2GB of DMA space */
    - if (phb->dma_window_base_cur + phb->dma_window_size > 0x80000000ul) {
    - udbg_printf("PCI_DMA: Unexpected number of IOAs under this PHB.\n");
    - panic("PCI_DMA: Unexpected number of IOAs under this PHB.\n");
    - }
    -
    phb->dma_window_base_cur += phb->dma_window_size;
    -
    - /* Set the tce table size - measured in entries */
    - tbl->it_size = phb->dma_window_size >> tbl->it_page_shift;
    -
    - tbl->it_index = 0;
    - tbl->it_blocksize = 16;
    - tbl->it_type = TCE_PCI;
    }

    +struct iommu_table_ops iommu_table_lpar_multi_ops;
    +
    /*
    * iommu_table_setparms_lpar
    *
    @@ -557,17 +565,13 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb,
    struct iommu_table_group *table_group,
    const __be32 *dma_window)
    {
    - unsigned long offset, size;
    + unsigned long offset, size, liobn;

    - of_parse_dma_window(dn, dma_window, &tbl->it_index, &offset, &size);
    + of_parse_dma_window(dn, dma_window, &liobn, &offset, &size);
    +
    + iommu_table_setparms_common(tbl, phb->bus->number, liobn, offset, size, IOMMU_PAGE_SHIFT_4K, NULL,
    + &iommu_table_lpar_multi_ops);

    - tbl->it_busno = phb->bus->number;
    - tbl->it_page_shift = IOMMU_PAGE_SHIFT_4K;
    - tbl->it_base = 0;
    - tbl->it_blocksize = 16;
    - tbl->it_type = TCE_PCI;
    - tbl->it_offset = offset >> tbl->it_page_shift;
    - tbl->it_size = size >> tbl->it_page_shift;

    table_group->tce32_start = offset;
    table_group->tce32_size = size;
    @@ -647,7 +651,7 @@ static void pci_dma_bus_setup_pSeries(struct pci_bus *bus)
    tbl = pci->table_group->tables[0];

    iommu_table_setparms(pci->phb, dn, tbl);
    - tbl->it_ops = &iommu_table_pseries_ops;
    +
    if (!iommu_init_table(tbl, pci->phb->node, 0, 0))
    panic("Failed to initialize iommu table");

    @@ -730,7 +734,7 @@ static void pci_dma_bus_setup_pSeriesLP(struct pci_bus *bus)
    tbl = ppci->table_group->tables[0];
    iommu_table_setparms_lpar(ppci->phb, pdn, tbl,
    ppci->table_group, dma_window);
    - tbl->it_ops = &iommu_table_lpar_multi_ops;
    +
    if (!iommu_init_table(tbl, ppci->phb->node, 0, 0))
    panic("Failed to initialize iommu table");
    iommu_register_group(ppci->table_group,
    @@ -760,7 +764,7 @@ static void pci_dma_dev_setup_pSeries(struct pci_dev *dev)
    PCI_DN(dn)->table_group = iommu_pseries_alloc_group(phb->node);
    tbl = PCI_DN(dn)->table_group->tables[0];
    iommu_table_setparms(phb, dn, tbl);
    - tbl->it_ops = &iommu_table_pseries_ops;
    +
    if (!iommu_init_table(tbl, phb->node, 0, 0))
    panic("Failed to initialize iommu table");

    @@ -1461,7 +1465,7 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
    tbl = pci->table_group->tables[0];
    iommu_table_setparms_lpar(pci->phb, pdn, tbl,
    pci->table_group, dma_window);
    - tbl->it_ops = &iommu_table_lpar_multi_ops;
    +
    iommu_init_table(tbl, pci->phb->node, 0, 0);
    iommu_register_group(pci->table_group,
    pci_domain_nr(pci->phb->bus), 0);
    --
    2.32.0
    \
     
     \ /
      Last update: 2021-08-17 08:40    [W:5.542 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site