aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linuxkpi/common/src/linux_firmware.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/linuxkpi/common/src/linux_firmware.c')
-rw-r--r--sys/compat/linuxkpi/common/src/linux_firmware.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/sys/compat/linuxkpi/common/src/linux_firmware.c b/sys/compat/linuxkpi/common/src/linux_firmware.c
index 47cccd42da20..17da91381280 100644
--- a/sys/compat/linuxkpi/common/src/linux_firmware.c
+++ b/sys/compat/linuxkpi/common/src/linux_firmware.c
@@ -2,6 +2,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2022 Bjoern A. Zeeb
*
* This software was developed by Björn Zeeb under sponsorship from
* the FreeBSD Foundation.
@@ -26,8 +27,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
#include <sys/param.h>
@@ -223,3 +222,26 @@ linuxkpi_release_firmware(const struct linuxkpi_firmware *fw)
firmware_put(fw->fbdfw, FIRMWARE_UNLOAD);
free(__DECONST(void *, fw), M_LKPI_FW);
}
+
+int
+linuxkpi_request_partial_firmware_into_buf(const struct linuxkpi_firmware **fw,
+ const char *fw_name, struct device *dev, uint8_t *buf, size_t buflen,
+ size_t offset)
+{
+ const struct linuxkpi_firmware *lfw;
+ int error;
+
+ error = linuxkpi_request_firmware(fw, fw_name, dev);
+ if (error != 0)
+ return (error);
+
+ lfw = *fw;
+ if ((offset + buflen) >= lfw->size) {
+ linuxkpi_release_firmware(lfw);
+ return (-ERANGE);
+ }
+
+ memcpy(buf, lfw->data + offset, buflen);
+
+ return (0);
+}