@@ -36,6 +36,8 @@ static int virtio_pmem_probe(struct virtio_device *vdev)
3636 struct virtio_pmem * vpmem ;
3737 struct resource res ;
3838 int err = 0 ;
39+ bool have_shm_region ;
40+ struct virtio_shm_region pmem_region ;
3941
4042 if (!vdev -> config -> get ) {
4143 dev_err (& vdev -> dev , "%s failure: config access disabled\n" ,
@@ -57,10 +59,20 @@ static int virtio_pmem_probe(struct virtio_device *vdev)
5759 goto out_err ;
5860 }
5961
60- virtio_cread_le (vpmem -> vdev , struct virtio_pmem_config ,
61- start , & vpmem -> start );
62- virtio_cread_le (vpmem -> vdev , struct virtio_pmem_config ,
63- size , & vpmem -> size );
62+ /* Retrieve the pmem device's address and size. It may have been supplied
63+ * as a PCI BAR-relative shared memory region, or as a guest absolute address.
64+ */
65+ have_shm_region = virtio_get_shm_region (vpmem -> vdev , & pmem_region ,
66+ VIRTIO_PMEM_SHMCAP_ID_PMEM_REGION );
67+ if (have_shm_region ) {
68+ vpmem -> start = pmem_region .addr ;
69+ vpmem -> size = pmem_region .len ;
70+ } else {
71+ virtio_cread_le (vpmem -> vdev , struct virtio_pmem_config ,
72+ start , & vpmem -> start );
73+ virtio_cread_le (vpmem -> vdev , struct virtio_pmem_config ,
74+ size , & vpmem -> size );
75+ }
6476
6577 res .start = vpmem -> start ;
6678 res .end = vpmem -> start + vpmem -> size - 1 ;
0 commit comments