Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9855d59 authored by Lingfeng Yang's avatar Lingfeng Yang Committed by Alistair Delva
Browse files

CHROMIUM: drm/virtgpu: check for revelant capabilites

Initialize the TTM VRAM support when host coherent memory is
detected.

BUG=chromium:924405
TEST=compile

Bug: b/153580313

Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/1702157


Reviewed-by: default avatarRobert Tarasov <tutankhamen@chromium.org>
Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: default avatarGurchetan Singh <gurchetansingh@chromium.org>
[rebase54(groeck): Squashed:
	FIXUP: CHROMIUM: drm/virtgpu: check for revelant capabilites
]
Change-Id: If2c6269d82cc4e9826660d8ffaefe19320fba2e1
Signed-off-by: default avatarGuenter Roeck <groeck@chromium.org>
Signed-off-by: default avatarLingfeng Yang <lfy@google.com>
parent 400919b2
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ static int virtio_gpu_features(struct seq_file *m, void *data)

	virtio_add_bool(m, "virgl", vgdev->has_virgl_3d);
	virtio_add_bool(m, "edid", vgdev->has_edid);
	virtio_add_bool(m, "resource v2", vgdev->has_resource_v2);
	virtio_add_bool(m, "shared guest", vgdev->has_shared_guest);
	virtio_add_bool(m, "host coherent", vgdev->has_host_coherent);
	virtio_add_int(m, "cap sets", vgdev->num_capsets);
	virtio_add_int(m, "scanouts", vgdev->num_scanouts);
	return 0;
+3 −0
Original line number Diff line number Diff line
@@ -178,6 +178,9 @@ static unsigned int features[] = {
	VIRTIO_GPU_F_VIRGL,
#endif
	VIRTIO_GPU_F_EDID,
	VIRTIO_GPU_F_RESOURCE_V2,
	VIRTIO_GPU_F_SHARED_GUEST,
	VIRTIO_GPU_F_HOST_COHERENT,
};
static struct virtio_driver virtio_gpu_driver = {
	.feature_table = features,
+8 −0
Original line number Diff line number Diff line
@@ -234,12 +234,20 @@ struct virtio_gpu_device {

	bool has_virgl_3d;
	bool has_edid;
	bool has_resource_v2;
	bool has_shared_guest;
	bool has_host_coherent;

	struct work_struct config_changed_work;

	struct virtio_gpu_drv_capset *capsets;
	uint32_t num_capsets;
	struct list_head cap_cache;

	/* coherent memory */
	int cbar;
	unsigned long caddr;
	unsigned long csize;
};

struct virtio_gpu_fpriv {
+24 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include <linux/pci.h>
#include <linux/virtio.h>
#include <linux/virtio_config.h>
#include <drm/drmP.h>
@@ -181,6 +182,29 @@ int virtio_gpu_init(struct drm_device *dev)
		DRM_INFO("EDID support available.\n");
	}

	if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_RESOURCE_V2)) {
		if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_HOST_COHERENT)) {
			vgdev->cbar = 4;
			vgdev->caddr = pci_resource_start(dev->pdev, vgdev->cbar);
			vgdev->csize = pci_resource_len(dev->pdev, vgdev->cbar);
			ret = pci_request_region(dev->pdev, vgdev->cbar, "virtio-gpu-coherent");
			if (ret != 0) {
				DRM_WARN("Cannot request coherent memory bar\n");
			} else {
				DRM_INFO("coherent host resources enabled, using %s bar %d,"
					 "at 0x%lx, size %ld MB", dev_name(&dev->pdev->dev),
					vgdev->cbar, vgdev->caddr, vgdev->csize >> 20);

				vgdev->has_host_coherent = true;
			}
		}

		if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_SHARED_GUEST))
			vgdev->has_shared_guest = true;

		vgdev->has_resource_v2 = true;
	}

	ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL);
	if (ret) {
		DRM_ERROR("failed to find virt queues\n");
+31 −3
Original line number Diff line number Diff line
@@ -96,14 +96,42 @@ static void virtio_gpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
static void virtio_gpu_init_ttm_placement(struct virtio_gpu_object *vgbo)
{
	u32 c = 1;
	u32 ttm_caching_flags = 0;

	vgbo->placement.placement = &vgbo->placement_code;
	vgbo->placement.busy_placement = &vgbo->placement_code;
	vgbo->placement_code.fpfn = 0;
	vgbo->placement_code.lpfn = 0;

	switch (vgbo->caching_type) {
	case VIRTIO_GPU_CACHED:
		ttm_caching_flags = TTM_PL_FLAG_CACHED;
		break;
	case VIRTIO_GPU_WRITE_COMBINE:
		ttm_caching_flags = TTM_PL_FLAG_WC;
		break;
	case VIRTIO_GPU_UNCACHED:
		ttm_caching_flags = TTM_PL_FLAG_UNCACHED;
		break;
	default:
		ttm_caching_flags = TTM_PL_MASK_CACHING;
	}


	switch (vgbo->guest_memory_type) {
	case VIRTIO_GPU_MEMORY_UNDEFINED:
	case VIRTIO_GPU_MEMORY_TRANSFER:
	case VIRTIO_GPU_MEMORY_SHARED_GUEST:
		vgbo->placement_code.flags =
			TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT |
			TTM_PL_FLAG_NO_EVICT;
		break;
	case VIRTIO_GPU_MEMORY_HOST_COHERENT:
		vgbo->placement_code.flags =
			ttm_caching_flags | TTM_PL_FLAG_VRAM |
			TTM_PL_FLAG_NO_EVICT;
		break;
	}
	vgbo->placement.num_placement = c;
	vgbo->placement.num_busy_placement = c;

Loading