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  * $FreeBSD$
32  */
33 
34 #ifndef	_LINUXKPI_LINUX_FIRMWARE_H
35 #define	_LINUXKPI_LINUX_FIRMWARE_H
36 
37 #include <sys/types.h>
38 #include <linux/types.h>
39 #include <linux/device.h>
40 
41 struct firmware;
42 
43 struct linuxkpi_firmware {
44 	size_t			size;
45 	const uint8_t		*data;
46 	/* XXX Does Linux expose anything else? */
47 
48 	/* This is LinuxKPI implementation private. */
49 	const struct firmware	*fbdfw;
50 };
51 
52 int linuxkpi_request_firmware_nowait(struct module *, bool, const char *,
53     struct device *, gfp_t, void *,
54     void(*cont)(const struct linuxkpi_firmware *, void *));
55 int linuxkpi_request_firmware(const struct linuxkpi_firmware **,
56     const char *, struct device *);
57 int linuxkpi_firmware_request_nowarn(const struct linuxkpi_firmware **,
58     const char *, struct device *);
59 void linuxkpi_release_firmware(const struct linuxkpi_firmware *);
60 int linuxkpi_request_partial_firmware_into_buf(const struct linuxkpi_firmware **,
61     const char *, struct device *, uint8_t *, size_t, size_t);
62 
63 
64 static __inline int
65 request_firmware_nowait(struct module *mod, bool _t,
66     const char *fw_name, struct device *dev, gfp_t gfp, void *drv,
67     void(*cont)(const struct linuxkpi_firmware *, void *))
68 {
69 
70 
71 	return (linuxkpi_request_firmware_nowait(mod, _t, fw_name, dev, gfp,
72 	    drv, cont));
73 }
74 
75 static __inline int
76 request_firmware(const struct linuxkpi_firmware **fw,
77     const char *fw_name, struct device *dev)
78 {
79 
80 	return (linuxkpi_request_firmware(fw, fw_name, dev));
81 }
82 
83 static __inline int
84 request_firmware_direct(const struct linuxkpi_firmware **fw,
85     const char *fw_name, struct device *dev)
86 {
87 
88 	return (linuxkpi_request_firmware(fw, fw_name, dev));
89 }
90 
91 static __inline int
92 firmware_request_nowarn(const struct linuxkpi_firmware **fw,
93     const char *fw_name, struct device *dev)
94 {
95 
96 	return (linuxkpi_firmware_request_nowarn(fw, fw_name, dev));
97 }
98 
99 static __inline void
100 release_firmware(const struct linuxkpi_firmware *fw)
101 {
102 
103 	linuxkpi_release_firmware(fw);
104 }
105 
106 static inline int
107 request_partial_firmware_into_buf(const struct linuxkpi_firmware **fw,
108     const char *fw_name, struct device *dev, void *buf, size_t buflen,
109     size_t offset)
110 {
111 
112 	return (linuxkpi_request_partial_firmware_into_buf(fw, fw_name,
113 	    dev, buf, buflen, offset));
114 }
115 
116 #define	firmware	linuxkpi_firmware
117 
118 #endif	/* _LINUXKPI_LINUX_FIRMWARE_H */
119