mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 11:19:37 +00:00
![Joerg Roedel](/assets/img/avatar_default.png)
Commit68a17f0be6
introduced an initialization order problem, where devices are linked against an iommu which is not yet initialized. Fix it by initializing the iommu-device before the iommu-ops are registered against the bus. Reported-by: Michael Ellerman <mpe@ellerman.id.au> Fixes:68a17f0be6
('iommu/pamu: Add support for generic iommu-device') Signed-off-by: Joerg Roedel <jroedel@suse.de>
85 lines
2.6 KiB
C
85 lines
2.6 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License, version 2, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Copyright (C) 2013 Freescale Semiconductor, Inc.
|
|
*
|
|
*/
|
|
|
|
#ifndef __FSL_PAMU_DOMAIN_H
|
|
#define __FSL_PAMU_DOMAIN_H
|
|
|
|
#include "fsl_pamu.h"
|
|
|
|
struct dma_window {
|
|
phys_addr_t paddr;
|
|
u64 size;
|
|
int valid;
|
|
int prot;
|
|
};
|
|
|
|
struct fsl_dma_domain {
|
|
/*
|
|
* Indicates the geometry size for the domain.
|
|
* This would be set when the geometry is
|
|
* configured for the domain.
|
|
*/
|
|
dma_addr_t geom_size;
|
|
/*
|
|
* Number of windows assocaited with this domain.
|
|
* During domain initialization, it is set to the
|
|
* the maximum number of subwindows allowed for a LIODN.
|
|
* Minimum value for this is 1 indicating a single PAMU
|
|
* window, without any sub windows. Value can be set/
|
|
* queried by set_attr/get_attr API for DOMAIN_ATTR_WINDOWS.
|
|
* Value can only be set once the geometry has been configured.
|
|
*/
|
|
u32 win_cnt;
|
|
/*
|
|
* win_arr contains information of the configured
|
|
* windows for a domain. This is allocated only
|
|
* when the number of windows for the domain are
|
|
* set.
|
|
*/
|
|
struct dma_window *win_arr;
|
|
/* list of devices associated with the domain */
|
|
struct list_head devices;
|
|
/* dma_domain states:
|
|
* mapped - A particular mapping has been created
|
|
* within the configured geometry.
|
|
* enabled - DMA has been enabled for the given
|
|
* domain. This translates to setting of the
|
|
* valid bit for the primary PAACE in the PAMU
|
|
* PAACT table. Domain geometry should be set and
|
|
* it must have a valid mapping before DMA can be
|
|
* enabled for it.
|
|
*
|
|
*/
|
|
int mapped;
|
|
int enabled;
|
|
/* stash_id obtained from the stash attribute details */
|
|
u32 stash_id;
|
|
struct pamu_stash_attribute dma_stash;
|
|
u32 snoop_id;
|
|
struct iommu_domain iommu_domain;
|
|
spinlock_t domain_lock;
|
|
};
|
|
|
|
/* domain-device relationship */
|
|
struct device_domain_info {
|
|
struct list_head link; /* link to domain siblings */
|
|
struct device *dev;
|
|
u32 liodn;
|
|
struct fsl_dma_domain *domain; /* pointer to domain */
|
|
};
|
|
#endif /* __FSL_PAMU_DOMAIN_H */
|