1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2020-2021 The FreeBSD Foundation
5  * Copyright (c) 2022 Bjoern A. Zeeb
6  *
7  * This software was developed by Björn Zeeb under sponsorship from
8  * the FreeBSD Foundation.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #ifndef	_LINUXKPI_LINUX_FIRMWARE_H
33 #define	_LINUXKPI_LINUX_FIRMWARE_H
34 
35 #include <sys/types.h>
36 #include <linux/types.h>
37 #include <linux/device.h>
38 
39 struct firmware;
40 
41 struct linuxkpi_firmware {
42 	size_t			size;
43 	const uint8_t		*data;
44 	/* XXX Does Linux expose anything else? */
45 
46 	/* This is LinuxKPI implementation private. */
47 	const struct firmware	*fbdfw;
48 };
49 
50 int linuxkpi_request_firmware_nowait(struct module *, bool, const char *,
51     struct device *, gfp_t, void *,
52     void(*cont)(const struct linuxkpi_firmware *, void *));
53 int linuxkpi_request_firmware(const struct linuxkpi_firmware **,
54     const char *, struct device *);
55 int linuxkpi_firmware_request_nowarn(const struct linuxkpi_firmware **,
56     const char *, struct device *);
57 void linuxkpi_release_firmware(const struct linuxkpi_firmware *);
58 int linuxkpi_request_partial_firmware_into_buf(const struct linuxkpi_firmware **,
59     const char *, struct device *, uint8_t *, size_t, size_t);
60 
61 
62 static __inline int
request_firmware_nowait(struct module * mod,bool _t,const char * fw_name,struct device * dev,gfp_t gfp,void * drv,void (* cont)(const struct linuxkpi_firmware *,void *))63 request_firmware_nowait(struct module *mod, bool _t,
64     const char *fw_name, struct device *dev, gfp_t gfp, void *drv,
65     void(*cont)(const struct linuxkpi_firmware *, void *))
66 {
67 
68 
69 	return (linuxkpi_request_firmware_nowait(mod, _t, fw_name, dev, gfp,
70 	    drv, cont));
71 }
72 
73 static __inline int
request_firmware(const struct linuxkpi_firmware ** fw,const char * fw_name,struct device * dev)74 request_firmware(const struct linuxkpi_firmware **fw,
75     const char *fw_name, struct device *dev)
76 {
77 
78 	return (linuxkpi_request_firmware(fw, fw_name, dev));
79 }
80 
81 static __inline int
request_firmware_direct(const struct linuxkpi_firmware ** fw,const char * fw_name,struct device * dev)82 request_firmware_direct(const struct linuxkpi_firmware **fw,
83     const char *fw_name, struct device *dev)
84 {
85 
86 	return (linuxkpi_request_firmware(fw, fw_name, dev));
87 }
88 
89 static __inline int
firmware_request_nowarn(const struct linuxkpi_firmware ** fw,const char * fw_name,struct device * dev)90 firmware_request_nowarn(const struct linuxkpi_firmware **fw,
91     const char *fw_name, struct device *dev)
92 {
93 
94 	return (linuxkpi_firmware_request_nowarn(fw, fw_name, dev));
95 }
96 
97 static __inline void
release_firmware(const struct linuxkpi_firmware * fw)98 release_firmware(const struct linuxkpi_firmware *fw)
99 {
100 
101 	linuxkpi_release_firmware(fw);
102 }
103 
104 static inline int
request_partial_firmware_into_buf(const struct linuxkpi_firmware ** fw,const char * fw_name,struct device * dev,void * buf,size_t buflen,size_t offset)105 request_partial_firmware_into_buf(const struct linuxkpi_firmware **fw,
106     const char *fw_name, struct device *dev, void *buf, size_t buflen,
107     size_t offset)
108 {
109 
110 	return (linuxkpi_request_partial_firmware_into_buf(fw, fw_name,
111 	    dev, buf, buflen, offset));
112 }
113 
114 #define	firmware	linuxkpi_firmware
115 
116 #endif	/* _LINUXKPI_LINUX_FIRMWARE_H */
117