Module Name:    src
Committed By:   mrg
Date:           Mon Jul  5 20:32:24 UTC 2010

Modified Files:
        src/distrib/sets/lists/base: mi
        src/sys/dev/microcode: Makefile
        src/sys/external/bsd/drm/dist/bsd-core: radeon_drv.c
        src/sys/external/bsd/drm/dist/shared-core: r600_cp.c radeon_cp.c
            radeon_drv.h

Log Message:
move all the radeondrm firmware images into the filesystem.  check that
some firmware sizes are the expected size.  (XXX make all.)

based upon similar changes seen in the linux radeon drm driver.

this saves about 250KB in the kernel or module.


To generate a diff of this commit:
cvs rdiff -u -r1.873 -r1.874 src/distrib/sets/lists/base/mi
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/microcode/Makefile
cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm/dist/bsd-core/radeon_drv.c
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm/dist/shared-core/r600_cp.c
cvs rdiff -u -r1.7 -r1.8 \
    src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c
cvs rdiff -u -r1.8 -r1.9 \
    src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/base/mi
diff -u src/distrib/sets/lists/base/mi:1.873 src/distrib/sets/lists/base/mi:1.874
--- src/distrib/sets/lists/base/mi:1.873	Sat Jul  3 08:16:50 2010
+++ src/distrib/sets/lists/base/mi	Mon Jul  5 20:32:23 2010
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.873 2010/07/03 08:16:50 jmmv Exp $
+# $NetBSD: mi,v 1.874 2010/07/05 20:32:23 mrg Exp $
 #
 # Note:	Don't delete entries from here - mark them as "obsolete" instead,
 #	unless otherwise stated below.
@@ -881,6 +881,48 @@
 ./usr/libdata/debug/usr/mdec			base-sys-usr
 ./usr/libdata/debug/usr/sbin			base-sys-usr
 ./usr/libdata/firmware				base-sys-usr
+./usr/libdata/firmware/radeon			base-sys-usr
+./usr/libdata/firmware/radeon/CEDAR_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/CEDAR_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/CEDAR_rlc.bin	base-sys-usr
+./usr/libdata/firmware/radeon/CYPRESS_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/CYPRESS_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/CYPRESS_rlc.bin	base-sys-usr
+./usr/libdata/firmware/radeon/JUNIPER_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/JUNIPER_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/JUNIPER_rlc.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R100_cp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R200_cp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R300_cp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R420_cp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R520_cp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R600_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R600_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R600_rlc.bin	base-sys-usr
+./usr/libdata/firmware/radeon/R700_rlc.bin	base-sys-usr
+./usr/libdata/firmware/radeon/REDWOOD_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/REDWOOD_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/REDWOOD_rlc.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RS600_cp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RS690_cp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RS780_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RS780_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV610_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV610_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV620_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV620_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV630_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV630_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV635_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV635_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV670_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV670_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV710_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV710_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV730_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV730_pfp.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV770_me.bin	base-sys-usr
+./usr/libdata/firmware/radeon/RV770_pfp.bin	base-sys-usr
 ./usr/libdata/ldscripts				base-c-usr
 ./usr/libdata/lint				base-c-usr
 ./usr/libexec					base-sys-usr

Index: src/sys/dev/microcode/Makefile
diff -u src/sys/dev/microcode/Makefile:1.7 src/sys/dev/microcode/Makefile:1.8
--- src/sys/dev/microcode/Makefile:1.7	Sat Jun  9 11:20:56 2007
+++ src/sys/dev/microcode/Makefile	Mon Jul  5 20:32:24 2010
@@ -1,5 +1,6 @@
-#	$NetBSD: Makefile,v 1.7 2007/06/09 11:20:56 kiyohara Exp $
+#	$NetBSD: Makefile,v 1.8 2010/07/05 20:32:24 mrg Exp $
 
 SUBDIR+=	ral rum zyd
+SUBDIR+=	radeon
 
 .include <bsd.subdir.mk>

