|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 06/10] plat/xen/drivers/cons: Configure Consfront
This patch provides configure which and intializes
the ring. Grants access to backend.
Signed-off-by: Birlea Costin <costin.birlea@xxxxxxxxx>
---
plat/xen/drivers/cons/consfront.c | 130 ++++++++++++++++++++++++++++++++++++++
plat/xen/drivers/cons/consfront.h | 6 ++
2 files changed, 136 insertions(+)
diff --git a/plat/xen/drivers/cons/consfront.c
b/plat/xen/drivers/cons/consfront.c
index 33adabf7..cdbed0f5 100644
--- a/plat/xen/drivers/cons/consfront.c
+++ b/plat/xen/drivers/cons/consfront.c
@@ -60,6 +60,21 @@
static struct uk_alloc *drv_allocator;
+static void consfront_rx_handler(evtchn_port_t port __unused,
+ struct __regs *regs __unused,
+ void *data __unused)
+{
+ struct uk_consdev *dev = (struct uk_consdev *) data;
+ struct consfront_dev *cfdev;
+
+ cfdev = to_consfront(dev);
+ UK_ASSERT(cfdev);
+
+ mask_evtchn(cfdev->evtchn);
+
+ uk_consdev_drv_rx_event(dev);
+}
+
static void consfront_info_get(struct uk_consdev *dev __unused,
struct uk_consdev_info *dev_info)
{
@@ -90,6 +105,117 @@ static int consfront_tx_info_get(struct uk_consdev *dev
__unused,
return 0;
}
+static int consfront_ring_init(struct consfront_dev *cfdev)
+{
+ struct xenbus_device *xendev;
+
+ xendev = cfdev->xendev;
+
+ cfdev->ring = uk_malloc_page(drv_allocator);
+ if (!cfdev->ring)
+ return -ENOMEM;
+ memset(cfdev->ring, 0, PAGE_SIZE);
+
+ cfdev->ring_ref = gnttab_grant_access(xendev->otherend_id,
+ virt_to_mfn(cfdev->ring), 0);
+ UK_ASSERT(cfdev->ring_ref != GRANT_INVALID_REF);
+
+ return 0;
+}
+
+static int consfront_configure(struct uk_consdev *dev,
+ const struct uk_consdev_conf *dev_conf)
+{
+ struct consfront_dev *cfdev;
+ int rc = 0;
+
+ UK_ASSERT(dev);
+ UK_ASSERT(dev_conf);
+
+ cfdev = to_consfront(dev);
+ UK_ASSERT(cfdev);
+
+ rc = consfront_ring_init(cfdev);
+
+ return rc;
+}
+
+static int consfront_rx_configure(struct uk_consdev *dev,
+ uint16_t nb_desc,
+ const struct uk_consdev_rx_conf *rx_conf __unused)
+{
+ struct consfront_dev *cfdev;
+ struct xenbus_device *xendev;
+ int rc = 0;
+
+ cfdev = to_consfront(dev);
+ UK_ASSERT(cfdev);
+
+ xendev = cfdev->xendev;
+ UK_ASSERT(xendev);
+
+ if ((nb_desc != 0) &&
+ (nb_desc != XEN_CONSFRONT_SIZE_IN))
+ return -EINVAL;
+
+ rc = evtchn_alloc_unbound(xendev->otherend_id,
+ consfront_rx_handler, dev, &cfdev->evtchn);
+ if (rc < 0) {
+ uk_pr_err("Error creating event channel: %d.\n", rc);
+ return rc;
+ }
+
+ /* Start with interrupts disabled, API user should enable them */
+ mask_evtchn(cfdev->evtchn);
+
+ return rc;
+}
+
+static int consfront_tx_configure(struct uk_consdev *dev __unused,
+ uint16_t nb_desc,
+ const struct uk_consdev_tx_conf *tx_conf __unused)
+{
+ /* Although we don't use nb_desc, user still has to abide the API */
+ if ((nb_desc != 0) &&
+ (nb_desc != XEN_CONSFRONT_SIZE_OUT))
+ return -EINVAL;
+
+ return 0;
+}
+
+static void consfront_ring_release(struct consfront_dev *cfdev)
+{
+ int rc = 0;
+
+ /* Release ring */
+ if (cfdev->ring_ref != GRANT_INVALID_REF) {
+ rc = gnttab_end_access(cfdev->ring_ref);
+ UK_ASSERT(rc);
+ }
+
+ if (cfdev->ring) {
+ uk_free_page(drv_allocator, cfdev->ring);
+ cfdev->ring = NULL;
+ }
+}
+
+static int consfront_release(struct uk_consdev *dev)
+{
+ struct consfront_dev *cfdev;
+
+ UK_ASSERT(dev);
+
+ cfdev = to_consfront(dev);
+ UK_ASSERT(cfdev);
+
+ mask_evtchn(cfdev->evtchn);
+ unbind_evtchn(cfdev->evtchn);
+
+ consfront_ring_release(cfdev);
+
+ return 0;
+}
+
static void consfront_close(struct uk_consdev *dev)
{
struct consfront_dev *cfdev;
@@ -110,6 +236,10 @@ static const struct uk_consdev_ops consfront_ops = {
.info_get = consfront_info_get,
.rx_info_get = consfront_rx_info_get,
.tx_info_get = consfront_tx_info_get,
+ .configure = consfront_configure,
+ .rx_configure = consfront_rx_configure,
+ .tx_configure = consfront_tx_configure,
+ .release = consfront_release,
.close = consfront_close,
};
diff --git a/plat/xen/drivers/cons/consfront.h
b/plat/xen/drivers/cons/consfront.h
index 3772c7a1..61cb2df4 100644
--- a/plat/xen/drivers/cons/consfront.h
+++ b/plat/xen/drivers/cons/consfront.h
@@ -47,6 +47,12 @@ struct consfront_dev {
struct xenbus_device *xendev;
/* Consdev Device. */
struct uk_consdev consdev;
+ /* Xen Console Ring */
+ struct xencons_interface *ring;
+ /* Grant ref pointing at the front ring. */
+ grant_ref_t ring_ref;
+ /* Event channel for the front ring. */
+ evtchn_port_t evtchn;
/* The consdev identifier */
__u16 uid;
};
--
2.11.0
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |