Merge "soc: qcom: secure_buffer: add API page_accessible"

This commit is contained in:
qctecmdr 2020-09-09 18:24:28 -07:00 • committed by Gerrit - the friendly Code Review server
commit 9204b9429b
2 changed files with 45 additions and 0 deletions

View file

@ -146,6 +146,32 @@ static int batched_hyp_assign(struct sg_table *table, u32 *source_vmids,
return ret;
}
static inline void set_each_page_of_sg(struct sg_table *table, u64 flag)
{
struct scatterlist *sg;
int npages;
int i = 0;
for_each_sg(table->sgl, sg, table->nents, i) {
npages = sg->length / PAGE_SIZE;
if (sg->length % PAGE_SIZE)
npages++;
while (npages--)
set_page_private(nth_page(sg_page(sg), npages), flag);
}
}
#define SECURE_PAGE_MAGIC 0xEEEEEEEE
int page_accessible(unsigned long pfn)
{
struct page *page = pfn_to_page(pfn);
if (page->private == SECURE_PAGE_MAGIC)
return 0;
else
return 1;
}
/*
* When -EADDRNOTAVAIL is returned the memory may no longer be in
* a usable state and should no longer be accessed by the HLOS.
@ -207,6 +233,19 @@ int hyp_assign_table(struct sg_table *table,
ret = batched_hyp_assign(table, source_vm_copy, source_vm_copy_size,
dest_vm_copy, dest_vm_copy_size);
if (!ret) {
while (dest_nelems--) {
if (dest_vmids[dest_nelems] == VMID_HLOS)
break;
}
if (dest_nelems == -1)
set_each_page_of_sg(table, SECURE_PAGE_MAGIC);
else
set_each_page_of_sg(table, 0);
}
dma_unmap_single(qcom_secure_buffer_dev, dest_dma_addr,
dest_vm_copy_size, DMA_TO_DEVICE);
out_free_dest:

View file

@ -54,6 +54,7 @@ int hyp_assign_phys(phys_addr_t addr, u64 size,
int *dest_vmids, int *dest_perms, int dest_nelems);
const char *msm_secure_vmid_to_string(int secure_vmid);
u32 msm_secure_get_vmid_perms(u32 vmid);
int page_accessible(unsigned long pfn);
#else
static inline int hyp_assign_table(struct sg_table *table,
u32 *source_vm_list, int source_nelems,
@ -79,5 +80,10 @@ static inline u32 msm_secure_get_vmid_perms(u32 vmid)
{
return 0;
}
static inline int page_accessible(unsigned long pfn)
{
return 1;
}
#endif
#endif