xref: /openbsd/sys/dev/pci/drm/include/linux/firmware.h (revision 1bb76ff1)
17f4dd379Sjsg /* Public domain. */
27f4dd379Sjsg 
37f4dd379Sjsg #ifndef _LINUX_FIRMWARE_H
47f4dd379Sjsg #define _LINUX_FIRMWARE_H
57f4dd379Sjsg 
67f4dd379Sjsg #include <sys/types.h>
77f4dd379Sjsg #include <sys/malloc.h>
87f4dd379Sjsg #include <sys/device.h>
97f4dd379Sjsg #include <linux/types.h>
10c349dbc7Sjsg #include <linux/gfp.h>
117f4dd379Sjsg 
127f4dd379Sjsg #ifndef __DECONST
137f4dd379Sjsg #define __DECONST(type, var)	((type)(__uintptr_t)(const void *)(var))
147f4dd379Sjsg #endif
157f4dd379Sjsg 
167f4dd379Sjsg struct firmware {
177f4dd379Sjsg 	size_t size;
187f4dd379Sjsg 	const u8 *data;
197f4dd379Sjsg };
207f4dd379Sjsg 
217f4dd379Sjsg static inline int
request_firmware(const struct firmware ** fw,const char * name,struct device * device)227f4dd379Sjsg request_firmware(const struct firmware **fw, const char *name,
237f4dd379Sjsg     struct device *device)
247f4dd379Sjsg {
257f4dd379Sjsg 	int r;
267f4dd379Sjsg 	struct firmware *f = malloc(sizeof(struct firmware), M_DRM,
277f4dd379Sjsg 	    M_WAITOK | M_ZERO);
287f4dd379Sjsg 	r = loadfirmware(name, __DECONST(u_char **, &f->data), &f->size);
297f4dd379Sjsg 	if (r != 0) {
307f4dd379Sjsg 		free(f, M_DRM, sizeof(struct firmware));
317f4dd379Sjsg 		*fw = NULL;
327f4dd379Sjsg 		return -r;
337f4dd379Sjsg 	} else  {
347f4dd379Sjsg 		*fw = f;
357f4dd379Sjsg 		return 0;
367f4dd379Sjsg 	}
377f4dd379Sjsg }
387f4dd379Sjsg 
39ef1d491fSkettenis static inline int
firmware_request_nowarn(const struct firmware ** fw,const char * name,struct device * device)40*1bb76ff1Sjsg firmware_request_nowarn(const struct firmware **fw, const char *name,
41*1bb76ff1Sjsg     struct device *device)
42*1bb76ff1Sjsg {
43*1bb76ff1Sjsg 	return request_firmware(fw, name, device);
44*1bb76ff1Sjsg }
45*1bb76ff1Sjsg 
46*1bb76ff1Sjsg static inline int
request_firmware_direct(const struct firmware ** fw,const char * name,struct device * device)47ef1d491fSkettenis request_firmware_direct(const struct firmware **fw, const char *name,
48ef1d491fSkettenis     struct device *device)
49ef1d491fSkettenis {
50ef1d491fSkettenis 	return request_firmware(fw, name, device);
51ef1d491fSkettenis }
52ef1d491fSkettenis 
537f4dd379Sjsg #define request_firmware_nowait(a, b, c, d, e, f, g) -EINVAL
547f4dd379Sjsg 
557f4dd379Sjsg static inline void
release_firmware(const struct firmware * fw)567f4dd379Sjsg release_firmware(const struct firmware *fw)
577f4dd379Sjsg {
587f4dd379Sjsg 	if (fw)
597f4dd379Sjsg 		free(__DECONST(u_char *, fw->data), M_DEVBUF, fw->size);
607f4dd379Sjsg 	free(__DECONST(struct firmware *, fw), M_DRM, sizeof(*fw));
617f4dd379Sjsg }
627f4dd379Sjsg 
637f4dd379Sjsg #endif
64