> Date: Fri, 16 Aug 2019 22:21:33 +0200 (CEST)
> From: Mark Kettenis <[email protected]>
>
> The diff below provides a minimal implementation of some of the Linux
> ACPI iterfaces. Enough to allow us to compile the ACPI code for
> radeon(4) and amdgpu(4). With this diff the brightness keys on my HP
> laptop with:
>
> cpu0: AMD A4-4355M APU with Radeon(tm) HD Graphics, 1897.56 MHz, 15-10-01
> ...
> radeondrm0 at pci0 dev 1 function 0 "ATI Radeon HD 7400G" rev 0x00
>
> now work. I'd like to see some more tests, especially on laptops with
> amdgpu(4). Diff has some debug printing enabled. Feel free to share
> the dmesg output with me.
So here is a new diff that addresses the issues that jsg@ raised. It
also adds another debug printf that should help diagnose what's going
on with the debug keys.
Index: dev/pci/drm/drm_drv.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/drm_drv.c,v
retrieving revision 1.164
diff -u -p -r1.164 drm_drv.c
--- dev/pci/drm/drm_drv.c 30 Jul 2019 05:50:20 -0000 1.164
+++ dev/pci/drm/drm_drv.c 17 Aug 2019 12:27:49 -0000
@@ -55,6 +55,14 @@
#include <uvm/uvm.h>
#include <uvm/uvm_device.h>
+#include <machine/bus.h>
+
+#ifdef __HAVE_ACPI
+#include <dev/acpi/acpidev.h>
+#include <dev/acpi/acpivar.h>
+#include <dev/acpi/dsdt.h>
+#endif
+
#include <drm/drmP.h>
#include <drm/drm_gem.h>
#include <uapi/drm/drm.h>
@@ -76,7 +84,7 @@ struct drm_softc {
#ifdef DRMDEBUG
unsigned int drm_debug = DRM_UT_DRIVER | DRM_UT_KMS;
#else
-unsigned int drm_debug = 0;
+unsigned int drm_debug = DRM_UT_DRIVER;
#endif
int drm_firstopen(struct drm_device *);
@@ -256,6 +264,12 @@ drm_attach(struct device *parent, struct
dev->bridgetag = da->bridgetag;
dev->pdev->tag = da->tag;
dev->pdev->pci = (struct pci_softc *)parent->dv_parent;
+
+#ifdef CONFIG_ACPI
+ dev->pdev->dev.node = acpi_find_pci(da->pc, da->tag);
+ aml_register_notify(dev->pdev->dev.node, NULL,
+ drm_linux_acpi_notify, NULL, ACPIDEV_NOPOLL);
+#endif
rw_init(&dev->struct_mutex, "drmdevlk");
mtx_init(&dev->event_lock, IPL_TTY);
Index: dev/pci/drm/drm_linux.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v
retrieving revision 1.47
diff -u -p -r1.47 drm_linux.c
--- dev/pci/drm/drm_linux.c 5 Aug 2019 08:35:59 -0000 1.47
+++ dev/pci/drm/drm_linux.c 17 Aug 2019 12:27:49 -0000
@@ -987,6 +987,8 @@ vga_put(struct pci_dev *pdev, int rsrc)
#include <dev/acpi/acpireg.h>
#include <dev/acpi/acpivar.h>
+#include <dev/acpi/amltypes.h>
+#include <dev/acpi/dsdt.h>
acpi_status
acpi_get_table(const char *sig, int instance,
@@ -1008,6 +1010,131 @@ acpi_get_table(const char *sig, int inst
}
return AE_NOT_FOUND;
+}
+
+acpi_status
+acpi_get_handle(acpi_handle node, const char *name, acpi_handle *rnode)
+{
+ node = aml_searchname(node, name);
+ if (node == NULL)
+ return AE_NOT_FOUND;
+
+ *rnode = node;
+ return 0;
+}
+
+acpi_status
+acpi_get_name(acpi_handle node, int type, struct acpi_buffer *buffer)
+{
+ KASSERT(buffer->length != ACPI_ALLOCATE_BUFFER);
+ KASSERT(type == ACPI_FULL_PATHNAME);
+ strlcpy(buffer->pointer, aml_nodename(node), buffer->length);
+ return 0;
+}
+
+acpi_status
+acpi_evaluate_object(acpi_handle node, const char *name,
+ struct acpi_object_list *params, struct acpi_buffer *result)
+{
+ struct aml_value args[4], res;
+ union acpi_object *obj;
+ uint8_t *data;
+ int i;
+
+ KASSERT(params->count <= nitems(args));
+
+ for (i = 0; i < params->count; i++) {
+ args[i].type = params->pointer[i].type;
+ switch (args[i].type) {
+ case AML_OBJTYPE_INTEGER:
+ args[i].v_integer = params->pointer[i].integer.value;
+ break;
+ case AML_OBJTYPE_BUFFER:
+ args[i].length = params->pointer[i].buffer.length;
+ args[i].v_buffer = params->pointer[i].buffer.pointer;
+ break;
+ default:
+ printf("%s: arg type 0x%02x", __func__, args[i].type);
+ return AE_BAD_PARAMETER;
+ }
+ }
+
+ if (name) {
+ node = aml_searchname(node, name);
+ if (node == NULL)
+ return AE_NOT_FOUND;
+ }
+ if (aml_evalnode(acpi_softc, node, params->count, args, &res)) {
+ aml_freevalue(&res);
+ return AE_ERROR;
+ }
+
+ KASSERT(result->length == ACPI_ALLOCATE_BUFFER);
+
+ result->length = sizeof(union acpi_object);
+ switch (res.type) {
+ case AML_OBJTYPE_BUFFER:
+ result->length += res.length;
+ result->pointer = malloc(result->length, M_DRM, M_WAITOK);
+ obj = (union acpi_object *)result->pointer;
+ data = (uint8_t *)(obj + 1);
+ obj->type = res.type;
+ obj->buffer.length = res.length;
+ obj->buffer.pointer = data;
+ memcpy(data, res.v_buffer, res.length);
+ break;
+ default:
+ printf("%s: return type 0x%02x", __func__, res.type);
+ aml_freevalue(&res);
+ return AE_ERROR;
+ }
+
+ aml_freevalue(&res);
+ return 0;
+}
+
+SLIST_HEAD(, notifier_block) drm_linux_acpi_notify_list =
+ SLIST_HEAD_INITIALIZER(drm_linux_acpi_notify_list);
+
+int
+drm_linux_acpi_notify(struct aml_node *node, int notify, void *arg)
+{
+ struct acpi_bus_event event;
+ struct notifier_block *nb;
+
+ event.device_class = ACPI_VIDEO_CLASS;
+ event.type = notify;
+
+ SLIST_FOREACH(nb, &drm_linux_acpi_notify_list, link)
+ nb->notifier_call(nb, 0, &event);
+ return 0;
+}
+
+int
+register_acpi_notifier(struct notifier_block *nb)
+{
+ SLIST_INSERT_HEAD(&drm_linux_acpi_notify_list, nb, link);
+ return 0;
+}
+
+int
+unregister_acpi_notifier(struct notifier_block *nb)
+{
+ SLIST_REMOVE(&drm_linux_acpi_notify_list, nb, notifier_block, link);
+ return 0;
+}
+
+const char *
+acpi_format_exception(acpi_status status)
+{
+ switch (status) {
+ case AE_NOT_FOUND:
+ return "not found";
+ case AE_BAD_PARAMETER:
+ return "bad parameter";
+ default:
+ return "unknown";
+ }
}
#endif
Index: dev/pci/drm/files.drm
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/files.drm,v
retrieving revision 1.45
diff -u -p -r1.45 files.drm
--- dev/pci/drm/files.drm 21 May 2019 22:40:06 -0000 1.45
+++ dev/pci/drm/files.drm 17 Aug 2019 12:27:49 -0000
@@ -235,7 +235,7 @@ file dev/pci/drm/radeon/r600_cs.c
rade
file dev/pci/drm/radeon/r600_dma.c radeondrm
file dev/pci/drm/radeon/r600_dpm.c radeondrm
file dev/pci/drm/radeon/r600_hdmi.c radeondrm
-#file dev/pci/drm/radeon/radeon_acpi.c radeondrm
+file dev/pci/drm/radeon/radeon_acpi.c radeondrm & acpi
file dev/pci/drm/radeon/radeon_agp.c radeondrm
file dev/pci/drm/radeon/radeon_asic.c radeondrm
file dev/pci/drm/radeon/radeon_atombios.c radeondrm
@@ -518,7 +518,7 @@ file dev/pci/drm/amd/amdgpu/amdgpu_vce_v
device amdgpu: drmbase, ttm, wsemuldisplaydev, rasops8, rasops32, i2cbus,
i2c_bitbang, drm_sched, chash, powerplay, amddal
attach amdgpu at pci
-#file dev/pci/drm/amd/amdgpu/amdgpu_acpi.c amdgpu
+file dev/pci/drm/amd/amdgpu/amdgpu_acpi.c amdgpu & acpi
file dev/pci/drm/amd/amdgpu/amdgpu_afmt.c amdgpu
file dev/pci/drm/amd/amdgpu/amdgpu_amdkfd.c amdgpu
file dev/pci/drm/amd/amdgpu/amdgpu_atombios.c amdgpu
Index: dev/pci/drm/amd/amdgpu/amdgpu_acpi.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/amd/amdgpu/amdgpu_acpi.c,v
retrieving revision 1.2
diff -u -p -r1.2 amdgpu_acpi.c
--- dev/pci/drm/amd/amdgpu/amdgpu_acpi.c 11 Jun 2019 11:47:24 -0000
1.2
+++ dev/pci/drm/amd/amdgpu/amdgpu_acpi.c 17 Aug 2019 12:27:49 -0000
@@ -1,3 +1,4 @@
+#define DRMDEBUG
/*
* Copyright 2012 Advanced Micro Devices, Inc.
*
@@ -207,6 +208,8 @@ static int amdgpu_atif_verify_interface(
/* TODO: check version? */
DRM_DEBUG_DRIVER("ATIF version %u\n", output.version);
+ printf("XXX notifications 0x%08x functions 0x%08x\n",
+ output.notification_mask, output.function_bits);
amdgpu_atif_parse_notification(&atif->notifications,
output.notification_mask);
amdgpu_atif_parse_functions(&atif->functions, output.function_bits);
Index: dev/pci/drm/amd/amdgpu/amdgpu_bios.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/amd/amdgpu/amdgpu_bios.c,v
retrieving revision 1.1
diff -u -p -r1.1 amdgpu_bios.c
--- dev/pci/drm/amd/amdgpu/amdgpu_bios.c 21 May 2019 22:40:06 -0000
1.1
+++ dev/pci/drm/amd/amdgpu/amdgpu_bios.c 17 Aug 2019 12:27:49 -0000
@@ -37,10 +37,6 @@
#include <dev/isa/isavar.h>
#endif
-#ifdef __HAVE_ACPI
-#include "acpi.h"
-#endif
-
/*
* BIOS.
*/
@@ -476,10 +472,6 @@ static bool amdgpu_read_disabled_bios(st
else
return amdgpu_asic_read_disabled_bios(adev);
}
-
-#if NACPI > 0
-#define CONFIG_ACPI
-#endif
#ifdef CONFIG_ACPI
static bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)
Index: dev/pci/drm/i915/i915_drv.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_drv.h,v
retrieving revision 1.82
diff -u -p -r1.82 i915_drv.h
--- dev/pci/drm/i915/i915_drv.h 4 May 2019 11:34:47 -0000 1.82
+++ dev/pci/drm/i915/i915_drv.h 17 Aug 2019 12:27:50 -0000
@@ -55,11 +55,6 @@
#include <drm/drm_gem.h>
#include <drm/drm_cache.h>
-#include "acpi.h"
-#if NACPI > 0
-#define CONFIG_ACPI
-#endif
-
#include "drm.h"
#include "vga.h"
Index: dev/pci/drm/include/drm/drmP.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/drm/drmP.h,v
retrieving revision 1.4
diff -u -p -r1.4 drmP.h
--- dev/pci/drm/include/drm/drmP.h 14 Aug 2019 05:32:56 -0000 1.4
+++ dev/pci/drm/include/drm/drmP.h 17 Aug 2019 12:27:50 -0000
@@ -242,6 +242,7 @@ struct drm_attach_args {
#define DRMDEVCF_PRIMARY_UNK -1
void drm_linux_init(void);
+int drm_linux_acpi_notify(struct aml_node *, int, void *);
/* Device setup support (drm_drv.c) */
int drm_pciprobe(struct pci_attach_args *, const struct drm_pcidev * );
Index: dev/pci/drm/include/generated/autoconf.h
===================================================================
RCS file: dev/pci/drm/include/generated/autoconf.h
diff -N dev/pci/drm/include/generated/autoconf.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ dev/pci/drm/include/generated/autoconf.h 17 Aug 2019 12:27:50 -0000
@@ -0,0 +1,37 @@
+/* Public domain. */
+
+#include <sys/param.h>
+
+#define CONFIG_BACKLIGHT_CLASS_DEVICE 1
+#define CONFIG_DRM_FBDEV_EMULATION 1
+#define CONFIG_DRM_FBDEV_OVERALLOC 0
+#define CONFIG_DRM_I915_DEBUG 0
+#define CONFIG_DRM_I915_DEBUG_GEM 0
+#define CONFIG_DRM_I915_FBDEV 1
+#define CONFIG_DRM_I915_ALPHA_SUPPORT 0
+#define CONFIG_DRM_I915_CAPTURE_ERROR 1
+#define CONFIG_DRM_I915_GVT 0
+#define CONFIG_DRM_I915_SW_FENCE_CHECK_DAG 0
+#define CONFIG_PM 0
+#define CONFIG_DRM_AMD_DC 1
+#define CONFIG_DRM_AMD_DC_DCN1_0 1
+#if 0
+#define CONFIG_DRM_AMDGPU_CIK 1
+#define CONFIG_DRM_AMDGPU_SI 1
+#endif
+
+#ifdef __HAVE_ACPI
+#include "acpi.h"
+#if NACPI > 0
+#define CONFIG_ACPI 1
+#endif
+#endif
+
+#include "agp.h"
+#if NAGP > 0
+#define CONFIG_AGP 1
+#endif
+
+#if defined(__amd64__) || defined(__i386__)
+#define CONFIG_DMI 1
+#endif
Index: dev/pci/drm/include/linux/acpi.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/acpi.h,v
retrieving revision 1.1
diff -u -p -r1.1 acpi.h
--- dev/pci/drm/include/linux/acpi.h 14 Apr 2019 10:14:53 -0000 1.1
+++ dev/pci/drm/include/linux/acpi.h 17 Aug 2019 12:27:50 -0000
@@ -13,13 +13,71 @@
typedef size_t acpi_size;
typedef int acpi_status;
+typedef struct aml_node *acpi_handle;
+
+struct acpi_bus_event {
+ const char *device_class;
+ int type;
+};
+
+struct acpi_buffer {
+ size_t length;
+ void *pointer;
+};
+
+#define ACPI_ALLOCATE_BUFFER (size_t)-1
+
+union acpi_object {
+ int type;
+ struct {
+ int type;
+ uint64_t value;
+ } integer;
+ struct {
+ int type;
+ size_t length;
+ void *pointer;
+ } buffer;
+};
+
+#define ACPI_TYPE_INTEGER 1
+#define ACPI_TYPE_BUFFER 3
+
+struct acpi_object_list {
+ int count;
+ union acpi_object *pointer;
+};
struct acpi_table_header;
#define ACPI_SUCCESS(x) ((x) == 0)
+#define ACPI_FAILURE(x) ((x) != 0)
-#define AE_NOT_FOUND 0x0005
+#define AE_ERROR 1
+#define AE_NOT_FOUND 2
+#define AE_BAD_PARAMETER 3
acpi_status acpi_get_table(const char *, int, struct acpi_table_header **);
+
+acpi_status acpi_evaluate_object(acpi_handle, const char *,
+ struct acpi_object_list *, struct acpi_buffer *);
+
+acpi_status acpi_get_handle(acpi_handle, const char *, acpi_handle *);
+acpi_status acpi_get_name(acpi_handle, int, struct acpi_buffer *);
+
+#define ACPI_FULL_PATHNAME 1
+
+#define ACPI_VIDEO_CLASS "video"
+
+#define ACPI_VIDEO_NOTIFY_PROBE 0x81
+
+#define ACPI_HANDLE(x) ((x)->node)
+
+const char *acpi_format_exception(acpi_status);
+
+struct notifier_block;
+
+int register_acpi_notifier(struct notifier_block *);
+int unregister_acpi_notifier(struct notifier_block *);
#endif
Index: dev/pci/drm/include/linux/backlight.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/backlight.h,v
retrieving revision 1.1
diff -u -p -r1.1 backlight.h
--- dev/pci/drm/include/linux/backlight.h 14 Apr 2019 10:14:53 -0000
1.1
+++ dev/pci/drm/include/linux/backlight.h 17 Aug 2019 12:27:50 -0000
@@ -31,6 +31,8 @@ struct backlight_device {
#define BACKLIGHT_RAW 0
#define BACKLIGHT_FIRMWARE 1
+#define BACKLIGHT_UPDATE_HOTKEY 0
+
struct backlight_device *backlight_device_register(const char *, void *,
void *, const struct backlight_ops *, struct backlight_properties *);
void backlight_device_unregister(struct backlight_device *);
@@ -39,6 +41,12 @@ static inline void
backlight_update_status(struct backlight_device *bd)
{
bd->ops->update_status(bd);
+}
+
+static inline void
+backlight_force_update(struct backlight_device *bd, int reason)
+{
+ bd->props.brightness = bd->ops->get_brightness(bd);
}
void backlight_schedule_update_status(struct backlight_device *);
Index: dev/pci/drm/include/linux/kconfig.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/kconfig.h,v
retrieving revision 1.4
diff -u -p -r1.4 kconfig.h
--- dev/pci/drm/include/linux/kconfig.h 14 Aug 2019 05:32:56 -0000 1.4
+++ dev/pci/drm/include/linux/kconfig.h 17 Aug 2019 12:27:50 -0000
@@ -3,43 +3,17 @@
#ifndef _LINUX_KCONFIG_H
#define _LINUX_KCONFIG_H
-#include "agp.h"
-
#include <sys/endian.h>
+#include <generated/autoconf.h>
+
#define IS_ENABLED(x) x - 0
#define IS_BUILTIN(x) 1
-#define CONFIG_DRM_FBDEV_EMULATION 1
-#define CONFIG_DRM_FBDEV_OVERALLOC 0
-#define CONFIG_BACKLIGHT_CLASS_DEVICE 1
-#define CONFIG_DRM_I915_DEBUG 0
-#define CONFIG_DRM_I915_DEBUG_GEM 0
-#define CONFIG_DRM_I915_FBDEV 1
-#define CONFIG_DRM_I915_ALPHA_SUPPORT 0
-#define CONFIG_DRM_I915_CAPTURE_ERROR 1
-#define CONFIG_DRM_I915_GVT 0
-#define CONFIG_DRM_I915_SW_FENCE_CHECK_DAG 0
-#define CONFIG_PM 0
-#define CONFIG_DRM_AMD_DC 1
-#define CONFIG_DRM_AMD_DC_DCN1_0 1
-#if 0
-#define CONFIG_DRM_AMDGPU_CIK 1
-#define CONFIG_DRM_AMDGPU_SI 1
-#endif
-
#if BYTE_ORDER == BIG_ENDIAN
#define __BIG_ENDIAN
#else
#define __LITTLE_ENDIAN
-#endif
-
-#if NAGP > 0
-#define CONFIG_AGP 1
-#endif
-
-#if defined(__amd64__) || defined(__i386__)
-#define CONFIG_DMI 1
#endif
#endif
Index: dev/pci/drm/include/linux/notifier.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/notifier.h,v
retrieving revision 1.1
diff -u -p -r1.1 notifier.h
--- dev/pci/drm/include/linux/notifier.h 14 Apr 2019 10:14:53 -0000
1.1
+++ dev/pci/drm/include/linux/notifier.h 17 Aug 2019 12:27:50 -0000
@@ -4,7 +4,8 @@
#define _LINUX_NOTIFIER_H
struct notifier_block {
- void *notifier_call;
+ int (*notifier_call)(struct notifier_block *, unsigned long, void *);
+ SLIST_ENTRY(notifier_block) link;
};
#define ATOMIC_INIT_NOTIFIER_HEAD(x)
Index: dev/pci/drm/include/linux/pci.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/include/linux/pci.h,v
retrieving revision 1.2
diff -u -p -r1.2 pci.h
--- dev/pci/drm/include/linux/pci.h 15 Jul 2019 03:35:23 -0000 1.2
+++ dev/pci/drm/include/linux/pci.h 17 Aug 2019 12:27:50 -0000
@@ -39,6 +39,10 @@ struct pci_bus {
struct pci_dev *self;
};
+struct pci_acpi {
+ struct aml_node *node;
+};
+
struct pci_dev {
struct pci_bus _bus;
struct pci_bus *bus;
@@ -57,6 +61,8 @@ struct pci_dev {
int irq;
int msi_enabled;
uint8_t no_64bit_msi;
+
+ struct pci_acpi dev;
};
#define PCI_ANY_ID (uint16_t) (~0U)
@@ -272,6 +278,17 @@ pci_set_power_state(struct pci_dev *dev,
{
return 0;
}
+
+static inline struct pci_dev *
+pci_get_class(pcireg_t class, struct pci_dev *pdev)
+{
+ return NULL;
+}
+
+#define PCI_CLASS_DISPLAY_VGA \
+ (PCI_CLASS_DISPLAY | PCI_SUBCLASS_DISPLAY_VGA)
+#define PCI_CLASS_DISPLAY_OTHER \
+ (PCI_CLASS_DISPLAY | PCI_SUBCLASS_DISPLAY_MISC)
#if defined(__amd64__) || defined(__i386__)
Index: dev/pci/drm/radeon/radeon_acpi.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_acpi.c,v
retrieving revision 1.6
diff -u -p -r1.6 radeon_acpi.c
--- dev/pci/drm/radeon/radeon_acpi.c 14 Apr 2019 10:14:54 -0000 1.6
+++ dev/pci/drm/radeon/radeon_acpi.c 17 Aug 2019 12:27:50 -0000
@@ -1,3 +1,4 @@
+#define DRMDEBUG
/*
* Copyright 2012 Advanced Micro Devices, Inc.
*
@@ -229,6 +230,8 @@ static int radeon_atif_verify_interface(
/* TODO: check version? */
DRM_DEBUG_DRIVER("ATIF version %u\n", output.version);
+ printf("XXX notifications 0x%08x functions 0x%08x\n",
+ output.notification_mask, output.function_bits);
radeon_atif_parse_notification(&atif->notifications,
output.notification_mask);
radeon_atif_parse_functions(&atif->functions, output.function_bits);
Index: dev/pci/drm/radeon/radeon_bios.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_bios.c,v
retrieving revision 1.15
diff -u -p -r1.15 radeon_bios.c
--- dev/pci/drm/radeon/radeon_bios.c 14 Apr 2019 10:14:54 -0000 1.15
+++ dev/pci/drm/radeon/radeon_bios.c 17 Aug 2019 12:27:50 -0000
@@ -42,10 +42,6 @@
#include <machine/autoconf.h>
#endif
-#ifdef __HAVE_ACPI
-#include "acpi.h"
-#endif
-
/*
* BIOS.
*/
@@ -737,10 +733,6 @@ static bool radeon_read_disabled_bios(st
else
return legacy_read_disabled_bios(rdev);
}
-
-#if NACPI > 0
-#define CONFIG_ACPI
-#endif
#ifdef CONFIG_ACPI
static bool radeon_acpi_vfct_bios(struct radeon_device *rdev)