Index: src/sys/external/bsd/drm/dist/bsd-core/radeon_drv.c
diff -u src/sys/external/bsd/drm/dist/bsd-core/radeon_drv.c:1.9 src/sys/external/bsd/drm/dist/bsd-core/radeon_drv.c:1.10
--- src/sys/external/bsd/drm/dist/bsd-core/radeon_drv.c:1.9	Wed Mar  3 03:48:39 2010
+++ src/sys/external/bsd/drm/dist/bsd-core/radeon_drv.c	Mon Jul  5 20:32:24 2010
@@ -259,4 +259,38 @@
 }
 #endif /* _MODULE */
 
+
+#include <dev/firmload.h>
+
+int radeon_load_a_microcode(const char *fmt, const char *chip_name, void **codep, size_t *sizep)
+{
+	firmware_handle_t fh;
+	char fw_name[30];
+	int error;
+
+	snprintf(fw_name, sizeof(fw_name), fmt, chip_name);
+	if ((error = firmware_open("radeon", fw_name, &fh)) != 0) {
+		DRM_ERROR("Cannot open radeon/%s firmware: %d\n", fw_name, error);
+		return error;
+	}
+	*sizep = firmware_get_size(fh);
+	if ((*codep = firmware_malloc(*sizep)) == NULL) {
+		DRM_ERROR("Cannot alloc memory for radeon/%s firmware\n", chip_name);
+		firmware_close(fh);
+		return ENOMEM;
+	}
+	if ((error = firmware_read(fh, 0, *codep, *sizep)) != 0) {
+		DRM_ERROR("Cannot read radeon/%s firmware: %d\n", chip_name, error);
+		firmware_free(*codep, *sizep);
+	}
+	firmware_close(fh);
+
+	return error;
+}
+
+void radeon_free_a_microcode(void *code, size_t size)
+{
+	firmware_free(code, size);
+}
+
 #endif

Index: src/sys/external/bsd/drm/dist/shared-core/r600_cp.c
diff -u src/sys/external/bsd/drm/dist/shared-core/r600_cp.c:1.3 src/sys/external/bsd/drm/dist/shared-core/r600_cp.c:1.4
--- src/sys/external/bsd/drm/dist/shared-core/r600_cp.c:1.3	Sat Jun 26 23:05:13 2010
+++ src/sys/external/bsd/drm/dist/shared-core/r600_cp.c	Mon Jul  5 20:32:24 2010
@@ -33,8 +33,12 @@
 #include "radeon_drv.h"
 #include "r300_reg.h"
 
-#include "r600_microcode.h"
-#include "radeonhd_microcode.h"
+#define PFP_UCODE_SIZE 576
+#define PM4_UCODE_SIZE 1792
+#define R700_PFP_UCODE_SIZE 848
+#define R700_PM4_UCODE_SIZE 1360
+#define EVERGREEN_PFP_UCODE_SIZE 1120
+#define EVERGREEN_PM4_UCODE_SIZE 1376
 
 # define ATI_PCIGART_PAGE_SIZE		4096	/**< PCI GART page size */
 # define ATI_PCIGART_PAGE_MASK		(~(ATI_PCIGART_PAGE_SIZE-1))
