forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/radeon/radeon_bios.c
....@@ -25,13 +25,17 @@
2525 * Alex Deucher
2626 * Jerome Glisse
2727 */
28
-#include <drm/drmP.h>
29
-#include "radeon_reg.h"
30
-#include "radeon.h"
31
-#include "atom.h"
3228
33
-#include <linux/slab.h>
3429 #include <linux/acpi.h>
30
+#include <linux/pci.h>
31
+#include <linux/slab.h>
32
+
33
+#include <drm/drm_device.h>
34
+
35
+#include "atom.h"
36
+#include "radeon.h"
37
+#include "radeon_reg.h"
38
+
3539 /*
3640 * BIOS.
3741 */
....@@ -223,6 +227,7 @@
223227
224228 if (!found)
225229 return false;
230
+ pci_dev_put(pdev);
226231
227232 rdev->bios = kmalloc(size, GFP_KERNEL);
228233 if (!rdev->bios) {
....@@ -608,13 +613,14 @@
608613 acpi_size tbl_size;
609614 UEFI_ACPI_VFCT *vfct;
610615 unsigned offset;
616
+ bool r = false;
611617
612618 if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))
613619 return false;
614620 tbl_size = hdr->length;
615621 if (tbl_size < sizeof(UEFI_ACPI_VFCT)) {
616622 DRM_ERROR("ACPI VFCT table present but broken (too short #1)\n");
617
- return false;
623
+ goto out;
618624 }
619625
620626 vfct = (UEFI_ACPI_VFCT *)hdr;
....@@ -627,13 +633,13 @@
627633 offset += sizeof(VFCT_IMAGE_HEADER);
628634 if (offset > tbl_size) {
629635 DRM_ERROR("ACPI VFCT image header truncated\n");
630
- return false;
636
+ goto out;
631637 }
632638
633639 offset += vhdr->ImageLength;
634640 if (offset > tbl_size) {
635641 DRM_ERROR("ACPI VFCT image truncated\n");
636
- return false;
642
+ goto out;
637643 }
638644
639645 if (vhdr->ImageLength &&
....@@ -645,15 +651,18 @@
645651 rdev->bios = kmemdup(&vbios->VbiosContent,
646652 vhdr->ImageLength,
647653 GFP_KERNEL);
654
+ if (rdev->bios)
655
+ r = true;
648656
649
- if (!rdev->bios)
650
- return false;
651
- return true;
657
+ goto out;
652658 }
653659 }
654660
655661 DRM_ERROR("ACPI VFCT table present but broken (too short #2)\n");
656
- return false;
662
+
663
+out:
664
+ acpi_put_table(hdr);
665
+ return r;
657666 }
658667 #else
659668 static inline bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
....@@ -668,17 +677,17 @@
668677 uint16_t tmp;
669678
670679 r = radeon_atrm_get_bios(rdev);
671
- if (r == false)
680
+ if (!r)
672681 r = radeon_acpi_vfct_bios(rdev);
673
- if (r == false)
682
+ if (!r)
674683 r = igp_read_bios_from_vram(rdev);
675
- if (r == false)
684
+ if (!r)
676685 r = radeon_read_bios(rdev);
677
- if (r == false)
686
+ if (!r)
678687 r = radeon_read_disabled_bios(rdev);
679
- if (r == false)
688
+ if (!r)
680689 r = radeon_read_platform_bios(rdev);
681
- if (r == false || rdev->bios == NULL) {
690
+ if (!r || rdev->bios == NULL) {
682691 DRM_ERROR("Unable to locate a BIOS ROM\n");
683692 rdev->bios = NULL;
684693 return false;