x86: ivybridge: Use syscon for the GMA device
authorSimon Glass <sjg@chromium.org>
Sun, 17 Jan 2016 23:11:59 +0000 (16:11 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Sun, 24 Jan 2016 04:09:42 +0000 (12:09 +0800)
Until we have a proper video uclass we can use syscon to handle the GMA
device, and avoid the special device tree and PCI searching. Update the code
to work this way.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/ivybridge/bd82x6x.c
arch/x86/cpu/ivybridge/early_me.c
arch/x86/cpu/ivybridge/gma.c
arch/x86/dts/chromebook_link.dts
arch/x86/include/asm/arch-ivybridge/bd82x6x.h
arch/x86/include/asm/cpu.h

index 2591b2000fcec792751eb1a30da5d0bf0bb06548..2b172d49bade73704529abfbadd64beb28a932a7 100644 (file)
@@ -9,6 +9,8 @@
 #include <fdtdec.h>
 #include <malloc.h>
 #include <pch.h>
+#include <syscon.h>
+#include <asm/cpu.h>
 #include <asm/io.h>
 #include <asm/lapic.h>
 #include <asm/pci.h>
@@ -149,8 +151,7 @@ void pch_iobp_update(struct udevice *dev, u32 address, u32 andvalue,
 
 static int bd82x6x_probe(struct udevice *dev)
 {
-       const void *blob = gd->fdt_blob;
-       int gma_node;
+       struct udevice *gma_dev;
        int ret;
 
        if (!(gd->flags & GD_FLG_RELOC))
@@ -159,15 +160,10 @@ static int bd82x6x_probe(struct udevice *dev)
        /* Cause the SATA device to do its init */
        uclass_first_device(UCLASS_DISK, &dev);
 
-       gma_node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_GMA);
-       if (gma_node < 0) {
-               debug("%s: Cannot find GMA node\n", __func__);
-               return -EINVAL;
-       }
-       ret = dm_pci_bus_find_bdf(PCH_VIDEO_DEV, &dev);
+       ret = syscon_get_by_driver_data(X86_SYSCON_GMA, &gma_dev);
        if (ret)
                return ret;
-       ret = gma_func0_init(dev, blob, gma_node);
+       ret = gma_func0_init(gma_dev);
        if (ret)
                return ret;
 
index f0d68990065fcea88fa27cca0f2a9e760f77888a..b1df77d571b30ae08d7c91dcf779eefedfea7f11 100644 (file)
@@ -191,6 +191,7 @@ int intel_early_me_init_done(struct udevice *dev, struct udevice *me_dev,
 
 static const struct udevice_id ivybridge_syscon_ids[] = {
        { .compatible = "intel,me", .data = X86_SYSCON_ME },
+       { .compatible = "intel,gma", .data = X86_SYSCON_GMA },
        { }
 };
 
index f9b03f2ef649924367b8d00857d52e01720bf991..3b6291e9054d607c1c563e8541ebf143e7d1672e 100644 (file)
@@ -538,8 +538,10 @@ static int gma_pm_init_pre_vbios(void *gtt_bar, int rev)
        return 0;
 }
 
-int gma_pm_init_post_vbios(int rev, void *gtt_bar, const void *blob, int node)
+int gma_pm_init_post_vbios(struct udevice *dev, int rev, void *gtt_bar)
 {
+       const void *blob = gd->fdt_blob;
+       int node = dev->of_offset;
        u32 reg32, cycle_delay;
 
        debug("GT Power Management Init (post VBIOS)\n");
@@ -794,7 +796,7 @@ void sandybridge_setup_graphics(struct udevice *dev, struct udevice *video_dev)
        writel(reg32, MCHBAR_REG(0x5418));
 }
 
-int gma_func0_init(struct udevice *dev, const void *blob, int node)
+int gma_func0_init(struct udevice *dev)
 {
 #ifdef CONFIG_VIDEO
        ulong start;
@@ -839,7 +841,7 @@ int gma_func0_init(struct udevice *dev, const void *blob, int node)
        debug("BIOS ran in %lums\n", get_timer(start));
 #endif
        /* Post VBIOS init */
-       ret = gma_pm_init_post_vbios(rev, gtt_bar, blob, node);
+       ret = gma_pm_init_post_vbios(dev, rev, gtt_bar);
        if (ret)
                return ret;
 
index 662e5d9a00ce7eac07f88634a12e10b9a6fec9f0..d148d6e349cd87f0d8c06395834aca3f52909e5e 100644 (file)
                        u-boot,dm-pre-reloc;
                };
 
-               gma {
+               gma@2,0 {
+                       reg = <0x00001000 0 0 0 0>;
                        compatible = "intel,gma";
                        intel,dp_hotplug = <0 0 0x06>;
                        intel,panel-port-select = <1>;
index 2607da63ea2311a624dc8cf4af01017e855f5f33..e866580046619bfab3675b8455ba4cd1f0aea65a 100644 (file)
@@ -7,6 +7,6 @@
 #ifndef _ASM_ARCH_BD82X6X_H
 #define _ASM_ARCH_BD82X6X_H
 
-int gma_func0_init(struct udevice *dev, const void *blob, int node);
+int gma_func0_init(struct udevice *dev);
 
 #endif
index 76cdf4750981ef381adcc9cbea5f2c14774755bc..18b034598639059048ed1922b5ee961a465675b7 100644 (file)
@@ -47,11 +47,13 @@ enum {
 
 /*
  * System controllers in an x86 system. We mostly need to just find these and
- * use them on PCI. At some point these might have their own uclass.
+ * use them on PCI. At some point these might have their own uclass (e.g.
+ * UCLASS_VIDEO for the GMA device).
  */
 enum {
        X86_NONE,
        X86_SYSCON_ME,          /* Intel Management Engine */
+       X86_SYSCON_GMA,         /* Intel Graphics Media Accelerator */
 };
 
 struct cpuid_result {