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
39struct firmware;
40
41struct 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
50int linuxkpi_request_firmware_nowait(struct module *, bool, const char *,
51    struct device *, gfp_t, void *,
52    void(*cont)(const struct linuxkpi_firmware *, void *));
53int linuxkpi_request_firmware(const struct linuxkpi_firmware **,
54    const char *, struct device *);
55int linuxkpi_firmware_request_nowarn(const struct linuxkpi_firmware **,
56    const char *, struct device *);
57void linuxkpi_release_firmware(const struct linuxkpi_firmware *);
58int linuxkpi_request_partial_firmware_into_buf(const struct linuxkpi_firmware **,
59    const char *, struct device *, uint8_t *, size_t, size_t);
60
61
62static __inline int
63request_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
73static __inline int
74request_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
81static __inline int
82request_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
89static __inline int
90firmware_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
97static __inline void
98release_firmware(const struct linuxkpi_firmware *fw)
99{
100
101	linuxkpi_release_firmware(fw);
102}
103
104static inline int
105request_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