xref: /freebsd/sys/arm/broadcom/bcm2835/bcm2835_vcio.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
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