@@ -285,51 +289,48 @@
 /* load r600 microcode */
 static void r600_cp_load_microcode(drm_radeon_private_t * dev_priv)
 {
-	const u32 (*cp)[3];
-	const u32 *pfp;
-	int i;
+	const char *chip_name;
+	u32 (*me)[3];
+	u32 *pfp;
+	size_t pfp_size, me_size;
+	int i, error;
 
 	switch (dev_priv->flags & RADEON_FAMILY_MASK) {
 	case CHIP_R600:
-		DRM_INFO("Loading R600 Microcode\n");
-		cp  = R600_cp_microcode;
-		pfp = R600_pfp_microcode;
+		chip_name = "R600";
 		break;
 	case CHIP_RV610:
-		DRM_INFO("Loading RV610 Microcode\n");
-		cp  = RV610_cp_microcode;
-		pfp = RV610_pfp_microcode;
+		chip_name = "RV610";
 		break;
 	case CHIP_RV630:
-		DRM_INFO("Loading RV630 Microcode\n");
-		cp  = RV630_cp_microcode;
-		pfp = RV630_pfp_microcode;
+		chip_name = "RV630";
 		break;
 	case CHIP_RV620:
-		DRM_INFO("Loading RV620 Microcode\n");
-		cp  = RV620_cp_microcode;
-		pfp = RV620_pfp_microcode;
+		chip_name = "RV620";
 		break;
 	case CHIP_RV635:
-		DRM_INFO("Loading RV635 Microcode\n");
-		cp  = RV635_cp_microcode;
-		pfp = RV635_pfp_microcode;
+		chip_name = "RV635";
 		break;
 	case CHIP_RV670:
-		DRM_INFO("Loading RV670 Microcode\n");
-		cp  = RV670_cp_microcode;
-		pfp = RV670_pfp_microcode;
+		chip_name = "RV670";
 		break;
 	case CHIP_RS780:
 	case CHIP_RS880:
-		DRM_INFO("Loading RS780/RS880 Microcode\n");
-		cp  = RS780_cp_microcode;
-		pfp = RS780_pfp_microcode;
+		chip_name = "RS780";
 		break;
 	default:
 		return;
 	}
 
+	DRM_INFO("Loading %s Microcode\n", chip_name);
+
+	if ((error = radeon_load_a_microcode("%s_pfp.bin", chip_name, (void **)&pfp, &pfp_size)) != 0)
+		return;
+	if ((error = radeon_load_a_microcode("%s_me.bin", chip_name, (void **)&me, &me_size)) != 0) {
+		radeon_free_a_microcode(pfp, pfp_size);
+		return;
+	}
+
 	r600_do_cp_stop(dev_priv);
 
 	RADEON_WRITE(R600_CP_RB_CNTL,
@@ -345,19 +346,21 @@
 	RADEON_WRITE(R600_CP_ME_RAM_WADDR, 0);
 
 	for (i = 0; i < PM4_UCODE_SIZE; i++) {
-		RADEON_WRITE(R600_CP_ME_RAM_DATA, cp[i][0]);
-		RADEON_WRITE(R600_CP_ME_RAM_DATA, cp[i][1]);
-		RADEON_WRITE(R600_CP_ME_RAM_DATA, cp[i][2]);
+		RADEON_WRITE(R600_CP_ME_RAM_DATA, be32toh(me[i][0]));
+		RADEON_WRITE(R600_CP_ME_RAM_DATA, be32toh(me[i][1]));
+		RADEON_WRITE(R600_CP_ME_RAM_DATA, be32toh(me[i][2]));
 	}
 
 	RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0);
 	for (i = 0; i < PFP_UCODE_SIZE; i++)
-		RADEON_WRITE(R600_CP_PFP_UCODE_DATA, pfp[i]);
+		RADEON_WRITE(R600_CP_PFP_UCODE_DATA, be32toh(pfp[i]));
 
 	RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0);
 	RADEON_WRITE(R600_CP_ME_RAM_WADDR, 0);
 	RADEON_WRITE(R600_CP_ME_RAM_RADDR, 0);
 
+	radeon_free_a_microcode(pfp, pfp_size);
+	radeon_free_a_microcode(me, me_size);
 }
 
 static void r700_vm_init(struct drm_device *dev)
