firmware.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  20. * DEALINGS IN THE SOFTWARE.
  21. */
  22. #include <core/device.h>
  23. #include <core/firmware.h>
  24. /**
  25. * nvkm_firmware_get - load firmware from the official nvidia/chip/ directory
  26. * @device device that will use that firmware
  27. * @fwname name of firmware file to load
  28. * @fw firmware structure to load to
  29. *
  30. * Use this function to load firmware files in the form nvidia/chip/fwname.bin.
  31. * Firmware files released by NVIDIA will always follow this format.
  32. */
  33. int
  34. nvkm_firmware_get(struct nvkm_device *device, const char *fwname,
  35. const struct firmware **fw)
  36. {
  37. char f[64];
  38. char cname[16];
  39. int i;
  40. /* Convert device name to lowercase */
  41. strncpy(cname, device->chip->name, sizeof(cname));
  42. cname[sizeof(cname) - 1] = '\0';
  43. i = strlen(cname);
  44. while (i) {
  45. --i;
  46. cname[i] = tolower(cname[i]);
  47. }
  48. snprintf(f, sizeof(f), "nvidia/%s/%s.bin", cname, fwname);
  49. return request_firmware(fw, f, device->dev);
  50. }
  51. /**
  52. * nvkm_firmware_put - release firmware loaded with nvkm_firmware_get
  53. */
  54. void
  55. nvkm_firmware_put(const struct firmware *fw)
  56. {
  57. release_firmware(fw);
  58. }