> +static u64 ufshpb_get_ppn(struct ufshpb_lu *hpb,
> > +                         struct ufshpb_map_ctx *mctx, int pos, int *error)
> > +{
> > +       u64 *ppn_table;
> > +       struct page *page;
> > +       int index, offset;
> > +
> > +       index = pos / (PAGE_SIZE / HPB_ENTRY_SIZE);
> > +       offset = pos % (PAGE_SIZE / HPB_ENTRY_SIZE);
> > +
> > +       page = mctx->m_page[index];
> > +       if (unlikely(!page)) {
> > +               *error = -ENOMEM;
> > +               dev_err(&hpb->sdev_ufs_lu->sdev_dev,
> > +                       "error. cannot find page in mctx\n");
> > +               return 0;
> > +       }
> > +
> > +       ppn_table = page_address(page);
> > +       if (unlikely(!ppn_table)) {
> > +               *error = -ENOMEM;
> > +               dev_err(&hpb->sdev_ufs_lu->sdev_dev,
> > +                       "error. cannot get ppn_table\n");
> > +               return 0;
> > +       }
> > +
> > +       return ppn_table[offset];
> How about memcpy here as well?
> This way it is clear that the host is not manipulating the physical addresses 
> in any way,
> And you won't need to invent the new ufshpb_fill_ppn_from_page.
>  
I changed the code to use ufshpb_fill_ppn_from_page() because it is more
genenal for use than ufshpb_get_ppn(). And I fixed to use memcpy for
setting cdb of HPB read.

Thanks,
Daejun

Reply via email to