@@ -417,53 +420,49 @@
 static void r700_cp_load_microcode(drm_radeon_private_t * dev_priv)
 {
 	size_t pfp_req_size, me_req_size;
-
-	const u32 *pfp;
-	const u32 *cp;
-	int i;
+	const char *chip_name;
+	u32 *pfp;
+	u32 *me;
+	size_t pfp_size, me_size;
+	int i, error;
 
 	switch (dev_priv->flags & RADEON_FAMILY_MASK) {
 	case CHIP_RV770:
-		DRM_INFO("Loading RV770/RV790 Microcode\n");
-		pfp = RV770_pfp_microcode;
-		cp  = RV770_cp_microcode;
+		chip_name = "RV770";
 		break;
 	case CHIP_RV730:
 	case CHIP_RV740:
-		DRM_INFO("Loading RV730/RV740 Microcode\n");
-		pfp = RV730_pfp_microcode;
-		cp  = RV730_cp_microcode;
+		chip_name = "RV730";
 		break;
 	case CHIP_RV710:
-		DRM_INFO("Loading RV710 Microcode\n");
-		pfp = RV710_pfp_microcode;
-		cp  = RV710_cp_microcode;
+		chip_name = "RV710";
 		break;
 	case CHIP_CEDAR:
-		DRM_INFO("Loading CEDAR Microcode\n");
-		pfp = CEDAR_pfp_microcode;
-		cp  = CEDAR_me_microcode;
+		chip_name = "CEDAR";
 		break;
 	case CHIP_REDWOOD:
-		DRM_INFO("Loading REDWOOD Microcode\n");
-		pfp = REDWOOD_pfp_microcode;
-		cp  = REDWOOD_me_microcode;
+		chip_name = "REDWOOD";
 		break;
 	case CHIP_JUNIPER:
-		DRM_INFO("Loading JUNIPER Microcode\n");
-		pfp = JUNIPER_pfp_microcode;
-		cp  = JUNIPER_me_microcode;
+		chip_name = "JUNIPER";
 		break;
 	case CHIP_CYPRESS:
 	case CHIP_HEMLOCK:
-		DRM_INFO("Loading CYPRESS Microcode\n");
-		pfp = CYPRESS_pfp_microcode;
-		cp  = CYPRESS_me_microcode;
+		chip_name = "CYPRESS";
 		break;
 	default:
 		return;
 	}
 
+	DRM_INFO("Loading %s Microcode\n", chip_name);
+
+	if ((error = radeon_load_a_microcode("%s_pfp.bin", chip_name, (void **)&pfp, &pfp_size)) != 0)
+		return;
+	if ((error = radeon_load_a_microcode("%s_me.bin", chip_name, (void **)&me, &me_size)) != 0) {
+		radeon_free_a_microcode(pfp, pfp_size);
+		return;
+	}
+
 	if (((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_CEDAR)) {
 		pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
 		me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
@@ -472,6 +471,20 @@
 		me_req_size = R700_PM4_UCODE_SIZE * 4;
 	}
 
+	if (pfp_req_size != pfp_size) {
+		DRM_ERROR("Wrong size for %s_pfp.bin (got %zu want %zu)\n", chip_name, pfp_size, pfp_req_size);
+		radeon_free_a_microcode(pfp, pfp_size);
+		radeon_free_a_microcode(me, me_size);
+		return;
+	}
+
+	if (me_req_size != me_size) {
+		DRM_ERROR("Wrong size for %s_me.bin (got %zu want %zu)\n", chip_name, me_size, me_req_size);
+		radeon_free_a_microcode(pfp, pfp_size);
+		radeon_free_a_microcode(me, me_size);
+		return;
+	}
+
 	r600_do_cp_stop(dev_priv);
 
 	RADEON_WRITE(R600_CP_RB_CNTL,
@@ -485,19 +498,21 @@
 	RADEON_WRITE(R600_GRBM_SOFT_RESET, 0);
 
 	RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0);
-	for (i = 0; i < pfp_req_size; i++)
-		RADEON_WRITE(R600_CP_PFP_UCODE_DATA, pfp[i]);
+	for (i = 0; i < pfp_req_size / 4; i++)
+		RADEON_WRITE(R600_CP_PFP_UCODE_DATA, be32toh(pfp[i]));
 	RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0);
 
 	RADEON_WRITE(R600_CP_ME_RAM_WADDR, 0);
-	for (i = 0; i < me_req_size; i++)
-		RADEON_WRITE(R600_CP_ME_RAM_DATA, cp[i]);
+	for (i = 0; i < me_req_size / 4; i++)
+		RADEON_WRITE(R600_CP_ME_RAM_DATA, be32toh(me[i]));
 	RADEON_WRITE(R600_CP_ME_RAM_WADDR, 0);
 
 	RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0);
 	RADEON_WRITE(R600_CP_ME_RAM_WADDR, 0);
 	RADEON_WRITE(R600_CP_ME_RAM_RADDR, 0);
 
+	radeon_free_a_microcode(pfp, pfp_size);
+	radeon_free_a_microcode(me, me_size);
 }
 
 static void r600_test_writeback(drm_radeon_private_t * dev_priv)

Index: src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c
diff -u src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c:1.7 src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c:1.8
--- src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c:1.7	Mon May 24 01:39:06 2010
+++ src/sys/external/bsd/drm/dist/shared-core/radeon_cp.c	Mon Jul  5 20:32:24 2010
@@ -35,7 +35,6 @@
 #include "radeon_drv.h"
 #include "r300_reg.h"
 
