[PATCH V2 03/12] virtio-console: switch to use .validate()

Jason Wang
2021-10-12T06:53:29Z

This patch switches to use validate() to filter out the features that
is not supported by the rproc.

Cc: Amit Shah <amit@kernel.org>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
drivers/char/virtio_console.c | 41 ++++++++++++++++++++++-------------
1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 7eaf303a7a86..daeed31df622 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1172,9 +1172,7 @@ static void resize_console(struct port *port)

vdev = port->portdev->vdev;

- /* Don't test F_SIZE at all if we're rproc: not a valid feature! */
- if (!is_rproc_serial(vdev) &&
- virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE))
+ if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE))
hvc_resize(port->cons.hvc, port->cons.ws);
}

@@ -1981,6 +1979,29 @@ static void virtcons_remove(struct virtio_device *vdev)
kfree(portdev);
}

+static int virtcons_validate(struct virtio_device *vdev)
+{
+ if (is_rproc_serial(vdev)) {
+ /* Don't test F_SIZE at all if we're rproc: not a
+ * valid feature! */
+ __virtio_clear_bit(vdev, VIRTIO_CONSOLE_F_SIZE);
+ /* Don't test MULTIPORT at all if we're rproc: not a
+ * valid feature! */
+ __virtio_clear_bit(vdev, VIRTIO_CONSOLE_F_MULTIPORT);
+ }
+
+ /* We only need a config space if features are offered */
+ if (!vdev->config->get &&
+ (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)
+ || virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT))) {
+ dev_err(&vdev->dev, "%s failure: config access disabled\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
/*
* Once we're further in boot, we get probed like any other virtio
* device.
@@ -1996,15 +2017,6 @@ static int virtcons_probe(struct virtio_device *vdev)
bool multiport;
bool early = early_put_chars != NULL;

- /* We only need a config space if features are offered */
- if (!vdev->config->get &&
- (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)
- || virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT))) {
- dev_err(&vdev->dev, "%s failure: config access disabled\n",
- __func__);
- return -EINVAL;
- }
-
/* Ensure to read early_put_chars now */
barrier();

@@ -2031,9 +2043,7 @@ static int virtcons_probe(struct virtio_device *vdev)
multiport = false;
portdev->max_nr_ports = 1;

- /* Don't test MULTIPORT at all if we're rproc: not a valid feature! */
- if (!is_rproc_serial(vdev) &&
- virtio_cread_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT,
+ if (virtio_cread_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT,
struct virtio_console_config, max_nr_ports,
&portdev->max_nr_ports) == 0) {
multiport = true;
@@ -2210,6 +2220,7 @@ static struct virtio_driver virtio_console = {
.driver.name = KBUILD_MODNAME,
.driver.owner = THIS_MODULE,
.id_table = id_table,
+ .validate = virtcons_validate,
.probe = virtcons_probe,
.remove = virtcons_remove,
.config_changed = config_intr,
--
2.25.1