/*
 * Copyright (c) 2016 Google Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <vmm/virtio.h>
#include <vmm/virtio_ids.h>
#include <vmm/virtio_config.h>

// Returns NULL if the features are valid, otherwise returns
// an error string describing what part of validation failed
// We pass the vqdev instead of just the dev_id in case we
// also want to validate the device-specific config space.
// feat is the feature vector that you want to validate for the vqdev
const char *virtio_validate_feat(struct virtio_vq_dev *vqdev, uint64_t feat)
{

	// First validate device-specific features. We want to tell someone
	// when they forgot to implement validation code for a new device
	// as soon as possible, so that they don't skip this when they
	// implement new devices.
	switch (vqdev->dev_id) {
		case VIRTIO_ID_CONSOLE:
			// No interdependent features for the console.
			break;
		case VIRTIO_ID_NET:
			// There is no "mandatory" feature bit that we always want to have,
			// either the device can set its own MAC Address (as it does now)
			// or the driver can set it using a controller thread.
			break;
		case VIRTIO_ID_BLOCK:
			break;
		case 0:
			return "Invalid device id (0x0)! On the MMIO transport, this value indicates that the device is a system memory map with placeholder devices at static, well known addresses. In any case, this is not something you validate features for.";
		default:
			return "Validation not implemented for this device type! You MUST implement validation for this device! You should add your new code to the virtio_validate_feat function in vmm/virtio.c.";
	}

	// Validate common features
	if (!(feat & ((uint64_t)1 << VIRTIO_F_VERSION_1)))
		return "A device MUST offer the VIRTIO_F_VERSION_1 feature bit and a driver MUST accept it.\n"
		       "  See virtio-v1.0-cs04 s6.1 & s6.2.";

	return NULL;
}
