1f4f73431SOleksandr Tymoshenko /*-
2f4f73431SOleksandr Tymoshenko * Copyright (c) 2015 Oleksandr Tymoshenko <gonzo@freebsd.org>
3f4f73431SOleksandr Tymoshenko *
4f4f73431SOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without
5f4f73431SOleksandr Tymoshenko * modification, are permitted provided that the following conditions
6f4f73431SOleksandr Tymoshenko * are met:
7f4f73431SOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright
8f4f73431SOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer.
9f4f73431SOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright
10f4f73431SOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the
11f4f73431SOleksandr Tymoshenko * documentation and/or other materials provided with the distribution.
12f4f73431SOleksandr Tymoshenko *
13f4f73431SOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14f4f73431SOleksandr Tymoshenko * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15f4f73431SOleksandr Tymoshenko * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16f4f73431SOleksandr Tymoshenko * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17f4f73431SOleksandr Tymoshenko * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18f4f73431SOleksandr Tymoshenko * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19f4f73431SOleksandr Tymoshenko * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20f4f73431SOleksandr Tymoshenko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21f4f73431SOleksandr Tymoshenko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22f4f73431SOleksandr Tymoshenko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23f4f73431SOleksandr Tymoshenko * SUCH DAMAGE.
24f4f73431SOleksandr Tymoshenko */
25*fdafd315SWarner Losh
26f4f73431SOleksandr Tymoshenko #include <sys/param.h>
27f4f73431SOleksandr Tymoshenko #include <sys/systm.h>
28f4f73431SOleksandr Tymoshenko #include <sys/kernel.h>
29f4f73431SOleksandr Tymoshenko #include <sys/malloc.h>
30f4f73431SOleksandr Tymoshenko #include <sys/module.h>
31f4f73431SOleksandr Tymoshenko #include <sys/ioccom.h>
32f4f73431SOleksandr Tymoshenko #include <sys/conf.h>
33f4f73431SOleksandr Tymoshenko #include <sys/proc.h>
34f4f73431SOleksandr Tymoshenko
35f4f73431SOleksandr Tymoshenko #include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
36f4f73431SOleksandr Tymoshenko
37f4f73431SOleksandr Tymoshenko MALLOC_DECLARE(M_VCIO);
38f4f73431SOleksandr Tymoshenko MALLOC_DEFINE(M_VCIO, "vcio", "VCIO temporary buffers");
39f4f73431SOleksandr Tymoshenko
40f4f73431SOleksandr Tymoshenko static struct cdev *sdev;
41f4f73431SOleksandr Tymoshenko static d_ioctl_t vcio_ioctl;
42f4f73431SOleksandr Tymoshenko
43f4f73431SOleksandr Tymoshenko static struct cdevsw vcio_devsw = {
44f4f73431SOleksandr Tymoshenko /* version */ .d_version = D_VERSION,
45f4f73431SOleksandr Tymoshenko /* ioctl */ .d_ioctl = vcio_ioctl,
46f4f73431SOleksandr Tymoshenko };
47f4f73431SOleksandr Tymoshenko
48f4f73431SOleksandr Tymoshenko #define VCIO_IOC_MAGIC 100
49f4f73431SOleksandr Tymoshenko #define IOCTL_MBOX_PROPERTY _IOWR(VCIO_IOC_MAGIC, 0, char *)
50f4f73431SOleksandr Tymoshenko
51f4f73431SOleksandr Tymoshenko int
vcio_ioctl(struct cdev * dev,u_long cmd,caddr_t arg,int mode,struct thread * td)52f4f73431SOleksandr Tymoshenko vcio_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int mode,
53f4f73431SOleksandr Tymoshenko struct thread *td)
54f4f73431SOleksandr Tymoshenko {
55f4f73431SOleksandr Tymoshenko int error;
56f4f73431SOleksandr Tymoshenko void *ptr;
57f4f73431SOleksandr Tymoshenko uint32_t size;
58f4f73431SOleksandr Tymoshenko uint8_t *property;
59f4f73431SOleksandr Tymoshenko
60f4f73431SOleksandr Tymoshenko error = 0;
61f4f73431SOleksandr Tymoshenko switch(cmd) {
62f4f73431SOleksandr Tymoshenko case IOCTL_MBOX_PROPERTY:
63f4f73431SOleksandr Tymoshenko memcpy (&ptr, arg, sizeof(ptr));
64f4f73431SOleksandr Tymoshenko error = copyin(ptr, &size, sizeof(size));
65f4f73431SOleksandr Tymoshenko
66f4f73431SOleksandr Tymoshenko if (error != 0)
67f4f73431SOleksandr Tymoshenko break;
68f4f73431SOleksandr Tymoshenko property = malloc(size, M_VCIO, M_WAITOK);
69f4f73431SOleksandr Tymoshenko
70f4f73431SOleksandr Tymoshenko error = copyin(ptr, property, size);
71f4f73431SOleksandr Tymoshenko if (error) {
72f4f73431SOleksandr Tymoshenko free(property, M_VCIO);
73f4f73431SOleksandr Tymoshenko break;
74f4f73431SOleksandr Tymoshenko }
75f4f73431SOleksandr Tymoshenko
76f4f73431SOleksandr Tymoshenko error = bcm2835_mbox_property(property, size);
77f4f73431SOleksandr Tymoshenko if (error) {
78f4f73431SOleksandr Tymoshenko free(property, M_VCIO);
79f4f73431SOleksandr Tymoshenko break;
80f4f73431SOleksandr Tymoshenko }
81f4f73431SOleksandr Tymoshenko
82f4f73431SOleksandr Tymoshenko error = copyout(property, ptr, size);
83f4f73431SOleksandr Tymoshenko free(property, M_VCIO);
84f4f73431SOleksandr Tymoshenko
85f4f73431SOleksandr Tymoshenko break;
86f4f73431SOleksandr Tymoshenko default:
87f4f73431SOleksandr Tymoshenko error = EINVAL;
88f4f73431SOleksandr Tymoshenko break;
89f4f73431SOleksandr Tymoshenko }
90f4f73431SOleksandr Tymoshenko return (error);
91f4f73431SOleksandr Tymoshenko }
92f4f73431SOleksandr Tymoshenko
93f4f73431SOleksandr Tymoshenko static int
vcio_load(module_t mod,int cmd,void * arg)94f4f73431SOleksandr Tymoshenko vcio_load(module_t mod, int cmd, void *arg)
95f4f73431SOleksandr Tymoshenko {
96f4f73431SOleksandr Tymoshenko int err = 0;
97f4f73431SOleksandr Tymoshenko
98f4f73431SOleksandr Tymoshenko switch (cmd) {
99f4f73431SOleksandr Tymoshenko case MOD_LOAD:
100f4f73431SOleksandr Tymoshenko sdev = make_dev(&vcio_devsw, 0, UID_ROOT, GID_WHEEL, 0600, "vcio");
101f4f73431SOleksandr Tymoshenko break;
102f4f73431SOleksandr Tymoshenko
103f4f73431SOleksandr Tymoshenko case MOD_UNLOAD:
104f4f73431SOleksandr Tymoshenko destroy_dev(sdev);
105f4f73431SOleksandr Tymoshenko break;
106f4f73431SOleksandr Tymoshenko
107f4f73431SOleksandr Tymoshenko default:
108f4f73431SOleksandr Tymoshenko err = EOPNOTSUPP;
109f4f73431SOleksandr Tymoshenko break;
110f4f73431SOleksandr Tymoshenko }
111f4f73431SOleksandr Tymoshenko
112f4f73431SOleksandr Tymoshenko return(err);
113f4f73431SOleksandr Tymoshenko }
114f4f73431SOleksandr Tymoshenko
115f4f73431SOleksandr Tymoshenko DEV_MODULE(vcio, vcio_load, NULL);
116f4f73431SOleksandr Tymoshenko MODULE_DEPEND(vcio, mbox, 1, 1, 1);
117