-#include "radeon_microcode.h"
 #define RADEON_FIFO_DEBUG	0
 
 static int radeon_do_cleanup_cp(struct drm_device * dev);
@@ -374,8 +373,10 @@
 /* Load the microcode for the CP */
 static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv)
 {
+	const char *chip_name;
 	const u32 (*cp)[2];
-	int i;
+	int i, error;
+	size_t cp_size;
 	DRM_DEBUG("\n");
 
 	switch (dev_priv->flags & RADEON_FAMILY_MASK) {
@@ -384,15 +385,13 @@
 	case CHIP_RV200:
 	case CHIP_RS100:
 	case CHIP_RS200:
-		DRM_INFO("Loading R100 Microcode\n");
-		cp = R100_cp_microcode;
+		chip_name = "R100";
 		break;
 	case CHIP_R200:
 	case CHIP_RV250:
 	case CHIP_RV280:
 	case CHIP_RS300:
-		DRM_INFO("Loading R200 Microcode\n");
-		cp = R200_cp_microcode;
+		chip_name = "R200";
 		break;
 	case CHIP_R300:
 	case CHIP_R350:
@@ -400,23 +399,19 @@
 	case CHIP_RV380:
 	case CHIP_RS400:
 	case CHIP_RS480:
-		DRM_INFO("Loading R300 Microcode\n");
-		cp = R300_cp_microcode;
+		chip_name = "R300";
 		break;
 	case CHIP_R420:
 	case CHIP_R423:
 	case CHIP_RV410:
-		DRM_INFO("Loading R400 Microcode\n");
-		cp = R420_cp_microcode;
+		chip_name = "R420";
 		break;
 	case CHIP_RS690:
 	case CHIP_RS740:
-		DRM_INFO("Loading RS690/RS740 Microcode\n");
-		cp = RS690_cp_microcode;
+		chip_name = "RS690";
 		break;
 	case CHIP_RS600:
-		DRM_INFO("Loading RS600 Microcode\n");
-		cp = RS600_cp_microcode;
+		chip_name = "RS600";
 		break;
 	case CHIP_RV515:
 	case CHIP_R520:
@@ -424,21 +419,27 @@
 	case CHIP_R580:
 	case CHIP_RV560:
 	case CHIP_RV570:
-		DRM_INFO("Loading R500 Microcode\n");
-		cp = R520_cp_microcode;
+		chip_name = "R520";
 		break;
 	default:
 		return;
 	}
 
+	DRM_INFO("Loading %s Microcode\n", chip_name);
+
+	if ((error = radeon_load_a_microcode("%s_cp.bin", chip_name, (void **)&cp, &cp_size)) != 0)
+		return;
+
 	radeon_do_wait_for_idle(dev_priv);
 
 	RADEON_WRITE(RADEON_CP_ME_RAM_ADDR, 0);
 
 	for (i = 0; i != 256; i++) {
-		RADEON_WRITE(RADEON_CP_ME_RAM_DATAH, cp[i][1]);
-		RADEON_WRITE(RADEON_CP_ME_RAM_DATAL, cp[i][0]);
+		RADEON_WRITE(RADEON_CP_ME_RAM_DATAH, be32toh(cp[i][0]));
+		RADEON_WRITE(RADEON_CP_ME_RAM_DATAL, be32toh(cp[i][1]));
 	}
+
+	radeon_free_a_microcode(cp, cp_size);
 }
 
 

Index: src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h
diff -u src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h:1.8 src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h:1.9
--- src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h:1.8	Sat Jun 26 22:59:31 2010
+++ src/sys/external/bsd/drm/dist/shared-core/radeon_drv.h	Mon Jul  5 20:32:24 2010
@@ -548,6 +548,10 @@
 extern int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *fpriv);
 extern int r600_cs_init(struct drm_device *dev);
 
+/* part of platform code, usually radeon_drv.c */
+int radeon_load_a_microcode(const char *fmt, const char *chip_name, void **codep, size_t *sizep);
+void radeon_free_a_microcode(void *code, size_t size);
+
 /* Flags for stats.boxes
  */
 #define RADEON_BOX_DMA_IDLE      0x1

Reply via email to