mirror of https://gitee.com/openkylin/linux.git
KVM: PPC: Add @offset to kvmppc_spapr_tce_table
This enables userspace view of TCE tables to start from non-zero offset on a bus. This will be used for huge DMA windows. This only changes the internal structure, the user interface needs to change in order to use an offset. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
fe26e52712
commit
14f853f1b2
|
@ -184,6 +184,7 @@ struct kvmppc_spapr_tce_table {
|
||||||
u64 liobn;
|
u64 liobn;
|
||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
u32 page_shift;
|
u32 page_shift;
|
||||||
|
u64 offset; /* in pages */
|
||||||
u64 size; /* window size in pages */
|
u64 size; /* window size in pages */
|
||||||
struct page *pages[0];
|
struct page *pages[0];
|
||||||
};
|
};
|
||||||
|
|
|
@ -75,7 +75,9 @@ long kvmppc_ioba_validate(struct kvmppc_spapr_tce_table *stt,
|
||||||
unsigned long mask = (1ULL << stt->page_shift) - 1;
|
unsigned long mask = (1ULL << stt->page_shift) - 1;
|
||||||
unsigned long idx = ioba >> stt->page_shift;
|
unsigned long idx = ioba >> stt->page_shift;
|
||||||
|
|
||||||
if ((ioba & mask) || (idx + npages > stt->size) || (idx + npages < idx))
|
if ((ioba & mask) || (idx < stt->offset) ||
|
||||||
|
(idx - stt->offset + npages > stt->size) ||
|
||||||
|
(idx + npages < idx))
|
||||||
return H_PARAMETER;
|
return H_PARAMETER;
|
||||||
|
|
||||||
return H_SUCCESS;
|
return H_SUCCESS;
|
||||||
|
@ -147,6 +149,7 @@ void kvmppc_tce_put(struct kvmppc_spapr_tce_table *stt,
|
||||||
struct page *page;
|
struct page *page;
|
||||||
u64 *tbl;
|
u64 *tbl;
|
||||||
|
|
||||||
|
idx -= stt->offset;
|
||||||
page = stt->pages[idx / TCES_PER_PAGE];
|
page = stt->pages[idx / TCES_PER_PAGE];
|
||||||
tbl = kvmppc_page_address(page);
|
tbl = kvmppc_page_address(page);
|
||||||
|
|
||||||
|
@ -335,7 +338,7 @@ long kvmppc_h_get_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
|
||||||
if (ret != H_SUCCESS)
|
if (ret != H_SUCCESS)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
idx = ioba >> stt->page_shift;
|
idx = (ioba >> stt->page_shift) - stt->offset;
|
||||||
page = stt->pages[idx / TCES_PER_PAGE];
|
page = stt->pages[idx / TCES_PER_PAGE];
|
||||||
tbl = (u64 *)page_address(page);
|
tbl = (u64 *)page_address(page);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue