Index: sys/external/bsd/drm2/dist/drm/radeon/cik.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/cik.c,v retrieving revision 1.2 diff -p -u -r1.2 cik.c --- sys/external/bsd/drm2/dist/drm/radeon/cik.c 16 Jul 2014 20:59:57 -0000 1.2 +++ sys/external/bsd/drm2/dist/drm/radeon/cik.c 25 Jul 2014 12:39:58 -0000 @@ -8233,6 +8233,36 @@ int cik_suspend(struct radeon_device *rd return 0; } +#ifdef __NetBSD__ /* XXX radeon firmware */ +static void +cik_init_mountroot(device_t self) +{ + struct radeon_device *const rdev = radeon_device_private(self); + int r; + + if (rdev->flags & RADEON_IS_IGP) { + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || + !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) { + r = cik_init_microcode(rdev); + if (r) { + DRM_ERROR("Failed to load firmware: %d\n", r); + /* XXX Detach? */ + } + } + } else { + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || + !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw || + !rdev->mc_fw) { + r = cik_init_microcode(rdev); + if (r) { + DRM_ERROR("Failed to load firmware: %d\n", r); + /* XXX Detach? */ + } + } + } +} +#endif + /* Plan is to move initialization in that function and use * helper function so that radeon_device_init pretty much * do nothing more than calling asic specific function. This @@ -8300,6 +8330,9 @@ int cik_init(struct radeon_device *rdev) if (r) return r; +#ifdef __NetBSD__ /* XXX radeon firmware */ + config_mountroot(rdev->ddev->dev, &cik_init_mountroot); +#else if (rdev->flags & RADEON_IS_IGP) { if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) { @@ -8320,6 +8353,7 @@ int cik_init(struct radeon_device *rdev) } } } +#endif /* Initialize power management */ radeon_pm_init(rdev); Index: sys/external/bsd/drm2/dist/drm/radeon/ni.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/ni.c,v retrieving revision 1.2 diff -p -u -r1.2 ni.c --- sys/external/bsd/drm2/dist/drm/radeon/ni.c 16 Jul 2014 20:59:57 -0000 1.2 +++ sys/external/bsd/drm2/dist/drm/radeon/ni.c 25 Jul 2014 12:39:58 -0000 @@ -2150,6 +2150,33 @@ int cayman_suspend(struct radeon_device return 0; } +#ifdef __NetBSD__ /* XXX radeon firmware */ +static void +cayman_init_mountroot(device_t self) +{ + struct radeon_device *const rdev = radeon_device_private(self); + int r; + + if (rdev->flags & RADEON_IS_IGP) { + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { + r = ni_init_microcode(rdev); + if (r) { + DRM_ERROR("Failed to load firmware: %d\n", r); + /* XXX Detach? */ + } + } + } else { + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { + r = ni_init_microcode(rdev); + if (r) { + DRM_ERROR("Failed to load firmware: %d\n", r); + /* XXX Detach? */ + } + } + } +} +#endif + /* Plan is to move initialization in that function and use * helper function so that radeon_device_init pretty much * do nothing more than calling asic specific function. This @@ -2205,6 +2232,9 @@ int cayman_init(struct radeon_device *rd if (r) return r; +#ifdef __NetBSD__ /* XXX radeon firmware */ + config_mountroot(rdev->ddev->dev, &cayman_init_mountroot); +#else if (rdev->flags & RADEON_IS_IGP) { if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { r = ni_init_microcode(rdev); @@ -2222,6 +2252,7 @@ int cayman_init(struct radeon_device *rd } } } +#endif /* Initialize power management */ radeon_pm_init(rdev); Index: sys/external/bsd/drm2/dist/drm/radeon/r100.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/r100.c,v retrieving revision 1.2 diff -p -u -r1.2 r100.c --- sys/external/bsd/drm2/dist/drm/radeon/r100.c 16 Jul 2014 20:59:57 -0000 1.2 +++ sys/external/bsd/drm2/dist/drm/radeon/r100.c 25 Jul 2014 12:39:58 -0000 @@ -1117,6 +1117,23 @@ static void r100_cp_load_microcode(struc } } +#ifdef __NetBSD__ /* XXX radeon firmware */ +static void +r100_cp_init_mountroot(device_t self) +{ + struct radeon_device *const rdev = radeon_device_private(self); + int r; + + if (!rdev->me_fw) { + r = r100_cp_init_microcode(rdev); + if (r) { + DRM_ERROR("Failed to load firmware: %d\n", r); + /* XXX Detach? */ + } + } +} +#endif + int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) { struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; @@ -1133,6 +1150,9 @@ int r100_cp_init(struct radeon_device *r if (r100_debugfs_cp_init(rdev)) { DRM_ERROR("Failed to register debugfs file for CP !\n"); } +#ifdef __NetBSD__ /* XXX radeon firmware */ + config_mountroot(rdev->ddev->dev, &r100_cp_init_mountroot); +#else if (!rdev->me_fw) { r = r100_cp_init_microcode(rdev); if (r) { @@ -1140,6 +1160,7 @@ int r100_cp_init(struct radeon_device *r return r; } } +#endif /* Align ring size */ rb_bufsz = order_base_2(ring_size / 8); Index: sys/external/bsd/drm2/dist/drm/radeon/r600.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/r600.c,v retrieving revision 1.2 diff -p -u -r1.2 r600.c --- sys/external/bsd/drm2/dist/drm/radeon/r600.c 16 Jul 2014 20:59:57 -0000 1.2 +++ sys/external/bsd/drm2/dist/drm/radeon/r600.c 25 Jul 2014 12:39:58 -0000 @@ -3050,6 +3050,23 @@ int r600_suspend(struct radeon_device *r return 0; } +#ifdef __NetBSD__ /* XXX radeon firmware */ +static void +r600_init_mountroot(device_t self) +{ + struct radeon_device *const rdev = radeon_device_private(self); + int r; + + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { + r = r600_init_microcode(rdev); + if (r) { + DRM_ERROR("Failed to load firmware: %d\n", r); + /* XXX Detach? */ + } + } +} +#endif + /* Plan is to move initialization in that function and use * helper function so that radeon_device_init pretty much * do nothing more than calling asic specific function. This @@ -3108,6 +3125,9 @@ int r600_init(struct radeon_device *rdev if (r) return r; +#ifdef __NetBSD__ /* XXX radeon firmware */ + config_mountroot(rdev->ddev->dev, &r600_init_mountroot); +#else if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { r = r600_init_microcode(rdev); if (r) { @@ -3115,6 +3135,7 @@ int r600_init(struct radeon_device *rdev return r; } } +#endif /* Initialize power management */ radeon_pm_init(rdev); Index: sys/external/bsd/drm2/dist/drm/radeon/r600_cp.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/r600_cp.c,v retrieving revision 1.1.1.1 diff -p -u -r1.1.1.1 r600_cp.c --- sys/external/bsd/drm2/dist/drm/radeon/r600_cp.c 16 Jul 2014 19:35:28 -0000 1.1.1.1 +++ sys/external/bsd/drm2/dist/drm/radeon/r600_cp.c 25 Jul 2014 12:39:58 -0000 @@ -1978,6 +1978,26 @@ int r600_do_cleanup_cp(struct drm_device return 0; } +#ifdef __NetBSD__ /* XXX radeon firmware */ +static void +r600_do_init_cp_mountroot(device_t self) +{ + struct radeon_device *const rdev = radeon_device_private(self); + + if (!dev_priv->me_fw || !dev_priv->pfp_fw) { + int err = r600_cp_init_microcode(dev_priv); + if (err) { + DRM_ERROR("Failed to load firmware: %d\n", err); + /* XXX Detach? */ + } + } + if (((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)) + r700_cp_load_microcode(dev_priv); + else + r600_cp_load_microcode(dev_priv); +} +#endif + int r600_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init, struct drm_file *file_priv) { @@ -2261,6 +2281,9 @@ int r600_do_init_cp(struct drm_device *d r600_vm_init(dev); } +#ifdef __NetBSD__ /* XXX radeon firmware */ + config_mountroot(rdev->ddev->dev, &r600_do_init_cp_mountroot); +#else if (!dev_priv->me_fw || !dev_priv->pfp_fw) { int err = r600_cp_init_microcode(dev_priv); if (err) { @@ -2273,6 +2296,7 @@ int r600_do_init_cp(struct drm_device *d r700_cp_load_microcode(dev_priv); else r600_cp_load_microcode(dev_priv); +#endif r600_cp_init_ring_buffer(dev, dev_priv, file_priv); Index: sys/external/bsd/drm2/dist/drm/radeon/radeon_uvd.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/radeon_uvd.c,v retrieving revision 1.2 diff -p -u -r1.2 radeon_uvd.c --- sys/external/bsd/drm2/dist/drm/radeon/radeon_uvd.c 16 Jul 2014 20:59:57 -0000 1.2 +++ sys/external/bsd/drm2/dist/drm/radeon/radeon_uvd.c 25 Jul 2014 12:39:58 -0000 @@ -54,8 +54,10 @@ MODULE_FIRMWARE(FIRMWARE_BONAIRE); static void radeon_uvd_idle_work_handler(struct work_struct *work); -int radeon_uvd_init(struct radeon_device *rdev) +static void +radeon_uvd_init_mountroot(device_t self) { + struct radeon_device *const rdev = radeon_device_private(self); unsigned long bo_size; const char *fw_name; int i, r; @@ -104,14 +106,14 @@ int radeon_uvd_init(struct radeon_device break; default: - return -EINVAL; + return; } r = request_firmware(&rdev->uvd_fw, fw_name, rdev->dev); if (r) { - dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n", - fw_name); - return r; + dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"" + ": %d\n", fw_name, r); + return; } bo_size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 8) + @@ -120,14 +122,14 @@ int radeon_uvd_init(struct radeon_device RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->uvd.vcpu_bo); if (r) { dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r); - return r; + return; } r = radeon_bo_reserve(rdev->uvd.vcpu_bo, false); if (r) { radeon_bo_unref(&rdev->uvd.vcpu_bo); dev_err(rdev->dev, "(%d) failed to reserve UVD bo\n", r); - return r; + return; } r = radeon_bo_pin(rdev->uvd.vcpu_bo, RADEON_GEM_DOMAIN_VRAM, @@ -136,13 +138,13 @@ int radeon_uvd_init(struct radeon_device radeon_bo_unreserve(rdev->uvd.vcpu_bo); radeon_bo_unref(&rdev->uvd.vcpu_bo); dev_err(rdev->dev, "(%d) UVD bo pin failed\n", r); - return r; + return; } r = radeon_bo_kmap(rdev->uvd.vcpu_bo, &rdev->uvd.cpu_addr); if (r) { dev_err(rdev->dev, "(%d) UVD map failed\n", r); - return r; + return; } radeon_bo_unreserve(rdev->uvd.vcpu_bo); @@ -152,12 +154,19 @@ int radeon_uvd_init(struct radeon_device rdev->uvd.filp[i] = NULL; rdev->uvd.img_size[i] = 0; } +} + +int radeon_uvd_init(struct radeon_device *rdev) +{ + config_mountroot(rdev->ddev->dev, &radeon_uvd_init_mountroot); return 0; } -void radeon_uvd_fini(struct radeon_device *rdev) +static void +radeon_uvd_fini_mountroot(device_t self) { + struct radeon_device *const rdev = radeon_device_private(self); int r; if (rdev->uvd.vcpu_bo == NULL) @@ -177,6 +186,12 @@ void radeon_uvd_fini(struct radeon_devic release_firmware(rdev->uvd_fw); } +void radeon_uvd_fini(struct radeon_device *rdev) +{ + + config_mountroot(rdev->ddev->dev, &radeon_uvd_fini_mountroot); +} + int radeon_uvd_suspend(struct radeon_device *rdev) { unsigned size; Index: sys/external/bsd/drm2/dist/drm/radeon/si.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/drm/radeon/si.c,v retrieving revision 1.2 diff -p -u -r1.2 si.c --- sys/external/bsd/drm2/dist/drm/radeon/si.c 16 Jul 2014 20:59:57 -0000 1.2 +++ sys/external/bsd/drm2/dist/drm/radeon/si.c 25 Jul 2014 12:39:58 -0000 @@ -6731,6 +6731,24 @@ int si_suspend(struct radeon_device *rde return 0; } +#ifdef __NetBSD__ /* XXX radeon firmware */ +static void +si_init_mountroot(device_t self) +{ + struct radeon_device *const rdev = radeon_device_private(self); + int r; + + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || + !rdev->rlc_fw || !rdev->mc_fw) { + r = si_init_microcode(rdev); + if (r) { + DRM_ERROR("Failed to load firmware: %d\n", r); + /* XXX Detach? */ + } + } +} +#endif + /* Plan is to move initialization in that function and use * helper function so that radeon_device_init pretty much * do nothing more than calling asic specific function. This @@ -6788,6 +6806,9 @@ int si_init(struct radeon_device *rdev) if (r) return r; +#ifdef __NetBSD__ /* XXX radeon firmware */ + config_mountroot(rdev->ddev->dev, &si_init_mountroot); +#else if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || !rdev->rlc_fw || !rdev->mc_fw) { r = si_init_microcode(rdev); @@ -6796,6 +6817,7 @@ int si_init(struct radeon_device *rdev) return r; } } +#endif /* Initialize power management */ radeon_pm_init(rdev);