diff --git a/patch.sh b/patch.sh index 976b75d482a632849b41034d1181ffa7cc02f352..71e4fc7bbd1633c7f11b380ce710fa5e663bf71b 100644 --- a/patch.sh +++ b/patch.sh @@ -557,30 +557,23 @@ drivers () { dir 'drivers/ti/tsc' dir 'drivers/ti/gpio' dir 'drivers/greybus' - #dir 'drivers/serdev' dir 'drivers/fb_ssd1306' - #dir 'drivers/mikrobus' } soc () { dir 'bootup_hacks' } -fixes () { - dir 'fixes/gcc' -} - ### backports #reverts drivers soc -fixes packaging () { #do_backport="enable" if [ "x${do_backport}" = "xenable" ] ; then - backport_tag="v6.0.8" + backport_tag="v6.1.1" subsystem="bindeb-pkg" #regenerate="enable" @@ -601,4 +594,4 @@ packaging () { packaging echo "patch.sh ran successfully" -# \ No newline at end of file +# diff --git a/patches/defconfig b/patches/defconfig index 531492de17fdc0836a23ded009243cb936cf95aa..7eafe5d0c10b2d63592692d4e28d70938dc0cb9d 100644 --- a/patches/defconfig +++ b/patches/defconfig @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 6.1.0-rc5 Kernel Configuration +# Linux/arm 6.1.0-rc7 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="arm-linux-gnueabi-gcc (GCC) 11.3.0" +CONFIG_CC_VERSION_TEXT="arm-linux-gnueabi-gcc (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=110300 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -153,6 +153,7 @@ CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC12_NO_ARRAY_BOUNDS=y +CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set @@ -461,6 +462,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set # CONFIG_XEN is not set +CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y CONFIG_STACKPROTECTOR_PER_TASK=y # end of Kernel Features @@ -663,7 +665,6 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set -CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK=y # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -914,6 +915,7 @@ CONFIG_INET_ESP=m CONFIG_INET_ESP_OFFLOAD=m # CONFIG_INET_ESPINTCP is not set CONFIG_INET_IPCOMP=m +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_XFRM_TUNNEL=m CONFIG_INET_TUNNEL=m CONFIG_INET_DIAG=m @@ -7617,10 +7619,12 @@ CONFIG_LSM="yama,loadpin,safesetid,integrity,apparmor,selinux,smack,tomoyo" # # Memory initialization # +CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y CONFIG_INIT_STACK_NONE=y -# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_INIT_STACK_ALL_PATTERN is not set +# CONFIG_INIT_STACK_ALL_ZERO is not set CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y diff --git a/patches/drivers/mikrobus/0001-mikrobus-driver-update-patch.patch b/patches/drivers/mikrobus/0001-mikrobus-driver-update-patch.patch deleted file mode 100644 index 95336db11bed84a9dab3615b6ba53e65cb79e74d..0000000000000000000000000000000000000000 --- a/patches/drivers/mikrobus/0001-mikrobus-driver-update-patch.patch +++ /dev/null @@ -1,2901 +0,0 @@ -From 2fb4b13ddf4e9283069ea392ed71101280cc64e1 Mon Sep 17 00:00:00 2001 -From: vaishnav98 <vaishnav@beagleboard.org> -Date: Wed, 1 Sep 2021 21:02:29 +0530 -Subject: [PATCH] mikrobus driver update patch - -This Patch series is an update to the mikroBUS driver -with support for mikrobus over greybus and click ID EEPROM. - -RFC v1 Patch : https://lkml.org/lkml/2020/7/24/518 . -The mikrobus driver is updated to add mikrobus ports from device-tree -overlays, the debug interfaces for adding mikrobus ports through sysFS -is removed, and the driver considers the extended usage of mikrobus -port pins from their standard purposes. - -change log: - v2: support for adding mikroBUS ports from DT overlays, - remove debug sysFS interface for adding mikrobus ports, - consider extended pin usage/deviations from mikrobus standard - specifications, - use greybus CPort protocol enum instead of new protcol enums - Fix cases of wrong indendation, ignoring return values, freeing - allocated resources in case of errors and other style suggestions - in v1 review. - -Signed-off-by: vaishnav <vaishnav@beagleboard.org> -Signed-off-by: vaishnav98 <vaishnav@beagleboard.org> ---- - drivers/greybus/Kconfig | 7 + - drivers/greybus/Makefile | 2 + - drivers/greybus/gb_netlink.h | 34 + - drivers/greybus/manifest.c | 18 + - drivers/greybus/netlink.c | 257 ++++ - drivers/misc/Kconfig | 1 + - drivers/misc/Makefile | 1 + - drivers/misc/mikrobus/Kconfig | 16 + - drivers/misc/mikrobus/Makefile | 6 + - drivers/misc/mikrobus/mikrobus_core.c | 1032 +++++++++++++++++ - drivers/misc/mikrobus/mikrobus_id.c | 197 ++++ - drivers/misc/mikrobus/mikrobus_manifest.c | 477 ++++++++ - drivers/misc/mikrobus/mikrobus_manifest.h | 20 + - drivers/staging/greybus/gbphy.c | 10 +- - drivers/staging/greybus/gpio.c | 26 +- - drivers/staging/greybus/i2c.c | 11 +- - drivers/staging/greybus/pwm.c | 2 +- - drivers/staging/greybus/sdio.c | 2 +- - drivers/staging/greybus/spi.c | 2 +- - drivers/staging/greybus/spilib.c | 19 +- - drivers/staging/greybus/uart.c | 2 +- - drivers/staging/greybus/usb.c | 2 +- - drivers/w1/w1.c | 3 +- - drivers/w1/w1_int.c | 28 + - include/linux/greybus/bundle.h | 2 + - .../staging => include/linux}/greybus/gbphy.h | 61 +- - include/linux/greybus/greybus_manifest.h | 49 + - include/linux/greybus/interface.h | 2 + - include/linux/mikrobus.h | 207 ++++ - include/linux/w1.h | 1 + - 30 files changed, 2430 insertions(+), 67 deletions(-) - create mode 100644 drivers/greybus/gb_netlink.h - create mode 100644 drivers/greybus/netlink.c - create mode 100644 drivers/misc/mikrobus/Kconfig - create mode 100644 drivers/misc/mikrobus/Makefile - create mode 100644 drivers/misc/mikrobus/mikrobus_core.c - create mode 100644 drivers/misc/mikrobus/mikrobus_id.c - create mode 100644 drivers/misc/mikrobus/mikrobus_manifest.c - create mode 100644 drivers/misc/mikrobus/mikrobus_manifest.h - rename {drivers/staging => include/linux}/greybus/gbphy.h (68%) - create mode 100644 include/linux/mikrobus.h - -diff --git a/drivers/greybus/Kconfig b/drivers/greybus/Kconfig -index 78ba3c3083d5..f07fb38f4a1a 100644 ---- a/drivers/greybus/Kconfig -+++ b/drivers/greybus/Kconfig -@@ -28,5 +28,12 @@ config GREYBUS_ES2 - To compile this code as a module, choose M here: the module - will be called gb-es2.ko - -+config GREYBUS_NETLINK -+ tristate "Greybus netlink host controller" -+ help -+ Select this option if you want to implement a Greybus -+ "host controller" in userspace. -+ To compile this code as a module, chose M here: the module -+ will be called gb-netlink.ko - endif # GREYBUS - -diff --git a/drivers/greybus/Makefile b/drivers/greybus/Makefile -index 9bccdd229aa2..280a35e9971c 100644 ---- a/drivers/greybus/Makefile -+++ b/drivers/greybus/Makefile -@@ -20,7 +20,9 @@ ccflags-y += -I$(src) - - # Greybus Host controller drivers - gb-es2-y := es2.o -+gb-netlink-y := netlink.o - - obj-$(CONFIG_GREYBUS_ES2) += gb-es2.o -+obj-$(CONFIG_GREYBUS_NETLINK) += gb-netlink.o - - -diff --git a/drivers/greybus/gb_netlink.h b/drivers/greybus/gb_netlink.h -new file mode 100644 -index 000000000000..4756491397ec ---- /dev/null -+++ b/drivers/greybus/gb_netlink.h -@@ -0,0 +1,34 @@ -+/* -+ * Greybus TCP/IP driver for Greybus over TCP/IP -+ * -+ * Released under the GPLv2 only. -+ */ -+ -+#ifndef __GB_NETLINK_H -+#define __GB_NETLINK_H -+ -+/* Maximum packet size */ -+#define GB_NETLINK_MTU 2048 -+/* Maximum number of Cports */ -+#define GB_NETLINK_NUM_CPORT 32 -+ -+#define GB_NL_NAME "GREYBUS" -+#define GB_NL_PID 1 -+ -+enum { -+ GB_NL_A_UNSPEC, -+ GB_NL_A_DATA, -+ GB_NL_A_CPORT, -+ __GB_NL_A_MAX, -+}; -+#define GB_NL_A_MAX (__GB_NL_A_MAX - 1) -+ -+enum { -+ GB_NL_C_UNSPEC, -+ GB_NL_C_MSG, -+ GB_NL_C_HD_RESET, -+ __GB_NL_C_MAX, -+}; -+#define GB_NL_C_MAX (__GB_NL_C_MAX - 1) -+ -+#endif /* __GB_NETLINK_H */ -diff --git a/drivers/greybus/manifest.c b/drivers/greybus/manifest.c -index dd7040697bde..9be09511b4df 100644 ---- a/drivers/greybus/manifest.c -+++ b/drivers/greybus/manifest.c -@@ -136,6 +136,17 @@ static int identify_descriptor(struct gb_interface *intf, - case GREYBUS_TYPE_CPORT: - expected_size += sizeof(struct greybus_descriptor_cport); - break; -+ case GREYBUS_TYPE_PROPERTY: -+ expected_size += sizeof(struct greybus_descriptor_property); -+ expected_size += desc->property.length; -+ expected_size = ALIGN(expected_size, 4); -+ break; -+ case GREYBUS_TYPE_DEVICE: -+ expected_size += sizeof(struct greybus_descriptor_device); -+ break; -+ case GREYBUS_TYPE_MIKROBUS: -+ expected_size += sizeof(struct greybus_descriptor_mikrobus); -+ break; - case GREYBUS_TYPE_INVALID: - default: - dev_err(&intf->dev, "invalid descriptor type (%u)\n", -@@ -372,6 +383,11 @@ static u32 gb_manifest_parse_bundles(struct gb_interface *intf) - continue; - } - -+ if (class == GREYBUS_CLASS_BRIDGED_PHY){ -+ bundle->manifest_blob = kmemdup(intf->manifest_blob, intf->manifest_size, GFP_KERNEL); -+ bundle->manifest_size = intf->manifest_size; -+ } -+ - count++; - } - -@@ -489,6 +505,8 @@ bool gb_manifest_parse(struct gb_interface *intf, void *data, size_t size) - return false; - } - -+ intf->manifest_size = size; -+ intf->manifest_blob = data; - /* OK, find all the descriptors */ - desc = manifest->descriptors; - size -= sizeof(*header); -diff --git a/drivers/greybus/netlink.c b/drivers/greybus/netlink.c -new file mode 100644 -index 000000000000..56f507ebdd0b ---- /dev/null -+++ b/drivers/greybus/netlink.c -@@ -0,0 +1,257 @@ -+/* -+ * Greybus Netlink driver for userspace controller -+ * -+ * Copyright (c) 2017 BayLibre SAS -+ * -+ * Released under the GPLv2 only. -+ */ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/pm_runtime.h> -+#include <linux/slab.h> -+#include <net/genetlink.h> -+#include <linux/greybus.h> -+ -+#include "gb_netlink.h" -+ -+static dev_t major_dev; -+static struct class *gb_nl_class; -+static struct genl_family gb_nl_family; -+static struct gb_host_device *gb_nl_hd; -+ -+#define VERSION_NR 1 -+ -+#define DEVICE_NAME "gb_netlink" -+#define CLASS_NAME "gb_netlink" -+ -+static int _gb_netlink_init(struct device *dev); -+static void _gb_netlink_exit(void); -+ -+static int gb_netlink_msg(struct sk_buff *skb, struct genl_info *info) -+{ -+ struct nlattr *na; -+ u16 cport_id; -+ void *data; -+ -+ if (!info) -+ return -EPROTO; -+ -+ na = info->attrs[GB_NL_A_CPORT]; -+ if (!na) { -+ dev_err(&gb_nl_hd->dev, -+ "Received message without cport id attribute\n"); -+ return -EPROTO; -+ } -+ -+ cport_id = nla_get_u32(na); -+ if (!cport_id_valid(gb_nl_hd, cport_id)) { -+ dev_err(&gb_nl_hd->dev, "invalid cport id %u received", -+ cport_id); -+ return -EINVAL; -+ } -+ -+ na = info->attrs[GB_NL_A_DATA]; -+ if (!na) { -+ dev_err(&gb_nl_hd->dev, -+ "Received message without data attribute\n"); -+ return -EPROTO; -+ } -+ -+ data = nla_data(na); -+ if (!data) { -+ dev_err(&gb_nl_hd->dev, -+ "Received message without data\n"); -+ return -EINVAL; -+ } -+ -+ greybus_data_rcvd(gb_nl_hd, cport_id, data, nla_len(na)); -+ -+ return 0; -+} -+ -+static int gb_netlink_hd_reset(struct sk_buff *skb, struct genl_info *info) -+{ -+ struct device *dev; -+ struct gb_host_device *hd = gb_nl_hd; -+ -+ dev = hd->dev.parent; -+ _gb_netlink_exit(); -+ _gb_netlink_init(dev); -+ -+ return 0; -+} -+ -+static struct nla_policy gb_nl_policy[GB_NL_A_MAX + 1] = { -+ [GB_NL_A_DATA] = { .type = NLA_BINARY, .len = GB_NETLINK_MTU }, -+ [GB_NL_A_CPORT] = { .type = NLA_U32}, -+}; -+ -+static struct genl_ops gb_nl_ops[] = { -+ { -+ .cmd = GB_NL_C_MSG, -+ .doit = gb_netlink_msg, -+ }, -+ { -+ .cmd = GB_NL_C_HD_RESET, -+ .doit = gb_netlink_hd_reset, -+ }, -+}; -+ -+static struct genl_family gb_nl_family = { -+ .hdrsize = 0, -+ .name = GB_NL_NAME, -+ .version = VERSION_NR, -+ .maxattr = GB_NL_A_MAX, -+ .ops = gb_nl_ops, -+ .n_ops = ARRAY_SIZE(gb_nl_ops), -+ .policy = gb_nl_policy, -+}; -+ -+static int message_send(struct gb_host_device *hd, u16 cport_id, -+ struct gb_message *message, gfp_t gfp_mask) -+{ -+ struct nl_msg *nl_msg; -+ struct sk_buff *skb; -+ int retval = -ENOMEM; -+ -+ skb = genlmsg_new(sizeof(*message->header) + sizeof(u32) + -+ message->payload_size, GFP_KERNEL); -+ if (!skb) -+ goto err_out; -+ -+ nl_msg = genlmsg_put(skb, GB_NL_PID, 0, -+ &gb_nl_family, 0, GB_NL_C_MSG); -+ if (!nl_msg) -+ goto err_free; -+ -+ retval = nla_put_u32(skb, GB_NL_A_CPORT, cport_id); -+ if (retval) -+ goto err_cancel; -+ -+ retval = nla_put(skb, GB_NL_A_DATA, -+ sizeof(*message->header) + message->payload_size, -+ message->header); -+ if (retval) -+ goto err_cancel; -+ -+ genlmsg_end(skb, nl_msg); -+ -+ retval = genlmsg_unicast(&init_net, skb, GB_NL_PID); -+ if (retval) -+ goto err_cancel; -+ -+ greybus_message_sent(hd, message, 0); -+ -+ return 0; -+ -+err_cancel: -+ genlmsg_cancel(skb, nl_msg); -+err_free: -+ nlmsg_free(skb); -+err_out: -+ return retval; -+} -+ -+static void message_cancel(struct gb_message *message) -+{ -+} -+ -+static struct gb_hd_driver tcpip_driver = { -+ .message_send = message_send, -+ .message_cancel = message_cancel, -+}; -+ -+static void _gb_netlink_exit(void) -+{ -+ if (!gb_nl_hd) -+ return; -+ -+ gb_hd_del(gb_nl_hd); -+ gb_hd_put(gb_nl_hd); -+ -+ gb_nl_hd = NULL; -+} -+ -+static void __exit gb_netlink_exit(void) -+{ -+ _gb_netlink_exit(); -+ -+ unregister_chrdev_region(major_dev, 1); -+ device_destroy(gb_nl_class, major_dev); -+ class_destroy(gb_nl_class); -+ -+ genl_unregister_family(&gb_nl_family); -+} -+ -+static int _gb_netlink_init(struct device *dev) -+{ -+ int retval; -+ -+ gb_nl_hd = gb_hd_create(&tcpip_driver, dev, GB_NETLINK_MTU, -+ GB_NETLINK_NUM_CPORT); -+ if (IS_ERR(gb_nl_hd)) -+ return PTR_ERR(gb_nl_hd); -+ -+ retval = gb_hd_add(gb_nl_hd); -+ if (retval) -+ goto err_gb_hd_del; -+ -+ return 0; -+ -+err_gb_hd_del: -+ gb_hd_del(gb_nl_hd); -+ gb_hd_put(gb_nl_hd); -+ -+ return retval; -+} -+ -+static int __init gb_netlink_init(void) -+{ -+ int retval; -+ struct device *dev; -+ -+ retval = genl_register_family(&gb_nl_family); -+ if (retval) -+ return retval; -+ -+ retval = alloc_chrdev_region(&major_dev, 0, 1, DEVICE_NAME); -+ if (retval) -+ goto err_genl_unregister; -+ -+ gb_nl_class = class_create(THIS_MODULE, CLASS_NAME); -+ if (IS_ERR(gb_nl_class)) { -+ retval = PTR_ERR(gb_nl_class); -+ goto err_chrdev_unregister; -+ } -+ -+ dev = device_create(gb_nl_class, NULL, major_dev, NULL, DEVICE_NAME); -+ if (IS_ERR(dev)) { -+ retval = PTR_ERR(dev); -+ goto err_class_destroy; -+ } -+ -+ retval = _gb_netlink_init(dev); -+ if (retval) -+ goto err_device_destroy; -+ -+ return 0; -+ -+err_device_destroy: -+ device_destroy(gb_nl_class, major_dev); -+err_chrdev_unregister: -+ unregister_chrdev_region(major_dev, 1); -+err_class_destroy: -+ class_destroy(gb_nl_class); -+err_genl_unregister: -+ genl_unregister_family(&gb_nl_family); -+ -+ return retval; -+} -+ -+module_init(gb_netlink_init); -+module_exit(gb_netlink_exit); -+ -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("Alexandre Bailon <abailon@baylibre.com>"); -diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index 8403506a4abf..b9702b3a65ff 100644 ---- a/drivers/misc/Kconfig -+++ b/drivers/misc/Kconfig -@@ -465,4 +465,5 @@ source "drivers/misc/cardreader/Kconfig" - source "drivers/misc/habanalabs/Kconfig" - source "drivers/misc/uacce/Kconfig" - source "drivers/misc/pvpanic/Kconfig" -+source "drivers/misc/mikrobus/Kconfig" - endmenu -diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile -index 2756a0302d60..b69fc0bad1d0 100644 ---- a/drivers/misc/Makefile -+++ b/drivers/misc/Makefile -@@ -38,6 +38,7 @@ obj-$(CONFIG_VMWARE_BALLOON) += vmw_balloon.o - obj-$(CONFIG_PCH_PHUB) += pch_phub.o - obj-y += ti-st/ - obj-y += lis3lv02d/ -+obj-y += mikrobus/ - obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/ - obj-$(CONFIG_INTEL_MEI) += mei/ - obj-$(CONFIG_VMWARE_VMCI) += vmw_vmci/ -diff --git a/drivers/misc/mikrobus/Kconfig b/drivers/misc/mikrobus/Kconfig -new file mode 100644 -index 000000000000..5f42bc4e9410 ---- /dev/null -+++ b/drivers/misc/mikrobus/Kconfig -@@ -0,0 +1,16 @@ -+menuconfig MIKROBUS -+ tristate "Module for instantiating devices on mikroBUS ports" -+ help -+ This option enables the mikroBUS driver. mikroBUS is an add-on -+ board socket standard that offers maximum expandability with -+ the smallest number of pins. The mikroBUS driver instantiates -+ devices on a mikroBUS port described by identifying data present -+ in an add-on board resident EEPROM, more details on the mikroBUS -+ driver support and discussion can be found in this eLinux wiki : -+ elinux.org/Mikrobus -+ -+ -+ Say Y here to enable support for this driver. -+ -+ To compile this code as a module, chose M here: the module -+ will be called mikrobus.ko -diff --git a/drivers/misc/mikrobus/Makefile b/drivers/misc/mikrobus/Makefile -new file mode 100644 -index 000000000000..0dfd04eabaf6 ---- /dev/null -+++ b/drivers/misc/mikrobus/Makefile -@@ -0,0 +1,6 @@ -+# SPDX-License-Identifier: GPL-2.0 -+# mikroBUS Core -+ -+obj-$(CONFIG_MIKROBUS) += mikrobus.o -+mikrobus-y := mikrobus_core.o mikrobus_manifest.o -+obj-$(CONFIG_MIKROBUS) += mikrobus_id.o -\ No newline at end of file -diff --git a/drivers/misc/mikrobus/mikrobus_core.c b/drivers/misc/mikrobus/mikrobus_core.c -new file mode 100644 -index 000000000000..4e24f980f18a ---- /dev/null -+++ b/drivers/misc/mikrobus/mikrobus_core.c -@@ -0,0 +1,1032 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * mikroBUS driver for instantiating add-on -+ * board devices with an identifier EEPROM -+ * -+ * Copyright 2021 Vaishnav M A, BeagleBoard.org Foundation. -+ * Copyright 2021 Zoran Stojsavljevic, zoran.stojsavljevic@gmail.com -+ */ -+ -+#define pr_fmt(fmt) "mikrobus:%s: " fmt, __func__ -+ -+#include <linux/err.h> -+#include <linux/errno.h> -+#include <linux/idr.h> -+#include <linux/init.h> -+#include <linux/jump_label.h> -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/gpio/consumer.h> -+#include <linux/mutex.h> -+#include <linux/w1.h> -+#include <linux/w1-gpio.h> -+#include <linux/device.h> -+#include <linux/i2c.h> -+#include <linux/greybus.h> -+#include <linux/gpio.h> -+#include <linux/gpio/machine.h> -+#include <linux/gpio/driver.h> -+#include <linux/nvmem-consumer.h> -+#include <linux/nvmem-provider.h> -+#include <linux/interrupt.h> -+#include <linux/spi/spi.h> -+#include <linux/serdev.h> -+#include <linux/property.h> -+#include <linux/platform_device.h> -+#include <linux/debugfs.h> -+#include <linux/pinctrl/pinctrl.h> -+#include <linux/pinctrl/pinmux.h> -+#include <linux/pinctrl/consumer.h> -+#include <linux/regulator/fixed.h> -+#include <linux/regulator/machine.h> -+#include <linux/clk-provider.h> -+#include <linux/greybus/greybus_manifest.h> -+#include <linux/greybus/gbphy.h> -+#include <linux/mikrobus.h> -+ -+#include "mikrobus_manifest.h" -+ -+#define MIKROBUS_ID_USER_EEPROM_ADDR 0x0A0A -+ -+static DEFINE_MUTEX(core_lock); -+static DEFINE_IDR(mikrobus_port_idr); -+static struct class_compat *mikrobus_port_compat_class; -+int __mikrobus_first_dynamic_bus_num; -+static bool is_registered; -+static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port); -+ -+const char *MIKROBUS_PINCTRL_STR[] = {"pwm", "uart", "i2c", "spi"}; -+ -+struct bus_type mikrobus_bus_type = { -+ .name = "mikrobus", -+}; -+EXPORT_SYMBOL_GPL(mikrobus_bus_type); -+ -+int mikrobus_port_scan_eeprom(struct mikrobus_port *port) -+{ -+ struct addon_board_info *board; -+ int manifest_size; -+ char header[12]; -+ int retval; -+ uint16_t manifest_start_addr; -+ char *buf; -+ -+ if(port->skip_scan) -+ return -EINVAL; -+ -+ retval = nvmem_device_read(port->eeprom, MIKROBUS_ID_USER_EEPROM_ADDR, 1, header); -+ if (retval != 1) { -+ dev_err(&port->dev, "failed to fetch manifest start address %d\n", -+ retval); -+ return -EINVAL; -+ } -+ manifest_start_addr = header[0] << 8; -+ pr_info("manifest start address is 0x%x \n", manifest_start_addr); -+ -+ retval = nvmem_device_read(port->eeprom, manifest_start_addr, 12, header); -+ if (retval != 12) { -+ dev_err(&port->dev, "failed to fetch manifest header %d\n", -+ retval); -+ return -EINVAL; -+ } -+ manifest_size = mikrobus_manifest_header_validate(header, 12); -+ if (manifest_size < 0) { -+ dev_err(&port->dev, "invalid manifest size %d\n", -+ manifest_size); -+ return -EINVAL; -+ } -+ buf = kzalloc(manifest_size, GFP_KERNEL); -+ if (!buf) -+ return -ENOMEM; -+ retval = nvmem_device_read(port->eeprom, manifest_start_addr, manifest_size, buf); -+ if (retval != manifest_size) { -+ dev_err(&port->dev, "failed to fetch manifest %d\n", retval); -+ retval = -EINVAL; -+ goto err_free_buf; -+ } -+ board = kzalloc(sizeof(*board), GFP_KERNEL); -+ if (!board) { -+ retval = -ENOMEM; -+ goto err_free_buf; -+ } -+ w1_reset_bus(port->w1_master); -+ /* set RST HIGH */ -+ gpiod_direction_output(port->gpios->desc[MIKROBUS_PIN_RST], 1); -+ set_bit(W1_ABORT_SEARCH, &port->w1_master->flags); -+ INIT_LIST_HEAD(&board->manifest_descs); -+ INIT_LIST_HEAD(&board->devices); -+ retval = mikrobus_manifest_parse(board, buf, manifest_size); -+ if (!retval) { -+ dev_err(&port->dev, "failed to parse manifest, size %d\n", -+ manifest_size); -+ retval = -EINVAL; -+ goto err_free_board; -+ } -+ retval = mikrobus_board_register(port, board); -+ if (retval) { -+ dev_err(&port->dev, "failed to register board %s\n", -+ board->name); -+ goto err_free_board; -+ } -+ kfree(buf); -+ return 0; -+err_free_board: -+ kfree(board); -+err_free_buf: -+ kfree(buf); -+ return retval; -+} -+EXPORT_SYMBOL_GPL(mikrobus_port_scan_eeprom); -+ -+static ssize_t name_show(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ return sprintf(buf, "%s\n", to_mikrobus_port(dev)->name); -+} -+static DEVICE_ATTR_RO(name); -+ -+static ssize_t new_device_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct mikrobus_port *port = to_mikrobus_port(dev); -+ struct addon_board_info *board; -+ int retval; -+ -+ if (port->board) { -+ dev_err(dev, "already has board registered\n"); -+ return -EBUSY; -+ } -+ -+ board = kzalloc(sizeof(*board), GFP_KERNEL); -+ if (!board) -+ return -ENOMEM; -+ INIT_LIST_HEAD(&board->manifest_descs); -+ INIT_LIST_HEAD(&board->devices); -+ retval = mikrobus_manifest_parse(board, (void *)buf, count); -+ if (!retval) { -+ dev_err(dev, "failed to parse manifest\n"); -+ retval = -EINVAL; -+ goto err_free_board; -+ } -+ retval = mikrobus_board_register(port, board); -+ if (retval) { -+ dev_err(dev, "failed to register board %s\n", board->name); -+ retval = -EINVAL; -+ goto err_free_board; -+ } -+ return count; -+err_free_board: -+ kfree(board); -+ return retval; -+} -+static DEVICE_ATTR_WO(new_device); -+ -+static ssize_t delete_device_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct mikrobus_port *port = to_mikrobus_port(dev); -+ unsigned long id; -+ -+ if (kstrtoul(buf, 0, &id)) { -+ dev_err(dev, "cannot parse board id"); -+ return -EINVAL; -+ } -+ if (!port->board) { -+ dev_err(dev, "does not have registered boards"); -+ return -ENODEV; -+ } -+ mikrobus_board_unregister(port, port->board); -+ return count; -+} -+static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, 0200, NULL, delete_device_store); -+ -+static struct attribute *mikrobus_port_attrs[] = { -+ &dev_attr_new_device.attr, &dev_attr_delete_device.attr, &dev_attr_name.attr, NULL}; -+ATTRIBUTE_GROUPS(mikrobus_port); -+ -+static void mikrobus_port_release(struct device *dev) -+{ -+ struct mikrobus_port *port = to_mikrobus_port(dev); -+ -+ mutex_lock(&core_lock); -+ idr_remove(&mikrobus_port_idr, port->id); -+ mutex_unlock(&core_lock); -+ kfree(port); -+} -+ -+struct device_type mikrobus_port_type = { -+ .groups = mikrobus_port_groups, -+ .release = mikrobus_port_release, -+}; -+EXPORT_SYMBOL_GPL(mikrobus_port_type); -+ -+static int mikrobus_w1_master_match(struct device *dev, const void *data) -+{ -+ struct mikrobus_port *port; -+ -+ if(dev->type != &mikrobus_port_type) -+ return 0; -+ -+ port = to_mikrobus_port(dev); -+ -+ return port->w1_master == data; -+} -+ -+struct mikrobus_port *mikrobus_find_port_by_w1_master(struct w1_master *master) -+{ -+ struct device *dev; -+ -+ dev = bus_find_device(&mikrobus_bus_type, NULL, master, mikrobus_w1_master_match); -+ if (!dev) -+ return NULL; -+ -+ return (dev->type == &mikrobus_port_type) ? to_mikrobus_port(dev) : NULL; -+} -+EXPORT_SYMBOL(mikrobus_find_port_by_w1_master); -+ -+int mikrobus_port_pinctrl_select(struct mikrobus_port *port) -+{ -+ struct pinctrl_state *state; -+ int retval; -+ int i; -+ -+ for (i = 0; i < MIKROBUS_NUM_PINCTRL_STATE; i++) { -+ state = pinctrl_lookup_state(port->pinctrl, -+ port->pinctrl_selected[i]); -+ if (!IS_ERR(state)) { -+ retval = pinctrl_select_state(port->pinctrl, state); -+ pr_info("setting pinctrl %s\n", -+ port->pinctrl_selected[i]); -+ if (retval != 0) { -+ dev_err(&port->dev, "failed to select state %s\n", -+ port->pinctrl_selected[i]); -+ return retval; -+ } -+ } else { -+ dev_err(&port->dev, "failed to find state %s\n", -+ port->pinctrl_selected[i]); -+ return PTR_ERR(state); -+ } -+ } -+ -+ return retval; -+} -+EXPORT_SYMBOL_GPL(mikrobus_port_pinctrl_select); -+ -+static int mikrobus_port_pinctrl_setup(struct mikrobus_port *port, struct addon_board_info *board) -+{ -+ int retval; -+ int i; -+ -+ for (i = 0; i < MIKROBUS_NUM_PINCTRL_STATE; i++) { -+ switch (i) { -+ case MIKROBUS_PINCTRL_PWM: -+ if (board->pin_state[MIKROBUS_PIN_PWM] == MIKROBUS_STATE_PWM) -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], PINCTRL_STATE_DEFAULT); -+ else -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], MIKROBUS_PINCTRL_STATE_GPIO); -+ break; -+ case MIKROBUS_PINCTRL_UART: -+ if (board->pin_state[MIKROBUS_PIN_RX] == MIKROBUS_STATE_UART) -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], PINCTRL_STATE_DEFAULT); -+ else -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], MIKROBUS_PINCTRL_STATE_GPIO); -+ break; -+ case MIKROBUS_PINCTRL_I2C: -+ if (board->pin_state[MIKROBUS_PIN_SCL] == MIKROBUS_STATE_I2C) -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], PINCTRL_STATE_DEFAULT); -+ else -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], MIKROBUS_PINCTRL_STATE_GPIO); -+ break; -+ case MIKROBUS_PINCTRL_SPI: -+ if (board->pin_state[MIKROBUS_PIN_MOSI] == MIKROBUS_STATE_SPI) -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], PINCTRL_STATE_DEFAULT); -+ else -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], MIKROBUS_PINCTRL_STATE_GPIO); -+ break; -+ } -+ } -+ -+ retval = mikrobus_port_pinctrl_select(port); -+ if (retval) -+ dev_err(&port->dev, "failed to select pinctrl states [%d]", retval); -+ return retval; -+} -+ -+static int mikrobus_irq_get(struct mikrobus_port *port, int irqno, -+ int irq_type) -+{ -+ int irq; -+ -+ if (irqno > port->gpios->ndescs - 1) { -+ dev_err(&port->dev, "GPIO %d does not exist", irqno); -+ return -ENODEV; -+ } -+ -+ irq = gpiod_to_irq(port->gpios->desc[irqno]); -+ if (irq < 0) { -+ dev_err(&port->dev, "could not get irq %d", irqno); -+ return -EINVAL; -+ } -+ irq_set_irq_type(irq, irq_type); -+ return irq; -+} -+ -+static int mikrobus_gpio_setup(struct gpio_desc *gpio, int gpio_state) -+{ -+ int retval; -+ -+ switch (gpio_state) { -+ case MIKROBUS_STATE_INPUT: -+ retval = gpiod_direction_input(gpio); -+ break; -+ case MIKROBUS_STATE_OUTPUT_HIGH: -+ retval = gpiod_direction_output(gpio, 1); -+ break; -+ case MIKROBUS_STATE_OUTPUT_LOW: -+ retval = gpiod_direction_output(gpio, 0); -+ break; -+ case MIKROBUS_STATE_PWM: -+ case MIKROBUS_STATE_SPI: -+ case MIKROBUS_STATE_I2C: -+ default: -+ return 0; -+ } -+ return retval; -+} -+ -+static char *mikrobus_gpio_chip_name_get(struct mikrobus_port *port, int gpio) -+{ -+ char *name; -+ struct gpio_chip *gpiochip; -+ -+ if (gpio > port->gpios->ndescs - 1) -+ return NULL; -+ -+ gpiochip = gpiod_to_chip(port->gpios->desc[gpio]); -+ name = kmemdup(gpiochip->label, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ return name; -+} -+ -+static int mikrobus_gpio_hwnum_get(struct mikrobus_port *port, int gpio) -+{ -+ int hwnum; -+ struct gpio_chip *gpiochip; -+ -+ if (gpio > port->gpios->ndescs - 1) -+ return -ENODEV; -+ -+ gpiochip = gpiod_to_chip(port->gpios->desc[gpio]); -+ hwnum = desc_to_gpio(port->gpios->desc[gpio]) - gpiochip->base; -+ return hwnum; -+} -+ -+static void mikrobus_board_device_release_all(struct addon_board_info *info) -+{ -+ struct board_device_info *dev; -+ struct board_device_info *next; -+ -+ list_for_each_entry_safe(dev, next, &info->devices, links) { -+ list_del(&dev->links); -+ kfree(dev); -+ } -+} -+ -+static struct software_node *software_node_alloc(const struct property_entry *properties) -+{ -+ struct property_entry *props; -+ struct software_node *node; -+ -+ props = property_entries_dup(properties); -+ if (IS_ERR(props)) -+ return ERR_CAST(props); -+ -+ node = kzalloc(sizeof(*node), GFP_KERNEL); -+ if (!node) { -+ property_entries_free(props); -+ return ERR_PTR(-ENOMEM); -+ } -+ -+ node->properties = props; -+ -+ return node; -+} -+ -+static int mikrobus_device_register(struct mikrobus_port *port, -+ struct board_device_info *dev, char *board_name) -+{ -+ struct i2c_board_info *i2c; -+ struct spi_device *spi; -+ struct serdev_device *serdev; -+ struct platform_device *pdev; -+ struct gpiod_lookup_table *lookup; -+ struct regulator_consumer_supply regulator; -+ char devname[MIKROBUS_NAME_SIZE]; -+ int i; -+ u64 *val; -+ -+ dev_info(&port->dev, "registering device : %s", dev->drv_name); -+ -+ if (dev->gpio_lookup) { -+ lookup = dev->gpio_lookup; -+ if (dev->protocol == GREYBUS_PROTOCOL_SPI) { -+ snprintf(devname, sizeof(devname), "%s.%u", -+ dev_name(&port->spi_mstr->dev), -+ port->chip_select[dev->reg]); -+ lookup->dev_id = kmemdup(devname, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ } else if (dev->protocol == GREYBUS_PROTOCOL_RAW) { -+ snprintf(devname, sizeof(devname), "%s.%u", -+ dev->drv_name, dev->reg); -+ lookup->dev_id = kmemdup(devname, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ } else -+ lookup->dev_id = dev->drv_name; -+ dev_info(&port->dev, " adding lookup table : %s\n", -+ lookup->dev_id); -+ for (i = 0; i < dev->num_gpio_resources; i++) { -+ lookup->table[i].key = -+ mikrobus_gpio_chip_name_get(port, -+ lookup->table[i].chip_hwnum); -+ lookup->table[i].chip_hwnum = -+ mikrobus_gpio_hwnum_get(port, -+ lookup->table[i].chip_hwnum); -+ } -+ gpiod_add_lookup_table(lookup); -+ } -+ if (dev->regulators) { -+ if (dev->protocol == GREYBUS_PROTOCOL_SPI) { -+ snprintf(devname, sizeof(devname), "%s.%u", -+ dev_name(&port->spi_mstr->dev), -+ port->chip_select[dev->reg]); -+ regulator.dev_name = kmemdup(devname, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ } else if (dev->protocol == GREYBUS_PROTOCOL_RAW) { -+ snprintf(devname, sizeof(devname), "%s.%u", -+ dev->drv_name, dev->reg); -+ regulator.dev_name = kmemdup(devname, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ } else -+ regulator.dev_name = dev->drv_name; -+ -+ for (i = 0; i < dev->num_regulators; i++) { -+ val = dev->regulators[i].value.u64_data; -+ regulator.supply = kmemdup(dev->regulators[i].name, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ dev_info(&port->dev, " adding fixed regulator %llu uv, %s for %s\n", -+ *val, regulator.supply, regulator.dev_name); -+ regulator_register_always_on(0, dev->regulators[i].name, ®ulator, -+ 1, *val); -+ } -+ } -+ switch (dev->protocol) { -+ case GREYBUS_PROTOCOL_SPI: -+ spi = spi_alloc_device(port->spi_mstr); -+ if (!spi) -+ return -ENOMEM; -+ strncpy(spi->modalias, dev->drv_name, sizeof(spi->modalias) - 1); -+ if (dev->irq) -+ spi->irq = mikrobus_irq_get(port, dev->irq, dev->irq_type); -+ if (dev->properties) -+ device_add_properties(&spi->dev, dev->properties); -+ spi->chip_select = port->chip_select[dev->reg]; -+ spi->max_speed_hz = dev->max_speed_hz; -+ spi->mode = dev->mode; -+ if (dev->clocks) { -+ for (i = 0; i < dev->num_clocks; i++) { -+ val = dev->clocks[i].value.u64_data; -+ dev_info(&port->dev, " adding fixed clock %s, %llu hz\n", -+ dev->clocks[i].name, *val); -+ //failing: under debug -+ clk_register_fixed_rate(&spi->dev, dev->clocks[i].name, devname, 0, *val); -+ } -+ } -+ spi_add_device(spi); -+ dev->dev_client = (void *) spi; -+ break; -+ case GREYBUS_PROTOCOL_I2C: -+ i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); -+ if (!i2c) -+ return -ENOMEM; -+ strncpy(i2c->type, dev->drv_name, sizeof(i2c->type) - 1); -+ if (dev->irq) -+ i2c->irq = mikrobus_irq_get(port, dev->irq, dev->irq_type); -+ if (dev->properties) -+ i2c->swnode = software_node_alloc(dev->properties); -+ i2c->addr = dev->reg; -+ dev->dev_client = (void *) i2c_new_client_device(port->i2c_adap, i2c); -+ break; -+ case GREYBUS_PROTOCOL_RAW: -+ pdev = platform_device_alloc(dev->drv_name, 0); -+ if (!pdev) -+ return -ENOMEM; -+ if (dev->properties) -+ platform_device_add_properties(pdev, dev->properties); -+ dev->dev_client = pdev; -+ platform_device_add(dev->dev_client); -+ break; -+ case GREYBUS_PROTOCOL_UART: -+ serdev = serdev_device_alloc(port->ser_ctrl); -+ if (!serdev) -+ return -ENOMEM; -+ strncpy(serdev->modalias, dev->drv_name, sizeof(serdev->modalias) - 1); -+ if (dev->properties) -+ device_add_properties(&serdev->dev, dev->properties); -+ dev->dev_client = serdev; -+ serdev_device_add(serdev); -+ break; -+ break; -+ default: -+ return -EINVAL; -+ } -+ return 0; -+} -+ -+static void mikrobus_device_unregister(struct mikrobus_port *port, -+ struct board_device_info *dev, char *board_name) -+{ -+ dev_info(&port->dev, "removing device %s\n", dev->drv_name); -+ if (dev->gpio_lookup) { -+ gpiod_remove_lookup_table(dev->gpio_lookup); -+ kfree(dev->gpio_lookup); -+ } -+ kfree(dev->properties); -+ switch (dev->protocol) { -+ case GREYBUS_PROTOCOL_SPI: -+ spi_unregister_device((struct spi_device *)dev->dev_client); -+ break; -+ case GREYBUS_PROTOCOL_I2C: -+ i2c_unregister_device((struct i2c_client *)dev->dev_client); -+ break; -+ case GREYBUS_PROTOCOL_RAW: -+ platform_device_unregister((struct platform_device *)dev->dev_client); -+ break; -+ case GREYBUS_PROTOCOL_UART: -+ serdev_device_remove((struct serdev_device *)dev->dev_client); -+ break; -+ } -+} -+ -+int mikrobus_board_register(struct mikrobus_port *port, struct addon_board_info *board) -+{ -+ struct board_device_info *devinfo; -+ struct board_device_info *next; -+ int retval; -+ int i; -+ -+ if (WARN_ON(list_empty(&board->devices))) -+ return false; -+ if (port->pinctrl) { -+ retval = mikrobus_port_pinctrl_setup(port, board); -+ if (retval) -+ dev_err(&port->dev, "failed to setup pinctrl state [%d]", retval); -+ -+ } -+ if (port->gpios) { -+ for (i = 0; i < port->gpios->ndescs; i++) { -+ retval = mikrobus_gpio_setup(port->gpios->desc[i], board->pin_state[i]); -+ if (retval) -+ dev_err(&port->dev, "failed to setup gpio %d, state %d", -+ i, board->pin_state[i]); -+ } -+ } -+ list_for_each_entry_safe(devinfo, next, &board->devices, links) -+ mikrobus_device_register(port, devinfo, board->name); -+ port->board = board; -+ return 0; -+} -+EXPORT_SYMBOL_GPL(mikrobus_board_register); -+ -+void mikrobus_board_unregister(struct mikrobus_port *port, struct addon_board_info *board) -+{ -+ struct board_device_info *devinfo; -+ struct board_device_info *next; -+ -+ if (WARN_ON(list_empty(&board->devices))) -+ return; -+ port->board = NULL; -+ list_for_each_entry_safe(devinfo, next, &board->devices, links) -+ mikrobus_device_unregister(port, devinfo, board->name); -+ mikrobus_board_device_release_all(board); -+ kfree(board); -+ port->board = NULL; -+} -+EXPORT_SYMBOL_GPL(mikrobus_board_unregister); -+ -+static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port) -+{ -+ struct w1_bus_master *bm; -+ struct gpiod_lookup_table *lookup; -+ struct platform_device *mikrobus_id_eeprom_w1_device; -+ static struct w1_gpio_platform_data *mikrobus_id_eeprom_w1_pdata; -+ char devname[MIKROBUS_NAME_SIZE]; -+ char drvname[MIKROBUS_NAME_SIZE] = "w1-gpio"; -+ int retval; -+ int i; -+ -+ mikrobus_id_eeprom_w1_device = kzalloc(sizeof(*mikrobus_id_eeprom_w1_device), GFP_KERNEL); -+ if (!mikrobus_id_eeprom_w1_device) -+ return -ENOMEM; -+ -+ mikrobus_id_eeprom_w1_pdata = kzalloc(sizeof(*mikrobus_id_eeprom_w1_pdata), GFP_KERNEL); -+ if (!mikrobus_id_eeprom_w1_pdata) -+ return -ENOMEM; -+ -+ mikrobus_id_eeprom_w1_pdata->pullup_gpiod = NULL; -+ mikrobus_id_eeprom_w1_device->name = kmemdup(drvname, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ mikrobus_id_eeprom_w1_device->dev.platform_data = mikrobus_id_eeprom_w1_pdata; -+ -+ sprintf(port->pinctrl_selected[MIKROBUS_PINCTRL_SPI], "%s_%s", -+ MIKROBUS_PINCTRL_STR[MIKROBUS_PINCTRL_SPI], MIKROBUS_PINCTRL_STATE_GPIO); -+ -+ retval = mikrobus_port_pinctrl_select(port); -+ /* set RST LOW */ -+ gpiod_direction_output(port->gpios->desc[MIKROBUS_PIN_RST], 0); -+ -+ lookup = kzalloc(struct_size(lookup, table, 1), -+ GFP_KERNEL); -+ if (!lookup) -+ return -ENOMEM; -+ snprintf(devname, sizeof(devname), "%s.%u", -+ mikrobus_id_eeprom_w1_device->name, -+ port->id); -+ mikrobus_id_eeprom_w1_device->id = port->id; -+ lookup->dev_id = kmemdup(devname, MIKROBUS_NAME_SIZE, GFP_KERNEL); -+ lookup->table[0].key = mikrobus_gpio_chip_name_get(port, -+ MIKROBUS_PIN_CS); -+ lookup->table[0].flags = GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN; -+ lookup->table[0].chip_hwnum = mikrobus_gpio_hwnum_get(port, -+ MIKROBUS_PIN_CS); -+ gpiod_add_lookup_table(lookup); -+ platform_device_register(mikrobus_id_eeprom_w1_device); -+ port->w1_gpio = mikrobus_id_eeprom_w1_device; -+ bm = (struct w1_bus_master *) platform_get_drvdata(mikrobus_id_eeprom_w1_device); -+ if(bm) { -+ port->w1_master = w1_find_master_device(bm); -+ if(!port->w1_master){ -+ dev_err(&port->dev, "failed to find W1 GPIO master, port [%s]\n", -+ port->name); -+ gpiod_remove_lookup_table(lookup); -+ kfree(lookup); -+ return -ENODEV; -+ } -+ } -+ return 0; -+} -+ -+int mikrobus_port_register(struct mikrobus_port *port) -+{ -+ struct device *dev = &port->dev; -+ int retval; -+ int id; -+ -+ if (WARN_ON(!is_registered)) -+ return -EAGAIN; -+ -+ if (dev->of_node) { -+ id = of_alias_get_id(dev->of_node, "mikrobus"); -+ if (id >= 0) { -+ port->id = id; -+ mutex_lock(&core_lock); -+ id = idr_alloc(&mikrobus_port_idr, port, port->id, port->id + 1, -+ GFP_KERNEL); -+ mutex_unlock(&core_lock); -+ if (WARN(id < 0, "couldn't get idr")) -+ return id == -ENOSPC ? -EBUSY : id; -+ } -+ } else { -+ mutex_lock(&core_lock); -+ id = idr_alloc(&mikrobus_port_idr, port, __mikrobus_first_dynamic_bus_num, 0, -+ GFP_KERNEL); -+ mutex_unlock(&core_lock); -+ if (id < 0) -+ return id; -+ port->id = id; -+ } -+ port->dev.bus = &mikrobus_bus_type; -+ port->dev.type = &mikrobus_port_type; -+ strncpy(port->name, "mikrobus-port", sizeof(port->name) - 1); -+ dev_set_name(&port->dev, "mikrobus-%d", port->id); -+ pr_info("registering port mikrobus-%d ", port->id); -+ retval = device_register(&port->dev); -+ if (retval) { -+ pr_err("port '%d': can't register device (%d)", port->id, retval); -+ put_device(&port->dev); -+ return retval; -+ } -+ retval = class_compat_create_link(mikrobus_port_compat_class, &port->dev, -+ port->dev.parent); -+ if (retval) -+ dev_warn(&port->dev, "failed to create compatibility class link\n"); -+ if (!port->w1_master && !port->disable_eeprom) { -+ dev_info(&port->dev, "mikrobus port %d eeprom empty probing default eeprom\n", -+ port->id); -+ mutex_lock(&core_lock); -+ retval = mikrobus_port_id_eeprom_probe(port); -+ mutex_unlock(&core_lock); -+ } -+ return retval; -+} -+EXPORT_SYMBOL_GPL(mikrobus_port_register); -+ -+void mikrobus_port_delete(struct mikrobus_port *port) -+{ -+ struct mikrobus_port *found; -+ -+ mutex_lock(&core_lock); -+ found = idr_find(&mikrobus_port_idr, port->id); -+ mutex_unlock(&core_lock); -+ if (found != port) { -+ pr_err("port [%s] not registered", port->name); -+ return; -+ } -+ if (port->board) { -+ dev_err(&port->dev, "attempting to delete port with registered boards, port [%s]\n", -+ port->name); -+ return; -+ } -+ -+ if (port->eeprom) { -+ nvmem_device_put(port->eeprom); -+ platform_device_unregister(port->w1_gpio); -+ } -+ -+ class_compat_remove_link(mikrobus_port_compat_class, &port->dev, -+ port->dev.parent); -+ device_unregister(&port->dev); -+ mutex_lock(&core_lock); -+ idr_remove(&mikrobus_port_idr, port->id); -+ mutex_unlock(&core_lock); -+ memset(&port->dev, 0, sizeof(port->dev)); -+} -+EXPORT_SYMBOL_GPL(mikrobus_port_delete); -+ -+int mikrobus_port_gb_register(struct gbphy_host *host, void *manifest_blob, size_t manifest_size) -+{ -+ struct gb_bundle *bundle = host->bundle; -+ struct addon_board_info *board; -+ struct gbphy_device *gbphy_dev, *temp; -+ struct gb_i2c_device *gb_i2c_dev; -+ struct gb_connection *spi_connection; -+ struct gb_gpio_controller *ggc; -+ struct mikrobus_port *port; -+ struct gpio_desc *desc; -+ struct gpio_descs *descs; -+ int retval; -+ -+ if (bundle->num_cports == 0) -+ return -ENODEV; -+ -+ port = kzalloc(sizeof(*port), GFP_KERNEL); -+ if (!port) -+ return -ENOMEM; -+ -+ pr_info("mikrobus gb_probe , num cports= %zu, manifest_size %u \n", bundle->num_cports, manifest_size); -+ list_for_each_entry_safe(gbphy_dev, temp, &host->devices, list) { -+ pr_info("protocol added %d", gbphy_dev->cport_desc->protocol_id); -+ if(gbphy_dev->cport_desc->protocol_id != GREYBUS_PROTOCOL_I2C && -+ gbphy_dev->cport_desc->protocol_id != GREYBUS_PROTOCOL_SPI && -+ gbphy_dev->cport_desc->protocol_id != GREYBUS_PROTOCOL_GPIO){ -+ pr_info("only I2C , GPIO and SPI Protocol Currently Supported"); -+ kfree(port); -+ continue; -+ } -+ port->dev.parent = &gbphy_dev->dev; -+ if(gbphy_dev->cport_desc->protocol_id == GREYBUS_PROTOCOL_I2C){ -+ gb_i2c_dev = (struct gb_i2c_device *) gb_gbphy_get_data(gbphy_dev); -+ port->i2c_adap = &gb_i2c_dev->adapter; -+ -+ } -+ else if(gbphy_dev->cport_desc->protocol_id == GREYBUS_PROTOCOL_SPI){ -+ spi_connection = gb_gbphy_get_data(gbphy_dev); -+ port->spi_mstr = (struct spi_master *)gb_connection_get_data(spi_connection); -+ } -+ else if(gbphy_dev->cport_desc->protocol_id == GREYBUS_PROTOCOL_GPIO){ -+ ggc = (struct gb_gpio_controller *) gb_gbphy_get_data(gbphy_dev); -+ port->gpios = kzalloc(struct_size(descs, desc, 12), GFP_KERNEL); -+ port->gpios->desc[0] = gpio_to_desc( ggc->chip.base + 7);//PWM GPIO -+ port->gpios->desc[1] = gpio_to_desc( ggc->chip.base + 20); //INT GPIO -+ port->gpios->desc[10] = gpio_to_desc( ggc->chip.base + 19); //RST GPIO -+ } -+ } -+ port->disable_eeprom = 1; -+ retval = mikrobus_port_register(port); -+ if (retval) { -+ pr_err("port : can't register port [%d]\n", retval); -+ } -+ -+ board = kzalloc(sizeof(*board), GFP_KERNEL); -+ if (!board) { -+ retval = -ENOMEM; -+ goto err_free_buf; -+ } -+ INIT_LIST_HEAD(&board->manifest_descs); -+ INIT_LIST_HEAD(&board->devices); -+ retval = mikrobus_manifest_parse(board, manifest_blob, manifest_size); -+ if (!retval) { -+ dev_err(&port->dev, "failed to parse manifest, size %lu\n", -+ manifest_size); -+ retval = -EINVAL; -+ goto err_free_board; -+ } -+ retval = mikrobus_board_register(port, board); -+ if (retval) { -+ dev_err(&port->dev, "failed to register board %s\n", -+ board->name); -+ goto err_free_board; -+ } -+ return 0; -+err_free_board: -+ kfree(board); -+err_free_buf: -+ kfree(manifest_blob); -+ return retval; -+} -+EXPORT_SYMBOL_GPL(mikrobus_port_gb_register); -+ -+static int mikrobus_port_probe_pinctrl_setup(struct mikrobus_port *port) -+{ -+ struct pinctrl_state *state; -+ struct device *dev = port->dev.parent; -+ int retval, i; -+ -+ state = pinctrl_lookup_state(port->pinctrl, PINCTRL_STATE_DEFAULT); -+ if (!IS_ERR(state)) { -+ retval = pinctrl_select_state(port->pinctrl, state); -+ if (retval != 0) { -+ dev_err(dev, "Failed to select state %s\n", -+ PINCTRL_STATE_DEFAULT); -+ return retval; -+ } -+ } else { -+ dev_err(dev, "failed to find state %s\n", -+ PINCTRL_STATE_DEFAULT); -+ return PTR_ERR(state); -+ } -+ -+ for (i = 0; i < MIKROBUS_NUM_PINCTRL_STATE; i++) { -+ port->pinctrl_selected[i] = -+ kmalloc(MIKROBUS_PINCTRL_NAME_SIZE, GFP_KERNEL); -+ sprintf(port->pinctrl_selected[i], "%s_%s", -+ MIKROBUS_PINCTRL_STR[i], PINCTRL_STATE_DEFAULT); -+ } -+ -+ retval = mikrobus_port_pinctrl_select(port); -+ if (retval) -+ dev_err(dev, "failed to select pinctrl states [%d]", retval); -+ return retval; -+} -+ -+static int mikrobus_port_probe(struct platform_device *pdev) -+{ -+ struct mikrobus_port *port; -+ struct device *dev = &pdev->dev; -+ struct device_node *i2c_adap_np; -+ struct device_node *uart_np; -+ int retval; -+ u32 val; -+ -+ port = kzalloc(sizeof(*port), GFP_KERNEL); -+ if (!port) -+ return -ENOMEM; -+ -+ i2c_adap_np = of_parse_phandle(dev->of_node, "i2c-adapter", 0); -+ if (!i2c_adap_np) { -+ dev_err(dev, "cannot parse i2c-adapter\n"); -+ retval = -ENODEV; -+ goto err_port; -+ } -+ port->i2c_adap = of_find_i2c_adapter_by_node(i2c_adap_np); -+ of_node_put(i2c_adap_np); -+ retval = device_property_read_u32(dev, "spi-master", &val); -+ if (retval) { -+ dev_err(dev, "failed to get spi-master [%d]\n", retval); -+ goto err_port; -+ } -+ port->spi_mstr = spi_busnum_to_master(val); -+ retval = device_property_read_u32_array(dev, "spi-cs", -+ port->chip_select, 2); -+ if (retval) { -+ dev_err(dev, "failed to get spi-cs [%d]\n", retval); -+ goto err_port; -+ } -+ uart_np = of_parse_phandle(dev->of_node, "uart", 0); -+ if (!uart_np) { -+ dev_err(dev, "cannot parse uart\n"); -+ retval = -ENODEV; -+ goto err_port; -+ } -+ port->ser_ctrl = of_find_serdev_controller_by_node(uart_np); -+ of_node_put(uart_np); -+ //port->pwm = devm_pwm_get(dev, NULL); -+ //if (IS_ERR(port->pwm)) { -+ // retval = PTR_ERR(port->pwm); -+ // if (retval != -EPROBE_DEFER) -+ // dev_err(dev, "failed to request PWM device [%d]\n", -+ // retval); -+ // goto err_port; -+ //} -+ port->gpios = gpiod_get_array(dev, "mikrobus", GPIOD_OUT_LOW); -+ if (IS_ERR(port->gpios)) { -+ retval = PTR_ERR(port->gpios); -+ dev_err(dev, "failed to get gpio array [%d]\n", retval); -+ goto err_port; -+ } -+ port->pinctrl = devm_pinctrl_get(dev); -+ if (IS_ERR(port->pinctrl)) { -+ retval = PTR_ERR(port->pinctrl); -+ dev_err(dev, "failed to get pinctrl [%d]\n", retval); -+ goto err_port; -+ } -+ port->dev.parent = dev; -+ port->dev.of_node = pdev->dev.of_node; -+ -+ retval = mikrobus_port_probe_pinctrl_setup(port); -+ if (retval) { -+ dev_err(dev, "failed to setup pinctrl [%d]\n", retval); -+ goto err_port; -+ } -+ -+ retval = mikrobus_port_register(port); -+ if (retval) { -+ pr_err("port : can't register port [%d]\n", retval); -+ goto err_port; -+ } -+ platform_set_drvdata(pdev, port); -+ return 0; -+err_port: -+ kfree(port); -+ return retval; -+} -+ -+static int mikrobus_port_remove(struct platform_device *pdev) -+{ -+ struct mikrobus_port *port = platform_get_drvdata(pdev); -+ -+ mikrobus_port_delete(port); -+ return 0; -+} -+ -+static const struct of_device_id mikrobus_port_of_match[] = { -+ {.compatible = "linux,mikrobus"}, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, mikrobus_port_of_match); -+ -+static struct platform_driver mikrobus_port_driver = { -+ .probe = mikrobus_port_probe, -+ .remove = mikrobus_port_remove, -+ .driver = { -+ .name = "mikrobus", -+ .of_match_table = of_match_ptr(mikrobus_port_of_match), -+ }, -+}; -+ -+static int __init mikrobus_init(void) -+{ -+ int retval; -+ -+ retval = bus_register(&mikrobus_bus_type); -+ if (retval) { -+ pr_err("bus_register failed (%d)\n", retval); -+ return retval; -+ } -+ mikrobus_port_compat_class = class_compat_register("mikrobus-port"); -+ if (!mikrobus_port_compat_class) { -+ pr_err("class_compat register failed (%d)\n", retval); -+ retval = -ENOMEM; -+ goto class_err; -+ } -+ retval = of_alias_get_highest_id("mikrobus"); -+ if (retval >= __mikrobus_first_dynamic_bus_num) -+ __mikrobus_first_dynamic_bus_num = retval + 1; -+ -+ is_registered = true; -+ retval = platform_driver_register(&mikrobus_port_driver); -+ if (retval) -+ pr_err("driver register failed [%d]\n", retval); -+ return retval; -+ -+class_err: -+ bus_unregister(&mikrobus_bus_type); -+ idr_destroy(&mikrobus_port_idr); -+ is_registered = false; -+ return retval; -+} -+subsys_initcall(mikrobus_init); -+ -+static void __exit mikrobus_exit(void) -+{ -+ platform_driver_unregister(&mikrobus_port_driver); -+ bus_unregister(&mikrobus_bus_type); -+ class_compat_unregister(mikrobus_port_compat_class); -+ idr_destroy(&mikrobus_port_idr); -+} -+module_exit(mikrobus_exit); -+ -+MODULE_AUTHOR("Vaishnav M A <vaishnav@beagleboard.org>"); -+MODULE_DESCRIPTION("mikroBUS main module"); -+MODULE_LICENSE("GPL v2"); -diff --git a/drivers/misc/mikrobus/mikrobus_id.c b/drivers/misc/mikrobus/mikrobus_id.c -new file mode 100644 -index 000000000000..2b97342327d9 ---- /dev/null -+++ b/drivers/misc/mikrobus/mikrobus_id.c -@@ -0,0 +1,197 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * mikrobus_id.c - w1 mikroBUS ID family EEPROM driver -+ * -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#include <linux/device.h> -+#include <linux/types.h> -+#include <linux/delay.h> -+ -+#include <linux/w1.h> -+#include <linux/nvmem-provider.h> -+ -+#include <linux/mikrobus.h> -+ -+#define W1_EEPROM_MIKROBUS_ID 0x43 -+ -+#define W1_MIKROBUS_ID_EEPROM_SIZE 0x0A00 -+#define W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE 32 -+#define W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE 35 -+#define W1_MIKROBUS_ID_READ_EEPROM 0xF0 -+#define W1_MIKROBUS_ID_EEPROM_READ_RETRIES 10 -+#define W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES 5 -+#define W1_MIKROBUS_ID_EEPROM_WRITE_SCRATCH 0x0F -+#define W1_MIKROBUS_ID_EEPROM_READ_SCRATCH 0xAA -+#define W1_MIKROBUS_ID_EEPROM_COPY_SCRATCH 0x55 -+#define W1_MIKROBUS_ID_EEPROM_TPROG_MS 20 -+ -+static int w1_mikrobus_id_readblock(struct w1_slave *sl, int off, int count, char *buf) -+{ -+ u8 wrbuf[3]; -+ u8 *cmp; -+ int tries = W1_MIKROBUS_ID_EEPROM_READ_RETRIES; -+ -+ do { -+ wrbuf[0] = W1_MIKROBUS_ID_READ_EEPROM; -+ wrbuf[1] = off & 0xFF; -+ wrbuf[2] = off >> 8; -+ -+ if (w1_reset_select_slave(sl)) -+ return -1; -+ w1_write_block(sl->master, wrbuf, 3); -+ w1_read_block(sl->master, buf, count); -+ -+ if (w1_reset_select_slave(sl)) -+ return -1; -+ cmp = kzalloc(count, GFP_KERNEL); -+ if (!cmp) -+ return -ENOMEM; -+ w1_write_block(sl->master, wrbuf, 3); -+ w1_read_block(sl->master, cmp, count); -+ if (!memcmp(cmp, buf, count)){ -+ kfree(cmp); -+ return 0; -+ } -+ } while (--tries); -+ -+ dev_err(&sl->dev, "proof reading failed %d times\n", -+ W1_MIKROBUS_ID_EEPROM_READ_RETRIES); -+ kfree(cmp); -+ return -EIO; -+} -+ -+static int w1_mikrobus_id_movescratch(struct w1_slave *sl, int addr, char *buf) -+{ -+ u8 wrbuf[4]; -+ u8 scratchpad_verify[W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE]; -+ u8 TA1, TA2, ES; -+ int verify_status; -+ int tries; -+ -+ wrbuf[0] = W1_MIKROBUS_ID_EEPROM_WRITE_SCRATCH; -+ wrbuf[1] = addr & 0xFF; -+ wrbuf[2] = addr >> 8; -+ -+ tries = W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES; -+ do { -+ if (w1_reset_select_slave(sl)) -+ return -1; -+ w1_write_block(sl->master, wrbuf, 3); -+ w1_write_block(sl->master, buf, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -+ if (w1_reset_select_slave(sl)) -+ return -1; -+ w1_write_8(sl->master, W1_MIKROBUS_ID_EEPROM_READ_SCRATCH); -+ TA1 = w1_read_8(sl->master); -+ TA2 = w1_read_8(sl->master); -+ ES = w1_read_8(sl->master); -+ w1_read_block(sl->master, scratchpad_verify, W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE); -+ verify_status = memcmp(buf, scratchpad_verify, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -+ } while(verify_status && --tries); -+ -+ if(!tries && verify_status){ -+ dev_err(&sl->dev, "verify scratchpad failed %d times\n", -+ W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES); -+ return -EIO; -+ } -+ -+ wrbuf[0] = W1_MIKROBUS_ID_EEPROM_COPY_SCRATCH; -+ wrbuf[1] = addr & 0xFF; -+ wrbuf[2] = addr >> 8; -+ wrbuf[3] = ES; -+ if (w1_reset_select_slave(sl)) -+ return -1; -+ w1_write_block(sl->master, wrbuf, 4); -+ msleep(W1_MIKROBUS_ID_EEPROM_TPROG_MS); -+ return 0; -+} -+ -+static int w1_mikrobus_id_writeblock(struct w1_slave *sl, int off, int count, char *buf) -+{ -+ u16 wraddr = 0; -+ u16 len = count - (count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -+ u8 scratchpad_write[W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE] = {0}; -+ -+ while(len > 0) { -+ w1_mikrobus_id_movescratch(sl, wraddr + off, buf + wraddr); -+ wraddr += W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE; -+ len -= W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE; -+ } -+ -+ if(count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE){ -+ memcpy(scratchpad_write, buf + wraddr, count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -+ w1_mikrobus_id_movescratch(sl, wraddr + off, scratchpad_write); -+ } -+ -+ return 0; -+} -+ -+static int w1_mikrobus_id_nvmem_read(void *priv, unsigned int off, void *buf, size_t count) -+{ -+ struct w1_slave *sl = priv; -+ int ret; -+ -+ mutex_lock(&sl->master->bus_mutex); -+ ret = w1_mikrobus_id_readblock(sl, off, count, buf); -+ mutex_unlock(&sl->master->bus_mutex); -+ -+ return ret; -+} -+ -+static int w1_mikrobus_id_nvmem_write(void *priv, unsigned int off, void *buf, size_t count) -+{ -+ struct w1_slave *sl = priv; -+ int ret; -+ -+ mutex_lock(&sl->master->bus_mutex); -+ ret = w1_mikrobus_id_writeblock(sl, off, count, buf); -+ mutex_unlock(&sl->master->bus_mutex); -+ -+ return ret; -+} -+ -+static int w1_mikrobus_id_add_slave(struct w1_slave *sl) -+{ -+ struct nvmem_device *nvmem; -+ struct mikrobus_port *port; -+ struct nvmem_config nvmem_cfg = { -+ .dev = &sl->dev, -+ .reg_read = w1_mikrobus_id_nvmem_read, -+ .reg_write = w1_mikrobus_id_nvmem_write, -+ .type = NVMEM_TYPE_EEPROM, -+ .read_only = false, -+ .word_size = 1, -+ .stride = 1, -+ .size = W1_MIKROBUS_ID_EEPROM_SIZE, -+ .priv = sl, -+ }; -+ -+ port = mikrobus_find_port_by_w1_master(sl->master); -+ if(!port) -+ return -ENODEV; -+ -+ nvmem_cfg.name = port->name; -+ nvmem = devm_nvmem_register(&sl->dev, &nvmem_cfg); -+ port->eeprom = nvmem; -+ mikrobus_port_scan_eeprom(port); -+ -+ return PTR_ERR_OR_ZERO(nvmem); -+} -+ -+static const struct w1_family_ops w1_family_mikrobus_id_fops = { -+ .add_slave = w1_mikrobus_id_add_slave, -+}; -+ -+static struct w1_family w1_family_mikrobus_id = { -+ .fid = W1_EEPROM_MIKROBUS_ID, -+ .fops = &w1_family_mikrobus_id_fops, -+}; -+module_w1_family(w1_family_mikrobus_id); -+ -+MODULE_AUTHOR("Vaishnav M A <vaishnav@beagleboard.org>"); -+MODULE_DESCRIPTION("w1 family ac driver for mikroBUS ID EEPROM"); -+MODULE_LICENSE("GPL"); -+MODULE_ALIAS("w1-family-" __stringify(W1_EEPROM_MIKROBUS_ID)); -diff --git a/drivers/misc/mikrobus/mikrobus_manifest.c b/drivers/misc/mikrobus/mikrobus_manifest.c -new file mode 100644 -index 000000000000..bd945110ba8c ---- /dev/null -+++ b/drivers/misc/mikrobus/mikrobus_manifest.c -@@ -0,0 +1,477 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * mikroBUS manifest parsing, an -+ * extension to Greybus Manifest Parsing -+ * under drivers/greybus/manifest.c -+ * -+ * Copyright 2014-2015 Google Inc. -+ * Copyright 2014-2015 Linaro Ltd. -+ */ -+ -+#define pr_fmt(fmt) "mikrobus_manifest:%s: " fmt, __func__ -+ -+#include <linux/bits.h> -+#include <linux/types.h> -+#include <linux/property.h> -+#include <linux/greybus/greybus_manifest.h> -+ -+#include "mikrobus_manifest.h" -+ -+struct manifest_desc { -+ struct list_head links; -+ size_t size; -+ void *data; -+ enum greybus_descriptor_type type; -+}; -+ -+static void manifest_descriptor_release_all(struct addon_board_info *board) -+{ -+ struct manifest_desc *descriptor; -+ struct manifest_desc *next; -+ -+ list_for_each_entry_safe(descriptor, next, &board->manifest_descs, links) { -+ list_del(&descriptor->links); -+ kfree(descriptor); -+ } -+} -+ -+static int board_descriptor_add(struct addon_board_info *board, struct greybus_descriptor *desc, -+ size_t size) -+{ -+ struct greybus_descriptor_header *desc_header = &desc->header; -+ struct manifest_desc *descriptor; -+ size_t desc_size; -+ size_t expected_size; -+ -+ if (size < sizeof(*desc_header)) { -+ pr_err("short descriptor (%zu < %zu)", size, sizeof(*desc_header)); -+ return -EINVAL; -+ } -+ desc_size = le16_to_cpu(desc_header->size); -+ if (desc_size > size) { -+ pr_err("incorrect descriptor size (%zu != %zu)", size, desc_size); -+ return -EINVAL; -+ } -+ expected_size = sizeof(*desc_header); -+ switch (desc_header->type) { -+ case GREYBUS_TYPE_STRING: -+ expected_size += sizeof(struct greybus_descriptor_string); -+ expected_size += desc->string.length; -+ expected_size = ALIGN(expected_size, 4); -+ break; -+ case GREYBUS_TYPE_PROPERTY: -+ expected_size += sizeof(struct greybus_descriptor_property); -+ expected_size += desc->property.length; -+ expected_size = ALIGN(expected_size, 4); -+ break; -+ case GREYBUS_TYPE_DEVICE: -+ expected_size += sizeof(struct greybus_descriptor_device); -+ break; -+ case GREYBUS_TYPE_MIKROBUS: -+ expected_size += sizeof(struct greybus_descriptor_mikrobus); -+ break; -+ case GREYBUS_TYPE_INTERFACE: -+ expected_size += sizeof(struct greybus_descriptor_interface); -+ break; -+ case GREYBUS_TYPE_CPORT: -+ expected_size += sizeof(struct greybus_descriptor_cport); -+ break; -+ case GREYBUS_TYPE_BUNDLE: -+ expected_size += sizeof(struct greybus_descriptor_bundle); -+ break; -+ case GREYBUS_TYPE_INVALID: -+ default: -+ pr_err("invalid descriptor type %d", desc_header->type); -+ return -EINVAL; -+ } -+ -+ descriptor = kzalloc(sizeof(*descriptor), GFP_KERNEL); -+ if (!descriptor) -+ return -ENOMEM; -+ descriptor->size = desc_size; -+ descriptor->data = (char *)desc + sizeof(*desc_header); -+ descriptor->type = desc_header->type; -+ list_add_tail(&descriptor->links, &board->manifest_descs); -+ return desc_size; -+} -+ -+static char *mikrobus_string_get(struct addon_board_info *board, u8 string_id) -+{ -+ struct greybus_descriptor_string *desc_string; -+ struct manifest_desc *descriptor; -+ bool found = false; -+ char *string; -+ -+ if (!string_id) -+ return NULL; -+ -+ list_for_each_entry(descriptor, &board->manifest_descs, links) { -+ if (descriptor->type != GREYBUS_TYPE_STRING) -+ continue; -+ desc_string = descriptor->data; -+ if (desc_string->id == string_id) { -+ found = true; -+ break; -+ } -+ } -+ if (!found) -+ return ERR_PTR(-ENOENT); -+ string = kmemdup(&desc_string->string, desc_string->length + 1, GFP_KERNEL); -+ if (!string) -+ return ERR_PTR(-ENOMEM); -+ string[desc_string->length] = '\0'; -+ return string; -+} -+ -+static void mikrobus_state_get(struct addon_board_info *board) -+{ -+ struct greybus_descriptor_mikrobus *mikrobus; -+ struct greybus_descriptor_interface *interface; -+ struct manifest_desc *descriptor; -+ bool found = false; -+ int i; -+ -+ list_for_each_entry(descriptor, &board->manifest_descs, links) { -+ if (descriptor->type == GREYBUS_TYPE_MIKROBUS) { -+ mikrobus = descriptor->data; -+ found = true; -+ break; -+ } -+ } -+ if (!found) { -+ pr_err("mikrobus descriptor not found"); -+ return; -+ } -+ for (i = 0; i < MIKROBUS_PORT_PIN_COUNT; i++) -+ board->pin_state[i] = mikrobus->pin_state[i]; -+ -+ found = false; -+ list_for_each_entry(descriptor, &board->manifest_descs, links) { -+ if (descriptor->type == GREYBUS_TYPE_INTERFACE) { -+ interface = descriptor->data; -+ found = true; -+ break; -+ } -+ } -+ if (!found) { -+ pr_err("interface descriptor not found"); -+ return; -+ } -+ board->name = mikrobus_string_get(board, interface->product_stringid); -+} -+ -+static struct property_entry * -+mikrobus_property_entry_get(struct addon_board_info *board, u8 *prop_link, -+ int num_properties) -+{ -+ struct greybus_descriptor_property *desc_property; -+ struct manifest_desc *descriptor; -+ struct property_entry *properties; -+ bool found = false; -+ char *prop_name; -+ u64 *val_u64; -+ u32 *val_u32; -+ u16 *val_u16; -+ u8 *val_u8; -+ int i; -+ -+ properties = kcalloc(num_properties, sizeof(*properties), GFP_KERNEL); -+ if (!properties) -+ return ERR_PTR(-ENOMEM); -+ for (i = 0; i < num_properties; i++) { -+ list_for_each_entry(descriptor, &board->manifest_descs, links) { -+ if (descriptor->type != GREYBUS_TYPE_PROPERTY) -+ continue; -+ desc_property = descriptor->data; -+ if (desc_property->id == prop_link[i]) { -+ found = true; -+ break; -+ } -+ } -+ if (!found) { -+ kfree(properties); -+ return ERR_PTR(-ENOENT); -+ } -+ prop_name = mikrobus_string_get(board, desc_property->propname_stringid); -+ if (!prop_name) { -+ kfree(properties); -+ return ERR_PTR(-ENOENT); -+ } -+ switch (desc_property->type) { -+ case MIKROBUS_PROPERTY_TYPE_U8: -+ val_u8 = kmemdup(&desc_property->value, -+ (desc_property->length) * sizeof(u8), -+ GFP_KERNEL); -+ if (desc_property->length == 1) -+ properties[i] = PROPERTY_ENTRY_U8(prop_name, *val_u8); -+ else -+ properties[i] = PROPERTY_ENTRY_U8_ARRAY_LEN(prop_name, -+ (void *)desc_property->value, desc_property->length); -+ break; -+ case MIKROBUS_PROPERTY_TYPE_U16: -+ val_u16 = kmemdup(&desc_property->value, -+ (desc_property->length) * sizeof(u16), GFP_KERNEL); -+ if (desc_property->length == 1) -+ properties[i] = PROPERTY_ENTRY_U16(prop_name, *val_u16); -+ else -+ properties[i] = PROPERTY_ENTRY_U16_ARRAY_LEN(prop_name, -+ (void *)desc_property->value, desc_property->length); -+ break; -+ case MIKROBUS_PROPERTY_TYPE_U32: -+ val_u32 = kmemdup(&desc_property->value, -+ (desc_property->length) * sizeof(u32), GFP_KERNEL); -+ if (desc_property->length == 1) -+ properties[i] = PROPERTY_ENTRY_U32(prop_name, *val_u32); -+ else -+ properties[i] = PROPERTY_ENTRY_U32_ARRAY_LEN(prop_name, -+ (void *)desc_property->value, desc_property->length); -+ break; -+ case MIKROBUS_PROPERTY_TYPE_U64: -+ val_u64 = kmemdup(&desc_property->value, -+ (desc_property->length) * sizeof(u64), GFP_KERNEL); -+ if (desc_property->length == 1) -+ properties[i] = PROPERTY_ENTRY_U64(prop_name, *val_u64); -+ else -+ properties[i] = PROPERTY_ENTRY_U64_ARRAY_LEN(prop_name, -+ (void *)desc_property->value, desc_property->length); -+ break; -+ default: -+ kfree(properties); -+ return ERR_PTR(-EINVAL); -+ } -+ } -+ return properties; -+} -+ -+static u8 *mikrobus_property_link_get(struct addon_board_info *board, u8 prop_id, -+ struct board_device_info *board_dev, u8 prop_type) -+{ -+ struct greybus_descriptor_property *desc_property; -+ struct manifest_desc *descriptor; -+ bool found = false; -+ u8 *val_u8; -+ -+ if (!prop_id) -+ return NULL; -+ list_for_each_entry(descriptor, &board->manifest_descs, links) { -+ if (descriptor->type != GREYBUS_TYPE_PROPERTY) -+ continue; -+ desc_property = descriptor->data; -+ if (desc_property->id == prop_id && desc_property->type == prop_type) { -+ found = true; -+ break; -+ } -+ } -+ if (!found) -+ return ERR_PTR(-ENOENT); -+ val_u8 = kmemdup(&desc_property->value, desc_property->length, GFP_KERNEL); -+ if (prop_type == MIKROBUS_PROPERTY_TYPE_GPIO) -+ board_dev->num_gpio_resources = desc_property->length; -+ else if (prop_type == MIKROBUS_PROPERTY_TYPE_PROPERTY) -+ board_dev->num_properties = desc_property->length; -+ else if (prop_type == MIKROBUS_PROPERTY_TYPE_REGULATOR) -+ board_dev->num_regulators = desc_property->length; -+ else if (prop_type == MIKROBUS_PROPERTY_TYPE_CLOCK) -+ board_dev->num_clocks = desc_property->length; -+ return val_u8; -+} -+ -+static int mikrobus_manifest_attach_device(struct addon_board_info *board, -+ struct greybus_descriptor_device *dev_desc) -+{ -+ struct board_device_info *board_dev; -+ struct gpiod_lookup_table *lookup; -+ struct greybus_descriptor_property *desc_property; -+ struct manifest_desc *descriptor; -+ u8 *gpio_desc_link; -+ u8 *prop_link; -+ u8 *reg_link; -+ u8 *clock_link; -+ u8 *gpioval; -+ int retval; -+ int i; -+ -+ board_dev = kzalloc(sizeof(*board_dev), GFP_KERNEL); -+ if (!board_dev) -+ return -ENOMEM; -+ board_dev->id = dev_desc->id; -+ board_dev->drv_name = mikrobus_string_get(board, dev_desc->driver_stringid); -+ if (!board_dev->drv_name) { -+ retval = -ENOENT; -+ goto err_free_board_dev; -+ } -+ board_dev->protocol = dev_desc->protocol; -+ board_dev->reg = dev_desc->reg; -+ board_dev->irq = dev_desc->irq; -+ board_dev->irq_type = dev_desc->irq_type; -+ board_dev->max_speed_hz = le32_to_cpu(dev_desc->max_speed_hz); -+ board_dev->mode = dev_desc->mode; -+ pr_info("parsed device %d, driver=%s, protocol=%d, reg=%x", board_dev->id, board_dev->drv_name, board_dev->protocol, board_dev->reg); -+ -+ if (dev_desc->prop_link > 0) { -+ prop_link = mikrobus_property_link_get(board, dev_desc->prop_link, -+ board_dev, MIKROBUS_PROPERTY_TYPE_PROPERTY); -+ if (!prop_link) { -+ retval = -ENOENT; -+ goto err_free_board_dev; -+ } -+ pr_info("device %d, number of properties=%d", board_dev->id, -+ board_dev->num_properties); -+ board_dev->properties = mikrobus_property_entry_get(board, prop_link, -+ board_dev->num_properties); -+ } -+ -+ if (dev_desc->gpio_link > 0) { -+ gpio_desc_link = mikrobus_property_link_get(board, dev_desc->gpio_link, board_dev, -+ MIKROBUS_PROPERTY_TYPE_GPIO); -+ if (!gpio_desc_link) { -+ retval = -ENOENT; -+ goto err_free_board_dev; -+ } -+ pr_info("device %d, number of gpio resource=%d", board_dev->id, -+ board_dev->num_gpio_resources); -+ lookup = kzalloc(struct_size(lookup, table, board_dev->num_gpio_resources), -+ GFP_KERNEL); -+ if (!lookup) { -+ retval = -ENOMEM; -+ goto err_free_board_dev; -+ } -+ for (i = 0; i < board_dev->num_gpio_resources; i++) { -+ list_for_each_entry(descriptor, &board->manifest_descs, links) { -+ if (descriptor->type != GREYBUS_TYPE_PROPERTY) -+ continue; -+ desc_property = descriptor->data; -+ if (desc_property->id == gpio_desc_link[i]) { -+ gpioval = desc_property->value; -+ lookup->table[i].chip_hwnum = gpioval[0]; -+ lookup->table[i].flags = gpioval[1]; -+ lookup->table[i].con_id = -+ mikrobus_string_get(board, -+ desc_property->propname_stringid); -+ break; -+ } -+ } -+ } -+ board_dev->gpio_lookup = lookup; -+ } -+ -+ if (dev_desc->reg_link > 0) { -+ reg_link = mikrobus_property_link_get(board, dev_desc->reg_link, -+ board_dev, MIKROBUS_PROPERTY_TYPE_REGULATOR); -+ if (!reg_link) { -+ retval = -ENOENT; -+ goto err_free_board_dev; -+ } -+ pr_info("device %d, number of regulators=%d", board_dev->id, -+ board_dev->num_regulators); -+ board_dev->regulators = mikrobus_property_entry_get(board, reg_link, -+ board_dev->num_regulators); -+ } -+ -+ if (dev_desc->clock_link > 0) { -+ clock_link = mikrobus_property_link_get(board, dev_desc->clock_link, -+ board_dev, MIKROBUS_PROPERTY_TYPE_CLOCK); -+ if (!clock_link) { -+ retval = -ENOENT; -+ goto err_free_board_dev; -+ } -+ pr_info("device %d, number of clocks=%d", board_dev->id, -+ board_dev->num_clocks); -+ board_dev->clocks = mikrobus_property_entry_get(board, clock_link, -+ board_dev->num_clocks); -+ } -+ list_add_tail(&board_dev->links, &board->devices); -+ return 0; -+err_free_board_dev: -+ kfree(board_dev); -+ return retval; -+} -+ -+static int mikrobus_manifest_parse_devices(struct addon_board_info *board) -+{ -+ struct greybus_descriptor_device *desc_device; -+ struct manifest_desc *desc, *next; -+ int retval; -+ int devcount = 0; -+ -+ list_for_each_entry_safe(desc, next, &board->manifest_descs, links) { -+ if (desc->type != GREYBUS_TYPE_DEVICE) -+ continue; -+ desc_device = desc->data; -+ retval = mikrobus_manifest_attach_device(board, desc_device); -+ devcount++; -+ } -+ return devcount; -+} -+ -+int mikrobus_manifest_parse(struct addon_board_info *board, void *data, -+ size_t size) -+{ -+ struct greybus_manifest_header *header; -+ struct greybus_manifest *manifest; -+ struct greybus_descriptor *desc; -+ u16 manifest_size; -+ int dev_count; -+ int desc_size; -+ -+ if (size < sizeof(*header)) { -+ pr_err("short manifest (%zu < %zu)", size, sizeof(*header)); -+ return -EINVAL; -+ } -+ -+ manifest = data; -+ header = &manifest->header; -+ manifest_size = le16_to_cpu(header->size); -+ -+ if (manifest_size != size) { -+ pr_err("invalid manifest size(%zu < %u)", size, manifest_size); -+ return -EINVAL; -+ } -+ -+ if (header->version_major > MIKROBUS_VERSION_MAJOR) { -+ pr_err("manifest version too new (%u.%u > %u.%u)", -+ header->version_major, header->version_minor, -+ MIKROBUS_VERSION_MAJOR, MIKROBUS_VERSION_MINOR); -+ return -EINVAL; -+ } -+ -+ desc = manifest->descriptors; -+ size -= sizeof(*header); -+ while (size) { -+ desc_size = board_descriptor_add(board, desc, size); -+ if (desc_size < 0) { -+ pr_err("invalid manifest descriptor, size: %u", desc_size); -+ return -EINVAL; -+ } -+ desc = (void *)desc + desc_size; -+ size -= desc_size; -+ } -+ mikrobus_state_get(board); -+ dev_count = mikrobus_manifest_parse_devices(board); -+ pr_info(" %s manifest parsed with %d devices", board->name, dev_count); -+ manifest_descriptor_release_all(board); -+ return true; -+} -+ -+size_t mikrobus_manifest_header_validate(void *data, size_t size) -+{ -+ struct greybus_manifest_header *header; -+ u16 manifest_size; -+ -+ header = data; -+ manifest_size = le16_to_cpu(header->size); -+ -+ if (manifest_size < sizeof(*header)) { -+ pr_err("short manifest (%zu < %zu)", size, sizeof(*header)); -+ return -EINVAL; -+ } -+ -+ if (header->version_major > MIKROBUS_VERSION_MAJOR) { -+ pr_err("manifest version too new (%u.%u > %u.%u)", -+ header->version_major, header->version_minor, -+ MIKROBUS_VERSION_MAJOR, MIKROBUS_VERSION_MINOR); -+ return -EINVAL; -+ } -+ return manifest_size; -+} -+ -diff --git a/drivers/misc/mikrobus/mikrobus_manifest.h b/drivers/misc/mikrobus/mikrobus_manifest.h -new file mode 100644 -index 000000000000..4c8b4346575e ---- /dev/null -+++ b/drivers/misc/mikrobus/mikrobus_manifest.h -@@ -0,0 +1,20 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * mikroBUS manifest definition -+ * extension to Greybus Manifest Definition -+ * -+ * Copyright 2014-2015 Google Inc. -+ * Copyright 2014-2015 Linaro Ltd. -+ * -+ * Released under the GPLv2 and BSD licenses. -+ */ -+ -+#ifndef __MIKROBUS_MANIFEST_H -+#define __MIKROBUS_MANIFEST_H -+ -+#include <linux/mikrobus.h> -+ -+int mikrobus_manifest_parse(struct addon_board_info *info, void *data, size_t size); -+size_t mikrobus_manifest_header_validate(void *data, size_t size); -+ -+#endif /* __MIKROBUS_MANIFEST_H */ -diff --git a/drivers/staging/greybus/gbphy.c b/drivers/staging/greybus/gbphy.c -index 13d319860da5..738421ccf4b2 100644 ---- a/drivers/staging/greybus/gbphy.c -+++ b/drivers/staging/greybus/gbphy.c -@@ -14,16 +14,12 @@ - #include <linux/slab.h> - #include <linux/device.h> - #include <linux/greybus.h> -+#include <linux/mikrobus.h> - --#include "gbphy.h" -+#include <linux/greybus/gbphy.h> - - #define GB_GBPHY_AUTOSUSPEND_MS 3000 - --struct gbphy_host { -- struct gb_bundle *bundle; -- struct list_head devices; --}; -- - static DEFINE_IDA(gbphy_id); - - static ssize_t protocol_id_show(struct device *dev, -@@ -305,6 +301,8 @@ static int gb_gbphy_probe(struct gb_bundle *bundle, - list_add(&gbphy_dev->list, &gbphy_host->devices); - } - -+ mikrobus_port_gb_register(gbphy_host, bundle->manifest_blob, bundle->manifest_size); -+ - gb_pm_runtime_put_autosuspend(bundle); - - return 0; -diff --git a/drivers/staging/greybus/gpio.c b/drivers/staging/greybus/gpio.c -index 7e6347fe93f9..218f4ae1c562 100644 ---- a/drivers/staging/greybus/gpio.c -+++ b/drivers/staging/greybus/gpio.c -@@ -15,32 +15,8 @@ - #include <linux/mutex.h> - #include <linux/greybus.h> - --#include "gbphy.h" -- --struct gb_gpio_line { -- /* The following has to be an array of line_max entries */ -- /* --> make them just a flags field */ -- u8 active: 1, -- direction: 1, /* 0 = output, 1 = input */ -- value: 1; /* 0 = low, 1 = high */ -- u16 debounce_usec; -- -- u8 irq_type; -- bool irq_type_pending; -- bool masked; -- bool masked_pending; --}; -- --struct gb_gpio_controller { -- struct gbphy_device *gbphy_dev; -- struct gb_connection *connection; -- u8 line_max; /* max line number */ -- struct gb_gpio_line *lines; -+#include <linux/greybus/gbphy.h> - -- struct gpio_chip chip; -- struct irq_chip irqc; -- struct mutex irq_lock; --}; - #define gpio_chip_to_gb_gpio_controller(chip) \ - container_of(chip, struct gb_gpio_controller, chip) - #define irq_data_to_gpio_chip(d) (d->domain->host_data) -diff --git a/drivers/staging/greybus/i2c.c b/drivers/staging/greybus/i2c.c -index de2f6516da09..4fff1c6d88b7 100644 ---- a/drivers/staging/greybus/i2c.c -+++ b/drivers/staging/greybus/i2c.c -@@ -12,16 +12,7 @@ - #include <linux/i2c.h> - #include <linux/greybus.h> - --#include "gbphy.h" -- --struct gb_i2c_device { -- struct gb_connection *connection; -- struct gbphy_device *gbphy_dev; -- -- u32 functionality; -- -- struct i2c_adapter adapter; --}; -+#include <linux/greybus/gbphy.h> - - /* - * Map Greybus i2c functionality bits into Linux ones -diff --git a/drivers/staging/greybus/pwm.c b/drivers/staging/greybus/pwm.c -index 891a6a672378..2808882e2ad3 100644 ---- a/drivers/staging/greybus/pwm.c -+++ b/drivers/staging/greybus/pwm.c -@@ -12,7 +12,7 @@ - #include <linux/pwm.h> - #include <linux/greybus.h> - --#include "gbphy.h" -+#include <linux/greybus/gbphy.h> - - struct gb_pwm_chip { - struct gb_connection *connection; -diff --git a/drivers/staging/greybus/sdio.c b/drivers/staging/greybus/sdio.c -index 37bf04c22dbc..29f82d95e8b2 100644 ---- a/drivers/staging/greybus/sdio.c -+++ b/drivers/staging/greybus/sdio.c -@@ -14,7 +14,7 @@ - #include <linux/workqueue.h> - #include <linux/greybus.h> - --#include "gbphy.h" -+#include <linux/greybus/gbphy.h> - - struct gb_sdio_host { - struct gb_connection *connection; -diff --git a/drivers/staging/greybus/spi.c b/drivers/staging/greybus/spi.c -index 68e8d272db6d..2ab5fa2e6cfa 100644 ---- a/drivers/staging/greybus/spi.c -+++ b/drivers/staging/greybus/spi.c -@@ -9,7 +9,7 @@ - #include <linux/module.h> - #include <linux/greybus.h> - --#include "gbphy.h" -+#include <linux/greybus/gbphy.h> - #include "spilib.h" - - static struct spilib_ops *spilib_ops; -diff --git a/drivers/staging/greybus/spilib.c b/drivers/staging/greybus/spilib.c -index ad0700a0bb81..5c94b7639969 100644 ---- a/drivers/staging/greybus/spilib.c -+++ b/drivers/staging/greybus/spilib.c -@@ -14,24 +14,7 @@ - #include <linux/spi/spi.h> - - #include "spilib.h" -- --struct gb_spilib { -- struct gb_connection *connection; -- struct device *parent; -- struct spi_transfer *first_xfer; -- struct spi_transfer *last_xfer; -- struct spilib_ops *ops; -- u32 rx_xfer_offset; -- u32 tx_xfer_offset; -- u32 last_xfer_size; -- unsigned int op_timeout; -- u16 mode; -- u16 flags; -- u32 bits_per_word_mask; -- u8 num_chipselect; -- u32 min_speed_hz; -- u32 max_speed_hz; --}; -+#include <linux/greybus/gbphy.h> - - #define GB_SPI_STATE_MSG_DONE ((void *)0) - #define GB_SPI_STATE_MSG_IDLE ((void *)1) -diff --git a/drivers/staging/greybus/uart.c b/drivers/staging/greybus/uart.c -index 73f01ed1e5b7..6722565b1fd7 100644 ---- a/drivers/staging/greybus/uart.c -+++ b/drivers/staging/greybus/uart.c -@@ -30,7 +30,7 @@ - #include <linux/completion.h> - #include <linux/greybus.h> - --#include "gbphy.h" -+#include <linux/greybus/gbphy.h> - - #define GB_NUM_MINORS 16 /* 16 is more than enough */ - #define GB_NAME "ttyGB" -diff --git a/drivers/staging/greybus/usb.c b/drivers/staging/greybus/usb.c -index 8e9d9d59a357..df4b84f022a5 100644 ---- a/drivers/staging/greybus/usb.c -+++ b/drivers/staging/greybus/usb.c -@@ -12,7 +12,7 @@ - #include <linux/usb/hcd.h> - #include <linux/greybus.h> - --#include "gbphy.h" -+#include <linux/greybus/gbphy.h> - - /* Greybus USB request types */ - #define GB_USB_TYPE_HCD_START 0x02 -diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c -index f2ae2e563dc5..c59ecb60f358 100644 ---- a/drivers/w1/w1.c -+++ b/drivers/w1/w1.c -@@ -683,7 +683,8 @@ static int __w1_attach_slave_device(struct w1_slave *sl) - sl->dev.of_node = of_find_matching_node(sl->master->dev.of_node, - sl->family->of_match_table); - -- dev_set_name(&sl->dev, "%02x-%012llx", -+ dev_set_name(&sl->dev, "%s-%02x-%012llx", -+ sl->master->name, - (unsigned int) sl->reg_num.family, - (unsigned long long) sl->reg_num.id); - snprintf(&sl->name[0], sizeof(sl->name), -diff --git a/drivers/w1/w1_int.c b/drivers/w1/w1_int.c -index b3e1792d9c49..5b16717c8415 100644 ---- a/drivers/w1/w1_int.c -+++ b/drivers/w1/w1_int.c -@@ -243,3 +243,31 @@ void w1_remove_master_device(struct w1_bus_master *bm) - __w1_remove_master_device(found); - } - EXPORT_SYMBOL(w1_remove_master_device); -+ -+/** -+ * w1_find_master_device() - find a master device -+ * @bm: master bus device to search -+ */ -+struct w1_master *w1_find_master_device(struct w1_bus_master *bm) -+{ -+ struct w1_master *dev, *found = NULL; -+ -+ list_for_each_entry(dev, &w1_masters, w1_master_entry) { -+ if (!dev->initialized) -+ continue; -+ -+ if (dev->bus_master->data == bm->data) { -+ found = dev; -+ break; -+ } -+ } -+ -+ if (!found) { -+ pr_err("device doesn't exist.\n"); -+ return ERR_PTR(-ENODEV); -+ } -+ -+ return found; -+} -+EXPORT_SYMBOL(w1_find_master_device); -+ -diff --git a/include/linux/greybus/bundle.h b/include/linux/greybus/bundle.h -index df8d88424cb7..f54ceecf2be8 100644 ---- a/include/linux/greybus/bundle.h -+++ b/include/linux/greybus/bundle.h -@@ -33,6 +33,8 @@ struct gb_bundle { - u8 *state; - - struct list_head links; /* interface->bundles */ -+ void *manifest_blob; -+ size_t manifest_size; - }; - #define to_gb_bundle(d) container_of(d, struct gb_bundle, dev) - -diff --git a/drivers/staging/greybus/gbphy.h b/include/linux/greybus/gbphy.h -similarity index 68% -rename from drivers/staging/greybus/gbphy.h -rename to include/linux/greybus/gbphy.h -index d4a225b76338..cfc23589b2e2 100644 ---- a/drivers/staging/greybus/gbphy.h -+++ b/include/linux/greybus/gbphy.h -@@ -8,6 +8,63 @@ - #ifndef __GBPHY_H - #define __GBPHY_H - -+#include <linux/i2c.h> -+#include <linux/gpio/driver.h> -+ -+struct gbphy_host { -+ struct gb_bundle *bundle; -+ struct list_head devices; -+}; -+ -+ -+struct gb_i2c_device { -+ struct gb_connection *connection; -+ struct gbphy_device *gbphy_dev; -+ u32 functionality; -+ struct i2c_adapter adapter; -+}; -+ -+struct gb_spilib { -+ struct gb_connection *connection; -+ struct device *parent; -+ struct spi_transfer *first_xfer; -+ struct spi_transfer *last_xfer; -+ struct spilib_ops *ops; -+ u32 rx_xfer_offset; -+ u32 tx_xfer_offset; -+ u32 last_xfer_size; -+ unsigned int op_timeout; -+ u16 mode; -+ u16 flags; -+ u32 bits_per_word_mask; -+ u8 num_chipselect; -+ u32 min_speed_hz; -+ u32 max_speed_hz; -+}; -+struct gb_gpio_line { -+ /* The following has to be an array of line_max entries */ -+ /* --> make them just a flags field */ -+ u8 active: 1, -+ direction: 1, /* 0 = output, 1 = input */ -+ value: 1; /* 0 = low, 1 = high */ -+ u16 debounce_usec; -+ -+ u8 irq_type; -+ bool irq_type_pending; -+ bool masked; -+ bool masked_pending; -+}; -+ -+struct gb_gpio_controller { -+ struct gbphy_device *gbphy_dev; -+ struct gb_connection *connection; -+ u8 line_max; /* max line number */ -+ struct gb_gpio_line *lines; -+ struct gpio_chip chip; -+ struct irq_chip irqc; -+ struct mutex irq_lock; -+}; -+ - struct gbphy_device { - u32 id; - struct greybus_descriptor_cport *cport_desc; -@@ -36,9 +93,9 @@ struct gbphy_device_id { - - struct gbphy_driver { - const char *name; -- int (*probe)(struct gbphy_device *device, -+ int (*probe)(struct gbphy_device *, - const struct gbphy_device_id *id); -- void (*remove)(struct gbphy_device *device); -+ void (*remove)(struct gbphy_device *); - const struct gbphy_device_id *id_table; - - struct device_driver driver; -diff --git a/include/linux/greybus/greybus_manifest.h b/include/linux/greybus/greybus_manifest.h -index 6e62fe478712..50d5a5fd3d51 100644 ---- a/include/linux/greybus/greybus_manifest.h -+++ b/include/linux/greybus/greybus_manifest.h -@@ -23,6 +23,9 @@ enum greybus_descriptor_type { - GREYBUS_TYPE_STRING = 0x02, - GREYBUS_TYPE_BUNDLE = 0x03, - GREYBUS_TYPE_CPORT = 0x04, -+ GREYBUS_TYPE_MIKROBUS = 0x05, -+ GREYBUS_TYPE_PROPERTY = 0x06, -+ GREYBUS_TYPE_DEVICE = 0x07, - }; - - enum greybus_protocol { -@@ -151,6 +154,49 @@ struct greybus_descriptor_cport { - __u8 protocol_id; /* enum greybus_protocol */ - } __packed; - -+/* -+ * A mikrobus descriptor is used to describe the details -+ * about the bus ocnfiguration for the add-on board -+ * connected to the mikrobus port. -+ */ -+struct greybus_descriptor_mikrobus { -+ __u8 pin_state[12]; -+} __packed; -+ -+/* -+ * A property descriptor is used to pass named properties -+ * to device drivers through the unified device properties -+ * interface under linux/property.h -+ */ -+struct greybus_descriptor_property { -+ __u8 length; -+ __u8 id; -+ __u8 propname_stringid; -+ __u8 type; -+ __u8 value[0]; -+} __packed; -+ -+/* -+ * A device descriptor is used to describe the -+ * details required by a add-on board device -+ * driver. -+ */ -+struct greybus_descriptor_device { -+ __u8 id; -+ __u8 driver_stringid; -+ __u8 protocol; -+ __u8 reg; -+ __le32 max_speed_hz; -+ __u8 irq; -+ __u8 irq_type; -+ __u8 mode; -+ __u8 prop_link; -+ __u8 gpio_link; -+ __u8 reg_link; -+ __u8 clock_link; -+ __u8 pad[1]; -+} __packed; -+ - struct greybus_descriptor_header { - __le16 size; - __u8 type; /* enum greybus_descriptor_type */ -@@ -164,6 +210,9 @@ struct greybus_descriptor { - struct greybus_descriptor_interface interface; - struct greybus_descriptor_bundle bundle; - struct greybus_descriptor_cport cport; -+ struct greybus_descriptor_mikrobus mikrobus; -+ struct greybus_descriptor_property property; -+ struct greybus_descriptor_device device; - }; - } __packed; - -diff --git a/include/linux/greybus/interface.h b/include/linux/greybus/interface.h -index ce4def881e6f..a7d8d40fa300 100644 ---- a/include/linux/greybus/interface.h -+++ b/include/linux/greybus/interface.h -@@ -65,6 +65,8 @@ struct gb_interface { - - struct work_struct mode_switch_work; - struct completion mode_switch_completion; -+ void *manifest_blob; -+ size_t manifest_size; - }; - #define to_gb_interface(d) container_of(d, struct gb_interface, dev) - -diff --git a/include/linux/mikrobus.h b/include/linux/mikrobus.h -new file mode 100644 -index 000000000000..4999ac70e566 ---- /dev/null -+++ b/include/linux/mikrobus.h -@@ -0,0 +1,207 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * mikroBUS Driver for instantiating add-on -+ * board devices with an identifier EEPROM -+ * -+ * Copyright 2020 Vaishnav M A, BeagleBoard.org Foundation. -+ */ -+ -+#ifndef __MIKROBUS_H -+#define __MIKROBUS_H -+ -+#include <linux/kernel.h> -+#include <linux/device.h> -+#include <linux/i2c.h> -+#include <linux/gpio.h> -+#include <linux/gpio/consumer.h> -+#include <linux/gpio/machine.h> -+#include <linux/spi/spi.h> -+#include <linux/serdev.h> -+#include <linux/property.h> -+#include <linux/greybus.h> -+#include <linux/pinctrl/pinctrl.h> -+#include <linux/pinctrl/pinmux.h> -+#include <linux/pinctrl/consumer.h> -+#include <linux/nvmem-consumer.h> -+#include <linux/nvmem-provider.h> -+#include <linux/greybus/gbphy.h> -+ -+#define MIKROBUS_VERSION_MAJOR 0x00 -+#define MIKROBUS_VERSION_MINOR 0x03 -+ -+#define MIKROBUS_NAME_SIZE 40 -+#define MIKROBUS_PINCTRL_NAME_SIZE 20 -+ -+#define MIKROBUS_NUM_PINCTRL_STATE 4 -+#define MIKROBUS_NUM_CS 2 -+ -+#define MIKROBUS_PINCTRL_PWM 0 -+#define MIKROBUS_PINCTRL_UART 1 -+#define MIKROBUS_PINCTRL_I2C 2 -+#define MIKROBUS_PINCTRL_SPI 3 -+ -+#define MIKROBUS_PINCTRL_STATE_GPIO "gpio" -+ -+#define MIKROBUS_EEPROM_EXIT_ID_CMD 0xD2 -+ -+extern struct bus_type mikrobus_bus_type; -+extern struct device_type mikrobus_port_type; -+extern const char *MIKROBUS_PINCTRL_STR[]; -+ -+enum mikrobus_property_type { -+ MIKROBUS_PROPERTY_TYPE_MIKROBUS = 0x00, -+ MIKROBUS_PROPERTY_TYPE_PROPERTY = 0x01, -+ MIKROBUS_PROPERTY_TYPE_GPIO = 0x02, -+ MIKROBUS_PROPERTY_TYPE_U8 = 0x03, -+ MIKROBUS_PROPERTY_TYPE_U16 = 0x04, -+ MIKROBUS_PROPERTY_TYPE_U32 = 0x05, -+ MIKROBUS_PROPERTY_TYPE_U64 = 0x06, -+ MIKROBUS_PROPERTY_TYPE_REGULATOR = 0x07, -+ MIKROBUS_PROPERTY_TYPE_CLOCK = 0x08, -+}; -+ -+enum mikrobus_pin { -+ MIKROBUS_PIN_PWM = 0x00, -+ MIKROBUS_PIN_INT = 0x01, -+ MIKROBUS_PIN_RX = 0x02, -+ MIKROBUS_PIN_TX = 0x03, -+ MIKROBUS_PIN_SCL = 0x04, -+ MIKROBUS_PIN_SDA = 0x05, -+ MIKROBUS_PIN_MOSI = 0x06, -+ MIKROBUS_PIN_MISO = 0x07, -+ MIKROBUS_PIN_SCK = 0x08, -+ MIKROBUS_PIN_CS = 0x09, -+ MIKROBUS_PIN_RST = 0x0A, -+ MIKROBUS_PIN_AN = 0x0B, -+ MIKROBUS_PORT_PIN_COUNT = 0x0C, -+}; -+ -+enum mikrobus_pin_state { -+ MIKROBUS_STATE_INPUT = 0x01, -+ MIKROBUS_STATE_OUTPUT_HIGH = 0x02, -+ MIKROBUS_STATE_OUTPUT_LOW = 0x03, -+ MIKROBUS_STATE_PWM = 0x04, -+ MIKROBUS_STATE_SPI = 0x05, -+ MIKROBUS_STATE_I2C = 0x06, -+ MIKROBUS_STATE_UART = 0x07, -+}; -+ -+/* -+ * board_device_info describes a single device on a mikrobus add-on -+ * board, an add-on board can present one or more device to the host -+ * -+ * @gpio_lookup: used to provide the GPIO lookup table for -+ * passing the named GPIOs to device drivers. -+ * @properties: used to provide the property_entry to pass named -+ * properties to device drivers, applicable only when driver uses -+ * device_property_read_* calls to fetch the properties. -+ * @num_gpio_resources: number of named gpio resources for the device, -+ * used mainly for gpiod_lookup_table memory allocation. -+ * @num_properties: number of custom properties for the device, -+ * used mainly for property_entry memory allocation. -+ * @protocol: used to know the type of the device and it should -+ * contain one of the values defined under 'enum greybus_class_type' -+ * under linux/greybus/greybus_manifest.h -+ * @reg: I2C address for the device, for devices on the SPI bus -+ * this field is the chip select address relative to the mikrobus -+ * port:0->device chip select connected to CS pin on mikroBUS port -+ * 1->device chip select connected to RST Pin on mikroBUS port -+ * @mode: SPI mode -+ * @max_speed_hz: SPI max speed(Hz) -+ * @drv_name: device_id to match with the driver -+ * @irq_type: type of IRQ trigger , match with defines in linux/interrupt.h -+ * @irq: irq number relative to the mikrobus port should contain one of the -+ * values defined under 'enum mikrobus_pin' -+ * @id: device id starting from 1 -+ */ -+struct board_device_info { -+ struct gpiod_lookup_table *gpio_lookup; -+ struct property_entry *properties; -+ struct property_entry *regulators; -+ struct property_entry *clocks; -+ struct list_head links; -+ unsigned short num_gpio_resources; -+ unsigned short num_properties; -+ unsigned short num_regulators; -+ unsigned short num_clocks; -+ unsigned short protocol; -+ unsigned short reg; -+ unsigned int mode; -+ void *dev_client; -+ u32 max_speed_hz; -+ char *drv_name; -+ int irq_type; -+ int irq; -+ int id; -+}; -+ -+/* -+ * addon_board_info describes a mikrobus add-on device the add-on -+ * board, an add-on board can present one or more device to the host -+ * -+ * @manifest_descs: list of manifest descriptors -+ * @devices: list of devices on the board -+ * @pin_state: the state of each pin on the mikrobus port required -+ * for the add-on board should contain one of the values defined under -+ * 'enum mikrobus_pin_state' restrictions are as per mikrobus standard -+ * specifications. -+ * @name: add-on board name -+ */ -+struct addon_board_info { -+ struct list_head manifest_descs; -+ struct list_head devices; -+ u8 pin_state[MIKROBUS_PORT_PIN_COUNT]; -+ char *name; -+}; -+ -+/* -+ * mikrobus_port describes the peripherals mapped to a -+ * mikrobus port. -+ * -+ * @eeprom_client: i2c_client corresponding to the eeprom -+ * on the add-on board. -+ * @board: pointer to the attached add-on board. -+ * @i2c_adap: I2C adapter attached to the mikrobus port. -+ * @spi_mstr: SPI master attached to the mikrobus port. -+ * @eeprom: nvmem_device for the eeprom on the add-on board. -+ * @pwm: pwm_device attached to the mikrobus port PWM pin. -+ * @pinctrl_selected: current pinctrl_selected state. -+ * @chip_select: chip select number mapped to the SPI -+ * CS pin on the mikrobus port and the RST pin on the mikrobus -+ * port -+ * @id: port id starting from 1 -+ */ -+struct mikrobus_port { -+ struct addon_board_info *board; -+ struct nvmem_device *eeprom; -+ struct i2c_adapter *i2c_adap; -+ struct spi_master *spi_mstr; -+ struct w1_master *w1_master; -+ struct platform_device *w1_gpio; -+ struct serdev_controller *ser_ctrl; -+ struct gpio_descs *gpios; -+ struct pwm_device *pwm; -+ struct pinctrl *pinctrl; -+ struct module *owner; -+ struct device dev; -+ char name[MIKROBUS_NAME_SIZE]; -+ char *pinctrl_selected[MIKROBUS_NUM_PINCTRL_STATE]; -+ unsigned int chip_select[MIKROBUS_NUM_CS]; -+ int skip_scan; -+ int disable_eeprom; -+ int id; -+}; -+#define to_mikrobus_port(d) container_of(d, struct mikrobus_port, dev) -+ -+void mikrobus_board_unregister(struct mikrobus_port *port, -+ struct addon_board_info *board); -+int mikrobus_board_register(struct mikrobus_port *port, -+ struct addon_board_info *board); -+ -+int mikrobus_port_gb_register(struct gbphy_host *host, void *manifest_blob, size_t manifest_size); -+int mikrobus_port_register(struct mikrobus_port *port); -+int mikrobus_port_pinctrl_select(struct mikrobus_port *port); -+void mikrobus_port_delete(struct mikrobus_port *port); -+int mikrobus_port_scan_eeprom(struct mikrobus_port *port); -+struct mikrobus_port *mikrobus_find_port_by_w1_master(struct w1_master *master); -+#endif /* __MIKROBUS_H */ -diff --git a/include/linux/w1.h b/include/linux/w1.h -index 9a2a0ef39018..24269d0dd5d1 100644 ---- a/include/linux/w1.h -+++ b/include/linux/w1.h -@@ -242,6 +242,7 @@ struct w1_master { - - int w1_add_master_device(struct w1_bus_master *master); - void w1_remove_master_device(struct w1_bus_master *master); -+struct w1_master *w1_find_master_device(struct w1_bus_master *master); - - /** - * struct w1_family_ops - operations for a family type --- -2.25.1 - diff --git a/patches/drivers/mikrobus/0002-v5.15.x-mikrobus-Use-software-node-API-with-the-prop.patch b/patches/drivers/mikrobus/0002-v5.15.x-mikrobus-Use-software-node-API-with-the-prop.patch deleted file mode 100644 index 5d2cbb63e0a333287bba07c58a37c5b7e92284f4..0000000000000000000000000000000000000000 --- a/patches/drivers/mikrobus/0002-v5.15.x-mikrobus-Use-software-node-API-with-the-prop.patch +++ /dev/null @@ -1,27 +0,0 @@ -From a05f98ae5794c56d341d612c794e949f8ecc6a86 Mon Sep 17 00:00:00 2001 -From: Robert Nelson <robertcnelson@gmail.com> -Date: Mon, 1 Nov 2021 11:39:04 -0500 -Subject: [PATCH 2/2] v5.15.x: mikrobus: Use software node API with the - properties - -Signed-off-by: Robert Nelson <robertcnelson@gmail.com> ---- - drivers/misc/mikrobus/mikrobus_core.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/misc/mikrobus/mikrobus_core.c b/drivers/misc/mikrobus/mikrobus_core.c -index 4e24f980f18a..5700396b83e4 100644 ---- a/drivers/misc/mikrobus/mikrobus_core.c -+++ b/drivers/misc/mikrobus/mikrobus_core.c -@@ -524,7 +524,7 @@ static int mikrobus_device_register(struct mikrobus_port *port, - if (!pdev) - return -ENOMEM; - if (dev->properties) -- platform_device_add_properties(pdev, dev->properties); -+ device_create_managed_software_node(&pdev->dev, dev->properties, NULL); - dev->dev_client = pdev; - platform_device_add(dev->dev_client); - break; --- -2.30.2 - diff --git a/patches/drivers/mikrobus/0003-drivers-misc-mikrobus-add-support-alternate-Click-ID.patch b/patches/drivers/mikrobus/0003-drivers-misc-mikrobus-add-support-alternate-Click-ID.patch deleted file mode 100644 index 2df996702d4869162fec14cabcb54a0212f41bd5..0000000000000000000000000000000000000000 --- a/patches/drivers/mikrobus/0003-drivers-misc-mikrobus-add-support-alternate-Click-ID.patch +++ /dev/null @@ -1,343 +0,0 @@ -From 3363f1da1dc7fb5c3926051ab9dc6d05d7c83334 Mon Sep 17 00:00:00 2001 -From: vaishnav98 <vaishnav@beagleboard.org> -Date: Tue, 23 Nov 2021 12:24:04 +0530 -Subject: [PATCH] drivers: misc: mikrobus add support alternate Click ID EEPROM - -Add support for Alternate Click ID EEPROM Part No. DS28E36 - -Signed-off-by: vaishnav <vaishnav@beagleboard.org> ---- - drivers/misc/mikrobus/mikrobus_core.c | 31 +---- - drivers/misc/mikrobus/mikrobus_id.c | 171 +++++++++++++++----------- - 2 files changed, 103 insertions(+), 99 deletions(-) - -diff --git a/drivers/misc/mikrobus/mikrobus_core.c b/drivers/misc/mikrobus/mikrobus_core.c -index 5700396b83e4..c4511bc2846c 100644 ---- a/drivers/misc/mikrobus/mikrobus_core.c -+++ b/drivers/misc/mikrobus/mikrobus_core.c -@@ -78,7 +78,7 @@ int mikrobus_port_scan_eeprom(struct mikrobus_port *port) - if (retval != 1) { - dev_err(&port->dev, "failed to fetch manifest start address %d\n", - retval); -- return -EINVAL; -+ header[0] = 0; - } - manifest_start_addr = header[0] << 8; - pr_info("manifest start address is 0x%x \n", manifest_start_addr); -@@ -255,7 +255,7 @@ int mikrobus_port_pinctrl_select(struct mikrobus_port *port) - port->pinctrl_selected[i]); - if (!IS_ERR(state)) { - retval = pinctrl_select_state(port->pinctrl, state); -- pr_info("setting pinctrl %s\n", -+ pr_debug("setting pinctrl %s\n", - port->pinctrl_selected[i]); - if (retval != 0) { - dev_err(&port->dev, "failed to select state %s\n", -@@ -400,26 +400,6 @@ static void mikrobus_board_device_release_all(struct addon_board_info *info) - } - } - --static struct software_node *software_node_alloc(const struct property_entry *properties) --{ -- struct property_entry *props; -- struct software_node *node; -- -- props = property_entries_dup(properties); -- if (IS_ERR(props)) -- return ERR_CAST(props); -- -- node = kzalloc(sizeof(*node), GFP_KERNEL); -- if (!node) { -- property_entries_free(props); -- return ERR_PTR(-ENOMEM); -- } -- -- node->properties = props; -- -- return node; --} -- - static int mikrobus_device_register(struct mikrobus_port *port, - struct board_device_info *dev, char *board_name) - { -@@ -515,7 +495,7 @@ static int mikrobus_device_register(struct mikrobus_port *port, - if (dev->irq) - i2c->irq = mikrobus_irq_get(port, dev->irq, dev->irq_type); - if (dev->properties) -- i2c->swnode = software_node_alloc(dev->properties); -+ i2c->fwnode = fwnode_create_software_node(dev->properties, NULL); - i2c->addr = dev->reg; - dev->dev_client = (void *) i2c_new_client_device(port->i2c_adap, i2c); - break; -@@ -625,7 +605,6 @@ static int mikrobus_port_id_eeprom_probe(struct mikrobus_port *port) - char devname[MIKROBUS_NAME_SIZE]; - char drvname[MIKROBUS_NAME_SIZE] = "w1-gpio"; - int retval; -- int i; - - mikrobus_id_eeprom_w1_device = kzalloc(sizeof(*mikrobus_id_eeprom_w1_device), GFP_KERNEL); - if (!mikrobus_id_eeprom_w1_device) -@@ -773,7 +752,7 @@ int mikrobus_port_gb_register(struct gbphy_host *host, void *manifest_blob, size - struct gb_connection *spi_connection; - struct gb_gpio_controller *ggc; - struct mikrobus_port *port; -- struct gpio_desc *desc; -+ // struct gpio_desc *desc; - struct gpio_descs *descs; - int retval; - -@@ -827,7 +806,7 @@ int mikrobus_port_gb_register(struct gbphy_host *host, void *manifest_blob, size - INIT_LIST_HEAD(&board->devices); - retval = mikrobus_manifest_parse(board, manifest_blob, manifest_size); - if (!retval) { -- dev_err(&port->dev, "failed to parse manifest, size %lu\n", -+ dev_err(&port->dev, "failed to parse manifest, size %u\n", - manifest_size); - retval = -EINVAL; - goto err_free_board; -diff --git a/drivers/misc/mikrobus/mikrobus_id.c b/drivers/misc/mikrobus/mikrobus_id.c -index 2b97342327d9..d8e9b3660b6b 100644 ---- a/drivers/misc/mikrobus/mikrobus_id.c -+++ b/drivers/misc/mikrobus/mikrobus_id.c -@@ -16,18 +16,19 @@ - - #include <linux/mikrobus.h> - -+#define W1_EEPROM_MIKROBUS_SECONDARY_ID 0x4C - #define W1_EEPROM_MIKROBUS_ID 0x43 -- --#define W1_MIKROBUS_ID_EEPROM_SIZE 0x0A00 -+#define W1_MIKROBUS_ID_EEPROM_SIZE 0x0A00 -+#define W1_MIKROBUS_ID_EEPROM_SECONDARY_SIZE 0x0200 -+#define W1_MIKROBUS_ID_EEPROM_SECONDARY_PAGE_SIZE 32 - #define W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE 32 - #define W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE 35 - #define W1_MIKROBUS_ID_READ_EEPROM 0xF0 -+#define W1_MIKROBUS_ID_READ_SECONDARY_EEPROM 0x69 -+#define W1_MIKROBUS_ID_RELEASE_SECONDARY_EEPROM 0xAA - #define W1_MIKROBUS_ID_EEPROM_READ_RETRIES 10 --#define W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES 5 --#define W1_MIKROBUS_ID_EEPROM_WRITE_SCRATCH 0x0F --#define W1_MIKROBUS_ID_EEPROM_READ_SCRATCH 0xAA --#define W1_MIKROBUS_ID_EEPROM_COPY_SCRATCH 0x55 - #define W1_MIKROBUS_ID_EEPROM_TPROG_MS 20 -+#define MIKROBUS_ID_USER_EEPROM_ADDR 0x0A0A - - static int w1_mikrobus_id_readblock(struct w1_slave *sl, int off, int count, char *buf) - { -@@ -64,90 +65,80 @@ static int w1_mikrobus_id_readblock(struct w1_slave *sl, int off, int count, cha - return -EIO; - } - --static int w1_mikrobus_id_movescratch(struct w1_slave *sl, int addr, char *buf) -+static int w1_mikrobus_id_readpage_secondary(struct w1_slave *sl, int pageaddr, char *buf) - { -- u8 wrbuf[4]; -- u8 scratchpad_verify[W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE]; -- u8 TA1, TA2, ES; -- int verify_status; -- int tries; -- -- wrbuf[0] = W1_MIKROBUS_ID_EEPROM_WRITE_SCRATCH; -- wrbuf[1] = addr & 0xFF; -- wrbuf[2] = addr >> 8; -+ u8 crc_rdbuf[2]; - -- tries = W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES; -- do { -- if (w1_reset_select_slave(sl)) -- return -1; -- w1_write_block(sl->master, wrbuf, 3); -- w1_write_block(sl->master, buf, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -- if (w1_reset_select_slave(sl)) -- return -1; -- w1_write_8(sl->master, W1_MIKROBUS_ID_EEPROM_READ_SCRATCH); -- TA1 = w1_read_8(sl->master); -- TA2 = w1_read_8(sl->master); -- ES = w1_read_8(sl->master); -- w1_read_block(sl->master, scratchpad_verify, W1_MIKROBUS_ID_EEPROM_VERIFY_SCRATCH_SIZE); -- verify_status = memcmp(buf, scratchpad_verify, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -- } while(verify_status && --tries); -- -- if(!tries && verify_status){ -- dev_err(&sl->dev, "verify scratchpad failed %d times\n", -- W1_MIKROBUS_ID_EEPROM_WRITE_RETRIES); -- return -EIO; -- } -- -- wrbuf[0] = W1_MIKROBUS_ID_EEPROM_COPY_SCRATCH; -- wrbuf[1] = addr & 0xFF; -- wrbuf[2] = addr >> 8; -- wrbuf[3] = ES; - if (w1_reset_select_slave(sl)) -- return -1; -- w1_write_block(sl->master, wrbuf, 4); -- msleep(W1_MIKROBUS_ID_EEPROM_TPROG_MS); -+ return -1; -+ w1_write_8(sl->master, W1_MIKROBUS_ID_READ_SECONDARY_EEPROM); -+ w1_write_8(sl->master, pageaddr); -+ w1_read_block(sl->master, crc_rdbuf, 2); -+ w1_write_8(sl->master, W1_MIKROBUS_ID_RELEASE_SECONDARY_EEPROM); -+ msleep(10); -+ w1_read_block(sl->master, crc_rdbuf, 1); -+ w1_read_block(sl->master, buf, W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -+ w1_read_block(sl->master, crc_rdbuf, 2); - return 0; - } - --static int w1_mikrobus_id_writeblock(struct w1_slave *sl, int off, int count, char *buf) -+static int w1_mikrobus_id_readbuf_secondary(struct w1_slave *sl, int count, char *buf) - { -- u16 wraddr = 0; -- u16 len = count - (count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -- u8 scratchpad_write[W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE] = {0}; -- -- while(len > 0) { -- w1_mikrobus_id_movescratch(sl, wraddr + off, buf + wraddr); -- wraddr += W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE; -- len -= W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE; -+ u8 pageaddr = 0; -+ int iter, index, ret; -+ int len = count - (count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -+ u8 temp_rdbuf[W1_MIKROBUS_ID_EEPROM_SECONDARY_PAGE_SIZE]; -+ -+ while(len > 0) { -+ ret = w1_mikrobus_id_readpage_secondary(sl, pageaddr, buf + (W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE*pageaddr)); -+ pageaddr += 1; -+ len -= W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE; - } - - if(count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE){ -- memcpy(scratchpad_write, buf + wraddr, count % W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE); -- w1_mikrobus_id_movescratch(sl, wraddr + off, scratchpad_write); -+ ret = w1_mikrobus_id_readpage_secondary(sl, pageaddr, temp_rdbuf); -+ for(iter = W1_MIKROBUS_ID_EEPROM_SCRATCH_SIZE*pageaddr, index=0; iter < count; iter++, index++) -+ buf[iter] = temp_rdbuf[index]; - } -- -- return 0; -+ return ret; - } - --static int w1_mikrobus_id_nvmem_read(void *priv, unsigned int off, void *buf, size_t count) -+static int w1_mikrobus_id_readblock_secondary(struct w1_slave *sl, int off, int count, char *buf) - { -- struct w1_slave *sl = priv; -- int ret; -+ u8 *cmp; -+ int tries = W1_MIKROBUS_ID_EEPROM_READ_RETRIES; - -- mutex_lock(&sl->master->bus_mutex); -- ret = w1_mikrobus_id_readblock(sl, off, count, buf); -- mutex_unlock(&sl->master->bus_mutex); -- -- return ret; -+ if(off == MIKROBUS_ID_USER_EEPROM_ADDR && count == 1) { -+ buf[0] = 0; -+ return 0; -+ } -+ -+ do { -+ w1_mikrobus_id_readbuf_secondary(sl, count, buf); -+ cmp = kzalloc(count, GFP_KERNEL); -+ if (!cmp) -+ return -ENOMEM; -+ w1_mikrobus_id_readbuf_secondary(sl, count, cmp); -+ if (!memcmp(cmp, buf, count)){ -+ kfree(cmp); -+ return 0; -+ } -+ } while (--tries); -+ -+ kfree(cmp); -+ return -EINVAL; - } - --static int w1_mikrobus_id_nvmem_write(void *priv, unsigned int off, void *buf, size_t count) -+static int w1_mikrobus_id_nvmem_read(void *priv, unsigned int off, void *buf, size_t count) - { - struct w1_slave *sl = priv; - int ret; - - mutex_lock(&sl->master->bus_mutex); -- ret = w1_mikrobus_id_writeblock(sl, off, count, buf); -+ if (sl->family->fid == W1_EEPROM_MIKROBUS_SECONDARY_ID) -+ ret = w1_mikrobus_id_readblock_secondary(sl, off, count, buf); -+ else -+ ret = w1_mikrobus_id_readblock(sl, off, count, buf); - mutex_unlock(&sl->master->bus_mutex); - - return ret; -@@ -160,12 +151,12 @@ static int w1_mikrobus_id_add_slave(struct w1_slave *sl) - struct nvmem_config nvmem_cfg = { - .dev = &sl->dev, - .reg_read = w1_mikrobus_id_nvmem_read, -- .reg_write = w1_mikrobus_id_nvmem_write, - .type = NVMEM_TYPE_EEPROM, -- .read_only = false, -+ .read_only = true, - .word_size = 1, - .stride = 1, -- .size = W1_MIKROBUS_ID_EEPROM_SIZE, -+ .size = (sl->family->fid == W1_EEPROM_MIKROBUS_SECONDARY_ID) ? -+ W1_MIKROBUS_ID_EEPROM_SECONDARY_SIZE: W1_MIKROBUS_ID_EEPROM_SIZE, - .priv = sl, - }; - -@@ -181,7 +172,7 @@ static int w1_mikrobus_id_add_slave(struct w1_slave *sl) - return PTR_ERR_OR_ZERO(nvmem); - } - --static const struct w1_family_ops w1_family_mikrobus_id_fops = { -+static struct w1_family_ops w1_family_mikrobus_id_fops = { - .add_slave = w1_mikrobus_id_add_slave, - }; - -@@ -189,9 +180,43 @@ static struct w1_family w1_family_mikrobus_id = { - .fid = W1_EEPROM_MIKROBUS_ID, - .fops = &w1_family_mikrobus_id_fops, - }; --module_w1_family(w1_family_mikrobus_id); -+ -+static struct w1_family w1_family_mikrobus_id_alternate = { -+ .fid = W1_EEPROM_MIKROBUS_SECONDARY_ID, -+ .fops = &w1_family_mikrobus_id_fops, -+}; -+ -+static int __init w1_mikrobusid_init(void) -+{ -+ int err; -+ -+ err = w1_register_family(&w1_family_mikrobus_id); -+ if (err) -+ return err; -+ -+ err = w1_register_family(&w1_family_mikrobus_id_alternate); -+ if (err) -+ goto err_mikrobusidinit; -+ -+ -+ return 0; -+ -+err_mikrobusidinit: -+ w1_unregister_family(&w1_family_mikrobus_id); -+ return err; -+} -+ -+static void __exit w1_mikrobusid_exit(void) -+{ -+ w1_unregister_family(&w1_family_mikrobus_id); -+ w1_unregister_family(&w1_family_mikrobus_id_alternate); -+} -+ -+module_init(w1_mikrobusid_init); -+module_exit(w1_mikrobusid_exit); - - MODULE_AUTHOR("Vaishnav M A <vaishnav@beagleboard.org>"); - MODULE_DESCRIPTION("w1 family ac driver for mikroBUS ID EEPROM"); - MODULE_LICENSE("GPL"); - MODULE_ALIAS("w1-family-" __stringify(W1_EEPROM_MIKROBUS_ID)); -+MODULE_ALIAS("w1-family-" __stringify(W1_EEPROM_MIKROBUS_SECONDARY_ID)); --- -2.25.1 - diff --git a/patches/drivers/powervr/0001-sizes.h-Add-entries-between-32G-and-64T.patch b/patches/drivers/powervr/0001-sizes.h-Add-entries-between-32G-and-64T.patch deleted file mode 100644 index a8d80388b4e521a3a63e155465b99d49ef4890fb..0000000000000000000000000000000000000000 --- a/patches/drivers/powervr/0001-sizes.h-Add-entries-between-32G-and-64T.patch +++ /dev/null @@ -1,43 +0,0 @@ -From b0719e1872b919c3ef1f99972406c20e4d588f00 Mon Sep 17 00:00:00 2001 -From: Matt Coster <matt.coster@imgtec.com> -Date: Wed, 1 Sep 2021 15:36:33 +0100 -Subject: [PATCH 1/3] sizes.h: Add entries between 32G and 64T - -Signed-off-by: Matt Coster <matt.coster@imgtec.com> ---- - include/linux/sizes.h | 19 +++++++++++++++---- - 1 file changed, 15 insertions(+), 4 deletions(-) - -diff --git a/include/linux/sizes.h b/include/linux/sizes.h -index 1ac79bcee2bb..e19e41ac45e0 100644 ---- a/include/linux/sizes.h -+++ b/include/linux/sizes.h -@@ -43,10 +43,21 @@ - #define SZ_1G 0x40000000 - #define SZ_2G 0x80000000 - --#define SZ_4G _AC(0x100000000, ULL) --#define SZ_8G _AC(0x200000000, ULL) --#define SZ_16G _AC(0x400000000, ULL) --#define SZ_32G _AC(0x800000000, ULL) -+#define SZ_4G _AC(0x000100000000, ULL) -+#define SZ_8G _AC(0x000200000000, ULL) -+#define SZ_16G _AC(0x000400000000, ULL) -+#define SZ_32G _AC(0x000800000000, ULL) -+#define SZ_64G _AC(0x001000000000, ULL) -+#define SZ_128G _AC(0x002000000000, ULL) -+#define SZ_256G _AC(0x004000000000, ULL) -+#define SZ_512G _AC(0x008000000000, ULL) -+ -+#define SZ_1T _AC(0x010000000000, ULL) -+#define SZ_2T _AC(0x020000000000, ULL) -+#define SZ_4T _AC(0x040000000000, ULL) -+#define SZ_8T _AC(0x080000000000, ULL) -+#define SZ_16T _AC(0x100000000000, ULL) -+#define SZ_32T _AC(0x200000000000, ULL) - #define SZ_64T _AC(0x400000000000, ULL) - - #endif /* __LINUX_SIZES_H__ */ --- -2.30.2 - diff --git a/patches/drivers/powervr/0002-dt-bindings-gpu-add-bindings-for-Imagination-Technol.patch b/patches/drivers/powervr/0002-dt-bindings-gpu-add-bindings-for-Imagination-Technol.patch deleted file mode 100644 index bd2ddf7b97053a6e1d55126d544a7167006bb2b0..0000000000000000000000000000000000000000 --- a/patches/drivers/powervr/0002-dt-bindings-gpu-add-bindings-for-Imagination-Technol.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 1de9dfaf563c1fb86268358d188c189afe4a10e0 Mon Sep 17 00:00:00 2001 -From: Sarah Walker <sarah.walker@imgtec.com> -Date: Thu, 12 Aug 2021 08:50:45 +0100 -Subject: [PATCH 2/3] dt-bindings: gpu: add bindings for Imagination - Technologies PowerVR Rogue GPUs - -Co-authored-by: Luigi Santivetti <luigi.santivetti@imgtec.com> -Signed-off-by: Sarah Walker <sarah.walker@imgtec.com> -Signed-off-by: Luigi Santivetti <luigi.santivetti@imgtec.com> ---- - .../devicetree/bindings/gpu/img,powervr.yaml | 101 ++++++++++++++++++ - 1 file changed, 101 insertions(+) - create mode 100644 Documentation/devicetree/bindings/gpu/img,powervr.yaml - -diff --git a/Documentation/devicetree/bindings/gpu/img,powervr.yaml b/Documentation/devicetree/bindings/gpu/img,powervr.yaml -new file mode 100644 -index 000000000000..9440a01434e5 ---- /dev/null -+++ b/Documentation/devicetree/bindings/gpu/img,powervr.yaml -@@ -0,0 +1,101 @@ -+# SPDX-License-Identifier: (GPL-2.0-only OR MIT) -+# Copyright (c) 2022 Imagination Technologies Ltd. -+%YAML 1.2 -+--- -+$id: "http://devicetree.org/schemas/gpu/img-powervr.yaml#" -+$schema: "http://devicetree.org/meta-schemas/core.yaml#" -+ -+title: Imagination Technologies PowerVR GPU -+ -+maintainers: -+ - Sarah Walker <sarah.walker@imgtec.com> -+ -+properties: -+ compatible: -+ oneOf: -+ - items: -+ - enum: -+ - mediatek,mt8173-gpu -+ - const: img,powervr-series6xt -+ -+ reg: -+ minItems: 1 -+ maxItems: 1 -+ -+ clocks: -+ minItems: 1 -+ maxItems: 3 -+ -+ clock-names: -+ items: -+ - const: core_clk -+ - const: mem_clk -+ - const: sys_clk -+ -+ interrupts: -+ items: -+ - description: GPU interrupt -+ -+ interrupt-names: -+ items: -+ - const: gpu -+ -+ power-domains: -+ maxItems: 1 -+ -+ operating-points-v2: true -+ power-supply: true -+ -+ "#cooling-cells": -+ const: 2 -+ -+required: -+ - compatible -+ - reg -+ - clocks -+ - clock-names -+ - interrupts -+ - interrupt-names -+ -+allOf: -+ - if: -+ properties: -+ compatible: -+ contains: -+ const: mediatek,mt8173-gpu -+ then: -+ properties: -+ reg: -+ minItems: 2 -+ maxItems: 2 -+ - if: -+ properties: -+ compatible: -+ contains: -+ const: img,powervr-series6xt -+ then: -+ properties: -+ clocks: -+ minItems: 3 -+ -+examples: -+ - | -+ #include <dt-bindings/interrupt-controller/irq.h> -+ #include <dt-bindings/interrupt-controller/arm-gic.h> -+ -+ gpu@13000000 { -+ compatible = "mediatek,mt8173-gpu", "img,powervr-series6xt"; -+ reg = <0 0x13000000 0 0xffff>, <0 0x13fff000 0 0x1000>; -+ power-domains = <&scpsys MT8173_POWER_DOMAIN_MFG>; -+ power-supply = <&da9211_vgpu_reg>; -+ operating-points-v2 = <&gpu_opp_table>; -+ clocks = <&gpu_ckgen 0>, -+ <&gpu_ckgen 1>, -+ <&gpu_ckgen 2>; -+ clock-names = "core_clk", -+ "mem_clk", -+ "sys_clk"; -+ interrupts = <GIC_SPI 217 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "gpu"; -+ }; -+ --- -2.30.2 - diff --git a/patches/drivers/powervr/0003-drm-imagination-Add-initial-Imagination-Technologies.patch b/patches/drivers/powervr/0003-drm-imagination-Add-initial-Imagination-Technologies.patch deleted file mode 100644 index 315035496bc1dadf693c125e712e7d20c60741d4..0000000000000000000000000000000000000000 --- a/patches/drivers/powervr/0003-drm-imagination-Add-initial-Imagination-Technologies.patch +++ /dev/null @@ -1,28872 +0,0 @@ -From 03d958cbedb0fedd7e5c4aaa77e9dd41990dc3f9 Mon Sep 17 00:00:00 2001 -From: Frank Binns <frank.binns@imgtec.com> -Date: Fri, 23 Apr 2021 16:41:22 +0100 -Subject: [PATCH 3/3] drm/imagination: Add initial Imagination Technologies - PowerVR driver - -Co-authored-by: Sarah Walker <sarah.walker@imgtec.com> -Co-authored-by: Matt Coster <matt.coster@imgtec.com> -Co-authored-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com> -Signed-off-by: Frank Binns <frank.binns@imgtec.com> -Signed-off-by: Sarah Walker <sarah.walker@imgtec.com> -Signed-off-by: Matt Coster <matt.coster@imgtec.com> -Signed-off-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com> ---- - drivers/gpu/drm/Kconfig | 2 + - drivers/gpu/drm/Makefile | 1 + - drivers/gpu/drm/imagination/Kconfig | 11 + - drivers/gpu/drm/imagination/Makefile | 29 + - drivers/gpu/drm/imagination/pvr_ccb.c | 282 + - drivers/gpu/drm/imagination/pvr_ccb.h | 48 + - drivers/gpu/drm/imagination/pvr_cccb.c | 328 + - drivers/gpu/drm/imagination/pvr_cccb.h | 103 + - drivers/gpu/drm/imagination/pvr_context.c | 727 ++ - drivers/gpu/drm/imagination/pvr_context.h | 181 + - drivers/gpu/drm/imagination/pvr_device.c | 613 ++ - drivers/gpu/drm/imagination/pvr_device.h | 776 +++ - drivers/gpu/drm/imagination/pvr_device_info.c | 108 + - drivers/gpu/drm/imagination/pvr_device_info.h | 54 + - drivers/gpu/drm/imagination/pvr_drv.c | 885 +++ - drivers/gpu/drm/imagination/pvr_drv.h | 19 + - drivers/gpu/drm/imagination/pvr_fence.c | 250 + - drivers/gpu/drm/imagination/pvr_fence.h | 148 + - drivers/gpu/drm/imagination/pvr_free_list.c | 377 + - drivers/gpu/drm/imagination/pvr_free_list.h | 139 + - drivers/gpu/drm/imagination/pvr_fw.c | 900 +++ - drivers/gpu/drm/imagination/pvr_fw.h | 163 + - drivers/gpu/drm/imagination/pvr_fw_info.h | 106 + - drivers/gpu/drm/imagination/pvr_fw_meta.c | 834 +++ - drivers/gpu/drm/imagination/pvr_fw_mips.c | 185 + - drivers/gpu/drm/imagination/pvr_fw_mips.h | 29 + - drivers/gpu/drm/imagination/pvr_fw_trace.c | 487 ++ - drivers/gpu/drm/imagination/pvr_fw_trace.h | 70 + - drivers/gpu/drm/imagination/pvr_gem.c | 1082 +++ - drivers/gpu/drm/imagination/pvr_gem.h | 383 + - drivers/gpu/drm/imagination/pvr_hwrt.c | 379 + - drivers/gpu/drm/imagination/pvr_hwrt.h | 171 + - drivers/gpu/drm/imagination/pvr_job.c | 969 +++ - drivers/gpu/drm/imagination/pvr_job.h | 32 + - drivers/gpu/drm/imagination/pvr_object.c | 223 + - drivers/gpu/drm/imagination/pvr_object.h | 60 + - .../gpu/drm/imagination/pvr_rogue_cr_defs.h | 6191 +++++++++++++++++ - drivers/gpu/drm/imagination/pvr_rogue_defs.h | 162 + - drivers/gpu/drm/imagination/pvr_rogue_fwif.h | 2314 ++++++ - .../drm/imagination/pvr_rogue_fwif_client.h | 158 + - .../drm/imagination/pvr_rogue_fwif_common.h | 55 + - .../pvr_rogue_fwif_resetframework.h | 28 + - .../gpu/drm/imagination/pvr_rogue_fwif_sf.h | 846 +++ - .../drm/imagination/pvr_rogue_fwif_shared.h | 235 + - .../drm/imagination/pvr_rogue_heap_config.h | 103 + - drivers/gpu/drm/imagination/pvr_rogue_meta.h | 357 + - drivers/gpu/drm/imagination/pvr_rogue_mips.h | 336 + - .../gpu/drm/imagination/pvr_rogue_mmu_defs.h | 136 + - drivers/gpu/drm/imagination/pvr_vendor.h | 77 + - drivers/gpu/drm/imagination/pvr_vm.c | 4177 +++++++++++ - drivers/gpu/drm/imagination/pvr_vm.h | 192 + - drivers/gpu/drm/imagination/pvr_vm_mips.c | 220 + - drivers/gpu/drm/imagination/pvr_vm_mips.h | 22 + - .../gpu/drm/imagination/vendor/pvr_mt8173.c | 121 + - include/uapi/drm/pvr_drm.h | 1524 ++++ - 55 files changed, 28408 insertions(+) - create mode 100644 drivers/gpu/drm/imagination/Kconfig - create mode 100644 drivers/gpu/drm/imagination/Makefile - create mode 100644 drivers/gpu/drm/imagination/pvr_ccb.c - create mode 100644 drivers/gpu/drm/imagination/pvr_ccb.h - create mode 100644 drivers/gpu/drm/imagination/pvr_cccb.c - create mode 100644 drivers/gpu/drm/imagination/pvr_cccb.h - create mode 100644 drivers/gpu/drm/imagination/pvr_context.c - create mode 100644 drivers/gpu/drm/imagination/pvr_context.h - create mode 100644 drivers/gpu/drm/imagination/pvr_device.c - create mode 100644 drivers/gpu/drm/imagination/pvr_device.h - create mode 100644 drivers/gpu/drm/imagination/pvr_device_info.c - create mode 100644 drivers/gpu/drm/imagination/pvr_device_info.h - create mode 100644 drivers/gpu/drm/imagination/pvr_drv.c - create mode 100644 drivers/gpu/drm/imagination/pvr_drv.h - create mode 100644 drivers/gpu/drm/imagination/pvr_fence.c - create mode 100644 drivers/gpu/drm/imagination/pvr_fence.h - create mode 100644 drivers/gpu/drm/imagination/pvr_free_list.c - create mode 100644 drivers/gpu/drm/imagination/pvr_free_list.h - create mode 100644 drivers/gpu/drm/imagination/pvr_fw.c - create mode 100644 drivers/gpu/drm/imagination/pvr_fw.h - create mode 100644 drivers/gpu/drm/imagination/pvr_fw_info.h - create mode 100644 drivers/gpu/drm/imagination/pvr_fw_meta.c - create mode 100644 drivers/gpu/drm/imagination/pvr_fw_mips.c - create mode 100644 drivers/gpu/drm/imagination/pvr_fw_mips.h - create mode 100644 drivers/gpu/drm/imagination/pvr_fw_trace.c - create mode 100644 drivers/gpu/drm/imagination/pvr_fw_trace.h - create mode 100644 drivers/gpu/drm/imagination/pvr_gem.c - create mode 100644 drivers/gpu/drm/imagination/pvr_gem.h - create mode 100644 drivers/gpu/drm/imagination/pvr_hwrt.c - create mode 100644 drivers/gpu/drm/imagination/pvr_hwrt.h - create mode 100644 drivers/gpu/drm/imagination/pvr_job.c - create mode 100644 drivers/gpu/drm/imagination/pvr_job.h - create mode 100644 drivers/gpu/drm/imagination/pvr_object.c - create mode 100644 drivers/gpu/drm/imagination/pvr_object.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_cr_defs.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_defs.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_client.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_common.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_resetframework.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_sf.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_heap_config.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_meta.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_mips.h - create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_mmu_defs.h - create mode 100644 drivers/gpu/drm/imagination/pvr_vendor.h - create mode 100644 drivers/gpu/drm/imagination/pvr_vm.c - create mode 100644 drivers/gpu/drm/imagination/pvr_vm.h - create mode 100644 drivers/gpu/drm/imagination/pvr_vm_mips.c - create mode 100644 drivers/gpu/drm/imagination/pvr_vm_mips.h - create mode 100644 drivers/gpu/drm/imagination/vendor/pvr_mt8173.c - create mode 100644 include/uapi/drm/pvr_drm.h - -diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig -index b1f22e457fd0..ff6c83027177 100644 ---- a/drivers/gpu/drm/Kconfig -+++ b/drivers/gpu/drm/Kconfig -@@ -390,6 +390,8 @@ source "drivers/gpu/drm/gud/Kconfig" - - source "drivers/gpu/drm/sprd/Kconfig" - -+source "drivers/gpu/drm/imagination/Kconfig" -+ - config DRM_HYPERV - tristate "DRM Support for Hyper-V synthetic video device" - depends on DRM && PCI && MMU && HYPERV -diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile -index 301a44dc18e3..6e063a24c1c5 100644 ---- a/drivers/gpu/drm/Makefile -+++ b/drivers/gpu/drm/Makefile -@@ -135,3 +135,4 @@ obj-y += xlnx/ - obj-y += gud/ - obj-$(CONFIG_DRM_HYPERV) += hyperv/ - obj-$(CONFIG_DRM_SPRD) += sprd/ -+obj-$(CONFIG_DRM_POWERVR) += imagination/ -diff --git a/drivers/gpu/drm/imagination/Kconfig b/drivers/gpu/drm/imagination/Kconfig -new file mode 100644 -index 000000000000..83248822d0ed ---- /dev/null -+++ b/drivers/gpu/drm/imagination/Kconfig -@@ -0,0 +1,11 @@ -+# SPDX-License-Identifier: GPL-2.0 OR MIT -+# Copyright (c) 2022 Imagination Technologies Ltd. -+ -+config DRM_POWERVR -+ tristate "Imagination Technologies PowerVR Graphics" -+ depends on ARM64 -+ depends on DRM -+ select FW_LOADER -+ help -+ Choose this option if you have a system that has an Imagination -+ Technologies PowerVR Rogue GPU. -diff --git a/drivers/gpu/drm/imagination/Makefile b/drivers/gpu/drm/imagination/Makefile -new file mode 100644 -index 000000000000..74725a03e5a0 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/Makefile -@@ -0,0 +1,29 @@ -+# SPDX-License-Identifier: GPL-2.0 OR MIT -+# Copyright (c) 2022 Imagination Technologies Ltd. -+ -+subdir-cc-flags-y := -I$(srctree)/$(src) -+ -+powervr-y := \ -+ pvr_ccb.o \ -+ pvr_cccb.o \ -+ pvr_context.o \ -+ pvr_device.o \ -+ pvr_device_info.o \ -+ pvr_drv.o \ -+ pvr_fence.o \ -+ pvr_free_list.o \ -+ pvr_fw.o \ -+ pvr_fw_meta.o \ -+ pvr_fw_mips.o \ -+ pvr_fw_trace.o \ -+ pvr_gem.o \ -+ pvr_hwrt.o \ -+ pvr_job.o \ -+ pvr_object.o \ -+ pvr_vm.o \ -+ pvr_vm_mips.o -+ -+powervr-y += \ -+ vendor/pvr_mt8173.o -+ -+obj-$(CONFIG_DRM_POWERVR) += powervr.o -diff --git a/drivers/gpu/drm/imagination/pvr_ccb.c b/drivers/gpu/drm/imagination/pvr_ccb.c -new file mode 100644 -index 000000000000..41d65061f4b2 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_ccb.c -@@ -0,0 +1,282 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_ccb.h" -+#include "pvr_device.h" -+#include "pvr_fw.h" -+#include "pvr_gem.h" -+ -+#include <linux/compiler.h> -+#include <linux/delay.h> -+#include <linux/jiffies.h> -+#include <linux/kernel.h> -+#include <linux/mutex.h> -+#include <linux/types.h> -+#include <linux/workqueue.h> -+ -+#define ACQUIRE_SLOT_TIMEOUT (1 * HZ) /* 1s */ -+ -+/** -+ * pvr_ccb_init() - Initialise a CCB -+ * @pvr_dev: Device pointer. -+ * @pvr_ccb: Pointer to CCB structure to initialise. -+ * @num_cmds_log2: Log2 of number of commands in this CCB. -+ * @cmd_size: Command size for this CCB. -+ * -+ * Return: -+ * * Zero on success, or -+ * * Any error code returned by pvr_gem_create_and_map_fw_object(). -+ */ -+static int -+pvr_ccb_init(struct pvr_device *pvr_dev, struct pvr_ccb *pvr_ccb, -+ u32 num_cmds_log2, size_t cmd_size) -+{ -+ u32 num_cmds = 1 << num_cmds_log2; -+ u32 ccb_size = num_cmds * cmd_size; -+ int err; -+ -+ mutex_init(&pvr_ccb->lock); -+ -+ /* -+ * Map CCB and control structure as uncached, so we don't have to flush -+ * CPU cache repeatedly when polling for space. -+ */ -+ pvr_ccb->ctrl = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*pvr_ccb->ctrl), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED, -+ &pvr_ccb->ctrl_obj); -+ if (IS_ERR(pvr_ccb->ctrl)) { -+ err = PTR_ERR(pvr_ccb->ctrl); -+ goto err_out; -+ } -+ -+ pvr_ccb->ccb = pvr_gem_create_and_map_fw_object(pvr_dev, ccb_size, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_ccb->ccb_obj); -+ if (IS_ERR(pvr_ccb->ccb)) { -+ err = PTR_ERR(pvr_ccb->ccb); -+ goto err_free_ctrl; -+ } -+ -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_ccb->ctrl_obj, -+ &pvr_ccb->ctrl_fw_addr)); -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_ccb->ccb_obj, -+ &pvr_ccb->ccb_fw_addr)); -+ -+ pvr_ccb->ctrl->write_offset = 0; -+ pvr_ccb->ctrl->read_offset = 0; -+ pvr_ccb->ctrl->wrap_mask = num_cmds - 1; -+ pvr_ccb->ctrl->cmd_size = cmd_size; -+ -+ return 0; -+ -+err_free_ctrl: -+ pvr_fw_object_vunmap(pvr_ccb->ctrl_obj, pvr_ccb->ctrl, false); -+ pvr_fw_object_release(pvr_ccb->ctrl_obj); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_ccb_fini() - Release CCB structure -+ * @pvr_ccb: CCB to release. -+ */ -+void -+pvr_ccb_fini(struct pvr_ccb *pvr_ccb) -+{ -+ pvr_fw_object_vunmap(pvr_ccb->ccb_obj, pvr_ccb->ccb, false); -+ pvr_fw_object_release(pvr_ccb->ccb_obj); -+ -+ pvr_fw_object_vunmap(pvr_ccb->ctrl_obj, pvr_ccb->ctrl, false); -+ pvr_fw_object_release(pvr_ccb->ctrl_obj); -+} -+ -+/** -+ * pvr_ccb_slot_available_locked() - Test whether any slots are available in CCB -+ * @pvr_ccb: CCB to test. -+ * @write_offset: Address to store number of next available slot. May be %NULL. -+ * -+ * Caller must hold @pvr_ccb->lock. -+ * -+ * Return: -+ * * %true if a slot is available, or -+ * * %false if no slot is available. -+ */ -+static __always_inline bool -+pvr_ccb_slot_available_locked(struct pvr_ccb *pvr_ccb, u32 *write_offset) -+{ -+ struct rogue_fwif_ccb_ctl *ctrl = pvr_ccb->ctrl; -+ u32 next_write_offset = (ctrl->write_offset + 1) & ctrl->wrap_mask; -+ -+ lockdep_assert_held(&pvr_ccb->lock); -+ -+ if (ctrl->read_offset != next_write_offset) { -+ if (write_offset) -+ *write_offset = next_write_offset; -+ return true; -+ } -+ -+ return false; -+} -+ -+/** -+ * pvr_ccb_acquire_slot_locked() - Acquire slot in CCB -+ * @pvr_ccb: CCB to acquire slot in. -+ * @write_offset: Address to store acquired slot number. -+ * -+ * Caller must hold @pvr_ccb->lock. -+ * -+ * Return: -+ * * Zero on success, or -+ * * -EBUSY if function times out waiting for a slot. -+ */ -+static int -+pvr_ccb_acquire_slot_locked(struct pvr_ccb *pvr_ccb, u32 *write_offset) -+{ -+ unsigned long start_timestamp = jiffies; -+ -+ lockdep_assert_held(&pvr_ccb->lock); -+ -+ while ((jiffies - start_timestamp) < ACQUIRE_SLOT_TIMEOUT) { -+ if (pvr_ccb_slot_available_locked(pvr_ccb, write_offset)) -+ return 0; -+ usleep_range(1, 50); -+ } -+ -+ return -EBUSY; -+} -+ -+/** -+ * pvr_fwccb_process_worker() - Process any pending FWCCB commands -+ * @pvr_dev: Target PowerVR device. -+ * -+ * For this initial implementation, FWCCB commands will be printed to the console but otherwise not -+ * processed. -+ */ -+static void -+pvr_fwccb_process_worker(struct work_struct *work) -+{ -+ struct pvr_device *pvr_dev = container_of(work, struct pvr_device, fwccb_work); -+ volatile struct rogue_fwif_fwccb_cmd *fwccb = pvr_dev->fwccb.ccb; -+ struct rogue_fwif_ccb_ctl *ctrl = pvr_dev->fwccb.ctrl; -+ -+ mutex_lock(&pvr_dev->fwccb.lock); -+ -+ while (ctrl->read_offset != ctrl->write_offset) { -+ drm_info(from_pvr_device(pvr_dev), "Received FWCCB command %x\n", -+ fwccb[ctrl->read_offset].cmd_type); -+ -+ ctrl->read_offset = (ctrl->read_offset + 1) & ctrl->wrap_mask; -+ } -+ -+ mutex_unlock(&pvr_dev->fwccb.lock); -+} -+ -+/** -+ * pvr_kccb_send_cmd() - Send command to the KCCB -+ * @pvr_dev: Device pointer. -+ * @cmd: Command to sent. -+ * @kccb_slot: Address to store the KCCB slot for this command. May be %NULL. -+ * -+ * Returns: -+ * * Zero on success, or -+ * * -EBUSY if timeout while waiting for a free KCCB slot. -+ */ -+int -+pvr_kccb_send_cmd(struct pvr_device *pvr_dev, struct rogue_fwif_kccb_cmd *cmd, -+ u32 *kccb_slot) -+{ -+ struct pvr_ccb *pvr_ccb = &pvr_dev->kccb; -+ struct rogue_fwif_kccb_cmd *kccb = pvr_ccb->ccb; -+ struct rogue_fwif_ccb_ctl *ctrl = pvr_ccb->ctrl; -+ u32 old_write_offset; -+ u32 new_write_offset; -+ int err; -+ -+ mutex_lock(&pvr_ccb->lock); -+ -+ old_write_offset = ctrl->write_offset; -+ -+ err = pvr_ccb_acquire_slot_locked(pvr_ccb, &new_write_offset); -+ if (err) -+ goto err_unlock; -+ -+ memcpy(&kccb[old_write_offset], cmd, -+ sizeof(struct rogue_fwif_kccb_cmd)); -+ if (kccb_slot) { -+ *kccb_slot = old_write_offset; -+ /* Clear return status for this slot. */ -+ WRITE_ONCE(pvr_dev->kccb_rtn[old_write_offset], -+ ROGUE_FWIF_KCCB_RTN_SLOT_NO_RESPONSE); -+ } -+ mb(); /* memory barrier */ -+ ctrl->write_offset = new_write_offset; -+ -+ mutex_unlock(&pvr_ccb->lock); -+ -+ /* Kick MTS */ -+ pvr_fw_mts_schedule(pvr_dev, -+ PVR_FWIF_DM_GP & ~ROGUE_CR_MTS_SCHEDULE_DM_CLRMSK); -+ -+ return 0; -+ -+err_unlock: -+ mutex_unlock(&pvr_ccb->lock); -+ -+ return err; -+} -+ -+/** -+ * pvr_kccb_wait_for_completion() - Wait for a KCCB command to complete -+ * @pvr_dev: Device pointer. -+ * @slot_nr: KCCB slot to wait on. -+ * @timeout: Timeout length (in jiffies). -+ * -+ * Returns: -+ * * Zero on success, or -+ * * -EBUSY on timeout. -+ */ -+int -+pvr_kccb_wait_for_completion(struct pvr_device *pvr_dev, u32 slot_nr, -+ u32 timeout) -+{ -+ int ret = wait_event_timeout(pvr_dev->kccb_rtn_q, READ_ONCE(pvr_dev->kccb_rtn[slot_nr]) & -+ ROGUE_FWIF_KCCB_RTN_SLOT_CMD_EXECUTED, timeout); -+ -+ return ret ? 0 : -EBUSY; -+} -+ -+/** -+ * pvr_kccb_init() - Initialise device KCCB -+ * @pvr_dev: Target PowerVR device -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_ccb_init(). -+ */ -+int -+pvr_kccb_init(struct pvr_device *pvr_dev) -+{ -+ return pvr_ccb_init(pvr_dev, &pvr_dev->kccb, -+ ROGUE_FWIF_KCCB_NUMCMDS_LOG2_DEFAULT, -+ sizeof(struct rogue_fwif_kccb_cmd)); -+} -+ -+/** -+ * pvr_fwccb_init() - Initialise device FWCCB -+ * @pvr_dev: Target PowerVR device -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_ccb_init(). -+ */ -+int -+pvr_fwccb_init(struct pvr_device *pvr_dev) -+{ -+ INIT_WORK(&pvr_dev->fwccb_work, pvr_fwccb_process_worker); -+ -+ return pvr_ccb_init(pvr_dev, &pvr_dev->fwccb, -+ ROGUE_FWIF_FWCCB_NUMCMDS_LOG2, -+ sizeof(struct rogue_fwif_fwccb_cmd)); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_ccb.h b/drivers/gpu/drm/imagination/pvr_ccb.h -new file mode 100644 -index 000000000000..cae5f61d74fc ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_ccb.h -@@ -0,0 +1,48 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_CCB_H__ -+#define __PVR_CCB_H__ -+ -+#include "pvr_rogue_fwif.h" -+ -+#include <linux/mutex.h> -+#include <linux/types.h> -+ -+/* Forward declaration from pvr_device.h. */ -+struct pvr_device; -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+struct pvr_ccb { -+ /** @ctrl_obj: FW object representing CCB control structure. */ -+ struct pvr_fw_object *ctrl_obj; -+ /** @ccb_obj: FW object representing CCB. */ -+ struct pvr_fw_object *ccb_obj; -+ -+ /** @ctrl_fw_addr: FW virtual address of CCB control structure. */ -+ u32 ctrl_fw_addr; -+ /** @ccb_fw_addr: FW virtual address of CCB. */ -+ u32 ccb_fw_addr; -+ -+ /** @lock: Mutex protecting @ctrl and @ccb. */ -+ struct mutex lock; -+ /** -+ * @ctrl: Kernel mapping of CCB control structure. @lock must be held -+ * when accessing. -+ */ -+ struct rogue_fwif_ccb_ctl *ctrl; -+ /** @ccb: Kernel mapping of CCB. @lock must be held when accessing. */ -+ void *ccb; -+}; -+ -+int pvr_kccb_init(struct pvr_device *pvr_dev); -+int pvr_fwccb_init(struct pvr_device *pvr_dev); -+void pvr_ccb_fini(struct pvr_ccb *ccb); -+ -+int pvr_kccb_send_cmd(struct pvr_device *pvr_dev, -+ struct rogue_fwif_kccb_cmd *cmd, u32 *kccb_slot); -+int pvr_kccb_wait_for_completion(struct pvr_device *pvr_dev, u32 slot_nr, u32 timeout); -+ -+#endif /* __PVR_CCB_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_cccb.c b/drivers/gpu/drm/imagination/pvr_cccb.c -new file mode 100644 -index 000000000000..451cea704c23 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_cccb.c -@@ -0,0 +1,328 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_ccb.h" -+#include "pvr_cccb.h" -+#include "pvr_device.h" -+#include "pvr_gem.h" -+#include "pvr_hwrt.h" -+ -+#include <linux/compiler.h> -+#include <linux/delay.h> -+#include <linux/jiffies.h> -+#include <linux/mutex.h> -+#include <linux/types.h> -+ -+#define PADDING_COMMAND_SIZE sizeof(struct rogue_fwif_ccb_cmd_header) -+ -+static __always_inline u32 -+get_ccb_space(u32 w_off, u32 r_off, u32 ccb_size) -+{ -+ return (((r_off) - (w_off)) + ((ccb_size)-1)) & ((ccb_size)-1); -+} -+ -+/** -+ * pvr_cccb_init() - Initialise a Client CCB -+ * @pvr_dev: Device pointer. -+ * @pvr_cccb: Pointer to Client CCB structure to initialise. -+ * @size_log2: Log2 size of Client CCB in bytes. -+ * @name: Name of owner of Client CCB. Used for fence context. -+ * -+ * Return: -+ * * Zero on success, or -+ * * Any error code returned by pvr_gem_create_and_map_fw_object(). -+ */ -+int -+pvr_cccb_init(struct pvr_device *pvr_dev, struct pvr_cccb *pvr_cccb, -+ u32 size_log2, const char *name) -+{ -+ size_t size = 1 << size_log2; -+ int err; -+ -+ mutex_init(&pvr_cccb->lock); -+ -+ /* -+ * Map CCCB and control structure as uncached, so we don't have to flush -+ * CPU cache repeatedly when polling for space. -+ */ -+ pvr_cccb->ctrl = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*pvr_cccb->ctrl), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED, -+ &pvr_cccb->ctrl_obj); -+ if (IS_ERR(pvr_cccb->ctrl)) { -+ err = PTR_ERR(pvr_cccb->ctrl); -+ goto err_out; -+ } -+ -+ pvr_cccb->cccb = pvr_gem_create_and_map_fw_object(pvr_dev, size, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_cccb->cccb_obj); -+ if (IS_ERR(pvr_cccb->cccb)) { -+ err = PTR_ERR(pvr_cccb->cccb); -+ goto err_free_ctrl; -+ } -+ -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_cccb->ctrl_obj, -+ &pvr_cccb->ctrl_fw_addr)); -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_cccb->cccb_obj, -+ &pvr_cccb->cccb_fw_addr)); -+ -+ WRITE_ONCE(pvr_cccb->ctrl->write_offset, 0); -+ WRITE_ONCE(pvr_cccb->ctrl->read_offset, 0); -+ WRITE_ONCE(pvr_cccb->ctrl->dep_offset, 0); -+ WRITE_ONCE(pvr_cccb->ctrl->wrap_mask, size - 1); -+ pvr_cccb->size = size; -+ pvr_cccb->write_offset = 0; -+ pvr_cccb->wrap_mask = size - 1; -+ -+ pvr_fence_context_init(pvr_dev, &pvr_cccb->pvr_fence_context, name); -+ -+ return 0; -+ -+err_free_ctrl: -+ pvr_fw_object_vunmap(pvr_cccb->ctrl_obj, pvr_cccb->ctrl, false); -+ pvr_fw_object_release(pvr_cccb->ctrl_obj); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_cccb_fini() - Release Client CCB structure -+ * @pvr_cccb: Client CCB to release. -+ */ -+void -+pvr_cccb_fini(struct pvr_cccb *pvr_cccb) -+{ -+ pvr_fw_object_vunmap(pvr_cccb->cccb_obj, pvr_cccb->cccb, false); -+ pvr_fw_object_release(pvr_cccb->cccb_obj); -+ -+ pvr_fw_object_vunmap(pvr_cccb->ctrl_obj, pvr_cccb->ctrl, false); -+ pvr_fw_object_release(pvr_cccb->ctrl_obj); -+} -+ -+static void -+build_padding_command(void *cmd_ptr, u32 remaining) -+{ -+ struct rogue_fwif_ccb_cmd_header *cmd = cmd_ptr; -+ -+ WRITE_ONCE(cmd->cmd_type, ROGUE_FWIF_CCB_CMD_TYPE_PADDING); -+ WRITE_ONCE(cmd->cmd_size, remaining - sizeof(*cmd)); -+} -+ -+/** -+ * pvr_cccb_acquire_command_space_locked() - Acquire space in a Client CCB -+ * @pvr_cccb: Target Client CCB. -+ * @size: Size of allocation, in bytes. -+ * @out_ptr: Pointer to location to store CPU pointer to acquired space. -+ * @new_write_offset: Pointer to location to store new CCB write offset. -+ * -+ * Caller must hold @pvr_cccb->lock, and if this function succeeds then it must -+ * be held until after pvr_release_cccb_space() is called. -+ * -+ * Returns: -+ * * Zero on success, or -+ * * -EAGAIN if insufficient space is currently available in the CCCB. -+ */ -+static int -+pvr_cccb_acquire_command_space_locked(struct pvr_cccb *pvr_cccb, size_t size, -+ void **out_ptr, u32 *new_write_offset) -+{ -+ struct rogue_fwif_cccb_ctl *ctrl = pvr_cccb->ctrl; -+ u32 read_offset = READ_ONCE(ctrl->read_offset); -+ u32 remaining = pvr_cccb->size - pvr_cccb->write_offset; -+ u32 required_size = size; -+ bool padding_required = false; -+ -+ lockdep_assert_held(&pvr_cccb->lock); -+ -+ /* -+ * Always ensure we have enough room for a padding command at the end of -+ * the CCCB. -+ */ -+ required_size += PADDING_COMMAND_SIZE; -+ -+ if (remaining < required_size) { -+ /* -+ * Command would need to wrap, so we need to pad the remainder -+ * of the CCCB. -+ */ -+ required_size += remaining; -+ padding_required = true; -+ } -+ -+ if (get_ccb_space(pvr_cccb->write_offset, read_offset, pvr_cccb->size) < -+ required_size) -+ return -EAGAIN; -+ -+ if (padding_required) { -+ /* Add padding command */ -+ build_padding_command(&pvr_cccb->cccb[pvr_cccb->write_offset], remaining); -+ pvr_cccb->write_offset = 0; -+ } -+ -+ *out_ptr = &pvr_cccb->cccb[pvr_cccb->write_offset]; -+ *new_write_offset = pvr_cccb->write_offset + size; -+ -+ return 0; -+} -+ -+/** -+ * pvr_cccb_write_command() - Write a command to a Client CCB -+ * @pvr_cccb: Target Client CCB. -+ * @cmd_data: Pointer to command to write. -+ * @size: Size of command in bytes. -+ * -+ * Caller must have locked the Client CCB with pvr_cccb_lock(). -+ * -+ * Returns: -+ * * Zero on success, or -+ * * -EAGAIN if insufficient space is currently available in the CCCB. -+ */ -+int -+pvr_cccb_write_command(struct pvr_cccb *pvr_cccb, void *cmd_data, size_t size) -+{ -+ void *cccb_ptr; -+ u32 new_write_offset; -+ int err; -+ -+ lockdep_assert_held(&pvr_cccb->lock); -+ -+ err = pvr_cccb_acquire_command_space_locked(pvr_cccb, size, &cccb_ptr, -+ &new_write_offset); -+ if (err) -+ return err; -+ -+ memcpy(cccb_ptr, cmd_data, size); -+ pvr_cccb->write_offset = new_write_offset; -+ -+ return 0; -+} -+ -+/** -+ * pvr_cccb_write_command_with_header() - Write a command + command header to a -+ * Client CCB -+ * @pvr_cccb: Target Client CCB. -+ * @cmd_type: Client CCB command type. Must be one of %ROGUE_FWIF_CCB_CMD_TYPE_*. -+ * @cmd_size: Size of command in bytes. -+ * @cmd_data: Pointer to command to write. -+ * @ext_job_ref: External job reference. -+ * @int_job_ref: Internal job reference. -+ * -+ * Caller must have locked the Client CCB with pvr_cccb_lock(). -+ * -+ * Returns: -+ * * Zero on success, or -+ * * -EAGAIN if insufficient space is currently available in the CCCB. -+ */ -+int -+pvr_cccb_write_command_with_header(struct pvr_cccb *pvr_cccb, u32 cmd_type, u32 cmd_size, -+ void *cmd_data, u32 ext_job_ref, u32 int_job_ref) -+{ -+ struct rogue_fwif_ccb_cmd_header cmd_header; -+ u8 *cccb_ptr; -+ u32 new_write_offset; -+ const size_t size = sizeof(cmd_header) + cmd_size; -+ int err; -+ -+ lockdep_assert_held(&pvr_cccb->lock); -+ -+ cmd_header.cmd_type = cmd_type; -+ cmd_header.cmd_size = cmd_size; -+ cmd_header.ext_job_ref = ext_job_ref; -+ cmd_header.int_job_ref = int_job_ref; -+ -+ err = pvr_cccb_acquire_command_space_locked(pvr_cccb, size, (void **)&cccb_ptr, -+ &new_write_offset); -+ if (err) -+ return err; -+ -+ memcpy(cccb_ptr, &cmd_header, sizeof(cmd_header)); -+ memcpy(cccb_ptr + sizeof(cmd_header), cmd_data, cmd_size); -+ pvr_cccb->write_offset = new_write_offset; -+ -+ return 0; -+} -+ -+/** -+ * pvr_cccb_wait_for_idle: Wait for Client CCB to go idle -+ * @pvr_cccb: Client CCB to wait on. -+ * @timeout: Timeout length (in jiffies). -+ * -+ * Returns: -+ * * Zero on success, or -+ * * -EBUSY on timeout. -+ */ -+int -+pvr_cccb_wait_for_idle(struct pvr_cccb *pvr_cccb, u32 timeout) -+{ -+ struct rogue_fwif_cccb_ctl *ctrl = pvr_cccb->ctrl; -+ unsigned long end_jiffies = jiffies + timeout; -+ -+ while (!time_after(jiffies, end_jiffies)) { -+ if (READ_ONCE(ctrl->read_offset) == READ_ONCE(ctrl->write_offset)) -+ return 0; -+ usleep_range(100, 1000); -+ } -+ -+ return -EBUSY; -+} -+ -+/** -+ * pvr_cccb_unlock_send_kccb_kick: Unlock Client CCB and send KCCB kick to -+ * trigger command processing -+ * @pvr_dev: Device pointer. -+ * @pvr_cccb: Pointer to CCCB to process. -+ * @cctx_fw_addr: FW virtual address for context owning this Client CCB. -+ * @hwrt: HWRT data set associated with this kick. May be %NULL. -+ * -+ * Caller must have locked the Client CCB with pvr_cccb_lock(). -+ * -+ * If this function is successful, then the Client CCB will be unlocked. On -+ * error, the Client CCB will still be locked, and it is the callers -+ * responsibility to unlock it with pvr_cccb_unlock_rollback(). -+ * -+ * Return : -+ * * Zero on success, or -+ * * Any error returned by pvr_kccb_send_cmd(). -+ */ -+int -+pvr_cccb_unlock_send_kccb_kick(struct pvr_device *pvr_dev, -+ struct pvr_cccb *pvr_cccb, u32 cctx_fw_addr, -+ struct pvr_hwrt_data *hwrt) -+{ -+ struct rogue_fwif_kccb_cmd cmd_kick; -+ struct rogue_fwif_kccb_cmd_kick_data *cmd_kick_data = -+ &cmd_kick.cmd_data.cmd_kick_data; -+ u32 *cleanup_ctl; -+ int err; -+ -+ lockdep_assert_held(&pvr_cccb->lock); -+ -+ cmd_kick.cmd_type = ROGUE_FWIF_KCCB_CMD_KICK; -+ cmd_kick_data->context_fw_addr = cctx_fw_addr; -+ cmd_kick_data->client_woff_update = pvr_cccb->write_offset; -+ cmd_kick_data->client_wrap_mask_update = pvr_cccb->wrap_mask; -+ -+ cmd_kick_data->num_cleanup_ctl = 0; -+ cleanup_ctl = cmd_kick_data->cleanup_ctl_fw_addr; -+ if (hwrt) { -+ WARN_ON(!pvr_gem_get_fw_addr_offset(hwrt->fw_obj, -+ offsetof(struct rogue_fwif_hwrtdata, cleanup_state), -+ cleanup_ctl)); -+ cmd_kick_data->num_cleanup_ctl++; -+ cleanup_ctl++; -+ } -+ cmd_kick_data->work_est_cmd_header_offset = 0; -+ -+ err = pvr_kccb_send_cmd(pvr_dev, &cmd_kick, NULL); -+ if (err) -+ goto err_out; -+ -+ mutex_unlock(&pvr_cccb->lock); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -diff --git a/drivers/gpu/drm/imagination/pvr_cccb.h b/drivers/gpu/drm/imagination/pvr_cccb.h -new file mode 100644 -index 000000000000..7cf479ee75cb ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_cccb.h -@@ -0,0 +1,103 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_CCCB_H__ -+#define __PVR_CCCB_H__ -+ -+#include "pvr_fence.h" -+#include "pvr_rogue_fwif.h" -+#include "pvr_rogue_fwif_shared.h" -+ -+#include <linux/mutex.h> -+#include <linux/types.h> -+ -+/* Forward declaration from pvr_device.h. */ -+struct pvr_device; -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+/* Forward declaration from pvr_hwrt.h. */ -+struct pvr_hwrt_data; -+ -+struct pvr_cccb { -+ /** @ctrl_obj: FW object representing CCCB control structure. */ -+ struct pvr_fw_object *ctrl_obj; -+ -+ /** @ccb_obj: FW object representing CCCB. */ -+ struct pvr_fw_object *cccb_obj; -+ -+ /** @lock: Mutex protecting @ctrl and @cccb. */ -+ struct mutex lock; -+ -+ /** -+ * @ctrl: Kernel mapping of CCCB control structure. @lock must be held -+ * when accessing. -+ */ -+ struct rogue_fwif_cccb_ctl *ctrl; -+ -+ /** @cccb: Kernel mapping of CCCB. @lock must be held when accessing.*/ -+ u8 *cccb; -+ -+ /** @ctrl_fw_addr: FW virtual address of CCCB control structure. */ -+ u32 ctrl_fw_addr; -+ /** @ccb_fw_addr: FW virtual address of CCCB. */ -+ u32 cccb_fw_addr; -+ -+ /** @size: Size of CCCB in bytes. */ -+ size_t size; -+ -+ /** @write_offset: CCCB write offset. */ -+ u32 write_offset; -+ -+ /** @wrap_mask: CCCB wrap mask. */ -+ u32 wrap_mask; -+ -+ /** @old_write_offset: CCCB write offset, sampled at CCCB lock time. */ -+ u32 old_write_offset; -+ -+ /** @pvr_fence_context: Fence context for data master represented by this CCCB. */ -+ struct pvr_fence_context pvr_fence_context; -+}; -+ -+int pvr_cccb_init(struct pvr_device *pvr_dev, struct pvr_cccb *cccb, -+ u32 size_log2, const char *name); -+void pvr_cccb_fini(struct pvr_cccb *cccb); -+ -+int pvr_cccb_write_command(struct pvr_cccb *pvr_cccb, void *cmd_data, -+ size_t size); -+int -+pvr_cccb_write_command_with_header(struct pvr_cccb *pvr_cccb, u32 cmd_type, u32 cmd_size, -+ void *cmd_data, u32 ext_job_ref, u32 int_job_ref); -+int pvr_cccb_wait_for_idle(struct pvr_cccb *pvr_cccb, u32 timeout); -+int pvr_cccb_unlock_send_kccb_kick(struct pvr_device *pvr_dev, -+ struct pvr_cccb *pvr_cccb, u32 cctx_fw_addr, -+ struct pvr_hwrt_data *hwrt); -+ -+/** -+ * pvr_cccb_lock() - Lock a client CCB for writing -+ * @pvr_cccb: Target client CCB. -+ */ -+static __always_inline void -+pvr_cccb_lock(struct pvr_cccb *pvr_cccb) -+{ -+ mutex_lock(&pvr_cccb->lock); -+ -+ pvr_cccb->old_write_offset = pvr_cccb->write_offset; -+} -+ -+/** -+ * pvr_cccb_unlock_rollback() - Unlock a client CCB and rollback any written -+ * commands -+ * @pvr_cccb: Target client CCB. -+ */ -+static __always_inline void -+pvr_cccb_unlock_rollback(struct pvr_cccb *pvr_cccb) -+{ -+ lockdep_assert_held(&pvr_cccb->lock); -+ -+ pvr_cccb->write_offset = pvr_cccb->old_write_offset; -+ mutex_unlock(&pvr_cccb->lock); -+} -+ -+#endif /* __PVR_CCCB_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_context.c b/drivers/gpu/drm/imagination/pvr_context.c -new file mode 100644 -index 000000000000..b316a05e551b ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_context.c -@@ -0,0 +1,727 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_cccb.h" -+#include "pvr_context.h" -+#include "pvr_device.h" -+#include "pvr_gem.h" -+#include "pvr_object.h" -+#include "pvr_rogue_fwif.h" -+#include "pvr_rogue_fwif_common.h" -+#include "pvr_rogue_fwif_resetframework.h" -+ -+#include <drm/drm_auth.h> -+#include <linux/errno.h> -+#include <linux/kernel.h> -+#include <linux/slab.h> -+#include <linux/types.h> -+#include <linux/xarray.h> -+ -+/* TODO: placeholder */ -+#define MAX_DEADLINE_MS 30000 -+ -+#define CTX_COMPUTE_CCCB_SIZE_LOG2 15 -+#define CTX_FRAG_CCCB_SIZE_LOG2 15 -+#define CTX_GEOM_CCCB_SIZE_LOG2 15 -+ -+static int -+pvr_init_context_common(struct pvr_device *pvr_dev, struct pvr_file *pvr_file, -+ struct pvr_context *ctx, int type, -+ enum pvr_context_priority priority, -+ struct drm_pvr_ioctl_create_context_args *args) -+{ -+ struct rogue_fwif_rf_cmd *reset_framework; -+ int err; -+ -+ ctx->type = type; -+ ctx->pvr_dev = pvr_dev; -+ ctx->pvr_file = pvr_file; -+ -+ ctx->flags = args->flags; -+ ctx->priority = priority; -+ -+ kref_init(&ctx->ref_count); -+ -+ reset_framework = pvr_gem_create_and_map_fw_object(pvr_dev, ROGUE_FWIF_RF_CMD_SIZE, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &ctx->reset_framework_obj); -+ if (IS_ERR(reset_framework)) { -+ err = PTR_ERR(reset_framework); -+ goto err_out; -+ } -+ -+ if (args->reset_framework_registers) { -+ struct drm_pvr_reset_framework rf_args; -+ -+ if (copy_from_user(&rf_args, -+ u64_to_user_ptr( -+ args->reset_framework_registers), -+ sizeof(rf_args))) { -+ err = -EFAULT; -+ goto err_rf_free; -+ } -+ -+ if (rf_args.flags || rf_args.format != DRM_PVR_RF_FORMAT_CDM_1) { -+ err = -EINVAL; -+ goto err_rf_free; -+ } -+ -+ if (!PVR_IOCTL_UNION_PADDING_CHECK(&rf_args, data, -+ cdm_format_1) || -+ !rf_args.data.cdm_format_1.cdm_ctrl_stream_base) { -+ err = -EINVAL; -+ goto err_rf_free; -+ } -+ -+ reset_framework->flags = ROGUE_FWIF_RF_FLAG_ENABLE; -+ reset_framework->fw_registers.cdmreg_cdm_ctrl_stream_base = -+ rf_args.data.cdm_format_1.cdm_ctrl_stream_base; -+ -+ } else { -+ reset_framework->flags = 0; -+ } -+ -+ pvr_fw_object_vunmap(ctx->reset_framework_obj, reset_framework, true); -+ -+ return 0; -+ -+err_rf_free: -+ pvr_fw_object_release(ctx->reset_framework_obj); -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_fini_context_common(struct pvr_device *pvr_dev, struct pvr_context *ctx) -+{ -+ pvr_fw_object_release(ctx->reset_framework_obj); -+} -+ -+/** -+ * pvr_init_geom_context() - Initialise a geometry context -+ * @ctx_render: Pointer to parent render context. -+ * @render_ctx_args: Arguments from userspace. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by pvr_gem_create_and_map_fw_object(). -+ */ -+static int -+pvr_init_geom_context( -+ struct pvr_context_render *ctx_render, -+ struct drm_pvr_ioctl_create_render_context_args *render_ctx_args) -+{ -+ struct pvr_device *pvr_dev = ctx_render->base.pvr_dev; -+ struct pvr_context_geom *ctx_geom = &ctx_render->ctx_geom; -+ struct rogue_fwif_geom_ctx_state *geom_ctx_state_fw; -+ int err; -+ -+ ctx_geom->ctx_id = atomic_inc_return(&ctx_render->base.pvr_file->ctx_id); -+ -+ err = pvr_cccb_init(pvr_dev, &ctx_geom->cccb, CTX_GEOM_CCCB_SIZE_LOG2, "geometry"); -+ if (err) -+ goto err_out; -+ -+ geom_ctx_state_fw = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*geom_ctx_state_fw), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &ctx_geom->ctx_state_obj); -+ if (IS_ERR(geom_ctx_state_fw)) { -+ err = PTR_ERR(geom_ctx_state_fw); -+ goto err_cccb_fini; -+ } -+ -+ geom_ctx_state_fw->geom_reg_vdm_call_stack_pointer = -+ render_ctx_args->vdm_callstack_addr; -+ -+ pvr_fw_object_vunmap(ctx_geom->ctx_state_obj, geom_ctx_state_fw, true); -+ -+ return 0; -+ -+err_cccb_fini: -+ pvr_cccb_fini(&ctx_geom->cccb); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_fini_geom_context() - Clean up a geometry context -+ * @ctx_render: Pointer to parent render context. -+ */ -+static void -+pvr_fini_geom_context(struct pvr_context_render *ctx_render) -+{ -+ struct pvr_context_geom *ctx_geom = &ctx_render->ctx_geom; -+ -+ pvr_fw_object_release(ctx_geom->ctx_state_obj); -+ -+ pvr_cccb_fini(&ctx_geom->cccb); -+} -+ -+/** -+ * pvr_init_frag_context() - Initialise a fragment context -+ * @ctx_render: Pointer to parent render context. -+ * @render_ctx_args: Arguments from userspace. -+ * -+ * Return: -+ * * 0 on success. -+ */ -+static int -+pvr_init_frag_context(struct pvr_context_render *ctx_render, -+ struct drm_pvr_ioctl_create_render_context_args *render_ctx_args) -+{ -+ struct pvr_device *pvr_dev = ctx_render->base.pvr_dev; -+ struct pvr_file *pvr_file = ctx_render->base.pvr_file; -+ struct pvr_context_frag *ctx_frag = &ctx_render->ctx_frag; -+ int err; -+ -+ ctx_frag->ctx_id = atomic_inc_return(&pvr_file->ctx_id); -+ -+ err = pvr_cccb_init(pvr_dev, &ctx_frag->cccb, CTX_FRAG_CCCB_SIZE_LOG2, "fragment"); -+ if (err) -+ goto err_out; -+ -+ err = pvr_gem_create_fw_object(pvr_dev, sizeof(struct rogue_fwif_frag_ctx_state), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, &ctx_frag->ctx_state_obj); -+ if (err) -+ goto err_cccb_fini; -+ -+ return 0; -+ -+err_cccb_fini: -+ pvr_cccb_fini(&ctx_frag->cccb); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_fini_frag_context() - Clean up a fragment context -+ * @ctx_render: Pointer to parent render context. -+ */ -+static void -+pvr_fini_frag_context(struct pvr_context_render *ctx_render) -+{ -+ struct pvr_context_frag *ctx_frag = &ctx_render->ctx_frag; -+ -+ pvr_fw_object_release(ctx_frag->ctx_state_obj); -+ -+ pvr_cccb_fini(&ctx_frag->cccb); -+} -+ -+static int -+remap_priority(struct pvr_file *pvr_file, s32 uapi_priority, enum pvr_context_priority *priority_out) -+{ -+ switch (uapi_priority) { -+ case DRM_PVR_CTX_PRIORITY_LOW: -+ *priority_out = PVR_CTX_PRIORITY_LOW; -+ break; -+ case DRM_PVR_CTX_PRIORITY_NORMAL: -+ *priority_out = PVR_CTX_PRIORITY_MEDIUM; -+ break; -+ case DRM_PVR_CTX_PRIORITY_HIGH: -+ if (!capable(CAP_SYS_NICE) && !drm_is_current_master(from_pvr_file(pvr_file))) -+ return -EACCES; -+ *priority_out = PVR_CTX_PRIORITY_HIGH; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+/** -+ * pvr_init_fw_common_context() - Initialise an FW-side common context structure -+ * @pvr_file: Pointer to pvr_file structure. -+ * @ctx: Pointer to context. -+ * @cctx_fw: Pointer to FW common context structure. -+ * @dm_type: Data master type. -+ * @priority: Context priority. -+ * @max_deadline_ms: Maximum deadline for work on this context. -+ * @cctx_id: Common context ID. -+ * @ctx_state_obj: FW object representing context state. -+ * @cccb: Client CCB for this context. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by pvr_gem_get_fw_addr(). -+ */ -+static int -+pvr_init_fw_common_context(struct pvr_file *pvr_file, struct pvr_context *ctx, -+ struct rogue_fwif_fwcommoncontext *cctx_fw, -+ u32 dm_type, u32 priority, u32 max_deadline_ms, -+ u32 cctx_id, struct pvr_fw_object *ctx_state_obj, -+ struct pvr_cccb *cccb) -+{ -+ int err = 0; -+ -+ cctx_fw->ccbctl_fw_addr = cccb->ctrl_fw_addr; -+ cctx_fw->ccb_fw_addr = cccb->cccb_fw_addr; -+ -+ cctx_fw->dm = dm_type; -+ cctx_fw->priority = ctx->priority; -+ cctx_fw->priority_seq_num = 0; -+ cctx_fw->max_deadline_ms = max_deadline_ms; -+ cctx_fw->pid = task_tgid_nr(current); -+ cctx_fw->server_common_context_id = cctx_id; -+ -+ if (ctx->reset_framework_obj) { -+ if (!pvr_gem_get_fw_addr(ctx->reset_framework_obj, -+ &cctx_fw->rf_cmd_addr)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ } -+ -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_file->fw_mem_ctx_obj, &cctx_fw->fw_mem_context_fw_addr)); -+ -+ if (!pvr_gem_get_fw_addr(ctx_state_obj, &cctx_fw->context_state_addr)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_init_fw_render_context() - Initialise an FW-side render context structure -+ * @pvr_file: Pointer to pvr_file structure. -+ * @ctx_render: Pointer to parent render context. -+ * @args: Context creation arguments from userspace. -+ * @render_ctx_args: Render context specific arguments from userspace. -+ * -+ * Return: -+ * * 0 on success. -+ */ -+static int -+pvr_init_fw_render_context( -+ struct pvr_file *pvr_file, -+ struct pvr_context_render *ctx_render, -+ struct drm_pvr_ioctl_create_context_args *args, -+ struct drm_pvr_ioctl_create_render_context_args *render_ctx_args) -+{ -+ struct rogue_fwif_geom_registers_caswitch *ctxswitch_regs; -+ struct rogue_fwif_fwrendercontext *fw_render_context; -+ struct drm_pvr_static_render_context_state srcs_args; -+ int err; -+ -+ fw_render_context = pvr_gem_create_and_map_fw_object(ctx_render->base.pvr_dev, -+ sizeof(*fw_render_context), PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, &ctx_render->fw_obj); -+ if (IS_ERR(fw_render_context)) { -+ err = PTR_ERR(fw_render_context); -+ goto err_out; -+ } -+ -+ /* Copy static render context state from userspace. */ -+ if (copy_from_user(&srcs_args, -+ u64_to_user_ptr( -+ render_ctx_args->static_render_context_state), -+ sizeof(srcs_args))) { -+ err = -EFAULT; -+ goto err_destroy_gem_object; -+ } -+ -+ if (srcs_args.format != DRM_PVR_SRCS_FORMAT_1 || -+ srcs_args._padding_4) { -+ err = -EINVAL; -+ goto err_destroy_gem_object; -+ } -+ -+ if (!PVR_IOCTL_UNION_PADDING_CHECK(&srcs_args, data, format_1)) { -+ err = -EINVAL; -+ goto err_destroy_gem_object; -+ } -+ -+ ctxswitch_regs = -+ &fw_render_context->static_render_context_state.ctxswitch_regs; -+ -+ BUILD_BUG_ON(sizeof(*ctxswitch_regs) != sizeof(srcs_args.data)); -+ memcpy(ctxswitch_regs, &srcs_args.data, sizeof(srcs_args.data)); -+ -+ err = pvr_init_fw_common_context(pvr_file, &ctx_render->base, -+ &fw_render_context->geom_context, -+ PVR_FWIF_DM_GEOM, args->priority, -+ MAX_DEADLINE_MS, -+ ctx_render->ctx_geom.ctx_id, -+ ctx_render->ctx_geom.ctx_state_obj, -+ &ctx_render->ctx_geom.cccb); -+ if (err) -+ goto err_destroy_gem_object; -+ -+ err = pvr_init_fw_common_context(pvr_file, &ctx_render->base, -+ &fw_render_context->frag_context, -+ PVR_FWIF_DM_FRAG, args->priority, -+ MAX_DEADLINE_MS, -+ ctx_render->ctx_frag.ctx_id, -+ ctx_render->ctx_frag.ctx_state_obj, -+ &ctx_render->ctx_frag.cccb); -+ if (err) -+ goto err_destroy_gem_object; -+ -+ pvr_fw_object_vunmap(ctx_render->fw_obj, fw_render_context, true); -+ return 0; -+ -+err_destroy_gem_object: -+ pvr_fw_object_vunmap(ctx_render->fw_obj, fw_render_context, true); -+ pvr_fw_object_release(ctx_render->fw_obj); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_fini_fw_render_context() - Clean up an FW-side render context structure -+ * @ctx_render: Pointer to parent render context. -+ */ -+static void -+pvr_fini_fw_render_context(struct pvr_context_render *ctx_render) -+{ -+ pvr_fw_object_release(ctx_render->fw_obj); -+} -+ -+/** -+ * pvr_init_compute_context() - Initialise a compute context structure -+ * @pvr_file: Pointer to pvr_file structure. -+ * @ctx_compute: Pointer to parent compute context. -+ * @args: Context creation arguments from userspace. -+ * @compute_ctx_args: Compute context specific arguments from userspace. -+ * -+ * Return: -+ * * 0 on success. -+ */ -+static int -+pvr_init_compute_context( -+ struct pvr_file *pvr_file, -+ struct pvr_context_compute *ctx_compute, -+ struct drm_pvr_ioctl_create_context_args *args, -+ struct drm_pvr_ioctl_create_compute_context_args *compute_ctx_args) -+{ -+ struct pvr_device *pvr_dev = pvr_file->pvr_dev; -+ struct rogue_fwif_cdm_registers_cswitch *ctxswitch_regs; -+ struct rogue_fwif_fwcomputecontext *fw_compute_context; -+ struct drm_pvr_static_compute_context_state sccs_args; -+ int err; -+ -+ ctx_compute->ctx_id = atomic_inc_return(&pvr_file->ctx_id); -+ -+ err = pvr_cccb_init(pvr_dev, &ctx_compute->cccb, CTX_COMPUTE_CCCB_SIZE_LOG2, "compute"); -+ if (err) -+ goto err_out; -+ -+ err = pvr_gem_create_fw_object(pvr_dev, sizeof(struct rogue_fwif_compute_ctx_state), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, &ctx_compute->ctx_state_obj); -+ if (err) -+ goto err_cccb_fini; -+ -+ fw_compute_context = pvr_gem_create_and_map_fw_object(ctx_compute->base.pvr_dev, -+ sizeof(*fw_compute_context), PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, &ctx_compute->fw_obj); -+ if (IS_ERR(fw_compute_context)) { -+ err = PTR_ERR(fw_compute_context); -+ goto err_destroy_ctx_state_obj; -+ } -+ -+ /* Copy static render context state from userspace. */ -+ if (copy_from_user(&sccs_args, -+ u64_to_user_ptr(compute_ctx_args->static_compute_context_state), -+ sizeof(sccs_args))) { -+ err = -EFAULT; -+ goto err_destroy_gem_object; -+ } -+ -+ if (sccs_args.format != DRM_PVR_SCCS_FORMAT_1 || sccs_args._padding_4) { -+ err = -EINVAL; -+ goto err_destroy_gem_object; -+ } -+ -+ if (!PVR_IOCTL_UNION_PADDING_CHECK(&sccs_args, data, format_1)) { -+ err = -EINVAL; -+ goto err_destroy_gem_object; -+ } -+ -+ ctxswitch_regs = -+ &fw_compute_context->static_compute_context_state.ctxswitch_regs; -+ -+ BUILD_BUG_ON(sizeof(*ctxswitch_regs) != sizeof(sccs_args.data)); -+ memcpy(ctxswitch_regs, &sccs_args.data, sizeof(sccs_args.data)); -+ -+ err = pvr_init_fw_common_context(pvr_file, &ctx_compute->base, -+ &fw_compute_context->cdm_context, PVR_FWIF_DM_CDM, -+ args->priority, MAX_DEADLINE_MS, -+ ctx_compute->ctx_id, -+ ctx_compute->ctx_state_obj, -+ &ctx_compute->cccb); -+ if (err) -+ goto err_destroy_gem_object; -+ -+ pvr_fw_object_vunmap(ctx_compute->fw_obj, fw_compute_context, true); -+ return 0; -+ -+err_destroy_gem_object: -+ pvr_fw_object_vunmap(ctx_compute->fw_obj, fw_compute_context, true); -+ pvr_fw_object_release(ctx_compute->fw_obj); -+ -+err_destroy_ctx_state_obj: -+ pvr_fw_object_release(ctx_compute->ctx_state_obj); -+ -+err_cccb_fini: -+ pvr_cccb_fini(&ctx_compute->cccb); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_fini_compute_context() - Clean up a compute context structure -+ * @ctx_compute: Pointer to compute context. -+ */ -+static void -+pvr_fini_compute_context(struct pvr_context_compute *ctx_compute) -+{ -+ pvr_fw_object_release(ctx_compute->fw_obj); -+ pvr_fw_object_release(ctx_compute->ctx_state_obj); -+ pvr_cccb_fini(&ctx_compute->cccb); -+} -+ -+/** -+ * pvr_create_render_context() - Create a combination geometry/fragment render -+ * context and return a handle -+ * @pvr_file: Pointer to pvr_file structure. -+ * @args: Creation arguments from userspace. -+ * @render_ctx_args: Render context creation args from userspace. -+ * @handle_out: Output handle pointer. -+ * -+ * The context is initialised with refcount of 1. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%ENOMEM on out-of-memory, or -+ * * Any error returned by xa_alloc(). -+ */ -+int -+pvr_create_render_context(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_context_args *args, -+ struct drm_pvr_ioctl_create_render_context_args *render_ctx_args, -+ u32 *handle_out) -+{ -+ struct pvr_device *pvr_dev = pvr_file->pvr_dev; -+ struct pvr_context_render *ctx_render; -+ enum pvr_context_priority priority; -+ u32 handle; -+ int err; -+ -+ if (!render_ctx_args->static_render_context_state) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = remap_priority(pvr_file, args->priority, &priority); -+ if (err) -+ goto err_out; -+ -+ ctx_render = kzalloc(sizeof(*ctx_render), GFP_KERNEL); -+ if (!ctx_render) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = pvr_init_context_common(pvr_dev, pvr_file, -+ from_pvr_context_render(ctx_render), -+ DRM_PVR_CTX_TYPE_RENDER, priority, args); -+ if (err < 0) -+ goto err_free; -+ -+ err = pvr_init_geom_context(ctx_render, render_ctx_args); -+ if (err < 0) -+ goto err_destroy_common_context; -+ -+ err = pvr_init_frag_context(ctx_render, render_ctx_args); -+ if (err < 0) -+ goto err_destroy_geom_context; -+ -+ err = pvr_init_fw_render_context(pvr_file, ctx_render, args, render_ctx_args); -+ if (err < 0) -+ goto err_destroy_frag_context; -+ -+ /* Add to context list, and get handle */ -+ err = xa_alloc(&pvr_file->contexts, &handle, -+ from_pvr_context_render(ctx_render), xa_limit_1_32b, -+ GFP_KERNEL); -+ if (err < 0) -+ goto err_destroy_fw_render_context; -+ -+ *handle_out = handle; -+ -+ return 0; -+ -+err_destroy_fw_render_context: -+ pvr_fini_fw_render_context(ctx_render); -+ -+err_destroy_frag_context: -+ pvr_fini_frag_context(ctx_render); -+ -+err_destroy_geom_context: -+ pvr_fini_geom_context(ctx_render); -+ -+err_destroy_common_context: -+ pvr_fini_context_common(pvr_dev, from_pvr_context_render(ctx_render)); -+ -+err_free: -+ kfree(ctx_render); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_create_compute_context() - Create a compute context and return a handle -+ * @pvr_file: Pointer to pvr_file structure. -+ * @args: Creation arguments from userspace. -+ * @compute_ctx_args: Compute context creation args from userspace. -+ * @handle_out: Output handle pointer. -+ * -+ * The context is initialised with refcount of 1. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%ENOMEM on out-of-memory, or -+ * * Any error returned by xa_alloc(). -+ */ -+int -+pvr_create_compute_context(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_context_args *args, -+ struct drm_pvr_ioctl_create_compute_context_args *compute_ctx_args, -+ u32 *handle_out) -+{ -+ struct pvr_device *pvr_dev = pvr_file->pvr_dev; -+ struct pvr_context_compute *ctx_compute; -+ enum pvr_context_priority priority; -+ u32 handle; -+ int err; -+ -+ if (!compute_ctx_args->static_compute_context_state) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = remap_priority(pvr_file, args->priority, &priority); -+ if (err) -+ goto err_out; -+ -+ ctx_compute = kzalloc(sizeof(*ctx_compute), GFP_KERNEL); -+ if (!ctx_compute) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = pvr_init_context_common(pvr_dev, pvr_file, -+ from_pvr_context_compute(ctx_compute), -+ DRM_PVR_CTX_TYPE_COMPUTE, priority, args); -+ if (err < 0) -+ goto err_free; -+ -+ err = pvr_init_compute_context(pvr_file, ctx_compute, args, compute_ctx_args); -+ if (err < 0) -+ goto err_destroy_common_context; -+ -+ /* Add to context list, and get handle */ -+ err = xa_alloc(&pvr_file->contexts, &handle, -+ from_pvr_context_compute(ctx_compute), xa_limit_1_32b, -+ GFP_KERNEL); -+ if (err < 0) -+ goto err_destroy_compute_context; -+ -+ *handle_out = handle; -+ -+ return 0; -+ -+err_destroy_compute_context: -+ pvr_fini_compute_context(ctx_compute); -+ -+err_destroy_common_context: -+ pvr_fini_context_common(pvr_dev, from_pvr_context_compute(ctx_compute)); -+ -+err_free: -+ kfree(ctx_compute); -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_release_context(struct kref *ref_count) -+{ -+ struct pvr_context *ctx = -+ container_of(ref_count, struct pvr_context, ref_count); -+ struct pvr_device *pvr_dev = ctx->pvr_dev; -+ -+ if (ctx->type == DRM_PVR_CTX_TYPE_RENDER) { -+ struct pvr_context_render *ctx_render = -+ to_pvr_context_render(ctx); -+ -+ WARN_ON(pvr_object_cleanup(pvr_dev, ROGUE_FWIF_CLEANUP_FWCOMMONCONTEXT, -+ ctx_render->fw_obj, -+ offsetof(struct rogue_fwif_fwrendercontext, -+ geom_context))); -+ WARN_ON(pvr_object_cleanup(pvr_dev, ROGUE_FWIF_CLEANUP_FWCOMMONCONTEXT, -+ ctx_render->fw_obj, -+ offsetof(struct rogue_fwif_fwrendercontext, -+ frag_context))); -+ -+ pvr_fini_fw_render_context(ctx_render); -+ -+ /* Destroy owned geometry & fragment contexts. */ -+ pvr_fini_frag_context(ctx_render); -+ pvr_fini_geom_context(ctx_render); -+ } else if (ctx->type == DRM_PVR_CTX_TYPE_COMPUTE) { -+ struct pvr_context_compute *ctx_compute = -+ to_pvr_context_compute(ctx); -+ -+ pvr_fini_compute_context(ctx_compute); -+ } -+ -+ pvr_fini_context_common(ctx->pvr_dev, ctx); -+ -+ kfree(ctx); -+} -+ -+/** -+ * pvr_context_put() - Release reference on context -+ * @ctx: Target context. -+ */ -+void -+pvr_context_put(struct pvr_context *ctx) -+{ -+ kref_put(&ctx->ref_count, pvr_release_context); -+} -+ -+/** -+ * pvr_context_destroy() - Destroy context -+ * @pvr_file: Pointer to pvr_file structure. -+ * @handle: Context handle. -+ * -+ * Removes context from context list and drops initial reference. Context will -+ * then be destroyed once all outstanding references are dropped. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL if context not in context list. -+ */ -+int -+pvr_context_destroy(struct pvr_file *pvr_file, u32 handle) -+{ -+ struct pvr_context *ctx = xa_erase(&pvr_file->contexts, handle); -+ -+ if (!ctx) -+ return -EINVAL; -+ -+ pvr_context_put(ctx); -+ -+ return 0; -+} -diff --git a/drivers/gpu/drm/imagination/pvr_context.h b/drivers/gpu/drm/imagination/pvr_context.h -new file mode 100644 -index 000000000000..e94f2e8f655e ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_context.h -@@ -0,0 +1,181 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_CONTEXT_H__ -+#define __PVR_CONTEXT_H__ -+ -+#include <linux/compiler_attributes.h> -+#include <linux/kref.h> -+#include <linux/types.h> -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+#include "pvr_cccb.h" -+#include "pvr_device.h" -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+/** -+ * struct pvr_context_geom - Geometry render context data -+ */ -+struct pvr_context_geom { -+ /** @ctx_id: FW context ID. */ -+ u32 ctx_id; -+ -+ /** -+ * @ctx_state_obj: FW object representing context register state. -+ */ -+ struct pvr_fw_object *ctx_state_obj; -+ -+ /** @cccb: Client Circular Command Buffer. */ -+ struct pvr_cccb cccb; -+}; -+ -+/** -+ * struct pvr_context_frag - Fragment render context data -+ */ -+struct pvr_context_frag { -+ /** @ctx_id: FW context ID. */ -+ u32 ctx_id; -+ -+ /** -+ * @ctx_state_obj: FW object representing context register state. -+ */ -+ struct pvr_fw_object *ctx_state_obj; -+ -+ /** @cccb: Client Circular Command Buffer. */ -+ struct pvr_cccb cccb; -+}; -+ -+enum pvr_context_priority { -+ PVR_CTX_PRIORITY_LOW = 0, -+ PVR_CTX_PRIORITY_MEDIUM, -+ PVR_CTX_PRIORITY_HIGH, -+}; -+ -+/** -+ * struct pvr_context - Context data -+ */ -+struct pvr_context { -+ /** @ref_count: Refcount for context. */ -+ struct kref ref_count; -+ -+ /** @pvr_dev: Pointer to owning device. */ -+ struct pvr_device *pvr_dev; -+ -+ /** @pvr_file: Pointer to owning file. */ -+ struct pvr_file *pvr_file; -+ -+ /** @type: Type of context. */ -+ enum drm_pvr_ctx_type type; -+ -+ /** @flags: Context flags. */ -+ u32 flags; -+ -+ /** @priority: Context priority*/ -+ enum pvr_context_priority priority; -+ -+ /** @reset_framework_obj: FW object representing reset framework. */ -+ struct pvr_fw_object *reset_framework_obj; -+}; -+ -+/** -+ * struct pvr_context_render - Render context data -+ */ -+struct pvr_context_render { -+ /** @base: Base context structure. */ -+ struct pvr_context base; -+ -+ /** @ctx_geom: Geometry context data. */ -+ struct pvr_context_geom ctx_geom; -+ -+ /** @ctx_frag: Fragment context data. */ -+ struct pvr_context_frag ctx_frag; -+ -+ /** @fw_obj: FW object representing FW-side context data. */ -+ struct pvr_fw_object *fw_obj; -+}; -+ -+/** -+ * struct pvr_context_compute - Compute context data -+ */ -+struct pvr_context_compute { -+ /** @base: Base context structure. */ -+ struct pvr_context base; -+ -+ /** @fw_obj: FW object representing FW-side context data. */ -+ struct pvr_fw_object *fw_obj; -+ -+ /** @ctx_id: Compute context ID. */ -+ u32 ctx_id; -+ -+ /** -+ * @ctx_state_obj: FW object representing context register state. -+ */ -+ struct pvr_fw_object *ctx_state_obj; -+ -+ /** @cccb: Client Circular Command Buffer. */ -+ struct pvr_cccb cccb; -+}; -+ -+int pvr_create_render_context(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_context_args *args, -+ struct drm_pvr_ioctl_create_render_context_args *render_ctx_args, -+ u32 *handle_out); -+int pvr_create_compute_context(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_context_args *args, -+ struct drm_pvr_ioctl_create_compute_context_args *compute_ctx_args, -+ u32 *handle_out); -+ -+static __always_inline struct pvr_context * -+from_pvr_context_render(struct pvr_context_render *ctx_render) -+{ -+ return &ctx_render->base; -+}; -+ -+static __always_inline struct pvr_context_render * -+to_pvr_context_render(struct pvr_context *ctx) -+{ -+ return container_of(ctx, struct pvr_context_render, base); -+} -+ -+static __always_inline struct pvr_context * -+from_pvr_context_compute(struct pvr_context_compute *ctx_context) -+{ -+ return &ctx_context->base; -+}; -+ -+static __always_inline struct pvr_context_compute * -+to_pvr_context_compute(struct pvr_context *ctx) -+{ -+ return container_of(ctx, struct pvr_context_compute, base); -+} -+ -+/** -+ * pvr_context_get() - Get context pointer from handle. -+ * @pvr_file: Pointer to pvr_file structure. -+ * @handle: Context handle. -+ * -+ * Takes reference on context. Call pvr_context_put() to release. -+ * -+ * Return: -+ * * The requested context on success, or -+ * * %NULL on failure. -+ */ -+static __always_inline struct pvr_context * -+pvr_context_get(struct pvr_file *pvr_file, u32 handle) -+{ -+ struct pvr_context *ctx = xa_load(&pvr_file->contexts, handle); -+ -+ if (ctx) -+ kref_get(&ctx->ref_count); -+ -+ return ctx; -+} -+ -+void pvr_context_put(struct pvr_context *ctx); -+ -+int pvr_context_destroy(struct pvr_file *pvr_file, u32 handle); -+ -+#endif /* __PVR_CONTEXT_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_device.c b/drivers/gpu/drm/imagination/pvr_device.c -new file mode 100644 -index 000000000000..d0d63584b2aa ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_device.c -@@ -0,0 +1,613 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_fw.h" -+ -+#include "pvr_rogue_cr_defs.h" -+ -+#include <drm/drm_print.h> -+ -+#include <linux/bitfield.h> -+#include <linux/clk.h> -+#include <linux/compiler_attributes.h> -+#include <linux/compiler_types.h> -+#include <linux/dma-mapping.h> -+#include <linux/err.h> -+#include <linux/firmware.h> -+#include <linux/gfp.h> -+#include <linux/interrupt.h> -+#include <linux/platform_device.h> -+#include <linux/slab.h> -+#include <linux/stddef.h> -+#include <linux/types.h> -+#include <linux/workqueue.h> -+ -+/* Major and minor numbers for the supported version of the firmware. */ -+#define PVR_FW_VERSION_MAJOR 1 -+#define PVR_FW_VERSION_MINOR 14 -+ -+/** -+ * pvr_device_reg_init() - Initialize kernel access to a PowerVR device's -+ * control registers. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Sets struct pvr_device->regs. -+ * -+ * This method of mapping the device control registers into memory ensures that -+ * they are unmapped when the driver is detached (i.e. no explicit cleanup is -+ * required). -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by devm_platform_ioremap_resource(). -+ */ -+static int -+pvr_device_reg_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct platform_device *plat_dev = to_platform_device(drm_dev->dev); -+ struct resource *regs_resource; -+ void __iomem *regs; -+ int err; -+ -+ pvr_dev->regs_resource = NULL; -+ pvr_dev->regs = NULL; -+ -+ regs = devm_platform_get_and_ioremap_resource(plat_dev, 0, ®s_resource); -+ if (IS_ERR(regs)) { -+ err = PTR_ERR(regs); -+ drm_err(drm_dev, "failed to ioremap gpu registers (err=%d)\n", -+ err); -+ return err; -+ } -+ -+ pvr_dev->regs = regs; -+ pvr_dev->regs_resource = regs_resource; -+ -+ return 0; -+} -+ -+/** -+ * pvr_device_reg_fini() - Deinitialize kernel access to a PowerVR device's -+ * control registers. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This is essentially a no-op, since pvr_device_reg_init() already ensures that -+ * struct pvr_device->regs is unmapped when the device is detached. This -+ * function just sets struct pvr_device->regs to %NULL. -+ */ -+static __always_inline void -+pvr_device_reg_fini(struct pvr_device *pvr_dev) -+{ -+ pvr_dev->regs = NULL; -+} -+ -+/** -+ * pvr_device_clk_init() - Initialize clocks required by a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Sets struct pvr_device->core_clk, struct pvr_device->sys_clk and -+ * struct pvr_device->mem_clk. -+ * -+ * Three clocks are required by the PowerVR device: core, sys and mem. On -+ * return, this function guarantees that the clocks are in one of the following -+ * states: -+ * -+ * * All successfully initialized, -+ * * Core errored, sys and mem uninitialized, -+ * * Core deinitialized, sys errored, mem uninitialized, or -+ * * Core and sys deinitialized, mem errored. -+ * -+ * Return: -+ * * 0 on success, -+ * * Any error returned by devm_clk_get(), or -+ * * Any error returned by clk_prepare_enable(). -+ */ -+static int pvr_device_clk_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct clk *core_clk; -+ struct clk *sys_clk; -+ struct clk *mem_clk; -+ int err; -+ -+ pvr_dev->core_clk = NULL; -+ pvr_dev->sys_clk = NULL; -+ pvr_dev->mem_clk = NULL; -+ -+ core_clk = devm_clk_get(drm_dev->dev, "core_clk"); -+ if (IS_ERR(core_clk)) { -+ err = PTR_ERR(core_clk); -+ drm_err(drm_dev, "failed to get core_clk (err=%d)\n", err); -+ goto err_out; -+ } -+ -+ sys_clk = devm_clk_get(drm_dev->dev, "sys_clk"); -+ if (IS_ERR(sys_clk)) { -+ err = PTR_ERR(sys_clk); -+ drm_err(drm_dev, "failed to get sys_clk (err=%d)\n", err); -+ goto err_out; -+ } -+ -+ mem_clk = devm_clk_get(drm_dev->dev, "mem_clk"); -+ if (IS_ERR(mem_clk)) { -+ err = PTR_ERR(mem_clk); -+ drm_err(drm_dev, "failed to get mem_clk (err=%d)\n", err); -+ goto err_out; -+ } -+ -+ err = clk_prepare_enable(core_clk); -+ if (err) -+ goto err_out; -+ -+ err = clk_prepare_enable(sys_clk); -+ if (err) -+ goto err_deinit_core_clk; -+ -+ err = clk_prepare_enable(mem_clk); -+ if (err) -+ goto err_deinit_sys_clk; -+ -+ pvr_dev->core_clk = core_clk; -+ pvr_dev->sys_clk = sys_clk; -+ pvr_dev->mem_clk = mem_clk; -+ -+ return 0; -+ -+err_deinit_sys_clk: -+ clk_disable_unprepare(sys_clk); -+err_deinit_core_clk: -+ clk_disable_unprepare(core_clk); -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_device_clk_fini() - Deinitialize clocks required by a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ */ -+static void -+pvr_device_clk_fini(struct pvr_device *pvr_dev) -+{ -+ clk_disable_unprepare(pvr_dev->mem_clk); -+ clk_disable_unprepare(pvr_dev->sys_clk); -+ clk_disable_unprepare(pvr_dev->core_clk); -+ -+ pvr_dev->core_clk = NULL; -+ pvr_dev->sys_clk = NULL; -+ pvr_dev->mem_clk = NULL; -+} -+ -+/** -+ * pvr_device_clk_core_get_freq - Get current PowerVR device core clock frequency -+ * @pvr_dev: Target PowerVR device. -+ * @freq_out: Pointer to location to store core clock frequency in Hz. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if frequency can not be determined. -+ */ -+int -+pvr_device_clk_core_get_freq(struct pvr_device *pvr_dev, u32 *freq_out) -+{ -+ u32 freq = clk_get_rate(pvr_dev->core_clk); -+ -+ if (!freq) -+ return -EINVAL; -+ -+ *freq_out = freq; -+ return 0; -+} -+ -+static irqreturn_t pvr_meta_irq_handler(int irq, void *data) -+{ -+ struct pvr_device *pvr_dev = data; -+ u32 irq_status; -+ -+ irq_status = PVR_CR_READ32(pvr_dev, META_SP_MSLVIRQSTATUS); -+ -+ if (!(irq_status & ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT2_EN)) -+ return IRQ_NONE; /* Spurious IRQ - ignore. */ -+ -+ /* Acknowledge IRQ. */ -+ PVR_CR_WRITE32(pvr_dev, META_SP_MSLVIRQSTATUS, -+ ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT2_CLRMSK); -+ -+ /* Only process IRQ work if FW is currently running. */ -+ if (pvr_dev->fw_booted) { -+ queue_work(pvr_dev->irq_wq, &pvr_dev->fwccb_work); -+ wake_up(&pvr_dev->kccb_rtn_q); -+ queue_work(pvr_dev->irq_wq, &pvr_dev->fence_work); -+ } -+ -+ return IRQ_HANDLED; -+} -+ -+/** -+ * pvr_device_irq_init() - Initialise IRQ required by a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Returns: -+ * * 0 on success, -+ * * Any error returned by platform_get_irq_byname(), or -+ * * Any error returned by request_irq(). -+ */ -+static int -+pvr_device_irq_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct platform_device *plat_dev = to_platform_device(drm_dev->dev); -+ int err; -+ -+ init_waitqueue_head(&pvr_dev->kccb_rtn_q); -+ -+ pvr_dev->irq_wq = alloc_workqueue("powervr-irq", WQ_UNBOUND, 0); -+ if (!pvr_dev->irq_wq) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ pvr_dev->irq = platform_get_irq_byname(plat_dev, "gpu"); -+ if (pvr_dev->irq < 0) { -+ err = pvr_dev->irq; -+ goto err_destroy_wq; -+ } -+ -+ err = request_irq(pvr_dev->irq, pvr_meta_irq_handler, IRQF_SHARED, NULL, pvr_dev); -+ if (err) -+ goto err_destroy_wq; -+ -+ return 0; -+ -+err_destroy_wq: -+ destroy_workqueue(pvr_dev->irq_wq); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_device_irq_fini() - Deinitialise IRQ required by a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ */ -+static void -+pvr_device_irq_fini(struct pvr_device *pvr_dev) -+{ -+ free_irq(pvr_dev->irq, pvr_dev); -+ destroy_workqueue(pvr_dev->irq_wq); -+} -+ -+/** -+ * pvr_build_firmware_filename() - Construct a PowerVR firmware filename -+ * @pvr_dev: Target PowerVR device. -+ * @base: First part of the filename. -+ * @major: Major version number. -+ * @minor: Minor version number. -+ * -+ * A PowerVR firmware filename consists of three parts separated by underscores -+ * (``'_'``) along with a '.fw' file suffix. The first part is the exact value -+ * of @base, the second part is the hardware version string derived from @pvr_fw -+ * and the final part is the firmware version number constructed from @major and -+ * @minor with a 'v' prefix, e.g. powervr/rogue_4.40.2.51_v1.14.fw. -+ * -+ * The returned string will have been slab allocated and must be freed with -+ * kfree(). -+ * -+ * Return: -+ * * The constructed filename on success, or -+ * * Any error returned by kasprintf(). -+ */ -+static char * -+pvr_build_firmware_filename(struct pvr_device *pvr_dev, const char *base, -+ u8 major, u8 minor) -+{ -+ struct pvr_version *version = &pvr_dev->version; -+ -+ return kasprintf(GFP_KERNEL, "%s_%d.%d.%d.%d_v%d.%d.fw", base, version->b, -+ version->v, version->n, version->c, major, minor); -+} -+ -+/** -+ * pvr_request_firmware() - Load firmware for a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * -+ * See pvr_build_firmware_filename() for details on firmware file naming. -+ * -+ * Return: -+ * * 0 on success, -+ * * Any error returned by pvr_build_firmware_filename(), or -+ * * Any error returned by request_firmware(). -+ */ -+static int -+pvr_request_firmware(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = &pvr_dev->base; -+ char *filename; -+ const struct firmware *fw; -+ int err; -+ -+ filename = pvr_build_firmware_filename(pvr_dev, "powervr/rogue", -+ PVR_FW_VERSION_MAJOR, -+ PVR_FW_VERSION_MINOR); -+ if (IS_ERR(filename)) -+ return PTR_ERR(filename); -+ -+ /* -+ * This function takes a copy of &filename, meaning we can free our -+ * instance before returning. -+ */ -+ err = request_firmware(&fw, filename, pvr_dev->base.dev); -+ if (err) { -+ drm_err(drm_dev, "failed to load firmware %s (err=%d)\n", -+ filename, err); -+ goto err_free_filename; -+ } -+ -+ drm_info(drm_dev, "loaded firmware %s\n", filename); -+ kfree(filename); -+ -+ pvr_dev->fw = fw; -+ -+ return 0; -+ -+err_free_filename: -+ kfree(filename); -+ -+ return err; -+} -+ -+/** -+ * pvr_load_hw_version() - Load a PowerVR device's hardware version (BVNC) from -+ * control registers. -+ * -+ * Sets struct pvr_dev.version. -+ * -+ * @pvr_dev: Target PowerVR device. -+ */ -+static void -+pvr_load_hw_version(struct pvr_device *pvr_dev) -+{ -+ struct pvr_version *version = &pvr_dev->version; -+ u64 bvnc; -+ -+ /* -+ * Try reading the BVNC using the newer (cleaner) method first. If the -+ * B value is zero, fall back to the older method. -+ */ -+ bvnc = PVR_CR_READ64(pvr_dev, CORE_ID__PBVNC); -+ -+ version->b = PVR_CR_FIELD_GET(bvnc, CORE_ID__PBVNC__BRANCH_ID); -+ if (version->b != 0) { -+ version->v = PVR_CR_FIELD_GET(bvnc, CORE_ID__PBVNC__VERSION_ID); -+ version->n = PVR_CR_FIELD_GET( -+ bvnc, CORE_ID__PBVNC__NUMBER_OF_SCALABLE_UNITS); -+ version->c = PVR_CR_FIELD_GET(bvnc, CORE_ID__PBVNC__CONFIG_ID); -+ } else { -+ u32 core_rev = PVR_CR_READ32(pvr_dev, CORE_REVISION); -+ u32 core_id = PVR_CR_READ32(pvr_dev, CORE_ID); -+ u16 core_id_config = PVR_CR_FIELD_GET(core_id, CORE_ID_CONFIG); -+ -+ version->b = PVR_CR_FIELD_GET(core_rev, CORE_REVISION_MAJOR); -+ version->v = PVR_CR_FIELD_GET(core_rev, CORE_REVISION_MINOR); -+ version->n = FIELD_GET(0xFF00, core_id_config); -+ version->c = FIELD_GET(0x00FF, core_id_config); -+ } -+} -+ -+/** -+ * pvr_set_dma_info() - Set PowerVR device DMA information -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Sets the DMA mask and max segment size for the PowerVR device. -+ * -+ * Return: -+ * * 0 on success, -+ * * Any error returned by PVR_FEATURE_VALUE(), or -+ * * Any error returned by dma_set_mask(). -+ */ -+ -+static int -+pvr_set_dma_info(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ u16 phys_bus_width; -+ int err; -+ -+ err = PVR_FEATURE_VALUE(pvr_dev, phys_bus_width, &phys_bus_width); -+ if (err) { -+ drm_err(drm_dev, "Failed to get device physical bus width\n"); -+ return err; -+ } -+ -+ /* -+ * See the comment on &pvr_drm_driver.prime_fd_to_handle for an -+ * explanation of the dma_set_mask function and dma_set_max_seg_size -+ * calls below. -+ */ -+ err = dma_set_mask(drm_dev->dev, DMA_BIT_MASK(phys_bus_width)); -+ if (err) { -+ drm_err(drm_dev, "Failed to set DMA mask (err=%d)\n", err); -+ return err; -+ } -+ -+ dma_set_max_seg_size(drm_dev->dev, UINT_MAX); -+ -+ return 0; -+} -+ -+/** -+ * pvr_device_gpu_init() - GPU-specific initialization for a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * -+ * The following steps are taken to ensure the device is ready: -+ * -+ * 1. Read the hardware version information from control registers, -+ * 2. Initialise the hardware feature information, -+ * 3. Setup the device DMA information, -+ * 4. Setup the device-scoped memory context, and -+ * 5. Load firmware into the device. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%ENODEV if the GPU is not supported, -+ * * Any error returned by pvr_set_dma_info(), -+ * * Any error returned by pvr_memory_context_init(), or -+ * * Any error returned by pvr_request_firmware(). -+ */ -+static int -+pvr_device_gpu_init(struct pvr_device *pvr_dev) -+{ -+ int err; -+ -+ pvr_load_hw_version(pvr_dev); -+ -+ err = pvr_device_info_init(pvr_dev); -+ if (err) -+ goto err_out; -+ -+ if (PVR_HAS_FEATURE(pvr_dev, meta)) { -+ pvr_dev->fw_processor_type = PVR_FW_PROCESSOR_TYPE_META; -+ } else if (PVR_HAS_FEATURE(pvr_dev, mips)) { -+ pvr_dev->fw_processor_type = PVR_FW_PROCESSOR_TYPE_MIPS; -+ } else if (PVR_HAS_FEATURE(pvr_dev, riscv_fw_processor)) { -+ pvr_dev->fw_processor_type = PVR_FW_PROCESSOR_TYPE_RISCV; -+ } else { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = pvr_set_dma_info(pvr_dev); -+ if (err) -+ goto err_out; -+ -+ pvr_dev->kernel_vm_ctx = pvr_vm_create_context(pvr_dev); -+ if (IS_ERR(pvr_dev->kernel_vm_ctx)) { -+ err = PTR_ERR(pvr_dev->kernel_vm_ctx); -+ goto err_out; -+ } -+ -+ err = pvr_request_firmware(pvr_dev); -+ if (err) -+ goto err_vm_ctx_destroy; -+ -+ err = pvr_fw_init(pvr_dev); -+ if (err) -+ goto err_release_firmware; -+ -+ return 0; -+ -+err_release_firmware: -+ release_firmware(pvr_dev->fw); -+ -+err_vm_ctx_destroy: -+ pvr_vm_destroy_context(pvr_dev->kernel_vm_ctx, true); -+ pvr_dev->kernel_vm_ctx = NULL; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_device_gpu_fini() - GPU-specific deinitialization for a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ */ -+static void -+pvr_device_gpu_fini(struct pvr_device *pvr_dev) -+{ -+ pvr_fw_fini(pvr_dev); -+ release_firmware(pvr_dev->fw); -+ -+ pvr_vm_destroy_context(pvr_dev->kernel_vm_ctx, true); -+} -+ -+/** -+ * pvr_device_init() - Initialize a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * -+ * If this function returns successfully, the device will have been fully -+ * initialized. Otherwise, any parts of the device initialized before an error -+ * occurs will be de-initialized before returning. -+ * -+ * NOTE: The initialization steps currently taken are the bare minimum required -+ * to read from the control registers. The device is unlikely to function -+ * until further initialization steps are added. [This note should be -+ * removed when that happens.] -+ * -+ * Return: -+ * * 0 on success, -+ * * Any error returned by pvr_device_reg_init(), -+ * * Any error returned by pvr_device_clk_init(), or -+ * * Any error returned by pvr_device_gpu_init(). -+ */ -+int -+pvr_device_init(struct pvr_device *pvr_dev) -+{ -+ int err; -+ -+ /* Map the control registers into memory. */ -+ err = pvr_device_reg_init(pvr_dev); -+ if (err) -+ return err; -+ -+ /* Enable and initialize clocks required for the device to operate. */ -+ err = pvr_device_clk_init(pvr_dev); -+ if (err) -+ goto err_device_reg_fini; -+ -+ if (pvr_dev->vendor.callbacks && -+ pvr_dev->vendor.callbacks->power_enable) { -+ err = pvr_dev->vendor.callbacks->power_enable(pvr_dev); -+ if (err) -+ goto err_device_clk_fini; -+ } -+ -+ err = pvr_device_irq_init(pvr_dev); -+ if (err) -+ goto err_vendor_power_disable; -+ -+ /* Perform GPU-specific initialization steps. */ -+ err = pvr_device_gpu_init(pvr_dev); -+ if (err) -+ goto err_device_irq_fini; -+ -+ return 0; -+ -+err_device_irq_fini: -+ pvr_device_irq_fini(pvr_dev); -+ -+err_vendor_power_disable: -+ if (pvr_dev->vendor.callbacks && -+ pvr_dev->vendor.callbacks->power_disable) -+ pvr_dev->vendor.callbacks->power_disable(pvr_dev); -+ -+err_device_clk_fini: -+ pvr_device_clk_fini(pvr_dev); -+ -+err_device_reg_fini: -+ pvr_device_reg_fini(pvr_dev); -+ -+ return err; -+} -+ -+/** -+ * pvr_device_fini() - Deinitialize a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ */ -+void -+pvr_device_fini(struct pvr_device *pvr_dev) -+{ -+ /* -+ * Deinitialization stages are performed in reverse order compared to -+ * the initialization stages in pvr_device_init(). -+ */ -+ pvr_device_gpu_fini(pvr_dev); -+ pvr_device_irq_fini(pvr_dev); -+ if (pvr_dev->vendor.callbacks && -+ pvr_dev->vendor.callbacks->power_disable) -+ pvr_dev->vendor.callbacks->power_disable(pvr_dev); -+ pvr_device_clk_fini(pvr_dev); -+ pvr_device_reg_fini(pvr_dev); -+ -+ /* TODO: Remaining deinitialization steps */ -+} -diff --git a/drivers/gpu/drm/imagination/pvr_device.h b/drivers/gpu/drm/imagination/pvr_device.h -new file mode 100644 -index 000000000000..216ff9ae6fcb ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_device.h -@@ -0,0 +1,776 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_DEVICE_H__ -+#define __PVR_DEVICE_H__ -+ -+#include "pvr_ccb.h" -+#include "pvr_device_info.h" -+#include "pvr_fw_trace.h" -+#include "pvr_vendor.h" -+#include "pvr_vm.h" -+ -+#include <drm/drm_device.h> -+#include <drm/drm_file.h> -+#include <drm/drm_mm.h> -+ -+#include <linux/bits.h> -+#include <linux/compiler_attributes.h> -+#include <linux/compiler_types.h> -+#include <linux/io.h> -+#include <linux/iopoll.h> -+#include <linux/kernel.h> -+#include <linux/math.h> -+#include <linux/types.h> -+#include <linux/wait.h> -+#include <linux/workqueue.h> -+#include <linux/xarray.h> -+ -+/* Forward declaration from <linux/clk.h>. */ -+struct clk; -+ -+/* Forward declaration from <linux/firmware.h>. */ -+struct firmware; -+ -+/* Forward declaration from "pvr_fw.h". */ -+struct pvr_fw_funcs; -+ -+/** -+ * struct pvr_version - Hardware version information for a PowerVR device -+ * @b: Branch ID. -+ * @v: Version ID. -+ * @n: Number of scalable units. -+ * @c: Config ID. -+ */ -+struct pvr_version { -+ u16 b, v, n, c; -+}; -+ -+/** -+ * struct pvr_fw_version - Firmware version information -+ * @major: Major version number. -+ * @minor: Minor version number. -+ */ -+struct pvr_fw_version { -+ u16 major, minor; -+}; -+ -+/** -+ * struct pvr_vendor - Vendor specific data for @pvr_device. -+ */ -+struct pvr_vendor { -+ /** -+ * @callbacks: Callback functions for vendor specific functionality. -+ * -+ * May be %NULL. -+ */ -+ const struct pvr_vendor_callbacks *callbacks; -+ -+ /** @data: Vendor specific data. */ -+ void *data; -+}; -+ -+/** -+ * struct pvr_device - powervr-specific wrapper for &struct drm_device -+ */ -+struct pvr_device { -+ /** -+ * @base: The underlying &struct drm_device. -+ * -+ * Do not access this member directly, instead call -+ * from_pvr_device(). -+ */ -+ struct drm_device base; -+ -+ /** @version: Hardware version detected at runtime. */ -+ struct pvr_version version; -+ -+ /** -+ * @features: Hardware feature information. -+ * -+ * Do not access this member directly, instead use PVR_HAS_FEATURE() -+ * or PVR_FEATURE_VALUE() macros. -+ */ -+ struct pvr_device_features features; -+ -+ /** -+ * @quirks: Hardware quirk information. -+ * -+ * Do not access this member directly, instead use PVR_HAS_QUIRK(). -+ */ -+ struct pvr_device_quirks quirks; -+ -+ /** @fw_version: Firmware version detected at runtime. */ -+ struct pvr_fw_version fw_version; -+ -+ /** @regs_resource: Resource representing device control registers. */ -+ struct resource *regs_resource; -+ -+ /** -+ * @regs: Device control registers. -+ * -+ * These are mapped into memory when the device is initialized; that -+ * location is where this pointer points. -+ */ -+ void __iomem *regs; -+ -+ /** @core_clk: General core clock. */ -+ struct clk *core_clk; -+ -+ /** @sys_clk: System bus clock. */ -+ struct clk *sys_clk; -+ -+ /** @mem_clk: Memory clock. */ -+ struct clk *mem_clk; -+ -+ /** @irq: IRQ number. */ -+ int irq; -+ -+ /** @irq_wq: Workqueue for actions triggered off the IRQ handler. */ -+ struct workqueue_struct *irq_wq; -+ -+ /** @kccb_rtn_q: Waitqueue for KCCB command return waiters. */ -+ wait_queue_head_t kccb_rtn_q; -+ -+ /** @fw: Handle to the firmware loaded into the device. */ -+ const struct firmware *fw; -+ -+ /** @vendor: Vendor specific device data. */ -+ struct pvr_vendor vendor; -+ -+ /** @kccb: Kernel CCB. */ -+ struct pvr_ccb kccb; -+ -+ /** @fwccb: Firmware CCB. */ -+ struct pvr_ccb fwccb; -+ -+ /** @fwccb_work: Work item for FWCCB processing. */ -+ struct work_struct fwccb_work; -+ -+ /** @fence_work: Work item for fence processing. */ -+ struct work_struct fence_work; -+ -+ /** @kccb_rtn_obj: Object representing KCCB return slots. */ -+ struct pvr_fw_object *kccb_rtn_obj; -+ -+ /** -+ * @kccb_rtn: Pointer to CPU mapping of KCCB return slots. Must be -+ * accessed by READ_ONCE()/WRITE_ONCE(). -+ */ -+ u32 *kccb_rtn; -+ -+ /** @kernel_vm_ctx: TODO */ -+ struct pvr_vm_context *kernel_vm_ctx; -+ -+ /** @fw_mm: Firmware address space allocator. */ -+ struct drm_mm fw_mm; -+ -+ /** @fw_mm_lock: Lock protecting access to &fw_mm. */ -+ spinlock_t fw_mm_lock; -+ -+ /** @fw_mm_base: Base address of address space managed by @fw_mm. */ -+ u64 fw_mm_base; -+ -+ /** @fw_code_obj: Object representing firmware code. */ -+ struct pvr_fw_object *fw_code_obj; -+ -+ /** @fw_data_obj: Object representing firmware data. */ -+ struct pvr_fw_object *fw_data_obj; -+ -+ /** -+ * @fw_core_code_obj: Object representing firmware core code. May be -+ * %NULL if firmware does not contain this section. -+ */ -+ struct pvr_fw_object *fw_core_code_obj; -+ -+ /** -+ * @fw_core_data_obj: Object representing firmware core data. May be -+ * %NULL if firmware does not contain this section. -+ */ -+ struct pvr_fw_object *fw_core_data_obj; -+ -+ /** -+ * @fwif_connection_ctl_obj: Object representing FWIF connection control -+ * structure. -+ */ -+ struct pvr_fw_object *fwif_connection_ctl_obj; -+ -+ /** -+ * @fwif_connection_ctl: Pointer to CPU mapping of FWIF connection -+ * control structure. -+ */ -+ struct rogue_fwif_connection_ctl *fwif_connection_ctl; -+ -+ /** @fw_osinit_obj: Object representing FW OSINIT structure. */ -+ struct pvr_fw_object *fw_osinit_obj; -+ -+ /** @fw_osinit: Pointer to CPU mapping of FW OSINIT structure. */ -+ struct rogue_fwif_osinit *fw_osinit; -+ -+ /** @fw_sysinit_obj: Object representing FW SYSINIT structure. */ -+ struct pvr_fw_object *fw_sysinit_obj; -+ -+ /** @fw_sysinit: Pointer to CPU mapping of FW SYSINIT structure. */ -+ struct rogue_fwif_sysinit *fw_sysinit; -+ -+ /** @fw_osdata_obj: Object representing FW OSDATA structure. */ -+ struct pvr_fw_object *fw_osdata_obj; -+ -+ /** @fw_osdata: Pointer to CPU mapping of FW OSDATA structure. */ -+ struct rogue_fwif_osdata *fw_osdata; -+ -+ /** @fw_hwrinfobuf_obj: Object representing FW hwrinfobuf structure. */ -+ struct pvr_fw_object *fw_hwrinfobuf_obj; -+ -+ /** @fw_sysdata_obj: Object representing FW SYSDATA structure. */ -+ struct pvr_fw_object *fw_sysdata_obj; -+ -+ /** @fw_fault_page_obj: Object representing FW fault page. */ -+ struct pvr_fw_object *fw_fault_page_obj; -+ -+ /** -+ * @fw_gpu_util_fwcb_obj: Object representing FW GPU utilisation control -+ * structure. -+ */ -+ struct pvr_fw_object *fw_gpu_util_fwcb_obj; -+ -+ /** -+ * @fw_runtime_cfg_obj: Object representing FW runtime config -+ * structure. -+ */ -+ struct pvr_fw_object *fw_runtime_cfg_obj; -+ -+ /** @fw_mmucache_sync_obj: Object used as the sync parameter in an MMU cache operation. */ -+ struct pvr_fw_object *fw_mmucache_sync_obj; -+ -+ /** @fw_booted: %true if the firmware has been booted, %false otherwise. */ -+ bool fw_booted; -+ -+ /** @fw_trace: Device firmware trace buffer state. */ -+ struct pvr_fw_trace fw_trace; -+ -+ /** @fence_list_spinlock: Lock protecting accesses to @fence_list. */ -+ spinlock_t fence_list_spinlock; -+ -+ /** @fence_list: List of active fences. */ -+ struct list_head fence_list; -+ -+ /** -+ * @fw_processor_type: FW processor type for this device. Must be one of -+ * %PVR_FW_PROCESSOR_TYPE_*. -+ */ -+ u16 fw_processor_type; -+ -+ /** @fw_funcs: Function table for the FW processor used by this device. */ -+ const struct pvr_fw_funcs *fw_funcs; -+ -+ /** @fw_data: Pointer to data specific to FW processor. */ -+ union { -+ /** @mips_data: Pointer to MIPS-specific data. */ -+ struct pvr_fw_mips_data *mips_data; -+ } fw_data; -+ -+ /** @fw_heap: Firmware heap information. */ -+ struct { -+ /** @gpu_addr: Base address of firmware heap in GPU address space. */ -+ u64 gpu_addr; -+ -+ /** @size: Size of main area of heap. */ -+ u32 size; -+ -+ /** @offset_mask: Mask for offsets within FW heap. */ -+ u32 offset_mask; -+ -+ /** @raw_size: Raw size of heap, including reserved areas. */ -+ u32 raw_size; -+ -+ /** @log2_size: Log2 of raw size of heap. */ -+ u32 log2_size; -+ -+ /** @config_offset: Offset of config area within heap. */ -+ u32 config_offset; -+ -+ /** @reserved_size: Size of reserved area in heap. */ -+ u32 reserved_size; -+ } fw_heap_info; -+}; -+ -+/** -+ * struct pvr_file - powervr-specific data to be assigned to &struct -+ * drm_file.driver_priv -+ */ -+struct pvr_file { -+ /** -+ * @file: A reference to the parent &struct drm_file. -+ * -+ * Do not access this member directly, instead call from_pvr_file(). -+ */ -+ struct drm_file *file; -+ -+ /** -+ * @pvr_dev: A reference to the powervr-specific wrapper for the -+ * associated device. Saves on repeated calls to -+ * to_pvr_device(). -+ */ -+ struct pvr_device *pvr_dev; -+ -+ /** -+ * @contexts: Array of contexts belonging to this file. Array members -+ * are of type "struct pvr_context *". -+ */ -+ struct xarray contexts; -+ -+ /** -+ * @objects: Array of objects belonging to this file. Array members -+ * are of type "struct pvr_object *". -+ */ -+ struct xarray objects; -+ -+ /** @free_list_id: Next ID to be assigned when creating a free list. */ -+ atomic_t free_list_id; -+ -+ /** @ctx_id: Next ID to be assigned when creating a context. */ -+ atomic_t ctx_id; -+ -+ /** @user_vm_ctx: TODO */ -+ struct pvr_vm_context *user_vm_ctx; -+ -+ /** @fw_mem_ctx_obj: Firmware object representing firmware memory context. */ -+ struct pvr_fw_object *fw_mem_ctx_obj; -+}; -+ -+/** -+ * PVR_HAS_FEATURE() - Tests whether a PowerVR device has a given feature -+ * @pvr_dev: [IN] Target PowerVR device. -+ * @feature: [IN] Hardware feature name. -+ * -+ * Feature names are derived from those found in &struct pvr_device_features by -+ * dropping the 'has_' prefix, which is applied by this macro. -+ * -+ * Return: -+ * * true if the named feature is present in the hardware -+ * * false if the named feature is not present in the hardware -+ */ -+#define PVR_HAS_FEATURE(pvr_dev, feature) ((pvr_dev)->features.has_##feature) -+ -+/** -+ * PVR_FEATURE_VALUE() - Gets a PowerVR device feature value -+ * @pvr_dev: [IN] Target PowerVR device. -+ * @feature: [IN] Feature name. -+ * @value_out: [OUT] Feature value. -+ * -+ * This macro will get a feature value for those features that have values. -+ * -+ * Feature names are derived from those found in &struct pvr_device_features by -+ * dropping the 'has_' prefix. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL if the named feature is not present in the hardware -+ */ -+#define PVR_FEATURE_VALUE(pvr_dev, feature, value_out) \ -+ ({ \ -+ struct pvr_device *__pvr_dev = pvr_dev; \ -+ int __ret = -EINVAL; \ -+ if (__pvr_dev->features.has_##feature) { \ -+ *(value_out) = __pvr_dev->features.feature; \ -+ __ret = 0; \ -+ } \ -+ __ret; \ -+ }) -+ -+/** -+ * PVR_HAS_QUIRK() - Tests whether a physical device has a given quirk -+ * @pvr_dev: [IN] Target PowerVR device. -+ * @quirk: [IN] Hardware quirk name. -+ * -+ * Quirk numbers are derived from those found in #pvr_device_quirks by -+ * dropping the 'has_brn' prefix, which is applied by this macro. -+ * -+ * Returns -+ * * true if the quirk is present in the hardware, or -+ * * false if the quirk is not present in the hardware. -+ */ -+#define PVR_HAS_QUIRK(pvr_dev, quirk) ((pvr_dev)->quirks.has_brn##quirk) -+ -+static __always_inline struct drm_device * -+from_pvr_device(struct pvr_device *pvr_dev) -+{ -+ return &pvr_dev->base; -+} -+ -+static __always_inline struct pvr_device * -+to_pvr_device(struct drm_device *drm_dev) -+{ -+ return container_of(drm_dev, struct pvr_device, base); -+} -+ -+static __always_inline struct drm_file * -+from_pvr_file(struct pvr_file *pvr_file) -+{ -+ return pvr_file->file; -+} -+ -+static __always_inline struct pvr_file * -+to_pvr_file(struct drm_file *file) -+{ -+ return file->driver_priv; -+} -+ -+/** -+ * PVR_PACKED_BVNC() - Packs B, V, N and C values into a 64-bit unsigned integer -+ * @b: Branch ID. -+ * @v: Version ID. -+ * @n: Number of scalable units. -+ * @c: Config ID. -+ * -+ * The packed layout is as follows: -+ * -+ * +--------+--------+--------+-------+ -+ * | 63..48 | 47..32 | 31..16 | 15..0 | -+ * +========+========+========+=======+ -+ * | B | V | N | C | -+ * +--------+--------+--------+-------+ -+ * -+ * pvr_version_to_packed_bvnc() should be used instead of this macro when a -+ * &struct pvr_version is available in order to ensure proper type checking. -+ * -+ * Return: Packed BVNC. -+ */ -+/* clang-format off */ -+#define PVR_PACKED_BVNC(b, v, n, c) \ -+ ((((u64)(b) & GENMASK_ULL(15, 0)) << 48) | \ -+ (((u64)(v) & GENMASK_ULL(15, 0)) << 32) | \ -+ (((u64)(n) & GENMASK_ULL(15, 0)) << 16) | \ -+ (((u64)(c) & GENMASK_ULL(15, 0)) << 0)) -+/* clang-format on */ -+ -+/** -+ * pvr_version_to_packed_bvnc() - Packs B, V, N and C values into a 64-bit -+ * unsigned integer -+ * @version: Version information. -+ * -+ * The packed layout is as follows: -+ * -+ * +--------+--------+--------+-------+ -+ * | 63..48 | 47..32 | 31..16 | 15..0 | -+ * +========+========+========+=======+ -+ * | B | V | N | C | -+ * +--------+--------+--------+-------+ -+ * -+ * This should be used in preference to PVR_PACKED_BVNC() when a &struct -+ * pvr_version is available in order to ensure proper type checking. -+ * -+ * Return: Packed BVNC. -+ */ -+static __always_inline u64 -+pvr_version_to_packed_bvnc(struct pvr_version *version) -+{ -+ return PVR_PACKED_BVNC(version->b, version->v, version->n, version->c); -+} -+ -+static __always_inline void -+packed_bvnc_to_pvr_version(u64 bvnc, struct pvr_version *version) -+{ -+ version->b = (bvnc & GENMASK_ULL(63, 48)) >> 48; -+ version->v = (bvnc & GENMASK_ULL(47, 32)) >> 32; -+ version->n = (bvnc & GENMASK_ULL(31, 16)) >> 16; -+ version->c = bvnc & GENMASK_ULL(15, 0); -+} -+ -+int pvr_device_init(struct pvr_device *pvr_dev); -+void pvr_device_fini(struct pvr_device *pvr_dev); -+ -+int -+pvr_device_clk_core_get_freq(struct pvr_device *pvr_dev, u32 *freq_out); -+ -+/** -+ * PVR_CR_READ32() - Read a 32-bit register from a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * -+ * This macro is a wrapper around __pvr_cr_read32(). It applies ROGUE_CR_ prefix -+ * to the provided @reg name, making it behave comparably to the -+ * PVR_CR_FIELD_GET() macro. -+ * -+ * Return: The value of the requested register. -+ */ -+#define PVR_CR_READ32(pvr_dev, reg) __pvr_cr_read32(pvr_dev, ROGUE_CR_##reg) -+ -+/** -+ * PVR_CR_READ64() - Read a 64-bit register from a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * -+ * This macro is a wrapper around __pvr_cr_read64(). It applies ROGUE_CR_ prefix -+ * to the provided @reg name, making it behave comparably to the -+ * PVR_CR_FIELD_GET() macro. -+ * -+ * Return: The value of the requested register. -+ */ -+#define PVR_CR_READ64(pvr_dev, reg) __pvr_cr_read64(pvr_dev, ROGUE_CR_##reg) -+ -+/** -+ * PVR_CR_WRITE32() - Write to a 32-bit register in a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * @val: Value to write. -+ * -+ * This macro is a wrapper around __pvr_cr_write32(). It applies ROGUE_CR_ -+ * prefix to the provided @reg name, making it behave comparably to the -+ * PVR_CR_FIELD_GET() macro. -+ */ -+#define PVR_CR_WRITE32(pvr_dev, reg, val) \ -+ __pvr_cr_write32(pvr_dev, ROGUE_CR_##reg, val) -+ -+/** -+ * PVR_CR_WRITE64() - Write to a 64-bit register in a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * @val: Value to write. -+ * -+ * This macro is a wrapper around __pvr_cr_write64(). It applies ROGUE_CR_ -+ * prefix to the provided @reg name, making it behave comparably to the -+ * PVR_CR_FIELD_GET() macro. -+ */ -+#define PVR_CR_WRITE64(pvr_dev, reg, val) \ -+ __pvr_cr_write64(pvr_dev, ROGUE_CR_##reg, val) -+ -+/** -+ * PVR_CR_FIELD_GET() - Extract a single field from a PowerVR control register -+ * @val: Value of the target register. -+ * @field: Field specifier, as defined in "pvr_rogue_cr_defs.h". -+ * -+ * Return: The extracted field. -+ */ -+#define PVR_CR_FIELD_GET(val, field) FIELD_GET(~ROGUE_CR_##field##_CLRMSK, val) -+ -+/** -+ * __pvr_cr_read32() - Read a 32-bit register from a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * -+ * Do not call this function directly; use the PVR_CR_READ32() macro instead. -+ * -+ * Return: The value of the requested register. -+ */ -+static __always_inline u32 -+__pvr_cr_read32(struct pvr_device *pvr_dev, u32 reg) -+{ -+ return ioread32(pvr_dev->regs + reg); -+} -+ -+/** -+ * __pvr_cr_read64() - Read a 64-bit register from a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * -+ * Do not call this function directly; use the PVR_CR_READ64() macro instead. -+ * -+ * Return: The value of the requested register. -+ */ -+static __always_inline u64 -+__pvr_cr_read64(struct pvr_device *pvr_dev, u32 reg) -+{ -+ return ioread64(pvr_dev->regs + reg); -+} -+ -+/** -+ * __pvr_cr_write32() - Write to a 32-bit register in a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * @val: Value to write. -+ * -+ * Do not call this function directly; use the PVR_CR_WRITE32() macro instead. -+ */ -+static __always_inline void -+__pvr_cr_write32(struct pvr_device *pvr_dev, u32 reg, u32 val) -+{ -+ iowrite32(val, pvr_dev->regs + reg); -+} -+ -+/** -+ * __pvr_cr_write64() - Write to a 64-bit register in a PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ * @reg: Target register. -+ * @val: Value to write. -+ * -+ * Do not call this function directly; use the PVR_CR_WRITE64() macro instead. -+ */ -+static __always_inline void -+__pvr_cr_write64(struct pvr_device *pvr_dev, u32 reg, u64 val) -+{ -+ iowrite64(val, pvr_dev->regs + reg); -+} -+ -+/** -+ * pvr_cr_poll_reg32() - Wait for a 32-bit register to match a given value by -+ * polling -+ * @pvr_dev: Target PowerVR device. -+ * @reg_addr: Address of register. -+ * @reg_value: Expected register value (after masking). -+ * @reg_mask: Mask of bits valid for comparison with @reg_value. -+ * @timeout_usec: Timeout length, in us. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%ETIMEDOUT on timeout. -+ */ -+static __always_inline int -+pvr_cr_poll_reg32(struct pvr_device *pvr_dev, u32 reg_addr, u32 reg_value, -+ u32 reg_mask, u64 timeout_usec) -+{ -+ u32 value; -+ -+ return readl_poll_timeout(pvr_dev->regs + reg_addr, value, -+ (value & reg_mask) == reg_value, 0, timeout_usec); -+} -+ -+/** -+ * pvr_cr_poll_reg64() - Wait for a 64-bit register to match a given value by -+ * polling -+ * @pvr_dev: Target PowerVR device. -+ * @reg_addr: Address of register. -+ * @reg_value: Expected register value (after masking). -+ * @reg_mask: Mask of bits valid for comparison with @reg_value. -+ * @timeout_usec: Timeout length, in us. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%ETIMEDOUT on timeout. -+ */ -+static __always_inline int -+pvr_cr_poll_reg64(struct pvr_device *pvr_dev, u32 reg_addr, u64 reg_value, -+ u64 reg_mask, u64 timeout_usec) -+{ -+ u64 value; -+ -+ return readq_poll_timeout(pvr_dev->regs + reg_addr, value, -+ (value & reg_mask) == reg_value, 0, timeout_usec); -+} -+ -+/** -+ * pvr_round_up_to_cacheline_size() - Round up a provided size to be cacheline -+ * aligned -+ * @pvr_dev: Target PowerVR device. -+ * @size: Initial size, in bytes. -+ * -+ * Returns: -+ * * Size aligned to cacheline size. -+ */ -+static __always_inline size_t -+pvr_round_up_to_cacheline_size(struct pvr_device *pvr_dev, size_t size) -+{ -+ u16 slc_cacheline_size_in_bits = 0; -+ u16 slc_cacheline_size_in_bytes; -+ -+ WARN_ON(!PVR_HAS_FEATURE(pvr_dev, slc_cache_line_size_in_bits)); -+ PVR_FEATURE_VALUE(pvr_dev, slc_cache_line_size_in_bits, -+ &slc_cacheline_size_in_bits); -+ slc_cacheline_size_in_bytes = slc_cacheline_size_in_bits / 8; -+ -+ return round_up(size, slc_cacheline_size_in_bytes); -+} -+ -+/** -+ * DOC: IOCTL validation helpers -+ * -+ * To validate the constraints imposed on IOCTL argument structs, a collection -+ * of macros and helper functions exist in ``pvr_device.h``. -+ * -+ * Of the current helpers, it should only be necessary to call -+ * PVR_IOCTL_UNION_PADDING_CHECK() directly. This macro should be used once in -+ * every code path which extracts a union member from a struct passed from -+ * userspace. -+ */ -+ -+/** -+ * pvr_ioctl_union_padding_check() - Validate that the implicit padding between -+ * the end of a union member and the end of the union itself is zeroed. -+ * @instance: Pointer to the instance of the struct to validate. -+ * @union_offset: Offset into the type of @instance of the target union. Must -+ * be 64-bit aligned. -+ * @union_size: Size of the target union in the type of @instance. Must be -+ * 64-bit aligned. -+ * @member_size: Size of the target member in the target union specified by -+ * @union_offset and @union_size. It is assumed that the offset of the target -+ * member is zero relative to @union_offset. Must be 64-bit aligned. -+ * -+ * You probably want to use PVR_IOCTL_UNION_PADDING_CHECK() instead of calling -+ * this function directly, since that macro abstracts away much of the setup, -+ * and also provides some static validation. See its docs for details. -+ * -+ * Return: -+ * * %true if every byte between the end of the used member of the union and -+ * the end of that union is zeroed, or -+ * * %false otherwise. -+ */ -+static __always_inline bool -+pvr_ioctl_union_padding_check(void *instance, size_t union_offset, -+ size_t union_size, size_t member_size) -+{ -+ /* -+ * void pointer arithmetic is technically illegal - cast to a byte -+ * pointer so this addition works safely. -+ */ -+ void *padding_start = ((u8 *)instance) + union_offset + member_size; -+ size_t padding_size = union_size - member_size; -+ -+ return !memchr_inv(padding_start, 0, padding_size); -+} -+ -+/** -+ * PVR_STATIC_ASSERT_64BIT_ALIGNED() - Inline assertion for 64-bit alignment. -+ * @static_expr_: Target expression to evaluate. -+ * -+ * If @static_expr_ does not evaluate to a constant integer which would be a -+ * 64-bit aligned address (i.e. a multiple of 8), compilation will fail. -+ * -+ * Return: -+ * The value of @static_expr_. -+ */ -+#define PVR_STATIC_ASSERT_64BIT_ALIGNED(static_expr_) \ -+ ({ \ -+ static_assert(((static_expr_) & (sizeof(u64) - 1)) == 0); \ -+ (static_expr_); \ -+ }) -+ -+/** -+ * PVR_IOCTL_UNION_PADDING_CHECK() - Validate that the implicit padding between -+ * the end of a union member and the end of the union itself is zeroed. -+ * @struct_instance_: An expression which evaluates to a pointer to a UAPI data -+ * struct. -+ * @union_: The name of the union member of @struct_instance_ to check. If the -+ * union member is nested within the type of @struct_instance_, this may -+ * contain the member access operator ("."). -+ * @member_: The name of the member of @union_ to assess. -+ * -+ * This is a wrapper around pvr_ioctl_union_padding_check() which performs -+ * alignment checks and simplifies things for the caller. -+ * -+ * Return: -+ * * %true if every byte in @struct_instance_ between the end of @member_ and -+ * the end of @union_ is zeroed, or -+ * * %false otherwise. -+ */ -+#define PVR_IOCTL_UNION_PADDING_CHECK(struct_instance_, union_, member_) \ -+ ({ \ -+ typeof(struct_instance_) __instance = (struct_instance_); \ -+ size_t __union_offset = PVR_STATIC_ASSERT_64BIT_ALIGNED( \ -+ offsetof(typeof(*__instance), union_)); \ -+ size_t __union_size = PVR_STATIC_ASSERT_64BIT_ALIGNED( \ -+ sizeof(__instance->union_)); \ -+ size_t __member_size = PVR_STATIC_ASSERT_64BIT_ALIGNED( \ -+ sizeof(__instance->union_.member_)); \ -+ pvr_ioctl_union_padding_check(__instance, __union_offset, \ -+ __union_size, __member_size); \ -+ }) -+ -+/** Reserve handle 0 as invalid for xarrays. */ -+#define xa_limit_1_32b XA_LIMIT(1, UINT_MAX) -+ -+#define PVR_FW_PROCESSOR_TYPE_META 0 -+#define PVR_FW_PROCESSOR_TYPE_MIPS 1 -+#define PVR_FW_PROCESSOR_TYPE_RISCV 2 -+ -+#endif /* __PVR_DEVICE_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_device_info.c b/drivers/gpu/drm/imagination/pvr_device_info.c -new file mode 100644 -index 000000000000..eb437dc7d346 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_device_info.c -@@ -0,0 +1,108 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_device_info.h" -+ -+#include <drm/drm_print.h> -+ -+#include <linux/types.h> -+ -+const struct pvr_device_features pvr_device_4_V_2_51 = { -+ .has_meta = true, -+ .has_meta_coremem_size = true, -+ .has_num_clusters = true, -+ .has_phys_bus_width = true, -+ .has_slc_cache_line_size_in_bits = true, -+ .has_virtual_address_space_bits = true, -+ -+ .meta = true, -+ .meta_coremem_size = 32, -+ .num_clusters = 2, -+ .phys_bus_width = 40, -+ .slc_cache_line_size_in_bits = 512, -+ .virtual_address_space_bits = 40, -+}; -+ -+const struct pvr_device_quirks pvr_device_quirks_4_40_2_51 = { -+ .has_brn63142 = true, -+}; -+ -+const struct pvr_device_features pvr_device_33_V_11_3 = { -+ .has_mips = true, -+ .has_num_clusters = true, -+ .has_phys_bus_width = true, -+ .has_slc_cache_line_size_in_bits = true, -+ .has_virtual_address_space_bits = true, -+ -+ .mips = true, -+ .num_clusters = 1, -+ .phys_bus_width = 36, -+ .slc_cache_line_size_in_bits = 512, -+ .virtual_address_space_bits = 40, -+}; -+ -+const struct pvr_device_quirks pvr_device_quirks_33_15_11_3 = { -+}; -+ -+const struct pvr_device_features pvr_device_36_V_104_796 = { -+ .has_num_clusters = true, -+ .has_phys_bus_width = true, -+ .has_riscv_fw_processor = true, -+ .has_slc_cache_line_size_in_bits = true, -+ .has_virtual_address_space_bits = true, -+ -+ .num_clusters = 1, -+ .phys_bus_width = 36, -+ .riscv_fw_processor = true, -+ .slc_cache_line_size_in_bits = 512, -+ .virtual_address_space_bits = 40, -+}; -+ -+const struct pvr_device_quirks pvr_device_quirks_36_53_104_796 = { -+}; -+ -+/** -+ * pvr_device_info_init() - Initialize a PowerVR device's hardware features and quirks -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This function relies on &pvr_dev.version having already been initialized. If -+ * PowerVR device version is supported then sets &pvr_dev.features and &pvr_dev.quirks. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%ENODEV if the device is not supported. -+ */ -+int -+pvr_device_info_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct pvr_version *version = &pvr_dev->version; -+ const u64 bvnc = pvr_version_to_packed_bvnc(version); -+ -+ /* -+ * This macro results in a "Macros with multiple statements should be -+ * enclosed in a do - while loop" checkpatch error. However, following -+ * this advice would make the macro look a bit odd and isn't necessary -+ * in this particular case, as the macro has a very specific use and a -+ * very limited lifetime. The error can therefore be ignored. -+ */ -+#define CASE_PACKED_BVNC_DEVICE_INFO(b, v, n, c) \ -+ case PVR_PACKED_BVNC(b, v, n, c): \ -+ pvr_dev->features = pvr_device_##b##_V_##n##_##c; \ -+ pvr_dev->quirks = pvr_device_quirks_##b##_##v##_##n##_##c; \ -+ return 0 -+ -+ switch (bvnc) { -+ CASE_PACKED_BVNC_DEVICE_INFO(4, 40, 2, 51); -+ CASE_PACKED_BVNC_DEVICE_INFO(33, 15, 11, 3); -+ CASE_PACKED_BVNC_DEVICE_INFO(36, 53, 104, 796); -+ } -+ -+#undef CASE_PACKED_BVNC_DEVICE_INFO -+ -+ drm_warn(drm_dev, "Unsupported BVNC: %u.%u.%u.%u\n", version->b, -+ version->v, version->n, version->c); -+ -+ return -ENODEV; -+} -diff --git a/drivers/gpu/drm/imagination/pvr_device_info.h b/drivers/gpu/drm/imagination/pvr_device_info.h -new file mode 100644 -index 000000000000..2bb571bd03c5 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_device_info.h -@@ -0,0 +1,54 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_DEVICE_INFO_H__ -+#define __PVR_DEVICE_INFO_H__ -+ -+#include <linux/types.h> -+ -+struct pvr_device; -+ -+/** -+ * struct pvr_device_features - Hardware feature information -+ */ -+struct pvr_device_features { -+ bool has_meta : 1; -+ bool has_meta_coremem_size : 1; -+ bool has_mips : 1; -+ bool has_num_clusters : 1; -+ bool has_phys_bus_width : 1; -+ bool has_riscv_fw_processor : 1; -+ bool has_slc_cache_line_size_in_bits : 1; -+ bool has_virtual_address_space_bits : 1; -+ -+ bool meta; -+ u32 meta_coremem_size; -+ bool mips; -+ u16 num_clusters; -+ u16 phys_bus_width; -+ bool riscv_fw_processor; -+ u16 slc_cache_line_size_in_bits; -+ u16 virtual_address_space_bits; -+}; -+ -+/** -+ * struct pvr_device_quirks - Hardware quirk information -+ */ -+struct pvr_device_quirks { -+ bool has_brn63142 : 1; -+}; -+ -+int pvr_device_info_init(struct pvr_device *pvr_dev); -+ -+/* -+ * Meta cores -+ * -+ * These are the values for the 'meta' feature when the feature is present -+ * (as per @pvr_device_features)/ -+ */ -+#define PVR_META_MTP218 (1) -+#define PVR_META_MTP219 (2) -+#define PVR_META_LTP218 (3) -+#define PVR_META_LTP217 (4) -+ -+#endif /* __PVR_DEVICE_INFO_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_drv.c b/drivers/gpu/drm/imagination/pvr_drv.c -new file mode 100644 -index 000000000000..cca639fc1aa6 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_drv.c -@@ -0,0 +1,885 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_context.h" -+#include "pvr_device.h" -+#include "pvr_drv.h" -+#include "pvr_gem.h" -+#include "pvr_job.h" -+#include "pvr_object.h" -+#include "pvr_rogue_fwif_shared.h" -+#include "pvr_fw_trace.h" -+ -+#include <uapi/drm/pvr_drm.h> -+ -+#include <drm/drm_device.h> -+#include <drm/drm_drv.h> -+#include <drm/drm_file.h> -+#include <drm/drm_ioctl.h> -+ -+#include <linux/err.h> -+#include <linux/export.h> -+#include <linux/fs.h> -+#include <linux/limits.h> -+#include <linux/mod_devicetable.h> -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#include <linux/of_device.h> -+#include <linux/of_platform.h> -+#include <linux/overflow.h> -+#include <linux/platform_device.h> -+#include <linux/xarray.h> -+ -+/** -+ * DOC: PowerVR Graphics Driver -+ * -+ * This driver supports the following PowerVR graphics cores from Imagination -+ * Technologies: -+ * -+ * * GX6250 (found in MediaTek MT8173) -+ */ -+ -+bool pvr_fw_trace_enable; -+module_param(pvr_fw_trace_enable, bool, 0); -+MODULE_PARM_DESC(pvr_fw_trace_enable, "Enable FW trace at module startup"); -+ -+/** -+ * pvr_ioctl_create_bo() - IOCTL to create a GEM buffer object. -+ * @drm_dev: [IN] Target DRM device. -+ * @raw_args: [IN/OUT] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_create_bo_args. -+ * @file: [IN] DRM file-private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_CREATE_BO. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if the value of &drm_pvr_ioctl_create_bo_args.size is zero -+ * or wider than &typedef size_t, -+ * * -%EINVAL if any bits in &drm_pvr_ioctl_create_bo_args.flags that are -+ * reserved or undefined are set, -+ * * -%EINVAL if any padding fields in &drm_pvr_ioctl_create_bo_args are not -+ * zero, -+ * * Any error encountered while creating the object (see -+ * pvr_gem_object_create()), or -+ * * Any error encountered while transferring ownership of the object into a -+ * userspace-accessible handle (see pvr_gem_object_into_handle()). -+ */ -+int -+pvr_ioctl_create_bo(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_create_bo_args *args = raw_args; -+ struct pvr_device *pvr_dev = to_pvr_device(drm_dev); -+ struct pvr_file *pvr_file = to_pvr_file(file); -+ -+ struct pvr_gem_object *pvr_obj; -+ size_t sanitized_size; -+ size_t real_size; -+ -+ int err; -+ -+ /* All padding fields must be zeroed. */ -+ if (args->_padding_c != 0) -+ return -EINVAL; -+ -+ /* -+ * On 64-bit platforms (our primary target), size_t is a u64. However, -+ * on other architectures we have to check for overflow when casting -+ * down to size_t from u64. -+ * -+ * We also disallow zero-sized allocations, and reserved (kernel-only) -+ * flags. -+ */ -+ if (args->size > SIZE_MAX || args->size == 0 || -+ args->flags & PVR_BO_RESERVED_MASK) { -+ return -EINVAL; -+ } -+ -+ sanitized_size = (size_t)args->size; -+ -+ /* -+ * Create a buffer object and transfer ownership to a userspace- -+ * accessible handle. -+ */ -+ pvr_obj = pvr_gem_object_create(pvr_dev, sanitized_size, args->flags); -+ if (IS_ERR(pvr_obj)) { -+ err = PTR_ERR(pvr_obj); -+ goto err_out; -+ } -+ -+ /* -+ * Store the actual size of the created buffer object. We can't fetch -+ * this after this point because we will no longer have a reference to -+ * &pvr_obj. -+ */ -+ real_size = pvr_gem_object_size(pvr_obj); -+ -+ /* This function will not modify &args->handle unless it succeeds. */ -+ err = pvr_gem_object_into_handle(pvr_obj, pvr_file, &args->handle); -+ if (err) -+ goto err_destroy_obj; -+ -+ /* -+ * Now write the real size back to the args struct, after no further -+ * errors can occur. -+ */ -+ args->size = real_size; -+ -+ return 0; -+ -+err_destroy_obj: -+ /* -+ * GEM objects are refcounted, so there is no explicit destructor -+ * function. Instead, we release the singular reference we currently -+ * hold on the object and let GEM take care of the rest. -+ */ -+ pvr_gem_object_put(pvr_obj); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_ioctl_get_bo_mmap_offset() - IOCTL to generate a "fake" offset to be -+ * used when calling mmap() from userspace to map the given GEM buffer object -+ * @drm_dev: [IN] DRM device (unused). -+ * @raw_args: [IN/OUT] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_get_bo_mmap_offset_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET. -+ * -+ * This IOCTL does *not* perform an mmap. See the docs on -+ * &struct drm_pvr_ioctl_get_bo_mmap_offset_args for details. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%ENOENT if the handle does not reference a valid GEM buffer object, -+ * * -%EINVAL if any padding fields in &struct -+ * drm_pvr_ioctl_get_bo_mmap_offset_args are not zero, or -+ * * Any error returned by drm_gem_create_mmap_offset(). -+ */ -+int -+pvr_ioctl_get_bo_mmap_offset(__always_unused struct drm_device *drm_dev, -+ void *raw_args, struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_get_bo_mmap_offset_args *args = raw_args; -+ struct pvr_file *pvr_file = to_pvr_file(file); -+ -+ struct pvr_gem_object *pvr_obj; -+ struct drm_gem_object *gem_obj; -+ int ret; -+ -+ /* All padding fields must be zeroed. */ -+ if (args->_padding_4 != 0) -+ return -EINVAL; -+ -+ /* -+ * Obtain a kernel reference to the buffer object. This reference is -+ * counted and must be manually dropped before returning. If a buffer -+ * object cannot be found for the specified handle, return -%ENOENT (No -+ * such file or directory). -+ */ -+ pvr_obj = pvr_gem_object_from_handle(pvr_file, args->handle); -+ if (!pvr_obj) -+ return -ENOENT; -+ -+ gem_obj = from_pvr_gem_object(pvr_obj); -+ -+ /* -+ * Allocate a fake offset which can be used in userspace calls to mmap -+ * on the DRM device file. If this fails, return the error code. This -+ * operation is idempotent. -+ */ -+ ret = drm_gem_create_mmap_offset(gem_obj); -+ if (ret != 0) { -+ /* Drop our reference to the buffer object. */ -+ drm_gem_object_put(gem_obj); -+ return ret; -+ } -+ -+ /* -+ * Read out the fake offset allocated by the earlier call to -+ * drm_gem_create_mmap_offset. -+ */ -+ args->offset = drm_vma_node_offset_addr(&gem_obj->vma_node); -+ -+ /* Drop our reference to the buffer object. */ -+ pvr_gem_object_put(pvr_obj); -+ -+ return 0; -+} -+ -+static __always_inline u64 -+pvr_fw_version_packed(u32 major, u32 minor) -+{ -+ return ((u64)major << 32) | minor; -+} -+ -+/** -+ * pvr_ioctl_get_param() - IOCTL to get information about a device -+ * @drm_dev: [IN] DRM device. -+ * @raw_args: [IN/OUT] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_get_param_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_GET_PARAM. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if the value of &struct drm_pvr_ioctl_get_param_args.param is -+ * not one of those in &enum drm_pvr_param or is %DRM_PVR_PARAM_INVALID, or -+ * * -%EINVAL if any padding fields in &struct drm_pvr_ioctl_get_param_args -+ * are not zero. -+ */ -+int -+pvr_ioctl_get_param(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct pvr_device *pvr_dev = to_pvr_device(drm_dev); -+ struct drm_pvr_ioctl_get_param_args *args = raw_args; -+ u64 value; -+ -+ /* All padding fields must be zeroed. */ -+ if (args->_padding_4 != 0) -+ return -EINVAL; -+ -+ switch (args->param) { -+ case DRM_PVR_PARAM_GPU_ID: -+ value = pvr_version_to_packed_bvnc(&pvr_dev->version); -+ break; -+ case DRM_PVR_PARAM_HWRT_NUM_GEOMDATAS: -+ value = ROGUE_FWIF_NUM_GEOMDATAS; -+ break; -+ case DRM_PVR_PARAM_HWRT_NUM_RTDATAS: -+ value = ROGUE_FWIF_NUM_RTDATAS; -+ break; -+ case DRM_PVR_PARAM_HWRT_NUM_FREELISTS: -+ value = ROGUE_FWIF_NUM_RTDATA_FREELISTS; -+ break; -+ case DRM_PVR_PARAM_FW_VERSION: -+ value = pvr_fw_version_packed(pvr_dev->fw_version.major, pvr_dev->fw_version.minor); -+ break; -+ case DRM_PVR_PARAM_INVALID: -+ case DRM_PVR_PARAM_MAX: -+ default: -+ return -EINVAL; -+ } -+ -+ args->value = value; -+ -+ return 0; -+} -+ -+/** -+ * pvr_ioctl_create_context() - IOCTL to create a context -+ * @drm_dev: [IN] DRM device. -+ * @raw_args: [IN/OUT] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_create_context_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_CREATE_CONTEXT. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL if provided arguments are invalid, or -+ * * -%EFAULT if arguments can't be copied from userspace, or -+ * * Any error returned by pvr_create_render_context(). -+ */ -+int -+pvr_ioctl_create_context(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_create_context_args *args = raw_args; -+ struct pvr_file *pvr_file = file->driver_priv; -+ u32 handle; -+ int err; -+ -+ if (args->flags || !args->data) { -+ /* Context creation flags are currently unused and must be zero. */ -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ switch (args->type) { -+ case DRM_PVR_CTX_TYPE_RENDER: { -+ struct drm_pvr_ioctl_create_render_context_args render_ctx_args; -+ -+ if (copy_from_user(&render_ctx_args, u64_to_user_ptr(args->data), -+ sizeof(render_ctx_args))) { -+ err = -EFAULT; -+ goto err_out; -+ } -+ -+ err = pvr_create_render_context(pvr_file, args, &render_ctx_args, &handle); -+ break; -+ } -+ -+ case DRM_PVR_CTX_TYPE_COMPUTE: { -+ struct drm_pvr_ioctl_create_compute_context_args compute_ctx_args; -+ -+ if (copy_from_user(&compute_ctx_args, u64_to_user_ptr(args->data), -+ sizeof(compute_ctx_args))) { -+ err = -EFAULT; -+ goto err_out; -+ } -+ -+ err = pvr_create_compute_context(pvr_file, args, &compute_ctx_args, &handle); -+ break; -+ } -+ -+ -+ default: -+ err = -EINVAL; -+ break; -+ } -+ -+ if (err < 0) -+ goto err_out; -+ -+ args->handle = handle; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_ioctl_destroy_context() - IOCTL to destroy a context -+ * @drm_dev: [IN] DRM device. -+ * @raw_args: [IN/OUT] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_destroy_context_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_DESTROY_CONTEXT. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL if context not in context list. -+ */ -+int -+pvr_ioctl_destroy_context(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_destroy_context_args *args = raw_args; -+ struct pvr_file *pvr_file = file->driver_priv; -+ -+ return pvr_context_destroy(pvr_file, args->handle); -+} -+ -+/** -+ * pvr_ioctl_create_object() - IOCTL to create an object -+ * @drm_dev: [IN] DRM device. -+ * @raw_args: [IN/OUT] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_create_object_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_CREATE_OBJECT. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by pvr_object_create(). -+ */ -+int -+pvr_ioctl_create_object(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_create_object_args *args = raw_args; -+ struct pvr_file *pvr_file = to_pvr_file(file); -+ u32 handle; -+ int err; -+ -+ err = pvr_object_create(pvr_file, args, &handle); -+ if (!err) -+ args->handle = handle; -+ -+ return err; -+} -+ -+/** -+ * pvr_ioctl_destroy_object() - IOCTL to destroy an object -+ * @drm_dev: [IN] DRM device. -+ * @raw_args: [IN] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_destroy_object_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_DESTROY_OBJECT. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL if object not in object list. -+ */ -+int -+pvr_ioctl_destroy_object(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_destroy_object_args *args = raw_args; -+ struct pvr_file *pvr_file = to_pvr_file(file); -+ -+ return pvr_object_destroy(pvr_file, args->handle); -+} -+ -+/** -+ * pvr_ioctl_get_heap_info() - IOCTL to get information on device heaps -+ * @drm_dev: [IN] DRM device. -+ * @raw_args: [IN] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_get_heap_info. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_GET_HEAP_INFO. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EFAULT on failure to write to user buffer. -+ */ -+int -+pvr_ioctl_get_heap_info(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_get_heap_info_args *args = raw_args; -+ -+ return pvr_get_heap_info(to_pvr_device(drm_dev), args); -+} -+ -+/** -+ * pvr_ioctl_vm_op_map() - Sub-operation of pvr_ioctl_vm_op(). -+ * @pvr_file: PowerVR file private data. -+ * @args: The operation-specific part of the calling ioctl args. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_VM_OP when the -+ * &drm_pvr_ioctl_vm_op_args.operation field is set to %DRM_PVR_VM_OP_MAP. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if &drm_pvr_ioctl_vm_op_map_args.flags is not zero, -+ * * -%EINVAL if the bounds specified by &drm_pvr_ioctl_vm_op_map_args.offset -+ * and &drm_pvr_ioctl_vm_op_map_args.size are not valid or do not fall -+ * within the buffer object specified by -+ * &drm_pvr_ioctl_vm_op_map_args.handle, -+ * * -%EINVAL if the bounds specified by -+ * &drm_pvr_ioctl_vm_op_map_args.device_addr and -+ * &drm_pvr_ioctl_vm_op_map_args.size do not form a valid device-virtual -+ * address range which falls entirely within a single heap, or -+ * * -%ENOENT if &drm_pvr_ioctl_vm_op_map_args.handle does not refer to a -+ * valid PowerVR buffer object. -+ */ -+static int -+pvr_ioctl_vm_op_map(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_vm_op_map_args *args) -+{ -+ struct pvr_device *pvr_dev = pvr_file->pvr_dev; -+ struct pvr_vm_context *vm_ctx = pvr_file->user_vm_ctx; -+ -+ struct pvr_gem_object *pvr_obj; -+ size_t pvr_obj_size; -+ -+ u64 offset_plus_size; -+ int err; -+ -+ /* Initial validation of args. */ -+ if (args->flags != 0 || -+ check_add_overflow(args->offset, args->size, &offset_plus_size) || -+ !pvr_find_heap_containing(pvr_dev, args->device_addr, args->size)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ pvr_obj = pvr_gem_object_from_handle(pvr_file, args->handle); -+ if (!pvr_obj) { -+ err = -ENOENT; -+ goto err_out; -+ } -+ -+ pvr_obj_size = pvr_gem_object_size(pvr_obj); -+ -+ /* -+ * Validate offset and size args. The alignment of these will be -+ * checked when mapping; for now just check that they're within valid -+ * bounds -+ */ -+ if (args->offset >= pvr_obj_size || offset_plus_size > pvr_obj_size) { -+ err = -EINVAL; -+ goto err_put_pvr_object; -+ } -+ -+ /* -+ * If the caller has specified that the entire object should be mapped, -+ * use the more efficient pvr_vm_map(). -+ */ -+ if (args->offset == 0 && args->size == pvr_obj_size) { -+ err = pvr_vm_map(vm_ctx, pvr_obj, args->device_addr); -+ } else { -+ err = pvr_vm_map_partial(vm_ctx, pvr_obj, args->offset, -+ args->device_addr, args->size); -+ } -+ if (err) -+ goto err_put_pvr_object; -+ -+ /* -+ * In order to set up the mapping, we needed a reference to &pvr_obj. -+ * However, pvr_vm_map() obtains and stores its own reference, so we -+ * must release ours before returning. -+ */ -+ err = 0; -+ goto err_put_pvr_object; -+ -+err_put_pvr_object: -+ pvr_gem_object_put(pvr_obj); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_ioctl_vm_op_unmap() - Sub-operation of pvr_ioctl_vm_op(). -+ * @pvr_file: PowerVR file private data. -+ * @args: The operation-specific part of the calling ioctl args. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_VM_OP when the -+ * &drm_pvr_ioctl_vm_op_args.operation field is set to %DRM_PVR_VM_OP_UNMAP. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if &drm_pvr_ioctl_vm_op_unmap_args.device_addr is not a valid -+ * device page-aligned device-virtual address, or -+ * * -%ENOENT if there is currently no PowerVR buffer object mapped at -+ * &drm_pvr_ioctl_vm_op_unmap_args.device_addr. -+ */ -+static int -+pvr_ioctl_vm_op_unmap(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_vm_op_unmap_args *args) -+{ -+ return pvr_vm_unmap(pvr_file->user_vm_ctx, args->device_addr); -+} -+ -+/** -+ * pvr_ioctl_vm_op() - IOCTL to perform a virtual memory operation. -+ * @drm_dev: [IN] Target DRM device. -+ * @raw_args: [IN] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_vm_op_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_VM_OP. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if any padding fields in &drm_pvr_ioctl_vm_op_args are not zero -+ * (including implicit padding in unions), or -+ * * Any error encountered while processing the selected pvr_ioctl_vm_op_*() -+ * function corresponding to &drm_pvr_ioctl_vm_op_args.operation. -+ */ -+int -+pvr_ioctl_vm_op(__always_unused struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_vm_op_args *args = raw_args; -+ struct pvr_file *pvr_file = to_pvr_file(file); -+ -+ /* All padding fields must be zeroed. */ -+ if (args->_padding_4 != 0) -+ return -EINVAL; -+ -+ /* -+ * We delegate most of the data.* member validation to individual -+ * operation handlers. However, since the implicit union padding -+ * falls outside these members, we must check that ourselves. -+ */ -+ switch (args->operation) { -+ case DRM_PVR_VM_OP_MAP: -+ if (!PVR_IOCTL_UNION_PADDING_CHECK(args, data, map)) -+ return -EINVAL; -+ -+ return pvr_ioctl_vm_op_map(pvr_file, &args->data.map); -+ -+ case DRM_PVR_VM_OP_UNMAP: -+ if (!PVR_IOCTL_UNION_PADDING_CHECK(args, data, unmap)) -+ return -EINVAL; -+ -+ return pvr_ioctl_vm_op_unmap(pvr_file, &args->data.unmap); -+ -+ default: -+ return -EINVAL; -+ } -+} -+ -+/* -+ * pvr_ioctl_submit_job() - IOCTL to submit a job to the GPU -+ * @drm_dev: [IN] DRM device. -+ * @raw_args: [IN] Arguments passed to this IOCTL. This must be of type -+ * &struct drm_pvr_ioctl_submit_job_args. -+ * @file: [IN] DRM file private data. -+ * -+ * Called from userspace with %DRM_IOCTL_PVR_SUBMIT_JOB. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL if arguments are invalid. -+ */ -+int -+pvr_ioctl_submit_job(struct drm_device *drm_dev, void *raw_args, -+ struct drm_file *file) -+{ -+ struct drm_pvr_ioctl_submit_job_args *args = raw_args; -+ struct pvr_device *pvr_dev = to_pvr_device(drm_dev); -+ struct pvr_file *pvr_file = to_pvr_file(file); -+ -+ return pvr_submit_job(pvr_dev, pvr_file, args); -+} -+ -+#define DRM_PVR_IOCTL(_name, _func, _flags) \ -+ DRM_IOCTL_DEF_DRV(PVR_##_name, pvr_ioctl_##_func, _flags) -+ -+/* clang-format off */ -+ -+static const struct drm_ioctl_desc pvr_drm_driver_ioctls[] = { -+ DRM_PVR_IOCTL(CREATE_BO, create_bo, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(GET_BO_MMAP_OFFSET, get_bo_mmap_offset, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(GET_PARAM, get_param, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(CREATE_CONTEXT, create_context, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(DESTROY_CONTEXT, destroy_context, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(CREATE_OBJECT, create_object, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(DESTROY_OBJECT, destroy_object, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(GET_HEAP_INFO, get_heap_info, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(VM_OP, vm_op, DRM_RENDER_ALLOW), -+ DRM_PVR_IOCTL(SUBMIT_JOB, submit_job, DRM_RENDER_ALLOW), -+}; -+ -+/* clang-format on */ -+ -+#undef DRM_PVR_IOCTL -+ -+/** -+ * pvr_drm_driver_open() - Driver callback when a new &struct drm_file is opened -+ * @drm_dev: [IN] DRM device. -+ * @file: [IN] DRM file private data. -+ * -+ * Allocates powervr-specific file private data (&struct pvr_file). -+ * -+ * Registered in &pvr_drm_driver. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%ENOMEM if the allocation of a &struct ipvr_file fails, or -+ * * Any error returned by pvr_memory_context_init(). -+ */ -+static int -+pvr_drm_driver_open(struct drm_device *drm_dev, struct drm_file *file) -+{ -+ struct pvr_device *pvr_dev = to_pvr_device(drm_dev); -+ struct pvr_file *pvr_file; -+ -+ int err; -+ -+ pvr_file = kzalloc(sizeof(*pvr_file), GFP_KERNEL); -+ if (!pvr_file) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ /* -+ * Store reference to base DRM file private data for use by -+ * from_pvr_file. -+ */ -+ pvr_file->file = file; -+ -+ /* -+ * Store reference to powervr-specific outer device struct in file -+ * private data for convenient access. -+ */ -+ pvr_file->pvr_dev = pvr_dev; -+ -+ xa_init_flags(&pvr_file->contexts, XA_FLAGS_ALLOC); -+ xa_init_flags(&pvr_file->objects, XA_FLAGS_ALLOC); -+ -+ /* Initialize the file-scoped memory context. */ -+ pvr_file->user_vm_ctx = pvr_vm_create_context(pvr_dev); -+ if (IS_ERR(pvr_file->user_vm_ctx)) { -+ err = PTR_ERR(pvr_file->user_vm_ctx); -+ goto err_xa_destroy; -+ } -+ -+ err = pvr_vm_fw_mem_context_create(pvr_file); -+ if (err) -+ goto err_vm_ctx_destroy; -+ -+ /* -+ * Store reference to powervr-specific file private data in DRM file -+ * private data. -+ */ -+ file->driver_priv = pvr_file; -+ -+ return 0; -+ -+err_vm_ctx_destroy: -+ pvr_vm_destroy_context(pvr_file->user_vm_ctx, false); -+ -+err_xa_destroy: -+ xa_destroy(&pvr_file->contexts); -+ xa_destroy(&pvr_file->objects); -+ -+ kfree(pvr_file); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_drm_driver_postclose() - One of the driver callbacks when a &struct -+ * drm_file is closed. -+ * @drm_dev: [IN] DRM device (unused). -+ * @file: [IN] DRM file private data. -+ * -+ * Frees powervr-specific file private data (&struct pvr_file). -+ * -+ * Registered in &pvr_drm_driver. -+ */ -+static void -+pvr_drm_driver_postclose(__always_unused struct drm_device *drm_dev, -+ struct drm_file *file) -+{ -+ struct pvr_file *pvr_file = to_pvr_file(file); -+ struct pvr_context *ctx; -+ struct pvr_object *obj; -+ unsigned long id; -+ -+ pvr_vm_fw_mem_context_destroy(pvr_file); -+ pvr_vm_destroy_context(pvr_file->user_vm_ctx, false); -+ -+ /* clang-format off */ -+ /* Drop references on any remaining objects. */ -+ xa_for_each(&pvr_file->objects, id, obj) { -+ pvr_object_put(obj); -+ } -+ -+ /* Drop references on any remaining contexts. */ -+ xa_for_each(&pvr_file->contexts, id, ctx) { -+ pvr_context_put(ctx); -+ } -+ /* clang-format on */ -+ -+ xa_destroy(&pvr_file->contexts); -+ -+ kfree(pvr_file); -+ file->driver_priv = NULL; -+} -+ -+DEFINE_DRM_GEM_FOPS(pvr_drm_driver_fops); -+ -+static struct drm_driver pvr_drm_driver = { -+ .driver_features = DRIVER_GEM | DRIVER_RENDER | DRIVER_SYNCOBJ, -+ .open = pvr_drm_driver_open, -+ .postclose = pvr_drm_driver_postclose, -+ .ioctls = pvr_drm_driver_ioctls, -+ .num_ioctls = ARRAY_SIZE(pvr_drm_driver_ioctls), -+ .fops = &pvr_drm_driver_fops, -+#if defined(CONFIG_DEBUG_FS) -+ .debugfs_init = pvr_fw_trace_debugfs_init, -+#endif -+ -+ .name = PVR_DRIVER_NAME, -+ .desc = PVR_DRIVER_DESC, -+ .date = PVR_DRIVER_DATE, -+ .major = PVR_DRIVER_MAJOR, -+ .minor = PVR_DRIVER_MINOR, -+ .patchlevel = PVR_DRIVER_PATCHLEVEL, -+ -+ /* -+ * These three (four) helper functions implement PRIME buffer sharing -+ * for us. The last is set implicitly when not assigned here. The only -+ * additional requirement to make PRIME work is to call dma_set_mask() -+ * in pvr_probe() to tell DMA that we can read from more than the first -+ * 4GB (32 bits) of memory address space. The subsequent call to -+ * dma_set_max_seg_size() is not strictly required, but prevents some -+ * warnings from appearing when CONFIG_DMA_API_DEBUG_SG is enabled. -+ */ -+ .prime_fd_to_handle = drm_gem_prime_fd_to_handle, -+ .prime_handle_to_fd = drm_gem_prime_handle_to_fd, -+ .gem_prime_import_sg_table = __pvr_gem_prime_import_sg_table, -+ /* .gem_prime_import = drm_gem_prime_import, */ -+}; -+ -+static int -+pvr_probe(struct platform_device *plat_dev) -+{ -+ struct pvr_device *pvr_dev; -+ struct drm_device *drm_dev; -+ int err; -+ -+ pvr_dev = devm_drm_dev_alloc(&plat_dev->dev, &pvr_drm_driver, -+ struct pvr_device, base); -+ if (IS_ERR(pvr_dev)) { -+ err = IS_ERR(pvr_dev); -+ goto err_out; -+ } -+ drm_dev = &pvr_dev->base; -+ -+ platform_set_drvdata(plat_dev, drm_dev); -+ -+ pvr_fence_device_init(pvr_dev); -+ -+ pvr_dev->vendor.callbacks = of_device_get_match_data(&plat_dev->dev); -+ -+ if (pvr_dev->vendor.callbacks && pvr_dev->vendor.callbacks->init) { -+ err = pvr_dev->vendor.callbacks->init(pvr_dev); -+ if (err) -+ goto err_out; -+ } -+ -+ err = pvr_device_init(pvr_dev); -+ if (err) -+ goto err_vendor_fini; -+ -+ err = drm_dev_register(drm_dev, 0); -+ if (err) -+ goto err_device_fini; -+ -+ return 0; -+ -+err_device_fini: -+ pvr_device_fini(pvr_dev); -+ -+err_vendor_fini: -+ if (pvr_dev->vendor.callbacks && pvr_dev->vendor.callbacks->fini) -+ pvr_dev->vendor.callbacks->fini(pvr_dev); -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_remove(struct platform_device *plat_dev) -+{ -+ struct drm_device *drm_dev = platform_get_drvdata(plat_dev); -+ struct pvr_device *pvr_dev = to_pvr_device(drm_dev); -+ -+ drm_dev_unregister(drm_dev); -+ pvr_device_fini(pvr_dev); -+ if (pvr_dev->vendor.callbacks && pvr_dev->vendor.callbacks->fini) -+ pvr_dev->vendor.callbacks->fini(pvr_dev); -+ -+ return 0; -+} -+ -+static const struct of_device_id dt_match[] = { -+ { .compatible = "mediatek,mt8173-gpu", .data = &pvr_mt8173_callbacks }, -+ { .compatible = "img,powervr-series6xt", .data = NULL }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, dt_match); -+ -+static struct platform_driver pvr_driver = { -+ .probe = pvr_probe, -+ .remove = pvr_remove, -+ .driver = { -+ .name = PVR_DRIVER_NAME, -+ .of_match_table = dt_match, -+ }, -+}; -+module_platform_driver(pvr_driver); -+ -+MODULE_AUTHOR("Imagination Technologies Ltd."); -+MODULE_DESCRIPTION(PVR_DRIVER_DESC); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_IMPORT_NS(DMA_BUF); -diff --git a/drivers/gpu/drm/imagination/pvr_drv.h b/drivers/gpu/drm/imagination/pvr_drv.h -new file mode 100644 -index 000000000000..89630b82aaca ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_drv.h -@@ -0,0 +1,19 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_DRV_H__ -+#define __PVR_DRV_H__ -+ -+#define PVR_DRIVER_NAME "powervr" -+#define PVR_DRIVER_DESC "Imagination PowerVR Graphics" -+#define PVR_DRIVER_DATE "20220211" -+ -+/* -+ * Driver interface version: -+ * - 1.0: Initial interface -+ */ -+#define PVR_DRIVER_MAJOR 1 -+#define PVR_DRIVER_MINOR 0 -+#define PVR_DRIVER_PATCHLEVEL 0 -+ -+#endif /* __PVR_DRV_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_fence.c b/drivers/gpu/drm/imagination/pvr_fence.c -new file mode 100644 -index 000000000000..d1f5acaa70d1 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fence.c -@@ -0,0 +1,250 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_drv.h" -+#include "pvr_fence.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_fwif.h" -+ -+#include <linux/errno.h> -+#include <linux/kernel.h> -+#include <linux/list.h> -+#include <linux/slab.h> -+#include <linux/spinlock.h> -+ -+/** -+ * pvr_fence_create() - Create a PowerVR fence -+ * @context: Target PowerVR fence context -+ * -+ * The fence will be created with two references; one for the caller, one for the fence worker. The -+ * callers reference (and any other references subsequently taken) should be released with -+ * dma_fence_put(). If the fence will not be signaled (e.g. on an error path) then the fence worker -+ * reference should also be manually dropped. -+ * -+ * Returns: -+ * * 0 on success, -+ * * -%ENOMEM on out of memory, or -+ * * Any error returned by pvr_gem_create_and_map_fw_object(). -+ */ -+struct dma_fence * -+pvr_fence_create(struct pvr_fence_context *context) -+{ -+ struct pvr_device *pvr_dev = context->pvr_dev; -+ struct pvr_fence *pvr_fence; -+ unsigned long flags; -+ int err; -+ -+ pvr_fence = kmalloc(sizeof(*pvr_fence), GFP_KERNEL); -+ if (!pvr_fence) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ pvr_fence->context = context; -+ pvr_fence->sync_checkpoint = -+ pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*pvr_fence->sync_checkpoint), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_fence->sync_checkpoint_fw_obj); -+ if (IS_ERR(pvr_fence->sync_checkpoint)) { -+ err = PTR_ERR(pvr_fence->sync_checkpoint); -+ goto err_free; -+ } -+ -+ INIT_LIST_HEAD(&pvr_fence->dep_list); -+ INIT_LIST_HEAD(&pvr_fence->dep_head); -+ -+ dma_fence_init(&pvr_fence->base, &pvr_fence_ops, &context->fence_spinlock, -+ context->fence_context, atomic_inc_return(&context->fence_id)); -+ -+ /* -+ * The initial reference on this fence will be passed to the fence list as soon as the -+ * fence is added to that list. Take another reference before then to hand back to the -+ * caller. -+ */ -+ dma_fence_get(&pvr_fence->base); -+ -+ spin_lock_irqsave(&pvr_dev->fence_list_spinlock, flags); -+ list_add_tail(&pvr_fence->head, &pvr_dev->fence_list); -+ spin_unlock_irqrestore(&pvr_dev->fence_list_spinlock, flags); -+ -+ return from_pvr_fence(pvr_fence); -+ -+err_free: -+ kfree(pvr_fence); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+static void -+pvr_fence_release_dep_fences(struct pvr_fence *pvr_fence) -+{ -+ struct pvr_device *pvr_dev = pvr_fence->context->pvr_dev; -+ struct pvr_fence *dep_fence; -+ struct pvr_fence *tmp; -+ unsigned long flags; -+ -+ LIST_HEAD(dep_fence_list); -+ -+ spin_lock_irqsave(&pvr_dev->fence_list_spinlock, flags); -+ -+ list_for_each_entry_safe(dep_fence, tmp, &pvr_fence->dep_list, dep_head) -+ list_move_tail(&dep_fence->dep_head, &dep_fence_list); -+ -+ spin_unlock_irqrestore(&pvr_dev->fence_list_spinlock, flags); -+ -+ list_for_each_entry_safe(dep_fence, tmp, &dep_fence_list, dep_head) { -+ list_del_init(&dep_fence->dep_head); -+ dma_fence_put(&dep_fence->base); -+ } -+} -+ -+static void -+pvr_fence_destroy(struct pvr_fence *pvr_fence) -+{ -+ struct pvr_device *pvr_dev = pvr_fence->context->pvr_dev; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&pvr_dev->fence_list_spinlock, flags); -+ list_del(&pvr_fence->head); -+ spin_unlock_irqrestore(&pvr_dev->fence_list_spinlock, flags); -+ -+ pvr_fence_release_dep_fences(pvr_fence); -+ -+ pvr_fw_object_vunmap(pvr_fence->sync_checkpoint_fw_obj, pvr_fence->sync_checkpoint, false); -+ pvr_fw_object_release(pvr_fence->sync_checkpoint_fw_obj); -+ -+ BUILD_BUG_ON(offsetof(typeof(*pvr_fence), base)); -+ dma_fence_free(&pvr_fence->base); -+} -+ -+static const char * -+pvr_fence_get_driver_name(struct dma_fence *fence) -+{ -+ return PVR_DRIVER_NAME; -+} -+ -+static const char * -+pvr_fence_get_timeline_name(struct dma_fence *fence) -+{ -+ struct pvr_fence *pvr_fence = to_pvr_fence(fence); -+ -+ return (const char *)pvr_fence->context->timeline_name; -+} -+ -+static bool -+pvr_fence_is_signaled(struct dma_fence *fence) -+{ -+ struct pvr_fence *pvr_fence = to_pvr_fence(fence); -+ -+ return (pvr_fence->sync_checkpoint->state == PVR_SYNC_CHECKPOINT_ERRORED) || -+ (pvr_fence->sync_checkpoint->state == PVR_SYNC_CHECKPOINT_SIGNALED); -+} -+ -+static void -+pvr_fence_release(struct dma_fence *fence) -+{ -+ struct pvr_fence *pvr_fence = to_pvr_fence(fence); -+ -+ pvr_fence_destroy(pvr_fence); -+} -+ -+const struct dma_fence_ops pvr_fence_ops = { -+ .get_driver_name = pvr_fence_get_driver_name, -+ .get_timeline_name = pvr_fence_get_timeline_name, -+ .release = pvr_fence_release, -+ .signaled = pvr_fence_is_signaled, -+}; -+ -+/** -+ * pvr_fence_process_worker() - Process any completed fences -+ * @pvr_dev: Target PowerVR device. -+ */ -+static void -+pvr_fence_process_worker(struct work_struct *work) -+{ -+ struct pvr_device *pvr_dev = container_of(work, struct pvr_device, fence_work); -+ struct pvr_fence *pvr_fence; -+ struct pvr_fence *tmp; -+ unsigned long flags; -+ -+ LIST_HEAD(signaled_list); -+ -+ spin_lock_irqsave(&pvr_dev->fence_list_spinlock, flags); -+ -+ /* Move any signaled fences to the signaled list for further processing. */ -+ list_for_each_entry_safe(pvr_fence, tmp, &pvr_dev->fence_list, head) { -+ if (pvr_fence_is_signaled(&pvr_fence->base)) -+ list_move_tail(&pvr_fence->head, &signaled_list); -+ } -+ -+ /* Finished with device fence list, can now drop lock. */ -+ spin_unlock_irqrestore(&pvr_dev->fence_list_spinlock, flags); -+ -+ list_for_each_entry_safe(pvr_fence, tmp, &signaled_list, head) { -+ list_del_init(&pvr_fence->head); -+ -+ /* Signal fence and drop our reference. */ -+ dma_fence_signal(&pvr_fence->base); -+ pvr_fence_release_dep_fences(pvr_fence); -+ dma_fence_put(&pvr_fence->base); -+ } -+} -+ -+/** -+ * pvr_fence_device_init() - Initialise fence handling for PowerVR device -+ * @pvr_dev: Target PowerVR device. -+ */ -+void -+pvr_fence_device_init(struct pvr_device *pvr_dev) -+{ -+ spin_lock_init(&pvr_dev->fence_list_spinlock); -+ INIT_LIST_HEAD(&pvr_dev->fence_list); -+ INIT_WORK(&pvr_dev->fence_work, pvr_fence_process_worker); -+} -+ -+/** -+ * pvr_fence_context_init() - Initialise fence context -+ * @pvr_dev: Target PowerVR device. -+ * @context: Pointer to fence context to initialise. -+ * @name: Name of timeline this fence context represents. -+ */ -+void -+pvr_fence_context_init(struct pvr_device *pvr_dev, struct pvr_fence_context *context, -+ const char *name) -+{ -+ context->pvr_dev = pvr_dev; -+ spin_lock_init(&context->fence_spinlock); -+ atomic_set(&context->fence_id, 0); -+ context->fence_context = dma_fence_context_alloc(1); -+ strncpy(context->timeline_name, name, sizeof(context->timeline_name) - 1); -+} -+ -+/** -+ * pvr_fence_to_ufo() - Create a UFO representation of a pvr_fence, for use by firmware -+ * @fence: Pointer to fence to convert. -+ * @ufo: Location to write UFO representation. -+ * -+ * Returns: -+ * * 0 on success, -+ * * -%EINVAL if provided fence is not a &struct pvr_fence, or -+ * * -%ENOMEM if provided fence is not mapped to firmware. -+ */ -+int -+pvr_fence_to_ufo(struct dma_fence *fence, struct rogue_fwif_ufo *ufo) -+{ -+ struct pvr_fence *pvr_fence = to_pvr_fence(fence); -+ -+ if (unlikely(!pvr_fence)) -+ return -EINVAL; -+ -+ if (!pvr_gem_get_fw_addr(pvr_fence->sync_checkpoint_fw_obj, &ufo->addr)) -+ return -ENOMEM; -+ -+ ufo->addr |= ROGUE_FWIF_UFO_ADDR_IS_SYNC_CHECKPOINT; -+ ufo->value = PVR_SYNC_CHECKPOINT_ACTIVE; -+ -+ return 0; -+} -diff --git a/drivers/gpu/drm/imagination/pvr_fence.h b/drivers/gpu/drm/imagination/pvr_fence.h -new file mode 100644 -index 000000000000..789a8768c911 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fence.h -@@ -0,0 +1,148 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_FENCE_H__ -+#define __PVR_FENCE_H__ -+ -+#include "pvr_device.h" -+ -+#include <linux/bits.h> -+#include <linux/dma-fence.h> -+#include <linux/list.h> -+#include <linux/spinlock.h> -+#include <linux/types.h> -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+/* Forward declarations from pvr_rogue_fwif_shared.h. */ -+struct rogue_fwif_sync_checkpoint; -+struct rogue_fwif_ufo; -+ -+/** -+ * &struct pvr_fence_context - PowerVR fence context -+ */ -+struct pvr_fence_context { -+ /** @pvr_dev: Owning PowerVR device. */ -+ struct pvr_device *pvr_dev; -+ -+ /** @fence_spinlock: Lock used by pvr_fence. */ -+ spinlock_t fence_spinlock; -+ -+ /** @fence_id: Next ID to be assigned when creating fences. */ -+ atomic_t fence_id; -+ -+ /** @fence_context: Device fence context. */ -+ u64 fence_context; -+ -+ /** @timeline_name: Name of timeline this fence context represents. */ -+ char timeline_name[32]; -+}; -+ -+/** -+ * &struct pvr_fence - PowerVR fence structure -+ */ -+struct pvr_fence { -+ /** @base: Base DMA fence backing this pvr_fence. */ -+ struct dma_fence base; -+ -+ /** @fence_context: Owning fence context. */ -+ struct pvr_fence_context *context; -+ -+ /** @head: List head for this fence. */ -+ struct list_head head; -+ -+ /** -+ * @sync_checkpoint_fw_obj: FW object representing the sync checkpoint structure for this -+ * fence. -+ */ -+ struct pvr_fw_object *sync_checkpoint_fw_obj; -+ -+ /** @sync_checkpoint: CPU mapping of sync checkpoint structure for this fence. */ -+ struct rogue_fwif_sync_checkpoint *sync_checkpoint; -+ -+ /** -+ * @dep_list: List of fences this fence depends on. All fences in this list will be -+ * released when this fence is signalled or destroyed. -+ */ -+ struct list_head dep_list; -+ -+ /** @dep_head: Dependency list head for this fence. */ -+ struct list_head dep_head; -+}; -+ -+extern const struct dma_fence_ops pvr_fence_ops; -+ -+void -+pvr_fence_device_init(struct pvr_device *pvr_dev); -+void -+pvr_fence_context_init(struct pvr_device *pvr_dev, struct pvr_fence_context *context, -+ const char *name); -+struct dma_fence * -+pvr_fence_create(struct pvr_fence_context *context); -+int -+pvr_fence_to_ufo(struct dma_fence *fence, struct rogue_fwif_ufo *ufo); -+ -+static __always_inline struct dma_fence * -+from_pvr_fence(struct pvr_fence *pvr_fence) -+{ -+ return &pvr_fence->base; -+} -+ -+static __always_inline struct pvr_fence * -+to_pvr_fence(struct dma_fence *fence) -+{ -+ if (fence->ops == &pvr_fence_ops) -+ return container_of(fence, struct pvr_fence, base); -+ -+ return NULL; -+} -+ -+/** -+ * pvr_fence_add_fence_dependency() - Add dependency to pvr_fence -+ * @fence: Target fence. -+ * @dep_fence: Dependency to add. -+ * -+ * Dependency will be released when target fence is signalled or destroyed. -+ * -+ * Returns: -+ * * 0 on success, -+ * * -%EINVAL if provided fences are not pvr_fences, or -+ * * -%EINVAL if dependency is already attached to a &struct pvr_fence. -+ */ -+static __always_inline int -+pvr_fence_add_fence_dependency(struct dma_fence *fence, struct dma_fence *dep_fence) -+{ -+ struct pvr_fence *pvr_dep_fence = to_pvr_fence(dep_fence); -+ struct pvr_fence *pvr_fence = to_pvr_fence(fence); -+ struct pvr_device *pvr_dev; -+ unsigned long flags; -+ int err; -+ -+ if (!pvr_fence || !pvr_dep_fence) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ pvr_dev = pvr_fence->context->pvr_dev; -+ spin_lock_irqsave(&pvr_dev->fence_list_spinlock, flags); -+ -+ if (!list_empty(&pvr_dep_fence->dep_head)) { -+ err = -EINVAL; -+ goto err_unlock; -+ } -+ -+ list_add_tail(&pvr_dep_fence->dep_head, &pvr_fence->dep_list); -+ -+ spin_unlock_irqrestore(&pvr_dev->fence_list_spinlock, flags); -+ -+ return 0; -+ -+err_unlock: -+ spin_unlock_irqrestore(&pvr_dev->fence_list_spinlock, flags); -+ -+err_out: -+ return err; -+} -+ -+#endif /* __PVR_FENCE_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_free_list.c b/drivers/gpu/drm/imagination/pvr_free_list.c -new file mode 100644 -index 000000000000..869d9302f7b5 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_free_list.c -@@ -0,0 +1,377 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_free_list.h" -+#include "pvr_gem.h" -+#include "pvr_object.h" -+#include "pvr_rogue_fwif.h" -+#include "pvr_vm.h" -+ -+#include <drm/drm_gem.h> -+#include <linux/slab.h> -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+#define FREE_LIST_ENTRY_SIZE sizeof(u32) -+ -+#define FREE_LIST_ALIGNMENT \ -+ ((ROGUE_BIF_PM_FREELIST_BASE_ADDR_ALIGNSIZE / FREE_LIST_ENTRY_SIZE) - 1) -+ -+static int -+free_list_create_kernel_structure( -+ struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_free_list_args *args, -+ struct pvr_free_list *free_list) -+{ -+ struct pvr_gem_object *free_list_obj; -+ u64 free_list_size; -+ int err; -+ -+ if (args->grow_threshold < 0 || args->grow_threshold > 100 || -+ args->initial_num_pages > args->max_num_pages || -+ args->grow_num_pages > args->max_num_pages || -+ args->max_num_pages == 0 || -+ (args->initial_num_pages < args->max_num_pages && !args->grow_num_pages) || -+ (args->initial_num_pages == args->max_num_pages && args->grow_num_pages)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ if ((args->initial_num_pages & FREE_LIST_ALIGNMENT) || -+ (args->max_num_pages & FREE_LIST_ALIGNMENT) || -+ (args->grow_num_pages & FREE_LIST_ALIGNMENT)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ free_list_obj = pvr_vm_find_gem_object(pvr_file->user_vm_ctx, args->free_list_gpu_addr, -+ NULL, &free_list_size); -+ if (IS_ERR(free_list_obj)) { -+ err = PTR_ERR(free_list_obj); -+ goto err_out; -+ } -+ -+ if ((free_list_obj->flags & DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS) || -+ !(free_list_obj->flags & DRM_PVR_BO_DEVICE_PM_FW_PROTECT) || -+ free_list_size < (args->max_num_pages * FREE_LIST_ENTRY_SIZE)) { -+ err = -EINVAL; -+ goto err_put_free_list_obj; -+ } -+ -+ free_list->base.type = DRM_PVR_OBJECT_TYPE_FREE_LIST; -+ free_list->pvr_dev = pvr_file->pvr_dev; -+ free_list->current_pages = 0; -+ free_list->max_pages = args->max_num_pages; -+ free_list->grow_pages = args->grow_num_pages; -+ free_list->grow_threshold = args->grow_threshold; -+ free_list->id = atomic_inc_return(&pvr_file->free_list_id); -+ INIT_LIST_HEAD(&free_list->mem_block_list); -+ free_list->obj = free_list_obj; -+ -+ err = pvr_gem_object_get_pages(free_list->obj); -+ if (err < 0) -+ goto err_put_free_list_obj; -+ -+ return 0; -+ -+err_put_free_list_obj: -+ pvr_gem_object_put(free_list_obj); -+ -+err_out: -+ return err; -+} -+ -+static void -+free_list_destroy_kernel_structure(struct pvr_free_list *free_list) -+{ -+ pvr_gem_object_put_pages(free_list->obj); -+ pvr_gem_object_put(free_list->obj); -+} -+ -+/** -+ * calculate_free_list_ready_pages() - Function to work out the number of free -+ * list pages to reserve for growing within -+ * the FW without having to wait for the -+ * host to progress a grow request -+ * @free_list: Pointer to free list. -+ * @pages: Total pages currently in free list. -+ * -+ * If the threshold or grow size means less than the alignment size (4 pages on -+ * Rogue), then the feature is not used. -+ * -+ * Return: number of pages to reserve. -+ */ -+static u32 -+calculate_free_list_ready_pages(struct pvr_free_list *free_list, u32 pages) -+{ -+ u32 ready_pages = ((pages * free_list->grow_threshold) / 100); -+ -+ /* The number of pages must be less than the grow size. */ -+ ready_pages = min(ready_pages, free_list->grow_pages); -+ -+ /* -+ * The number of pages must be a multiple of the free list align size. -+ */ -+ ready_pages &= ~FREE_LIST_ALIGNMENT; -+ -+ return ready_pages; -+} -+ -+static int -+free_list_create_fw_structure(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_free_list_args *args, -+ struct pvr_free_list *free_list) -+{ -+ struct pvr_device *pvr_dev = pvr_file->pvr_dev; -+ struct rogue_fwif_freelist *free_list_fw; -+ u32 ready_pages; -+ int err; -+ -+ /* -+ * Create and map the FW structure so we can initialise it. This is not -+ * accessed on the CPU side post-initialisation so the mapping lifetime -+ * is only for this function. -+ */ -+ free_list_fw = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*free_list_fw), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, &free_list->fw_obj); -+ if (IS_ERR(free_list_fw)) { -+ err = PTR_ERR(free_list_fw); -+ goto err_out; -+ } -+ -+ /* Fill out FW structure */ -+ ready_pages = calculate_free_list_ready_pages(free_list, -+ args->initial_num_pages); -+ -+ free_list_fw->max_pages = free_list->max_pages; -+ free_list_fw->current_pages = args->initial_num_pages - ready_pages; -+ free_list_fw->grow_pages = free_list->grow_pages; -+ free_list_fw->ready_pages = ready_pages; -+ free_list_fw->freelist_id = free_list->id; -+ free_list_fw->grow_pending = false; -+ free_list_fw->current_stack_top = free_list_fw->current_pages - 1; -+ free_list_fw->freelist_dev_addr = args->free_list_gpu_addr; -+ free_list_fw->current_dev_addr = -+ (free_list_fw->freelist_dev_addr + -+ ((free_list_fw->max_pages - free_list_fw->current_pages) * -+ FREE_LIST_ENTRY_SIZE)) & -+ ~((u64)ROGUE_BIF_PM_FREELIST_BASE_ADDR_ALIGNSIZE - 1); -+ -+ pvr_fw_object_vunmap(free_list->fw_obj, free_list_fw, false); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static void -+free_list_destroy_fw_structure(struct pvr_free_list *free_list) -+{ -+ pvr_fw_object_release(free_list->fw_obj); -+} -+ -+static int -+pvr_free_list_insert_pages(struct pvr_free_list *free_list, -+ struct sg_table *sgt, u32 offset, u32 num_pages) -+{ -+ struct sg_dma_page_iter dma_iter; -+ u32 *page_list; -+ int err; -+ -+ page_list = pvr_gem_object_vmap(free_list->obj, false); -+ if (IS_ERR(page_list)) { -+ err = PTR_ERR(page_list); -+ goto err_out; -+ } -+ -+ offset /= FREE_LIST_ENTRY_SIZE; -+ /* clang-format off */ -+ for_each_sgtable_dma_page(sgt, &dma_iter, 0) { -+ dma_addr_t dma_addr = sg_page_iter_dma_address(&dma_iter); -+ u64 dma_pfn = dma_addr >> -+ ROGUE_BIF_PM_PHYSICAL_PAGE_ALIGNSHIFT; -+ u32 dma_addr_offset; -+ -+ BUILD_BUG_ON(ROGUE_BIF_PM_PHYSICAL_PAGE_SIZE > PAGE_SIZE); -+ -+ for (dma_addr_offset = 0; dma_addr_offset < PAGE_SIZE; -+ dma_addr_offset += ROGUE_BIF_PM_PHYSICAL_PAGE_SIZE) { -+ WARN_ON_ONCE(dma_pfn >> 32); -+ -+ page_list[offset++] = (u32)dma_pfn; -+ dma_pfn++; -+ -+ num_pages--; -+ if (!num_pages) -+ break; -+ } -+ -+ if (!num_pages) -+ break; -+ }; -+ /* clang-format on */ -+ -+ pvr_gem_object_vunmap(free_list->obj, page_list, true); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_free_list_grow(struct pvr_free_list *free_list, u32 num_pages) -+{ -+ struct pvr_device *pvr_dev = free_list->pvr_dev; -+ struct pvr_free_list_node *free_list_node; -+ u32 start_page; -+ u32 offset; -+ int err; -+ -+ if (num_pages & FREE_LIST_ALIGNMENT) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ free_list_node = kzalloc(sizeof(*free_list_node), GFP_KERNEL); -+ if (!free_list_node) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ free_list_node->num_pages = num_pages; -+ free_list_node->free_list = free_list; -+ -+ free_list_node->mem_obj = pvr_gem_object_create(pvr_dev, -+ num_pages << ROGUE_BIF_PM_PHYSICAL_PAGE_ALIGNSHIFT, -+ PVR_BO_FW_FLAGS_DEVICE_CACHED); -+ if (IS_ERR(free_list_node->mem_obj)) { -+ err = PTR_ERR(free_list_node->mem_obj); -+ goto err_free; -+ } -+ -+ err = pvr_gem_object_get_pages(free_list_node->mem_obj); -+ if (err < 0) -+ goto err_destroy_gem_object; -+ -+ start_page = free_list->max_pages - free_list->current_pages - -+ free_list_node->num_pages; -+ offset = ((start_page * FREE_LIST_ENTRY_SIZE) & -+ ~((u64)ROGUE_BIF_PM_FREELIST_BASE_ADDR_ALIGNSIZE - 1)); -+ -+ pvr_free_list_insert_pages(free_list, free_list_node->mem_obj->sgt, -+ offset, num_pages); -+ -+ list_add_tail(&free_list_node->node, &free_list->mem_block_list); -+ -+ free_list->current_pages += num_pages; -+ -+ /* -+ * Reserve a number ready pages to allow the FW to process OOM quickly -+ * and asynchronously request a grow. -+ */ -+ free_list->ready_pages = -+ calculate_free_list_ready_pages(free_list, -+ free_list->current_pages); -+ free_list->current_pages -= free_list->ready_pages; -+ -+ return 0; -+ -+err_destroy_gem_object: -+ pvr_gem_object_put(free_list_node->mem_obj); -+ -+err_free: -+ kfree(free_list_node); -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_free_list_free_node(struct pvr_free_list_node *free_list_node) -+{ -+ pvr_gem_object_put_pages(free_list_node->mem_obj); -+ pvr_gem_object_put(free_list_node->mem_obj); -+ -+ kfree(free_list_node); -+} -+ -+/** -+ * pvr_free_list_create() - Create a new free list and return an object pointer -+ * @pvr_file: Pointer to pvr_file structure. -+ * @args: Creation arguments from userspace. -+ * -+ * Return: -+ * * Free list pointer on success, or -+ * * -%ENOMEM on out of memory. -+ */ -+struct pvr_free_list * -+pvr_free_list_create(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_free_list_args *args) -+{ -+ struct pvr_free_list *free_list; -+ int err; -+ -+ /* Create and fill out the kernel structure */ -+ free_list = kzalloc(sizeof(*free_list), GFP_KERNEL); -+ if (!free_list) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = free_list_create_kernel_structure(pvr_file, args, free_list); -+ if (err < 0) -+ goto err_free; -+ -+ err = free_list_create_fw_structure(pvr_file, args, free_list); -+ if (err < 0) -+ goto err_destroy_kernel_structure; -+ -+ err = pvr_free_list_grow(free_list, args->initial_num_pages); -+ if (err < 0) -+ goto err_destroy_fw_structure; -+ -+ return free_list; -+ -+err_destroy_fw_structure: -+ free_list_destroy_fw_structure(free_list); -+ -+err_destroy_kernel_structure: -+ free_list_destroy_kernel_structure(free_list); -+ -+err_free: -+ kfree(free_list); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * pvr_free_list_destroy() - Destroy a free list -+ * @free_list: Free list to be destroyed. -+ * -+ * This should not be called directly. Free list references should be dropped via -+ * pvr_free_list_put(). -+ */ -+void -+pvr_free_list_destroy(struct pvr_free_list *free_list) -+{ -+ struct list_head *pos, *n; -+ -+ WARN_ON(pvr_object_cleanup(free_list->pvr_dev, ROGUE_FWIF_CLEANUP_FREELIST, -+ free_list->fw_obj, 0)); -+ -+ /* clang-format off */ -+ list_for_each_safe(pos, n, &free_list->mem_block_list) { -+ struct pvr_free_list_node *free_list_node = -+ container_of(pos, struct pvr_free_list_node, node); -+ -+ list_del(pos); -+ pvr_free_list_free_node(free_list_node); -+ } -+ /* clang-format on */ -+ -+ free_list_destroy_kernel_structure(free_list); -+ free_list_destroy_fw_structure(free_list); -+ kfree(free_list); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_free_list.h b/drivers/gpu/drm/imagination/pvr_free_list.h -new file mode 100644 -index 000000000000..f7eef2c10d61 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_free_list.h -@@ -0,0 +1,139 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_FREE_LIST_H__ -+#define __PVR_FREE_LIST_H__ -+ -+#include <linux/compiler_attributes.h> -+#include <linux/kref.h> -+#include <linux/list.h> -+#include <linux/types.h> -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+#include "pvr_device.h" -+#include "pvr_object.h" -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_gem_object; -+ -+/** -+ * struct pvr_free_list_node - structure representing an allocation in the free -+ * list -+ */ -+struct pvr_free_list_node { -+ /** @node: List node for &pvr_free_list.mem_block_list. */ -+ struct list_head node; -+ -+ /** @free_list: Pointer to owning free list. */ -+ struct pvr_free_list *free_list; -+ -+ /** @num_pages: Number of pages in this node. */ -+ u32 num_pages; -+ -+ /** @mem_obj: GEM object representing the pages in this node. */ -+ struct pvr_gem_object *mem_obj; -+}; -+ -+/** -+ * struct pvr_free_list - structure representing a free list -+ */ -+struct pvr_free_list { -+ /** @base: Object base structure. */ -+ struct pvr_object base; -+ -+ /** @pvr_dev: Pointer to owning device. */ -+ struct pvr_device *pvr_dev; -+ -+ /** @obj: GEM object representing the free list. */ -+ struct pvr_gem_object *obj; -+ -+ /** @fw_obj: FW object representing the FW-side structure. */ -+ struct pvr_fw_object *fw_obj; -+ -+ /** @current_pages: Current number of pages in free list. */ -+ u32 current_pages; -+ -+ /** @max_pages: Maximum number of pages in free list. */ -+ u32 max_pages; -+ -+ /** @grow_pages: Pages to grow free list by per request. */ -+ u32 grow_pages; -+ -+ /** -+ * @grow_threshold: Percentage of FL memory used that should trigger a -+ * new grow request. -+ */ -+ u32 grow_threshold; -+ -+ /** -+ * @ready_pages: Number of pages reserved for FW to use while a grow -+ * request is being processed. -+ */ -+ u32 ready_pages; -+ -+ /** @id: FW-side ID for the free list. */ -+ u32 id; -+ -+ /** @mem_block_list: List of memory blocks in this free list. */ -+ struct list_head mem_block_list; -+}; -+ -+static __always_inline struct pvr_object * -+from_pvr_free_list(struct pvr_free_list *free_list) -+{ -+ return &free_list->base; -+}; -+ -+static __always_inline struct pvr_free_list * -+to_pvr_free_list(struct pvr_object *obj) -+{ -+ return container_of(obj, struct pvr_free_list, base); -+} -+ -+struct pvr_free_list * -+pvr_free_list_create(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_free_list_args *args); -+ -+void pvr_free_list_destroy(struct pvr_free_list *free_list); -+ -+/** -+ * pvr_free_list_get() - Get free list pointer from handle -+ * @pvr_file: Pointer to pvr_file structure. -+ * @handle: Object handle. -+ * -+ * Takes reference on object. Call pvr_object_put() to release. -+ * -+ * Returns: -+ * * The requested object on success, or -+ * * %NULL on failure (object does not exist in list, or is not a free list) -+ */ -+static __always_inline struct pvr_free_list * -+pvr_free_list_get(struct pvr_file *pvr_file, u32 handle) -+{ -+ struct pvr_object *obj = pvr_object_get(pvr_file, handle); -+ -+ if (obj) { -+ if (obj->type == DRM_PVR_OBJECT_TYPE_FREE_LIST) -+ return to_pvr_free_list(obj); -+ -+ pvr_object_put(obj); -+ } -+ -+ return NULL; -+} -+ -+/** -+ * pvr_free_list_put() - Release reference on free list -+ * @free_list: Pointer to list to release reference on -+ */ -+static __always_inline void -+pvr_free_list_put(struct pvr_free_list *free_list) -+{ -+ pvr_object_put(&free_list->base); -+} -+ -+#endif /* __PVR_FREE_LIST_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_fw.c b/drivers/gpu/drm/imagination/pvr_fw.c -new file mode 100644 -index 000000000000..6d185c24f1ab ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw.c -@@ -0,0 +1,900 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_ccb.h" -+#include "pvr_device.h" -+#include "pvr_fw.h" -+#include "pvr_fw_info.h" -+#include "pvr_fw_trace.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_heap_config.h" -+ -+#include <drm/drm_mm.h> -+#include <linux/firmware.h> -+#include <linux/minmax.h> -+#include <linux/sizes.h> -+ -+#define FW_BOOT_TIMEOUT_USEC 5000000 -+ -+/* Config heap occupies top 192k of the firmware heap. */ -+#define PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY SZ_64K -+#define PVR_ROGUE_FW_CONFIG_HEAP_SIZE (3 * PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY) -+ -+/* Main firmware allocations should come from the remainder of the heap. */ -+#define PVR_ROGUE_FW_MAIN_HEAP_BASE ROGUE_FW_HEAP_BASE -+ -+/* Offsets from start of configuration area of FW heap. */ -+#define PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET 0 -+#define PVR_ROGUE_FWIF_OSINIT_OFFSET \ -+ (PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET + PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY) -+#define PVR_ROGUE_FWIF_SYSINIT_OFFSET \ -+ (PVR_ROGUE_FWIF_OSINIT_OFFSET + PVR_ROGUE_FW_CONFIG_HEAP_GRANULARITY) -+ -+#define PVR_ROGUE_FAULT_PAGE_SIZE SZ_4K -+ -+#define PVR_SYNC_OBJ_SIZE sizeof(u32) -+ -+const struct pvr_fw_layout_entry * -+pvr_fw_find_layout_entry(const struct pvr_fw_layout_entry *layout_entries, u32 num_layout_entries, -+ enum pvr_fw_section_id id) -+{ -+ u32 entry; -+ -+ for (entry = 0; entry < num_layout_entries; entry++) { -+ if (layout_entries[entry].id == id) -+ return &layout_entries[entry]; -+ } -+ -+ return NULL; -+} -+ -+/** -+ * pvr_fw_validate() - Parse firmware header and check compatibility -+ * @pvr_dev: Device pointer. -+ * @header_out: Pointer to location to write firmware header pointer. -+ * @layout_entries_out: Pointer to location to write layout table pointer. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -EINVAL if firmware is incompatible. -+ */ -+static int -+pvr_fw_validate(struct pvr_device *pvr_dev, -+ const struct pvr_fw_info_header **header_out, -+ const struct pvr_fw_layout_entry **layout_entries_out) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ const u8 *fw = pvr_dev->fw->data; -+ u32 fw_offset = pvr_dev->fw->size - SZ_4K; -+ const struct pvr_fw_layout_entry *layout_entries; -+ const struct pvr_fw_info_header *header; -+ u32 layout_table_size; -+ u32 entry; -+ int err; -+ -+ if ((pvr_dev->fw->size < SZ_4K) || -+ (pvr_dev->fw->size % FW_BLOCK_SIZE)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ header = (const struct pvr_fw_info_header *)&fw[fw_offset]; -+ -+ if (header->info_version != PVR_FW_INFO_VERSION) { -+ drm_err(drm_dev, "Unsupported fw info version %u\n", -+ header->info_version); -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (header->header_len != sizeof(struct pvr_fw_info_header) || -+ header->layout_entry_size != sizeof(struct pvr_fw_layout_entry) || -+ header->layout_entry_num > PVR_FW_INFO_MAX_NUM_ENTRIES) { -+ drm_err(drm_dev, "FW info format mismatch\n"); -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (pvr_version_to_packed_bvnc(&pvr_dev->version) != header->bvnc) { -+ struct pvr_version fw_version; -+ -+ packed_bvnc_to_pvr_version(header->bvnc, &fw_version); -+ drm_err(drm_dev, "Unsupported fw version %i.%i.%i.%i\n", -+ fw_version.b, fw_version.v, fw_version.n, fw_version.c); -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ fw_offset += header->header_len; -+ layout_table_size = -+ header->layout_entry_size * header->layout_entry_num; -+ if ((fw_offset + layout_table_size) > pvr_dev->fw->size) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ layout_entries = (const struct pvr_fw_layout_entry *)&fw[fw_offset]; -+ for (entry = 0; entry < header->layout_entry_num; entry++) { -+ u32 start_addr = layout_entries[entry].base_addr; -+ u32 end_addr = start_addr + layout_entries[entry].alloc_size; -+ -+ if (start_addr >= end_addr) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ } -+ -+ *header_out = header; -+ *layout_entries_out = layout_entries; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static void -+layout_get_sizes(const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, u32 *code_alloc_size, -+ u32 *data_alloc_size, u32 *core_code_alloc_size, -+ u32 *core_data_alloc_size) -+{ -+ u32 entry; -+ -+ *code_alloc_size = 0; -+ *data_alloc_size = 0; -+ *core_code_alloc_size = 0; -+ *core_data_alloc_size = 0; -+ -+ /* Extract section sizes from FW layout table. */ -+ for (entry = 0; entry < num_layout_entries; entry++) { -+ switch (layout_entries[entry].type) { -+ case FW_CODE: -+ (*code_alloc_size) += layout_entries[entry].alloc_size; -+ break; -+ case FW_DATA: -+ (*data_alloc_size) += layout_entries[entry].alloc_size; -+ break; -+ case FW_COREMEM_CODE: -+ (*core_code_alloc_size) += -+ layout_entries[entry].alloc_size; -+ break; -+ case FW_COREMEM_DATA: -+ (*core_data_alloc_size) += -+ layout_entries[entry].alloc_size; -+ break; -+ case NONE: -+ break; -+ } -+ } -+} -+ -+int -+pvr_fw_find_mmu_segment(u32 addr, u32 size, const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, void *fw_code_ptr, void *fw_data_ptr, -+ void *fw_core_code_ptr, void *fw_core_data_ptr, -+ void **host_addr_out) -+{ -+ u32 end_addr = addr + size; -+ int entry = 0; -+ int err; -+ -+ /* Ensure requested range is not zero, and size is not causing addr to overflow. */ -+ if (end_addr <= addr) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ for (entry = 0; entry < num_layout_entries; entry++) { -+ u32 entry_start_addr = layout_entries[entry].base_addr; -+ u32 entry_end_addr = entry_start_addr + layout_entries[entry].alloc_size; -+ -+ if (addr >= entry_start_addr && addr < entry_end_addr && -+ end_addr > entry_start_addr && end_addr <= entry_end_addr) { -+ switch (layout_entries[entry].type) { -+ case FW_CODE: -+ *host_addr_out = fw_code_ptr; -+ break; -+ -+ case FW_DATA: -+ *host_addr_out = fw_data_ptr; -+ break; -+ -+ case FW_COREMEM_CODE: -+ *host_addr_out = fw_core_code_ptr; -+ break; -+ -+ case FW_COREMEM_DATA: -+ *host_addr_out = fw_core_data_ptr; -+ break; -+ -+ default: -+ err = -EINVAL; -+ goto err_out; -+ } -+ /* Direct Mem write to mapped memory */ -+ addr -= layout_entries[entry].base_addr; -+ addr += layout_entries[entry].alloc_offset; -+ -+ /* -+ * Add offset to pointer to FW allocation only if that -+ * allocation is available -+ */ -+ *(u8 **)host_addr_out += addr; -+ return 0; -+ } -+ } -+ -+ err = -EINVAL; -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_fw_create_fwif_connection_ctl(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ int err; -+ -+ pvr_dev->fwif_connection_ctl = pvr_gem_create_and_map_fw_object_offset(pvr_dev, -+ pvr_dev->fw_heap_info.config_offset + PVR_ROGUE_FWIF_CONNECTION_CTL_OFFSET, -+ sizeof(*pvr_dev->fwif_connection_ctl), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fwif_connection_ctl_obj); -+ if (IS_ERR(pvr_dev->fwif_connection_ctl)) { -+ drm_err(drm_dev, -+ "Unable to allocate FWIF connection control memory\n"); -+ err = PTR_ERR(pvr_dev->fwif_connection_ctl); -+ goto err_out; -+ } -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_fw_fini_fwif_connection_ctl(struct pvr_device *pvr_dev) -+{ -+ pvr_fw_object_vunmap(pvr_dev->fwif_connection_ctl_obj, -+ pvr_dev->fwif_connection_ctl, false); -+ pvr_fw_object_release(pvr_dev->fwif_connection_ctl_obj); -+} -+ -+static int -+pvr_fw_create_os_structures(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct rogue_fwif_hwrinfobuf *hwrinfobuf; -+ int err; -+ -+ pvr_dev->fw_osinit = pvr_gem_create_and_map_fw_object_offset(pvr_dev, -+ pvr_dev->fw_heap_info.config_offset + PVR_ROGUE_FWIF_OSINIT_OFFSET, -+ sizeof(*pvr_dev->fw_osinit), PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_osinit_obj); -+ if (IS_ERR(pvr_dev->fw_osinit)) { -+ drm_err(drm_dev, "Unable to allocate FW OSINIT structure\n"); -+ err = PTR_ERR(pvr_dev->fw_osinit); -+ goto err_out; -+ } -+ -+ pvr_dev->fw_osdata = pvr_gem_create_and_map_fw_object( -+ pvr_dev, sizeof(*pvr_dev->fw_osdata), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_osdata_obj); -+ if (IS_ERR(pvr_dev->fw_osdata)) { -+ drm_err(drm_dev, "Unable to allocate FW OSDATA structure\n"); -+ err = PTR_ERR(pvr_dev->fw_osdata); -+ goto err_release_osinit; -+ } -+ -+ hwrinfobuf = pvr_gem_create_and_map_fw_object( -+ pvr_dev, sizeof(*hwrinfobuf), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_hwrinfobuf_obj); -+ if (IS_ERR(hwrinfobuf)) { -+ drm_err(drm_dev, -+ "Unable to allocate FW hwrinfobuf structure\n"); -+ err = PTR_ERR(hwrinfobuf); -+ goto err_release_osdata; -+ } -+ -+ err = pvr_gem_create_fw_object(pvr_dev, PVR_SYNC_OBJ_SIZE, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_mmucache_sync_obj); -+ if (err) { -+ drm_err(drm_dev, -+ "Unable to allocate MMU cache sync object\n"); -+ goto err_release_hwrinfobuf; -+ } -+ -+ pvr_dev->fw_osinit->kernel_ccbctl_fw_addr = -+ pvr_dev->kccb.ctrl_fw_addr; -+ pvr_dev->fw_osinit->kernel_ccb_fw_addr = pvr_dev->kccb.ccb_fw_addr; -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_dev->kccb_rtn_obj, -+ &pvr_dev->fw_osinit->kernel_ccb_rtn_slots_fw_addr)); -+ -+ pvr_dev->fw_osinit->firmware_ccbctl_fw_addr = -+ pvr_dev->fwccb.ctrl_fw_addr; -+ pvr_dev->fw_osinit->firmware_ccb_fw_addr = pvr_dev->fwccb.ccb_fw_addr; -+ -+ pvr_dev->fw_osinit->work_est_firmware_ccbctl_fw_addr = 0; -+ pvr_dev->fw_osinit->work_est_firmware_ccb_fw_addr = 0; -+ -+ WARN_ON(!pvr_gem_get_fw_addr( -+ pvr_dev->fw_hwrinfobuf_obj, -+ &pvr_dev->fw_osinit->rogue_fwif_hwr_info_buf_ctl_fw_addr)); -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_dev->fw_osdata_obj, -+ &pvr_dev->fw_osinit->fw_os_data_fw_addr)); -+ -+ pvr_dev->fw_osinit->hwr_debug_dump_limit = 0; -+ -+ ROGUE_FWIF_COMPCHECKS_BVNC_INIT( -+ pvr_dev->fw_osinit->rogue_comp_checks.hw_bvnc); -+ ROGUE_FWIF_COMPCHECKS_BVNC_INIT( -+ pvr_dev->fw_osinit->rogue_comp_checks.fw_bvnc); -+ -+ pvr_fw_object_vunmap(pvr_dev->fw_hwrinfobuf_obj, hwrinfobuf, false); -+ /* fw_osinit_obj and fw_osdata_obj remain mapped on the CPU. */ -+ return 0; -+ -+err_release_hwrinfobuf: -+ pvr_fw_object_vunmap(pvr_dev->fw_hwrinfobuf_obj, hwrinfobuf, false); -+ pvr_fw_object_release(pvr_dev->fw_hwrinfobuf_obj); -+ -+err_release_osdata: -+ pvr_fw_object_vunmap(pvr_dev->fw_osdata_obj, pvr_dev->fw_osdata, false); -+ pvr_fw_object_release(pvr_dev->fw_osdata_obj); -+ -+err_release_osinit: -+ pvr_fw_object_vunmap(pvr_dev->fw_osinit_obj, pvr_dev->fw_osinit, false); -+ pvr_fw_object_release(pvr_dev->fw_osinit_obj); -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_fw_destroy_os_structures(struct pvr_device *pvr_dev) -+{ -+ pvr_fw_object_release(pvr_dev->fw_mmucache_sync_obj); -+ pvr_fw_object_release(pvr_dev->fw_hwrinfobuf_obj); -+ pvr_fw_object_vunmap(pvr_dev->fw_osdata_obj, pvr_dev->fw_osdata, false); -+ pvr_fw_object_release(pvr_dev->fw_osdata_obj); -+ pvr_fw_object_vunmap(pvr_dev->fw_osinit_obj, pvr_dev->fw_osinit, false); -+ pvr_fw_object_release(pvr_dev->fw_osinit_obj); -+} -+ -+static int -+pvr_fw_create_dev_structures(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct rogue_fwif_sysdata *sysdata; -+ struct rogue_fwif_gpu_util_fwcb *gpu_util_fwcb; -+ struct rogue_fwif_runtime_cfg *runtime_cfg; -+ u32 clock_speed_hz; -+ u32 *fault_page; -+ dma_addr_t fault_dma_addr; -+ int i; -+ int err; -+ -+ pvr_dev->fw_sysinit = pvr_gem_create_and_map_fw_object_offset(pvr_dev, -+ pvr_dev->fw_heap_info.config_offset + PVR_ROGUE_FWIF_SYSINIT_OFFSET, -+ sizeof(*pvr_dev->fw_sysinit), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_sysinit_obj); -+ if (IS_ERR(pvr_dev->fw_sysinit)) { -+ drm_err(drm_dev, "Unable to allocate FW SYSINIT structure\n"); -+ err = PTR_ERR(pvr_dev->fw_sysinit); -+ goto err_out; -+ } -+ -+ sysdata = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*sysdata), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_sysdata_obj); -+ if (IS_ERR(sysdata)) { -+ drm_err(drm_dev, "Unable to allocate FW SYSDATA structure\n"); -+ err = PTR_ERR(sysdata); -+ goto err_release_sysinit; -+ } -+ sysdata->config_flags = 0; -+ sysdata->config_flags_ext = 0; -+ pvr_fw_object_vunmap(pvr_dev->fw_sysdata_obj, sysdata, false); -+ -+ fault_page = pvr_gem_create_and_map_fw_object(pvr_dev, PVR_ROGUE_FAULT_PAGE_SIZE, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED, -+ &pvr_dev->fw_fault_page_obj); -+ if (IS_ERR(fault_page)) { -+ drm_err(drm_dev, "Unable to allocate FW fault page\n"); -+ err = PTR_ERR(fault_page); -+ goto err_release_sysdata; -+ } -+ for (i = 0; i < PVR_ROGUE_FAULT_PAGE_SIZE / sizeof(*fault_page); i++) -+ fault_page[i] = 0xdeadbee0; -+ pvr_fw_object_vunmap(pvr_dev->fw_fault_page_obj, fault_page, false); -+ -+ gpu_util_fwcb = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*gpu_util_fwcb), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_gpu_util_fwcb_obj); -+ if (IS_ERR(gpu_util_fwcb)) { -+ drm_err(drm_dev, "Unable to allocate GPU util FWCB\n"); -+ err = PTR_ERR(gpu_util_fwcb); -+ goto err_release_fault_page; -+ } -+ /* TODO : add timestamp. */ -+ gpu_util_fwcb->last_word = PVR_FWIF_GPU_UTIL_STATE_IDLE; -+ pvr_fw_object_vunmap(pvr_dev->fw_gpu_util_fwcb_obj, gpu_util_fwcb, false); -+ -+ err = pvr_device_clk_core_get_freq(pvr_dev, &clock_speed_hz); -+ if (err) { -+ drm_err(drm_dev, "Unable to determine core clock frequency\n"); -+ goto err_release_gpu_util_fwcb; -+ } -+ -+ runtime_cfg = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*runtime_cfg), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_runtime_cfg_obj); -+ if (IS_ERR(runtime_cfg)) { -+ drm_err(drm_dev, "Unable to allocate FW runtime config\n"); -+ err = PTR_ERR(runtime_cfg); -+ goto err_release_gpu_util_fwcb; -+ } -+ runtime_cfg->core_clock_speed = clock_speed_hz; -+ runtime_cfg->active_pm_latency_ms = 0; -+ runtime_cfg->active_pm_latency_persistant = true; -+ WARN_ON(PVR_FEATURE_VALUE(pvr_dev, num_clusters, -+ &runtime_cfg->default_dusts_num_init) != 0); -+ pvr_fw_object_vunmap(pvr_dev->fw_runtime_cfg_obj, runtime_cfg, false); -+ -+ err = pvr_fw_trace_init(pvr_dev); -+ if (err) -+ goto err_release_runtime_cfg; -+ -+ err = pvr_fw_get_dma_addr(pvr_dev->fw_fault_page_obj, 0, &fault_dma_addr); -+ if (err) { -+ drm_err(drm_dev, -+ "Unable to get FW fault page physical address\n"); -+ goto err_trace_fini; -+ } -+ pvr_dev->fw_sysinit->fault_phys_addr = (u64)fault_dma_addr; -+ -+ pvr_dev->fw_sysinit->pds_exec_base = ROGUE_PDSCODEDATA_HEAP_BASE; -+ pvr_dev->fw_sysinit->usc_exec_base = ROGUE_USCCODE_HEAP_BASE; -+ -+ WARN_ON(!pvr_gem_get_fw_addr( -+ pvr_dev->fw_runtime_cfg_obj, -+ &pvr_dev->fw_sysinit->runtime_cfg_fw_addr)); -+ WARN_ON(!pvr_gem_get_fw_addr( -+ pvr_dev->fw_trace.tracebuf_ctrl_obj, -+ &pvr_dev->fw_sysinit->trace_buf_ctl_fw_addr)); -+ WARN_ON(!pvr_gem_get_fw_addr( -+ pvr_dev->fw_sysdata_obj, -+ &pvr_dev->fw_sysinit->fw_sys_data_fw_addr)); -+ WARN_ON(!pvr_gem_get_fw_addr( -+ pvr_dev->fw_gpu_util_fwcb_obj, -+ &pvr_dev->fw_sysinit->gpu_util_fw_cb_ctl_fw_addr)); -+ if (pvr_dev->fw_core_data_obj) { -+ WARN_ON(!pvr_gem_get_fw_addr( -+ pvr_dev->fw_core_data_obj, -+ &pvr_dev->fw_sysinit->coremem_data_store.fw_addr)); -+ } -+ -+ /* Currently unsupported. */ -+ pvr_dev->fw_sysinit->counter_dump_ctl.buffer_fw_addr = 0; -+ pvr_dev->fw_sysinit->counter_dump_ctl.size_in_dwords = 0; -+ -+ /* Skip alignment checks. */ -+ pvr_dev->fw_sysinit->align_checks = 0; -+ -+ pvr_dev->fw_sysinit->filter_flags = 0; -+ pvr_dev->fw_sysinit->hw_perf_filter = 0; -+ pvr_dev->fw_sysinit->firmware_perf = FW_PERF_CONF_NONE; -+ pvr_dev->fw_sysinit->initial_core_clock_speed = clock_speed_hz; -+ pvr_dev->fw_sysinit->active_pm_latency_ms = 0; -+ pvr_dev->fw_sysinit->gpio_validation_mode = ROGUE_FWIF_GPIO_VAL_OFF; -+ pvr_dev->fw_sysinit->firmware_started = false; -+ pvr_dev->fw_sysinit->marker_val = 1; -+ -+ memset(&pvr_dev->fw_sysinit->bvnc_km_feature_flags, 0, -+ sizeof(pvr_dev->fw_sysinit->bvnc_km_feature_flags)); -+ -+ return 0; -+ -+err_trace_fini: -+ pvr_fw_trace_fini(pvr_dev); -+ -+err_release_runtime_cfg: -+ pvr_fw_object_release(pvr_dev->fw_runtime_cfg_obj); -+ -+err_release_gpu_util_fwcb: -+ pvr_fw_object_release(pvr_dev->fw_gpu_util_fwcb_obj); -+ -+err_release_fault_page: -+ pvr_fw_object_release(pvr_dev->fw_fault_page_obj); -+ -+err_release_sysdata: -+ pvr_fw_object_release(pvr_dev->fw_sysdata_obj); -+ -+err_release_sysinit: -+ pvr_fw_object_vunmap(pvr_dev->fw_sysinit_obj, pvr_dev->fw_sysinit, false); -+ pvr_fw_object_release(pvr_dev->fw_sysinit_obj); -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_fw_destroy_dev_structures(struct pvr_device *pvr_dev) -+{ -+ pvr_fw_trace_fini(pvr_dev); -+ pvr_fw_object_release(pvr_dev->fw_runtime_cfg_obj); -+ pvr_fw_object_release(pvr_dev->fw_gpu_util_fwcb_obj); -+ pvr_fw_object_release(pvr_dev->fw_fault_page_obj); -+ pvr_fw_object_release(pvr_dev->fw_sysdata_obj); -+ pvr_fw_object_vunmap(pvr_dev->fw_sysinit_obj, pvr_dev->fw_sysinit, false); -+ pvr_fw_object_release(pvr_dev->fw_sysinit_obj); -+} -+ -+/** -+ * pvr_fw_process() - Process firmware image, allocate FW memory and create boot -+ * arguments -+ * @pvr_dev: Device pointer. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_gem_create_and_map_fw_object_offset(), or -+ * * Any error returned by pvr_gem_create_and_map_fw_object(). -+ */ -+static int -+pvr_fw_process(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ const u8 *fw = pvr_dev->fw->data; -+ const struct pvr_fw_info_header *header; -+ const struct pvr_fw_layout_entry *layout_entries; -+ u32 code_alloc_size; -+ u32 data_alloc_size; -+ u32 core_code_alloc_size; -+ u32 core_data_alloc_size; -+ u8 *fw_code_ptr; -+ u8 *fw_data_ptr; -+ u8 *fw_core_code_ptr; -+ u8 *fw_core_data_ptr; -+ int err; -+ -+ err = pvr_fw_validate(pvr_dev, &header, &layout_entries); -+ if (err) -+ goto err_out; -+ -+ layout_get_sizes(layout_entries, header->layout_entry_num, -+ &code_alloc_size, &data_alloc_size, -+ &core_code_alloc_size, &core_data_alloc_size); -+ -+ /* Allocate and map memory for firmware sections. */ -+ -+ /* -+ * Code allocation must be at the start of the firmware heap, otherwise -+ * firmware processor will be unable to boot. -+ * -+ * This has the useful side-effect that for every other object in the -+ * driver, a firmware address of 0 is invalid. -+ */ -+ fw_code_ptr = pvr_gem_create_and_map_fw_object_offset(pvr_dev, 0, code_alloc_size, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, &pvr_dev->fw_code_obj); -+ if (IS_ERR(fw_code_ptr)) { -+ drm_err(drm_dev, "Unable to allocate FW code memory\n"); -+ err = PTR_ERR(fw_code_ptr); -+ goto err_out; -+ } -+ -+ fw_data_ptr = pvr_gem_create_and_map_fw_object(pvr_dev, data_alloc_size, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, &pvr_dev->fw_data_obj); -+ if (IS_ERR(fw_data_ptr)) { -+ drm_err(drm_dev, "Unable to allocate FW data memory\n"); -+ err = PTR_ERR(fw_data_ptr); -+ goto err_free_fw_code_obj; -+ } -+ -+ /* Core code and data sections are optional. */ -+ if (core_code_alloc_size) { -+ fw_core_code_ptr = pvr_gem_create_and_map_fw_object(pvr_dev, core_code_alloc_size, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_core_code_obj); -+ if (IS_ERR(fw_core_code_ptr)) { -+ drm_err(drm_dev, -+ "Unable to allocate FW core code memory\n"); -+ err = PTR_ERR(fw_core_code_ptr); -+ goto err_free_fw_data_obj; -+ } -+ } else { -+ fw_core_code_ptr = NULL; -+ } -+ -+ if (core_data_alloc_size) { -+ fw_core_data_ptr = pvr_gem_create_and_map_fw_object(pvr_dev, core_data_alloc_size, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->fw_core_data_obj); -+ if (IS_ERR(fw_core_data_ptr)) { -+ drm_err(drm_dev, -+ "Unable to allocate FW core data memory\n"); -+ err = PTR_ERR(fw_core_data_ptr); -+ goto err_free_fw_core_code_obj; -+ } -+ } else { -+ fw_core_data_ptr = NULL; -+ } -+ -+ err = pvr_dev->fw_funcs->fw_process(pvr_dev, fw, layout_entries, header->layout_entry_num, -+ fw_code_ptr, fw_data_ptr, fw_core_code_ptr, -+ fw_core_data_ptr, core_code_alloc_size); -+ -+ if (err) -+ goto err_free_fw_core_data_obj; -+ -+ /* We're finished with the firmware section memory on the CPU, unmap. */ -+ if (fw_core_data_ptr) -+ pvr_fw_object_vunmap(pvr_dev->fw_core_data_obj, fw_core_data_ptr, false); -+ if (fw_core_code_ptr) -+ pvr_fw_object_vunmap(pvr_dev->fw_core_code_obj, fw_core_code_ptr, false); -+ pvr_fw_object_vunmap(pvr_dev->fw_data_obj, fw_data_ptr, false); -+ fw_data_ptr = NULL; -+ pvr_fw_object_vunmap(pvr_dev->fw_code_obj, fw_code_ptr, false); -+ fw_code_ptr = NULL; -+ -+ err = pvr_fw_create_fwif_connection_ctl(pvr_dev); -+ if (err) -+ goto err_free_fw_core_data_obj; -+ -+ return 0; -+ -+err_free_fw_core_data_obj: -+ if (fw_core_data_ptr) { -+ pvr_fw_object_vunmap(pvr_dev->fw_core_data_obj, fw_core_data_ptr, false); -+ pvr_fw_object_release(pvr_dev->fw_core_data_obj); -+ } -+ -+err_free_fw_core_code_obj: -+ if (fw_core_code_ptr) { -+ pvr_fw_object_vunmap(pvr_dev->fw_core_code_obj, fw_core_code_ptr, false); -+ pvr_fw_object_release(pvr_dev->fw_core_code_obj); -+ } -+ -+err_free_fw_data_obj: -+ if (fw_data_ptr) -+ pvr_fw_object_vunmap(pvr_dev->fw_data_obj, fw_data_ptr, false); -+ pvr_fw_object_release(pvr_dev->fw_data_obj); -+ -+err_free_fw_code_obj: -+ if (fw_code_ptr) -+ pvr_fw_object_vunmap(pvr_dev->fw_code_obj, fw_code_ptr, false); -+ pvr_fw_object_release(pvr_dev->fw_code_obj); -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_fw_cleanup(struct pvr_device *pvr_dev) -+{ -+ pvr_fw_fini_fwif_connection_ctl(pvr_dev); -+ -+ if (pvr_dev->fw_core_code_obj) -+ pvr_fw_object_release(pvr_dev->fw_core_code_obj); -+ if (pvr_dev->fw_core_data_obj) -+ pvr_fw_object_release(pvr_dev->fw_core_data_obj); -+ pvr_fw_object_release(pvr_dev->fw_code_obj); -+ pvr_fw_object_release(pvr_dev->fw_data_obj); -+} -+ -+/** -+ * pvr_wait_for_fw_boot() - Wait for firmware to finish booting -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%ETIMEDOUT if firmware fails to boot within timeout. -+ */ -+int -+pvr_wait_for_fw_boot(struct pvr_device *pvr_dev) -+{ -+ ktime_t deadline = ktime_add_us(ktime_get(), FW_BOOT_TIMEOUT_USEC); -+ -+ while (ktime_to_ns(ktime_sub(deadline, ktime_get())) > 0) { -+ if (READ_ONCE(pvr_dev->fw_sysinit->firmware_started)) -+ return 0; -+ } -+ -+ return -ETIMEDOUT; -+} -+ -+/* -+ * pvr_fw_heap_info_init() - Calculate size and masks for FW heap -+ * @pvr_dev: Target PowerVR device. -+ * @log2_size: Log2 of raw heap size. -+ * @reserved_size: Size of reserved area of heap, in bytes. May be zero. -+ */ -+void -+pvr_fw_heap_info_init(struct pvr_device *pvr_dev, u32 log2_size, u32 reserved_size) -+{ -+ pvr_dev->fw_heap_info.gpu_addr = PVR_ROGUE_FW_MAIN_HEAP_BASE; -+ pvr_dev->fw_heap_info.log2_size = log2_size; -+ pvr_dev->fw_heap_info.reserved_size = reserved_size; -+ pvr_dev->fw_heap_info.raw_size = 1 << pvr_dev->fw_heap_info.log2_size; -+ pvr_dev->fw_heap_info.offset_mask = pvr_dev->fw_heap_info.raw_size - 1; -+ pvr_dev->fw_heap_info.config_offset = pvr_dev->fw_heap_info.raw_size - -+ PVR_ROGUE_FW_CONFIG_HEAP_SIZE; -+ pvr_dev->fw_heap_info.size = pvr_dev->fw_heap_info.raw_size - -+ (PVR_ROGUE_FW_CONFIG_HEAP_SIZE + reserved_size); -+} -+ -+/** -+ * pvr_fw_init() - Initialise and boot firmware -+ * @pvr_dev: Target PowerVR device -+ * -+ * On successful completion of the function the PowerVR device will be -+ * initialised and ready to use. -+ * -+ * Returns: -+ * * 0 on success, -+ * * -%EINVAL on invalid firmware image, -+ * * -%ENOMEM on out of memory, or -+ * * -%ETIMEDOUT if firmware processor fails to boot or on register poll timeout. -+ */ -+int -+pvr_fw_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ u32 kccb_size_log2 = ROGUE_FWIF_KCCB_NUMCMDS_LOG2_DEFAULT; -+ u32 kccb_rtn_size = (1 << kccb_size_log2) * sizeof(*pvr_dev->kccb_rtn); -+ u32 ddk_version; -+ int err; -+ -+ if (pvr_dev->fw_processor_type == PVR_FW_PROCESSOR_TYPE_META) { -+ pvr_dev->fw_funcs = &pvr_fw_funcs_meta; -+ } else if (pvr_dev->fw_processor_type == PVR_FW_PROCESSOR_TYPE_MIPS) { -+ pvr_dev->fw_funcs = &pvr_fw_funcs_mips; -+ } else { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = pvr_dev->fw_funcs->init(pvr_dev); -+ if (err) -+ goto err_out; -+ -+ drm_mm_init(&pvr_dev->fw_mm, ROGUE_FW_HEAP_BASE, pvr_dev->fw_heap_info.raw_size); -+ pvr_dev->fw_mm_base = ROGUE_FW_HEAP_BASE; -+ spin_lock_init(&pvr_dev->fw_mm_lock); -+ -+ err = pvr_fw_process(pvr_dev); -+ if (err) -+ goto err_mm_takedown; -+ -+ /* Initialise KCCB and FWCCB. */ -+ err = pvr_kccb_init(pvr_dev); -+ if (err) -+ goto err_fw_cleanup; -+ -+ err = pvr_fwccb_init(pvr_dev); -+ if (err) -+ goto err_kccb_fini; -+ -+ /* Allocate memory for KCCB return slots. */ -+ pvr_dev->kccb_rtn = pvr_gem_create_and_map_fw_object(pvr_dev, kccb_rtn_size, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_dev->kccb_rtn_obj); -+ if (IS_ERR(pvr_dev->kccb_rtn)) { -+ err = PTR_ERR(pvr_dev->kccb_rtn); -+ goto err_fwccb_fini; -+ } -+ -+ err = pvr_fw_create_os_structures(pvr_dev); -+ if (err) -+ goto err_kccb_rtn_release; -+ -+ err = pvr_fw_create_dev_structures(pvr_dev); -+ if (err) -+ goto err_destroy_os_structures; -+ -+ err = pvr_dev->fw_funcs->start(pvr_dev); -+ if (err) -+ goto err_destroy_dev_structures; -+ -+ err = pvr_wait_for_fw_boot(pvr_dev); -+ if (err) { -+ drm_err(drm_dev, "Firmware failed to boot\n"); -+ goto err_fw_stop; -+ } -+ -+ pvr_dev->fw_booted = true; -+ -+ /* Now that firmware has booted, we can get the firmware version. */ -+ ddk_version = pvr_dev->fw_osinit->rogue_comp_checks.ddk_version; -+ pvr_dev->fw_version.major = ddk_version >> 16; -+ pvr_dev->fw_version.minor = ddk_version & 0xffff; -+ -+ return 0; -+ -+err_fw_stop: -+ pvr_dev->fw_funcs->stop(pvr_dev); -+ -+err_destroy_dev_structures: -+ pvr_fw_destroy_dev_structures(pvr_dev); -+ -+err_destroy_os_structures: -+ pvr_fw_destroy_os_structures(pvr_dev); -+ -+err_kccb_rtn_release: -+ pvr_fw_object_vunmap(pvr_dev->kccb_rtn_obj, pvr_dev->kccb_rtn, false); -+ pvr_fw_object_release(pvr_dev->kccb_rtn_obj); -+ -+err_fwccb_fini: -+ pvr_ccb_fini(&pvr_dev->fwccb); -+ -+err_kccb_fini: -+ pvr_ccb_fini(&pvr_dev->kccb); -+ -+err_fw_cleanup: -+ pvr_fw_cleanup(pvr_dev); -+ -+err_mm_takedown: -+ drm_mm_takedown(&pvr_dev->fw_mm); -+ -+ if (pvr_dev->fw_funcs->fini) -+ pvr_dev->fw_funcs->fini(pvr_dev); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_fw_fini() - Shutdown firmware processor and free associated memory -+ * @pvr_dev: Target PowerVR device -+ */ -+void -+pvr_fw_fini(struct pvr_device *pvr_dev) -+{ -+ pvr_dev->fw_funcs->stop(pvr_dev); -+ pvr_dev->fw_booted = false; -+ pvr_fw_destroy_dev_structures(pvr_dev); -+ pvr_fw_destroy_os_structures(pvr_dev); -+ pvr_fw_object_vunmap(pvr_dev->kccb_rtn_obj, (void *)pvr_dev->kccb_rtn, false); -+ pvr_fw_object_release(pvr_dev->kccb_rtn_obj); -+ /* -+ * Ensure FWCCB worker has finished executing before destroying FWCCB. The IRQ handler has -+ * been unregistered at this point so no new work should be being submitted. -+ */ -+ flush_work(&pvr_dev->fwccb_work); -+ pvr_ccb_fini(&pvr_dev->fwccb); -+ pvr_ccb_fini(&pvr_dev->kccb); -+ pvr_fw_cleanup(pvr_dev); -+ -+ drm_mm_takedown(&pvr_dev->fw_mm); -+ -+ if (pvr_dev->fw_funcs->fini) -+ pvr_dev->fw_funcs->fini(pvr_dev); -+} -+ -+/** -+ * pvr_fw_mts_schedule() - Schedule work via an MTS kick -+ * @pvr_dev: Target PowerVR device -+ * @val: Kick mask. Should be a combination of %ROGUE_CR_MTS_SCHEDULE_* -+ */ -+void -+pvr_fw_mts_schedule(struct pvr_device *pvr_dev, u32 val) -+{ -+ /* Ensure memory is flushed before kicking MTS. */ -+ wmb(); -+ -+ PVR_CR_WRITE32(pvr_dev, MTS_SCHEDULE, val); -+ -+ /* Ensure the MTS kick goes through before continuing. */ -+ mb(); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_fw.h b/drivers/gpu/drm/imagination/pvr_fw.h -new file mode 100644 -index 000000000000..1ee11a8b1d20 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw.h -@@ -0,0 +1,163 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_FW_H__ -+#define __PVR_FW_H__ -+ -+#include "pvr_fw_info.h" -+ -+#include <linux/types.h> -+ -+/* Forward declaration from pvr_device.h. */ -+struct pvr_device; -+ -+#define ROGUE_FWIF_FWCCB_NUMCMDS_LOG2 5 -+ -+#define ROGUE_FWIF_KCCB_NUMCMDS_LOG2_DEFAULT 7 -+ -+/** -+ * struct pvr_fw_funcs - FW processor function table -+ */ -+struct pvr_fw_funcs { -+ /** -+ * @init: -+ * -+ * FW processor specific initialisation. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This function must call pvr_fw_heap_calculate() to initialise the firmware heap for this -+ * FW processor. -+ * -+ * This function is mandatory. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any appropriate error on failure. -+ */ -+ int (*init)(struct pvr_device *pvr_dev); -+ -+ /** -+ * @fini: -+ * -+ * FW processor specific finalisation. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This function is optional. -+ */ -+ void (*fini)(struct pvr_device *pvr_dev); -+ -+ /** -+ * @fw_process: -+ * -+ * Load and process firmware image. -+ * @pvr_dev: Target PowerVR device. -+ * @fw: Pointer to firmware image. -+ * @layout_entries: Layout of firmware memory. -+ * @num_layout_entries: Number of entries in @layout_entries. -+ * @fw_code_ptr: Pointer to firmware code section. -+ * @fw_data_ptr: Pointer to firmware data section. -+ * @fw_core_code_ptr: Pointer to firmware core code section. May be %NULL. -+ * @fw_core_data_ptr: Pointer to firmware core data section. May be %NULL. -+ * @core_code_alloc_size: Total allocation size of core code section. -+ * -+ * This function is mandatory. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any appropriate error on failure. -+ */ -+ int (*fw_process)(struct pvr_device *pvr_dev, const u8 *fw, -+ const struct pvr_fw_layout_entry *layout_entries, u32 num_layout_entries, -+ u8 *fw_code_ptr, u8 *fw_data_ptr, u8 *fw_core_code_ptr, -+ u8 *fw_core_data_ptr, u32 core_code_alloc_size); -+ -+ /** -+ * @vm_map: -+ * -+ * Map FW object into FW processor address space. -+ * @pvr_dev: Target PowerVR device. -+ * @fw_obj: FW object to map. -+ * -+ * This function is mandatory. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any appropriate error on failure. -+ */ -+ int (*vm_map)(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj); -+ -+ /** -+ * @vm_unmap: -+ * -+ * Unmap FW object from FW processor address space. -+ * @pvr_dev: Target PowerVR device. -+ * @fw_obj: FW object to map. -+ * -+ * This function is mandatory. -+ */ -+ void (*vm_unmap)(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj); -+ -+ /** -+ * @get_fw_addr_with_offset: -+ * -+ * Called to get address of object in firmware address space, with offset. -+ * @fw_obj: Pointer to object. -+ * @offset: Desired offset from start of object. -+ * -+ * This function is mandatory. -+ * -+ * Returns: -+ * * Address in firmware address space. -+ */ -+ u32 (*get_fw_addr_with_offset)(struct pvr_fw_object *fw_obj, u32 offset); -+ -+ /** -+ * @start: -+ * -+ * Called to start FW processor and boot firmware. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This function is mandatory. -+ * -+ * Returns: -+ * * 0 on success. -+ * * Any appropriate error on failure. -+ */ -+ int (*start)(struct pvr_device *pvr_dev); -+ -+ /** -+ * @stop: -+ * -+ * Called to stop FW processor execution. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This function is mandatory. -+ * -+ * Returns: -+ * * 0 on success. -+ * * Any appropriate error on failure. -+ */ -+ int (*stop)(struct pvr_device *pvr_dev); -+}; -+ -+extern const struct pvr_fw_funcs pvr_fw_funcs_meta; -+extern const struct pvr_fw_funcs pvr_fw_funcs_mips; -+ -+int pvr_fw_init(struct pvr_device *pvr_dev); -+void pvr_fw_fini(struct pvr_device *pvr_dev); -+ -+void pvr_fw_mts_schedule(struct pvr_device *pvr_dev, u32 val); -+ -+void -+pvr_fw_heap_info_init(struct pvr_device *pvr_dev, u32 log2_size, u32 reserved_size); -+ -+const struct pvr_fw_layout_entry * -+pvr_fw_find_layout_entry(const struct pvr_fw_layout_entry *layout_entries, u32 num_layout_entries, -+ enum pvr_fw_section_id id); -+int -+pvr_fw_find_mmu_segment(u32 addr, u32 size, const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, void *fw_code_ptr, void *fw_data_ptr, -+ void *fw_core_code_ptr, void *fw_core_data_ptr, -+ void **host_addr_out); -+ -+#endif /* __PVR_FW_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_fw_info.h b/drivers/gpu/drm/imagination/pvr_fw_info.h -new file mode 100644 -index 000000000000..2f2a6ffe61b9 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw_info.h -@@ -0,0 +1,106 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_FW_INFO_H__ -+#define __PVR_FW_INFO_H__ -+ -+#include <linux/sizes.h> -+#include <linux/types.h> -+ -+/* -+ * Firmware binary block unit in bytes. -+ * Raw data stored in FW binary will be aligned to this size. -+ */ -+#define FW_BLOCK_SIZE SZ_4K -+ -+/* Maximum number of entries in firmware layout table. */ -+#define PVR_FW_INFO_MAX_NUM_ENTRIES 8 -+ -+enum pvr_fw_section_id { -+ META_CODE = 0, -+ META_PRIVATE_DATA, -+ META_COREMEM_CODE, -+ META_COREMEM_DATA, -+ MIPS_CODE, -+ MIPS_EXCEPTIONS_CODE, -+ MIPS_BOOT_CODE, -+ MIPS_PRIVATE_DATA, -+ MIPS_BOOT_DATA, -+ MIPS_STACK, -+ RISCV_UNCACHED_CODE, -+ RISCV_CACHED_CODE, -+ RISCV_PRIVATE_DATA, -+ RISCV_COREMEM_CODE, -+ RISCV_COREMEM_DATA, -+}; -+ -+enum pvr_fw_section_type { -+ NONE = 0, -+ FW_CODE, -+ FW_DATA, -+ FW_COREMEM_CODE, -+ FW_COREMEM_DATA, -+}; -+ -+/* -+ * FW binary format with FW info attached: -+ * -+ * Contents Offset -+ * +-----------------+ -+ * | | 0 -+ * | | -+ * | Original binary | -+ * | file | -+ * | (.ldr/.elf) | -+ * | | -+ * | | -+ * +-----------------+ -+ * | FW info header | FILE_SIZE - 4K -+ * +-----------------+ -+ * | | -+ * | FW layout table | -+ * | | -+ * +-----------------+ -+ * FILE_SIZE -+ */ -+ -+#define PVR_FW_INFO_VERSION 1 -+ -+/** struct pvr_fw_info_header - Firmware header */ -+struct pvr_fw_info_header { -+ /** @info_version: FW info header version. */ -+ u32 info_version; -+ /** @header_len: Header length. */ -+ u32 header_len; -+ /** @layout_entry_num: Number of entries in the layout table. */ -+ u32 layout_entry_num; -+ /** @layout_entry_size: Size of an entry in the layout table. */ -+ u32 layout_entry_size; -+ /** @bvnc: FW version number. */ -+ aligned_u64 bvnc; -+ /** @fw_page_size: Page size of processor on which firmware executes. */ -+ u32 fw_page_size; -+ /** @flags: Compatibility flags. */ -+ u32 flags; -+}; -+ -+/** -+ * struct pvr_fw_layout_entry - Entry in firmware layout table, describing a -+ * section of the firmware image -+ */ -+struct pvr_fw_layout_entry { -+ /** @id: Section ID. */ -+ enum pvr_fw_section_id id; -+ /** @type: Section type. */ -+ enum pvr_fw_section_type type; -+ /** @base_addr: Base address of section in FW address space. */ -+ u32 base_addr; -+ /** @max_size: Maximum size of section, in bytes. */ -+ u32 max_size; -+ /** @alloc_size: Allocation size of section, in bytes. */ -+ u32 alloc_size; -+ /** @alloc_offset: Allocation offset of section. */ -+ u32 alloc_offset; -+}; -+ -+#endif /* __PVR_FW_INFO_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_fw_meta.c b/drivers/gpu/drm/imagination/pvr_fw_meta.c -new file mode 100644 -index 000000000000..63a29b0cb686 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw_meta.c -@@ -0,0 +1,834 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_fw.h" -+#include "pvr_fw_info.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_cr_defs.h" -+#include "pvr_rogue_meta.h" -+ -+#include <linux/compiler.h> -+#include <linux/delay.h> -+#include <linux/firmware.h> -+#include <linux/ktime.h> -+#include <linux/types.h> -+ -+#define ROGUE_FW_HEAP_META_SHIFT 25 /* 32 MB */ -+ -+#define POLL_TIMEOUT_USEC 1000000 -+ -+/** -+ * pvr_meta_cr_read32() - Read a META register via the Slave Port -+ * @pvr_dev: Device pointer. -+ * @reg_addr: Address of register to read. -+ * @reg_value_out: Pointer to location to store register value. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_cr_poll_reg32(). -+ */ -+static int -+pvr_meta_cr_read32(struct pvr_device *pvr_dev, u32 reg_addr, u32 *reg_value_out) -+{ -+ int err; -+ -+ /* Wait for Slave Port to be Ready. */ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_META_SP_MSLVCTRL1, -+ ROGUE_CR_META_SP_MSLVCTRL1_READY_EN | -+ ROGUE_CR_META_SP_MSLVCTRL1_GBLPORT_IDLE_EN, -+ ROGUE_CR_META_SP_MSLVCTRL1_READY_EN | -+ ROGUE_CR_META_SP_MSLVCTRL1_GBLPORT_IDLE_EN, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ /* Issue a Read. */ -+ PVR_CR_WRITE32(pvr_dev, META_SP_MSLVCTRL0, -+ reg_addr | ROGUE_CR_META_SP_MSLVCTRL0_RD_EN); -+ (void)PVR_CR_READ32(pvr_dev, META_SP_MSLVCTRL0); /* Fence write. */ -+ -+ /* Wait for Slave Port to be Ready. */ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_META_SP_MSLVCTRL1, -+ ROGUE_CR_META_SP_MSLVCTRL1_READY_EN | -+ ROGUE_CR_META_SP_MSLVCTRL1_GBLPORT_IDLE_EN, -+ ROGUE_CR_META_SP_MSLVCTRL1_READY_EN | -+ ROGUE_CR_META_SP_MSLVCTRL1_GBLPORT_IDLE_EN, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ *reg_value_out = PVR_CR_READ32(pvr_dev, META_SP_MSLVDATAX); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static void -+rogue_meta_proc_wrapper_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ u64 garten_config; -+ -+ /* Set Garten IDLE to META idle and Set the Garten Wrapper BIF Fence address. */ -+ -+ /* Garten IDLE bit controlled by META. */ -+ garten_config = ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_IDLE_CTRL_META; -+ -+ /* The fence addr is set during the fw init sequence. */ -+ -+ /* Set PC = 0 for fences. */ -+ garten_config &= -+ ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_PC_BASE_CLRMSK; -+ garten_config |= -+ (u64)MMU_CONTEXT_MAPPING_FWPRIV -+ << ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_PC_BASE_SHIFT; -+ -+ /* Set SLC DM=META. */ -+ garten_config |= ((u64)ROGUE_FW_SEGMMU_META_BIFDM_ID) -+ << ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_DM_SHIFT; -+ -+ drm_info(drm_dev, "Configure META wrapper"); -+ PVR_CR_WRITE64(pvr_dev, MTS_GARTEN_WRAPPER_CONFIG, garten_config); -+} -+ -+static void -+rogue_axi_ace_list_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ -+ /* Setup AXI-ACE config. Set everything to outer cache. */ -+ u64 reg_val = -+ (3U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_NON_SNOOPING_SHIFT) | -+ (3U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_NON_SNOOPING_SHIFT) | -+ (2U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_CACHE_MAINTENANCE_SHIFT) | -+ (2U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_COHERENT_SHIFT) | -+ (2U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_COHERENT_SHIFT) | -+ (2U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWCACHE_COHERENT_SHIFT) | -+ (2U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_COHERENT_SHIFT) | -+ (2U -+ << ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_CACHE_MAINTENANCE_SHIFT); -+ -+ drm_info(drm_dev, "Init AXI-ACE interface"); -+ PVR_CR_WRITE64(pvr_dev, AXI_ACE_LITE_CONFIGURATION, reg_val); -+} -+ -+static void -+rogue_bif_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ dma_addr_t pc_dma_addr; -+ u64 pc_addr; -+ -+ /* Acquire the address of the Kernel Page Catalogue. */ -+ pc_dma_addr = pvr_vm_get_page_catalogue_addr(pvr_dev->kernel_vm_ctx); -+ -+ /* Write the kernel catalogue base. */ -+ drm_info(drm_dev, "Rogue firmware MMU Page Catalogue"); -+ -+ pc_addr = ((((u64)pc_dma_addr >> ROGUE_CR_BIF_CAT_BASE0_ADDR_ALIGNSHIFT) -+ << ROGUE_CR_BIF_CAT_BASE0_ADDR_SHIFT) & -+ ~ROGUE_CR_BIF_CAT_BASE0_ADDR_CLRMSK); -+ -+ __pvr_cr_write64(pvr_dev, BIF_CAT_BASEX(MMU_CONTEXT_MAPPING_FWPRIV), -+ pc_addr); -+} -+ -+static int -+rogue_slc_init(struct pvr_device *pvr_dev) -+{ -+ u16 slc_cache_line_size_in_bits; -+ u32 reg_val; -+ int err; -+ -+ /* -+ * SLC Misc control. -+ * -+ * Note: This is a 64bit register and we set only the lower 32bits -+ * leaving the top 32bits (ROGUE_CR_SLC_CTRL_MISC_SCRAMBLE_BITS) -+ * unchanged from the HW default. -+ */ -+ reg_val = (PVR_CR_READ32(pvr_dev, SLC_CTRL_MISC) & -+ ROGUE_CR_SLC_CTRL_MISC_ENABLE_PSG_HAZARD_CHECK_EN) | -+ ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_PVR_HASH1; -+ -+ err = PVR_FEATURE_VALUE(pvr_dev, slc_cache_line_size_in_bits, -+ &slc_cache_line_size_in_bits); -+ if (err) -+ return err; -+ -+ /* Bypass burst combiner if SLC line size is smaller than 1024 bits. */ -+ if (slc_cache_line_size_in_bits < 1024) -+ reg_val |= ROGUE_CR_SLC_CTRL_MISC_BYPASS_BURST_COMBINER_EN; -+ -+ PVR_CR_WRITE32(pvr_dev, SLC_CTRL_MISC, reg_val); -+ -+ return 0; -+} -+ -+/** -+ * pvr_meta_start() - Start META processor and boot firmware -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Returns: -+ * * 0 on success. -+ */ -+static int -+pvr_meta_start(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ int err; -+ -+ /* Set Rogue in soft-reset. */ -+ drm_info(drm_dev, "%s: soft reset everything", __func__); -+ PVR_CR_WRITE64(pvr_dev, SOFT_RESET, ROGUE_CR_SOFT_RESET_MASKFULL); -+ -+ /* Read soft-reset to fence previous write in order to clear the SOCIF pipeline. */ -+ (void)PVR_CR_READ64(pvr_dev, SOFT_RESET); -+ -+ /* Take Rascal and Dust out of reset. */ -+ drm_info(drm_dev, "%s: Rascal and Dust out of reset", __func__); -+ PVR_CR_WRITE64(pvr_dev, SOFT_RESET, -+ ROGUE_CR_SOFT_RESET_MASKFULL ^ -+ ROGUE_CR_SOFT_RESET_RASCALDUSTS_EN); -+ -+ (void)PVR_CR_READ64(pvr_dev, SOFT_RESET); -+ -+ /* Take everything out of reset but the FW processor. */ -+ drm_info(drm_dev, "%s: Take everything out of reset but META", __func__); -+ PVR_CR_WRITE64(pvr_dev, SOFT_RESET, ROGUE_CR_SOFT_RESET_GARTEN_EN); -+ -+ (void)PVR_CR_READ64(pvr_dev, SOFT_RESET); -+ -+ err = rogue_slc_init(pvr_dev); -+ if (err) -+ goto err_reset; -+ -+ /* Configure META to Master boot */ -+ drm_info(drm_dev, "%s: META Master boot", __func__); -+ PVR_CR_WRITE64(pvr_dev, META_BOOT, ROGUE_CR_META_BOOT_MODE_EN); -+ -+ /* Initialise Firmware wrapper. */ -+ rogue_meta_proc_wrapper_init(pvr_dev); -+ -+ /* We must init the AXI-ACE interface before first BIF transaction. */ -+ rogue_axi_ace_list_init(pvr_dev); -+ -+ /* Initialise BIF. */ -+ rogue_bif_init(pvr_dev); -+ -+ drm_info(drm_dev, "%s: Take META out of reset", __func__); -+ -+ /* Need to wait for at least 16 cycles before taking the FW processor out of reset ... */ -+ udelay(3); -+ -+ PVR_CR_WRITE64(pvr_dev, SOFT_RESET, 0x0); -+ (void)PVR_CR_READ64(pvr_dev, SOFT_RESET); -+ -+ /* ... and afterwards. */ -+ udelay(3); -+ -+ return 0; -+ -+err_reset: -+ /* Put everything back into soft-reset. */ -+ PVR_CR_WRITE64(pvr_dev, SOFT_RESET, ROGUE_CR_SOFT_RESET_MASKFULL); -+ -+ return err; -+} -+ -+/** -+ * pvr_meta_stop() - Stop META processor -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_cr_poll_reg32(). -+ */ -+static int -+pvr_meta_stop(struct pvr_device *pvr_dev) -+{ -+ const u32 jones_sidekick_idle_mask = ROGUE_CR_JONES_IDLE_MASKFULL & -+ ~(ROGUE_CR_JONES_IDLE_GARTEN_EN | -+ ROGUE_CR_JONES_IDLE_SOCIF_EN | -+ ROGUE_CR_JONES_IDLE_HOSTIF_EN); -+ u32 reg_value; -+ int err; -+ -+ /* -+ * Wait for Sidekick/Jones to signal IDLE except for the Garten Wrapper. -+ * For LAYOUT_MARS = 1, SIDEKICK would have been powered down by FW. -+ */ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_JONES_IDLE, -+ jones_sidekick_idle_mask, -+ jones_sidekick_idle_mask, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ /* Unset MTS DM association with threads. */ -+ PVR_CR_WRITE32(pvr_dev, MTS_INTCTX_THREAD0_DM_ASSOC, -+ ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC_MASKFULL & -+ ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC_DM_ASSOC_CLRMSK); -+ PVR_CR_WRITE32(pvr_dev, MTS_BGCTX_THREAD0_DM_ASSOC, -+ ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC_MASKFULL & -+ ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC_DM_ASSOC_CLRMSK); -+ PVR_CR_WRITE32(pvr_dev, MTS_INTCTX_THREAD1_DM_ASSOC, -+ ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC_MASKFULL & -+ ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC_DM_ASSOC_CLRMSK); -+ PVR_CR_WRITE32(pvr_dev, MTS_BGCTX_THREAD1_DM_ASSOC, -+ ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC_MASKFULL & -+ ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC_DM_ASSOC_CLRMSK); -+ -+ /* Extra Idle checks. */ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_BIF_STATUS_MMU, 0, -+ ROGUE_CR_BIF_STATUS_MMU_MASKFULL, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_BIFPM_STATUS_MMU, 0, -+ ROGUE_CR_BIFPM_STATUS_MMU_MASKFULL, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_BIFPM_READS_EXT_STATUS, 0, -+ ROGUE_CR_BIFPM_READS_EXT_STATUS_MASKFULL, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ err = pvr_cr_poll_reg64(pvr_dev, ROGUE_CR_SLC_STATUS1, 0, -+ ROGUE_CR_SLC_STATUS1_MASKFULL, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ /* -+ * Wait for SLC to signal IDLE. -+ * For LAYOUT_MARS = 1, SLC would have been powered down by FW. -+ */ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_SLC_IDLE, -+ ROGUE_CR_SLC_IDLE_MASKFULL, -+ ROGUE_CR_SLC_IDLE_MASKFULL, POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ /* -+ * Wait for Sidekick/Jones to signal IDLE except for the Garten Wrapper. -+ * For LAYOUT_MARS = 1, SIDEKICK would have been powered down by FW. -+ */ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_SIDEKICK_IDLE, -+ jones_sidekick_idle_mask, -+ jones_sidekick_idle_mask, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ -+ err = pvr_meta_cr_read32(pvr_dev, META_CR_TxVECINT_BHALT, ®_value); -+ if (err) -+ goto err_out; -+ -+ if (!reg_value) { -+ /* -+ * Wait for Sidekick/Jones to signal IDLE including the Garten -+ * Wrapper if there is no debugger attached (TxVECINT_BHALT = -+ * 0x0). -+ */ -+ err = pvr_cr_poll_reg32(pvr_dev, ROGUE_CR_SIDEKICK_IDLE, -+ ROGUE_CR_SIDEKICK_IDLE_GARTEN_EN, -+ ROGUE_CR_SIDEKICK_IDLE_GARTEN_EN, -+ POLL_TIMEOUT_USEC); -+ if (err) -+ goto err_out; -+ } -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static __always_inline void -+add_boot_arg(u32 **boot_conf, u32 param, u32 data) -+{ -+ *(*boot_conf)++ = param; -+ *(*boot_conf)++ = data; -+} -+ -+static int -+meta_ldr_cmd_loadmem(struct drm_device *drm_dev, const u8 *fw, -+ struct rogue_meta_ldr_l1_data_blk *l1_data, -+ u32 coremem_size, -+ const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, u8 *fw_code_ptr, u8 *fw_data_ptr, -+ u8 *fw_core_code_ptr, u8 *fw_core_data_ptr, -+ const u32 fw_size) -+{ -+ struct rogue_meta_ldr_l2_data_blk *l2_block = -+ (struct rogue_meta_ldr_l2_data_blk *)(fw + -+ l1_data->cmd_data[1]); -+ u32 offset = l1_data->cmd_data[0]; -+ u32 data_size; -+ void *write_addr; -+ int err; -+ -+ /* Verify header is within bounds. */ -+ if (((u8 *)l2_block - fw) >= fw_size || ((u8 *)(l2_block + 1) - fw) >= fw_size) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ data_size = l2_block->length - 6 /* L2 Tag length and checksum */; -+ -+ /* Verify data is within bounds. */ -+ if (((u8 *)l2_block->block_data - fw) >= fw_size || -+ ((((u8 *)l2_block->block_data) + data_size) - fw) >= fw_size) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (!ROGUE_META_IS_COREMEM_CODE(offset, coremem_size) && -+ !ROGUE_META_IS_COREMEM_DATA(offset, coremem_size)) { -+ /* Global range is aliased to local range */ -+ offset &= ~META_MEM_GLOBAL_RANGE_BIT; -+ } -+ -+ err = pvr_fw_find_mmu_segment(offset, data_size, layout_entries, -+ num_layout_entries, fw_code_ptr, fw_data_ptr, -+ fw_core_code_ptr, fw_core_data_ptr, &write_addr); -+ if (err) { -+ drm_err(drm_dev, -+ "Addr 0x%x (size: %d) not found in any firmware segment", -+ offset, data_size); -+ goto err_out; -+ } -+ -+ memcpy(write_addr, l2_block->block_data, data_size); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int -+meta_ldr_cmd_zeromem(struct drm_device *drm_dev, -+ struct rogue_meta_ldr_l1_data_blk *l1_data, -+ u32 coremem_size, -+ const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, u8 *fw_code_ptr, u8 *fw_data_ptr, -+ u8 *fw_core_code_ptr, u8 *fw_core_data_ptr) -+{ -+ u32 offset = l1_data->cmd_data[0]; -+ u32 byte_count = l1_data->cmd_data[1]; -+ void *write_addr; -+ int err; -+ -+ if (ROGUE_META_IS_COREMEM_DATA(offset, coremem_size)) { -+ /* cannot zero coremem directly */ -+ return 0; -+ } -+ -+ /* Global range is aliased to local range */ -+ offset &= ~META_MEM_GLOBAL_RANGE_BIT; -+ -+ err = pvr_fw_find_mmu_segment(offset, byte_count, layout_entries, -+ num_layout_entries, fw_code_ptr, fw_data_ptr, -+ fw_core_code_ptr, fw_core_data_ptr, &write_addr); -+ if (err) { -+ drm_err(drm_dev, -+ "Addr 0x%x (size: %d) not found in any firmware segment", -+ offset, byte_count); -+ goto err_out; -+ } -+ -+ memset(write_addr, 0, byte_count); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int -+meta_ldr_cmd_config(struct drm_device *drm_dev, const u8 *fw, -+ struct rogue_meta_ldr_l1_data_blk *l1_data, -+ const u32 fw_size, u32 **boot_conf_ptr) -+{ -+ struct rogue_meta_ldr_l2_data_blk *l2_block = -+ (struct rogue_meta_ldr_l2_data_blk *)(fw + -+ l1_data->cmd_data[0]); -+ struct rogue_meta_ldr_cfg_blk *config_command; -+ u32 l2_block_size; -+ u32 curr_block_size = 0; -+ u32 *boot_conf = boot_conf_ptr ? *boot_conf_ptr : NULL; -+ int err; -+ -+ /* Verify block header is within bounds. */ -+ if (((u8 *)l2_block - fw) >= fw_size || ((u8 *)(l2_block + 1) - fw) >= fw_size) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ l2_block_size = l2_block->length - 6 /* L2 Tag length and checksum */; -+ config_command = (struct rogue_meta_ldr_cfg_blk *)l2_block->block_data; -+ -+ if (((u8 *)config_command - fw) >= fw_size || -+ ((((u8 *)config_command) + l2_block_size) - fw) >= fw_size) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ while (l2_block_size >= 12) { -+ if (config_command->type != ROGUE_META_LDR_CFG_WRITE) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ /* -+ * Only write to bootloader if we got a valid pointer to the FW -+ * code allocation. -+ */ -+ if (boot_conf) { -+ u32 register_offset = config_command->block_data[0]; -+ u32 register_value = config_command->block_data[1]; -+ -+ /* Do register write */ -+ add_boot_arg(&boot_conf, register_offset, -+ register_value); -+ } -+ -+ curr_block_size = 12; -+ l2_block_size -= curr_block_size; -+ config_command = (struct rogue_meta_ldr_cfg_blk -+ *)((uintptr_t)config_command + -+ curr_block_size); -+ } -+ -+ if (boot_conf_ptr) -+ *boot_conf_ptr = boot_conf; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * process_ldr_command_stream() - Process LDR firmware image and populate -+ * firmware sections -+ * @pvr_dev: Device pointer. -+ * @fw: Pointer to firmware image. -+ * @layout_entries: Pointer to layout table. -+ * @num_layout_entries: Number of entries in layout table. -+ * @fw_code_ptr: Pointer to FW code section. -+ * @fw_data_ptr: Pointer to FW data section. -+ * @fw_core_code_ptr: Pointer to FW coremem code section. -+ * @fw_core_data_ptr: Pointer to FW coremem data section. -+ * @boot_conf_ptr: Pointer to boot config argument pointer. -+ * -+ * Returns : -+ * * 0 on success, or -+ * * -EINVAL on any error in LDR command stream. -+ */ -+static int -+process_ldr_command_stream(struct pvr_device *pvr_dev, const u8 *fw, -+ const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, u8 *fw_code_ptr, -+ u8 *fw_data_ptr, u8 *fw_core_code_ptr, -+ u8 *fw_core_data_ptr, u32 **boot_conf_ptr) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct rogue_meta_ldr_block_hdr *ldr_header = -+ (struct rogue_meta_ldr_block_hdr *)fw; -+ struct rogue_meta_ldr_l1_data_blk *l1_data = -+ (struct rogue_meta_ldr_l1_data_blk *)(fw + ldr_header->sl_data); -+ const u32 fw_size = pvr_dev->fw->size; -+ int err; -+ -+ u32 *boot_conf = boot_conf_ptr ? *boot_conf_ptr : NULL; -+ u32 coremem_size; -+ -+ err = PVR_FEATURE_VALUE(pvr_dev, meta_coremem_size, &coremem_size); -+ if (err) -+ goto err_out; -+ -+ coremem_size *= SZ_1K; -+ -+ while (l1_data) { -+ /* Verify block header is within bounds. */ -+ if (((u8 *)l1_data - fw) >= fw_size || ((u8 *)(l1_data + 1) - fw) >= fw_size) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (ROGUE_META_LDR_BLK_IS_COMMENT(l1_data->cmd)) { -+ /* Don't process comment blocks */ -+ goto next_block; -+ } -+ -+ switch (l1_data->cmd & ROGUE_META_LDR_CMD_MASK) -+ case ROGUE_META_LDR_CMD_LOADMEM: { -+ err = meta_ldr_cmd_loadmem(drm_dev, fw, l1_data, -+ coremem_size, layout_entries, -+ num_layout_entries, -+ fw_code_ptr, fw_data_ptr, -+ fw_core_code_ptr, -+ fw_core_data_ptr, fw_size); -+ if (err) -+ goto err_out; -+ break; -+ -+ case ROGUE_META_LDR_CMD_START_THREADS: -+ /* Don't process this block */ -+ break; -+ -+ case ROGUE_META_LDR_CMD_ZEROMEM: -+ err = meta_ldr_cmd_zeromem(drm_dev, l1_data, -+ coremem_size, layout_entries, -+ num_layout_entries, -+ fw_code_ptr, fw_data_ptr, -+ fw_core_code_ptr, -+ fw_core_data_ptr); -+ break; -+ -+ case ROGUE_META_LDR_CMD_CONFIG: -+ err = meta_ldr_cmd_config(drm_dev, fw, l1_data, fw_size, -+ &boot_conf); -+ break; -+ -+ default: -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+next_block: -+ if (l1_data->next == 0xFFFFFFFF) -+ break; -+ -+ l1_data = (struct rogue_meta_ldr_l1_data_blk *)(fw + -+ l1_data->next); -+ } -+ -+ if (boot_conf_ptr) -+ *boot_conf_ptr = boot_conf; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static void -+configure_seg_id(u64 seg_out_addr, u32 seg_base, u32 seg_limit, u32 seg_id, -+ u32 **boot_conf_ptr) -+{ -+ u32 seg_out_addr0 = seg_out_addr & 0x00000000FFFFFFFFUL; -+ u32 seg_out_addr1 = (seg_out_addr >> 32) & 0x00000000FFFFFFFFUL; -+ u32 *boot_conf = *boot_conf_ptr; -+ -+ /* META segments have a minimum size. */ -+ u32 limit_off = max(seg_limit, ROGUE_FW_SEGMMU_ALIGN); -+ -+ /* The limit is an offset, therefore off = size - 1. */ -+ limit_off -= 1; -+ -+ seg_base |= ROGUE_FW_SEGMMU_ALLTHRS_WRITEABLE; -+ -+ add_boot_arg(&boot_conf, META_CR_MMCU_SEGMENTn_BASE(seg_id), seg_base); -+ add_boot_arg(&boot_conf, META_CR_MMCU_SEGMENTn_LIMIT(seg_id), -+ limit_off); -+ add_boot_arg(&boot_conf, META_CR_MMCU_SEGMENTn_OUTA0(seg_id), -+ seg_out_addr0); -+ add_boot_arg(&boot_conf, META_CR_MMCU_SEGMENTn_OUTA1(seg_id), -+ seg_out_addr1); -+ -+ *boot_conf_ptr = boot_conf; -+} -+ -+static void -+configure_seg_mmu(struct pvr_device *pvr_dev, -+ const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, u32 **boot_conf_ptr) -+{ -+ u64 seg_out_addr_top; -+ u32 i; -+ -+ seg_out_addr_top = -+ ROGUE_FW_SEGMMU_OUTADDR_TOP_SLC(MMU_CONTEXT_MAPPING_FWPRIV, -+ ROGUE_FW_SEGMMU_META_BIFDM_ID); -+ -+ for (i = 0; i < num_layout_entries; i++) { -+ /* -+ * FW code is using the bootloader segment which is already -+ * configured on boot. FW coremem code and data don't use the -+ * segment MMU. Only the FW data segment needs to be configured. -+ */ -+ if (layout_entries[i].type == FW_DATA) { -+ u32 seg_id = ROGUE_FW_SEGMMU_DATA_ID; -+ u64 seg_out_addr; -+ -+ WARN_ON(!pvr_gem_get_fw_gpu_addr(pvr_dev->fw_data_obj, -+ &seg_out_addr)); -+ seg_out_addr += layout_entries[i].alloc_offset; -+ seg_out_addr |= seg_out_addr_top; -+ -+ /* Write the sequence to the bootldr. */ -+ configure_seg_id(seg_out_addr, -+ layout_entries[i].base_addr, -+ layout_entries[i].alloc_size, seg_id, -+ boot_conf_ptr); -+ -+ break; -+ } -+ } -+} -+ -+static void -+configure_meta_caches(u32 **boot_conf_ptr) -+{ -+ u32 *boot_conf = *boot_conf_ptr; -+ u32 d_cache_t0, i_cache_t0; -+ u32 d_cache_t1, i_cache_t1; -+ u32 d_cache_t2, i_cache_t2; -+ u32 d_cache_t3, i_cache_t3; -+ -+ /* Initialise I/Dcache settings */ -+ d_cache_t0 = d_cache_t1 = META_CR_SYSC_DCPARTX_CACHED_WRITE_ENABLE; -+ d_cache_t2 = d_cache_t3 = META_CR_SYSC_DCPARTX_CACHED_WRITE_ENABLE; -+ i_cache_t0 = i_cache_t1 = i_cache_t2 = i_cache_t3 = 0; -+ -+ d_cache_t0 |= META_CR_SYSC_XCPARTX_LOCAL_ADDR_FULL_CACHE; -+ i_cache_t0 |= META_CR_SYSC_XCPARTX_LOCAL_ADDR_FULL_CACHE; -+ -+ /* Local region MMU enhanced bypass: WIN-3 mode for code and data caches */ -+ add_boot_arg(&boot_conf, META_CR_MMCU_LOCAL_EBCTRL, -+ META_CR_MMCU_LOCAL_EBCTRL_ICWIN | -+ META_CR_MMCU_LOCAL_EBCTRL_DCWIN); -+ -+ /* Data cache partitioning thread 0 to 3 */ -+ add_boot_arg(&boot_conf, META_CR_SYSC_DCPART(0), d_cache_t0); -+ add_boot_arg(&boot_conf, META_CR_SYSC_DCPART(1), d_cache_t1); -+ add_boot_arg(&boot_conf, META_CR_SYSC_DCPART(2), d_cache_t2); -+ add_boot_arg(&boot_conf, META_CR_SYSC_DCPART(3), d_cache_t3); -+ -+ /* Enable data cache hits */ -+ add_boot_arg(&boot_conf, META_CR_MMCU_DCACHE_CTRL, -+ META_CR_MMCU_XCACHE_CTRL_CACHE_HITS_EN); -+ -+ /* Instruction cache partitioning thread 0 to 3 */ -+ add_boot_arg(&boot_conf, META_CR_SYSC_ICPART(0), i_cache_t0); -+ add_boot_arg(&boot_conf, META_CR_SYSC_ICPART(1), i_cache_t1); -+ add_boot_arg(&boot_conf, META_CR_SYSC_ICPART(2), i_cache_t2); -+ add_boot_arg(&boot_conf, META_CR_SYSC_ICPART(3), i_cache_t3); -+ -+ /* Enable instruction cache hits */ -+ add_boot_arg(&boot_conf, META_CR_MMCU_ICACHE_CTRL, -+ META_CR_MMCU_XCACHE_CTRL_CACHE_HITS_EN); -+ -+ add_boot_arg(&boot_conf, 0x040000C0, 0); -+ -+ *boot_conf_ptr = boot_conf; -+} -+ -+static int -+pvr_meta_fw_process(struct pvr_device *pvr_dev, const u8 *fw, -+ const struct pvr_fw_layout_entry *layout_entries, u32 num_layout_entries, -+ u8 *fw_code_ptr, u8 *fw_data_ptr, u8 *fw_core_code_ptr, u8 *fw_core_data_ptr, -+ u32 core_code_alloc_size) -+{ -+ u32 *boot_conf; -+ int err; -+ -+ boot_conf = ((u32 *)fw_code_ptr) + ROGUE_FW_BOOTLDR_CONF_OFFSET; -+ -+ /* Slave port and JTAG accesses are privileged. */ -+ add_boot_arg(&boot_conf, META_CR_SYSC_JTAG_THREAD, -+ META_CR_SYSC_JTAG_THREAD_PRIV_EN); -+ -+ configure_seg_mmu(pvr_dev, layout_entries, num_layout_entries, &boot_conf); -+ -+ /* Populate FW sections from LDR image. */ -+ err = process_ldr_command_stream(pvr_dev, fw, layout_entries, num_layout_entries, -+ fw_code_ptr, fw_data_ptr, fw_core_code_ptr, -+ fw_core_data_ptr, &boot_conf); -+ if (err) -+ goto err_out; -+ -+ configure_meta_caches(&boot_conf); -+ -+ /* End argument list. */ -+ add_boot_arg(&boot_conf, 0, 0); -+ -+ if (pvr_dev->fw_core_code_obj) { -+ u32 core_code_fw_addr; -+ -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_dev->fw_core_code_obj, &core_code_fw_addr)); -+ add_boot_arg(&boot_conf, core_code_fw_addr, core_code_alloc_size); -+ } else { -+ add_boot_arg(&boot_conf, 0, 0); -+ } -+ /* None of the cores supported by this driver have META DMA. */ -+ add_boot_arg(&boot_conf, 0, 0); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_meta_init(struct pvr_device *pvr_dev) -+{ -+ pvr_fw_heap_info_init(pvr_dev, ROGUE_FW_HEAP_META_SHIFT, 0); -+ -+ return 0; -+} -+ -+static u32 -+pvr_meta_get_fw_addr_with_offset(struct pvr_fw_object *fw_obj, u32 offset) -+{ -+ u32 fw_addr = fw_obj->fw_addr_offset + offset + ROGUE_FW_SEGMMU_DATA_BASE_ADDRESS; -+ -+ /* META cacheability is determined by address. */ -+ if (fw_obj->base.flags & PVR_BO_FW_FLAGS_DEVICE_UNCACHED) -+ fw_addr |= ROGUE_FW_SEGMMU_DATA_META_UNCACHED | -+ ROGUE_FW_SEGMMU_DATA_VIVT_SLC_UNCACHED; -+ -+ return fw_addr; -+} -+ -+static int -+pvr_meta_vm_map(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj) -+{ -+ struct pvr_gem_object *pvr_obj = from_pvr_fw_object(fw_obj); -+ -+ return pvr_vm_map(pvr_dev->kernel_vm_ctx, pvr_obj, fw_obj->fw_mm_node.start); -+} -+ -+static void -+pvr_meta_vm_unmap(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj) -+{ -+ pvr_vm_unmap(pvr_dev->kernel_vm_ctx, fw_obj->fw_mm_node.start); -+} -+ -+const struct pvr_fw_funcs pvr_fw_funcs_meta = { -+ .init = pvr_meta_init, -+ .fw_process = pvr_meta_fw_process, -+ .vm_map = pvr_meta_vm_map, -+ .vm_unmap = pvr_meta_vm_unmap, -+ .get_fw_addr_with_offset = pvr_meta_get_fw_addr_with_offset, -+ .start = pvr_meta_start, -+ .stop = pvr_meta_stop, -+}; -diff --git a/drivers/gpu/drm/imagination/pvr_fw_mips.c b/drivers/gpu/drm/imagination/pvr_fw_mips.c -new file mode 100644 -index 000000000000..2aca0d6ab09f ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw_mips.c -@@ -0,0 +1,185 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_fw.h" -+#include "pvr_fw_mips.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_mips.h" -+#include "pvr_vm_mips.h" -+ -+#include <linux/elf.h> -+#include <linux/err.h> -+#include <linux/types.h> -+ -+#define ROGUE_FW_HEAP_MIPS_BASE 0xC0000000 -+#define ROGUE_FW_HEAP_MIPS_SHIFT 24 /* 16 MB */ -+#define ROGUE_FW_HEAP_MIPS_RESERVED_SIZE SZ_1M -+ -+/** -+ * process_elf_command_stream() - Process ELF firmware image and populate -+ * firmware sections -+ * @pvr_dev: Device pointer. -+ * @fw: Pointer to firmware image. -+ * @layout_entries: Pointer to layout table. -+ * @num_layout_entries: Number of entries in layout table. -+ * @fw_code_ptr: Pointer to FW code section. -+ * @fw_data_ptr: Pointer to FW data section. -+ * @fw_core_code_ptr: Pointer to FW coremem code section. -+ * @fw_core_data_ptr: Pointer to FW coremem data section. -+ * -+ * Returns : -+ * * 0 on success, or -+ * * -EINVAL on any error in ELF command stream. -+ */ -+static int -+process_elf_command_stream(struct pvr_device *pvr_dev, const u8 *fw, -+ const struct pvr_fw_layout_entry *layout_entries, -+ u32 num_layout_entries, u8 *fw_code_ptr, -+ u8 *fw_data_ptr, u8 *fw_core_code_ptr, -+ u8 *fw_core_data_ptr) -+{ -+ struct elf32_hdr *header = (struct elf32_hdr *)fw; -+ struct elf32_phdr *program_header = (struct elf32_phdr *)(fw + header->e_phoff); -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ u32 entry; -+ int err; -+ -+ for (entry = 0; entry < header->e_phnum; entry++, program_header++) { -+ void *write_addr; -+ -+ /* Only consider loadable entries in the ELF segment table */ -+ if (program_header->p_type != PT_LOAD) -+ continue; -+ -+ err = pvr_fw_find_mmu_segment(program_header->p_vaddr, program_header->p_memsz, -+ layout_entries, num_layout_entries, fw_code_ptr, fw_data_ptr, -+ fw_core_code_ptr, fw_core_data_ptr, &write_addr); -+ if (err) { -+ drm_err(drm_dev, -+ "Addr 0x%x (size: %d) not found in any firmware segment", -+ program_header->p_vaddr, program_header->p_memsz); -+ goto err_out; -+ } -+ -+ /* Write to FW allocation only if available */ -+ if (write_addr) { -+ memcpy(write_addr, fw + program_header->p_offset, -+ program_header->p_filesz); -+ -+ memset((u8 *)write_addr + program_header->p_filesz, 0, -+ program_header->p_memsz - program_header->p_filesz); -+ } -+ } -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_mips_init(struct pvr_device *pvr_dev) -+{ -+ pvr_fw_heap_info_init(pvr_dev, ROGUE_FW_HEAP_MIPS_SHIFT, ROGUE_FW_HEAP_MIPS_RESERVED_SIZE); -+ -+ return pvr_vm_mips_init(pvr_dev); -+} -+ -+static void -+pvr_mips_fini(struct pvr_device *pvr_dev) -+{ -+ pvr_vm_mips_fini(pvr_dev); -+} -+ -+static int -+pvr_mips_fw_process(struct pvr_device *pvr_dev, const u8 *fw, -+ const struct pvr_fw_layout_entry *layout_entries, u32 num_layout_entries, -+ u8 *fw_code_ptr, u8 *fw_data_ptr, u8 *fw_core_code_ptr, u8 *fw_core_data_ptr, -+ u32 core_code_alloc_size) -+{ -+ struct pvr_fw_mips_data *mips_data = pvr_dev->fw_data.mips_data; -+ const struct pvr_fw_layout_entry *boot_data_entry; -+ const struct pvr_fw_layout_entry *stack_entry; -+ struct rogue_mipsfw_boot_data *boot_data; -+ dma_addr_t dma_addr; -+ u32 page_nr; -+ int err; -+ -+ err = process_elf_command_stream(pvr_dev, fw, layout_entries, num_layout_entries, -+ fw_code_ptr, fw_data_ptr, fw_core_code_ptr, -+ fw_core_data_ptr); -+ if (err) -+ goto err_out; -+ -+ boot_data_entry = pvr_fw_find_layout_entry(layout_entries, num_layout_entries, -+ MIPS_BOOT_DATA); -+ if (!boot_data_entry) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ stack_entry = pvr_fw_find_layout_entry(layout_entries, num_layout_entries, MIPS_STACK); -+ if (!stack_entry) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ boot_data = (struct rogue_mipsfw_boot_data *)(fw_data_ptr + boot_data_entry->alloc_offset + -+ ROGUE_MIPSFW_BOOTLDR_CONF_OFFSET); -+ -+ WARN_ON(pvr_fw_get_dma_addr(pvr_dev->fw_data_obj, stack_entry->alloc_offset, &dma_addr)); -+ boot_data->stack_phys_addr = dma_addr; -+ -+ boot_data->reg_base = pvr_dev->regs_resource->start; -+ -+ for (page_nr = 0; page_nr < ARRAY_SIZE(boot_data->pt_phys_addr); page_nr++) { -+ WARN_ON(pvr_gem_get_dma_addr(mips_data->pt_obj, -+ page_nr << ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K, &dma_addr)); -+ -+ boot_data->pt_phys_addr[page_nr] = dma_addr; -+ } -+ -+ boot_data->pt_log2_page_size = ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K; -+ boot_data->pt_num_pages = ROGUE_MIPSFW_MAX_NUM_PAGETABLE_PAGES; -+ boot_data->reserved1 = 0; -+ boot_data->reserved2 = 0; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_mips_start(struct pvr_device *pvr_dev) -+{ -+ return -ENODEV; -+} -+ -+static int -+pvr_mips_stop(struct pvr_device *pvr_dev) -+{ -+ return -ENODEV; -+} -+ -+static u32 -+pvr_mips_get_fw_addr_with_offset(struct pvr_fw_object *fw_obj, u32 offset) -+{ -+ struct pvr_device *pvr_dev = fw_obj->base.pvr_dev; -+ -+ /* MIPS cacheability is determined by page table. */ -+ return ((fw_obj->fw_addr_offset + offset) & pvr_dev->fw_heap_info.offset_mask) | -+ ROGUE_FW_HEAP_MIPS_BASE; -+} -+ -+const struct pvr_fw_funcs pvr_fw_funcs_mips = { -+ .init = pvr_mips_init, -+ .fini = pvr_mips_fini, -+ .fw_process = pvr_mips_fw_process, -+ .vm_map = pvr_vm_mips_map, -+ .vm_unmap = pvr_vm_mips_unmap, -+ .get_fw_addr_with_offset = pvr_mips_get_fw_addr_with_offset, -+ .start = pvr_mips_start, -+ .stop = pvr_mips_stop, -+}; -diff --git a/drivers/gpu/drm/imagination/pvr_fw_mips.h b/drivers/gpu/drm/imagination/pvr_fw_mips.h -new file mode 100644 -index 000000000000..2a2ca7618b18 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw_mips.h -@@ -0,0 +1,29 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_FW_MIPS_H__ -+#define __PVR_FW_MIPS_H__ -+ -+#include <linux/types.h> -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_gem_object; -+ -+/** -+ * struct pvr_fw_mips_data - MIPS-specific data -+ */ -+struct pvr_fw_mips_data { -+ /** @pt_obj: Object representing MIPS pagetable. */ -+ struct pvr_gem_object *pt_obj; -+ -+ /** @pt: Pointer to CPU mapping of MIPS pagetable. */ -+ u32 *pt; -+ -+ /** @cache_policy: Cache policy for this processor. */ -+ u32 cache_policy; -+ -+ /** @pfn_mask: PFN mask for MIPS pagetable. */ -+ u32 pfn_mask; -+}; -+ -+#endif /* __PVR_FW_MIPS_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_fw_trace.c b/drivers/gpu/drm/imagination/pvr_fw_trace.c -new file mode 100644 -index 000000000000..21b1f242aa03 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw_trace.c -@@ -0,0 +1,487 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_fwif.h" -+#include "pvr_rogue_fwif_sf.h" -+#include "pvr_fw_trace.h" -+ -+#include <drm/drm_file.h> -+#include <linux/sysfs.h> -+#include <linux/types.h> -+ -+/* -+ * The tuple pairs that will be generated using XMacros will be stored here. -+ * This macro definition must match the definition of rogue_fw_log_sfids in -+ * pvr_rogue_fwif_sf.h. -+ */ -+static const struct rogue_km_stid_fmt stid_fmts[] = { -+#define X(a, b, c, d, e) { ROGUE_FW_LOG_CREATESFID(a, b, e), d }, -+ ROGUE_FW_LOG_SFIDLIST -+#undef X -+}; -+ -+int pvr_fw_trace_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct pvr_fw_trace *fw_trace = &pvr_dev->fw_trace; -+ u32 thread_nr; -+ int err; -+ -+ fw_trace->tracebuf_ctrl = pvr_gem_create_and_map_fw_object(pvr_dev, -+ sizeof(*fw_trace->tracebuf_ctrl), PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, &fw_trace->tracebuf_ctrl_obj); -+ if (IS_ERR(fw_trace->tracebuf_ctrl)) { -+ drm_err(drm_dev, "Unable to allocate trace buffer control structure\n"); -+ err = PTR_ERR(fw_trace->tracebuf_ctrl); -+ goto err_out; -+ } -+ -+ BUILD_BUG_ON(ARRAY_SIZE(fw_trace->tracebuf_ctrl->tracebuf) != -+ ARRAY_SIZE(fw_trace->buffers)); -+ -+ for (thread_nr = 0; thread_nr < ARRAY_SIZE(fw_trace->buffers); thread_nr++) { -+ struct rogue_fwif_tracebuf_space *tracebuf_space = -+ &fw_trace->tracebuf_ctrl->tracebuf[thread_nr]; -+ struct pvr_fw_trace_buffer *trace_buffer = &fw_trace->buffers[thread_nr]; -+ -+ trace_buffer->buf = pvr_gem_create_and_map_fw_object(pvr_dev, -+ ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS * sizeof(*trace_buffer->buf), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &trace_buffer->buf_obj); -+ if (IS_ERR(trace_buffer->buf)) { -+ drm_err(drm_dev, "Unable to allocate trace buffer\n"); -+ err = PTR_ERR(trace_buffer->buf); -+ trace_buffer->buf = NULL; -+ goto err_free_buf; -+ } -+ trace_buffer->tracebuf_space = tracebuf_space; -+ -+ WARN_ON(!pvr_gem_get_fw_addr(trace_buffer->buf_obj, -+ &tracebuf_space->trace_buffer_fw_addr)); -+ -+ tracebuf_space->trace_buffer = trace_buffer->buf; -+ tracebuf_space->trace_pointer = 0; -+ } -+ -+ fw_trace->tracebuf_ctrl->tracebuf_size_in_dwords = -+ ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS; -+ fw_trace->tracebuf_ctrl->tracebuf_flags = 0; -+ -+ if (pvr_fw_trace_enable) { -+ fw_trace->group_mask = ROGUE_FWIF_LOG_TYPE_GROUP_MASK; -+ fw_trace->tracebuf_ctrl->log_type = ROGUE_FWIF_LOG_TYPE_TRACE | -+ fw_trace->group_mask; -+ } else { -+ fw_trace->group_mask = 0; -+ fw_trace->tracebuf_ctrl->log_type = ROGUE_FWIF_LOG_TYPE_NONE; -+ } -+ -+ return 0; -+ -+err_free_buf: -+ for (thread_nr = 0; thread_nr < ARRAY_SIZE(fw_trace->buffers); thread_nr++) { -+ struct pvr_fw_trace_buffer *trace_buffer = &fw_trace->buffers[thread_nr]; -+ -+ if (trace_buffer->buf) { -+ pvr_fw_object_vunmap(trace_buffer->buf_obj, trace_buffer->buf, false); -+ pvr_fw_object_release(trace_buffer->buf_obj); -+ } -+ } -+ -+ pvr_fw_object_vunmap(fw_trace->tracebuf_ctrl_obj, fw_trace->tracebuf_ctrl, false); -+ pvr_fw_object_release(fw_trace->tracebuf_ctrl_obj); -+ -+err_out: -+ return err; -+} -+ -+void pvr_fw_trace_fini(struct pvr_device *pvr_dev) -+{ -+ struct pvr_fw_trace *fw_trace = &pvr_dev->fw_trace; -+ u32 thread_nr; -+ -+ for (thread_nr = 0; thread_nr < ARRAY_SIZE(fw_trace->buffers); thread_nr++) { -+ struct pvr_fw_trace_buffer *trace_buffer = &fw_trace->buffers[thread_nr]; -+ -+ pvr_fw_object_vunmap(trace_buffer->buf_obj, trace_buffer->buf, false); -+ pvr_fw_object_release(trace_buffer->buf_obj); -+ } -+ pvr_fw_object_vunmap(fw_trace->tracebuf_ctrl_obj, fw_trace->tracebuf_ctrl, false); -+ pvr_fw_object_release(fw_trace->tracebuf_ctrl_obj); -+} -+ -+/** -+ * update_logtype() - Send KCCB command to trigger FW to update logtype -+ * @pvr_dev: Target PowerVR device -+ * @group_mask: New log group mask. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_kccb_send_cmd(). -+ */ -+static int -+update_logtype(struct pvr_device *pvr_dev, u32 group_mask) -+{ -+ struct pvr_fw_trace *fw_trace = &pvr_dev->fw_trace; -+ struct rogue_fwif_kccb_cmd cmd; -+ -+ if (group_mask) -+ fw_trace->tracebuf_ctrl->log_type = ROGUE_FWIF_LOG_TYPE_TRACE | group_mask; -+ else -+ fw_trace->tracebuf_ctrl->log_type = ROGUE_FWIF_LOG_TYPE_NONE; -+ -+ cmd.cmd_type = ROGUE_FWIF_KCCB_CMD_LOGTYPE_UPDATE; -+ cmd.kccb_flags = 0; -+ -+ return pvr_kccb_send_cmd(pvr_dev, &cmd, NULL); -+} -+ -+static int fw_trace_group_mask_show(struct seq_file *m, void *data) -+{ -+ struct pvr_device *pvr_dev = m->private; -+ -+ seq_printf(m, "%08x\n", pvr_dev->fw_trace.group_mask); -+ -+ return 0; -+} -+ -+static int fw_trace_group_mask_open(struct inode *inode, struct file *file) -+{ -+ return single_open(file, fw_trace_group_mask_show, inode->i_private); -+} -+ -+static ssize_t fw_trace_group_mask_write(struct file *file, const char __user *ubuf, size_t len, -+ loff_t *offp) -+{ -+ struct seq_file *m = file->private_data; -+ struct pvr_device *pvr_dev = m->private; -+ u32 new_group_mask; -+ int err; -+ -+ err = kstrtouint_from_user(ubuf, len, 0, &new_group_mask); -+ if (err) -+ goto err_out; -+ -+ err = update_logtype(pvr_dev, new_group_mask); -+ if (err) -+ goto err_out; -+ -+ pvr_dev->fw_trace.group_mask = new_group_mask; -+ -+err_out: -+ return err ? err : len; -+} -+ -+ -+static const struct file_operations pvr_fw_trace_group_mask_fops = { -+ .owner = THIS_MODULE, -+ .open = fw_trace_group_mask_open, -+ .read = seq_read, -+ .write = fw_trace_group_mask_write, -+ .llseek = default_llseek, -+ .release = single_release, -+}; -+ -+struct pvr_fw_trace_seq_data { -+ /** @buffer: Pointer to copy of trace data. */ -+ u32 *buffer; -+ -+ /** @start_offset: Starting offset in trace data, as reported by FW. */ -+ u32 start_offset; -+ -+ /** @idx: Current index into trace data. */ -+ u32 idx; -+ -+ /** @assert_buf: Trace assert buffer, as reported by FW. */ -+ struct rogue_fwif_file_info_buf assert_buf; -+}; -+ -+static u32 find_sfid(u32 id) -+{ -+ u32 i; -+ -+ for (i = 0; i < ARRAY_SIZE(stid_fmts); i++) { -+ if (stid_fmts[i].id == id) -+ return i; -+ } -+ -+ return ROGUE_FW_SF_LAST; -+} -+ -+static u32 read_fw_trace(struct pvr_fw_trace_seq_data *trace_seq_data, u32 offset) -+{ -+ u32 idx; -+ -+ idx = trace_seq_data->idx + offset; -+ if (idx >= ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS) -+ return 0; -+ -+ idx = (idx + trace_seq_data->start_offset) % ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS; -+ return trace_seq_data->buffer[idx]; -+} -+ -+/** -+ * fw_trace_get_next() - Advance trace index to next entry -+ * @trace_seq_data: Trace sequence data. -+ * -+ * Returns: -+ * * %true if trace index is now pointing to a valid entry, or -+ * * %false if trace index is pointing to an invalid entry, or has hit the end -+ * of the trace. -+ */ -+static bool fw_trace_get_next(struct pvr_fw_trace_seq_data *trace_seq_data) -+{ -+ u32 id, sf_id; -+ -+ while (trace_seq_data->idx < ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS) { -+ id = read_fw_trace(trace_seq_data, 0); -+ trace_seq_data->idx++; -+ if (!ROGUE_FW_LOG_VALIDID(id)) -+ continue; -+ if (id == ROGUE_FW_SF_MAIN_ASSERT_FAILED) { -+ /* Assertion failure marks the end of the trace. */ -+ return false; -+ } -+ -+ sf_id = find_sfid(id); -+ if (sf_id == ROGUE_FW_SF_FIRST) -+ continue; -+ if (sf_id == ROGUE_FW_SF_LAST) { -+ /* -+ * Could not match with an ID in the SF table, trace is -+ * most likely corrupt from this point. -+ */ -+ return false; -+ } -+ -+ /* Skip over the timestamp, and any parameters. */ -+ trace_seq_data->idx += 2 + ROGUE_FW_SF_PARAMNUM(id); -+ -+ /* Ensure index is now pointing to a valid trace entry. */ -+ id = read_fw_trace(trace_seq_data, 0); -+ if (!ROGUE_FW_LOG_VALIDID(id)) -+ continue; -+ -+ return true; -+ }; -+ -+ /* Hit end of trace data. */ -+ return false; -+} -+ -+/** -+ * fw_trace_get_first() - Find first valid entry in trace -+ * @trace_seq_data: Trace sequence data. -+ * -+ * Skips over invalid (usually zero) and ROGUE_FW_SF_FIRST entries. -+ * -+ * If the trace has no valid entries, this function will exit with the trace -+ * index pointing to the end of the trace. trace_seq_show() will return an error -+ * in this state. -+ */ -+static void fw_trace_get_first(struct pvr_fw_trace_seq_data *trace_seq_data) -+{ -+ trace_seq_data->idx = 0; -+ -+ while (trace_seq_data->idx < ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS) { -+ u32 id = read_fw_trace(trace_seq_data, 0); -+ -+ if (ROGUE_FW_LOG_VALIDID(id)) { -+ u32 sf_id = find_sfid(id); -+ -+ if (sf_id != ROGUE_FW_SF_FIRST) -+ break; -+ } -+ trace_seq_data->idx++; -+ } -+} -+ -+static void *fw_trace_seq_start(struct seq_file *s, loff_t *pos) -+{ -+ struct pvr_fw_trace_seq_data *trace_seq_data = s->private; -+ u32 i; -+ -+ /* Reset trace index, then advance to *pos. */ -+ fw_trace_get_first(trace_seq_data); -+ -+ for (i = 0; i < *pos; i++) { -+ if (!fw_trace_get_next(trace_seq_data)) -+ return NULL; -+ } -+ -+ return (trace_seq_data->idx < ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS) ? pos : NULL; -+} -+ -+static void *fw_trace_seq_next(struct seq_file *s, void *v, loff_t *pos) -+{ -+ struct pvr_fw_trace_seq_data *trace_seq_data = s->private; -+ -+ (*pos)++; -+ if (!fw_trace_get_next(trace_seq_data)) -+ return NULL; -+ -+ return (trace_seq_data->idx < ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS) ? pos : NULL; -+} -+ -+static void fw_trace_seq_stop(struct seq_file *s, void *v) -+{ -+} -+ -+static int fw_trace_seq_show(struct seq_file *s, void *v) -+{ -+ struct pvr_fw_trace_seq_data *trace_seq_data = s->private; -+ u64 timestamp; -+ u32 id; -+ u32 sf_id; -+ int err; -+ -+ if (trace_seq_data->idx >= ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ id = read_fw_trace(trace_seq_data, 0); -+ if (!ROGUE_FW_LOG_VALIDID(id)) { -+ /* Index is not pointing at a valid entry. */ -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ sf_id = find_sfid(id); -+ if (sf_id == ROGUE_FW_SF_LAST) { -+ /* Index is not pointing at a valid entry. */ -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ timestamp = read_fw_trace(trace_seq_data, 1) | -+ ((u64)read_fw_trace(trace_seq_data, 2) << 32); -+ timestamp = (timestamp & ~ROGUE_FWT_TIMESTAMP_TIME_CLRMSK) >> -+ ROGUE_FWT_TIMESTAMP_TIME_SHIFT; -+ -+ seq_printf(s, "[%llu] : ", timestamp); -+ if (id == ROGUE_FW_SF_MAIN_ASSERT_FAILED) { -+ seq_printf(s, "ASSERTION %s failed at %s:%u", -+ trace_seq_data->assert_buf.info, -+ trace_seq_data->assert_buf.path, -+ trace_seq_data->assert_buf.line_num); -+ } else { -+ seq_printf(s, stid_fmts[sf_id].name, -+ read_fw_trace(trace_seq_data, 3), -+ read_fw_trace(trace_seq_data, 4), -+ read_fw_trace(trace_seq_data, 5), -+ read_fw_trace(trace_seq_data, 6), -+ read_fw_trace(trace_seq_data, 7), -+ read_fw_trace(trace_seq_data, 8), -+ read_fw_trace(trace_seq_data, 9), -+ read_fw_trace(trace_seq_data, 10), -+ read_fw_trace(trace_seq_data, 11), -+ read_fw_trace(trace_seq_data, 12), -+ read_fw_trace(trace_seq_data, 13), -+ read_fw_trace(trace_seq_data, 14), -+ read_fw_trace(trace_seq_data, 15), -+ read_fw_trace(trace_seq_data, 16), -+ read_fw_trace(trace_seq_data, 17), -+ read_fw_trace(trace_seq_data, 18), -+ read_fw_trace(trace_seq_data, 19), -+ read_fw_trace(trace_seq_data, 20), -+ read_fw_trace(trace_seq_data, 21), -+ read_fw_trace(trace_seq_data, 22)); -+ } -+ seq_puts(s, "\n"); -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static const struct seq_operations pvr_fw_trace_seq_ops = { -+ .start = fw_trace_seq_start, -+ .next = fw_trace_seq_next, -+ .stop = fw_trace_seq_stop, -+ .show = fw_trace_seq_show -+}; -+ -+static int fw_trace_open(struct inode *inode, struct file *file) -+{ -+ struct pvr_fw_trace_buffer *trace_buffer = inode->i_private; -+ struct rogue_fwif_tracebuf_space *tracebuf_space = -+ trace_buffer->tracebuf_space; -+ struct pvr_fw_trace_seq_data *trace_seq_data; -+ int err; -+ -+ trace_seq_data = kzalloc(sizeof(*trace_seq_data), GFP_KERNEL); -+ if (!trace_seq_data) -+ goto err_out; -+ -+ trace_seq_data->buffer = kcalloc(ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS, -+ sizeof(*trace_seq_data->buffer), GFP_KERNEL); -+ if (!trace_seq_data->buffer) -+ goto err_free_data; -+ -+ /* -+ * Take a local copy of the trace buffer, as firmware may still be -+ * writing to it. This will exist as long as this file is open. -+ */ -+ memcpy(trace_seq_data->buffer, trace_buffer->buf, -+ ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS * sizeof(u32)); -+ trace_seq_data->start_offset = READ_ONCE(tracebuf_space->trace_pointer); -+ trace_seq_data->assert_buf = tracebuf_space->assert_buf; -+ fw_trace_get_first(trace_seq_data); -+ -+ err = seq_open(file, &pvr_fw_trace_seq_ops); -+ if (err) -+ goto err_free_buffer; -+ -+ ((struct seq_file *)file->private_data)->private = trace_seq_data; -+ -+ return 0; -+ -+err_free_buffer: -+ kfree(trace_seq_data->buffer); -+ -+err_free_data: -+ kfree(trace_seq_data); -+ -+err_out: -+ return err; -+} -+ -+static int fw_trace_release(struct inode *inode, struct file *file) -+{ -+ struct pvr_fw_trace_seq_data *trace_seq_data = -+ ((struct seq_file *)file->private_data)->private; -+ -+ seq_release(inode, file); -+ kfree(trace_seq_data->buffer); -+ kfree(trace_seq_data); -+ -+ return 0; -+} -+ -+static const struct file_operations pvr_fw_trace_fops = { -+ .owner = THIS_MODULE, -+ .open = fw_trace_open, -+ .read = seq_read, -+ .llseek = seq_lseek, -+ .release = fw_trace_release, -+}; -+ -+void pvr_fw_trace_debugfs_init(struct drm_minor *minor) -+{ -+ struct pvr_device *pvr_dev = to_pvr_device(minor->dev); -+ u32 thread_nr; -+ -+ for (thread_nr = 0; thread_nr < ARRAY_SIZE(pvr_dev->fw_trace.buffers); thread_nr++) { -+ char fn[14]; -+ -+ sprintf(fn, "pvr_fw_trace%u", thread_nr); -+ debugfs_create_file(fn, 0444, minor->debugfs_root, -+ &pvr_dev->fw_trace.buffers[thread_nr], &pvr_fw_trace_fops); -+ } -+ -+ debugfs_create_file("pvr_fw_trace_group_mask", 0644, minor->debugfs_root, pvr_dev, -+ &pvr_fw_trace_group_mask_fops); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_fw_trace.h b/drivers/gpu/drm/imagination/pvr_fw_trace.h -new file mode 100644 -index 000000000000..d9c79ff27f4e ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_fw_trace.h -@@ -0,0 +1,70 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_FW_TRACE_H__ -+#define __PVR_FW_TRACE_H__ -+ -+#include <drm/drm_file.h> -+#include <linux/types.h> -+ -+/* Forward declaration from pvr_device.h. */ -+struct pvr_device; -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+/* Forward declarations from pvr_rogue_fwif.h */ -+struct rogue_fwif_tracebuf; -+struct rogue_fwif_tracebuf_space; -+ -+/** -+ * struct pvr_fw_trace_buffer - Structure representing a trace buffer -+ */ -+struct pvr_fw_trace_buffer { -+ /** @buf_obj: FW buffer object representing trace buffer. */ -+ struct pvr_fw_object *buf_obj; -+ -+ /** @buf: Pointer to CPU mapping of trace buffer. */ -+ u32 *buf; -+ -+ /** -+ * @tracebuf_space: Pointer to FW tracebuf_space structure for this -+ * trace buffer. -+ */ -+ struct rogue_fwif_tracebuf_space *tracebuf_space; -+}; -+ -+/** -+ * struct pvr_fw_trace - Device firmware trace data -+ */ -+struct pvr_fw_trace { -+ /** -+ * @tracebuf_ctrl_obj: Object representing FW trace buffer control -+ * structure. -+ */ -+ struct pvr_fw_object *tracebuf_ctrl_obj; -+ -+ /** -+ * @tracebuf_ctrl: Pointer to CPU mapping of FW trace buffer control -+ * structure. -+ */ -+ struct rogue_fwif_tracebuf *tracebuf_ctrl; -+ -+ /** -+ * @buffers: Array representing the actual trace buffers owned by this -+ * device. -+ */ -+ struct pvr_fw_trace_buffer buffers[ROGUE_FW_THREAD_NUM]; -+ -+ /** @group_mask: Mask of enabled trace groups. */ -+ u32 group_mask; -+}; -+ -+extern bool pvr_fw_trace_enable; -+ -+int pvr_fw_trace_init(struct pvr_device *pvr_dev); -+void pvr_fw_trace_fini(struct pvr_device *pvr_dev); -+ -+void pvr_fw_trace_debugfs_init(struct drm_minor *minor); -+ -+#endif /* __PVR_FW_TRACE_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_gem.c b/drivers/gpu/drm/imagination/pvr_gem.c -new file mode 100644 -index 000000000000..5a6b3d31f33d ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_gem.c -@@ -0,0 +1,1082 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_meta.h" -+#include "pvr_vm.h" -+#include "pvr_vm_mips.h" -+ -+#include <drm/drm_gem.h> -+#include <drm/drm_prime.h> -+ -+#include <linux/compiler.h> -+#include <linux/compiler_attributes.h> -+#include <linux/dma-buf.h> -+#include <linux/dma-direction.h> -+#include <linux/dma-mapping.h> -+#include <linux/err.h> -+#include <linux/gfp.h> -+#include <linux/log2.h> -+#include <linux/mutex.h> -+#include <linux/pagemap.h> -+#include <linux/refcount.h> -+#include <linux/scatterlist.h> -+ -+static vm_fault_t pvr_gem_vm_fault(struct vm_fault *vmf) -+{ -+ struct vm_area_struct *vma = vmf->vma; -+ struct drm_gem_object *gem_obj = vma->vm_private_data; -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ loff_t num_pages = gem_obj->size >> PAGE_SHIFT; -+ pgoff_t page_offset; -+ struct page *page; -+ vm_fault_t ret; -+ -+ /* We don't use vmf->pgoff since that has the fake offset */ -+ page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT; -+ -+ if (page_offset >= num_pages || WARN_ON_ONCE(!pvr_obj->pages)) { -+ ret = VM_FAULT_SIGBUS; -+ } else { -+ page = pvr_obj->pages[page_offset]; -+ -+ ret = vmf_insert_page(vma, vmf->address, page); -+ } -+ -+ return ret; -+} -+ -+static void pvr_gem_vm_open(struct vm_area_struct *vma) -+{ -+ struct drm_gem_object *gem_obj = vma->vm_private_data; -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ int err; -+ -+ WARN_ON(gem_obj->import_attach); -+ -+ err = pvr_gem_object_get_pages(pvr_obj); -+ WARN_ON(err); -+ -+ drm_gem_vm_open(vma); -+} -+ -+static void pvr_gem_vm_close(struct vm_area_struct *vma) -+{ -+ struct drm_gem_object *gem_obj = vma->vm_private_data; -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ -+ pvr_gem_object_put_pages(pvr_obj); -+ drm_gem_vm_close(vma); -+} -+ -+static const struct vm_operations_struct pvr_gem_vm_ops = { -+ .fault = pvr_gem_vm_fault, -+ .open = pvr_gem_vm_open, -+ .close = pvr_gem_vm_close, -+}; -+ -+static void pvr_gem_free_object(struct drm_gem_object *gem_obj) -+{ -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ -+ if (gem_obj->import_attach) -+ drm_prime_gem_destroy(gem_obj, pvr_obj->sgt); -+ drm_gem_object_release(gem_obj); -+ kfree(pvr_obj); -+} -+ -+static struct sg_table *pvr_gem_get_sg_table(struct drm_gem_object *gem_obj) -+{ -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ -+ if (gem_obj->import_attach) -+ return ERR_PTR(-EINVAL); -+ -+ return drm_prime_pages_to_sg(gem_obj->dev, pvr_obj->pages, gem_obj->size >> PAGE_SHIFT); -+} -+ -+static int pvr_gem_mmap(struct drm_gem_object *gem_obj, struct vm_area_struct *vma) -+{ -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ int err; -+ -+ if (gem_obj->import_attach) { -+ /* Drop the reference drm_gem_mmap_obj() acquired.*/ -+ drm_gem_object_put(gem_obj); -+ vma->vm_private_data = NULL; -+ -+ return dma_buf_mmap(gem_obj->dma_buf, vma, 0); -+ } -+ -+ if (!(pvr_obj->flags & DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = pvr_gem_object_get_pages(pvr_obj); -+ if (err) -+ goto err_out; -+ -+ vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND; -+ vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); -+ if (!(pvr_obj->flags & PVR_BO_CPU_CACHED)) -+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int pvr_gem_pin(struct drm_gem_object *gem_obj) -+{ -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ -+ WARN_ON(gem_obj->import_attach); -+ -+ return pvr_gem_object_get_pages(pvr_obj); -+} -+ -+static void pvr_gem_unpin(struct drm_gem_object *gem_obj) -+{ -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ -+ WARN_ON(gem_obj->import_attach); -+ -+ pvr_gem_object_put_pages(pvr_obj); -+} -+ -+static const struct drm_gem_object_funcs pvr_gem_object_funcs = { -+ .free = pvr_gem_free_object, -+ .get_sg_table = pvr_gem_get_sg_table, -+ .mmap = pvr_gem_mmap, -+ .pin = pvr_gem_pin, -+ .unpin = pvr_gem_unpin, -+ .vm_ops = &pvr_gem_vm_ops, -+}; -+ -+static void pvr_free_fw_object(struct drm_gem_object *gem_obj) -+{ -+ struct pvr_gem_object *pvr_obj = to_pvr_gem_object(gem_obj); -+ struct pvr_fw_object *fw_obj = to_pvr_fw_object(pvr_obj); -+ -+ WARN_ON(gem_obj->import_attach); -+ drm_gem_object_release(gem_obj); -+ kfree(fw_obj); -+} -+ -+/* FW objects may not be mmap'ed or exported. */ -+static const struct drm_gem_object_funcs pvr_gem_fw_object_funcs = { -+ .free = pvr_free_fw_object, -+}; -+ -+/** -+ * pvr_gem_object_flags_validate() - Verify that a collection of PowerVR GEM -+ * mapping and/or creation flags form a valid combination. -+ * @flags: PowerVR GEM mapping/creation flags to validate. -+ * -+ * This function explicitly allows kernel-only flags. All ioctl entrypoints -+ * should do their own validation as well as relying on this function. -+ * -+ * Return: -+ * * %true if @flags contains valid mapping and/or creation flags, or -+ * * %false otherwise. -+ */ -+static bool -+pvr_gem_object_flags_validate(u64 flags) -+{ -+ static const u64 invalid_combinations[] = { -+ /* -+ * Memory flagged as PM/FW-protected cannot be mapped to -+ * userspace. To make this explicit, we require that the two -+ * flags allowing each of these respective features are never -+ * specified together. -+ */ -+ (DRM_PVR_BO_DEVICE_PM_FW_PROTECT | -+ DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS), -+ }; -+ -+ int i; -+ -+ /* -+ * Check for bits set in undefined regions. Reserved regions refer to -+ * options that can only be set by the kernel. These are explicitly -+ * allowed in most cases, and must be checked specifically in IOCTL -+ * callback code. -+ */ -+ if ((flags & PVR_BO_UNDEFINED_MASK) != 0) -+ return false; -+ -+ /* -+ * Check for all combinations of flags marked as invalid in the array -+ * above. -+ */ -+ for (i = 0; i < ARRAY_SIZE(invalid_combinations); ++i) { -+ u64 combo = invalid_combinations[i]; -+ -+ if ((flags & combo) == combo) -+ return false; -+ } -+ -+ return true; -+} -+ -+/** -+ * pvr_gem_object_into_handle() - Convert a reference to an object into a -+ * userspace-accessible handle. -+ * @pvr_obj: [IN] Target PowerVR-specific object. -+ * @pvr_file: [IN] File to associate the handle with. -+ * @handle: [OUT] Pointer to store the created handle in. Remains unmodified if -+ * an error is encountered. -+ * -+ * If an error is encountered, ownership of @pvr_obj will not have been -+ * transferred. If this function succeeds, however, further use of @pvr_obj is -+ * considered undefined behaviour unless another reference to it is explicitly -+ * held. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error encountered while attempting to allocate a handle on @pvr_file. -+ */ -+int -+pvr_gem_object_into_handle(struct pvr_gem_object *pvr_obj, -+ struct pvr_file *pvr_file, u32 *handle) -+{ -+ struct drm_gem_object *gem_obj = from_pvr_gem_object(pvr_obj); -+ struct drm_file *file = from_pvr_file(pvr_file); -+ -+ u32 new_handle; -+ int err; -+ -+ err = drm_gem_handle_create(file, gem_obj, &new_handle); -+ if (err) -+ goto err_out; -+ -+ /* -+ * Release our reference to @pvr_obj, effectively transferring -+ * ownership to the handle. -+ */ -+ pvr_gem_object_put(pvr_obj); -+ -+ /* -+ * Do not store the new handle in @handle until no more errors can -+ * occur. -+ */ -+ *handle = new_handle; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_gem_object_from_handle() - Obtain a reference to an object from a -+ * userspace handle. -+ * @pvr_file: PowerVR-specific file to which @handle is associated. -+ * @handle: Userspace handle referencing the target object. -+ * -+ * On return, @handle always maintains its reference to the requested object -+ * (if it had one in the first place). If this function succeeds, the returned -+ * object will hold an additional reference. When the caller is finished with -+ * the returned object, they should call pvr_gem_object_put() on it to release -+ * this reference. -+ * -+ * Return: -+ * * A pointer to the requested PowerVR-specific object on success, or -+ * * %NULL otherwise. -+ */ -+struct pvr_gem_object * -+pvr_gem_object_from_handle(struct pvr_file *pvr_file, u32 handle) -+{ -+ struct drm_file *file = from_pvr_file(pvr_file); -+ struct drm_gem_object *gem_obj; -+ -+ gem_obj = drm_gem_object_lookup(file, handle); -+ if (!gem_obj) -+ return NULL; -+ -+ return to_pvr_gem_object(gem_obj); -+} -+ -+static int -+pvr_gem_object_get_pages_locked(struct pvr_gem_object *pvr_obj) -+{ -+ struct drm_gem_object *obj = from_pvr_gem_object(pvr_obj); -+ struct page **pages; -+ struct sg_table *sgt; -+ int err; -+ -+ lockdep_assert_held(&pvr_obj->lock); -+ -+ if (obj->import_attach) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if ((++pvr_obj->pages_ref_count) == 1) { -+ WARN_ON(pvr_obj->pages); -+ -+ pages = drm_gem_get_pages(obj); -+ if (IS_ERR(pages)) { -+ err = PTR_ERR(pages); -+ goto err_dec_ref_count; -+ } -+ -+ sgt = drm_prime_pages_to_sg(obj->dev, pages, -+ obj->size >> PAGE_SHIFT); -+ if (IS_ERR(sgt)) { -+ err = PTR_ERR(sgt); -+ goto err_put_pages; -+ } -+ -+ err = dma_map_sgtable(obj->dev->dev, sgt, DMA_BIDIRECTIONAL, 0); -+ if (err) -+ goto err_free_sgt; -+ -+ pvr_obj->pages = pages; -+ pvr_obj->sgt = sgt; -+ } else { -+ WARN_ON(!pvr_obj->pages); -+ } -+ -+ return 0; -+ -+err_free_sgt: -+ sg_free_table(sgt); -+ kfree(sgt); -+ -+err_put_pages: -+ drm_gem_put_pages(obj, pages, false, false); -+ -+err_dec_ref_count: -+ pvr_obj->pages_ref_count--; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_gem_object_get_pages: Get pages associated with a &struct pvr_gem_object -+ * @pvr_obj: Target object -+ * -+ * This will fill out the pages array of the object. This must be called before -+ * the object is mapped to userspace. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by drm_gem_get_pages(), or -+ * * Any error returned by drm_prime_pages_to_sg(), or -+ * * Any error returned by dma_map_sgtable(). -+ */ -+int -+pvr_gem_object_get_pages(struct pvr_gem_object *pvr_obj) -+{ -+ int err; -+ -+ mutex_lock(&pvr_obj->lock); -+ err = pvr_gem_object_get_pages_locked(pvr_obj); -+ mutex_unlock(&pvr_obj->lock); -+ -+ return err; -+} -+ -+static void -+pvr_gem_object_put_pages_locked(struct pvr_gem_object *pvr_obj) -+{ -+ struct drm_gem_object *gem_obj = from_pvr_gem_object(pvr_obj); -+ -+ lockdep_assert_held(&pvr_obj->lock); -+ -+ if (gem_obj->import_attach) -+ return; -+ -+ if (pvr_obj->pages && (--pvr_obj->pages_ref_count) == 0) { -+ sg_free_table(pvr_obj->sgt); -+ kfree(pvr_obj->sgt); -+ drm_gem_put_pages(gem_obj, pvr_obj->pages, true, true); -+ pvr_obj->sgt = NULL; -+ pvr_obj->pages = NULL; -+ } -+} -+ -+/** -+ * pvr_gem_object_put_pages: Release pages associated with a &struct -+ * pvr_gem_object -+ * @pvr_obj: Target object -+ */ -+void -+pvr_gem_object_put_pages(struct pvr_gem_object *pvr_obj) -+{ -+ mutex_lock(&pvr_obj->lock); -+ pvr_gem_object_put_pages_locked(pvr_obj); -+ mutex_unlock(&pvr_obj->lock); -+} -+ -+/** -+ * pvr_gem_object_vmap_prot() - Map a PowerVR GEM object into CPU virtual -+ * address space without using information from the object's flags. -+ * @pvr_obj: Target PowerVR GEM object. -+ * @sync_to_cpu: Specifies whether the buffer should be synced to the CPU -+ * immediately after mapping. -+ * @prot: Page protection options for the mapping. -+ * -+ * Once the caller is finished with the CPU mapping, they must call -+ * pvr_gem_object_vunmap() on @pvr_obj. -+ * -+ * Unlike pvr_gem_object_vmap(), this function does NOT use information from -+ * the flags on @pvr_obj to determine page protection options. You probably -+ * want to use pvr_gem_object_vmap() instead. If you really need to use this -+ * function, be absolutely sure that @prot is compatible with the flags on -+ * @pvr_obj. There are no safeguards! -+ * -+ * Return: -+ * * A pointer to the CPU mapping on success, -+ * * -%ENOMEM if the mapping fails, or -+ * * Any error encountered while attempting to acquire a reference to the -+ * backing pages for @pvr_obj. -+ */ -+static void * -+pvr_gem_object_vmap_prot(struct pvr_gem_object *pvr_obj, bool sync_to_cpu, -+ pgprot_t prot) -+{ -+ struct drm_gem_object *gem_obj = from_pvr_gem_object(pvr_obj); -+ /* The size of @pvr_obj is always CPU page-aligned. */ -+ size_t nr_pages = pvr_gem_object_size(pvr_obj) >> PAGE_SHIFT; -+ -+ void *cpu_ptr; -+ -+ int err; -+ -+ if (gem_obj->import_attach) { -+ struct dma_buf_map map; -+ -+ err = dma_buf_vmap(gem_obj->import_attach->dmabuf, &map); -+ if (err) -+ goto err_out; -+ -+ cpu_ptr = map.vaddr; -+ } else { -+ err = pvr_gem_object_get_pages(pvr_obj); -+ if (err) -+ goto err_out; -+ -+ cpu_ptr = vmap(pvr_obj->pages, nr_pages, VM_MAP, prot); -+ if (!cpu_ptr) { -+ err = -ENOMEM; -+ goto err_put_pages; -+ } -+ } -+ -+ /* -+ * There's no need for sync operations on the CPU cache if we're not -+ * using the CPU cache. -+ */ -+ if ((pvr_obj->flags & PVR_BO_CPU_CACHED) && sync_to_cpu) { -+ struct device *dev = gem_obj->dev->dev; -+ -+ dma_sync_sgtable_for_cpu(dev, pvr_obj->sgt, DMA_BIDIRECTIONAL); -+ } -+ -+ return cpu_ptr; -+ -+err_put_pages: -+ pvr_gem_object_put_pages(pvr_obj); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * pvr_gem_object_vmap() - Map a PowerVR GEM object into CPU virtual address -+ * space. -+ * @pvr_obj: Target PowerVR GEM object. -+ * @sync_to_cpu: Specifies whether the buffer should be synced to the CPU -+ * immediately after mapping. -+ * -+ * Once the caller is finished with the CPU mapping, they must call -+ * pvr_gem_object_vunmap() on @pvr_obj. -+ * -+ * If @pvr_obj is not using the CPU cache, @sync_to_cpu is ignored. -+ * -+ * Return: -+ * * A pointer to the CPU mapping on success, -+ * * -%ENOMEM if the mapping fails, or -+ * * Any error encountered while attempting to acquire a reference to the -+ * backing pages for @pvr_obj. -+ */ -+void * -+pvr_gem_object_vmap(struct pvr_gem_object *pvr_obj, bool sync_to_cpu) -+{ -+ pgprot_t prot; -+ -+ /* Determine parameters from @pvr_obj CPU caching strategy. */ -+ if (pvr_obj->flags & PVR_BO_CPU_CACHED) { -+ prot = PAGE_KERNEL; -+ } else { -+ /* The default caching strategy is write-combined. */ -+ prot = pgprot_writecombine(PAGE_KERNEL); -+ } -+ -+ return pvr_gem_object_vmap_prot(pvr_obj, sync_to_cpu, prot); -+} -+ -+/** -+ * pvr_gem_object_vunmap() - Unmap a PowerVR memory object from CPU virtual -+ * address space. -+ * @pvr_obj: Target PowerVR GEM object. -+ * @cpu_ptr: CPU pointer to be unmapped from. -+ * @sync_to_device: Specifies whether the buffer should be synced to the device -+ * immediately before unmapping from the CPU. -+ * -+ * If @pvr_obj is not using the CPU cache, @sync_to_device is ignored. -+ */ -+void -+pvr_gem_object_vunmap(struct pvr_gem_object *pvr_obj, void *cpu_ptr, -+ bool sync_to_device) -+{ -+ struct drm_gem_object *gem_obj = from_pvr_gem_object(pvr_obj); -+ -+ /* -+ * There's no need for sync operations on the CPU cache if we're not -+ * using the CPU cache. -+ */ -+ if ((pvr_obj->flags & PVR_BO_CPU_CACHED) && sync_to_device) { -+ struct device *dev = gem_obj->dev->dev; -+ -+ dma_sync_sgtable_for_device(dev, pvr_obj->sgt, -+ DMA_BIDIRECTIONAL); -+ } -+ -+ if (gem_obj->import_attach) { -+ struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(cpu_ptr); -+ -+ dma_buf_vunmap(gem_obj->import_attach->dmabuf, &map); -+ } else { -+ vunmap(cpu_ptr); -+ -+ pvr_gem_object_put_pages(pvr_obj); -+ } -+} -+ -+/** -+ * pvr_gem_object_zero() - Zeroes the physical memory behind an object. -+ * @pvr_obj: Target PowerVR GEM object. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error encountered while attempting to map @pvr_obj to the CPU (see -+ * pvr_gem_object_vmap_unchecked()). -+ */ -+static int -+pvr_gem_object_zero(struct pvr_gem_object *pvr_obj) -+{ -+ void *cpu_ptr; -+ int err; -+ -+ /* -+ * We always map writecombined here so there's no need to flush the -+ * CPU cache afterwards. -+ */ -+ cpu_ptr = pvr_gem_object_vmap_prot(pvr_obj, false, -+ pgprot_writecombine(PAGE_KERNEL)); -+ if (IS_ERR(cpu_ptr)) { -+ err = PTR_ERR(cpu_ptr); -+ goto err_out; -+ } -+ -+ memset(cpu_ptr, 0, pvr_gem_object_size(pvr_obj)); -+ -+ pvr_gem_object_vunmap(pvr_obj, cpu_ptr, false); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_gem_object_init() - Initialises a PowerVR-specific buffer object. -+ * @pvr_dev: Target PowerVR device. -+ * @pvr_obj: PowerVR buffer object to initialise -+ * @size: Size of the object to allocate in bytes. Must be greater than zero. -+ * Any value which is not an exact multiple of the system page size will be -+ * rounded up to satisfy this condition. -+ * @flags: Options which affect both this operation and future mapping -+ * operations performed on the returned object. Must be a combination of -+ * DRM_PVR_BO_* and/or PVR_BO_* flags. -+ * @funcs: Pointer to &struct drm_gem_object_funcs to assign to this object. -+ * @is_imported: True if buffer object represents an imported buffer. -+ * -+ * The created object may be larger than @size, but can never be smaller. To -+ * get the exact size, call pvr_gem_object_size() on the returned pointer. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if @size is zero or @flags is not valid, -+ * * -%ENOMEM if sufficient physical memory cannot be allocated, -+ * * Any other error returned by drm_gem_object_init(), or -+ * * Any other error returned by drm_gem_create_mmap_offset(). -+ */ -+static int -+pvr_gem_object_init(struct pvr_device *pvr_dev, struct pvr_gem_object *pvr_obj, size_t size, -+ u64 flags, const struct drm_gem_object_funcs *funcs, bool is_imported) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct drm_gem_object *gem_obj; -+ int err; -+ -+ /* Verify @size and @flags before continuing. */ -+ if (size == 0 || !pvr_gem_object_flags_validate(flags)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ size = PAGE_ALIGN(size); -+ -+ /* FIXME: Compute any kernel-only options and apply them to @flags. */ -+ -+ gem_obj = from_pvr_gem_object(pvr_obj); -+ -+ if (is_imported) { -+ drm_gem_private_object_init(drm_dev, gem_obj, size); -+ } else { -+ err = drm_gem_object_init(drm_dev, gem_obj, size); -+ if (err) -+ goto err_out; -+ -+ /* -+ * Our buffers are kept pinned, so allocating them from the MOVABLE zone is a -+ * really bad idea, and conflicts with CMA. See comments above new_inode() why this -+ * is required _and_ expected if you're going to pin these pages. -+ */ -+ mapping_set_gfp_mask(gem_obj->filp->f_mapping, GFP_HIGHUSER | -+ __GFP_RETRY_MAYFAIL | __GFP_NOWARN); -+ } -+ -+ err = drm_gem_create_mmap_offset(gem_obj); -+ if (err) -+ goto err_release; -+ -+ pvr_obj->pvr_dev = pvr_dev; -+ mutex_init(&pvr_obj->lock); -+ -+ /* Safe to cast away the const-qualifier during initialization. */ -+ *(u64 *)&pvr_obj->flags = flags; -+ -+ gem_obj->funcs = funcs; -+ -+ /* -+ * Do this last because pvr_gem_object_zero() requires a fully -+ * configured instance of struct pvr_gem_object. -+ */ -+ if (flags & DRM_PVR_BO_CREATE_ZEROED) -+ pvr_gem_object_zero(pvr_obj); -+ -+ return 0; -+ -+err_release: -+ drm_gem_object_release(gem_obj); -+ -+err_out: -+ return err; -+} -+ -+static struct pvr_gem_object * -+pvr_gem_object_create_internal(struct pvr_device *pvr_dev, size_t size, u64 flags, bool is_imported) -+{ -+ struct pvr_gem_object *pvr_obj; -+ int err; -+ -+ /* Allocate a powervr-specific buffer object, which includes a &struct drm_gem_object. */ -+ pvr_obj = kzalloc(sizeof(*pvr_obj), GFP_KERNEL); -+ if (!pvr_obj) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = pvr_gem_object_init(pvr_dev, pvr_obj, size, flags, &pvr_gem_object_funcs, -+ is_imported); -+ if (err) -+ goto err_kfree_pvr_obj; -+ -+ return pvr_obj; -+ -+err_kfree_pvr_obj: -+ kfree(pvr_obj); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * pvr_gem_object_create() - Creates a PowerVR-specific buffer object. -+ * @pvr_dev: Target PowerVR device. -+ * @size: Size of the object to allocate in bytes. Must be greater than zero. -+ * Any value which is not an exact multiple of the system page size will be -+ * rounded up to satisfy this condition. -+ * @flags: Options which affect both this operation and future mapping -+ * operations performed on the returned object. Must be a combination of -+ * DRM_PVR_BO_* and/or PVR_BO_* flags. -+ * -+ * The created object may be larger than @size, but can never be smaller. To -+ * get the exact size, call pvr_gem_object_size() on the returned pointer. -+ * -+ * Return: -+ * * The newly-minted PowerVR-specific buffer object on success, -+ * * -%EINVAL if @size is zero or @flags is not valid, -+ * * -%ENOMEM if sufficient physical memory cannot be allocated, or -+ * * Any other error returned by drm_gem_create_mmap_offset(). -+ */ -+struct pvr_gem_object * -+pvr_gem_object_create(struct pvr_device *pvr_dev, size_t size, u64 flags) -+{ -+ return pvr_gem_object_create_internal(pvr_dev, size, flags, false); -+} -+ -+/** -+ * pvr_gem_fw_vmap() - Map a FW object in firmware address space -+ * @pvr_dev: Device pointer. -+ * @fw_obj: FW object to map. -+ * @dev_addr: Desired address in device space, if a specific address is -+ * required. 0 otherwise. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if @fw_obj is already mapped but has no references, or -+ * * Any error returned by DRM. -+ */ -+static int -+pvr_gem_fw_vmap(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj, -+ u64 dev_addr) -+{ -+ struct pvr_gem_object *pvr_obj = from_pvr_fw_object(fw_obj); -+ struct drm_gem_object *gem_obj = from_pvr_gem_object(pvr_obj); -+ -+ int err; -+ -+ err = pvr_gem_object_get_pages(pvr_obj); -+ if (err) -+ goto err_out; -+ -+ spin_lock(&pvr_dev->fw_mm_lock); -+ -+ if (drm_mm_node_allocated(&fw_obj->fw_mm_node)) { -+ err = -EINVAL; -+ goto err_unlock; -+ } -+ -+ if (!dev_addr) { -+ /* -+ * Allocate from the main heap only (firmware heap minus -+ * config space). -+ */ -+ err = drm_mm_insert_node_in_range(&pvr_dev->fw_mm, &fw_obj->fw_mm_node, -+ gem_obj->size, 0, 0, -+ pvr_dev->fw_heap_info.gpu_addr, -+ pvr_dev->fw_heap_info.gpu_addr + -+ pvr_dev->fw_heap_info.size, 0); -+ if (err) -+ goto err_unlock; -+ } else { -+ fw_obj->fw_mm_node.start = dev_addr; -+ fw_obj->fw_mm_node.size = gem_obj->size; -+ err = drm_mm_reserve_node(&pvr_dev->fw_mm, -+ &fw_obj->fw_mm_node); -+ if (err) -+ goto err_unlock; -+ } -+ -+ spin_unlock(&pvr_dev->fw_mm_lock); -+ -+ /* Map object on GPU. */ -+ err = pvr_dev->fw_funcs->vm_map(pvr_dev, fw_obj); -+ if (err) -+ goto err_remove_node; -+ -+ fw_obj->fw_addr_offset = -+ (u32)(fw_obj->fw_mm_node.start - pvr_dev->fw_mm_base); -+ -+ return 0; -+ -+err_remove_node: -+ spin_lock(&pvr_dev->fw_mm_lock); -+ drm_mm_remove_node(&fw_obj->fw_mm_node); -+ -+err_unlock: -+ spin_unlock(&pvr_dev->fw_mm_lock); -+ -+ pvr_gem_object_put_pages(pvr_obj); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_gem_fw_vunmap() - Unmap a previously mapped FW object -+ * @fw_obj: FW object to unmap. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if object is not currently mapped. -+ */ -+static int -+pvr_gem_fw_vunmap(struct pvr_fw_object *fw_obj) -+{ -+ struct pvr_gem_object *pvr_obj = from_pvr_fw_object(fw_obj); -+ struct drm_gem_object *gem_obj = from_pvr_gem_object(pvr_obj); -+ struct pvr_device *pvr_dev = to_pvr_device(gem_obj->dev); -+ int err; -+ -+ pvr_dev->fw_funcs->vm_unmap(pvr_dev, fw_obj); -+ -+ spin_lock(&pvr_dev->fw_mm_lock); -+ -+ if (!drm_mm_node_allocated(&fw_obj->fw_mm_node)) { -+ spin_unlock(&pvr_dev->fw_mm_lock); -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ drm_mm_remove_node(&fw_obj->fw_mm_node); -+ -+ spin_unlock(&pvr_dev->fw_mm_lock); -+ -+ pvr_gem_object_put_pages(pvr_obj); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_gem_create_fw_object_common(struct pvr_device *pvr_dev, size_t size, -+ u64 flags, u64 dev_addr, -+ struct pvr_fw_object **fw_obj_out) -+{ -+ struct pvr_fw_object *fw_obj; -+ int err; -+ -+ /* %DRM_PVR_BO_DEVICE_PM_FW_PROTECT is implicit for FW objects. */ -+ flags |= DRM_PVR_BO_DEVICE_PM_FW_PROTECT; -+ -+ fw_obj = kzalloc(sizeof(*fw_obj), GFP_KERNEL); -+ if (!fw_obj) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ /* -+ * All firmware objects use the same mapping flags. See -+ * %PVR_BO_FW_FLAGS_* for details. -+ */ -+ err = pvr_gem_object_init(pvr_dev, &fw_obj->base, size, flags, &pvr_gem_fw_object_funcs, -+ false); -+ if (err) -+ goto err_fw_obj_free; -+ -+ err = pvr_gem_fw_vmap(pvr_dev, fw_obj, dev_addr); -+ if (err) -+ goto err_release_object; -+ -+ *fw_obj_out = fw_obj; -+ -+ return 0; -+ -+err_release_object: -+ pvr_gem_object_put(&fw_obj->base); -+ -+err_fw_obj_free: -+ kfree(fw_obj); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_gem_create_fw_object() - Create a FW object and map to firmware -+ * @pvr_dev: PowerVR device pointer. -+ * @size: Size of object, in bytes. -+ * @flags: Options which affect both this operation and future mapping -+ * operations performed on the returned object. Must be a combination of -+ * DRM_PVR_BO_* and/or PVR_BO_* flags. -+ * @fw_obj_out: Pointer to location to store created object pointer. -+ * -+ * %DRM_PVR_BO_DEVICE_PM_FW_PROTECT is implied for all FW objects. Consequently, -+ * this function will fail if @flags has %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS -+ * set. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_gem_create_fw_object_common(). -+ */ -+int -+pvr_gem_create_fw_object(struct pvr_device *pvr_dev, size_t size, u64 flags, -+ struct pvr_fw_object **fw_obj_out) -+{ -+ return pvr_gem_create_fw_object_common(pvr_dev, size, flags, 0, -+ fw_obj_out); -+} -+ -+static void * -+pvr_gem_create_and_map_fw_common(struct pvr_device *pvr_dev, size_t size, -+ u64 flags, u64 dev_addr, -+ struct pvr_fw_object **fw_obj_out) -+{ -+ struct pvr_fw_object *fw_obj; -+ void *cpu_ptr; -+ int err; -+ -+ err = pvr_gem_create_fw_object_common(pvr_dev, size, flags, dev_addr, -+ &fw_obj); -+ if (err) -+ goto err_out; -+ -+ cpu_ptr = pvr_fw_object_vmap(fw_obj, true); -+ if (IS_ERR(cpu_ptr)) { -+ err = PTR_ERR(cpu_ptr); -+ goto err_put_object; -+ } -+ -+ *fw_obj_out = fw_obj; -+ -+ return cpu_ptr; -+ -+err_put_object: -+ pvr_fw_object_release(fw_obj); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * pvr_gem_create_and_map_fw_object() - Create a FW object and map to firmware -+ * and CPU -+ * @pvr_dev: PowerVR device pointer. -+ * @size: Size of object, in bytes. -+ * @flags: Options which affect both this operation and future mapping -+ * operations performed on the returned object. Must be a combination of -+ * DRM_PVR_BO_* and/or PVR_BO_* flags. -+ * @fw_obj_out: Pointer to location to store created object pointer. -+ * -+ * %DRM_PVR_BO_DEVICE_PM_FW_PROTECT is implied for all FW objects. Consequently, -+ * this function will fail if @flags has %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS -+ * set. -+ * -+ * Caller is responsible for calling pvr_gem_object_vunmap() to release the CPU -+ * mapping. -+ * -+ * Returns: -+ * * Pointer to CPU mapping of newly created object, or -+ * * Any error returned by pvr_gem_create_fw_object(), or -+ * * Any error returned by pvr_gem_object_vmap(). -+ */ -+void * -+pvr_gem_create_and_map_fw_object(struct pvr_device *pvr_dev, size_t size, -+ u64 flags, struct pvr_fw_object **fw_obj_out) -+{ -+ return pvr_gem_create_and_map_fw_common(pvr_dev, size, flags, 0, -+ fw_obj_out); -+} -+ -+/** -+ * pvr_gem_create_and_map_fw_object_offset() - Create a FW object and map to -+ * firmware at the provided offset -+ * and to the CPU. -+ * @pvr_dev: PowerVR device pointer. -+ * @dev_offset: Base address of desired FW mapping, offset from start of FW heap. -+ * @size: Size of object, in bytes. -+ * @flags: Options which affect both this operation and future mapping -+ * operations performed on the returned object. Must be a combination of -+ * DRM_PVR_BO_* and/or PVR_BO_* flags. -+ * @fw_obj_out: Pointer to location to store created object pointer. -+ * -+ * %DRM_PVR_BO_DEVICE_PM_FW_PROTECT is implied for all FW objects. Consequently, -+ * this function will fail if @flags has %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS -+ * set. -+ * -+ * Caller is responsible for calling pvr_gem_object_vunmap() to release the CPU -+ * mapping. -+ * -+ * Returns: -+ * * Pointer to CPU mapping of newly created object, or -+ * * Any error returned by pvr_gem_create_fw_object(), or -+ * * Any error returned by pvr_gem_object_vmap(). -+ */ -+void * -+pvr_gem_create_and_map_fw_object_offset(struct pvr_device *pvr_dev, -+ u32 dev_offset, size_t size, u64 flags, -+ struct pvr_fw_object **fw_obj_out) -+{ -+ u64 dev_addr = pvr_dev->fw_mm_base + dev_offset; -+ -+ return pvr_gem_create_and_map_fw_common(pvr_dev, size, flags, dev_addr, -+ fw_obj_out); -+} -+ -+/** -+ * pvr_gem_get_dma_addr() - Get DMA address for given offset in object -+ * @pvr_obj: Pointer to object to lookup address in. -+ * @offset: Offset within object to lookup address at. -+ * @dma_addr_out: Pointer to location to store DMA address. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if object is not currently backed, or if @offset is out of valid -+ * range for this object. -+ */ -+int -+pvr_gem_get_dma_addr(struct pvr_gem_object *pvr_obj, u32 offset, -+ dma_addr_t *dma_addr_out) -+{ -+ u32 accumulated_offset = 0; -+ struct scatterlist *sgl; -+ unsigned int sgt_idx; -+ -+ if (!pvr_obj->sgt) -+ return -EINVAL; -+ -+ for_each_sgtable_dma_sg(pvr_obj->sgt, sgl, sgt_idx) { -+ u32 new_offset = accumulated_offset + sg_dma_len(sgl); -+ -+ if (offset >= accumulated_offset && offset < new_offset) { -+ *dma_addr_out = sg_dma_address(sgl) + -+ (offset - accumulated_offset); -+ return 0; -+ } -+ -+ accumulated_offset = new_offset; -+ } -+ -+ return -EINVAL; -+} -+ -+/** -+ * pvr_fw_object_release() - Release FW object and unmap from FW space -+ * @fw_obj: Object to release. -+ */ -+void pvr_fw_object_release(struct pvr_fw_object *fw_obj) -+{ -+ WARN_ON(pvr_gem_fw_vunmap(fw_obj)); -+ pvr_fw_object_put(fw_obj); -+} -+ -+struct drm_gem_object * -+__pvr_gem_prime_import_sg_table(struct drm_device *drm_dev, -+ struct dma_buf_attachment *attach, -+ struct sg_table *sgt) -+{ -+ struct pvr_device *pvr_dev = to_pvr_device(drm_dev); -+ size_t size = attach->dmabuf->size; -+ struct pvr_gem_object *pvr_obj; -+ -+ pvr_obj = pvr_gem_object_create_internal(pvr_dev, size, 0, true); -+ if (IS_ERR(pvr_obj)) -+ return ERR_CAST(pvr_obj); -+ -+ pvr_obj->sgt = sgt; -+ -+ return from_pvr_gem_object(pvr_obj); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_gem.h b/drivers/gpu/drm/imagination/pvr_gem.h -new file mode 100644 -index 000000000000..d65e1ae490eb ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_gem.h -@@ -0,0 +1,383 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_GEM_H__ -+#define __PVR_GEM_H__ -+ -+#include "pvr_fw.h" -+#include "pvr_rogue_heap_config.h" -+#include "pvr_rogue_meta.h" -+ -+#include <uapi/drm/pvr_drm.h> -+ -+#include <drm/drm_gem.h> -+#include <drm/drm_mm.h> -+ -+#include <linux/bitfield.h> -+#include <linux/bits.h> -+#include <linux/const.h> -+#include <linux/compiler_attributes.h> -+#include <linux/kernel.h> -+#include <linux/mutex.h> -+#include <linux/refcount.h> -+#include <linux/scatterlist.h> -+#include <linux/sizes.h> -+#include <linux/types.h> -+ -+/* Forward declaration from "pvr_device.h". */ -+struct pvr_device; -+struct pvr_file; -+ -+/** -+ * DOC: Flags for DRM_IOCTL_PVR_CREATE_BO (kernel-only) -+ * -+ * Kernel-only values allowed in &pvr_gem_object->flags. The majority of options -+ * for this field are specified in the UAPI header "pvr_drm.h" with a -+ * DRM_PVR_BO_ prefix. To distinguish these internal options (which must exist -+ * in ranges marked as "reserved" in the UAPI header), we drop the DRM prefix. -+ * The public options should be used directly, DRM prefix and all. -+ * -+ * To avoid potentially confusing gaps in the UAPI options, these kernel-only -+ * options are specified "in reverse", starting at bit 63. -+ * -+ * We use "reserved" to refer to bits defined here and not exposed in the UAPI. -+ * Bits not defined anywhere are "undefined". -+ * -+ * Creation options -+ * These use the prefix PVR_BO_CREATE_. -+ * -+ * *There are currently no kernel-only flags in this group.* -+ * -+ * Device mapping options -+ * These use the prefix PVR_BO_DEVICE_. -+ * -+ * *There are currently no kernel-only flags in this group.* -+ * -+ * CPU mapping options -+ * These use the prefix PVR_BO_CPU_. -+ * -+ * :CACHED: By default, all GEM objects are mapped write-combined on the -+ * CPU. Set this flag to override this behaviour and map the object -+ * cached. -+ */ -+#define PVR_BO_CPU_CACHED BIT_ULL(63) -+ -+/* Bits 62..4 are undefined. */ -+/* Bits 3..0 are defined in the UAPI. */ -+ -+/* Other utilities. */ -+#define PVR_BO_UNDEFINED_MASK GENMASK_ULL(62, 4) -+#define PVR_BO_RESERVED_MASK (PVR_BO_UNDEFINED_MASK | GENMASK_ULL(63, 63)) -+ -+/* -+ * All firmware-mapped memory uses (mostly) the same flags. Specifically, -+ * firmware-mapped memory should be: -+ * * Read/write on the device, -+ * * Read/write on the CPU, and -+ * * Write-combined on the CPU. -+ * -+ * The only variation is in caching on the device. -+ */ -+#define PVR_BO_FW_FLAGS_DEVICE_CACHED (ULL(0)) -+#define PVR_BO_FW_FLAGS_DEVICE_UNCACHED DRM_PVR_BO_DEVICE_BYPASS_CACHE -+ -+/** -+ * struct pvr_gem_object - powervr-specific wrapper for &struct drm_gem_object -+ */ -+struct pvr_gem_object { -+ /** -+ * @base: The underlying &struct drm_gem_object. -+ * -+ * Do not access this member directly, instead call -+ * from_pvr_gem_object(). -+ */ -+ struct drm_gem_object base; -+ -+ /** @pvr_dev: Owning PowerVR device. */ -+ struct pvr_device *pvr_dev; -+ -+ /** -+ * @lock: Mutex protecting @pages_ref_count and @fw_mm_ref_count, and -+ * writes to @pages, @sgt and @mm_node. -+ */ -+ struct mutex lock; -+ -+ /** -+ * @pages_ref_count: Reference count for @pages. @lock must be held when -+ * accessing. -+ */ -+ int pages_ref_count; -+ -+ /** -+ * @pages: Array of page structures representing the memory backing -+ * this object. @lock must be held when writing. -+ * pvr_gem_get_pages() must be called before reading. -+ */ -+ struct page **pages; -+ -+ /** -+ * @sgt: Scatter-gather table representing the memory backing this -+ * object. @lock must be held when writing. pvr_gem_get_pages() -+ * must be called before reading. -+ */ -+ struct sg_table *sgt; -+ -+ /** -+ * @flags: Options set at creation-time. Some of these options apply to -+ * the creation operation itself (which are stored here for reference) -+ * with the remainder used for mapping options to both the device and -+ * CPU. These are used every time this object is mapped, but may be -+ * changed after creation. -+ * -+ * Must be a combination of DRM_PVR_BO_* and/or PVR_BO_* flags. -+ * -+ * .. note:: -+ * -+ * This member is declared const to indicate that none of these -+ * options may change or be changed throughout the object's -+ * lifetime. -+ */ -+ const u64 flags; -+}; -+ -+/** -+ * struct pvr_fw_object - container for firmware memory allocations -+ */ -+struct pvr_fw_object { -+ /** @base: The underlying PVR GEM object backing this allocation. */ -+ struct pvr_gem_object base; -+ -+ /** -+ * @fw_mm_node: Node representing mapping in FW address space. @pvr_obj->lock must -+ * be held when writing. -+ */ -+ struct drm_mm_node fw_mm_node; -+ -+ /** -+ * @fw_addr_offset: Virtual address offset of firmware mapping. Only -+ * valid if @flags has %PVR_GEM_OBJECT_FLAGS_FW_MAPPED -+ * set. -+ */ -+ u32 fw_addr_offset; -+}; -+ -+static __always_inline struct drm_gem_object * -+from_pvr_gem_object(struct pvr_gem_object *pvr_obj) -+{ -+ return &pvr_obj->base; -+} -+ -+static __always_inline struct pvr_gem_object * -+to_pvr_gem_object(struct drm_gem_object *gem_obj) -+{ -+ return container_of(gem_obj, struct pvr_gem_object, base); -+} -+ -+static __always_inline struct pvr_gem_object * -+from_pvr_fw_object(struct pvr_fw_object *fw_obj) -+{ -+ return &fw_obj->base; -+} -+ -+static __always_inline struct pvr_fw_object * -+to_pvr_fw_object(struct pvr_gem_object *pvr_obj) -+{ -+ return container_of(pvr_obj, struct pvr_fw_object, base); -+} -+ -+/* Functions defined in pvr_gem.c */ -+ -+struct drm_gem_object * -+__pvr_gem_prime_import_sg_table(struct drm_device *drm_dev, -+ struct dma_buf_attachment *attach, -+ struct sg_table *sgt); -+ -+struct pvr_gem_object *pvr_gem_object_create(struct pvr_device *pvr_dev, -+ size_t size, u64 flags); -+ -+int pvr_gem_object_into_handle(struct pvr_gem_object *pvr_obj, -+ struct pvr_file *pvr_file, u32 *handle); -+struct pvr_gem_object *pvr_gem_object_from_handle(struct pvr_file *pvr_file, -+ u32 handle); -+ -+int pvr_gem_object_get_pages(struct pvr_gem_object *pvr_obj); -+void pvr_gem_object_put_pages(struct pvr_gem_object *pvr_obj); -+ -+void *pvr_gem_object_vmap(struct pvr_gem_object *pvr_obj, bool sync_to_cpu); -+void pvr_gem_object_vunmap(struct pvr_gem_object *pvr_obj, void *cpu_ptr, -+ bool sync_to_device); -+ -+int pvr_gem_create_fw_object(struct pvr_device *pvr_dev, size_t size, u64 flags, -+ struct pvr_fw_object **pvr_obj_out); -+ -+void *pvr_gem_create_and_map_fw_object(struct pvr_device *pvr_dev, size_t size, -+ u64 flags, -+ struct pvr_fw_object **pvr_obj_out); -+ -+void * -+pvr_gem_create_and_map_fw_object_offset(struct pvr_device *pvr_dev, -+ u32 dev_offset, size_t size, u64 flags, -+ struct pvr_fw_object **pvr_obj_out); -+ -+int pvr_gem_get_dma_addr(struct pvr_gem_object *pvr_obj, u32 offset, -+ dma_addr_t *dma_addr_out); -+ -+/** -+ * pvr_gem_object_get() - Acquire reference on pvr_gem_object -+ * @pvr_obj: Pointer to object to acquire reference on. -+ */ -+static __always_inline void -+pvr_gem_object_get(struct pvr_gem_object *pvr_obj) -+{ -+ drm_gem_object_get(from_pvr_gem_object(pvr_obj)); -+} -+ -+/** -+ * pvr_gem_object_put() - Release reference on pvr_gem_object -+ * @pvr_obj: Pointer to object to release reference on. -+ */ -+static __always_inline void -+pvr_gem_object_put(struct pvr_gem_object *pvr_obj) -+{ -+ drm_gem_object_put(from_pvr_gem_object(pvr_obj)); -+} -+ -+static __always_inline size_t -+pvr_gem_object_size(struct pvr_gem_object *pvr_obj) -+{ -+ return from_pvr_gem_object(pvr_obj)->size; -+} -+ -+/** -+ * pvr_gem_object_is_imported() - Return whether an object is imported -+ * @pvr_obj: Pointer to object to test. -+ * -+ * Returns: -+ * * %true if object is imported, or -+ * * %false if object is not imported. -+ */ -+static __always_inline bool -+pvr_gem_object_is_imported(struct pvr_gem_object *pvr_obj) -+{ -+ return pvr_obj->base.import_attach != NULL; -+} -+ -+void pvr_fw_object_release(struct pvr_fw_object *fw_obj); -+ -+static __always_inline void * -+pvr_fw_object_vmap(struct pvr_fw_object *fw_obj, bool sync_to_cpu) -+{ -+ return pvr_gem_object_vmap(from_pvr_fw_object(fw_obj), sync_to_cpu); -+} -+ -+static __always_inline void -+pvr_fw_object_vunmap(struct pvr_fw_object *fw_obj, void *cpu_ptr, bool sync_to_device) -+{ -+ pvr_gem_object_vunmap(from_pvr_fw_object(fw_obj), cpu_ptr, sync_to_device); -+} -+ -+/** -+ * pvr_fw_object_get() - Acquire reference on pvr_fw_object -+ * @fw_obj: Pointer to object to acquire reference on. -+ */ -+static __always_inline void -+pvr_fw_object_get(struct pvr_fw_object *fw_obj) -+{ -+ pvr_gem_object_get(from_pvr_fw_object(fw_obj)); -+} -+ -+/** -+ * pvr_fw_object_put() - Release reference on pvr_fw_object -+ * @fw_obj: Pointer to object to release reference on. -+ * -+ * Note: This function must _not_ be used to release the reference obtained at -+ * creation time via pvr_gem_create_fw_object(). Use pvr_fw_object_release() -+ * instead. -+ */ -+static __always_inline void -+pvr_fw_object_put(struct pvr_fw_object *fw_obj) -+{ -+ pvr_gem_object_put(from_pvr_fw_object(fw_obj)); -+} -+ -+/** -+ * pvr_fw_get_dma_addr() - Get DMA address for given offset in firmware object -+ * @fw_obj: Pointer to object to lookup address in. -+ * @offset: Offset within object to lookup address at. -+ * @dma_addr_out: Pointer to location to store DMA address. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if object is not currently backed, or if @offset is out of valid -+ * range for this object. -+ */ -+static __always_inline int -+pvr_fw_get_dma_addr(struct pvr_fw_object *fw_obj, u32 offset, dma_addr_t *dma_addr_out) -+{ -+ return pvr_gem_get_dma_addr(from_pvr_fw_object(fw_obj), offset, dma_addr_out); -+} -+ -+/** -+ * pvr_gem_get_fw_addr_offset() - Return address of object in firmware address space, with given -+ * offset. -+ * @fw_obj: Pointer to object. -+ * @offset: Desired offset from start of object. -+ * @fw_addr_out: Location to store address to. -+ * -+ * Returns : -+ * * %true on success, or -+ * * %false if object is not mapped to firmware address space, or if @offset is outside object. -+ */ -+static __always_inline bool -+pvr_gem_get_fw_addr_offset(struct pvr_fw_object *fw_obj, u32 offset, u32 *fw_addr_out) -+{ -+ struct pvr_gem_object *pvr_obj = from_pvr_fw_object(fw_obj); -+ struct pvr_device *pvr_dev = pvr_obj->pvr_dev; -+ -+ *fw_addr_out = pvr_dev->fw_funcs->get_fw_addr_with_offset(fw_obj, offset); -+ -+ return true; -+} -+ -+/** -+ * pvr_gem_get_fw_addr() - Return address of object in firmware address space -+ * @fw_obj: Pointer to object. -+ * @fw_addr_out: Location to store address to. -+ * -+ * Returns : -+ * * %true on success, or -+ * * %false if object is not mapped to firmware address space. -+ */ -+static __always_inline bool -+pvr_gem_get_fw_addr(struct pvr_fw_object *fw_obj, u32 *fw_addr_out) -+{ -+ return pvr_gem_get_fw_addr_offset(fw_obj, 0, fw_addr_out); -+} -+ -+/** -+ * pvr_gem_get_fw_gpu_addr() - Return address of object in GPU address space -+ * @fw_obj: Pointer to object. -+ * @gpu_addr_out: Location to store address to. -+ * -+ * Note that this function is not valid if firmware processor is MIPS. -+ * -+ * Returns : -+ * * %true on success, or -+ * * %false if object is not mapped to firmware address space. -+ */ -+static __always_inline bool -+pvr_gem_get_fw_gpu_addr(struct pvr_fw_object *fw_obj, u64 *gpu_addr_out) -+{ -+ /* FIXME: Move to META-specific file */ -+ struct pvr_gem_object *pvr_obj = from_pvr_fw_object(fw_obj); -+ struct pvr_device *pvr_dev = pvr_obj->pvr_dev; -+ -+ if (pvr_dev->fw_processor_type != PVR_FW_PROCESSOR_TYPE_MIPS) { -+ *gpu_addr_out = fw_obj->fw_addr_offset + pvr_dev->fw_heap_info.gpu_addr; -+ return true; -+ } -+ -+ return false; -+} -+ -+#endif /* __PVR_GEM_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_hwrt.c b/drivers/gpu/drm/imagination/pvr_hwrt.c -new file mode 100644 -index 000000000000..49ae5a2e30d4 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_hwrt.c -@@ -0,0 +1,379 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_free_list.h" -+#include "pvr_hwrt.h" -+#include "pvr_gem.h" -+#include "pvr_object.h" -+#include "pvr_rogue_fwif.h" -+ -+#include <drm/drm_gem.h> -+#include <linux/slab.h> -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+/* Size of Shadow Render Target Cache entry */ -+#define SRTC_ENTRY_SIZE sizeof(u32) -+/* Size of Renders Accumulation Array entry */ -+#define RAA_ENTRY_SIZE sizeof(u32) -+ -+static int -+hwrt_init_kernel_structure(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_hwrt_dataset_args *args, -+ struct create_hwrt_free_list_args *free_list_args, -+ struct pvr_hwrt_dataset *hwrt) -+{ -+ int err; -+ int i; -+ -+ hwrt->base.type = DRM_PVR_OBJECT_TYPE_HWRT_DATASET; -+ hwrt->pvr_dev = pvr_file->pvr_dev; -+ hwrt->max_rts = args->max_rts; -+ hwrt->num_free_lists = args->num_free_lists; -+ hwrt->num_rt_datas = args->num_rt_datas; -+ -+ /* Get pointers to the free lists */ -+ for (i = 0; i < hwrt->num_free_lists; i++) { -+ hwrt->free_lists[i] = -+ pvr_free_list_get(pvr_file, -+ free_list_args[i].free_list_handle); -+ if (!hwrt->free_lists[i]) { -+ err = -EINVAL; -+ goto err_put_free_lists; -+ } -+ } -+ -+ return 0; -+ -+err_put_free_lists: -+ for (i = 0; i < hwrt->num_free_lists; i++) { -+ if (hwrt->free_lists[i]) { -+ pvr_free_list_put(hwrt->free_lists[i]); -+ hwrt->free_lists[i] = NULL; -+ } -+ } -+ -+ return err; -+} -+ -+static void -+hwrt_fini_kernel_structure(struct pvr_hwrt_dataset *hwrt) -+{ -+ int i; -+ -+ for (i = 0; i < hwrt->num_free_lists; i++) { -+ if (hwrt->free_lists[i]) { -+ pvr_free_list_put(hwrt->free_lists[i]); -+ hwrt->free_lists[i] = NULL; -+ } -+ } -+} -+ -+static int -+hwrt_init_common_fw_structure( -+ struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_hwrt_dataset_args *args, -+ struct pvr_hwrt_dataset *hwrt) -+{ -+ struct pvr_device *pvr_dev = pvr_file->pvr_dev; -+ struct rogue_fwif_hwrtdata_common *hwrt_data_common_fw; -+ int err; -+ -+ /* -+ * Create and map the FW structure so we can initialise it. This is not -+ * accessed on the CPU side post-initialisation so the mapping lifetime -+ * is only for this function. -+ */ -+ hwrt_data_common_fw = pvr_gem_create_and_map_fw_object(pvr_dev, -+ sizeof(*hwrt_data_common_fw), PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, &hwrt->common_fw_obj); -+ if (IS_ERR(hwrt_data_common_fw)) { -+ err = PTR_ERR(hwrt_data_common_fw); -+ goto err_out; -+ } -+ -+ hwrt_data_common_fw->geom_caches_need_zeroing = false; -+ -+ pvr_fw_object_vunmap(hwrt->common_fw_obj, hwrt_data_common_fw, false); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+static void -+hwrt_fini_common_fw_structure(struct pvr_hwrt_dataset *hwrt) -+{ -+ pvr_fw_object_release(hwrt->common_fw_obj); -+} -+ -+static int -+hwrt_data_init_fw_structure(struct pvr_file *pvr_file, -+ struct pvr_hwrt_dataset *hwrt, -+ struct drm_pvr_ioctl_create_hwrt_dataset_args *args, -+ struct create_hwrt_geom_data_args *geom_data_args, -+ struct create_hwrt_rt_data_args *rt_data_args, -+ struct pvr_hwrt_data *hwrt_data) -+{ -+ struct pvr_device *pvr_dev = pvr_file->pvr_dev; -+ struct rogue_fwif_hwrtdata *hwrt_data_fw; -+ struct rogue_fwif_rta_ctl *rta_ctl; -+ int free_list_i; -+ int err; -+ -+ /* -+ * Create and map the FW structure so we can initialise it. This is not -+ * accessed on the CPU side post-initialisation so the mapping lifetime -+ * is only for this function. -+ */ -+ hwrt_data_fw = pvr_gem_create_and_map_fw_object(pvr_dev, sizeof(*hwrt_data_fw), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, &hwrt_data->fw_obj); -+ if (IS_ERR(hwrt_data_fw)) { -+ err = PTR_ERR(hwrt_data_fw); -+ goto err_out; -+ } -+ -+ WARN_ON(!pvr_gem_get_fw_addr( -+ hwrt->common_fw_obj, &hwrt_data_fw->hwrt_data_common_fw_addr)); -+ -+ /* MList Data Store */ -+ hwrt_data_fw->pm_mlist_dev_addr = rt_data_args->pm_mlist_dev_addr; -+ -+ for (free_list_i = 0; free_list_i < hwrt->num_free_lists; -+ free_list_i++) { -+ if (!pvr_gem_get_fw_addr( -+ hwrt->free_lists[free_list_i]->fw_obj, -+ &hwrt_data_fw->freelists_fw_addr[free_list_i])) { -+ err = -EINVAL; -+ goto err_put_fw_obj; -+ } -+ } -+ -+ hwrt_data_fw->vheap_table_dev_addr = geom_data_args->vheap_table_dev_addr; -+ hwrt_data_fw->screen_pixel_max = args->screen_pixel_max; -+ hwrt_data_fw->multi_sample_ctl = args->multi_sample_control; -+ hwrt_data_fw->flipped_multi_sample_ctl = -+ args->flipped_multi_sample_control; -+ hwrt_data_fw->tpc_stride = args->tpc_stride; -+ hwrt_data_fw->tail_ptrs_dev_addr = geom_data_args->tail_ptrs_dev_addr; -+ hwrt_data_fw->tpc_size = args->tpc_stride; -+ hwrt_data_fw->te_screen = args->te_screen_size; -+ hwrt_data_fw->mtile_stride = args->mtile_stride; -+ hwrt_data_fw->teaa = args->te_aa; -+ hwrt_data_fw->te_mtile1 = args->te_mtile[0]; -+ hwrt_data_fw->te_mtile2 = args->te_mtile[1]; -+ hwrt_data_fw->isp_merge_lower_x = args->isp_merge_lower_x; -+ hwrt_data_fw->isp_merge_lower_y = args->isp_merge_lower_y; -+ hwrt_data_fw->isp_merge_upper_x = args->isp_merge_upper_x; -+ hwrt_data_fw->isp_mergy_upper_y = args->isp_merge_upper_y; -+ hwrt_data_fw->isp_merge_scale_x = args->isp_merge_scale_x; -+ hwrt_data_fw->isp_merge_scale_y = args->isp_merge_scale_y; -+ hwrt_data_fw->macrotile_array_dev_addr = -+ rt_data_args->macrotile_array_dev_addr; -+ hwrt_data_fw->rgn_header_dev_addr = rt_data_args->region_header_dev_addr; -+ hwrt_data_fw->rtc_dev_addr = geom_data_args->rtc_dev_addr; -+ hwrt_data_fw->rgn_header_size = args->region_header_size; -+ hwrt_data_fw->isp_mtile_size = args->isp_mtile_size; -+ -+ rta_ctl = &hwrt_data_fw->rta_ctl; -+ -+ rta_ctl->render_target_index = 0; -+ rta_ctl->active_render_targets = 0; -+ rta_ctl->valid_render_targets_fw_addr = 0; -+ rta_ctl->rta_num_partial_renders_fw_addr = 0; -+ rta_ctl->max_rts = args->max_rts; -+ -+ if (args->max_rts > 1) { -+ err = pvr_gem_create_fw_object(pvr_dev, args->max_rts * SRTC_ENTRY_SIZE, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &hwrt_data->srtc_obj); -+ if (err) -+ goto err_put_fw_obj; -+ WARN_ON(!pvr_gem_get_fw_addr( -+ hwrt_data->srtc_obj, -+ &rta_ctl->valid_render_targets_fw_addr)); -+ -+ err = pvr_gem_create_fw_object(pvr_dev, args->max_rts * RAA_ENTRY_SIZE, -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | -+ DRM_PVR_BO_CREATE_ZEROED, -+ &hwrt_data->raa_obj); -+ if (err) -+ goto err_put_shadow_rt_cache; -+ WARN_ON(!pvr_gem_get_fw_addr( -+ hwrt_data->raa_obj, -+ &rta_ctl->rta_num_partial_renders_fw_addr)); -+ } -+ -+ pvr_fw_object_vunmap(hwrt_data->fw_obj, hwrt_data_fw, false); -+ -+ return 0; -+ -+err_put_shadow_rt_cache: -+ pvr_fw_object_release(hwrt_data->srtc_obj); -+ -+err_put_fw_obj: -+ pvr_fw_object_vunmap(hwrt_data->fw_obj, hwrt_data_fw, false); -+ pvr_fw_object_release(hwrt_data->fw_obj); -+ -+err_out: -+ return err; -+} -+ -+static void -+hwrt_data_fini_fw_structure(struct pvr_hwrt_dataset *hwrt, int hwrt_nr) -+{ -+ struct pvr_hwrt_data *hwrt_data = &hwrt->data[hwrt_nr]; -+ -+ if (hwrt->max_rts > 1) { -+ pvr_fw_object_release(hwrt_data->raa_obj); -+ pvr_fw_object_release(hwrt_data->srtc_obj); -+ } -+ -+ pvr_fw_object_release(hwrt_data->fw_obj); -+} -+ -+/** -+ * pvr_hwrt_dataset_create() - Create a new HWRT dataset -+ * @pvr_file: Pointer to pvr_file structure. -+ * @args: Creation arguments from userspace. -+ * -+ * Return: -+ * * HWRT pointer on success, or -+ * * -%ENOMEM on out of memory. -+ */ -+struct pvr_hwrt_dataset * -+pvr_hwrt_dataset_create(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_hwrt_dataset_args *args) -+{ -+ struct create_hwrt_geom_data_args *geom_data_args; -+ struct create_hwrt_rt_data_args *rt_data_args; -+ struct create_hwrt_free_list_args *free_list_args; -+ struct pvr_hwrt_dataset *hwrt; -+ int err; -+ int i; -+ -+ if (args->num_geom_datas != ROGUE_FWIF_NUM_GEOMDATAS || -+ args->num_rt_datas != ROGUE_FWIF_NUM_RTDATAS || -+ args->num_free_lists != ROGUE_FWIF_NUM_RTDATA_FREELISTS) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (args->_padding_7a || args->_padding_7c) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ /* TODO: support multiple geom datas */ -+ BUILD_BUG_ON(ROGUE_FWIF_NUM_GEOMDATAS != 1); -+ -+ /* Copy geom / RT / free list structures from user space. */ -+ geom_data_args = kcalloc(args->num_geom_datas, sizeof(*geom_data_args), -+ GFP_KERNEL); -+ rt_data_args = -+ kcalloc(args->num_rt_datas, sizeof(*rt_data_args), GFP_KERNEL); -+ free_list_args = kcalloc(args->num_free_lists, sizeof(*free_list_args), -+ GFP_KERNEL); -+ if (!geom_data_args || !rt_data_args || !free_list_args) { -+ err = -ENOMEM; -+ goto err_free_args; -+ } -+ -+ if (copy_from_user(geom_data_args, -+ u64_to_user_ptr(args->geom_data_args), -+ sizeof(*geom_data_args) * args->num_geom_datas)) { -+ err = -EFAULT; -+ goto err_free_args; -+ } -+ if (copy_from_user(rt_data_args, u64_to_user_ptr(args->rt_data_args), -+ sizeof(*rt_data_args) * args->num_rt_datas)) { -+ err = -EFAULT; -+ goto err_free_args; -+ } -+ if (copy_from_user(free_list_args, -+ u64_to_user_ptr(args->free_list_args), -+ sizeof(*free_list_args) * args->num_free_lists)) { -+ err = -EFAULT; -+ goto err_free_args; -+ } -+ -+ /* Create and fill out the kernel structure */ -+ hwrt = kzalloc(sizeof(*hwrt), GFP_KERNEL); -+ if (!hwrt) { -+ err = -ENOMEM; -+ goto err_free_args; -+ } -+ -+ err = hwrt_init_kernel_structure(pvr_file, args, free_list_args, hwrt); -+ if (err < 0) -+ goto err_free_hwrt; -+ -+ err = hwrt_init_common_fw_structure(pvr_file, args, hwrt); -+ if (err < 0) -+ goto err_destroy_kernel_structure; -+ -+ for (i = 0; i < args->num_rt_datas; i++) { -+ err = hwrt_data_init_fw_structure(pvr_file, hwrt, args, -+ geom_data_args, -+ &rt_data_args[i], -+ &hwrt->data[i]); -+ if (err < 0) { -+ i--; -+ /* Destroy already created structures. */ -+ for (; i >= 0; i--) -+ hwrt_data_fini_fw_structure(hwrt, i); -+ goto err_destroy_common_fw_structure; -+ } -+ -+ hwrt->data[i].hwrt_dataset = hwrt; -+ } -+ -+ kfree(geom_data_args); -+ kfree(rt_data_args); -+ kfree(free_list_args); -+ -+ return hwrt; -+ -+err_destroy_common_fw_structure: -+ hwrt_fini_common_fw_structure(hwrt); -+ -+err_destroy_kernel_structure: -+ hwrt_fini_kernel_structure(hwrt); -+ -+err_free_hwrt: -+ kfree(hwrt); -+ -+err_free_args: -+ kfree(geom_data_args); -+ kfree(rt_data_args); -+ kfree(free_list_args); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * pvr_hwrt_dataset_destroy() - Destroy a HWRT data set -+ * @hwrt: HWRT pointer -+ * -+ * This should not be called directly. HWRT references should be dropped via pvr_hwrt_dataset_put(). -+ */ -+void -+pvr_hwrt_dataset_destroy(struct pvr_hwrt_dataset *hwrt) -+{ -+ struct pvr_device *pvr_dev = hwrt->pvr_dev; -+ int i; -+ -+ for (i = hwrt->num_rt_datas - 1; i >= 0; i--) { -+ WARN_ON(pvr_object_cleanup(pvr_dev, ROGUE_FWIF_CLEANUP_HWRTDATA, -+ hwrt->data[i].fw_obj, 0)); -+ hwrt_data_fini_fw_structure(hwrt, i); -+ } -+ -+ hwrt_fini_common_fw_structure(hwrt); -+ hwrt_fini_kernel_structure(hwrt); -+ -+ kfree(hwrt); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_hwrt.h b/drivers/gpu/drm/imagination/pvr_hwrt.h -new file mode 100644 -index 000000000000..edfa3945e055 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_hwrt.h -@@ -0,0 +1,171 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_HWRT_H__ -+#define __PVR_HWRT_H__ -+ -+#include <linux/compiler_attributes.h> -+#include <linux/kref.h> -+#include <linux/list.h> -+#include <linux/types.h> -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+#include "pvr_device.h" -+#include "pvr_object.h" -+#include "pvr_rogue_fwif_shared.h" -+ -+/* Forward declaration from pvr_free_list.h. */ -+struct pvr_free_list; -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+/** -+ * struct pvr_hwrt_data - structure representing HWRT data -+ */ -+struct pvr_hwrt_data { -+ /** @fw_obj: FW object representing the FW-side structure. */ -+ struct pvr_fw_object *fw_obj; -+ -+ /** -+ * @srtc_obj: FW object representing shadow render target cache. -+ * -+ * Only valid if @max_rts > 1. -+ */ -+ struct pvr_fw_object *srtc_obj; -+ -+ /** -+ * @raa_obj: FW object representing renders accumulation array. -+ * -+ * Only valid if @max_rts > 1. -+ */ -+ struct pvr_fw_object *raa_obj; -+ -+ /** @hwrt_dataset: Back pointer to owning HWRT dataset. */ -+ struct pvr_hwrt_dataset *hwrt_dataset; -+}; -+ -+/** -+ * struct pvr_hwrt_dataset - structure representing a HWRT data set. -+ */ -+struct pvr_hwrt_dataset { -+ /** @base: Object base structure. */ -+ struct pvr_object base; -+ -+ /** @pvr_dev: Pointer to owning device. */ -+ struct pvr_device *pvr_dev; -+ -+ /** @common_fw_obj: FW object representing common FW-side structure. */ -+ struct pvr_fw_object *common_fw_obj; -+ -+ /** @data: HWRT data structures belonging to this set. */ -+ struct pvr_hwrt_data data[ROGUE_FWIF_NUM_RTDATAS]; -+ -+ /** @free_lists: Free lists used by HWRT data set. */ -+ struct pvr_free_list *free_lists[ROGUE_FWIF_NUM_RTDATA_FREELISTS]; -+ -+ /** @max_rts: Maximum render targets for this HWRT data set. */ -+ u16 max_rts; -+ -+ /** @num_rt_datas: Number of rt data arguments. */ -+ u32 num_rt_datas; -+ -+ /** @num_free_lists: Number of free list arguments. */ -+ u32 num_free_lists; -+}; -+ -+struct pvr_hwrt_dataset * -+pvr_hwrt_dataset_create(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_hwrt_dataset_args *args); -+ -+void pvr_hwrt_dataset_destroy(struct pvr_hwrt_dataset *hwrt); -+ -+static __always_inline struct pvr_object * -+from_pvr_hwrt_dataset(struct pvr_hwrt_dataset *hwrt) -+{ -+ return &hwrt->base; -+}; -+ -+static __always_inline struct pvr_hwrt_dataset * -+to_pvr_hwrt_dataset(struct pvr_object *obj) -+{ -+ return container_of(obj, struct pvr_hwrt_dataset, base); -+} -+ -+/** -+ * pvr_hwrt_dataset_get() - Get HWRT dataset pointer from handle -+ * @pvr_file: Pointer to pvr_file structure. -+ * @handle: Object handle. -+ * -+ * Takes reference on object. Call pvr_hwrt_dataset_put() to release. -+ * -+ * Returns: -+ * * The requested object on success, or -+ * * %NULL on failure (object does not exist in list, or is not a HWRT -+ * dataset) -+ */ -+static __always_inline struct pvr_hwrt_dataset * -+pvr_hwrt_dataset_get(struct pvr_file *pvr_file, u32 handle) -+{ -+ struct pvr_object *obj = pvr_object_get(pvr_file, handle); -+ -+ if (obj) { -+ if (obj->type == DRM_PVR_OBJECT_TYPE_HWRT_DATASET) -+ return to_pvr_hwrt_dataset(obj); -+ -+ pvr_object_put(obj); -+ } -+ -+ return NULL; -+} -+ -+/** -+ * pvr_hwrt_dataset_put() - Release reference on HWRT dataset -+ * @hwrt: Pointer to HWRT dataset to release reference on -+ */ -+static __always_inline void -+pvr_hwrt_dataset_put(struct pvr_hwrt_dataset *hwrt) -+{ -+ pvr_object_put(&hwrt->base); -+} -+ -+/** -+ * pvr_hwrt_data_get() - Get HWRT data pointer from handle and index -+ * @pvr_file: Pointer to pvr_file structure. -+ * @handle: Object handle. -+ * @index: Index of RT data within dataset. -+ * -+ * Takes reference on dataset object. Call pvr_hwrt_data_put() to release. -+ * -+ * Returns: -+ * * The requested object on success, or -+ * * %NULL on failure (object does not exist in list, or is not a HWRT -+ * dataset, or index is out of range) -+ */ -+static __always_inline struct pvr_hwrt_data * -+pvr_hwrt_data_get(struct pvr_file *pvr_file, u32 handle, u32 index) -+{ -+ struct pvr_hwrt_dataset *hwrt_dataset = pvr_hwrt_dataset_get(pvr_file, handle); -+ -+ if (hwrt_dataset) { -+ if (index < hwrt_dataset->num_rt_datas) -+ return &hwrt_dataset->data[index]; -+ -+ pvr_hwrt_dataset_put(hwrt_dataset); -+ } -+ -+ return NULL; -+} -+ -+/** -+ * pvr_hwrt_data_put() - Release reference on HWRT data -+ * @hwrt: Pointer to HWRT data to release reference on -+ */ -+static __always_inline void -+pvr_hwrt_data_put(struct pvr_hwrt_data *hwrt) -+{ -+ pvr_hwrt_dataset_put(hwrt->hwrt_dataset); -+} -+ -+#endif /* __PVR_HWRT_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_job.c b/drivers/gpu/drm/imagination/pvr_job.c -new file mode 100644 -index 000000000000..27c28eb2ff08 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_job.c -@@ -0,0 +1,969 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_context.h" -+#include "pvr_device.h" -+#include "pvr_fence.h" -+#include "pvr_gem.h" -+#include "pvr_hwrt.h" -+#include "pvr_job.h" -+#include "pvr_rogue_fwif.h" -+#include "pvr_rogue_fwif_client.h" -+ -+#include <drm/drm_gem.h> -+#include <drm/drm_syncobj.h> -+#include <linux/slab.h> -+#include <linux/types.h> -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+static int -+import_fences(struct pvr_file *pvr_file, u32 num_in_syncobj_handles, -+ u64 in_syncobj_handles_p, struct xarray *in_fences) -+{ -+ const void __user *uptr = u64_to_user_ptr(in_syncobj_handles_p); -+ u32 *in_syncobj_handles; -+ struct dma_fence *fence; -+ unsigned long id; -+ int err; -+ int i; -+ -+ in_syncobj_handles = kcalloc(num_in_syncobj_handles, sizeof(*in_syncobj_handles), -+ GFP_KERNEL); -+ if (!in_syncobj_handles) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ if (copy_from_user(in_syncobj_handles, uptr, -+ sizeof(*in_syncobj_handles) * num_in_syncobj_handles)) { -+ err = -EFAULT; -+ goto err_free_memory; -+ } -+ -+ for (i = 0; i < num_in_syncobj_handles; i++) { -+ err = drm_syncobj_find_fence(from_pvr_file(pvr_file), -+ in_syncobj_handles[i], 0, 0, &fence); -+ if (err) -+ goto err_release_fences; -+ -+ err = drm_gem_fence_array_add(in_fences, fence); -+ if (err) -+ goto err_release_fences; -+ } -+ -+ return 0; -+ -+err_release_fences: -+ xa_for_each(in_fences, id, fence) { -+ dma_fence_put(fence); -+ } -+ xa_destroy(in_fences); -+ -+err_free_memory: -+ kfree(in_syncobj_handles); -+ -+err_out: -+ return err; -+} -+ -+static void release_fences(struct xarray *in_fences) -+{ -+ struct dma_fence *fence; -+ unsigned long id; -+ -+ xa_for_each(in_fences, id, fence) { -+ dma_fence_put(fence); -+ } -+ xa_destroy(in_fences); -+} -+ -+static int -+import_implicit_fences(struct pvr_file *pvr_file, struct pvr_job *job, -+ u32 num_in_bo_handles, u64 in_bo_handles_p, -+ struct xarray *in_fences) -+{ -+ struct drm_file *drm_file = from_pvr_file(pvr_file); -+ struct drm_pvr_bo_ref *bo_refs; -+ struct dma_fence *fence; -+ unsigned long id; -+ int err; -+ int i; -+ -+ bo_refs = kvmalloc_array(num_in_bo_handles, sizeof(*bo_refs), GFP_KERNEL); -+ if (!bo_refs) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ if (copy_from_user(bo_refs, u64_to_user_ptr(in_bo_handles_p), -+ num_in_bo_handles * sizeof(*bo_refs))) { -+ err = -EFAULT; -+ goto err_free_bo_refs; -+ } -+ -+ job->bos = kvmalloc_array(num_in_bo_handles, sizeof(*job->bos), GFP_KERNEL | __GFP_ZERO); -+ if (!job->bos) { -+ err = -ENOMEM; -+ goto err_free_bo_refs; -+ } -+ -+ job->num_bos = num_in_bo_handles; -+ -+ for (i = 0; i < job->num_bos; i++) { -+ job->bos[i] = drm_gem_object_lookup(drm_file, bo_refs[i].handle); -+ if (job->bos[i]) -+ goto err_release_fences; -+ -+ err = drm_gem_fence_array_add_implicit(in_fences, job->bos[i], -+ bo_refs[i].flags & DRM_PVR_BO_REF_WRITE); -+ if (err) -+ goto err_release_fences; -+ } -+ -+ return 0; -+ -+err_release_fences: -+ xa_for_each(in_fences, id, fence) { -+ dma_fence_put(fence); -+ } -+ xa_destroy(in_fences); -+ -+ for (i = 0; i < num_in_bo_handles; i++) -+ drm_gem_object_put(job->bos[i]); -+ kfree(job->bos); -+ -+err_free_bo_refs: -+ kfree(bo_refs); -+ -+err_out: -+ return err; -+} -+ -+static void release_implicit_fences(struct pvr_job *job, struct xarray *in_fences) -+{ -+ struct dma_fence *fence; -+ unsigned long id; -+ int i; -+ -+ xa_for_each(in_fences, id, fence) { -+ dma_fence_put(fence); -+ } -+ xa_destroy(in_fences); -+ -+ for (i = 0; i < job->num_bos; i++) -+ drm_gem_object_put(job->bos[i]); -+ kfree(job->bos); -+} -+ -+static void wait_fences(struct xarray *fence_array) -+{ -+ struct dma_fence *fence; -+ unsigned long id; -+ -+ xa_for_each(fence_array, id, fence) { -+ dma_fence_wait(fence, false); -+ } -+} -+ -+static int -+submit_cmd_geometry(struct pvr_device *pvr_dev, struct pvr_file *pvr_file, -+ struct pvr_context_render *ctx_render, -+ struct drm_pvr_ioctl_submit_job_args *args, -+ struct drm_pvr_job_render_args *render_args, struct pvr_hwrt_data *hwrt, -+ struct rogue_fwif_cmd_geom *cmd_geom, struct dma_fence **out_fence_out) -+{ -+ struct rogue_fwif_cmd_geom_frag_shared *cmd_shared = &cmd_geom->cmd_shared; -+ struct pvr_context_geom *ctx_geom = &ctx_render->ctx_geom; -+ struct drm_syncobj *out_syncobj; -+ struct rogue_fwif_ufo out_ufo; -+ struct dma_fence *out_fence; -+ struct xarray in_fences; -+ u32 ctx_fw_addr; -+ int err; -+ -+ WARN_ON(!pvr_gem_get_fw_addr(hwrt->fw_obj, &cmd_shared->hwrt_data_fw_addr)); -+ -+ WARN_ON(!pvr_gem_get_fw_addr(ctx_render->fw_obj, &ctx_fw_addr)); -+ -+ out_fence = pvr_fence_create(&ctx_geom->cccb.pvr_fence_context); -+ if (IS_ERR(out_fence)) { -+ err = PTR_ERR(out_fence); -+ goto err_out; -+ } -+ -+ err = pvr_fence_to_ufo(out_fence, &out_ufo); -+ if (err) -+ goto err_put_out_fence; -+ -+ if (render_args->out_syncobj_geom) { -+ out_syncobj = drm_syncobj_find(from_pvr_file(pvr_file), -+ render_args->out_syncobj_geom); -+ if (!out_syncobj) { -+ err = -ENOENT; -+ goto err_put_out_fence; -+ } -+ } -+ -+ xa_init_flags(&in_fences, XA_FLAGS_ALLOC); -+ -+ err = import_fences(pvr_file, render_args->num_in_syncobj_handles_geom, -+ render_args->in_syncobj_handles_geom, &in_fences); -+ if (err) -+ goto err_put_out_syncobj; -+ -+ /* Wait on fences */ -+ wait_fences(&in_fences); -+ -+ pvr_cccb_lock(&ctx_geom->cccb); -+ -+ /* Submit job to FW */ -+ err = pvr_cccb_write_command_with_header(&ctx_geom->cccb, ROGUE_FWIF_CCB_CMD_TYPE_GEOM, -+ sizeof(*cmd_geom), cmd_geom, args->ext_job_ref, 0); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ err = pvr_cccb_write_command_with_header(&ctx_geom->cccb, ROGUE_FWIF_CCB_CMD_TYPE_UPDATE, -+ sizeof(out_ufo), &out_ufo, args->ext_job_ref, 0); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ err = pvr_cccb_unlock_send_kccb_kick(pvr_dev, &ctx_geom->cccb, ctx_fw_addr, hwrt); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ /* Signal completion of geometry job */ -+ if (render_args->out_syncobj_geom) { -+ drm_syncobj_replace_fence(out_syncobj, out_fence); -+ drm_syncobj_put(out_syncobj); -+ } -+ -+ /* Write out fence to be used as input by fragment job. */ -+ *out_fence_out = out_fence; -+ release_fences(&in_fences); -+ -+ return 0; -+ -+err_cccb_unlock_rollback: -+ pvr_cccb_unlock_rollback(&ctx_geom->cccb); -+ -+ release_fences(&in_fences); -+ -+err_put_out_syncobj: -+ if (render_args->out_syncobj_geom) -+ drm_syncobj_put(out_syncobj); -+ -+err_put_out_fence: -+ /* As out_fence will now never be signaled, we need to drop two references here. */ -+ dma_fence_put(out_fence); -+ dma_fence_put(out_fence); -+ -+err_out: -+ return err; -+} -+ -+static int -+submit_cmd_fragment(struct pvr_device *pvr_dev, struct pvr_file *pvr_file, -+ struct pvr_context_render *ctx_render, -+ struct drm_pvr_ioctl_submit_job_args *args, -+ struct drm_pvr_job_render_args *render_args, struct pvr_hwrt_data *hwrt, -+ struct rogue_fwif_cmd_frag *cmd_frag, struct dma_fence *geom_in_fence) -+{ -+ struct rogue_fwif_cmd_geom_frag_shared *cmd_shared = &cmd_frag->cmd_shared; -+ struct pvr_context_frag *ctx_frag = &ctx_render->ctx_frag; -+ struct drm_syncobj *out_syncobj; -+ struct rogue_fwif_ufo out_ufo; -+ struct dma_fence *out_fence; -+ struct xarray in_fences; -+ u32 ctx_fw_addr; -+ int err; -+ -+ WARN_ON(!pvr_gem_get_fw_addr(hwrt->fw_obj, &cmd_shared->hwrt_data_fw_addr)); -+ -+ WARN_ON(!pvr_gem_get_fw_addr(ctx_render->fw_obj, &ctx_fw_addr)); -+ ctx_fw_addr += offsetof(struct rogue_fwif_fwrendercontext, frag_context); -+ -+ out_fence = pvr_fence_create(&ctx_frag->cccb.pvr_fence_context); -+ if (IS_ERR(out_fence)) { -+ err = PTR_ERR(out_fence); -+ goto err_out; -+ } -+ -+ err = pvr_fence_to_ufo(out_fence, &out_ufo); -+ if (err) -+ goto err_put_out_fence; -+ -+ if (geom_in_fence) { -+ /* -+ * Add dependency on geometry fence to the out fence, to ensure the former doesn't -+ * get freed while it's still being waited on. -+ */ -+ dma_fence_get(geom_in_fence); -+ pvr_fence_add_fence_dependency(out_fence, geom_in_fence); -+ } -+ -+ if (render_args->out_syncobj_frag) { -+ out_syncobj = drm_syncobj_find(from_pvr_file(pvr_file), -+ render_args->out_syncobj_frag); -+ if (!out_syncobj) { -+ err = -ENOENT; -+ goto err_put_out_fence; -+ } -+ } -+ -+ xa_init_flags(&in_fences, XA_FLAGS_ALLOC); -+ -+ err = import_fences(pvr_file, render_args->num_in_syncobj_handles_frag, -+ render_args->in_syncobj_handles_frag, &in_fences); -+ if (err) -+ goto err_put_out_syncobj; -+ -+ /* Wait on fences */ -+ wait_fences(&in_fences); -+ -+ pvr_cccb_lock(&ctx_frag->cccb); -+ -+ if (geom_in_fence) { -+ struct rogue_fwif_ufo geom_in_ufo; -+ -+ err = pvr_fence_to_ufo(geom_in_fence, &geom_in_ufo); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ err = pvr_cccb_write_command_with_header(&ctx_frag->cccb, -+ ROGUE_FWIF_CCB_CMD_TYPE_FENCE, -+ sizeof(geom_in_ufo), &geom_in_ufo, -+ args->ext_job_ref, 0); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ } -+ -+ /* Submit job to FW */ -+ err = pvr_cccb_write_command_with_header(&ctx_frag->cccb, ROGUE_FWIF_CCB_CMD_TYPE_FRAG, -+ sizeof(*cmd_frag), cmd_frag, args->ext_job_ref, 0); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ err = pvr_cccb_write_command_with_header(&ctx_frag->cccb, ROGUE_FWIF_CCB_CMD_TYPE_UPDATE, -+ sizeof(out_ufo), &out_ufo, args->ext_job_ref, 0); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ err = pvr_cccb_unlock_send_kccb_kick(pvr_dev, &ctx_frag->cccb, ctx_fw_addr, hwrt); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ /* Signal completion of fragment job */ -+ if (render_args->out_syncobj_frag) { -+ drm_syncobj_replace_fence(out_syncobj, out_fence); -+ drm_syncobj_put(out_syncobj); -+ } -+ -+ dma_fence_put(out_fence); -+ release_fences(&in_fences); -+ -+ return 0; -+ -+err_cccb_unlock_rollback: -+ pvr_cccb_unlock_rollback(&ctx_frag->cccb); -+ -+ release_fences(&in_fences); -+ -+err_put_out_syncobj: -+ if (render_args->out_syncobj_frag) -+ drm_syncobj_put(out_syncobj); -+ -+err_put_out_fence: -+ /* As out_fence will now never be signaled, we need to drop two references here. */ -+ dma_fence_put(out_fence); -+ dma_fence_put(out_fence); -+ -+err_out: -+ return err; -+} -+ -+static int -+submit_cmd_compute(struct pvr_device *pvr_dev, struct pvr_file *pvr_file, -+ struct pvr_context_compute *ctx_compute, -+ struct drm_pvr_ioctl_submit_job_args *args, -+ struct drm_pvr_job_compute_args *compute_args, -+ struct rogue_fwif_cmd_compute *cmd_compute) -+{ -+ struct drm_syncobj *out_syncobj; -+ struct rogue_fwif_ufo out_ufo; -+ struct dma_fence *out_fence; -+ struct xarray in_fences; -+ u32 ctx_fw_addr; -+ int err; -+ -+ WARN_ON(!pvr_gem_get_fw_addr(ctx_compute->fw_obj, &ctx_fw_addr)); -+ -+ out_fence = pvr_fence_create(&ctx_compute->cccb.pvr_fence_context); -+ if (IS_ERR(out_fence)) { -+ err = PTR_ERR(out_fence); -+ goto err_out; -+ } -+ -+ err = pvr_fence_to_ufo(out_fence, &out_ufo); -+ if (err) -+ goto err_put_out_fence; -+ -+ if (compute_args->out_syncobj) { -+ out_syncobj = drm_syncobj_find(from_pvr_file(pvr_file), -+ compute_args->out_syncobj); -+ if (!out_syncobj) { -+ err = -ENOENT; -+ goto err_put_out_fence; -+ } -+ } -+ -+ xa_init_flags(&in_fences, XA_FLAGS_ALLOC); -+ -+ err = import_fences(pvr_file, compute_args->num_in_syncobj_handles, -+ compute_args->in_syncobj_handles, &in_fences); -+ if (err) -+ goto err_put_out_syncobj; -+ -+ /* Wait on fences */ -+ wait_fences(&in_fences); -+ -+ pvr_cccb_lock(&ctx_compute->cccb); -+ -+ /* Submit job to FW */ -+ err = pvr_cccb_write_command_with_header(&ctx_compute->cccb, ROGUE_FWIF_CCB_CMD_TYPE_CDM, -+ sizeof(*cmd_compute), cmd_compute, -+ args->ext_job_ref, 0); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ err = pvr_cccb_write_command_with_header(&ctx_compute->cccb, ROGUE_FWIF_CCB_CMD_TYPE_UPDATE, -+ sizeof(out_ufo), &out_ufo, args->ext_job_ref, 0); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ err = pvr_cccb_unlock_send_kccb_kick(pvr_dev, &ctx_compute->cccb, ctx_fw_addr, NULL); -+ if (err) -+ goto err_cccb_unlock_rollback; -+ -+ /* Signal completion of compute job */ -+ if (compute_args->out_syncobj) { -+ drm_syncobj_replace_fence(out_syncobj, out_fence); -+ drm_syncobj_put(out_syncobj); -+ } -+ -+ dma_fence_put(out_fence); -+ release_fences(&in_fences); -+ -+ return 0; -+ -+err_cccb_unlock_rollback: -+ pvr_cccb_unlock_rollback(&ctx_compute->cccb); -+ -+ release_fences(&in_fences); -+ -+err_put_out_syncobj: -+ if (compute_args->out_syncobj) -+ drm_syncobj_put(out_syncobj); -+ -+err_put_out_fence: -+ /* As out_fence will now never be signaled, we need to drop two references here. */ -+ dma_fence_put(out_fence); -+ dma_fence_put(out_fence); -+ -+err_out: -+ return err; -+} -+ -+static int -+convert_cmd_geom(struct rogue_fwif_cmd_geom *cmd_geom, struct drm_pvr_cmd_geom *cmd_geom_user) -+{ -+ struct drm_pvr_cmd_geom_format_1 *cmd_geom_format_1 = -+ &cmd_geom_user->data.cmd_geom_format_1; -+ -+ if (cmd_geom_user->format != DRM_PVR_CMD_GEOM_FORMAT_1 || cmd_geom_user->_padding_4) -+ return -EINVAL; -+ -+ if (cmd_geom_format_1->flags & ~DRM_PVR_SUBMIT_JOB_GEOM_CMD_FLAGS_MASK) -+ return -EINVAL; -+ -+ cmd_geom->cmd_shared.cmn.frame_num = cmd_geom_format_1->frame_num; -+ /* HWRT and PR buffers filled out later. */ -+ cmd_geom->flags = cmd_geom_format_1->flags; -+ /* PR fence filled out later. */ -+ -+ cmd_geom->geom_regs.vdm_ctrl_stream_base = -+ cmd_geom_format_1->geom_regs.vdm_ctrl_stream_base; -+ cmd_geom->geom_regs.tpu_border_colour_table = -+ cmd_geom_format_1->geom_regs.tpu_border_colour_table; -+ cmd_geom->geom_regs.ppp_ctrl = cmd_geom_format_1->geom_regs.ppp_ctrl; -+ cmd_geom->geom_regs.te_psg = cmd_geom_format_1->geom_regs.te_psg; -+ cmd_geom->geom_regs.tpu = cmd_geom_format_1->geom_regs.tpu; -+ cmd_geom->geom_regs.vdm_context_resume_task0_size = -+ cmd_geom_format_1->geom_regs.vdm_context_resume_task0_size; -+ cmd_geom->geom_regs.pds_ctrl = cmd_geom_format_1->geom_regs.pds_ctrl; -+ cmd_geom->geom_regs.view_idx = cmd_geom_format_1->geom_regs.view_idx; -+ -+ return 0; -+} -+ -+static int -+convert_cmd_frag(struct rogue_fwif_cmd_frag *cmd_frag, struct drm_pvr_cmd_frag *cmd_frag_user) -+{ -+ struct drm_pvr_cmd_frag_format_1 *cmd_frag_format_1 = -+ &cmd_frag_user->data.cmd_frag_format_1; -+ -+ if (cmd_frag_user->format != DRM_PVR_CMD_FRAG_FORMAT_1 || cmd_frag_user->_padding_4) -+ return -EINVAL; -+ -+ if (cmd_frag_format_1->flags & ~DRM_PVR_SUBMIT_JOB_FRAG_CMD_FLAGS_MASK) -+ return -EINVAL; -+ -+ cmd_frag->cmd_shared.cmn.frame_num = cmd_frag_format_1->frame_num; -+ /* HWRT and PR buffers filled out later. */ -+ cmd_frag->flags = cmd_frag_format_1->flags; -+ cmd_frag->zls_stride = cmd_frag_format_1->zls_stride; -+ cmd_frag->sls_stride = cmd_frag_format_1->sls_stride; -+ -+ memcpy(cmd_frag->regs.usc_clear_register, cmd_frag_format_1->regs.usc_clear_register, -+ sizeof(cmd_frag->regs.usc_clear_register)); -+ cmd_frag->regs.usc_pixel_output_ctrl = cmd_frag_format_1->regs.usc_pixel_output_ctrl; -+ cmd_frag->regs.isp_bgobjdepth = cmd_frag_format_1->regs.isp_bgobjdepth; -+ cmd_frag->regs.isp_bgobjvals = cmd_frag_format_1->regs.isp_bgobjvals; -+ cmd_frag->regs.isp_aa = cmd_frag_format_1->regs.isp_aa; -+ cmd_frag->regs.isp_ctl = cmd_frag_format_1->regs.isp_ctl; -+ cmd_frag->regs.tpu = cmd_frag_format_1->regs.tpu; -+ cmd_frag->regs.event_pixel_pds_info = cmd_frag_format_1->regs.event_pixel_pds_info; -+ cmd_frag->regs.pixel_phantom = cmd_frag_format_1->regs.pixel_phantom; -+ cmd_frag->regs.view_idx = cmd_frag_format_1->regs.view_idx; -+ cmd_frag->regs.event_pixel_pds_data = cmd_frag_format_1->regs.event_pixel_pds_data; -+ cmd_frag->regs.isp_scissor_base = cmd_frag_format_1->regs.isp_scissor_base; -+ cmd_frag->regs.isp_dbias_base = cmd_frag_format_1->regs.isp_dbias_base; -+ cmd_frag->regs.isp_oclqry_base = cmd_frag_format_1->regs.isp_oclqry_base; -+ cmd_frag->regs.isp_zlsctl = cmd_frag_format_1->regs.isp_zlsctl; -+ cmd_frag->regs.isp_zload_store_base = cmd_frag_format_1->regs.isp_zload_store_base; -+ cmd_frag->regs.isp_stencil_load_store_base = -+ cmd_frag_format_1->regs.isp_stencil_load_store_base; -+ cmd_frag->regs.isp_zls_pixels = cmd_frag_format_1->regs.isp_zls_pixels; -+ memcpy(cmd_frag->regs.pbe_word, cmd_frag_format_1->regs.pbe_word, -+ sizeof(cmd_frag->regs.pbe_word)); -+ cmd_frag->regs.tpu_border_colour_table = cmd_frag_format_1->regs.tpu_border_colour_table; -+ memcpy(cmd_frag->regs.pds_bgnd, cmd_frag_format_1->regs.pds_bgnd, -+ sizeof(cmd_frag->regs.pds_bgnd)); -+ memcpy(cmd_frag->regs.pds_pr_bgnd, cmd_frag_format_1->regs.pds_pr_bgnd, -+ sizeof(cmd_frag->regs.pds_pr_bgnd)); -+ -+ return 0; -+} -+ -+static int -+convert_cmd_compute(struct rogue_fwif_cmd_compute *cmd_compute, -+ struct drm_pvr_cmd_compute *cmd_compute_user) -+{ -+ struct drm_pvr_cmd_compute_format_1 *cmd_compute_format_1 = -+ &cmd_compute_user->data.cmd_compute_format_1; -+ -+ if (cmd_compute_user->format != DRM_PVR_CMD_COMPUTE_FORMAT_1 || -+ cmd_compute_user->_padding_4) -+ return -EINVAL; -+ -+ if (cmd_compute_format_1->flags & ~DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_FLAGS_MASK) -+ return -EINVAL; -+ -+ cmd_compute->common.frame_num = cmd_compute_format_1->frame_num; -+ cmd_compute->flags = cmd_compute_format_1->flags; -+ -+ cmd_compute->cmd_regs.tpu_border_colour_table = -+ cmd_compute_format_1->regs.tpu_border_colour_table; -+ cmd_compute->cmd_regs.cdm_item = cmd_compute_format_1->regs.cdm_item; -+ cmd_compute->cmd_regs.compute_cluster = cmd_compute_format_1->regs.compute_cluster; -+ cmd_compute->cmd_regs.cdm_ctrl_stream_base = -+ cmd_compute_format_1->regs.cdm_ctrl_stream_base; -+ cmd_compute->cmd_regs.tpu = cmd_compute_format_1->regs.tpu; -+ cmd_compute->cmd_regs.cdm_resume_pds1 = cmd_compute_format_1->regs.cdm_resume_pds1; -+ -+ return 0; -+} -+ -+static int -+pvr_fw_cmd_geom_init(struct drm_pvr_job_render_args *render_args, -+ struct rogue_fwif_cmd_geom **cmd_geom_out) -+{ -+ struct drm_pvr_cmd_geom *cmd_geom_user; -+ struct rogue_fwif_cmd_geom *cmd_geom; -+ int err; -+ -+ cmd_geom_user = kzalloc(sizeof(*cmd_geom_user), GFP_KERNEL); -+ if (!cmd_geom_user) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ cmd_geom = kzalloc(sizeof(*cmd_geom), GFP_KERNEL); -+ if (!cmd_geom) { -+ err = -ENOMEM; -+ goto err_free_cmd_geom_user; -+ } -+ -+ if (copy_from_user(cmd_geom_user, u64_to_user_ptr(render_args->cmd_geom), -+ sizeof(*cmd_geom_user))) { -+ err = -EFAULT; -+ goto err_free_cmd_geom; -+ } -+ -+ err = convert_cmd_geom(cmd_geom, cmd_geom_user); -+ if (err) -+ goto err_free_cmd_geom; -+ -+ kfree(cmd_geom_user); -+ -+ *cmd_geom_out = cmd_geom; -+ -+ return 0; -+ -+err_free_cmd_geom: -+ kfree(cmd_geom); -+ -+err_free_cmd_geom_user: -+ kfree(cmd_geom_user); -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_fw_cmd_frag_init(struct drm_pvr_job_render_args *render_args, -+ struct rogue_fwif_cmd_frag **cmd_frag_out) -+{ -+ struct drm_pvr_cmd_frag *cmd_frag_user; -+ struct rogue_fwif_cmd_frag *cmd_frag; -+ int err; -+ -+ cmd_frag_user = kzalloc(sizeof(*cmd_frag_user), GFP_KERNEL); -+ if (!cmd_frag_user) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ cmd_frag = kzalloc(sizeof(*cmd_frag), GFP_KERNEL); -+ if (!cmd_frag) { -+ err = -ENOMEM; -+ goto err_free_cmd_frag_user; -+ } -+ -+ if (copy_from_user(cmd_frag_user, u64_to_user_ptr(render_args->cmd_frag), -+ sizeof(*cmd_frag_user))) { -+ err = -EFAULT; -+ goto err_free_cmd_frag; -+ } -+ -+ err = convert_cmd_frag(cmd_frag, cmd_frag_user); -+ if (err) -+ goto err_free_cmd_frag; -+ -+ kfree(cmd_frag_user); -+ -+ *cmd_frag_out = cmd_frag; -+ -+ return 0; -+ -+err_free_cmd_frag: -+ kfree(cmd_frag); -+ -+err_free_cmd_frag_user: -+ kfree(cmd_frag_user); -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_fw_cmd_compute_init(struct drm_pvr_job_compute_args *compute_args, -+ struct rogue_fwif_cmd_compute **cmd_compute_out) -+{ -+ struct drm_pvr_cmd_compute *cmd_compute_user; -+ struct rogue_fwif_cmd_compute *cmd_compute; -+ int err; -+ -+ cmd_compute_user = kzalloc(sizeof(*cmd_compute_user), GFP_KERNEL); -+ if (!cmd_compute_user) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ cmd_compute = kzalloc(sizeof(*cmd_compute), GFP_KERNEL); -+ if (!cmd_compute) { -+ err = -ENOMEM; -+ goto err_free_cmd_compute_user; -+ } -+ -+ if (copy_from_user(cmd_compute_user, u64_to_user_ptr(compute_args->cmd), -+ sizeof(*cmd_compute_user))) { -+ err = -EFAULT; -+ goto err_free_cmd_compute; -+ } -+ -+ err = convert_cmd_compute(cmd_compute, cmd_compute_user); -+ if (err) -+ goto err_free_cmd_compute; -+ -+ kfree(cmd_compute_user); -+ -+ *cmd_compute_out = cmd_compute; -+ -+ return 0; -+ -+err_free_cmd_compute: -+ kfree(cmd_compute); -+ -+err_free_cmd_compute_user: -+ kfree(cmd_compute_user); -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_process_job_render(struct pvr_device *pvr_dev, -+ struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_submit_job_args *args, -+ struct drm_pvr_job_render_args *render_args, -+ struct pvr_job *job) -+{ -+ struct pvr_context_render *ctx_render; -+ struct rogue_fwif_cmd_geom *cmd_geom; -+ struct rogue_fwif_cmd_frag *cmd_frag; -+ struct xarray implicit_fences; -+ struct dma_fence *geom_fence = NULL; -+ struct pvr_hwrt_data *hwrt; -+ int err; -+ -+ /* Copy commands from userspace. */ -+ if (render_args->cmd_geom) { -+ err = pvr_fw_cmd_geom_init(render_args, &cmd_geom); -+ if (err) -+ goto err_out; -+ } -+ if (render_args->cmd_frag) { -+ err = pvr_fw_cmd_frag_init(render_args, &cmd_frag); -+ if (err) -+ goto err_free_cmd_geom; -+ } -+ -+ hwrt = pvr_hwrt_data_get(pvr_file, render_args->hwrt_data_set_handle, -+ render_args->hwrt_data_index); -+ if (!hwrt) { -+ err = -EINVAL; -+ goto err_free_cmd_frag; -+ } -+ -+ job->ctx = pvr_context_get(pvr_file, args->context_handle); -+ if (!job->ctx) { -+ err = -EINVAL; -+ goto err_put_hwrt; -+ } -+ ctx_render = to_pvr_context_render(job->ctx); -+ -+ xa_init_flags(&implicit_fences, XA_FLAGS_ALLOC); -+ -+ err = import_implicit_fences(pvr_file, job, render_args->num_bo_handles, -+ render_args->bo_handles, &implicit_fences); -+ if (err) -+ goto err_put_context; -+ -+ /* Wait on implicit fences */ -+ wait_fences(&implicit_fences); -+ -+ if (render_args->cmd_geom) { -+ err = submit_cmd_geometry(pvr_dev, pvr_file, ctx_render, args, render_args, hwrt, -+ cmd_geom, &geom_fence); -+ if (err) -+ goto err_release_implicit_fences; -+ } -+ -+ if (render_args->cmd_frag) { -+ err = submit_cmd_fragment(pvr_dev, pvr_file, ctx_render, args, render_args, hwrt, -+ cmd_frag, geom_fence); -+ if (err) -+ goto err_put_geom_fence; -+ } -+ -+ dma_fence_put(geom_fence); -+ release_implicit_fences(job, &implicit_fences); -+ pvr_context_put(job->ctx); -+ pvr_hwrt_data_put(hwrt); -+ -+ kfree(cmd_frag); -+ kfree(cmd_geom); -+ -+ return 0; -+ -+err_put_geom_fence: -+ dma_fence_put(geom_fence); -+ -+err_release_implicit_fences: -+ release_implicit_fences(job, &implicit_fences); -+ -+err_put_context: -+ pvr_context_put(job->ctx); -+ -+err_put_hwrt: -+ pvr_hwrt_data_put(hwrt); -+ -+err_free_cmd_frag: -+ if (render_args->cmd_frag) -+ kfree(cmd_frag); -+ -+err_free_cmd_geom: -+ if (render_args->cmd_geom) -+ kfree(cmd_geom); -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_process_job_compute(struct pvr_device *pvr_dev, -+ struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_submit_job_args *args, -+ struct drm_pvr_job_compute_args *compute_args, -+ struct pvr_job *job) -+{ -+ struct rogue_fwif_cmd_compute *cmd_compute; -+ struct pvr_context_compute *ctx_compute; -+ struct xarray implicit_fences; -+ int err; -+ -+ /* Copy commands from userspace. */ -+ if (!compute_args->cmd || compute_args->_padding_24) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = pvr_fw_cmd_compute_init(compute_args, &cmd_compute); -+ if (err) -+ goto err_out; -+ -+ job->ctx = pvr_context_get(pvr_file, args->context_handle); -+ if (!job->ctx) { -+ err = -EINVAL; -+ goto err_free_cmd_compute; -+ } -+ ctx_compute = to_pvr_context_compute(job->ctx); -+ -+ xa_init_flags(&implicit_fences, XA_FLAGS_ALLOC); -+ -+ err = import_implicit_fences(pvr_file, job, compute_args->num_bo_handles, -+ compute_args->bo_handles, &implicit_fences); -+ if (err) -+ goto err_put_context; -+ -+ /* Wait on implicit fences */ -+ wait_fences(&implicit_fences); -+ -+ err = submit_cmd_compute(pvr_dev, pvr_file, ctx_compute, args, compute_args, cmd_compute); -+ if (err) -+ goto err_release_implicit_fences; -+ -+ release_implicit_fences(job, &implicit_fences); -+ pvr_context_put(job->ctx); -+ -+ kfree(cmd_compute); -+ -+ return 0; -+ -+err_release_implicit_fences: -+ release_implicit_fences(job, &implicit_fences); -+ -+err_put_context: -+ pvr_context_put(job->ctx); -+ -+err_free_cmd_compute: -+ kfree(cmd_compute); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_submit_job() - Submit a job to the GPU -+ * @pvr_dev: Target PowerVR device. -+ * @pvr_file: Pointer to PowerVR file structure. -+ * @args: IOCTL arguments. -+ * -+ * This initial implementation is entirely synchronous; on return the GPU will -+ * be idle. This will not be the case for future implementations. -+ * -+ * Returns: -+ * * 0 on success, -+ * * -%EFAULT if arguments can not be copied from user space, -+ * * -%EINVAL on invalid arguments, or -+ * * Any other error. -+ */ -+int -+pvr_submit_job(struct pvr_device *pvr_dev, -+ struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_submit_job_args *args) -+{ -+ struct pvr_job *job; -+ int err; -+ -+ if (args->_padding_c) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ job = kzalloc(sizeof(*job), GFP_KERNEL); -+ if (!job) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ job->type = args->job_type; -+ -+ /* Process arguments based on job type */ -+ switch (job->type) { -+ case DRM_PVR_JOB_TYPE_RENDER: { -+ struct drm_pvr_job_render_args render_args; -+ -+ if (copy_from_user(&render_args, u64_to_user_ptr(args->data), -+ sizeof(render_args))) { -+ err = -EFAULT; -+ goto err_free; -+ } -+ -+ err = pvr_process_job_render(pvr_dev, pvr_file, args, &render_args, job); -+ if (err) -+ goto err_free; -+ break; -+ } -+ -+ case DRM_PVR_JOB_TYPE_COMPUTE: { -+ struct drm_pvr_job_compute_args compute_args; -+ -+ if (copy_from_user(&compute_args, u64_to_user_ptr(args->data), -+ sizeof(compute_args))) { -+ err = -EFAULT; -+ goto err_free; -+ } -+ -+ err = pvr_process_job_compute(pvr_dev, pvr_file, args, &compute_args, job); -+ if (err) -+ goto err_free; -+ break; -+ } -+ -+ default: -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ kfree(job); -+ -+ return 0; -+ -+err_free: -+ kfree(job); -+ -+err_out: -+ return err; -+} -diff --git a/drivers/gpu/drm/imagination/pvr_job.h b/drivers/gpu/drm/imagination/pvr_job.h -new file mode 100644 -index 000000000000..c65d800627f1 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_job.h -@@ -0,0 +1,32 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_JOB_H__ -+#define __PVR_JOB_H__ -+ -+#include <uapi/drm/pvr_drm.h> -+ -+#include <linux/types.h> -+ -+#include <drm/drm_gem.h> -+ -+/* Forward declaration from "pvr_context.h". */ -+struct pvr_context; -+ -+/* Forward declarations from "pvr_device.h". */ -+struct pvr_device; -+struct pvr_file; -+ -+struct pvr_job { -+ enum drm_pvr_job_type type; -+ -+ struct pvr_context *ctx; -+ -+ u32 num_bos; -+ struct drm_gem_object **bos; -+}; -+ -+int pvr_submit_job(struct pvr_device *pvr_dev, struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_submit_job_args *args); -+ -+#endif /* __PVR_JOB_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_object.c b/drivers/gpu/drm/imagination/pvr_object.c -new file mode 100644 -index 000000000000..54318ffe7887 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_object.c -@@ -0,0 +1,223 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_free_list.h" -+#include "pvr_gem.h" -+#include "pvr_hwrt.h" -+#include "pvr_object.h" -+ -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+static void -+destroy_object(struct pvr_object *obj) -+{ -+ switch (obj->type) { -+ case DRM_PVR_OBJECT_TYPE_FREE_LIST: { -+ struct pvr_free_list *free_list = to_pvr_free_list(obj); -+ -+ pvr_free_list_destroy(free_list); -+ break; -+ } -+ case DRM_PVR_OBJECT_TYPE_HWRT_DATASET: { -+ struct pvr_hwrt_dataset *hwrt = to_pvr_hwrt_dataset(obj); -+ -+ pvr_hwrt_dataset_destroy(hwrt); -+ break; -+ } -+ case DRM_PVR_OBJECT_TYPE_MAX: -+ default: -+ WARN_ON(1); -+ break; -+ } -+} -+ -+/** -+ * pvr_object_create() - Create an object from parameters from userspace -+ * @pvr_file: Pointer to pvr_file structure. -+ * @args: Creation arguments from userspace. -+ * @handle_out: Output handle pointer. -+ * -+ * The context is initialised with refcount of 1. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL on invalid arguments, or -+ * * -%ENOMEM on out-of-memory, or -+ * * -%EFAULT if arguments can't be copied from userspace, or -+ * * Any error returned by pvr_free_list_create(). -+ */ -+int -+pvr_object_create(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_object_args *args, -+ u32 *handle_out) -+{ -+ struct pvr_object *obj; -+ u32 handle; -+ int err; -+ -+ switch (args->type) { -+ case DRM_PVR_OBJECT_TYPE_FREE_LIST: { -+ struct drm_pvr_ioctl_create_free_list_args free_list_args; -+ struct pvr_free_list *free_list; -+ -+ if (copy_from_user(&free_list_args, u64_to_user_ptr(args->data), -+ sizeof(free_list_args))) { -+ err = -EFAULT; -+ goto err_out; -+ } -+ -+ free_list = pvr_free_list_create(pvr_file, &free_list_args); -+ if (IS_ERR(free_list)) { -+ err = PTR_ERR(free_list); -+ goto err_out; -+ } -+ obj = from_pvr_free_list(free_list); -+ break; -+ } -+ -+ case DRM_PVR_OBJECT_TYPE_HWRT_DATASET: { -+ struct drm_pvr_ioctl_create_hwrt_dataset_args hwrt_args; -+ struct pvr_hwrt_dataset *hwrt; -+ -+ if (copy_from_user(&hwrt_args, u64_to_user_ptr(args->data), -+ sizeof(hwrt_args))) { -+ err = -EFAULT; -+ goto err_out; -+ } -+ -+ hwrt = pvr_hwrt_dataset_create(pvr_file, &hwrt_args); -+ if (IS_ERR(hwrt)) { -+ err = PTR_ERR(hwrt); -+ goto err_out; -+ } -+ obj = from_pvr_hwrt_dataset(hwrt); -+ break; -+ } -+ -+ case DRM_PVR_OBJECT_TYPE_MAX: -+ default: -+ err = -EINVAL; -+ goto err_out; -+ } -+ if (IS_ERR(obj)) { -+ err = PTR_ERR(obj); -+ goto err_out; -+ } -+ -+ kref_init(&obj->ref_count); -+ -+ /* Add to object list, and get handle */ -+ err = xa_alloc(&pvr_file->objects, &handle, obj, xa_limit_1_32b, -+ GFP_KERNEL); -+ if (err < 0) -+ goto err_destroy_object; -+ -+ *handle_out = handle; -+ return 0; -+ -+err_destroy_object: -+ destroy_object(obj); -+ -+err_out: -+ return err; -+} -+ -+static void -+pvr_object_release(struct kref *ref_count) -+{ -+ struct pvr_object *obj = -+ container_of(ref_count, struct pvr_object, ref_count); -+ -+ destroy_object(obj); -+} -+ -+/** -+ * pvr_object_put() - Release reference on object -+ * @obj: Target object. -+ */ -+void -+pvr_object_put(struct pvr_object *obj) -+{ -+ kref_put(&obj->ref_count, pvr_object_release); -+} -+ -+/** -+ * pvr_object_destroy() - Destroy object -+ * @pvr_file: Pointer to pvr_file structure. -+ * @handle: Object handle. -+ * -+ * Removes object from list and drops initial reference. Object will then be -+ * destroyed once all outstanding references are dropped. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if object not in object list. -+ */ -+int -+pvr_object_destroy(struct pvr_file *pvr_file, u32 handle) -+{ -+ struct pvr_object *obj = xa_erase(&pvr_file->objects, handle); -+ -+ if (!obj) -+ return -EINVAL; -+ -+ pvr_object_put(obj); -+ -+ return 0; -+} -+ -+/** -+ * pvr_object_cleanup() - Send FW cleanup request for an object -+ * @pvr_dev: Target PowerVR device. -+ * @type: Type of object to cleanup. Must be one of &enum rogue_fwif_cleanup_type. -+ * @fw_obj: Pointer to FW object containing object to cleanup. -+ * @offset: Offset within FW object of object to cleanup. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -EBUSY on timeout. -+ */ -+int -+pvr_object_cleanup(struct pvr_device *pvr_dev, u32 type, struct pvr_fw_object *fw_obj, u32 offset) -+{ -+ struct rogue_fwif_kccb_cmd cmd; -+ int slot_nr; -+ int err; -+ -+ struct rogue_fwif_cleanup_request *cleanup_req = &cmd.cmd_data.cleanup_data; -+ -+ cmd.cmd_type = ROGUE_FWIF_KCCB_CMD_CLEANUP; -+ cmd.kccb_flags = 0; -+ cleanup_req->cleanup_type = type; -+ -+ switch (type) { -+ case ROGUE_FWIF_CLEANUP_FWCOMMONCONTEXT: -+ WARN_ON(!pvr_gem_get_fw_addr_offset(fw_obj, offset, -+ &cleanup_req->cleanup_data.context_fw_addr)); -+ break; -+ case ROGUE_FWIF_CLEANUP_HWRTDATA: -+ WARN_ON(!pvr_gem_get_fw_addr_offset(fw_obj, offset, -+ &cleanup_req->cleanup_data.hwrt_data_fw_addr)); -+ break; -+ case ROGUE_FWIF_CLEANUP_FREELIST: -+ WARN_ON(!pvr_gem_get_fw_addr_offset(fw_obj, offset, -+ &cleanup_req->cleanup_data.freelist_fw_addr)); -+ break; -+ default: -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = pvr_kccb_send_cmd(pvr_dev, &cmd, &slot_nr); -+ if (err) -+ goto err_out; -+ -+ err = pvr_kccb_wait_for_completion(pvr_dev, slot_nr, HZ); -+ if (err) -+ goto err_out; -+ -+err_out: -+ return err; -+} -diff --git a/drivers/gpu/drm/imagination/pvr_object.h b/drivers/gpu/drm/imagination/pvr_object.h -new file mode 100644 -index 000000000000..f1973632f718 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_object.h -@@ -0,0 +1,60 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_OBJECT_H__ -+#define __PVR_OBJECT_H__ -+ -+#include <linux/compiler_attributes.h> -+#include <linux/kref.h> -+#include <linux/list.h> -+#include <linux/types.h> -+#include <linux/xarray.h> -+#include <uapi/drm/pvr_drm.h> -+ -+#include "pvr_device.h" -+ -+/** -+ * struct pvr_object - Common object structure -+ */ -+struct pvr_object { -+ /** @type: Type of object. Must be one of &enum drm_pvr_object_type. */ -+ enum drm_pvr_object_type type; -+ -+ /** @ref_count: Reference count of object. */ -+ struct kref ref_count; -+}; -+ -+int pvr_object_create(struct pvr_file *pvr_file, -+ struct drm_pvr_ioctl_create_object_args *args, -+ u32 *handle_out); -+ -+/** -+ * pvr_object_get() - Get object pointer from handle -+ * @pvr_file: Pointer to pvr_file structure. -+ * @handle: Object handle. -+ * -+ * Takes reference on object. Call pvr_object_put() to release. -+ * -+ * Returns: -+ * * The requested object on success, or -+ * * %NULL on failure (object is not in object list) -+ */ -+static __always_inline struct pvr_object * -+pvr_object_get(struct pvr_file *pvr_file, u32 handle) -+{ -+ struct pvr_object *obj = xa_load(&pvr_file->objects, handle); -+ -+ if (obj) -+ kref_get(&obj->ref_count); -+ -+ return obj; -+} -+ -+void pvr_object_put(struct pvr_object *obj); -+ -+int pvr_object_destroy(struct pvr_file *pvr_file, u32 handle); -+ -+int -+pvr_object_cleanup(struct pvr_device *pvr_dev, u32 type, struct pvr_fw_object *fw_obj, u32 offset); -+ -+#endif /* __PVR_OBJECT_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_cr_defs.h b/drivers/gpu/drm/imagination/pvr_rogue_cr_defs.h -new file mode 100644 -index 000000000000..4ffa3df14325 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_cr_defs.h -@@ -0,0 +1,6191 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+/* *** Autogenerated C -- do not edit *** */ -+ -+#ifndef __PVR_ROGUE_CR_DEFS_H__ -+#define __PVR_ROGUE_CR_DEFS_H__ -+ -+/* clang-format off */ -+ -+#define ROGUE_CR_DEFS_REVISION 1 -+ -+/* Register ROGUE_CR_RASTERISATION_INDIRECT */ -+#define ROGUE_CR_RASTERISATION_INDIRECT 0x8238U -+#define ROGUE_CR_RASTERISATION_INDIRECT_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_RASTERISATION_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_RASTERISATION_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF0U -+ -+/* Register ROGUE_CR_PBE_INDIRECT */ -+#define ROGUE_CR_PBE_INDIRECT 0x83E0U -+#define ROGUE_CR_PBE_INDIRECT_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_PBE_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_PBE_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF0U -+ -+/* Register ROGUE_CR_PBE_PERF_INDIRECT */ -+#define ROGUE_CR_PBE_PERF_INDIRECT 0x83D8U -+#define ROGUE_CR_PBE_PERF_INDIRECT_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_PBE_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_PBE_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF0U -+ -+/* Register ROGUE_CR_TPU_PERF_INDIRECT */ -+#define ROGUE_CR_TPU_PERF_INDIRECT 0x83F0U -+#define ROGUE_CR_TPU_PERF_INDIRECT_MASKFULL 0x0000000000000007ULL -+#define ROGUE_CR_TPU_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_TPU_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF8U -+ -+/* Register ROGUE_CR_RASTERISATION_PERF_INDIRECT */ -+#define ROGUE_CR_RASTERISATION_PERF_INDIRECT 0x8318U -+#define ROGUE_CR_RASTERISATION_PERF_INDIRECT_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_RASTERISATION_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_RASTERISATION_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF0U -+ -+/* Register ROGUE_CR_TPU_MCU_L0_PERF_INDIRECT */ -+#define ROGUE_CR_TPU_MCU_L0_PERF_INDIRECT 0x8028U -+#define ROGUE_CR_TPU_MCU_L0_PERF_INDIRECT_MASKFULL 0x0000000000000007ULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_TPU_MCU_L0_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF8U -+ -+/* Register ROGUE_CR_USC_PERF_INDIRECT */ -+#define ROGUE_CR_USC_PERF_INDIRECT 0x8030U -+#define ROGUE_CR_USC_PERF_INDIRECT_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_USC_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_USC_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF0U -+ -+/* Register ROGUE_CR_BLACKPEARL_INDIRECT */ -+#define ROGUE_CR_BLACKPEARL_INDIRECT 0x8388U -+#define ROGUE_CR_BLACKPEARL_INDIRECT_MASKFULL 0x0000000000000003ULL -+#define ROGUE_CR_BLACKPEARL_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BLACKPEARL_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFFCU -+ -+/* Register ROGUE_CR_BLACKPEARL_PERF_INDIRECT */ -+#define ROGUE_CR_BLACKPEARL_PERF_INDIRECT 0x83F8U -+#define ROGUE_CR_BLACKPEARL_PERF_INDIRECT_MASKFULL 0x0000000000000003ULL -+#define ROGUE_CR_BLACKPEARL_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BLACKPEARL_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFFCU -+ -+/* Register ROGUE_CR_TEXAS3_PERF_INDIRECT */ -+#define ROGUE_CR_TEXAS3_PERF_INDIRECT 0x83D0U -+#define ROGUE_CR_TEXAS3_PERF_INDIRECT_MASKFULL 0x0000000000000007ULL -+#define ROGUE_CR_TEXAS3_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_TEXAS3_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFF8U -+ -+/* Register ROGUE_CR_TEXAS_PERF_INDIRECT */ -+#define ROGUE_CR_TEXAS_PERF_INDIRECT 0x8288U -+#define ROGUE_CR_TEXAS_PERF_INDIRECT_MASKFULL 0x0000000000000003ULL -+#define ROGUE_CR_TEXAS_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_TEXAS_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFFCU -+ -+/* Register ROGUE_CR_BX_TU_PERF_INDIRECT */ -+#define ROGUE_CR_BX_TU_PERF_INDIRECT 0xC900U -+#define ROGUE_CR_BX_TU_PERF_INDIRECT_MASKFULL 0x0000000000000003ULL -+#define ROGUE_CR_BX_TU_PERF_INDIRECT_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BX_TU_PERF_INDIRECT_ADDRESS_CLRMSK 0xFFFFFFFCU -+ -+/* Register ROGUE_CR_CLK_CTRL */ -+#define ROGUE_CR_CLK_CTRL 0x0000U -+#define ROGUE_CR_CLK_CTRL__PBE2_XE__MASKFULL 0xFFFFFF003F3FFFFFULL -+#define ROGUE_CR_CLK_CTRL__S7_TOP__MASKFULL 0xCFCF03000F3F3F0FULL -+#define ROGUE_CR_CLK_CTRL_MASKFULL 0xFFFFFF003F3FFFFFULL -+#define ROGUE_CR_CLK_CTRL_BIF_TEXAS_SHIFT 62U -+#define ROGUE_CR_CLK_CTRL_BIF_TEXAS_CLRMSK 0x3FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_BIF_TEXAS_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_TEXAS_ON 0x4000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_TEXAS_AUTO 0x8000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_IPP_SHIFT 60U -+#define ROGUE_CR_CLK_CTRL_IPP_CLRMSK 0xCFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_IPP_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_IPP_ON 0x1000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_IPP_AUTO 0x2000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FBC_SHIFT 58U -+#define ROGUE_CR_CLK_CTRL_FBC_CLRMSK 0xF3FFFFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_FBC_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FBC_ON 0x0400000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FBC_AUTO 0x0800000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FBDC_SHIFT 56U -+#define ROGUE_CR_CLK_CTRL_FBDC_CLRMSK 0xFCFFFFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_FBDC_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FBDC_ON 0x0100000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FBDC_AUTO 0x0200000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FB_TLCACHE_SHIFT 54U -+#define ROGUE_CR_CLK_CTRL_FB_TLCACHE_CLRMSK 0xFF3FFFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_FB_TLCACHE_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FB_TLCACHE_ON 0x0040000000000000ULL -+#define ROGUE_CR_CLK_CTRL_FB_TLCACHE_AUTO 0x0080000000000000ULL -+#define ROGUE_CR_CLK_CTRL_USCS_SHIFT 52U -+#define ROGUE_CR_CLK_CTRL_USCS_CLRMSK 0xFFCFFFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_USCS_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_USCS_ON 0x0010000000000000ULL -+#define ROGUE_CR_CLK_CTRL_USCS_AUTO 0x0020000000000000ULL -+#define ROGUE_CR_CLK_CTRL_PBE_SHIFT 50U -+#define ROGUE_CR_CLK_CTRL_PBE_CLRMSK 0xFFF3FFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_PBE_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_PBE_ON 0x0004000000000000ULL -+#define ROGUE_CR_CLK_CTRL_PBE_AUTO 0x0008000000000000ULL -+#define ROGUE_CR_CLK_CTRL_MCU_L1_SHIFT 48U -+#define ROGUE_CR_CLK_CTRL_MCU_L1_CLRMSK 0xFFFCFFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_MCU_L1_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_MCU_L1_ON 0x0001000000000000ULL -+#define ROGUE_CR_CLK_CTRL_MCU_L1_AUTO 0x0002000000000000ULL -+#define ROGUE_CR_CLK_CTRL_CDM_SHIFT 46U -+#define ROGUE_CR_CLK_CTRL_CDM_CLRMSK 0xFFFF3FFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_CDM_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_CDM_ON 0x0000400000000000ULL -+#define ROGUE_CR_CLK_CTRL_CDM_AUTO 0x0000800000000000ULL -+#define ROGUE_CR_CLK_CTRL_SIDEKICK_SHIFT 44U -+#define ROGUE_CR_CLK_CTRL_SIDEKICK_CLRMSK 0xFFFFCFFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_SIDEKICK_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_SIDEKICK_ON 0x0000100000000000ULL -+#define ROGUE_CR_CLK_CTRL_SIDEKICK_AUTO 0x0000200000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_SIDEKICK_SHIFT 42U -+#define ROGUE_CR_CLK_CTRL_BIF_SIDEKICK_CLRMSK 0xFFFFF3FFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_BIF_SIDEKICK_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_SIDEKICK_ON 0x0000040000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_SIDEKICK_AUTO 0x0000080000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_SHIFT 40U -+#define ROGUE_CR_CLK_CTRL_BIF_CLRMSK 0xFFFFFCFFFFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_BIF_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_ON 0x0000010000000000ULL -+#define ROGUE_CR_CLK_CTRL_BIF_AUTO 0x0000020000000000ULL -+#define ROGUE_CR_CLK_CTRL_TPU_MCU_DEMUX_SHIFT 28U -+#define ROGUE_CR_CLK_CTRL_TPU_MCU_DEMUX_CLRMSK 0xFFFFFFFFCFFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_TPU_MCU_DEMUX_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_TPU_MCU_DEMUX_ON 0x0000000010000000ULL -+#define ROGUE_CR_CLK_CTRL_TPU_MCU_DEMUX_AUTO 0x0000000020000000ULL -+#define ROGUE_CR_CLK_CTRL_MCU_L0_SHIFT 26U -+#define ROGUE_CR_CLK_CTRL_MCU_L0_CLRMSK 0xFFFFFFFFF3FFFFFFULL -+#define ROGUE_CR_CLK_CTRL_MCU_L0_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_MCU_L0_ON 0x0000000004000000ULL -+#define ROGUE_CR_CLK_CTRL_MCU_L0_AUTO 0x0000000008000000ULL -+#define ROGUE_CR_CLK_CTRL_TPU_SHIFT 24U -+#define ROGUE_CR_CLK_CTRL_TPU_CLRMSK 0xFFFFFFFFFCFFFFFFULL -+#define ROGUE_CR_CLK_CTRL_TPU_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_TPU_ON 0x0000000001000000ULL -+#define ROGUE_CR_CLK_CTRL_TPU_AUTO 0x0000000002000000ULL -+#define ROGUE_CR_CLK_CTRL_USC_SHIFT 20U -+#define ROGUE_CR_CLK_CTRL_USC_CLRMSK 0xFFFFFFFFFFCFFFFFULL -+#define ROGUE_CR_CLK_CTRL_USC_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_USC_ON 0x0000000000100000ULL -+#define ROGUE_CR_CLK_CTRL_USC_AUTO 0x0000000000200000ULL -+#define ROGUE_CR_CLK_CTRL_TLA_SHIFT 18U -+#define ROGUE_CR_CLK_CTRL_TLA_CLRMSK 0xFFFFFFFFFFF3FFFFULL -+#define ROGUE_CR_CLK_CTRL_TLA_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_TLA_ON 0x0000000000040000ULL -+#define ROGUE_CR_CLK_CTRL_TLA_AUTO 0x0000000000080000ULL -+#define ROGUE_CR_CLK_CTRL_SLC_SHIFT 16U -+#define ROGUE_CR_CLK_CTRL_SLC_CLRMSK 0xFFFFFFFFFFFCFFFFULL -+#define ROGUE_CR_CLK_CTRL_SLC_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_SLC_ON 0x0000000000010000ULL -+#define ROGUE_CR_CLK_CTRL_SLC_AUTO 0x0000000000020000ULL -+#define ROGUE_CR_CLK_CTRL_UVS_SHIFT 14U -+#define ROGUE_CR_CLK_CTRL_UVS_CLRMSK 0xFFFFFFFFFFFF3FFFULL -+#define ROGUE_CR_CLK_CTRL_UVS_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_UVS_ON 0x0000000000004000ULL -+#define ROGUE_CR_CLK_CTRL_UVS_AUTO 0x0000000000008000ULL -+#define ROGUE_CR_CLK_CTRL_PDS_SHIFT 12U -+#define ROGUE_CR_CLK_CTRL_PDS_CLRMSK 0xFFFFFFFFFFFFCFFFULL -+#define ROGUE_CR_CLK_CTRL_PDS_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_PDS_ON 0x0000000000001000ULL -+#define ROGUE_CR_CLK_CTRL_PDS_AUTO 0x0000000000002000ULL -+#define ROGUE_CR_CLK_CTRL_VDM_SHIFT 10U -+#define ROGUE_CR_CLK_CTRL_VDM_CLRMSK 0xFFFFFFFFFFFFF3FFULL -+#define ROGUE_CR_CLK_CTRL_VDM_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_VDM_ON 0x0000000000000400ULL -+#define ROGUE_CR_CLK_CTRL_VDM_AUTO 0x0000000000000800ULL -+#define ROGUE_CR_CLK_CTRL_PM_SHIFT 8U -+#define ROGUE_CR_CLK_CTRL_PM_CLRMSK 0xFFFFFFFFFFFFFCFFULL -+#define ROGUE_CR_CLK_CTRL_PM_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_PM_ON 0x0000000000000100ULL -+#define ROGUE_CR_CLK_CTRL_PM_AUTO 0x0000000000000200ULL -+#define ROGUE_CR_CLK_CTRL_GPP_SHIFT 6U -+#define ROGUE_CR_CLK_CTRL_GPP_CLRMSK 0xFFFFFFFFFFFFFF3FULL -+#define ROGUE_CR_CLK_CTRL_GPP_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_GPP_ON 0x0000000000000040ULL -+#define ROGUE_CR_CLK_CTRL_GPP_AUTO 0x0000000000000080ULL -+#define ROGUE_CR_CLK_CTRL_TE_SHIFT 4U -+#define ROGUE_CR_CLK_CTRL_TE_CLRMSK 0xFFFFFFFFFFFFFFCFULL -+#define ROGUE_CR_CLK_CTRL_TE_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_TE_ON 0x0000000000000010ULL -+#define ROGUE_CR_CLK_CTRL_TE_AUTO 0x0000000000000020ULL -+#define ROGUE_CR_CLK_CTRL_TSP_SHIFT 2U -+#define ROGUE_CR_CLK_CTRL_TSP_CLRMSK 0xFFFFFFFFFFFFFFF3ULL -+#define ROGUE_CR_CLK_CTRL_TSP_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_TSP_ON 0x0000000000000004ULL -+#define ROGUE_CR_CLK_CTRL_TSP_AUTO 0x0000000000000008ULL -+#define ROGUE_CR_CLK_CTRL_ISP_SHIFT 0U -+#define ROGUE_CR_CLK_CTRL_ISP_CLRMSK 0xFFFFFFFFFFFFFFFCULL -+#define ROGUE_CR_CLK_CTRL_ISP_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL_ISP_ON 0x0000000000000001ULL -+#define ROGUE_CR_CLK_CTRL_ISP_AUTO 0x0000000000000002ULL -+ -+/* Register ROGUE_CR_CLK_STATUS */ -+#define ROGUE_CR_CLK_STATUS 0x0008U -+#define ROGUE_CR_CLK_STATUS__PBE2_XE__MASKFULL 0x00000001FFF077FFULL -+#define ROGUE_CR_CLK_STATUS__S7_TOP__MASKFULL 0x00000001B3101773ULL -+#define ROGUE_CR_CLK_STATUS_MASKFULL 0x00000001FFF077FFULL -+#define ROGUE_CR_CLK_STATUS_MCU_FBTC_SHIFT 32U -+#define ROGUE_CR_CLK_STATUS_MCU_FBTC_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_MCU_FBTC_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_MCU_FBTC_RUNNING 0x0000000100000000ULL -+#define ROGUE_CR_CLK_STATUS_BIF_TEXAS_SHIFT 31U -+#define ROGUE_CR_CLK_STATUS_BIF_TEXAS_CLRMSK 0xFFFFFFFF7FFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_BIF_TEXAS_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_BIF_TEXAS_RUNNING 0x0000000080000000ULL -+#define ROGUE_CR_CLK_STATUS_IPP_SHIFT 30U -+#define ROGUE_CR_CLK_STATUS_IPP_CLRMSK 0xFFFFFFFFBFFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_IPP_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_IPP_RUNNING 0x0000000040000000ULL -+#define ROGUE_CR_CLK_STATUS_FBC_SHIFT 29U -+#define ROGUE_CR_CLK_STATUS_FBC_CLRMSK 0xFFFFFFFFDFFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_FBC_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_FBC_RUNNING 0x0000000020000000ULL -+#define ROGUE_CR_CLK_STATUS_FBDC_SHIFT 28U -+#define ROGUE_CR_CLK_STATUS_FBDC_CLRMSK 0xFFFFFFFFEFFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_FBDC_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_FBDC_RUNNING 0x0000000010000000ULL -+#define ROGUE_CR_CLK_STATUS_FB_TLCACHE_SHIFT 27U -+#define ROGUE_CR_CLK_STATUS_FB_TLCACHE_CLRMSK 0xFFFFFFFFF7FFFFFFULL -+#define ROGUE_CR_CLK_STATUS_FB_TLCACHE_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_FB_TLCACHE_RUNNING 0x0000000008000000ULL -+#define ROGUE_CR_CLK_STATUS_USCS_SHIFT 26U -+#define ROGUE_CR_CLK_STATUS_USCS_CLRMSK 0xFFFFFFFFFBFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_USCS_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_USCS_RUNNING 0x0000000004000000ULL -+#define ROGUE_CR_CLK_STATUS_PBE_SHIFT 25U -+#define ROGUE_CR_CLK_STATUS_PBE_CLRMSK 0xFFFFFFFFFDFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_PBE_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_PBE_RUNNING 0x0000000002000000ULL -+#define ROGUE_CR_CLK_STATUS_MCU_L1_SHIFT 24U -+#define ROGUE_CR_CLK_STATUS_MCU_L1_CLRMSK 0xFFFFFFFFFEFFFFFFULL -+#define ROGUE_CR_CLK_STATUS_MCU_L1_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_MCU_L1_RUNNING 0x0000000001000000ULL -+#define ROGUE_CR_CLK_STATUS_CDM_SHIFT 23U -+#define ROGUE_CR_CLK_STATUS_CDM_CLRMSK 0xFFFFFFFFFF7FFFFFULL -+#define ROGUE_CR_CLK_STATUS_CDM_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_CDM_RUNNING 0x0000000000800000ULL -+#define ROGUE_CR_CLK_STATUS_SIDEKICK_SHIFT 22U -+#define ROGUE_CR_CLK_STATUS_SIDEKICK_CLRMSK 0xFFFFFFFFFFBFFFFFULL -+#define ROGUE_CR_CLK_STATUS_SIDEKICK_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_SIDEKICK_RUNNING 0x0000000000400000ULL -+#define ROGUE_CR_CLK_STATUS_BIF_SIDEKICK_SHIFT 21U -+#define ROGUE_CR_CLK_STATUS_BIF_SIDEKICK_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_CLK_STATUS_BIF_SIDEKICK_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_BIF_SIDEKICK_RUNNING 0x0000000000200000ULL -+#define ROGUE_CR_CLK_STATUS_BIF_SHIFT 20U -+#define ROGUE_CR_CLK_STATUS_BIF_CLRMSK 0xFFFFFFFFFFEFFFFFULL -+#define ROGUE_CR_CLK_STATUS_BIF_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_BIF_RUNNING 0x0000000000100000ULL -+#define ROGUE_CR_CLK_STATUS_TPU_MCU_DEMUX_SHIFT 14U -+#define ROGUE_CR_CLK_STATUS_TPU_MCU_DEMUX_CLRMSK 0xFFFFFFFFFFFFBFFFULL -+#define ROGUE_CR_CLK_STATUS_TPU_MCU_DEMUX_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_TPU_MCU_DEMUX_RUNNING 0x0000000000004000ULL -+#define ROGUE_CR_CLK_STATUS_MCU_L0_SHIFT 13U -+#define ROGUE_CR_CLK_STATUS_MCU_L0_CLRMSK 0xFFFFFFFFFFFFDFFFULL -+#define ROGUE_CR_CLK_STATUS_MCU_L0_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_MCU_L0_RUNNING 0x0000000000002000ULL -+#define ROGUE_CR_CLK_STATUS_TPU_SHIFT 12U -+#define ROGUE_CR_CLK_STATUS_TPU_CLRMSK 0xFFFFFFFFFFFFEFFFULL -+#define ROGUE_CR_CLK_STATUS_TPU_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_TPU_RUNNING 0x0000000000001000ULL -+#define ROGUE_CR_CLK_STATUS_USC_SHIFT 10U -+#define ROGUE_CR_CLK_STATUS_USC_CLRMSK 0xFFFFFFFFFFFFFBFFULL -+#define ROGUE_CR_CLK_STATUS_USC_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_USC_RUNNING 0x0000000000000400ULL -+#define ROGUE_CR_CLK_STATUS_TLA_SHIFT 9U -+#define ROGUE_CR_CLK_STATUS_TLA_CLRMSK 0xFFFFFFFFFFFFFDFFULL -+#define ROGUE_CR_CLK_STATUS_TLA_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_TLA_RUNNING 0x0000000000000200ULL -+#define ROGUE_CR_CLK_STATUS_SLC_SHIFT 8U -+#define ROGUE_CR_CLK_STATUS_SLC_CLRMSK 0xFFFFFFFFFFFFFEFFULL -+#define ROGUE_CR_CLK_STATUS_SLC_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_SLC_RUNNING 0x0000000000000100ULL -+#define ROGUE_CR_CLK_STATUS_UVS_SHIFT 7U -+#define ROGUE_CR_CLK_STATUS_UVS_CLRMSK 0xFFFFFFFFFFFFFF7FULL -+#define ROGUE_CR_CLK_STATUS_UVS_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_UVS_RUNNING 0x0000000000000080ULL -+#define ROGUE_CR_CLK_STATUS_PDS_SHIFT 6U -+#define ROGUE_CR_CLK_STATUS_PDS_CLRMSK 0xFFFFFFFFFFFFFFBFULL -+#define ROGUE_CR_CLK_STATUS_PDS_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_PDS_RUNNING 0x0000000000000040ULL -+#define ROGUE_CR_CLK_STATUS_VDM_SHIFT 5U -+#define ROGUE_CR_CLK_STATUS_VDM_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_CLK_STATUS_VDM_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_VDM_RUNNING 0x0000000000000020ULL -+#define ROGUE_CR_CLK_STATUS_PM_SHIFT 4U -+#define ROGUE_CR_CLK_STATUS_PM_CLRMSK 0xFFFFFFFFFFFFFFEFULL -+#define ROGUE_CR_CLK_STATUS_PM_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_PM_RUNNING 0x0000000000000010ULL -+#define ROGUE_CR_CLK_STATUS_GPP_SHIFT 3U -+#define ROGUE_CR_CLK_STATUS_GPP_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_CLK_STATUS_GPP_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_GPP_RUNNING 0x0000000000000008ULL -+#define ROGUE_CR_CLK_STATUS_TE_SHIFT 2U -+#define ROGUE_CR_CLK_STATUS_TE_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_CLK_STATUS_TE_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_TE_RUNNING 0x0000000000000004ULL -+#define ROGUE_CR_CLK_STATUS_TSP_SHIFT 1U -+#define ROGUE_CR_CLK_STATUS_TSP_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_CLK_STATUS_TSP_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_TSP_RUNNING 0x0000000000000002ULL -+#define ROGUE_CR_CLK_STATUS_ISP_SHIFT 0U -+#define ROGUE_CR_CLK_STATUS_ISP_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_CLK_STATUS_ISP_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS_ISP_RUNNING 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_CORE_ID */ -+#define ROGUE_CR_CORE_ID__PBVNC 0x0020U -+#define ROGUE_CR_CORE_ID__PBVNC__MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_CORE_ID__PBVNC__BRANCH_ID_SHIFT 48U -+#define ROGUE_CR_CORE_ID__PBVNC__BRANCH_ID_CLRMSK 0x0000FFFFFFFFFFFFULL -+#define ROGUE_CR_CORE_ID__PBVNC__VERSION_ID_SHIFT 32U -+#define ROGUE_CR_CORE_ID__PBVNC__VERSION_ID_CLRMSK 0xFFFF0000FFFFFFFFULL -+#define ROGUE_CR_CORE_ID__PBVNC__NUMBER_OF_SCALABLE_UNITS_SHIFT 16U -+#define ROGUE_CR_CORE_ID__PBVNC__NUMBER_OF_SCALABLE_UNITS_CLRMSK 0xFFFFFFFF0000FFFFULL -+#define ROGUE_CR_CORE_ID__PBVNC__CONFIG_ID_SHIFT 0U -+#define ROGUE_CR_CORE_ID__PBVNC__CONFIG_ID_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_CORE_ID */ -+#define ROGUE_CR_CORE_ID 0x0018U -+#define ROGUE_CR_CORE_ID_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_CORE_ID_ID_SHIFT 16U -+#define ROGUE_CR_CORE_ID_ID_CLRMSK 0x0000FFFFU -+#define ROGUE_CR_CORE_ID_CONFIG_SHIFT 0U -+#define ROGUE_CR_CORE_ID_CONFIG_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_CORE_REVISION */ -+#define ROGUE_CR_CORE_REVISION 0x0020U -+#define ROGUE_CR_CORE_REVISION_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_CORE_REVISION_DESIGNER_SHIFT 24U -+#define ROGUE_CR_CORE_REVISION_DESIGNER_CLRMSK 0x00FFFFFFU -+#define ROGUE_CR_CORE_REVISION_MAJOR_SHIFT 16U -+#define ROGUE_CR_CORE_REVISION_MAJOR_CLRMSK 0xFF00FFFFU -+#define ROGUE_CR_CORE_REVISION_MINOR_SHIFT 8U -+#define ROGUE_CR_CORE_REVISION_MINOR_CLRMSK 0xFFFF00FFU -+#define ROGUE_CR_CORE_REVISION_MAINTENANCE_SHIFT 0U -+#define ROGUE_CR_CORE_REVISION_MAINTENANCE_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_DESIGNER_REV_FIELD1 */ -+#define ROGUE_CR_DESIGNER_REV_FIELD1 0x0028U -+#define ROGUE_CR_DESIGNER_REV_FIELD1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_DESIGNER_REV_FIELD1_DESIGNER_REV_FIELD1_SHIFT 0U -+#define ROGUE_CR_DESIGNER_REV_FIELD1_DESIGNER_REV_FIELD1_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_DESIGNER_REV_FIELD2 */ -+#define ROGUE_CR_DESIGNER_REV_FIELD2 0x0030U -+#define ROGUE_CR_DESIGNER_REV_FIELD2_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_DESIGNER_REV_FIELD2_DESIGNER_REV_FIELD2_SHIFT 0U -+#define ROGUE_CR_DESIGNER_REV_FIELD2_DESIGNER_REV_FIELD2_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_CHANGESET_NUMBER */ -+#define ROGUE_CR_CHANGESET_NUMBER 0x0040U -+#define ROGUE_CR_CHANGESET_NUMBER_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_CHANGESET_NUMBER_CHANGESET_NUMBER_SHIFT 0U -+#define ROGUE_CR_CHANGESET_NUMBER_CHANGESET_NUMBER_CLRMSK 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_CLK_XTPLUS_CTRL */ -+#define ROGUE_CR_CLK_XTPLUS_CTRL 0x0080U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_MASKFULL 0x0000003FFFFF0000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_TDM_SHIFT 36U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_TDM_CLRMSK 0xFFFFFFCFFFFFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_TDM_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_TDM_ON 0x0000001000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_TDM_AUTO 0x0000002000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_ASTC_SHIFT 34U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_ASTC_CLRMSK 0xFFFFFFF3FFFFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_ASTC_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_ASTC_ON 0x0000000400000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_ASTC_AUTO 0x0000000800000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_IPF_SHIFT 32U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_IPF_CLRMSK 0xFFFFFFFCFFFFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_IPF_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_IPF_ON 0x0000000100000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_IPF_AUTO 0x0000000200000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_COMPUTE_SHIFT 30U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_COMPUTE_CLRMSK 0xFFFFFFFF3FFFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_COMPUTE_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_COMPUTE_ON 0x0000000040000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_COMPUTE_AUTO 0x0000000080000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PIXEL_SHIFT 28U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PIXEL_CLRMSK 0xFFFFFFFFCFFFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PIXEL_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PIXEL_ON 0x0000000010000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PIXEL_AUTO 0x0000000020000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_VERTEX_SHIFT 26U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_VERTEX_CLRMSK 0xFFFFFFFFF3FFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_VERTEX_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_VERTEX_ON 0x0000000004000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_VERTEX_AUTO 0x0000000008000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USCPS_SHIFT 24U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USCPS_CLRMSK 0xFFFFFFFFFCFFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USCPS_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USCPS_ON 0x0000000001000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USCPS_AUTO 0x0000000002000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PDS_SHARED_SHIFT 22U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PDS_SHARED_CLRMSK 0xFFFFFFFFFF3FFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PDS_SHARED_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PDS_SHARED_ON 0x0000000000400000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_PDS_SHARED_AUTO 0x0000000000800000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_BIF_BLACKPEARL_SHIFT 20U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_BIF_BLACKPEARL_CLRMSK 0xFFFFFFFFFFCFFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_BIF_BLACKPEARL_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_BIF_BLACKPEARL_ON 0x0000000000100000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_BIF_BLACKPEARL_AUTO 0x0000000000200000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USC_SHARED_SHIFT 18U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USC_SHARED_CLRMSK 0xFFFFFFFFFFF3FFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USC_SHARED_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USC_SHARED_ON 0x0000000000040000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_USC_SHARED_AUTO 0x0000000000080000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_GEOMETRY_SHIFT 16U -+#define ROGUE_CR_CLK_XTPLUS_CTRL_GEOMETRY_CLRMSK 0xFFFFFFFFFFFCFFFFULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_GEOMETRY_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_GEOMETRY_ON 0x0000000000010000ULL -+#define ROGUE_CR_CLK_XTPLUS_CTRL_GEOMETRY_AUTO 0x0000000000020000ULL -+ -+/* Register ROGUE_CR_CLK_XTPLUS_STATUS */ -+#define ROGUE_CR_CLK_XTPLUS_STATUS 0x0088U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_MASKFULL 0x00000000000007FFULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_TDM_SHIFT 10U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_TDM_CLRMSK 0xFFFFFFFFFFFFFBFFULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_TDM_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_TDM_RUNNING 0x0000000000000400ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_IPF_SHIFT 9U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_IPF_CLRMSK 0xFFFFFFFFFFFFFDFFULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_IPF_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_IPF_RUNNING 0x0000000000000200ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_COMPUTE_SHIFT 8U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_COMPUTE_CLRMSK 0xFFFFFFFFFFFFFEFFULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_COMPUTE_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_COMPUTE_RUNNING 0x0000000000000100ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_ASTC_SHIFT 7U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_ASTC_CLRMSK 0xFFFFFFFFFFFFFF7FULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_ASTC_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_ASTC_RUNNING 0x0000000000000080ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PIXEL_SHIFT 6U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PIXEL_CLRMSK 0xFFFFFFFFFFFFFFBFULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PIXEL_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PIXEL_RUNNING 0x0000000000000040ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_VERTEX_SHIFT 5U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_VERTEX_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_VERTEX_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_VERTEX_RUNNING 0x0000000000000020ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USCPS_SHIFT 4U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USCPS_CLRMSK 0xFFFFFFFFFFFFFFEFULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USCPS_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USCPS_RUNNING 0x0000000000000010ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PDS_SHARED_SHIFT 3U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PDS_SHARED_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PDS_SHARED_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_PDS_SHARED_RUNNING 0x0000000000000008ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_BIF_BLACKPEARL_SHIFT 2U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_BIF_BLACKPEARL_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_BIF_BLACKPEARL_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_BIF_BLACKPEARL_RUNNING 0x0000000000000004ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USC_SHARED_SHIFT 1U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USC_SHARED_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USC_SHARED_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_USC_SHARED_RUNNING 0x0000000000000002ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_GEOMETRY_SHIFT 0U -+#define ROGUE_CR_CLK_XTPLUS_STATUS_GEOMETRY_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_GEOMETRY_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_XTPLUS_STATUS_GEOMETRY_RUNNING 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_SOFT_RESET */ -+#define ROGUE_CR_SOFT_RESET 0x0100U -+#define ROGUE_CR_SOFT_RESET__PBE2_XE__MASKFULL 0xFFEFFFFFFFFFFC3DULL -+#define ROGUE_CR_SOFT_RESET_MASKFULL 0x00E7FFFFFFFFFC3DULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM3_CORE_SHIFT 63U -+#define ROGUE_CR_SOFT_RESET_PHANTOM3_CORE_CLRMSK 0x7FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM3_CORE_EN 0x8000000000000000ULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM2_CORE_SHIFT 62U -+#define ROGUE_CR_SOFT_RESET_PHANTOM2_CORE_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM2_CORE_EN 0x4000000000000000ULL -+#define ROGUE_CR_SOFT_RESET_BERNADO2_CORE_SHIFT 61U -+#define ROGUE_CR_SOFT_RESET_BERNADO2_CORE_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_BERNADO2_CORE_EN 0x2000000000000000ULL -+#define ROGUE_CR_SOFT_RESET_JONES_CORE_SHIFT 60U -+#define ROGUE_CR_SOFT_RESET_JONES_CORE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_JONES_CORE_EN 0x1000000000000000ULL -+#define ROGUE_CR_SOFT_RESET_TILING_CORE_SHIFT 59U -+#define ROGUE_CR_SOFT_RESET_TILING_CORE_CLRMSK 0xF7FFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_TILING_CORE_EN 0x0800000000000000ULL -+#define ROGUE_CR_SOFT_RESET_TE3_SHIFT 58U -+#define ROGUE_CR_SOFT_RESET_TE3_CLRMSK 0xFBFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_TE3_EN 0x0400000000000000ULL -+#define ROGUE_CR_SOFT_RESET_VCE_SHIFT 57U -+#define ROGUE_CR_SOFT_RESET_VCE_CLRMSK 0xFDFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_VCE_EN 0x0200000000000000ULL -+#define ROGUE_CR_SOFT_RESET_VBS_SHIFT 56U -+#define ROGUE_CR_SOFT_RESET_VBS_CLRMSK 0xFEFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_VBS_EN 0x0100000000000000ULL -+#define ROGUE_CR_SOFT_RESET_DPX1_CORE_SHIFT 55U -+#define ROGUE_CR_SOFT_RESET_DPX1_CORE_CLRMSK 0xFF7FFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DPX1_CORE_EN 0x0080000000000000ULL -+#define ROGUE_CR_SOFT_RESET_DPX0_CORE_SHIFT 54U -+#define ROGUE_CR_SOFT_RESET_DPX0_CORE_CLRMSK 0xFFBFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DPX0_CORE_EN 0x0040000000000000ULL -+#define ROGUE_CR_SOFT_RESET_FBA_SHIFT 53U -+#define ROGUE_CR_SOFT_RESET_FBA_CLRMSK 0xFFDFFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_FBA_EN 0x0020000000000000ULL -+#define ROGUE_CR_SOFT_RESET_FB_CDC_SHIFT 51U -+#define ROGUE_CR_SOFT_RESET_FB_CDC_CLRMSK 0xFFF7FFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_FB_CDC_EN 0x0008000000000000ULL -+#define ROGUE_CR_SOFT_RESET_SH_SHIFT 50U -+#define ROGUE_CR_SOFT_RESET_SH_CLRMSK 0xFFFBFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_SH_EN 0x0004000000000000ULL -+#define ROGUE_CR_SOFT_RESET_VRDM_SHIFT 49U -+#define ROGUE_CR_SOFT_RESET_VRDM_CLRMSK 0xFFFDFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_VRDM_EN 0x0002000000000000ULL -+#define ROGUE_CR_SOFT_RESET_MCU_FBTC_SHIFT 48U -+#define ROGUE_CR_SOFT_RESET_MCU_FBTC_CLRMSK 0xFFFEFFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_MCU_FBTC_EN 0x0001000000000000ULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM1_CORE_SHIFT 47U -+#define ROGUE_CR_SOFT_RESET_PHANTOM1_CORE_CLRMSK 0xFFFF7FFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM1_CORE_EN 0x0000800000000000ULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM0_CORE_SHIFT 46U -+#define ROGUE_CR_SOFT_RESET_PHANTOM0_CORE_CLRMSK 0xFFFFBFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_PHANTOM0_CORE_EN 0x0000400000000000ULL -+#define ROGUE_CR_SOFT_RESET_BERNADO1_CORE_SHIFT 45U -+#define ROGUE_CR_SOFT_RESET_BERNADO1_CORE_CLRMSK 0xFFFFDFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_BERNADO1_CORE_EN 0x0000200000000000ULL -+#define ROGUE_CR_SOFT_RESET_BERNADO0_CORE_SHIFT 44U -+#define ROGUE_CR_SOFT_RESET_BERNADO0_CORE_CLRMSK 0xFFFFEFFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_BERNADO0_CORE_EN 0x0000100000000000ULL -+#define ROGUE_CR_SOFT_RESET_IPP_SHIFT 43U -+#define ROGUE_CR_SOFT_RESET_IPP_CLRMSK 0xFFFFF7FFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_IPP_EN 0x0000080000000000ULL -+#define ROGUE_CR_SOFT_RESET_BIF_TEXAS_SHIFT 42U -+#define ROGUE_CR_SOFT_RESET_BIF_TEXAS_CLRMSK 0xFFFFFBFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_BIF_TEXAS_EN 0x0000040000000000ULL -+#define ROGUE_CR_SOFT_RESET_TORNADO_CORE_SHIFT 41U -+#define ROGUE_CR_SOFT_RESET_TORNADO_CORE_CLRMSK 0xFFFFFDFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_TORNADO_CORE_EN 0x0000020000000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_H_CORE_SHIFT 40U -+#define ROGUE_CR_SOFT_RESET_DUST_H_CORE_CLRMSK 0xFFFFFEFFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_H_CORE_EN 0x0000010000000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_G_CORE_SHIFT 39U -+#define ROGUE_CR_SOFT_RESET_DUST_G_CORE_CLRMSK 0xFFFFFF7FFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_G_CORE_EN 0x0000008000000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_F_CORE_SHIFT 38U -+#define ROGUE_CR_SOFT_RESET_DUST_F_CORE_CLRMSK 0xFFFFFFBFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_F_CORE_EN 0x0000004000000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_E_CORE_SHIFT 37U -+#define ROGUE_CR_SOFT_RESET_DUST_E_CORE_CLRMSK 0xFFFFFFDFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_E_CORE_EN 0x0000002000000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_D_CORE_SHIFT 36U -+#define ROGUE_CR_SOFT_RESET_DUST_D_CORE_CLRMSK 0xFFFFFFEFFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_D_CORE_EN 0x0000001000000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_C_CORE_SHIFT 35U -+#define ROGUE_CR_SOFT_RESET_DUST_C_CORE_CLRMSK 0xFFFFFFF7FFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_C_CORE_EN 0x0000000800000000ULL -+#define ROGUE_CR_SOFT_RESET_MMU_SHIFT 34U -+#define ROGUE_CR_SOFT_RESET_MMU_CLRMSK 0xFFFFFFFBFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_MMU_EN 0x0000000400000000ULL -+#define ROGUE_CR_SOFT_RESET_BIF1_SHIFT 33U -+#define ROGUE_CR_SOFT_RESET_BIF1_CLRMSK 0xFFFFFFFDFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_BIF1_EN 0x0000000200000000ULL -+#define ROGUE_CR_SOFT_RESET_GARTEN_SHIFT 32U -+#define ROGUE_CR_SOFT_RESET_GARTEN_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_GARTEN_EN 0x0000000100000000ULL -+#define ROGUE_CR_SOFT_RESET_CPU_SHIFT 32U -+#define ROGUE_CR_SOFT_RESET_CPU_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_CPU_EN 0x0000000100000000ULL -+#define ROGUE_CR_SOFT_RESET_RASCAL_CORE_SHIFT 31U -+#define ROGUE_CR_SOFT_RESET_RASCAL_CORE_CLRMSK 0xFFFFFFFF7FFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_RASCAL_CORE_EN 0x0000000080000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_B_CORE_SHIFT 30U -+#define ROGUE_CR_SOFT_RESET_DUST_B_CORE_CLRMSK 0xFFFFFFFFBFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_B_CORE_EN 0x0000000040000000ULL -+#define ROGUE_CR_SOFT_RESET_DUST_A_CORE_SHIFT 29U -+#define ROGUE_CR_SOFT_RESET_DUST_A_CORE_CLRMSK 0xFFFFFFFFDFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_DUST_A_CORE_EN 0x0000000020000000ULL -+#define ROGUE_CR_SOFT_RESET_FB_TLCACHE_SHIFT 28U -+#define ROGUE_CR_SOFT_RESET_FB_TLCACHE_CLRMSK 0xFFFFFFFFEFFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_FB_TLCACHE_EN 0x0000000010000000ULL -+#define ROGUE_CR_SOFT_RESET_SLC_SHIFT 27U -+#define ROGUE_CR_SOFT_RESET_SLC_CLRMSK 0xFFFFFFFFF7FFFFFFULL -+#define ROGUE_CR_SOFT_RESET_SLC_EN 0x0000000008000000ULL -+#define ROGUE_CR_SOFT_RESET_TLA_SHIFT 26U -+#define ROGUE_CR_SOFT_RESET_TLA_CLRMSK 0xFFFFFFFFFBFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_TLA_EN 0x0000000004000000ULL -+#define ROGUE_CR_SOFT_RESET_UVS_SHIFT 25U -+#define ROGUE_CR_SOFT_RESET_UVS_CLRMSK 0xFFFFFFFFFDFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_UVS_EN 0x0000000002000000ULL -+#define ROGUE_CR_SOFT_RESET_TE_SHIFT 24U -+#define ROGUE_CR_SOFT_RESET_TE_CLRMSK 0xFFFFFFFFFEFFFFFFULL -+#define ROGUE_CR_SOFT_RESET_TE_EN 0x0000000001000000ULL -+#define ROGUE_CR_SOFT_RESET_GPP_SHIFT 23U -+#define ROGUE_CR_SOFT_RESET_GPP_CLRMSK 0xFFFFFFFFFF7FFFFFULL -+#define ROGUE_CR_SOFT_RESET_GPP_EN 0x0000000000800000ULL -+#define ROGUE_CR_SOFT_RESET_FBDC_SHIFT 22U -+#define ROGUE_CR_SOFT_RESET_FBDC_CLRMSK 0xFFFFFFFFFFBFFFFFULL -+#define ROGUE_CR_SOFT_RESET_FBDC_EN 0x0000000000400000ULL -+#define ROGUE_CR_SOFT_RESET_FBC_SHIFT 21U -+#define ROGUE_CR_SOFT_RESET_FBC_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_SOFT_RESET_FBC_EN 0x0000000000200000ULL -+#define ROGUE_CR_SOFT_RESET_PM_SHIFT 20U -+#define ROGUE_CR_SOFT_RESET_PM_CLRMSK 0xFFFFFFFFFFEFFFFFULL -+#define ROGUE_CR_SOFT_RESET_PM_EN 0x0000000000100000ULL -+#define ROGUE_CR_SOFT_RESET_PBE_SHIFT 19U -+#define ROGUE_CR_SOFT_RESET_PBE_CLRMSK 0xFFFFFFFFFFF7FFFFULL -+#define ROGUE_CR_SOFT_RESET_PBE_EN 0x0000000000080000ULL -+#define ROGUE_CR_SOFT_RESET_USC_SHARED_SHIFT 18U -+#define ROGUE_CR_SOFT_RESET_USC_SHARED_CLRMSK 0xFFFFFFFFFFFBFFFFULL -+#define ROGUE_CR_SOFT_RESET_USC_SHARED_EN 0x0000000000040000ULL -+#define ROGUE_CR_SOFT_RESET_MCU_L1_SHIFT 17U -+#define ROGUE_CR_SOFT_RESET_MCU_L1_CLRMSK 0xFFFFFFFFFFFDFFFFULL -+#define ROGUE_CR_SOFT_RESET_MCU_L1_EN 0x0000000000020000ULL -+#define ROGUE_CR_SOFT_RESET_BIF_SHIFT 16U -+#define ROGUE_CR_SOFT_RESET_BIF_CLRMSK 0xFFFFFFFFFFFEFFFFULL -+#define ROGUE_CR_SOFT_RESET_BIF_EN 0x0000000000010000ULL -+#define ROGUE_CR_SOFT_RESET_CDM_SHIFT 15U -+#define ROGUE_CR_SOFT_RESET_CDM_CLRMSK 0xFFFFFFFFFFFF7FFFULL -+#define ROGUE_CR_SOFT_RESET_CDM_EN 0x0000000000008000ULL -+#define ROGUE_CR_SOFT_RESET_VDM_SHIFT 14U -+#define ROGUE_CR_SOFT_RESET_VDM_CLRMSK 0xFFFFFFFFFFFFBFFFULL -+#define ROGUE_CR_SOFT_RESET_VDM_EN 0x0000000000004000ULL -+#define ROGUE_CR_SOFT_RESET_TESS_SHIFT 13U -+#define ROGUE_CR_SOFT_RESET_TESS_CLRMSK 0xFFFFFFFFFFFFDFFFULL -+#define ROGUE_CR_SOFT_RESET_TESS_EN 0x0000000000002000ULL -+#define ROGUE_CR_SOFT_RESET_PDS_SHIFT 12U -+#define ROGUE_CR_SOFT_RESET_PDS_CLRMSK 0xFFFFFFFFFFFFEFFFULL -+#define ROGUE_CR_SOFT_RESET_PDS_EN 0x0000000000001000ULL -+#define ROGUE_CR_SOFT_RESET_ISP_SHIFT 11U -+#define ROGUE_CR_SOFT_RESET_ISP_CLRMSK 0xFFFFFFFFFFFFF7FFULL -+#define ROGUE_CR_SOFT_RESET_ISP_EN 0x0000000000000800ULL -+#define ROGUE_CR_SOFT_RESET_TSP_SHIFT 10U -+#define ROGUE_CR_SOFT_RESET_TSP_CLRMSK 0xFFFFFFFFFFFFFBFFULL -+#define ROGUE_CR_SOFT_RESET_TSP_EN 0x0000000000000400ULL -+#define ROGUE_CR_SOFT_RESET_SYSARB_SHIFT 5U -+#define ROGUE_CR_SOFT_RESET_SYSARB_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_SOFT_RESET_SYSARB_EN 0x0000000000000020ULL -+#define ROGUE_CR_SOFT_RESET_TPU_MCU_DEMUX_SHIFT 4U -+#define ROGUE_CR_SOFT_RESET_TPU_MCU_DEMUX_CLRMSK 0xFFFFFFFFFFFFFFEFULL -+#define ROGUE_CR_SOFT_RESET_TPU_MCU_DEMUX_EN 0x0000000000000010ULL -+#define ROGUE_CR_SOFT_RESET_MCU_L0_SHIFT 3U -+#define ROGUE_CR_SOFT_RESET_MCU_L0_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_SOFT_RESET_MCU_L0_EN 0x0000000000000008ULL -+#define ROGUE_CR_SOFT_RESET_TPU_SHIFT 2U -+#define ROGUE_CR_SOFT_RESET_TPU_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_SOFT_RESET_TPU_EN 0x0000000000000004ULL -+#define ROGUE_CR_SOFT_RESET_USC_SHIFT 0U -+#define ROGUE_CR_SOFT_RESET_USC_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_SOFT_RESET_USC_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_SOFT_RESET2 */ -+#define ROGUE_CR_SOFT_RESET2 0x0108U -+#define ROGUE_CR_SOFT_RESET2_MASKFULL 0x00000000001FFFFFULL -+#define ROGUE_CR_SOFT_RESET2_SPFILTER_SHIFT 12U -+#define ROGUE_CR_SOFT_RESET2_SPFILTER_CLRMSK 0xFFE00FFFU -+#define ROGUE_CR_SOFT_RESET2_TDM_SHIFT 11U -+#define ROGUE_CR_SOFT_RESET2_TDM_CLRMSK 0xFFFFF7FFU -+#define ROGUE_CR_SOFT_RESET2_TDM_EN 0x00000800U -+#define ROGUE_CR_SOFT_RESET2_ASTC_SHIFT 10U -+#define ROGUE_CR_SOFT_RESET2_ASTC_CLRMSK 0xFFFFFBFFU -+#define ROGUE_CR_SOFT_RESET2_ASTC_EN 0x00000400U -+#define ROGUE_CR_SOFT_RESET2_BLACKPEARL_SHIFT 9U -+#define ROGUE_CR_SOFT_RESET2_BLACKPEARL_CLRMSK 0xFFFFFDFFU -+#define ROGUE_CR_SOFT_RESET2_BLACKPEARL_EN 0x00000200U -+#define ROGUE_CR_SOFT_RESET2_USCPS_SHIFT 8U -+#define ROGUE_CR_SOFT_RESET2_USCPS_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_SOFT_RESET2_USCPS_EN 0x00000100U -+#define ROGUE_CR_SOFT_RESET2_IPF_SHIFT 7U -+#define ROGUE_CR_SOFT_RESET2_IPF_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_SOFT_RESET2_IPF_EN 0x00000080U -+#define ROGUE_CR_SOFT_RESET2_GEOMETRY_SHIFT 6U -+#define ROGUE_CR_SOFT_RESET2_GEOMETRY_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_SOFT_RESET2_GEOMETRY_EN 0x00000040U -+#define ROGUE_CR_SOFT_RESET2_USC_SHARED_SHIFT 5U -+#define ROGUE_CR_SOFT_RESET2_USC_SHARED_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_SOFT_RESET2_USC_SHARED_EN 0x00000020U -+#define ROGUE_CR_SOFT_RESET2_PDS_SHARED_SHIFT 4U -+#define ROGUE_CR_SOFT_RESET2_PDS_SHARED_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SOFT_RESET2_PDS_SHARED_EN 0x00000010U -+#define ROGUE_CR_SOFT_RESET2_BIF_BLACKPEARL_SHIFT 3U -+#define ROGUE_CR_SOFT_RESET2_BIF_BLACKPEARL_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SOFT_RESET2_BIF_BLACKPEARL_EN 0x00000008U -+#define ROGUE_CR_SOFT_RESET2_PIXEL_SHIFT 2U -+#define ROGUE_CR_SOFT_RESET2_PIXEL_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SOFT_RESET2_PIXEL_EN 0x00000004U -+#define ROGUE_CR_SOFT_RESET2_CDM_SHIFT 1U -+#define ROGUE_CR_SOFT_RESET2_CDM_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SOFT_RESET2_CDM_EN 0x00000002U -+#define ROGUE_CR_SOFT_RESET2_VERTEX_SHIFT 0U -+#define ROGUE_CR_SOFT_RESET2_VERTEX_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SOFT_RESET2_VERTEX_EN 0x00000001U -+ -+/* Register ROGUE_CR_EVENT_STATUS */ -+#define ROGUE_CR_EVENT_STATUS 0x0130U -+#define ROGUE_CR_EVENT_STATUS__ROGUEXE__MASKFULL 0x00000000E01DFFFFULL -+#define ROGUE_CR_EVENT_STATUS__SIGNALS__MASKFULL 0x00000000E007FFFFULL -+#define ROGUE_CR_EVENT_STATUS_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_EVENT_STATUS_TDM_FENCE_FINISHED_SHIFT 31U -+#define ROGUE_CR_EVENT_STATUS_TDM_FENCE_FINISHED_CLRMSK 0x7FFFFFFFU -+#define ROGUE_CR_EVENT_STATUS_TDM_FENCE_FINISHED_EN 0x80000000U -+#define ROGUE_CR_EVENT_STATUS_TDM_BUFFER_STALL_SHIFT 30U -+#define ROGUE_CR_EVENT_STATUS_TDM_BUFFER_STALL_CLRMSK 0xBFFFFFFFU -+#define ROGUE_CR_EVENT_STATUS_TDM_BUFFER_STALL_EN 0x40000000U -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_SIGNAL_FAILURE_SHIFT 29U -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_SIGNAL_FAILURE_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_SIGNAL_FAILURE_EN 0x20000000U -+#define ROGUE_CR_EVENT_STATUS_DPX_OUT_OF_MEMORY_SHIFT 28U -+#define ROGUE_CR_EVENT_STATUS_DPX_OUT_OF_MEMORY_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_EVENT_STATUS_DPX_OUT_OF_MEMORY_EN 0x10000000U -+#define ROGUE_CR_EVENT_STATUS_DPX_MMU_PAGE_FAULT_SHIFT 27U -+#define ROGUE_CR_EVENT_STATUS_DPX_MMU_PAGE_FAULT_CLRMSK 0xF7FFFFFFU -+#define ROGUE_CR_EVENT_STATUS_DPX_MMU_PAGE_FAULT_EN 0x08000000U -+#define ROGUE_CR_EVENT_STATUS_RPM_OUT_OF_MEMORY_SHIFT 26U -+#define ROGUE_CR_EVENT_STATUS_RPM_OUT_OF_MEMORY_CLRMSK 0xFBFFFFFFU -+#define ROGUE_CR_EVENT_STATUS_RPM_OUT_OF_MEMORY_EN 0x04000000U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC3_FINISHED_SHIFT 25U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC3_FINISHED_CLRMSK 0xFDFFFFFFU -+#define ROGUE_CR_EVENT_STATUS_FBA_FC3_FINISHED_EN 0x02000000U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC2_FINISHED_SHIFT 24U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC2_FINISHED_CLRMSK 0xFEFFFFFFU -+#define ROGUE_CR_EVENT_STATUS_FBA_FC2_FINISHED_EN 0x01000000U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC1_FINISHED_SHIFT 23U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC1_FINISHED_CLRMSK 0xFF7FFFFFU -+#define ROGUE_CR_EVENT_STATUS_FBA_FC1_FINISHED_EN 0x00800000U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC0_FINISHED_SHIFT 22U -+#define ROGUE_CR_EVENT_STATUS_FBA_FC0_FINISHED_CLRMSK 0xFFBFFFFFU -+#define ROGUE_CR_EVENT_STATUS_FBA_FC0_FINISHED_EN 0x00400000U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC3_FINISHED_SHIFT 21U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC3_FINISHED_CLRMSK 0xFFDFFFFFU -+#define ROGUE_CR_EVENT_STATUS_RDM_FC3_FINISHED_EN 0x00200000U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC2_FINISHED_SHIFT 20U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC2_FINISHED_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_EVENT_STATUS_RDM_FC2_FINISHED_EN 0x00100000U -+#define ROGUE_CR_EVENT_STATUS_SAFETY_SHIFT 20U -+#define ROGUE_CR_EVENT_STATUS_SAFETY_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_EVENT_STATUS_SAFETY_EN 0x00100000U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC1_FINISHED_SHIFT 19U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC1_FINISHED_CLRMSK 0xFFF7FFFFU -+#define ROGUE_CR_EVENT_STATUS_RDM_FC1_FINISHED_EN 0x00080000U -+#define ROGUE_CR_EVENT_STATUS_SLAVE_REQ_SHIFT 19U -+#define ROGUE_CR_EVENT_STATUS_SLAVE_REQ_CLRMSK 0xFFF7FFFFU -+#define ROGUE_CR_EVENT_STATUS_SLAVE_REQ_EN 0x00080000U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC0_FINISHED_SHIFT 18U -+#define ROGUE_CR_EVENT_STATUS_RDM_FC0_FINISHED_CLRMSK 0xFFFBFFFFU -+#define ROGUE_CR_EVENT_STATUS_RDM_FC0_FINISHED_EN 0x00040000U -+#define ROGUE_CR_EVENT_STATUS_TDM_CONTEXT_STORE_FINISHED_SHIFT 18U -+#define ROGUE_CR_EVENT_STATUS_TDM_CONTEXT_STORE_FINISHED_CLRMSK 0xFFFBFFFFU -+#define ROGUE_CR_EVENT_STATUS_TDM_CONTEXT_STORE_FINISHED_EN 0x00040000U -+#define ROGUE_CR_EVENT_STATUS_SHG_FINISHED_SHIFT 17U -+#define ROGUE_CR_EVENT_STATUS_SHG_FINISHED_CLRMSK 0xFFFDFFFFU -+#define ROGUE_CR_EVENT_STATUS_SHG_FINISHED_EN 0x00020000U -+#define ROGUE_CR_EVENT_STATUS_SPFILTER_SIGNAL_UPDATE_SHIFT 17U -+#define ROGUE_CR_EVENT_STATUS_SPFILTER_SIGNAL_UPDATE_CLRMSK 0xFFFDFFFFU -+#define ROGUE_CR_EVENT_STATUS_SPFILTER_SIGNAL_UPDATE_EN 0x00020000U -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_BUFFER_STALL_SHIFT 16U -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_BUFFER_STALL_CLRMSK 0xFFFEFFFFU -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_BUFFER_STALL_EN 0x00010000U -+#define ROGUE_CR_EVENT_STATUS_USC_TRIGGER_SHIFT 15U -+#define ROGUE_CR_EVENT_STATUS_USC_TRIGGER_CLRMSK 0xFFFF7FFFU -+#define ROGUE_CR_EVENT_STATUS_USC_TRIGGER_EN 0x00008000U -+#define ROGUE_CR_EVENT_STATUS_ZLS_FINISHED_SHIFT 14U -+#define ROGUE_CR_EVENT_STATUS_ZLS_FINISHED_CLRMSK 0xFFFFBFFFU -+#define ROGUE_CR_EVENT_STATUS_ZLS_FINISHED_EN 0x00004000U -+#define ROGUE_CR_EVENT_STATUS_GPIO_ACK_SHIFT 13U -+#define ROGUE_CR_EVENT_STATUS_GPIO_ACK_CLRMSK 0xFFFFDFFFU -+#define ROGUE_CR_EVENT_STATUS_GPIO_ACK_EN 0x00002000U -+#define ROGUE_CR_EVENT_STATUS_GPIO_REQ_SHIFT 12U -+#define ROGUE_CR_EVENT_STATUS_GPIO_REQ_CLRMSK 0xFFFFEFFFU -+#define ROGUE_CR_EVENT_STATUS_GPIO_REQ_EN 0x00001000U -+#define ROGUE_CR_EVENT_STATUS_POWER_ABORT_SHIFT 11U -+#define ROGUE_CR_EVENT_STATUS_POWER_ABORT_CLRMSK 0xFFFFF7FFU -+#define ROGUE_CR_EVENT_STATUS_POWER_ABORT_EN 0x00000800U -+#define ROGUE_CR_EVENT_STATUS_POWER_COMPLETE_SHIFT 10U -+#define ROGUE_CR_EVENT_STATUS_POWER_COMPLETE_CLRMSK 0xFFFFFBFFU -+#define ROGUE_CR_EVENT_STATUS_POWER_COMPLETE_EN 0x00000400U -+#define ROGUE_CR_EVENT_STATUS_MMU_PAGE_FAULT_SHIFT 9U -+#define ROGUE_CR_EVENT_STATUS_MMU_PAGE_FAULT_CLRMSK 0xFFFFFDFFU -+#define ROGUE_CR_EVENT_STATUS_MMU_PAGE_FAULT_EN 0x00000200U -+#define ROGUE_CR_EVENT_STATUS_PM_3D_MEM_FREE_SHIFT 8U -+#define ROGUE_CR_EVENT_STATUS_PM_3D_MEM_FREE_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_EVENT_STATUS_PM_3D_MEM_FREE_EN 0x00000100U -+#define ROGUE_CR_EVENT_STATUS_PM_OUT_OF_MEMORY_SHIFT 7U -+#define ROGUE_CR_EVENT_STATUS_PM_OUT_OF_MEMORY_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_EVENT_STATUS_PM_OUT_OF_MEMORY_EN 0x00000080U -+#define ROGUE_CR_EVENT_STATUS_TA_TERMINATE_SHIFT 6U -+#define ROGUE_CR_EVENT_STATUS_TA_TERMINATE_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_EVENT_STATUS_TA_TERMINATE_EN 0x00000040U -+#define ROGUE_CR_EVENT_STATUS_TA_FINISHED_SHIFT 5U -+#define ROGUE_CR_EVENT_STATUS_TA_FINISHED_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_EVENT_STATUS_TA_FINISHED_EN 0x00000020U -+#define ROGUE_CR_EVENT_STATUS_ISP_END_MACROTILE_SHIFT 4U -+#define ROGUE_CR_EVENT_STATUS_ISP_END_MACROTILE_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_EVENT_STATUS_ISP_END_MACROTILE_EN 0x00000010U -+#define ROGUE_CR_EVENT_STATUS_PIXELBE_END_RENDER_SHIFT 3U -+#define ROGUE_CR_EVENT_STATUS_PIXELBE_END_RENDER_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_EVENT_STATUS_PIXELBE_END_RENDER_EN 0x00000008U -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_FINISHED_SHIFT 2U -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_FINISHED_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_EVENT_STATUS_COMPUTE_FINISHED_EN 0x00000004U -+#define ROGUE_CR_EVENT_STATUS_KERNEL_FINISHED_SHIFT 1U -+#define ROGUE_CR_EVENT_STATUS_KERNEL_FINISHED_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_EVENT_STATUS_KERNEL_FINISHED_EN 0x00000002U -+#define ROGUE_CR_EVENT_STATUS_TLA_COMPLETE_SHIFT 0U -+#define ROGUE_CR_EVENT_STATUS_TLA_COMPLETE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_EVENT_STATUS_TLA_COMPLETE_EN 0x00000001U -+ -+/* Register ROGUE_CR_TIMER */ -+#define ROGUE_CR_TIMER 0x0160U -+#define ROGUE_CR_TIMER_MASKFULL 0x8000FFFFFFFFFFFFULL -+#define ROGUE_CR_TIMER_BIT31_SHIFT 63U -+#define ROGUE_CR_TIMER_BIT31_CLRMSK 0x7FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_TIMER_BIT31_EN 0x8000000000000000ULL -+#define ROGUE_CR_TIMER_VALUE_SHIFT 0U -+#define ROGUE_CR_TIMER_VALUE_CLRMSK 0xFFFF000000000000ULL -+ -+/* Register ROGUE_CR_TLA_STATUS */ -+#define ROGUE_CR_TLA_STATUS 0x0178U -+#define ROGUE_CR_TLA_STATUS_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_TLA_STATUS_BLIT_COUNT_SHIFT 39U -+#define ROGUE_CR_TLA_STATUS_BLIT_COUNT_CLRMSK 0x0000007FFFFFFFFFULL -+#define ROGUE_CR_TLA_STATUS_REQUEST_SHIFT 7U -+#define ROGUE_CR_TLA_STATUS_REQUEST_CLRMSK 0xFFFFFF800000007FULL -+#define ROGUE_CR_TLA_STATUS_FIFO_FULLNESS_SHIFT 1U -+#define ROGUE_CR_TLA_STATUS_FIFO_FULLNESS_CLRMSK 0xFFFFFFFFFFFFFF81ULL -+#define ROGUE_CR_TLA_STATUS_BUSY_SHIFT 0U -+#define ROGUE_CR_TLA_STATUS_BUSY_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_TLA_STATUS_BUSY_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_PM_PARTIAL_RENDER_ENABLE */ -+#define ROGUE_CR_PM_PARTIAL_RENDER_ENABLE 0x0338U -+#define ROGUE_CR_PM_PARTIAL_RENDER_ENABLE_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_PM_PARTIAL_RENDER_ENABLE_OP_SHIFT 0U -+#define ROGUE_CR_PM_PARTIAL_RENDER_ENABLE_OP_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_PM_PARTIAL_RENDER_ENABLE_OP_EN 0x00000001U -+ -+/* Register ROGUE_CR_SIDEKICK_IDLE */ -+#define ROGUE_CR_SIDEKICK_IDLE 0x03C8U -+#define ROGUE_CR_SIDEKICK_IDLE_MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_SIDEKICK_IDLE_FB_CDC_SHIFT 6U -+#define ROGUE_CR_SIDEKICK_IDLE_FB_CDC_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_SIDEKICK_IDLE_FB_CDC_EN 0x00000040U -+#define ROGUE_CR_SIDEKICK_IDLE_MMU_SHIFT 5U -+#define ROGUE_CR_SIDEKICK_IDLE_MMU_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_SIDEKICK_IDLE_MMU_EN 0x00000020U -+#define ROGUE_CR_SIDEKICK_IDLE_BIF128_SHIFT 4U -+#define ROGUE_CR_SIDEKICK_IDLE_BIF128_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SIDEKICK_IDLE_BIF128_EN 0x00000010U -+#define ROGUE_CR_SIDEKICK_IDLE_TLA_SHIFT 3U -+#define ROGUE_CR_SIDEKICK_IDLE_TLA_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SIDEKICK_IDLE_TLA_EN 0x00000008U -+#define ROGUE_CR_SIDEKICK_IDLE_GARTEN_SHIFT 2U -+#define ROGUE_CR_SIDEKICK_IDLE_GARTEN_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SIDEKICK_IDLE_GARTEN_EN 0x00000004U -+#define ROGUE_CR_SIDEKICK_IDLE_HOSTIF_SHIFT 1U -+#define ROGUE_CR_SIDEKICK_IDLE_HOSTIF_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SIDEKICK_IDLE_HOSTIF_EN 0x00000002U -+#define ROGUE_CR_SIDEKICK_IDLE_SOCIF_SHIFT 0U -+#define ROGUE_CR_SIDEKICK_IDLE_SOCIF_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SIDEKICK_IDLE_SOCIF_EN 0x00000001U -+ -+/* Register ROGUE_CR_MARS_IDLE */ -+#define ROGUE_CR_MARS_IDLE 0x08F8U -+#define ROGUE_CR_MARS_IDLE_MASKFULL 0x0000000000000007ULL -+#define ROGUE_CR_MARS_IDLE_MH_SYSARB0_SHIFT 2U -+#define ROGUE_CR_MARS_IDLE_MH_SYSARB0_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_MARS_IDLE_MH_SYSARB0_EN 0x00000004U -+#define ROGUE_CR_MARS_IDLE_CPU_SHIFT 1U -+#define ROGUE_CR_MARS_IDLE_CPU_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_MARS_IDLE_CPU_EN 0x00000002U -+#define ROGUE_CR_MARS_IDLE_SOCIF_SHIFT 0U -+#define ROGUE_CR_MARS_IDLE_SOCIF_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MARS_IDLE_SOCIF_EN 0x00000001U -+ -+/* Register ROGUE_CR_VDM_CONTEXT_STORE_STATUS */ -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS 0x0430U -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_MASKFULL 0x00000000000000F3ULL -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_LAST_PIPE_SHIFT 4U -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_LAST_PIPE_CLRMSK 0xFFFFFF0FU -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_NEED_RESUME_SHIFT 1U -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_NEED_RESUME_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_NEED_RESUME_EN 0x00000002U -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_COMPLETE_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_COMPLETE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_VDM_CONTEXT_STORE_STATUS_COMPLETE_EN 0x00000001U -+ -+/* Register ROGUE_CR_VDM_CONTEXT_STORE_TASK0 */ -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK0 0x0438U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK0_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK0_PDS_STATE1_SHIFT 32U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK0_PDS_STATE1_CLRMSK 0x00000000FFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK0_PDS_STATE0_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK0_PDS_STATE0_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register ROGUE_CR_VDM_CONTEXT_STORE_TASK1 */ -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK1 0x0440U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK1_PDS_STATE2_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK1_PDS_STATE2_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_VDM_CONTEXT_STORE_TASK2 */ -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK2 0x0448U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK2_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK2_STREAM_OUT2_SHIFT 32U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK2_STREAM_OUT2_CLRMSK 0x00000000FFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK2_STREAM_OUT1_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_STORE_TASK2_STREAM_OUT1_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register ROGUE_CR_VDM_CONTEXT_RESUME_TASK0 */ -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK0 0x0450U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK0_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK0_PDS_STATE1_SHIFT 32U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK0_PDS_STATE1_CLRMSK 0x00000000FFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK0_PDS_STATE0_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK0_PDS_STATE0_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register ROGUE_CR_VDM_CONTEXT_RESUME_TASK1 */ -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK1 0x0458U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK1_PDS_STATE2_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK1_PDS_STATE2_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_VDM_CONTEXT_RESUME_TASK2 */ -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK2 0x0460U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK2_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK2_STREAM_OUT2_SHIFT 32U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK2_STREAM_OUT2_CLRMSK 0x00000000FFFFFFFFULL -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK2_STREAM_OUT1_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_RESUME_TASK2_STREAM_OUT1_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register ROGUE_CR_CDM_CONTEXT_STORE_STATUS */ -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS 0x04A0U -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS_MASKFULL 0x0000000000000003ULL -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS_NEED_RESUME_SHIFT 1U -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS_NEED_RESUME_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS_NEED_RESUME_EN 0x00000002U -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS_COMPLETE_SHIFT 0U -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS_COMPLETE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_CDM_CONTEXT_STORE_STATUS_COMPLETE_EN 0x00000001U -+ -+/* Register ROGUE_CR_CDM_CONTEXT_PDS0 */ -+#define ROGUE_CR_CDM_CONTEXT_PDS0 0x04A8U -+#define ROGUE_CR_CDM_CONTEXT_PDS0_MASKFULL 0xFFFFFFF0FFFFFFF0ULL -+#define ROGUE_CR_CDM_CONTEXT_PDS0_DATA_ADDR_SHIFT 36U -+#define ROGUE_CR_CDM_CONTEXT_PDS0_DATA_ADDR_CLRMSK 0x0000000FFFFFFFFFULL -+#define ROGUE_CR_CDM_CONTEXT_PDS0_DATA_ADDR_ALIGNSHIFT 4U -+#define ROGUE_CR_CDM_CONTEXT_PDS0_DATA_ADDR_ALIGNSIZE 16U -+#define ROGUE_CR_CDM_CONTEXT_PDS0_CODE_ADDR_SHIFT 4U -+#define ROGUE_CR_CDM_CONTEXT_PDS0_CODE_ADDR_CLRMSK 0xFFFFFFFF0000000FULL -+#define ROGUE_CR_CDM_CONTEXT_PDS0_CODE_ADDR_ALIGNSHIFT 4U -+#define ROGUE_CR_CDM_CONTEXT_PDS0_CODE_ADDR_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_CDM_CONTEXT_PDS1 */ -+#define ROGUE_CR_CDM_CONTEXT_PDS1 0x04B0U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__MASKFULL 0x000000007FFFFFFFULL -+#define ROGUE_CR_CDM_CONTEXT_PDS1_MASKFULL 0x000000003FFFFFFFULL -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__PDS_SEQ_DEP_SHIFT 30U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__PDS_SEQ_DEP_CLRMSK 0xBFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__PDS_SEQ_DEP_EN 0x40000000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_PDS_SEQ_DEP_SHIFT 29U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_PDS_SEQ_DEP_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_PDS_SEQ_DEP_EN 0x20000000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__USC_SEQ_DEP_SHIFT 29U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__USC_SEQ_DEP_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__USC_SEQ_DEP_EN 0x20000000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_USC_SEQ_DEP_SHIFT 28U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_USC_SEQ_DEP_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_USC_SEQ_DEP_EN 0x10000000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__TARGET_SHIFT 28U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__TARGET_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__TARGET_EN 0x10000000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_TARGET_SHIFT 27U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_TARGET_CLRMSK 0xF7FFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_TARGET_EN 0x08000000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__UNIFIED_SIZE_SHIFT 22U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__UNIFIED_SIZE_CLRMSK 0xF03FFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_UNIFIED_SIZE_SHIFT 21U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_UNIFIED_SIZE_CLRMSK 0xF81FFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__COMMON_SHARED_SHIFT 21U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__COMMON_SHARED_CLRMSK 0xFFDFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__COMMON_SHARED_EN 0x00200000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_COMMON_SHARED_SHIFT 20U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_COMMON_SHARED_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_COMMON_SHARED_EN 0x00100000U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__COMMON_SIZE_SHIFT 12U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__COMMON_SIZE_CLRMSK 0xFFE00FFFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_COMMON_SIZE_SHIFT 11U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_COMMON_SIZE_CLRMSK 0xFFF007FFU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_TEMP_SIZE_SHIFT 7U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_TEMP_SIZE_CLRMSK 0xFFFFF87FU -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__TEMP_SIZE_SHIFT 7U -+#define ROGUE_CR_CDM_CONTEXT_PDS1__TEMPSIZE8__TEMP_SIZE_CLRMSK 0xFFFFF07FU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_DATA_SIZE_SHIFT 1U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_DATA_SIZE_CLRMSK 0xFFFFFF81U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_FENCE_SHIFT 0U -+#define ROGUE_CR_CDM_CONTEXT_PDS1_FENCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_CDM_CONTEXT_PDS1_FENCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_CDM_TERMINATE_PDS */ -+#define ROGUE_CR_CDM_TERMINATE_PDS 0x04B8U -+#define ROGUE_CR_CDM_TERMINATE_PDS_MASKFULL 0xFFFFFFF0FFFFFFF0ULL -+#define ROGUE_CR_CDM_TERMINATE_PDS_DATA_ADDR_SHIFT 36U -+#define ROGUE_CR_CDM_TERMINATE_PDS_DATA_ADDR_CLRMSK 0x0000000FFFFFFFFFULL -+#define ROGUE_CR_CDM_TERMINATE_PDS_DATA_ADDR_ALIGNSHIFT 4U -+#define ROGUE_CR_CDM_TERMINATE_PDS_DATA_ADDR_ALIGNSIZE 16U -+#define ROGUE_CR_CDM_TERMINATE_PDS_CODE_ADDR_SHIFT 4U -+#define ROGUE_CR_CDM_TERMINATE_PDS_CODE_ADDR_CLRMSK 0xFFFFFFFF0000000FULL -+#define ROGUE_CR_CDM_TERMINATE_PDS_CODE_ADDR_ALIGNSHIFT 4U -+#define ROGUE_CR_CDM_TERMINATE_PDS_CODE_ADDR_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_CDM_TERMINATE_PDS1 */ -+#define ROGUE_CR_CDM_TERMINATE_PDS1 0x04C0U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__MASKFULL 0x000000007FFFFFFFULL -+#define ROGUE_CR_CDM_TERMINATE_PDS1_MASKFULL 0x000000003FFFFFFFULL -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__PDS_SEQ_DEP_SHIFT 30U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__PDS_SEQ_DEP_CLRMSK 0xBFFFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__PDS_SEQ_DEP_EN 0x40000000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_PDS_SEQ_DEP_SHIFT 29U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_PDS_SEQ_DEP_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_PDS_SEQ_DEP_EN 0x20000000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__USC_SEQ_DEP_SHIFT 29U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__USC_SEQ_DEP_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__USC_SEQ_DEP_EN 0x20000000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_USC_SEQ_DEP_SHIFT 28U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_USC_SEQ_DEP_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_USC_SEQ_DEP_EN 0x10000000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__TARGET_SHIFT 28U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__TARGET_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__TARGET_EN 0x10000000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_TARGET_SHIFT 27U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_TARGET_CLRMSK 0xF7FFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_TARGET_EN 0x08000000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__UNIFIED_SIZE_SHIFT 22U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__UNIFIED_SIZE_CLRMSK 0xF03FFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_UNIFIED_SIZE_SHIFT 21U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_UNIFIED_SIZE_CLRMSK 0xF81FFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__COMMON_SHARED_SHIFT 21U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__COMMON_SHARED_CLRMSK 0xFFDFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__COMMON_SHARED_EN 0x00200000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_COMMON_SHARED_SHIFT 20U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_COMMON_SHARED_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_COMMON_SHARED_EN 0x00100000U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__COMMON_SIZE_SHIFT 12U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__COMMON_SIZE_CLRMSK 0xFFE00FFFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_COMMON_SIZE_SHIFT 11U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_COMMON_SIZE_CLRMSK 0xFFF007FFU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_TEMP_SIZE_SHIFT 7U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_TEMP_SIZE_CLRMSK 0xFFFFF87FU -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__TEMP_SIZE_SHIFT 7U -+#define ROGUE_CR_CDM_TERMINATE_PDS1__TEMPSIZE8__TEMP_SIZE_CLRMSK 0xFFFFF07FU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_DATA_SIZE_SHIFT 1U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_DATA_SIZE_CLRMSK 0xFFFFFF81U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_FENCE_SHIFT 0U -+#define ROGUE_CR_CDM_TERMINATE_PDS1_FENCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_CDM_TERMINATE_PDS1_FENCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_CDM_CONTEXT_LOAD_PDS0 */ -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0 0x04D8U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_MASKFULL 0xFFFFFFF0FFFFFFF0ULL -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_DATA_ADDR_SHIFT 36U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_DATA_ADDR_CLRMSK 0x0000000FFFFFFFFFULL -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_DATA_ADDR_ALIGNSHIFT 4U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_DATA_ADDR_ALIGNSIZE 16U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_CODE_ADDR_SHIFT 4U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_CODE_ADDR_CLRMSK 0xFFFFFFFF0000000FULL -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_CODE_ADDR_ALIGNSHIFT 4U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS0_CODE_ADDR_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_CDM_CONTEXT_LOAD_PDS1 */ -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1 0x04E0U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__MASKFULL 0x000000007FFFFFFFULL -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_MASKFULL 0x000000003FFFFFFFULL -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__PDS_SEQ_DEP_SHIFT 30U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__PDS_SEQ_DEP_CLRMSK 0xBFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__PDS_SEQ_DEP_EN 0x40000000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_PDS_SEQ_DEP_SHIFT 29U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_PDS_SEQ_DEP_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_PDS_SEQ_DEP_EN 0x20000000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__USC_SEQ_DEP_SHIFT 29U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__USC_SEQ_DEP_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__USC_SEQ_DEP_EN 0x20000000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_USC_SEQ_DEP_SHIFT 28U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_USC_SEQ_DEP_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_USC_SEQ_DEP_EN 0x10000000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__TARGET_SHIFT 28U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__TARGET_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__TARGET_EN 0x10000000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_TARGET_SHIFT 27U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_TARGET_CLRMSK 0xF7FFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_TARGET_EN 0x08000000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__UNIFIED_SIZE_SHIFT 22U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__UNIFIED_SIZE_CLRMSK 0xF03FFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_UNIFIED_SIZE_SHIFT 21U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_UNIFIED_SIZE_CLRMSK 0xF81FFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__COMMON_SHARED_SHIFT 21U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__COMMON_SHARED_CLRMSK 0xFFDFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__COMMON_SHARED_EN 0x00200000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_COMMON_SHARED_SHIFT 20U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_COMMON_SHARED_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_COMMON_SHARED_EN 0x00100000U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__COMMON_SIZE_SHIFT 12U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__COMMON_SIZE_CLRMSK 0xFFE00FFFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_COMMON_SIZE_SHIFT 11U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_COMMON_SIZE_CLRMSK 0xFFF007FFU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_TEMP_SIZE_SHIFT 7U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_TEMP_SIZE_CLRMSK 0xFFFFF87FU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__TEMP_SIZE_SHIFT 7U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1__TEMPSIZE8__TEMP_SIZE_CLRMSK 0xFFFFF07FU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_DATA_SIZE_SHIFT 1U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_DATA_SIZE_CLRMSK 0xFFFFFF81U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_FENCE_SHIFT 0U -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_FENCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_CDM_CONTEXT_LOAD_PDS1_FENCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_WRAPPER_CONFIG */ -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG 0x0810U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_MASKFULL 0x000001030F01FFFFULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_FW_IDLE_ENABLE_SHIFT 40U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_FW_IDLE_ENABLE_CLRMSK 0xFFFFFEFFFFFFFFFFULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_FW_IDLE_ENABLE_EN 0x0000010000000000ULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_DISABLE_BOOT_SHIFT 33U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_DISABLE_BOOT_CLRMSK 0xFFFFFFFDFFFFFFFFULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_DISABLE_BOOT_EN 0x0000000200000000ULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_L2_CACHE_OFF_SHIFT 32U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_L2_CACHE_OFF_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_L2_CACHE_OFF_EN 0x0000000100000000ULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_OS_ID_SHIFT 25U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_OS_ID_CLRMSK 0xFFFFFFFFF1FFFFFFULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_TRUSTED_SHIFT 24U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_TRUSTED_CLRMSK 0xFFFFFFFFFEFFFFFFULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_TRUSTED_EN 0x0000000001000000ULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_BOOT_ISA_MODE_SHIFT 16U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_BOOT_ISA_MODE_CLRMSK 0xFFFFFFFFFFFEFFFFULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_BOOT_ISA_MODE_MIPS32 0x0000000000000000ULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_BOOT_ISA_MODE_MICROMIPS 0x0000000000010000ULL -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_REGBANK_BASE_ADDR_SHIFT 0U -+#define ROGUE_CR_MIPS_WRAPPER_CONFIG_REGBANK_BASE_ADDR_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1 0x0818U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1_MASKFULL 0x00000000FFFFF001ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1_BASE_ADDR_IN_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1_BASE_ADDR_IN_CLRMSK 0xFFFFFFFF00000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1_MODE_ENABLE_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1_MODE_ENABLE_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG1_MODE_ENABLE_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2 0x0820U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_MASKFULL 0x000000FFFFFFF1FFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_ADDR_OUT_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_ADDR_OUT_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_OS_ID_SHIFT 6U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_OS_ID_CLRMSK 0xFFFFFFFFFFFFFE3FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_TRUSTED_SHIFT 5U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_TRUSTED_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_TRUSTED_EN 0x0000000000000020ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_REGION_SIZE_POW2_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP1_CONFIG2_REGION_SIZE_POW2_CLRMSK 0xFFFFFFFFFFFFFFE0ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1 0x0828U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1_MASKFULL 0x00000000FFFFF001ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1_BASE_ADDR_IN_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1_BASE_ADDR_IN_CLRMSK 0xFFFFFFFF00000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1_MODE_ENABLE_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1_MODE_ENABLE_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG1_MODE_ENABLE_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2 0x0830U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_MASKFULL 0x000000FFFFFFF1FFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_ADDR_OUT_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_ADDR_OUT_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_OS_ID_SHIFT 6U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_OS_ID_CLRMSK 0xFFFFFFFFFFFFFE3FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_TRUSTED_SHIFT 5U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_TRUSTED_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_TRUSTED_EN 0x0000000000000020ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_REGION_SIZE_POW2_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP2_CONFIG2_REGION_SIZE_POW2_CLRMSK 0xFFFFFFFFFFFFFFE0ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1 0x0838U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1_MASKFULL 0x00000000FFFFF001ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1_BASE_ADDR_IN_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1_BASE_ADDR_IN_CLRMSK 0xFFFFFFFF00000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1_MODE_ENABLE_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1_MODE_ENABLE_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG1_MODE_ENABLE_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2 0x0840U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_MASKFULL 0x000000FFFFFFF1FFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_ADDR_OUT_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_ADDR_OUT_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_OS_ID_SHIFT 6U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_OS_ID_CLRMSK 0xFFFFFFFFFFFFFE3FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_TRUSTED_SHIFT 5U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_TRUSTED_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_TRUSTED_EN 0x0000000000000020ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_REGION_SIZE_POW2_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP3_CONFIG2_REGION_SIZE_POW2_CLRMSK 0xFFFFFFFFFFFFFFE0ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1 0x0848U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1_MASKFULL 0x00000000FFFFF001ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1_BASE_ADDR_IN_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1_BASE_ADDR_IN_CLRMSK 0xFFFFFFFF00000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1_MODE_ENABLE_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1_MODE_ENABLE_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG1_MODE_ENABLE_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2 0x0850U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_MASKFULL 0x000000FFFFFFF1FFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_ADDR_OUT_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_ADDR_OUT_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_OS_ID_SHIFT 6U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_OS_ID_CLRMSK 0xFFFFFFFFFFFFFE3FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_TRUSTED_SHIFT 5U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_TRUSTED_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_TRUSTED_EN 0x0000000000000020ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_REGION_SIZE_POW2_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP4_CONFIG2_REGION_SIZE_POW2_CLRMSK 0xFFFFFFFFFFFFFFE0ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1 0x0858U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1_MASKFULL 0x00000000FFFFF001ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1_BASE_ADDR_IN_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1_BASE_ADDR_IN_CLRMSK 0xFFFFFFFF00000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1_MODE_ENABLE_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1_MODE_ENABLE_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG1_MODE_ENABLE_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2 */ -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2 0x0860U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_MASKFULL 0x000000FFFFFFF1FFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_ADDR_OUT_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_ADDR_OUT_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_OS_ID_SHIFT 6U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_OS_ID_CLRMSK 0xFFFFFFFFFFFFFE3FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_TRUSTED_SHIFT 5U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_TRUSTED_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_TRUSTED_EN 0x0000000000000020ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_REGION_SIZE_POW2_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP5_CONFIG2_REGION_SIZE_POW2_CLRMSK 0xFFFFFFFFFFFFFFE0ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS */ -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS 0x0868U -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS_MASKFULL 0x00000001FFFFFFFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS_EVENT_SHIFT 32U -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS_EVENT_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS_EVENT_EN 0x0000000100000000ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS_ADDRESS_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_STATUS_ADDRESS_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_CLEAR */ -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_CLEAR 0x0870U -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_CLEAR_EVENT_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_CLEAR_EVENT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_ADDR_REMAP_UNMAPPED_CLEAR_EVENT_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG */ -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG 0x0878U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_MASKFULL 0xFFFFFFF7FFFFFFBFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_ADDR_OUT_SHIFT 36U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_ADDR_OUT_CLRMSK 0x0000000FFFFFFFFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_OS_ID_SHIFT 32U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_OS_ID_CLRMSK 0xFFFFFFF8FFFFFFFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_BASE_ADDR_IN_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_BASE_ADDR_IN_CLRMSK 0xFFFFFFFF00000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_TRUSTED_SHIFT 11U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_TRUSTED_CLRMSK 0xFFFFFFFFFFFFF7FFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_TRUSTED_EN 0x0000000000000800ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_SHIFT 7U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_CLRMSK 0xFFFFFFFFFFFFF87FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_4KB 0x0000000000000000ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_16KB 0x0000000000000080ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_64KB 0x0000000000000100ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_256KB 0x0000000000000180ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_1MB 0x0000000000000200ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_4MB 0x0000000000000280ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_16MB 0x0000000000000300ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_64MB 0x0000000000000380ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_REGION_SIZE_256MB 0x0000000000000400ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_ENTRY_SHIFT 1U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_ENTRY_CLRMSK 0xFFFFFFFFFFFFFFC1ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_MODE_ENABLE_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_MODE_ENABLE_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_CONFIG_MODE_ENABLE_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ */ -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ 0x0880U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ_MASKFULL 0x000000000000003FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ_ENTRY_SHIFT 1U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ_ENTRY_CLRMSK 0xFFFFFFC1U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ_REQUEST_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ_REQUEST_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_READ_REQUEST_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA */ -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA 0x0888U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_MASKFULL 0xFFFFFFF7FFFFFF81ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_ADDR_OUT_SHIFT 36U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_ADDR_OUT_CLRMSK 0x0000000FFFFFFFFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_OS_ID_SHIFT 32U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_OS_ID_CLRMSK 0xFFFFFFF8FFFFFFFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_BASE_ADDR_IN_SHIFT 12U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_BASE_ADDR_IN_CLRMSK 0xFFFFFFFF00000FFFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_TRUSTED_SHIFT 11U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_TRUSTED_CLRMSK 0xFFFFFFFFFFFFF7FFULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_TRUSTED_EN 0x0000000000000800ULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_REGION_SIZE_SHIFT 7U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_REGION_SIZE_CLRMSK 0xFFFFFFFFFFFFF87FULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_MODE_ENABLE_SHIFT 0U -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_MODE_ENABLE_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MIPS_ADDR_REMAP_RANGE_DATA_MODE_ENABLE_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MIPS_WRAPPER_IRQ_ENABLE */ -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_ENABLE 0x08A0U -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_ENABLE_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_ENABLE_EVENT_SHIFT 0U -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_ENABLE_EVENT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_ENABLE_EVENT_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_WRAPPER_IRQ_STATUS */ -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_STATUS 0x08A8U -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_STATUS_EVENT_SHIFT 0U -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_STATUS_EVENT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_STATUS_EVENT_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_WRAPPER_IRQ_CLEAR */ -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_CLEAR 0x08B0U -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_CLEAR_EVENT_SHIFT 0U -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_CLEAR_EVENT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_WRAPPER_IRQ_CLEAR_EVENT_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_WRAPPER_NMI_ENABLE */ -+#define ROGUE_CR_MIPS_WRAPPER_NMI_ENABLE 0x08B8U -+#define ROGUE_CR_MIPS_WRAPPER_NMI_ENABLE_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_MIPS_WRAPPER_NMI_ENABLE_EVENT_SHIFT 0U -+#define ROGUE_CR_MIPS_WRAPPER_NMI_ENABLE_EVENT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_WRAPPER_NMI_ENABLE_EVENT_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_WRAPPER_NMI_EVENT */ -+#define ROGUE_CR_MIPS_WRAPPER_NMI_EVENT 0x08C0U -+#define ROGUE_CR_MIPS_WRAPPER_NMI_EVENT_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_MIPS_WRAPPER_NMI_EVENT_TRIGGER_SHIFT 0U -+#define ROGUE_CR_MIPS_WRAPPER_NMI_EVENT_TRIGGER_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_WRAPPER_NMI_EVENT_TRIGGER_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_DEBUG_CONFIG */ -+#define ROGUE_CR_MIPS_DEBUG_CONFIG 0x08C8U -+#define ROGUE_CR_MIPS_DEBUG_CONFIG_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_MIPS_DEBUG_CONFIG_DISABLE_PROBE_DEBUG_SHIFT 0U -+#define ROGUE_CR_MIPS_DEBUG_CONFIG_DISABLE_PROBE_DEBUG_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_DEBUG_CONFIG_DISABLE_PROBE_DEBUG_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_EXCEPTION_STATUS */ -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS 0x08D0U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_MASKFULL 0x000000000000003FULL -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_SLEEP_SHIFT 5U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_SLEEP_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_SLEEP_EN 0x00000020U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NMI_TAKEN_SHIFT 4U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NMI_TAKEN_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NMI_TAKEN_EN 0x00000010U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NEST_EXL_SHIFT 3U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NEST_EXL_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NEST_EXL_EN 0x00000008U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NEST_ERL_SHIFT 2U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NEST_ERL_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_NEST_ERL_EN 0x00000004U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_EXL_SHIFT 1U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_EXL_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_EXL_EN 0x00000002U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_ERL_SHIFT 0U -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_ERL_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MIPS_EXCEPTION_STATUS_SI_ERL_EN 0x00000001U -+ -+/* Register ROGUE_CR_MIPS_WRAPPER_STATUS */ -+#define ROGUE_CR_MIPS_WRAPPER_STATUS 0x08E8U -+#define ROGUE_CR_MIPS_WRAPPER_STATUS_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_MIPS_WRAPPER_STATUS_OUTSTANDING_REQUESTS_SHIFT 0U -+#define ROGUE_CR_MIPS_WRAPPER_STATUS_OUTSTANDING_REQUESTS_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_XPU_BROADCAST */ -+#define ROGUE_CR_XPU_BROADCAST 0x0890U -+#define ROGUE_CR_XPU_BROADCAST_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_XPU_BROADCAST_MASK_SHIFT 0U -+#define ROGUE_CR_XPU_BROADCAST_MASK_CLRMSK 0xFFFFFE00U -+ -+/* Register ROGUE_CR_META_SP_MSLVDATAX */ -+#define ROGUE_CR_META_SP_MSLVDATAX 0x0A00U -+#define ROGUE_CR_META_SP_MSLVDATAX_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_META_SP_MSLVDATAX_MSLVDATAX_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVDATAX_MSLVDATAX_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_META_SP_MSLVDATAT */ -+#define ROGUE_CR_META_SP_MSLVDATAT 0x0A08U -+#define ROGUE_CR_META_SP_MSLVDATAT_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_META_SP_MSLVDATAT_MSLVDATAT_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVDATAT_MSLVDATAT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_META_SP_MSLVCTRL0 */ -+#define ROGUE_CR_META_SP_MSLVCTRL0 0x0A10U -+#define ROGUE_CR_META_SP_MSLVCTRL0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_META_SP_MSLVCTRL0_ADDR_SHIFT 2U -+#define ROGUE_CR_META_SP_MSLVCTRL0_ADDR_CLRMSK 0x00000003U -+#define ROGUE_CR_META_SP_MSLVCTRL0_AUTOINCR_SHIFT 1U -+#define ROGUE_CR_META_SP_MSLVCTRL0_AUTOINCR_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_META_SP_MSLVCTRL0_AUTOINCR_EN 0x00000002U -+#define ROGUE_CR_META_SP_MSLVCTRL0_RD_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVCTRL0_RD_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_META_SP_MSLVCTRL0_RD_EN 0x00000001U -+ -+/* Register ROGUE_CR_META_SP_MSLVCTRL1 */ -+#define ROGUE_CR_META_SP_MSLVCTRL1 0x0A18U -+#define ROGUE_CR_META_SP_MSLVCTRL1_MASKFULL 0x00000000F7F4003FULL -+#define ROGUE_CR_META_SP_MSLVCTRL1_DEFERRTHREAD_SHIFT 30U -+#define ROGUE_CR_META_SP_MSLVCTRL1_DEFERRTHREAD_CLRMSK 0x3FFFFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_LOCK2_INTERLOCK_SHIFT 29U -+#define ROGUE_CR_META_SP_MSLVCTRL1_LOCK2_INTERLOCK_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_LOCK2_INTERLOCK_EN 0x20000000U -+#define ROGUE_CR_META_SP_MSLVCTRL1_ATOMIC_INTERLOCK_SHIFT 28U -+#define ROGUE_CR_META_SP_MSLVCTRL1_ATOMIC_INTERLOCK_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_ATOMIC_INTERLOCK_EN 0x10000000U -+#define ROGUE_CR_META_SP_MSLVCTRL1_GBLPORT_IDLE_SHIFT 26U -+#define ROGUE_CR_META_SP_MSLVCTRL1_GBLPORT_IDLE_CLRMSK 0xFBFFFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_GBLPORT_IDLE_EN 0x04000000U -+#define ROGUE_CR_META_SP_MSLVCTRL1_COREMEM_IDLE_SHIFT 25U -+#define ROGUE_CR_META_SP_MSLVCTRL1_COREMEM_IDLE_CLRMSK 0xFDFFFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_COREMEM_IDLE_EN 0x02000000U -+#define ROGUE_CR_META_SP_MSLVCTRL1_READY_SHIFT 24U -+#define ROGUE_CR_META_SP_MSLVCTRL1_READY_CLRMSK 0xFEFFFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_READY_EN 0x01000000U -+#define ROGUE_CR_META_SP_MSLVCTRL1_DEFERRID_SHIFT 21U -+#define ROGUE_CR_META_SP_MSLVCTRL1_DEFERRID_CLRMSK 0xFF1FFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_DEFERR_SHIFT 20U -+#define ROGUE_CR_META_SP_MSLVCTRL1_DEFERR_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_DEFERR_EN 0x00100000U -+#define ROGUE_CR_META_SP_MSLVCTRL1_WR_ACTIVE_SHIFT 18U -+#define ROGUE_CR_META_SP_MSLVCTRL1_WR_ACTIVE_CLRMSK 0xFFFBFFFFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_WR_ACTIVE_EN 0x00040000U -+#define ROGUE_CR_META_SP_MSLVCTRL1_THREAD_SHIFT 4U -+#define ROGUE_CR_META_SP_MSLVCTRL1_THREAD_CLRMSK 0xFFFFFFCFU -+#define ROGUE_CR_META_SP_MSLVCTRL1_TRANS_SIZE_SHIFT 2U -+#define ROGUE_CR_META_SP_MSLVCTRL1_TRANS_SIZE_CLRMSK 0xFFFFFFF3U -+#define ROGUE_CR_META_SP_MSLVCTRL1_BYTE_ROUND_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVCTRL1_BYTE_ROUND_CLRMSK 0xFFFFFFFCU -+ -+/* Register ROGUE_CR_META_SP_MSLVHANDSHKE */ -+#define ROGUE_CR_META_SP_MSLVHANDSHKE 0x0A50U -+#define ROGUE_CR_META_SP_MSLVHANDSHKE_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_META_SP_MSLVHANDSHKE_INPUT_SHIFT 2U -+#define ROGUE_CR_META_SP_MSLVHANDSHKE_INPUT_CLRMSK 0xFFFFFFF3U -+#define ROGUE_CR_META_SP_MSLVHANDSHKE_OUTPUT_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVHANDSHKE_OUTPUT_CLRMSK 0xFFFFFFFCU -+ -+/* Register ROGUE_CR_META_SP_MSLVT0KICK */ -+#define ROGUE_CR_META_SP_MSLVT0KICK 0x0A80U -+#define ROGUE_CR_META_SP_MSLVT0KICK_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT0KICK_MSLVT0KICK_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT0KICK_MSLVT0KICK_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVT0KICKI */ -+#define ROGUE_CR_META_SP_MSLVT0KICKI 0x0A88U -+#define ROGUE_CR_META_SP_MSLVT0KICKI_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT0KICKI_MSLVT0KICKI_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT0KICKI_MSLVT0KICKI_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVT1KICK */ -+#define ROGUE_CR_META_SP_MSLVT1KICK 0x0A90U -+#define ROGUE_CR_META_SP_MSLVT1KICK_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT1KICK_MSLVT1KICK_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT1KICK_MSLVT1KICK_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVT1KICKI */ -+#define ROGUE_CR_META_SP_MSLVT1KICKI 0x0A98U -+#define ROGUE_CR_META_SP_MSLVT1KICKI_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT1KICKI_MSLVT1KICKI_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT1KICKI_MSLVT1KICKI_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVT2KICK */ -+#define ROGUE_CR_META_SP_MSLVT2KICK 0x0AA0U -+#define ROGUE_CR_META_SP_MSLVT2KICK_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT2KICK_MSLVT2KICK_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT2KICK_MSLVT2KICK_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVT2KICKI */ -+#define ROGUE_CR_META_SP_MSLVT2KICKI 0x0AA8U -+#define ROGUE_CR_META_SP_MSLVT2KICKI_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT2KICKI_MSLVT2KICKI_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT2KICKI_MSLVT2KICKI_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVT3KICK */ -+#define ROGUE_CR_META_SP_MSLVT3KICK 0x0AB0U -+#define ROGUE_CR_META_SP_MSLVT3KICK_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT3KICK_MSLVT3KICK_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT3KICK_MSLVT3KICK_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVT3KICKI */ -+#define ROGUE_CR_META_SP_MSLVT3KICKI 0x0AB8U -+#define ROGUE_CR_META_SP_MSLVT3KICKI_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_META_SP_MSLVT3KICKI_MSLVT3KICKI_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVT3KICKI_MSLVT3KICKI_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_META_SP_MSLVRST */ -+#define ROGUE_CR_META_SP_MSLVRST 0x0AC0U -+#define ROGUE_CR_META_SP_MSLVRST_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_META_SP_MSLVRST_SOFTRESET_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVRST_SOFTRESET_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_META_SP_MSLVRST_SOFTRESET_EN 0x00000001U -+ -+/* Register ROGUE_CR_META_SP_MSLVIRQSTATUS */ -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS 0x0AC8U -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS_MASKFULL 0x000000000000000CULL -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT3_SHIFT 3U -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT3_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT3_EN 0x00000008U -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT2_SHIFT 2U -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT2_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_META_SP_MSLVIRQSTATUS_TRIGVECT2_EN 0x00000004U -+ -+/* Register ROGUE_CR_META_SP_MSLVIRQENABLE */ -+#define ROGUE_CR_META_SP_MSLVIRQENABLE 0x0AD0U -+#define ROGUE_CR_META_SP_MSLVIRQENABLE_MASKFULL 0x000000000000000CULL -+#define ROGUE_CR_META_SP_MSLVIRQENABLE_EVENT1_SHIFT 3U -+#define ROGUE_CR_META_SP_MSLVIRQENABLE_EVENT1_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_META_SP_MSLVIRQENABLE_EVENT1_EN 0x00000008U -+#define ROGUE_CR_META_SP_MSLVIRQENABLE_EVENT0_SHIFT 2U -+#define ROGUE_CR_META_SP_MSLVIRQENABLE_EVENT0_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_META_SP_MSLVIRQENABLE_EVENT0_EN 0x00000004U -+ -+/* Register ROGUE_CR_META_SP_MSLVIRQLEVEL */ -+#define ROGUE_CR_META_SP_MSLVIRQLEVEL 0x0AD8U -+#define ROGUE_CR_META_SP_MSLVIRQLEVEL_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_META_SP_MSLVIRQLEVEL_MODE_SHIFT 0U -+#define ROGUE_CR_META_SP_MSLVIRQLEVEL_MODE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_META_SP_MSLVIRQLEVEL_MODE_EN 0x00000001U -+ -+/* Register ROGUE_CR_MTS_SCHEDULE */ -+#define ROGUE_CR_MTS_SCHEDULE 0x0B00U -+#define ROGUE_CR_MTS_SCHEDULE_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_SCHEDULE1 */ -+#define ROGUE_CR_MTS_SCHEDULE1 0x10B00U -+#define ROGUE_CR_MTS_SCHEDULE1_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE1_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE1_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE1_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE1_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE1_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE1_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE1_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE1_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE1_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE1_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE1_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE1_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE1_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE1_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE1_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE1_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE1_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE1_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE1_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_SCHEDULE2 */ -+#define ROGUE_CR_MTS_SCHEDULE2 0x20B00U -+#define ROGUE_CR_MTS_SCHEDULE2_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE2_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE2_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE2_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE2_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE2_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE2_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE2_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE2_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE2_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE2_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE2_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE2_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE2_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE2_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE2_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE2_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE2_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE2_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE2_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_SCHEDULE3 */ -+#define ROGUE_CR_MTS_SCHEDULE3 0x30B00U -+#define ROGUE_CR_MTS_SCHEDULE3_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE3_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE3_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE3_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE3_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE3_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE3_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE3_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE3_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE3_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE3_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE3_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE3_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE3_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE3_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE3_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE3_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE3_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE3_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE3_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_SCHEDULE4 */ -+#define ROGUE_CR_MTS_SCHEDULE4 0x40B00U -+#define ROGUE_CR_MTS_SCHEDULE4_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE4_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE4_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE4_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE4_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE4_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE4_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE4_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE4_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE4_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE4_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE4_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE4_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE4_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE4_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE4_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE4_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE4_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE4_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE4_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_SCHEDULE5 */ -+#define ROGUE_CR_MTS_SCHEDULE5 0x50B00U -+#define ROGUE_CR_MTS_SCHEDULE5_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE5_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE5_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE5_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE5_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE5_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE5_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE5_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE5_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE5_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE5_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE5_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE5_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE5_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE5_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE5_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE5_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE5_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE5_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE5_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_SCHEDULE6 */ -+#define ROGUE_CR_MTS_SCHEDULE6 0x60B00U -+#define ROGUE_CR_MTS_SCHEDULE6_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE6_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE6_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE6_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE6_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE6_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE6_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE6_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE6_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE6_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE6_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE6_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE6_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE6_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE6_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE6_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE6_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE6_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE6_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE6_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_SCHEDULE7 */ -+#define ROGUE_CR_MTS_SCHEDULE7 0x70B00U -+#define ROGUE_CR_MTS_SCHEDULE7_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_MTS_SCHEDULE7_HOST_SHIFT 8U -+#define ROGUE_CR_MTS_SCHEDULE7_HOST_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_MTS_SCHEDULE7_HOST_BG_TIMER 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE7_HOST_HOST 0x00000100U -+#define ROGUE_CR_MTS_SCHEDULE7_PRIORITY_SHIFT 6U -+#define ROGUE_CR_MTS_SCHEDULE7_PRIORITY_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_MTS_SCHEDULE7_PRIORITY_PRT0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE7_PRIORITY_PRT1 0x00000040U -+#define ROGUE_CR_MTS_SCHEDULE7_PRIORITY_PRT2 0x00000080U -+#define ROGUE_CR_MTS_SCHEDULE7_PRIORITY_PRT3 0x000000C0U -+#define ROGUE_CR_MTS_SCHEDULE7_CONTEXT_SHIFT 5U -+#define ROGUE_CR_MTS_SCHEDULE7_CONTEXT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SCHEDULE7_CONTEXT_BGCTX 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE7_CONTEXT_INTCTX 0x00000020U -+#define ROGUE_CR_MTS_SCHEDULE7_TASK_SHIFT 4U -+#define ROGUE_CR_MTS_SCHEDULE7_TASK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SCHEDULE7_TASK_NON_COUNTED 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE7_TASK_COUNTED 0x00000010U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_CLRMSK 0xFFFFFFF0U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM0 0x00000000U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM1 0x00000001U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM2 0x00000002U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM3 0x00000003U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM4 0x00000004U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM5 0x00000005U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM6 0x00000006U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM7 0x00000007U -+#define ROGUE_CR_MTS_SCHEDULE7_DM_DM_ALL 0x0000000FU -+ -+/* Register ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC */ -+#define ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC 0x0B30U -+#define ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC_DM_ASSOC_SHIFT 0U -+#define ROGUE_CR_MTS_BGCTX_THREAD0_DM_ASSOC_DM_ASSOC_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC */ -+#define ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC 0x0B38U -+#define ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC_DM_ASSOC_SHIFT 0U -+#define ROGUE_CR_MTS_BGCTX_THREAD1_DM_ASSOC_DM_ASSOC_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC */ -+#define ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC 0x0B40U -+#define ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC_DM_ASSOC_SHIFT 0U -+#define ROGUE_CR_MTS_INTCTX_THREAD0_DM_ASSOC_DM_ASSOC_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC */ -+#define ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC 0x0B48U -+#define ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC_DM_ASSOC_SHIFT 0U -+#define ROGUE_CR_MTS_INTCTX_THREAD1_DM_ASSOC_DM_ASSOC_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG */ -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG 0x0B50U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG__S7_TOP__MASKFULL 0x000FF0FFFFFFF701ULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_MASKFULL 0x0000FFFFFFFFF001ULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_PC_BASE_SHIFT 44U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_PC_BASE_CLRMSK 0xFFFF0FFFFFFFFFFFULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG__S7_TOP__FENCE_PC_BASE_SHIFT 44U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG__S7_TOP__FENCE_PC_BASE_CLRMSK 0xFFF00FFFFFFFFFFFULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_DM_SHIFT 40U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_DM_CLRMSK 0xFFFFF0FFFFFFFFFFULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_ADDR_SHIFT 12U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_PERSISTENCE_SHIFT 9U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_PERSISTENCE_CLRMSK 0xFFFFFFFFFFFFF9FFULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_SLC_COHERENT_SHIFT 8U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_SLC_COHERENT_CLRMSK 0xFFFFFFFFFFFFFEFFULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_FENCE_SLC_COHERENT_EN 0x0000000000000100ULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_IDLE_CTRL_SHIFT 0U -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_IDLE_CTRL_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_IDLE_CTRL_META 0x0000000000000000ULL -+#define ROGUE_CR_MTS_GARTEN_WRAPPER_CONFIG_IDLE_CTRL_MTS 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MTS_DM0_INTERRUPT_ENABLE */ -+#define ROGUE_CR_MTS_DM0_INTERRUPT_ENABLE 0x0B58U -+#define ROGUE_CR_MTS_DM0_INTERRUPT_ENABLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MTS_DM0_INTERRUPT_ENABLE_INT_ENABLE_SHIFT 0U -+#define ROGUE_CR_MTS_DM0_INTERRUPT_ENABLE_INT_ENABLE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_MTS_DM1_INTERRUPT_ENABLE */ -+#define ROGUE_CR_MTS_DM1_INTERRUPT_ENABLE 0x0B60U -+#define ROGUE_CR_MTS_DM1_INTERRUPT_ENABLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MTS_DM1_INTERRUPT_ENABLE_INT_ENABLE_SHIFT 0U -+#define ROGUE_CR_MTS_DM1_INTERRUPT_ENABLE_INT_ENABLE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_MTS_DM2_INTERRUPT_ENABLE */ -+#define ROGUE_CR_MTS_DM2_INTERRUPT_ENABLE 0x0B68U -+#define ROGUE_CR_MTS_DM2_INTERRUPT_ENABLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MTS_DM2_INTERRUPT_ENABLE_INT_ENABLE_SHIFT 0U -+#define ROGUE_CR_MTS_DM2_INTERRUPT_ENABLE_INT_ENABLE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_MTS_DM3_INTERRUPT_ENABLE */ -+#define ROGUE_CR_MTS_DM3_INTERRUPT_ENABLE 0x0B70U -+#define ROGUE_CR_MTS_DM3_INTERRUPT_ENABLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MTS_DM3_INTERRUPT_ENABLE_INT_ENABLE_SHIFT 0U -+#define ROGUE_CR_MTS_DM3_INTERRUPT_ENABLE_INT_ENABLE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_MTS_DM4_INTERRUPT_ENABLE */ -+#define ROGUE_CR_MTS_DM4_INTERRUPT_ENABLE 0x0B78U -+#define ROGUE_CR_MTS_DM4_INTERRUPT_ENABLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MTS_DM4_INTERRUPT_ENABLE_INT_ENABLE_SHIFT 0U -+#define ROGUE_CR_MTS_DM4_INTERRUPT_ENABLE_INT_ENABLE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_MTS_DM5_INTERRUPT_ENABLE */ -+#define ROGUE_CR_MTS_DM5_INTERRUPT_ENABLE 0x0B80U -+#define ROGUE_CR_MTS_DM5_INTERRUPT_ENABLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MTS_DM5_INTERRUPT_ENABLE_INT_ENABLE_SHIFT 0U -+#define ROGUE_CR_MTS_DM5_INTERRUPT_ENABLE_INT_ENABLE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_MTS_INTCTX */ -+#define ROGUE_CR_MTS_INTCTX 0x0B98U -+#define ROGUE_CR_MTS_INTCTX_MASKFULL 0x000000003FFFFFFFULL -+#define ROGUE_CR_MTS_INTCTX_DM_HOST_SCHEDULE_SHIFT 22U -+#define ROGUE_CR_MTS_INTCTX_DM_HOST_SCHEDULE_CLRMSK 0xC03FFFFFU -+#define ROGUE_CR_MTS_INTCTX_DM_PTR_SHIFT 18U -+#define ROGUE_CR_MTS_INTCTX_DM_PTR_CLRMSK 0xFFC3FFFFU -+#define ROGUE_CR_MTS_INTCTX_THREAD_ACTIVE_SHIFT 16U -+#define ROGUE_CR_MTS_INTCTX_THREAD_ACTIVE_CLRMSK 0xFFFCFFFFU -+#define ROGUE_CR_MTS_INTCTX_DM_TIMER_SCHEDULE_SHIFT 8U -+#define ROGUE_CR_MTS_INTCTX_DM_TIMER_SCHEDULE_CLRMSK 0xFFFF00FFU -+#define ROGUE_CR_MTS_INTCTX_DM_INTERRUPT_SCHEDULE_SHIFT 0U -+#define ROGUE_CR_MTS_INTCTX_DM_INTERRUPT_SCHEDULE_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_MTS_BGCTX */ -+#define ROGUE_CR_MTS_BGCTX 0x0BA0U -+#define ROGUE_CR_MTS_BGCTX_MASKFULL 0x0000000000003FFFULL -+#define ROGUE_CR_MTS_BGCTX_DM_PTR_SHIFT 10U -+#define ROGUE_CR_MTS_BGCTX_DM_PTR_CLRMSK 0xFFFFC3FFU -+#define ROGUE_CR_MTS_BGCTX_THREAD_ACTIVE_SHIFT 8U -+#define ROGUE_CR_MTS_BGCTX_THREAD_ACTIVE_CLRMSK 0xFFFFFCFFU -+#define ROGUE_CR_MTS_BGCTX_DM_NONCOUNTED_SCHEDULE_SHIFT 0U -+#define ROGUE_CR_MTS_BGCTX_DM_NONCOUNTED_SCHEDULE_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE */ -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE 0x0BA8U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM7_SHIFT 56U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM7_CLRMSK 0x00FFFFFFFFFFFFFFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM6_SHIFT 48U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM6_CLRMSK 0xFF00FFFFFFFFFFFFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM5_SHIFT 40U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM5_CLRMSK 0xFFFF00FFFFFFFFFFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM4_SHIFT 32U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM4_CLRMSK 0xFFFFFF00FFFFFFFFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM3_SHIFT 24U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM3_CLRMSK 0xFFFFFFFF00FFFFFFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM2_SHIFT 16U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM2_CLRMSK 0xFFFFFFFFFF00FFFFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM1_SHIFT 8U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM1_CLRMSK 0xFFFFFFFFFFFF00FFULL -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM0_SHIFT 0U -+#define ROGUE_CR_MTS_BGCTX_COUNTED_SCHEDULE_DM0_CLRMSK 0xFFFFFFFFFFFFFF00ULL -+ -+/* Register ROGUE_CR_MTS_GPU_INT_STATUS */ -+#define ROGUE_CR_MTS_GPU_INT_STATUS 0x0BB0U -+#define ROGUE_CR_MTS_GPU_INT_STATUS_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MTS_GPU_INT_STATUS_STATUS_SHIFT 0U -+#define ROGUE_CR_MTS_GPU_INT_STATUS_STATUS_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_MTS_SCHEDULE_ENABLE */ -+#define ROGUE_CR_MTS_SCHEDULE_ENABLE 0x0BC8U -+#define ROGUE_CR_MTS_SCHEDULE_ENABLE_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_MTS_SCHEDULE_ENABLE_MASK_SHIFT 0U -+#define ROGUE_CR_MTS_SCHEDULE_ENABLE_MASK_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_IRQ_OS0_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS0_EVENT_STATUS 0x0BD8U -+#define ROGUE_CR_IRQ_OS0_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS0_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS0_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS0_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS0_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS0_EVENT_CLEAR 0x0BE8U -+#define ROGUE_CR_IRQ_OS0_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS0_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS0_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS0_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS1_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS1_EVENT_STATUS 0x10BD8U -+#define ROGUE_CR_IRQ_OS1_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS1_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS1_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS1_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS1_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS1_EVENT_CLEAR 0x10BE8U -+#define ROGUE_CR_IRQ_OS1_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS1_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS1_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS1_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS2_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS2_EVENT_STATUS 0x20BD8U -+#define ROGUE_CR_IRQ_OS2_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS2_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS2_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS2_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS2_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS2_EVENT_CLEAR 0x20BE8U -+#define ROGUE_CR_IRQ_OS2_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS2_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS2_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS2_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS3_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS3_EVENT_STATUS 0x30BD8U -+#define ROGUE_CR_IRQ_OS3_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS3_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS3_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS3_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS3_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS3_EVENT_CLEAR 0x30BE8U -+#define ROGUE_CR_IRQ_OS3_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS3_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS3_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS3_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS4_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS4_EVENT_STATUS 0x40BD8U -+#define ROGUE_CR_IRQ_OS4_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS4_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS4_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS4_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS4_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS4_EVENT_CLEAR 0x40BE8U -+#define ROGUE_CR_IRQ_OS4_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS4_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS4_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS4_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS5_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS5_EVENT_STATUS 0x50BD8U -+#define ROGUE_CR_IRQ_OS5_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS5_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS5_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS5_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS5_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS5_EVENT_CLEAR 0x50BE8U -+#define ROGUE_CR_IRQ_OS5_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS5_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS5_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS5_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS6_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS6_EVENT_STATUS 0x60BD8U -+#define ROGUE_CR_IRQ_OS6_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS6_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS6_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS6_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS6_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS6_EVENT_CLEAR 0x60BE8U -+#define ROGUE_CR_IRQ_OS6_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS6_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS6_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS6_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS7_EVENT_STATUS */ -+#define ROGUE_CR_IRQ_OS7_EVENT_STATUS 0x70BD8U -+#define ROGUE_CR_IRQ_OS7_EVENT_STATUS_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS7_EVENT_STATUS_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS7_EVENT_STATUS_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS7_EVENT_STATUS_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_IRQ_OS7_EVENT_CLEAR */ -+#define ROGUE_CR_IRQ_OS7_EVENT_CLEAR 0x70BE8U -+#define ROGUE_CR_IRQ_OS7_EVENT_CLEAR_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_IRQ_OS7_EVENT_CLEAR_SOURCE_SHIFT 0U -+#define ROGUE_CR_IRQ_OS7_EVENT_CLEAR_SOURCE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_IRQ_OS7_EVENT_CLEAR_SOURCE_EN 0x00000001U -+ -+/* Register ROGUE_CR_META_BOOT */ -+#define ROGUE_CR_META_BOOT 0x0BF8U -+#define ROGUE_CR_META_BOOT_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_META_BOOT_MODE_SHIFT 0U -+#define ROGUE_CR_META_BOOT_MODE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_META_BOOT_MODE_EN 0x00000001U -+ -+/* Register ROGUE_CR_GARTEN_SLC */ -+#define ROGUE_CR_GARTEN_SLC 0x0BB8U -+#define ROGUE_CR_GARTEN_SLC_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_GARTEN_SLC_FORCE_COHERENCY_SHIFT 0U -+#define ROGUE_CR_GARTEN_SLC_FORCE_COHERENCY_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_GARTEN_SLC_FORCE_COHERENCY_EN 0x00000001U -+ -+/* Register ROGUE_CR_PPP */ -+#define ROGUE_CR_PPP 0x0CD0U -+#define ROGUE_CR_PPP_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PPP_CHECKSUM_SHIFT 0U -+#define ROGUE_CR_PPP_CHECKSUM_CLRMSK 0x00000000U -+ -+#define ROGUE_CR_ISP_RENDER_DIR_TYPE_MASK 0x00000003U -+/* Top-left to bottom-right */ -+#define ROGUE_CR_ISP_RENDER_DIR_TYPE_TL2BR 0x00000000U -+/* Top-right to bottom-left */ -+#define ROGUE_CR_ISP_RENDER_DIR_TYPE_TR2BL 0x00000001U -+/* Bottom-left to top-right */ -+#define ROGUE_CR_ISP_RENDER_DIR_TYPE_BL2TR 0x00000002U -+/* Bottom-right to top-left */ -+#define ROGUE_CR_ISP_RENDER_DIR_TYPE_BR2TL 0x00000003U -+ -+#define ROGUE_CR_ISP_RENDER_MODE_TYPE_MASK 0x00000003U -+/* Normal render */ -+#define ROGUE_CR_ISP_RENDER_MODE_TYPE_NORM 0x00000000U -+/* Fast 2D render */ -+#define ROGUE_CR_ISP_RENDER_MODE_TYPE_FAST_2D 0x00000002U -+/* Fast scale render */ -+#define ROGUE_CR_ISP_RENDER_MODE_TYPE_FAST_SCALE 0x00000003U -+ -+/* Register ROGUE_CR_ISP_RENDER */ -+#define ROGUE_CR_ISP_RENDER 0x0F08U -+#define ROGUE_CR_ISP_RENDER_MASKFULL 0x00000000000001FFULL -+#define ROGUE_CR_ISP_RENDER_FAST_RENDER_FORCE_PROTECT_SHIFT 8U -+#define ROGUE_CR_ISP_RENDER_FAST_RENDER_FORCE_PROTECT_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_ISP_RENDER_FAST_RENDER_FORCE_PROTECT_EN 0x00000100U -+#define ROGUE_CR_ISP_RENDER_PROCESS_PROTECTED_TILES_SHIFT 7U -+#define ROGUE_CR_ISP_RENDER_PROCESS_PROTECTED_TILES_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_ISP_RENDER_PROCESS_PROTECTED_TILES_EN 0x00000080U -+#define ROGUE_CR_ISP_RENDER_PROCESS_UNPROTECTED_TILES_SHIFT 6U -+#define ROGUE_CR_ISP_RENDER_PROCESS_UNPROTECTED_TILES_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_ISP_RENDER_PROCESS_UNPROTECTED_TILES_EN 0x00000040U -+#define ROGUE_CR_ISP_RENDER_DISABLE_EOMT_SHIFT 5U -+#define ROGUE_CR_ISP_RENDER_DISABLE_EOMT_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_ISP_RENDER_DISABLE_EOMT_EN 0x00000020U -+#define ROGUE_CR_ISP_RENDER_RESUME_SHIFT 4U -+#define ROGUE_CR_ISP_RENDER_RESUME_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_ISP_RENDER_RESUME_EN 0x00000010U -+#define ROGUE_CR_ISP_RENDER_DIR_SHIFT 2U -+#define ROGUE_CR_ISP_RENDER_DIR_CLRMSK 0xFFFFFFF3U -+#define ROGUE_CR_ISP_RENDER_DIR_TL2BR 0x00000000U -+#define ROGUE_CR_ISP_RENDER_DIR_TR2BL 0x00000004U -+#define ROGUE_CR_ISP_RENDER_DIR_BL2TR 0x00000008U -+#define ROGUE_CR_ISP_RENDER_DIR_BR2TL 0x0000000CU -+#define ROGUE_CR_ISP_RENDER_MODE_SHIFT 0U -+#define ROGUE_CR_ISP_RENDER_MODE_CLRMSK 0xFFFFFFFCU -+#define ROGUE_CR_ISP_RENDER_MODE_NORM 0x00000000U -+#define ROGUE_CR_ISP_RENDER_MODE_FAST_2D 0x00000002U -+#define ROGUE_CR_ISP_RENDER_MODE_FAST_SCALE 0x00000003U -+ -+/* Register ROGUE_CR_ISP_CTL */ -+#define ROGUE_CR_ISP_CTL 0x0F38U -+#define ROGUE_CR_ISP_CTL_MASKFULL 0x00000000FFFFF3FFULL -+#define ROGUE_CR_ISP_CTL_SKIP_INIT_HDRS_SHIFT 31U -+#define ROGUE_CR_ISP_CTL_SKIP_INIT_HDRS_CLRMSK 0x7FFFFFFFU -+#define ROGUE_CR_ISP_CTL_SKIP_INIT_HDRS_EN 0x80000000U -+#define ROGUE_CR_ISP_CTL_LINE_STYLE_SHIFT 30U -+#define ROGUE_CR_ISP_CTL_LINE_STYLE_CLRMSK 0xBFFFFFFFU -+#define ROGUE_CR_ISP_CTL_LINE_STYLE_EN 0x40000000U -+#define ROGUE_CR_ISP_CTL_LINE_STYLE_PIX_SHIFT 29U -+#define ROGUE_CR_ISP_CTL_LINE_STYLE_PIX_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_ISP_CTL_LINE_STYLE_PIX_EN 0x20000000U -+#define ROGUE_CR_ISP_CTL_PAIR_TILES_VERT_SHIFT 28U -+#define ROGUE_CR_ISP_CTL_PAIR_TILES_VERT_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_ISP_CTL_PAIR_TILES_VERT_EN 0x10000000U -+#define ROGUE_CR_ISP_CTL_PAIR_TILES_SHIFT 27U -+#define ROGUE_CR_ISP_CTL_PAIR_TILES_CLRMSK 0xF7FFFFFFU -+#define ROGUE_CR_ISP_CTL_PAIR_TILES_EN 0x08000000U -+#define ROGUE_CR_ISP_CTL_CREQ_BUF_EN_SHIFT 26U -+#define ROGUE_CR_ISP_CTL_CREQ_BUF_EN_CLRMSK 0xFBFFFFFFU -+#define ROGUE_CR_ISP_CTL_CREQ_BUF_EN_EN 0x04000000U -+#define ROGUE_CR_ISP_CTL_TILE_AGE_EN_SHIFT 25U -+#define ROGUE_CR_ISP_CTL_TILE_AGE_EN_CLRMSK 0xFDFFFFFFU -+#define ROGUE_CR_ISP_CTL_TILE_AGE_EN_EN 0x02000000U -+#define ROGUE_CR_ISP_CTL_ISP_SAMPLE_POS_MODE_SHIFT 23U -+#define ROGUE_CR_ISP_CTL_ISP_SAMPLE_POS_MODE_CLRMSK 0xFE7FFFFFU -+#define ROGUE_CR_ISP_CTL_ISP_SAMPLE_POS_MODE_DX9 0x00000000U -+#define ROGUE_CR_ISP_CTL_ISP_SAMPLE_POS_MODE_DX10 0x00800000U -+#define ROGUE_CR_ISP_CTL_ISP_SAMPLE_POS_MODE_OGL 0x01000000U -+#define ROGUE_CR_ISP_CTL_NUM_TILES_PER_USC_SHIFT 21U -+#define ROGUE_CR_ISP_CTL_NUM_TILES_PER_USC_CLRMSK 0xFF9FFFFFU -+#define ROGUE_CR_ISP_CTL_DBIAS_IS_INT_SHIFT 20U -+#define ROGUE_CR_ISP_CTL_DBIAS_IS_INT_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_ISP_CTL_DBIAS_IS_INT_EN 0x00100000U -+#define ROGUE_CR_ISP_CTL_OVERLAP_CHECK_MODE_SHIFT 19U -+#define ROGUE_CR_ISP_CTL_OVERLAP_CHECK_MODE_CLRMSK 0xFFF7FFFFU -+#define ROGUE_CR_ISP_CTL_OVERLAP_CHECK_MODE_EN 0x00080000U -+#define ROGUE_CR_ISP_CTL_PT_UPFRONT_DEPTH_DISABLE_SHIFT 18U -+#define ROGUE_CR_ISP_CTL_PT_UPFRONT_DEPTH_DISABLE_CLRMSK 0xFFFBFFFFU -+#define ROGUE_CR_ISP_CTL_PT_UPFRONT_DEPTH_DISABLE_EN 0x00040000U -+#define ROGUE_CR_ISP_CTL_PROCESS_EMPTY_TILES_SHIFT 17U -+#define ROGUE_CR_ISP_CTL_PROCESS_EMPTY_TILES_CLRMSK 0xFFFDFFFFU -+#define ROGUE_CR_ISP_CTL_PROCESS_EMPTY_TILES_EN 0x00020000U -+#define ROGUE_CR_ISP_CTL_SAMPLE_POS_SHIFT 16U -+#define ROGUE_CR_ISP_CTL_SAMPLE_POS_CLRMSK 0xFFFEFFFFU -+#define ROGUE_CR_ISP_CTL_SAMPLE_POS_EN 0x00010000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_SHIFT 12U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_CLRMSK 0xFFFF0FFFU -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_ONE 0x00000000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_TWO 0x00001000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_THREE 0x00002000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_FOUR 0x00003000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_FIVE 0x00004000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_SIX 0x00005000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_SEVEN 0x00006000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_EIGHT 0x00007000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_NINE 0x00008000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_TEN 0x00009000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_ELEVEN 0x0000A000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_TWELVE 0x0000B000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_THIRTEEN 0x0000C000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_FOURTEEN 0x0000D000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_FIFTEEN 0x0000E000U -+#define ROGUE_CR_ISP_CTL_PIPE_ENABLE_PIPE_SIXTEEN 0x0000F000U -+#define ROGUE_CR_ISP_CTL_VALID_ID_SHIFT 4U -+#define ROGUE_CR_ISP_CTL_VALID_ID_CLRMSK 0xFFFFFC0FU -+#define ROGUE_CR_ISP_CTL_UPASS_START_SHIFT 0U -+#define ROGUE_CR_ISP_CTL_UPASS_START_CLRMSK 0xFFFFFFF0U -+ -+/* Register ROGUE_CR_ISP_STATUS */ -+#define ROGUE_CR_ISP_STATUS 0x1038U -+#define ROGUE_CR_ISP_STATUS_MASKFULL 0x0000000000000007ULL -+#define ROGUE_CR_ISP_STATUS_SPLIT_MAX_SHIFT 2U -+#define ROGUE_CR_ISP_STATUS_SPLIT_MAX_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_ISP_STATUS_SPLIT_MAX_EN 0x00000004U -+#define ROGUE_CR_ISP_STATUS_ACTIVE_SHIFT 1U -+#define ROGUE_CR_ISP_STATUS_ACTIVE_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_ISP_STATUS_ACTIVE_EN 0x00000002U -+#define ROGUE_CR_ISP_STATUS_EOR_SHIFT 0U -+#define ROGUE_CR_ISP_STATUS_EOR_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_ISP_STATUS_EOR_EN 0x00000001U -+ -+/* Register group: ROGUE_CR_ISP_XTP_RESUME, with 64 repeats */ -+#define ROGUE_CR_ISP_XTP_RESUME_REPEATCOUNT 64U -+/* Register ROGUE_CR_ISP_XTP_RESUME0 */ -+#define ROGUE_CR_ISP_XTP_RESUME0 0x3A00U -+#define ROGUE_CR_ISP_XTP_RESUME0_MASKFULL 0x00000000003FF3FFULL -+#define ROGUE_CR_ISP_XTP_RESUME0_TILE_X_SHIFT 12U -+#define ROGUE_CR_ISP_XTP_RESUME0_TILE_X_CLRMSK 0xFFC00FFFU -+#define ROGUE_CR_ISP_XTP_RESUME0_TILE_Y_SHIFT 0U -+#define ROGUE_CR_ISP_XTP_RESUME0_TILE_Y_CLRMSK 0xFFFFFC00U -+ -+/* Register group: ROGUE_CR_ISP_XTP_STORE, with 32 repeats */ -+#define ROGUE_CR_ISP_XTP_STORE_REPEATCOUNT 32U -+/* Register ROGUE_CR_ISP_XTP_STORE0 */ -+#define ROGUE_CR_ISP_XTP_STORE0 0x3C00U -+#define ROGUE_CR_ISP_XTP_STORE0_MASKFULL 0x000000007F3FF3FFULL -+#define ROGUE_CR_ISP_XTP_STORE0_ACTIVE_SHIFT 30U -+#define ROGUE_CR_ISP_XTP_STORE0_ACTIVE_CLRMSK 0xBFFFFFFFU -+#define ROGUE_CR_ISP_XTP_STORE0_ACTIVE_EN 0x40000000U -+#define ROGUE_CR_ISP_XTP_STORE0_EOR_SHIFT 29U -+#define ROGUE_CR_ISP_XTP_STORE0_EOR_CLRMSK 0xDFFFFFFFU -+#define ROGUE_CR_ISP_XTP_STORE0_EOR_EN 0x20000000U -+#define ROGUE_CR_ISP_XTP_STORE0_TILE_LAST_SHIFT 28U -+#define ROGUE_CR_ISP_XTP_STORE0_TILE_LAST_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_ISP_XTP_STORE0_TILE_LAST_EN 0x10000000U -+#define ROGUE_CR_ISP_XTP_STORE0_MT_SHIFT 24U -+#define ROGUE_CR_ISP_XTP_STORE0_MT_CLRMSK 0xF0FFFFFFU -+#define ROGUE_CR_ISP_XTP_STORE0_TILE_X_SHIFT 12U -+#define ROGUE_CR_ISP_XTP_STORE0_TILE_X_CLRMSK 0xFFC00FFFU -+#define ROGUE_CR_ISP_XTP_STORE0_TILE_Y_SHIFT 0U -+#define ROGUE_CR_ISP_XTP_STORE0_TILE_Y_CLRMSK 0xFFFFFC00U -+ -+/* Register group: ROGUE_CR_BIF_CAT_BASE, with 8 repeats */ -+#define ROGUE_CR_BIF_CAT_BASE_REPEATCOUNT 8U -+/* Register ROGUE_CR_BIF_CAT_BASE0 */ -+#define ROGUE_CR_BIF_CAT_BASE0 0x1200U -+#define ROGUE_CR_BIF_CAT_BASE0_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE0_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE0_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE0_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE0_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE1 */ -+#define ROGUE_CR_BIF_CAT_BASE1 0x1208U -+#define ROGUE_CR_BIF_CAT_BASE1_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE1_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE1_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE1_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE1_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE2 */ -+#define ROGUE_CR_BIF_CAT_BASE2 0x1210U -+#define ROGUE_CR_BIF_CAT_BASE2_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE2_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE2_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE2_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE2_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE3 */ -+#define ROGUE_CR_BIF_CAT_BASE3 0x1218U -+#define ROGUE_CR_BIF_CAT_BASE3_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE3_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE3_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE3_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE3_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE4 */ -+#define ROGUE_CR_BIF_CAT_BASE4 0x1220U -+#define ROGUE_CR_BIF_CAT_BASE4_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE4_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE4_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE4_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE4_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE5 */ -+#define ROGUE_CR_BIF_CAT_BASE5 0x1228U -+#define ROGUE_CR_BIF_CAT_BASE5_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE5_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE5_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE5_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE5_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE6 */ -+#define ROGUE_CR_BIF_CAT_BASE6 0x1230U -+#define ROGUE_CR_BIF_CAT_BASE6_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE6_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE6_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE6_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE6_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE7 */ -+#define ROGUE_CR_BIF_CAT_BASE7 0x1238U -+#define ROGUE_CR_BIF_CAT_BASE7_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_BIF_CAT_BASE7_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE7_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_CAT_BASE7_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_CAT_BASE7_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_CAT_BASE_INDEX */ -+#define ROGUE_CR_BIF_CAT_BASE_INDEX 0x1240U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_MASKFULL 0x00070707073F0707ULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_RVTX_SHIFT 48U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_RVTX_CLRMSK 0xFFF8FFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_RAY_SHIFT 40U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_RAY_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_HOST_SHIFT 32U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_HOST_CLRMSK 0xFFFFFFF8FFFFFFFFULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_TLA_SHIFT 24U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_TLA_CLRMSK 0xFFFFFFFFF8FFFFFFULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_TDM_SHIFT 19U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_TDM_CLRMSK 0xFFFFFFFFFFC7FFFFULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_CDM_SHIFT 16U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_CDM_CLRMSK 0xFFFFFFFFFFF8FFFFULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_PIXEL_SHIFT 8U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_PIXEL_CLRMSK 0xFFFFFFFFFFFFF8FFULL -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_TA_SHIFT 0U -+#define ROGUE_CR_BIF_CAT_BASE_INDEX_TA_CLRMSK 0xFFFFFFFFFFFFFFF8ULL -+ -+/* Register ROGUE_CR_BIF_PM_CAT_BASE_VCE0 */ -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0 0x1248U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_MASKFULL 0x0FFFFFFFFFFFF003ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_INIT_PAGE_SHIFT 40U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_INIT_PAGE_CLRMSK 0xF00000FFFFFFFFFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_WRAP_SHIFT 1U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_WRAP_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_WRAP_EN 0x0000000000000002ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_VALID_SHIFT 0U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_VALID_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE0_VALID_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_BIF_PM_CAT_BASE_TE0 */ -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0 0x1250U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_MASKFULL 0x0FFFFFFFFFFFF003ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_INIT_PAGE_SHIFT 40U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_INIT_PAGE_CLRMSK 0xF00000FFFFFFFFFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_WRAP_SHIFT 1U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_WRAP_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_WRAP_EN 0x0000000000000002ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_VALID_SHIFT 0U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_VALID_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE0_VALID_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_BIF_PM_CAT_BASE_ALIST0 */ -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0 0x1260U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_MASKFULL 0x0FFFFFFFFFFFF003ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_INIT_PAGE_SHIFT 40U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_INIT_PAGE_CLRMSK 0xF00000FFFFFFFFFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_WRAP_SHIFT 1U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_WRAP_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_WRAP_EN 0x0000000000000002ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_VALID_SHIFT 0U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_VALID_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST0_VALID_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_BIF_PM_CAT_BASE_VCE1 */ -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1 0x1268U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_MASKFULL 0x0FFFFFFFFFFFF003ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_INIT_PAGE_SHIFT 40U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_INIT_PAGE_CLRMSK 0xF00000FFFFFFFFFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_WRAP_SHIFT 1U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_WRAP_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_WRAP_EN 0x0000000000000002ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_VALID_SHIFT 0U -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_VALID_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_VCE1_VALID_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_BIF_PM_CAT_BASE_TE1 */ -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1 0x1270U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_MASKFULL 0x0FFFFFFFFFFFF003ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_INIT_PAGE_SHIFT 40U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_INIT_PAGE_CLRMSK 0xF00000FFFFFFFFFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_WRAP_SHIFT 1U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_WRAP_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_WRAP_EN 0x0000000000000002ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_VALID_SHIFT 0U -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_VALID_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_TE1_VALID_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_BIF_PM_CAT_BASE_ALIST1 */ -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1 0x1280U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_MASKFULL 0x0FFFFFFFFFFFF003ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_INIT_PAGE_SHIFT 40U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_INIT_PAGE_CLRMSK 0xF00000FFFFFFFFFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_ADDR_SHIFT 12U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_WRAP_SHIFT 1U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_WRAP_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_WRAP_EN 0x0000000000000002ULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_VALID_SHIFT 0U -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_VALID_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_BIF_PM_CAT_BASE_ALIST1_VALID_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_BIF_MMU_ENTRY_STATUS */ -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS 0x1288U -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS_MASKFULL 0x000000FFFFFFF0F3ULL -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS_ADDRESS_SHIFT 12U -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS_ADDRESS_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS_CAT_BASE_SHIFT 4U -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS_CAT_BASE_CLRMSK 0xFFFFFFFFFFFFFF0FULL -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS_DATA_TYPE_SHIFT 0U -+#define ROGUE_CR_BIF_MMU_ENTRY_STATUS_DATA_TYPE_CLRMSK 0xFFFFFFFFFFFFFFFCULL -+ -+/* Register ROGUE_CR_BIF_MMU_ENTRY */ -+#define ROGUE_CR_BIF_MMU_ENTRY 0x1290U -+#define ROGUE_CR_BIF_MMU_ENTRY_MASKFULL 0x0000000000000003ULL -+#define ROGUE_CR_BIF_MMU_ENTRY_ENABLE_SHIFT 1U -+#define ROGUE_CR_BIF_MMU_ENTRY_ENABLE_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_BIF_MMU_ENTRY_ENABLE_EN 0x00000002U -+#define ROGUE_CR_BIF_MMU_ENTRY_PENDING_SHIFT 0U -+#define ROGUE_CR_BIF_MMU_ENTRY_PENDING_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_MMU_ENTRY_PENDING_EN 0x00000001U -+ -+/* Register ROGUE_CR_BIF_CTRL_INVAL */ -+#define ROGUE_CR_BIF_CTRL_INVAL 0x12A0U -+#define ROGUE_CR_BIF_CTRL_INVAL_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_BIF_CTRL_INVAL_TLB1_SHIFT 3U -+#define ROGUE_CR_BIF_CTRL_INVAL_TLB1_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_BIF_CTRL_INVAL_TLB1_EN 0x00000008U -+#define ROGUE_CR_BIF_CTRL_INVAL_PC_SHIFT 2U -+#define ROGUE_CR_BIF_CTRL_INVAL_PC_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BIF_CTRL_INVAL_PC_EN 0x00000004U -+#define ROGUE_CR_BIF_CTRL_INVAL_PD_SHIFT 1U -+#define ROGUE_CR_BIF_CTRL_INVAL_PD_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_BIF_CTRL_INVAL_PD_EN 0x00000002U -+#define ROGUE_CR_BIF_CTRL_INVAL_PT_SHIFT 0U -+#define ROGUE_CR_BIF_CTRL_INVAL_PT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_CTRL_INVAL_PT_EN 0x00000001U -+ -+/* Register ROGUE_CR_BIF_CTRL */ -+#define ROGUE_CR_BIF_CTRL 0x12A8U -+#define ROGUE_CR_BIF_CTRL__XE_MEM__MASKFULL 0x000000000000033FULL -+#define ROGUE_CR_BIF_CTRL_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_CPU_SHIFT 9U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_CPU_CLRMSK 0xFFFFFDFFU -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_CPU_EN 0x00000200U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF4_SHIFT 8U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF4_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF4_EN 0x00000100U -+#define ROGUE_CR_BIF_CTRL_ENABLE_MMU_QUEUE_BYPASS_SHIFT 7U -+#define ROGUE_CR_BIF_CTRL_ENABLE_MMU_QUEUE_BYPASS_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_BIF_CTRL_ENABLE_MMU_QUEUE_BYPASS_EN 0x00000080U -+#define ROGUE_CR_BIF_CTRL_ENABLE_MMU_AUTO_PREFETCH_SHIFT 6U -+#define ROGUE_CR_BIF_CTRL_ENABLE_MMU_AUTO_PREFETCH_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_BIF_CTRL_ENABLE_MMU_AUTO_PREFETCH_EN 0x00000040U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF3_SHIFT 5U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF3_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF3_EN 0x00000020U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF2_SHIFT 4U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF2_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF2_EN 0x00000010U -+#define ROGUE_CR_BIF_CTRL_PAUSE_BIF1_SHIFT 3U -+#define ROGUE_CR_BIF_CTRL_PAUSE_BIF1_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_BIF_CTRL_PAUSE_BIF1_EN 0x00000008U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_PM_SHIFT 2U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_PM_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_PM_EN 0x00000004U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF1_SHIFT 1U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF1_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF1_EN 0x00000002U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF0_SHIFT 0U -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF0_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_CTRL_PAUSE_MMU_BIF0_EN 0x00000001U -+ -+/* Register ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS */ -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS 0x12B0U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_MASKFULL 0x000000000000F775ULL -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_SHIFT 12U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_CLRMSK 0xFFFF0FFFU -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_SHIFT 8U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_CLRMSK 0xFFFFF8FFU -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_SHIFT 5U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_CLRMSK 0xFFFFFF9FU -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_SHIFT 4U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_EN 0x00000010U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_SHIFT 2U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_EN 0x00000004U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_SHIFT 0U -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_EN 0x00000001U -+ -+/* Register ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS */ -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS 0x12B8U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__MASKFULL 0x001FFFFFFFFFFFF0ULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_MASKFULL 0x0007FFFFFFFFFFF0ULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__RNW_SHIFT 52U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__RNW_CLRMSK 0xFFEFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__RNW_EN 0x0010000000000000ULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_RNW_SHIFT 50U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_RNW_CLRMSK 0xFFFBFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_RNW_EN 0x0004000000000000ULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__TAG_SB_SHIFT 46U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__TAG_SB_CLRMSK 0xFFF03FFFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_SHIFT 44U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_CLRMSK 0xFFFC0FFFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_SHIFT 40U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_CLRMSK 0xFFFFF0FFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__TAG_ID_SHIFT 40U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS__XE_MEM__TAG_ID_CLRMSK 0xFFFFC0FFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_SHIFT 4U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_CLRMSK 0xFFFFFF000000000FULL -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_ALIGNSHIFT 4U -+#define ROGUE_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS */ -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS 0x12C0U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_MASKFULL 0x000000000000F775ULL -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_CAT_BASE_SHIFT 12U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_CAT_BASE_CLRMSK 0xFFFF0FFFU -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_PAGE_SIZE_SHIFT 8U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_PAGE_SIZE_CLRMSK 0xFFFFF8FFU -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_DATA_TYPE_SHIFT 5U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_DATA_TYPE_CLRMSK 0xFFFFFF9FU -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_RO_SHIFT 4U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_RO_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_RO_EN 0x00000010U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_PM_META_RO_SHIFT 2U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_PM_META_RO_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_PM_META_RO_EN 0x00000004U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_SHIFT 0U -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_FAULT_BANK1_MMU_STATUS_FAULT_EN 0x00000001U -+ -+/* Register ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS */ -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS 0x12C8U -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_MASKFULL 0x0007FFFFFFFFFFF0ULL -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_RNW_SHIFT 50U -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_RNW_CLRMSK 0xFFFBFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_RNW_EN 0x0004000000000000ULL -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_TAG_SB_SHIFT 44U -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_TAG_SB_CLRMSK 0xFFFC0FFFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_TAG_ID_SHIFT 40U -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_TAG_ID_CLRMSK 0xFFFFF0FFFFFFFFFFULL -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_ADDRESS_SHIFT 4U -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_ADDRESS_CLRMSK 0xFFFFFF000000000FULL -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_ADDRESS_ALIGNSHIFT 4U -+#define ROGUE_CR_BIF_FAULT_BANK1_REQ_STATUS_ADDRESS_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_BIF_MMU_STATUS */ -+#define ROGUE_CR_BIF_MMU_STATUS 0x12D0U -+#define ROGUE_CR_BIF_MMU_STATUS__XE_MEM__MASKFULL 0x000000001FFFFFF7ULL -+#define ROGUE_CR_BIF_MMU_STATUS_MASKFULL 0x000000001FFFFFF7ULL -+#define ROGUE_CR_BIF_MMU_STATUS_PM_FAULT_SHIFT 28U -+#define ROGUE_CR_BIF_MMU_STATUS_PM_FAULT_CLRMSK 0xEFFFFFFFU -+#define ROGUE_CR_BIF_MMU_STATUS_PM_FAULT_EN 0x10000000U -+#define ROGUE_CR_BIF_MMU_STATUS_PC_DATA_SHIFT 20U -+#define ROGUE_CR_BIF_MMU_STATUS_PC_DATA_CLRMSK 0xF00FFFFFU -+#define ROGUE_CR_BIF_MMU_STATUS_PD_DATA_SHIFT 12U -+#define ROGUE_CR_BIF_MMU_STATUS_PD_DATA_CLRMSK 0xFFF00FFFU -+#define ROGUE_CR_BIF_MMU_STATUS_PT_DATA_SHIFT 4U -+#define ROGUE_CR_BIF_MMU_STATUS_PT_DATA_CLRMSK 0xFFFFF00FU -+#define ROGUE_CR_BIF_MMU_STATUS_STALLED_SHIFT 2U -+#define ROGUE_CR_BIF_MMU_STATUS_STALLED_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BIF_MMU_STATUS_STALLED_EN 0x00000004U -+#define ROGUE_CR_BIF_MMU_STATUS_PAUSED_SHIFT 1U -+#define ROGUE_CR_BIF_MMU_STATUS_PAUSED_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_BIF_MMU_STATUS_PAUSED_EN 0x00000002U -+#define ROGUE_CR_BIF_MMU_STATUS_BUSY_SHIFT 0U -+#define ROGUE_CR_BIF_MMU_STATUS_BUSY_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_MMU_STATUS_BUSY_EN 0x00000001U -+ -+/* Register group: ROGUE_CR_BIF_TILING_CFG, with 8 repeats */ -+#define ROGUE_CR_BIF_TILING_CFG_REPEATCOUNT 8U -+/* Register ROGUE_CR_BIF_TILING_CFG0 */ -+#define ROGUE_CR_BIF_TILING_CFG0 0x12D8U -+#define ROGUE_CR_BIF_TILING_CFG0_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG0_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG0_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG0_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG0_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG0_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG0_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG0_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG0_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG0_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG0_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG0_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG0_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG0_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_TILING_CFG1 */ -+#define ROGUE_CR_BIF_TILING_CFG1 0x12E0U -+#define ROGUE_CR_BIF_TILING_CFG1_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG1_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG1_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG1_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG1_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG1_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG1_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG1_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG1_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG1_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG1_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG1_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG1_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG1_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_TILING_CFG2 */ -+#define ROGUE_CR_BIF_TILING_CFG2 0x12E8U -+#define ROGUE_CR_BIF_TILING_CFG2_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG2_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG2_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG2_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG2_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG2_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG2_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG2_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG2_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG2_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG2_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG2_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG2_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG2_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_TILING_CFG3 */ -+#define ROGUE_CR_BIF_TILING_CFG3 0x12F0U -+#define ROGUE_CR_BIF_TILING_CFG3_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG3_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG3_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG3_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG3_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG3_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG3_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG3_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG3_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG3_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG3_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG3_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG3_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG3_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_TILING_CFG4 */ -+#define ROGUE_CR_BIF_TILING_CFG4 0x12F8U -+#define ROGUE_CR_BIF_TILING_CFG4_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG4_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG4_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG4_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG4_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG4_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG4_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG4_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG4_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG4_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG4_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG4_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG4_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG4_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_TILING_CFG5 */ -+#define ROGUE_CR_BIF_TILING_CFG5 0x1300U -+#define ROGUE_CR_BIF_TILING_CFG5_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG5_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG5_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG5_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG5_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG5_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG5_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG5_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG5_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG5_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG5_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG5_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG5_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG5_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_TILING_CFG6 */ -+#define ROGUE_CR_BIF_TILING_CFG6 0x1308U -+#define ROGUE_CR_BIF_TILING_CFG6_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG6_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG6_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG6_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG6_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG6_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG6_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG6_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG6_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG6_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG6_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG6_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG6_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG6_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_TILING_CFG7 */ -+#define ROGUE_CR_BIF_TILING_CFG7 0x1310U -+#define ROGUE_CR_BIF_TILING_CFG7_MASKFULL 0xFFFFFFFF0FFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG7_XSTRIDE_SHIFT 61U -+#define ROGUE_CR_BIF_TILING_CFG7_XSTRIDE_CLRMSK 0x1FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG7_ENABLE_SHIFT 60U -+#define ROGUE_CR_BIF_TILING_CFG7_ENABLE_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG7_ENABLE_EN 0x1000000000000000ULL -+#define ROGUE_CR_BIF_TILING_CFG7_MAX_ADDRESS_SHIFT 32U -+#define ROGUE_CR_BIF_TILING_CFG7_MAX_ADDRESS_CLRMSK 0xF0000000FFFFFFFFULL -+#define ROGUE_CR_BIF_TILING_CFG7_MAX_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG7_MAX_ADDRESS_ALIGNSIZE 4096U -+#define ROGUE_CR_BIF_TILING_CFG7_MIN_ADDRESS_SHIFT 0U -+#define ROGUE_CR_BIF_TILING_CFG7_MIN_ADDRESS_CLRMSK 0xFFFFFFFFF0000000ULL -+#define ROGUE_CR_BIF_TILING_CFG7_MIN_ADDRESS_ALIGNSHIFT 12U -+#define ROGUE_CR_BIF_TILING_CFG7_MIN_ADDRESS_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_BIF_READS_EXT_STATUS */ -+#define ROGUE_CR_BIF_READS_EXT_STATUS 0x1320U -+#define ROGUE_CR_BIF_READS_EXT_STATUS_MASKFULL 0x000000000FFFFFFFULL -+#define ROGUE_CR_BIF_READS_EXT_STATUS_MMU_SHIFT 16U -+#define ROGUE_CR_BIF_READS_EXT_STATUS_MMU_CLRMSK 0xF000FFFFU -+#define ROGUE_CR_BIF_READS_EXT_STATUS_BANK1_SHIFT 0U -+#define ROGUE_CR_BIF_READS_EXT_STATUS_BANK1_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_BIF_READS_INT_STATUS */ -+#define ROGUE_CR_BIF_READS_INT_STATUS 0x1328U -+#define ROGUE_CR_BIF_READS_INT_STATUS_MASKFULL 0x0000000007FFFFFFULL -+#define ROGUE_CR_BIF_READS_INT_STATUS_MMU_SHIFT 16U -+#define ROGUE_CR_BIF_READS_INT_STATUS_MMU_CLRMSK 0xF800FFFFU -+#define ROGUE_CR_BIF_READS_INT_STATUS_BANK1_SHIFT 0U -+#define ROGUE_CR_BIF_READS_INT_STATUS_BANK1_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_BIFPM_READS_INT_STATUS */ -+#define ROGUE_CR_BIFPM_READS_INT_STATUS 0x1330U -+#define ROGUE_CR_BIFPM_READS_INT_STATUS_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_BIFPM_READS_INT_STATUS_BANK0_SHIFT 0U -+#define ROGUE_CR_BIFPM_READS_INT_STATUS_BANK0_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_BIFPM_READS_EXT_STATUS */ -+#define ROGUE_CR_BIFPM_READS_EXT_STATUS 0x1338U -+#define ROGUE_CR_BIFPM_READS_EXT_STATUS_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_BIFPM_READS_EXT_STATUS_BANK0_SHIFT 0U -+#define ROGUE_CR_BIFPM_READS_EXT_STATUS_BANK0_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_BIFPM_STATUS_MMU */ -+#define ROGUE_CR_BIFPM_STATUS_MMU 0x1350U -+#define ROGUE_CR_BIFPM_STATUS_MMU_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_BIFPM_STATUS_MMU_REQUESTS_SHIFT 0U -+#define ROGUE_CR_BIFPM_STATUS_MMU_REQUESTS_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_BIF_STATUS_MMU */ -+#define ROGUE_CR_BIF_STATUS_MMU 0x1358U -+#define ROGUE_CR_BIF_STATUS_MMU_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_BIF_STATUS_MMU_REQUESTS_SHIFT 0U -+#define ROGUE_CR_BIF_STATUS_MMU_REQUESTS_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_BIF_FAULT_READ */ -+#define ROGUE_CR_BIF_FAULT_READ 0x13E0U -+#define ROGUE_CR_BIF_FAULT_READ_MASKFULL 0x000000FFFFFFFFF0ULL -+#define ROGUE_CR_BIF_FAULT_READ_ADDRESS_SHIFT 4U -+#define ROGUE_CR_BIF_FAULT_READ_ADDRESS_CLRMSK 0xFFFFFF000000000FULL -+#define ROGUE_CR_BIF_FAULT_READ_ADDRESS_ALIGNSHIFT 4U -+#define ROGUE_CR_BIF_FAULT_READ_ADDRESS_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS */ -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS 0x1430U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_MASKFULL 0x000000000000F775ULL -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_SHIFT 12U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_CLRMSK 0xFFFF0FFFU -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_SHIFT 8U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_CLRMSK 0xFFFFF8FFU -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_SHIFT 5U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_CLRMSK 0xFFFFFF9FU -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_SHIFT 4U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_EN 0x00000010U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_SHIFT 2U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_EN 0x00000004U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_SHIFT 0U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS_FAULT_EN 0x00000001U -+ -+/* Register ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS */ -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS 0x1438U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_MASKFULL 0x0007FFFFFFFFFFF0ULL -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_RNW_SHIFT 50U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_RNW_CLRMSK 0xFFFBFFFFFFFFFFFFULL -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_RNW_EN 0x0004000000000000ULL -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_SHIFT 44U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_CLRMSK 0xFFFC0FFFFFFFFFFFULL -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_SHIFT 40U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_CLRMSK 0xFFFFF0FFFFFFFFFFULL -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_SHIFT 4U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_CLRMSK 0xFFFFFF000000000FULL -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_ALIGNSHIFT 4U -+#define ROGUE_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_MCU_FENCE */ -+#define ROGUE_CR_MCU_FENCE 0x1740U -+#define ROGUE_CR_MCU_FENCE_MASKFULL 0x000007FFFFFFFFE0ULL -+#define ROGUE_CR_MCU_FENCE_DM_SHIFT 40U -+#define ROGUE_CR_MCU_FENCE_DM_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_MCU_FENCE_DM_VERTEX 0x0000000000000000ULL -+#define ROGUE_CR_MCU_FENCE_DM_PIXEL 0x0000010000000000ULL -+#define ROGUE_CR_MCU_FENCE_DM_COMPUTE 0x0000020000000000ULL -+#define ROGUE_CR_MCU_FENCE_DM_RAY_VERTEX 0x0000030000000000ULL -+#define ROGUE_CR_MCU_FENCE_DM_RAY 0x0000040000000000ULL -+#define ROGUE_CR_MCU_FENCE_DM_FASTRENDER 0x0000050000000000ULL -+#define ROGUE_CR_MCU_FENCE_ADDR_SHIFT 5U -+#define ROGUE_CR_MCU_FENCE_ADDR_CLRMSK 0xFFFFFF000000001FULL -+#define ROGUE_CR_MCU_FENCE_ADDR_ALIGNSHIFT 5U -+#define ROGUE_CR_MCU_FENCE_ADDR_ALIGNSIZE 32U -+ -+/* Register group: ROGUE_CR_SCRATCH, with 16 repeats */ -+#define ROGUE_CR_SCRATCH_REPEATCOUNT 16U -+/* Register ROGUE_CR_SCRATCH0 */ -+#define ROGUE_CR_SCRATCH0 0x1A00U -+#define ROGUE_CR_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH1 */ -+#define ROGUE_CR_SCRATCH1 0x1A08U -+#define ROGUE_CR_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH2 */ -+#define ROGUE_CR_SCRATCH2 0x1A10U -+#define ROGUE_CR_SCRATCH2_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH2_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH3 */ -+#define ROGUE_CR_SCRATCH3 0x1A18U -+#define ROGUE_CR_SCRATCH3_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH3_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH4 */ -+#define ROGUE_CR_SCRATCH4 0x1A20U -+#define ROGUE_CR_SCRATCH4_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH4_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH4_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH5 */ -+#define ROGUE_CR_SCRATCH5 0x1A28U -+#define ROGUE_CR_SCRATCH5_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH5_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH5_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH6 */ -+#define ROGUE_CR_SCRATCH6 0x1A30U -+#define ROGUE_CR_SCRATCH6_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH6_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH6_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH7 */ -+#define ROGUE_CR_SCRATCH7 0x1A38U -+#define ROGUE_CR_SCRATCH7_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH7_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH7_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH8 */ -+#define ROGUE_CR_SCRATCH8 0x1A40U -+#define ROGUE_CR_SCRATCH8_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH8_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH8_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH9 */ -+#define ROGUE_CR_SCRATCH9 0x1A48U -+#define ROGUE_CR_SCRATCH9_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH9_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH9_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH10 */ -+#define ROGUE_CR_SCRATCH10 0x1A50U -+#define ROGUE_CR_SCRATCH10_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH10_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH10_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH11 */ -+#define ROGUE_CR_SCRATCH11 0x1A58U -+#define ROGUE_CR_SCRATCH11_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH11_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH11_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH12 */ -+#define ROGUE_CR_SCRATCH12 0x1A60U -+#define ROGUE_CR_SCRATCH12_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH12_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH12_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH13 */ -+#define ROGUE_CR_SCRATCH13 0x1A68U -+#define ROGUE_CR_SCRATCH13_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH13_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH13_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH14 */ -+#define ROGUE_CR_SCRATCH14 0x1A70U -+#define ROGUE_CR_SCRATCH14_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH14_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH14_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SCRATCH15 */ -+#define ROGUE_CR_SCRATCH15 0x1A78U -+#define ROGUE_CR_SCRATCH15_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SCRATCH15_DATA_SHIFT 0U -+#define ROGUE_CR_SCRATCH15_DATA_CLRMSK 0x00000000U -+ -+/* Register group: ROGUE_CR_OS0_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS0_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS0_SCRATCH0 */ -+#define ROGUE_CR_OS0_SCRATCH0 0x1A80U -+#define ROGUE_CR_OS0_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS0_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS0_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS0_SCRATCH1 */ -+#define ROGUE_CR_OS0_SCRATCH1 0x1A88U -+#define ROGUE_CR_OS0_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS0_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS0_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS0_SCRATCH2 */ -+#define ROGUE_CR_OS0_SCRATCH2 0x1A90U -+#define ROGUE_CR_OS0_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS0_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS0_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS0_SCRATCH3 */ -+#define ROGUE_CR_OS0_SCRATCH3 0x1A98U -+#define ROGUE_CR_OS0_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS0_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS0_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register group: ROGUE_CR_OS1_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS1_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS1_SCRATCH0 */ -+#define ROGUE_CR_OS1_SCRATCH0 0x11A80U -+#define ROGUE_CR_OS1_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS1_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS1_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS1_SCRATCH1 */ -+#define ROGUE_CR_OS1_SCRATCH1 0x11A88U -+#define ROGUE_CR_OS1_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS1_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS1_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS1_SCRATCH2 */ -+#define ROGUE_CR_OS1_SCRATCH2 0x11A90U -+#define ROGUE_CR_OS1_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS1_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS1_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS1_SCRATCH3 */ -+#define ROGUE_CR_OS1_SCRATCH3 0x11A98U -+#define ROGUE_CR_OS1_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS1_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS1_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register group: ROGUE_CR_OS2_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS2_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS2_SCRATCH0 */ -+#define ROGUE_CR_OS2_SCRATCH0 0x21A80U -+#define ROGUE_CR_OS2_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS2_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS2_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS2_SCRATCH1 */ -+#define ROGUE_CR_OS2_SCRATCH1 0x21A88U -+#define ROGUE_CR_OS2_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS2_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS2_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS2_SCRATCH2 */ -+#define ROGUE_CR_OS2_SCRATCH2 0x21A90U -+#define ROGUE_CR_OS2_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS2_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS2_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS2_SCRATCH3 */ -+#define ROGUE_CR_OS2_SCRATCH3 0x21A98U -+#define ROGUE_CR_OS2_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS2_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS2_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register group: ROGUE_CR_OS3_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS3_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS3_SCRATCH0 */ -+#define ROGUE_CR_OS3_SCRATCH0 0x31A80U -+#define ROGUE_CR_OS3_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS3_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS3_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS3_SCRATCH1 */ -+#define ROGUE_CR_OS3_SCRATCH1 0x31A88U -+#define ROGUE_CR_OS3_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS3_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS3_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS3_SCRATCH2 */ -+#define ROGUE_CR_OS3_SCRATCH2 0x31A90U -+#define ROGUE_CR_OS3_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS3_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS3_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS3_SCRATCH3 */ -+#define ROGUE_CR_OS3_SCRATCH3 0x31A98U -+#define ROGUE_CR_OS3_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS3_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS3_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register group: ROGUE_CR_OS4_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS4_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS4_SCRATCH0 */ -+#define ROGUE_CR_OS4_SCRATCH0 0x41A80U -+#define ROGUE_CR_OS4_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS4_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS4_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS4_SCRATCH1 */ -+#define ROGUE_CR_OS4_SCRATCH1 0x41A88U -+#define ROGUE_CR_OS4_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS4_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS4_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS4_SCRATCH2 */ -+#define ROGUE_CR_OS4_SCRATCH2 0x41A90U -+#define ROGUE_CR_OS4_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS4_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS4_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS4_SCRATCH3 */ -+#define ROGUE_CR_OS4_SCRATCH3 0x41A98U -+#define ROGUE_CR_OS4_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS4_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS4_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register group: ROGUE_CR_OS5_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS5_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS5_SCRATCH0 */ -+#define ROGUE_CR_OS5_SCRATCH0 0x51A80U -+#define ROGUE_CR_OS5_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS5_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS5_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS5_SCRATCH1 */ -+#define ROGUE_CR_OS5_SCRATCH1 0x51A88U -+#define ROGUE_CR_OS5_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS5_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS5_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS5_SCRATCH2 */ -+#define ROGUE_CR_OS5_SCRATCH2 0x51A90U -+#define ROGUE_CR_OS5_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS5_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS5_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS5_SCRATCH3 */ -+#define ROGUE_CR_OS5_SCRATCH3 0x51A98U -+#define ROGUE_CR_OS5_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS5_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS5_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register group: ROGUE_CR_OS6_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS6_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS6_SCRATCH0 */ -+#define ROGUE_CR_OS6_SCRATCH0 0x61A80U -+#define ROGUE_CR_OS6_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS6_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS6_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS6_SCRATCH1 */ -+#define ROGUE_CR_OS6_SCRATCH1 0x61A88U -+#define ROGUE_CR_OS6_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS6_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS6_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS6_SCRATCH2 */ -+#define ROGUE_CR_OS6_SCRATCH2 0x61A90U -+#define ROGUE_CR_OS6_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS6_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS6_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS6_SCRATCH3 */ -+#define ROGUE_CR_OS6_SCRATCH3 0x61A98U -+#define ROGUE_CR_OS6_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS6_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS6_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register group: ROGUE_CR_OS7_SCRATCH, with 2 repeats */ -+#define ROGUE_CR_OS7_SCRATCH_REPEATCOUNT 2U -+/* Register ROGUE_CR_OS7_SCRATCH0 */ -+#define ROGUE_CR_OS7_SCRATCH0 0x71A80U -+#define ROGUE_CR_OS7_SCRATCH0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS7_SCRATCH0_DATA_SHIFT 0U -+#define ROGUE_CR_OS7_SCRATCH0_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS7_SCRATCH1 */ -+#define ROGUE_CR_OS7_SCRATCH1 0x71A88U -+#define ROGUE_CR_OS7_SCRATCH1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_OS7_SCRATCH1_DATA_SHIFT 0U -+#define ROGUE_CR_OS7_SCRATCH1_DATA_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OS7_SCRATCH2 */ -+#define ROGUE_CR_OS7_SCRATCH2 0x71A90U -+#define ROGUE_CR_OS7_SCRATCH2_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS7_SCRATCH2_DATA_SHIFT 0U -+#define ROGUE_CR_OS7_SCRATCH2_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_OS7_SCRATCH3 */ -+#define ROGUE_CR_OS7_SCRATCH3 0x71A98U -+#define ROGUE_CR_OS7_SCRATCH3_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_OS7_SCRATCH3_DATA_SHIFT 0U -+#define ROGUE_CR_OS7_SCRATCH3_DATA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_SPFILTER_SIGNAL_DESCR */ -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR 0x2700U -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_SIZE_SHIFT 0U -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_SIZE_CLRMSK 0xFFFF0000U -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_SIZE_ALIGNSHIFT 4U -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_SIZE_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_SPFILTER_SIGNAL_DESCR_MIN */ -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_MIN 0x2708U -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_MIN_MASKFULL 0x000000FFFFFFFFF0ULL -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_MIN_ADDR_SHIFT 4U -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_MIN_ADDR_CLRMSK 0xFFFFFF000000000FULL -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_MIN_ADDR_ALIGNSHIFT 4U -+#define ROGUE_CR_SPFILTER_SIGNAL_DESCR_MIN_ADDR_ALIGNSIZE 16U -+ -+/* Register group: ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG, with 16 repeats */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG_REPEATCOUNT 16U -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0 0x3000U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1 0x3008U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG1_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2 0x3010U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG2_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3 0x3018U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG3_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4 0x3020U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG4_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5 0x3028U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG5_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6 0x3030U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG6_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7 0x3038U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG7_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8 0x3040U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG8_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9 0x3048U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG9_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10 0x3050U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG10_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11 0x3058U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG11_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12 0x3060U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG12_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13 0x3068U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG13_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14 0x3070U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG14_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15 */ -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15 0x3078U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_MASKFULL 0x7FFFF7FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_TRUSTED_SHIFT 62U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_TRUSTED_CLRMSK 0xBFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_TRUSTED_EN 0x4000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_LOAD_STORE_EN_SHIFT 61U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_LOAD_STORE_EN_CLRMSK 0xDFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_LOAD_STORE_EN_EN 0x2000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_FETCH_EN_SHIFT 60U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_FETCH_EN_CLRMSK 0xEFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_FETCH_EN_EN 0x1000000000000000ULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_SIZE_SHIFT 44U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_SIZE_CLRMSK 0xF0000FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_CBASE_SHIFT 40U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_CBASE_CLRMSK 0xFFFFF8FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_DEVVADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_DEVVADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_DEVVADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG15_DEVVADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_BOOT */ -+#define ROGUE_CR_FWCORE_BOOT 0x3090U -+#define ROGUE_CR_FWCORE_BOOT_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_FWCORE_BOOT_ENABLE_SHIFT 0U -+#define ROGUE_CR_FWCORE_BOOT_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_BOOT_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_FWCORE_RESET_ADDR */ -+#define ROGUE_CR_FWCORE_RESET_ADDR 0x3098U -+#define ROGUE_CR_FWCORE_RESET_ADDR_MASKFULL 0x00000000FFFFFFFEULL -+#define ROGUE_CR_FWCORE_RESET_ADDR_ADDR_SHIFT 1U -+#define ROGUE_CR_FWCORE_RESET_ADDR_ADDR_CLRMSK 0x00000001U -+#define ROGUE_CR_FWCORE_RESET_ADDR_ADDR_ALIGNSHIFT 1U -+#define ROGUE_CR_FWCORE_RESET_ADDR_ADDR_ALIGNSIZE 2U -+ -+/* Register ROGUE_CR_FWCORE_WRAPPER_NMI_ADDR */ -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_ADDR 0x30A0U -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_ADDR_MASKFULL 0x00000000FFFFFFFEULL -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_ADDR_ADDR_SHIFT 1U -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_ADDR_ADDR_CLRMSK 0x00000001U -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_ADDR_ADDR_ALIGNSHIFT 1U -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_ADDR_ADDR_ALIGNSIZE 2U -+ -+/* Register ROGUE_CR_FWCORE_WRAPPER_NMI_EVENT */ -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_EVENT 0x30A8U -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_EVENT_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_EVENT_TRIGGER_EN_SHIFT 0U -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_EVENT_TRIGGER_EN_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_WRAPPER_NMI_EVENT_TRIGGER_EN_EN 0x00000001U -+ -+/* Register ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS */ -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS 0x30B0U -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_MASKFULL 0x000000000000F771ULL -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_CAT_BASE_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_CAT_BASE_CLRMSK 0xFFFF0FFFU -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_PAGE_SIZE_SHIFT 8U -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_PAGE_SIZE_CLRMSK 0xFFFFF8FFU -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_DATA_TYPE_SHIFT 5U -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_DATA_TYPE_CLRMSK 0xFFFFFF9FU -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_FAULT_RO_SHIFT 4U -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_FAULT_RO_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_FAULT_RO_EN 0x00000010U -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_FAULT_SHIFT 0U -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_MEM_FAULT_MMU_STATUS_FAULT_EN 0x00000001U -+ -+/* Register ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS */ -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS 0x30B8U -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_MASKFULL 0x001FFFFFFFFFFFF0ULL -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_RNW_SHIFT 52U -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_RNW_CLRMSK 0xFFEFFFFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_RNW_EN 0x0010000000000000ULL -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_TAG_SB_SHIFT 46U -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_TAG_SB_CLRMSK 0xFFF03FFFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_TAG_ID_SHIFT 40U -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_TAG_ID_CLRMSK 0xFFFFC0FFFFFFFFFFULL -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_ADDRESS_SHIFT 4U -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_ADDRESS_CLRMSK 0xFFFFFF000000000FULL -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_ADDRESS_ALIGNSHIFT 4U -+#define ROGUE_CR_FWCORE_MEM_FAULT_REQ_STATUS_ADDRESS_ALIGNSIZE 16U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CTRL_INVAL */ -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL 0x30C0U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_TLB_SHIFT 3U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_TLB_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_TLB_EN 0x00000008U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PC_SHIFT 2U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PC_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PC_EN 0x00000004U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PD_SHIFT 1U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PD_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PD_EN 0x00000002U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PT_SHIFT 0U -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_MEM_CTRL_INVAL_PT_EN 0x00000001U -+ -+/* Register ROGUE_CR_FWCORE_MEM_MMU_STATUS */ -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS 0x30C8U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_MASKFULL 0x000000000FFFFFF7ULL -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PC_DATA_SHIFT 20U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PC_DATA_CLRMSK 0xF00FFFFFU -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PD_DATA_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PD_DATA_CLRMSK 0xFFF00FFFU -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PT_DATA_SHIFT 4U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PT_DATA_CLRMSK 0xFFFFF00FU -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_STALLED_SHIFT 2U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_STALLED_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_STALLED_EN 0x00000004U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PAUSED_SHIFT 1U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PAUSED_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_PAUSED_EN 0x00000002U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_BUSY_SHIFT 0U -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_BUSY_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_MEM_MMU_STATUS_BUSY_EN 0x00000001U -+ -+/* Register ROGUE_CR_FWCORE_MEM_READS_EXT_STATUS */ -+#define ROGUE_CR_FWCORE_MEM_READS_EXT_STATUS 0x30D8U -+#define ROGUE_CR_FWCORE_MEM_READS_EXT_STATUS_MASKFULL 0x0000000000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_READS_EXT_STATUS_MMU_SHIFT 0U -+#define ROGUE_CR_FWCORE_MEM_READS_EXT_STATUS_MMU_CLRMSK 0xFFFFF000U -+ -+/* Register ROGUE_CR_FWCORE_MEM_READS_INT_STATUS */ -+#define ROGUE_CR_FWCORE_MEM_READS_INT_STATUS 0x30E0U -+#define ROGUE_CR_FWCORE_MEM_READS_INT_STATUS_MASKFULL 0x00000000000007FFULL -+#define ROGUE_CR_FWCORE_MEM_READS_INT_STATUS_MMU_SHIFT 0U -+#define ROGUE_CR_FWCORE_MEM_READS_INT_STATUS_MMU_CLRMSK 0xFFFFF800U -+ -+/* Register ROGUE_CR_FWCORE_WRAPPER_FENCE */ -+#define ROGUE_CR_FWCORE_WRAPPER_FENCE 0x30E8U -+#define ROGUE_CR_FWCORE_WRAPPER_FENCE_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_FWCORE_WRAPPER_FENCE_ID_SHIFT 0U -+#define ROGUE_CR_FWCORE_WRAPPER_FENCE_ID_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_WRAPPER_FENCE_ID_EN 0x00000001U -+ -+/* Register group: ROGUE_CR_FWCORE_MEM_CAT_BASE, with 8 repeats */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE_REPEATCOUNT 8U -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE0 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE0 0x30F0U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE0_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE0_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE0_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE0_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE0_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE1 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE1 0x30F8U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE1_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE1_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE1_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE1_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE1_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE2 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE2 0x3100U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE2_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE2_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE2_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE2_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE2_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE3 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE3 0x3108U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE3_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE3_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE3_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE3_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE3_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE4 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE4 0x3110U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE4_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE4_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE4_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE4_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE4_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE5 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE5 0x3118U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE5_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE5_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE5_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE5_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE5_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE6 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE6 0x3120U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE6_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE6_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE6_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE6_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE6_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_MEM_CAT_BASE7 */ -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE7 0x3128U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE7_MASKFULL 0x000000FFFFFFF000ULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE7_ADDR_SHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE7_ADDR_CLRMSK 0xFFFFFF0000000FFFULL -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE7_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_FWCORE_MEM_CAT_BASE7_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_FWCORE_WDT_RESET */ -+#define ROGUE_CR_FWCORE_WDT_RESET 0x3130U -+#define ROGUE_CR_FWCORE_WDT_RESET_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_FWCORE_WDT_RESET_EN_SHIFT 0U -+#define ROGUE_CR_FWCORE_WDT_RESET_EN_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_WDT_RESET_EN_EN 0x00000001U -+ -+/* Register ROGUE_CR_FWCORE_WDT_CTRL */ -+#define ROGUE_CR_FWCORE_WDT_CTRL 0x3138U -+#define ROGUE_CR_FWCORE_WDT_CTRL_MASKFULL 0x00000000FFFF1F01ULL -+#define ROGUE_CR_FWCORE_WDT_CTRL_PROT_SHIFT 16U -+#define ROGUE_CR_FWCORE_WDT_CTRL_PROT_CLRMSK 0x0000FFFFU -+#define ROGUE_CR_FWCORE_WDT_CTRL_THRESHOLD_SHIFT 8U -+#define ROGUE_CR_FWCORE_WDT_CTRL_THRESHOLD_CLRMSK 0xFFFFE0FFU -+#define ROGUE_CR_FWCORE_WDT_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_FWCORE_WDT_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_FWCORE_WDT_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_FWCORE_WDT_COUNT */ -+#define ROGUE_CR_FWCORE_WDT_COUNT 0x3140U -+#define ROGUE_CR_FWCORE_WDT_COUNT_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_FWCORE_WDT_COUNT_VALUE_SHIFT 0U -+#define ROGUE_CR_FWCORE_WDT_COUNT_VALUE_CLRMSK 0x00000000U -+ -+/* Register group: ROGUE_CR_FWCORE_DMI_RESERVED0, with 4 repeats */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED0_REPEATCOUNT 4U -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED00 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED00 0x3400U -+#define ROGUE_CR_FWCORE_DMI_RESERVED00_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED01 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED01 0x3408U -+#define ROGUE_CR_FWCORE_DMI_RESERVED01_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED02 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED02 0x3410U -+#define ROGUE_CR_FWCORE_DMI_RESERVED02_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED03 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED03 0x3418U -+#define ROGUE_CR_FWCORE_DMI_RESERVED03_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_DATA0 */ -+#define ROGUE_CR_FWCORE_DMI_DATA0 0x3420U -+#define ROGUE_CR_FWCORE_DMI_DATA0_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_DATA1 */ -+#define ROGUE_CR_FWCORE_DMI_DATA1 0x3428U -+#define ROGUE_CR_FWCORE_DMI_DATA1_MASKFULL 0x0000000000000000ULL -+ -+/* Register group: ROGUE_CR_FWCORE_DMI_RESERVED1, with 5 repeats */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED1_REPEATCOUNT 5U -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED10 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED10 0x3430U -+#define ROGUE_CR_FWCORE_DMI_RESERVED10_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED11 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED11 0x3438U -+#define ROGUE_CR_FWCORE_DMI_RESERVED11_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED12 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED12 0x3440U -+#define ROGUE_CR_FWCORE_DMI_RESERVED12_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED13 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED13 0x3448U -+#define ROGUE_CR_FWCORE_DMI_RESERVED13_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED14 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED14 0x3450U -+#define ROGUE_CR_FWCORE_DMI_RESERVED14_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_DMCONTROL */ -+#define ROGUE_CR_FWCORE_DMI_DMCONTROL 0x3480U -+#define ROGUE_CR_FWCORE_DMI_DMCONTROL_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_DMSTATUS */ -+#define ROGUE_CR_FWCORE_DMI_DMSTATUS 0x3488U -+#define ROGUE_CR_FWCORE_DMI_DMSTATUS_MASKFULL 0x0000000000000000ULL -+ -+/* Register group: ROGUE_CR_FWCORE_DMI_RESERVED2, with 4 repeats */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED2_REPEATCOUNT 4U -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED20 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED20 0x3490U -+#define ROGUE_CR_FWCORE_DMI_RESERVED20_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED21 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED21 0x3498U -+#define ROGUE_CR_FWCORE_DMI_RESERVED21_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED22 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED22 0x34A0U -+#define ROGUE_CR_FWCORE_DMI_RESERVED22_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED23 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED23 0x34A8U -+#define ROGUE_CR_FWCORE_DMI_RESERVED23_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_ABSTRACTCS */ -+#define ROGUE_CR_FWCORE_DMI_ABSTRACTCS 0x34B0U -+#define ROGUE_CR_FWCORE_DMI_ABSTRACTCS_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_COMMAND */ -+#define ROGUE_CR_FWCORE_DMI_COMMAND 0x34B8U -+#define ROGUE_CR_FWCORE_DMI_COMMAND_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_SBCS */ -+#define ROGUE_CR_FWCORE_DMI_SBCS 0x35C0U -+#define ROGUE_CR_FWCORE_DMI_SBCS_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_SBADDRESS0 */ -+#define ROGUE_CR_FWCORE_DMI_SBADDRESS0 0x35C8U -+#define ROGUE_CR_FWCORE_DMI_SBADDRESS0_MASKFULL 0x0000000000000000ULL -+ -+/* Register group: ROGUE_CR_FWCORE_DMI_RESERVED3, with 2 repeats */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED3_REPEATCOUNT 2U -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED30 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED30 0x34D0U -+#define ROGUE_CR_FWCORE_DMI_RESERVED30_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_RESERVED31 */ -+#define ROGUE_CR_FWCORE_DMI_RESERVED31 0x34D8U -+#define ROGUE_CR_FWCORE_DMI_RESERVED31_MASKFULL 0x0000000000000000ULL -+ -+/* Register group: ROGUE_CR_FWCORE_DMI_SBDATA, with 4 repeats */ -+#define ROGUE_CR_FWCORE_DMI_SBDATA_REPEATCOUNT 4U -+/* Register ROGUE_CR_FWCORE_DMI_SBDATA0 */ -+#define ROGUE_CR_FWCORE_DMI_SBDATA0 0x35E0U -+#define ROGUE_CR_FWCORE_DMI_SBDATA0_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_SBDATA1 */ -+#define ROGUE_CR_FWCORE_DMI_SBDATA1 0x35E8U -+#define ROGUE_CR_FWCORE_DMI_SBDATA1_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_SBDATA2 */ -+#define ROGUE_CR_FWCORE_DMI_SBDATA2 0x35F0U -+#define ROGUE_CR_FWCORE_DMI_SBDATA2_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_SBDATA3 */ -+#define ROGUE_CR_FWCORE_DMI_SBDATA3 0x35F8U -+#define ROGUE_CR_FWCORE_DMI_SBDATA3_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_FWCORE_DMI_HALTSUM0 */ -+#define ROGUE_CR_FWCORE_DMI_HALTSUM0 0x3600U -+#define ROGUE_CR_FWCORE_DMI_HALTSUM0_MASKFULL 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_SLC_CTRL_MISC */ -+#define ROGUE_CR_SLC_CTRL_MISC 0x3800U -+#define ROGUE_CR_SLC_CTRL_MISC_MASKFULL 0xFFFFFFFF01FF010FULL -+#define ROGUE_CR_SLC_CTRL_MISC_SCRAMBLE_BITS_SHIFT 32U -+#define ROGUE_CR_SLC_CTRL_MISC_SCRAMBLE_BITS_CLRMSK 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_MISC_LAZYWB_OVERRIDE_SHIFT 24U -+#define ROGUE_CR_SLC_CTRL_MISC_LAZYWB_OVERRIDE_CLRMSK 0xFFFFFFFFFEFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_MISC_LAZYWB_OVERRIDE_EN 0x0000000001000000ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_SHIFT 16U -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_CLRMSK 0xFFFFFFFFFF00FFFFULL -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_INTERLEAVED_64_BYTE 0x0000000000000000ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_INTERLEAVED_128_BYTE 0x0000000000010000ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_SIMPLE_HASH1 0x0000000000100000ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_SIMPLE_HASH2 0x0000000000110000ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_PVR_HASH1 0x0000000000200000ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ADDR_DECODE_MODE_PVR_HASH2_SCRAMBLE 0x0000000000210000ULL -+#define ROGUE_CR_SLC_CTRL_MISC_PAUSE_SHIFT 8U -+#define ROGUE_CR_SLC_CTRL_MISC_PAUSE_CLRMSK 0xFFFFFFFFFFFFFEFFULL -+#define ROGUE_CR_SLC_CTRL_MISC_PAUSE_EN 0x0000000000000100ULL -+#define ROGUE_CR_SLC_CTRL_MISC_RESP_PRIORITY_SHIFT 3U -+#define ROGUE_CR_SLC_CTRL_MISC_RESP_PRIORITY_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_SLC_CTRL_MISC_RESP_PRIORITY_EN 0x0000000000000008ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ENABLE_LINE_USE_LIMIT_SHIFT 2U -+#define ROGUE_CR_SLC_CTRL_MISC_ENABLE_LINE_USE_LIMIT_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_SLC_CTRL_MISC_ENABLE_LINE_USE_LIMIT_EN 0x0000000000000004ULL -+#define ROGUE_CR_SLC_CTRL_MISC_ENABLE_PSG_HAZARD_CHECK_SHIFT 1U -+#define ROGUE_CR_SLC_CTRL_MISC_ENABLE_PSG_HAZARD_CHECK_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_SLC_CTRL_MISC_ENABLE_PSG_HAZARD_CHECK_EN 0x0000000000000002ULL -+#define ROGUE_CR_SLC_CTRL_MISC_BYPASS_BURST_COMBINER_SHIFT 0U -+#define ROGUE_CR_SLC_CTRL_MISC_BYPASS_BURST_COMBINER_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_SLC_CTRL_MISC_BYPASS_BURST_COMBINER_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_SLC_CTRL_FLUSH_INVAL */ -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL 0x3818U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_MASKFULL 0x0000000080000FFFULL -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_LAZY_SHIFT 31U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_LAZY_CLRMSK 0x7FFFFFFFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_LAZY_EN 0x80000000U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_FASTRENDER_SHIFT 11U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_FASTRENDER_CLRMSK 0xFFFFF7FFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_FASTRENDER_EN 0x00000800U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_RAY_VERTEX_SHIFT 10U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_RAY_VERTEX_CLRMSK 0xFFFFFBFFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_RAY_VERTEX_EN 0x00000400U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_RAY_SHIFT 9U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_RAY_CLRMSK 0xFFFFFDFFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_RAY_EN 0x00000200U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_FRC_SHIFT 8U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_FRC_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_FRC_EN 0x00000100U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_VXE_SHIFT 7U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_VXE_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_VXE_EN 0x00000080U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_VXD_SHIFT 6U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_VXD_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_VXD_EN 0x00000040U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_HOST_META_SHIFT 5U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_HOST_META_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_HOST_META_EN 0x00000020U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_MMU_SHIFT 4U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_MMU_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_MMU_EN 0x00000010U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_COMPUTE_SHIFT 3U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_COMPUTE_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_COMPUTE_EN 0x00000008U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_PIXEL_SHIFT 2U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_PIXEL_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_PIXEL_EN 0x00000004U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_TA_SHIFT 1U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_TA_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_DM_TA_EN 0x00000002U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_ALL_SHIFT 0U -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_ALL_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SLC_CTRL_FLUSH_INVAL_ALL_EN 0x00000001U -+ -+/* Register ROGUE_CR_SLC_STATUS0 */ -+#define ROGUE_CR_SLC_STATUS0 0x3820U -+#define ROGUE_CR_SLC_STATUS0_MASKFULL 0x0000000000000007ULL -+#define ROGUE_CR_SLC_STATUS0_FLUSH_INVAL_PENDING_SHIFT 2U -+#define ROGUE_CR_SLC_STATUS0_FLUSH_INVAL_PENDING_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SLC_STATUS0_FLUSH_INVAL_PENDING_EN 0x00000004U -+#define ROGUE_CR_SLC_STATUS0_INVAL_PENDING_SHIFT 1U -+#define ROGUE_CR_SLC_STATUS0_INVAL_PENDING_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SLC_STATUS0_INVAL_PENDING_EN 0x00000002U -+#define ROGUE_CR_SLC_STATUS0_FLUSH_PENDING_SHIFT 0U -+#define ROGUE_CR_SLC_STATUS0_FLUSH_PENDING_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SLC_STATUS0_FLUSH_PENDING_EN 0x00000001U -+ -+/* Register ROGUE_CR_SLC_CTRL_BYPASS */ -+#define ROGUE_CR_SLC_CTRL_BYPASS 0x3828U -+#define ROGUE_CR_SLC_CTRL_BYPASS__XE_MEM__MASKFULL 0x0FFFFFFFFFFF7FFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_MASKFULL 0x000000000FFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_COMP_ZLS_SHIFT 59U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_COMP_ZLS_CLRMSK 0xF7FFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_COMP_ZLS_EN 0x0800000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_ZLS_HEADER_SHIFT 58U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_ZLS_HEADER_CLRMSK 0xFBFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_ZLS_HEADER_EN 0x0400000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_TCU_HEADER_SHIFT 57U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_TCU_HEADER_CLRMSK 0xFDFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_TCU_HEADER_EN 0x0200000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_ZLS_DATA_SHIFT 56U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_ZLS_DATA_CLRMSK 0xFEFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_ZLS_DATA_EN 0x0100000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_TCU_DATA_SHIFT 55U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_TCU_DATA_CLRMSK 0xFF7FFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_DECOMP_TCU_DATA_EN 0x0080000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_COMP_PBE_SHIFT 54U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_COMP_PBE_CLRMSK 0xFFBFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TFBC_COMP_PBE_EN 0x0040000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TCU_DM_COMPUTE_SHIFT 53U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TCU_DM_COMPUTE_CLRMSK 0xFFDFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TCU_DM_COMPUTE_EN 0x0020000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_PDSRW_NOLINEFILL_SHIFT 52U -+#define ROGUE_CR_SLC_CTRL_BYPASS_PDSRW_NOLINEFILL_CLRMSK 0xFFEFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_PDSRW_NOLINEFILL_EN 0x0010000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_PBE_NOLINEFILL_SHIFT 51U -+#define ROGUE_CR_SLC_CTRL_BYPASS_PBE_NOLINEFILL_CLRMSK 0xFFF7FFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_PBE_NOLINEFILL_EN 0x0008000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_FBC_SHIFT 50U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_FBC_CLRMSK 0xFFFBFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_FBC_EN 0x0004000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_RREQ_SHIFT 49U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_RREQ_CLRMSK 0xFFFDFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_RREQ_EN 0x0002000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_CREQ_SHIFT 48U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_CREQ_CLRMSK 0xFFFEFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_CREQ_EN 0x0001000000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_PREQ_SHIFT 47U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_PREQ_CLRMSK 0xFFFF7FFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_PREQ_EN 0x0000800000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_DBSC_SHIFT 46U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_DBSC_CLRMSK 0xFFFFBFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_DBSC_EN 0x0000400000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TCU_SHIFT 45U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TCU_CLRMSK 0xFFFFDFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TCU_EN 0x0000200000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PBE_SHIFT 44U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PBE_CLRMSK 0xFFFFEFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PBE_EN 0x0000100000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_ISP_SHIFT 43U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_ISP_CLRMSK 0xFFFFF7FFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_ISP_EN 0x0000080000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PM_SHIFT 42U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PM_CLRMSK 0xFFFFFBFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PM_EN 0x0000040000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TDM_SHIFT 41U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TDM_CLRMSK 0xFFFFFDFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TDM_EN 0x0000020000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_CDM_SHIFT 40U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_CDM_CLRMSK 0xFFFFFEFFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_CDM_EN 0x0000010000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_PDS_STATE_SHIFT 39U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_PDS_STATE_CLRMSK 0xFFFFFF7FFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_PDS_STATE_EN 0x0000008000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_DB_SHIFT 38U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_DB_CLRMSK 0xFFFFFFBFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_DB_EN 0x0000004000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_VTX_VAR_SHIFT 37U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_VTX_VAR_CLRMSK 0xFFFFFFDFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TSPF_VTX_VAR_EN 0x0000002000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_VDM_SHIFT 36U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_VDM_CLRMSK 0xFFFFFFEFFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_VDM_EN 0x0000001000000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PSG_STREAM_SHIFT 35U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PSG_STREAM_CLRMSK 0xFFFFFFF7FFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PSG_STREAM_EN 0x0000000800000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PSG_REGION_SHIFT 34U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PSG_REGION_CLRMSK 0xFFFFFFFBFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PSG_REGION_EN 0x0000000400000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_VCE_SHIFT 33U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_VCE_CLRMSK 0xFFFFFFFDFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_VCE_EN 0x0000000200000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PPP_SHIFT 32U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PPP_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_PPP_EN 0x0000000100000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_FASTRENDER_SHIFT 31U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_FASTRENDER_CLRMSK 0xFFFFFFFF7FFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_FASTRENDER_EN 0x0000000080000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PM_ALIST_SHIFT 30U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PM_ALIST_CLRMSK 0xFFFFFFFFBFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PM_ALIST_EN 0x0000000040000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PB_TE_SHIFT 29U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PB_TE_CLRMSK 0xFFFFFFFFDFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PB_TE_EN 0x0000000020000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PB_VCE_SHIFT 28U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PB_VCE_CLRMSK 0xFFFFFFFFEFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PB_VCE_EN 0x0000000010000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_RAY_VERTEX_SHIFT 27U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_RAY_VERTEX_CLRMSK 0xFFFFFFFFF7FFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_RAY_VERTEX_EN 0x0000000008000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_RAY_SHIFT 26U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_RAY_CLRMSK 0xFFFFFFFFFBFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_RAY_EN 0x0000000004000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_CPF_SHIFT 25U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_CPF_CLRMSK 0xFFFFFFFFFDFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_CPF_EN 0x0000000002000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TPU_SHIFT 24U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TPU_CLRMSK 0xFFFFFFFFFEFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TPU_EN 0x0000000001000000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_FBDC_SHIFT 23U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_FBDC_CLRMSK 0xFFFFFFFFFF7FFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_FBDC_EN 0x0000000000800000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TLA_SHIFT 22U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TLA_CLRMSK 0xFFFFFFFFFFBFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TLA_EN 0x0000000000400000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_BYP_CC_N_SHIFT 21U -+#define ROGUE_CR_SLC_CTRL_BYPASS_BYP_CC_N_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_BYP_CC_N_EN 0x0000000000200000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_BYP_CC_SHIFT 20U -+#define ROGUE_CR_SLC_CTRL_BYPASS_BYP_CC_CLRMSK 0xFFFFFFFFFFEFFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_BYP_CC_EN 0x0000000000100000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MCU_SHIFT 19U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MCU_CLRMSK 0xFFFFFFFFFFF7FFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MCU_EN 0x0000000000080000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PDS_SHIFT 18U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PDS_CLRMSK 0xFFFFFFFFFFFBFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_PDS_EN 0x0000000000040000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TPF_SHIFT 17U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TPF_CLRMSK 0xFFFFFFFFFFFDFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TPF_EN 0x0000000000020000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_TPC_SHIFT 16U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_TPC_CLRMSK 0xFFFFFFFFFFFEFFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_TA_TPC_EN 0x0000000000010000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_OBJ_SHIFT 15U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_OBJ_CLRMSK 0xFFFFFFFFFFFF7FFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_IPF_OBJ_EN 0x0000000000008000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_USC_SHIFT 14U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_USC_CLRMSK 0xFFFFFFFFFFFFBFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_USC_EN 0x0000000000004000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_META_SHIFT 13U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_META_CLRMSK 0xFFFFFFFFFFFFDFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_META_EN 0x0000000000002000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_HOST_SHIFT 12U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_HOST_CLRMSK 0xFFFFFFFFFFFFEFFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_HOST_EN 0x0000000000001000ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PT_SHIFT 11U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PT_CLRMSK 0xFFFFFFFFFFFFF7FFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PT_EN 0x0000000000000800ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PD_SHIFT 10U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PD_CLRMSK 0xFFFFFFFFFFFFFBFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PD_EN 0x0000000000000400ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PC_SHIFT 9U -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PC_CLRMSK 0xFFFFFFFFFFFFFDFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_REQ_MMU_PC_EN 0x0000000000000200ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_FRC_SHIFT 8U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_FRC_CLRMSK 0xFFFFFFFFFFFFFEFFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_FRC_EN 0x0000000000000100ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_VXE_SHIFT 7U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_VXE_CLRMSK 0xFFFFFFFFFFFFFF7FULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_VXE_EN 0x0000000000000080ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_VXD_SHIFT 6U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_VXD_CLRMSK 0xFFFFFFFFFFFFFFBFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_VXD_EN 0x0000000000000040ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_HOST_META_SHIFT 5U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_HOST_META_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_HOST_META_EN 0x0000000000000020ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_MMU_SHIFT 4U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_MMU_CLRMSK 0xFFFFFFFFFFFFFFEFULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_MMU_EN 0x0000000000000010ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_COMPUTE_SHIFT 3U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_COMPUTE_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_COMPUTE_EN 0x0000000000000008ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PIXEL_SHIFT 2U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PIXEL_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_PIXEL_EN 0x0000000000000004ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_TA_SHIFT 1U -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_TA_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_DM_TA_EN 0x0000000000000002ULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_ALL_SHIFT 0U -+#define ROGUE_CR_SLC_CTRL_BYPASS_ALL_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_SLC_CTRL_BYPASS_ALL_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_SLC_STATUS1 */ -+#define ROGUE_CR_SLC_STATUS1 0x3870U -+#define ROGUE_CR_SLC_STATUS1_MASKFULL 0x800003FF03FFFFFFULL -+#define ROGUE_CR_SLC_STATUS1_PAUSED_SHIFT 63U -+#define ROGUE_CR_SLC_STATUS1_PAUSED_CLRMSK 0x7FFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC_STATUS1_PAUSED_EN 0x8000000000000000ULL -+#define ROGUE_CR_SLC_STATUS1_READS1_SHIFT 32U -+#define ROGUE_CR_SLC_STATUS1_READS1_CLRMSK 0xFFFFFC00FFFFFFFFULL -+#define ROGUE_CR_SLC_STATUS1_READS0_SHIFT 16U -+#define ROGUE_CR_SLC_STATUS1_READS0_CLRMSK 0xFFFFFFFFFC00FFFFULL -+#define ROGUE_CR_SLC_STATUS1_READS1_EXT_SHIFT 8U -+#define ROGUE_CR_SLC_STATUS1_READS1_EXT_CLRMSK 0xFFFFFFFFFFFF00FFULL -+#define ROGUE_CR_SLC_STATUS1_READS0_EXT_SHIFT 0U -+#define ROGUE_CR_SLC_STATUS1_READS0_EXT_CLRMSK 0xFFFFFFFFFFFFFF00ULL -+ -+/* Register ROGUE_CR_SLC_IDLE */ -+#define ROGUE_CR_SLC_IDLE 0x3898U -+#define ROGUE_CR_SLC_IDLE__XE_MEM__MASKFULL 0x00000000000003FFULL -+#define ROGUE_CR_SLC_IDLE_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_SLC_IDLE_MH_SYSARB1_SHIFT 9U -+#define ROGUE_CR_SLC_IDLE_MH_SYSARB1_CLRMSK 0xFFFFFDFFU -+#define ROGUE_CR_SLC_IDLE_MH_SYSARB1_EN 0x00000200U -+#define ROGUE_CR_SLC_IDLE_MH_SYSARB0_SHIFT 8U -+#define ROGUE_CR_SLC_IDLE_MH_SYSARB0_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_SLC_IDLE_MH_SYSARB0_EN 0x00000100U -+#define ROGUE_CR_SLC_IDLE_IMGBV4_SHIFT 7U -+#define ROGUE_CR_SLC_IDLE_IMGBV4_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_SLC_IDLE_IMGBV4_EN 0x00000080U -+#define ROGUE_CR_SLC_IDLE_CACHE_BANKS_SHIFT 6U -+#define ROGUE_CR_SLC_IDLE_CACHE_BANKS_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_SLC_IDLE_CACHE_BANKS_EN 0x00000040U -+#define ROGUE_CR_SLC_IDLE_RBOFIFO_SHIFT 5U -+#define ROGUE_CR_SLC_IDLE_RBOFIFO_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_SLC_IDLE_RBOFIFO_EN 0x00000020U -+#define ROGUE_CR_SLC_IDLE_FRC_CONV_SHIFT 4U -+#define ROGUE_CR_SLC_IDLE_FRC_CONV_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SLC_IDLE_FRC_CONV_EN 0x00000010U -+#define ROGUE_CR_SLC_IDLE_VXE_CONV_SHIFT 3U -+#define ROGUE_CR_SLC_IDLE_VXE_CONV_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SLC_IDLE_VXE_CONV_EN 0x00000008U -+#define ROGUE_CR_SLC_IDLE_VXD_CONV_SHIFT 2U -+#define ROGUE_CR_SLC_IDLE_VXD_CONV_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SLC_IDLE_VXD_CONV_EN 0x00000004U -+#define ROGUE_CR_SLC_IDLE_BIF1_CONV_SHIFT 1U -+#define ROGUE_CR_SLC_IDLE_BIF1_CONV_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SLC_IDLE_BIF1_CONV_EN 0x00000002U -+#define ROGUE_CR_SLC_IDLE_CBAR_SHIFT 0U -+#define ROGUE_CR_SLC_IDLE_CBAR_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SLC_IDLE_CBAR_EN 0x00000001U -+ -+/* Register ROGUE_CR_SLC_STATUS2 */ -+#define ROGUE_CR_SLC_STATUS2 0x3908U -+#define ROGUE_CR_SLC_STATUS2_MASKFULL 0x000003FF03FFFFFFULL -+#define ROGUE_CR_SLC_STATUS2_READS3_SHIFT 32U -+#define ROGUE_CR_SLC_STATUS2_READS3_CLRMSK 0xFFFFFC00FFFFFFFFULL -+#define ROGUE_CR_SLC_STATUS2_READS2_SHIFT 16U -+#define ROGUE_CR_SLC_STATUS2_READS2_CLRMSK 0xFFFFFFFFFC00FFFFULL -+#define ROGUE_CR_SLC_STATUS2_READS3_EXT_SHIFT 8U -+#define ROGUE_CR_SLC_STATUS2_READS3_EXT_CLRMSK 0xFFFFFFFFFFFF00FFULL -+#define ROGUE_CR_SLC_STATUS2_READS2_EXT_SHIFT 0U -+#define ROGUE_CR_SLC_STATUS2_READS2_EXT_CLRMSK 0xFFFFFFFFFFFFFF00ULL -+ -+/* Register ROGUE_CR_SLC_CTRL_MISC2 */ -+#define ROGUE_CR_SLC_CTRL_MISC2 0x3930U -+#define ROGUE_CR_SLC_CTRL_MISC2_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SLC_CTRL_MISC2_SCRAMBLE_BITS_SHIFT 0U -+#define ROGUE_CR_SLC_CTRL_MISC2_SCRAMBLE_BITS_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SLC_CROSSBAR_LOAD_BALANCE */ -+#define ROGUE_CR_SLC_CROSSBAR_LOAD_BALANCE 0x3938U -+#define ROGUE_CR_SLC_CROSSBAR_LOAD_BALANCE_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_SLC_CROSSBAR_LOAD_BALANCE_BYPASS_SHIFT 0U -+#define ROGUE_CR_SLC_CROSSBAR_LOAD_BALANCE_BYPASS_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SLC_CROSSBAR_LOAD_BALANCE_BYPASS_EN 0x00000001U -+ -+/* Register ROGUE_CR_USC_UVS0_CHECKSUM */ -+#define ROGUE_CR_USC_UVS0_CHECKSUM 0x5000U -+#define ROGUE_CR_USC_UVS0_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_UVS0_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_USC_UVS0_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_USC_UVS1_CHECKSUM */ -+#define ROGUE_CR_USC_UVS1_CHECKSUM 0x5008U -+#define ROGUE_CR_USC_UVS1_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_UVS1_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_USC_UVS1_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_USC_UVS2_CHECKSUM */ -+#define ROGUE_CR_USC_UVS2_CHECKSUM 0x5010U -+#define ROGUE_CR_USC_UVS2_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_UVS2_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_USC_UVS2_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_USC_UVS3_CHECKSUM */ -+#define ROGUE_CR_USC_UVS3_CHECKSUM 0x5018U -+#define ROGUE_CR_USC_UVS3_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_UVS3_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_USC_UVS3_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PPP_SIGNATURE */ -+#define ROGUE_CR_PPP_SIGNATURE 0x5020U -+#define ROGUE_CR_PPP_SIGNATURE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PPP_SIGNATURE_VALUE_SHIFT 0U -+#define ROGUE_CR_PPP_SIGNATURE_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TE_SIGNATURE */ -+#define ROGUE_CR_TE_SIGNATURE 0x5028U -+#define ROGUE_CR_TE_SIGNATURE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TE_SIGNATURE_VALUE_SHIFT 0U -+#define ROGUE_CR_TE_SIGNATURE_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TE_CHECKSUM */ -+#define ROGUE_CR_TE_CHECKSUM 0x5110U -+#define ROGUE_CR_TE_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TE_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_TE_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_USC_UVB_CHECKSUM */ -+#define ROGUE_CR_USC_UVB_CHECKSUM 0x5118U -+#define ROGUE_CR_USC_UVB_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_UVB_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_USC_UVB_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_VCE_CHECKSUM */ -+#define ROGUE_CR_VCE_CHECKSUM 0x5030U -+#define ROGUE_CR_VCE_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_VCE_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_VCE_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_ISP_PDS_CHECKSUM */ -+#define ROGUE_CR_ISP_PDS_CHECKSUM 0x5038U -+#define ROGUE_CR_ISP_PDS_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_ISP_PDS_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_ISP_PDS_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_ISP_TPF_CHECKSUM */ -+#define ROGUE_CR_ISP_TPF_CHECKSUM 0x5040U -+#define ROGUE_CR_ISP_TPF_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_ISP_TPF_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_ISP_TPF_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TFPU_PLANE0_CHECKSUM */ -+#define ROGUE_CR_TFPU_PLANE0_CHECKSUM 0x5048U -+#define ROGUE_CR_TFPU_PLANE0_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TFPU_PLANE0_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_TFPU_PLANE0_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TFPU_PLANE1_CHECKSUM */ -+#define ROGUE_CR_TFPU_PLANE1_CHECKSUM 0x5050U -+#define ROGUE_CR_TFPU_PLANE1_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TFPU_PLANE1_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_TFPU_PLANE1_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PBE_CHECKSUM */ -+#define ROGUE_CR_PBE_CHECKSUM 0x5058U -+#define ROGUE_CR_PBE_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PBE_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_PBE_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PDS_DOUTM_STM_SIGNATURE */ -+#define ROGUE_CR_PDS_DOUTM_STM_SIGNATURE 0x5060U -+#define ROGUE_CR_PDS_DOUTM_STM_SIGNATURE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PDS_DOUTM_STM_SIGNATURE_VALUE_SHIFT 0U -+#define ROGUE_CR_PDS_DOUTM_STM_SIGNATURE_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_IFPU_ISP_CHECKSUM */ -+#define ROGUE_CR_IFPU_ISP_CHECKSUM 0x5068U -+#define ROGUE_CR_IFPU_ISP_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_IFPU_ISP_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_IFPU_ISP_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_USC_UVS4_CHECKSUM */ -+#define ROGUE_CR_USC_UVS4_CHECKSUM 0x5100U -+#define ROGUE_CR_USC_UVS4_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_UVS4_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_USC_UVS4_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_USC_UVS5_CHECKSUM */ -+#define ROGUE_CR_USC_UVS5_CHECKSUM 0x5108U -+#define ROGUE_CR_USC_UVS5_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_UVS5_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_USC_UVS5_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PPP_CLIP_CHECKSUM */ -+#define ROGUE_CR_PPP_CLIP_CHECKSUM 0x5120U -+#define ROGUE_CR_PPP_CLIP_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PPP_CLIP_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_PPP_CLIP_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_TA_PHASE */ -+#define ROGUE_CR_PERF_TA_PHASE 0x6008U -+#define ROGUE_CR_PERF_TA_PHASE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_TA_PHASE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_TA_PHASE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_3D_PHASE */ -+#define ROGUE_CR_PERF_3D_PHASE 0x6010U -+#define ROGUE_CR_PERF_3D_PHASE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_3D_PHASE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_3D_PHASE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_COMPUTE_PHASE */ -+#define ROGUE_CR_PERF_COMPUTE_PHASE 0x6018U -+#define ROGUE_CR_PERF_COMPUTE_PHASE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_COMPUTE_PHASE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_COMPUTE_PHASE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_TA_CYCLE */ -+#define ROGUE_CR_PERF_TA_CYCLE 0x6020U -+#define ROGUE_CR_PERF_TA_CYCLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_TA_CYCLE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_TA_CYCLE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_3D_CYCLE */ -+#define ROGUE_CR_PERF_3D_CYCLE 0x6028U -+#define ROGUE_CR_PERF_3D_CYCLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_3D_CYCLE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_3D_CYCLE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_COMPUTE_CYCLE */ -+#define ROGUE_CR_PERF_COMPUTE_CYCLE 0x6030U -+#define ROGUE_CR_PERF_COMPUTE_CYCLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_COMPUTE_CYCLE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_COMPUTE_CYCLE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_TA_OR_3D_CYCLE */ -+#define ROGUE_CR_PERF_TA_OR_3D_CYCLE 0x6038U -+#define ROGUE_CR_PERF_TA_OR_3D_CYCLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_TA_OR_3D_CYCLE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_TA_OR_3D_CYCLE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_INITIAL_TA_CYCLE */ -+#define ROGUE_CR_PERF_INITIAL_TA_CYCLE 0x6040U -+#define ROGUE_CR_PERF_INITIAL_TA_CYCLE_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_INITIAL_TA_CYCLE_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_INITIAL_TA_CYCLE_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC0_READ_STALL */ -+#define ROGUE_CR_PERF_SLC0_READ_STALL 0x60B8U -+#define ROGUE_CR_PERF_SLC0_READ_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC0_READ_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC0_READ_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC0_WRITE_STALL */ -+#define ROGUE_CR_PERF_SLC0_WRITE_STALL 0x60C0U -+#define ROGUE_CR_PERF_SLC0_WRITE_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC0_WRITE_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC0_WRITE_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC1_READ_STALL */ -+#define ROGUE_CR_PERF_SLC1_READ_STALL 0x60E0U -+#define ROGUE_CR_PERF_SLC1_READ_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC1_READ_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC1_READ_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC1_WRITE_STALL */ -+#define ROGUE_CR_PERF_SLC1_WRITE_STALL 0x60E8U -+#define ROGUE_CR_PERF_SLC1_WRITE_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC1_WRITE_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC1_WRITE_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC2_READ_STALL */ -+#define ROGUE_CR_PERF_SLC2_READ_STALL 0x6158U -+#define ROGUE_CR_PERF_SLC2_READ_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC2_READ_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC2_READ_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC2_WRITE_STALL */ -+#define ROGUE_CR_PERF_SLC2_WRITE_STALL 0x6160U -+#define ROGUE_CR_PERF_SLC2_WRITE_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC2_WRITE_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC2_WRITE_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC3_READ_STALL */ -+#define ROGUE_CR_PERF_SLC3_READ_STALL 0x6180U -+#define ROGUE_CR_PERF_SLC3_READ_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC3_READ_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC3_READ_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_SLC3_WRITE_STALL */ -+#define ROGUE_CR_PERF_SLC3_WRITE_STALL 0x6188U -+#define ROGUE_CR_PERF_SLC3_WRITE_STALL_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_SLC3_WRITE_STALL_COUNT_SHIFT 0U -+#define ROGUE_CR_PERF_SLC3_WRITE_STALL_COUNT_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PERF_3D_SPINUP */ -+#define ROGUE_CR_PERF_3D_SPINUP 0x6220U -+#define ROGUE_CR_PERF_3D_SPINUP_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PERF_3D_SPINUP_CYCLES_SHIFT 0U -+#define ROGUE_CR_PERF_3D_SPINUP_CYCLES_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_AXI_ACE_LITE_CONFIGURATION */ -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION 0x38C0U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_MASKFULL 0x00003FFFFFFFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ENABLE_FENCE_OUT_SHIFT 45U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ENABLE_FENCE_OUT_CLRMSK 0xFFFFDFFFFFFFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ENABLE_FENCE_OUT_EN 0x0000200000000000ULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_OSID_SECURITY_SHIFT 37U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_OSID_SECURITY_CLRMSK 0xFFFFE01FFFFFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_WRITELINEUNIQUE_SHIFT 36U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_WRITELINEUNIQUE_CLRMSK 0xFFFFFFEFFFFFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_WRITELINEUNIQUE_EN 0x0000001000000000ULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_WRITE_SHIFT 35U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_WRITE_CLRMSK 0xFFFFFFF7FFFFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_WRITE_EN 0x0000000800000000ULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_READ_SHIFT 34U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_READ_CLRMSK 0xFFFFFFFBFFFFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_DISABLE_COHERENT_READ_EN 0x0000000400000000ULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_CACHE_MAINTENANCE_SHIFT 30U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_CACHE_MAINTENANCE_CLRMSK 0xFFFFFFFC3FFFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_COHERENT_SHIFT 26U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_COHERENT_CLRMSK 0xFFFFFFFFC3FFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWCACHE_COHERENT_SHIFT 22U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWCACHE_COHERENT_CLRMSK 0xFFFFFFFFFC3FFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_BARRIER_SHIFT 20U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_BARRIER_CLRMSK 0xFFFFFFFFFFCFFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_BARRIER_SHIFT 18U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_BARRIER_CLRMSK 0xFFFFFFFFFFF3FFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_CACHE_MAINTENANCE_SHIFT 16U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_CACHE_MAINTENANCE_CLRMSK 0xFFFFFFFFFFFCFFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_COHERENT_SHIFT 14U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_COHERENT_CLRMSK 0xFFFFFFFFFFFF3FFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_COHERENT_SHIFT 12U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_COHERENT_CLRMSK 0xFFFFFFFFFFFFCFFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_NON_SNOOPING_SHIFT 10U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARDOMAIN_NON_SNOOPING_CLRMSK 0xFFFFFFFFFFFFF3FFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_NON_SNOOPING_SHIFT 8U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWDOMAIN_NON_SNOOPING_CLRMSK 0xFFFFFFFFFFFFFCFFULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_NON_SNOOPING_SHIFT 4U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_ARCACHE_NON_SNOOPING_CLRMSK 0xFFFFFFFFFFFFFF0FULL -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWCACHE_NON_SNOOPING_SHIFT 0U -+#define ROGUE_CR_AXI_ACE_LITE_CONFIGURATION_AWCACHE_NON_SNOOPING_CLRMSK 0xFFFFFFFFFFFFFFF0ULL -+ -+/* Register ROGUE_CR_POWER_ESTIMATE_RESULT */ -+#define ROGUE_CR_POWER_ESTIMATE_RESULT 0x6328U -+#define ROGUE_CR_POWER_ESTIMATE_RESULT_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_POWER_ESTIMATE_RESULT_VALUE_SHIFT 0U -+#define ROGUE_CR_POWER_ESTIMATE_RESULT_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TA_PERF */ -+#define ROGUE_CR_TA_PERF 0x7600U -+#define ROGUE_CR_TA_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_TA_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_TA_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_TA_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_TA_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_TA_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_TA_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_TA_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_TA_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_TA_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_TA_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_TA_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_TA_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_TA_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_TA_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_TA_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_TA_PERF_SELECT0 */ -+#define ROGUE_CR_TA_PERF_SELECT0 0x7608U -+#define ROGUE_CR_TA_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_TA_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_TA_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_TA_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_TA_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_TA_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_TA_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_TA_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TA_PERF_SELECT1 */ -+#define ROGUE_CR_TA_PERF_SELECT1 0x7610U -+#define ROGUE_CR_TA_PERF_SELECT1_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT1_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_TA_PERF_SELECT1_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT1_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_TA_PERF_SELECT1_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT1_MODE_SHIFT 21U -+#define ROGUE_CR_TA_PERF_SELECT1_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT1_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_TA_PERF_SELECT1_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_TA_PERF_SELECT1_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_TA_PERF_SELECT1_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_TA_PERF_SELECT1_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TA_PERF_SELECT2 */ -+#define ROGUE_CR_TA_PERF_SELECT2 0x7618U -+#define ROGUE_CR_TA_PERF_SELECT2_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT2_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_TA_PERF_SELECT2_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT2_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_TA_PERF_SELECT2_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT2_MODE_SHIFT 21U -+#define ROGUE_CR_TA_PERF_SELECT2_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT2_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_TA_PERF_SELECT2_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_TA_PERF_SELECT2_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_TA_PERF_SELECT2_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_TA_PERF_SELECT2_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TA_PERF_SELECT3 */ -+#define ROGUE_CR_TA_PERF_SELECT3 0x7620U -+#define ROGUE_CR_TA_PERF_SELECT3_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT3_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_TA_PERF_SELECT3_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT3_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_TA_PERF_SELECT3_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT3_MODE_SHIFT 21U -+#define ROGUE_CR_TA_PERF_SELECT3_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECT3_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_TA_PERF_SELECT3_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_TA_PERF_SELECT3_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_TA_PERF_SELECT3_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_TA_PERF_SELECT3_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TA_PERF_SELECTED_BITS */ -+#define ROGUE_CR_TA_PERF_SELECTED_BITS 0x7648U -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG3_SHIFT 48U -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG3_CLRMSK 0x0000FFFFFFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG2_SHIFT 32U -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG2_CLRMSK 0xFFFF0000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG1_SHIFT 16U -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG1_CLRMSK 0xFFFFFFFF0000FFFFULL -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG0_SHIFT 0U -+#define ROGUE_CR_TA_PERF_SELECTED_BITS_REG0_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TA_PERF_COUNTER_0 */ -+#define ROGUE_CR_TA_PERF_COUNTER_0 0x7650U -+#define ROGUE_CR_TA_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_TA_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TA_PERF_COUNTER_1 */ -+#define ROGUE_CR_TA_PERF_COUNTER_1 0x7658U -+#define ROGUE_CR_TA_PERF_COUNTER_1_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_COUNTER_1_REG_SHIFT 0U -+#define ROGUE_CR_TA_PERF_COUNTER_1_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TA_PERF_COUNTER_2 */ -+#define ROGUE_CR_TA_PERF_COUNTER_2 0x7660U -+#define ROGUE_CR_TA_PERF_COUNTER_2_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_COUNTER_2_REG_SHIFT 0U -+#define ROGUE_CR_TA_PERF_COUNTER_2_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TA_PERF_COUNTER_3 */ -+#define ROGUE_CR_TA_PERF_COUNTER_3 0x7668U -+#define ROGUE_CR_TA_PERF_COUNTER_3_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TA_PERF_COUNTER_3_REG_SHIFT 0U -+#define ROGUE_CR_TA_PERF_COUNTER_3_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_RASTERISATION_PERF */ -+#define ROGUE_CR_RASTERISATION_PERF 0x7700U -+#define ROGUE_CR_RASTERISATION_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_RASTERISATION_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_RASTERISATION_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_RASTERISATION_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_RASTERISATION_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_RASTERISATION_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_RASTERISATION_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_RASTERISATION_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_RASTERISATION_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_RASTERISATION_PERF_SELECT0 */ -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0 0x7708U -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_RASTERISATION_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_RASTERISATION_PERF_COUNTER_0 */ -+#define ROGUE_CR_RASTERISATION_PERF_COUNTER_0 0x7750U -+#define ROGUE_CR_RASTERISATION_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_RASTERISATION_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_RASTERISATION_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_HUB_BIFPMCACHE_PERF */ -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF 0x7800U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0 */ -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0 0x7808U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_HUB_BIFPMCACHE_PERF_COUNTER_0 */ -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_COUNTER_0 0x7850U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_HUB_BIFPMCACHE_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TPU_MCU_L0_PERF */ -+#define ROGUE_CR_TPU_MCU_L0_PERF 0x7900U -+#define ROGUE_CR_TPU_MCU_L0_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_TPU_MCU_L0_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_TPU_MCU_L0_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_TPU_MCU_L0_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_TPU_MCU_L0_PERF_SELECT0 */ -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0 0x7908U -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_TPU_MCU_L0_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TPU_MCU_L0_PERF_COUNTER_0 */ -+#define ROGUE_CR_TPU_MCU_L0_PERF_COUNTER_0 0x7950U -+#define ROGUE_CR_TPU_MCU_L0_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TPU_MCU_L0_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_TPU_MCU_L0_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_USC_PERF */ -+#define ROGUE_CR_USC_PERF 0x8100U -+#define ROGUE_CR_USC_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_USC_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_USC_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_USC_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_USC_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_USC_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_USC_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_USC_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_USC_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_USC_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_USC_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_USC_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_USC_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_USC_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_USC_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_USC_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_USC_PERF_SELECT0 */ -+#define ROGUE_CR_USC_PERF_SELECT0 0x8108U -+#define ROGUE_CR_USC_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_USC_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_USC_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_USC_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_USC_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_USC_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_USC_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_USC_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_USC_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_USC_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_USC_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_USC_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_USC_PERF_COUNTER_0 */ -+#define ROGUE_CR_USC_PERF_COUNTER_0 0x8150U -+#define ROGUE_CR_USC_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_USC_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_USC_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_JONES_IDLE */ -+#define ROGUE_CR_JONES_IDLE 0x8328U -+#define ROGUE_CR_JONES_IDLE_MASKFULL 0x0000000000007FFFULL -+#define ROGUE_CR_JONES_IDLE_TDM_SHIFT 14U -+#define ROGUE_CR_JONES_IDLE_TDM_CLRMSK 0xFFFFBFFFU -+#define ROGUE_CR_JONES_IDLE_TDM_EN 0x00004000U -+#define ROGUE_CR_JONES_IDLE_FB_CDC_TLA_SHIFT 13U -+#define ROGUE_CR_JONES_IDLE_FB_CDC_TLA_CLRMSK 0xFFFFDFFFU -+#define ROGUE_CR_JONES_IDLE_FB_CDC_TLA_EN 0x00002000U -+#define ROGUE_CR_JONES_IDLE_FB_CDC_SHIFT 12U -+#define ROGUE_CR_JONES_IDLE_FB_CDC_CLRMSK 0xFFFFEFFFU -+#define ROGUE_CR_JONES_IDLE_FB_CDC_EN 0x00001000U -+#define ROGUE_CR_JONES_IDLE_MMU_SHIFT 11U -+#define ROGUE_CR_JONES_IDLE_MMU_CLRMSK 0xFFFFF7FFU -+#define ROGUE_CR_JONES_IDLE_MMU_EN 0x00000800U -+#define ROGUE_CR_JONES_IDLE_TLA_SHIFT 10U -+#define ROGUE_CR_JONES_IDLE_TLA_CLRMSK 0xFFFFFBFFU -+#define ROGUE_CR_JONES_IDLE_TLA_EN 0x00000400U -+#define ROGUE_CR_JONES_IDLE_GARTEN_SHIFT 9U -+#define ROGUE_CR_JONES_IDLE_GARTEN_CLRMSK 0xFFFFFDFFU -+#define ROGUE_CR_JONES_IDLE_GARTEN_EN 0x00000200U -+#define ROGUE_CR_JONES_IDLE_HOSTIF_SHIFT 8U -+#define ROGUE_CR_JONES_IDLE_HOSTIF_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_JONES_IDLE_HOSTIF_EN 0x00000100U -+#define ROGUE_CR_JONES_IDLE_SOCIF_SHIFT 7U -+#define ROGUE_CR_JONES_IDLE_SOCIF_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_JONES_IDLE_SOCIF_EN 0x00000080U -+#define ROGUE_CR_JONES_IDLE_TILING_SHIFT 6U -+#define ROGUE_CR_JONES_IDLE_TILING_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_JONES_IDLE_TILING_EN 0x00000040U -+#define ROGUE_CR_JONES_IDLE_IPP_SHIFT 5U -+#define ROGUE_CR_JONES_IDLE_IPP_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_JONES_IDLE_IPP_EN 0x00000020U -+#define ROGUE_CR_JONES_IDLE_USCS_SHIFT 4U -+#define ROGUE_CR_JONES_IDLE_USCS_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_JONES_IDLE_USCS_EN 0x00000010U -+#define ROGUE_CR_JONES_IDLE_PM_SHIFT 3U -+#define ROGUE_CR_JONES_IDLE_PM_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_JONES_IDLE_PM_EN 0x00000008U -+#define ROGUE_CR_JONES_IDLE_CDM_SHIFT 2U -+#define ROGUE_CR_JONES_IDLE_CDM_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_JONES_IDLE_CDM_EN 0x00000004U -+#define ROGUE_CR_JONES_IDLE_VDM_SHIFT 1U -+#define ROGUE_CR_JONES_IDLE_VDM_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_JONES_IDLE_VDM_EN 0x00000002U -+#define ROGUE_CR_JONES_IDLE_BIF_SHIFT 0U -+#define ROGUE_CR_JONES_IDLE_BIF_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_JONES_IDLE_BIF_EN 0x00000001U -+ -+/* Register ROGUE_CR_TORNADO_PERF */ -+#define ROGUE_CR_TORNADO_PERF 0x8228U -+#define ROGUE_CR_TORNADO_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_TORNADO_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_TORNADO_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_TORNADO_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_TORNADO_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_TORNADO_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_TORNADO_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_TORNADO_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_TORNADO_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_TORNADO_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_TORNADO_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_TORNADO_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_TORNADO_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_TORNADO_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_TORNADO_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_TORNADO_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_TORNADO_PERF_SELECT0 */ -+#define ROGUE_CR_TORNADO_PERF_SELECT0 0x8230U -+#define ROGUE_CR_TORNADO_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_TORNADO_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_TORNADO_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_TORNADO_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_TORNADO_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_TORNADO_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_TORNADO_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_TORNADO_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_TORNADO_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_TORNADO_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_TORNADO_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_TORNADO_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TORNADO_PERF_COUNTER_0 */ -+#define ROGUE_CR_TORNADO_PERF_COUNTER_0 0x8268U -+#define ROGUE_CR_TORNADO_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TORNADO_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_TORNADO_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_TEXAS_PERF */ -+#define ROGUE_CR_TEXAS_PERF 0x8290U -+#define ROGUE_CR_TEXAS_PERF_MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_TEXAS_PERF_CLR_5_SHIFT 6U -+#define ROGUE_CR_TEXAS_PERF_CLR_5_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_TEXAS_PERF_CLR_5_EN 0x00000040U -+#define ROGUE_CR_TEXAS_PERF_CLR_4_SHIFT 5U -+#define ROGUE_CR_TEXAS_PERF_CLR_4_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_TEXAS_PERF_CLR_4_EN 0x00000020U -+#define ROGUE_CR_TEXAS_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_TEXAS_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_TEXAS_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_TEXAS_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_TEXAS_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_TEXAS_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_TEXAS_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_TEXAS_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_TEXAS_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_TEXAS_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_TEXAS_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_TEXAS_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_TEXAS_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_TEXAS_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_TEXAS_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_TEXAS_PERF_SELECT0 */ -+#define ROGUE_CR_TEXAS_PERF_SELECT0 0x8298U -+#define ROGUE_CR_TEXAS_PERF_SELECT0_MASKFULL 0x3FFF3FFF803FFFFFULL -+#define ROGUE_CR_TEXAS_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_TEXAS_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_TEXAS_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_TEXAS_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_TEXAS_PERF_SELECT0_MODE_SHIFT 31U -+#define ROGUE_CR_TEXAS_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFF7FFFFFFFULL -+#define ROGUE_CR_TEXAS_PERF_SELECT0_MODE_EN 0x0000000080000000ULL -+#define ROGUE_CR_TEXAS_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_TEXAS_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFC0FFFFULL -+#define ROGUE_CR_TEXAS_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_TEXAS_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_TEXAS_PERF_COUNTER_0 */ -+#define ROGUE_CR_TEXAS_PERF_COUNTER_0 0x82D8U -+#define ROGUE_CR_TEXAS_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_TEXAS_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_TEXAS_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_JONES_PERF */ -+#define ROGUE_CR_JONES_PERF 0x8330U -+#define ROGUE_CR_JONES_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_JONES_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_JONES_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_JONES_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_JONES_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_JONES_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_JONES_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_JONES_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_JONES_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_JONES_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_JONES_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_JONES_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_JONES_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_JONES_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_JONES_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_JONES_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_JONES_PERF_SELECT0 */ -+#define ROGUE_CR_JONES_PERF_SELECT0 0x8338U -+#define ROGUE_CR_JONES_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_JONES_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_JONES_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_JONES_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_JONES_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_JONES_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_JONES_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_JONES_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_JONES_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_JONES_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_JONES_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_JONES_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_JONES_PERF_COUNTER_0 */ -+#define ROGUE_CR_JONES_PERF_COUNTER_0 0x8368U -+#define ROGUE_CR_JONES_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_JONES_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_JONES_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_BLACKPEARL_PERF */ -+#define ROGUE_CR_BLACKPEARL_PERF 0x8400U -+#define ROGUE_CR_BLACKPEARL_PERF_MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_5_SHIFT 6U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_5_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_5_EN 0x00000040U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_4_SHIFT 5U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_4_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_4_EN 0x00000020U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_BLACKPEARL_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_BLACKPEARL_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_BLACKPEARL_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BLACKPEARL_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_BLACKPEARL_PERF_SELECT0 */ -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0 0x8408U -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_MASKFULL 0x3FFF3FFF803FFFFFULL -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_MODE_SHIFT 31U -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFF7FFFFFFFULL -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_MODE_EN 0x0000000080000000ULL -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFC0FFFFULL -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_BLACKPEARL_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_BLACKPEARL_PERF_COUNTER_0 */ -+#define ROGUE_CR_BLACKPEARL_PERF_COUNTER_0 0x8448U -+#define ROGUE_CR_BLACKPEARL_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_BLACKPEARL_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_BLACKPEARL_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_PBE_PERF */ -+#define ROGUE_CR_PBE_PERF 0x8478U -+#define ROGUE_CR_PBE_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_PBE_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_PBE_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_PBE_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_PBE_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_PBE_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_PBE_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_PBE_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_PBE_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_PBE_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_PBE_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_PBE_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_PBE_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_PBE_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_PBE_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_PBE_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_PBE_PERF_SELECT0 */ -+#define ROGUE_CR_PBE_PERF_SELECT0 0x8480U -+#define ROGUE_CR_PBE_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_PBE_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_PBE_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_PBE_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_PBE_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_PBE_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_PBE_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_PBE_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_PBE_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_PBE_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_PBE_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_PBE_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_PBE_PERF_COUNTER_0 */ -+#define ROGUE_CR_PBE_PERF_COUNTER_0 0x84B0U -+#define ROGUE_CR_PBE_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_PBE_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_PBE_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_OCP_REVINFO */ -+#define ROGUE_CR_OCP_REVINFO 0x9000U -+#define ROGUE_CR_OCP_REVINFO_MASKFULL 0x00000007FFFFFFFFULL -+#define ROGUE_CR_OCP_REVINFO_HWINFO_SYSBUS_SHIFT 33U -+#define ROGUE_CR_OCP_REVINFO_HWINFO_SYSBUS_CLRMSK 0xFFFFFFF9FFFFFFFFULL -+#define ROGUE_CR_OCP_REVINFO_HWINFO_MEMBUS_SHIFT 32U -+#define ROGUE_CR_OCP_REVINFO_HWINFO_MEMBUS_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_OCP_REVINFO_HWINFO_MEMBUS_EN 0x0000000100000000ULL -+#define ROGUE_CR_OCP_REVINFO_REVISION_SHIFT 0U -+#define ROGUE_CR_OCP_REVINFO_REVISION_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register ROGUE_CR_OCP_SYSCONFIG */ -+#define ROGUE_CR_OCP_SYSCONFIG 0x9010U -+#define ROGUE_CR_OCP_SYSCONFIG_MASKFULL 0x0000000000000FFFULL -+#define ROGUE_CR_OCP_SYSCONFIG_DUST2_STANDBY_MODE_SHIFT 10U -+#define ROGUE_CR_OCP_SYSCONFIG_DUST2_STANDBY_MODE_CLRMSK 0xFFFFF3FFU -+#define ROGUE_CR_OCP_SYSCONFIG_DUST1_STANDBY_MODE_SHIFT 8U -+#define ROGUE_CR_OCP_SYSCONFIG_DUST1_STANDBY_MODE_CLRMSK 0xFFFFFCFFU -+#define ROGUE_CR_OCP_SYSCONFIG_DUST0_STANDBY_MODE_SHIFT 6U -+#define ROGUE_CR_OCP_SYSCONFIG_DUST0_STANDBY_MODE_CLRMSK 0xFFFFFF3FU -+#define ROGUE_CR_OCP_SYSCONFIG_RASCAL_STANDBYMODE_SHIFT 4U -+#define ROGUE_CR_OCP_SYSCONFIG_RASCAL_STANDBYMODE_CLRMSK 0xFFFFFFCFU -+#define ROGUE_CR_OCP_SYSCONFIG_STANDBY_MODE_SHIFT 2U -+#define ROGUE_CR_OCP_SYSCONFIG_STANDBY_MODE_CLRMSK 0xFFFFFFF3U -+#define ROGUE_CR_OCP_SYSCONFIG_IDLE_MODE_SHIFT 0U -+#define ROGUE_CR_OCP_SYSCONFIG_IDLE_MODE_CLRMSK 0xFFFFFFFCU -+ -+/* Register ROGUE_CR_OCP_IRQSTATUS_RAW_0 */ -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_0 0x9020U -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_0_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_0_INIT_MINTERRUPT_RAW_SHIFT 0U -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_0_INIT_MINTERRUPT_RAW_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_0_INIT_MINTERRUPT_RAW_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQSTATUS_RAW_1 */ -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_1 0x9028U -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_1_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_1_TARGET_SINTERRUPT_RAW_SHIFT 0U -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_1_TARGET_SINTERRUPT_RAW_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_1_TARGET_SINTERRUPT_RAW_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQSTATUS_RAW_2 */ -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_2 0x9030U -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_2_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_2_RGX_IRQ_RAW_SHIFT 0U -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_2_RGX_IRQ_RAW_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQSTATUS_RAW_2_RGX_IRQ_RAW_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQSTATUS_0 */ -+#define ROGUE_CR_OCP_IRQSTATUS_0 0x9038U -+#define ROGUE_CR_OCP_IRQSTATUS_0_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQSTATUS_0_INIT_MINTERRUPT_STATUS_SHIFT 0U -+#define ROGUE_CR_OCP_IRQSTATUS_0_INIT_MINTERRUPT_STATUS_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQSTATUS_0_INIT_MINTERRUPT_STATUS_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQSTATUS_1 */ -+#define ROGUE_CR_OCP_IRQSTATUS_1 0x9040U -+#define ROGUE_CR_OCP_IRQSTATUS_1_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQSTATUS_1_TARGET_SINTERRUPT_STATUS_SHIFT 0U -+#define ROGUE_CR_OCP_IRQSTATUS_1_TARGET_SINTERRUPT_STATUS_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQSTATUS_1_TARGET_SINTERRUPT_STATUS_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQSTATUS_2 */ -+#define ROGUE_CR_OCP_IRQSTATUS_2 0x9048U -+#define ROGUE_CR_OCP_IRQSTATUS_2_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQSTATUS_2_RGX_IRQ_STATUS_SHIFT 0U -+#define ROGUE_CR_OCP_IRQSTATUS_2_RGX_IRQ_STATUS_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQSTATUS_2_RGX_IRQ_STATUS_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQENABLE_SET_0 */ -+#define ROGUE_CR_OCP_IRQENABLE_SET_0 0x9050U -+#define ROGUE_CR_OCP_IRQENABLE_SET_0_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQENABLE_SET_0_INIT_MINTERRUPT_ENABLE_SHIFT 0U -+#define ROGUE_CR_OCP_IRQENABLE_SET_0_INIT_MINTERRUPT_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQENABLE_SET_0_INIT_MINTERRUPT_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQENABLE_SET_1 */ -+#define ROGUE_CR_OCP_IRQENABLE_SET_1 0x9058U -+#define ROGUE_CR_OCP_IRQENABLE_SET_1_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQENABLE_SET_1_TARGET_SINTERRUPT_ENABLE_SHIFT 0U -+#define ROGUE_CR_OCP_IRQENABLE_SET_1_TARGET_SINTERRUPT_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQENABLE_SET_1_TARGET_SINTERRUPT_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQENABLE_SET_2 */ -+#define ROGUE_CR_OCP_IRQENABLE_SET_2 0x9060U -+#define ROGUE_CR_OCP_IRQENABLE_SET_2_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQENABLE_SET_2_RGX_IRQ_ENABLE_SHIFT 0U -+#define ROGUE_CR_OCP_IRQENABLE_SET_2_RGX_IRQ_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQENABLE_SET_2_RGX_IRQ_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQENABLE_CLR_0 */ -+#define ROGUE_CR_OCP_IRQENABLE_CLR_0 0x9068U -+#define ROGUE_CR_OCP_IRQENABLE_CLR_0_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQENABLE_CLR_0_INIT_MINTERRUPT_DISABLE_SHIFT 0U -+#define ROGUE_CR_OCP_IRQENABLE_CLR_0_INIT_MINTERRUPT_DISABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQENABLE_CLR_0_INIT_MINTERRUPT_DISABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQENABLE_CLR_1 */ -+#define ROGUE_CR_OCP_IRQENABLE_CLR_1 0x9070U -+#define ROGUE_CR_OCP_IRQENABLE_CLR_1_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQENABLE_CLR_1_TARGET_SINTERRUPT_DISABLE_SHIFT 0U -+#define ROGUE_CR_OCP_IRQENABLE_CLR_1_TARGET_SINTERRUPT_DISABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQENABLE_CLR_1_TARGET_SINTERRUPT_DISABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQENABLE_CLR_2 */ -+#define ROGUE_CR_OCP_IRQENABLE_CLR_2 0x9078U -+#define ROGUE_CR_OCP_IRQENABLE_CLR_2_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_IRQENABLE_CLR_2_RGX_IRQ_DISABLE_SHIFT 0U -+#define ROGUE_CR_OCP_IRQENABLE_CLR_2_RGX_IRQ_DISABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_IRQENABLE_CLR_2_RGX_IRQ_DISABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_IRQ_EVENT */ -+#define ROGUE_CR_OCP_IRQ_EVENT 0x9080U -+#define ROGUE_CR_OCP_IRQ_EVENT_MASKFULL 0x00000000000FFFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETH_RCVD_UNEXPECTED_RDATA_SHIFT 19U -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETH_RCVD_UNEXPECTED_RDATA_CLRMSK 0xFFFFFFFFFFF7FFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETH_RCVD_UNEXPECTED_RDATA_EN 0x0000000000080000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETH_RCVD_UNSUPPORTED_MCMD_SHIFT 18U -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETH_RCVD_UNSUPPORTED_MCMD_CLRMSK 0xFFFFFFFFFFFBFFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETH_RCVD_UNSUPPORTED_MCMD_EN 0x0000000000040000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETS_RCVD_UNEXPECTED_RDATA_SHIFT 17U -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETS_RCVD_UNEXPECTED_RDATA_CLRMSK 0xFFFFFFFFFFFDFFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETS_RCVD_UNEXPECTED_RDATA_EN 0x0000000000020000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETS_RCVD_UNSUPPORTED_MCMD_SHIFT 16U -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETS_RCVD_UNSUPPORTED_MCMD_CLRMSK 0xFFFFFFFFFFFEFFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_TARGETS_RCVD_UNSUPPORTED_MCMD_EN 0x0000000000010000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_IMG_PAGE_BOUNDARY_CROSS_SHIFT 15U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_IMG_PAGE_BOUNDARY_CROSS_CLRMSK 0xFFFFFFFFFFFF7FFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_IMG_PAGE_BOUNDARY_CROSS_EN 0x0000000000008000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RCVD_RESP_ERR_FAIL_SHIFT 14U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RCVD_RESP_ERR_FAIL_CLRMSK 0xFFFFFFFFFFFFBFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RCVD_RESP_ERR_FAIL_EN 0x0000000000004000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RCVD_UNUSED_TAGID_SHIFT 13U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RCVD_UNUSED_TAGID_CLRMSK 0xFFFFFFFFFFFFDFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RCVD_UNUSED_TAGID_EN 0x0000000000002000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RDATA_FIFO_OVERFILL_SHIFT 12U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RDATA_FIFO_OVERFILL_CLRMSK 0xFFFFFFFFFFFFEFFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT3_RDATA_FIFO_OVERFILL_EN 0x0000000000001000ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_IMG_PAGE_BOUNDARY_CROSS_SHIFT 11U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_IMG_PAGE_BOUNDARY_CROSS_CLRMSK 0xFFFFFFFFFFFFF7FFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_IMG_PAGE_BOUNDARY_CROSS_EN 0x0000000000000800ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RCVD_RESP_ERR_FAIL_SHIFT 10U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RCVD_RESP_ERR_FAIL_CLRMSK 0xFFFFFFFFFFFFFBFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RCVD_RESP_ERR_FAIL_EN 0x0000000000000400ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RCVD_UNUSED_TAGID_SHIFT 9U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RCVD_UNUSED_TAGID_CLRMSK 0xFFFFFFFFFFFFFDFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RCVD_UNUSED_TAGID_EN 0x0000000000000200ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RDATA_FIFO_OVERFILL_SHIFT 8U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RDATA_FIFO_OVERFILL_CLRMSK 0xFFFFFFFFFFFFFEFFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT2_RDATA_FIFO_OVERFILL_EN 0x0000000000000100ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_IMG_PAGE_BOUNDARY_CROSS_SHIFT 7U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_IMG_PAGE_BOUNDARY_CROSS_CLRMSK 0xFFFFFFFFFFFFFF7FULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_IMG_PAGE_BOUNDARY_CROSS_EN 0x0000000000000080ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RCVD_RESP_ERR_FAIL_SHIFT 6U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RCVD_RESP_ERR_FAIL_CLRMSK 0xFFFFFFFFFFFFFFBFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RCVD_RESP_ERR_FAIL_EN 0x0000000000000040ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RCVD_UNUSED_TAGID_SHIFT 5U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RCVD_UNUSED_TAGID_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RCVD_UNUSED_TAGID_EN 0x0000000000000020ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RDATA_FIFO_OVERFILL_SHIFT 4U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RDATA_FIFO_OVERFILL_CLRMSK 0xFFFFFFFFFFFFFFEFULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT1_RDATA_FIFO_OVERFILL_EN 0x0000000000000010ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_IMG_PAGE_BOUNDARY_CROSS_SHIFT 3U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_IMG_PAGE_BOUNDARY_CROSS_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_IMG_PAGE_BOUNDARY_CROSS_EN 0x0000000000000008ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RCVD_RESP_ERR_FAIL_SHIFT 2U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RCVD_RESP_ERR_FAIL_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RCVD_RESP_ERR_FAIL_EN 0x0000000000000004ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RCVD_UNUSED_TAGID_SHIFT 1U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RCVD_UNUSED_TAGID_CLRMSK 0xFFFFFFFFFFFFFFFDULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RCVD_UNUSED_TAGID_EN 0x0000000000000002ULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RDATA_FIFO_OVERFILL_SHIFT 0U -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RDATA_FIFO_OVERFILL_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_OCP_IRQ_EVENT_INIT0_RDATA_FIFO_OVERFILL_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_OCP_DEBUG_CONFIG */ -+#define ROGUE_CR_OCP_DEBUG_CONFIG 0x9088U -+#define ROGUE_CR_OCP_DEBUG_CONFIG_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_OCP_DEBUG_CONFIG_REG_SHIFT 0U -+#define ROGUE_CR_OCP_DEBUG_CONFIG_REG_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_OCP_DEBUG_CONFIG_REG_EN 0x00000001U -+ -+/* Register ROGUE_CR_OCP_DEBUG_STATUS */ -+#define ROGUE_CR_OCP_DEBUG_STATUS 0x9090U -+#define ROGUE_CR_OCP_DEBUG_STATUS_MASKFULL 0x001F1F77FFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SDISCACK_SHIFT 51U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SDISCACK_CLRMSK 0xFFE7FFFFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SCONNECT_SHIFT 50U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SCONNECT_CLRMSK 0xFFFBFFFFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SCONNECT_EN 0x0004000000000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_MCONNECT_SHIFT 48U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_MCONNECT_CLRMSK 0xFFFCFFFFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SDISCACK_SHIFT 43U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SDISCACK_CLRMSK 0xFFFFE7FFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SCONNECT_SHIFT 42U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SCONNECT_CLRMSK 0xFFFFFBFFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SCONNECT_EN 0x0000040000000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_MCONNECT_SHIFT 40U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_MCONNECT_CLRMSK 0xFFFFFCFFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_BUSY_SHIFT 38U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_BUSY_CLRMSK 0xFFFFFFBFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_BUSY_EN 0x0000004000000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_CMD_FIFO_FULL_SHIFT 37U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_CMD_FIFO_FULL_CLRMSK 0xFFFFFFDFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_CMD_FIFO_FULL_EN 0x0000002000000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SRESP_ERROR_SHIFT 36U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SRESP_ERROR_CLRMSK 0xFFFFFFEFFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETH_SRESP_ERROR_EN 0x0000001000000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_BUSY_SHIFT 34U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_BUSY_CLRMSK 0xFFFFFFFBFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_BUSY_EN 0x0000000400000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_CMD_FIFO_FULL_SHIFT 33U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_CMD_FIFO_FULL_CLRMSK 0xFFFFFFFDFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_CMD_FIFO_FULL_EN 0x0000000200000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SRESP_ERROR_SHIFT 32U -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SRESP_ERROR_CLRMSK 0xFFFFFFFEFFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_TARGETS_SRESP_ERROR_EN 0x0000000100000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_RESERVED_SHIFT 31U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_RESERVED_CLRMSK 0xFFFFFFFF7FFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_RESERVED_EN 0x0000000080000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_SWAIT_SHIFT 30U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_SWAIT_CLRMSK 0xFFFFFFFFBFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_SWAIT_EN 0x0000000040000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_MDISCREQ_SHIFT 29U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_MDISCREQ_CLRMSK 0xFFFFFFFFDFFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_MDISCREQ_EN 0x0000000020000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_MDISCACK_SHIFT 27U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_MDISCACK_CLRMSK 0xFFFFFFFFE7FFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_SCONNECT_SHIFT 26U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_SCONNECT_CLRMSK 0xFFFFFFFFFBFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_SCONNECT_EN 0x0000000004000000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_MCONNECT_SHIFT 24U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT3_MCONNECT_CLRMSK 0xFFFFFFFFFCFFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_RESERVED_SHIFT 23U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_RESERVED_CLRMSK 0xFFFFFFFFFF7FFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_RESERVED_EN 0x0000000000800000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_SWAIT_SHIFT 22U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_SWAIT_CLRMSK 0xFFFFFFFFFFBFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_SWAIT_EN 0x0000000000400000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_MDISCREQ_SHIFT 21U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_MDISCREQ_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_MDISCREQ_EN 0x0000000000200000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_MDISCACK_SHIFT 19U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_MDISCACK_CLRMSK 0xFFFFFFFFFFE7FFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_SCONNECT_SHIFT 18U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_SCONNECT_CLRMSK 0xFFFFFFFFFFFBFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_SCONNECT_EN 0x0000000000040000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_MCONNECT_SHIFT 16U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT2_MCONNECT_CLRMSK 0xFFFFFFFFFFFCFFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_RESERVED_SHIFT 15U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_RESERVED_CLRMSK 0xFFFFFFFFFFFF7FFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_RESERVED_EN 0x0000000000008000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_SWAIT_SHIFT 14U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_SWAIT_CLRMSK 0xFFFFFFFFFFFFBFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_SWAIT_EN 0x0000000000004000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_MDISCREQ_SHIFT 13U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_MDISCREQ_CLRMSK 0xFFFFFFFFFFFFDFFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_MDISCREQ_EN 0x0000000000002000ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_MDISCACK_SHIFT 11U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_MDISCACK_CLRMSK 0xFFFFFFFFFFFFE7FFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_SCONNECT_SHIFT 10U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_SCONNECT_CLRMSK 0xFFFFFFFFFFFFFBFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_SCONNECT_EN 0x0000000000000400ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_MCONNECT_SHIFT 8U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT1_MCONNECT_CLRMSK 0xFFFFFFFFFFFFFCFFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_RESERVED_SHIFT 7U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_RESERVED_CLRMSK 0xFFFFFFFFFFFFFF7FULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_RESERVED_EN 0x0000000000000080ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_SWAIT_SHIFT 6U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_SWAIT_CLRMSK 0xFFFFFFFFFFFFFFBFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_SWAIT_EN 0x0000000000000040ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_MDISCREQ_SHIFT 5U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_MDISCREQ_CLRMSK 0xFFFFFFFFFFFFFFDFULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_MDISCREQ_EN 0x0000000000000020ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_MDISCACK_SHIFT 3U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_MDISCACK_CLRMSK 0xFFFFFFFFFFFFFFE7ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_SCONNECT_SHIFT 2U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_SCONNECT_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_SCONNECT_EN 0x0000000000000004ULL -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_MCONNECT_SHIFT 0U -+#define ROGUE_CR_OCP_DEBUG_STATUS_INIT0_MCONNECT_CLRMSK 0xFFFFFFFFFFFFFFFCULL -+ -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PM_ALIST_SHIFT 6U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PM_ALIST_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PM_ALIST_EN 0x00000040U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_HOST_SHIFT 5U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_HOST_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_HOST_EN 0x00000020U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_META_SHIFT 4U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_META_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_META_EN 0x00000010U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_ZLS_SHIFT 3U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_ZLS_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_ZLS_EN 0x00000008U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_TE_SHIFT 2U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_TE_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_TE_EN 0x00000004U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_VCE_SHIFT 1U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_VCE_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_PB_VCE_EN 0x00000002U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_TLA_SHIFT 0U -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_TLA_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_TRUST_DM_TYPE_TLA_EN 0x00000001U -+ -+#define ROGUE_CR_BIF_TRUST_DM_MASK 0x0000007FU -+ -+/* Register ROGUE_CR_BIF_TRUST */ -+#define ROGUE_CR_BIF_TRUST 0xA000U -+#define ROGUE_CR_BIF_TRUST_MASKFULL 0x00000000001FFFFFULL -+#define ROGUE_CR_BIF_TRUST_OTHER_RAY_VERTEX_DM_TRUSTED_SHIFT 20U -+#define ROGUE_CR_BIF_TRUST_OTHER_RAY_VERTEX_DM_TRUSTED_CLRMSK 0xFFEFFFFFU -+#define ROGUE_CR_BIF_TRUST_OTHER_RAY_VERTEX_DM_TRUSTED_EN 0x00100000U -+#define ROGUE_CR_BIF_TRUST_MCU_RAY_VERTEX_DM_TRUSTED_SHIFT 19U -+#define ROGUE_CR_BIF_TRUST_MCU_RAY_VERTEX_DM_TRUSTED_CLRMSK 0xFFF7FFFFU -+#define ROGUE_CR_BIF_TRUST_MCU_RAY_VERTEX_DM_TRUSTED_EN 0x00080000U -+#define ROGUE_CR_BIF_TRUST_OTHER_RAY_DM_TRUSTED_SHIFT 18U -+#define ROGUE_CR_BIF_TRUST_OTHER_RAY_DM_TRUSTED_CLRMSK 0xFFFBFFFFU -+#define ROGUE_CR_BIF_TRUST_OTHER_RAY_DM_TRUSTED_EN 0x00040000U -+#define ROGUE_CR_BIF_TRUST_MCU_RAY_DM_TRUSTED_SHIFT 17U -+#define ROGUE_CR_BIF_TRUST_MCU_RAY_DM_TRUSTED_CLRMSK 0xFFFDFFFFU -+#define ROGUE_CR_BIF_TRUST_MCU_RAY_DM_TRUSTED_EN 0x00020000U -+#define ROGUE_CR_BIF_TRUST_ENABLE_SHIFT 16U -+#define ROGUE_CR_BIF_TRUST_ENABLE_CLRMSK 0xFFFEFFFFU -+#define ROGUE_CR_BIF_TRUST_ENABLE_EN 0x00010000U -+#define ROGUE_CR_BIF_TRUST_DM_TRUSTED_SHIFT 9U -+#define ROGUE_CR_BIF_TRUST_DM_TRUSTED_CLRMSK 0xFFFF01FFU -+#define ROGUE_CR_BIF_TRUST_OTHER_COMPUTE_DM_TRUSTED_SHIFT 8U -+#define ROGUE_CR_BIF_TRUST_OTHER_COMPUTE_DM_TRUSTED_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_BIF_TRUST_OTHER_COMPUTE_DM_TRUSTED_EN 0x00000100U -+#define ROGUE_CR_BIF_TRUST_MCU_COMPUTE_DM_TRUSTED_SHIFT 7U -+#define ROGUE_CR_BIF_TRUST_MCU_COMPUTE_DM_TRUSTED_CLRMSK 0xFFFFFF7FU -+#define ROGUE_CR_BIF_TRUST_MCU_COMPUTE_DM_TRUSTED_EN 0x00000080U -+#define ROGUE_CR_BIF_TRUST_PBE_COMPUTE_DM_TRUSTED_SHIFT 6U -+#define ROGUE_CR_BIF_TRUST_PBE_COMPUTE_DM_TRUSTED_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_BIF_TRUST_PBE_COMPUTE_DM_TRUSTED_EN 0x00000040U -+#define ROGUE_CR_BIF_TRUST_OTHER_PIXEL_DM_TRUSTED_SHIFT 5U -+#define ROGUE_CR_BIF_TRUST_OTHER_PIXEL_DM_TRUSTED_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_BIF_TRUST_OTHER_PIXEL_DM_TRUSTED_EN 0x00000020U -+#define ROGUE_CR_BIF_TRUST_MCU_PIXEL_DM_TRUSTED_SHIFT 4U -+#define ROGUE_CR_BIF_TRUST_MCU_PIXEL_DM_TRUSTED_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_BIF_TRUST_MCU_PIXEL_DM_TRUSTED_EN 0x00000010U -+#define ROGUE_CR_BIF_TRUST_PBE_PIXEL_DM_TRUSTED_SHIFT 3U -+#define ROGUE_CR_BIF_TRUST_PBE_PIXEL_DM_TRUSTED_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_BIF_TRUST_PBE_PIXEL_DM_TRUSTED_EN 0x00000008U -+#define ROGUE_CR_BIF_TRUST_OTHER_VERTEX_DM_TRUSTED_SHIFT 2U -+#define ROGUE_CR_BIF_TRUST_OTHER_VERTEX_DM_TRUSTED_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_BIF_TRUST_OTHER_VERTEX_DM_TRUSTED_EN 0x00000004U -+#define ROGUE_CR_BIF_TRUST_MCU_VERTEX_DM_TRUSTED_SHIFT 1U -+#define ROGUE_CR_BIF_TRUST_MCU_VERTEX_DM_TRUSTED_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_BIF_TRUST_MCU_VERTEX_DM_TRUSTED_EN 0x00000002U -+#define ROGUE_CR_BIF_TRUST_PBE_VERTEX_DM_TRUSTED_SHIFT 0U -+#define ROGUE_CR_BIF_TRUST_PBE_VERTEX_DM_TRUSTED_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_BIF_TRUST_PBE_VERTEX_DM_TRUSTED_EN 0x00000001U -+ -+/* Register ROGUE_CR_SYS_BUS_SECURE */ -+#define ROGUE_CR_SYS_BUS_SECURE 0xA100U -+#define ROGUE_CR_SYS_BUS_SECURE__SECR__MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_SYS_BUS_SECURE_MASKFULL 0x0000000000000001ULL -+#define ROGUE_CR_SYS_BUS_SECURE_ENABLE_SHIFT 0U -+#define ROGUE_CR_SYS_BUS_SECURE_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SYS_BUS_SECURE_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_FBA_FC0_CHECKSUM */ -+#define ROGUE_CR_FBA_FC0_CHECKSUM 0xD170U -+#define ROGUE_CR_FBA_FC0_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_FBA_FC0_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_FBA_FC0_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_FBA_FC1_CHECKSUM */ -+#define ROGUE_CR_FBA_FC1_CHECKSUM 0xD178U -+#define ROGUE_CR_FBA_FC1_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_FBA_FC1_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_FBA_FC1_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_FBA_FC2_CHECKSUM */ -+#define ROGUE_CR_FBA_FC2_CHECKSUM 0xD180U -+#define ROGUE_CR_FBA_FC2_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_FBA_FC2_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_FBA_FC2_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_FBA_FC3_CHECKSUM */ -+#define ROGUE_CR_FBA_FC3_CHECKSUM 0xD188U -+#define ROGUE_CR_FBA_FC3_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_FBA_FC3_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_FBA_FC3_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_CLK_CTRL2 */ -+#define ROGUE_CR_CLK_CTRL2 0xD200U -+#define ROGUE_CR_CLK_CTRL2_MASKFULL 0x0000000000000F33ULL -+#define ROGUE_CR_CLK_CTRL2_MCU_FBTC_SHIFT 10U -+#define ROGUE_CR_CLK_CTRL2_MCU_FBTC_CLRMSK 0xFFFFFFFFFFFFF3FFULL -+#define ROGUE_CR_CLK_CTRL2_MCU_FBTC_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL2_MCU_FBTC_ON 0x0000000000000400ULL -+#define ROGUE_CR_CLK_CTRL2_MCU_FBTC_AUTO 0x0000000000000800ULL -+#define ROGUE_CR_CLK_CTRL2_VRDM_SHIFT 8U -+#define ROGUE_CR_CLK_CTRL2_VRDM_CLRMSK 0xFFFFFFFFFFFFFCFFULL -+#define ROGUE_CR_CLK_CTRL2_VRDM_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL2_VRDM_ON 0x0000000000000100ULL -+#define ROGUE_CR_CLK_CTRL2_VRDM_AUTO 0x0000000000000200ULL -+#define ROGUE_CR_CLK_CTRL2_SH_SHIFT 4U -+#define ROGUE_CR_CLK_CTRL2_SH_CLRMSK 0xFFFFFFFFFFFFFFCFULL -+#define ROGUE_CR_CLK_CTRL2_SH_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL2_SH_ON 0x0000000000000010ULL -+#define ROGUE_CR_CLK_CTRL2_SH_AUTO 0x0000000000000020ULL -+#define ROGUE_CR_CLK_CTRL2_FBA_SHIFT 0U -+#define ROGUE_CR_CLK_CTRL2_FBA_CLRMSK 0xFFFFFFFFFFFFFFFCULL -+#define ROGUE_CR_CLK_CTRL2_FBA_OFF 0x0000000000000000ULL -+#define ROGUE_CR_CLK_CTRL2_FBA_ON 0x0000000000000001ULL -+#define ROGUE_CR_CLK_CTRL2_FBA_AUTO 0x0000000000000002ULL -+ -+/* Register ROGUE_CR_CLK_STATUS2 */ -+#define ROGUE_CR_CLK_STATUS2 0xD208U -+#define ROGUE_CR_CLK_STATUS2_MASKFULL 0x0000000000000015ULL -+#define ROGUE_CR_CLK_STATUS2_VRDM_SHIFT 4U -+#define ROGUE_CR_CLK_STATUS2_VRDM_CLRMSK 0xFFFFFFFFFFFFFFEFULL -+#define ROGUE_CR_CLK_STATUS2_VRDM_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS2_VRDM_RUNNING 0x0000000000000010ULL -+#define ROGUE_CR_CLK_STATUS2_SH_SHIFT 2U -+#define ROGUE_CR_CLK_STATUS2_SH_CLRMSK 0xFFFFFFFFFFFFFFFBULL -+#define ROGUE_CR_CLK_STATUS2_SH_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS2_SH_RUNNING 0x0000000000000004ULL -+#define ROGUE_CR_CLK_STATUS2_FBA_SHIFT 0U -+#define ROGUE_CR_CLK_STATUS2_FBA_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_CLK_STATUS2_FBA_GATED 0x0000000000000000ULL -+#define ROGUE_CR_CLK_STATUS2_FBA_RUNNING 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_RPM_SHF_FPL */ -+#define ROGUE_CR_RPM_SHF_FPL 0xD520U -+#define ROGUE_CR_RPM_SHF_FPL_MASKFULL 0x3FFFFFFFFFFFFFFCULL -+#define ROGUE_CR_RPM_SHF_FPL_SIZE_SHIFT 40U -+#define ROGUE_CR_RPM_SHF_FPL_SIZE_CLRMSK 0xC00000FFFFFFFFFFULL -+#define ROGUE_CR_RPM_SHF_FPL_BASE_SHIFT 2U -+#define ROGUE_CR_RPM_SHF_FPL_BASE_CLRMSK 0xFFFFFF0000000003ULL -+#define ROGUE_CR_RPM_SHF_FPL_BASE_ALIGNSHIFT 2U -+#define ROGUE_CR_RPM_SHF_FPL_BASE_ALIGNSIZE 4U -+ -+/* Register ROGUE_CR_RPM_SHF_FPL_READ */ -+#define ROGUE_CR_RPM_SHF_FPL_READ 0xD528U -+#define ROGUE_CR_RPM_SHF_FPL_READ_MASKFULL 0x00000000007FFFFFULL -+#define ROGUE_CR_RPM_SHF_FPL_READ_TOGGLE_SHIFT 22U -+#define ROGUE_CR_RPM_SHF_FPL_READ_TOGGLE_CLRMSK 0xFFBFFFFFU -+#define ROGUE_CR_RPM_SHF_FPL_READ_TOGGLE_EN 0x00400000U -+#define ROGUE_CR_RPM_SHF_FPL_READ_OFFSET_SHIFT 0U -+#define ROGUE_CR_RPM_SHF_FPL_READ_OFFSET_CLRMSK 0xFFC00000U -+ -+/* Register ROGUE_CR_RPM_SHF_FPL_WRITE */ -+#define ROGUE_CR_RPM_SHF_FPL_WRITE 0xD530U -+#define ROGUE_CR_RPM_SHF_FPL_WRITE_MASKFULL 0x00000000007FFFFFULL -+#define ROGUE_CR_RPM_SHF_FPL_WRITE_TOGGLE_SHIFT 22U -+#define ROGUE_CR_RPM_SHF_FPL_WRITE_TOGGLE_CLRMSK 0xFFBFFFFFU -+#define ROGUE_CR_RPM_SHF_FPL_WRITE_TOGGLE_EN 0x00400000U -+#define ROGUE_CR_RPM_SHF_FPL_WRITE_OFFSET_SHIFT 0U -+#define ROGUE_CR_RPM_SHF_FPL_WRITE_OFFSET_CLRMSK 0xFFC00000U -+ -+/* Register ROGUE_CR_RPM_SHG_FPL */ -+#define ROGUE_CR_RPM_SHG_FPL 0xD538U -+#define ROGUE_CR_RPM_SHG_FPL_MASKFULL 0x3FFFFFFFFFFFFFFCULL -+#define ROGUE_CR_RPM_SHG_FPL_SIZE_SHIFT 40U -+#define ROGUE_CR_RPM_SHG_FPL_SIZE_CLRMSK 0xC00000FFFFFFFFFFULL -+#define ROGUE_CR_RPM_SHG_FPL_BASE_SHIFT 2U -+#define ROGUE_CR_RPM_SHG_FPL_BASE_CLRMSK 0xFFFFFF0000000003ULL -+#define ROGUE_CR_RPM_SHG_FPL_BASE_ALIGNSHIFT 2U -+#define ROGUE_CR_RPM_SHG_FPL_BASE_ALIGNSIZE 4U -+ -+/* Register ROGUE_CR_RPM_SHG_FPL_READ */ -+#define ROGUE_CR_RPM_SHG_FPL_READ 0xD540U -+#define ROGUE_CR_RPM_SHG_FPL_READ_MASKFULL 0x00000000007FFFFFULL -+#define ROGUE_CR_RPM_SHG_FPL_READ_TOGGLE_SHIFT 22U -+#define ROGUE_CR_RPM_SHG_FPL_READ_TOGGLE_CLRMSK 0xFFBFFFFFU -+#define ROGUE_CR_RPM_SHG_FPL_READ_TOGGLE_EN 0x00400000U -+#define ROGUE_CR_RPM_SHG_FPL_READ_OFFSET_SHIFT 0U -+#define ROGUE_CR_RPM_SHG_FPL_READ_OFFSET_CLRMSK 0xFFC00000U -+ -+/* Register ROGUE_CR_RPM_SHG_FPL_WRITE */ -+#define ROGUE_CR_RPM_SHG_FPL_WRITE 0xD548U -+#define ROGUE_CR_RPM_SHG_FPL_WRITE_MASKFULL 0x00000000007FFFFFULL -+#define ROGUE_CR_RPM_SHG_FPL_WRITE_TOGGLE_SHIFT 22U -+#define ROGUE_CR_RPM_SHG_FPL_WRITE_TOGGLE_CLRMSK 0xFFBFFFFFU -+#define ROGUE_CR_RPM_SHG_FPL_WRITE_TOGGLE_EN 0x00400000U -+#define ROGUE_CR_RPM_SHG_FPL_WRITE_OFFSET_SHIFT 0U -+#define ROGUE_CR_RPM_SHG_FPL_WRITE_OFFSET_CLRMSK 0xFFC00000U -+ -+/* Register ROGUE_CR_SH_PERF */ -+#define ROGUE_CR_SH_PERF 0xD5F8U -+#define ROGUE_CR_SH_PERF_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_SH_PERF_CLR_3_SHIFT 4U -+#define ROGUE_CR_SH_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SH_PERF_CLR_3_EN 0x00000010U -+#define ROGUE_CR_SH_PERF_CLR_2_SHIFT 3U -+#define ROGUE_CR_SH_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SH_PERF_CLR_2_EN 0x00000008U -+#define ROGUE_CR_SH_PERF_CLR_1_SHIFT 2U -+#define ROGUE_CR_SH_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SH_PERF_CLR_1_EN 0x00000004U -+#define ROGUE_CR_SH_PERF_CLR_0_SHIFT 1U -+#define ROGUE_CR_SH_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SH_PERF_CLR_0_EN 0x00000002U -+#define ROGUE_CR_SH_PERF_CTRL_ENABLE_SHIFT 0U -+#define ROGUE_CR_SH_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SH_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register ROGUE_CR_SH_PERF_SELECT0 */ -+#define ROGUE_CR_SH_PERF_SELECT0 0xD600U -+#define ROGUE_CR_SH_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define ROGUE_CR_SH_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define ROGUE_CR_SH_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define ROGUE_CR_SH_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define ROGUE_CR_SH_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define ROGUE_CR_SH_PERF_SELECT0_MODE_SHIFT 21U -+#define ROGUE_CR_SH_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define ROGUE_CR_SH_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define ROGUE_CR_SH_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define ROGUE_CR_SH_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define ROGUE_CR_SH_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define ROGUE_CR_SH_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_SH_PERF_COUNTER_0 */ -+#define ROGUE_CR_SH_PERF_COUNTER_0 0xD628U -+#define ROGUE_CR_SH_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SH_PERF_COUNTER_0_REG_SHIFT 0U -+#define ROGUE_CR_SH_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SHF_SHG_CHECKSUM */ -+#define ROGUE_CR_SHF_SHG_CHECKSUM 0xD1C0U -+#define ROGUE_CR_SHF_SHG_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SHF_SHG_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_SHF_SHG_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SHF_VERTEX_BIF_CHECKSUM */ -+#define ROGUE_CR_SHF_VERTEX_BIF_CHECKSUM 0xD1C8U -+#define ROGUE_CR_SHF_VERTEX_BIF_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SHF_VERTEX_BIF_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_SHF_VERTEX_BIF_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SHF_VARY_BIF_CHECKSUM */ -+#define ROGUE_CR_SHF_VARY_BIF_CHECKSUM 0xD1D0U -+#define ROGUE_CR_SHF_VARY_BIF_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SHF_VARY_BIF_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_SHF_VARY_BIF_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_RPM_BIF_CHECKSUM */ -+#define ROGUE_CR_RPM_BIF_CHECKSUM 0xD1D8U -+#define ROGUE_CR_RPM_BIF_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_RPM_BIF_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_RPM_BIF_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SHG_BIF_CHECKSUM */ -+#define ROGUE_CR_SHG_BIF_CHECKSUM 0xD1E0U -+#define ROGUE_CR_SHG_BIF_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SHG_BIF_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_SHG_BIF_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register ROGUE_CR_SHG_FE_BE_CHECKSUM */ -+#define ROGUE_CR_SHG_FE_BE_CHECKSUM 0xD1E8U -+#define ROGUE_CR_SHG_FE_BE_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_SHG_FE_BE_CHECKSUM_VALUE_SHIFT 0U -+#define ROGUE_CR_SHG_FE_BE_CHECKSUM_VALUE_CLRMSK 0x00000000U -+ -+/* Register DPX_CR_BF_PERF */ -+#define DPX_CR_BF_PERF 0xC458U -+#define DPX_CR_BF_PERF_MASKFULL 0x000000000000001FULL -+#define DPX_CR_BF_PERF_CLR_3_SHIFT 4U -+#define DPX_CR_BF_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define DPX_CR_BF_PERF_CLR_3_EN 0x00000010U -+#define DPX_CR_BF_PERF_CLR_2_SHIFT 3U -+#define DPX_CR_BF_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define DPX_CR_BF_PERF_CLR_2_EN 0x00000008U -+#define DPX_CR_BF_PERF_CLR_1_SHIFT 2U -+#define DPX_CR_BF_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define DPX_CR_BF_PERF_CLR_1_EN 0x00000004U -+#define DPX_CR_BF_PERF_CLR_0_SHIFT 1U -+#define DPX_CR_BF_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define DPX_CR_BF_PERF_CLR_0_EN 0x00000002U -+#define DPX_CR_BF_PERF_CTRL_ENABLE_SHIFT 0U -+#define DPX_CR_BF_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define DPX_CR_BF_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register DPX_CR_BF_PERF_SELECT0 */ -+#define DPX_CR_BF_PERF_SELECT0 0xC460U -+#define DPX_CR_BF_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define DPX_CR_BF_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define DPX_CR_BF_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define DPX_CR_BF_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define DPX_CR_BF_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define DPX_CR_BF_PERF_SELECT0_MODE_SHIFT 21U -+#define DPX_CR_BF_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define DPX_CR_BF_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define DPX_CR_BF_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define DPX_CR_BF_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define DPX_CR_BF_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define DPX_CR_BF_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register DPX_CR_BF_PERF_COUNTER_0 */ -+#define DPX_CR_BF_PERF_COUNTER_0 0xC488U -+#define DPX_CR_BF_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define DPX_CR_BF_PERF_COUNTER_0_REG_SHIFT 0U -+#define DPX_CR_BF_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register DPX_CR_BT_PERF */ -+#define DPX_CR_BT_PERF 0xC3D0U -+#define DPX_CR_BT_PERF_MASKFULL 0x000000000000001FULL -+#define DPX_CR_BT_PERF_CLR_3_SHIFT 4U -+#define DPX_CR_BT_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define DPX_CR_BT_PERF_CLR_3_EN 0x00000010U -+#define DPX_CR_BT_PERF_CLR_2_SHIFT 3U -+#define DPX_CR_BT_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define DPX_CR_BT_PERF_CLR_2_EN 0x00000008U -+#define DPX_CR_BT_PERF_CLR_1_SHIFT 2U -+#define DPX_CR_BT_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define DPX_CR_BT_PERF_CLR_1_EN 0x00000004U -+#define DPX_CR_BT_PERF_CLR_0_SHIFT 1U -+#define DPX_CR_BT_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define DPX_CR_BT_PERF_CLR_0_EN 0x00000002U -+#define DPX_CR_BT_PERF_CTRL_ENABLE_SHIFT 0U -+#define DPX_CR_BT_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define DPX_CR_BT_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register DPX_CR_BT_PERF_SELECT0 */ -+#define DPX_CR_BT_PERF_SELECT0 0xC3D8U -+#define DPX_CR_BT_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define DPX_CR_BT_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define DPX_CR_BT_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define DPX_CR_BT_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define DPX_CR_BT_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define DPX_CR_BT_PERF_SELECT0_MODE_SHIFT 21U -+#define DPX_CR_BT_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define DPX_CR_BT_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define DPX_CR_BT_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define DPX_CR_BT_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define DPX_CR_BT_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define DPX_CR_BT_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register DPX_CR_BT_PERF_COUNTER_0 */ -+#define DPX_CR_BT_PERF_COUNTER_0 0xC420U -+#define DPX_CR_BT_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define DPX_CR_BT_PERF_COUNTER_0_REG_SHIFT 0U -+#define DPX_CR_BT_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register DPX_CR_RQ_USC_DEBUG */ -+#define DPX_CR_RQ_USC_DEBUG 0xC110U -+#define DPX_CR_RQ_USC_DEBUG_MASKFULL 0x00000000FFFFFFFFULL -+#define DPX_CR_RQ_USC_DEBUG_CHECKSUM_SHIFT 0U -+#define DPX_CR_RQ_USC_DEBUG_CHECKSUM_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register DPX_CR_BIF_FAULT_BANK_MMU_STATUS */ -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS 0xC5C8U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_MASKFULL 0x000000000000F775ULL -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_CAT_BASE_SHIFT 12U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_CAT_BASE_CLRMSK 0xFFFF0FFFU -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_PAGE_SIZE_SHIFT 8U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_PAGE_SIZE_CLRMSK 0xFFFFF8FFU -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_DATA_TYPE_SHIFT 5U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_DATA_TYPE_CLRMSK 0xFFFFFF9FU -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_RO_SHIFT 4U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_RO_CLRMSK 0xFFFFFFEFU -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_RO_EN 0x00000010U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_PM_META_RO_SHIFT 2U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_PM_META_RO_CLRMSK 0xFFFFFFFBU -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_PM_META_RO_EN 0x00000004U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_SHIFT 0U -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_CLRMSK 0xFFFFFFFEU -+#define DPX_CR_BIF_FAULT_BANK_MMU_STATUS_FAULT_EN 0x00000001U -+ -+/* Register DPX_CR_BIF_FAULT_BANK_REQ_STATUS */ -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS 0xC5D0U -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_MASKFULL 0x03FFFFFFFFFFFFF0ULL -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_RNW_SHIFT 57U -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_RNW_CLRMSK 0xFDFFFFFFFFFFFFFFULL -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_RNW_EN 0x0200000000000000ULL -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_TAG_SB_SHIFT 44U -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_TAG_SB_CLRMSK 0xFE000FFFFFFFFFFFULL -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_TAG_ID_SHIFT 40U -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_TAG_ID_CLRMSK 0xFFFFF0FFFFFFFFFFULL -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_ADDRESS_SHIFT 4U -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_ADDRESS_CLRMSK 0xFFFFFF000000000FULL -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_ADDRESS_ALIGNSHIFT 4U -+#define DPX_CR_BIF_FAULT_BANK_REQ_STATUS_ADDRESS_ALIGNSIZE 16U -+ -+/* Register DPX_CR_BIF_MMU_STATUS */ -+#define DPX_CR_BIF_MMU_STATUS 0xC5D8U -+#define DPX_CR_BIF_MMU_STATUS_MASKFULL 0x000000000FFFFFF7ULL -+#define DPX_CR_BIF_MMU_STATUS_PC_DATA_SHIFT 20U -+#define DPX_CR_BIF_MMU_STATUS_PC_DATA_CLRMSK 0xF00FFFFFU -+#define DPX_CR_BIF_MMU_STATUS_PD_DATA_SHIFT 12U -+#define DPX_CR_BIF_MMU_STATUS_PD_DATA_CLRMSK 0xFFF00FFFU -+#define DPX_CR_BIF_MMU_STATUS_PT_DATA_SHIFT 4U -+#define DPX_CR_BIF_MMU_STATUS_PT_DATA_CLRMSK 0xFFFFF00FU -+#define DPX_CR_BIF_MMU_STATUS_STALLED_SHIFT 2U -+#define DPX_CR_BIF_MMU_STATUS_STALLED_CLRMSK 0xFFFFFFFBU -+#define DPX_CR_BIF_MMU_STATUS_STALLED_EN 0x00000004U -+#define DPX_CR_BIF_MMU_STATUS_PAUSED_SHIFT 1U -+#define DPX_CR_BIF_MMU_STATUS_PAUSED_CLRMSK 0xFFFFFFFDU -+#define DPX_CR_BIF_MMU_STATUS_PAUSED_EN 0x00000002U -+#define DPX_CR_BIF_MMU_STATUS_BUSY_SHIFT 0U -+#define DPX_CR_BIF_MMU_STATUS_BUSY_CLRMSK 0xFFFFFFFEU -+#define DPX_CR_BIF_MMU_STATUS_BUSY_EN 0x00000001U -+ -+/* Register DPX_CR_RT_PERF */ -+#define DPX_CR_RT_PERF 0xC700U -+#define DPX_CR_RT_PERF_MASKFULL 0x000000000000001FULL -+#define DPX_CR_RT_PERF_CLR_3_SHIFT 4U -+#define DPX_CR_RT_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define DPX_CR_RT_PERF_CLR_3_EN 0x00000010U -+#define DPX_CR_RT_PERF_CLR_2_SHIFT 3U -+#define DPX_CR_RT_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define DPX_CR_RT_PERF_CLR_2_EN 0x00000008U -+#define DPX_CR_RT_PERF_CLR_1_SHIFT 2U -+#define DPX_CR_RT_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define DPX_CR_RT_PERF_CLR_1_EN 0x00000004U -+#define DPX_CR_RT_PERF_CLR_0_SHIFT 1U -+#define DPX_CR_RT_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define DPX_CR_RT_PERF_CLR_0_EN 0x00000002U -+#define DPX_CR_RT_PERF_CTRL_ENABLE_SHIFT 0U -+#define DPX_CR_RT_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define DPX_CR_RT_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register DPX_CR_RT_PERF_SELECT0 */ -+#define DPX_CR_RT_PERF_SELECT0 0xC708U -+#define DPX_CR_RT_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define DPX_CR_RT_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define DPX_CR_RT_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define DPX_CR_RT_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define DPX_CR_RT_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define DPX_CR_RT_PERF_SELECT0_MODE_SHIFT 21U -+#define DPX_CR_RT_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define DPX_CR_RT_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define DPX_CR_RT_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define DPX_CR_RT_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define DPX_CR_RT_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define DPX_CR_RT_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register DPX_CR_RT_PERF_COUNTER_0 */ -+#define DPX_CR_RT_PERF_COUNTER_0 0xC730U -+#define DPX_CR_RT_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define DPX_CR_RT_PERF_COUNTER_0_REG_SHIFT 0U -+#define DPX_CR_RT_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register DPX_CR_BX_TU_PERF */ -+#define DPX_CR_BX_TU_PERF 0xC908U -+#define DPX_CR_BX_TU_PERF_MASKFULL 0x000000000000001FULL -+#define DPX_CR_BX_TU_PERF_CLR_3_SHIFT 4U -+#define DPX_CR_BX_TU_PERF_CLR_3_CLRMSK 0xFFFFFFEFU -+#define DPX_CR_BX_TU_PERF_CLR_3_EN 0x00000010U -+#define DPX_CR_BX_TU_PERF_CLR_2_SHIFT 3U -+#define DPX_CR_BX_TU_PERF_CLR_2_CLRMSK 0xFFFFFFF7U -+#define DPX_CR_BX_TU_PERF_CLR_2_EN 0x00000008U -+#define DPX_CR_BX_TU_PERF_CLR_1_SHIFT 2U -+#define DPX_CR_BX_TU_PERF_CLR_1_CLRMSK 0xFFFFFFFBU -+#define DPX_CR_BX_TU_PERF_CLR_1_EN 0x00000004U -+#define DPX_CR_BX_TU_PERF_CLR_0_SHIFT 1U -+#define DPX_CR_BX_TU_PERF_CLR_0_CLRMSK 0xFFFFFFFDU -+#define DPX_CR_BX_TU_PERF_CLR_0_EN 0x00000002U -+#define DPX_CR_BX_TU_PERF_CTRL_ENABLE_SHIFT 0U -+#define DPX_CR_BX_TU_PERF_CTRL_ENABLE_CLRMSK 0xFFFFFFFEU -+#define DPX_CR_BX_TU_PERF_CTRL_ENABLE_EN 0x00000001U -+ -+/* Register DPX_CR_BX_TU_PERF_SELECT0 */ -+#define DPX_CR_BX_TU_PERF_SELECT0 0xC910U -+#define DPX_CR_BX_TU_PERF_SELECT0_MASKFULL 0x3FFF3FFF003FFFFFULL -+#define DPX_CR_BX_TU_PERF_SELECT0_BATCH_MAX_SHIFT 48U -+#define DPX_CR_BX_TU_PERF_SELECT0_BATCH_MAX_CLRMSK 0xC000FFFFFFFFFFFFULL -+#define DPX_CR_BX_TU_PERF_SELECT0_BATCH_MIN_SHIFT 32U -+#define DPX_CR_BX_TU_PERF_SELECT0_BATCH_MIN_CLRMSK 0xFFFFC000FFFFFFFFULL -+#define DPX_CR_BX_TU_PERF_SELECT0_MODE_SHIFT 21U -+#define DPX_CR_BX_TU_PERF_SELECT0_MODE_CLRMSK 0xFFFFFFFFFFDFFFFFULL -+#define DPX_CR_BX_TU_PERF_SELECT0_MODE_EN 0x0000000000200000ULL -+#define DPX_CR_BX_TU_PERF_SELECT0_GROUP_SELECT_SHIFT 16U -+#define DPX_CR_BX_TU_PERF_SELECT0_GROUP_SELECT_CLRMSK 0xFFFFFFFFFFE0FFFFULL -+#define DPX_CR_BX_TU_PERF_SELECT0_BIT_SELECT_SHIFT 0U -+#define DPX_CR_BX_TU_PERF_SELECT0_BIT_SELECT_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register DPX_CR_BX_TU_PERF_COUNTER_0 */ -+#define DPX_CR_BX_TU_PERF_COUNTER_0 0xC938U -+#define DPX_CR_BX_TU_PERF_COUNTER_0_MASKFULL 0x00000000FFFFFFFFULL -+#define DPX_CR_BX_TU_PERF_COUNTER_0_REG_SHIFT 0U -+#define DPX_CR_BX_TU_PERF_COUNTER_0_REG_CLRMSK 0x00000000U -+ -+/* Register DPX_CR_RS_PDS_RR_CHECKSUM */ -+#define DPX_CR_RS_PDS_RR_CHECKSUM 0xC0F0U -+#define DPX_CR_RS_PDS_RR_CHECKSUM_MASKFULL 0x00000000FFFFFFFFULL -+#define DPX_CR_RS_PDS_RR_CHECKSUM_VALUE_SHIFT 0U -+#define DPX_CR_RS_PDS_RR_CHECKSUM_VALUE_CLRMSK 0xFFFFFFFF00000000ULL -+ -+/* Register ROGUE_CR_MMU_CBASE_MAPPING_CONTEXT */ -+#define ROGUE_CR_MMU_CBASE_MAPPING_CONTEXT 0xE140U -+#define ROGUE_CR_MMU_CBASE_MAPPING_CONTEXT_MASKFULL 0x00000000000000FFULL -+#define ROGUE_CR_MMU_CBASE_MAPPING_CONTEXT_ID_SHIFT 0U -+#define ROGUE_CR_MMU_CBASE_MAPPING_CONTEXT_ID_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_MMU_CBASE_MAPPING */ -+#define ROGUE_CR_MMU_CBASE_MAPPING 0xE148U -+#define ROGUE_CR_MMU_CBASE_MAPPING_MASKFULL 0x000000000FFFFFFFULL -+#define ROGUE_CR_MMU_CBASE_MAPPING_BASE_ADDR_SHIFT 0U -+#define ROGUE_CR_MMU_CBASE_MAPPING_BASE_ADDR_CLRMSK 0xF0000000U -+#define ROGUE_CR_MMU_CBASE_MAPPING_BASE_ADDR_ALIGNSHIFT 12U -+#define ROGUE_CR_MMU_CBASE_MAPPING_BASE_ADDR_ALIGNSIZE 4096U -+ -+/* Register ROGUE_CR_MMU_FAULT_STATUS */ -+#define ROGUE_CR_MMU_FAULT_STATUS 0xE150U -+#define ROGUE_CR_MMU_FAULT_STATUS_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_ADDRESS_SHIFT 28U -+#define ROGUE_CR_MMU_FAULT_STATUS_ADDRESS_CLRMSK 0x000000000FFFFFFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_CONTEXT_SHIFT 20U -+#define ROGUE_CR_MMU_FAULT_STATUS_CONTEXT_CLRMSK 0xFFFFFFFFF00FFFFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_TAG_SB_SHIFT 12U -+#define ROGUE_CR_MMU_FAULT_STATUS_TAG_SB_CLRMSK 0xFFFFFFFFFFF00FFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_REQ_ID_SHIFT 6U -+#define ROGUE_CR_MMU_FAULT_STATUS_REQ_ID_CLRMSK 0xFFFFFFFFFFFFF03FULL -+#define ROGUE_CR_MMU_FAULT_STATUS_LEVEL_SHIFT 4U -+#define ROGUE_CR_MMU_FAULT_STATUS_LEVEL_CLRMSK 0xFFFFFFFFFFFFFFCFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_RNW_SHIFT 3U -+#define ROGUE_CR_MMU_FAULT_STATUS_RNW_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_MMU_FAULT_STATUS_RNW_EN 0x0000000000000008ULL -+#define ROGUE_CR_MMU_FAULT_STATUS_TYPE_SHIFT 1U -+#define ROGUE_CR_MMU_FAULT_STATUS_TYPE_CLRMSK 0xFFFFFFFFFFFFFFF9ULL -+#define ROGUE_CR_MMU_FAULT_STATUS_FAULT_SHIFT 0U -+#define ROGUE_CR_MMU_FAULT_STATUS_FAULT_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MMU_FAULT_STATUS_FAULT_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_MMU_FAULT_STATUS_META */ -+#define ROGUE_CR_MMU_FAULT_STATUS_META 0xE158U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_ADDRESS_SHIFT 28U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_ADDRESS_CLRMSK 0x000000000FFFFFFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_CONTEXT_SHIFT 20U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_CONTEXT_CLRMSK 0xFFFFFFFFF00FFFFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_TAG_SB_SHIFT 12U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_TAG_SB_CLRMSK 0xFFFFFFFFFFF00FFFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_REQ_ID_SHIFT 6U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_REQ_ID_CLRMSK 0xFFFFFFFFFFFFF03FULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_LEVEL_SHIFT 4U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_LEVEL_CLRMSK 0xFFFFFFFFFFFFFFCFULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_RNW_SHIFT 3U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_RNW_CLRMSK 0xFFFFFFFFFFFFFFF7ULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_RNW_EN 0x0000000000000008ULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_TYPE_SHIFT 1U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_TYPE_CLRMSK 0xFFFFFFFFFFFFFFF9ULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_FAULT_SHIFT 0U -+#define ROGUE_CR_MMU_FAULT_STATUS_META_FAULT_CLRMSK 0xFFFFFFFFFFFFFFFEULL -+#define ROGUE_CR_MMU_FAULT_STATUS_META_FAULT_EN 0x0000000000000001ULL -+ -+/* Register ROGUE_CR_SLC3_CTRL_MISC */ -+#define ROGUE_CR_SLC3_CTRL_MISC 0xE200U -+#define ROGUE_CR_SLC3_CTRL_MISC_MASKFULL 0x0000000000000107ULL -+#define ROGUE_CR_SLC3_CTRL_MISC_WRITE_COMBINER_SHIFT 8U -+#define ROGUE_CR_SLC3_CTRL_MISC_WRITE_COMBINER_CLRMSK 0xFFFFFEFFU -+#define ROGUE_CR_SLC3_CTRL_MISC_WRITE_COMBINER_EN 0x00000100U -+#define ROGUE_CR_SLC3_CTRL_MISC_ADDR_DECODE_MODE_SHIFT 0U -+#define ROGUE_CR_SLC3_CTRL_MISC_ADDR_DECODE_MODE_CLRMSK 0xFFFFFFF8U -+#define ROGUE_CR_SLC3_CTRL_MISC_ADDR_DECODE_MODE_LINEAR 0x00000000U -+#define ROGUE_CR_SLC3_CTRL_MISC_ADDR_DECODE_MODE_IN_PAGE_HASH 0x00000001U -+#define ROGUE_CR_SLC3_CTRL_MISC_ADDR_DECODE_MODE_FIXED_PVR_HASH 0x00000002U -+#define ROGUE_CR_SLC3_CTRL_MISC_ADDR_DECODE_MODE_SCRAMBLE_PVR_HASH 0x00000003U -+#define ROGUE_CR_SLC3_CTRL_MISC_ADDR_DECODE_MODE_WEAVED_HASH 0x00000004U -+ -+/* Register ROGUE_CR_SLC3_SCRAMBLE */ -+#define ROGUE_CR_SLC3_SCRAMBLE 0xE208U -+#define ROGUE_CR_SLC3_SCRAMBLE_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC3_SCRAMBLE_BITS_SHIFT 0U -+#define ROGUE_CR_SLC3_SCRAMBLE_BITS_CLRMSK 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_SLC3_SCRAMBLE2 */ -+#define ROGUE_CR_SLC3_SCRAMBLE2 0xE210U -+#define ROGUE_CR_SLC3_SCRAMBLE2_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC3_SCRAMBLE2_BITS_SHIFT 0U -+#define ROGUE_CR_SLC3_SCRAMBLE2_BITS_CLRMSK 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_SLC3_SCRAMBLE3 */ -+#define ROGUE_CR_SLC3_SCRAMBLE3 0xE218U -+#define ROGUE_CR_SLC3_SCRAMBLE3_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC3_SCRAMBLE3_BITS_SHIFT 0U -+#define ROGUE_CR_SLC3_SCRAMBLE3_BITS_CLRMSK 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_SLC3_SCRAMBLE4 */ -+#define ROGUE_CR_SLC3_SCRAMBLE4 0xE260U -+#define ROGUE_CR_SLC3_SCRAMBLE4_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC3_SCRAMBLE4_BITS_SHIFT 0U -+#define ROGUE_CR_SLC3_SCRAMBLE4_BITS_CLRMSK 0x0000000000000000ULL -+ -+/* Register ROGUE_CR_SLC3_STATUS */ -+#define ROGUE_CR_SLC3_STATUS 0xE220U -+#define ROGUE_CR_SLC3_STATUS_MASKFULL 0xFFFFFFFFFFFFFFFFULL -+#define ROGUE_CR_SLC3_STATUS_WRITES1_SHIFT 48U -+#define ROGUE_CR_SLC3_STATUS_WRITES1_CLRMSK 0x0000FFFFFFFFFFFFULL -+#define ROGUE_CR_SLC3_STATUS_WRITES0_SHIFT 32U -+#define ROGUE_CR_SLC3_STATUS_WRITES0_CLRMSK 0xFFFF0000FFFFFFFFULL -+#define ROGUE_CR_SLC3_STATUS_READS1_SHIFT 16U -+#define ROGUE_CR_SLC3_STATUS_READS1_CLRMSK 0xFFFFFFFF0000FFFFULL -+#define ROGUE_CR_SLC3_STATUS_READS0_SHIFT 0U -+#define ROGUE_CR_SLC3_STATUS_READS0_CLRMSK 0xFFFFFFFFFFFF0000ULL -+ -+/* Register ROGUE_CR_SLC3_IDLE */ -+#define ROGUE_CR_SLC3_IDLE 0xE228U -+#define ROGUE_CR_SLC3_IDLE_MASKFULL 0x00000000000FFFFFULL -+#define ROGUE_CR_SLC3_IDLE_ORDERQ_DUST2_SHIFT 18U -+#define ROGUE_CR_SLC3_IDLE_ORDERQ_DUST2_CLRMSK 0xFFF3FFFFU -+#define ROGUE_CR_SLC3_IDLE_MMU_SHIFT 17U -+#define ROGUE_CR_SLC3_IDLE_MMU_CLRMSK 0xFFFDFFFFU -+#define ROGUE_CR_SLC3_IDLE_MMU_EN 0x00020000U -+#define ROGUE_CR_SLC3_IDLE_RDI_SHIFT 16U -+#define ROGUE_CR_SLC3_IDLE_RDI_CLRMSK 0xFFFEFFFFU -+#define ROGUE_CR_SLC3_IDLE_RDI_EN 0x00010000U -+#define ROGUE_CR_SLC3_IDLE_IMGBV4_SHIFT 12U -+#define ROGUE_CR_SLC3_IDLE_IMGBV4_CLRMSK 0xFFFF0FFFU -+#define ROGUE_CR_SLC3_IDLE_CACHE_BANKS_SHIFT 4U -+#define ROGUE_CR_SLC3_IDLE_CACHE_BANKS_CLRMSK 0xFFFFF00FU -+#define ROGUE_CR_SLC3_IDLE_ORDERQ_DUST_SHIFT 2U -+#define ROGUE_CR_SLC3_IDLE_ORDERQ_DUST_CLRMSK 0xFFFFFFF3U -+#define ROGUE_CR_SLC3_IDLE_ORDERQ_JONES_SHIFT 1U -+#define ROGUE_CR_SLC3_IDLE_ORDERQ_JONES_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SLC3_IDLE_ORDERQ_JONES_EN 0x00000002U -+#define ROGUE_CR_SLC3_IDLE_XBAR_SHIFT 0U -+#define ROGUE_CR_SLC3_IDLE_XBAR_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SLC3_IDLE_XBAR_EN 0x00000001U -+ -+/* Register ROGUE_CR_SLC3_FAULT_STOP_STATUS */ -+#define ROGUE_CR_SLC3_FAULT_STOP_STATUS 0xE248U -+#define ROGUE_CR_SLC3_FAULT_STOP_STATUS_MASKFULL 0x0000000000001FFFULL -+#define ROGUE_CR_SLC3_FAULT_STOP_STATUS_BIF_SHIFT 0U -+#define ROGUE_CR_SLC3_FAULT_STOP_STATUS_BIF_CLRMSK 0xFFFFE000U -+ -+/* Register ROGUE_CR_VDM_CONTEXT_STORE_MODE */ -+#define ROGUE_CR_VDM_CONTEXT_STORE_MODE 0xF048U -+#define ROGUE_CR_VDM_CONTEXT_STORE_MODE_MASKFULL 0x0000000000000003ULL -+#define ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_SHIFT 0U -+#define ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_CLRMSK 0xFFFFFFFCU -+#define ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_INDEX 0x00000000U -+#define ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_INSTANCE 0x00000001U -+#define ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_LIST 0x00000002U -+ -+/* Register ROGUE_CR_CONTEXT_MAPPING0 */ -+#define ROGUE_CR_CONTEXT_MAPPING0 0xF078U -+#define ROGUE_CR_CONTEXT_MAPPING0_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING0_2D_SHIFT 24U -+#define ROGUE_CR_CONTEXT_MAPPING0_2D_CLRMSK 0x00FFFFFFU -+#define ROGUE_CR_CONTEXT_MAPPING0_CDM_SHIFT 16U -+#define ROGUE_CR_CONTEXT_MAPPING0_CDM_CLRMSK 0xFF00FFFFU -+#define ROGUE_CR_CONTEXT_MAPPING0_3D_SHIFT 8U -+#define ROGUE_CR_CONTEXT_MAPPING0_3D_CLRMSK 0xFFFF00FFU -+#define ROGUE_CR_CONTEXT_MAPPING0_TA_SHIFT 0U -+#define ROGUE_CR_CONTEXT_MAPPING0_TA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_CONTEXT_MAPPING1 */ -+#define ROGUE_CR_CONTEXT_MAPPING1 0xF080U -+#define ROGUE_CR_CONTEXT_MAPPING1_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING1_HOST_SHIFT 8U -+#define ROGUE_CR_CONTEXT_MAPPING1_HOST_CLRMSK 0xFFFF00FFU -+#define ROGUE_CR_CONTEXT_MAPPING1_TLA_SHIFT 0U -+#define ROGUE_CR_CONTEXT_MAPPING1_TLA_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_CONTEXT_MAPPING2 */ -+#define ROGUE_CR_CONTEXT_MAPPING2 0xF088U -+#define ROGUE_CR_CONTEXT_MAPPING2_MASKFULL 0x0000000000FFFFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING2_ALIST0_SHIFT 16U -+#define ROGUE_CR_CONTEXT_MAPPING2_ALIST0_CLRMSK 0xFF00FFFFU -+#define ROGUE_CR_CONTEXT_MAPPING2_TE0_SHIFT 8U -+#define ROGUE_CR_CONTEXT_MAPPING2_TE0_CLRMSK 0xFFFF00FFU -+#define ROGUE_CR_CONTEXT_MAPPING2_VCE0_SHIFT 0U -+#define ROGUE_CR_CONTEXT_MAPPING2_VCE0_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_CONTEXT_MAPPING3 */ -+#define ROGUE_CR_CONTEXT_MAPPING3 0xF090U -+#define ROGUE_CR_CONTEXT_MAPPING3_MASKFULL 0x0000000000FFFFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING3_ALIST1_SHIFT 16U -+#define ROGUE_CR_CONTEXT_MAPPING3_ALIST1_CLRMSK 0xFF00FFFFU -+#define ROGUE_CR_CONTEXT_MAPPING3_TE1_SHIFT 8U -+#define ROGUE_CR_CONTEXT_MAPPING3_TE1_CLRMSK 0xFFFF00FFU -+#define ROGUE_CR_CONTEXT_MAPPING3_VCE1_SHIFT 0U -+#define ROGUE_CR_CONTEXT_MAPPING3_VCE1_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_BIF_JONES_OUTSTANDING_READ */ -+#define ROGUE_CR_BIF_JONES_OUTSTANDING_READ 0xF098U -+#define ROGUE_CR_BIF_JONES_OUTSTANDING_READ_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_BIF_JONES_OUTSTANDING_READ_COUNTER_SHIFT 0U -+#define ROGUE_CR_BIF_JONES_OUTSTANDING_READ_COUNTER_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_BIF_BLACKPEARL_OUTSTANDING_READ */ -+#define ROGUE_CR_BIF_BLACKPEARL_OUTSTANDING_READ 0xF0A0U -+#define ROGUE_CR_BIF_BLACKPEARL_OUTSTANDING_READ_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_BIF_BLACKPEARL_OUTSTANDING_READ_COUNTER_SHIFT 0U -+#define ROGUE_CR_BIF_BLACKPEARL_OUTSTANDING_READ_COUNTER_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_BIF_DUST_OUTSTANDING_READ */ -+#define ROGUE_CR_BIF_DUST_OUTSTANDING_READ 0xF0A8U -+#define ROGUE_CR_BIF_DUST_OUTSTANDING_READ_MASKFULL 0x000000000000FFFFULL -+#define ROGUE_CR_BIF_DUST_OUTSTANDING_READ_COUNTER_SHIFT 0U -+#define ROGUE_CR_BIF_DUST_OUTSTANDING_READ_COUNTER_CLRMSK 0xFFFF0000U -+ -+/* Register ROGUE_CR_CONTEXT_MAPPING4 */ -+#define ROGUE_CR_CONTEXT_MAPPING4 0xF210U -+#define ROGUE_CR_CONTEXT_MAPPING4_MASKFULL 0x0000FFFFFFFFFFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING4_3D_MMU_STACK_SHIFT 40U -+#define ROGUE_CR_CONTEXT_MAPPING4_3D_MMU_STACK_CLRMSK 0xFFFF00FFFFFFFFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING4_3D_UFSTACK_SHIFT 32U -+#define ROGUE_CR_CONTEXT_MAPPING4_3D_UFSTACK_CLRMSK 0xFFFFFF00FFFFFFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING4_3D_FSTACK_SHIFT 24U -+#define ROGUE_CR_CONTEXT_MAPPING4_3D_FSTACK_CLRMSK 0xFFFFFFFF00FFFFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING4_TA_MMU_STACK_SHIFT 16U -+#define ROGUE_CR_CONTEXT_MAPPING4_TA_MMU_STACK_CLRMSK 0xFFFFFFFFFF00FFFFULL -+#define ROGUE_CR_CONTEXT_MAPPING4_TA_UFSTACK_SHIFT 8U -+#define ROGUE_CR_CONTEXT_MAPPING4_TA_UFSTACK_CLRMSK 0xFFFFFFFFFFFF00FFULL -+#define ROGUE_CR_CONTEXT_MAPPING4_TA_FSTACK_SHIFT 0U -+#define ROGUE_CR_CONTEXT_MAPPING4_TA_FSTACK_CLRMSK 0xFFFFFFFFFFFFFF00ULL -+ -+/* Register ROGUE_CR_MULTICORE_GPU */ -+#define ROGUE_CR_MULTICORE_GPU 0xF300U -+#define ROGUE_CR_MULTICORE_GPU_MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_FRAGMENT_SHIFT 6U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_FRAGMENT_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_FRAGMENT_EN 0x00000040U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_GEOMETRY_SHIFT 5U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_GEOMETRY_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_GEOMETRY_EN 0x00000020U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_COMPUTE_SHIFT 4U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_COMPUTE_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_COMPUTE_EN 0x00000010U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_PRIMARY_SHIFT 3U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_PRIMARY_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_MULTICORE_GPU_CAPABILITY_PRIMARY_EN 0x00000008U -+#define ROGUE_CR_MULTICORE_GPU_ID_SHIFT 0U -+#define ROGUE_CR_MULTICORE_GPU_ID_CLRMSK 0xFFFFFFF8U -+ -+/* Register ROGUE_CR_MULTICORE_SYSTEM */ -+#define ROGUE_CR_MULTICORE_SYSTEM 0xF308U -+#define ROGUE_CR_MULTICORE_SYSTEM_MASKFULL 0x000000000000000FULL -+#define ROGUE_CR_MULTICORE_SYSTEM_GPU_COUNT_SHIFT 0U -+#define ROGUE_CR_MULTICORE_SYSTEM_GPU_COUNT_CLRMSK 0xFFFFFFF0U -+ -+/* Register ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON */ -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON 0xF310U -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON_WORKLOAD_TYPE_SHIFT 30U -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON_WORKLOAD_TYPE_CLRMSK 0x3FFFFFFFU -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON_WORKLOAD_EXECUTE_COUNT_SHIFT 8U -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON_WORKLOAD_EXECUTE_COUNT_CLRMSK 0xC00000FFU -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON_GPU_ENABLE_SHIFT 0U -+#define ROGUE_CR_MULTICORE_FRAGMENT_CTRL_COMMON_GPU_ENABLE_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON */ -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON 0xF320U -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON_WORKLOAD_TYPE_SHIFT 30U -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON_WORKLOAD_TYPE_CLRMSK 0x3FFFFFFFU -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON_WORKLOAD_EXECUTE_COUNT_SHIFT 8U -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON_WORKLOAD_EXECUTE_COUNT_CLRMSK 0xC00000FFU -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON_GPU_ENABLE_SHIFT 0U -+#define ROGUE_CR_MULTICORE_GEOMETRY_CTRL_COMMON_GPU_ENABLE_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON */ -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON 0xF330U -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON_MASKFULL 0x00000000FFFFFFFFULL -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON_WORKLOAD_TYPE_SHIFT 30U -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON_WORKLOAD_TYPE_CLRMSK 0x3FFFFFFFU -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON_WORKLOAD_EXECUTE_COUNT_SHIFT 8U -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON_WORKLOAD_EXECUTE_COUNT_CLRMSK 0xC00000FFU -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON_GPU_ENABLE_SHIFT 0U -+#define ROGUE_CR_MULTICORE_COMPUTE_CTRL_COMMON_GPU_ENABLE_CLRMSK 0xFFFFFF00U -+ -+/* Register ROGUE_CR_ECC_RAM_ERR_INJ */ -+#define ROGUE_CR_ECC_RAM_ERR_INJ 0xF340U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_ECC_RAM_ERR_INJ_SLC_SIDEKICK_SHIFT 4U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_SLC_SIDEKICK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_ECC_RAM_ERR_INJ_SLC_SIDEKICK_EN 0x00000010U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_USC_SHIFT 3U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_USC_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_USC_EN 0x00000008U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_TPU_MCU_L0_SHIFT 2U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_TPU_MCU_L0_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_ECC_RAM_ERR_INJ_TPU_MCU_L0_EN 0x00000004U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_RASCAL_SHIFT 1U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_RASCAL_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_ECC_RAM_ERR_INJ_RASCAL_EN 0x00000002U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_MARS_SHIFT 0U -+#define ROGUE_CR_ECC_RAM_ERR_INJ_MARS_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_ECC_RAM_ERR_INJ_MARS_EN 0x00000001U -+ -+/* Register ROGUE_CR_ECC_RAM_INIT_KICK */ -+#define ROGUE_CR_ECC_RAM_INIT_KICK 0xF348U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_ECC_RAM_INIT_KICK_SLC_SIDEKICK_SHIFT 4U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_SLC_SIDEKICK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_ECC_RAM_INIT_KICK_SLC_SIDEKICK_EN 0x00000010U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_USC_SHIFT 3U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_USC_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_USC_EN 0x00000008U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_TPU_MCU_L0_SHIFT 2U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_TPU_MCU_L0_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_ECC_RAM_INIT_KICK_TPU_MCU_L0_EN 0x00000004U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_RASCAL_SHIFT 1U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_RASCAL_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_ECC_RAM_INIT_KICK_RASCAL_EN 0x00000002U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_MARS_SHIFT 0U -+#define ROGUE_CR_ECC_RAM_INIT_KICK_MARS_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_ECC_RAM_INIT_KICK_MARS_EN 0x00000001U -+ -+/* Register ROGUE_CR_ECC_RAM_INIT_DONE */ -+#define ROGUE_CR_ECC_RAM_INIT_DONE 0xF350U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_MASKFULL 0x000000000000001FULL -+#define ROGUE_CR_ECC_RAM_INIT_DONE_SLC_SIDEKICK_SHIFT 4U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_SLC_SIDEKICK_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_ECC_RAM_INIT_DONE_SLC_SIDEKICK_EN 0x00000010U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_USC_SHIFT 3U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_USC_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_USC_EN 0x00000008U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_TPU_MCU_L0_SHIFT 2U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_TPU_MCU_L0_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_ECC_RAM_INIT_DONE_TPU_MCU_L0_EN 0x00000004U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_RASCAL_SHIFT 1U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_RASCAL_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_ECC_RAM_INIT_DONE_RASCAL_EN 0x00000002U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_MARS_SHIFT 0U -+#define ROGUE_CR_ECC_RAM_INIT_DONE_MARS_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_ECC_RAM_INIT_DONE_MARS_EN 0x00000001U -+ -+/* Register ROGUE_CR_SAFETY_EVENT_ENABLE */ -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE 0xF390U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__CPU_PAGE_FAULT_SHIFT 6U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__CPU_PAGE_FAULT_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__CPU_PAGE_FAULT_EN 0x00000040U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__SAFE_COMPUTE_FAIL_SHIFT 5U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__SAFE_COMPUTE_FAIL_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__SAFE_COMPUTE_FAIL_EN 0x00000020U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__WATCHDOG_TIMEOUT_SHIFT 4U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__WATCHDOG_TIMEOUT_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__WATCHDOG_TIMEOUT_EN 0x00000010U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__TRP_FAIL_SHIFT 3U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__TRP_FAIL_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__TRP_FAIL_EN 0x00000008U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_FW_SHIFT 2U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_FW_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_FW_EN 0x00000004U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_GPU_SHIFT 1U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_GPU_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_GPU_EN 0x00000002U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__GPU_PAGE_FAULT_SHIFT 0U -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__GPU_PAGE_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SAFETY_EVENT_ENABLE__ROGUEXE__GPU_PAGE_FAULT_EN 0x00000001U -+ -+/* Register ROGUE_CR_SAFETY_EVENT_STATUS */ -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE 0xF398U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__CPU_PAGE_FAULT_SHIFT 6U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__CPU_PAGE_FAULT_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__CPU_PAGE_FAULT_EN 0x00000040U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__SAFE_COMPUTE_FAIL_SHIFT 5U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__SAFE_COMPUTE_FAIL_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__SAFE_COMPUTE_FAIL_EN 0x00000020U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__WATCHDOG_TIMEOUT_SHIFT 4U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__WATCHDOG_TIMEOUT_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__WATCHDOG_TIMEOUT_EN 0x00000010U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__TRP_FAIL_SHIFT 3U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__TRP_FAIL_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__TRP_FAIL_EN 0x00000008U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__FAULT_FW_SHIFT 2U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__FAULT_FW_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__FAULT_FW_EN 0x00000004U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__FAULT_GPU_SHIFT 1U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__FAULT_GPU_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__FAULT_GPU_EN 0x00000002U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__GPU_PAGE_FAULT_SHIFT 0U -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__GPU_PAGE_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SAFETY_EVENT_STATUS__ROGUEXE__GPU_PAGE_FAULT_EN 0x00000001U -+ -+/* Register ROGUE_CR_SAFETY_EVENT_CLEAR */ -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE 0xF3A0U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__CPU_PAGE_FAULT_SHIFT 6U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__CPU_PAGE_FAULT_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__CPU_PAGE_FAULT_EN 0x00000040U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__SAFE_COMPUTE_FAIL_SHIFT 5U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__SAFE_COMPUTE_FAIL_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__SAFE_COMPUTE_FAIL_EN 0x00000020U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__WATCHDOG_TIMEOUT_SHIFT 4U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__WATCHDOG_TIMEOUT_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__WATCHDOG_TIMEOUT_EN 0x00000010U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__TRP_FAIL_SHIFT 3U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__TRP_FAIL_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__TRP_FAIL_EN 0x00000008U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__FAULT_FW_SHIFT 2U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__FAULT_FW_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__FAULT_FW_EN 0x00000004U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__FAULT_GPU_SHIFT 1U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__FAULT_GPU_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__FAULT_GPU_EN 0x00000002U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__GPU_PAGE_FAULT_SHIFT 0U -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__GPU_PAGE_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_SAFETY_EVENT_CLEAR__ROGUEXE__GPU_PAGE_FAULT_EN 0x00000001U -+ -+/* Register ROGUE_CR_MTS_SAFETY_EVENT_ENABLE */ -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE 0xF3D8U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__MASKFULL 0x000000000000007FULL -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__CPU_PAGE_FAULT_SHIFT 6U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__CPU_PAGE_FAULT_CLRMSK 0xFFFFFFBFU -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__CPU_PAGE_FAULT_EN 0x00000040U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__SAFE_COMPUTE_FAIL_SHIFT 5U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__SAFE_COMPUTE_FAIL_CLRMSK 0xFFFFFFDFU -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__SAFE_COMPUTE_FAIL_EN 0x00000020U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__WATCHDOG_TIMEOUT_SHIFT 4U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__WATCHDOG_TIMEOUT_CLRMSK 0xFFFFFFEFU -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__WATCHDOG_TIMEOUT_EN 0x00000010U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__TRP_FAIL_SHIFT 3U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__TRP_FAIL_CLRMSK 0xFFFFFFF7U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__TRP_FAIL_EN 0x00000008U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_FW_SHIFT 2U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_FW_CLRMSK 0xFFFFFFFBU -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_FW_EN 0x00000004U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_GPU_SHIFT 1U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_GPU_CLRMSK 0xFFFFFFFDU -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__FAULT_GPU_EN 0x00000002U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__GPU_PAGE_FAULT_SHIFT 0U -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__GPU_PAGE_FAULT_CLRMSK 0xFFFFFFFEU -+#define ROGUE_CR_MTS_SAFETY_EVENT_ENABLE__ROGUEXE__GPU_PAGE_FAULT_EN 0x00000001U -+ -+/* clang-format on */ -+ -+#endif /* __PVR_ROGUE_CR_DEFS_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_defs.h b/drivers/gpu/drm/imagination/pvr_rogue_defs.h -new file mode 100644 -index 000000000000..584835c5682a ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_defs.h -@@ -0,0 +1,162 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_DEFS_H__ -+#define __PVR_ROGUE_DEFS_H__ -+ -+#include "pvr_rogue_cr_defs.h" -+ -+#include <linux/bits.h> -+ -+/* -+ ****************************************************************************** -+ * ROGUE Defines -+ ****************************************************************************** -+ */ -+ -+#define ROGUE_FW_MAX_NUM_OS (8U) -+#define ROGUE_FW_HOST_OS (0U) -+#define ROGUE_FW_GUEST_OSID_START (1U) -+ -+#define ROGUE_FW_THREAD_0 (0U) -+#define ROGUE_FW_THREAD_1 (1U) -+ -+#define GET_ROGUE_CACHE_LINE_SIZE(x) ((((s32)(x)) > 0) ? ((x) / 8) : (0)) -+ -+#define MAX_HW_GEOM_FRAG_CONTEXTS 2U -+ -+#define ROGUE_CR_CLK_CTRL_ALL_ON \ -+ (0x5555555555555555ull & ROGUE_CR_CLK_CTRL_MASKFULL) -+#define ROGUE_CR_CLK_CTRL_ALL_AUTO \ -+ (0xaaaaaaaaaaaaaaaaull & ROGUE_CR_CLK_CTRL_MASKFULL) -+#define ROGUE_CR_CLK_CTRL2_ALL_ON \ -+ (0x5555555555555555ull & ROGUE_CR_CLK_CTRL2_MASKFULL) -+#define ROGUE_CR_CLK_CTRL2_ALL_AUTO \ -+ (0xaaaaaaaaaaaaaaaaull & ROGUE_CR_CLK_CTRL2_MASKFULL) -+ -+#define ROGUE_CR_SOFT_RESET_DUST_n_CORE_EN \ -+ (ROGUE_CR_SOFT_RESET_DUST_A_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_B_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_C_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_D_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_E_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_F_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_G_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_H_CORE_EN) -+ -+/* SOFT_RESET Rascal and DUSTs bits */ -+#define ROGUE_CR_SOFT_RESET_RASCALDUSTS_EN \ -+ (ROGUE_CR_SOFT_RESET_RASCAL_CORE_EN | \ -+ ROGUE_CR_SOFT_RESET_DUST_n_CORE_EN) -+ -+/* SOFT_RESET steps as defined in the TRM */ -+#define ROGUE_S7_SOFT_RESET_DUSTS (ROGUE_CR_SOFT_RESET_DUST_n_CORE_EN) -+ -+#define ROGUE_S7_SOFT_RESET_JONES \ -+ (ROGUE_CR_SOFT_RESET_PM_EN | ROGUE_CR_SOFT_RESET_VDM_EN | \ -+ ROGUE_CR_SOFT_RESET_ISP_EN) -+ -+#define ROGUE_S7_SOFT_RESET_JONES_ALL \ -+ (ROGUE_S7_SOFT_RESET_JONES | ROGUE_CR_SOFT_RESET_BIF_EN | \ -+ ROGUE_CR_SOFT_RESET_SLC_EN | ROGUE_CR_SOFT_RESET_GARTEN_EN) -+ -+#define ROGUE_S7_SOFT_RESET2 \ -+ (ROGUE_CR_SOFT_RESET2_BLACKPEARL_EN | ROGUE_CR_SOFT_RESET2_PIXEL_EN | \ -+ ROGUE_CR_SOFT_RESET2_CDM_EN | ROGUE_CR_SOFT_RESET2_VERTEX_EN) -+ -+#define ROGUE_BIF_PM_PHYSICAL_PAGE_ALIGNSHIFT (12U) -+#define ROGUE_BIF_PM_PHYSICAL_PAGE_SIZE \ -+ BIT(ROGUE_BIF_PM_PHYSICAL_PAGE_ALIGNSHIFT) -+ -+#define ROGUE_BIF_PM_VIRTUAL_PAGE_ALIGNSHIFT (14U) -+#define ROGUE_BIF_PM_VIRTUAL_PAGE_SIZE BIT(ROGUE_BIF_PM_VIRTUAL_PAGE_ALIGNSHIFT) -+ -+#define ROGUE_BIF_PM_FREELIST_BASE_ADDR_ALIGNSIZE (16U) -+ -+/* -+ * To get the number of required Dusts, divide the number of -+ * clusters by 2 and round up -+ */ -+#define ROGUE_REQ_NUM_DUSTS(CLUSTERS) (((CLUSTERS) + 1U) / 2U) -+ -+/* -+ * To get the number of required Bernado/Phantom(s), divide -+ * the number of clusters by 4 and round up -+ */ -+#define ROGUE_REQ_NUM_PHANTOMS(CLUSTERS) (((CLUSTERS) + 3U) / 4U) -+#define ROGUE_REQ_NUM_BERNADOS(CLUSTERS) (((CLUSTERS) + 3U) / 4U) -+#define ROGUE_REQ_NUM_BLACKPEARLS(CLUSTERS) (((CLUSTERS) + 3U) / 4U) -+ -+/* -+ * FW MMU contexts -+ */ -+#define MMU_CONTEXT_MAPPING_FWPRIV (0x0) /* FW code/private data */ -+#define MMU_CONTEXT_MAPPING_FWIF (0x0) /* Host/FW data */ -+ -+/* -+ * Utility macros to calculate CAT_BASE register addresses -+ */ -+#define BIF_CAT_BASEX(n) \ -+ (ROGUE_CR_BIF_CAT_BASE0 + \ -+ (n) * (ROGUE_CR_BIF_CAT_BASE1 - ROGUE_CR_BIF_CAT_BASE0)) -+ -+#define FWCORE_MEM_CAT_BASEX(n) \ -+ (ROGUE_CR_FWCORE_MEM_CAT_BASE0 + \ -+ (n) * (ROGUE_CR_FWCORE_MEM_CAT_BASE1 - \ -+ ROGUE_CR_FWCORE_MEM_CAT_BASE0)) -+ -+/* -+ * FWCORE wrapper register defines -+ */ -+#define FWCORE_ADDR_REMAP_CONFIG0_MMU_CONTEXT_SHIFT \ -+ ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_CBASE_SHIFT -+#define FWCORE_ADDR_REMAP_CONFIG0_MMU_CONTEXT_CLRMSK \ -+ ROGUE_CR_FWCORE_ADDR_REMAP_CONFIG0_CBASE_CLRMSK -+#define FWCORE_ADDR_REMAP_CONFIG0_SIZE_ALIGNSHIFT (12U) -+ -+/* -+ ****************************************************************************** -+ * WA HWBRNs -+ ****************************************************************************** -+ */ -+ -+/* GPU CR timer tick in GPU cycles */ -+#define ROGUE_CRTIME_TICK_IN_CYCLES (256U) -+ -+/* for nohw multicore return max cores possible to client */ -+#define ROGUE_MULTICORE_MAX_NOHW_CORES (4U) -+ -+/* -+ * If the size of the SLC is less than this value then the TPU bypasses the SLC. -+ */ -+#define ROGUE_TPU_CACHED_SLC_SIZE_THRESHOLD (128U * 1024U) -+ -+/* -+ * If the size of the SLC is bigger than this value then the TCU must not be -+ * bypassed in the SLC. -+ * In XE_MEMORY_HIERARCHY cores, the TCU is bypassed by default. -+ */ -+#define ROGUE_TCU_CACHED_SLC_SIZE_THRESHOLD (32U * 1024U) -+ -+/* -+ * Register used by the FW to track the current boot stage (not used in MIPS) -+ */ -+#define ROGUE_FW_BOOT_STAGE_REGISTER (ROGUE_CR_POWER_ESTIMATE_RESULT) -+ -+/* -+ * Virtualisation definitions -+ */ -+#define ROGUE_VIRTUALISATION_REG_SIZE_PER_OS \ -+ (ROGUE_CR_MTS_SCHEDULE1 - ROGUE_CR_MTS_SCHEDULE) -+ -+/* -+ * Macro used to indicate which version of HWPerf is active -+ */ -+#define ROGUE_FEATURE_HWPERF_ROGUE -+ -+/* -+ * Maximum number of cores supported by TRP -+ */ -+#define ROGUE_TRP_MAX_NUM_CORES (4U) -+ -+#endif /* __PVR_ROGUE_DEFS_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_fwif.h b/drivers/gpu/drm/imagination/pvr_rogue_fwif.h -new file mode 100644 -index 000000000000..f17e8078c515 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_fwif.h -@@ -0,0 +1,2314 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_FWIF_H__ -+#define __PVR_ROGUE_FWIF_H__ -+ -+#include <linux/bits.h> -+#include <linux/build_bug.h> -+#include <linux/compiler.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+ -+#include "pvr_rogue_defs.h" -+#include "pvr_rogue_fwif_common.h" -+#include "pvr_rogue_fwif_shared.h" -+ -+/* -+ **************************************************************************** -+ * Logging type -+ **************************************************************************** -+ */ -+#define ROGUE_FWIF_LOG_TYPE_NONE 0x00000000U -+#define ROGUE_FWIF_LOG_TYPE_TRACE 0x00000001U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_MAIN 0x00000002U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_MTS 0x00000004U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_CLEANUP 0x00000008U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_CSW 0x00000010U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_BIF 0x00000020U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_PM 0x00000040U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_RTD 0x00000080U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_SPM 0x00000100U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_POW 0x00000200U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_HWR 0x00000400U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_HWP 0x00000800U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_RPM 0x00001000U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_DMA 0x00002000U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_MISC 0x00004000U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_DEBUG 0x80000000U -+#define ROGUE_FWIF_LOG_TYPE_GROUP_MASK 0x80007FFEU -+#define ROGUE_FWIF_LOG_TYPE_MASK 0x80007FFFU -+ -+/* String used in pvrdebug -h output */ -+#define ROGUE_FWIF_LOG_GROUPS_STRING_LIST \ -+ "main,mts,cleanup,csw,bif,pm,rtd,spm,pow,hwr,hwp,rpm,dma,misc,debug" -+ -+/* Table entry to map log group strings to log type value */ -+struct rogue_fwif_log_group_map_entry { -+ const char *log_group_name; -+ u32 log_group_type; -+}; -+ -+/* clang-format off */ -+/* -+ * Macro for use with the ROGUE_FWIF_LOG_GROUP_MAP_ENTRY type to create a lookup -+ * table where needed. Keep log group names short, no more than 20 chars. -+ */ -+#define ROGUE_FWIF_LOG_GROUP_NAME_VALUE_MAP \ -+ { "none", ROGUE_FWIF_LOG_TYPE_NONE }, \ -+ { "main", ROGUE_FWIF_LOG_TYPE_GROUP_MAIN }, \ -+ { "mts", ROGUE_FWIF_LOG_TYPE_GROUP_MTS }, \ -+ { "cleanup", ROGUE_FWIF_LOG_TYPE_GROUP_CLEANUP }, \ -+ { "csw", ROGUE_FWIF_LOG_TYPE_GROUP_CSW }, \ -+ { "bif", ROGUE_FWIF_LOG_TYPE_GROUP_BIF }, \ -+ { "pm", ROGUE_FWIF_LOG_TYPE_GROUP_PM }, \ -+ { "rtd", ROGUE_FWIF_LOG_TYPE_GROUP_RTD }, \ -+ { "spm", ROGUE_FWIF_LOG_TYPE_GROUP_SPM }, \ -+ { "pow", ROGUE_FWIF_LOG_TYPE_GROUP_POW }, \ -+ { "hwr", ROGUE_FWIF_LOG_TYPE_GROUP_HWR }, \ -+ { "hwp", ROGUE_FWIF_LOG_TYPE_GROUP_HWP }, \ -+ { "rpm", ROGUE_FWIF_LOG_TYPE_GROUP_RPM }, \ -+ { "dma", ROGUE_FWIF_LOG_TYPE_GROUP_DMA }, \ -+ { "misc", ROGUE_FWIF_LOG_TYPE_GROUP_MISC }, \ -+ { "debug", ROGUE_FWIF_LOG_TYPE_GROUP_DEBUG } -+/* clang-format on */ -+ -+/* -+ * Used in print statements to display log group state, one %s per group defined -+ */ -+#define ROGUE_FWIF_LOG_ENABLED_GROUPS_LIST_PFSPEC \ -+ "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" -+ -+/* clang-format off */ -+/* Used in a print statement to display log group state, one per group */ -+#define ROGUE_FWIF_LOG_ENABLED_GROUPS_LIST(types) \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_MAIN)) ? ("main ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_MTS)) ? ("mts ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_CLEANUP)) ? ("cleanup ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_CSW)) ? ("csw ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_BIF)) ? ("bif ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_PM)) ? ("pm ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_RTD)) ? ("rtd ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_SPM)) ? ("spm ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_POW)) ? ("pow ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_HWR)) ? ("hwr ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_HWP)) ? ("hwp ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_RPM)) ? ("rpm ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_DMA)) ? ("dma ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_MISC)) ? ("misc ") : ("")), \ -+ (((types)(&ROGUE_FWIF_LOG_TYPE_GROUP_DEBUG)) ? ("debug ") : ("")) -+/* clang-format on */ -+ -+/* -+ **************************************************************************** -+ * ROGUE FW signature checks -+ **************************************************************************** -+ */ -+#define ROGUE_FW_SIG_BUFFER_SIZE_MIN (8192) -+ -+/* -+ **************************************************************************** -+ * Trace Buffer -+ **************************************************************************** -+ */ -+ -+/* Default size of ROGUE_FWIF_TRACEBUF_SPACE in DWords */ -+#define ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS 12000U -+#define ROGUE_FW_TRACE_BUFFER_ASSERT_SIZE 200U -+#define ROGUE_FW_THREAD_NUM 1U -+ -+#define ROGUE_FW_POLL_TYPE_SET 0x80000000U -+ -+struct rogue_fwif_file_info_buf { -+ char path[ROGUE_FW_TRACE_BUFFER_ASSERT_SIZE]; -+ char info[ROGUE_FW_TRACE_BUFFER_ASSERT_SIZE]; -+ u32 line_num; -+} __aligned(8); -+ -+struct rogue_fwif_tracebuf_space { -+ u32 trace_pointer; -+ -+ u32 trace_buffer_fw_addr; -+ -+ /* To be used by host when reading from trace buffer */ -+ u32 *trace_buffer; -+ -+ struct rogue_fwif_file_info_buf assert_buf; -+} __aligned(8); -+ -+/* Total number of FW fault logs stored */ -+#define ROGUE_FWIF_FWFAULTINFO_MAX (8U) -+ -+struct rogue_fw_fault_info { -+ aligned_u64 cr_timer; -+ aligned_u64 os_timer; -+ u32 data __aligned(8); -+ u32 reserved; -+ struct rogue_fwif_file_info_buf fault_buf; -+} __aligned(8); -+ -+/* clang-format off */ -+#define ROGUE_FWIF_POW_STATES \ -+ X(ROGUE_FWIF_POW_OFF) /* idle and ready to full power down */ \ -+ X(ROGUE_FWIF_POW_ON) /* running HW commands */ \ -+ X(ROGUE_FWIF_POW_FORCED_IDLE) /* forced idle */ \ -+ X(ROGUE_FWIF_POW_IDLE) /* idle waiting for host handshake */ -+/* clang-format on */ -+ -+enum rogue_fwif_pow_state { -+#define X(NAME) NAME, -+ ROGUE_FWIF_POW_STATES -+#undef X -+}; -+ -+/* Firmware HWR states */ -+/* The HW state is ok or locked up */ -+#define ROGUE_FWIF_HWR_HARDWARE_OK BIT(0) -+/* The analysis of a GPU lockup has been performed */ -+#define ROGUE_FWIF_HWR_ANALYSIS_DONE BIT(2) -+/* A DM unrelated lockup has been detected */ -+#define ROGUE_FWIF_HWR_GENERAL_LOCKUP BIT(3) -+/* At least one DM is running without being close to a lockup */ -+#define ROGUE_FWIF_HWR_DM_RUNNING_OK BIT(4) -+/* At least one DM is close to lockup */ -+#define ROGUE_FWIF_HWR_DM_STALLING BIT(5) -+/* The FW has faulted and needs to restart */ -+#define ROGUE_FWIF_HWR_FW_FAULT BIT(6) -+/* The FW has requested the host to restart it */ -+#define ROGUE_FWIF_HWR_RESTART_REQUESTED BIT(7) -+ -+#define ROGUE_FWIF_PHR_STATE_SHIFT (8U) -+/* The FW has requested the host to restart it, per PHR configuration */ -+#define ROGUE_FWIF_PHR_RESTART_REQUESTED ((1) << ROGUE_FWIF_PHR_STATE_SHIFT) -+/* A PHR triggered GPU reset has just finished */ -+#define ROGUE_FWIF_PHR_RESTART_FINISHED ((2) << ROGUE_FWIF_PHR_STATE_SHIFT) -+#define ROGUE_FWIF_PHR_RESTART_MASK \ -+ (ROGUE_FWIF_PHR_RESTART_REQUESTED | ROGUE_FWIF_PHR_RESTART_FINISHED) -+ -+/* Firmware per-DM HWR states */ -+/* DM is working if all flags are cleared */ -+#define ROGUE_FWIF_DM_STATE_WORKING (0) -+/* DM is idle and ready for HWR */ -+#define ROGUE_FWIF_DM_STATE_READY_FOR_HWR BIT(0) -+/* DM need to skip to next cmd before resuming processing */ -+#define ROGUE_FWIF_DM_STATE_NEEDS_SKIP BIT(2) -+/* DM need partial render cleanup before resuming processing */ -+#define ROGUE_FWIF_DM_STATE_NEEDS_PR_CLEANUP BIT(3) -+/* DM need to increment Recovery Count once fully recovered */ -+#define ROGUE_FWIF_DM_STATE_NEEDS_TRACE_CLEAR BIT(4) -+/* DM was identified as locking up and causing HWR */ -+#define ROGUE_FWIF_DM_STATE_GUILTY_LOCKUP BIT(5) -+/* DM was innocently affected by another lockup which caused HWR */ -+#define ROGUE_FWIF_DM_STATE_INNOCENT_LOCKUP BIT(6) -+/* DM was identified as over-running and causing HWR */ -+#define ROGUE_FWIF_DM_STATE_GUILTY_OVERRUNING BIT(7) -+/* DM was innocently affected by another DM over-running which caused HWR */ -+#define ROGUE_FWIF_DM_STATE_INNOCENT_OVERRUNING BIT(8) -+/* DM was forced into HWR as it delayed more important workloads */ -+#define ROGUE_FWIF_DM_STATE_HARD_CONTEXT_SWITCH BIT(9) -+ -+/* Firmware's connection state */ -+enum rogue_fwif_connection_fw_state { -+ /* Firmware is offline */ -+ ROGUE_FW_CONNECTION_FW_OFFLINE = 0, -+ /* Firmware is initialised */ -+ ROGUE_FW_CONNECTION_FW_READY, -+ /* Firmware connection is fully established */ -+ ROGUE_FW_CONNECTION_FW_ACTIVE, -+ /* Firmware is clearing up connection data*/ -+ ROGUE_FW_CONNECTION_FW_OFFLOADING, -+ ROGUE_FW_CONNECTION_FW_STATE_COUNT -+}; -+ -+/* OS' connection state */ -+enum rogue_fwif_connection_os_state { -+ /* OS is offline */ -+ ROGUE_FW_CONNECTION_OS_OFFLINE = 0, -+ /* OS's KM driver is setup and waiting */ -+ ROGUE_FW_CONNECTION_OS_READY, -+ /* OS connection is fully established */ -+ ROGUE_FW_CONNECTION_OS_ACTIVE, -+ ROGUE_FW_CONNECTION_OS_STATE_COUNT -+}; -+ -+struct rogue_fwif_os_runtime_flags { -+ int os_state : 3; -+ int fl_ok : 1; -+ int fl_grow_pending : 1; -+ int isolated_os : 1; -+ int reserved : 26; -+}; -+ -+#define PVR_SLR_LOG_ENTRIES 10 -+/* MAX_CLIENT_CCB_NAME not visible to this header */ -+#define PVR_SLR_LOG_STRLEN 30 -+ -+struct rogue_fwif_slr_entry { -+ aligned_u64 timestamp; -+ u32 fw_ctx_addr; -+ u32 num_ufos; -+ char ccb_name[PVR_SLR_LOG_STRLEN]; -+} __aligned(8); -+ -+/* firmware trace control data */ -+struct rogue_fwif_tracebuf { -+ u32 log_type; -+ struct rogue_fwif_tracebuf_space tracebuf[ROGUE_FW_THREAD_NUM]; -+ /* -+ * Member initialised only when sTraceBuf is actually allocated (in -+ * ROGUETraceBufferInitOnDemandResources) -+ */ -+ u32 tracebuf_size_in_dwords; -+ /* Compatibility and other flags */ -+ u32 tracebuf_flags; -+} __aligned(8); -+ -+/* firmware system data shared with the Host driver */ -+struct rogue_fwif_sysdata { -+ /* Configuration flags from host */ -+ u32 config_flags; -+ /* Extended configuration flags from host */ -+ u32 config_flags_ext; -+ volatile enum rogue_fwif_pow_state pow_state; -+ volatile u32 hw_perf_ridx; -+ volatile u32 hw_perf_widx; -+ volatile u32 hw_perf_wrap_count; -+ /* Constant after setup, needed in FW */ -+ u32 hw_perf_size; -+ /* The number of times the FW drops a packet due to buffer full */ -+ u32 hw_perf_drop_count; -+ -+ /* -+ * ui32HWPerfUt, ui32FirstDropOrdinal, ui32LastDropOrdinal only valid -+ * when FW is built with ROGUE_HWPERF_UTILIZATION & -+ * ROGUE_HWPERF_DROP_TRACKING defined in rogue_fw_hwperf.c -+ */ -+ /* Buffer utilisation, high watermark of bytes in use */ -+ u32 hw_pert_ut; -+ /* The ordinal of the first packet the FW dropped */ -+ u32 first_drop_ordinal; -+ /* The ordinal of the last packet the FW dropped */ -+ u32 last_drop_ordinal; -+ /* State flags for each Operating System mirrored from Fw coremem */ -+ struct rogue_fwif_os_runtime_flags -+ os_runtime_flags_mirror[ROGUE_FW_MAX_NUM_OS]; -+ /* Priority for each Operating System mirrored from Fw coremem */ -+ u32 osid_prio_mirror[ROGUE_FW_MAX_NUM_OS]; -+ -+ /* Periodic Hardware Reset Mode mirrored from Fw coremem */ -+ u32 phr_mode_mirror; -+ struct rogue_fw_fault_info fault_info[ROGUE_FWIF_FWFAULTINFO_MAX]; -+ u32 fw_faults; -+ u32 cr_poll_addr[ROGUE_FW_THREAD_NUM]; -+ u32 cr_poll_mask[ROGUE_FW_THREAD_NUM]; -+ u32 cr_poll_count[ROGUE_FW_THREAD_NUM]; -+ aligned_u64 start_idle_time; -+ -+ /* -+ * Non-volatile power monitoring results: -+ * * static power (by default) -+ * * energy count (PVR_POWER_MONITOR_DYNAMIC_ENERGY) -+ */ -+ u32 pow_mon_estimate; -+ -+#if defined(SUPPORT_ROGUE_FW_STATS_FRAMEWORK) -+# define ROGUE_FWIF_STATS_FRAMEWORK_LINESIZE (8) -+# define ROGUE_FWIF_STATS_FRAMEWORK_MAX \ -+ (2048 * ROGUE_FWIF_STATS_FRAMEWORK_LINESIZE) -+ u32 fw_stats_buf[ROGUE_FWIF_STATS_FRAMEWORK_MAX] __aligned(8); -+#endif -+ u32 hwr_state_flags; -+ u32 hwr_recovery_flags[PVR_FWIF_DM_MAX]; -+ /* Compatibility and other flags */ -+ u32 fw_sys_data_flags; -+} __aligned(8); -+ -+/* per-os firmware shared data */ -+struct rogue_fwif_osdata { -+ /* Configuration flags from an OS */ -+ u32 fw_os_config_flags; -+ /* Markers to signal that the host should perform a full sync check */ -+ u32 fw_sync_check_mark; -+ u32 host_sync_check_mark; -+ -+ u32 force_updates_requested; -+ u8 slr_log_wp; -+ struct rogue_fwif_slr_entry slr_log_first; -+ struct rogue_fwif_slr_entry slr_log[PVR_SLR_LOG_ENTRIES]; -+ aligned_u64 last_forced_update_time; -+ -+ /* Interrupt count from Threads > */ -+ volatile u32 interrupt_count[ROGUE_FW_THREAD_NUM]; -+ u32 kccb_cmds_executed; -+ u32 power_sync_fw_addr; -+ /* Compatibility and other flags */ -+ u32 fw_os_data_flags; -+} __aligned(8); -+ -+/* Firmware trace time-stamp field breakup */ -+ -+/* ROGUE_CR_TIMER register read (48 bits) value*/ -+#define ROGUE_FWT_TIMESTAMP_TIME_SHIFT (0U) -+#define ROGUE_FWT_TIMESTAMP_TIME_CLRMSK (0xFFFF000000000000ull) -+ -+/* Extra debug-info (16 bits) */ -+#define ROGUE_FWT_TIMESTAMP_DEBUG_INFO_SHIFT (48U) -+#define ROGUE_FWT_TIMESTAMP_DEBUG_INFO_CLRMSK ~ROGUE_FWT_TIMESTAMP_TIME_CLRMSK -+ -+/* Debug-info sub-fields */ -+/* -+ * Bit 0: ROGUE_CR_EVENT_STATUS_MMU_PAGE_FAULT bit from ROGUE_CR_EVENT_STATUS -+ * register -+ */ -+#define ROGUE_FWT_DEBUG_INFO_MMU_PAGE_FAULT_SHIFT (0U) -+#define ROGUE_FWT_DEBUG_INFO_MMU_PAGE_FAULT_SET \ -+ BIT(ROGUE_FWT_DEBUG_INFO_MMU_PAGE_FAULT_SHIFT) -+ -+/* Bit 1: ROGUE_CR_BIF_MMU_ENTRY_PENDING bit from ROGUE_CR_BIF_MMU_ENTRY register */ -+#define ROGUE_FWT_DEBUG_INFO_MMU_ENTRY_PENDING_SHIFT (1U) -+#define ROGUE_FWT_DEBUG_INFO_MMU_ENTRY_PENDING_SET \ -+ BIT(ROGUE_FWT_DEBUG_INFO_MMU_ENTRY_PENDING_SHIFT) -+ -+/* Bit 2: ROGUE_CR_SLAVE_EVENT register is non-zero */ -+#define ROGUE_FWT_DEBUG_INFO_SLAVE_EVENTS_SHIFT (2U) -+#define ROGUE_FWT_DEBUG_INFO_SLAVE_EVENTS_SET \ -+ BIT(ROGUE_FWT_DEBUG_INFO_SLAVE_EVENTS_SHIFT) -+ -+/* Bit 3-15: Unused bits */ -+ -+#define ROGUE_FWT_DEBUG_INFO_STR_MAXLEN 64 -+#define ROGUE_FWT_DEBUG_INFO_STR_PREPEND " (debug info: " -+#define ROGUE_FWT_DEBUG_INFO_STR_APPEND ")" -+ -+/* -+ * Table of debug info sub-field's masks and corresponding message strings -+ * to be appended to firmware trace -+ * -+ * Mask : 16 bit mask to be applied to debug-info field -+ * String : debug info message string -+ */ -+ -+#define ROGUE_FWT_DEBUG_INFO_MSKSTRLIST \ -+ /*Mask, String*/ \ -+ X(ROGUE_FWT_DEBUG_INFO_MMU_PAGE_FAULT_SET, "mmu pf") \ -+ X(ROGUE_FWT_DEBUG_INFO_MMU_ENTRY_PENDING_SET, "mmu pending") \ -+ X(ROGUE_FWT_DEBUG_INFO_SLAVE_EVENTS_SET, "slave events") -+ -+/* -+ ****************************************************************************** -+ * HWR Data -+ ****************************************************************************** -+ */ -+enum rogue_hwrtype { -+ ROGUE_HWRTYPE_UNKNOWNFAILURE = 0, -+ ROGUE_HWRTYPE_OVERRUN = 1, -+ ROGUE_HWRTYPE_POLLFAILURE = 2, -+ ROGUE_HWRTYPE_BIF0FAULT = 3, -+ ROGUE_HWRTYPE_BIF1FAULT = 4, -+ ROGUE_HWRTYPE_TEXASBIF0FAULT = 5, -+ ROGUE_HWRTYPE_MMUFAULT = 6, -+ ROGUE_HWRTYPE_MMUMETAFAULT = 7, -+ ROGUE_HWRTYPE_MIPSTLBFAULT = 8, -+ ROGUE_HWRTYPE_ECCFAULT = 9, -+}; -+ -+#define ROGUE_FWIF_HWRTYPE_BIF_BANK_GET(hwr_type) \ -+ (((hwr_type) == ROGUE_HWRTYPE_BIF0FAULT) ? 0 : 1) -+ -+#define ROGUE_FWIF_HWRTYPE_PAGE_FAULT_GET(hwr_type) \ -+ ((((hwr_type) == ROGUE_HWRTYPE_BIF0FAULT) || \ -+ ((hwr_type) == ROGUE_HWRTYPE_BIF1FAULT) || \ -+ ((hwr_type) == ROGUE_HWRTYPE_TEXASBIF0FAULT) || \ -+ ((hwr_type) == ROGUE_HWRTYPE_MMUFAULT) || \ -+ ((hwr_type) == ROGUE_HWRTYPE_MMUMETAFAULT) || \ -+ ((hwr_type) == ROGUE_HWRTYPE_MIPSTLBFAULT)) \ -+ ? true \ -+ : false) -+ -+struct rogue_bifinfo { -+ aligned_u64 bif_req_status; -+ aligned_u64 bif_mmu_status; -+ aligned_u64 pc_address; /* phys address of the page catalogue */ -+ aligned_u64 reserved; -+}; -+ -+struct rogue_eccinfo { -+ u32 fault_gpu; -+}; -+ -+struct rogue_mmuinfo { -+ aligned_u64 mmu_status; -+ aligned_u64 pc_address; /* phys address of the page catalogue */ -+ aligned_u64 reserved; -+}; -+ -+struct rogue_pollinfo { -+ u32 thread_num; -+ u32 cr_poll_addr; -+ u32 cr_poll_mask; -+ u32 cr_poll_last_value; -+ aligned_u64 reserved; -+} __aligned(8); -+ -+struct rogue_tlbinfo { -+ u32 bad_addr; -+ u32 entry_lo; -+} __aligned(8); -+ -+struct rogue_hwrinfo { -+ union { -+ struct rogue_bifinfo bif_info; -+ struct rogue_mmuinfo mmu_info; -+ struct rogue_pollinfo poll_info; -+ struct rogue_tlbinfo tlb_info; -+ struct rogue_eccinfo ecc_info; -+ } hwr_data; -+ -+ aligned_u64 cr_timer; -+ aligned_u64 os_timer; -+ u32 frame_num; -+ u32 pid; -+ u32 active_hwrt_data; -+ u32 hwr_number; -+ u32 event_status; -+ u32 hwr_recovery_flags; -+ enum rogue_hwrtype hwr_type; -+ u32 dm; -+ u32 core_id; -+ aligned_u64 cr_time_of_kick; -+ aligned_u64 cr_time_hw_reset_start; -+ aligned_u64 cr_time_hw_reset_finish; -+ aligned_u64 cr_time_freelist_ready; -+ aligned_u64 reserved[2]; -+} __aligned(8); -+ -+/* Number of first HWR logs recorded (never overwritten by newer logs) */ -+#define ROGUE_FWIF_HWINFO_MAX_FIRST 8U -+/* Number of latest HWR logs (older logs are overwritten by newer logs) */ -+#define ROGUE_FWIF_HWINFO_MAX_LAST 8U -+/* Total number of HWR logs stored in a buffer */ -+#define ROGUE_FWIF_HWINFO_MAX \ -+ (ROGUE_FWIF_HWINFO_MAX_FIRST + ROGUE_FWIF_HWINFO_MAX_LAST) -+/* Index of the last log in the HWR log buffer */ -+#define ROGUE_FWIF_HWINFO_LAST_INDEX (ROGUE_FWIF_HWINFO_MAX - 1U) -+ -+struct rogue_fwif_hwrinfobuf { -+ struct rogue_hwrinfo hwr_info[ROGUE_FWIF_HWINFO_MAX]; -+ u32 hwr_counter; -+ u32 write_index; -+ u32 dd_req_count; -+ u32 hwr_info_buf_flags; /* Compatibility and other flags */ -+ u32 hwr_dm_locked_up_count[PVR_FWIF_DM_MAX]; -+ u32 hwr_dm_overran_count[PVR_FWIF_DM_MAX]; -+ u32 hwr_dm_recovered_count[PVR_FWIF_DM_MAX]; -+ u32 hwr_dm_false_detect_count[PVR_FWIF_DM_MAX]; -+} __aligned(8); -+ -+enum rogue_activepm_conf { -+ ROGUE_ACTIVEPM_FORCE_OFF = 0, -+ ROGUE_ACTIVEPM_FORCE_ON = 1, -+ ROGUE_ACTIVEPM_DEFAULT = 2 -+}; -+ -+enum rogue_rd_power_island_conf { -+ ROGUE_RD_POWER_ISLAND_FORCE_OFF = 0, -+ ROGUE_RD_POWER_ISLAND_FORCE_ON = 1, -+ ROGUE_RD_POWER_ISLAND_DEFAULT = 2 -+}; -+ -+/* -+ ****************************************************************************** -+ * Querying DM state -+ ****************************************************************************** -+ */ -+ -+struct rogue_fw_register_list { -+ /* Register number */ -+ u16 reg_num; -+ /* Indirect register number (or 0 if not used) */ -+ u16 indirect_reg_num; -+ /* Start value for indirect register */ -+ u16 indirect_start_val; -+ /* End value for indirect register */ -+ u16 indirect_end_val; -+}; -+ -+#define ROGUE_FWIF_CTXSWITCH_PROFILE_FAST_EN (1) -+#define ROGUE_FWIF_CTXSWITCH_PROFILE_MEDIUM_EN (2) -+#define ROGUE_FWIF_CTXSWITCH_PROFILE_SLOW_EN (3) -+#define ROGUE_FWIF_CTXSWITCH_PROFILE_NODELAY_EN (4) -+ -+#define ROGUE_FWIF_CDM_ARBITRATION_TASK_DEMAND_EN (1) -+#define ROGUE_FWIF_CDM_ARBITRATION_ROUND_ROBIN_EN (2) -+ -+#define ROGUE_FWIF_ISP_SCHEDMODE_VER1_IPP (1) -+#define ROGUE_FWIF_ISP_SCHEDMODE_VER2_ISP (2) -+/* -+ ****************************************************************************** -+ * ROGUE firmware Init Config Data -+ ****************************************************************************** -+ */ -+ -+/* Flag definitions affecting the firmware globally */ -+#define ROGUE_FWIF_INICFG_CTXSWITCH_MODE_RAND BIT(0) -+#define ROGUE_FWIF_INICFG_CTXSWITCH_SRESET_EN BIT(1) -+#define ROGUE_FWIF_INICFG_HWPERF_EN BIT(2) -+#define ROGUE_FWIF_INICFG_DM_KILL_MODE_RAND_EN BIT(3) -+#define ROGUE_FWIF_INICFG_POW_RASCALDUST BIT(4) -+/* Bit 5 is reserved. */ -+#define ROGUE_FWIF_INICFG_FBCDC_V3_1_EN BIT(6) -+#define ROGUE_FWIF_INICFG_CHECK_MLIST_EN BIT(7) -+#define ROGUE_FWIF_INICFG_DISABLE_CLKGATING_EN BIT(8) -+#define ROGUE_FWIF_INICFG_POLL_COUNTERS_EN BIT(9) -+#define ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_SHIFT (10) -+#define ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_INDEX \ -+ (ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_INDEX \ -+ << ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_SHIFT) -+#define ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_INSTANCE \ -+ (ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_INSTANCE \ -+ << ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_SHIFT) -+#define ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_LIST \ -+ (ROGUE_CR_VDM_CONTEXT_STORE_MODE_MODE_LIST \ -+ << ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_SHIFT) -+#define ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_MASK \ -+ (ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_INDEX | \ -+ ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_INSTANCE | \ -+ ROGUE_FWIF_INICFG_VDM_CTX_STORE_MODE_LIST) -+#define ROGUE_FWIF_INICFG_REGCONFIG_EN BIT(12) -+#define ROGUE_FWIF_INICFG_ASSERT_ON_OUTOFMEMORY BIT(13) -+#define ROGUE_FWIF_INICFG_HWP_DISABLE_FILTER BIT(14) -+#define ROGUE_FWIF_INICFG_CUSTOM_PERF_TIMER_EN BIT(15) -+#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT (16) -+#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_FAST \ -+ (ROGUE_FWIF_CTXSWITCH_PROFILE_FAST_EN \ -+ << ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT) -+#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_MEDIUM \ -+ (ROGUE_FWIF_CTXSWITCH_PROFILE_MEDIUM_EN \ -+ << ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT) -+#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SLOW \ -+ (ROGUE_FWIF_CTXSWITCH_PROFILE_SLOW_EN \ -+ << ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT) -+#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_NODELAY \ -+ (ROGUE_FWIF_CTXSWITCH_PROFILE_NODELAY_EN \ -+ << ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT) -+#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_MASK \ -+ (7 << ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT) -+#define ROGUE_FWIF_INICFG_DISABLE_DM_OVERLAP BIT(19) -+#define ROGUE_FWIF_INICFG_ASSERT_ON_HWR_TRIGGER BIT(20) -+#define ROGUE_FWIF_INICFG_FABRIC_COHERENCY_ENABLED BIT(21) -+#define ROGUE_FWIF_INICFG_VALIDATE_IRQ BIT(22) -+#define ROGUE_FWIF_INICFG_DISABLE_PDP_EN BIT(23) -+#define ROGUE_FWIF_INICFG_SPU_POWER_STATE_MASK_CHANGE_EN BIT(24) -+#define ROGUE_FWIF_INICFG_WORKEST BIT(25) -+#define ROGUE_FWIF_INICFG_PDVFS BIT(26) -+#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT (27) -+#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_TASK_DEMAND \ -+ (ROGUE_FWIF_CDM_ARBITRATION_TASK_DEMAND_EN \ -+ << ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT) -+#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_ROUND_ROBIN \ -+ (ROGUE_FWIF_CDM_ARBITRATION_ROUND_ROBIN_EN \ -+ << ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT) -+#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_MASK \ -+ (3 << ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT) -+#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_SHIFT (29) -+#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_NONE (0) -+#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER1_IPP \ -+ (ROGUE_FWIF_ISP_SCHEDMODE_VER1_IPP \ -+ << ROGUE_FWIF_INICFG_ISPSCHEDMODE_SHIFT) -+#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER2_ISP \ -+ (ROGUE_FWIF_ISP_SCHEDMODE_VER2_ISP \ -+ << ROGUE_FWIF_INICFG_ISPSCHEDMODE_SHIFT) -+#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_MASK \ -+ (ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER1_IPP | \ -+ ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER2_ISP) -+#define ROGUE_FWIF_INICFG_VALIDATE_SOCUSC_TIMER BIT(31) -+ -+#define ROGUE_FWIF_INICFG_ALL (0xFFFFFFFFU) -+ -+/* Extended Flag definitions affecting the firmware globally */ -+#define ROGUE_FWIF_INICFG_EXT_ALL (0x0U) -+ -+/* Flag definitions affecting only workloads submitted by a particular OS */ -+#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_TDM_EN BIT(0) -+#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_GEOM_EN BIT(1) -+#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_FRAG_EN BIT(2) -+#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_CDM_EN BIT(3) -+ -+#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_TDM BIT(4) -+#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_GEOM BIT(5) -+#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_FRAG BIT(6) -+#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_CDM BIT(7) -+ -+#define ROGUE_FWIF_INICFG_OS_ALL (0xFF) -+ -+#define ROGUE_FWIF_INICFG_SYS_CTXSWITCH_CLRMSK \ -+ ~(ROGUE_FWIF_INICFG_CTXSWITCH_MODE_RAND | \ -+ ROGUE_FWIF_INICFG_CTXSWITCH_SRESET_EN) -+ -+#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_DM_ALL \ -+ (ROGUE_FWIF_INICFG_OS_CTXSWITCH_TDM_EN | \ -+ ROGUE_FWIF_INICFG_OS_CTXSWITCH_GEOM_EN | \ -+ ROGUE_FWIF_INICFG_OS_CTXSWITCH_FRAG_EN | \ -+ ROGUE_FWIF_INICFG_OS_CTXSWITCH_CDM_EN) -+ -+#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_CLRMSK \ -+ ~(ROGUE_FWIF_INICFG_OS_CTXSWITCH_DM_ALL) -+ -+#define ROGUE_FWIF_FILTCFG_TRUNCATE_HALF BIT(3) -+#define ROGUE_FWIF_FILTCFG_TRUNCATE_INT BIT(2) -+#define ROGUE_FWIF_FILTCFG_NEW_FILTER_MODE BIT(1) -+ -+#if defined(ROGUE_FW_IRQ_OS_COUNTERS) -+/* clang-format off */ -+/* -+ * Unused registers re-purposed for storing counters of the Firmware's -+ * interrupts for each OS -+ */ -+# define IRQ_COUNTER_STORAGE_REGS \ -+ 0x2028U, /* ROGUE_CR_PM_TA_MMU_FSTACK */ \ -+ 0x2050U, /* ROGUE_CR_PM_3D_MMU_FSTACK */ \ -+ 0x2030U, /* ROGUE_CR_PM_START_OF_MMU_TACONTEXT*/ \ -+ 0x2058U, /* ROGUE_CR_PM_START_OF_MMU_3DCONTEXT*/ \ -+ 0x2058U, /* ROGUE_CR_PM_START_OF_MMU_3DCONTEXT*/ \ -+ 0x2058U, /* ROGUE_CR_PM_START_OF_MMU_3DCONTEXT*/ \ -+ 0x2058U, /* ROGUE_CR_PM_START_OF_MMU_3DCONTEXT*/ \ -+ 0x2058U, /* ROGUE_CR_PM_START_OF_MMU_3DCONTEXT*/ -+/* clang-format on */ -+#endif -+ -+struct rogue_fwif_dllist_node { -+ u32 p; -+ u32 n; -+}; -+ -+/* -+ * This number is used to represent an invalid page catalogue physical address -+ */ -+#define ROGUE_FWIF_INVALID_PC_PHYADDR 0xFFFFFFFFFFFFFFFFLLU -+ -+/* This number is used to represent unallocated page catalog base register */ -+#define ROGUE_FW_BIF_INVALID_PCREG 0xFFFFFFFFU -+ -+/* Firmware memory context. */ -+struct rogue_fwif_fwmemcontext { -+ /* device physical address of context's page catalogue */ -+ aligned_u64 pc_dev_paddr; -+ /* -+ * associated page catalog base register (ROGUE_FW_BIF_INVALID_PCREG == -+ * unallocated) -+ */ -+ u32 page_cat_base_reg_id; -+ /* breakpoint address */ -+ u32 breakpoint_addr; -+ /* breakpoint handler address */ -+ u32 bp_handler_addr; -+ /* DM and enable control for BP */ -+ u32 breakpoint_ctl; -+ /* Compatibility and other flags */ -+ u32 fw_mem_ctx_flags; -+} __aligned(8); -+ -+/* -+ * FW context state flags -+ */ -+#define ROGUE_FWIF_CONTEXT_FLAGS_NEED_RESUME (0x00000001U) -+#define ROGUE_FWIF_CONTEXT_FLAGS_MC_NEED_RESUME_MASKFULL (0x000000FFU) -+#define ROGUE_FWIF_CONTEXT_FLAGS_TDM_HEADER_STALE (0x00000100U) -+ -+/* -+ * Fast scale blit renders can be divided into smaller slices. The maximum -+ * screen size is 8192x8192 pixels or 256x256 tiles. The blit is sliced -+ * into 512x512 pixel blits or 16x16 tiles. Therefore, there are at most -+ * 256 slices of 16x16 tiles, which means we need 8bits to count up to -+ * which slice we have blitted so far. -+ */ -+#define ROGUE_FWIF_CONTEXT_SLICE_BLIT_X_MASK (0x00000F00) -+#define ROGUE_FWIF_CONTEXT_SLICE_BLIT_X_SHIFT (8) -+#define ROGUE_FWIF_CONTEXT_SLICE_BLIT_Y_MASK (0x0000F000) -+#define ROGUE_FWIF_CONTEXT_SLICE_BLIT_Y_SHIFT (12) -+ -+/* -+ * FW-accessible TA state which must be written out to memory on context store -+ */ -+struct rogue_fwif_geom_ctx_state { -+ /* To store in mid-TA */ -+ aligned_u64 geom_reg_vdm_call_stack_pointer; -+ /* Initial value (in case is 'lost' due to a lock-up */ -+ aligned_u64 geom_reg_vdm_call_stack_pointer_init; -+ aligned_u64 geom_reg_vdm_batch; -+ aligned_u64 geom_reg_vbs_so_prim0; -+ aligned_u64 geom_reg_vbs_so_prim1; -+ aligned_u64 geom_reg_vbs_so_prim2; -+ aligned_u64 geom_reg_vbs_so_prim3; -+ s16 geom_current_idx; -+} __aligned(8); -+ -+/* -+ * FW-accessible ISP state which must be written out to memory on context store -+ */ -+struct rogue_fwif_frag_ctx_state { -+ aligned_u64 frag_reg_pm_deallocated_mask_status; -+ aligned_u64 frag_reg_dm_pds_mtilefree_status; -+ /* Compatibility and other flags */ -+ u32 ctx_state_flags; -+ /* -+ * frag_reg_isp_store should be the last element of the structure as this -+ * is an array whose size is determined at runtime after detecting the -+ * ROGUE core -+ */ -+ u32 frag_reg_isp_store[]; -+} __aligned(8); -+ -+#define ROGUE_FWIF_CTX_USING_BUFFER_A (0) -+#define ROGUE_FWIF_CTX_USING_BUFFER_B (1U) -+ -+struct rogue_fwif_compute_ctx_state { -+ u32 ctx_state_flags; /* Target buffer and other flags */ -+}; -+ -+struct rogue_fwif_fwcommoncontext { -+ /* CCB details for this firmware context */ -+ u32 ccbctl_fw_addr; /* CCB control */ -+ u32 ccb_fw_addr; /* CCB base */ -+ struct rogue_fwif_dma_addr ccb_meta_dma_addr; -+ -+ /* List entry for the waiting list */ -+ struct rogue_fwif_dllist_node waiting_node __aligned(8); -+ /* List entry for the run list */ -+ struct rogue_fwif_dllist_node run_node __aligned(8); -+ /* UFO that last failed (or NULL) */ -+ struct rogue_fwif_ufo last_failed_ufo; -+ -+ /* Memory context */ -+ u32 fw_mem_context_fw_addr; -+ -+ /* Context suspend state */ -+ /* geom/frag context suspend state, read/written by FW */ -+ u32 context_state_addr __aligned(8); -+ -+ /* Framework state */ -+ /* Register updates for Framework */ -+ u32 rf_cmd_addr __aligned(8); -+ -+ /* Flags e.g. for context switching */ -+ u32 fw_com_ctx_flags; -+ u32 priority; -+ u32 priority_seq_num; -+ -+ /* References to the host side originators */ -+ /* the Server Common Context */ -+ u32 server_common_context_id; -+ /* associated process ID */ -+ u32 pid; -+ -+ /* Statistic updates waiting to be passed back to the host... */ -+ /* True when some stats are pending */ -+ bool stats_pending __aligned(4); -+ /* Number of stores on this context since last update */ -+ s32 stats_num_stores; -+ /* Number of OOMs on this context since last update */ -+ s32 stats_num_out_of_memory; -+ /* Number of PRs on this context since last update */ -+ s32 stats_num_partial_renders; -+ /* Data Master type */ -+ u32 dm; -+ /* Device Virtual Address of the signal the context is waiting on */ -+ aligned_u64 wait_signal_address; -+ /* List entry for the wait-signal list */ -+ struct rogue_fwif_dllist_node wait_signal_node __aligned(8); -+ /* List entry for the buffer stalled list */ -+ struct rogue_fwif_dllist_node buf_stalled_node __aligned(8); -+ /* Address of the circular buffer queue pointers */ -+ aligned_u64 cbuf_queue_ctrl_addr; -+ -+ aligned_u64 robustness_address; -+ /* Max HWR deadline limit in ms */ -+ u32 max_deadline_ms; -+ /* Following HWR circular buffer read-offset needs resetting */ -+ bool read_offset_needs_reset __aligned(4); -+} __aligned(8); -+ -+/* Firmware render context. */ -+struct rogue_fwif_fwrendercontext { -+ /* Geometry firmware context. */ -+ struct rogue_fwif_fwcommoncontext geom_context; -+ /* Fragment firmware context. */ -+ struct rogue_fwif_fwcommoncontext frag_context; -+ -+ struct rogue_fwif_static_rendercontext_state static_render_context_state; -+ -+ /* Number of commands submitted to the WorkEst FW CCB */ -+ u32 work_est_ccb_submitted; -+ -+ /* Compatibility and other flags */ -+ u32 fw_render_ctx_flags; -+} __aligned(8); -+ -+/* Firmware compute context. */ -+struct rogue_fwif_fwcomputecontext { -+ /* Firmware context for the CDM */ -+ struct rogue_fwif_fwcommoncontext cdm_context; -+ -+ struct rogue_fwif_static_computecontext_state -+ static_compute_context_state; -+ -+ /* Number of commands submitted to the WorkEst FW CCB */ -+ u32 work_est_ccb_submitted; -+ -+ /* Compatibility and other flags */ -+ u32 compute_ctx_flags; -+ -+ u32 kz_state; -+ u32 kz_checksum; -+ u32 core_mask_a; -+ u32 core_mask_b; -+} __aligned(8); -+ -+/* Firmware TDM context. */ -+struct rogue_fwif_fwtdmcontext { -+ /* Firmware context for the TDM */ -+ struct rogue_fwif_fwcommoncontext tdm_context; -+ -+ /* Number of commands submitted to the WorkEst FW CCB */ -+ u32 work_est_ccb_submitted; -+} __aligned(8); -+ -+/* Firmware TQ3D context. */ -+struct rogue_fwif_fwtransfercontext { -+ /* Firmware context for TQ3D. */ -+ struct rogue_fwif_fwcommoncontext tq_context; -+}; -+ -+/* -+ ****************************************************************************** -+ * Defines for CMD_TYPE corruption detection and forward compatibility check -+ ****************************************************************************** -+ */ -+ -+/* -+ * CMD_TYPE 32bit contains: -+ * 31:16 Reserved for magic value to detect corruption (16 bits) -+ * 15 Reserved for ROGUE_CCB_TYPE_TASK (1 bit) -+ * 14:0 Bits available for CMD_TYPEs (15 bits) -+ */ -+ -+/* Magic value to detect corruption */ -+#define ROGUE_CMD_MAGIC_DWORD (0x2ABC) -+#define ROGUE_CMD_MAGIC_DWORD_MASK (0xFFFF0000U) -+#define ROGUE_CMD_MAGIC_DWORD_SHIFT (16U) -+#define ROGUE_CMD_MAGIC_DWORD_SHIFTED \ -+ (ROGUE_CMD_MAGIC_DWORD << ROGUE_CMD_MAGIC_DWORD_SHIFT) -+ -+/* Kernel CCB control for ROGUE */ -+struct rogue_fwif_ccb_ctl { -+ /* write offset into array of commands (MUST be aligned to 16 bytes!) */ -+ volatile u32 write_offset; -+ /* read offset into array of commands */ -+ volatile u32 read_offset; -+ /* Offset wrapping mask (Total capacity of the CCB - 1) */ -+ u32 wrap_mask; -+ /* size of each command in bytes */ -+ u32 cmd_size; -+} __aligned(8); -+ -+/* Kernel CCB command structure for ROGUE */ -+ -+#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PT (0x1U) /* MMU_CTRL_INVAL_PT_EN */ -+#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PD (0x2U) /* MMU_CTRL_INVAL_PD_EN */ -+#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PC (0x4U) /* MMU_CTRL_INVAL_PC_EN */ -+ -+/* -+ * can't use PM_TLB0 bit from BIFPM_CTRL reg because it collides with PT -+ * bit from BIF_CTRL reg -+ */ -+#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PMTLB (0x10) -+/* BIF_CTRL_INVAL_TLB1_EN */ -+#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_TLB \ -+ (ROGUE_FWIF_MMUCACHEDATA_FLAGS_PMTLB | 0x8) -+/* MMU_CTRL_INVAL_ALL_CONTEXTS_EN */ -+#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_CTX_ALL (0x800) -+ -+/* indicates FW should interrupt the host */ -+#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_INTERRUPT (0x4000000U) -+ -+struct rogue_fwif_mmucachedata { -+ u32 cache_flags; -+ u32 mmu_cache_sync_fw_addr; -+ u32 mmu_cache_sync_update_value; -+}; -+ -+#define ROGUE_FWIF_BPDATA_FLAGS_ENABLE BIT(0) -+#define ROGUE_FWIF_BPDATA_FLAGS_WRITE BIT(1) -+#define ROGUE_FWIF_BPDATA_FLAGS_CTL BIT(2) -+#define ROGUE_FWIF_BPDATA_FLAGS_REGS BIT(3) -+ -+struct rogue_fwif_bpdata { -+ /* Memory context */ -+ u32 fw_mem_context_fw_addr; -+ /* Breakpoint address */ -+ u32 bp_addr; -+ /* Breakpoint handler */ -+ u32 bp_handler_addr; -+ /* Breakpoint control */ -+ u32 bp_dm; -+ u32 bp_data_flags; -+ /* Number of temporary registers to overallocate */ -+ u32 temp_regs; -+ /* Number of shared registers to overallocate */ -+ u32 shared_regs; -+ /* DM associated with the breakpoint */ -+ u32 dm; -+}; -+ -+#define ROGUE_FWIF_KCCB_CMD_KICK_DATA_MAX_NUM_CLEANUP_CTLS \ -+ (ROGUE_FWIF_PRBUFFER_MAXSUPPORTED + 1U) /* +1 is RTDATASET cleanup */ -+ -+struct rogue_fwif_kccb_cmd_kick_data { -+ /* address of the firmware context */ -+ u32 context_fw_addr; -+ /* Client CCB woff update */ -+ u32 client_woff_update; -+ /* Client CCB wrap mask update after CCCB growth */ -+ u32 client_wrap_mask_update; -+ /* number of CleanupCtl pointers attached */ -+ u32 num_cleanup_ctl; -+ /* CleanupCtl structures associated with command */ -+ u32 cleanup_ctl_fw_addr -+ [ROGUE_FWIF_KCCB_CMD_KICK_DATA_MAX_NUM_CLEANUP_CTLS]; -+ /* -+ * offset to the CmdHeader which houses the workload estimation kick -+ * data. -+ */ -+ u32 work_est_cmd_header_offset; -+}; -+ -+struct rogue_fwif_kccb_cmd_combined_geom_frag_kick_data { -+ struct rogue_fwif_kccb_cmd_kick_data geom_cmd_kick_data; -+ struct rogue_fwif_kccb_cmd_kick_data frag_cmd_kick_data; -+}; -+ -+struct rogue_fwif_kccb_cmd_force_update_data { -+ /* address of the firmware context */ -+ u32 context_fw_addr; -+ /* Client CCB fence offset */ -+ u32 ccb_fence_offset; -+}; -+ -+struct rogue_fwif_kccb_cmd_phr_cfg_data { -+ /* Variable containing PHR configuration values */ -+ u32 phr_mode; -+}; -+ -+#define ROGUEIF_PHR_MODE_OFF (0UL) -+#define ROGUEIF_PHR_MODE_RD_RESET (1UL) -+#define ROGUEIF_PHR_MODE_FULL_RESET (2UL) -+ -+struct rogue_fwif_kccb_cmd_wdg_cfg_data { -+ /* Variable containing the requested watchdog period in microseconds */ -+ u32 wdg_period_us; -+}; -+ -+enum rogue_fwif_cleanup_type { -+ /* FW common context cleanup */ -+ ROGUE_FWIF_CLEANUP_FWCOMMONCONTEXT, -+ /* FW HW RT data cleanup */ -+ ROGUE_FWIF_CLEANUP_HWRTDATA, -+ /* FW freelist cleanup */ -+ ROGUE_FWIF_CLEANUP_FREELIST, -+ /* FW ZS Buffer cleanup */ -+ ROGUE_FWIF_CLEANUP_ZSBUFFER, -+}; -+ -+struct rogue_fwif_cleanup_request { -+ /* Cleanup type */ -+ enum rogue_fwif_cleanup_type cleanup_type; -+ union { -+ /* FW common context to cleanup */ -+ u32 context_fw_addr; -+ /* HW RT to cleanup */ -+ u32 hwrt_data_fw_addr; -+ /* Freelist to cleanup */ -+ u32 freelist_fw_addr; -+ /* ZS Buffer to cleanup */ -+ u32 zs_buffer_fw_addr; -+ } cleanup_data; -+}; -+ -+enum rogue_fwif_power_type { -+ ROGUE_FWIF_POW_OFF_REQ = 1, -+ ROGUE_FWIF_POW_FORCED_IDLE_REQ, -+ ROGUE_FWIF_POW_NUM_UNITS_CHANGE, -+ ROGUE_FWIF_POW_APM_LATENCY_CHANGE -+}; -+ -+enum rogue_fwif_power_force_idle_type { -+ ROGUE_FWIF_POWER_FORCE_IDLE = 1, -+ ROGUE_FWIF_POWER_CANCEL_FORCED_IDLE, -+ ROGUE_FWIF_POWER_HOST_TIMEOUT, -+}; -+ -+struct rogue_fwif_power_request { -+ /* Type of power request */ -+ enum rogue_fwif_power_type pow_type; -+ union { -+ /* Number of active Dusts */ -+ u32 num_of_dusts; -+ /* If the operation is mandatory */ -+ bool forced __aligned(4); -+ /* -+ * Type of Request. Consolidating Force Idle, Cancel Forced -+ * Idle, Host Timeout -+ */ -+ enum rogue_fwif_power_force_idle_type pow_request_type; -+ /* Number of milliseconds to set APM latency */ -+ u32 active_pm_latency_ms; -+ } power_req_data; -+}; -+ -+struct rogue_fwif_slcflushinvaldata { -+ /* Context to fence on (only useful when bDMContext == TRUE) */ -+ u32 context_fw_addr; -+ /* Invalidate the cache as well as flushing */ -+ bool inval __aligned(4); -+ /* The data to flush/invalidate belongs to a specific DM context */ -+ bool dm_context __aligned(4); -+}; -+ -+struct rogue_fwif_hcs_ctl { -+ /* New number of milliseconds C/S is allowed to last */ -+ u32 hcs_deadling_ms; -+}; -+ -+enum rogue_fwif_hwperf_update_config { -+ ROGUE_FWIF_HWPERF_CTRL_TOGGLE = 0, -+ ROGUE_FWIF_HWPERF_CTRL_SET = 1, -+ ROGUE_FWIF_HWPERF_CTRL_EMIT_FEATURES_EV = 2 -+}; -+ -+struct rogue_fwif_hwperf_ctrl { -+ enum rogue_fwif_hwperf_update_config opcode; /* Control operation code */ -+ aligned_u64 mask; /* Mask of events to toggle */ -+}; -+ -+struct rogue_fwif_hwperf_config_enable_blks { -+ /* Number of ROGUE_HWPERF_CONFIG_CNTBLK in the array */ -+ u32 num_blocks; -+ /* Address of the ROGUE_HWPERF_CONFIG_CNTBLK array */ -+ u32 block_configs_fw_addr; -+}; -+ -+struct rogue_fwif_coreclkspeedchange_data { -+ u32 new_clock_speed; /* New clock speed */ -+}; -+ -+#define ROGUE_FWIF_HWPERF_CTRL_BLKS_MAX 16 -+ -+struct rogue_fwif_hwperf_ctrl_blks { -+ bool enable __aligned(4); -+ /* Number of block IDs in the array */ -+ u32 num_blocks; -+ /* Array of ROGUE_HWPERF_CNTBLK_ID values */ -+ u16 block_ids[ROGUE_FWIF_HWPERF_CTRL_BLKS_MAX]; -+}; -+ -+struct rogue_fwif_hwperf_select_custom_cntrs { -+ u16 custom_block; -+ u16 num_counters; -+ u32 custom_counter_ids_fw_addr; -+}; -+ -+struct rogue_fwif_zsbuffer_backing_data { -+ u32 zs_buffer_fw_addr; /* ZS-Buffer FW address */ -+ bool done __aligned(4); /* action backing/unbacking succeeded */ -+}; -+ -+struct rogue_fwif_freelist_gs_data { -+ /* Freelist FW address */ -+ u32 freelist_fw_addr; -+ /* Amount of the Freelist change */ -+ u32 delta_pages; -+ /* New amount of pages on the freelist (including ready pages) */ -+ u32 new_pages; -+ /* Number of ready pages to be held in reserve until OOM */ -+ u32 ready_pages; -+}; -+ -+#define ROGUE_FWIF_MAX_FREELISTS_TO_RECONSTRUCT \ -+ (MAX_HW_GEOM_FRAG_CONTEXTS * ROGUE_FW_MAX_FREELISTS * 2U) -+#define ROGUE_FWIF_FREELISTS_RECONSTRUCTION_FAILED_FLAG 0x80000000U -+ -+struct rogue_fwif_freelists_reconstruction_data { -+ u32 freelist_count; -+ u32 freelist_ids[ROGUE_FWIF_MAX_FREELISTS_TO_RECONSTRUCT]; -+}; -+ -+struct rogue_fwif_signal_update_data { -+ /* device virtual address of the updated signal */ -+ aligned_u64 dev_signal_address; -+ /* Memory context */ -+ u32 fw_mem_context_fw_addr; -+} __aligned(8); -+ -+struct rogue_fwif_write_offset_update_data { -+ /* -+ * Context to that may need to be resumed following write offset update -+ */ -+ u32 context_fw_addr; -+} __aligned(8); -+ -+/* -+ ****************************************************************************** -+ * Proactive DVFS Structures -+ ****************************************************************************** -+ */ -+#define NUM_OPP_VALUES 16 -+ -+struct pdvfs_opp { -+ u32 volt; /* V */ -+ u32 freq; /* Hz */ -+} __aligned(8); -+ -+struct rogue_fwif_pdvfs_opp { -+ struct pdvfs_opp opp_salues[NUM_OPP_VALUES]; -+ u32 max_opp_point; -+} __aligned(8); -+ -+struct rogue_fwif_pdvfs_max_freq_data { -+ u32 max_opp_point; -+} __aligned(8); -+ -+struct rogue_fwif_pdvfs_min_freq_data { -+ u32 min_opp_point; -+} __aligned(8); -+ -+/* -+ ****************************************************************************** -+ * Register configuration structures -+ ****************************************************************************** -+ */ -+ -+#define ROGUE_FWIF_REG_CFG_MAX_SIZE 512 -+ -+enum rogue_fwif_regdata_cmd_type { -+ ROGUE_FWIF_REGCFG_CMD_ADD = 101, -+ ROGUE_FWIF_REGCFG_CMD_CLEAR = 102, -+ ROGUE_FWIF_REGCFG_CMD_ENABLE = 103, -+ ROGUE_FWIF_REGCFG_CMD_DISABLE = 104 -+}; -+ -+enum rogue_fwif_reg_cfg_type { -+ /* Sidekick power event */ -+ ROGUE_FWIF_REG_CFG_TYPE_PWR_ON = 0, -+ /* Rascal / dust power event */ -+ ROGUE_FWIF_REG_CFG_TYPE_DUST_CHANGE, -+ /* Geometry kick */ -+ ROGUE_FWIF_REG_CFG_TYPE_GEOM, -+ /* Fragment kick */ -+ ROGUE_FWIF_REG_CFG_TYPE_FRAG, -+ /* Compute kick */ -+ ROGUE_FWIF_REG_CFG_TYPE_CDM, -+ /* TLA kick */ -+ ROGUE_FWIF_REG_CFG_TYPE_TLA, -+ /* TDM kick */ -+ ROGUE_FWIF_REG_CFG_TYPE_TDM, -+ /* Applies to all types. Keep as last element */ -+ ROGUE_FWIF_REG_CFG_TYPE_ALL -+}; -+ -+struct rogue_fwif_reg_cfg_rec { -+ u64 sddr; -+ u64 mask; -+ u64 value; -+}; -+ -+struct rogue_fwif_regconfig_data { -+ enum rogue_fwif_regdata_cmd_type cmd_type; -+ enum rogue_fwif_reg_cfg_type reg_config_type; -+ struct rogue_fwif_reg_cfg_rec reg_config __aligned(8); -+}; -+ -+struct rogue_fwif_reg_cfg { -+ /* -+ * PDump WRW command write granularity is 32 bits. -+ * Add padding to ensure array size is 32 bit granular. -+ */ -+ u8 num_regs_type[ALIGN((u32)ROGUE_FWIF_REG_CFG_TYPE_ALL, -+ sizeof(u32))] __aligned(8); -+ struct rogue_fwif_reg_cfg_rec -+ reg_configs[ROGUE_FWIF_REG_CFG_MAX_SIZE] __aligned(8); -+} __aligned(8); -+ -+/* OSid Scheduling Priority Change */ -+struct rogue_fwif_osid_priority_data { -+ u32 osid_num; -+ u32 priority; -+}; -+ -+/* clang-format off */ -+enum rogue_fwif_os_state_change { -+ ROGUE_FWIF_OS_ONLINE = 1, -+ ROGUE_FWIF_OS_OFFLINE -+}; -+/* clang-format on */ -+ -+struct rogue_fwif_os_state_change_data { -+ u32 osid; -+ enum rogue_fwif_os_state_change new_os_state; -+} __aligned(8); -+ -+enum rogue_fwif_counter_dump_request { -+ ROGUE_FWIF_PWR_COUNTER_DUMP_START = 1, -+ ROGUE_FWIF_PWR_COUNTER_DUMP_STOP, -+ ROGUE_FWIF_PWR_COUNTER_DUMP_SAMPLE, -+}; -+ -+struct rogue_fwif_counter_dump_data { -+ enum rogue_fwif_counter_dump_request counter_dump_request; -+} __aligned(8); -+ -+enum rogue_fwif_kccb_cmd_type { -+ /* Common commands */ -+ ROGUE_FWIF_KCCB_CMD_KICK = 101U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ ROGUE_FWIF_KCCB_CMD_MMUCACHE = 102U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ ROGUE_FWIF_KCCB_CMD_BP = 103U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* SLC flush and invalidation request */ -+ ROGUE_FWIF_KCCB_CMD_SLCFLUSHINVAL = 105U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* -+ * Requests cleanup of a FW resource (type specified in the command -+ * data) -+ */ -+ ROGUE_FWIF_KCCB_CMD_CLEANUP = 106U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Power request */ -+ ROGUE_FWIF_KCCB_CMD_POW = 107U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Backing for on-demand ZS-Buffer done */ -+ ROGUE_FWIF_KCCB_CMD_ZSBUFFER_BACKING_UPDATE = -+ 108U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Unbacking for on-demand ZS-Buffer done */ -+ ROGUE_FWIF_KCCB_CMD_ZSBUFFER_UNBACKING_UPDATE = -+ 109U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Freelist Grow done */ -+ ROGUE_FWIF_KCCB_CMD_FREELIST_GROW_UPDATE = -+ 110U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Freelists Reconstruction done */ -+ ROGUE_FWIF_KCCB_CMD_FREELISTS_RECONSTRUCTION_UPDATE = -+ 112U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Informs the firmware that the host has performed a signal update */ -+ ROGUE_FWIF_KCCB_CMD_NOTIFY_SIGNAL_UPDATE = -+ 113U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* -+ * Informs the firmware that the host has added more data to a CDM2 -+ * Circular Buffer -+ */ -+ ROGUE_FWIF_KCCB_CMD_NOTIFY_WRITE_OFFSET_UPDATE = -+ 114U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Health check request */ -+ ROGUE_FWIF_KCCB_CMD_HEALTH_CHECK = 115U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Forcing signalling of all unmet UFOs for a given CCB offset */ -+ ROGUE_FWIF_KCCB_CMD_FORCE_UPDATE = 116U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ -+ /* There is a geometry and a fragment command in this single kick */ -+ ROGUE_FWIF_KCCB_CMD_COMBINED_GEOM_FRAG_KICK = 117U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ -+ /* Commands only permitted to the native or host OS */ -+ ROGUE_FWIF_KCCB_CMD_REGCONFIG = 200U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Configure the custom counters for HWPerf */ -+ ROGUE_FWIF_KCCB_CMD_HWPERF_SELECT_CUSTOM_CNTRS = -+ 201U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* -+ * Ask the firmware to update its cached ui32LogType value from the -+ * (shared) tracebuf control structure -+ */ -+ ROGUE_FWIF_KCCB_CMD_LOGTYPE_UPDATE = 202U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Set a maximum frequency/OPP point */ -+ ROGUE_FWIF_KCCB_CMD_PDVFS_LIMIT_MAX_FREQ = -+ 203U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* -+ * Changes the relative scheduling priority for a particular OSid. It -+ * can only be serviced for the Host DDK -+ */ -+ ROGUE_FWIF_KCCB_CMD_OSID_PRIORITY_CHANGE = -+ 204U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Set or clear firmware state flags */ -+ ROGUE_FWIF_KCCB_CMD_STATEFLAGS_CTRL = 205U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Set hard context switching deadline */ -+ ROGUE_FWIF_KCCB_CMD_HCS_SET_DEADLINE = 206U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* -+ * Informs the FW that a Guest OS has come online / offline. It can only -+ * be serviced for the Host DDK -+ */ -+ ROGUE_FWIF_KCCB_CMD_OS_ONLINE_STATE_CONFIGURE = -+ 207U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Controls counter dumping in the FW */ -+ ROGUE_FWIF_KCCB_CMD_COUNTER_DUMP = 208U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* -+ * Configure HWPerf events (to be generated) and HWPerf buffer address -+ * (if required) -+ */ -+ ROGUE_FWIF_KCCB_CMD_HWPERF_UPDATE_CONFIG = -+ 209U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Configure, clear and enable multiple HWPerf blocks */ -+ ROGUE_FWIF_KCCB_CMD_HWPERF_CONFIG_ENABLE_BLKS = -+ 210U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* -+ * Enable or disable multiple HWPerf blocks (reusing existing -+ * configuration) -+ */ -+ ROGUE_FWIF_KCCB_CMD_HWPERF_CTRL_BLKS = 211U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Core clock speed change event */ -+ ROGUE_FWIF_KCCB_CMD_CORECLKSPEEDCHANGE = 212U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Set a minimum frequency/OPP point */ -+ ROGUE_FWIF_KCCB_CMD_PDVFS_LIMIT_MIN_FREQ = -+ 213U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Configure Periodic Hardware Reset behaviour */ -+ ROGUE_FWIF_KCCB_CMD_PHR_CFG = 214U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Configure Safety Firmware Watchdog */ -+ ROGUE_FWIF_KCCB_CMD_WDG_CFG = 216U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+}; -+ -+#define ROGUE_FWIF_LAST_ALLOWED_GUEST_KCCB_CMD \ -+ (ROGUE_FWIF_KCCB_CMD_REGCONFIG - 1) -+ -+/* Kernel CCB command packet */ -+struct rogue_fwif_kccb_cmd { -+ /* Command type */ -+ enum rogue_fwif_kccb_cmd_type cmd_type; -+ /* Compatibility and other flags */ -+ u32 kccb_flags; -+ -+ /* -+ * NOTE: Make sure that uCmdData is the last member of this struct -+ * This is to calculate actual command size for device mem copy. -+ * (Refer ROGUEGetCmdMemCopySize()) -+ */ -+ union { -+ /* Data for Kick command */ -+ struct rogue_fwif_kccb_cmd_kick_data cmd_kick_data; -+ /* Data for combined geom/frag Kick command */ -+ struct rogue_fwif_kccb_cmd_combined_geom_frag_kick_data -+ combined_geom_frag_cmd_kick_data; -+ /* Data for MMU cache command */ -+ struct rogue_fwif_mmucachedata mmu_cache_data; -+ /* Data for Breakpoint Commands */ -+ struct rogue_fwif_bpdata bp_data; -+ /* Data for SLC Flush/Inval commands */ -+ struct rogue_fwif_slcflushinvaldata slc_flush_inval_data; -+ /* Data for cleanup commands */ -+ struct rogue_fwif_cleanup_request cleanup_data; -+ /* Data for power request commands */ -+ struct rogue_fwif_power_request pow_data; -+ /* Data for HWPerf control command */ -+ struct rogue_fwif_hwperf_ctrl hw_perf_ctrl; -+ /* -+ * Data for HWPerf configure, clear and enable performance -+ * counter block command -+ */ -+ struct rogue_fwif_hwperf_config_enable_blks -+ hw_perf_cfg_enable_blks; -+ /* -+ * Data for HWPerf enable or disable performance counter block -+ * commands -+ */ -+ struct rogue_fwif_hwperf_ctrl_blks hw_perf_ctrl_blks; -+ /* Data for HWPerf configure the custom counters to read */ -+ struct rogue_fwif_hwperf_select_custom_cntrs -+ hw_perf_select_cstm_cntrs; -+ /* Data for core clock speed change */ -+ struct rogue_fwif_coreclkspeedchange_data -+ core_clk_speed_change_data; -+ /* Feedback for Z/S Buffer backing/unbacking */ -+ struct rogue_fwif_zsbuffer_backing_data zs_buffer_backing_data; -+ /* Feedback for Freelist grow/shrink */ -+ struct rogue_fwif_freelist_gs_data free_list_gs_data; -+ /* Feedback for Freelists reconstruction*/ -+ struct rogue_fwif_freelists_reconstruction_data -+ free_lists_reconstruction_data; -+ /* Data for custom register configuration */ -+ struct rogue_fwif_regconfig_data reg_config_data; -+ /* Data for informing the FW about the signal update */ -+ struct rogue_fwif_signal_update_data signal_update_data; -+ /* Data for informing the FW about the write offset update */ -+ struct rogue_fwif_write_offset_update_data -+ write_offset_update_data; -+ /* Data for setting the max frequency/OPP */ -+ struct rogue_fwif_pdvfs_max_freq_data pdvfs_max_freq_data; -+ /* Data for setting the min frequency/OPP */ -+ struct rogue_fwif_pdvfs_min_freq_data pdvfs_min_freq_data; -+ /* Data for updating an OSid priority */ -+ struct rogue_fwif_osid_priority_data cmd_osid_priority_data; -+ /* Data for Hard Context Switching */ -+ struct rogue_fwif_hcs_ctl hcs_ctrl; -+ /* Data for updating the Guest Online states */ -+ struct rogue_fwif_os_state_change_data cmd_os_online_state_data; -+ /* Dev address for TBI buffer allocated on demand */ -+ u32 tbi_buffer_fw_addr; -+ /* Data for dumping of register ranges */ -+ struct rogue_fwif_counter_dump_data counter_dump_config_data; -+ /* Data for signalling all unmet fences for a given CCB */ -+ struct rogue_fwif_kccb_cmd_force_update_data force_update_data; -+ /* Data for configuring the Periodic Hw Reset behaviour */ -+ struct rogue_fwif_kccb_cmd_phr_cfg_data periodic_hw_reset_cfg; -+ /* Data for configuring the Safety Firmware Watchdog */ -+ struct rogue_fwif_kccb_cmd_wdg_cfg_data safety_watchdog_cfg; -+ } cmd_data __aligned(8); -+} __aligned(8); -+ -+PVR_FW_STRUCT_SIZE_ASSERT(struct rogue_fwif_kccb_cmd); -+ -+/* -+ ****************************************************************************** -+ * Firmware CCB command structure for ROGUE -+ ****************************************************************************** -+ */ -+ -+struct rogue_fwif_fwccb_cmd_zsbuffer_backing_data { -+ u32 zs_buffer_id; -+}; -+ -+struct rogue_fwif_fwccb_cmd_freelist_gs_data { -+ u32 freelist_id; -+}; -+ -+struct rogue_fwif_fwccb_cmd_freelists_reconstruction_data { -+ u32 freelist_count; -+ u32 hwr_counter; -+ u32 freelist_ids[ROGUE_FWIF_MAX_FREELISTS_TO_RECONSTRUCT]; -+}; -+ -+struct rogue_fwif_fwccb_cmd_context_reset_data { -+ /* Context affected by the reset */ -+ u32 server_common_context_id; -+ /* Reason for reset */ -+ enum rogue_context_reset_reason reset_reason; -+ /* Data Master affected by the reset */ -+ u32 dm; -+ /* Job ref running at the time of reset */ -+ u32 reset_job_ref; -+ /* Did a page fault happen */ -+ bool page_fault __aligned(4); -+ /* At what page catalog address */ -+ aligned_u64 pc_address; -+ /* Page fault address (only when applicable) */ -+ aligned_u64 fault_address; -+}; -+ -+enum rogue_fwif_fwccb_cmd_type { -+ /* Requests ZSBuffer to be backed with physical pages */ -+ ROGUE_FWIF_FWCCB_CMD_ZSBUFFER_BACKING = 101U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Requests ZSBuffer to be unbacked */ -+ ROGUE_FWIF_FWCCB_CMD_ZSBUFFER_UNBACKING = 102U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Requests an on-demand freelist grow/shrink */ -+ ROGUE_FWIF_FWCCB_CMD_FREELIST_GROW = 103U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Requests freelists reconstruction */ -+ ROGUE_FWIF_FWCCB_CMD_FREELISTS_RECONSTRUCTION = -+ 104U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Notifies host of a HWR event on a context */ -+ ROGUE_FWIF_FWCCB_CMD_CONTEXT_RESET_NOTIFICATION = -+ 105U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Requests an on-demand debug dump */ -+ ROGUE_FWIF_FWCCB_CMD_DEBUG_DUMP = 106U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ /* Requests an on-demand update on process stats */ -+ ROGUE_FWIF_FWCCB_CMD_UPDATE_STATS = 107U | -+ ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ -+ ROGUE_FWIF_FWCCB_CMD_CORE_CLK_RATE_CHANGE = -+ 108U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+ ROGUE_FWIF_FWCCB_CMD_REQUEST_GPU_RESTART = -+ 109U | ROGUE_CMD_MAGIC_DWORD_SHIFTED, -+}; -+ -+enum rogue_fwif_fwccb_cmd_update_stats_type { -+ /* -+ * PVRSRVStatsUpdateRenderContextStats should increase the value of the -+ * ui32TotalNumPartialRenders stat -+ */ -+ ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_PARTIAL_RENDERS = 1, -+ /* -+ * PVRSRVStatsUpdateRenderContextStats should increase the value of the -+ * ui32TotalNumOutOfMemory stat -+ */ -+ ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_OUT_OF_MEMORY, -+ /* -+ * PVRSRVStatsUpdateRenderContextStats should increase the value of the -+ * ui32NumGeomStores stat -+ */ -+ ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_GEOM_STORES, -+ /* -+ * PVRSRVStatsUpdateRenderContextStats should increase the value of the -+ * ui32NumFragStores stat -+ */ -+ ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_FRAG_STORES, -+ /* -+ * PVRSRVStatsUpdateRenderContextStats should increase the value of the -+ * ui32NumCDMStores stat -+ */ -+ ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_CDM_STORES, -+ /* -+ * PVRSRVStatsUpdateRenderContextStats should increase the value of the -+ * ui32NumTDMStores stat -+ */ -+ ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_TDM_STORES -+}; -+ -+struct rogue_fwif_fwccb_cmd_update_stats_data { -+ /* Element to update */ -+ enum rogue_fwif_fwccb_cmd_update_stats_type element_to_update; -+ /* The pid of the process whose stats are being updated */ -+ u32 pid_owner; -+ /* Adjustment to be made to the statistic */ -+ s32 adjustment_value; -+}; -+ -+struct rogue_fwif_fwccb_cmd_core_clk_rate_change_data { -+ u32 core_clk_rate; -+} __aligned(8); -+ -+struct rogue_fwif_fwccb_cmd { -+ /* Command type */ -+ enum rogue_fwif_fwccb_cmd_type cmd_type; -+ /* Compatibility and other flags */ -+ u32 fwccb_flags; -+ -+ union { -+ /* Data for Z/S-Buffer on-demand (un)backing*/ -+ struct rogue_fwif_fwccb_cmd_zsbuffer_backing_data -+ cmd_zs_buffer_backing; -+ /* Data for on-demand freelist grow/shrink */ -+ struct rogue_fwif_fwccb_cmd_freelist_gs_data cmd_free_list_gs; -+ /* Data for freelists reconstruction */ -+ struct rogue_fwif_fwccb_cmd_freelists_reconstruction_data -+ cmd_freelists_reconstruction; -+ /* Data for context reset notification */ -+ struct rogue_fwif_fwccb_cmd_context_reset_data -+ cmd_context_reset_notification; -+ /* Data for updating process stats */ -+ struct rogue_fwif_fwccb_cmd_update_stats_data -+ cmd_update_stats_data; -+ struct rogue_fwif_fwccb_cmd_core_clk_rate_change_data -+ cmd_core_clk_rate_change; -+ } cmd_data __aligned(8); -+} __aligned(8); -+ -+PVR_FW_STRUCT_SIZE_ASSERT(struct rogue_fwif_fwccb_cmd); -+ -+/* -+ ****************************************************************************** -+ * Workload estimation Firmware CCB command structure for ROGUE -+ ****************************************************************************** -+ */ -+struct rogue_fwif_workest_fwccb_cmd { -+ /* Index for return data array */ -+ aligned_u64 return_data_index; -+ /* The cycles the workload took on the hardware */ -+ aligned_u64 cycles_taken; -+}; -+ -+/* -+ ****************************************************************************** -+ * Client CCB commands for ROGUE -+ ****************************************************************************** -+ */ -+ -+/* -+ * Required memory alignment for 64-bit variables accessible by Meta -+ * (The gcc meta aligns 64-bit variables to 64-bit; therefore, memory shared -+ * between the host and meta that contains 64-bit variables has to maintain -+ * this alignment) -+ */ -+#define ROGUE_FWIF_FWALLOC_ALIGN sizeof(u64) -+ -+#define ROGUE_CCB_TYPE_TASK BIT(15) -+#define ROGUE_CCB_FWALLOC_ALIGN(size) \ -+ (((size) + (ROGUE_FWIF_FWALLOC_ALIGN - 1)) & \ -+ ~(ROGUE_FWIF_FWALLOC_ALIGN - 1)) -+ -+#define ROGUE_FWIF_CCB_CMD_TYPE_GEOM \ -+ (201U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_TQ_3D \ -+ (202U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_FRAG \ -+ (203U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_FRAG_PR \ -+ (204U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_CDM \ -+ (205U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_TQ_TDM \ -+ (206U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_FBSC_INVALIDATE \ -+ (207U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_TQ_2D \ -+ (208U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_PRE_TIMESTAMP \ -+ (209U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+#define ROGUE_FWIF_CCB_CMD_TYPE_NULL \ -+ (210U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK) -+ -+/* Leave a gap between CCB specific commands and generic commands */ -+#define ROGUE_FWIF_CCB_CMD_TYPE_FENCE (211U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+#define ROGUE_FWIF_CCB_CMD_TYPE_UPDATE (212U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+#define ROGUE_FWIF_CCB_CMD_TYPE_RMW_UPDATE \ -+ (213U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+#define ROGUE_FWIF_CCB_CMD_TYPE_FENCE_PR (214U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+#define ROGUE_FWIF_CCB_CMD_TYPE_PRIORITY (215U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+/* -+ * Pre and Post timestamp commands are supposed to sandwich the DM cmd. The -+ * padding code with the CCB wrap upsets the FW if we don't have the task type -+ * bit cleared for POST_TIMESTAMPs. That's why we have 2 different cmd types. -+ */ -+#define ROGUE_FWIF_CCB_CMD_TYPE_POST_TIMESTAMP \ -+ (216U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+#define ROGUE_FWIF_CCB_CMD_TYPE_UNFENCED_UPDATE \ -+ (217U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+#define ROGUE_FWIF_CCB_CMD_TYPE_UNFENCED_RMW_UPDATE \ -+ (218U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+ -+#define ROGUE_FWIF_CCB_CMD_TYPE_PADDING (220U | ROGUE_CMD_MAGIC_DWORD_SHIFTED) -+ -+struct rogue_fwif_workest_kick_data { -+ /* Index for the KM Workload estimation return data array */ -+ aligned_u64 return_data_index; -+ /* Deadline for the workload */ -+ aligned_u64 deadline; -+ /* Predicted time taken to do the work in cycles */ -+ aligned_u64 cycles_prediction; -+}; -+ -+struct rogue_fwif_ccb_cmd_header { -+ u32 cmd_type; -+ u32 cmd_size; -+ /* -+ * external job reference - provided by client and used in debug for -+ * tracking submitted work -+ */ -+ u32 ext_job_ref; -+ /* -+ * internal job reference - generated by services and used in debug for -+ * tracking submitted work -+ */ -+ u32 int_job_ref; -+ /* Workload Estimation - Workload Estimation Data */ -+ struct rogue_fwif_workest_kick_data work_est_kick_data; -+}; -+ -+/* -+ ****************************************************************************** -+ * Client CCB commands which are only required by the kernel -+ ****************************************************************************** -+ */ -+struct rogue_fwif_cmd_priority { -+ u32 priority; -+}; -+ -+/* -+ ****************************************************************************** -+ * Signature and Checksums Buffer -+ ****************************************************************************** -+ */ -+struct rogue_fwif_sigbuf_ctl { -+ /* Ptr to Signature Buffer memory */ -+ u32 buffer_fw_addr; -+ /* Amount of space left for storing regs in the buffer */ -+ u32 left_size_in_regs; -+} __aligned(8); -+ -+struct rogue_fwif_counter_dump_ctl { -+ /* Ptr to counter dump buffer */ -+ u32 buffer_fw_addr; -+ /* Amount of space for storing in the buffer */ -+ u32 size_in_dwords; -+} __aligned(8); -+ -+struct rogue_fwif_firmware_gcov_ctl { -+ /* Ptr to firmware gcov buffer */ -+ u32 buffer_fw_addr; -+ /* Amount of space for storing in the buffer */ -+ u32 size; -+} __aligned(8); -+ -+/* -+ ***************************************************************************** -+ * ROGUE Compatibility checks -+ ***************************************************************************** -+ */ -+ -+/* -+ * WARNING: Whenever the layout of ROGUE_FWIF_COMPCHECKS_BVNC changes, the -+ * following define should be increased by 1 to indicate to the compatibility -+ * logic that layout has changed. -+ */ -+#define ROGUE_FWIF_COMPCHECKS_LAYOUT_VERSION 3 -+ -+struct rogue_fwif_compchecks_bvnc { -+ /* WARNING: This field must be defined as first one in this structure */ -+ u32 layout_version; -+ aligned_u64 bvnc; -+} __aligned(8); -+ -+struct rogue_fwif_init_options { -+ u8 os_count_support; -+} __aligned(8); -+ -+#define ROGUE_FWIF_COMPCHECKS_BVNC_DECLARE_AND_INIT(name) \ -+ struct rogue_fwif_compchecks_bvnc(name) = { \ -+ ROGUE_FWIF_COMPCHECKS_LAYOUT_VERSION, \ -+ 0, \ -+ } -+#define ROGUE_FWIF_COMPCHECKS_BVNC_INIT(name) \ -+ do { \ -+ (name).layout_version = ROGUE_FWIF_COMPCHECKS_LAYOUT_VERSION; \ -+ (name).bvnc = 0; \ -+ } while (0) -+ -+struct rogue_fwif_compchecks { -+ /* hardware BVNC (from the ROGUE registers) */ -+ struct rogue_fwif_compchecks_bvnc hw_bvnc; -+ /* firmware BVNC */ -+ struct rogue_fwif_compchecks_bvnc fw_bvnc; -+ /* identifier of the FW processor version */ -+ u32 fw_processor_version; -+ /* software DDK version */ -+ u32 ddk_version; -+ /* software DDK build no. */ -+ u32 ddk_build; -+ /* build options bit-field */ -+ u32 build_options; -+ /* initialisation options bit-field */ -+ struct rogue_fwif_init_options init_options; -+ /* Information is valid */ -+ bool updated __aligned(4); -+} __aligned(8); -+ -+/* -+ ****************************************************************************** -+ * Updated configuration post FW data init. -+ ****************************************************************************** -+ */ -+struct rogue_fwif_runtime_cfg { -+ /* APM latency in ms before signalling IDLE to the host */ -+ u32 active_pm_latency_ms; -+ /* Compatibility and other flags */ -+ u32 runtime_cfg_flags; -+ /* -+ * If set, APM latency does not reset to system default each GPU power -+ * transition -+ */ -+ bool active_pm_latency_persistant __aligned(4); -+ /* Core clock speed, currently only used to calculate timer ticks */ -+ u32 core_clock_speed; -+ /* Last number of dusts change requested by the host */ -+ u32 default_dusts_num_init; -+ /* On-demand allocated HWPerf buffer address, to be passed to the FW */ -+ u32 hwperf_buf_fw_addr; -+}; -+ -+/* -+ ***************************************************************************** -+ * Control data for ROGUE -+ ***************************************************************************** -+ */ -+ -+#define ROGUE_FWIF_HWR_DEBUG_DUMP_ALL (99999U) -+ -+enum rogue_fwif_tpu_dm { -+ ROGUE_FWIF_TPU_DM_PDM = 0, -+ ROGUE_FWIF_TPU_DM_VDM = 1, -+ ROGUE_FWIF_TPU_DM_CDM = 2, -+ ROGUE_FWIF_TPU_DM_TDM = 3, -+ ROGUE_FWIF_TPU_DM_LAST -+}; -+ -+enum rogue_fwif_gpio_val_mode { -+ /* No GPIO validation */ -+ ROGUE_FWIF_GPIO_VAL_OFF = 0, -+ /* -+ * Simple test case that initiates by sending data via the GPIO and then -+ * sends back any data received over the GPIO -+ */ -+ ROGUE_FWIF_GPIO_VAL_GENERAL = 1, -+ /* -+ * More complex test case that writes and reads data across the entire -+ * GPIO AP address range. -+ */ -+ ROGUE_FWIF_GPIO_VAL_AP = 2, -+ /* Validates the GPIO Testbench. */ -+ ROGUE_FWIF_GPIO_VAL_TESTBENCH = 5, -+ ROGUE_FWIF_GPIO_VAL_LAST -+}; -+ -+enum fw_perf_conf { -+ FW_PERF_CONF_NONE = 0, -+ FW_PERF_CONF_ICACHE = 1, -+ FW_PERF_CONF_DCACHE = 2, -+ FW_PERF_CONF_POLLS = 3, -+ FW_PERF_CONF_CUSTOM_TIMER = 4, -+ FW_PERF_CONF_JTLB_INSTR = 5, -+ FW_PERF_CONF_INSTRUCTIONS = 6 -+}; -+ -+enum fw_boot_stage { -+ FW_BOOT_STAGE_TLB_INIT_FAILURE = -2, -+ FW_BOOT_STAGE_NOT_AVAILABLE = -1, -+ FW_BOOT_NOT_STARTED = 0, -+ FW_BOOT_BLDR_STARTED = 1, -+ FW_BOOT_CACHE_DONE, -+ FW_BOOT_TLB_DONE, -+ FW_BOOT_MAIN_STARTED, -+ FW_BOOT_ALIGNCHECKS_DONE, -+ FW_BOOT_INIT_DONE, -+}; -+ -+/* -+ * Kernel CCB return slot responses. Usage of bit-fields instead of bare -+ * integers allows FW to possibly pack-in several responses for each single kCCB -+ * command. -+ */ -+/* Command executed (return status from FW) */ -+#define ROGUE_FWIF_KCCB_RTN_SLOT_CMD_EXECUTED BIT(0) -+/* A cleanup was requested but resource busy */ -+#define ROGUE_FWIF_KCCB_RTN_SLOT_CLEANUP_BUSY BIT(1) -+/* Poll failed in FW for a HW operation to complete */ -+#define ROGUE_FWIF_KCCB_RTN_SLOT_POLL_FAILURE BIT(2) -+/* Reset value of a kCCB return slot (set by host) */ -+#define ROGUE_FWIF_KCCB_RTN_SLOT_NO_RESPONSE 0x0U -+ -+struct rogue_fwif_connection_ctl { -+ /* Fw-Os connection states */ -+ volatile enum rogue_fwif_connection_fw_state connection_fw_state; -+ volatile enum rogue_fwif_connection_os_state connection_os_state; -+ volatile u32 alive_fw_token; -+ volatile u32 alive_os_token; -+} __aligned(8); -+ -+struct rogue_fwif_osinit { -+ /* Kernel CCB */ -+ u32 kernel_ccbctl_fw_addr; -+ u32 kernel_ccb_fw_addr; -+ u32 kernel_ccb_rtn_slots_fw_addr; -+ -+ /* Firmware CCB */ -+ u32 firmware_ccbctl_fw_addr; -+ u32 firmware_ccb_fw_addr; -+ -+ /* Workload Estimation Firmware CCB */ -+ u32 work_est_firmware_ccbctl_fw_addr; -+ u32 work_est_firmware_ccb_fw_addr; -+ -+ u32 rogue_fwif_hwr_info_buf_ctl_fw_addr; -+ -+ u32 hwr_debug_dump_limit; -+ -+ u32 fw_os_data_fw_addr; -+ -+ /* Compatibility checks to be populated by the Firmware */ -+ struct rogue_fwif_compchecks rogue_comp_checks; -+} __aligned(8); -+ -+/* BVNC Features */ -+struct rogue_hwperf_bvnc_block { -+ /* Counter block ID, see ROGUE_HWPERF_CNTBLK_ID */ -+ u16 block_id; -+ -+ /* Number of counters in this block type */ -+ u16 num_counters; -+ -+ /* Number of blocks of this type */ -+ u16 num_blocks; -+ -+ u16 reserved; -+}; -+ -+#define ROGUE_HWPERF_MAX_BVNC_LEN (24) -+ -+#define ROGUE_HWPERF_MAX_BVNC_BLOCK_LEN (16U) -+ -+/* BVNC Features */ -+struct rogue_hwperf_bvnc { -+ /* BVNC string */ -+ char bvnc_string[ROGUE_HWPERF_MAX_BVNC_LEN]; -+ /* See ROGUE_HWPERF_FEATURE_FLAGS */ -+ u32 bvnc_km_feature_flags; -+ /* Number of blocks described in aBvncBlocks */ -+ u16 num_bvnc_blocks; -+ /* Number of GPU cores present */ -+ u16 bvnc_gpu_cores; -+ /* Supported Performance Blocks for BVNC */ -+ struct rogue_hwperf_bvnc_block -+ bvnc_blocks[ROGUE_HWPERF_MAX_BVNC_BLOCK_LEN]; -+}; -+ -+PVR_FW_STRUCT_SIZE_ASSERT(struct rogue_hwperf_bvnc); -+ -+struct rogue_fwif_sysinit { -+ aligned_u64 fault_phys_addr; -+ -+ aligned_u64 pds_exec_base; -+ aligned_u64 usc_exec_base; -+ -+ u32 filter_flags; -+ -+ struct rogue_fwif_sigbuf_ctl sig_buf_ctl[PVR_FWIF_DM_MAX]; -+ -+ u32 runtime_cfg_fw_addr; -+ -+ u32 trace_buf_ctl_fw_addr; -+ u32 fw_sys_data_fw_addr; -+ -+ aligned_u64 hw_perf_filter; -+ -+ u32 gpu_util_fw_cb_ctl_fw_addr; -+ u32 reg_cfg_fw_addr; -+ u32 hwperf_ctl_fw_addr; -+ -+ struct rogue_fwif_counter_dump_ctl counter_dump_ctl; -+ -+ u32 align_checks; -+ -+ /* Core clock speed at FW boot time */ -+ u32 initial_core_clock_speed; -+ -+ /* APM latency in ms before signalling IDLE to the host */ -+ u32 active_pm_latency_ms; -+ -+ /* Flag to be set by the Firmware after successful start */ -+ bool firmware_started __aligned(4); -+ -+ u32 marker_val; -+ -+ u32 firmware_started_timestamp; -+ -+ u32 jones_disable_mask; -+ -+ struct rogue_fwif_dma_addr coremem_data_store; -+ -+ enum fw_perf_conf firmware_perf; -+ -+ aligned_u64 slc3_fence_dev_addr; -+ -+ struct rogue_fwif_pdvfs_opp pdvfs_opp_info; -+ -+ /* -+ * FW Pointer to memory containing core clock rate in Hz. -+ * Firmware (PDVFS) updates the memory when running on non primary FW -+ * thread to communicate to host driver. -+ */ -+ u32 core_clock_rate_fw_addr; -+ -+ enum rogue_fwif_gpio_val_mode gpio_validation_mode; -+ u32 tpu_trilinear_frac_mask[ROGUE_FWIF_TPU_DM_LAST] __aligned(8); -+ -+ /* Used in HWPerf for decoding BVNC Features */ -+ struct rogue_hwperf_bvnc bvnc_km_feature_flags; -+} __aligned(8); -+ -+/* -+ ***************************************************************************** -+ * Timer correlation shared data and defines -+ ***************************************************************************** -+ */ -+ -+struct rogue_fwif_time_corr { -+ aligned_u64 os_timestamp; -+ aligned_u64 os_mono_timestamp; -+ aligned_u64 cr_timestamp; -+ -+ /* -+ * Utility variable used to convert CR timer deltas to OS timer deltas -+ * (nS), where the deltas are relative to the timestamps above: -+ * deltaOS = (deltaCR * K) >> decimal_shift, see full explanation below -+ */ -+ aligned_u64 cr_delta_to_os_delta_kns; -+ -+ u32 core_clock_speed; -+ u32 reserved; -+} __aligned(8); -+ -+/* -+ * The following macros are used to help converting FW timestamps to the Host -+ * time domain. On the FW the ROGUE_CR_TIMER counter is used to keep track of -+ * time; it increments by 1 every 256 GPU clock ticks, so the general -+ * formula to perform the conversion is: -+ * -+ * [ GPU clock speed in Hz, if (scale == 10^9) then deltaOS is in nS, -+ * otherwise if (scale == 10^6) then deltaOS is in uS ] -+ * -+ * deltaCR * 256 256 * scale -+ * deltaOS = --------------- * scale = deltaCR * K [ K = --------------- ] -+ * GPUclockspeed GPUclockspeed -+ * -+ * The actual K is multiplied by 2^20 (and deltaCR * K is divided by 2^20) -+ * to get some better accuracy and to avoid returning 0 in the integer -+ * division 256000000/GPUfreq if GPUfreq is greater than 256MHz. -+ * This is the same as keeping K as a decimal number. -+ * -+ * The maximum deltaOS is slightly more than 5hrs for all GPU frequencies -+ * (deltaCR * K is more or less a constant), and it's relative to the base -+ * OS timestamp sampled as a part of the timer correlation data. -+ * This base is refreshed on GPU power-on, DVFS transition and periodic -+ * frequency calibration (executed every few seconds if the FW is doing -+ * some work), so as long as the GPU is doing something and one of these -+ * events is triggered then deltaCR * K will not overflow and deltaOS will be -+ * correct. -+ */ -+ -+#define ROGUE_FWIF_CRDELTA_TO_OSDELTA_ACCURACY_SHIFT (20) -+ -+#define ROGUE_FWIF_GET_DELTA_OSTIME_NS(delta_cr, k) \ -+ (((delta_cr) * (k)) >> ROGUE_FWIF_CRDELTA_TO_OSDELTA_ACCURACY_SHIFT) -+ -+/* -+ ****************************************************************************** -+ * GPU Utilisation -+ ****************************************************************************** -+ */ -+ -+/* See rogue_common.h for a list of GPU states */ -+#define ROGUE_FWIF_GPU_UTIL_TIME_MASK \ -+ (0xFFFFFFFFFFFFFFFFull & ~ROGUE_FWIF_GPU_UTIL_STATE_MASK) -+ -+#define ROGUE_FWIF_GPU_UTIL_GET_TIME(word) \ -+ ((word)(&ROGUE_FWIF_GPU_UTIL_TIME_MASK)) -+#define ROGUE_FWIF_GPU_UTIL_GET_STATE(word) \ -+ ((word)(&ROGUE_FWIF_GPU_UTIL_STATE_MASK)) -+ -+/* -+ * The OS timestamps computed by the FW are approximations of the real time, -+ * which means they could be slightly behind or ahead the real timer on the -+ * Host. In some cases we can perform subtractions between FW approximated -+ * timestamps and real OS timestamps, so we need a form of protection against -+ * negative results if for instance the FW one is a bit ahead of time. -+ */ -+#define ROGUE_FWIF_GPU_UTIL_GET_PERIOD(newtime, oldtime) \ -+ (((newtime) > (oldtime)) ? ((newtime) - (oldtime)) : 0U) -+ -+#define ROGUE_FWIF_GPU_UTIL_MAKE_WORD(time, state) \ -+ (ROGUE_FWIF_GPU_UTIL_GET_TIME(time) | \ -+ ROGUE_FWIF_GPU_UTIL_GET_STATE(state)) -+ -+/* -+ * The timer correlation array must be big enough to ensure old entries won't be -+ * overwritten before all the HWPerf events linked to those entries are -+ * processed by the MISR. The update frequency of this array depends on how fast -+ * the system can change state (basically how small the APM latency is) and -+ * perform DVFS transitions. -+ * -+ * The minimum size is 2 (not 1) to avoid race conditions between the FW reading -+ * an entry while the Host is updating it. With 2 entries in the worst case the -+ * FW will read old data, which is still quite ok if the Host is updating the -+ * timer correlation at that time. -+ */ -+#define ROGUE_FWIF_TIME_CORR_ARRAY_SIZE 256U -+#define ROGUE_FWIF_TIME_CORR_CURR_INDEX(seqcount) \ -+ ((seqcount) % ROGUE_FWIF_TIME_CORR_ARRAY_SIZE) -+ -+/* Make sure the timer correlation array size is a power of 2 */ -+static_assert((ROGUE_FWIF_TIME_CORR_ARRAY_SIZE & -+ (ROGUE_FWIF_TIME_CORR_ARRAY_SIZE - 1U)) == 0U, -+ "ROGUE_FWIF_TIME_CORR_ARRAY_SIZE must be a power of two"); -+ -+struct rogue_fwif_gpu_util_fwcb { -+ struct rogue_fwif_time_corr time_corr[ROGUE_FWIF_TIME_CORR_ARRAY_SIZE]; -+ u32 time_corr_seq_count; -+ -+ /* Last GPU state + OS time of the last state update */ -+ aligned_u64 last_word; -+ -+ /* Counters for the amount of time the GPU was active/idle/blocked */ -+ aligned_u64 stats_counters[PVR_FWIF_GPU_UTIL_STATE_NUM]; -+ -+ /* Compatibility and other flags */ -+ u32 gpu_util_flags; -+} __aligned(8); -+ -+struct rogue_fwif_rta_ctl { -+ /* Render number */ -+ u32 render_target_index; -+ /* index in RTA */ -+ u32 current_render_target; -+ /* total active RTs */ -+ u32 active_render_targets; -+ /* total active RTs from the first TA kick, for OOM */ -+ u32 cumul_active_render_targets; -+ /* Array of valid RT indices */ -+ u32 valid_render_targets_fw_addr; -+ /* Array of number of occurred partial renders per render target */ -+ u32 rta_num_partial_renders_fw_addr; -+ /* Number of render targets in the array */ -+ u32 max_rts; -+ /* Compatibility and other flags */ -+ u32 rta_ctl_flags; -+} __aligned(8); -+ -+struct rogue_fwif_freelist { -+ aligned_u64 freelist_dev_addr; -+ aligned_u64 current_dev_addr; -+ u32 current_stack_top; -+ u32 max_pages; -+ u32 grow_pages; -+ /* HW pages */ -+ u32 current_pages; -+ u32 allocated_page_count; -+ u32 allocated_mmu_page_count; -+ u32 freelist_id; -+ bool grow_pending __aligned(4); -+ /* Pages that should be used only when OOM is reached */ -+ u32 ready_pages; -+ /* Compatibility and other flags */ -+ u32 freelist_flags; -+} __aligned(8); -+ -+/* -+ ****************************************************************************** -+ * Parameter Management (PM) control data for ROGUE -+ ****************************************************************************** -+ */ -+ -+/* -+ * Used only by Firmware but defined here for similarity with Volcanic where -+ * it's required for SW TRP -+ */ -+ -+enum rogue_fw_spm_state { -+ ROGUE_FW_SPM_STATE_NONE = 0, -+ ROGUE_FW_SPM_STATE_PR_BLOCKED, -+ ROGUE_FW_SPM_STATE_WAIT_FOR_GROW, -+ ROGUE_FW_SPM_STATE_WAIT_FOR_HW, -+ ROGUE_FW_SPM_STATE_PR_RUNNING, -+ ROGUE_FW_SPM_STATE_PR_AVOIDED, -+ ROGUE_FW_SPM_STATE_PR_EXECUTED, -+}; -+ -+struct rogue_fw_spmctl { -+ /* Current owner of this PM data structure */ -+ enum rogue_fw_spm_state spm_state; -+ /* -+ * Geometry/fragment fence object holding the value to let through the fragment partial -+ * command -+ */ -+ struct rogue_fwif_ufo partial_render_geom_frag_fence; -+ /* Pointer to the fragment context holding the partial render */ -+ struct rogue_fwif_fwcommoncontext *frag_context; -+ /* Pointer to the header of the command holding the partial render */ -+ struct rogue_fwif_ccb_cmd_header *cmd_header; -+ /* Pointer to the fragment command holding the partial render register info */ -+ struct rogue_fwif_cmd_frag_struct *frag_cmd; -+ /* -+ * Array of pointers to PR Buffers which may be used if partial render -+ * is needed -+ */ -+ struct rogue_fwif_prbuffer *pr_buffer[ROGUE_FWIF_PRBUFFER_MAXSUPPORTED]; -+ /* Indicates the freelist type that went out of memory */ -+ u32 oom_freelist_type; -+ /* Indicates if a fragment Memory Free has been detected, which resolves OOM. */ -+ bool frag_mem_free_detected __aligned(4); -+}; -+ -+/* -+ ****************************************************************************** -+ * HWRTData -+ ****************************************************************************** -+ */ -+ -+/* HWRTData flags */ -+/* Deprecated flags 1:0 */ -+#define HWRTDATA_HAS_LAST_GEOM BIT(2) -+#define HWRTDATA_PARTIAL_RENDERED BIT(3) -+#define HWRTDATA_DISABLE_TILE_REORDERING BIT(4) -+#define HWRTDATA_NEED_BRN65101_BLIT BIT(5) -+#define HWRTDATA_FIRST_BRN65101_STRIP BIT(6) -+#define HWRTDATA_NEED_BRN67182_2ND_RENDER BIT(7) -+ -+enum rogue_fwif_rtdata_state { -+ ROGUE_FWIF_RTDATA_STATE_NONE = 0, -+ ROGUE_FWIF_RTDATA_STATE_KICK_GEOM, -+ ROGUE_FWIF_RTDATA_STATE_KICK_GEOM_FIRST, -+ ROGUE_FWIF_RTDATA_STATE_GEOM_FINISHED, -+ ROGUE_FWIF_RTDATA_STATE_KICK_FRAG, -+ ROGUE_FWIF_RTDATA_STATE_FRAG_FINISHED, -+ ROGUE_FWIF_RTDATA_STATE_GEOM_OUTOFMEM, -+ ROGUE_FWIF_RTDATA_STATE_PARTIALRENDERFINISHED, -+ /* -+ * In case of HWR, we can't set the RTDATA state to NONE, as this will -+ * cause any TA to become a first TA. To ensure all related TA's are -+ * skipped, we use the HWR state -+ */ -+ ROGUE_FWIF_RTDATA_STATE_HWR, -+ ROGUE_FWIF_RTDATA_STATE_UNKNOWN = 0x7FFFFFFFU -+}; -+ -+struct rogue_fwif_hwrtdata_common { -+ bool geom_caches_need_zeroing __aligned(4); -+} __aligned(8); -+ -+struct rogue_fwif_hwrtdata { -+ u32 hwrt_data_common_fw_addr; -+ -+ u32 hwrt_data_flags; -+ enum rogue_fwif_rtdata_state state; -+ -+ /* MList Data Store */ -+ aligned_u64 pm_mlist_dev_addr; -+ -+ aligned_u64 vce_cat_base[4]; -+ aligned_u64 vce_last_cat_base[4]; -+ aligned_u64 te_cat_base[4]; -+ aligned_u64 te_last_cat_base[4]; -+ aligned_u64 alist_cat_base; -+ aligned_u64 alist_last_cat_base; -+ -+ aligned_u64 pm_alist_stack_pointer; -+ u32 pm_mlist_stack_pointer; -+ -+ u32 freelists_fw_addr[ROGUE_FW_MAX_FREELISTS] __aligned(8); -+ u32 freelist_hwr_snapshot[ROGUE_FW_MAX_FREELISTS]; -+ -+ aligned_u64 vheap_table_dev_addr; -+ -+ struct rogue_fwif_cleanup_ctl cleanup_state; -+ -+ struct rogue_fwif_rta_ctl rta_ctl; -+ -+ u32 screen_pixel_max; -+ aligned_u64 multi_sample_ctl; -+ u64 flipped_multi_sample_ctl; -+ u32 tpc_stride; -+ aligned_u64 tail_ptrs_dev_addr; -+ u32 tpc_size; -+ u32 te_screen; -+ u32 mtile_stride; -+ u32 teaa; -+ u32 te_mtile1; -+ u32 te_mtile2; -+ u32 isp_merge_lower_x; -+ u32 isp_merge_lower_y; -+ u32 isp_merge_upper_x; -+ u32 isp_mergy_upper_y; -+ u32 isp_merge_scale_x; -+ u32 isp_merge_scale_y; -+ aligned_u64 macrotile_array_dev_addr; -+ aligned_u64 rgn_header_dev_addr; -+ aligned_u64 rtc_dev_addr; -+ aligned_u64 rgn_header_size; -+ u32 isp_mtile_size; -+ u32 owner_geom_not_used_by_host __aligned(8); -+} __aligned(8); -+ -+/* -+ ****************************************************************************** -+ * Sync checkpoints -+ ****************************************************************************** -+ */ -+ -+#define PVR_SYNC_CHECKPOINT_UNDEF 0x000 -+#define PVR_SYNC_CHECKPOINT_ACTIVE 0xac1 /* Checkpoint has not signaled. */ -+#define PVR_SYNC_CHECKPOINT_SIGNALED 0x519 /* Checkpoint has signaled. */ -+#define PVR_SYNC_CHECKPOINT_ERRORED 0xeff /* Checkpoint has been errored. */ -+ -+#endif /* __PVR_ROGUE_FWIF_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_fwif_client.h b/drivers/gpu/drm/imagination/pvr_rogue_fwif_client.h -new file mode 100644 -index 000000000000..f527cfd3c268 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_fwif_client.h -@@ -0,0 +1,158 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_FWIF_CLIENT_H__ -+#define __PVR_ROGUE_FWIF_CLIENT_H__ -+ -+#include <linux/kernel.h> -+#include <linux/types.h> -+ -+#include "pvr_rogue_fwif_shared.h" -+ -+/* -+ ************************************************ -+ * Parameter/HWRTData control structures. -+ ************************************************ -+ */ -+ -+/* -+ * Configuration registers which need to be loaded by the firmware before a geometry -+ * job can be started. -+ */ -+struct rogue_fwif_geom_regs { -+ u64 vdm_ctrl_stream_base; -+ u64 tpu_border_colour_table; -+ -+ u32 ppp_ctrl; -+ u32 te_psg; -+ u32 tpu; -+ -+ u32 vdm_context_resume_task0_size; -+ -+ /* FIXME: HIGH: FIX_HW_BRN_56279 changes the structure's layout, given we -+ * are supporting Features/ERNs/BRNs at runtime, we need to look into this -+ * and find a solution to keep layout intact. -+ */ -+ /* Available if FIX_HW_BRN_56279 is present. */ -+ u32 pds_ctrl; -+ -+ u32 view_idx; -+}; -+ -+/* -+ * Represents a geometry command that can be used to tile a whole scene's objects as -+ * per TA behavior. -+ */ -+struct rogue_fwif_cmd_geom { -+ /* -+ * rogue_fwif_cmd_geom_frag_shared field must always be at the beginning of the -+ * struct. -+ * -+ * The command struct (rogue_fwif_cmd_geom) is shared between Client and -+ * Firmware. Kernel is unable to perform read/write operations on the -+ * command struct, the SHARED region is the only exception from this rule. -+ * This region must be the first member so that Kernel can easily access it. -+ * For more info, see rogue_fwif_cmd_geom_frag_shared definition. -+ */ -+ struct rogue_fwif_cmd_geom_frag_shared cmd_shared; -+ -+ struct rogue_fwif_geom_regs geom_regs __aligned(8); -+ u32 flags __aligned(8); -+ -+ /* -+ * Holds the geometry/fragment fence value to allow the fragment partial render command -+ * to go through. -+ */ -+ struct rogue_fwif_ufo partial_render_geom_frag_fence; -+}; -+ -+/* -+ * Configuration registers which need to be loaded by the firmware before ISP -+ * can be started. -+ */ -+struct rogue_fwif_frag_regs { -+ u32 usc_pixel_output_ctrl; -+ -+ /* FIXME: HIGH: ROGUE_MAXIMUM_OUTPUT_REGISTERS_PER_PIXEL changes the structure's layout. */ -+#define ROGUE_MAXIMUM_OUTPUT_REGISTERS_PER_PIXEL 8U -+ u32 usc_clear_register[ROGUE_MAXIMUM_OUTPUT_REGISTERS_PER_PIXEL]; -+ -+ u32 isp_bgobjdepth; -+ u32 isp_bgobjvals; -+ u32 isp_aa; -+ u32 isp_ctl; -+ -+ u32 tpu; -+ -+ u32 event_pixel_pds_info; -+ -+ /* FIXME: HIGH: RGX_FEATURE_CLUSTER_GROUPING changes the structure's layout. */ -+ u32 pixel_phantom; -+ -+ u32 view_idx; -+ -+ u32 event_pixel_pds_data; -+ /* -+ * FIXME: HIGH: MULTIBUFFER_OCLQRY changes the structure's layout. -+ * Commenting out for now as it's not supported by 4.V.2.51. -+ */ -+ /* uint32_t isp_oclqry_stride; */ -+ -+ /* All values below the ALIGN(8) must be 64 bit. */ -+ aligned_u64 isp_scissor_base; -+ u64 isp_dbias_base; -+ u64 isp_oclqry_base; -+ u64 isp_zlsctl; -+ u64 isp_zload_store_base; -+ u64 isp_stencil_load_store_base; -+ /* FIXME: HIGH: RGX_FEATURE_ZLS_SUBTILE changes the structure's layout. */ -+ u64 isp_zls_pixels; -+ -+ /* FIXME: HIGH: RGX_HW_REQUIRES_FB_CDC_ZLS_SETUP changes the structure's layout. */ -+ u64 deprecated; -+ -+ /* FIXME: HIGH: RGX_PBE_WORDS_REQUIRED_FOR_RENDERS changes the structure's layout. */ -+#define ROGUE_PBE_WORDS_REQUIRED_FOR_RENDERS 2U -+ u64 pbe_word[8U][ROGUE_PBE_WORDS_REQUIRED_FOR_RENDERS]; -+ u64 tpu_border_colour_table; -+ u64 pds_bgnd[3U]; -+ u64 pds_pr_bgnd[3U]; -+}; -+ -+struct rogue_fwif_cmd_frag { -+ struct rogue_fwif_cmd_geom_frag_shared cmd_shared __aligned(8); -+ -+ struct rogue_fwif_frag_regs regs __aligned(8); -+ /* command control flags. */ -+ u32 flags; -+ /* Stride IN BYTES for Z-Buffer in case of RTAs. */ -+ u32 zls_stride; -+ /* Stride IN BYTES for S-Buffer in case of RTAs. */ -+ u32 sls_stride; -+}; -+ -+/* -+ * Configuration registers which need to be loaded by the firmware before CDM -+ * can be started. -+ */ -+struct rogue_fwif_compute_regs { -+ u64 tpu_border_colour_table; -+ u64 cdm_item; -+ u64 compute_cluster; -+ u64 cdm_ctrl_stream_base; -+ u32 tpu; -+ u32 cdm_resume_pds1; -+}; -+ -+struct rogue_fwif_cmd_compute { -+ /* Common command attributes */ -+ struct rogue_fwif_cmd_common common __aligned(8); -+ -+ /* CDM registers */ -+ struct rogue_fwif_compute_regs cmd_regs; -+ -+ /* Control flags */ -+ u32 flags __aligned(8); -+}; -+ -+#endif /* __PVR_ROGUE_FWIF_CLIENT_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_fwif_common.h b/drivers/gpu/drm/imagination/pvr_rogue_fwif_common.h -new file mode 100644 -index 000000000000..68083d0d1832 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_fwif_common.h -@@ -0,0 +1,55 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_FWIF_COMMON_H__ -+#define __PVR_ROGUE_FWIF_COMMON_H__ -+ -+#include <linux/build_bug.h> -+ -+/* -+ * This macro represents a mask of LSBs that must be zero on data structure -+ * sizes and offsets to ensure they are 8-byte granular on types shared between -+ * the FW and host driver. -+ */ -+#define PVR_FW_ALIGNMENT_LSB 7U -+ -+/* Macro to test structure size alignment. */ -+#define PVR_FW_STRUCT_SIZE_ASSERT(_a) \ -+ static_assert((sizeof(_a) & PVR_FW_ALIGNMENT_LSB) == 0U, \ -+ "Size of " #_a " is not properly aligned") -+ -+/* The master definition for data masters known to the firmware. */ -+ -+#define PVR_FWIF_DM_GP 0U -+/* Either TDM or 2D DM is present. */ -+/* When the 'tla' feature is present in the hw (as per @pvr_device_features). */ -+#define PVR_FWIF_DM_2D 1U -+/* -+ * When the 'fastrender_dm' feature is present in the hw (as per -+ * @pvr_device_features). -+ */ -+#define PVR_FWIF_DM_TDM 1U -+#define PVR_FWIF_DM_GEOM 2U -+#define PVR_FWIF_DM_FRAG 3U -+#define PVR_FWIF_DM_CDM 4U -+#define PVR_FWIF_DM_LAST PVR_FWIF_DM_CDM -+ -+/* Maximum number of DM in use: GP, 2D/TDM, GEOM, FRAG, CDM */ -+#define PVR_FWIF_DM_MAX (PVR_FWIF_DM_LAST + 1U) -+#define PVR_FWIF_HWDM_MAX PVR_FWIF_DM_MAX -+ -+/* GPU Utilisation states */ -+#define PVR_FWIF_GPU_UTIL_STATE_IDLE 0U -+#define PVR_FWIF_GPU_UTIL_STATE_ACTIVE 1U -+#define PVR_FWIF_GPU_UTIL_STATE_BLOCKED 2U -+#define PVR_FWIF_GPU_UTIL_STATE_NUM 3U -+#define PVR_FWIF_GPU_UTIL_STATE_MASK 0x3ULL -+ -+/* -+ * Maximum amount of register writes that can be done by the register -+ * programmer (FW or META DMA). This is not a HW limitation, it is only -+ * a protection against malformed inputs to the register programmer. -+ */ -+#define PVR_MAX_NUM_REGISTER_PROGRAMMER_WRITES 128U -+ -+#endif /* __PVR_ROGUE_FWIF_COMMON_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_fwif_resetframework.h b/drivers/gpu/drm/imagination/pvr_rogue_fwif_resetframework.h -new file mode 100644 -index 000000000000..de3e4d6114cd ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_fwif_resetframework.h -@@ -0,0 +1,28 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_FWIF_RESETFRAMEWORK_H__ -+#define __PVR_ROGUE_FWIF_RESETFRAMEWORK_H__ -+ -+#include <linux/bits.h> -+#include <linux/types.h> -+ -+#include "pvr_rogue_fwif_shared.h" -+ -+struct rogue_fwif_rf_registers { -+ u64 cdmreg_cdm_ctrl_stream_base; -+}; -+ -+/* enables the reset framework in the firmware */ -+#define ROGUE_FWIF_RF_FLAG_ENABLE BIT(0) -+ -+struct rogue_fwif_rf_cmd { -+ u32 flags; -+ -+ /* THIS MUST BE THE LAST MEMBER OF THE CONTAINING STRUCTURE */ -+ struct rogue_fwif_rf_registers fw_registers __aligned(8); -+}; -+ -+#define ROGUE_FWIF_RF_CMD_SIZE sizeof(struct rogue_fwif_rf_cmd) -+ -+#endif /* __PVR_ROGUE_FWIF_RESETFRAMEWORK_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_fwif_sf.h b/drivers/gpu/drm/imagination/pvr_rogue_fwif_sf.h -new file mode 100644 -index 000000000000..202d3ba9716b ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_fwif_sf.h -@@ -0,0 +1,846 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_FWIF_SF_H__ -+#define __PVR_ROGUE_FWIF_SF_H__ -+ -+/* -+ ****************************************************************************** -+ * *DO*NOT* rearrange or delete lines in SFIDLIST or SFGROUPLIST or you -+ * WILL BREAK fw tracing message compatibility with previous -+ * fw versions. Only add new ones, if so required. -+ ****************************************************************************** -+ */ -+/* Available log groups. */ -+#define ROGUE_FW_LOG_SFGROUPLIST \ -+ X(ROGUE_FW_GROUP_NULL, NULL) \ -+ X(ROGUE_FW_GROUP_MAIN, MAIN) \ -+ X(ROGUE_FW_GROUP_CLEANUP, CLEANUP) \ -+ X(ROGUE_FW_GROUP_CSW, CSW) \ -+ X(ROGUE_FW_GROUP_PM, PM) \ -+ X(ROGUE_FW_GROUP_RTD, RTD) \ -+ X(ROGUE_FW_GROUP_SPM, SPM) \ -+ X(ROGUE_FW_GROUP_MTS, MTS) \ -+ X(ROGUE_FW_GROUP_BIF, BIF) \ -+ X(ROGUE_FW_GROUP_MISC, MISC) \ -+ X(ROGUE_FW_GROUP_POW, POW) \ -+ X(ROGUE_FW_GROUP_HWR, HWR) \ -+ X(ROGUE_FW_GROUP_HWP, HWP) \ -+ X(ROGUE_FW_GROUP_RPM, RPM) \ -+ X(ROGUE_FW_GROUP_DMA, DMA) \ -+ X(ROGUE_FW_GROUP_DBG, DBG) -+ -+enum rogue_fw_log_sfgroups { -+#define X(A, B) A, -+ ROGUE_FW_LOG_SFGROUPLIST -+#undef X -+}; -+ -+#define PVR_SF_STRING_MAX_SIZE 256U -+ -+/* pair of string format id and string formats */ -+struct rogue_fw_stid_fmt { -+ u32 id; -+ char name[PVR_SF_STRING_MAX_SIZE]; -+}; -+ -+/* pair of string format id and string formats */ -+struct rogue_km_stid_fmt { -+ u32 id; -+ const char *name; -+}; -+ -+/* -+ * Table of String Format specifiers, the group they belong and the number of -+ * arguments each expects. Xmacro styled macros are used to generate what is -+ * needed without requiring hand editing. -+ * -+ * id : id within a group -+ * gid : group id -+ * Sym name : name of enumerations used to identify message strings -+ * String : Actual string -+ * #args : number of arguments the string format requires -+ */ -+#define ROGUE_FW_LOG_SFIDLIST \ -+/*id, gid, id name, string, # arguments */ \ -+X(0, ROGUE_FW_GROUP_NULL, ROGUE_FW_SF_FIRST, "You should not use this string", 0) \ -+\ -+X(1, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_3D_DEPRECATED, "Kick 3D: FWCtx 0x%08.8x @ %d, RTD 0x%08x. Partial render:%d, CSW resume:%d, prio:%d", 6) \ -+X(2, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_3D_FINISHED, "3D finished, HWRTData0State=%x, HWRTData1State=%x", 2) \ -+X(3, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK3D_TQ_DEPRECATED, "Kick 3D TQ: FWCtx 0x%08.8x @ %d, CSW resume:%d, prio: %d", 4) \ -+X(4, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_3D_TQ_FINISHED, "3D Transfer finished", 0) \ -+X(5, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_COMPUTE_DEPRECATED, "Kick Compute: FWCtx 0x%08.8x @ %d, prio: %d", 3) \ -+X(6, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_FINISHED, "Compute finished", 0) \ -+X(7, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_TA_DEPRECATED, "Kick TA: FWCtx 0x%08.8x @ %d, RTD 0x%08x. First kick:%d, Last kick:%d, CSW resume:%d, prio:%d", 7) \ -+X(8, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TA_FINISHED, "TA finished", 0) \ -+X(9, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TA_RESTART_AFTER_PRENDER, "Restart TA after partial render", 0) \ -+X(10, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TA_RESUME_WOUT_PRENDER, "Resume TA without partial render", 0) \ -+X(11, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OOM, "Out of memory! Context 0x%08x, HWRTData 0x%x", 2) \ -+X(12, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_TLA_DEPRECATED, "Kick TLA: FWCtx 0x%08.8x @ %d, prio:%d", 3) \ -+X(13, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TLA_FINISHED, "TLA finished", 0) \ -+X(14, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_CCCB_WOFF_UPDATE, "cCCB Woff update = %d, DM = %d, FWCtx = 0x%08.8x", 3) \ -+X(16, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_CHECK_START, "UFO Checks for FWCtx 0x%08.8x @ %d", 2) \ -+X(17, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_CHECK, "UFO Check: [0x%08.8x] is 0x%08.8x requires 0x%08.8x", 3) \ -+X(18, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_CHECK_SUCCEEDED, "UFO Checks succeeded", 0) \ -+X(19, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_PR_CHECK, "UFO PR-Check: [0x%08.8x] is 0x%08.8x requires >= 0x%08.8x", 3) \ -+X(20, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_SPM_PR_CHECK_START, "UFO SPM PR-Checks for FWCtx 0x%08.8x", 1) \ -+X(21, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_SPM_PR_CHECK_DEPRECATED, "UFO SPM special PR-Check: [0x%08.8x] is 0x%08.8x requires >= ????????, [0x%08.8x] is ???????? requires 0x%08.8x", 4) \ -+X(22, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_UPDATE_START, "UFO Updates for FWCtx 0x%08.8x @ %d", 2) \ -+X(23, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_UPDATE, "UFO Update: [0x%08.8x] = 0x%08.8x", 2) \ -+X(24, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_ASSERT_FAILED, "ASSERT Failed: line %d of:", 1) \ -+X(25, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_LOCKUP_DEPRECATED, "HWR: Lockup detected on DM%d, FWCtx: 0x%08.8x", 2) \ -+X(26, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_RESET_FW_DEPRECATED, "HWR: Reset fw state for DM%d, FWCtx: 0x%08.8x, MemCtx: 0x%08.8x", 3) \ -+X(27, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_RESET_HW_DEPRECATED, "HWR: Reset HW", 0) \ -+X(28, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_TERMINATED_DEPRECATED, "HWR: Lockup recovered.", 0) \ -+X(29, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_FALSE_LOCKUP_DEPRECATED, "HWR: False lockup detected for DM%u", 1) \ -+X(30, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_ALIGN_FAILED, "Alignment check %d failed: host = 0x%x, fw = 0x%x", 3) \ -+X(31, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_GP_USC_TRIGGERED, "GP USC triggered", 0) \ -+X(32, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BREAKPOINT_OVERALLOC_REGS, "Overallocating %u temporary registers and %u shared registers for breakpoint handler", 2) \ -+X(33, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BREAKPOINT_SET_DEPRECATED, "Setting breakpoint: Addr 0x%08.8x", 1) \ -+X(34, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BREAKPOINT_STORE, "Store breakpoint state", 0) \ -+X(35, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BREAKPOINT_UNSET, "Unsetting BP Registers", 0) \ -+X(36, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_NONZERO_RT, "Active RTs expected to be zero, actually %u", 1) \ -+X(37, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_RTC_PRESENT, "RTC present, %u active render targets", 1) \ -+X(38, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_EST_POWER_DEPRECATED, "Estimated Power 0x%x", 1) \ -+X(39, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_RTA_TARGET, "RTA render target %u", 1) \ -+X(40, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_RTA_KICK_RENDER, "Kick RTA render %u of %u", 2) \ -+X(41, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_SIZES_CHECK_DEPRECATED, "HWR sizes check %d failed: addresses = %d, sizes = %d", 3) \ -+X(42, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_POW_DUSTS_ENABLE_DEPRECATED, "Pow: DUSTS_ENABLE = 0x%x", 1) \ -+X(43, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_POW_HWREQ_DEPRECATED, "Pow: On(1)/Off(0): %d, Units: 0x%08.8x", 2) \ -+X(44, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_POW_DUSTS_CHANGE_DEPRECATED, "Pow: Changing number of dusts from %d to %d", 2) \ -+X(45, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_POW_SIDEKICK_IDLE_DEPRECATED, "Pow: Sidekick ready to be powered down", 0) \ -+X(46, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_POW_DUSTS_CHANGE_REQ_DEPRECATED, "Pow: Request to change num of dusts to %d (bPowRascalDust=%d)", 2) \ -+X(47, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_PARTIALRENDER_WITHOUT_ZSBUFFER_STORE, "No ZS Buffer used for partial render (store)", 0) \ -+X(48, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_PARTIALRENDER_WITHOUT_ZSBUFFER_LOAD, "No Depth/Stencil Buffer used for partial render (load)", 0) \ -+X(49, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_SET_LOCKUP_DEPRECATED, "HWR: Lock-up DM%d FWCtx: 0x%08.8x", 2) \ -+X(50, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_MLIST_CHECKER_REG_VALUE_DEPRECATED, "MLIST%d checker: CatBase TE=0x%08x (%d Pages), VCE=0x%08x (%d Pages), ALIST=0x%08x, IsTA=%d", 7) \ -+X(51, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_MLIST_CHECKER_MLIST_VALUE, "MLIST%d checker: MList[%d] = 0x%08x", 3) \ -+X(52, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_MLIST_CHECKER_OK, "MLIST%d OK", 1) \ -+X(53, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_MLIST_CHECKER_EMPTY, "MLIST%d is empty", 1) \ -+X(54, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_MLIST_CHECKER_REG_VALUE, "MLIST%d checker: CatBase TE=0x%08x%08x, VCE=0x%08x%08x, ALIST=0x%08x%08x, IsTA=%d", 8) \ -+X(55, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_3D_40480KICK, "3D OQ flush kick", 0) \ -+X(56, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWP_UNSUPPORTED_BLOCK, "HWPerf block ID (0x%x) unsupported by device", 1) \ -+X(57, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BREAKPOINT_SET_DEPRECATED2, "Setting breakpoint: Addr 0x%08.8x DM%u", 2) \ -+X(58, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_RTU_DEPRECATED, "Kick RTU: FWCtx 0x%08.8x @ %d, prio: %d", 3) \ -+X(59, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_RTU_FINISHED_DEPRECATED, "RDM finished on context %u", 1) \ -+X(60, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_SHG_DEPRECATED, "Kick SHG: FWCtx 0x%08.8x @ %d, prio: %d", 3) \ -+X(61, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SHG_FINISHED_DEPRECATED, "SHG finished", 0) \ -+X(62, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FBA_FINISHED_DEPRECATED, "FBA finished on context %u", 1) \ -+X(63, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_CHECK_FAILED, "UFO Checks failed", 0) \ -+X(64, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KILLDM_START, "Kill DM%d start", 1) \ -+X(65, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KILLDM_COMPLETE, "Kill DM%d complete", 1) \ -+X(66, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FC_CCB_UPDATE_DEPRECATED, "FC%u cCCB Woff update = %u", 2) \ -+X(67, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_RTU_DEPRECATED2, "Kick RTU: FWCtx 0x%08.8x @ %d, prio: %d, Frame Context: %d", 4) \ -+X(68, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_GPU_INIT, "GPU init", 0) \ -+X(69, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UNITS_INIT, "GPU Units init (# mask: 0x%x)", 1) \ -+X(70, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_REGTIMES, "Register access cycles: read: %d cycles, write: %d cycles, iterations: %d", 3) \ -+X(71, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_REGCONFIG_ADD, "Register configuration added. Address: 0x%x Value: 0x%x%x", 3) \ -+X(72, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_REGCONFIG_SET, "Register configuration applied to type %d. (0:pow on, 1:Rascal/dust init, 2-5: TA,3D,CDM,TLA, 6:All)", 1) \ -+X(73, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TPC_FLUSH, "Perform TPC flush.", 0) \ -+X(74, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_HIT_LOCKUP_DEPRECATED, "GPU has locked up (see HWR logs for more info)", 0) \ -+X(75, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_HIT_OUTOFTIME, "HWR has been triggered - GPU has overrun its deadline (see HWR logs)", 0) \ -+X(76, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_HIT_POLLFAILURE, "HWR has been triggered - GPU has failed a poll (see HWR logs)", 0) \ -+X(77, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_DOPPLER_OOM_DEPRECATED, "Doppler out of memory event for FC %u", 1) \ -+X(78, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_SPM_PR_CHECK1, "UFO SPM special PR-Check: [0x%08.8x] is 0x%08.8x requires >= 0x%08.8x", 3) \ -+X(79, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_SPM_PR_CHECK2, "UFO SPM special PR-Check: [0x%08.8x] is 0x%08.8x requires 0x%08.8x", 3) \ -+X(80, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TIMESTAMP, "TIMESTAMP -> [0x%08.8x]", 1) \ -+X(81, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_RMW_UPDATE_START, "UFO RMW Updates for FWCtx 0x%08.8x @ %d", 2) \ -+X(82, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_RMW_UPDATE, "UFO Update: [0x%08.8x] = 0x%08.8x", 2) \ -+X(83, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_NULLCMD, "Kick Null cmd: FWCtx 0x%08.8x @ %d", 2) \ -+X(84, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_RPM_OOM_DEPRECATED, "RPM Out of memory! Context 0x%08x, SH requestor %d", 2) \ -+X(85, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_RTU_ABORT_DISCARD_DEPRECATED, "Discard RTU due to RPM abort: FWCtx 0x%08.8x @ %d, prio: %d, Frame Context: %d", 4) \ -+X(86, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_DEFERRED, "Deferring DM%u from running context 0x%08x @ %d (deferred DMs = 0x%08x)", 4) \ -+X(87, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_DEFERRED_WAITING_TURN_DEPRECATED, "Deferring DM%u from running context 0x%08x @ %d to let other deferred DMs run (deferred DMs = 0x%08x)", 4) \ -+X(88, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_DEFERRED_NO_LONGER, "No longer deferring DM%u from running context = 0x%08x @ %d (deferred DMs = 0x%08x)", 4) \ -+X(89, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_WAITING_FOR_FWCCB_DEPRECATED, "FWCCB for DM%u is full, we will have to wait for space! (Roff = %u, Woff = %u)", 3) \ -+X(90, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_WAITING_FOR_FWCCB, "FWCCB for OSid %u is full, we will have to wait for space! (Roff = %u, Woff = %u)", 3) \ -+X(91, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SYNC_PART, "Host Sync Partition marker: %d", 1) \ -+X(92, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SYNC_PART_RPT, "Host Sync Partition repeat: %d", 1) \ -+X(93, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_CLOCK_SPEED_CHANGE, "Core clock set to %d Hz", 1) \ -+X(94, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_OFFSETS, "Compute Queue: FWCtx 0x%08.8x, prio: %d, queue: 0x%08x%08x (Roff = %u, Woff = %u, Size = %u)", 7) \ -+X(95, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SIGNAL_WAIT_FAILURE_DEPRECATED, "Signal check failed, Required Data: 0x%x, Address: 0x%08x%08x", 3) \ -+X(96, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SIGNAL_UPDATE_DEPRECATED, "Signal update, Snoop Filter: %u, MMU Ctx: %u, Signal Id: %u, Signals Base: 0x%08x%08x", 5) \ -+X(97, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FWCONTEXT_SIGNALED, "Signalled the previously waiting FWCtx: 0x%08.8x, OSId: %u, Signal Address: 0x%08x%08x", 4) \ -+X(98, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_STALLED_DEPRECATED, "Compute stalled", 0) \ -+X(99, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_STALLED, "Compute stalled (Roff = %u, Woff = %u, Size = %u)", 3) \ -+X(100, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_RESUMED_FROM_STALL, "Compute resumed (Roff = %u, Woff = %u, Size = %u)", 3) \ -+X(101, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_NOTIFY_SIGNAL_UPDATE, "Signal update notification from the host, PC Physical Address: 0x%08x%08x, Signal Virtual Address: 0x%08x%08x", 4) \ -+X(102, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SIGNAL_UPDATE_OSID_DM_DEPRECATED, "Signal update from DM: %u, OSId: %u, PC Physical Address: 0x%08x%08x", 4) \ -+X(103, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SIGNAL_WAIT_FAILURE_DM_DEPRECATED, "DM: %u signal check failed", 1) \ -+X(104, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_TDM_DEPRECATED, "Kick TDM: FWCtx 0x%08.8x @ %d, prio:%d", 3) \ -+X(105, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_FINISHED, "TDM finished", 0) \ -+X(106, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TE_PIPE_STATUS_DEPRECATED, "MMU_PM_CAT_BASE_TE[%d]_PIPE[%d]: 0x%08x 0x%08x)", 4) \ -+X(107, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BRN_54141_HIT_DEPRECATED, "BRN 54141 HIT", 0) \ -+X(108, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BRN_54141_APPLYING_DUMMY_TA_DEPRECATED, "BRN 54141 Dummy TA kicked", 0) \ -+X(109, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BRN_54141_RESUME_TA_DEPRECATED, "BRN 54141 resume TA", 0) \ -+X(110, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BRN_54141_DOUBLE_HIT_DEPRECATED, "BRN 54141 double hit after applying WA", 0) \ -+X(111, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BRN_54141_DUMMY_TA_VDM_BASE_DEPRECATED, "BRN 54141 Dummy TA VDM base address: 0x%08x%08x", 2) \ -+X(112, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SIGNAL_WAIT_FAILURE_WITH_CURRENT, "Signal check failed, Required Data: 0x%x, Current Data: 0x%x, Address: 0x%08x%08x", 4) \ -+X(113, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_BUFFER_STALL_DEPRECATED, "TDM stalled (Roff = %u, Woff = %u)", 2) \ -+X(114, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_NOTIFY_WRITE_OFFSET_UPDATE, "Write Offset update notification for stalled FWCtx 0x%08.8x", 1) \ -+X(115, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_PRIORITY_CHANGE, "Changing OSid %d's priority from %u to %u", 3) \ -+X(116, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_RESUMED, "Compute resumed", 0) \ -+X(117, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_TLA, "Kick TLA: FWCtx 0x%08.8x @ %d. (PID:%d, prio:%d, frame:%d, ext:0x%08x, int:0x%08x)", 7) \ -+X(118, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_TDM, "Kick TDM: FWCtx 0x%08.8x @ %d. (PID:%d, prio:%d, frame:%d, ext:0x%08x, int:0x%08x)", 7) \ -+X(119, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_TA, "Kick TA: FWCtx 0x%08.8x @ %d, RTD 0x%08x, First kick:%d, Last kick:%d, CSW resume:%d. (PID:%d, prio:%d, frame:%d, ext:0x%08x, int:0x%08x)", 11) \ -+X(120, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_3D, "Kick 3D: FWCtx 0x%08.8x @ %d, RTD 0x%08x, Partial render:%d, CSW resume:%d. (PID:%d, prio:%d, frame:%d, ext:0x%08x, int:0x%08x)", 10) \ -+X(121, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_3DTQ, "Kick 3D TQ: FWCtx 0x%08.8x @ %d, CSW resume:%d. (PID:%d, prio:%d, frame:%d, ext:0x%08x, int:0x%08x)", 8) \ -+X(122, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_COMPUTE, "Kick Compute: FWCtx 0x%08.8x @ %d. (PID:%d, prio:%d, ext:0x%08x, int:0x%08x)", 6) \ -+X(123, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_RTU_DEPRECATED3, "Kick RTU: FWCtx 0x%08.8x @ %d, Frame Context:%d. (PID:%d, prio:%d, frame:%d, ext:0x%08x, int:0x%08x)", 8) \ -+X(124, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KICK_SHG_DEPRECATED2, "Kick SHG: FWCtx 0x%08.8x @ %d. (PID:%d, prio:%d, frame:%d, ext:0x%08x, int:0x%08x)", 7) \ -+X(125, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_CSRM_RECONFIG, "Reconfigure CSRM: special coeff support enable %d.", 1) \ -+X(127, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TA_REQ_MAX_COEFFS, "TA requires max coeff mode, deferring: %d.", 1) \ -+X(128, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_3D_REQ_MAX_COEFFS, "3D requires max coeff mode, deferring: %d.", 1) \ -+X(129, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KILLDM_FAILED, "Kill DM%d failed", 1) \ -+X(130, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_WAITING_FOR_QUEUE, "Thread Queue is full, we will have to wait for space! (Roff = %u, Woff = %u)", 2) \ -+X(131, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_WAITING_FOR_QUEUE_FENCE, "Thread Queue is fencing, we are waiting for Roff = %d (Roff = %u, Woff = %u)", 3) \ -+X(132, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SET_HCS_TRIGGERED, "DM %d failed to Context Switch on time. Triggered HCS (see HWR logs).", 1) \ -+X(133, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HCS_SET, "HCS changed to %d ms", 1) \ -+X(134, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UPDATE_TILES_IN_FLIGHT_DEPRECATED, "Updating Tiles In Flight (Dusts=%d, PartitionMask=0x%08x, ISPCtl=0x%08x%08x)", 4) \ -+X(135, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SET_TILES_IN_FLIGHT, " Phantom %d: USCTiles=%d", 2) \ -+X(136, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_ISOLATION_CONF_OFF, "Isolation grouping is disabled", 0) \ -+X(137, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_ISOLATION_CONF_DEPRECATED, "Isolation group configured with a priority threshold of %d", 1) \ -+X(138, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_ONLINE_DEPRECATED, "OS %d has come online", 1) \ -+X(139, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_OFFLINE_DEPRECATED, "OS %d has gone offline", 1) \ -+X(140, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FWCONTEXT_SIGNAL_REKICK, "Signalled the previously stalled FWCtx: 0x%08.8x, OSId: %u, Signal Address: 0x%08x%08x", 4) \ -+X(141, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_OFFSETS_DEPRECATED, "TDM Queue: FWCtx 0x%08.8x, prio: %d, queue: 0x%08x%08x (Roff = %u, Woff = %u, Size = %u)", 7) \ -+X(142, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_OFFSET_READ_RESET, "Reset TDM Queue Read Offset: FWCtx 0x%08.8x, queue: 0x%08x%08x (Roff = %u becomes 0, Woff = %u, Size = %u)", 6) \ -+X(143, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UMQ_MISMATCHED_READ_OFFSET, "User Mode Queue mismatched stream start: FWCtx 0x%08.8x, queue: 0x%08x%08x (Roff = %u, StreamStartOffset = %u)", 5) \ -+X(144, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_GPU_DEINIT, "GPU deinit", 0) \ -+X(145, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UNITS_DEINIT, "GPU units deinit", 0) \ -+X(146, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_INIT_CONFIG, "Initialised OS %d with config flags 0x%08x", 2) \ -+X(147, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_LIMIT, "UFO limit exceeded %d/%d", 2) \ -+X(148, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_3D_62850KICK, "3D Dummy stencil store", 0) \ -+X(149, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_INIT_CONFIG_DEPRECATED, "Initialised OS %d with config flags 0x%08x and extended config flags 0x%08x", 3) \ -+X(150, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UNKNOWN_COMMAND_DEPRECATED, "Unknown Command (eCmdType=0x%08x)", 1) \ -+X(151, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_FORCED_UPDATE, "UFO forced update: FWCtx 0x%08.8x @ %d [0x%08.8x] = 0x%08.8x", 4) \ -+X(152, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UFO_FORCED_UPDATE_NOP, "UFO forced update NOP: FWCtx 0x%08.8x @ %d [0x%08.8x] = 0x%08.8x, reason %d", 5) \ -+X(153, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_BRN66075_CHECK, "TDM context switch check: Roff %u points to 0x%08x, Match=%u", 3) \ -+X(154, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_INIT_CCBS, "OSid %d CCB init status: %d (1-ok 0-fail): kCCBCtl@0x%x kCCB@0x%x fwCCBCtl@0x%x fwCCB@0x%x", 6) \ -+X(155, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FWIRQ, "FW IRQ # %u @ %u", 2) \ -+X(156, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BREAKPOINT_SET, "Setting breakpoint: Addr 0x%08.8x DM%u usc_breakpoint_ctrl_dm = %u", 3) \ -+X(157, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_KERNEL_CCB_DEPRECATED, "Invalid KCCB setup for OSid %u: KCCB 0x%08x, KCCB Ctrl 0x%08x", 3) \ -+X(158, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_KERNEL_CCB_CMD, "Invalid KCCB cmd (%u) for OSid %u @ KCCB 0x%08x", 3) \ -+X(159, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FW_FAULT, "FW FAULT: At line %d in file 0x%08x%08x, additional data=0x%08x", 4) \ -+X(160, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_BREAKPOINT_INVALID, "Invalid breakpoint: MemCtx 0x%08x Addr 0x%08.8x DM%u usc_breakpoint_ctrl_dm = %u", 4) \ -+X(161, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FLUSHINVAL_CMD_INVALID_DEPRECATED, "Discarding invalid SLC flushinval command for OSid %u: DM %u, FWCtx 0x%08x", 3) \ -+X(162, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_NOTIFY_WRITE_OFFSET_UPDATE_DEPRECATED, "Invalid Write Offset update notification from OSid %u to DM %u: FWCtx 0x%08x, MemCtx 0x%08x", 4) \ -+X(163, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_KCCB_KICK_CMD_DEPRECATED, "Null FWCtx in KCCB kick cmd for OSid %u: KCCB 0x%08x, ROff %u, WOff %u", 4) \ -+X(164, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FULL_CHPTCCB, "Checkpoint CCB for OSid %u is full, signalling host for full check state (Roff = %u, Woff = %u)", 3) \ -+X(165, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_INIT_CCBS_DEPRECATED, "OSid %d CCB init status: %d (1-ok 0-fail): kCCBCtl@0x%x kCCB@0x%x fwCCBCtl@0x%x fwCCB@0x%x chptCCBCtl@0x%x chptCCB@0x%x", 8) \ -+X(166, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_STATE_CHANGE, "OSid %d fw state transition request: from %d to %d (0-offline 1-ready 2-active 3-offloading). Status %d (1-ok 0-fail)", 4) \ -+X(167, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_STALE_KCCB_CMDS, "OSid %u has %u stale commands in its KCCB", 2) \ -+X(168, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TA_VCE_PAUSE, "Applying VCE pause", 0) \ -+X(169, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_KCCB_UPDATE_RTN_SLOT_DEPRECATED, "OSid %u KCCB slot %u value updated to %u", 3) \ -+X(170, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UNKNOWN_KCCB_COMMAND, "Unknown KCCB Command: KCCBCtl=0x%08x, KCCB=0x%08x, Roff=%u, Woff=%u, Wrap=%u, Cmd=0x%08x, CmdType=0x%08x", 7) \ -+X(171, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UNKNOWN_CCB_COMMAND1, "Unknown Client CCB Command processing fences: FWCtx=0x%08x, CCBCtl=0x%08x, CCB=0x%08x, Roff=%u, Doff=%u, Woff=%u, Wrap=%u, CmdHdr=0x%08x, CmdType=0x%08x, CmdSize=%u", 10) \ -+X(172, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UNKNOWN_CCB_COMMAND2, "Unknown Client CCB Command executing kick: FWCtx=0x%08x, CCBCtl=0x%08x, CCB=0x%08x, Roff=%u, Doff=%u, Woff=%u, Wrap=%u, CmdHdr=0x%08x, CmdType=0x%08x, CmdSize=%u", 10) \ -+X(173, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_KCCB_KICK_CMD, "Null FWCtx in KCCB kick cmd for OSid %u with WOff %u", 2) \ -+X(174, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FLUSHINVAL_CMD_INVALID, "Discarding invalid SLC flushinval command for OSid %u, FWCtx 0x%08x", 2) \ -+X(175, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_NOTIFY_WRITE_OFFSET_UPDATE, "Invalid Write Offset update notification from OSid %u: FWCtx 0x%08x, MemCtx 0x%08x", 3) \ -+X(176, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FW_INIT_CONFIG, "Initialised Firmware with config flags 0x%08x and extended config flags 0x%08x", 2) \ -+X(177, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_PHR_CONFIG, "Set Periodic Hardware Reset Mode: %d", 1) \ -+X(179, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_PHR_TRIG, "PHR mode %d, FW state: 0x%08x, HWR flags: 0x%08x", 3) \ -+X(180, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_PHR_RESET_DEPRECATED, "PHR mode %d triggered a reset", 1) \ -+X(181, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SIGNAL_UPDATE, "Signal update, Snoop Filter: %u, Signal Id: %u", 2) \ -+X(182, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FIXME_SERIES8, "WARNING: Skipping FW KCCB Cmd type %d which is not yet supported on Series8.", 1) \ -+X(183, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INCONSISTENT_MMU_FLAGS, "MMU context cache data NULL, but cache flags=0x%x (sync counter=%u, update value=%u) OSId=%u", 4) \ -+X(184, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SLC_FLUSH, "SLC range based flush: Context=%u VAddr=0x%02x%08x, Size=0x%08x, Invalidate=%d", 5) \ -+X(185, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FBSC_INVAL, "FBSC invalidate for Context [0x%08x]: Entry mask 0x%08x%08x.", 3) \ -+X(186, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_BRN66284_UPDATE, "TDM context switch check: Roff %u was not valid for kick starting at %u, moving back to %u", 3) \ -+X(187, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SPFILTER_UPDATES, "Signal updates: FIFO: %u, Signals: 0x%08x", 2) \ -+X(188, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_FBSC_CMD, "Invalid FBSC cmd: FWCtx 0x%08x, MemCtx 0x%08x", 2) \ -+X(189, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_BRN68497_BLIT, "Insert BRN68497 WA blit after TDM Context store.", 0) \ -+X(190, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_PENDING_UFO_UPDATE_START, "UFO Updates for previously finished FWCtx 0x%08.8x", 1) \ -+X(191, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_RTC_RTA_PRESENT, "RTC with RTA present, %u active render targets", 1) \ -+X(192, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_NULL_RTAS, "Invalid RTA Set-up. The ValidRenderTargets array in RTACtl is Null!", 0) \ -+X(193, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_INVALID_COUNTER, "Block 0x%x / Counter 0x%x INVALID and ignored", 2) \ -+X(194, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_ECC_FAULT_DEPRECATED, "ECC fault GPU=0x%08x FW=0x%08x", 2) \ -+X(195, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_PROCESS_XPU_EVENT, "Processing XPU event on DM = %d", 1) \ -+X(196, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_VZ_WDG_TRIGGER, "OSid %u failed to respond to the virtualisation watchdog in time. Timestamp of its last input = %u", 2) \ -+X(197, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_HIT_LOCKUP, "GPU-%u has locked up (see HWR logs for more info)", 1) \ -+X(198, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UPDATE_TILES_IN_FLIGHT, "Updating Tiles In Flight (Dusts=%d, PartitionMask=0x%08x, ISPCtl=0x%08x)", 3) \ -+X(199, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_HWR_HIT_LOCKUP_DM, "GPU has locked up (see HWR logs for more info)", 0) \ -+X(200, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_REPROCESS_XPU_EVENTS, "Reprocessing outstanding XPU events from cores 0x%02x", 1) \ -+X(201, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SECONDARY_XPU_EVENT, "Secondary XPU event on DM=%d, CoreMask=0x%02x, Raised=0x%02x", 3) \ -+X(202, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_OFFSETS, "TDM Queue: Core %u, FWCtx 0x%08.8x, prio: %d, queue: 0x%08x%08x (Roff = %u, Woff = %u, Size = %u)", 8) \ -+X(203, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_BUFFER_STALL, "TDM stalled Core %u (Roff = %u, Woff = %u)", 3) \ -+X(204, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_CORE_OFFSETS, "Compute Queue: Core %u, FWCtx 0x%08.8x, prio: %d, queue: 0x%08x%08x (Roff = %u, Woff = %u, Size = %u)", 8) \ -+X(205, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_CORE_STALLED, "Compute stalled core %u (Roff = %u, Woff = %u, Size = %u)", 4) \ -+X(206, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_UMQ_MISMATCHED_CORE_READ_OFFSET, "User Mode Queue mismatched stream start: Core %u, FWCtx 0x%08.8x, queue: 0x%08x%08x (Roff = %u, StreamStartOffset = %u)", 6) \ -+X(207, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TDM_RESUMED_FROM_STALL, "TDM resumed core %u (Roff = %u, Woff = %u)", 3) \ -+X(208, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_COMPUTE_CORE_RESUMED_FROM_STALL, "Compute resumed core %u (Roff = %u, Woff = %u, Size = %u)", 4) \ -+X(209, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_OS_MTS_PERMISSION_CHANGED, " Updated permission for OSid %u to perform MTS kicks: %u (1 = allowed, 0 = not allowed)", 2) \ -+X(210, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TEST1, "Mask = 0x%X, mask2 = 0x%X", 2) \ -+X(211, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_TEST2, " core %u, reg = %u, mask = 0x%X)", 3) \ -+X(212, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_ECC_FAULT_SAFETY_BUS, "ECC fault received from safety bus: 0x%08x", 1) \ -+X(213, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SAFETY_WDG_CONFIG, "Safety Watchdog threshold period set to 0x%x clock cycles", 1) \ -+X(214, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_SAFETY_WDG_TRIGGER, "MTS Safety Event trigged by the safety watchdog.", 0) \ -+X(215, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_USC_TASKS_RANGE, "DM%d USC tasks range limit 0 - %d, stride %d", 3) \ -+X(216, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_GPU_ECC_FAULT, "ECC fault GPU=0x%08x", 1) \ -+X(217, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_GPU_SAFETY_RESET, "GPU Hardware units reset to prevent transient faults.", 0) \ -+X(221, ROGUE_FW_GROUP_MAIN, ROGUE_FW_SF_MAIN_FWDATA_INIT_STATUS, "State of firmware's private data at boot time: %d (0 = uninitialised, 1 = initialised); Fw State Flags = 0x%08X", 2) \ -+\ -+X(1, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_BG_KICK_DEPRECATED, "Bg Task DM = %u, counted = %d", 2) \ -+X(2, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_BG_COMPLETE_DEPRECATED, "Bg Task complete DM = %u", 1) \ -+X(3, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_IRQ_KICK, "Irq Task DM = %u, Breq = %d, SBIrq = 0x%x", 3) \ -+X(4, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_IRQ_COMPLETE_DEPRECATED, "Irq Task complete DM = %u", 1) \ -+X(5, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_KICK_MTS_BG_ALL_DEPRECATED, "Kick MTS Bg task DM=All", 0) \ -+X(6, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_KICK_MTS_IRQ, "Kick MTS Irq task DM=%d", 1) \ -+X(7, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_READYCELLTYPE_DEPRECATED, "Ready queue debug DM = %u, celltype = %d", 2) \ -+X(8, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_READYTORUN_DEPRECATED, "Ready-to-run debug DM = %u, item = 0x%x", 2) \ -+X(9, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_CMDHEADER, "Client command header DM = %u, client CCB = 0x%x, cmd = 0x%x", 3) \ -+X(10, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_READYTORUN, "Ready-to-run debug OSid = %u, DM = %u, item = 0x%x", 3) \ -+X(11, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_READYCELLTYPE_DEPRECATED2, "Ready queue debug DM = %u, celltype = %d, OSid = %u", 3) \ -+X(12, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_BG_KICK_DEPRECATED2, "Bg Task DM = %u, counted = %d, OSid = %u", 3) \ -+X(13, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_BG_COMPLETE, "Bg Task complete DM Bitfield: %u", 1) \ -+X(14, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_IRQ_COMPLETE, "Irq Task complete.", 0) \ -+X(15, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_CMD_DISCARD, "Discarded Command Type: %d OS ID = %d PID = %d context = 0x%08x cccb ROff = 0x%x, due to USC breakpoint hit by OS ID = %d PID = %d.", 7) \ -+X(16, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_KCCBCMD_EXEC_DEPRECATED, "KCCB Slot %u: DM=%u, Cmd=0x%08x, OSid=%u", 4) \ -+X(17, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_KCCBCMD_RTN_VALUE, "KCCB Slot %u: Return value %u", 2) \ -+X(18, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_BG_KICK, "Bg Task OSid = %u", 1) \ -+X(19, ROGUE_FW_GROUP_MTS, ROGUE_FW_SF_MTS_KCCBCMD_EXEC, "KCCB Slot %u: Cmd=0x%08x, OSid=%u", 3) \ -+\ -+X(1, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_FWCTX_CLEANUP, "FwCommonContext [0x%08x] cleaned", 1) \ -+X(2, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_FWCTX_BUSY, "FwCommonContext [0x%08x] is busy: ReadOffset = %d, WriteOffset = %d", 3) \ -+X(3, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_CLEANUP_DEPRECATED, "HWRTData [0x%08x] for DM=%d, received cleanup request", 2) \ -+X(4, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_CLEANED_FOR_DM_DEPRECATED, "HWRTData [0x%08x] HW Context cleaned for DM%u, executed commands = %d", 3) \ -+X(5, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_BUSY_DEPRECATED, "HWRTData [0x%08x] HW Context for DM%u is busy", 2) \ -+X(6, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_CLEANED_DEPRECATED, "HWRTData [0x%08x] HW Context %u cleaned", 2) \ -+X(7, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_FL_CLEANED, "Freelist [0x%08x] cleaned", 1) \ -+X(8, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_ZSBUFFER_CLEANED, "ZSBuffer [0x%08x] cleaned", 1) \ -+X(9, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_ZSBUFFER_BUSY, "ZSBuffer [0x%08x] is busy: submitted = %d, executed = %d", 3) \ -+X(10, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_BUSY_DEPRECATED2, "HWRTData [0x%08x] HW Context for DM%u is busy: submitted = %d, executed = %d", 4) \ -+X(11, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRFD_CLEANUP_DEPRECATED, "HW Ray Frame data [0x%08x] for DM=%d, received cleanup request", 2) \ -+X(12, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRFD_CLEANED_FOR_DM_DEPRECATED, "HW Ray Frame Data [0x%08x] cleaned for DM%u, executed commands = %d", 3) \ -+X(13, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRFD_BUSY_DEPRECATED, "HW Ray Frame Data [0x%08x] for DM%u is busy: submitted = %d, executed = %d", 4) \ -+X(14, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRFD_CLEANED_DEPRECATED, "HW Ray Frame Data [0x%08x] HW Context %u cleaned", 2) \ -+X(15, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_INVALID_REQUEST, "Discarding invalid cleanup request of type 0x%x", 1) \ -+X(16, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_CLEANUP, "Received cleanup request for HWRTData [0x%08x]", 1) \ -+X(17, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_BUSY, "HWRTData [0x%08x] HW Context is busy: submitted = %d, executed = %d", 3) \ -+X(18, ROGUE_FW_GROUP_CLEANUP, ROGUE_FW_SF_CLEANUP_HWRTD_CLEANED, "HWRTData [0x%08x] HW Context %u cleaned, executed commands = %d", 3) \ -+\ -+X(1, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_NEEDS_RESUME, "CDM FWCtx 0x%08.8x needs resume", 1) \ -+X(2, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_RESUME_DEPRECATED, "*** CDM FWCtx 0x%08.8x resume from snapshot buffer 0x%08x%08x", 3) \ -+X(3, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_SHARED, "CDM FWCtx shared alloc size load 0x%x", 1) \ -+X(4, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_STORE_COMPLETE, "*** CDM FWCtx store complete", 0) \ -+X(5, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_STORE_START, "*** CDM FWCtx store start", 0) \ -+X(6, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_SOFT_RESET, "CDM Soft Reset", 0) \ -+X(7, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_NEEDS_RESUME, "3D FWCtx 0x%08.8x needs resume", 1) \ -+X(8, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_RESUME, "*** 3D FWCtx 0x%08.8x resume", 1) \ -+X(9, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_STORE_COMPLETE, "*** 3D context store complete", 0) \ -+X(10, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_STORE_PIPE_STATE_DEPRECATED, "3D context store pipe state: 0x%08.8x 0x%08.8x 0x%08.8x", 3) \ -+X(11, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_STORE_START, "*** 3D context store start", 0) \ -+X(12, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_TQ_RESUME, "*** 3D TQ FWCtx 0x%08.8x resume", 1) \ -+X(13, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_NEEDS_RESUME, "TA FWCtx 0x%08.8x needs resume", 1) \ -+X(14, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_RESUME, "*** TA FWCtx 0x%08.8x resume from snapshot buffer 0x%08x%08x", 3) \ -+X(15, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_SHARED, "TA context shared alloc size store 0x%x, load 0x%x", 2) \ -+X(16, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_STORE_COMPLETE, "*** TA context store complete", 0) \ -+X(17, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_STORE_START, "*** TA context store start", 0) \ -+X(18, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_HIGHER_PRIORITY_SCHEDULED_DEPRECATED, "Higher priority context scheduled for DM %u, old prio:%d, new prio:%d", 3) \ -+X(19, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_SET_CONTEXT_PRIORITY, "Set FWCtx 0x%x priority to %u", 2) \ -+X(20, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_STORE_PIPE_STATE_DEPRECATED2, "3D context store pipe%d state: 0x%08.8x", 2) \ -+X(21, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_RESUME_PIPE_STATE_DEPRECATED, "3D context resume pipe%d state: 0x%08.8x", 2) \ -+X(22, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_SHG_NEEDS_RESUME_DEPRECATED, "SHG FWCtx 0x%08.8x needs resume", 1) \ -+X(23, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_SHG_RESUME_DEPRECATED, "*** SHG FWCtx 0x%08.8x resume from snapshot buffer 0x%08x%08x", 3) \ -+X(24, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_SHG_SHARED_DEPRECATED, "SHG context shared alloc size store 0x%x, load 0x%x", 2) \ -+X(25, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_SHG_STORE_COMPLETE_DEPRECATED, "*** SHG context store complete", 0) \ -+X(26, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_SHG_STORE_START_DEPRECATED, "*** SHG context store start", 0) \ -+X(27, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_PIPE_INDIRECT, "Performing TA indirection, last used pipe %d", 1) \ -+X(28, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_STORE_CTRL_STREAM_TERMINATE, "CDM context store hit ctrl stream terminate. Skip resume.", 0) \ -+X(29, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_CDM_RESUME_AB_BUFFER, "*** CDM FWCtx 0x%08.8x resume from snapshot buffer 0x%08x%08x, shader state %u", 4) \ -+X(30, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_STATE_BUFFER_FLIP, "TA PDS/USC state buffer flip (%d->%d)", 2) \ -+X(31, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_STORE_52563_HIT_DEPRECATED, "TA context store hit BRN 52563: vertex store tasks outstanding", 0) \ -+X(32, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_STORE_USC_POLL_FAILED, "TA USC poll failed (USC vertex task count: %d)", 1) \ -+X(33, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TA_STORE_DEFERRED_DEPRECATED, "TA context store deferred due to BRN 54141.", 0) \ -+X(34, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_HIGHER_PRIORITY_SCHEDULED_DEPRECATED2, "Higher priority context scheduled for DM %u. Prios (OSid, OSid Prio, Context Prio): Current: %u, %u, %u New: %u, %u, %u", 7) \ -+X(35, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TDM_STORE_START, "*** TDM context store start", 0) \ -+X(36, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TDM_STORE_COMPLETE, "*** TDM context store complete", 0) \ -+X(37, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TDM_STORE_NEEDS_RESUME_DEPRECATED, "TDM context needs resume, header [0x%08.8x, 0x%08.8x]", 2) \ -+X(38, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_HIGHER_PRIORITY_SCHEDULED, "Higher priority context scheduled for DM %u. Prios (OSid, OSid Prio, Context Prio): Current: %u, %u, %u New: %u, %u, %u. Hard Context Switching: %u", 8) \ -+X(39, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_STORE_PIPE_STATE, "3D context store pipe %2d (%2d) state: 0x%08.8x", 3) \ -+X(40, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_RESUME_PIPE_STATE, "3D context resume pipe %2d (%2d) state: 0x%08.8x", 3) \ -+X(41, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_STORE_START_VOLCANIC, "*** 3D context store start version %d (1=IPP_TILE, 2=ISP_TILE)", 1) \ -+X(42, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_STORE_PIPE_STATE_VOLCANIC, "3D context store pipe%d state: 0x%08.8x%08x", 3) \ -+X(43, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_RESUME_PIPE_STATE_VOLCANIC, "3D context resume pipe%d state: 0x%08.8x%08x", 3) \ -+X(44, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_RESUME_IPP_STATE, "3D context resume IPP state: 0x%08.8x%08x", 2) \ -+X(45, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_PIPES_EMPTY, "All 3D pipes empty after ISP tile mode store! IPP_status: 0x%08x", 1) \ -+X(46, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TDM_RESUME_PIPE_STATE_DEPRECATED, "TDM context resume pipe%d state: 0x%08.8x%08x", 3) \ -+X(47, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_3D_LEVEL4_STORE_START, "*** 3D context store start version 4", 0) \ -+X(48, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_RESUME_MULTICORE, "Multicore context resume on DM%d active core mask 0x%04.4x", 2) \ -+X(49, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_STORE_MULTICORE, "Multicore context store on DM%d active core mask 0x%04.4x", 2) \ -+X(50, ROGUE_FW_GROUP_CSW, ROGUE_FW_SF_CSW_TDM_RESUME_PIPE_STATE, "TDM context resume Core %d, pipe%d state: 0x%08.8x%08x%08x", 5) \ -+\ -+X(1, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_ACTIVATE_BIFREQ_DEPRECATED, "Activate MemCtx=0x%08x BIFreq=%d secure=%d", 3) \ -+X(2, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_DEACTIVATE, "Deactivate MemCtx=0x%08x", 1) \ -+X(3, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_PCREG_ALLOC, "Alloc PC reg %d", 1) \ -+X(4, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_PCREG_GRAB, "Grab reg %d refcount now %d", 2) \ -+X(5, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_PCREG_UNGRAB, "Ungrab reg %d refcount now %d", 2) \ -+X(6, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_SETUP_REG_BIFREQ_DEPRECATED, "Setup reg=%d BIFreq=%d, expect=0x%08x%08x, actual=0x%08x%08x", 6) \ -+X(7, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_TRUST_DEPRECATED, "Trust enabled:%d, for BIFreq=%d", 2) \ -+X(8, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_TILECFG_DEPRECATED, "BIF Tiling Cfg %d base 0x%08x%08x len 0x%08x%08x enable %d stride %d --> 0x%08x%08x", 9) \ -+X(9, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_OSID0, "Wrote the Value %d to OSID0, Cat Base %d, Register's contents are now 0x%08x 0x%08x", 4) \ -+X(10, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_OSID1, "Wrote the Value %d to OSID1, Context %d, Register's contents are now 0x%04x", 3) \ -+X(11, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_OSIDx, "ui32OSid = %u, Catbase = %u, Reg Address = 0x%x, Reg index = %u, Bitshift index = %u, Val = 0x%08x%08x", 7) \ -+X(12, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_MAP_GPU_MEMORY_BIFREQ_DEPRECATED, "Map GPU memory DevVAddr 0x%x%08x, Size %u, Context ID %u, BIFREQ %u", 5) \ -+X(13, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_UNMAP_GPU_MEMORY, "Unmap GPU memory (event status 0x%x)", 1) \ -+X(14, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_ACTIVATE_DM, "Activate MemCtx=0x%08x DM=%d secure=%d", 3) \ -+X(15, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_SETUP_REG_DM, "Setup reg=%d DM=%d, expect=0x%08x%08x, actual=0x%08x%08x", 6) \ -+X(16, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_MAP_GPU_MEMORY, "Map GPU memory DevVAddr 0x%x%08x, Size %u, Context ID %u", 4) \ -+X(17, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_TRUST_DM, "Trust enabled:%d, for DM=%d", 2) \ -+X(18, ROGUE_FW_GROUP_BIF, ROGUE_FW_SF_BIF_MAP_GPU_MEMORY_DM, "Map GPU memory DevVAddr 0x%x%08x, Size %u, Context ID %u, DM %u", 5) \ -+\ -+X(1, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_WRITE, "GPIO write 0x%02x", 1) \ -+X(2, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_READ, "GPIO read 0x%02x", 1) \ -+X(3, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_ENABLED, "GPIO enabled", 0) \ -+X(4, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_DISABLED, "GPIO disabled", 0) \ -+X(5, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_STATUS, "GPIO status=%d (0=OK, 1=Disabled)", 1) \ -+X(6, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_AP_READ, "GPIO_AP: Read address=0x%02x (%d byte(s))", 2) \ -+X(7, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_AP_WRITE, "GPIO_AP: Write address=0x%02x (%d byte(s))", 2) \ -+X(8, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_AP_TIMEOUT, "GPIO_AP timeout!", 0) \ -+X(9, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_AP_ERROR, "GPIO_AP error. GPIO status=%d (0=OK, 1=Disabled)", 1) \ -+X(10, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_GPIO_ALREADY_READ, "GPIO already read 0x%02x", 1) \ -+X(11, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_CHECK_BUFFER_AVAILABLE, "SR: Check buffer %d available returned %d", 2) \ -+X(12, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_WAITING_BUFFER_AVAILABLE, "SR: Waiting for buffer %d", 1) \ -+X(13, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_WAIT_BUFFER_TIMEOUT, "SR: Timeout waiting for buffer %d (after %d ticks)", 2) \ -+X(14, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_SKIP_FRAME_CHECK, "SR: Skip frame check for strip %d returned %d (0=No skip, 1=Skip frame)", 2) \ -+X(15, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_SKIP_REMAINING_STRIPS, "SR: Skip remaining strip %d in frame", 1) \ -+X(16, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_FRAME_SKIP_NEW_FRAME, "SR: Inform HW that strip %d is a new frame", 1) \ -+X(17, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_SKIP_FRAME_TIMEOUT, "SR: Timeout waiting for INTERRUPT_FRAME_SKIP (after %d ticks)", 1) \ -+X(18, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_STRIP_MODE, "SR: Strip mode is %d", 1) \ -+X(19, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_STRIP_INDEX, "SR: Strip Render start (strip %d)", 1) \ -+X(20, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_BUFFER_RENDERED, "SR: Strip Render complete (buffer %d)", 1) \ -+X(21, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SR_BUFFER_FAULT, "SR: Strip Render fault (buffer %d)", 1) \ -+X(22, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_TRP_STATE, "TRP state: %d", 1) \ -+X(23, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_TRP_FAILURE, "TRP failure: %d", 1) \ -+X(24, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SW_TRP_STATE, "SW TRP State: %d", 1) \ -+X(25, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_SW_TRP_FAILURE, "SW TRP failure: %d", 1) \ -+X(26, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_HW_KICK, "HW kick event (%u)", 1) \ -+X(27, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_WGP_CHECKSUMS, "GPU core (%u/%u): checksum 0x%08x vs. 0x%08x", 4) \ -+X(28, ROGUE_FW_GROUP_MISC, ROGUE_FW_SF_MISC_WGP_UNIT_CHECKSUMS, "GPU core (%u/%u), unit (%u,%u): checksum 0x%08x vs. 0x%08x", 6) \ -+\ -+X(1, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_AMLIST, "ALIST%d SP = %u, MLIST%d SP = %u (VCE 0x%08x%08x, TE 0x%08x%08x, ALIST 0x%08x%08x)", 10) \ -+X(2, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_SHARED_DEPRECATED, "Is TA: %d, finished: %d on HW %u (HWRTData = 0x%08x, MemCtx = 0x%08x). FL different between TA/3D: global:%d, local:%d, mmu:%d", 8) \ -+X(3, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_3DBASE_DEPRECATED, "UFL-3D-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), FL-3D-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), MFL-3D-Base: 0x%08x%08x (SP = %u, 4PT = %u)", 14) \ -+X(4, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_TABASE_DEPRECATED, "UFL-TA-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), FL-TA-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), MFL-TA-Base: 0x%08x%08x (SP = %u, 4PT = %u)", 14) \ -+X(5, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_FL_GROW_COMPLETE_DEPRECATED, "Freelist grow completed [0x%08x]: added pages 0x%08x, total pages 0x%08x, new DevVirtAddr 0x%08x%08x", 5) \ -+X(6, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_FL_GROW_DENIED_DEPRECATED, "Grow for freelist ID=0x%08x denied by host", 1) \ -+X(7, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_FL_UPDATE_COMPLETE, "Freelist update completed [0x%08x]: old total pages 0x%08x, new total pages 0x%08x, new DevVirtAddr 0x%08x%08x", 5) \ -+X(8, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_FL_RECONSTRUCTION_FAILED_DEPRECATED, "Reconstruction of freelist ID=0x%08x failed", 1) \ -+X(9, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_DM_PAUSE_WARNING, "Ignored attempt to pause or unpause the DM while there is no relevant operation in progress (0-TA,1-3D): %d, operation(0-unpause, 1-pause): %d", 2) \ -+X(10, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_3D_TIMEOUT_STATUS, "Force free 3D Context memory, FWCtx: 0x%08x, status(1:success, 0:fail): %d", 2)\ -+X(11, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_DM_PAUSE_ALLOC, "PM pause TA ALLOC: PM_PAGE_MANAGEOP set to 0x%x", 1) \ -+X(12, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_DM_UNPAUSE_ALLOC, "PM unpause TA ALLOC: PM_PAGE_MANAGEOP set to 0x%x", 1) \ -+X(13, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_DM_PAUSE_DALLOC, "PM pause 3D DALLOC: PM_PAGE_MANAGEOP set to 0x%x", 1) \ -+X(14, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_DM_UNPAUSE_DALLOC, "PM unpause 3D DALLOC: PM_PAGE_MANAGEOP set to 0x%x", 1) \ -+X(15, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_DM_PAUSE_FAILED, "PM ALLOC/DALLOC change was not actioned: PM_PAGE_MANAGEOP_STATUS=0x%x", 1) \ -+X(16, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_SHARED, "Is TA: %d, finished: %d on HW %u (HWRTData = 0x%08x, MemCtx = 0x%08x). FL different between TA/3D: global:%d, local:%d", 7) \ -+X(17, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_3DBASE, "UFL-3D-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), FL-3D-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u)", 10) \ -+X(18, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_TABASE, "UFL-TA-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), FL-TA-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u)", 10) \ -+X(19, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_FL_UPDATE_COMPLETE_VOLCANIC, "Freelist update completed [0x%08x / FL State 0x%08x%08x]: old total pages 0x%08x, new total pages 0x%08x, new DevVirtAddr 0x%08x%08x", 7) \ -+X(20, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_FL_UPDATE_FAILED, "Freelist update failed [0x%08x / FL State 0x%08x%08x]: old total pages 0x%08x, new total pages 0x%08x, new DevVirtAddr 0x%08x%08x", 7) \ -+X(21, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_3DBASE_VOLCANIC, "UFL-3D-State-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), FL-3D-State-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u)", 10) \ -+X(22, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_TABASE_VOLCANIC, "UFL-TA-State-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u), FL-TA-State-Base: 0x%08x%08x (SP = %u, 4PB = %u, 4PT = %u)", 10) \ -+X(23, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_CHECK_FL_BASEADDR, "Freelist 0x%08x base address from HW: 0x%02x%08x (expected value: 0x%02x%08x)", 5) \ -+X(24, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_ANALYSE_FL_GROW, "Analysis of FL grow: Pause=(%u,%u) Paused+Valid(%u,%u) PMStateBuffer=0x%x", 5) \ -+X(25, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_ATTEMPT_FL_GROW, "Attempt FL grow for FL: 0x%08x, new dev address: 0x%02x%08x, new page count: %u, new ready count: %u", 5) \ -+X(26, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_DEFER_FL_GROW, "Deferring FL grow for non-loaded FL: 0x%08x, new dev address: 0x%02x%08x, new page count: %u, new ready count: %u", 5) \ -+X(27, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_UFL_SHARED_ALBIORIX, "Is GEOM: %d, finished: %d (HWRTData = 0x%08x, MemCtx = 0x%08x)", 4) \ -+X(28, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_3D_TIMEOUT, "3D Timeout Now for FWCtx 0x%08.8x", 1) \ -+X(29, ROGUE_FW_GROUP_PM, ROGUE_FW_SF_PM_RECYCLE, "GEOM PM Recycle for FWCtx 0x%08.8x", 1) \ -+\ -+X(1, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_GLL_DYNAMIC_STATUS_DEPRECATED, "Global link list dynamic page count: vertex 0x%x, varying 0x%x, node 0x%x", 3) \ -+X(2, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_GLL_STATIC_STATUS_DEPRECATED, "Global link list static page count: vertex 0x%x, varying 0x%x, node 0x%x", 3) \ -+X(3, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_STATE_WAIT_FOR_GROW_DEPRECATED, "RPM request failed. Waiting for freelist grow.", 0) \ -+X(4, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_STATE_ABORT_DEPRECATED, "RPM request failed. Aborting the current frame.", 0) \ -+X(5, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_STATE_WAIT_FOR_PENDING_GROW_DEPRECATED, "RPM waiting for pending grow on freelist 0x%08x", 1) \ -+X(6, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_REQUEST_HOST_GROW_DEPRECATED, "Request freelist grow [0x%08x] current pages %d, grow size %d", 3) \ -+X(7, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_FREELIST_LOAD_DEPRECATED, "Freelist load: SHF = 0x%08x, SHG = 0x%08x", 2) \ -+X(8, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_SHF_FPL_DEPRECATED, "SHF FPL register: 0x%08x.0x%08x", 2) \ -+X(9, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_SHG_FPL_DEPRECATED, "SHG FPL register: 0x%08x.0x%08x", 2) \ -+X(10, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_GROW_FREELIST_DEPRECATED, "Kernel requested RPM grow on freelist (type %d) at 0x%08x from current size %d to new size %d, RPM restart: %d (1=Yes)", 5) \ -+X(11, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_GROW_RESTART_DEPRECATED, "Restarting SHG", 0) \ -+X(12, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_GROW_ABORTED_DEPRECATED, "Grow failed, aborting the current frame.", 0) \ -+X(13, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_ABORT_COMPLETE_DEPRECATED, "RPM abort complete on HWFrameData [0x%08x].", 1) \ -+X(14, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_CLEANUP_NEEDS_ABORT_DEPRECATED, "RPM freelist cleanup [0x%08x] requires abort to proceed.", 1) \ -+X(15, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_RPM_PT_DEPRECATED, "RPM page table base register: 0x%08x.0x%08x", 2) \ -+X(16, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_OOM_ABORT_DEPRECATED, "Issuing RPM abort.", 0) \ -+X(17, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_OOM_TOGGLE_CHECK_FULL_DEPRECATED, "RPM OOM received but toggle bits indicate free pages available", 0) \ -+X(18, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_STATE_HW_TIMEOUT_DEPRECATED, "RPM hardware timeout. Unable to process OOM event.", 0) \ -+X(19, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_SHF_FPL_LOAD_DEPRECATED_DEPRECATED, "SHF FL (0x%08x) load, FPL: 0x%08x.0x%08x, roff: 0x%08x, woff: 0x%08x", 5) \ -+X(20, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_SHG_FPL_LOAD_DEPRECATED, "SHG FL (0x%08x) load, FPL: 0x%08x.0x%08x, roff: 0x%08x, woff: 0x%08x", 5) \ -+X(21, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_SHF_FPL_STORE_DEPRECATED, "SHF FL (0x%08x) store, roff: 0x%08x, woff: 0x%08x", 3) \ -+X(22, ROGUE_FW_GROUP_RPM, ROGUE_FW_SF_RPM_SHG_FPL_STORE_DEPRECATED, "SHG FL (0x%08x) store, roff: 0x%08x, woff: 0x%08x", 3) \ -+\ -+X(1, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_3D_RTDATA_FINISHED, "3D RTData 0x%08x finished on HW context %u", 2) \ -+X(2, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_3D_RTDATA_READY, "3D RTData 0x%08x ready on HW context %u", 2) \ -+X(3, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_PB_SET_TO_DEPRECATED, "CONTEXT_PB_BASE set to 0x%x, FL different between TA/3D: local: %d, global: %d, mmu: %d", 4) \ -+X(4, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_LOADVFP_3D_DEPRECATED, "Loading VFP table 0x%08x%08x for 3D", 2) \ -+X(5, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_LOADVFP_TA_DEPRECATED, "Loading VFP table 0x%08x%08x for TA", 2) \ -+X(6, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_LOAD_FL_DEPRECATED, "Load Freelist 0x%x type: %d (0:local,1:global,2:mmu) for DM%d: TotalPMPages = %d, FL-addr = 0x%08x%08x, stacktop = 0x%08x%08x, Alloc Page Count = %u, Alloc MMU Page Count = %u", 10) \ -+X(7, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_VHEAP_STORE, "Perform VHEAP table store", 0) \ -+X(8, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_RTDATA_MATCH_FOUND, "RTData 0x%08x: found match in Context=%d: Load=No, Store=No", 2) \ -+X(9, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_RTDATA_NULL_FOUND, "RTData 0x%08x: found NULL in Context=%d: Load=Yes, Store=No", 2) \ -+X(10, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_RTDATA_3D_FINISHED, "RTData 0x%08x: found state 3D finished (0x%08x) in Context=%d: Load=Yes, Store=Yes", 3) \ -+X(11, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_RTDATA_TA_FINISHED, "RTData 0x%08x: found state TA finished (0x%08x) in Context=%d: Load=Yes, Store=Yes", 3) \ -+X(12, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_LOAD_STACK_POINTERS, "Loading stack-pointers for %d (0:MidTA,1:3D) on context %d, MLIST = 0x%08x, ALIST = 0x%08x%08x", 5) \ -+X(13, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_STORE_PB_DEPRECATED, "Store Freelist 0x%x type: %d (0:local,1:global,2:mmu) for DM%d: TotalPMPages = %d, FL-addr = 0x%08x%08x, stacktop = 0x%08x%08x, Alloc Page Count = %u, Alloc MMU Page Count = %u", 10) \ -+X(14, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_TA_RTDATA_FINISHED, "TA RTData 0x%08x finished on HW context %u", 2) \ -+X(15, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_TA_RTDATA_LOADED, "TA RTData 0x%08x loaded on HW context %u", 2) \ -+X(16, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_STORE_PB_DEPRECATED2, "Store Freelist 0x%x type: %d (0:local,1:global,2:mmu) for DM%d: FL Total Pages %u (max=%u,grow size=%u), FL-addr = 0x%08x%08x, stacktop = 0x%08x%08x, Alloc Page Count = %u, Alloc MMU Page Count = %u", 12) \ -+X(17, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_LOAD_FL_DEPRECATED2, "Load Freelist 0x%x type: %d (0:local,1:global,2:mmu) for DM%d: FL Total Pages %u (max=%u,grow size=%u), FL-addr = 0x%08x%08x, stacktop = 0x%08x%08x, Alloc Page Count = %u, Alloc MMU Page Count = %u", 12) \ -+X(18, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_DEBUG_DEPRECATED, "Freelist 0x%x RESET!!!!!!!!", 1) \ -+X(19, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_DEBUG2_DEPRECATED, "Freelist 0x%x stacktop = 0x%08x%08x, Alloc Page Count = %u, Alloc MMU Page Count = %u", 5) \ -+X(20, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_FL_RECON_DEPRECATED, "Request reconstruction of Freelist 0x%x type: %d (0:local,1:global,2:mmu) on HW context %u", 3) \ -+X(21, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_FL_RECON_ACK_DEPRECATED, "Freelist reconstruction ACK from host (HWR state :%u)", 1) \ -+X(22, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_FL_RECON_ACK_DEPRECATED2, "Freelist reconstruction completed", 0) \ -+X(23, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_TA_RTDATA_LOADED_DEPRECATED, "TA RTData 0x%08x loaded on HW context %u HWRTDataNeedsLoading=%d", 3) \ -+X(24, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_TE_RGNHDR_INFO, "TE Region headers base 0x%08x%08x (RGNHDR Init: %d)", 3) \ -+X(25, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_TA_RTDATA_BUFFER_ADDRS_DEPRECATED, "TA Buffers: FWCtx 0x%08x, RT 0x%08x, RTData 0x%08x, VHeap 0x%08x%08x, TPC 0x%08x%08x (MemCtx 0x%08x)", 8) \ -+X(26, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_3D_RTDATA_LOADED_DEPRECATED, "3D RTData 0x%08x loaded on HW context %u", 2) \ -+X(27, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_3D_RTDATA_BUFFER_ADDRS_DEPRECATED, "3D Buffers: FWCtx 0x%08x, RT 0x%08x, RTData 0x%08x (MemCtx 0x%08x)", 4) \ -+X(28, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_TA_RESTART_AFTER_PR_EXECUTED, "Restarting TA after partial render, HWRTData0State=0x%x, HWRTData1State=0x%x", 2) \ -+X(29, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_PB_SET_TO, "CONTEXT_PB_BASE set to 0x%x, FL different between TA/3D: local: %d, global: %d", 3) \ -+X(30, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_STORE_FL, "Store Freelist 0x%x type: %d (0:local,1:global) for PMDM%d: FL Total Pages %u (max=%u,grow size=%u), FL-addr = 0x%08x%08x, stacktop = 0x%08x%08x, Alloc Page Count = %u, Alloc MMU Page Count = %u", 12) \ -+X(31, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_LOAD_FL, "Load Freelist 0x%x type: %d (0:local,1:global) for PMDM%d: FL Total Pages %u (max=%u,grow size=%u), FL-addr = 0x%08x%08x, stacktop = 0x%08x%08x, Alloc Page Count = %u, Alloc MMU Page Count = %u", 12) \ -+X(32, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_3D_RTDATA_BUFFER_ADDRS_DEPRECATED2, "3D Buffers: FWCtx 0x%08x, parent RT 0x%08x, RTData 0x%08x on ctx %d, (MemCtx 0x%08x)", 5) \ -+X(33, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_TA_RTDATA_BUFFER_ADDRS, "TA Buffers: FWCtx 0x%08x, RTData 0x%08x, VHeap 0x%08x%08x, TPC 0x%08x%08x (MemCtx 0x%08x)", 7) \ -+X(34, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_3D_RTDATA_BUFFER_ADDRS, "3D Buffers: FWCtx 0x%08x, RTData 0x%08x on ctx %d, (MemCtx 0x%08x)", 4) \ -+X(35, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_LOAD_FL_V2, "Load Freelist 0x%x type: %d (0:local,1:global) for PMDM%d: FL Total Pages %u (max=%u,grow size=%u)", 6) \ -+X(36, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_KILLED_TA, "TA RTData 0x%08x marked as killed.", 1) \ -+X(37, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_KILLED_3D, "3D RTData 0x%08x marked as killed.", 1) \ -+X(38, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_KILL_TA_AFTER_RESTART, "RTData 0x%08x will be killed after TA restart.", 1) \ -+X(39, ROGUE_FW_GROUP_RTD, ROGUE_FW_SF_RTD_RENDERSTATE_RESET, "RTData 0x%08x Render State Buffer 0x%08x%08x will be reset.", 3) \ -+\ -+X(1, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZLOAD_DEPRECATED, "Force Z-Load for partial render", 0) \ -+X(2, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSTORE_DEPRECATED, "Force Z-Store for partial render", 0) \ -+X(3, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_3DMEMFREE_LOCAL_DEPRECATED, "3D MemFree: Local FL 0x%08x", 1) \ -+X(4, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_3DMEMFREE_MMU_DEPRECATED, "3D MemFree: MMU FL 0x%08x", 1) \ -+X(5, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_3DMEMFREE_GLOBAL_DEPRECATED, "3D MemFree: Global FL 0x%08x", 1) \ -+X(6, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OOM_TACMD_DEPRECATED, "OOM TA/3D PR Check: [0x%08.8x] is 0x%08.8x requires 0x%08.8x, HardwareSync Fence [0x%08.8x] is 0x%08.8x requires 0x%08.8x", 6) \ -+X(7, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OOM_TACMD_UN_FL, "OOM TA_cmd=0x%08x, U-FL 0x%08x, N-FL 0x%08x", 3) \ -+X(8, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OOM_TACMD_UN_MMU_FL_DEPRECATED, "OOM TA_cmd=0x%08x, OOM MMU:%d, U-FL 0x%08x, N-FL 0x%08x, MMU-FL 0x%08x", 5) \ -+X(9, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_PRENDER_AVOIDED_DEPRECATED, "Partial render avoided", 0) \ -+X(10, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_PRENDER_DISCARDED_DEPRECATED, "Partial render discarded", 0) \ -+X(11, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_PRENDER_FINISHED, "Partial Render finished", 0) \ -+X(12, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OWNER_3DBG_DEPRECATED, "SPM Owner = 3D-BG", 0) \ -+X(13, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OWNER_3DIRQ_DEPRECATED, "SPM Owner = 3D-IRQ", 0) \ -+X(14, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OWNER_NONE_DEPRECATED, "SPM Owner = NONE", 0) \ -+X(15, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OWNER_TABG_DEPRECATED, "SPM Owner = TA-BG", 0) \ -+X(16, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OWNER_TAIRQ_DEPRECATED, "SPM Owner = TA-IRQ", 0) \ -+X(17, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSTORE_ADDRESS, "ZStore address 0x%08x%08x", 2) \ -+X(18, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_SSTORE_ADDRESS, "SStore address 0x%08x%08x", 2) \ -+X(19, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZLOAD_ADDRESS, "ZLoad address 0x%08x%08x", 2) \ -+X(20, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_SLOAD_ADDRESS, "SLoad address 0x%08x%08x", 2) \ -+X(21, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_NO_DEFERRED_ZSBUFFER_DEPRECATED, "No deferred ZS Buffer provided", 0) \ -+X(22, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_POPULATED, "ZS Buffer successfully populated (ID=0x%08x)", 1) \ -+X(23, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_POP_UNNEEDED_DEPRECATED, "No need to populate ZS Buffer (ID=0x%08x)", 1) \ -+X(24, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_UNPOPULATED, "ZS Buffer successfully unpopulated (ID=0x%08x)", 1) \ -+X(25, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_UNPOP_UNNEEDED_DEPRECATED, "No need to unpopulate ZS Buffer (ID=0x%08x)", 1) \ -+X(26, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_BACKING_REQUEST_DEPRECATED, "Send ZS-Buffer backing request to host (ID=0x%08x)", 1) \ -+X(27, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_UNBACKING_REQUEST_DEPRECATED, "Send ZS-Buffer unbacking request to host (ID=0x%08x)", 1) \ -+X(28, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_BACKING_REQUEST_PENDING_DEPRECATED, "Don't send ZS-Buffer backing request. Previous request still pending (ID=0x%08x)", 1) \ -+X(29, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_UNBACKING_REQUEST_PENDING_DEPRECATED, "Don't send ZS-Buffer unbacking request. Previous request still pending (ID=0x%08x)", 1) \ -+X(30, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZBUFFER_NOT_READY_DEPRECATED, "Partial Render waiting for ZBuffer to be backed (ID=0x%08x)", 1) \ -+X(31, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_SBUFFER_NOT_READY_DEPRECATED, "Partial Render waiting for SBuffer to be backed (ID=0x%08x)", 1) \ -+X(32, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_NONE, "SPM State = none", 0) \ -+X(33, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_PR_BLOCKED, "SPM State = PR blocked", 0) \ -+X(34, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_WAIT_FOR_GROW, "SPM State = wait for grow", 0) \ -+X(35, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_WAIT_FOR_HW, "SPM State = wait for HW", 0) \ -+X(36, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_PR_RUNNING, "SPM State = PR running", 0) \ -+X(37, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_PR_AVOIDED, "SPM State = PR avoided", 0) \ -+X(38, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_PR_EXECUTED, "SPM State = PR executed", 0) \ -+X(39, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_FREELIST_MATCH, "3DMemFree matches freelist 0x%08x (FL type = %u)", 2) \ -+X(40, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_3DMEMFREE_FLAG_SET, "Raise the 3DMemFreeDedected flag", 0) \ -+X(41, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_STATE_WAIT_FOR_PENDING_GROW, "Wait for pending grow on Freelist 0x%08x", 1) \ -+X(42, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ZSBUFFER_BACKING_REQUEST_FAILED, "ZS Buffer failed to be populated (ID=0x%08x)", 1) \ -+X(43, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_FL_GROW_DEBUG, "Grow update inconsistency: FL addr: 0x%02x%08x, curr pages: %u, ready: %u, new: %u", 5) \ -+X(44, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_RESUMED_TA_WITH_SP, "OOM: Resumed TA with ready pages, FL addr: 0x%02x%08x, current pages: %u, SP : %u", 4) \ -+X(45, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ACK_GROW_UPDATE_DEPRECATED, "Received grow update, FL addr: 0x%02x%08x, current pages: %u, ready pages: %u, threshold: %u", 5) \ -+X(46, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_NO_DEFERRED_PRBUFFER, "No deferred partial render FW (Type=%d) Buffer provided", 1) \ -+X(47, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_BUFFER_POP_UNNEEDED, "No need to populate PR Buffer (ID=0x%08x)", 1) \ -+X(48, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_BUFFER_UNPOP_UNNEEDED, "No need to unpopulate PR Buffer (ID=0x%08x)", 1) \ -+X(49, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_BUFFER_BACKING_REQUEST, "Send PR Buffer backing request to host (ID=0x%08x)", 1) \ -+X(50, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_BUFFER_UNBACKING_REQUEST, "Send PR Buffer unbacking request to host (ID=0x%08x)", 1) \ -+X(51, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_BUFFER_BACKING_REQUEST_PENDING, "Don't send PR Buffer backing request. Previous request still pending (ID=0x%08x)", 1) \ -+X(52, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_BUFFER_UNBACKING_REQUEST_PENDING, "Don't send PR Buffer unbacking request. Previous request still pending (ID=0x%08x)", 1) \ -+X(53, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_BUFFER_NOT_READY, "Partial Render waiting for Buffer %d type to be backed (ID=0x%08x)", 2) \ -+X(54, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_ACK_GROW_UPDATE, "Received grow update, FL addr: 0x%02x%08x, new pages: %u, ready pages: %u", 4) \ -+X(66, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_OOM_TACMD, "OOM TA/3D PR Check: [0x%08.8x] is 0x%08.8x requires 0x%08.8x", 3) \ -+X(67, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_RESUMED_TA, "OOM: Resumed TA with ready pages, FL addr: 0x%02x%08x, current pages: %u", 3) \ -+X(68, ROGUE_FW_GROUP_SPM, ROGUE_FW_SF_SPM_PR_DEADLOCK_UNBLOCKED, "OOM TA/3D PR deadlock unblocked reordering DM%d runlist head from Context 0x%08x to 0x%08x", 3) \ -+\ -+X(1, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CHECK_DEPRECATED, "Check Pow state DM%d int: 0x%x, ext: 0x%x, pow flags: 0x%x", 4) \ -+X(2, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_GPU_IDLE, "GPU idle (might be powered down). Pow state int: 0x%x, ext: 0x%x, flags: 0x%x", 3) \ -+X(3, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_OSREQ_DEPRECATED, "OS requested pow off (forced = %d), DM%d, pow flags: 0x%x", 3) \ -+X(4, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_INIOFF_DEPRECATED, "Initiate powoff query. Inactive DMs: %d %d %d %d", 4) \ -+X(5, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CHECKOFF_DEPRECATED, "Any RD-DM pending? %d, Any RD-DM Active? %d", 2) \ -+X(6, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_GPU_OFF, "GPU ready to be powered down. Pow state int: 0x%x, ext: 0x%x, flags: 0x%x", 3) \ -+X(7, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_HWREQ, "HW Request On(1)/Off(0): %d, Units: 0x%08.8x", 2) \ -+X(8, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_DUSTS_CHANGE_REQ, "Request to change num of dusts to %d (Power flags=%d)", 2) \ -+X(9, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_DUSTS_CHANGE, "Changing number of dusts from %d to %d", 2) \ -+X(11, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_SIDEKICK_INIT_DEPRECATED, "Sidekick init", 0) \ -+X(12, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_RD_INIT_DEPRECATED, "Rascal+Dusts init (# dusts mask: 0x%x)", 1) \ -+X(13, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_INIOFF_RD, "Initiate powoff query for RD-DMs.", 0) \ -+X(14, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_INIOFF_TLA, "Initiate powoff query for TLA-DM.", 0) \ -+X(15, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_REQUESTEDOFF_RD, "Any RD-DM pending? %d, Any RD-DM Active? %d", 2) \ -+X(16, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_REQUESTEDOFF_TLA, "TLA-DM pending? %d, TLA-DM Active? %d", 2) \ -+X(17, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_BRN37270_DEPRECATED, "Request power up due to BRN37270. Pow stat int: 0x%x", 1) \ -+X(18, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_REQ_CANCEL, "Cancel power off request int: 0x%x, ext: 0x%x, pow flags: 0x%x", 3) \ -+X(19, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_FORCED_IDLE, "OS requested forced IDLE, pow flags: 0x%x", 1) \ -+X(20, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CANCEL_FORCED_IDLE, "OS cancelled forced IDLE, pow flags: 0x%x", 1) \ -+X(21, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_IDLE_TIMER, "Idle timer start. Pow state int: 0x%x, ext: 0x%x, flags: 0x%x", 3) \ -+X(22, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CANCEL_IDLE_TIMER, "Cancel idle timer. Pow state int: 0x%x, ext: 0x%x, flags: 0x%x", 3) \ -+X(23, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_APM_LATENCY_CHANGE, "Active PM latency set to %dms. Core clock: %d Hz", 2) \ -+X(24, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CDM_CLUSTERS, "Compute cluster mask change to 0x%x, %d dusts powered.", 2) \ -+X(25, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_NULL_CMD_INIOFF_RD, "Null command executed, repeating initiate powoff query for RD-DMs.", 0) \ -+X(26, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_POWMON_ENERGY, "Power monitor: Estimate of dynamic energy %u", 1) \ -+X(27, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CHECK_DEPRECATED2, "Check Pow state: Int: 0x%x, Ext: 0x%x, Pow flags: 0x%x", 3) \ -+X(28, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_NEW_DEADLINE, "Proactive DVFS: New deadline, time = 0x%08x%08x", 2) \ -+X(29, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_NEW_WORKLOAD, "Proactive DVFS: New workload, cycles = 0x%08x%08x", 2) \ -+X(30, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_CALCULATE, "Proactive DVFS: Proactive frequency calculated = %u", 1) \ -+X(31, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_UTILISATION, "Proactive DVFS: Reactive utilisation = %u percent", 1) \ -+X(32, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_REACT, "Proactive DVFS: Reactive frequency calculated = %u.%u", 2) \ -+X(33, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_GPIO_SEND_DEPRECATED, "Proactive DVFS: OPP Point Sent = 0x%x", 1) \ -+X(34, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_DEADLINE_REMOVED, "Proactive DVFS: Deadline removed = 0x%08x%08x", 2) \ -+X(35, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_WORKLOAD_REMOVED, "Proactive DVFS: Workload removed = 0x%08x%08x", 2) \ -+X(36, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_THROTTLE, "Proactive DVFS: Throttle to a maximum = 0x%x", 1) \ -+X(37, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_GPIO_FAILURE, "Proactive DVFS: Failed to pass OPP point via GPIO.", 0) \ -+X(38, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_INVALID_NODE_DEPRECATED, "Proactive DVFS: Invalid node passed to function.", 0) \ -+X(39, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_GUEST_BAD_ACCESS_DEPRECATED, "Proactive DVFS: Guest OS attempted to do a privileged action. OSid = %u", 1) \ -+X(40, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_UNPROFILED_STARTED, "Proactive DVFS: Unprofiled work started. Total unprofiled work present: %u", 1) \ -+X(41, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_UNPROFILED_FINISHED, "Proactive DVFS: Unprofiled work finished. Total unprofiled work present: %u", 1) \ -+X(42, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_DISABLED, "Proactive DVFS: Disabled: Not enabled by host.", 0) \ -+X(43, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_HWREQ_RESULT, "HW Request Completed(1)/Aborted(0): %d, Ticks: %d", 2) \ -+X(44, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_DUSTS_CHANGE_FIX_59042_DEPRECATED, "Allowed number of dusts is %d due to BRN59042.", 1) \ -+X(45, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_HOST_TIMEOUT_NOTIFICATION, "Host timed out while waiting for a forced idle state. Pow state int: 0x%x, ext: 0x%x, flags: 0x%x", 3) \ -+X(46, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CHECK, "Check Pow state: Int: 0x%x, Ext: 0x%x, Pow flags: 0x%x, Fence Counters: Check: %u - Update: %u", 5) \ -+X(47, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_GPIO_SEND, "Proactive DVFS: OPP Point Sent = 0x%x, Success = 0x%x", 2) \ -+X(48, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_TO_IDLE, "Proactive DVFS: GPU transitioned to idle", 0) \ -+X(49, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_TO_ACTIVE, "Proactive DVFS: GPU transitioned to active", 0) \ -+X(50, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_POWDUMP_BUFFER_SIZE, "Power counter dumping: Data truncated writing register %u. Buffer too small.", 1) \ -+X(51, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_POWCTRL_ABORT, "Power controller returned ABORT for last request so retrying.", 0) \ -+X(52, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_INVALID_POWER_REQUEST_DEPRECATED, "Discarding invalid power request: type 0x%x, DM %u", 2) \ -+X(53, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CANCEL_FORCED_IDLE_NOT_IDLE, "Detected attempt to cancel forced idle while not forced idle (pow state 0x%x, pow flags 0x%x)", 2) \ -+X(54, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_FORCED_POW_OFF_NOT_IDLE, "Detected attempt to force power off while not forced idle (pow state 0x%x, pow flags 0x%x)", 2) \ -+X(55, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_NUMDUST_CHANGE_NOT_IDLE, "Detected attempt to change dust count while not forced idle (pow state 0x%x)", 1) \ -+X(56, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_POWMON_RESULT, "Power monitor: Type = %d (0 = power, 1 = energy), Estimate result = 0x%08x%08x", 3) \ -+X(57, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_MINMAX_CONFLICT, "Conflicting clock frequency range: OPP min = %u, max = %u", 2) \ -+X(58, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_PDVFS_FLOOR, "Proactive DVFS: Set floor to a minimum = 0x%x", 1) \ -+X(59, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_OSREQ, "OS requested pow off (forced = %d), pow flags: 0x%x", 2) \ -+X(60, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_INVALID_POWER_REQUEST, "Discarding invalid power request: type 0x%x", 1) \ -+X(61, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_SPU_POW_STATE_CHANGE_REQ, "Request to change SPU power state mask from 0x%x to 0x%x. Pow flags: 0x%x", 3) \ -+X(62, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_SPU_POW_STATE_CHANGE, "Changing SPU power state mask from 0x%x to 0x%x", 2) \ -+X(63, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_SPU_POW_CHANGE_NOT_IDLE, "Detected attempt to change SPU power state mask while not forced idle (pow state 0x%x)", 1) \ -+X(64, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_INVALID_SPU_POWER_MASK, "Invalid SPU power mask 0x%x! Changing to 1", 1) \ -+X(65, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_CLKDIV_UPDATE, "Proactive DVFS: Send OPP %u with clock divider value %u", 2) \ -+X(66, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_POWMON_PERF_MODE, "PPA block started in perf validation mode.", 0) \ -+X(67, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_POWMON_RESET, "Reset PPA block state %u (1=reset, 0=recalculate).", 1) \ -+X(68, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_POWCTRL_ABORT_WITH_CORE, "Power controller returned ABORT for Core-%d last request so retrying.", 1) \ -+X(69, ROGUE_FW_GROUP_POW, ROGUE_FW_SF_POW_HWREQ64BIT, "HW Request On(1)/Off(0): %d, Units: 0x%08x%08x", 3) \ -+\ -+X(1, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_LOCKUP_DEPRECATED, "Lockup detected on DM%d, FWCtx: 0x%08.8x", 2) \ -+X(2, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RESET_FW_DEPRECATED, "Reset fw state for DM%d, FWCtx: 0x%08.8x, MemCtx: 0x%08.8x", 3) \ -+X(3, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RESET_HW_DEPRECATED, "Reset HW", 0) \ -+X(4, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_TERMINATED_DEPRECATED, "Lockup recovered.", 0) \ -+X(5, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_SET_LOCKUP_DEPRECATED, "Lock-up DM%d FWCtx: 0x%08.8x", 2) \ -+X(6, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_LOCKUP_DETECTED_DEPRECATED, "Lockup detected: GLB(%d->%d), PER-DM(0x%08x->0x%08x)", 4) \ -+X(7, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_EARLY_FAULT_DETECTION_DEPRECATED, "Early fault detection: GLB(%d->%d), PER-DM(0x%08x)", 3) \ -+X(8, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HOLD_SCHEDULING_DUE_TO_LOCKUP_DEPRECATED, "Hold scheduling due lockup: GLB(%d), PER-DM(0x%08x->0x%08x)", 3) \ -+X(9, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FALSE_LOCKUP_DEPRECATED, "False lockup detected: GLB(%d->%d), PER-DM(0x%08x->0x%08x)", 4) \ -+X(10, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_BRN37729_DEPRECATED, "BRN37729: GLB(%d->%d), PER-DM(0x%08x->0x%08x)", 4) \ -+X(11, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FREELISTS_RECONSTRUCTED_DEPRECATED, "Freelists reconstructed: GLB(%d->%d), PER-DM(0x%08x)", 3) \ -+X(12, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RECONSTRUCTING_FREELISTS_DEPRECATED, "Reconstructing freelists: %u (0-No, 1-Yes): GLB(%d->%d), PER-DM(0x%08x)", 4) \ -+X(13, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FAILED_HW_POLL, "HW poll %u (0-Unset 1-Set) failed (reg:0x%08x val:0x%08x)", 3) \ -+X(14, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DM_DISCARDED_DEPRECATED, "Discarded cmd on DM%u FWCtx=0x%08x", 2) \ -+X(15, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DM_DISCARDED, "Discarded cmd on DM%u (reason=%u) HWRTData=0x%08x (st: %d), FWCtx 0x%08x @ %d", 6) \ -+X(16, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_PM_FENCE_DEPRECATED, "PM fence WA could not be applied, Valid TA Setup: %d, RD powered off: %d", 2) \ -+X(17, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_SNAPSHOT, "FL snapshot RTD 0x%08.8x - local (0x%08.8x): %d, global (0x%08.8x): %d", 5) \ -+X(18, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_CHECK, "FL check RTD 0x%08.8x, discard: %d - local (0x%08.8x): s%d?=c%d, global (0x%08.8x): s%d?=c%d", 8) \ -+X(19, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_DEPRECATED, "FL reconstruction 0x%08.8x c%d", 2) \ -+X(20, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_3D_CHECK, "3D check: missing TA FWCtx 0x%08.8x @ %d, RTD 0x%08x.", 3) \ -+X(21, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RESET_HW_DEPRECATED2, "Reset HW (mmu:%d, extmem: %d)", 2) \ -+X(22, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_ZERO_TA_CACHES, "Zero TA caches for FWCtx: 0x%08.8x (TPC addr: 0x%08x%08x, size: %d bytes)", 4) \ -+X(23, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FREELISTS_RECONSTRUCTED_DEPRECATED2, "Recovery DM%u: Freelists reconstructed. New R-Flags=0x%08x", 2) \ -+X(24, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_SKIPPED_CMD, "Recovery DM%u: FWCtx 0x%08x skipped to command @ %u. PR=%u. New R-Flags=0x%08x", 5) \ -+X(25, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DM_RECOVERED, "Recovery DM%u: DM fully recovered", 1) \ -+X(26, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HOLD_SCHEDULING_DUE_TO_LOCKUP, "DM%u: Hold scheduling due to R-Flag = 0x%08x", 2) \ -+X(27, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_NEEDS_RECONSTRUCTION, "Analysis: Need freelist reconstruction", 0) \ -+X(28, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_NEEDS_SKIP, "Analysis DM%u: Lockup FWCtx: 0x%08.8x. Need to skip to next command", 2) \ -+X(29, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_NEEDS_SKIP_OOM_TA, "Analysis DM%u: Lockup while TA is OOM FWCtx: 0x%08.8x. Need to skip to next command", 2) \ -+X(30, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_NEEDS_PR_CLEANUP, "Analysis DM%u: Lockup while partial render FWCtx: 0x%08.8x. Need PR cleanup", 2) \ -+X(31, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_SET_LOCKUP_DEPRECATED2, "GPU has locked up", 0) \ -+X(32, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_READY, "DM%u ready for HWR", 1) \ -+X(33, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DM_UPDATE_RECOVERY, "Recovery DM%u: Updated Recovery counter. New R-Flags=0x%08x", 2) \ -+X(34, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_BRN37729_DEPRECATED2, "Analysis: BRN37729 detected, reset TA and re-kicked 0x%08x)", 1) \ -+X(35, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DM_TIMED_OUT, "DM%u timed out", 1) \ -+X(36, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_EVENT_STATUS_REG, "RGX_CR_EVENT_STATUS=0x%08x", 1) \ -+X(37, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DM_FALSE_LOCKUP, "DM%u lockup falsely detected, R-Flags=0x%08x", 2) \ -+X(38, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_SET_OUTOFTIME, "GPU has overrun its deadline", 0) \ -+X(39, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_SET_POLLFAILURE, "GPU has failed a poll", 0) \ -+X(40, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_PERF_PHASE_REG, "RGX DM%u phase count=0x%08x", 2) \ -+X(41, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RESET_HW_DEPRECATED3, "Reset HW (loop:%d, poll failures: 0x%08x)", 2) \ -+X(42, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_MMU_FAULT_EVENT, "MMU fault event: 0x%08x", 1) \ -+X(43, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_BIF1_FAULT, "BIF1 page fault detected (Bank1 MMU Status: 0x%08x)", 1) \ -+X(44, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_CRC_CHECK_TRUE_DEPRECATED, "Fast CRC Failed. Proceeding to full register checking (DM: %u).", 1) \ -+X(45, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_MMU_META_FAULT, "Meta MMU page fault detected (Meta MMU Status: 0x%08x%08x)", 2) \ -+X(46, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_CRC_CHECK_DEPRECATED, "Fast CRC Check result for DM%u is HWRNeeded=%u", 2) \ -+X(47, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FULL_CHECK_DEPRECATED, "Full Signature Check result for DM%u is HWRNeeded=%u", 2) \ -+X(48, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FINAL_RESULT, "Final result for DM%u is HWRNeeded=%u with HWRChecksToGo=%u", 3) \ -+X(49, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_USC_SLOTS_CHECK_DEPRECATED, "USC Slots result for DM%u is HWRNeeded=%u USCSlotsUsedByDM=%d", 3) \ -+X(50, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DEADLINE_CHECK_DEPRECATED, "Deadline counter for DM%u is HWRDeadline=%u", 2) \ -+X(51, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HOLD_SCHEDULING_DUE_TO_FREELIST_DEPRECATED, "Holding Scheduling on OSid %u due to pending freelist reconstruction", 1) \ -+X(52, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_REQUEST, "Requesting reconstruction for freelist 0x%x (ID=%d)", 2) \ -+X(53, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_PASSED, "Reconstruction of freelist ID=%d complete", 1) \ -+X(54, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_NEEDED_DEPRECATED, "Reconstruction needed for freelist 0x%x (ID=%d) type: %d (0:local,1:global,2:mmu) on HW context %u", 4) \ -+X(55, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_FAILED, "Reconstruction of freelist ID=%d failed", 1) \ -+X(56, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RESTRICTING_PDS_TASKS, "Restricting PDS Tasks to help other stalling DMs (RunningMask=0x%02x, StallingMask=0x%02x, PDS_CTRL=0x%08x%08x)", 4) \ -+X(57, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_UNRESTRICTING_PDS_TASKS, "Unrestricting PDS Tasks again (RunningMask=0x%02x, StallingMask=0x%02x, PDS_CTRL=0x%08x%08x)", 4) \ -+X(58, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_USC_SLOTS_USED, "USC slots: %u used by DM%u", 2) \ -+X(59, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_USC_SLOTS_EMPTY, "USC slots: %u empty", 1) \ -+X(60, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HCS_FIRE, "HCS DM%d's Context Switch failed to meet deadline. Current time: 0x%08x%08x, deadline: 0x%08x%08x", 5) \ -+X(61, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_START_HW_RESET, "Begin hardware reset (HWR Counter=%d)", 1) \ -+X(62, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FINISH_HW_RESET, "Finished hardware reset (HWR Counter=%d)", 1) \ -+X(63, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HOLD_SCHEDULING_DUE_TO_FREELIST, "Holding Scheduling on DM %u for OSid %u due to pending freelist reconstruction", 2) \ -+X(64, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RESET_UMQ_READ_OFFSET, "User Mode Queue ROff reset: FWCtx 0x%08.8x, queue: 0x%08x%08x (Roff = %u becomes StreamStartOffset = %u)", 5) \ -+X(65, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_NEEDED_DEPRECATED2, "Reconstruction needed for freelist 0x%x (ID=%d) type: %d (0:local,1:global) on HW context %u", 4) \ -+X(66, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_MIPS_FAULT, "Mips page fault detected (BadVAddr: 0x%08x, EntryLo0: 0x%08x, EntryLo1: 0x%08x)", 3) \ -+X(67, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_ANOTHER_CHANCE, "At least one other DM is running okay so DM%u will get another chance", 1) \ -+X(68, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_FW, "Reconstructing in FW, FL: 0x%x (ID=%d)", 2) \ -+X(69, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_ZERO_RTC, "Zero RTC for FWCtx: 0x%08.8x (RTC addr: 0x%08x%08x, size: %d bytes)", 4) \ -+X(70, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_NEEDED_DEPRECATED3, "Reconstruction needed for freelist 0x%x (ID=%d) type: %d (0:local,1:global) phase: %d (0:TA, 1:3D) on HW context %u", 5) \ -+X(71, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_START_LONG_HW_POLL, "Start long HW poll %u (0-Unset 1-Set) for (reg:0x%08x val:0x%08x)", 3) \ -+X(72, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_END_LONG_HW_POLL, "End long HW poll (result=%d)", 1) \ -+X(73, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_DEADLINE_CHECK, "DM%u has taken %d ticks and deadline is %d ticks", 3) \ -+X(74, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_WATCHDOG_CHECK_DEPRECATED, "USC Watchdog result for DM%u is HWRNeeded=%u Status=%u USCs={0x%x} with HWRChecksToGo=%u", 5) \ -+X(75, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FL_RECON_NEEDED, "Reconstruction needed for freelist 0x%x (ID=%d) OSid: %d type: %d (0:local,1:global) phase: %d (0:TA, 1:3D) on HW context %u", 6) \ -+X(76, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_SET_LOCKUP, "GPU-%u has locked up", 1) \ -+X(77, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_SET_LOCKUP_DM, "DM%u has locked up", 1) \ -+X(78, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_CORE_EVENT_STATUS_REG, "Core %d RGX_CR_EVENT_STATUS=0x%08x", 2) \ -+X(79, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_MULTICORE_EVENT_STATUS_REG, "RGX_CR_MULTICORE_EVENT_STATUS%u=0x%08x", 2) \ -+X(80, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_CORE_BIF0_FAULT, "BIF0 page fault detected (Core %d MMU Status: 0x%08x%08x Req Status: 0x%08x%08x)", 5) \ -+X(81, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_CORE_MMU_FAULT_S7, "MMU page fault detected (Core %d MMU Status: 0x%08x%08x)", 3) \ -+X(82, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_CORE_MMU_FAULT, "MMU page fault detected (Core %d MMU Status: 0x%08x%08x 0x%08x)", 4) \ -+X(83, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_RESET_HW, "Reset HW (core:%d of %d, loop:%d, poll failures: 0x%08x)", 4) \ -+X(84, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_CRC_CHECK, "Fast CRC Check result for Core%u, DM%u is HWRNeeded=%u", 3) \ -+X(85, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_FULL_CHECK, "Full Signature Check result for Core%u, DM%u is HWRNeeded=%u", 3) \ -+X(86, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_USC_SLOTS_CHECK, "USC Slots result for Core%u, DM%u is HWRNeeded=%u USCSlotsUsedByDM=%d", 4) \ -+X(87, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_WATCHDOG_CHECK, "USC Watchdog result for Core%u DM%u is HWRNeeded=%u Status=%u USCs={0x%x} with HWRChecksToGo=%u", 6) \ -+X(88, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_MMU_RISCV_FAULT, "RISC-V MMU page fault detected (FWCORE MMU Status 0x%08x Req Status 0x%08x%08x)", 3) \ -+X(89, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HWR_FAULT_POLL_BIF_TEXAS1_PFS_DEPRECATED, "After FW fault was raised, TEXAS1_PFS poll failed on core %d with value 0x%08x", 2) \ -+X(90, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HWR_FAULT_POLL_BIF_PFS, "After FW fault was raised, BIF_PFS poll failed on core %d with value 0x%08x", 2) \ -+X(91, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HWR_FAULT_POLL_SET_ABORT_PM_STATUS, "After FW fault was raised, MMU_ABORT_PM_STATUS set poll failed on core %d with value 0x%08x", 2) \ -+X(92, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HWR_FAULT_POLL_UNSET_ABORT_PM_STATUS, "After FW fault was raised, MMU_ABORT_PM_STATUS unset poll failed on core %d with value 0x%08x", 2) \ -+X(93, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HWR_FAULT_POLL_SLC_INVAL, "After FW fault was raised, MMU_CTRL_INVAL poll (all but fw) failed on core %d with value 0x%08x", 2) \ -+X(94, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HWR_FAULT_POLL_SLCMMU_INVAL, "After FW fault was raised, MMU_CTRL_INVAL poll (all) failed on core %d with value 0x%08x", 2) \ -+X(95, ROGUE_FW_GROUP_HWR, ROGUE_FW_SF_HWR_HWR_FAULT_POLL_BIF_TEXAS_PFS, "After FW fault was raised, TEXAS%d_PFS poll failed on core %d with value 0x%08x", 3) \ -+\ -+X(1, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CFGBLK, "Block 0x%x mapped to Config Idx %u", 2) \ -+X(2, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_OMTBLK, "Block 0x%x omitted from event - not enabled in HW", 1) \ -+X(3, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_INCBLK, "Block 0x%x included in event - enabled in HW", 1) \ -+X(4, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_SELREG, "Select register state hi_0x%x lo_0x%x", 2) \ -+X(5, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CSBHDR, "Counter stream block header word 0x%x", 1) \ -+X(6, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CTROFF, "Counter register offset 0x%x", 1) \ -+X(7, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CFGSKP, "Block 0x%x config unset, skipping", 1) \ -+X(8, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_INDBLK, "Accessing Indirect block 0x%x", 1) \ -+X(9, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_DIRBLK, "Accessing Direct block 0x%x", 1) \ -+X(10, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CNTPRG, "Programmed counter select register at offset 0x%x", 1) \ -+X(11, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_BLKPRG, "Block register offset 0x%x and value 0x%x", 2) \ -+X(12, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_UBLKCG, "Reading config block from driver 0x%x", 1) \ -+X(13, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_UBLKRG, "Reading block range 0x%x to 0x%x", 2) \ -+X(14, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_BLKREC, "Recording block 0x%x config from driver", 1) \ -+X(15, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_UBLKED, "Finished reading config block from driver", 0) \ -+X(16, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CUSTOM_COUNTER, "Custom Counter offset: 0x%x value: 0x%x", 2) \ -+X(17, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_SELECT_CNTR, "Select counter n:%u ID:0x%x", 2) \ -+X(18, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_DROP_SELECT_PACK, "The counter ID 0x%x is not allowed. The package [b:%u, n:%u] will be discarded", 3) \ -+X(19, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CHANGE_FILTER_STATUS_CUSTOM, "Custom Counters filter status %d", 1) \ -+X(20, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_DROP_WRONG_BLOCK, "The Custom block %d is not allowed. Use only blocks lower than %d. The package will be discarded", 2) \ -+X(21, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_DROP_TOO_MANY_ID, "The package will be discarded because it contains %d counters IDs while the upper limit is %d", 2) \ -+X(22, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CHECK_FILTER, "Check Filter 0x%x is 0x%x ?", 2) \ -+X(23, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_RESET_CUSTOM_BLOCK, "The custom block %u is reset", 1) \ -+X(24, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_INVALID_CMD_DEPRECATED, "Encountered an invalid command (%d)", 1) \ -+X(25, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_WAITING_FOR_QUEUE_DEPRECATED, "HWPerf Queue is full, we will have to wait for space! (Roff = %u, Woff = %u)", 2) \ -+X(26, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_WAITING_FOR_QUEUE_FENCE_DEPRECATED, "HWPerf Queue is fencing, we are waiting for Roff = %d (Roff = %u, Woff = %u)", 3) \ -+X(27, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CUSTOM_BLOCK, "Custom Counter block: %d", 1) \ -+X(28, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_BLKENA, "Block 0x%x ENABLED", 1) \ -+X(29, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_BLKDIS, "Block 0x%x DISABLED", 1) \ -+X(30, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_INDBLK_INSTANCE, "Accessing Indirect block 0x%x, instance %u", 2) \ -+X(31, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CTRVAL, "Counter register 0x%x, Value 0x%x", 2) \ -+X(32, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CHANGE_FILTER_STATUS, "Counters filter status %d", 1) \ -+X(33, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CTLBLK, "Block 0x%x mapped to Ctl Idx %u", 2) \ -+X(34, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_WORKEST_EN, "Block(s) in use for workload estimation.", 0) \ -+X(35, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CYCCTR, "GPU %u Cycle counter 0x%x, Value 0x%x", 3) \ -+X(36, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_CYCMAX, "GPU Mask 0x%x Cycle counter 0x%x, Value 0x%x", 3) \ -+X(37, ROGUE_FW_GROUP_HWP, ROGUE_FW_SF_HWP_I_IGNORE_BLOCKS, "Blocks IGNORED for GPU %u", 1) \ -+\ -+X(1, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_TRANSFER_REQUEST_DEPRECATED, "Transfer 0x%02x request: 0x%02x%08x -> 0x%08x, size %u", 5) \ -+X(2, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_TRANSFER_COMPLETE, "Transfer of type 0x%02x expected on channel %u, 0x%02x found, status %u", 4) \ -+X(3, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_INT_REG, "DMA Interrupt register 0x%08x", 1) \ -+X(4, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_WAIT, "Waiting for transfer of type 0x%02x completion...", 1) \ -+X(5, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_CCB_LOADING_FAILED, "Loading of cCCB data from FW common context 0x%08x (offset: %u, size: %u) failed", 3) \ -+X(6, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_CCB_LOAD_INVALID, "Invalid load of cCCB data from FW common context 0x%08x (offset: %u, size: %u)", 3) \ -+X(7, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_POLL_FAILED, "Transfer 0x%02x request poll failure", 1) \ -+X(8, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_BOOT_TRANSFER_FAILED, "Boot transfer(s) failed (code? %u, data? %u), used slower memcpy instead", 2) \ -+X(9, ROGUE_FW_GROUP_DMA, ROGUE_FW_SF_DMA_TRANSFER_REQUEST, "Transfer 0x%02x request on ch. %u: system 0x%02x%08x, coremem 0x%08x, flags 0x%x, size %u", 7) \ -+\ -+X(1, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_INTPAIR, "0x%08x 0x%08x", 2) \ -+X(2, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_1HEX, "0x%08x", 1) \ -+X(3, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_2HEX, "0x%08x 0x%08x", 2) \ -+X(4, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_3HEX, "0x%08x 0x%08x 0x%08x", 3) \ -+X(5, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_4HEX, "0x%08x 0x%08x 0x%08x 0x%08x", 4) \ -+X(6, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_5HEX, "0x%08x 0x%08x 0x%08x 0x%08x 0x%08x", 5) \ -+X(7, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_6HEX, "0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x", 6) \ -+X(8, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_7HEX, "0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x", 7) \ -+X(9, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_8HEX, "0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x", 8) \ -+X(10, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_1SIGNED, "%d", 1) \ -+X(11, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_2SIGNED, "%d %d", 2) \ -+X(12, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_3SIGNED, "%d %d %d", 3) \ -+X(13, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_4SIGNED, "%d %d %d %d", 4) \ -+X(14, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_5SIGNED, "%d %d %d %d %d", 5) \ -+X(15, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_6SIGNED, "%d %d %d %d %d %d", 6) \ -+X(16, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_7SIGNED, "%d %d %d %d %d %d %d", 7) \ -+X(17, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_8SIGNED, "%d %d %d %d %d %d %d %d", 8) \ -+X(18, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_1UNSIGNED, "%u", 1) \ -+X(19, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_2UNSIGNED, "%u %u", 2) \ -+X(20, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_3UNSIGNED, "%u %u %u", 3) \ -+X(21, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_4UNSIGNED, "%u %u %u %u", 4) \ -+X(22, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_5UNSIGNED, "%u %u %u %u %u", 5) \ -+X(23, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_6UNSIGNED, "%u %u %u %u %u %u", 6) \ -+X(24, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_7UNSIGNED, "%u %u %u %u %u %u %u", 7) \ -+X(25, ROGUE_FW_GROUP_DBG, ROGUE_FW_SF_DBG_8UNSIGNED, "%u %u %u %u %u %u %u %u", 8) \ -+\ -+X(65535, ROGUE_FW_GROUP_NULL, ROGUE_FW_SF_LAST, "You should not use this string", 15) -+ -+ -+/* -+ * The symbolic names found in the table above are assigned an u32 value of -+ * the following format: -+ * 31 30 28 27 20 19 16 15 12 11 0 bits -+ * - --- ---- ---- ---- ---- ---- ---- ---- -+ * 0-11: id number -+ * 12-15: group id number -+ * 16-19: number of parameters -+ * 20-27: unused -+ * 28-30: active: identify SF packet, otherwise regular int32 -+ * 31: reserved for signed/unsigned compatibility -+ * -+ * The following macro assigns those values to the enum generated SF ids list. -+ */ -+#define ROGUE_FW_LOG_IDMARKER (0x70000000U) -+#define ROGUE_FW_LOG_CREATESFID(a, b, e) ((u32)(a) | ((u32)(b)<<12U) | ((u32)(e)<<16U)) | ROGUE_FW_LOG_IDMARKER -+ -+#define ROGUE_FW_LOG_IDMASK (0xFFF00000) -+#define ROGUE_FW_LOG_VALIDID(I) (((I) & ROGUE_FW_LOG_IDMASK) == ROGUE_FW_LOG_IDMARKER) -+ -+enum rogue_fw_log_sfids { -+#define X(a, b, c, d, e) c = ROGUE_FW_LOG_CREATESFID(a, b, e), -+ ROGUE_FW_LOG_SFIDLIST -+#undef X -+}; -+ -+/* Return the group id that the given (enum generated) id belongs to */ -+#define ROGUE_FW_SF_GID(x) (((u32)(x)>>12) & 0xfU) -+/* Returns how many arguments the SF(string format) for the given (enum generated) id requires */ -+#define ROGUE_FW_SF_PARAMNUM(x) (((u32)(x)>>16) & 0xfU) -+ -+#endif /* __PVR_ROGUE_FWIF_SF_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h b/drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h -new file mode 100644 -index 000000000000..d71bf348ecd0 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h -@@ -0,0 +1,235 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_FWIF_SHARED_H__ -+#define __PVR_ROGUE_FWIF_SHARED_H__ -+ -+#include <linux/compiler.h> -+#include <linux/types.h> -+ -+#define ROGUE_FWIF_NUM_RTDATAS 2U -+#define ROGUE_FWIF_NUM_GEOMDATAS 1U -+#define ROGUE_FWIF_NUM_RTDATA_FREELISTS 2U -+ -+/* -+ * Maximum number of UFOs in a CCB command. -+ * The number is based on having 32 sync prims (as originally), plus 32 sync -+ * checkpoints. -+ * Once the use of sync prims is no longer supported, we will retain -+ * the same total (64) as the number of sync checkpoints which may be -+ * supporting a fence is not visible to the client driver and has to -+ * allow for the number of different timelines involved in fence merges. -+ */ -+#define ROGUE_FWIF_CCB_CMD_MAX_UFOS (32U + 32U) -+ -+/* -+ * This is a generic limit imposed on any DM (GEOMETRY,FRAGMENT,CDM,TDM,2D,TRANSFER) -+ * command passed through the bridge. -+ * Just across the bridge in the server, any incoming kick command size is -+ * checked against this maximum limit. -+ * In case the incoming command size is larger than the specified limit, -+ * the bridge call is retired with error. -+ */ -+#define ROGUE_FWIF_DM_INDEPENDENT_KICK_CMD_SIZE (1024U) -+ -+#define ROGUE_FWIF_PRBUFFER_START (0) -+#define ROGUE_FWIF_PRBUFFER_ZSBUFFER (0) -+#define ROGUE_FWIF_PRBUFFER_MSAABUFFER (1) -+#define ROGUE_FWIF_PRBUFFER_MAXSUPPORTED (2) -+ -+struct rogue_fwif_dma_addr { -+ aligned_u64 dev_addr; -+ u32 fw_addr; -+} __aligned(8); -+ -+struct rogue_fwif_ufo { -+ u32 addr; -+ u32 value; -+}; -+ -+#define ROGUE_FWIF_UFO_ADDR_IS_SYNC_CHECKPOINT (1) -+ -+struct rogue_fwif_sync_checkpoint { -+ u32 state; -+ u32 fw_ref_count; -+}; -+ -+struct rogue_fwif_cleanup_ctl { -+ /* Number of commands received by the FW */ -+ u32 submitted_commands; -+ /* Number of commands executed by the FW */ -+ u32 executed_commands; -+} __aligned(8); -+ -+/* -+ * Used to share frame numbers across UM-KM-FW, -+ * frame number is set in UM, -+ * frame number is required in both KM for HTB and FW for FW trace. -+ * -+ * May be used to house Kick flags in the future. -+ */ -+struct rogue_fwif_cmd_common { -+ /* associated frame number */ -+ u32 frame_num; -+}; -+ -+/* -+ * Geometry and fragment commands require set of firmware addresses that are stored in the Kernel. -+ * Client has handle(s) to Kernel containers storing these addresses, instead of raw addresses. We -+ * have to patch/write these addresses in KM to prevent UM from controlling FW addresses directly. -+ * Typedefs for geometry and fragment commands are shared between Client and Firmware (both -+ * single-BVNC). Kernel is implemented in a multi-BVNC manner, so it can't use geometry|fragment -+ * CMD type definitions directly. Therefore we have a SHARED block that is shared between UM-KM-FW -+ * across all BVNC configurations. -+ */ -+struct rogue_fwif_cmd_geom_frag_shared { -+ /* Common command attributes */ -+ struct rogue_fwif_cmd_common cmn; -+ /* -+ * RTData associated with this command, this is used for context -+ * selection and for storing out HW-context, when TA is switched out for -+ * continuing later -+ */ -+ u32 hwrt_data_fw_addr; -+ -+ /* Supported PR Buffers like Z/S/MSAA Scratch */ -+ u32 pr_buffer_fw_addr[ROGUE_FWIF_PRBUFFER_MAXSUPPORTED]; -+}; -+ -+/* -+ * Client Circular Command Buffer (CCCB) control structure. -+ * This is shared between the Server and the Firmware and holds byte offsets -+ * into the CCCB as well as the wrapping mask to aid wrap around. A given -+ * snapshot of this queue with Cmd 1 running on the GPU might be: -+ * -+ * Roff Doff Woff -+ * [..........|-1----------|=2===|=3===|=4===|~5~~~~|~6~~~~|~7~~~~|..........] -+ * < runnable commands >< !ready to run > -+ * -+ * Cmd 1 : Currently executing on the GPU data master. -+ * Cmd 2,3,4: Fence dependencies met, commands runnable. -+ * Cmd 5... : Fence dependency not met yet. -+ */ -+struct rogue_fwif_cccb_ctl { -+ /* Host write offset into CCB. This must be aligned to 16 bytes. */ -+ u32 write_offset; -+ /* -+ * Firmware read offset into CCB. Points to the command that is runnable -+ * on GPU, if R!=W -+ */ -+ u32 read_offset; -+ /* -+ * Firmware fence dependency offset. Points to commands not ready, i.e. -+ * fence dependencies are not met. -+ */ -+ u32 dep_offset; -+ /* Offset wrapping mask, total capacity in bytes of the CCB-1 */ -+ u32 wrap_mask; -+} __aligned(8); -+ -+#define ROGUE_FW_LOCAL_FREELIST (0) -+#define ROGUE_FW_GLOBAL_FREELIST (1) -+#define ROGUE_FW_FREELIST_TYPE_LAST ROGUE_FW_GLOBAL_FREELIST -+#define ROGUE_FW_MAX_FREELISTS (ROGUE_FW_FREELIST_TYPE_LAST + 1U) -+ -+struct rogue_fwif_geom_registers_caswitch { -+ u64 geom_reg_vdm_context_state_base_addr; -+ u64 geom_reg_vdm_context_state_resume_addr; -+ u64 geom_reg_ta_context_state_base_addr; -+ -+ struct { -+ u64 geom_reg_vdm_context_store_task0; -+ u64 geom_reg_vdm_context_store_task1; -+ u64 geom_reg_vdm_context_store_task2; -+ -+ /* VDM resume state update controls */ -+ u64 geom_reg_vdm_context_resume_task0; -+ u64 geom_reg_vdm_context_resume_task1; -+ u64 geom_reg_vdm_context_resume_task2; -+ -+ u64 geom_reg_vdm_context_store_task3; -+ u64 geom_reg_vdm_context_store_task4; -+ -+ u64 geom_reg_vdm_context_resume_task3; -+ u64 geom_reg_vdm_context_resume_task4; -+ } geom_state[2]; -+}; -+ -+#define ROGUE_FWIF_GEOM_REGISTERS_CSWITCH_SIZE \ -+ sizeof(struct rogue_fwif_geom_registers_caswitch) -+ -+struct rogue_fwif_cdm_registers_cswitch { -+ u64 cdmreg_cdm_context_state_base_addr; -+ u64 cdmreg_cdm_context_pds0; -+ u64 cdmreg_cdm_context_pds1; -+ u64 cdmreg_cdm_terminate_pds; -+ u64 cdmreg_cdm_terminate_pds1; -+ -+ /* CDM resume controls */ -+ u64 cdmreg_cdm_resume_pds0; -+ u64 cdmreg_cdm_context_pds0_b; -+ u64 cdmreg_cdm_resume_pds0_b; -+}; -+ -+struct rogue_fwif_static_rendercontext_state { -+ /* Geom registers for ctx switch */ -+ struct rogue_fwif_geom_registers_caswitch ctxswitch_regs __aligned(8); -+}; -+ -+#define ROGUE_FWIF_STATIC_RENDERCONTEXT_SIZE \ -+ sizeof(struct rogue_fwif_static_rendercontext_state) -+ -+struct rogue_fwif_static_computecontext_state { -+ /* CDM registers for ctx switch */ -+ struct rogue_fwif_cdm_registers_cswitch ctxswitch_regs __aligned(8); -+}; -+ -+#define ROGUE_FWIF_STATIC_COMPUTECONTEXT_SIZE \ -+ sizeof(struct rogue_fwif_static_computecontext_state) -+ -+enum rogue_fwif_prbuffer_state { -+ ROGUE_FWIF_PRBUFFER_UNBACKED = 0, -+ ROGUE_FWIF_PRBUFFER_BACKED, -+ ROGUE_FWIF_PRBUFFER_BACKING_PENDING, -+ ROGUE_FWIF_PRBUFFER_UNBACKING_PENDING, -+}; -+ -+struct rogue_fwif_prbuffer { -+ /* Buffer ID*/ -+ u32 buffer_id; -+ /* Needs On-demand Z/S/MSAA Buffer allocation */ -+ bool on_demand __aligned(4); -+ /* Z/S/MSAA -Buffer state */ -+ enum rogue_fwif_prbuffer_state state; -+ /* Cleanup state */ -+ struct rogue_fwif_cleanup_ctl cleanup_sate; -+ /* Compatibility and other flags */ -+ u32 prbuffer_flags; -+} __aligned(8); -+ -+/* Last reset reason for a context. */ -+enum rogue_context_reset_reason { -+ /* No reset reason recorded */ -+ ROGUE_CONTEXT_RESET_REASON_NONE = 0, -+ /* Caused a reset due to locking up */ -+ ROGUE_CONTEXT_RESET_REASON_GUILTY_LOCKUP = 1, -+ /* Affected by another context locking up */ -+ ROGUE_CONTEXT_RESET_REASON_INNOCENT_LOCKUP = 2, -+ /* Overran the global deadline */ -+ ROGUE_CONTEXT_RESET_REASON_GUILTY_OVERRUNING = 3, -+ /* Affected by another context overrunning */ -+ ROGUE_CONTEXT_RESET_REASON_INNOCENT_OVERRUNING = 4, -+ /* Forced reset to ensure scheduling requirements */ -+ ROGUE_CONTEXT_RESET_REASON_HARD_CONTEXT_SWITCH = 5, -+ /* CDM Mission/safety checksum mismatch */ -+ ROGUE_CONTEXT_RESET_REASON_KZ_CHECKSUM = 6, -+ /* TRP checksum mismatch */ -+ ROGUE_CONTEXT_RESET_REASON_TRP_CHECKSUM = 7, -+}; -+ -+struct rogue_context_reset_reason_data { -+ enum rogue_context_reset_reason reset_reason; -+ u32 reset_ext_job_ref; -+}; -+ -+#endif /* __PVR_ROGUE_FWIF_SHARED_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_heap_config.h b/drivers/gpu/drm/imagination/pvr_rogue_heap_config.h -new file mode 100644 -index 000000000000..96006f8cb374 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_heap_config.h -@@ -0,0 +1,103 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_HEAP_CONFIG_H__ -+#define __PVR_ROGUE_HEAP_CONFIG_H__ -+ -+#include <linux/sizes.h> -+ -+/* -+ * ROGUE Device Virtual Address Space Definitions -+ * -+ * This file defines the ROGUE virtual address heaps that are used in -+ * application memory contexts. It also shows where the Firmware memory heap -+ * fits into this, but the firmware heap is only ever created in the -+ * kernel driver and never exposed to userspace. -+ * -+ * ROGUE_PDSCODEDATA_HEAP_BASE and ROGUE_USCCODE_HEAP_BASE will be programmed, -+ * on a global basis, into ROGUE_CR_PDS_EXEC_BASE and ROGUE_CR_USC_CODE_BASE_* -+ * respectively. Therefore if client drivers use multiple configs they must -+ * still be consistent with their definitions for these heaps. -+ * -+ * Base addresses have to be a multiple of 4MiB. -+ * Heaps must not start at 0x0000000000, as this is reserved for internal -+ * use within the driver. -+ * Range comments, those starting in column 0 below are a section heading of -+ * sorts and are above the heaps in that range. Often this is the reserved -+ * size of the heap within the range. -+ */ -+ -+/* 0x00_0000_0000 ************************************************************/ -+ -+/* 0x00_0000_0000 - 0x00_0040_0000 */ -+/* 0 MiB to 4 MiB, size of 4 MiB : RESERVED */ -+ -+/* 0x00_0040_0000 - 0x7F_FFC0_0000 **/ -+/* 4 MiB to 512 GiB, size of 512 GiB less 4 MiB : RESERVED **/ -+ -+/* 0x80_0000_0000 ************************************************************/ -+ -+/* 0x80_0000_0000 - 0x9F_FFFF_FFFF **/ -+/* 512 GiB to 640 GiB, size of 128 GiB : GENERAL_HEAP **/ -+#define ROGUE_GENERAL_HEAP_BASE 0x8000000000ull -+#define ROGUE_GENERAL_HEAP_SIZE SZ_128G -+ -+/* 0xA0_0000_0000 - 0xAF_FFFF_FFFF */ -+/* 640 GiB to 704 GiB, size of 64 GiB : FREE */ -+ -+/* B0_0000_0000 - 0xB7_FFFF_FFFF */ -+/* 704 GiB to 736 GiB, size of 32 GiB : FREE */ -+ -+/* 0xB8_0000_0000 - 0xBF_FFFF_FFFF */ -+/* 736 GiB to 768 GiB, size of 32 GiB : RESERVED */ -+ -+/* 0xC0_0000_0000 ************************************************************/ -+ -+/* 0xC0_0000_0000 - 0xD9_FFFF_FFFF */ -+/* 768 GiB to 872 GiB, size of 104 GiB : FREE */ -+ -+/* 0xDA_0000_0000 - 0xDA_FFFF_FFFF */ -+/* 872 GiB to 876 GiB, size of 4 GiB : PDSCODEDATA_HEAP */ -+#define ROGUE_PDSCODEDATA_HEAP_BASE 0xDA00000000ull -+#define ROGUE_PDSCODEDATA_HEAP_SIZE SZ_4G -+ -+/* 0xDB_0000_0000 - 0xDB_FFFF_FFFF */ -+/* 876 GiB to 880 GiB, size of 256 MiB (reserved 4GiB) : BRN **/ -+/* -+ * The BRN63142 quirk workaround requires Region Header memory to be at the top -+ * of a 16GiB aligned range. This is so when masked with 0x03FFFFFFFF the -+ * address will avoid aliasing PB addresses. Start at 879.75GiB. Size of 256MiB. -+ */ -+#define ROGUE_RGNHDR_HEAP_BASE 0xDBF0000000ull -+#define ROGUE_RGNHDR_HEAP_SIZE SZ_256M -+ -+/* 0xDC_0000_0000 - 0xDF_FFFF_FFFF */ -+/* 880 GiB to 896 GiB, size of 16 GiB : FREE */ -+ -+/* 0xE0_0000_0000 - 0xE0_FFFF_FFFF */ -+/* 896 GiB to 900 GiB, size of 4 GiB : USCCODE_HEAP */ -+#define ROGUE_USCCODE_HEAP_BASE 0xE000000000ull -+#define ROGUE_USCCODE_HEAP_SIZE SZ_4G -+ -+/* 0xE1_0000_0000 - 0xE1_BFFF_FFFF */ -+/* 900 GiB to 903 GiB, size of 3 GiB : RESERVED */ -+ -+/* 0xE1_C000_000 - 0xE1_FFFF_FFFF */ -+/* 903 GiB to 904 GiB, reserved 1 GiB, : FIRMWARE_HEAP */ -+#define ROGUE_FW_HEAP_BASE 0xE1C0000000ull -+ -+/* 0xE2_0000_0000 - 0xE3_FFFF_FFFF */ -+/* 904 GiB to 912 GiB, size of 8 GiB : FREE */ -+ -+/* 0xE4_0000_0000 - 0xF2_001F_FFFF */ -+/* 912 GiB to 969 GiB, size of 57 GiB : RESERVED */ -+ -+/* 0xF2_4000_0000 - 0xF2_FFFF_FFFF */ -+/* 969 GiB to 972 GiB, size of 3 GiB : FREE */ -+ -+/* 0xF3_0000_0000 - 0xFF_FFFF_FFFF */ -+/* 972 GiB to 1024 GiB, size of 52 GiB : FREE */ -+ -+/* 0xFF_FFFF_FFFF ************************************************************/ -+ -+#endif /* __PVR_ROGUE_HEAP_CONFIG_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_meta.h b/drivers/gpu/drm/imagination/pvr_rogue_meta.h -new file mode 100644 -index 000000000000..0ae7aa3ecd43 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_meta.h -@@ -0,0 +1,357 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_META_H__ -+#define __PVR_ROGUE_META_H__ -+ -+/***** The META HW register definitions in the file are updated manually *****/ -+ -+#include <linux/bits.h> -+#include <linux/types.h> -+ -+/* -+ ****************************************************************************** -+ * META registers and MACROS -+ ***************************************************************************** -+ */ -+#define META_CR_CTRLREG_BASE(t) (0x04800000U + (0x1000U * (t))) -+ -+#define META_CR_TXPRIVEXT (0x048000E8) -+#define META_CR_TXPRIVEXT_MINIM_EN BIT(7) -+ -+#define META_CR_SYSC_JTAG_THREAD (0x04830030) -+#define META_CR_SYSC_JTAG_THREAD_PRIV_EN (0x00000004) -+ -+#define META_CR_PERF_COUNT0 (0x0480FFE0) -+#define META_CR_PERF_COUNT1 (0x0480FFE8) -+#define META_CR_PERF_COUNT_CTRL_SHIFT (28) -+#define META_CR_PERF_COUNT_CTRL_MASK (0xF0000000) -+#define META_CR_PERF_COUNT_CTRL_DCACHEHITS (8 << META_CR_PERF_COUNT_CTRL_SHIFT) -+#define META_CR_PERF_COUNT_CTRL_ICACHEHITS (9 << META_CR_PERF_COUNT_CTRL_SHIFT) -+#define META_CR_PERF_COUNT_CTRL_ICACHEMISS \ -+ (0xA << META_CR_PERF_COUNT_CTRL_SHIFT) -+#define META_CR_PERF_COUNT_CTRL_ICORE (0xD << META_CR_PERF_COUNT_CTRL_SHIFT) -+#define META_CR_PERF_COUNT_THR_SHIFT (24) -+#define META_CR_PERF_COUNT_THR_MASK (0x0F000000) -+#define META_CR_PERF_COUNT_THR_0 (0x1 << META_CR_PERF_COUNT_THR_SHIFT) -+#define META_CR_PERF_COUNT_THR_1 (0x2 << META_CR_PERF_COUNT_THR_1) -+ -+#define META_CR_TxVECINT_BHALT (0x04820500) -+#define META_CR_PERF_ICORE0 (0x0480FFD0) -+#define META_CR_PERF_ICORE1 (0x0480FFD8) -+#define META_CR_PERF_ICORE_DCACHEMISS (0x8) -+ -+#define META_CR_PERF_COUNT(ctrl, thr) \ -+ ((META_CR_PERF_COUNT_CTRL_##ctrl << META_CR_PERF_COUNT_CTRL_SHIFT) | \ -+ ((thr) << META_CR_PERF_COUNT_THR_SHIFT)) -+ -+#define META_CR_TXUXXRXDT_OFFSET (META_CR_CTRLREG_BASE(0U) + 0x0000FFF0U) -+#define META_CR_TXUXXRXRQ_OFFSET (META_CR_CTRLREG_BASE(0U) + 0x0000FFF8U) -+ -+/* Poll for done. */ -+#define META_CR_TXUXXRXRQ_DREADY_BIT (0x80000000U) -+/* Set for read. */ -+#define META_CR_TXUXXRXRQ_RDnWR_BIT (0x00010000U) -+#define META_CR_TXUXXRXRQ_TX_S (12) -+#define META_CR_TXUXXRXRQ_RX_S (4) -+#define META_CR_TXUXXRXRQ_UXX_S (0) -+ -+/* Internal ctrl regs. */ -+#define META_CR_TXUIN_ID (0x0) -+/* Data unit regs. */ -+#define META_CR_TXUD0_ID (0x1) -+/* Data unit regs. */ -+#define META_CR_TXUD1_ID (0x2) -+/* Address unit regs. */ -+#define META_CR_TXUA0_ID (0x3) -+/* Address unit regs. */ -+#define META_CR_TXUA1_ID (0x4) -+/* PC registers. */ -+#define META_CR_TXUPC_ID (0x5) -+ -+/* Macros to calculate register access values. */ -+#define META_CR_CORE_REG(thr, reg_num, unit) \ -+ (((u32)(thr) << META_CR_TXUXXRXRQ_TX_S) | \ -+ ((u32)(reg_num) << META_CR_TXUXXRXRQ_RX_S) | \ -+ ((u32)(unit) << META_CR_TXUXXRXRQ_UXX_S)) -+ -+#define META_CR_THR0_PC META_CR_CORE_REG(0, 0, META_CR_TXUPC_ID) -+#define META_CR_THR0_PCX META_CR_CORE_REG(0, 1, META_CR_TXUPC_ID) -+#define META_CR_THR0_SP META_CR_CORE_REG(0, 0, META_CR_TXUA0_ID) -+ -+#define META_CR_THR1_PC META_CR_CORE_REG(1, 0, META_CR_TXUPC_ID) -+#define META_CR_THR1_PCX META_CR_CORE_REG(1, 1, META_CR_TXUPC_ID) -+#define META_CR_THR1_SP META_CR_CORE_REG(1, 0, META_CR_TXUA0_ID) -+ -+#define SP_ACCESS(thread) META_CR_CORE_REG(thread, 0, META_CR_TXUA0_ID) -+#define PC_ACCESS(thread) META_CR_CORE_REG(thread, 0, META_CR_TXUPC_ID) -+ -+#define META_CR_COREREG_ENABLE (0x0000000U) -+#define META_CR_COREREG_STATUS (0x0000010U) -+#define META_CR_COREREG_DEFR (0x00000A0U) -+#define META_CR_COREREG_PRIVEXT (0x00000E8U) -+ -+#define META_CR_T0ENABLE_OFFSET \ -+ (META_CR_CTRLREG_BASE(0U) + META_CR_COREREG_ENABLE) -+#define META_CR_T0STATUS_OFFSET \ -+ (META_CR_CTRLREG_BASE(0U) + META_CR_COREREG_STATUS) -+#define META_CR_T0DEFR_OFFSET (META_CR_CTRLREG_BASE(0U) + META_CR_COREREG_DEFR) -+#define META_CR_T0PRIVEXT_OFFSET \ -+ (META_CR_CTRLREG_BASE(0U) + META_CR_COREREG_PRIVEXT) -+ -+#define META_CR_T1ENABLE_OFFSET \ -+ (META_CR_CTRLREG_BASE(1U) + META_CR_COREREG_ENABLE) -+#define META_CR_T1STATUS_OFFSET \ -+ (META_CR_CTRLREG_BASE(1U) + META_CR_COREREG_STATUS) -+#define META_CR_T1DEFR_OFFSET (META_CR_CTRLREG_BASE(1U) + META_CR_COREREG_DEFR) -+#define META_CR_T1PRIVEXT_OFFSET \ -+ (META_CR_CTRLREG_BASE(1U) + META_CR_COREREG_PRIVEXT) -+ -+#define META_CR_TXENABLE_ENABLE_BIT (0x00000001U) /* Set if running */ -+#define META_CR_TXSTATUS_PRIV (0x00020000U) -+#define META_CR_TXPRIVEXT_MINIM (0x00000080U) -+ -+#define META_MEM_GLOBAL_RANGE_BIT (0x80000000U) -+ -+#define META_CR_TXCLKCTRL (0x048000B0) -+#define META_CR_TXCLKCTRL_ALL_ON (0x55111111) -+#define META_CR_TXCLKCTRL_ALL_AUTO (0xAA222222) -+ -+#define META_CR_MMCU_LOCAL_EBCTRL (0x04830600) -+#define META_CR_MMCU_LOCAL_EBCTRL_ICWIN (0x3 << 14) -+#define META_CR_MMCU_LOCAL_EBCTRL_DCWIN (0x3 << 6) -+#define META_CR_SYSC_DCPART(n) (0x04830200 + (n)*0x8) -+#define META_CR_SYSC_DCPARTX_CACHED_WRITE_ENABLE (0x1 << 31) -+#define META_CR_SYSC_ICPART(n) (0x04830220 + (n)*0x8) -+#define META_CR_SYSC_XCPARTX_LOCAL_ADDR_OFFSET_TOP_HALF (0x8 << 16) -+#define META_CR_SYSC_XCPARTX_LOCAL_ADDR_FULL_CACHE (0xF) -+#define META_CR_SYSC_XCPARTX_LOCAL_ADDR_HALF_CACHE (0x7) -+#define META_CR_MMCU_DCACHE_CTRL (0x04830018) -+#define META_CR_MMCU_ICACHE_CTRL (0x04830020) -+#define META_CR_MMCU_XCACHE_CTRL_CACHE_HITS_EN (0x1) -+ -+/* -+ ****************************************************************************** -+ * META LDR Format -+ ****************************************************************************** -+ */ -+/* Block header structure. */ -+struct rogue_meta_ldr_block_hdr { -+ u32 dev_id; -+ u32 sl_code; -+ u32 sl_data; -+ u16 pc_ctrl; -+ u16 crc; -+}; -+ -+/* High level data stream block structure. */ -+struct rogue_meta_ldr_l1_data_blk { -+ u16 cmd; -+ u16 length; -+ u32 next; -+ u32 cmd_data[4]; -+}; -+ -+/* High level data stream block structure. */ -+struct rogue_meta_ldr_l2_data_blk { -+ u16 tag; -+ u16 length; -+ u32 block_data[4]; -+}; -+ -+/* Config command structure. */ -+struct rogue_meta_ldr_cfg_blk { -+ u32 type; -+ u32 block_data[4]; -+}; -+ -+/* Block type definitions */ -+#define ROGUE_META_LDR_COMMENT_TYPE_MASK (0x0010U) -+#define ROGUE_META_LDR_BLK_IS_COMMENT(x) \ -+ (((x)&ROGUE_META_LDR_COMMENT_TYPE_MASK) != 0U) -+ -+/* -+ * Command definitions -+ * Value Name Description -+ * 0 LoadMem Load memory with binary data. -+ * 1 LoadCore Load a set of core registers. -+ * 2 LoadMMReg Load a set of memory mapped registers. -+ * 3 StartThreads Set each thread PC and SP, then enable threads. -+ * 4 ZeroMem Zeros a memory region. -+ * 5 Config Perform a configuration command. -+ */ -+#define ROGUE_META_LDR_CMD_MASK (0x000FU) -+ -+#define ROGUE_META_LDR_CMD_LOADMEM (0x0000U) -+#define ROGUE_META_LDR_CMD_LOADCORE (0x0001U) -+#define ROGUE_META_LDR_CMD_LOADMMREG (0x0002U) -+#define ROGUE_META_LDR_CMD_START_THREADS (0x0003U) -+#define ROGUE_META_LDR_CMD_ZEROMEM (0x0004U) -+#define ROGUE_META_LDR_CMD_CONFIG (0x0005U) -+ -+/* -+ * Config Command definitions -+ * Value Name Description -+ * 0 Pause Pause for x times 100 instructions -+ * 1 Read Read a value from register - No value return needed. -+ * Utilises effects of issuing reads to certain registers -+ * 2 Write Write to mem location -+ * 3 MemSet Set mem to value -+ * 4 MemCheck check mem for specific value. -+ */ -+#define ROGUE_META_LDR_CFG_PAUSE (0x0000) -+#define ROGUE_META_LDR_CFG_READ (0x0001) -+#define ROGUE_META_LDR_CFG_WRITE (0x0002) -+#define ROGUE_META_LDR_CFG_MEMSET (0x0003) -+#define ROGUE_META_LDR_CFG_MEMCHECK (0x0004) -+ -+/* -+ ****************************************************************************** -+ * ROGUE FW segmented MMU definitions -+ ****************************************************************************** -+ */ -+/* All threads can access the segment. */ -+#define ROGUE_FW_SEGMMU_ALLTHRS (0xf << 8U) -+/* Writable. */ -+#define ROGUE_FW_SEGMMU_WRITEABLE (0x1U << 1U) -+/* All threads can access and writable. */ -+#define ROGUE_FW_SEGMMU_ALLTHRS_WRITEABLE \ -+ (ROGUE_FW_SEGMMU_ALLTHRS | ROGUE_FW_SEGMMU_WRITEABLE) -+ -+/* Direct map region 10 used for mapping GPU memory - max 8MB. */ -+#define ROGUE_FW_SEGMMU_DMAP_GPU_ID (10U) -+#define ROGUE_FW_SEGMMU_DMAP_GPU_ADDR_START (0x07000000U) -+#define ROGUE_FW_SEGMMU_DMAP_GPU_MAX_SIZE (0x00800000U) -+ -+/* Segment IDs. */ -+#define ROGUE_FW_SEGMMU_DATA_ID (1U) -+#define ROGUE_FW_SEGMMU_BOOTLDR_ID (2U) -+#define ROGUE_FW_SEGMMU_TEXT_ID (ROGUE_FW_SEGMMU_BOOTLDR_ID) -+ -+/* -+ * SLC caching strategy in S7 and volcanic is emitted through the segment MMU. -+ * All the segments configured through the macro ROGUE_FW_SEGMMU_OUTADDR_TOP are -+ * CACHED in the SLC. -+ * The interface has been kept the same to simplify the code changes. -+ * The bifdm argument is ignored (no longer relevant) in S7 and volcanic. -+ */ -+#define ROGUE_FW_SEGMMU_OUTADDR_TOP_VIVT_SLC(pers, slc_policy, mmu_ctx) \ -+ ((((u64)((pers)&0x3)) << 52) | (((u64)((mmu_ctx)&0xFF)) << 44) | \ -+ (((u64)((slc_policy)&0x1)) << 40)) -+#define ROGUE_FW_SEGMMU_OUTADDR_TOP_VIVT_SLC_CACHED(mmu_ctx) \ -+ ROGUE_FW_SEGMMU_OUTADDR_TOP_VIVT_SLC(0x3, 0x0, mmu_ctx) -+#define ROGUE_FW_SEGMMU_OUTADDR_TOP_VIVT_SLC_UNCACHED(mmu_ctx) \ -+ ROGUE_FW_SEGMMU_OUTADDR_TOP_VIVT_SLC(0x0, 0x1, mmu_ctx) -+ -+/* -+ * To configure the Page Catalog and BIF-DM fed into the BIF for Garten -+ * accesses through this segment. -+ */ -+#define ROGUE_FW_SEGMMU_OUTADDR_TOP_SLC(pc, bifdm) \ -+ (((u64)((u64)(pc)&0xFU) << 44U) | ((u64)((u64)(bifdm)&0xFU) << 40U)) -+ -+#define ROGUE_FW_SEGMMU_META_BIFDM_ID (0x7U) -+ -+/* META segments have 4kB minimum size. */ -+#define ROGUE_FW_SEGMMU_ALIGN (0x1000U) -+ -+/* Segmented MMU registers (n = segment id). */ -+#define META_CR_MMCU_SEGMENTn_BASE(n) (0x04850000U + ((n)*0x10U)) -+#define META_CR_MMCU_SEGMENTn_LIMIT(n) (0x04850004U + ((n)*0x10U)) -+#define META_CR_MMCU_SEGMENTn_OUTA0(n) (0x04850008U + ((n)*0x10U)) -+#define META_CR_MMCU_SEGMENTn_OUTA1(n) (0x0485000CU + ((n)*0x10U)) -+ -+/* -+ * The following defines must be recalculated if the Meta MMU segments used -+ * to access Host-FW data are changed -+ * Current combinations are: -+ * - SLC uncached, META cached, FW base address 0x70000000 -+ * - SLC uncached, META uncached, FW base address 0xF0000000 -+ * - SLC cached, META cached, FW base address 0x10000000 -+ * - SLC cached, META uncached, FW base address 0x90000000 -+ */ -+#define ROGUE_FW_SEGMMU_DATA_BASE_ADDRESS (0x10000000U) -+#define ROGUE_FW_SEGMMU_DATA_META_CACHED (0x0U) -+#define ROGUE_FW_SEGMMU_DATA_META_UNCACHED (META_MEM_GLOBAL_RANGE_BIT) -+#define ROGUE_FW_SEGMMU_DATA_META_CACHE_MASK (META_MEM_GLOBAL_RANGE_BIT) -+/* -+ * For non-VIVT SLCs the cacheability of the FW data in the SLC is selected in -+ * the PTEs for the FW data, not in the Meta Segment MMU, which means these -+ * defines have no real effect in those cases. -+ */ -+#define ROGUE_FW_SEGMMU_DATA_VIVT_SLC_CACHED (0x0U) -+#define ROGUE_FW_SEGMMU_DATA_VIVT_SLC_UNCACHED (0x60000000U) -+#define ROGUE_FW_SEGMMU_DATA_VIVT_SLC_CACHE_MASK (0x60000000U) -+ -+/* -+ ****************************************************************************** -+ * ROGUE FW Bootloader defaults -+ ****************************************************************************** -+ */ -+#define ROGUE_FW_BOOTLDR_META_ADDR (0x40000000U) -+#define ROGUE_FW_BOOTLDR_DEVV_ADDR_0 (0xC0000000U) -+#define ROGUE_FW_BOOTLDR_DEVV_ADDR_1 (0x000000E1) -+#define ROGUE_FW_BOOTLDR_DEVV_ADDR \ -+ ((((u64)ROGUE_FW_BOOTLDR_DEVV_ADDR_1) << 32) | \ -+ ROGUE_FW_BOOTLDR_DEVV_ADDR_0) -+#define ROGUE_FW_BOOTLDR_LIMIT (0x1FFFF000) -+#define ROGUE_FW_MAX_BOOTLDR_OFFSET (0x1000) -+ -+/* Bootloader configuration offset is in dwords (512 bytes) */ -+#define ROGUE_FW_BOOTLDR_CONF_OFFSET (0x80) -+ -+/* -+ ****************************************************************************** -+ * ROGUE META Stack -+ ****************************************************************************** -+ */ -+#define ROGUE_META_STACK_SIZE (0x1000U) -+ -+/* -+ ****************************************************************************** -+ * ROGUE META Core memory -+ ****************************************************************************** -+ */ -+/* Code and data both map to the same physical memory. */ -+#define ROGUE_META_COREMEM_CODE_ADDR (0x80000000U) -+#define ROGUE_META_COREMEM_DATA_ADDR (0x82000000U) -+#define ROGUE_META_COREMEM_OFFSET_MASK (0x01ffffffU) -+ -+#define ROGUE_META_IS_COREMEM_CODE(a, b) \ -+ ({ \ -+ u32 _a = (a), _b = (b); \ -+ ((_a) >= ROGUE_META_COREMEM_CODE_ADDR) && \ -+ ((_a) < (ROGUE_META_COREMEM_CODE_ADDR + (_b))); \ -+ }) -+#define ROGUE_META_IS_COREMEM_DATA(a, b) \ -+ ({ \ -+ u32 _a = (a), _b = (b); \ -+ ((_a) >= ROGUE_META_COREMEM_DATA_ADDR) && \ -+ ((_a) < (ROGUE_META_COREMEM_DATA_ADDR + (_b))); \ -+ }) -+/* -+ ****************************************************************************** -+ * 2nd thread -+ ****************************************************************************** -+ */ -+#define ROGUE_FW_THR1_PC (0x18930000) -+#define ROGUE_FW_THR1_SP (0x78890000) -+ -+/* -+ ****************************************************************************** -+ * META compatibility -+ ****************************************************************************** -+ */ -+ -+#define META_CR_CORE_ID (0x04831000) -+#define META_CR_CORE_ID_VER_SHIFT (16U) -+#define META_CR_CORE_ID_VER_CLRMSK (0XFF00FFFFU) -+ -+#define ROGUE_CR_META_MTP218_CORE_ID_VALUE 0x19 -+#define ROGUE_CR_META_MTP219_CORE_ID_VALUE 0x1E -+#define ROGUE_CR_META_LTP218_CORE_ID_VALUE 0x1C -+#define ROGUE_CR_META_LTP217_CORE_ID_VALUE 0x1F -+ -+#define ROGUE_FW_PROCESSOR_META "META" -+ -+#endif /* __PVR_ROGUE_META_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_mips.h b/drivers/gpu/drm/imagination/pvr_rogue_mips.h -new file mode 100644 -index 000000000000..270e0dd51e69 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_mips.h -@@ -0,0 +1,336 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_ROGUE_MIPS_H__ -+#define __PVR_ROGUE_MIPS_H__ -+ -+#include <linux/types.h> -+ -+/* Utility defines for memory management. */ -+#define ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K (12) -+#define ROGUE_MIPSFW_PAGE_SIZE_4K (0x1 << ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K) -+#define ROGUE_MIPSFW_PAGE_MASK_4K (ROGUE_MIPSFW_PAGE_SIZE_4K - 1) -+#define ROGUE_MIPSFW_LOG2_PAGE_SIZE_64K (16) -+#define ROGUE_MIPSFW_PAGE_SIZE_64K (0x1 << ROGUE_MIPSFW_LOG2_PAGE_SIZE_64K) -+#define ROGUE_MIPSFW_PAGE_MASK_64K (ROGUE_MIPSFW_PAGE_SIZE_64K - 1) -+#define ROGUE_MIPSFW_LOG2_PAGE_SIZE_256K (18) -+#define ROGUE_MIPSFW_PAGE_SIZE_256K (0x1 << ROGUE_MIPSFW_LOG2_PAGE_SIZE_256K) -+#define ROGUE_MIPSFW_PAGE_MASK_256K (ROGUE_MIPSFW_PAGE_SIZE_256K - 1) -+#define ROGUE_MIPSFW_LOG2_PAGE_SIZE_1MB (20) -+#define ROGUE_MIPSFW_PAGE_SIZE_1MB (0x1 << ROGUE_MIPSFW_LOG2_PAGE_SIZE_1MB) -+#define ROGUE_MIPSFW_PAGE_MASK_1MB (ROGUE_MIPSFW_PAGE_SIZE_1MB - 1) -+#define ROGUE_MIPSFW_LOG2_PAGE_SIZE_4MB (22) -+#define ROGUE_MIPSFW_PAGE_SIZE_4MB (0x1 << ROGUE_MIPSFW_LOG2_PAGE_SIZE_4MB) -+#define ROGUE_MIPSFW_PAGE_MASK_4MB (ROGUE_MIPSFW_PAGE_SIZE_4MB - 1) -+#define ROGUE_MIPSFW_LOG2_PTE_ENTRY_SIZE (2) -+/* log2 page table sizes dependent on FW heap size and page size (for each OS). */ -+#define ROGUE_MIPSFW_LOG2_PAGETABLE_SIZE_4K(pvr_dev) ((pvr_dev)->fw_heap_info.log2_size - \ -+ ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K + \ -+ ROGUE_MIPSFW_LOG2_PTE_ENTRY_SIZE) -+#define ROGUE_MIPSFW_LOG2_PAGETABLE_SIZE_64K(pvr_dev) ((pvr_dev)->fw_heap_info.log2_size - \ -+ ROGUE_MIPSFW_LOG2_PAGE_SIZE_64K + \ -+ ROGUE_MIPSFW_LOG2_PTE_ENTRY_SIZE) -+/* Maximum number of page table pages (both Host and MIPS pages). */ -+#define ROGUE_MIPSFW_MAX_NUM_PAGETABLE_PAGES (4) -+/* Total number of TLB entries. */ -+#define ROGUE_MIPSFW_NUMBER_OF_TLB_ENTRIES (16) -+/* "Uncached" caching policy. */ -+#define ROGUE_MIPSFW_UNCACHED_CACHE_POLICY (2) -+/* "Write-back write-allocate" caching policy. */ -+#define ROGUE_MIPSFW_WRITEBACK_CACHE_POLICY (3) -+/* "Write-through no write-allocate" caching policy. */ -+#define ROGUE_MIPSFW_WRITETHROUGH_CACHE_POLICY (1) -+/* Cached policy used by MIPS in case of physical bus on 32 bit. */ -+#define ROGUE_MIPSFW_CACHED_POLICY (ROGUE_MIPSFW_WRITEBACK_CACHE_POLICY) -+/* Cached policy used by MIPS in case of physical bus on more than 32 bit. */ -+#define ROGUE_MIPSFW_CACHED_POLICY_ABOVE_32BIT (ROGUE_MIPSFW_WRITETHROUGH_CACHE_POLICY) -+/* Total number of Remap entries. */ -+#define ROGUE_MIPSFW_NUMBER_OF_REMAP_ENTRIES (2 * ROGUE_MIPSFW_NUMBER_OF_TLB_ENTRIES) -+ -+ -+/* MIPS EntryLo/PTE format. */ -+ -+#define ROGUE_MIPSFW_ENTRYLO_READ_INHIBIT_SHIFT (31U) -+#define ROGUE_MIPSFW_ENTRYLO_READ_INHIBIT_CLRMSK (0X7FFFFFFF) -+#define ROGUE_MIPSFW_ENTRYLO_READ_INHIBIT_EN (0X80000000) -+ -+#define ROGUE_MIPSFW_ENTRYLO_EXEC_INHIBIT_SHIFT (30U) -+#define ROGUE_MIPSFW_ENTRYLO_EXEC_INHIBIT_CLRMSK (0XBFFFFFFF) -+#define ROGUE_MIPSFW_ENTRYLO_EXEC_INHIBIT_EN (0X40000000) -+ -+/* Page Frame Number */ -+#define ROGUE_MIPSFW_ENTRYLO_PFN_SHIFT (6) -+#define ROGUE_MIPSFW_ENTRYLO_PFN_ALIGNSHIFT (12) -+/* Mask used for the MIPS Page Table in case of physical bus on 32 bit. */ -+#define ROGUE_MIPSFW_ENTRYLO_PFN_MASK (0x03FFFFC0) -+#define ROGUE_MIPSFW_ENTRYLO_PFN_SIZE (20) -+/* Mask used for the MIPS Page Table in case of physical bus on more than 32 bit. */ -+#define ROGUE_MIPSFW_ENTRYLO_PFN_MASK_ABOVE_32BIT (0x3FFFFFC0) -+#define ROGUE_MIPSFW_ENTRYLO_PFN_SIZE_ABOVE_32BIT (24) -+#define ROGUE_MIPSFW_ADDR_TO_ENTRYLO_PFN_RSHIFT (ROGUE_MIPSFW_ENTRYLO_PFN_ALIGNSHIFT - \ -+ ROGUE_MIPSFW_ENTRYLO_PFN_SHIFT) -+ -+#define ROGUE_MIPSFW_ENTRYLO_CACHE_POLICY_SHIFT (3U) -+#define ROGUE_MIPSFW_ENTRYLO_CACHE_POLICY_CLRMSK (0XFFFFFFC7) -+ -+#define ROGUE_MIPSFW_ENTRYLO_DIRTY_SHIFT (2U) -+#define ROGUE_MIPSFW_ENTRYLO_DIRTY_CLRMSK (0XFFFFFFFB) -+#define ROGUE_MIPSFW_ENTRYLO_DIRTY_EN (0X00000004) -+ -+#define ROGUE_MIPSFW_ENTRYLO_VALID_SHIFT (1U) -+#define ROGUE_MIPSFW_ENTRYLO_VALID_CLRMSK (0XFFFFFFFD) -+#define ROGUE_MIPSFW_ENTRYLO_VALID_EN (0X00000002) -+ -+#define ROGUE_MIPSFW_ENTRYLO_GLOBAL_SHIFT (0U) -+#define ROGUE_MIPSFW_ENTRYLO_GLOBAL_CLRMSK (0XFFFFFFFE) -+#define ROGUE_MIPSFW_ENTRYLO_GLOBAL_EN (0X00000001) -+ -+#define ROGUE_MIPSFW_ENTRYLO_DVG (ROGUE_MIPSFW_ENTRYLO_DIRTY_EN | \ -+ ROGUE_MIPSFW_ENTRYLO_VALID_EN | \ -+ ROGUE_MIPSFW_ENTRYLO_GLOBAL_EN) -+#define ROGUE_MIPSFW_ENTRYLO_UNCACHED (ROGUE_MIPSFW_UNCACHED_CACHE_POLICY << \ -+ ROGUE_MIPSFW_ENTRYLO_CACHE_POLICY_SHIFT) -+#define ROGUE_MIPSFW_ENTRYLO_DVG_UNCACHED (ROGUE_MIPSFW_ENTRYLO_DVG | \ -+ ROGUE_MIPSFW_ENTRYLO_UNCACHED) -+ -+ -+/* Remap Range Config Addr Out. */ -+/* These defines refer to the upper half of the Remap Range Config register. */ -+#define ROGUE_MIPSFW_REMAP_RANGE_ADDR_OUT_MASK (0x0FFFFFF0) -+#define ROGUE_MIPSFW_REMAP_RANGE_ADDR_OUT_SHIFT (4) /* wrt upper half of the register. */ -+#define ROGUE_MIPSFW_REMAP_RANGE_ADDR_OUT_ALIGNSHIFT (12) -+#define ROGUE_MIPSFW_ADDR_TO_RR_ADDR_OUT_RSHIFT (ROGUE_MIPSFW_REMAP_RANGE_ADDR_OUT_ALIGNSHIFT - \ -+ ROGUE_MIPSFW_REMAP_RANGE_ADDR_OUT_SHIFT) -+ -+ -+/* -+ * Pages to trampoline problematic physical addresses: -+ * - ROGUE_MIPSFW_BOOT_REMAP_PHYS_ADDR_IN : 0x1FC0_0000 -+ * - ROGUE_MIPSFW_DATA_REMAP_PHYS_ADDR_IN : 0x1FC0_1000 -+ * - ROGUE_MIPSFW_CODE_REMAP_PHYS_ADDR_IN : 0x1FC0_2000 -+ * - (benign trampoline) : 0x1FC0_3000 -+ * that would otherwise be erroneously remapped by the MIPS wrapper. -+ * (see "Firmware virtual layout and remap configuration" section below) -+ */ -+ -+#define ROGUE_MIPSFW_TRAMPOLINE_LOG2_NUMPAGES (2) -+#define ROGUE_MIPSFW_TRAMPOLINE_NUMPAGES (1 << ROGUE_MIPSFW_TRAMPOLINE_LOG2_NUMPAGES) -+#define ROGUE_MIPSFW_TRAMPOLINE_SIZE (ROGUE_MIPSFW_TRAMPOLINE_NUMPAGES << \ -+ ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K) -+#define ROGUE_MIPSFW_TRAMPOLINE_LOG2_SEGMENT_SIZE (ROGUE_MIPSFW_TRAMPOLINE_LOG2_NUMPAGES + \ -+ ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K) -+ -+#define ROGUE_MIPSFW_TRAMPOLINE_TARGET_PHYS_ADDR (ROGUE_MIPSFW_BOOT_REMAP_PHYS_ADDR_IN) -+#define ROGUE_MIPSFW_TRAMPOLINE_OFFSET(a) ((a) - ROGUE_MIPSFW_BOOT_REMAP_PHYS_ADDR_IN) -+ -+#define ROGUE_MIPSFW_SENSITIVE_ADDR(a) (ROGUE_MIPSFW_BOOT_REMAP_PHYS_ADDR_IN == \ -+ (~((1 << ROGUE_MIPSFW_TRAMPOLINE_LOG2_SEGMENT_SIZE) - 1) \ -+ & (a))) -+ -+/* Firmware virtual layout and remap configuration. */ -+/* -+ * For each remap region we define: -+ * - the virtual base used by the Firmware to access code/data through that region -+ * - the microAptivAP physical address correspondent to the virtual base address, -+ * used as input address and remapped to the actual physical address -+ * - log2 of size of the region remapped by the MIPS wrapper, i.e. number of bits from -+ * the bottom of the base input address that survive onto the output address -+ * (this defines both the alignment and the maximum size of the remapped region) -+ * - one or more code/data segments within the remapped region. -+ */ -+ -+/* Boot remap setup. */ -+#define ROGUE_MIPSFW_BOOT_REMAP_VIRTUAL_BASE (0xBFC00000) -+#define ROGUE_MIPSFW_BOOT_REMAP_PHYS_ADDR_IN (0x1FC00000) -+#define ROGUE_MIPSFW_BOOT_REMAP_LOG2_SEGMENT_SIZE (12) -+#define ROGUE_MIPSFW_BOOT_NMI_CODE_VIRTUAL_BASE (ROGUE_MIPSFW_BOOT_REMAP_VIRTUAL_BASE) -+ -+/* Data remap setup. */ -+#define ROGUE_MIPSFW_DATA_REMAP_VIRTUAL_BASE (0xBFC01000) -+#define ROGUE_MIPSFW_DATA_CACHED_REMAP_VIRTUAL_BASE (0x9FC01000) -+#define ROGUE_MIPSFW_DATA_REMAP_PHYS_ADDR_IN (0x1FC01000) -+#define ROGUE_MIPSFW_DATA_REMAP_LOG2_SEGMENT_SIZE (12) -+#define ROGUE_MIPSFW_BOOT_NMI_DATA_VIRTUAL_BASE (ROGUE_MIPSFW_DATA_REMAP_VIRTUAL_BASE) -+ -+/* Code remap setup. */ -+#define ROGUE_MIPSFW_CODE_REMAP_VIRTUAL_BASE (0x9FC02000) -+#define ROGUE_MIPSFW_CODE_REMAP_PHYS_ADDR_IN (0x1FC02000) -+#define ROGUE_MIPSFW_CODE_REMAP_LOG2_SEGMENT_SIZE (12) -+#define ROGUE_MIPSFW_EXCEPTIONS_VIRTUAL_BASE (ROGUE_MIPSFW_CODE_REMAP_VIRTUAL_BASE) -+ -+/* Permanent mappings setup. */ -+#define ROGUE_MIPSFW_PT_VIRTUAL_BASE (0xCF000000) -+#define ROGUE_MIPSFW_REGISTERS_VIRTUAL_BASE (0xCF800000) -+#define ROGUE_MIPSFW_STACK_VIRTUAL_BASE (0xCF600000) -+ -+ -+/* Bootloader configuration data. */ -+/* -+ * Bootloader configuration offset (where ROGUE_MIPSFW_BOOT_DATA lives) -+ * within the bootloader/NMI data page. -+ */ -+#define ROGUE_MIPSFW_BOOTLDR_CONF_OFFSET (0x0) -+ -+/* NMI shared data. */ -+/* Base address of the shared data within the bootloader/NMI data page. */ -+#define ROGUE_MIPSFW_NMI_SHARED_DATA_BASE (0x100) -+/* Size used by Debug dump data. */ -+#define ROGUE_MIPSFW_NMI_SHARED_SIZE (0x2B0) -+/* Offsets in the NMI shared area in 32-bit words. */ -+#define ROGUE_MIPSFW_NMI_SYNC_FLAG_OFFSET (0x0) -+#define ROGUE_MIPSFW_NMI_STATE_OFFSET (0x1) -+#define ROGUE_MIPSFW_NMI_ERROR_STATE_SET (0x1) -+ -+/* MIPS boot stage. */ -+#define ROGUE_MIPSFW_BOOT_STAGE_OFFSET (0x400) -+ -+/* -+ * MIPS private data in the bootloader data page. -+ * Memory below this offset is used by the FW only, no interface data allowed. -+ */ -+#define ROGUE_MIPSFW_PRIVATE_DATA_OFFSET (0x800) -+ -+struct rogue_mipsfw_boot_data { -+ u64 stack_phys_addr; -+ u64 reg_base; -+ u64 pt_phys_addr[ROGUE_MIPSFW_MAX_NUM_PAGETABLE_PAGES]; -+ u32 pt_log2_page_size; -+ u32 pt_num_pages; -+ u32 reserved1; -+ u32 reserved2; -+}; -+ -+#define ROGUE_MIPSFW_GET_OFFSET_IN_DWORDS(offset) ((offset) / sizeof(u32)) -+#define ROGUE_MIPSFW_GET_OFFSET_IN_QWORDS(offset) ((offset) / sizeof(u64)) -+ -+/* Used for compatibility checks. */ -+#define ROGUE_MIPSFW_ARCHTYPE_VER_CLRMSK (0xFFFFE3FFU) -+#define ROGUE_MIPSFW_ARCHTYPE_VER_SHIFT (10U) -+#define ROGUE_MIPSFW_CORE_ID_VALUE (0x001U) -+#define ROGUE_FW_PROCESSOR_MIPS "MIPS" -+ -+/* microAptivAP cache line size. */ -+#define ROGUE_MIPSFW_MICROAPTIVEAP_CACHELINE_SIZE (16U) -+ -+/* -+ * The SOCIF transactions are identified with the top 16 bits of the physical address emitted by -+ * the MIPS. -+ */ -+#define ROGUE_MIPSFW_WRAPPER_CONFIG_REGBANK_ADDR_ALIGN (16U) -+ -+/* Values to put in the MIPS selectors for performance counters. */ -+/* Icache accesses in COUNTER0. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_ICACHE_ACCESSES_C0 (9U) -+/* Icache misses in COUNTER1. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_ICACHE_MISSES_C1 (9U) -+ -+/* Dcache accesses in COUNTER0. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_DCACHE_ACCESSES_C0 (10U) -+/* Dcache misses in COUNTER1. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_DCACHE_MISSES_C1 (11U) -+ -+/* ITLB instruction accesses in COUNTER0. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_ITLB_INSTR_ACCESSES_C0 (5U) -+/* JTLB instruction accesses misses in COUNTER1. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_JTLB_INSTR_MISSES_C1 (7U) -+ -+ /* Instructions completed in COUNTER0. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_INSTR_COMPLETED_C0 (1U) -+/* JTLB data misses in COUNTER1. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_JTLB_DATA_MISSES_C1 (8U) -+ -+/* Shift for the Event field in the MIPS perf ctrl registers. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_EVENT_SHIFT (5U) -+ -+/* Additional flags for performance counters. See MIPS manual for further reference. */ -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_COUNT_USER_MODE (8U) -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_COUNT_KERNEL_MODE (2U) -+#define ROGUE_MIPSFW_PERF_COUNT_CTRL_COUNT_EXL (1U) -+ -+#define ROGUE_MIPSFW_C0_NBHWIRQ 8 -+ -+/* Macros to decode C0_Cause register. */ -+#define ROGUE_MIPSFW_C0_CAUSE_EXCCODE(cause) (((cause) & 0x7c) >> 2) -+#define ROGUE_MIPSFW_C0_CAUSE_EXCCODE_FWERROR 9 -+/* Use only when Coprocessor Unusable exception. */ -+#define ROGUE_MIPSFW_C0_CAUSE_UNUSABLE_UNIT(cause) (((cause) >> 28) & 0x3) -+#define ROGUE_MIPSFW_C0_CAUSE_PENDING_HWIRQ(cause) (((cause) & 0x3fc00) >> 10) -+#define ROGUE_MIPSFW_C0_CAUSE_FDCIPENDING (1 << 21) -+#define ROGUE_MIPSFW_C0_CAUSE_IV (1 << 23) -+#define ROGUE_MIPSFW_C0_CAUSE_IC (1 << 25) -+#define ROGUE_MIPSFW_C0_CAUSE_PCIPENDING (1 << 26) -+#define ROGUE_MIPSFW_C0_CAUSE_TIPENDING (1 << 30) -+#define ROGUE_MIPSFW_C0_CAUSE_BRANCH_DELAY (1 << 31) -+ -+/* Macros to decode C0_Debug register. */ -+#define ROGUE_MIPSFW_C0_DEBUG_EXCCODE(debug) (((debug) >> 10) & 0x1f) -+#define ROGUE_MIPSFW_C0_DEBUG_DSS (1 << 0) -+#define ROGUE_MIPSFW_C0_DEBUG_DBP (1 << 1) -+#define ROGUE_MIPSFW_C0_DEBUG_DDBL (1 << 2) -+#define ROGUE_MIPSFW_C0_DEBUG_DDBS (1 << 3) -+#define ROGUE_MIPSFW_C0_DEBUG_DIB (1 << 4) -+#define ROGUE_MIPSFW_C0_DEBUG_DINT (1 << 5) -+#define ROGUE_MIPSFW_C0_DEBUG_DIBIMPR (1 << 6) -+#define ROGUE_MIPSFW_C0_DEBUG_DDBLIMPR (1 << 18) -+#define ROGUE_MIPSFW_C0_DEBUG_DDBSIMPR (1 << 19) -+#define ROGUE_MIPSFW_C0_DEBUG_IEXI (1 << 20) -+#define ROGUE_MIPSFW_C0_DEBUG_DBUSEP (1 << 21) -+#define ROGUE_MIPSFW_C0_DEBUG_CACHEEP (1 << 22) -+#define ROGUE_MIPSFW_C0_DEBUG_MCHECKP (1 << 23) -+#define ROGUE_MIPSFW_C0_DEBUG_IBUSEP (1 << 24) -+#define ROGUE_MIPSFW_C0_DEBUG_DM (1 << 30) -+#define ROGUE_MIPSFW_C0_DEBUG_DBD (1 << 31) -+ -+/* Macros to decode TLB entries. */ -+#define ROGUE_MIPSFW_TLB_GET_MASK(page_mask) (((page_mask) >> 13) & 0XFFFFU) -+/* Page size in KB. */ -+#define ROGUE_MIPSFW_TLB_GET_PAGE_SIZE(page_mask) ((((page_mask) | 0x1FFF) + 1) >> 11) -+/* Page size in KB. */ -+#define ROGUE_MIPSFW_TLB_GET_PAGE_MASK(page_size) ((((page_size) << 11) - 1) & ~0x7FF) -+#define ROGUE_MIPSFW_TLB_GET_VPN2(entry_hi) ((entry_hi) >> 13) -+#define ROGUE_MIPSFW_TLB_GET_COHERENCY(entry_lo) (((entry_lo) >> 3) & 0x7U) -+#define ROGUE_MIPSFW_TLB_GET_PFN(entry_lo) (((entry_lo) >> 6) & 0XFFFFFU) -+/* GET_PA uses a non-standard PFN mask for 36 bit addresses. */ -+#define ROGUE_MIPSFW_TLB_GET_PA(entry_lo) (((u64)(entry_lo) & \ -+ ROGUE_MIPSFW_ENTRYLO_PFN_MASK_ABOVE_32BIT) << 6) -+#define ROGUE_MIPSFW_TLB_GET_INHIBIT(entry_lo) (((entry_lo) >> 30) & 0x3U) -+#define ROGUE_MIPSFW_TLB_GET_DGV(entry_lo) ((entry_lo) & 0x7U) -+#define ROGUE_MIPSFW_TLB_GLOBAL (1U) -+#define ROGUE_MIPSFW_TLB_VALID (1U << 1) -+#define ROGUE_MIPSFW_TLB_DIRTY (1U << 2) -+#define ROGUE_MIPSFW_TLB_XI (1U << 30) -+#define ROGUE_MIPSFW_TLB_RI (1U << 31) -+ -+#define ROGUE_MIPSFW_REMAP_GET_REGION_SIZE(region_size_encoding) (1 << (((region_size_encoding) \ -+ + 1) << 1)) -+ -+struct rogue_mips_tlb_entry { -+ u32 tlb_page_mask; -+ u32 tlb_hi; -+ u32 tlb_lo0; -+ u32 tlb_lo1; -+}; -+ -+struct rogue_mips_remap_entry { -+ u32 remap_addr_in; /* Always 4k aligned. */ -+ u32 remap_addr_out; /* Always 4k aligned. */ -+ u32 remap_region_size; -+}; -+ -+struct rogue_mips_state { -+ u32 error_state; /* This must come first in the structure. */ -+ u32 error_epc; -+ u32 status_register; -+ u32 cause_register; -+ u32 bad_register; -+ u32 epc; -+ u32 sp; -+ u32 debug; -+ u32 depc; -+ u32 bad_instr; -+ u32 unmapped_address; -+ struct rogue_mips_tlb_entry tlb[ROGUE_MIPSFW_NUMBER_OF_TLB_ENTRIES]; -+ struct rogue_mips_remap_entry remap[ROGUE_MIPSFW_NUMBER_OF_REMAP_ENTRIES]; -+}; -+ -+#endif /* __PVR_ROGUE_MIPS_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_rogue_mmu_defs.h b/drivers/gpu/drm/imagination/pvr_rogue_mmu_defs.h -new file mode 100644 -index 000000000000..040978f40cdb ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_rogue_mmu_defs.h -@@ -0,0 +1,136 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+/* *** Autogenerated C -- do not edit *** */ -+ -+#ifndef __PVR_ROGUE_MMU_DEFS_H__ -+#define __PVR_ROGUE_MMU_DEFS_H__ -+ -+#define ROGUE_MMU_DEFS_REVISION 0 -+ -+#define ROGUE_BIF_DM_ENCODING_VERTEX (0x00000000U) -+#define ROGUE_BIF_DM_ENCODING_PIXEL (0x00000001U) -+#define ROGUE_BIF_DM_ENCODING_COMPUTE (0x00000002U) -+#define ROGUE_BIF_DM_ENCODING_TLA (0x00000003U) -+#define ROGUE_BIF_DM_ENCODING_PB_VCE (0x00000004U) -+#define ROGUE_BIF_DM_ENCODING_PB_TE (0x00000005U) -+#define ROGUE_BIF_DM_ENCODING_META (0x00000007U) -+#define ROGUE_BIF_DM_ENCODING_HOST (0x00000008U) -+#define ROGUE_BIF_DM_ENCODING_PM_ALIST (0x00000009U) -+ -+#define ROGUE_MMUCTRL_VADDR_PT_L2_INDEX_SHIFT (30U) -+#define ROGUE_MMUCTRL_VADDR_PT_L2_INDEX_CLRMSK (0xFFFFFF003FFFFFFFULL) -+#define ROGUE_MMUCTRL_VADDR_PT_L1_INDEX_SHIFT (21U) -+#define ROGUE_MMUCTRL_VADDR_PT_L1_INDEX_CLRMSK (0xFFFFFFFFC01FFFFFULL) -+#define ROGUE_MMUCTRL_VADDR_PT_L0_INDEX_SHIFT (12U) -+#define ROGUE_MMUCTRL_VADDR_PT_L0_INDEX_CLRMSK (0xFFFFFFFFFFE00FFFULL) -+ -+#define ROGUE_MMUCTRL_ENTRIES_PT_L2_VALUE (0x00000400U) -+#define ROGUE_MMUCTRL_ENTRIES_PT_L1_VALUE (0x00000200U) -+#define ROGUE_MMUCTRL_ENTRIES_PT_L0_VALUE (0x00000200U) -+ -+#define ROGUE_MMUCTRL_ENTRY_SIZE_PT_L2_VALUE (0x00000020U) -+#define ROGUE_MMUCTRL_ENTRY_SIZE_PT_L1_VALUE (0x00000040U) -+#define ROGUE_MMUCTRL_ENTRY_SIZE_PT_L0_VALUE (0x00000040U) -+ -+#define ROGUE_MMUCTRL_PAGE_SIZE_MASK (0x00000007U) -+#define ROGUE_MMUCTRL_PAGE_SIZE_4KB (0x00000000U) -+#define ROGUE_MMUCTRL_PAGE_SIZE_16KB (0x00000001U) -+#define ROGUE_MMUCTRL_PAGE_SIZE_64KB (0x00000002U) -+#define ROGUE_MMUCTRL_PAGE_SIZE_256KB (0x00000003U) -+#define ROGUE_MMUCTRL_PAGE_SIZE_1MB (0x00000004U) -+#define ROGUE_MMUCTRL_PAGE_SIZE_2MB (0x00000005U) -+ -+#define ROGUE_MMUCTRL_PAGE_4KB_RANGE_SHIFT (12U) -+#define ROGUE_MMUCTRL_PAGE_4KB_RANGE_CLRMSK (0xFFFFFF0000000FFFULL) -+ -+#define ROGUE_MMUCTRL_PAGE_16KB_RANGE_SHIFT (14U) -+#define ROGUE_MMUCTRL_PAGE_16KB_RANGE_CLRMSK (0xFFFFFF0000003FFFULL) -+ -+#define ROGUE_MMUCTRL_PAGE_64KB_RANGE_SHIFT (16U) -+#define ROGUE_MMUCTRL_PAGE_64KB_RANGE_CLRMSK (0xFFFFFF000000FFFFULL) -+ -+#define ROGUE_MMUCTRL_PAGE_256KB_RANGE_SHIFT (18U) -+#define ROGUE_MMUCTRL_PAGE_256KB_RANGE_CLRMSK (0xFFFFFF000003FFFFULL) -+ -+#define ROGUE_MMUCTRL_PAGE_1MB_RANGE_SHIFT (20U) -+#define ROGUE_MMUCTRL_PAGE_1MB_RANGE_CLRMSK (0xFFFFFF00000FFFFFULL) -+ -+#define ROGUE_MMUCTRL_PAGE_2MB_RANGE_SHIFT (21U) -+#define ROGUE_MMUCTRL_PAGE_2MB_RANGE_CLRMSK (0xFFFFFF00001FFFFFULL) -+ -+#define ROGUE_MMUCTRL_PT_L0_BASE_4KB_RANGE_SHIFT (12U) -+#define ROGUE_MMUCTRL_PT_L0_BASE_4KB_RANGE_CLRMSK (0xFFFFFF0000000FFFULL) -+ -+#define ROGUE_MMUCTRL_PT_L0_BASE_16KB_RANGE_SHIFT (10U) -+#define ROGUE_MMUCTRL_PT_L0_BASE_16KB_RANGE_CLRMSK (0xFFFFFF00000003FFULL) -+ -+#define ROGUE_MMUCTRL_PT_L0_BASE_64KB_RANGE_SHIFT (8U) -+#define ROGUE_MMUCTRL_PT_L0_BASE_64KB_RANGE_CLRMSK (0xFFFFFF00000000FFULL) -+ -+#define ROGUE_MMUCTRL_PT_L0_BASE_256KB_RANGE_SHIFT (6U) -+#define ROGUE_MMUCTRL_PT_L0_BASE_256KB_RANGE_CLRMSK (0xFFFFFF000000003FULL) -+ -+#define ROGUE_MMUCTRL_PT_L0_BASE_1MB_RANGE_SHIFT (5U) -+#define ROGUE_MMUCTRL_PT_L0_BASE_1MB_RANGE_CLRMSK (0xFFFFFF000000001FULL) -+ -+#define ROGUE_MMUCTRL_PT_L0_BASE_2MB_RANGE_SHIFT (5U) -+#define ROGUE_MMUCTRL_PT_L0_BASE_2MB_RANGE_CLRMSK (0xFFFFFF000000001FULL) -+ -+#define ROGUE_MMUCTRL_PT_L0_DATA_PM_META_PROTECT_SHIFT (62U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_PM_META_PROTECT_CLRMSK (0xBFFFFFFFFFFFFFFFULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_PM_META_PROTECT_EN (0x4000000000000000ULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_VP_PAGE_HI_SHIFT (40U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_VP_PAGE_HI_CLRMSK (0xC00000FFFFFFFFFFULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_PAGE_SHIFT (12U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_PAGE_CLRMSK (0xFFFFFF0000000FFFULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_VP_PAGE_LO_SHIFT (6U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_VP_PAGE_LO_CLRMSK (0xFFFFFFFFFFFFF03FULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_ENTRY_PENDING_SHIFT (5U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_ENTRY_PENDING_CLRMSK (0xFFFFFFFFFFFFFFDFULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_ENTRY_PENDING_EN (0x0000000000000020ULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_PM_SRC_SHIFT (4U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_PM_SRC_CLRMSK (0xFFFFFFFFFFFFFFEFULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_PM_SRC_EN (0x0000000000000010ULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_SLC_BYPASS_CTRL_SHIFT (3U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_SLC_BYPASS_CTRL_CLRMSK (0xFFFFFFFFFFFFFFF7ULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_SLC_BYPASS_CTRL_EN (0x0000000000000008ULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_CC_SHIFT (2U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_CC_CLRMSK (0xFFFFFFFFFFFFFFFBULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_CC_EN (0x0000000000000004ULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_READ_ONLY_SHIFT (1U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_READ_ONLY_CLRMSK (0xFFFFFFFFFFFFFFFDULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_READ_ONLY_EN (0x0000000000000002ULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_VALID_SHIFT (0U) -+#define ROGUE_MMUCTRL_PT_L0_DATA_VALID_CLRMSK (0xFFFFFFFFFFFFFFFEULL) -+#define ROGUE_MMUCTRL_PT_L0_DATA_VALID_EN (0x0000000000000001ULL) -+ -+#define ROGUE_MMUCTRL_PT_L1_DATA_ENTRY_PENDING_SHIFT (40U) -+#define ROGUE_MMUCTRL_PT_L1_DATA_ENTRY_PENDING_CLRMSK (0xFFFFFEFFFFFFFFFFULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_ENTRY_PENDING_EN (0x0000010000000000ULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PT_L0_BASE_SHIFT (5U) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PT_L0_BASE_CLRMSK (0xFFFFFF000000001FULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_SHIFT (1U) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_CLRMSK (0xFFFFFFFFFFFFFFF1ULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_4KB (0x0000000000000000ULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_16KB (0x0000000000000002ULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_64KB (0x0000000000000004ULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_256KB (0x0000000000000006ULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_1MB (0x0000000000000008ULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_PAGE_SIZE_2MB (0x000000000000000aULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_VALID_SHIFT (0U) -+#define ROGUE_MMUCTRL_PT_L1_DATA_VALID_CLRMSK (0xFFFFFFFFFFFFFFFEULL) -+#define ROGUE_MMUCTRL_PT_L1_DATA_VALID_EN (0x0000000000000001ULL) -+ -+#define ROGUE_MMUCTRL_PT_L2_DATA_PT_L1_BASE_SHIFT (4U) -+#define ROGUE_MMUCTRL_PT_L2_DATA_PT_L1_BASE_CLRMSK (0x0000000FU) -+#define ROGUE_MMUCTRL_PT_L2_DATA_PT_L1_BASE_ALIGNSHIFT (12U) -+#define ROGUE_MMUCTRL_PT_L2_DATA_PT_L1_BASE_ALIGNSIZE (4096U) -+#define ROGUE_MMUCTRL_PT_L2_DATA_ENTRY_PENDING_SHIFT (1U) -+#define ROGUE_MMUCTRL_PT_L2_DATA_ENTRY_PENDING_CLRMSK (0xFFFFFFFDU) -+#define ROGUE_MMUCTRL_PT_L2_DATA_ENTRY_PENDING_EN (0x00000002U) -+#define ROGUE_MMUCTRL_PT_L2_DATA_VALID_SHIFT (0U) -+#define ROGUE_MMUCTRL_PT_L2_DATA_VALID_CLRMSK (0xFFFFFFFEU) -+#define ROGUE_MMUCTRL_PT_L2_DATA_VALID_EN (0x00000001U) -+ -+#endif /* __PVR_ROGUE_MMU_DEFS_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_vendor.h b/drivers/gpu/drm/imagination/pvr_vendor.h -new file mode 100644 -index 000000000000..fa52e21f4bbc ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_vendor.h -@@ -0,0 +1,77 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_VENDOR_H__ -+#define __PVR_VENDOR_H__ -+ -+/* Forward declaration from "pvr_device.h". */ -+struct pvr_device; -+ -+/** -+ * struct pvr_vendor_callbacks - Vendor-specific callbacks -+ */ -+struct pvr_vendor_callbacks { -+ /** -+ * @init: Initialise vendor-specific functionality -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This callback should initialise any vendor-specific data in @pvr_dev->vendor.data, and -+ * retrieve any required resources. It should not attempt to power on the GPU or interact -+ * with the GPU hardware in any way. -+ * -+ * This callback is optional. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any negative error (see individual implementations for details). -+ */ -+ int (*init)(struct pvr_device *pvr_dev); -+ -+ /** -+ * @fini: Close vendor-specific functionality -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This callback is optional. -+ */ -+ void (*fini)(struct pvr_device *pvr_dev); -+ -+ /** -+ * @power_enable: Enable GPU power -+ * @pvr_dev: Target PowerVR device. -+ * -+ * On function entry the GPU clocks in device tree will be enabled, but the GPU will -+ * otherwise be unpowered. -+ * -+ * On function exit the GPU will be fully powered and the register file will be accessible. -+ * -+ * This callback is optional. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if the GPU was already powered, or -+ * * -%EBUSY if the GPU fails to power on. -+ */ -+ int (*power_enable)(struct pvr_device *pvr_dev); -+ -+ /** -+ * @power_disable: Disable GPU power -+ * @pvr_dev: Target PowerVR device. -+ * -+ * On function entry the GPU will be fully powered. -+ * -+ * On function exit the GPU will be unpowered. This function will not affect the clocks -+ * defined in device tree; the driver will disable these later. -+ * -+ * This callback is optional. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * -%EINVAL if the GPU was already unpowered, or -+ * * -%EBUSY if the GPU fails to power off. -+ */ -+ int (*power_disable)(struct pvr_device *pvr_dev); -+}; -+ -+extern const struct pvr_vendor_callbacks pvr_mt8173_callbacks; -+ -+#endif /* __PVR_VENDOR_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_vm.c b/drivers/gpu/drm/imagination/pvr_vm.c -new file mode 100644 -index 000000000000..e2daa99427a9 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_vm.c -@@ -0,0 +1,4177 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_vm.h" -+ -+#include "pvr_device.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_heap_config.h" -+#include "pvr_rogue_mmu_defs.h" -+ -+#include <drm/drm_gem.h> -+ -+#include <linux/bitops.h> -+#include <linux/compiler_attributes.h> -+#include <linux/dma-direction.h> -+#include <linux/dma-mapping.h> -+#include <linux/err.h> -+#include <linux/errno.h> -+#include <linux/gfp.h> -+#include <linux/highmem.h> -+#include <linux/interval_tree_generic.h> -+#include <linux/kernel.h> -+#include <linux/limits.h> -+#include <linux/lockdep.h> -+#include <linux/math.h> -+#include <linux/mutex.h> -+#include <linux/overflow.h> -+#include <linux/rbtree.h> -+#include <linux/scatterlist.h> -+#include <linux/sizes.h> -+#include <linux/slab.h> -+#include <linux/stddef.h> -+#include <linux/string.h> -+#include <linux/types.h> -+ -+struct pvr_vm_mapping; -+ -+static int -+pvr_vm_mapping_unmap(struct pvr_vm_context *vm_ctx, struct pvr_vm_mapping *mapping); -+static void -+pvr_vm_mapping_fini(struct pvr_vm_mapping *mapping); -+ -+/** -+ * pvr_mmu_flush() - Request flush of MMU caches -+ * @pvr_dev: Target PowerVR device -+ * -+ * This must be called following any possible change to the MMU page tables. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_kccb_send_cmd(), or -+ * * Any error returned by pvr_kccb_wait_for_completion(). -+ */ -+int -+pvr_vm_mmu_flush(struct pvr_device *pvr_dev) -+{ -+ struct rogue_fwif_kccb_cmd cmd_mmu_cache; -+ struct rogue_fwif_mmucachedata *cmd_mmu_cache_data = -+ &cmd_mmu_cache.cmd_data.mmu_cache_data; -+ u32 slot; -+ int err; -+ -+ /* Can't flush MMU if the firmware hasn't booted yet. */ -+ if (!pvr_dev->fw_booted) { -+ err = 0; -+ goto err_out; -+ } -+ -+ cmd_mmu_cache.cmd_type = ROGUE_FWIF_KCCB_CMD_MMUCACHE; -+ /* Request a complete MMU flush, across all pagetable levels, TLBs and contexts. */ -+ cmd_mmu_cache_data->cache_flags = ROGUE_FWIF_MMUCACHEDATA_FLAGS_PT | -+ ROGUE_FWIF_MMUCACHEDATA_FLAGS_PD | -+ ROGUE_FWIF_MMUCACHEDATA_FLAGS_PC | -+ ROGUE_FWIF_MMUCACHEDATA_FLAGS_TLB | -+ ROGUE_FWIF_MMUCACHEDATA_FLAGS_INTERRUPT; -+ WARN_ON(!pvr_gem_get_fw_addr(pvr_dev->fw_mmucache_sync_obj, -+ &cmd_mmu_cache_data->mmu_cache_sync_fw_addr)); -+ cmd_mmu_cache_data->mmu_cache_sync_update_value = 0; -+ -+ err = pvr_kccb_send_cmd(pvr_dev, &cmd_mmu_cache, &slot); -+ if (err) -+ goto err_out; -+ -+ err = pvr_kccb_wait_for_completion(pvr_dev, slot, HZ); -+ if (err) -+ goto err_out; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * DOC: PowerVR Virtual Memory Handling -+ * -+ * There's a lot going on in this section... TODO -+ * -+ * .. admonition:: Note on page table naming -+ * -+ * This file uses a different naming convention for page table levels than -+ * the original DDK materials. Since page table implementation details are -+ * not exposed outside this file, the description of the name mapping exists -+ * here in its normative form: -+ * -+ * * L0 page table => DDK page table -+ * * L1 page table => DDK page directory -+ * * L2 page table => DDK page catalog -+ * -+ * The variable/function naming convention in this file is -+ * ``page_table_lx_*`` where x is either ``0``, ``1`` or ``2`` to represent -+ * the level of the page table structure. The name ``page_table_*`` without -+ * the ``_lx`` suffix is used for references to the entire tree structure -+ * including all three levels, or an operation or value which is -+ * level-agnostic. -+ */ -+ -+/** -+ * PVR_IDX_INVALID - Default value for a u16-based index. -+ * -+ * This value cannot be zero, since zero is a valid index value. -+ */ -+#define PVR_IDX_INVALID ((u16)(-1)) -+ -+/** -+ * DOC: VM backing pages -+ * -+ * While the page tables hold memory accessible to the rest of the driver, -+ * the page tables themselves must have memory allocated to back them. We -+ * call this memory "VM backing pages". Conveniently, each page table is -+ * (currently) exactly 4KiB, as defined by %PVR_VM_BACKING_PAGE_SIZE. We -+ * currently support any CPU page size of this size or greater by ignoring -+ * any space after the first 4KiB of a CPU page allocated as a VM backing page. -+ * -+ * .. admonition:: Future work -+ * -+ * We should be able to efficiently support CPU page sizes greater than 4KiB -+ * by allocating multiple page tables to each CPU page. It is unlikely -+ * that we will ever need to support CPU page sizes less than 4KiB. -+ * -+ * Usage -+ * ----- -+ * To add this functionality to a structure which wraps a raw page table, embed -+ * an instance of &struct pvr_vm_backing_page in the wrapper struct. Call -+ * pvr_vm_backing_page_init() to allocate and map the backing page, and -+ * pvr_vm_backing_page_fini() to perform the reverse operations when you're -+ * finished with it. Use pvr_vm_backing_page_sync() to flush the memory from -+ * the host to the device. As this is an expensive operation (calling out to -+ * dma_sync_single_for_device()), be sure to perform all necessary changes to -+ * the backing memory before calling it. -+ * -+ * Between calls to pvr_vm_backing_page_init() and pvr_vm_backing_page_fini(), -+ * the public fields of &struct pvr_vm_backing_page can be used to access the -+ * allocated page. To access the memory from the CPU, use -+ * &pvr_vm_backing_page.host_ptr. For an address which can be passed to the -+ * device, use &pvr_vm_backing_page.dma_addr. -+ * -+ * It is expected that the embedded &struct pvr_vm_backing_page will be zeroed -+ * before calling pvr_vm_backing_page_init(). In return, -+ * pvr_vm_backing_page_fini() will re-zero it before returning. You can -+ * therefore compare the value of either &pvr_vm_backing_page.dma_addr or -+ * &pvr_vm_backing_page.host_ptr to zero or %NULL to check if the backing -+ * page is ready for use. -+ * -+ * .. note:: This API is not expected to be exposed outside ``pvr_vm.c``. -+ */ -+/** -+ * DOC: VM backing pages (constants) -+ * -+ * .. c:macro:: PVR_VM_BACKING_PAGE_SIZE -+ * -+ * Page size of a PowerVR device's integrated MMU. The CPU page size must be -+ * at least as large as this value for the current implementation; this is -+ * checked at compile-time. -+ */ -+ -+/** -+ * PVR_VM_BACKING_PAGE_SIZE - Page size of a PowerVR device's integrated MMU. -+ * -+ * *This doc comment is not rendered - see DOC: VM backing pages (constants).* -+ */ -+#define PVR_VM_BACKING_PAGE_SIZE SZ_4K -+static_assert(PAGE_SIZE >= PVR_VM_BACKING_PAGE_SIZE); -+ -+/** -+ * struct pvr_vm_backing_page - Represents a single page used to back a page -+ * table of any level. -+ */ -+struct pvr_vm_backing_page { -+ /** @dma_addr: DMA (quasi-physical) address of this page. */ -+ dma_addr_t dma_addr; -+ /** @host_ptr: CPU address of this page. */ -+ void *host_ptr; -+ -+ /** -+ * @pvr_dev: The PowerVR device to which this page is associated. -+ * **For internal use only.** -+ */ -+ struct pvr_device *pvr_dev; -+}; -+ -+/** -+ * pvr_vm_backing_page_init() - Initialize a VM backing page. -+ * @page: Target backing page. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * This function performs three distinct operations: -+ * -+ * 1. Allocate a single page, -+ * 2. Map the page to the CPU, and -+ * 3. Map the page to DMA-space. -+ * -+ * It is expected that @page be zeroed (e.g. from kzalloc()) before calling -+ * this function. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%ENOMEM if allocation of the backing page or mapping of the backing -+ * page to DMA fails. -+ */ -+static int -+pvr_vm_backing_page_init(struct pvr_vm_backing_page *page, -+ struct pvr_device *pvr_dev) -+{ -+ struct device *dev = from_pvr_device(pvr_dev)->dev; -+ -+ struct page *raw_page; -+ int err; -+ -+ dma_addr_t dma_addr; -+ void *host_ptr; -+ -+ raw_page = alloc_page(__GFP_ZERO | GFP_KERNEL); -+ if (!raw_page) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ host_ptr = kmap(raw_page); -+ -+ dma_addr = dma_map_page(dev, raw_page, 0, PVR_VM_BACKING_PAGE_SIZE, -+ DMA_TO_DEVICE); -+ if (dma_mapping_error(dev, dma_addr)) { -+ err = -ENOMEM; -+ goto err_unmap_free_page; -+ } -+ -+ page->dma_addr = dma_addr; -+ page->host_ptr = host_ptr; -+ page->pvr_dev = pvr_dev; -+ -+ return 0; -+ -+err_unmap_free_page: -+ kunmap(raw_page); -+ __free_page(raw_page); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_backing_page_fini() - Teardown a VM backing page. -+ * @page: Target backing page. -+ * -+ * This function performs the mirror operations to pvr_vm_backing_page_init(), -+ * in reverse order: -+ * -+ * 1. Unmap the page from DMA-space, -+ * 2. Unmap the page from the CPU, and -+ * 3. Free the page. -+ * -+ * It also zeros @page. -+ * -+ * It is a no-op to call this function a second (or further) time on any @page. -+ */ -+static void -+pvr_vm_backing_page_fini(struct pvr_vm_backing_page *page) -+{ -+ struct device *dev = from_pvr_device(page->pvr_dev)->dev; -+ struct page *raw_page = kmap_to_page(page->host_ptr); -+ -+ /* Do nothing if no allocation is present. */ -+ if (!page->pvr_dev) -+ return; -+ -+ dma_unmap_page(dev, page->dma_addr, PVR_VM_BACKING_PAGE_SIZE, -+ DMA_TO_DEVICE); -+ -+ kunmap(raw_page); -+ -+ __free_page(raw_page); -+ -+ memset(page, 0, sizeof(*page)); -+} -+ -+/** -+ * pvr_vm_backing_page_sync() - Flush a VM backing page from the CPU to the -+ * device. -+ * @page: Target backing page. -+ * -+ * .. caution:: -+ * -+ * **This is an expensive function call.** Only call -+ * pvr_vm_backing_page_sync() once you're sure you have no more changes to -+ * make to the backing page in the immediate future. -+ */ -+static void -+pvr_vm_backing_page_sync(struct pvr_vm_backing_page *page) -+{ -+ struct device *dev; -+ -+ /* -+ * Do nothing if no allocation is present. This may be the case if -+ * we are unmapping pages. -+ */ -+ if (!page->pvr_dev) -+ return; -+ -+ dev = from_pvr_device(page->pvr_dev)->dev; -+ -+ dma_sync_single_for_device(dev, page->dma_addr, -+ PVR_VM_BACKING_PAGE_SIZE, DMA_TO_DEVICE); -+} -+ -+/** -+ * DOC: Raw page tables -+ * -+ * These types define the lowest level representation of the page table -+ * structure. This is the format which a PowerVR device's MMU can interpret -+ * directly. As such, their definitions are taken directly from hardware -+ * documentation. -+ * -+ * To store additional information required by the driver, we use -+ * :ref:`mirror page tables<Mirror page tables>`. In most cases, the mirror -+ * types are the ones you want to use for handles. -+ */ -+ -+#define PVR_PAGE_TABLE_TYPEOF_ENTRY(level_) \ -+ typeof_member(struct pvr_page_table_l##level_##_entry_raw, val) -+ -+#define PVR_PAGE_TABLE_FIELD_GET(level_, field_, entry_) \ -+ (((entry_).val & \ -+ ~ROGUE_MMUCTRL_PT_L##level_##_DATA_##field_##_CLRMSK) >> \ -+ ROGUE_MMUCTRL_PT_L##level_##_DATA_##field_##_SHIFT) -+ -+#define PVR_PAGE_TABLE_FIELD_PREP(level_, field_, val_) \ -+ ((((PVR_PAGE_TABLE_TYPEOF_ENTRY(level_))(val_)) \ -+ << ROGUE_MMUCTRL_PT_L##level_##_DATA_##field_##_SHIFT) & \ -+ ~ROGUE_MMUCTRL_PT_L##level_##_DATA_##field_##_CLRMSK) -+ -+/** -+ * struct pvr_page_table_l2_entry_raw - A single entry in a level 2 page table. -+ * -+ * This type is a structure for type-checking purposes. At compile-time, its -+ * size is checked against %ROGUE_MMUCTRL_ENTRY_SIZE_PC_VALUE. -+ * -+ * The value stored in this structure can be decoded using the following bitmap: -+ * -+ * .. flat-table:: -+ * :widths: 1 5 -+ * :stub-columns: 1 -+ * -+ * * - 31..4 -+ * - **Level 1 Page Table Base Address:** Bits 39..12 of the L1 -+ * page table base address, which is 4KiB aligned. -+ * -+ * * - 3..2 -+ * - *(reserved)* -+ * -+ * * - 1 -+ * - **Pending:** When valid bit is not set, indicates that a valid -+ * entry is pending and the MMU should wait for the driver to map -+ * the entry. This is used to support page demand mapping of -+ * memory. -+ * -+ * * - 0 -+ * - **Valid:** Indicates that the entry contains a valid L1 page -+ * table. If the valid bit is not set, then an attempted use of -+ * the page would result in a page fault. -+ */ -+struct pvr_page_table_l2_entry_raw { -+ /** @val: The raw value of this entry. */ -+ u32 val; -+} __packed; -+static_assert(sizeof(struct pvr_page_table_l2_entry_raw) * 8 == -+ ROGUE_MMUCTRL_ENTRY_SIZE_PT_L2_VALUE); -+ -+static __always_inline bool -+pvr_page_table_l2_entry_raw_is_valid(struct pvr_page_table_l2_entry_raw entry) -+{ -+ return PVR_PAGE_TABLE_FIELD_GET(2, VALID, entry); -+} -+ -+static __always_inline void -+pvr_page_table_l2_entry_raw_set(struct pvr_page_table_l2_entry_raw *entry, -+ dma_addr_t child_table_dma_addr) -+{ -+ child_table_dma_addr >>= ROGUE_MMUCTRL_PT_L2_DATA_PT_L1_BASE_ALIGNSHIFT; -+ -+ entry->val = -+ PVR_PAGE_TABLE_FIELD_PREP(2, VALID, true) | -+ PVR_PAGE_TABLE_FIELD_PREP(2, ENTRY_PENDING, false) | -+ PVR_PAGE_TABLE_FIELD_PREP(2, PT_L1_BASE, child_table_dma_addr); -+} -+ -+static __always_inline void -+pvr_page_table_l2_entry_raw_clear(struct pvr_page_table_l2_entry_raw *entry) -+{ -+ entry->val = 0; -+} -+ -+/** -+ * struct pvr_page_table_l1_entry_raw - A single entry in a level 1 page table. -+ * -+ * This type is a structure for type-checking purposes. At compile-time, its -+ * size is checked against %ROGUE_MMUCTRL_ENTRY_SIZE_PD_VALUE. -+ * -+ * The value stored in this structure can be decoded using the following bitmap: -+ * -+ * .. flat-table:: -+ * :widths: 1 5 -+ * :stub-columns: 1 -+ * -+ * * - 63..41 -+ * - *(reserved)* -+ * -+ * * - 40 -+ * - **Pending:** When valid bit is not set, indicates that a valid entry -+ * is pending and the MMU should wait for the driver to map the entry. -+ * This is used to support page demand mapping of memory. -+ * -+ * * - 39..5 -+ * - **Level 0 Page Table Base Address:** The way this value is -+ * interpreted depends on the page size. Bits not specified in the -+ * table below (e.g. bits 11..5 for page size 4KiB) should be -+ * considered reserved. -+ * -+ * This table shows the bits used in an L1 page table entry to -+ * represent the Physical Table Base Address for a given Page Size. -+ * Since each L1 page table entry covers 2MiB of address space, the -+ * maximum page size is 2MiB. -+ * -+ * .. flat-table:: -+ * :widths: 1 1 1 1 -+ * :header-rows: 1 -+ * :stub-columns: 1 -+ * -+ * * - Page size -+ * - L0 page table base address bits -+ * - Number of L0 page table entries -+ * - Size of L0 page table -+ * -+ * * - 4KiB -+ * - 39..12 -+ * - 512 -+ * - 4KiB -+ * -+ * * - 16KiB -+ * - 39..10 -+ * - 128 -+ * - 1KiB -+ * -+ * * - 64KiB -+ * - 39..8 -+ * - 32 -+ * - 256B -+ * -+ * * - 256KiB -+ * - 39..6 -+ * - 8 -+ * - 64B -+ * -+ * * - 1MiB -+ * - 39..5 (4 = '0') -+ * - 2 -+ * - 16B -+ * -+ * * - 2MiB -+ * - 39..5 (4..3 = '00') -+ * - 1 -+ * - 8B -+ * -+ * * - 4 -+ * - *(reserved)* -+ * -+ * * - 3..1 -+ * - **Page Size:** Sets the page size, from 4KiB to 2MiB. -+ * -+ * * - 0 -+ * - **Valid:** Indicates that the entry contains a valid L0 page table. -+ * If the valid bit is not set, then an attempted use of the page would -+ * result in a page fault. -+ */ -+struct pvr_page_table_l1_entry_raw { -+ /** @val: The raw value of this entry. */ -+ u64 val; -+} __packed; -+static_assert(sizeof(struct pvr_page_table_l1_entry_raw) * 8 == -+ ROGUE_MMUCTRL_ENTRY_SIZE_PT_L1_VALUE); -+ -+static __always_inline bool -+pvr_page_table_l1_entry_raw_is_valid(struct pvr_page_table_l1_entry_raw entry) -+{ -+ return PVR_PAGE_TABLE_FIELD_GET(1, VALID, entry); -+} -+ -+static void -+pvr_page_table_l1_entry_raw_set(struct pvr_page_table_l1_entry_raw *entry, -+ dma_addr_t child_table_dma_addr) -+{ -+ entry->val = PVR_PAGE_TABLE_FIELD_PREP(1, VALID, true) | -+ PVR_PAGE_TABLE_FIELD_PREP(1, ENTRY_PENDING, false) | -+ PVR_PAGE_TABLE_FIELD_PREP(1, PAGE_SIZE, -+ ROGUE_MMUCTRL_PAGE_SIZE_4KB) | -+ (child_table_dma_addr & -+ ~ROGUE_MMUCTRL_PT_L0_BASE_4KB_RANGE_CLRMSK); -+} -+ -+static __always_inline void -+pvr_page_table_l1_entry_raw_clear(struct pvr_page_table_l1_entry_raw *entry) -+{ -+ entry->val = 0; -+} -+ -+/** -+ * struct pvr_page_table_l0_entry_raw - A single entry in a level 0 page table. -+ * -+ * This type is a structure for type-checking purposes. At compile-time, its -+ * size is checked against %ROGUE_MMUCTRL_ENTRY_SIZE_PT_VALUE. -+ * -+ * The value stored in this structure can be decoded using the following bitmap: -+ * -+ * .. flat-table:: -+ * :widths: 1 5 -+ * :stub-columns: 1 -+ * -+ * * - 63 -+ * - *(reserved)* -+ * -+ * * - 62 -+ * - **PM/FW Protect:** Indicates a protected region which only the -+ * Parameter Manager (PM) or firmware processor can write to. -+ * -+ * * - 61..40 -+ * - **VP Page (High):** Virtual-physical page used for Parameter Manager -+ * (PM) memory. This field is only used if the additional level of PB -+ * virtualization is enabled. The VP Page field is needed by the PM in -+ * order to correctly reconstitute the free lists after render -+ * completion. This (High) field holds bits 39..18 of the value; the -+ * Low field holds bits 17..12. Bits 11..0 are always zero because the -+ * value is always aligned to the 4KiB page size. -+ * -+ * * - 39..12 -+ * - **Physical Page Address:** he way this value is -+ * interpreted depends on the page size. Bits not specified in the -+ * table below (e.g. bits 20..12 for page size 2MiB) should be -+ * considered reserved. -+ * -+ * This table shows the bits used in an L0 page table entry to represent -+ * the Physical Page Address for a given page size (as defined in the -+ * associated L1 page table entry). -+ * -+ * .. flat-table:: -+ * :widths: 1 1 -+ * :header-rows: 1 -+ * :stub-columns: 1 -+ * -+ * * - Page size -+ * - Physical address bits -+ * -+ * * - 4KiB -+ * - 39..12 -+ * -+ * * - 16KiB -+ * - 39..14 -+ * -+ * * - 64KiB -+ * - 39..16 -+ * -+ * * - 256KiB -+ * - 39..18 -+ * -+ * * - 1MiB -+ * - 39..20 -+ * -+ * * - 2MiB -+ * - 39..21 -+ * -+ * * - 11..6 -+ * - **VP Page (Low):** Continuation of VP Page (High). -+ * -+ * * - 5 -+ * - **Pending:** When valid bit is not set, indicates that a valid entry -+ * is pending and the MMU should wait for the driver to map the entry. -+ * This is used to support page demand mapping of memory. -+ * -+ * * - 4 -+ * - **PM Src:** Set on Parameter Manager (PM) allocated page table -+ * entries when indicated by the PM. Note that this bit will only be set -+ * by the PM, not by the device driver. -+ * -+ * * - 3 -+ * - **SLC Bypass Control:** Specifies requests to this page should bypass -+ * the System Level Cache (SLC), if enabled in SLC configuration. -+ * -+ * * - 2 -+ * - **Cache Coherency:** Indicates that the page is coherent (i.e. it -+ * does not require a cache flush between operations on the CPU and the -+ * device). -+ * -+ * * - 1 -+ * - **Read Only:** If set, this bit indicates that the page is read only. -+ * An attempted write to this page would result in a write-protection -+ * fault. -+ * -+ * * - 0 -+ * - **Valid:** Indicates that the entry contains a valid page. If the -+ * valid bit is not set, then an attempted use of the page would result -+ * in a page fault. -+ */ -+struct pvr_page_table_l0_entry_raw { -+ /** @val: The raw value of this entry. */ -+ u64 val; -+} __packed; -+static_assert(sizeof(struct pvr_page_table_l0_entry_raw) * 8 == -+ ROGUE_MMUCTRL_ENTRY_SIZE_PT_L0_VALUE); -+ -+/** -+ * struct pvr_page_flags_raw - The configurable flags from a single entry in a -+ * level 0 page table. -+ * -+ * The flags stored in this type are: PM/FW Protect; SLC Bypass Control; Cache -+ * Coherency, and Read Only (bits 62, 3, 2 and 1 respectively). -+ */ -+struct pvr_page_flags_raw { -+ /** -+ * @val: The raw value of these flags. Since these are a strict subset -+ * of struct pvr_page_table_l0_entry_raw; use that type for our member -+ * here. -+ */ -+ struct pvr_page_table_l0_entry_raw val; -+} __packed; -+static_assert(sizeof(struct pvr_page_flags_raw) == -+ sizeof(struct pvr_page_table_l0_entry_raw)); -+ -+static __always_inline bool -+pvr_page_table_l0_entry_raw_is_valid(struct pvr_page_table_l0_entry_raw entry) -+{ -+ return PVR_PAGE_TABLE_FIELD_GET(0, VALID, entry); -+} -+ -+static void -+pvr_page_table_l0_entry_raw_set(struct pvr_page_table_l0_entry_raw *entry, -+ dma_addr_t dma_addr, -+ struct pvr_page_flags_raw flags) -+{ -+ entry->val = PVR_PAGE_TABLE_FIELD_PREP(0, VALID, true) | -+ PVR_PAGE_TABLE_FIELD_PREP(0, ENTRY_PENDING, false) | -+ (dma_addr & ~ROGUE_MMUCTRL_PAGE_4KB_RANGE_CLRMSK) | -+ flags.val.val; -+} -+ -+static __always_inline void -+pvr_page_table_l0_entry_raw_clear(struct pvr_page_table_l0_entry_raw *entry) -+{ -+ entry->val = 0; -+} -+ -+static struct pvr_page_flags_raw -+pvr_page_flags_raw_create(bool read_only, bool cache_coherent, bool slc_bypass, -+ bool pm_fw_protect) -+{ -+ struct pvr_page_flags_raw flags; -+ -+ flags.val.val = -+ PVR_PAGE_TABLE_FIELD_PREP(0, READ_ONLY, read_only) | -+ PVR_PAGE_TABLE_FIELD_PREP(0, CC, cache_coherent) | -+ PVR_PAGE_TABLE_FIELD_PREP(0, SLC_BYPASS_CTRL, slc_bypass) | -+ PVR_PAGE_TABLE_FIELD_PREP(0, PM_META_PROTECT, pm_fw_protect); -+ -+ return flags; -+} -+ -+/** -+ * struct pvr_page_table_l2_raw - The raw data of an L2 page table. -+ * -+ * This type is a structure for type-checking purposes. At compile-time, its -+ * size is checked against %PVR_VM_BACKING_PAGE_SIZE. -+ */ -+struct pvr_page_table_l2_raw { -+ /** @entries: The raw values of this table. */ -+ struct pvr_page_table_l2_entry_raw -+ entries[ROGUE_MMUCTRL_ENTRIES_PT_L2_VALUE]; -+} __packed; -+static_assert(sizeof(struct pvr_page_table_l2_raw) == PVR_VM_BACKING_PAGE_SIZE); -+ -+/** -+ * struct pvr_page_table_l1_raw - The raw data of an L1 page table. -+ * -+ * This type is a structure for type-checking purposes. At compile-time, its -+ * size is checked against %PVR_VM_BACKING_PAGE_SIZE. -+ */ -+struct pvr_page_table_l1_raw { -+ /** @entries: The raw values of this table. */ -+ struct pvr_page_table_l1_entry_raw -+ entries[ROGUE_MMUCTRL_ENTRIES_PT_L1_VALUE]; -+} __packed; -+static_assert(sizeof(struct pvr_page_table_l1_raw) == PVR_VM_BACKING_PAGE_SIZE); -+ -+/** -+ * struct pvr_page_table_l0_raw - The raw data of an L0 page table. -+ * -+ * This type is a structure for type-checking purposes. At compile-time, its -+ * size is checked against %PVR_VM_BACKING_PAGE_SIZE. -+ * -+ * .. caution:: -+ * -+ * The size of L0 page tables is variable depending on the page size -+ * specified in the associated L1 page table entry. For simplicity, this -+ * type is fixed to contain the maximum possible number of entries. -+ * **You should never read or write beyond the last supported entry.** -+ */ -+struct pvr_page_table_l0_raw { -+ /** @entries: The raw values of this table. */ -+ struct pvr_page_table_l0_entry_raw -+ entries[ROGUE_MMUCTRL_ENTRIES_PT_L0_VALUE]; -+} __packed; -+static_assert(sizeof(struct pvr_page_table_l0_raw) == PVR_VM_BACKING_PAGE_SIZE); -+ -+/** -+ * DOC: Mirror page tables -+ * -+ * These structures hold additional information required by the driver that -+ * cannot be stored in :ref:`raw page tables<Raw page tables>` (since those are -+ * defined by the hardware). -+ * -+ * In most cases, you should hold a handle to these types instead of the raw -+ * types directly. -+ */ -+ -+/* -+ * We pre-declare these types because they cross-depend on pointers to each -+ * other. -+ */ -+struct pvr_page_table_l2; -+struct pvr_page_table_l1; -+struct pvr_page_table_l0; -+ -+/** -+ * struct pvr_page_table_l2 - A wrapped L2 page table. -+ * -+ * To access the raw part of this table, use pvr_page_table_l2_get_raw(). -+ * Alternatively to access a raw entry directly, use -+ * pvr_page_table_l2_get_entry_raw(). -+ * -+ * An L2 page table forms the root of the page table tree structure, so this -+ * type has no &parent or &parent_idx members. -+ */ -+struct pvr_page_table_l2 { -+ /** -+ * @entries: The children of this node in the page table tree -+ * structure. These are also mirror tables. The indexing of this array -+ * is identical to that of the raw equivalent -+ * (&pvr_page_table_l1_raw.entries). -+ */ -+ struct pvr_page_table_l1 *entries[ROGUE_MMUCTRL_ENTRIES_PT_L2_VALUE]; -+ -+ /** -+ * @backing_page: A handle to the memory which holds the raw -+ * equivalent of this table. **For internal use only.** -+ */ -+ struct pvr_vm_backing_page backing_page; -+ -+ /** -+ * @entry_count: The current number of valid entries (that we know of) -+ * in this table. This value is essentially a refcount - the table is -+ * destroyed when this value is decremented to zero by -+ * pvr_page_table_l2_remove(). -+ */ -+ u16 entry_count; -+}; -+ -+/** -+ * pvr_page_table_l2_init() - Initialize an L2 page table. -+ * @table: Target L2 page table. -+ * @pvr_dev: Target PowerVR device -+ * -+ * It is expected that @table be zeroed (e.g. from kzalloc()) before calling -+ * this function. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by pvr_vm_backing_page_init(). -+ */ -+static __always_inline int -+pvr_page_table_l2_init(struct pvr_page_table_l2 *table, -+ struct pvr_device *pvr_dev) -+{ -+ return pvr_vm_backing_page_init(&table->backing_page, pvr_dev); -+} -+ -+/** -+ * pvr_page_table_l2_fini() - Teardown an L2 page table. -+ * @table: Target L2 page table. -+ * -+ * It is an error to attempt to use @table after calling this function. -+ */ -+static __always_inline void -+pvr_page_table_l2_fini(struct pvr_page_table_l2 *table) -+{ -+ pvr_vm_backing_page_fini(&table->backing_page); -+} -+ -+/** -+ * pvr_page_table_l2_sync() - Flush an L2 page table from the CPU to the device. -+ * @table: Target L2 page table. -+ * -+ * This is just a thin wrapper around pvr_vm_backing_page_sync(), so the -+ * warning there applies here too: **Only call pvr_page_table_l2_sync() once -+ * you're sure you have no more changes to make to** @table **in the immediate -+ * future.** -+ * -+ * If child L1 page tables of @table also need to be flushed, this should be -+ * done first using pvr_page_table_l1_sync() *before* calling this function. -+ */ -+static __always_inline void -+pvr_page_table_l2_sync(struct pvr_page_table_l2 *table) -+{ -+ pvr_vm_backing_page_sync(&table->backing_page); -+} -+ -+/** -+ * pvr_page_table_l2_get_raw() - Access the raw equivalent of a mirror L2 page -+ * table. -+ * @table: Target L2 page table. -+ * -+ * Essentially returns the CPU address of the raw equivalent of @table, cast to -+ * a &struct pvr_page_table_l2_raw pointer. -+ * -+ * You probably want to call pvr_page_table_l2_get_entry_raw() instead. -+ * -+ * Return: -+ * * The raw equivalent of @table. -+ */ -+static __always_inline struct pvr_page_table_l2_raw * -+pvr_page_table_l2_get_raw(struct pvr_page_table_l2 *table) -+{ -+ return table->backing_page.host_ptr; -+} -+ -+/** -+ * pvr_page_table_l2_get_entry_raw() - Access an entry from the raw equivalent -+ * of a mirror L2 page table. -+ * @table: Target L2 page table. -+ * @idx: Index of the entry to access. -+ * -+ * Technically this function returns a pointer to a slot in a raw L2 page -+ * table, since the returned "entry" is not guaranteed to be valid. The caller -+ * must verify the validity of the entry at the returned address before reading -+ * or overwriting it. -+ * -+ * Return: -+ * * A pointer to the requested raw L2 page table entry. -+ */ -+static __always_inline struct pvr_page_table_l2_entry_raw * -+pvr_page_table_l2_get_entry_raw(struct pvr_page_table_l2 *table, u16 idx) -+{ -+ return &pvr_page_table_l2_get_raw(table)->entries[idx]; -+} -+ -+/** -+ * pvr_page_table_l2_entry_is_valid() - Check if an L2 page table entry is -+ * marked as valid. -+ * @table: Target L2 page table. -+ * @idx: Index of the entry to check. -+ * -+ * Return: -+ * * %true if there is a valid entry at @idx in @table, or -+ * * %false otherwise. -+ */ -+static __always_inline bool -+pvr_page_table_l2_entry_is_valid(struct pvr_page_table_l2 *table, u16 idx) -+{ -+ struct pvr_page_table_l2_entry_raw entry_raw = -+ *pvr_page_table_l2_get_entry_raw(table, idx); -+ -+ return pvr_page_table_l2_entry_raw_is_valid(entry_raw); -+} -+ -+/** -+ * struct pvr_page_table_l1 - A wrapped L1 page table. -+ * -+ * To access the raw part of this table, use pvr_page_table_l1_get_raw(). -+ * Alternatively to access a raw entry directly, use -+ * pvr_page_table_l1_get_entry_raw(). -+ */ -+struct pvr_page_table_l1 { -+ /** -+ * @entries: The children of this node in the page table tree -+ * structure. These are also mirror tables. The indexing of this array -+ * is identical to that of the raw equivalent -+ * (&pvr_page_table_l0_raw.entries). -+ */ -+ struct pvr_page_table_l0 *entries[ROGUE_MMUCTRL_ENTRIES_PT_L1_VALUE]; -+ -+ /** -+ * @backing_page: A handle to the memory which holds the raw -+ * equivalent of this table. **For internal use only.** -+ */ -+ struct pvr_vm_backing_page backing_page; -+ -+ /** -+ * @parent: The parent of this node in the page table tree structure. -+ * This is also a mirror table. -+ */ -+ struct pvr_page_table_l2 *parent; -+ -+ /** -+ * @parent_idx: The index of the entry in the parent table (see -+ * @parent) which corresponds to this table. -+ */ -+ u16 parent_idx; -+ -+ /** -+ * @entry_count: The current number of valid entries (that we know of) -+ * in this table. This value is essentially a refcount - the table is -+ * destroyed when this value is decremented to zero by -+ * pvr_page_table_l1_remove(). -+ */ -+ u16 entry_count; -+}; -+ -+/** -+ * pvr_page_table_l1_init() - Initialize an L1 page table. -+ * @table: Target L1 page table. -+ * @pvr_dev: Target PowerVR device -+ * -+ * When this function returns successfully, @table is still not considered -+ * valid. It must be inserted into the page table tree structure with -+ * pvr_page_table_l2_insert() before it is ready for use. -+ * -+ * It is expected that @table be zeroed (e.g. from kzalloc()) before calling -+ * this function. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by pvr_vm_backing_page_init(). -+ */ -+static __always_inline int -+pvr_page_table_l1_init(struct pvr_page_table_l1 *table, -+ struct pvr_device *pvr_dev) -+{ -+ table->parent_idx = PVR_IDX_INVALID; -+ -+ return pvr_vm_backing_page_init(&table->backing_page, pvr_dev); -+} -+ -+/** -+ * pvr_page_table_l1_fini() - Teardown an L1 page table. -+ * @table: Target L1 page table. -+ * -+ * It is an error to attempt to use @table after calling this function, even -+ * indirectly. This includes calling pvr_page_table_l2_remove(), which must -+ * be called *before* pvr_page_table_l1_fini(). -+ */ -+static __always_inline void -+pvr_page_table_l1_fini(struct pvr_page_table_l1 *table) -+{ -+ pvr_vm_backing_page_fini(&table->backing_page); -+} -+ -+/** -+ * pvr_page_table_l1_sync() - Flush an L1 page table from the CPU to the device. -+ * @table: Target L1 page table. -+ * -+ * This is just a thin wrapper around pvr_vm_backing_page_sync(), so the -+ * warning there applies here too: **Only call pvr_page_table_l1_sync() once -+ * you're sure you have no more changes to make to** @table **in the immediate -+ * future.** -+ * -+ * If child L0 page tables of @table also need to be flushed, this should be -+ * done first using pvr_page_table_l0_sync() *before* calling this function. -+ */ -+static __always_inline void -+pvr_page_table_l1_sync(struct pvr_page_table_l1 *table) -+{ -+ pvr_vm_backing_page_sync(&table->backing_page); -+} -+ -+/** -+ * pvr_page_table_l1_get_raw() - Access the raw equivalent of a mirror L1 page -+ * table. -+ * @table: Target L1 page table. -+ * -+ * Essentially returns the CPU address of the raw equivalent of @table, cast to -+ * a &struct pvr_page_table_l1_raw pointer. -+ * -+ * You probably want to call pvr_page_table_l1_get_entry_raw() instead. -+ * -+ * Return: -+ * * The raw equivalent of @table. -+ */ -+static __always_inline struct pvr_page_table_l1_raw * -+pvr_page_table_l1_get_raw(struct pvr_page_table_l1 *table) -+{ -+ return table->backing_page.host_ptr; -+} -+ -+/** -+ * pvr_page_table_l1_get_entry_raw() - Access an entry from the raw equivalent -+ * of a mirror L1 page table. -+ * @table: Target L1 page table. -+ * @idx: Index of the entry to access. -+ * -+ * Technically this function returns a pointer to a slot in a raw L1 page -+ * table, since the returned "entry" is not guaranteed to be valid. The caller -+ * must verify the validity of the entry at the returned address before reading -+ * or overwriting it. -+ * -+ * Return: -+ * * A pointer to the requested raw L1 page table entry. -+ */ -+static __always_inline struct pvr_page_table_l1_entry_raw * -+pvr_page_table_l1_get_entry_raw(struct pvr_page_table_l1 *table, u16 idx) -+{ -+ return &pvr_page_table_l1_get_raw(table)->entries[idx]; -+} -+ -+/** -+ * pvr_page_table_l1_entry_is_valid() - Check if an L1 page table entry is -+ * marked as valid. -+ * @table: Target L1 page table. -+ * @idx: Index of the entry to check. -+ * -+ * Return: -+ * * %true if there is a valid entry at @idx in @table, or -+ * * %false otherwise. -+ */ -+static __always_inline bool -+pvr_page_table_l1_entry_is_valid(struct pvr_page_table_l1 *table, u16 idx) -+{ -+ struct pvr_page_table_l1_entry_raw entry_raw = -+ *pvr_page_table_l1_get_entry_raw(table, idx); -+ -+ return pvr_page_table_l1_entry_raw_is_valid(entry_raw); -+} -+ -+/** -+ * struct pvr_page_table_l0 - A wrapped L0 page table. -+ * -+ * To access the raw part of this table, use pvr_page_table_l0_get_raw(). -+ * Alternatively to access a raw entry directly, use -+ * pvr_page_table_l0_get_entry_raw(). -+ * -+ * There is no mirror representation of an individual page, so this type has no -+ * &entries member. -+ */ -+struct pvr_page_table_l0 { -+ /** -+ * @backing_page: A handle to the memory which holds the raw -+ * equivalent of this table. **For internal use only.** -+ */ -+ struct pvr_vm_backing_page backing_page; -+ -+ /** -+ * @parent: The parent of this node in the page table tree structure. -+ * This is also a mirror table. -+ */ -+ struct pvr_page_table_l1 *parent; -+ -+ /** -+ * @parent_idx: The index of the entry in the parent table (see -+ * @parent) which corresponds to this table. -+ */ -+ u16 parent_idx; -+ -+ /** -+ * @entry_count: The current number of valid entries (that we know of) -+ * in this table. This value is essentially a refcount - the table is -+ * destroyed when this value is decremented to zero by -+ * pvr_page_table_l0_remove(). -+ */ -+ u16 entry_count; -+}; -+ -+/** -+ * pvr_page_table_l0_init() - Initialize an L0 page table. -+ * @table: Target L0 page table. -+ * @pvr_dev: Target PowerVR device -+ * -+ * When this function returns successfully, @table is still not considered -+ * valid. It must be inserted into the page table tree structure with -+ * pvr_page_table_l1_insert() before it is ready for use. -+ * -+ * It is expected that @table be zeroed (e.g. from kzalloc()) before calling -+ * this function. -+ * -+ * Return: -+ * * 0 on success, or -+ * * Any error returned by pvr_vm_backing_page_init(). -+ */ -+static __always_inline int -+pvr_page_table_l0_init(struct pvr_page_table_l0 *table, -+ struct pvr_device *pvr_dev) -+{ -+ table->parent_idx = PVR_IDX_INVALID; -+ -+ return pvr_vm_backing_page_init(&table->backing_page, pvr_dev); -+} -+ -+/** -+ * pvr_page_table_l0_fini() - Teardown an L0 page table. -+ * @table: Target L0 page table. -+ * -+ * It is an error to attempt to use @table after calling this function, even -+ * indirectly. This includes calling pvr_page_table_l1_remove(), which must -+ * be called *before* pvr_page_table_l0_fini(). -+ */ -+static __always_inline void -+pvr_page_table_l0_fini(struct pvr_page_table_l0 *table) -+{ -+ pvr_vm_backing_page_fini(&table->backing_page); -+} -+ -+/** -+ * pvr_page_table_l0_sync() - Flush an L0 page table from the CPU to the device. -+ * @table: Target L0 page table. -+ * -+ * This is just a thin wrapper around pvr_vm_backing_page_sync(), so the -+ * warning there applies here too: **Only call pvr_page_table_l0_sync() once -+ * you're sure you have no more changes to make to** @table **in the immediate -+ * future.** -+ * -+ * If child pages of @table also need to be flushed, this should be done first -+ * using a DMA sync function (e.g. dma_sync_sg_for_device()) *before* calling -+ * this function. -+ */ -+static __always_inline void -+pvr_page_table_l0_sync(struct pvr_page_table_l0 *table) -+{ -+ pvr_vm_backing_page_sync(&table->backing_page); -+} -+ -+/** -+ * pvr_page_table_l0_get_raw() - Access the raw equivalent of a mirror L0 page -+ * table. -+ * @table: Target L0 page table. -+ * -+ * Essentially returns the CPU address of the raw equivalent of @table, cast to -+ * a &struct pvr_page_table_l0_raw pointer. -+ * -+ * You probably want to call pvr_page_table_l0_get_entry_raw() instead. -+ * -+ * Return: -+ * * The raw equivalent of @table. -+ */ -+static __always_inline struct pvr_page_table_l0_raw * -+pvr_page_table_l0_get_raw(struct pvr_page_table_l0 *table) -+{ -+ return table->backing_page.host_ptr; -+} -+ -+/** -+ * pvr_page_table_l0_get_entry_raw() - Access an entry from the raw equivalent -+ * of a mirror L0 page table. -+ * @table: Target L0 page table. -+ * @idx: Index of the entry to access. -+ * -+ * Technically this function returns a pointer to a slot in a raw L0 page -+ * table, since the returned "entry" is not guaranteed to be valid. The caller -+ * must verify the validity of the entry at the returned address before reading -+ * or overwriting it. -+ * -+ * Return: -+ * * A pointer to the requested raw L0 page table entry. -+ */ -+static __always_inline struct pvr_page_table_l0_entry_raw * -+pvr_page_table_l0_get_entry_raw(struct pvr_page_table_l0 *table, u16 idx) -+{ -+ return &pvr_page_table_l0_get_raw(table)->entries[idx]; -+} -+ -+/** -+ * pvr_page_table_l0_entry_is_valid() - Check if an L0 page table entry is -+ * marked as valid. -+ * @table: Target L0 page table. -+ * @idx: Index of the entry to check. -+ * -+ * Return: -+ * * %true if there is a valid entry at @idx in @table, or -+ * * %false otherwise. -+ */ -+static __always_inline bool -+pvr_page_table_l0_entry_is_valid(struct pvr_page_table_l0 *table, u16 idx) -+{ -+ struct pvr_page_table_l0_entry_raw entry_raw = -+ *pvr_page_table_l0_get_entry_raw(table, idx); -+ -+ return pvr_page_table_l0_entry_raw_is_valid(entry_raw); -+} -+ -+/** -+ * pvr_page_table_l2_insert() - TODO -+ * @table: Target L2 page table. -+ * @idx: Index of the entry to write. -+ * @child_table: Target L1 page table to be referenced by the new entry. -+ * -+ * This function is unchecked. Do not call it unless you're absolutely sure -+ * there is not already a valid entry at @idx in @table. -+ */ -+static void -+pvr_page_table_l2_insert(struct pvr_page_table_l2 *table, u16 idx, -+ struct pvr_page_table_l1 *child_table) -+{ -+ struct pvr_page_table_l2_entry_raw *entry_raw = -+ pvr_page_table_l2_get_entry_raw(table, idx); -+ -+ pvr_page_table_l2_entry_raw_set(entry_raw, -+ child_table->backing_page.dma_addr); -+ -+ child_table->parent = table; -+ child_table->parent_idx = idx; -+ -+ table->entries[idx] = child_table; -+ ++table->entry_count; -+} -+ -+/** -+ * pvr_page_table_l2_remove() - TODO -+ * @table: Target L2 page table. -+ * @idx: Index of the entry to remove. -+ * -+ * This function is unchecked. Do not call it unless you're absolutely sure -+ * there is a valid entry at @idx in @table. -+ */ -+static void -+pvr_page_table_l2_remove(struct pvr_page_table_l2 *table, u16 idx) -+{ -+ struct pvr_page_table_l1 *child_table = table->entries[idx]; -+ struct pvr_page_table_l2_entry_raw *entry_raw = -+ pvr_page_table_l2_get_entry_raw(table, idx); -+ -+ pvr_page_table_l2_entry_raw_clear(entry_raw); -+ -+ child_table->parent = NULL; -+ child_table->parent_idx = PVR_IDX_INVALID; -+ -+ table->entries[idx] = NULL; -+ --table->entry_count; -+} -+ -+/** -+ * pvr_page_table_l1_insert() - TODO -+ * @table: Target L1 page table. -+ * @idx: Index of the entry to write. -+ * @child_table: Target L0 page table to be referenced by the new entry. -+ * -+ * This function is unchecked. Do not call it unless you're absolutely sure -+ * there is not already a valid entry at @idx in @table. -+ */ -+static void -+pvr_page_table_l1_insert(struct pvr_page_table_l1 *table, u16 idx, -+ struct pvr_page_table_l0 *child_table) -+{ -+ struct pvr_page_table_l1_entry_raw *entry_raw = -+ pvr_page_table_l1_get_entry_raw(table, idx); -+ -+ pvr_page_table_l1_entry_raw_set(entry_raw, -+ child_table->backing_page.dma_addr); -+ -+ child_table->parent = table; -+ child_table->parent_idx = idx; -+ -+ table->entries[idx] = child_table; -+ ++table->entry_count; -+} -+ -+/* Forward declaration from below. */ -+static void __pvr_page_table_l1_destroy(struct pvr_page_table_l1 *table); -+ -+/** -+ * pvr_page_table_l1_remove() - TODO -+ * @table: Target L1 page table. -+ * @idx: Index of the entry to remove. -+ * -+ * This function is unchecked. Do not call it unless you're absolutely sure -+ * there is a valid entry at @idx in @table. -+ */ -+static void -+pvr_page_table_l1_remove(struct pvr_page_table_l1 *table, u16 idx) -+{ -+ struct pvr_page_table_l0 *child_table = table->entries[idx]; -+ struct pvr_page_table_l1_entry_raw *entry_raw = -+ pvr_page_table_l1_get_entry_raw(table, idx); -+ -+ pvr_page_table_l1_entry_raw_clear(entry_raw); -+ -+ child_table->parent = NULL; -+ child_table->parent_idx = PVR_IDX_INVALID; -+ -+ table->entries[idx] = NULL; -+ if (--table->entry_count == 0) -+ __pvr_page_table_l1_destroy(table); -+} -+ -+/** -+ * pvr_page_table_l0_insert() - TODO -+ * @table: Target L0 page table. -+ * @idx: Index of the entry to write. -+ * @dma_addr: Target DMA address to be referenced by the new entry. -+ * @flags: Page options to be stored in the new entry. -+ * -+ * This function is unchecked. Do not call it unless you're absolutely sure -+ * there is not already a valid entry at @idx in @table. -+ */ -+static void -+pvr_page_table_l0_insert(struct pvr_page_table_l0 *table, u16 idx, -+ dma_addr_t dma_addr, struct pvr_page_flags_raw flags) -+{ -+ struct pvr_page_table_l0_entry_raw *entry_raw = -+ pvr_page_table_l0_get_entry_raw(table, idx); -+ -+ pvr_page_table_l0_entry_raw_set(entry_raw, dma_addr, flags); -+ -+ /* -+ * There is no entry to set here - we don't keep a mirror of -+ * individual pages. -+ */ -+ -+ ++table->entry_count; -+} -+ -+/* Forward declaration from below. */ -+static void __pvr_page_table_l0_destroy(struct pvr_page_table_l0 *table); -+ -+/** -+ * pvr_page_table_l0_remove() - TODO -+ * @table: Target L0 page table. -+ * @idx: Index of the entry to remove. -+ * -+ * This function is unchecked. Do not call it unless you're absolutely sure -+ * there is a valid entry at @idx in @table. -+ */ -+static void -+pvr_page_table_l0_remove(struct pvr_page_table_l0 *table, u16 idx) -+{ -+ struct pvr_page_table_l0_entry_raw *entry_raw = -+ pvr_page_table_l0_get_entry_raw(table, idx); -+ -+ pvr_page_table_l0_entry_raw_clear(entry_raw); -+ -+ /* -+ * There is no entry to clear here - we don't keep a mirror of -+ * individual pages. -+ */ -+ -+ if (--table->entry_count == 0) -+ __pvr_page_table_l0_destroy(table); -+} -+ -+/** -+ * DOC: Page table index utilities -+ * -+ * These utilities are not tied to the raw or mirror page tables since they -+ * operate only on virtual device addresses which are identical between the two -+ * structures. -+ */ -+/** -+ * DOC: Page table index utilities (constants) -+ * -+ * .. c:macro:: PVR_PAGE_TABLE_ADDR_SPACE_SIZE -+ * -+ * Size of device-virtual address space which can be represented in the page -+ * table structure. -+ * -+ * This value is checked at runtime against -+ * &pvr_device_features.virtual_address_space_bits by -+ * pvr_vm_create_context(), which will return an error if the feature value -+ * does not match this constant. -+ * -+ * .. admonition:: Future work -+ * -+ * It should be possible to support other values of -+ * &pvr_device_features.virtual_address_space_bits, but so far no -+ * hardware has been created which advertises an unsupported value. -+ * -+ * .. c:macro:: PVR_PAGE_TABLE_ADDR_BITS -+ * -+ * Number of bits needed to represent any value less than -+ * %PVR_PAGE_TABLE_ADDR_SPACE_SIZE exactly. -+ * -+ * .. c:macro:: PVR_PAGE_TABLE_ADDR_MASK -+ * -+ * Bitmask of virtual devices addresses which are valid in the page table -+ * structure. -+ * -+ * This value is derived from %PVR_PAGE_TABLE_ADDR_SPACE_SIZE, so the same -+ * notes on that constant apply here. -+ */ -+ -+/** -+ * PVR_PAGE_TABLE_ADDR_SPACE_SIZE - Size of device-virtual address space which -+ * can be represented in the page table structure. -+ * -+ * *This doc comment is not rendered - see DOC: Page table index utilities -+ * (constants).* -+ */ -+#define PVR_PAGE_TABLE_ADDR_SPACE_SIZE SZ_1T -+ -+/** -+ * PVR_PAGE_TABLE_ADDR_BITS - Number of bits needed to represent any value less -+ * than %PVR_PAGE_TABLE_ADDR_SPACE_SIZE exactly. -+ * -+ * *This doc comment is not rendered - see DOC: Page table index utilities -+ * (constants).* -+ */ -+#define PVR_PAGE_TABLE_ADDR_BITS __ffs(PVR_PAGE_TABLE_ADDR_SPACE_SIZE) -+ -+/** -+ * PVR_PAGE_TABLE_ADDR_MASK - Bitmask of virtual devices addresses which are -+ * valid in the page table structure. -+ * -+ * *This doc comment is not rendered - see DOC: Page table index utilities -+ * (constants).* -+ */ -+#define PVR_PAGE_TABLE_ADDR_MASK (PVR_PAGE_TABLE_ADDR_SPACE_SIZE - 1) -+ -+/** -+ * pvr_page_table_l2_idx() - Calculate the L2 page table index for a virtual -+ * device address. -+ * @device_addr: Target virtual device address. -+ * -+ * This function does not perform any bounds checking - it is the caller's -+ * responsibility to ensure that @device_addr is valid before interpreting -+ * the result. -+ * -+ * Return: -+ * * The index into an L2 page table corresponding to @device_addr. -+ */ -+static __always_inline u16 -+pvr_page_table_l2_idx(u64 device_addr) -+{ -+ return (device_addr & ~ROGUE_MMUCTRL_VADDR_PT_L2_INDEX_CLRMSK) >> -+ ROGUE_MMUCTRL_VADDR_PT_L2_INDEX_SHIFT; -+} -+ -+/** -+ * pvr_page_table_l1_idx() - Calculate the L1 page table index for a virtual -+ * device address. -+ * @device_addr: Target virtual device address. -+ * -+ * This function does not perform any bounds checking - it is the caller's -+ * responsibility to ensure that @device_addr is valid before interpreting -+ * the result. -+ * -+ * Return: -+ * * The index into an L1 page table corresponding to @device_addr. -+ */ -+static __always_inline u16 -+pvr_page_table_l1_idx(u64 device_addr) -+{ -+ return (device_addr & ~ROGUE_MMUCTRL_VADDR_PT_L1_INDEX_CLRMSK) >> -+ ROGUE_MMUCTRL_VADDR_PT_L1_INDEX_SHIFT; -+} -+ -+/** -+ * pvr_page_table_l0_idx() - Calculate the L0 page table index for a virtual -+ * device address. -+ * @device_addr: Target virtual device address. -+ * -+ * This function does not perform any bounds checking - it is the caller's -+ * responsibility to ensure that @device_addr is valid before interpreting -+ * the result. -+ * -+ * Return: -+ * * The index into an L0 page table corresponding to @device_addr. -+ */ -+static __always_inline u16 -+pvr_page_table_l0_idx(u64 device_addr) -+{ -+ return (device_addr & ~ROGUE_MMUCTRL_VADDR_PT_L0_INDEX_CLRMSK) >> -+ ROGUE_MMUCTRL_VADDR_PT_L0_INDEX_SHIFT; -+} -+ -+/** -+ * DOC: High-level page table operations -+ * -+ * TODO -+ */ -+ -+/** -+ * pvr_page_table_l1_create_unchecked() - Create an L1 page table and insert -+ * it into an L2 page table. -+ * @pvr_dev: Target PowerVR device. -+ * @parent_table: L2 page table into which the created L1 page table will be -+ * inserted. -+ * @idx: Index into @parent_table at which to insert the created L1 page table. -+ * -+ * This function is unchecked. By using it, the caller is asserting that slot -+ * @idx in @parent_table does not contain a valid entry. -+ * -+ * Return: -+ * * The newly-minted L1 page table on success, -+ * * -%ENOMEM if allocation of a &struct pvr_page_table_l1 fails, or -+ * * Any error returned by pvr_page_table_l1_init(). -+ */ -+static struct pvr_page_table_l1 * -+pvr_page_table_l1_create_unchecked(struct pvr_device *pvr_dev, -+ struct pvr_page_table_l2 *parent_table, -+ u16 idx) -+{ -+ struct pvr_page_table_l1 *table; -+ int err; -+ -+ table = kzalloc(sizeof(*table), GFP_KERNEL); -+ if (!table) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = pvr_page_table_l1_init(table, pvr_dev); -+ if (err) -+ goto err_free_table; -+ -+ /* Store the new L1 page table in the parent L2 page table. */ -+ pvr_page_table_l2_insert(parent_table, idx, table); -+ -+ return table; -+ -+err_free_table: -+ kfree(table); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * __pvr_page_table_l1_destroy() - Destroy an L1 page table after removing it -+ * from its parent L2 page table. -+ * @table: Target L1 page table. -+ * -+ * Although this function is defined in the "High-level page table operations" -+ * section for symmetry, it should never be called directly (hence the ``__`` -+ * prefix). Instead, it's called automatically when pvr_page_table_l1_remove() -+ * causes @table to become empty. -+ */ -+static void -+__pvr_page_table_l1_destroy(struct pvr_page_table_l1 *table) -+{ -+ /* Clear the parent L2 page table entry. */ -+ if (table->parent_idx != PVR_IDX_INVALID) -+ pvr_page_table_l2_remove(table->parent, table->parent_idx); -+ -+ pvr_page_table_l1_fini(table); -+ kfree(table); -+} -+ -+/** -+ * pvr_page_table_l1_get_or_create() - Retrieves (optionally creating if -+ * necessary) an L1 page table from the -+ * specified L2 page table entry. -+ * @pvr_dev: [IN] Target PowerVR device. -+ * @parent_table: [IN] L2 page table which contains the target L1 page table. -+ * @idx: [IN] Index into @parent_table of the entry to fetch. -+ * @should_create: [IN] Specifies whether new page tables should be created -+ * when empty page table entries are encountered during traversal. -+ * @did_create: [OUT] Optional pointer to a flag which is set when -+ * @should_create is %true and new page table entries are created. In any -+ * other case, the value will not be modified. -+ * -+ * Return: -+ * * The selected L1 page table on success, -+ * * -%ENXIO if @should_create is %false and an L1 page table would have been -+ * created, or -+ * * Any error returned by pvr_page_table_l1_create_unchecked() if -+ * @should_create is %true and a new L1 page table needs to be created. -+ */ -+static struct pvr_page_table_l1 * -+pvr_page_table_l1_get_or_create(struct pvr_device *pvr_dev, -+ struct pvr_page_table_l2 *parent_table, u16 idx, -+ bool should_create, bool *did_create) -+{ -+ struct pvr_page_table_l1 *table; -+ -+ if (pvr_page_table_l2_entry_is_valid(parent_table, idx)) -+ return parent_table->entries[idx]; -+ -+ if (!should_create) -+ return ERR_PTR(-ENXIO); -+ -+ /* -+ * Use the unchecked version of pvr_page_table_l1_create() because we -+ * just verified the entry does not exist yet. -+ */ -+ table = pvr_page_table_l1_create_unchecked(pvr_dev, parent_table, idx); -+ if (!IS_ERR(table) && did_create) -+ *did_create = true; -+ -+ return table; -+} -+ -+/** -+ * pvr_page_table_l0_create_unchecked() - Create an L0 page table and insert -+ * it into an L1 page table. -+ * @pvr_dev: Target PowerVR device. -+ * @parent_table: L1 page table into which the created L0 page table will be -+ * inserted. -+ * @idx: Index into @parent_table at which to insert the created L0 page table. -+ * -+ * This function is unchecked. By using it, the caller is asserting that slot -+ * @idx in @parent_table does not contain a valid entry. -+ * -+ * Return: -+ * * The newly-minted L0 page table on success, -+ * * -%ENOMEM if allocation of a &struct pvr_page_table_l0 fails, or -+ * * Any error returned by pvr_page_table_l0_init(). -+ */ -+static struct pvr_page_table_l0 * -+pvr_page_table_l0_create_unchecked(struct pvr_device *pvr_dev, -+ struct pvr_page_table_l1 *parent_table, -+ u16 idx) -+{ -+ struct pvr_page_table_l0 *table; -+ int err; -+ -+ table = kzalloc(sizeof(*table), GFP_KERNEL); -+ if (!table) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = pvr_page_table_l0_init(table, pvr_dev); -+ if (err) -+ goto err_free_table; -+ -+ /* Store the new L0 page table in the parent L1 page table. */ -+ pvr_page_table_l1_insert(parent_table, idx, table); -+ -+ return table; -+ -+err_free_table: -+ kfree(table); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * __pvr_page_table_l0_destroy() - Destroy an L0 page table after removing it -+ * from its parent L1 page table. -+ * @table: Target L0 page table. -+ * -+ * Although this function is defined in the "High-level page table operations" -+ * section for symmetry, it should never be called directly (hence the ``__`` -+ * prefix). Instead, it's called automatically when pvr_page_table_l0_remove() -+ * causes @table to become empty. -+ */ -+static void -+__pvr_page_table_l0_destroy(struct pvr_page_table_l0 *table) -+{ -+ /* Clear the parent L1 page table entry. */ -+ if (table->parent_idx != PVR_IDX_INVALID) -+ pvr_page_table_l1_remove(table->parent, table->parent_idx); -+ -+ pvr_page_table_l0_fini(table); -+ kfree(table); -+} -+ -+/** -+ * pvr_page_table_l0_get_or_create() - Retrieves (optionally creating if -+ * necessary) an L0 page table from the -+ * specified L1 page table entry. -+ * @pvr_dev: [IN] Target PowerVR device. -+ * @parent_table: [IN] L1 page table which contains the target L0 page table. -+ * @idx: [IN] Index into @parent_table of the entry to fetch. -+ * @should_create: [IN] Specifies whether new page tables should be created -+ * when empty page table entries are encountered during traversal. -+ * @did_create: [OUT] Optional pointer to a flag which is set when -+ * @should_create is %true and new page table entries are created. In any -+ * other case, the value will not be modified. -+ * -+ * Return: -+ * * The selected L0 page table on success, -+ * * -%ENXIO if @should_create is %false and an L0 page table would have been -+ * created, or -+ * * Any error returned by pvr_page_table_l1_create_unchecked() if -+ * @should_create is %true and a new L0 page table needs to be created. -+ */ -+static struct pvr_page_table_l0 * -+pvr_page_table_l0_get_or_create(struct pvr_device *pvr_dev, -+ struct pvr_page_table_l1 *parent_table, u16 idx, -+ bool should_create, bool *did_create) -+{ -+ struct pvr_page_table_l0 *table; -+ -+ if (pvr_page_table_l1_entry_is_valid(parent_table, idx)) -+ return parent_table->entries[idx]; -+ -+ if (!should_create) -+ return ERR_PTR(-ENXIO); -+ -+ /* -+ * Use the unchecked version of pvr_page_table_l0_create() because we -+ * just verified the entry does not exist yet. -+ */ -+ table = pvr_page_table_l0_create_unchecked(pvr_dev, parent_table, idx); -+ if (!IS_ERR(table) && did_create) -+ *did_create = true; -+ -+ return table; -+} -+ -+/** -+ * DOC: Page table pointer -+ * -+ * Traversing the page table tree structure is not a straightforward -+ * operation since there are multiple layers, each with different properties. -+ * To contain and attempt to reduce this complexity, it's mostly encompassed -+ * in a "heavy pointer" type (&struct pvr_page_table_ptr) and its associated -+ * functions. -+ * -+ * Usage -+ * ----- -+ * To start using a &struct pvr_page_table_ptr instance, you must first -+ * initialize it to the starting address of your traversal using -+ * pvr_page_table_ptr_init(). -+ * -+ * TODO -+ */ -+ -+/** -+ * struct pvr_page_table_ptr - TODO -+ */ -+struct pvr_page_table_ptr { -+ /** -+ * @pvr_dev: The PowerVR device associated with the VM context the -+ * pointer is traversing. -+ */ -+ struct pvr_device *pvr_dev; -+ -+ /** -+ * @l2_table: A cached handle to the L2 page table the pointer is -+ * currently traversing. -+ */ -+ struct pvr_page_table_l2 *l2_table; -+ -+ /** -+ * @l1_table: A cached handle to the L1 page table the pointer is -+ * currently traversing. -+ */ -+ struct pvr_page_table_l1 *l1_table; -+ -+ /** -+ * @l0_table: A cached handle to the L0 page table the pointer is -+ * currently traversing. -+ */ -+ struct pvr_page_table_l0 *l0_table; -+ -+ /** -+ * @l2_idx: Index into the L2 page table the pointer is currently -+ * referencing. -+ */ -+ u16 l2_idx; -+ -+ /** -+ * @l1_idx: Index into the L1 page table the pointer is currently -+ * referencing. -+ */ -+ u16 l1_idx; -+ -+ /** -+ * @l0_idx: Index into the L0 page table the pointer is currently -+ * referencing. -+ */ -+ u16 l0_idx; -+ -+ /** -+ * @sync_level_required: The maximum level of the page table tree -+ * structure which has (possibly) been modified since it was last -+ * flushed to the device. -+ * -+ * This field should only be set with pvr_page_table_ptr_require_sync() -+ * or indirectly by pvr_page_table_ptr_sync_partial(). -+ */ -+ s8 sync_level_required; -+}; -+ -+static __always_inline void -+pvr_page_table_ptr_require_sync(struct pvr_page_table_ptr *ptr, s8 level) -+{ -+ if (ptr->sync_level_required < level) -+ ptr->sync_level_required = level; -+} -+ -+/** -+ * pvr_page_table_ptr_sync_manual() - TODO -+ * @ptr: Target page table pointer. -+ * @level: TODO -+ * -+ * Do not call this function directly. Instead use -+ * pvr_page_table_ptr_sync_partial() which is checked against the current -+ * value of &ptr->sync_level_required. -+ */ -+static void -+pvr_page_table_ptr_sync_manual(struct pvr_page_table_ptr *ptr, s8 level) -+{ -+ /* -+ * We sync the pages table levels in ascending order (starting from -+ * the leaf node) to ensure consistency. -+ */ -+ -+ if (level < 0) -+ return; -+ -+ pvr_page_table_l0_sync(ptr->l0_table); -+ -+ if (level < 1) -+ return; -+ -+ pvr_page_table_l1_sync(ptr->l1_table); -+ -+ if (level < 2) -+ return; -+ -+ pvr_page_table_l2_sync(ptr->l2_table); -+} -+ -+/** -+ * pvr_page_table_ptr_sync_partial() - TODO -+ * @ptr: Target page table pointer. -+ * @level: TODO -+ */ -+static void -+pvr_page_table_ptr_sync_partial(struct pvr_page_table_ptr *ptr, s8 level) -+{ -+ /* -+ * If the requested sync level is greater than or equal to the -+ * currently required sync level, we do two things: -+ * * Don't waste time syncing levels we haven't previously marked as -+ * requiring a sync, and -+ * * Reset the required sync level since we are about to sync -+ * everything that was previously marked as requiring a sync. -+ */ -+ if (level >= ptr->sync_level_required) { -+ level = ptr->sync_level_required; -+ ptr->sync_level_required = -1; -+ } -+ -+ pvr_page_table_ptr_sync_manual(ptr, level); -+} -+ -+/** -+ * pvr_page_table_ptr_sync() - TODO -+ * @ptr: Target page table pointer. -+ */ -+static __always_inline void -+pvr_page_table_ptr_sync(struct pvr_page_table_ptr *ptr) -+{ -+ pvr_page_table_ptr_sync_manual(ptr, ptr->sync_level_required); -+} -+ -+/** -+ * pvr_page_table_ptr_load_tables() - TODO -+ * @ptr: Target page table pointer. -+ * @should_create: Specifies whether new page tables should be created when -+ * empty page table entries are encountered during traversal. -+ * @load_level_required: TODO -+ * -+ * Return: -+ * * 0 on success, or -+ * * ... -+ */ -+static int -+pvr_page_table_ptr_load_tables(struct pvr_page_table_ptr *ptr, -+ bool should_create, s8 load_level_required) -+{ -+ bool did_create_l1; -+ bool did_create_l0; -+ int err; -+ -+ /* Clear tables we're about to fetch in case of error states. */ -+ if (load_level_required >= 1) -+ ptr->l1_table = NULL; -+ -+ if (load_level_required >= 0) -+ ptr->l0_table = NULL; -+ -+ /* Get or create L1 page table. */ -+ if (load_level_required >= 1) { -+ ptr->l1_table = pvr_page_table_l1_get_or_create(ptr->pvr_dev, -+ ptr->l2_table, -+ ptr->l2_idx, -+ should_create, -+ &did_create_l1); -+ if (IS_ERR(ptr->l1_table)) { -+ err = PTR_ERR(ptr->l1_table); -+ ptr->l1_table = NULL; -+ -+ /* -+ * If @should_create is %false and no L1 page table was -+ * found, return early but without an error. Since -+ * pvr_page_table_l1_get_or_create() can only return -+ * -%ENXIO if @should_create is %false, there is no -+ * need to check it here. -+ */ -+ if (err == -ENXIO) -+ err = 0; -+ -+ goto err_out; -+ } -+ } -+ -+ /* Get or create L0 page table. */ -+ if (load_level_required >= 0) { -+ ptr->l0_table = pvr_page_table_l0_get_or_create(ptr->pvr_dev, -+ ptr->l1_table, -+ ptr->l1_idx, -+ should_create, -+ &did_create_l0); -+ if (IS_ERR(ptr->l0_table)) { -+ err = PTR_ERR(ptr->l0_table); -+ ptr->l0_table = NULL; -+ -+ /* -+ * If @should_create is %false and no L0 page table was -+ * found, return early but without an error. Since -+ * pvr_page_table_l0_get_or_create() can only return -+ * -%ENXIO if @should_create is %false, there is no -+ * need to check it here. -+ */ -+ if (err == -ENXIO) -+ err = 0; -+ -+ /* -+ * At this point, an L1 page table could have been -+ * created but is now empty due to the failed attempt -+ * at creating an L0 page table. In this instance, we -+ * must destroy the empty L1 page table ourselves as -+ * pvr_page_table_l1_remove() is never called as part -+ * of the error path in -+ * pvr_page_table_l0_get_or_create(). -+ */ -+ if (did_create_l1) -+ __pvr_page_table_l1_destroy(ptr->l1_table); -+ -+ goto err_out; -+ } -+ } -+ -+ if (did_create_l1) -+ pvr_page_table_ptr_require_sync(ptr, 2); -+ else if (did_create_l0) -+ pvr_page_table_ptr_require_sync(ptr, 1); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_page_table_ptr_set() - TODO -+ * @ptr: Target page table pointer. -+ * @device_addr: New pointer target. -+ * @should_create: Specify whether new page tables should be created when -+ * empty page table entries are encountered during traversal. -+ * -+ * Return: -+ * * 0 on success, or -+ * * ... -+ */ -+static int -+pvr_page_table_ptr_set(struct pvr_page_table_ptr *ptr, u64 device_addr, -+ bool should_create) -+{ -+ pvr_page_table_ptr_sync(ptr); -+ -+ ptr->l2_idx = pvr_page_table_l2_idx(device_addr); -+ ptr->l1_idx = pvr_page_table_l1_idx(device_addr); -+ ptr->l0_idx = pvr_page_table_l0_idx(device_addr); -+ -+ return pvr_page_table_ptr_load_tables(ptr, should_create, 1); -+} -+ -+/** -+ * pvr_page_table_ptr_init() - Initialize a page table pointer. -+ * @ptr: Target page table pointer. -+ * @pvr_dev: TODO -+ * @root_table: TODO -+ * @device_addr: TODO -+ * @should_create: Specify whether new page tables should be created when -+ * empty page table entries are encountered during traversal. -+ * -+ * If @should_create is %true, the L0 page table will be flagged for -+ * -+ * It is expected that @ptr be zeroed (e.g. from kzalloc()) before calling this -+ * function. Since &struct pvr_page_table_ptr is small-ish (4-5 words), it is -+ * intended to be allocated on the stack. By default, this is zeroed memory -+ * so this warning is essentially just a formality. -+ * -+ * Return: -+ * * 0 on success, or -+ * * ... -+ */ -+static int -+pvr_page_table_ptr_init(struct pvr_page_table_ptr *ptr, -+ struct pvr_device *pvr_dev, -+ struct pvr_page_table_l2 *root_table, u64 device_addr, -+ bool should_create) -+{ -+ ptr->pvr_dev = pvr_dev; -+ ptr->l2_table = root_table; -+ ptr->sync_level_required = -1; -+ -+ return pvr_page_table_ptr_set(ptr, device_addr, should_create); -+} -+ -+/** -+ * pvr_page_table_ptr_fini() - Teardown a page table pointer. -+ * @ptr: Target page table pointer. -+ */ -+static void -+pvr_page_table_ptr_fini(struct pvr_page_table_ptr *ptr) -+{ -+ pvr_page_table_ptr_sync(ptr); -+} -+ -+/** -+ * pvr_page_table_ptr_next_page() - Advance a page table pointer. -+ * @ptr: Target page table pointer. -+ * @should_create: Specify whether new page tables should be created when -+ * empty page table entries are encountered during traversal. -+ * -+ * If @should_create is %false, it is the callers responsibility to verify that -+ * the state of the table references in @ptr is valid on return. If -%ENXIO is -+ * returned, at least one of the table references is invalid. It should be -+ * noted that @ptr as a whole will be left in a valid state if -%ENXIO is -+ * returned, unlike other error codes. The caller should check which references -+ * are invalid by comparing them to %NULL. Only &@ptr->l2_table is guaranteed -+ * to be valid, since it represents the root of the page table tree structure. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EPERM if the operation would wrap at the top of the page table -+ * hierarchy, -+ * * -%ENXIO if @should_create is %false and a page table of any level would -+ * have otherwise been created, or -+ * * Any error returned while attempting to create missing page tables if -+ * @should_create is %true. -+ */ -+static int -+pvr_page_table_ptr_next_page(struct pvr_page_table_ptr *ptr, bool should_create) -+{ -+ s8 load_level_required = -1; -+ -+ if (++ptr->l0_idx != ROGUE_MMUCTRL_ENTRIES_PT_L0_VALUE) -+ goto load_tables; -+ -+ ptr->l0_idx = 0; -+ load_level_required = 0; -+ -+ if (++ptr->l1_idx != ROGUE_MMUCTRL_ENTRIES_PT_L1_VALUE) -+ goto load_tables; -+ -+ ptr->l1_idx = 0; -+ load_level_required = 1; -+ -+ if (++ptr->l2_idx != ROGUE_MMUCTRL_ENTRIES_PT_L2_VALUE) -+ goto load_tables; -+ -+ /* -+ * If the pattern continued, we would set &ptr->l2_idx to zero here. -+ * However, that would wrap the top layer of the page table hierarchy -+ * which is not a valid operation. Instead, we warn and return an -+ * error. -+ */ -+ WARN(true, -+ "%s(%p) attempted to loop the top of the page table hierarchy", -+ __func__, ptr); -+ return -EPERM; -+ -+ /* If indices have wrapped, we need to load new tables. */ -+load_tables: -+ /* First, flush tables which will be unloaded. */ -+ pvr_page_table_ptr_sync_partial(ptr, load_level_required); -+ -+ /* Then load tables from the required level down. */ -+ return pvr_page_table_ptr_load_tables(ptr, should_create, -+ load_level_required); -+} -+ -+/** -+ * pvr_page_table_ptr_copy() - TODO -+ * @dst: TODO -+ * @src: TODO -+ */ -+static void -+pvr_page_table_ptr_copy(struct pvr_page_table_ptr *dst, -+ const struct pvr_page_table_ptr *src) -+{ -+ memcpy(dst, src, sizeof(*dst)); -+ -+ /* -+ * Nothing currently in the clone requires a sync later on, since the -+ * original will handle it either when advancing or during teardown. -+ */ -+ dst->sync_level_required = -1; -+} -+ -+/** -+ * DOC: Single page operations -+ * -+ * TODO -+ */ -+ -+/** -+ * pvr_page_create() - Create a device virtual memory page and insert it into -+ * an L0 page table. -+ * @ptr: TODO -+ * @dma_addr: DMA (quasi-physical) address which the created page should point -+ * to. -+ * @flags: Page options saved on the L0 page table entry for reading by the -+ * device. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EEXIST if the requested page already exists. -+ */ -+static int -+pvr_page_create(struct pvr_page_table_ptr *ptr, dma_addr_t dma_addr, -+ struct pvr_page_flags_raw flags) -+{ -+ /* Do not create a new page if one already exists. */ -+ if (pvr_page_table_l0_entry_is_valid(ptr->l0_table, ptr->l0_idx)) -+ return -EEXIST; -+ -+ pvr_page_table_l0_insert(ptr->l0_table, ptr->l0_idx, dma_addr, flags); -+ -+ pvr_page_table_ptr_require_sync(ptr, 0); -+ -+ return 0; -+} -+ -+/** -+ * pvr_page_destroy() - Destroy a device page after removing it from its -+ * parent L0 page table. -+ * @ptr: TODO -+ */ -+static void -+pvr_page_destroy(struct pvr_page_table_ptr *ptr) -+{ -+ /* Do nothing if the page does not exist. */ -+ if (!pvr_page_table_l0_entry_is_valid(ptr->l0_table, ptr->l0_idx)) -+ return; -+ -+ /* Clear the parent L0 page table entry. */ -+ pvr_page_table_l0_remove(ptr->l0_table, ptr->l0_idx); -+ -+ pvr_page_table_ptr_require_sync(ptr, 0); -+} -+ -+/** -+ * DOC: Interval tree base implementation -+ * -+ * There is a note in <linux/interval_tree_generic.h> which says: -+ * -+ * Note - before using this, please consider if generic version -+ * (interval_tree.h) would work for you... -+ * -+ * Here, then, is our justification for using the generic version, instead -+ * of the generic version (naming is hard, okay!): -+ * -+ * The generic version of &struct interval_tree_node (from -+ * <linux/interval_tree.h> uses unsigned long. We always need the elements to -+ * be 64 bits wide, regardless of host pointer size. We could gate this -+ * implementation on %BITS_PER_LONG, but it's better for us to store &start -+ * and &size then derive &last rather than the way &struct interval_tree_node -+ * does it, storing &start and &last] then deriving &size. -+ */ -+ -+/** -+ * pvr_vm_interval_tree_compute_last() - Compute the inclusive last value of -+ * a range. -+ * @start: Start of range. -+ * @size: Size of range. -+ * -+ * This seemingly useless function was added to attempt to eliminate some -+ * off-by-one errors which managed to creep in before it existed. -+ * -+ * Return: -+ * * The last (inclusive) value of the range specified by @start and @size. -+ */ -+static __always_inline u64 -+pvr_vm_interval_tree_compute_last(u64 start, u64 size) -+{ -+ if (!size) -+ return start; -+ -+ return start + size - 1; -+} -+ -+/** -+ * struct pvr_vm_interval_tree_node - A node in our implementation of an -+ * interval tree. -+ * -+ * Unlike the generic implementation in <linux/interval_tree.h>, we store the -+ * size of the interval instead of the last value. To access the last value (as -+ * required by the implementation behind INTERVAL_TREE_DEFINE()) use -+ * pvr_vm_internal_tree_node_last(). -+ */ -+struct pvr_vm_interval_tree_node { -+ /** @rb: Base RB-tree node. **For internal use only.** */ -+ struct rb_node rb; -+ -+ /** -+ * @start: The start value of the range represented by this node. -+ * **For internal use only.** -+ * -+ * Do not access this member directly, instead call -+ * pvr_vm_interval_tree_node_start(). -+ */ -+ u64 start; -+ -+ /** -+ * @size: The size of the range represented by this node. -+ * **For internal use only.** -+ * -+ * Do not access this member directly, instead call -+ * pvr_vm_interval_tree_node_size(). -+ */ -+ u64 size; -+ -+ /** -+ * @__subtree_last: Required for the implementation generated by -+ * INTERVAL_TREE_DEFINE(). **For internal use only.** -+ */ -+ u64 __subtree_last; -+}; -+ -+static __always_inline bool -+pvr_vm_interval_tree_node_is_inserted(struct pvr_vm_interval_tree_node *node) -+{ -+ return !RB_EMPTY_NODE(&node->rb); -+} -+ -+static __always_inline void -+pvr_vm_interval_tree_node_mark_removed(struct pvr_vm_interval_tree_node *node) -+{ -+ RB_CLEAR_NODE(&node->rb); -+} -+ -+static __always_inline void -+pvr_vm_interval_tree_node_init(struct pvr_vm_interval_tree_node *node, -+ u64 start, u64 size) -+{ -+ pvr_vm_interval_tree_node_mark_removed(node); -+ -+ node->start = start; -+ node->size = size; -+} -+ -+static __always_inline void -+pvr_vm_interval_tree_node_fini(struct pvr_vm_interval_tree_node *node) -+{ -+ WARN(pvr_vm_interval_tree_node_is_inserted(node), -+ "%s(%p) called before removing node from tree", __func__, node); -+} -+ -+/** -+ * pvr_vm_interval_tree_node_start() - TODO -+ * @node: Target VM interval tree node. -+ * -+ * Return: -+ * * The start value of @node. -+ */ -+static __always_inline u64 -+pvr_vm_interval_tree_node_start(struct pvr_vm_interval_tree_node *node) -+{ -+ return node->start; -+} -+ -+/** -+ * pvr_vm_interval_tree_node_size() - TODO -+ * @node: Target VM interval tree node. -+ * -+ * Return: -+ * * The size of @node. -+ */ -+static __always_inline u64 -+pvr_vm_interval_tree_node_size(struct pvr_vm_interval_tree_node *node) -+{ -+ return node->size; -+} -+ -+/** -+ * pvr_vm_interval_tree_node_last() - TODO -+ * @node: Target VM interval tree node. -+ * -+ * Return: -+ * * The last (inclusive) value of @node. -+ */ -+static __always_inline u64 -+pvr_vm_interval_tree_node_last(struct pvr_vm_interval_tree_node *node) -+{ -+ return pvr_vm_interval_tree_compute_last(node->start, node->size); -+} -+ -+INTERVAL_TREE_DEFINE(struct pvr_vm_interval_tree_node, rb, u64, __subtree_last, -+ pvr_vm_interval_tree_node_start, -+ pvr_vm_interval_tree_node_last, static, -+ __pvr_vm_interval_tree) -+ -+/** -+ * for_each_pvr_vm_interval_tree_node() - Helper macro to iterate a specific -+ * range of an interval tree. -+ * @tree_: -+ * @node_: -+ * @start_: -+ * @size_: -+ * -+ * Due to the way interval tree iteration works, formulating a ``for`` loop -+ * around it is pretty verbose! We can encapsulate all that lengthiness in a -+ * single macro (so we did). -+ */ -+#define for_each_pvr_vm_interval_tree_node(tree_, node_, start_, size_) \ -+ for ((node_) = pvr_vm_interval_tree_iter_first((tree_), (start_), \ -+ (size_)); \ -+ (node_); \ -+ (node_) = pvr_vm_interval_tree_iter_next((node_), (start_), \ -+ (size_))) -+ -+/** -+ * struct pvr_vm_interval_tree - TODO -+ */ -+struct pvr_vm_interval_tree { -+ /** @root: TODO */ -+ struct rb_root_cached root; -+} __packed; -+ -+/** -+ * pvr_vm_interval_tree_insert() - TODO -+ * @tree: Target VM interval tree. -+ * @node: Node to be inserted. -+ */ -+static __always_inline void -+pvr_vm_interval_tree_insert(struct pvr_vm_interval_tree *tree, -+ struct pvr_vm_interval_tree_node *node) -+{ -+ WARN(pvr_vm_interval_tree_node_is_inserted(node), -+ "%s(%p,%p) called on a node which is already in a tree", __func__, -+ tree, node); -+ -+ /* This function is generated by INTERVAL_TREE_DEFINE(). */ -+ __pvr_vm_interval_tree_insert(node, &tree->root); -+} -+ -+/** -+ * pvr_vm_interval_tree_remove() - TODO -+ * @tree: Target VM interval tree. -+ * @node: Node to be removed. -+ */ -+static __always_inline void -+pvr_vm_interval_tree_remove(struct pvr_vm_interval_tree *tree, -+ struct pvr_vm_interval_tree_node *node) -+{ -+ WARN(!pvr_vm_interval_tree_node_is_inserted(node), -+ "%s(%p,%p) called on a node which is not in a tree", __func__, -+ tree, node); -+ -+ /* This function is generated by INTERVAL_TREE_DEFINE(). */ -+ __pvr_vm_interval_tree_remove(node, &tree->root); -+ -+ pvr_vm_interval_tree_node_mark_removed(node); -+} -+ -+/** -+ * pvr_vm_interval_tree_subtree_search() - TODO -+ * @node: Node to search from. -+ * @start: Start value of the iterable range. -+ * @size: Size of the iterable range. -+ */ -+static __always_inline struct pvr_vm_interval_tree_node * -+pvr_vm_interval_tree_subtree_search(struct pvr_vm_interval_tree_node *node, -+ u64 start, u64 size) -+{ -+ /* This function is generated by INTERVAL_TREE_DEFINE(). */ -+ return __pvr_vm_interval_tree_subtree_search( -+ node, start, pvr_vm_interval_tree_compute_last(start, size)); -+} -+ -+/** -+ * pvr_vm_interval_tree_iter_first() - TODO -+ * @tree: Target VM interval tree. -+ * @start: Start value of the iterable range. -+ * @size: Size of the iterable range. -+ * -+ * *This function is generated by INTERVAL_TREE_DEFINE().* -+ */ -+static __always_inline struct pvr_vm_interval_tree_node * -+pvr_vm_interval_tree_iter_first(struct pvr_vm_interval_tree *tree, u64 start, -+ u64 size) -+{ -+ u64 last = pvr_vm_interval_tree_compute_last(start, size); -+ -+ /* This function is generated by INTERVAL_TREE_DEFINE(). */ -+ return __pvr_vm_interval_tree_iter_first(&tree->root, start, last); -+} -+ -+/** -+ * pvr_vm_interval_tree_iter_next() - TODO -+ * @node: Node to iterate from. -+ * @start: Start value of the iterable range. -+ * @size: Size of the iterable range. -+ */ -+static __always_inline struct pvr_vm_interval_tree_node * -+pvr_vm_interval_tree_iter_next(struct pvr_vm_interval_tree_node *node, -+ u64 start, u64 size) -+{ -+ u64 last = pvr_vm_interval_tree_compute_last(start, size); -+ -+ /* This function is generated by INTERVAL_TREE_DEFINE(). */ -+ return __pvr_vm_interval_tree_iter_next(node, start, last); -+} -+ -+/** -+ * pvr_vm_interval_tree_init() - Initialize an interval tree. -+ * @tree: Target VM interval tree. -+ */ -+static __always_inline void -+pvr_vm_interval_tree_init(struct pvr_vm_interval_tree *tree) -+{ -+ tree->root = RB_ROOT_CACHED; -+} -+ -+/** -+ * pvr_vm_interval_tree_fini() - Teardown an interval tree. -+ * @tree: Target VM interval tree. -+ * -+ * It is an error to call this function on a non-empty interval tree. Doing -+ * so is very likely to cause a memory leak. For this reason, -+ * pvr_vm_interval_tree_fini() will emit a kernel warning for each entry found -+ * in the target tree before returning. -+ */ -+static void -+pvr_vm_interval_tree_fini(struct pvr_vm_interval_tree *tree) -+{ -+ struct pvr_vm_interval_tree_node *node; -+ -+ /* clang-format off */ -+ for_each_pvr_vm_interval_tree_node(tree, node, 0, U64_MAX) { -+ WARN(true, "%s(%p) found [%llx,%llx]@%p", __func__, tree, -+ pvr_vm_interval_tree_node_start(node), -+ pvr_vm_interval_tree_node_last(node), node); -+ } -+ /* clang-format on */ -+} -+ -+/** -+ * pvr_vm_interval_tree_contains() - Check if any node in an interval tree -+ * overlaps with a specified range. -+ * @tree: Target VM interval tree. -+ * @start: Start value of the search range. -+ * @size: Size of the search range. -+ * -+ * This function is just a call to pvr_vm_interval_tree_iter_first() with the -+ * returned pointer coerced into a ``bool`` for convenience. It should always -+ * be inlined. -+ * -+ * Return: -+ * * %true if any node in the target interval tree overlaps with the range -+ * specified by @start and @size, or -+ * * %false otherwise. -+ */ -+static __always_inline bool -+pvr_vm_interval_tree_contains(struct pvr_vm_interval_tree *tree, u64 start, -+ u64 size) -+{ -+ return pvr_vm_interval_tree_iter_first(tree, start, size); -+} -+ -+/** -+ * pvr_vm_interval_tree_find() - Find a node which completely contains a range. -+ * @tree: Target VM interval tree. -+ * @start: Start value of the required range. -+ * @size: Size of the required range. -+ * -+ * Return: -+ * * A node containing the entire range specified by @start and @size, or -+ * * %NULL if such a node does not currently exist in @tree. -+ */ -+static struct pvr_vm_interval_tree_node * -+pvr_vm_interval_tree_find(struct pvr_vm_interval_tree *tree, u64 start, -+ u64 size) -+{ -+ /* -+ * We only search for the start of the range here, because the search -+ * implementation for interval_tree only looks for intersections. After -+ * a node is found that contains the start value, we can check that it -+ * also contains the last value. -+ */ -+ struct pvr_vm_interval_tree_node *node = -+ pvr_vm_interval_tree_iter_first(tree, start, 0); -+ -+ /* -+ * Check that a node exists around the requested range and that it -+ * encompasses the entire range. -+ */ -+ if (!node || pvr_vm_interval_tree_compute_last(start, size) > -+ pvr_vm_interval_tree_node_last(node)) -+ return NULL; -+ -+ return node; -+} -+ -+/** -+ * pvr_vm_interval_tree_get() - Fetch a node by its exact start value. -+ * @tree: Target VM interval tree. -+ * @start: Start value of the required node. -+ * -+ * Return: -+ * * A node whose start address is exactly @start, or -+ * * %NULL if such a node does not currently exist in @tree. -+ */ -+static struct pvr_vm_interval_tree_node * -+pvr_vm_interval_tree_get(struct pvr_vm_interval_tree *tree, u64 start) -+{ -+ struct pvr_vm_interval_tree_node *node = -+ pvr_vm_interval_tree_iter_first(tree, start, 0); -+ -+ if (!node || pvr_vm_interval_tree_node_start(node) != start) -+ return NULL; -+ -+ return node; -+} -+ -+/** -+ * DOC: Type-save VM interval tree wrappers -+ * -+ * TODO -+ */ -+ -+/** -+ * PVR_GEN_INTERVAL_TREE_WRAPPER_TYPE_AND_DECLS() - TODO -+ * @node_wrapper_: Type name of the structure to use as a node. -+ * -+ * TODO -+ * -+ * This is the first half of a two-part implementation. The second half can be -+ * found in PVR_GEN_INTERVAL_TREE_WRAPPER_DEFS(). -+ */ -+#define PVR_GEN_INTERVAL_TREE_WRAPPER_TYPE_AND_DECLS(node_wrapper_) \ -+ struct node_wrapper_##_tree { \ -+ struct pvr_vm_interval_tree tree; \ -+ } __packed; \ -+ \ -+ struct node_wrapper_; \ -+ \ -+ static __always_inline void node_wrapper_##_tree_init( \ -+ struct node_wrapper_##_tree *tree); \ -+ \ -+ static __always_inline void node_wrapper_##_tree_fini( \ -+ struct node_wrapper_##_tree *tree); \ -+ \ -+ static __always_inline u64 node_wrapper_##_start( \ -+ struct node_wrapper_ *node); \ -+ \ -+ static __always_inline u64 node_wrapper_##_last( \ -+ struct node_wrapper_ *node); \ -+ \ -+ static __always_inline void node_wrapper_##_tree_insert( \ -+ struct node_wrapper_##_tree *tree, \ -+ struct node_wrapper_ *node); \ -+ \ -+ static __always_inline void node_wrapper_##_tree_remove( \ -+ struct node_wrapper_##_tree *tree, \ -+ struct node_wrapper_ *node); \ -+ \ -+ static __always_inline struct node_wrapper_ \ -+ *node_wrapper_##_tree_iter_first( \ -+ struct node_wrapper_##_tree *tree, u64 start, \ -+ u64 size); \ -+ \ -+ static __always_inline struct node_wrapper_ \ -+ *node_wrapper_##_tree_iter_next(struct node_wrapper_ *node, \ -+ u64 start, u64 size); \ -+ \ -+ static __always_inline bool node_wrapper_##_tree_contains( \ -+ struct node_wrapper_##_tree *tree, u64 start, u64 size); \ -+ \ -+ static __always_inline struct node_wrapper_ *node_wrapper_##_tree_find( \ -+ struct node_wrapper_##_tree *tree, u64 start, u64 size); \ -+ \ -+ static __always_inline struct node_wrapper_ *node_wrapper_##_tree_get( \ -+ struct node_wrapper_##_tree *tree, u64 start); -+ -+/** -+ * PVR_GEN_INTERVAL_TREE_WRAPPER_DEFS() - TODO -+ * @node_wrapper_: Type name of the structure to use as a node. -+ * @node_wrapper_member_: Member name of the base -+ * &struct pvr_vm_interval_tree_node in the structure specified by -+ * @node_wrapper_. -+ * -+ * TODO -+ * -+ * This is the second half of a two-part implementation. The first half can be -+ * found in PVR_GEN_INTERVAL_TREE_WRAPPER_TYPE_AND_DECLS(). -+ */ -+#define PVR_GEN_INTERVAL_TREE_WRAPPER_DEFS(node_wrapper_, \ -+ node_wrapper_member_) \ -+ static __always_inline void node_wrapper_##_tree_init( \ -+ struct node_wrapper_##_tree *tree) \ -+ { \ -+ pvr_vm_interval_tree_init(&tree->tree); \ -+ } \ -+ \ -+ static __always_inline void node_wrapper_##_tree_fini( \ -+ struct node_wrapper_##_tree *tree) \ -+ { \ -+ pvr_vm_interval_tree_fini(&tree->tree); \ -+ } \ -+ \ -+ static __always_inline u64 node_wrapper_##_start( \ -+ struct node_wrapper_ *node) \ -+ { \ -+ return pvr_vm_interval_tree_node_start( \ -+ &node->node_wrapper_member_); \ -+ } \ -+ \ -+ static __always_inline u64 node_wrapper_##_size( \ -+ struct node_wrapper_ *node) \ -+ { \ -+ return pvr_vm_interval_tree_node_size( \ -+ &node->node_wrapper_member_); \ -+ } \ -+ \ -+ static __always_inline u64 node_wrapper_##_last( \ -+ struct node_wrapper_ *node) \ -+ { \ -+ return pvr_vm_interval_tree_node_last( \ -+ &node->node_wrapper_member_); \ -+ } \ -+ \ -+ static __always_inline struct node_wrapper_ *node_wrapper_##_from_node( \ -+ struct pvr_vm_interval_tree_node *node) \ -+ { \ -+ return container_of_safe(node, struct node_wrapper_, \ -+ node_wrapper_member_); \ -+ } \ -+ \ -+ static __always_inline void node_wrapper_##_tree_insert( \ -+ struct node_wrapper_##_tree *tree, struct node_wrapper_ *node) \ -+ { \ -+ pvr_vm_interval_tree_insert(&tree->tree, \ -+ &node->node_wrapper_member_); \ -+ } \ -+ \ -+ static __always_inline void node_wrapper_##_tree_remove( \ -+ struct node_wrapper_##_tree *tree, struct node_wrapper_ *node) \ -+ { \ -+ pvr_vm_interval_tree_remove(&tree->tree, \ -+ &node->node_wrapper_member_); \ -+ } \ -+ \ -+ static __always_inline struct node_wrapper_ \ -+ *node_wrapper_##_tree_iter_first( \ -+ struct node_wrapper_##_tree *tree, u64 start, \ -+ u64 size) \ -+ { \ -+ return node_wrapper_##_from_node( \ -+ pvr_vm_interval_tree_iter_first(&tree->tree, start, \ -+ size)); \ -+ } \ -+ \ -+ static __always_inline struct node_wrapper_ \ -+ *node_wrapper_##_tree_iter_next(struct node_wrapper_ *node, \ -+ u64 start, u64 size) \ -+ { \ -+ return node_wrapper_##_from_node( \ -+ pvr_vm_interval_tree_iter_next( \ -+ &node->node_wrapper_member_, start, size)); \ -+ } \ -+ \ -+ static __always_inline bool node_wrapper_##_tree_contains( \ -+ struct node_wrapper_##_tree *tree, u64 start, u64 size) \ -+ { \ -+ return pvr_vm_interval_tree_contains(&tree->tree, start, \ -+ size); \ -+ } \ -+ \ -+ static __always_inline struct node_wrapper_ *node_wrapper_##_tree_find( \ -+ struct node_wrapper_##_tree *tree, u64 start, u64 size) \ -+ { \ -+ return node_wrapper_##_from_node( \ -+ pvr_vm_interval_tree_find(&tree->tree, start, size)); \ -+ } \ -+ \ -+ static __always_inline struct node_wrapper_ *node_wrapper_##_tree_get( \ -+ struct node_wrapper_##_tree *tree, u64 start) \ -+ { \ -+ return node_wrapper_##_from_node( \ -+ pvr_vm_interval_tree_get(&tree->tree, start)); \ -+ } -+ -+PVR_GEN_INTERVAL_TREE_WRAPPER_TYPE_AND_DECLS(pvr_vm_mapping); -+ -+/** -+ * DOC: Memory context -+ * -+ * TODO -+ */ -+ -+/** -+ * struct pvr_vm_context - TODO -+ */ -+struct pvr_vm_context { -+ /** -+ * @pvr_dev: TODO -+ */ -+ struct pvr_device *pvr_dev; -+ -+ /** @root_table: The root of the page table tree structure.*/ -+ struct pvr_page_table_l2 root_table; -+ -+ /** -+ * @mappings: TODO -+ */ -+ struct pvr_vm_mapping_tree mappings; -+ -+ /** -+ * @lock: Global lock on this entire structure of page tables. -+ * -+ * .. admonition:: Future work -+ * -+ * This "global" lock is potentially not the most efficient method -+ * of protecting the entire page table tree structure. Investigation -+ * into more granular methods would be a good idea. -+ */ -+ struct mutex lock; -+}; -+ -+dma_addr_t pvr_vm_get_page_catalogue_addr(struct pvr_vm_context *vm_ctx) -+{ -+ return vm_ctx->root_table.backing_page.dma_addr; -+} -+ -+/** -+ * pvr_vm_context_init() - TODO -+ * @vm_ctx: Target VM context. -+ * @pvr_dev: Target PowerVR device. -+ */ -+static int -+pvr_vm_context_init(struct pvr_vm_context *vm_ctx, struct pvr_device *pvr_dev) -+{ -+ int err; -+ -+ err = pvr_page_table_l2_init(&vm_ctx->root_table, pvr_dev); -+ if (err) -+ goto err_out; -+ -+ pvr_vm_mapping_tree_init(&vm_ctx->mappings); -+ -+ mutex_init(&vm_ctx->lock); -+ -+ vm_ctx->pvr_dev = pvr_dev; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_context_fini() - TODO -+ * @vm_ctx: Target VM context. -+ * @enable_warnings: Whether to print warnings for remaining mappings. -+ */ -+static void -+pvr_vm_context_fini(struct pvr_vm_context *vm_ctx, bool enable_warnings) -+{ -+ struct pvr_vm_mapping *mapping; -+ -+ /* Destroy any remaining mappings. */ -+ mutex_lock(&vm_ctx->lock); -+ -+ while ((mapping = pvr_vm_mapping_tree_iter_first(&vm_ctx->mappings, 0, U64_MAX)) != NULL) { -+ WARN(enable_warnings, "%s(%p) found [%llx,%llx]@%p", __func__, &vm_ctx->mappings, -+ pvr_vm_mapping_start(mapping), pvr_vm_mapping_last(mapping), mapping); -+ pvr_vm_mapping_unmap(vm_ctx, mapping); -+ pvr_vm_mapping_fini(mapping); -+ kfree(mapping); -+ } -+ -+ mutex_unlock(&vm_ctx->lock); -+ -+ mutex_destroy(&vm_ctx->lock); -+ pvr_vm_mapping_tree_fini(&vm_ctx->mappings); -+ pvr_page_table_l2_fini(&vm_ctx->root_table); -+} -+ -+static int -+pvr_vm_context_unmap_from_ptr(struct pvr_page_table_ptr *ptr, u64 nr_pages) -+{ -+ u64 page; -+ int err; -+ -+ if (nr_pages == 0) -+ return 0; -+ -+ /* -+ * Destroy first page outside loop, as it doesn't require a pointer -+ * increment beforehand. If the L0 page table reference in @ptr is -+ * %NULL, there cannot be a mapped page at @ptr (so skip ahead). -+ */ -+ if (ptr->l0_table) -+ pvr_page_destroy(ptr); -+ -+ for (page = 1; page < nr_pages; ++page) { -+ err = pvr_page_table_ptr_next_page(ptr, false); -+ /* -+ * If the page table tree structure at @ptr is incomplete, -+ * skip ahead. We don't care about unmapping pages that -+ * cannot exist. -+ * -+ * FIXME: This could be made more efficient by jumping ahead -+ * using pvr_page_table_ptr_set(). -+ */ -+ if (err == -ENXIO) -+ continue; -+ -+ if (err) -+ goto err_out; -+ -+ pvr_page_destroy(ptr); -+ } -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_context_unmap() - TODO -+ * @vm_ctx: Target memory context. -+ * @device_addr: First virtual device address to unmap. -+ * @nr_pages: Number of pages to unmap. -+ * -+ * The total amount of virtual memory unmapped by pvr_vm_context_unmap() -+ * is @nr_pages * 4KiB. -+ */ -+static int -+pvr_vm_context_unmap(struct pvr_vm_context *vm_ctx, u64 device_addr, -+ u64 nr_pages) -+{ -+ struct pvr_page_table_ptr ptr; -+ int err; -+ -+ err = pvr_page_table_ptr_init(&ptr, vm_ctx->pvr_dev, -+ &vm_ctx->root_table, device_addr, false); -+ if (err && err != -ENXIO) -+ goto err_out; -+ -+ err = pvr_vm_context_unmap_from_ptr(&ptr, nr_pages); -+ if (err) -+ goto err_ptr_fini; -+ -+ err = 0; -+ goto err_ptr_fini; -+ -+err_ptr_fini: -+ pvr_page_table_ptr_fini(&ptr); -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_vm_context_map_direct(struct pvr_vm_context *vm_ctx, dma_addr_t dma_addr, -+ u64 size, struct pvr_page_table_ptr *ptr, -+ struct pvr_page_flags_raw flags) -+{ -+ unsigned int pages = size >> PVR_DEVICE_PAGE_SHIFT; -+ unsigned int page; -+ -+ struct pvr_page_table_ptr ptr_copy; -+ -+ int err; -+ -+ /* -+ * Before progressing, save a copy of the start pointer so we can use -+ * it again if we enter an error state and have to destroy pages. -+ */ -+ pvr_page_table_ptr_copy(&ptr_copy, ptr); -+ -+ /* -+ * Create first page outside loop, as it doesn't require a pointer -+ * increment beforehand. -+ */ -+ err = pvr_page_create(ptr, dma_addr, flags); -+ if (err) -+ goto err_fini_ptr_copy; -+ -+ for (page = 1; page < pages; ++page) { -+ err = pvr_page_table_ptr_next_page(ptr, true); -+ if (err) -+ goto err_destroy_pages; -+ -+ dma_addr += PVR_DEVICE_PAGE_SIZE; -+ -+ err = pvr_page_create(ptr, dma_addr, flags); -+ if (err) -+ goto err_destroy_pages; -+ } -+ -+ err = 0; -+ goto err_fini_ptr_copy; -+ -+err_destroy_pages: -+ err = pvr_vm_context_unmap_from_ptr(&ptr_copy, page); -+ -+err_fini_ptr_copy: -+ pvr_page_table_ptr_fini(&ptr_copy); -+ -+ return err; -+} -+ -+/** -+ * pvr_vm_context_map_partial_sgl() - Map part of a scatter-gather table entry -+ * to virtual device memory. -+ * @vm_ctx: Target VM context. -+ * @sgl: Target scatter-gather table entry. -+ * @offset: Offset into @sgl to map from. Must result in a starting address -+ * from @sgl which is CPU page-aligned. -+ * @size: Size of the memory to be mapped in bytes. Must be a non-zero multiple -+ * of the device page size. -+ * @ptr: Page table pointer which points to the first page that should be -+ * mapped to. This will point to the last page mapped to on return. -+ * @page_flags: Page options to be applied to every virtual device memory page -+ * in the created mapping. -+ * -+ * Return: -+ * * 0 on success, or -+ * * -%EINVAL if the range specified by @offset and @size is not completely -+ * within @sgl. -+ */ -+static int -+pvr_vm_context_map_partial_sgl(struct pvr_vm_context *vm_ctx, -+ struct scatterlist *sgl, u64 offset, u64 size, -+ struct pvr_page_table_ptr *ptr, -+ struct pvr_page_flags_raw page_flags) -+{ -+ dma_addr_t dma_addr = sg_dma_address(sgl); -+ unsigned int dma_len = sg_dma_len(sgl); -+ -+ if (offset + size > dma_len || offset > dma_len) -+ return -EINVAL; -+ -+ return pvr_vm_context_map_direct(vm_ctx, dma_addr + offset, size, ptr, -+ page_flags); -+} -+ -+static int -+pvr_vm_context_map_sgl(struct pvr_vm_context *vm_ctx, struct scatterlist *sgl, -+ struct pvr_page_table_ptr *ptr, -+ struct pvr_page_flags_raw page_flags) -+{ -+ dma_addr_t dma_addr = sg_dma_address(sgl); -+ unsigned int dma_len = sg_dma_len(sgl); -+ -+ return pvr_vm_context_map_direct(vm_ctx, dma_addr, dma_len, ptr, -+ page_flags); -+} -+ -+/** -+ * pvr_vm_context_map_sgt() - Map an entire scatter-gather table into virtual -+ * device memory. -+ * @vm_ctx: Target VM context. -+ * @sgt: Target scatter-gather table. -+ * @device_addr: Virtual device address to map to. Must be device page-aligned. -+ * @page_flags: Page options to be applied to every virtual device memory page -+ * in the created mapping. -+ * -+ * Return: -+ * * 0 on success, or -+ * * ... -+ */ -+static int -+pvr_vm_context_map_sgt(struct pvr_vm_context *vm_ctx, struct sg_table *sgt, -+ u64 device_addr, struct pvr_page_flags_raw page_flags) -+{ -+ struct pvr_page_table_ptr ptr; -+ struct pvr_page_table_ptr ptr_copy; -+ -+ struct scatterlist *sgl; -+ unsigned int sgt_idx; -+ -+ u64 accumulated_size = 0; -+ u64 created_size; -+ -+ int err; -+ -+ /* -+ * Ensure that every sg table entry has a DMA address and length that -+ * is a multiple of the device page size. -+ */ -+ /* clang-format off */ -+ for_each_sgtable_dma_sg(sgt, sgl, sgt_idx) { -+ accumulated_size += sg_dma_len(sgl); -+ -+ if (sg_dma_address(sgl) & ~PVR_DEVICE_PAGE_MASK || -+ sg_dma_len(sgl) & ~PVR_DEVICE_PAGE_MASK) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ } -+ /* clang-format on */ -+ -+ err = pvr_page_table_ptr_init(&ptr, vm_ctx->pvr_dev, -+ &vm_ctx->root_table, device_addr, true); -+ if (err) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ /* -+ * Before progressing, save a copy of the start pointer so we can use -+ * it again if we enter an error state and have to destroy pages. -+ */ -+ pvr_page_table_ptr_copy(&ptr_copy, &ptr); -+ -+ /* -+ * Map first sg table entry outside loop, as it doesn't require a -+ * pointer increment beforehand. We know &sgl is valid here because an -+ * sg table must contain at least one entry. -+ */ -+ sgl = sgt->sgl; -+ err = pvr_vm_context_map_sgl(vm_ctx, sgl, &ptr, page_flags); -+ if (err) -+ goto err_fini_ptr; -+ -+ created_size = sg_dma_len(sgl); -+ -+ while ((sgl = sg_next(sgl))) { -+ err = pvr_page_table_ptr_next_page(&ptr, true); -+ if (err) { -+ err = -EINVAL; -+ goto err_unmap; -+ } -+ -+ err = pvr_vm_context_map_sgl(vm_ctx, sgl, &ptr, page_flags); -+ if (err) -+ goto err_unmap; -+ -+ created_size += sg_dma_len(sgl); -+ } -+ -+ err = 0; -+ goto err_fini_ptr_and_ptr_copy; -+ -+err_unmap: -+ pvr_vm_context_unmap_from_ptr(&ptr_copy, -+ created_size >> PVR_DEVICE_PAGE_SHIFT); -+ -+err_fini_ptr_and_ptr_copy: -+ pvr_page_table_ptr_fini(&ptr_copy); -+ -+err_fini_ptr: -+ pvr_page_table_ptr_fini(&ptr); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_context_map_partial_sgt() - Map part of a scatter-gather table into -+ * virtual device memory. -+ * @vm_ctx: Target VM context. -+ * @sgt: Target scatter-gather table. -+ * @sgt_offset: Offset into @sgt to map from. Must result in a starting -+ * address from @sgt which is CPU page-aligned. -+ * @device_addr: Virtual device address to map to. Must be device page-aligned. -+ * @size: Size of memory to be mapped in bytes. Must be a non-zero multiple -+ * of the device page size. -+ * @page_flags: Page options to be applied to every virtual device memory page -+ * in the created mapping. -+ * -+ * Return: -+ * * 0 on success, or -+ * * ... -+ */ -+static int -+pvr_vm_context_map_partial_sgt(struct pvr_vm_context *vm_ctx, -+ struct sg_table *sgt, u64 sgt_offset, -+ u64 device_addr, u64 size, -+ struct pvr_page_flags_raw page_flags) -+{ -+ struct pvr_page_table_ptr ptr; -+ struct pvr_page_table_ptr ptr_copy; -+ -+ struct scatterlist *sgl; -+ -+ struct scatterlist *first_sgl; -+ struct scatterlist *last_sgl; -+ -+ /* -+ * For these three (four) values: -+ * * "offset" refers to the position in the given sgl to start mapping -+ * from, and -+ * * "size" refers to the amount of that sgl to map. -+ * -+ * For &first_sgl, "size" is the distance between "offset" and the -+ * total size of the sgl. -+ * -+ * For &last_sgl, "offset" is always zero because it is contiguous with -+ * the previous sgl. The only case it would be non-zero is when the -+ * first and last sgls are the same, but this case is handled -+ * specially. -+ */ -+ u64 first_sgl_offset; -+ /* There is no last_sgl_offset (see above). */ -+ u64 first_sgl_size; -+ u64 last_sgl_size; -+ -+ u64 accumulated_size = 0; -+ u64 created_size; -+ -+ int err; -+ -+ /* @sgt must contain at least one entry. */ -+ if (!sgt->sgl) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ /* -+ * First, skip through the sg table until we hit an entry which -+ * contains sgt_offset. -+ */ -+ sgl = sgt->sgl; -+ do { -+ accumulated_size += sg_dma_len(sgl); -+ -+ if (accumulated_size > sgt_offset) -+ goto found_first_sgl; -+ } while ((sgl = sg_next(sgl)) != NULL); -+ -+ /* -+ * If we fall out of the loop above, we've reached the end of @sgt -+ * without finding the start of the requested range. -+ */ -+ err = -EINVAL; -+ goto err_out; -+ -+found_first_sgl: -+ /* Record the entry discovered in the loop above. */ -+ first_sgl = sgl; -+ first_sgl_size = accumulated_size - sgt_offset; -+ first_sgl_offset = sg_dma_len(first_sgl) - first_sgl_size; -+ -+ /* -+ * Ensure that sgt_offset is within the bounds of the sg table; that -+ * the DMA address given by the offset into the first sg table entry -+ * is aligned to the device page size, and that the part of the first -+ * sg table entry past the offset is a multiple of the device page -+ * size. -+ */ -+ if (accumulated_size < sgt_offset || -+ (sg_dma_address(sgl) + first_sgl_offset) & ~PVR_DEVICE_PAGE_MASK || -+ first_sgl_size & ~PVR_DEVICE_PAGE_MASK) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ /* -+ * Resume iterating through the sg table until we hit an entry which -+ * contains (sgt_offset + size). Use do-while here because the first -+ * and last entries could be the same. -+ */ -+ do { -+ if (accumulated_size >= sgt_offset + size) -+ goto found_last_sgl; -+ -+ accumulated_size += sg_dma_len(sgl); -+ -+ /* -+ * This check should technically be at the top of this loop. -+ * However, we've already performed it above for the first -+ * iteration, so we move it to the bottom to prevent evaluating -+ * it again. It will still be performed before every break -+ * conditional. -+ */ -+ if (sg_dma_address(sgl) & ~PVR_DEVICE_PAGE_MASK || -+ sg_dma_len(sgl) & ~PVR_DEVICE_PAGE_MASK) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ } while ((sgl = sg_next(sgl)) != NULL); -+ -+ /* -+ * If we fall out of the loop above, we've reached the end of @sgt -+ * without finding the end of the requested range. -+ */ -+ err = -EINVAL; -+ goto err_out; -+ -+found_last_sgl: -+ /* Record the entry discovered in the loop above. */ -+ last_sgl = sgl; -+ last_sgl_size = accumulated_size - (sgt_offset + size); -+ -+ /* -+ * Ensure (sgt_offset + size) is within the bounds of the sg table and -+ * that the part of the last sg table entry up to size is a -+ * multiple of the page size. -+ */ -+ if (accumulated_size < sgt_offset + size || -+ last_sgl_size & ~PVR_DEVICE_PAGE_MASK || -+ sg_dma_address(last_sgl) & ~PVR_DEVICE_PAGE_MASK) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ err = pvr_page_table_ptr_init(&ptr, vm_ctx->pvr_dev, -+ &vm_ctx->root_table, device_addr, true); -+ if (err) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ /* -+ * If we only need to look at a single sg table entry, do that now so -+ * we can apply both first_sgt_offset and last_sgt_size to it. -+ */ -+ if (first_sgl == last_sgl) { -+ err = pvr_vm_context_map_partial_sgl(vm_ctx, first_sgl, -+ first_sgl_offset, -+ last_sgl_size, &ptr, -+ page_flags); -+ if (err) -+ goto err_fini_ptr; -+ -+ /* -+ * Flag the L0 page table as requiring a flush when the page -+ * table pointer is destroyed. -+ */ -+ pvr_page_table_ptr_require_sync(&ptr, 0); -+ -+ goto out; -+ } -+ -+ /* -+ * Before progressing, save a copy of the start pointer so we can use -+ * it again if we enter an error state and have to destroy pages. -+ * This is not needed for the case covered above since there is no -+ * route to err_unmap from there. -+ */ -+ pvr_page_table_ptr_copy(&ptr_copy, &ptr); -+ -+ /* -+ * When multiple sgls are mapped, we do so in three stages. Stages one -+ * and three take care of the first and last sgls respectively. Each of -+ * these use the associated values "offset" and "size" described above. -+ * -+ * The remaining "middle" sgls are mapped in their entirety by stage -+ * two which does not need to care about those values. -+ * -+ * If the first and last sgls are adjacent (i.e. there are exactly two -+ * sgls to map), stage two is skipped. -+ */ -+ -+ /* [1/3] Map first page. */ -+ err = pvr_vm_context_map_partial_sgl(vm_ctx, first_sgl, -+ first_sgl_offset, first_sgl_size, -+ &ptr, page_flags); -+ if (err) -+ goto err_fini_ptr_and_ptr_copy; -+ -+ created_size = first_sgl_size; -+ -+ /* [2/3] Map middle pages (if any). */ -+ for (sgl = sg_next(first_sgl); sgl != last_sgl; sgl = sg_next(sgl)) { -+ err = pvr_page_table_ptr_next_page(&ptr, true); -+ if (err) { -+ err = -EINVAL; -+ goto err_unmap; -+ } -+ -+ err = pvr_vm_context_map_sgl(vm_ctx, sgl, &ptr, page_flags); -+ if (err) -+ goto err_unmap; -+ -+ created_size += sg_dma_len(sgl); -+ } -+ -+ /* [3/3] Map last page. */ -+ err = pvr_page_table_ptr_next_page(&ptr, true); -+ if (err) { -+ err = -EINVAL; -+ goto err_unmap; -+ } -+ -+ err = pvr_vm_context_map_partial_sgl(vm_ctx, last_sgl, 0, last_sgl_size, -+ &ptr, page_flags); -+ if (err) -+ goto err_unmap; -+ -+ /* -+ * No need to update &created_size here as there are no more routes -+ * to err_unmap past this point. -+ */ -+ -+out: -+ err = 0; -+ goto err_fini_ptr_and_ptr_copy; -+ -+err_unmap: -+ pvr_vm_context_unmap_from_ptr(&ptr_copy, -+ created_size >> PVR_DEVICE_PAGE_SHIFT); -+ -+err_fini_ptr_and_ptr_copy: -+ pvr_page_table_ptr_fini(&ptr_copy); -+ -+err_fini_ptr: -+ pvr_page_table_ptr_fini(&ptr); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * DOC: Memory mappings -+ * -+ * TODO -+ */ -+/** -+ * DOC: Memory mappings (constants) -+ * -+ * .. c:macro:: PVR_VM_MAPPING_COMPLETE -+ * -+ * This is a "magic" value which, when assigned to the -+ * &pvr_vm_mapping->pvr_obj_offset member of a &struct pvr_vm_mapping, -+ * indicates that it maps the entire associated &struct pvr_gem_object. -+ */ -+ -+#define PVR_VM_MAPPING_COMPLETE ((unsigned int)(UINT_MAX)) -+ -+/** -+ * struct pvr_vm_mapping - TODO -+ * -+ * This structure implicitly contains the device address and size of the -+ * mapping through @node members &pvr_vm_interval_tree_node.start and -+ * &pvr_vm_interval_tree_node.size respectively. -+ */ -+struct pvr_vm_mapping { -+ struct pvr_vm_interval_tree_node node; -+ struct pvr_gem_object *pvr_obj; -+ unsigned int pvr_obj_offset; -+ -+ bool slc_bypass; -+ bool pm_fw_protect; -+}; -+ -+/** -+ * DOC: Memory mappings (implementation) -+ */ -+ -+PVR_GEN_INTERVAL_TREE_WRAPPER_DEFS(pvr_vm_mapping, node) -+ -+static struct pvr_page_flags_raw -+pvr_vm_mapping_page_flags_raw(struct pvr_vm_mapping *mapping) -+{ -+ /* -+ * FIXME: There is currently no way to mark a mapping as read-only or -+ * cache-coherent. Should there be? -+ */ -+ return pvr_page_flags_raw_create(false, false, mapping->slc_bypass, -+ mapping->pm_fw_protect); -+} -+ -+/** -+ * pvr_vm_mapping_init_partial() - TODO -+ * @mapping: Target memory mapping. -+ * @device_addr: TODO -+ * @size: TODO -+ * @pvr_obj: TODO -+ * @pvr_obj_offset: TODO -+ * -+ * The memory behind @mapping should be zeroed before calling this function. -+ */ -+static void -+pvr_vm_mapping_init_partial(struct pvr_vm_mapping *mapping, u64 device_addr, -+ u64 size, struct pvr_gem_object *pvr_obj, -+ u64 pvr_obj_offset) -+{ -+ u64 flags = pvr_obj->flags; -+ -+ /* -+ * Increment the refcount on the underlying physical memory resource -+ * to prevent de-allocation while the mapping exists. -+ */ -+ pvr_gem_object_get(pvr_obj); -+ -+ mapping->pvr_obj = pvr_obj; -+ mapping->pvr_obj_offset = pvr_obj_offset; -+ -+ mapping->slc_bypass = flags & DRM_PVR_BO_DEVICE_BYPASS_CACHE; -+ mapping->pm_fw_protect = flags & DRM_PVR_BO_DEVICE_PM_FW_PROTECT; -+ -+ pvr_vm_interval_tree_node_init(&mapping->node, device_addr, size); -+} -+ -+/** -+ * pvr_vm_mapping_init() - TODO -+ * @mapping: Target memory mapping. -+ * @device_addr: TODO -+ * @pvr_obj: TODO -+ * -+ * Internally, this function just calls pvr_vm_mapping_init_partial() with the -+ * extra arguments &size and &pvr_obj_offset populated with the size of -+ * @pvr_obj and the "magic" constant %PVR_VM_MAPPING_COMPLETE respectively. -+ */ -+static __always_inline void -+pvr_vm_mapping_init(struct pvr_vm_mapping *mapping, u64 device_addr, -+ struct pvr_gem_object *pvr_obj) -+{ -+ pvr_vm_mapping_init_partial(mapping, device_addr, -+ pvr_gem_object_size(pvr_obj), pvr_obj, -+ PVR_VM_MAPPING_COMPLETE); -+} -+ -+static void -+pvr_vm_mapping_fini(struct pvr_vm_mapping *mapping) -+{ -+ pvr_vm_interval_tree_node_fini(&mapping->node); -+ -+ pvr_gem_object_put(mapping->pvr_obj); -+} -+ -+static int -+pvr_vm_mapping_map(struct pvr_vm_context *vm_ctx, -+ struct pvr_vm_mapping *mapping) -+{ -+ int err; -+ -+ if (!pvr_gem_object_is_imported(mapping->pvr_obj)) { -+ err = pvr_gem_object_get_pages(mapping->pvr_obj); -+ if (err) -+ goto err_out; -+ } -+ -+ if (mapping->pvr_obj_offset == PVR_VM_MAPPING_COMPLETE) { -+ err = pvr_vm_context_map_sgt( -+ vm_ctx, mapping->pvr_obj->sgt, -+ pvr_vm_mapping_start(mapping), -+ pvr_vm_mapping_page_flags_raw(mapping)); -+ } else { -+ err = pvr_vm_context_map_partial_sgt( -+ vm_ctx, mapping->pvr_obj->sgt, mapping->pvr_obj_offset, -+ pvr_vm_mapping_start(mapping), -+ pvr_vm_mapping_size(mapping), -+ pvr_vm_mapping_page_flags_raw(mapping)); -+ } -+ WARN_ON(pvr_vm_mmu_flush(vm_ctx->pvr_dev)); -+ if (err) -+ goto err_put_pages; -+ -+ pvr_vm_mapping_tree_insert(&vm_ctx->mappings, mapping); -+ -+ return 0; -+ -+err_put_pages: -+ if (!pvr_gem_object_is_imported(mapping->pvr_obj)) -+ pvr_gem_object_put_pages(mapping->pvr_obj); -+ -+err_out: -+ return err; -+} -+ -+static int -+pvr_vm_mapping_unmap(struct pvr_vm_context *vm_ctx, -+ struct pvr_vm_mapping *mapping) -+{ -+ int err; -+ -+ pvr_vm_mapping_tree_remove(&vm_ctx->mappings, mapping); -+ -+ err = pvr_vm_context_unmap(vm_ctx, pvr_vm_mapping_start(mapping), -+ pvr_vm_mapping_size(mapping) >> PVR_DEVICE_PAGE_SHIFT); -+ WARN_ON(pvr_vm_mmu_flush(vm_ctx->pvr_dev)); -+ if (err) -+ goto err_out; -+ -+ if (!pvr_gem_object_is_imported(mapping->pvr_obj)) -+ pvr_gem_object_put_pages(mapping->pvr_obj); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/* -+ * Public API -+ * -+ * For an overview of these functions, see *DOC: Public API* in "pvr_vm.h". -+ */ -+ -+/** -+ * pvr_device_addr_is_valid() - Tests whether a virtual device address -+ * is valid. -+ * @device_addr: Virtual device address to test. -+ * -+ * Return: -+ * * %true if @device_addr is within the valid range for a device page -+ * table and is aligned to the device page size, or -+ * * %false otherwise. -+ */ -+bool -+pvr_device_addr_is_valid(u64 device_addr) -+{ -+ return (device_addr & ~PVR_PAGE_TABLE_ADDR_MASK) == 0 && -+ (device_addr & ~PVR_DEVICE_PAGE_MASK) == 0; -+} -+ -+/** -+ * pvr_device_addr_and_size_are_valid() - Tests whether a device-virtual -+ * address and associated size are both valid. -+ * -+ * Calling pvr_device_addr_is_valid() twice (once on @size, and again on -+ * @device_addr + @size) to verify a device-virtual address range initially -+ * seems intuitive, but it produces a false-negative when the address range -+ * is right at the end of device-virtual address space. -+ * -+ * This function catches that corner case, as well as checking that -+ * @size is non-zero. -+ * -+ * Return: -+ * * %true if @device_addr is device page aligned; @size is device page -+ * aligned; the range specified by @device_addr and @size is within the -+ * bounds of the device-virtual address space, and @size is non-zero, or -+ * * %false otherwise. -+ */ -+bool -+pvr_device_addr_and_size_are_valid(u64 device_addr, u64 size) -+{ -+ return pvr_device_addr_is_valid(device_addr) && -+ size != 0 && (size & ~PVR_DEVICE_PAGE_MASK) == 0 && -+ (device_addr + size <= PVR_PAGE_TABLE_ADDR_SPACE_SIZE); -+} -+ -+/** -+ * pvr_vm_create_context() - Create a new VM context. -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Return: -+ * * A handle to the newly-minted VM context on success, -+ * * -%EINVAL if the feature "virtual address space bits" on @pvr_dev is -+ * missing or has an unsupported value, -+ * * -%ENOMEM if allocation of the structure behind the opaque handle fails, -+ * or -+ * * Any error encountered while setting up internal structures. -+ */ -+struct pvr_vm_context * -+pvr_vm_create_context(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ -+ struct pvr_vm_context *vm_ctx; -+ u16 device_addr_bits; -+ -+ int err; -+ -+ err = PVR_FEATURE_VALUE(pvr_dev, virtual_address_space_bits, -+ &device_addr_bits); -+ if (err) { -+ drm_err(drm_dev, -+ "Failed to get device virtual address space bits\n"); -+ goto err_out; -+ } -+ -+ if (device_addr_bits != PVR_PAGE_TABLE_ADDR_BITS) { -+ drm_err(drm_dev, -+ "Device has unsupported virtual address space size\n"); -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ vm_ctx = kzalloc(sizeof(*vm_ctx), GFP_KERNEL); -+ if (!vm_ctx) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ err = pvr_vm_context_init(vm_ctx, pvr_dev); -+ if (err) -+ goto err_free_vm_ctx; -+ -+ return vm_ctx; -+ -+err_free_vm_ctx: -+ kfree(vm_ctx); -+ -+err_out: -+ return ERR_PTR(err); -+} -+ -+/** -+ * pvr_vm_destroy_context() - Destroy an existing VM context. -+ * @vm_ctx: Target VM context. -+ * @enable_warnings: Whether to print warnings for remaining mappings. -+ * -+ * It is an error to call pvr_vm_destroy_context() on a VM context that has -+ * already been destroyed. -+ */ -+void -+pvr_vm_destroy_context(struct pvr_vm_context *vm_ctx, bool enable_warnings) -+{ -+ pvr_vm_context_fini(vm_ctx, enable_warnings); -+ kfree(vm_ctx); -+} -+ -+static int -+pvr_vm_map_mapping_locked(struct pvr_vm_context *vm_ctx, -+ struct pvr_vm_mapping *mapping) -+{ -+ u64 device_addr = pvr_vm_mapping_start(mapping); -+ u64 size = pvr_vm_mapping_size(mapping); -+ -+ int err; -+ -+ lockdep_assert_held(&vm_ctx->lock); -+ -+ /* -+ * Check that the requested mapping range does not overlap with an -+ * existing mapping. -+ */ -+ if (pvr_vm_mapping_tree_contains(&vm_ctx->mappings, device_addr, -+ size)) { -+ err = -EEXIST; -+ goto err_out; -+ } -+ -+ err = pvr_vm_mapping_map(vm_ctx, mapping); -+ if (err) -+ goto err_out; -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_map() - Map a section of physical memory into a section of virtual -+ * device memory. -+ * @vm_ctx: Target VM context. -+ * @pvr_obj: Target PowerVR memory object. -+ * @device_addr: Virtual device address at the start of the requested mapping. -+ * -+ * If you only need to map part of @pvr_obj, use pvr_vm_map_partial() instead. -+ * -+ * No handle is returned to represent the mapping. Instead, callers should -+ * remember @device_addr and use that as a handle. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if @device_addr is not a valid page-aligned virtual device -+ * address or any part of @pvr_obj is not device virtual page-aligned, -+ * * -%EEXIST if the requested mapping overlaps with an existing mapping, -+ * * -%ENOMEM if allocation of internally required CPU memory fails, or -+ * * Any error encountered while performing internal operations required to -+ * create the mapping. -+ */ -+int -+pvr_vm_map(struct pvr_vm_context *vm_ctx, struct pvr_gem_object *pvr_obj, -+ u64 device_addr) -+{ -+ size_t size = pvr_gem_object_size(pvr_obj); -+ -+ struct pvr_vm_mapping *mapping; -+ int err; -+ -+ if (!pvr_device_addr_and_size_are_valid(device_addr, size) || -+ size & ~PAGE_MASK) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ mapping = kzalloc(sizeof(*mapping), GFP_KERNEL); -+ if (!mapping) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ mutex_lock(&vm_ctx->lock); -+ -+ pvr_vm_mapping_init(mapping, device_addr, pvr_obj); -+ -+ err = pvr_vm_map_mapping_locked(vm_ctx, mapping); -+ if (err) -+ goto err_fini_mapping; -+ -+ err = 0; -+ goto err_unlock; -+ -+err_fini_mapping: -+ pvr_vm_mapping_fini(mapping); -+ kfree(mapping); -+ -+err_unlock: -+ mutex_unlock(&vm_ctx->lock); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_map_partial() - Map a section of physical memory into a section of -+ * virtual device memory. -+ * @vm_ctx: Target VM context. -+ * @pvr_obj: Target PowerVR memory object. -+ * @pvr_obj_offset: Offset into @pvr_obj to map from. -+ * @device_addr: Virtual device address at the start of the requested mapping. -+ * @size: Size of the requested mapping. -+ * -+ * If you need to map an entire @pvr_obj, use pvr_vm_map() instead. -+ * -+ * No handle is returned to represent the mapping. Instead, callers should -+ * remember @device_addr and use that as a handle. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if @device_addr is not a valid page-aligned virtual device -+ * address; the region specified by @pvr_obj_offset and @size does not fall -+ * entirely within @pvr_obj, or any part of the specified region of @pvr_obj -+ * is not device virtual page-aligned, -+ * * -%EEXIST if the requested mapping overlaps with an existing mapping, -+ * * -%ENOMEM if allocation of internally required CPU memory fails, or -+ * * Any error encountered while performing internal operations required to -+ * create the mapping. -+ */ -+int -+pvr_vm_map_partial(struct pvr_vm_context *vm_ctx, -+ struct pvr_gem_object *pvr_obj, u64 pvr_obj_offset, -+ u64 device_addr, u64 size) -+{ -+ size_t pvr_obj_size = pvr_gem_object_size(pvr_obj); -+ -+ struct pvr_vm_mapping *mapping; -+ int err; -+ -+ if (!pvr_device_addr_and_size_are_valid(device_addr, size) || -+ pvr_obj_offset & ~PAGE_MASK || size & ~PAGE_MASK || -+ pvr_obj_offset + size > pvr_obj_size || -+ pvr_obj_offset > pvr_obj_size) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ mapping = kzalloc(sizeof(*mapping), GFP_KERNEL); -+ if (!mapping) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ mutex_lock(&vm_ctx->lock); -+ -+ pvr_vm_mapping_init_partial(mapping, device_addr, size, pvr_obj, -+ pvr_obj_offset); -+ -+ err = pvr_vm_map_mapping_locked(vm_ctx, mapping); -+ if (err) -+ goto err_fini_mapping; -+ -+ err = 0; -+ goto err_unlock; -+ -+err_fini_mapping: -+ pvr_vm_mapping_fini(mapping); -+ kfree(mapping); -+ -+err_unlock: -+ mutex_unlock(&vm_ctx->lock); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_unmap() - Unmap an already mapped section of virtual device memory. -+ * @vm_ctx: Target VM context. -+ * @device_addr: Virtual device address at the start of the target mapping. -+ * -+ * Return: -+ * * 0 on success, -+ * * -%EINVAL if @device_addr is not a valid page-aligned virtual device -+ * address, -+ * * -%ENOENT if @device_addr is not a handle to an existing mapping, or -+ * * Any error encountered while performing internal operations required to -+ * destroy the mapping. -+ */ -+int -+pvr_vm_unmap(struct pvr_vm_context *vm_ctx, u64 device_addr) -+{ -+ struct pvr_vm_mapping *mapping; -+ int err; -+ -+ if (!pvr_device_addr_is_valid(device_addr)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ mutex_lock(&vm_ctx->lock); -+ -+ mapping = pvr_vm_mapping_tree_iter_first(&vm_ctx->mappings, -+ device_addr, 0); -+ if (!mapping || pvr_vm_mapping_start(mapping) != device_addr) { -+ err = -ENOENT; -+ goto err_unlock; -+ } -+ -+ err = pvr_vm_mapping_unmap(vm_ctx, mapping); -+ if (err) -+ goto err_unlock; -+ -+ pvr_vm_mapping_fini(mapping); -+ kfree(mapping); -+ -+ err = 0; -+ goto err_unlock; -+ -+err_unlock: -+ mutex_unlock(&vm_ctx->lock); -+ -+err_out: -+ return err; -+} -+ -+/* -+ * Static data areas are determined by firmware. Each array must be kept -+ * in order of increasing offset, as this is used to determine the size of the -+ * reserved area for each heap. -+ */ -+static const struct drm_pvr_static_data_area general_static_data_areas[] = { -+ { -+ .id = DRM_PVR_STATIC_DATA_AREA_FENCE, -+ .offset = 0, -+ .size = 128, -+ }, -+ { -+ .id = DRM_PVR_STATIC_DATA_AREA_YUV_CSC, -+ .offset = 128, -+ .size = 1024, -+ }, -+}; -+ -+static const struct drm_pvr_static_data_area pds_static_data_areas[] = { -+ { -+ .id = DRM_PVR_STATIC_DATA_AREA_VDM_SYNC, -+ .offset = 0, -+ .size = 128, -+ }, -+ { -+ .id = DRM_PVR_STATIC_DATA_AREA_EOT, -+ .offset = 128, -+ .size = 128, -+ }, -+}; -+ -+static const struct drm_pvr_static_data_area usc_static_data_areas[] = { -+ { -+ .id = DRM_PVR_STATIC_DATA_AREA_VDM_SYNC, -+ .offset = 0, -+ .size = 128, -+ }, -+}; -+ -+#define LAST_AREA(areas) (areas[ARRAY_SIZE(areas) - 1]) -+ -+#define GET_RESERVED_SIZE(areas) round_up((LAST_AREA(areas).offset + LAST_AREA(areas).size), \ -+ PAGE_SIZE) -+ -+static const struct pvr_heap pvr_heaps[] = { -+ { -+ .id = DRM_PVR_HEAP_GENERAL, -+ .flags = 0, -+ .base = ROGUE_GENERAL_HEAP_BASE, -+ .size = ROGUE_GENERAL_HEAP_SIZE, -+ .reserved_base = ROGUE_GENERAL_HEAP_BASE, -+ .reserved_size = GET_RESERVED_SIZE(general_static_data_areas), -+ .page_size_log2 = 12, -+ .static_data_areas = general_static_data_areas, -+ .nr_static_data_areas = ARRAY_SIZE(general_static_data_areas), -+ }, -+ { -+ .id = DRM_PVR_HEAP_PDS_CODE_DATA, -+ .flags = 0, -+ .base = ROGUE_PDSCODEDATA_HEAP_BASE, -+ .size = ROGUE_PDSCODEDATA_HEAP_SIZE, -+ .reserved_base = ROGUE_PDSCODEDATA_HEAP_BASE, -+ .reserved_size = GET_RESERVED_SIZE(pds_static_data_areas), -+ .page_size_log2 = 12, -+ .static_data_areas = pds_static_data_areas, -+ .nr_static_data_areas = ARRAY_SIZE(pds_static_data_areas), -+ }, -+ { -+ .id = DRM_PVR_HEAP_USC_CODE, -+ .flags = 0, -+ .base = ROGUE_USCCODE_HEAP_BASE, -+ .size = ROGUE_USCCODE_HEAP_SIZE, -+ .reserved_base = ROGUE_USCCODE_HEAP_BASE, -+ .reserved_size = GET_RESERVED_SIZE(usc_static_data_areas), -+ .page_size_log2 = 12, -+ .static_data_areas = usc_static_data_areas, -+ .nr_static_data_areas = ARRAY_SIZE(usc_static_data_areas), -+ }, -+}; -+ -+static const struct pvr_heap rgnhdr_heap = { -+ .id = DRM_PVR_HEAP_RGNHDR, -+ .flags = 0, -+ .base = ROGUE_RGNHDR_HEAP_BASE, -+ .size = ROGUE_RGNHDR_HEAP_SIZE, -+ .reserved_base = 0, -+ .reserved_size = 0, -+ .page_size_log2 = 12, -+}; -+ -+static __always_inline u32 -+pvr_get_nr_heaps(struct pvr_device *pvr_dev) -+{ -+ u32 heaps = ARRAY_SIZE(pvr_heaps); -+ -+ /* Region header heap is only present if BRN63142 is present. */ -+ if (PVR_HAS_QUIRK(pvr_dev, 63142)) -+ heaps++; -+ -+ return heaps; -+} -+ -+int -+pvr_get_heap_info(struct pvr_device *pvr_dev, struct drm_pvr_ioctl_get_heap_info_args *args) -+{ -+ int err; -+ -+ if (args->data) { -+ const struct pvr_heap *pvr_heap; -+ -+ if (args->heap_nr < ARRAY_SIZE(pvr_heaps)) { -+ pvr_heap = &pvr_heaps[args->heap_nr]; -+ } else if (args->heap_nr == ARRAY_SIZE(pvr_heaps) && -+ PVR_HAS_QUIRK(pvr_dev, 63142)) { -+ /* Region header heap is only present if BRN63142 is present. */ -+ pvr_heap = &rgnhdr_heap; -+ } else { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ switch (args->op) { -+ case DRM_PVR_HEAP_OP_GET_HEAP_INFO: { -+ struct drm_pvr_heap heap_out; -+ -+ heap_out.id = pvr_heap->id; -+ heap_out.flags = pvr_heap->flags; -+ heap_out.base = pvr_heap->base; -+ heap_out.size = pvr_heap->size; -+ heap_out.reserved_base = pvr_heap->reserved_base; -+ heap_out.reserved_size = pvr_heap->reserved_size; -+ heap_out.page_size_log2 = pvr_heap->page_size_log2; -+ heap_out.nr_static_data_areas = pvr_heap->nr_static_data_areas; -+ -+ if (copy_to_user(u64_to_user_ptr(args->data), &heap_out, -+ sizeof(heap_out))) { -+ err = -EFAULT; -+ goto err_out; -+ } -+ break; -+ } -+ -+ case DRM_PVR_HEAP_OP_GET_STATIC_DATA_AREAS: { -+ if (!pvr_heap->nr_static_data_areas) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (copy_to_user(u64_to_user_ptr(args->data), -+ pvr_heap->static_data_areas, -+ pvr_heap->nr_static_data_areas * -+ sizeof(struct drm_pvr_static_data_area))) { -+ err = -EFAULT; -+ goto err_out; -+ } -+ break; -+ } -+ -+ default: -+ err = -EINVAL; -+ goto err_out; -+ } -+ } -+ -+ /* Always write the number of heaps, regardless of whether a data pointer was provided. */ -+ args->nr_heaps = pvr_get_nr_heaps(pvr_dev); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_heap_contains_range() - Determine if a given heap contains the specified -+ * device-virtual address range. -+ * @heap: Target heap. -+ * @start: Inclusive start of the target range. -+ * @end: Inclusive end of the target range. -+ * -+ * It is an error to call this function with values of @start and @end that do -+ * not satisfy the condition @start <= @end. -+ * -+ * Return: -+ * * %true iff @heap completely contains the range specified by @start and -+ * @end, or -+ * * %false otherwise. -+ */ -+static __always_inline bool -+pvr_heap_contains_range(const struct pvr_heap *pvr_heap, u64 start, u64 end) -+{ -+ return pvr_heap->base <= start && end < pvr_heap->base + pvr_heap->size; -+} -+ -+/** -+ * pvr_find_heap_containing() - Find a heap which contains the specified -+ * device-virtual address range. -+ * @pvr_dev: Target PowerVR device. -+ * @start: Start of the target range. -+ * @size: Size of the target range. -+ * -+ * Return: -+ * * A pointer to a constant instance of struct drm_pvr_heap representing the -+ * heap containing the entire range specified by @start and @size on -+ * success, or -+ * * %NULL if no such heap exists. -+ */ -+const struct pvr_heap * -+pvr_find_heap_containing(struct pvr_device *pvr_dev, u64 start, u64 size) -+{ -+ u32 heap_id; -+ u64 end; -+ -+ if (check_add_overflow(start, size - 1, &end)) -+ return NULL; -+ -+ /* -+ * There are no optimizations to be made here, since there are no -+ * guarantees about the order of &pvr_heaps. Iterate over the entire -+ * array. -+ */ -+ for (heap_id = 0; heap_id < ARRAY_SIZE(pvr_heaps); ++heap_id) { -+ /* -+ * If the target range is completely within this heap, break -+ * out and return the heap. -+ */ -+ if (pvr_heap_contains_range(&pvr_heaps[heap_id], start, end)) -+ return &pvr_heaps[heap_id]; -+ } -+ -+ /* Search quirky heaps only if the associated quirk is present. */ -+ if (PVR_HAS_QUIRK(pvr_dev, 63142) && -+ pvr_heap_contains_range(&rgnhdr_heap, start, end)) { -+ return &rgnhdr_heap; -+ } -+ -+ /* If we make it this far, we've exhausted all possible heaps. */ -+ return NULL; -+} -+ -+/** -+ * pvr_vm_find_gem_object() - Look up a buffer object from a given virtual -+ * device address. -+ * @vm_ctx: [IN] Target VM context. -+ * @device_addr: [IN] Virtual device address at the start of the required -+ * object. -+ * @mapped_offset_out: [OUT] Pointer to location to write offset of the start -+ * of the mapped region within the buffer object. May be %NULL if this -+ * information is not required. -+ * @mapped_size_out: [OUT] Pointer to location to write size of the mapped -+ * region. May be %NULL if this information is not required. -+ * -+ * If successful, a reference will be taken on the buffer object. The caller -+ * must drop the reference with pvr_gem_object_put(). -+ * -+ * Return: -+ * * The PowerVR buffer object mapped at @device_addr if one exists, or -+ * * -%EINVAL otherwise. -+ */ -+struct pvr_gem_object * -+pvr_vm_find_gem_object(struct pvr_vm_context *vm_ctx, u64 device_addr, -+ u64 *mapped_offset_out, u64 *mapped_size_out) -+{ -+ struct pvr_vm_mapping *mapping; -+ struct pvr_gem_object *pvr_obj; -+ int err; -+ -+ mutex_lock(&vm_ctx->lock); -+ -+ mapping = pvr_vm_mapping_tree_iter_first(&vm_ctx->mappings, -+ device_addr, 0); -+ if (!mapping || pvr_vm_mapping_start(mapping) != device_addr) { -+ err = -EINVAL; -+ goto err_unlock; -+ } -+ -+ pvr_obj = mapping->pvr_obj; -+ if (WARN_ON(!pvr_obj)) { -+ err = -EINVAL; -+ goto err_unlock; -+ } -+ -+ pvr_gem_object_get(pvr_obj); -+ -+ if (mapped_offset_out) -+ *mapped_offset_out = mapping->pvr_obj_offset; -+ if (mapped_size_out) -+ *mapped_size_out = pvr_vm_mapping_size(mapping); -+ -+ mutex_unlock(&vm_ctx->lock); -+ -+ return pvr_obj; -+ -+err_unlock: -+ mutex_unlock(&vm_ctx->lock); -+ -+ return ERR_PTR(err); -+} -+ -+/** -+ * pvr_vm_fw_mem_context_create() - Create firmware memory context -+ * @pvr_file: Pointer to pvr_file structure. -+ * -+ * Returns: -+ * * 0 on success, or -+ * * Any error returned by pvr_gem_create_and_map_fw_object(). -+ */ -+int pvr_vm_fw_mem_context_create(struct pvr_file *pvr_file) -+{ -+ struct pvr_vm_context *vm_ctx = pvr_file->user_vm_ctx; -+ struct rogue_fwif_fwmemcontext *fw_mem_ctx; -+ int err; -+ -+ fw_mem_ctx = pvr_gem_create_and_map_fw_object(pvr_file->pvr_dev, sizeof(*fw_mem_ctx), -+ PVR_BO_FW_FLAGS_DEVICE_UNCACHED | DRM_PVR_BO_CREATE_ZEROED, -+ &pvr_file->fw_mem_ctx_obj); -+ if (IS_ERR(fw_mem_ctx)) { -+ err = PTR_ERR(fw_mem_ctx); -+ goto err_out; -+ } -+ -+ fw_mem_ctx->pc_dev_paddr = vm_ctx->root_table.backing_page.dma_addr; -+ fw_mem_ctx->page_cat_base_reg_id = ROGUE_FW_BIF_INVALID_PCREG; -+ -+ pvr_fw_object_vunmap(pvr_file->fw_mem_ctx_obj, fw_mem_ctx, true); -+ -+ return 0; -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_fw_mem_context_destroy() - Destroy firmware memory context -+ * @pvr_file: Pointer to pvr_file structure. -+ */ -+void pvr_vm_fw_mem_context_destroy(struct pvr_file *pvr_file) -+{ -+ pvr_fw_object_release(pvr_file->fw_mem_ctx_obj); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_vm.h b/drivers/gpu/drm/imagination/pvr_vm.h -new file mode 100644 -index 000000000000..6a97e3c754d7 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_vm.h -@@ -0,0 +1,192 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_VM_H__ -+#define __PVR_VM_H__ -+ -+#include "pvr_rogue_mmu_defs.h" -+ -+#include <uapi/drm/pvr_drm.h> -+ -+#include <linux/bitops.h> -+#include <linux/types.h> -+ -+/* Forward declaration from "pvr_device.h" */ -+struct pvr_device; -+struct pvr_file; -+ -+/* Forward declaration from "pvr_gem.h" */ -+struct pvr_gem_object; -+ -+/* Forward declaration of opaque handle from "pvr_vm.c" */ -+struct pvr_vm_context; -+ -+/* Forward declaration from uapi/drm/pvr_drm.h. */ -+struct drm_pvr_ioctl_get_heap_info_args; -+ -+/** -+ * DOC: Public API -+ * -+ * The public-facing API of our virtual memory management is exposed as 7 -+ * functions (well, 6 and a helper) along with an opaque handle type. -+ * -+ * The opaque handle is &struct pvr_vm_context. This holds a "global state", -+ * including a complete page table tree structure. You do not need to consider -+ * this internal structure (or anything else in &struct pvr_vm_context) when -+ * using this API; it is designed to operate as a black box. -+ * -+ * Usage -+ * ----- -+ * Begin by calling pvr_vm_create_context() to obtain a VM context. It is bound -+ * to a PowerVR device (&struct pvr_device) and holds a reference to it. This -+ * binding is immutable. -+ * -+ * Once you're finished with a VM context, call pvr_vm_destroy_context() to -+ * release it. This should be done before freeing or otherwise releasing the -+ * PowerVR device to which the VM context is bound. -+ * -+ * It is an error to destroy a VM context while it still contains valid -+ * allocation ranges (and by extension, memory mappings). The operation will -+ * succeed, but memory will be leaked and kernel warnings will be printed. -+ * -+ * Mappings -+ * ~~~~~~~~ -+ * Physical memory is exposed to the device via **mappings**. Mappings may -+ * never overlap, although any given region of physical memory may be -+ * referenced by multiple mappings. -+ * -+ * Use pvr_vm_map() to create a mapping, providing a &struct pvr_gem_object -+ * holding the physical memory to be mapped. The physical memory behind the -+ * object does not have to be contiguous (it may be backed by a scatter-gather -+ * table) but each contiguous "section" must be device page-aligned. This -+ * restriction is checked by pvr_vm_map(), which returns -%EINVAL if the check -+ * fails. -+ * -+ * If only part of the &struct pvr_gem_object must be mapped, use -+ * pvr_vm_map_partial() instead. In addition to the parameters accepted by -+ * pvr_vm_map(), this also takes an offset into the the object and the size of -+ * the mapping to be created. The restrictions regarding alignment on -+ * pvr_vm_map() also apply here, with the exception that only the region of the -+ * object within the bounds specified by the offset and size must satisfy them. -+ * These are checked by pvr_vm_map_partial(), along with the offset and size -+ * values to ensure that the region they specify falls entirely within the -+ * bounds of the provided object. -+ * -+ * Both of these mapping functions call pvr_gem_object_get() to ensure the -+ * underlying physical memory is not freed until *after* the mapping is -+ * released. -+ * -+ * Mappings are tracked internally so that it is theoretically impossible to -+ * accidentally create overlapping mappings. No handle is returned after a -+ * mapping operation succeeds; callers should instead use the start device -+ * virtual address of the mapping as its handle. -+ * -+ * When mapped memory is no longer required by the device, it should be -+ * unmapped using pvr_vm_unmap(). In addition to making the memory inaccessible -+ * to the device, this will call pvr_gem_object_put() to release the -+ * underlying physical memory. If the mapping held the last reference, the -+ * physical memory will automatically be freed. Attempting to unmap an invalid -+ * mapping (or one that has already been unmapped) will result in an -%ENOENT -+ * error. -+ */ -+/** -+ * DOC: Public API (constants) -+ * -+ * .. c:macro:: PVR_DEVICE_PAGE_SIZE -+ * -+ * Fixed page size referenced by leaf nodes in the page table tree -+ * structure. -+ * -+ * .. admonition:: Future work -+ * -+ * The PowerVR device MMU supports multiple page sizes (6 of them!). -+ * While we currently only support 4KiB pages (the smallest), this -+ * constant (as well as the two derived values %PVR_DEVICE_PAGE_SHIFT and -+ * %PVR_DEVICE_PAGE_MASK) may have to become a lookup table at some point -+ * to support some or all of the additional page sizes. -+ * -+ * .. c:macro:: PVR_DEVICE_PAGE_SHIFT -+ * -+ * Shift value used to efficiently multiply or divide by -+ * %PVR_DEVICE_PAGE_SIZE. -+ * -+ * .. c:macro:: PVR_DEVICE_PAGE_MASK -+ * -+ * Mask used to round a value down to the nearest multiple of -+ * %PVR_DEVICE_PAGE_SIZE. When bitwise negated, it will indicate whether a -+ * value is already a multiple of %PVR_DEVICE_PAGE_SIZE. -+ */ -+ -+/* PVR_DEVICE_PAGE_SIZE determines the page size */ -+#define PVR_DEVICE_PAGE_SIZE (SZ_4K) -+#define PVR_DEVICE_PAGE_SHIFT (__ffs(PVR_DEVICE_PAGE_SIZE)) -+#define PVR_DEVICE_PAGE_MASK (~(PVR_DEVICE_PAGE_SIZE - 1)) -+ -+struct pvr_heap { -+ /** @id: Heap ID. */ -+ enum drm_pvr_heap_id id; -+ -+ /** @flags: Flags for this heap. Currently always 0. */ -+ u32 flags; -+ -+ /** @base: Base address of heap. */ -+ u64 base; -+ -+ /** @size: Size of heap, in bytes. */ -+ u64 size; -+ -+ /** @reserved_base: Base address of reserved area. */ -+ u64 reserved_base; -+ -+ /** -+ * @reserved_size: Size of reserved area, in bytes. May be 0 if this -+ * heap has no reserved area. -+ */ -+ u64 reserved_size; -+ -+ /** @page_size_log2: Log2 of page size. */ -+ u32 page_size_log2; -+ -+ /** @nr_static_data_areas: Number of static data areas in this heap. */ -+ u32 nr_static_data_areas; -+ -+ /** -+ * @static_data_areas: Pointer to description of static data areas in this heap. May be -+ * %NULL if &nr_static_data_areas is 0. -+ */ -+ const struct drm_pvr_static_data_area *static_data_areas; -+}; -+ -+/* Functions defined in pvr_vm.c */ -+ -+bool pvr_device_addr_is_valid(u64 device_addr); -+bool pvr_device_addr_and_size_are_valid(u64 device_addr, u64 size); -+ -+struct pvr_vm_context *pvr_vm_create_context(struct pvr_device *pvr_dev); -+void pvr_vm_destroy_context(struct pvr_vm_context *vm_ctx, bool enable_warnings); -+ -+int pvr_vm_map(struct pvr_vm_context *vm_ctx, struct pvr_gem_object *pvr_obj, -+ u64 device_addr); -+int pvr_vm_map_partial(struct pvr_vm_context *vm_ctx, -+ struct pvr_gem_object *pvr_obj, u64 pvr_obj_offset, -+ u64 device_addr, u64 size); -+int pvr_vm_unmap(struct pvr_vm_context *vm_ctx, u64 device_addr); -+ -+dma_addr_t pvr_vm_get_page_catalogue_addr(struct pvr_vm_context *vm_ctx); -+ -+int -+pvr_get_heap_info(struct pvr_device *pvr_dev, struct drm_pvr_ioctl_get_heap_info_args *args); -+ -+const struct pvr_heap * -+pvr_find_heap_containing(struct pvr_device *pvr_dev, u64 addr, u64 size); -+ -+struct pvr_gem_object * -+pvr_vm_find_gem_object(struct pvr_vm_context *vm_ctx, u64 device_addr, -+ u64 *mapped_offset_out, u64 *mapped_size_out); -+int pvr_vm_fw_mem_context_create(struct pvr_file *pvr_file); -+void pvr_vm_fw_mem_context_destroy(struct pvr_file *pvr_file); -+ -+int -+pvr_vm_mmu_flush(struct pvr_device *pvr_dev); -+ -+#endif /* __PVR_VM_H__ */ -diff --git a/drivers/gpu/drm/imagination/pvr_vm_mips.c b/drivers/gpu/drm/imagination/pvr_vm_mips.c -new file mode 100644 -index 000000000000..1b88b009e991 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_vm_mips.c -@@ -0,0 +1,220 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#include "pvr_device.h" -+#include "pvr_fw_mips.h" -+#include "pvr_gem.h" -+#include "pvr_rogue_mips.h" -+#include "pvr_vm_mips.h" -+ -+#include <linux/err.h> -+#include <linux/slab.h> -+#include <linux/types.h> -+ -+/** -+ * pvr_vm_mips_init() - Initialise MIPS FW pagetable -+ * @pvr_dev: Target PowerVR device. -+ * -+ * Returns: -+ * * 0 on success, -+ * * -%EINVAL, -+ * * Any error returned by pvr_gem_object_create(), or -+ * * And error returned by pvr_gem_object_vmap(). -+ */ -+int -+pvr_vm_mips_init(struct pvr_device *pvr_dev) -+{ -+ u32 pt_size = 1 << ROGUE_MIPSFW_LOG2_PAGETABLE_SIZE_4K(pvr_dev); -+ struct pvr_fw_mips_data *mips_data; -+ u32 phys_bus_width; -+ int err; -+ -+ /* Page table size must be at most ROGUE_MIPSFW_MAX_NUM_PAGETABLE_PAGES * 4k pages. */ -+ if (pt_size > ROGUE_MIPSFW_MAX_NUM_PAGETABLE_PAGES * SZ_4K) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (PVR_FEATURE_VALUE(pvr_dev, phys_bus_width, &phys_bus_width)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ mips_data = kzalloc(sizeof(*mips_data), GFP_KERNEL); -+ if (!mips_data) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ mips_data->pt_obj = pvr_gem_object_create(pvr_dev, pt_size, -+ DRM_PVR_BO_DEVICE_PM_FW_PROTECT | -+ DRM_PVR_BO_CREATE_ZEROED); -+ if (IS_ERR(mips_data->pt_obj)) { -+ err = PTR_ERR(mips_data->pt_obj); -+ goto err_kfree; -+ } -+ -+ mips_data->pt = pvr_gem_object_vmap(mips_data->pt_obj, false); -+ if (IS_ERR(mips_data->pt)) { -+ err = PTR_ERR(mips_data->pt); -+ goto err_put_obj; -+ } -+ -+ mips_data->pfn_mask = (phys_bus_width > 32) ? ROGUE_MIPSFW_ENTRYLO_PFN_MASK_ABOVE_32BIT : -+ ROGUE_MIPSFW_ENTRYLO_PFN_MASK; -+ -+ mips_data->cache_policy = (phys_bus_width > 32) ? ROGUE_MIPSFW_CACHED_POLICY_ABOVE_32BIT : -+ ROGUE_MIPSFW_CACHED_POLICY; -+ -+ pvr_dev->fw_data.mips_data = mips_data; -+ -+ return 0; -+ -+err_put_obj: -+ pvr_gem_object_put(mips_data->pt_obj); -+ -+err_kfree: -+ kfree(mips_data); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_mips_fini() - Release MIPS FW pagetable -+ * @pvr_dev: Target PowerVR device. -+ */ -+void -+pvr_vm_mips_fini(struct pvr_device *pvr_dev) -+{ -+ struct pvr_fw_mips_data *mips_data = pvr_dev->fw_data.mips_data; -+ -+ pvr_gem_object_vunmap(mips_data->pt_obj, mips_data->pt, false); -+ pvr_gem_object_put(mips_data->pt_obj); -+ kfree(mips_data); -+ pvr_dev->fw_data.mips_data = NULL; -+} -+ -+static u32 -+get_mips_pte_flags(bool read, bool write, int cache_policy) -+{ -+ u32 flags = 0; -+ -+ if (read && write) /* Read/write. */ -+ flags |= ROGUE_MIPSFW_ENTRYLO_DIRTY_EN; -+ else if (write) /* Write only. */ -+ flags |= ROGUE_MIPSFW_ENTRYLO_READ_INHIBIT_EN; -+ else -+ WARN_ON(!read); -+ -+ flags |= cache_policy << ROGUE_MIPSFW_ENTRYLO_CACHE_POLICY_SHIFT; -+ -+ flags |= ROGUE_MIPSFW_ENTRYLO_VALID_EN | ROGUE_MIPSFW_ENTRYLO_GLOBAL_EN; -+ -+ return flags; -+} -+ -+/** -+ * pvr_vm_mips_map() - Map a FW object into MIPS address space -+ * @pvr_dev: Target PowerVR device. -+ * @fw_obj: FW object to map. -+ * -+ * Returns: -+ * * 0 on success, -+ * * -%EINVAL if object does not reside within FW address space, or -+ * * Any error returned by pvr_fw_get_dma_addr(). -+ */ -+int -+pvr_vm_mips_map(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj) -+{ -+ struct pvr_fw_mips_data *mips_data = pvr_dev->fw_data.mips_data; -+ struct pvr_gem_object *pvr_obj = &fw_obj->base; -+ u64 start = fw_obj->fw_mm_node.start; -+ u64 size = fw_obj->fw_mm_node.size; -+ u64 end; -+ u32 cache_policy; -+ u32 pte_flags; -+ u32 start_pfn; -+ u32 end_pfn; -+ u32 pfn; -+ int err; -+ -+ if (check_add_overflow(start, size - 1, &end)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ if (start < ROGUE_FW_HEAP_BASE || -+ start >= ROGUE_FW_HEAP_BASE + pvr_dev->fw_heap_info.raw_size || -+ end < ROGUE_FW_HEAP_BASE || -+ end >= ROGUE_FW_HEAP_BASE + pvr_dev->fw_heap_info.raw_size || -+ (start & ROGUE_MIPSFW_PAGE_MASK_4K) || -+ ((end + 1) & ROGUE_MIPSFW_PAGE_MASK_4K)) { -+ err = -EINVAL; -+ goto err_out; -+ } -+ -+ start_pfn = (start & pvr_dev->fw_heap_info.offset_mask) >> ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K; -+ end_pfn = (end & pvr_dev->fw_heap_info.offset_mask) >> ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K; -+ -+ if (pvr_obj->flags & PVR_BO_FW_FLAGS_DEVICE_UNCACHED) -+ cache_policy = ROGUE_MIPSFW_UNCACHED_CACHE_POLICY; -+ else -+ cache_policy = mips_data->cache_policy; -+ -+ pte_flags = get_mips_pte_flags(true, true, cache_policy); -+ -+ for (pfn = start_pfn; pfn <= end_pfn; pfn++) { -+ dma_addr_t dma_addr; -+ u32 pte; -+ -+ err = pvr_fw_get_dma_addr(fw_obj, -+ (pfn - start_pfn) << ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K, -+ &dma_addr); -+ if (err) -+ goto err_unmap_pages; -+ -+ pte = ((dma_addr >> ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K) -+ << ROGUE_MIPSFW_ENTRYLO_PFN_SHIFT) & mips_data->pfn_mask; -+ pte |= pte_flags; -+ -+ WRITE_ONCE(mips_data->pt[pfn], pte); -+ } -+ -+ pvr_vm_mmu_flush(pvr_dev); -+ -+ return 0; -+ -+err_unmap_pages: -+ for (; pfn >= start_pfn; pfn--) -+ WRITE_ONCE(mips_data->pt[pfn], 0); -+ -+ pvr_vm_mmu_flush(pvr_dev); -+ -+err_out: -+ return err; -+} -+ -+/** -+ * pvr_vm_mips_unmap() - Unmap a FW object into MIPS address space -+ * @pvr_dev: Target PowerVR device. -+ * @fw_obj: FW object to unmap. -+ */ -+void -+pvr_vm_mips_unmap(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj) -+{ -+ struct pvr_fw_mips_data *mips_data = pvr_dev->fw_data.mips_data; -+ u64 start = fw_obj->fw_mm_node.start; -+ u64 size = fw_obj->fw_mm_node.size; -+ u64 end = start + size; -+ -+ u32 start_pfn = (start & pvr_dev->fw_heap_info.offset_mask) >> -+ ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K; -+ u32 end_pfn = (end & pvr_dev->fw_heap_info.offset_mask) >> ROGUE_MIPSFW_LOG2_PAGE_SIZE_4K; -+ u32 pfn; -+ -+ for (pfn = start_pfn; pfn < end_pfn; pfn++) -+ WRITE_ONCE(mips_data->pt[pfn], 0); -+ -+ pvr_vm_mmu_flush(pvr_dev); -+} -diff --git a/drivers/gpu/drm/imagination/pvr_vm_mips.h b/drivers/gpu/drm/imagination/pvr_vm_mips.h -new file mode 100644 -index 000000000000..8d0926052520 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/pvr_vm_mips.h -@@ -0,0 +1,22 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_VM_MIPS_H__ -+#define __PVR_VM_MIPS_H__ -+ -+/* Forward declaration from pvr_device.h. */ -+struct pvr_device; -+ -+/* Forward declaration from pvr_gem.h. */ -+struct pvr_fw_object; -+ -+int -+pvr_vm_mips_init(struct pvr_device *pvr_dev); -+void -+pvr_vm_mips_fini(struct pvr_device *pvr_dev); -+int -+pvr_vm_mips_map(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj); -+void -+pvr_vm_mips_unmap(struct pvr_device *pvr_dev, struct pvr_fw_object *fw_obj); -+ -+#endif /* __PVR_VM_MIPS_H__ */ -diff --git a/drivers/gpu/drm/imagination/vendor/pvr_mt8173.c b/drivers/gpu/drm/imagination/vendor/pvr_mt8173.c -new file mode 100644 -index 000000000000..864814e38059 ---- /dev/null -+++ b/drivers/gpu/drm/imagination/vendor/pvr_mt8173.c -@@ -0,0 +1,121 @@ -+// SPDX-License-Identifier: GPL-2.0 OR MIT -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+/* Parts copyright (c) 2014 MediaTek Inc. */ -+#include "pvr_device.h" -+#include "pvr_vendor.h" -+ -+#include <drm/drm_print.h> -+#include <linux/err.h> -+#include <linux/io.h> -+#include <linux/platform_device.h> -+#include <linux/slab.h> -+ -+/* Taken from img-rogue/mt8173/mt8173_mfgsys.c in ChromeOS kernel */ -+#define REG_MFG_AXI BIT(0) -+#define REG_MFG_MEM BIT(1) -+#define REG_MFG_G3D BIT(2) -+#define REG_MFG_26M BIT(3) -+#define REG_MFG_ALL (REG_MFG_AXI | REG_MFG_MEM | REG_MFG_G3D | REG_MFG_26M) -+ -+#define REG_MFG_CG_STA 0x00 -+#define REG_MFG_CG_SET 0x04 -+#define REG_MFG_CG_CLR 0x08 -+ -+struct pvr_mt8173_data { -+ void __iomem *regs; -+}; -+ -+static int -+mt8173_init(struct pvr_device *pvr_dev) -+{ -+ struct drm_device *drm_dev = from_pvr_device(pvr_dev); -+ struct platform_device *plat_dev = to_platform_device(drm_dev->dev); -+ struct pvr_mt8173_data *mt8173_data; -+ void __iomem *regs; -+ int err; -+ -+ mt8173_data = kzalloc(sizeof(*mt8173_data), GFP_KERNEL); -+ if (!mt8173_data) { -+ err = -ENOMEM; -+ goto err_out; -+ } -+ -+ regs = devm_platform_ioremap_resource(plat_dev, 1); -+ if (IS_ERR(regs)) { -+ err = PTR_ERR(regs); -+ drm_err(drm_dev, -+ "failed to ioremap mt8173 gpu registers (err=%d)\n", -+ err); -+ goto err_free; -+ } -+ -+ mt8173_data->regs = regs; -+ -+ pvr_dev->vendor.data = mt8173_data; -+ -+ return 0; -+ -+err_free: -+ kfree(mt8173_data); -+ -+err_out: -+ return err; -+} -+ -+static void -+mt8173_fini(struct pvr_device *pvr_dev) -+{ -+ struct pvr_mt8173_data *mt8173_data = pvr_dev->vendor.data; -+ -+ kfree(mt8173_data); -+ pvr_dev->vendor.data = NULL; -+} -+ -+static void -+mtk_mfg_enable_hw_apm(struct pvr_mt8173_data *mt8173_data) -+{ -+ /* Taken from img-rogue/mt8173/mt8173_mfgsys.c in ChromeOS kernel */ -+ writel(0x003c3d4d, mt8173_data->regs + 0x24); -+ writel(0x4d45440b, mt8173_data->regs + 0x28); -+ writel(0x7a710184, mt8173_data->regs + 0xe0); -+ writel(0x835f6856, mt8173_data->regs + 0xe4); -+ writel(0x002b0234, mt8173_data->regs + 0xe8); -+ writel(0x80000000, mt8173_data->regs + 0xec); -+ writel(0x08000000, mt8173_data->regs + 0xa0); -+} -+ -+static void -+mtk_mfg_disable_hw_apm(struct pvr_mt8173_data *mt8173_data) -+{ -+ /* Taken from img-rogue/mt8173/mt8173_mfgsys.c in ChromeOS kernel */ -+ writel(0x00, mt8173_data->regs + 0xec); -+} -+ -+static int -+mt8173_power_enable(struct pvr_device *pvr_dev) -+{ -+ struct pvr_mt8173_data *mt8173_data = pvr_dev->vendor.data; -+ -+ /* Taken from img-rogue/mt8173/mt8173_mfgsys.c in ChromeOS kernel */ -+ writel(REG_MFG_ALL, mt8173_data->regs + REG_MFG_CG_CLR); -+ mtk_mfg_enable_hw_apm(mt8173_data); -+ -+ return 0; -+} -+ -+static int -+mt8173_power_disable(struct pvr_device *pvr_dev) -+{ -+ struct pvr_mt8173_data *mt8173_data = pvr_dev->vendor.data; -+ -+ mtk_mfg_disable_hw_apm(mt8173_data); -+ -+ return 0; -+} -+ -+const struct pvr_vendor_callbacks pvr_mt8173_callbacks = { -+ .init = mt8173_init, -+ .fini = mt8173_fini, -+ .power_enable = mt8173_power_enable, -+ .power_disable = mt8173_power_disable, -+}; -diff --git a/include/uapi/drm/pvr_drm.h b/include/uapi/drm/pvr_drm.h -new file mode 100644 -index 000000000000..d3ecd5b6fcd3 ---- /dev/null -+++ b/include/uapi/drm/pvr_drm.h -@@ -0,0 +1,1524 @@ -+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note OR MIT */ -+/* Copyright (c) 2022 Imagination Technologies Ltd. */ -+ -+#ifndef __PVR_DRM_H__ -+#define __PVR_DRM_H__ -+ -+#include "drm.h" -+ -+#include <linux/const.h> -+#include <linux/types.h> -+ -+/** -+ * DOC: PowerVR UAPI -+ * -+ * TODO -+ */ -+ -+#if defined(__cplusplus) -+extern "C" { -+#endif -+ -+/** -+ * DOC: IOCTLS -+ * -+ * The PowerVR IOCTL argument structs have a few limitations in place, in -+ * addition to the standard kernel restrictions: -+ * -+ * - All members must be type-aligned. -+ * - The overall struct must be padded to 64-bit alignment. -+ * - Explicit padding is almost always required. This takes the form of -+ * &_padding_x members of sufficient size to pad to the next power-of-two -+ * alignment, where x is the offset into the struct in hexadecimal. Arrays -+ * are never used for alignment. Padding fields must be zeroed; this is -+ * always checked. -+ * - Unions may only appear as the last member of a struct. -+ * - Individual union members may grow in the future. The space between the -+ * end of a union member and the end of its containing union is considered -+ * "implicit padding" and must be zeroed. This is always checked. -+ */ -+ -+/* clang-format off */ -+/** -+ * PVR_IOCTL() - Build a PowerVR IOCTL number -+ * @_ioctl: An incrementing id for this IOCTL. Added to %DRM_COMMAND_BASE. -+ * @_mode: Must be one of DRM_IO{R,W,WR}. -+ * @_data: The type of the args struct passed by this IOCTL. -+ * -+ * The struct referred to by @_data must have a &drm_pvr_ioctl_ prefix and an -+ * &_args suffix. They are therefore omitted from @_data. -+ * -+ * This should only be used to build the constants described below; it should -+ * never be used to call an IOCTL directly. -+ * -+ * Return: -+ * An IOCTL number to be passed to ioctl() from userspace. -+ */ -+#define PVR_IOCTL(_ioctl, _mode, _data) \ -+ _mode(DRM_COMMAND_BASE + (_ioctl), struct drm_pvr_ioctl_##_data##_args) -+ -+#define DRM_IOCTL_PVR_CREATE_BO PVR_IOCTL(0x00, DRM_IOWR, create_bo) -+#define DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET PVR_IOCTL(0x01, DRM_IOWR, get_bo_mmap_offset) -+#define DRM_IOCTL_PVR_GET_PARAM PVR_IOCTL(0x02, DRM_IOWR, get_param) -+#define DRM_IOCTL_PVR_CREATE_CONTEXT PVR_IOCTL(0x03, DRM_IOWR, create_context) -+#define DRM_IOCTL_PVR_DESTROY_CONTEXT PVR_IOCTL(0x04, DRM_IOW, destroy_context) -+#define DRM_IOCTL_PVR_CREATE_OBJECT PVR_IOCTL(0x05, DRM_IOWR, create_object) -+#define DRM_IOCTL_PVR_DESTROY_OBJECT PVR_IOCTL(0x06, DRM_IOW, destroy_object) -+#define DRM_IOCTL_PVR_GET_HEAP_INFO PVR_IOCTL(0x07, DRM_IOWR, get_heap_info) -+#define DRM_IOCTL_PVR_VM_OP PVR_IOCTL(0x08, DRM_IOW, vm_op) -+#define DRM_IOCTL_PVR_SUBMIT_JOB PVR_IOCTL(0x09, DRM_IOW, submit_job) -+/* clang-format on */ -+ -+/** -+ * DOC: IOCTL CREATE_BO -+ * -+ * TODO -+ */ -+ -+/** -+ * DOC: Flags for CREATE_BO -+ * -+ * The &drm_pvr_ioctl_create_bo_args.flags field is 64 bits wide and consists -+ * of three groups of flags: creation, device mapping and CPU mapping. -+ * -+ * We use "device" to refer to the GPU here because of the ambiguity between -+ * CPU and GPU in some fonts. -+ * -+ * Creation options -+ * These use the prefix DRM_PVR_BO_CREATE_. -+ * -+ * :ZEROED: Require the allocated buffer to be zeroed before returning. Note -+ * that this is an active operation, and is never zero cost. Unless it is -+ * explicitly required, this option should not be set. -+ * -+ * Device mapping options -+ * These use the prefix DRM_PVR_BO_DEVICE_. -+ * -+ * :BYPASS_CACHE: There are very few situations where this flag is useful. -+ * By default, the device flushes its memory caches after every job. -+ * :PM_FW_PROTECT: Specify that only the Parameter Manager (PM) and/or -+ * firmware processor should be allowed to access this memory when mapped -+ * to the device. It is not valid to specify this flag with -+ * CPU_ALLOW_USERSPACE_ACCESS. -+ * -+ * CPU mapping options -+ * These use the prefix DRM_PVR_BO_CPU_. -+ * -+ * :ALLOW_USERSPACE_ACCESS: Allow userspace to map and access the contents -+ * of this memory. It is not valid to specify this flag with -+ * DEVICE_PM_FW_PROTECT. -+ */ -+#define DRM_PVR_BO_DEVICE_BYPASS_CACHE _BITULL(0) -+#define DRM_PVR_BO_DEVICE_PM_FW_PROTECT _BITULL(1) -+#define DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS _BITULL(2) -+#define DRM_PVR_BO_CREATE_ZEROED _BITULL(3) -+/* Bits 4..63 are reserved. */ -+ -+/** -+ * struct drm_pvr_ioctl_create_bo_args - Arguments for %DRM_IOCTL_PVR_CREATE_BO -+ */ -+struct drm_pvr_ioctl_create_bo_args { -+ /** -+ * @size: [IN/OUT] Unaligned size of buffer object to create. On -+ * return, this will be populated with the actual aligned size of the -+ * new buffer. -+ */ -+ __u64 size; -+ -+ /** -+ * @handle: [OUT] GEM handle of the new buffer object for use in -+ * userspace. -+ */ -+ __u32 handle; -+ -+ /** @_padding_c: Reserved. This field must be zeroed. */ -+ __u32 _padding_c; -+ -+ /** -+ * @flags: [IN] Options which will affect the behaviour of this -+ * creation operation and future mapping operations on the created -+ * object. This field must be a valid combination of DRM_PVR_BO_* -+ * values, with all bits marked as reserved set to zero. -+ */ -+ __u64 flags; -+}; -+ -+/** -+ * DOC: IOCTL GET_BO_MMAP_OFFSET -+ * -+ * TODO -+ */ -+ -+/** -+ * struct drm_pvr_ioctl_get_bo_mmap_offset_args - Arguments for -+ * %DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET -+ * -+ * Like other DRM drivers, the "mmap" IOCTL doesn't actually map any memory. -+ * Instead, it allocates a fake offset which refers to the specified buffer -+ * object. This offset can be used with a real mmap call on the DRM device -+ * itself. -+ */ -+struct drm_pvr_ioctl_get_bo_mmap_offset_args { -+ /** @handle: [IN] GEM handle of the buffer object to be mapped. */ -+ __u32 handle; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @offset: [OUT] Fake offset to use in the real mmap call. */ -+ __u64 offset; -+}; -+ -+/** -+ * DOC: IOCTL GET_PARAM -+ * -+ * TODO -+ */ -+ -+/** -+ * enum drm_pvr_param - Arguments for &drm_pvr_ioctl_get_param_args.param -+ */ -+enum drm_pvr_param { -+ /** @DRM_PVR_PARAM_INVALID: Invalid parameter. Do not use. */ -+ DRM_PVR_PARAM_INVALID = 0, -+ -+ /** -+ * @DRM_PVR_PARAM_GPU_ID: GPU identifier. -+ * -+ * For all currently supported GPUs this is the BVNC encoded as a 64-bit -+ * value as follows: -+ * -+ * +--------+--------+--------+-------+ -+ * | 63..48 | 47..32 | 31..16 | 15..0 | -+ * +========+========+========+=======+ -+ * | B | V | N | C | -+ * +--------+--------+--------+-------+ -+ */ -+ DRM_PVR_PARAM_GPU_ID, -+ -+ /** -+ * @DRM_PVR_PARAM_HWRT_NUM_GEOMDATAS: Number of geom data arguments -+ * required when creating a HWRT dataset. -+ */ -+ DRM_PVR_PARAM_HWRT_NUM_GEOMDATAS, -+ -+ /** -+ * @DRM_PVR_PARAM_HWRT_NUM_RTDATAS: Number of RT data arguments -+ * required when creating a HWRT dataset. -+ */ -+ DRM_PVR_PARAM_HWRT_NUM_RTDATAS, -+ -+ /** -+ * @DRM_PVR_PARAM_HWRT_NUM_FREELISTS: Number of free list data -+ * arguments required when creating a HWRT dataset. -+ */ -+ DRM_PVR_PARAM_HWRT_NUM_FREELISTS, -+ -+ /** -+ * @DRM_PVR_PARAM_FW_VERSION: Version number of GPU firmware. -+ * -+ * This is encoded with the major version number in the upper 32 bits of -+ * the output value, and the minor version number in the lower 32 bits. -+ */ -+ DRM_PVR_PARAM_FW_VERSION, -+ -+ DRM_PVR_PARAM_MAX /* non-ABI */ -+}; -+ -+/** -+ * struct drm_pvr_ioctl_get_param_args - Arguments for %DRM_IOCTL_PVR_GET_PARAM -+ */ -+struct drm_pvr_ioctl_get_param_args { -+ /** -+ * @param: [IN] Parameter for which a value should be returned. -+ * -+ * This must be one of the values defined by &enum drm_pvr_param, with -+ * the exception of %DRM_PVR_PARAM_INVALID. -+ */ -+ __u32 param; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @value: [OUT] Value for @param. */ -+ __u64 value; -+}; -+ -+/** -+ * DOC: IOCTL CREATE_CONTEXT -+ * -+ * TODO -+ */ -+ -+/** -+ * enum drm_pvr_ctx_priority - Arguments for -+ * &drm_pvr_ioctl_create_context_args.priority -+ */ -+enum drm_pvr_ctx_priority { -+ DRM_PVR_CTX_PRIORITY_LOW = -512, -+ DRM_PVR_CTX_PRIORITY_NORMAL = 0, -+ /* A priority above NORMAL requires CAP_SYS_NICE or DRM_MASTER. */ -+ DRM_PVR_CTX_PRIORITY_HIGH = 512, -+}; -+ -+/** -+ * enum drm_pvr_static_render_context_state_format - Arguments for -+ * &drm_pvr_static_render_context_state.format -+ */ -+enum drm_pvr_static_render_context_state_format { -+ /** @DRM_PVR_SRCS_FORMAT_1: Format 1, used by firmware version 1.14. */ -+ DRM_PVR_SRCS_FORMAT_1 = 0, -+}; -+ -+/** -+ * struct drm_pvr_static_render_context_state - Static render context state -+ * arguments for %DRM_IOCTL_PVR_CREATE_CONTEXT -+ */ -+struct drm_pvr_static_render_context_state { -+ /** -+ * @format: [IN] Format of @data. -+ * -+ * This must be one of the values defined by -+ * &enum drm_pvr_static_render_context_state_format. -+ * -+ * For firmware version 1.14, this is %DRM_PVR_SRCS_FORMAT_1. -+ */ -+ __u32 format; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @data: [IN] Static render context state data. */ -+ union { -+ /** -+ * @format_1: Static render context state data when @format == -+ * %DRM_PVR_SRCS_FORMAT_1. -+ */ -+ struct { -+ __u64 geom_reg_vdm_context_state_base_addr; -+ __u64 geom_reg_vdm_context_state_resume_addr; -+ __u64 geom_reg_ta_context_state_base_addr; -+ -+ struct { -+ __u64 geom_reg_vdm_context_store_task0; -+ __u64 geom_reg_vdm_context_store_task1; -+ __u64 geom_reg_vdm_context_store_task2; -+ -+ __u64 geom_reg_vdm_context_resume_task0; -+ __u64 geom_reg_vdm_context_resume_task1; -+ __u64 geom_reg_vdm_context_resume_task2; -+ -+ __u64 geom_reg_vdm_context_store_task3; -+ __u64 geom_reg_vdm_context_store_task4; -+ -+ __u64 geom_reg_vdm_context_resume_task3; -+ __u64 geom_reg_vdm_context_resume_task4; -+ } geom_state[2]; -+ } format_1; -+ } data; -+}; -+ -+/** -+ * enum drm_pvr_static_compute_context_state_format - Arguments for -+ * &drm_pvr_static_compute_context_state.format -+ */ -+enum drm_pvr_static_compute_context_state_format { -+ /** @DRM_PVR_SCCS_FORMAT_1: Format 1, used by firmware version 1.14. */ -+ DRM_PVR_SCCS_FORMAT_1 = 0, -+}; -+ -+/** -+ * struct drm_pvr_static_compute_context_state - Static compute context state -+ * arguments for %DRM_IOCTL_PVR_CREATE_CONTEXT -+ */ -+struct drm_pvr_static_compute_context_state { -+ /** -+ * @format: [IN] Format of @data. -+ * -+ * This must be one of the values defined by -+ * &enum drm_pvr_static_compute_context_state_format. -+ * -+ * For firmware version 1.14, this is %DRM_PVR_SCCS_FORMAT_1. -+ */ -+ __u32 format; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @data: [IN] Static compute context state data. */ -+ union { -+ /** -+ * @format_1: Static compute context state data when @format == -+ * %DRM_PVR_SCCS_FORMAT_1. -+ */ -+ struct { -+ __u64 cdmreg_cdm_context_state_base_addr; -+ __u64 cdmreg_cdm_context_pds0; -+ __u64 cdmreg_cdm_context_pds1; -+ __u64 cdmreg_cdm_terminate_pds; -+ __u64 cdmreg_cdm_terminate_pds1; -+ __u64 cdmreg_cdm_resume_pds0; -+ __u64 cdmreg_cdm_context_pds0_b; -+ __u64 cdmreg_cdm_resume_pds0_b; -+ } format_1; -+ } data; -+}; -+ -+/** -+ * struct drm_pvr_ioctl_create_render_context_args - Arguments for -+ * drm_pvr_ioctl_create_context_args.args.render. -+ */ -+struct drm_pvr_ioctl_create_render_context_args { -+ /** -+ * @vdm_callstack_addr: [IN] Address for initial TA call stack pointer. -+ */ -+ __u64 vdm_callstack_addr; -+ -+ /** -+ * @static_render_context_state: [IN] Pointer to static render context -+ * state to copy to new context. -+ */ -+ __u64 static_render_context_state; -+}; -+ -+/** -+ * struct drm_pvr_ioctl_create_compute_context_args - Arguments for %DRM_PVR_CTX_COMPUTE. -+ */ -+struct drm_pvr_ioctl_create_compute_context_args { -+ /** -+ * @static_compute_context_state: [IN] Pointer to static compute context state to copy to -+ * new context. -+ */ -+ __u64 static_compute_context_state; -+}; -+ -+/** -+ * enum drm_pvr_reset_framework_format - Arguments for -+ * &drm_pvr_reset_framework.format -+ */ -+enum drm_pvr_reset_framework_format { -+ /** @DRM_PVR_RF_FORMAT_CDM_1: Format 1, used by firmware 1.14. */ -+ DRM_PVR_RF_FORMAT_CDM_1 = 0, -+}; -+ -+/** -+ * struct drm_pvr_reset_framework - Reset framework arguments for -+ * %DRM_IOCTL_PVR_CREATE_CONTEXT -+ */ -+struct drm_pvr_reset_framework { -+ /** -+ * @flags: [IN] Flags for reset framework. -+ * -+ * This is currently unused and must be set to 0. -+ */ -+ __u32 flags; -+ -+ /** -+ * @format: [IN] Format of @data. -+ * -+ * This must be one of the values defined by -+ * &enum drm_pvr_reset_framework_format. -+ * -+ * For firmware version 1.14, this is %DRM_PVR_RF_FORMAT_CDM_1. -+ */ -+ __u32 format; -+ -+ /** @data: [IN] Reset framework data. */ -+ union { -+ /** -+ * @cdm_format_1: Reset framework data when @format == -+ * %DRM_PVR_RF_FORMAT_CDM_1. -+ */ -+ struct { -+ /** -+ * @cdm_ctrl_stream_base: Base address of CDM control -+ * stream -+ */ -+ __u64 cdm_ctrl_stream_base; -+ } cdm_format_1; -+ } data; -+}; -+ -+/* clang-format off */ -+ -+/** -+ * enum drm_pvr_ctx_type - Arguments for -+ * &drm_pvr_ioctl_create_context_args.type -+ */ -+enum drm_pvr_ctx_type { -+ /** -+ * @DRM_PVR_CTX_TYPE_RENDER: Render context. Use &struct -+ * drm_pvr_ioctl_create_render_context_args for context creation arguments. -+ */ -+ DRM_PVR_CTX_TYPE_RENDER = 0, -+ -+ /** -+ * @DRM_PVR_CTX_TYPE_COMPUTE: Compute context. Use &struct -+ * drm_pvr_ioctl_create_compute_context_args for context creation arguments. -+ */ -+ DRM_PVR_CTX_TYPE_COMPUTE, -+}; -+ -+/* clang-format on */ -+ -+/** -+ * struct drm_pvr_ioctl_create_context_args - Arguments for -+ * %DRM_IOCTL_PVR_CREATE_CONTEXT -+ */ -+struct drm_pvr_ioctl_create_context_args { -+ /** -+ * @type: [IN] Type of context to create. -+ * -+ * This must be one of the values defined by &enum drm_pvr_ctx_type. -+ */ -+ __u32 type; -+ -+ /** @flags: [IN] Flags for context. */ -+ __u32 flags; -+ -+ /** -+ * @reset_framework_registers: [IN] Pointer to reset framework -+ * registers. -+ * -+ * May be 0 to indicate no reset framework. -+ */ -+ __u64 reset_framework_registers; -+ -+ /** -+ * @priority: [IN] Priority of new context. -+ * -+ * This must be one of the values defined by &enum drm_pvr_ctx_priority. -+ */ -+ __s32 priority; -+ -+ /** @handle: [OUT] Handle for new context. */ -+ __u32 handle; -+ -+ /** @data: [IN] User pointer to context type specific arguments. */ -+ __u64 data; -+}; -+ -+/** -+ * DOC: IOCTL DESTROY_CONTEXT -+ * -+ * TODO -+ */ -+ -+/** -+ * struct drm_pvr_ioctl_destroy_context_args - Arguments for -+ * %DRM_IOCTL_PVR_DESTROY_CONTEXT -+ */ -+struct drm_pvr_ioctl_destroy_context_args { -+ /** -+ * @handle: [IN] Handle for context to be destroyed. -+ */ -+ __u32 handle; -+}; -+ -+/** -+ * DOC: IOCTL CREATE_OBJECT -+ * -+ * TODO -+ */ -+ -+/* clang-format off */ -+ -+/** -+ * enum drm_pvr_object_type - Arguments for -+ * &drm_pvr_ioctl_create_object_args.type -+ */ -+enum drm_pvr_object_type { -+ /** -+ * @DRM_PVR_OBJECT_TYPE_FREE_LIST: Free list object. Use &struct -+ * drm_pvr_ioctl_create_free_list_args for object creation arguments. -+ */ -+ DRM_PVR_OBJECT_TYPE_FREE_LIST = 0, -+ /** -+ * @DRM_PVR_OBJECT_TYPE_HWRT_DATASET: HWRT data set. Use &struct -+ * drm_pvr_ioctl_create_hwrt_dataset_args for object creation arguments. -+ */ -+ DRM_PVR_OBJECT_TYPE_HWRT_DATASET, -+ -+ DRM_PVR_OBJECT_TYPE_MAX /* non-ABI */ -+}; -+ -+/* clang-format on */ -+ -+/** -+ * struct drm_pvr_ioctl_create_free_list_args - Arguments for -+ * %DRM_PVR_OBJECT_TYPE_FREE_LIST -+ * -+ * Free list arguments have the following constraints : -+ * -+ * - &max_num_pages must be greater than zero. -+ * - &grow_threshold must be between 0 and 100. -+ * - &grow_num_pages must be less than or equal to &max_num_pages. -+ * - &initial_num_pages, &max_num_pages and &grow_num_pages must be multiples -+ * of 4. -+ * -+ * When &grow_num_pages is 0 : -+ * - &initial_num_pages must be equal to &max_num_pages -+ * -+ * When &grow_num_pages is non-zero : -+ * - &initial_num_pages must be less than &max_num_pages. -+ */ -+struct drm_pvr_ioctl_create_free_list_args { -+ /** -+ * @free_list_gpu_addr: [IN] Address of GPU mapping of buffer object -+ * containing memory to be used by free list. -+ * -+ * The mapped region of the buffer object must be at least -+ * @max_num_pages * sizeof(__u32). -+ * -+ * The buffer object must have been created with -+ * %DRM_PVR_BO_DEVICE_PM_FW_PROTECT set and -+ * %DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS not set. -+ */ -+ __u64 free_list_gpu_addr; -+ -+ /** @initial_num_pages: [IN] Pages initially allocated to free list. */ -+ __u32 initial_num_pages; -+ -+ /** @max_num_pages: [IN] Maximum number of pages in free list. */ -+ __u32 max_num_pages; -+ -+ /** @grow_num_pages: [IN] Pages to grow free list by per request. */ -+ __u32 grow_num_pages; -+ -+ /** -+ * @grow_threshold: [IN] Percentage of FL memory used that should -+ * trigger a new grow request. -+ */ -+ __u32 grow_threshold; -+}; -+ -+struct create_hwrt_geom_data_args { -+ /** @tail_ptrs_dev_addr: [IN] Tail pointers GPU virtual address. */ -+ __u64 tail_ptrs_dev_addr; -+ -+ /** @vheap_table_dev_addr: [IN] VHEAP table GPU virtual address. */ -+ __u64 vheap_table_dev_addr; -+ -+ /** @rtc_dev_addr: [IN] Render Target Cache virtual address. */ -+ __u64 rtc_dev_addr; -+}; -+ -+struct create_hwrt_rt_data_args { -+ /** @pm_mlist_dev_addr: [IN] PM MLIST GPU virtual address. */ -+ __u64 pm_mlist_dev_addr; -+ -+ /** @macrotile_array_dev_addr: [IN] Macrotile array GPU virtual address. */ -+ __u64 macrotile_array_dev_addr; -+ -+ /** @region_header_dev_addr: [IN] Region header GPU virtual address. */ -+ __u64 region_header_dev_addr; -+}; -+ -+struct create_hwrt_free_list_args { -+ /** @free_list_handle: [IN] Free list object handle. */ -+ __u32 free_list_handle; -+}; -+ -+struct drm_pvr_ioctl_create_hwrt_dataset_args { -+ /** -+ * @geom_data_args: [IN] User pointer to one or more &struct -+ * create_hwrt_geom_data_args. -+ * -+ * Number of &struct create_hwrt_geom_data_args must be equal to -+ * &num_geom_datas. -+ */ -+ __u64 geom_data_args; -+ -+ /** -+ * @rt_data_args: [IN] User pointer to one or more &struct -+ * create_hwrt_rt_data_args. -+ * -+ * Number of &struct create_hwrt_rt_data_args must be equal to -+ * &num_rt_datas. -+ */ -+ __u64 rt_data_args; -+ -+ /** -+ * @free_list_args: [IN] User pointer to one or more &struct -+ * create_hwrt_free_list_args. -+ * -+ * Number of &struct create_hwrt_free_list_args must be equal to -+ * &num_free_lists. -+ */ -+ __u64 free_list_args; -+ -+ /** -+ * @num_geom_datas: [IN] Number of geom data arguments. -+ * -+ * This should be equal to the value returned for -+ * %DRM_PVR_PARAM_HWRT_NUM_GEOMDATAS by %DRM_IOCTL_PVR_GET_PARAM. -+ */ -+ __u32 num_geom_datas; -+ -+ /** -+ * @num_rt_datas: [IN] Number of rt data arguments. -+ * -+ * This should be equal to the value returned for -+ * %DRM_PVR_PARAM_HWRT_NUM_RTDATAS by %DRM_IOCTL_PVR_GET_PARAM. -+ */ -+ __u32 num_rt_datas; -+ -+ /** -+ * @num_free_lists: [IN] Number of free list arguments. -+ * -+ * This should be equal to the value returned for -+ * %DRM_PVR_PARAM_HWRT_NUM_FREELISTS by %DRM_IOCTL_PVR_GET_PARAM. -+ */ -+ __u32 num_free_lists; -+ -+ /** @mtile_stride: [IN] Macrotile stride. */ -+ __u32 mtile_stride; -+ -+ /** @region_header_size: [IN] Region header size. */ -+ __u64 region_header_size; -+ -+ /** @flipped_multi_sample_control: [IN] Flipped multi sample control. */ -+ __u64 flipped_multi_sample_control; -+ -+ /** @multi_sample_control: [IN] Multi sample control. */ -+ __u64 multi_sample_control; -+ -+ /** @screen_pixel_max: [IN] Maximum screen size. */ -+ __u32 screen_pixel_max; -+ -+ /** @te_aa: [IN] TE anti-aliasing. */ -+ __u32 te_aa; -+ -+ /** @te_mtile: [IN] TE macrotile boundaries. */ -+ __u32 te_mtile[2]; -+ -+ /** @te_screen_size: [IN] TE screen size. */ -+ __u32 te_screen_size; -+ -+ /** @tpc_size: [IN] Tail Pointer Cache size */ -+ __u32 tpc_size; -+ -+ /** @tpc_stride: [IN] Tail Pointer Cache stride */ -+ __u32 tpc_stride; -+ -+ /** @isp_merge_lower_x: [IN] Lower X coefficient for triangle merging. */ -+ __u32 isp_merge_lower_x; -+ -+ /** @isp_merge_lower_y: [IN] Lower Y coefficient for triangle merging. */ -+ __u32 isp_merge_lower_y; -+ -+ /** @isp_merge_scale_x: [IN] Scale X coefficient for triangle merging. */ -+ __u32 isp_merge_scale_x; -+ -+ /** @isp_merge_scale_y: [IN] Scale Y coefficient for triangle merging. */ -+ __u32 isp_merge_scale_y; -+ -+ /** @isp_merge_upper_x: [IN] Upper X coefficient for triangle merging. */ -+ __u32 isp_merge_upper_x; -+ -+ /** @isp_merge_upper_y: [IN] Upper Y coefficient for triangle merging. */ -+ __u32 isp_merge_upper_y; -+ -+ /** @isp_mtile_size: [IN] Macrotile size. */ -+ __u32 isp_mtile_size; -+ -+ /** @max_rts: [IN] Maximum Render Targets. */ -+ __u16 max_rts; -+ -+ /** @_padding_7a: Reserved. This field must be zeroed. */ -+ __u16 _padding_7a; -+ -+ /** @_padding_7c: Reserved. This field must be zeroed. */ -+ __u32 _padding_7c; -+}; -+ -+/** -+ * struct drm_pvr_ioctl_create_object_args - Arguments for -+ * %DRM_IOCTL_PVR_CREATE_OBJECT -+ */ -+struct drm_pvr_ioctl_create_object_args { -+ /** -+ * @type: [IN] Type of object to create. -+ * -+ * This must be one of the values defined by &enum drm_pvr_object_type. -+ */ -+ __u32 type; -+ -+ /** -+ * @handle: [OUT] Handle for created object. -+ */ -+ __u32 handle; -+ -+ /** @data: [IN] User pointer to object type specific arguments. */ -+ __u64 data; -+}; -+ -+/** -+ * DOC: IOCTL DESTROY_OBJECT -+ * -+ * TODO -+ */ -+ -+/** -+ * struct drm_pvr_ioctl_destroy_object_args - Arguments for -+ * %DRM_IOCTL_PVR_DESTROY_OBJECT -+ */ -+struct drm_pvr_ioctl_destroy_object_args { -+ /** -+ * @handle: [IN] Handle for object to be destroyed. -+ */ -+ __u32 handle; -+}; -+ -+/** -+ * DOC: IOCTL GET_HEAP_INFO -+ * -+ * TODO -+ */ -+ -+enum drm_pvr_get_heap_info_op { -+ /** @DRM_PVR_HEAP_OP_GET_HEAP_INFO: Get &struct drm_pvr_heap for the requested heap. */ -+ DRM_PVR_HEAP_OP_GET_HEAP_INFO = 0, -+ /** -+ * @DRM_PVR_HEAP_OP_GET_STATIC_DATA_AREAS: Get array of &struct drm_pvr_static_data_area -+ * for the requested heap. -+ */ -+ DRM_PVR_HEAP_OP_GET_STATIC_DATA_AREAS = 1, -+}; -+ -+/** -+ * enum drm_pvr_heap_id - Valid heap IDs returned by %DRM_IOCTL_PVR_GET_HEAP_INFO -+ */ -+enum drm_pvr_heap_id { -+ /** @DRM_PVR_HEAP_GENERAL: General purpose heap. */ -+ DRM_PVR_HEAP_GENERAL = 0, -+ /** @DRM_PVR_HEAP_PDS_CODE_DATA: PDS code & data heap. */ -+ DRM_PVR_HEAP_PDS_CODE_DATA, -+ /** @DRM_PVR_HEAP_USC_CODE: USC code heap. */ -+ DRM_PVR_HEAP_USC_CODE, -+ /** @DRM_PVR_HEAP_RGNHDR: Region header heap. Only used if GPU has BRN63142. */ -+ DRM_PVR_HEAP_RGNHDR, -+}; -+ -+struct drm_pvr_heap { -+ /** @id: Heap ID. This must be one of the values defined by &enum drm_pvr_heap_id. */ -+ __u32 id; -+ -+ /** @flags: Flags for this heap. Currently always 0. */ -+ __u32 flags; -+ -+ /** @base: Base address of heap. */ -+ __u64 base; -+ -+ /** @size: Size of heap, in bytes. */ -+ __u64 size; -+ -+ /** -+ * @reserved_base: Base address of reserved area. -+ * -+ * The reserved area must be located at the beginning or end of the heap. Any other location -+ * is invalid and should be rejected by the caller. -+ */ -+ __u64 reserved_base; -+ -+ /** -+ * @reserved_size: Size of reserved area, in bytes. May be 0 if this -+ * heap has no reserved area. -+ */ -+ __u64 reserved_size; -+ -+ /** @page_size_log2: Log2 of page size. */ -+ __u32 page_size_log2; -+ -+ /** -+ * @nr_static_data_areas: Number of &struct drm_pvr_static_data_areas -+ * returned for this heap by -+ * %DRM_PVR_HEAP_OP_GET_STATIC_DATA_AREAS. -+ */ -+ __u32 nr_static_data_areas; -+}; -+ -+enum drm_pvr_static_data_area_id { -+ DRM_PVR_STATIC_DATA_AREA_EOT = 0, -+ DRM_PVR_STATIC_DATA_AREA_FENCE, -+ DRM_PVR_STATIC_DATA_AREA_VDM_SYNC, -+ DRM_PVR_STATIC_DATA_AREA_YUV_CSC, -+ -+ DRM_PVR_STATIC_DATA_AREA_MAX /* non-ABI */ -+}; -+ -+struct drm_pvr_static_data_area { -+ /** @id: ID of static data area. */ -+ __u32 id; -+ -+ /** @size: Size of static data area. */ -+ __u32 size; -+ -+ /** @offset: Offset of static data area from start of reserved area. */ -+ __u64 offset; -+}; -+ -+/** -+ * struct drm_pvr_ioctl_get_heap_info_args - Arguments for -+ * %DRM_IOCTL_PVR_GET_HEAP_INFO -+ */ -+struct drm_pvr_ioctl_get_heap_info_args { -+ /** -+ * @op: [IN] Operation to perform for this ioctl. Must be one of -+ * &enum drm_pvr_get_heap_info_op. -+ */ -+ __u32 op; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** -+ * @data: [IN] User pointer to memory that this ioctl writes to. This should point to -+ * &struct drm_pvr_heap when &op == %DRM_PVR_HEAP_OP_GET_HEAP_INFO, or an -+ * array of &struct drm_pvr_static_data_area, of size -+ * %drm_pvr_heap.nr_static_data_areas elements, when &op == -+ * %DRM_PVR_HEAP_OP_GET_STATIC_DATA_AREAS. -+ * May be zero, in which case this ioctl will not write any heap information. -+ */ -+ __u64 data; -+ -+ /** @heap_nr: [IN] Number of heap to get information for. Not used if @data is 0. */ -+ __u32 heap_nr; -+ -+ /** -+ * @nr_heaps: [OUT] Number of heaps provided by the driver. -+ */ -+ __u32 nr_heaps; -+}; -+ -+/** -+ * DOC: IOCTL VM_OP -+ * -+ * This IOCTL groups together several operations performed on device-virtual -+ * memory. For a list of the currently supported options, see the flags section -+ * below. -+ */ -+ -+/** -+ * DOC: Flags for VM_OP -+ * -+ * Operations -+ * ~~~~~~~~~~ -+ * .. c:macro:: DRM_PVR_VM_OP_MAP -+ * -+ * Map a PowerVR buffer object into device-virtual address space. -+ * -+ * .. c:macro:: DRM_PVR_VM_OP_UNMAP -+ * -+ * Unmap a PowerVR buffer object from device-virtual address space. -+ */ -+#define DRM_PVR_VM_OP_MAP _UL(0) -+#define DRM_PVR_VM_OP_UNMAP _UL(1) -+ -+/** -+ * struct drm_pvr_ioctl_vm_op_map_args - Additional arguments for -+ * %DRM_IOCTL_PVR_VM_OP when &drm_pvr_ioctl_vm_op_args.operation is -+ * %DRM_PVR_VM_OP_MAP. -+ */ -+struct drm_pvr_ioctl_vm_op_map_args { -+ /** -+ * @device_addr: [IN] Requested device-virtual address for the mapping. -+ * This must be non-zero and aligned to the device page size for the -+ * heap containing the requested address. It is an error to specify an -+ * address which is not contained within one of the heaps returned by -+ * %DRM_IOCTL_PVR_GET_HEAP_INFO. -+ */ -+ __u64 device_addr; -+ -+ /** @flags: [IN] Flags which affect this mapping. Currently always 0. */ -+ __u32 flags; -+ -+ /** -+ * @handle: [IN] Handle of the target buffer object. This must be a -+ * valid handle returned by %DRM_IOCTL_PVR_CREATE_BO. -+ */ -+ __u32 handle; -+ -+ /** -+ * @offset: [IN] Offset into the target bo from which to begin the -+ * mapping. -+ */ -+ __u64 offset; -+ -+ /** -+ * @size: [IN] Size of the requested mapping. Must be aligned to -+ * the device page size for the heap containing the requested address, -+ * as well as the host page size. When added to @device_addr, the -+ * result must not overflow the heap which contains @device_addr (i.e. -+ * the range specified by @device_addr and @size must be completely -+ * contained within a single heap specified by -+ * %DRM_IOCTL_PVR_GET_HEAP_INFO). -+ */ -+ __u64 size; -+}; -+ -+/** -+ * struct drm_pvr_ioctl_vm_op_unmap_args - Additional arguments for -+ * %DRM_IOCTL_PVR_VM_OP when &drm_pvr_ioctl_vm_op_args.operation is -+ * %DRM_PVR_VM_OP_UNMAP. -+ */ -+struct drm_pvr_ioctl_vm_op_unmap_args { -+ /** -+ * @device_addr: [IN] Device-virtual address at the start of the target -+ * mapping. This must be non-zero. -+ */ -+ __u64 device_addr; -+}; -+ -+/** -+ * struct drm_pvr_ioctl_vm_op_args - Arguments for %DRM_IOCTL_PVR_VM_OP. -+ */ -+struct drm_pvr_ioctl_vm_op_args { -+ /** -+ * @operation: [IN] Specific operation requested. Must be one of -+ * DRM_PVR_VM_OP_*. -+ */ -+ __u32 operation; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @data: [IN] Operation-specific arguments. */ -+ union { -+ struct drm_pvr_ioctl_vm_op_map_args map; -+ struct drm_pvr_ioctl_vm_op_unmap_args unmap; -+ } data; -+}; -+ -+/** -+ * enum drm_pvr_cmd_geom_format - Arguments for -+ * &drm_pvr_cmd_geom.format -+ */ -+enum drm_pvr_cmd_geom_format { -+ DRM_PVR_CMD_GEOM_FORMAT_1 = 0, -+}; -+ -+/** -+ * struct drm_pvr_geom_regs_format_1 - Configuration registers which need to be loaded by the -+ * firmware before the VDM can be started -+ * -+ * Valid for %DRM_PVR_CMD_GEOM_FORMAT_1. -+ */ -+struct drm_pvr_geom_regs_format_1 { -+ __u64 vdm_ctrl_stream_base; -+ __u64 tpu_border_colour_table; -+ __u32 ppp_ctrl; -+ __u32 te_psg; -+ __u32 tpu; -+ __u32 vdm_context_resume_task0_size; -+ __u32 pds_ctrl; -+ __u32 view_idx; -+}; -+ -+/** -+ * DOC: Flags for SUBMIT_JOB ioctl geometry command. -+ * -+ * Operations -+ * ~~~~~~~~~~ -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_FIRST -+ * -+ * Indicates if this the first command to be issued for a render. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_LAST -+ * -+ * Indicates if this the last command to be issued for a render. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_SINGLE_CORE -+ * -+ * Forces to use single core in a multi core device. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_GEOM_CMD_FLAGS_MASK -+ * -+ * Logical OR of all the geometry cmd flags. -+ */ -+#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_FIRST _BITULL(0) -+#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_LAST _BITULL(1) -+#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_SINGLE_CORE _BITULL(3) -+#define DRM_PVR_SUBMIT_JOB_GEOM_CMD_FLAGS_MASK \ -+ (DRM_PVR_SUBMIT_JOB_GEOM_CMD_FIRST | \ -+ DRM_PVR_SUBMIT_JOB_GEOM_CMD_LAST | \ -+ DRM_PVR_SUBMIT_JOB_GEOM_CMD_SINGLE_CORE) -+ -+/** -+ * struct drm_pvr_cmd_geom_format_1 - structure representing a geometry command, for format -+ * %DRM_PVR_CMD_GEOM_FORMAT_1 -+ */ -+struct drm_pvr_cmd_geom_format_1 { -+ /** @frame_num: Associated frame number. */ -+ __u32 frame_num; -+ -+ /** @flags: command control flags. */ -+ __u32 flags; -+ -+ /** -+ * @regs: Configuration registers which need to be loaded by the -+ * firmware before the VDM can be started. -+ */ -+ struct drm_pvr_geom_regs_format_1 geom_regs; -+}; -+ -+/** -+ * struct drm_pvr_cmd_geom - structure representing a geometry command -+ */ -+struct drm_pvr_cmd_geom { -+ /** -+ * @format: [IN] Format of @data. -+ * -+ * This must be one of the values defined by -+ * &enum drm_pvr_cmd_geom_format. -+ * -+ * For firmware version 1.14, this is %DRM_PVR_CMD_GEOM_FORMAT_1. -+ */ -+ __u32 format; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @data: [IN] Geometry job data. */ -+ union { -+ /** -+ * @cmd_frag_format_1: Command data when @format == -+ * %DRM_PVR_CMD_GEOM_FORMAT_1. -+ */ -+ struct drm_pvr_cmd_geom_format_1 cmd_geom_format_1; -+ } data; -+}; -+ -+/** -+ * enum drm_pvr_cmd_frag_format - Arguments for -+ * &drm_pvr_cmd_frag.format -+ */ -+enum drm_pvr_cmd_frag_format { -+ DRM_PVR_CMD_FRAG_FORMAT_1 = 0, -+}; -+ -+/** -+ * struct drm_pvr_frag_regs_format_1 - Configuration registers which need to be loaded by the -+ * firmware before the ISP can be started -+ * -+ * Valid for format %DRM_PVR_CMD_FRAG_FORMAT_1. -+ */ -+struct drm_pvr_frag_regs_format_1 { -+#define PVR_MAXIMUM_OUTPUT_REGISTERS_PER_PIXEL 8U -+ __u32 usc_clear_register[PVR_MAXIMUM_OUTPUT_REGISTERS_PER_PIXEL]; -+ __u32 usc_pixel_output_ctrl; -+ __u32 isp_bgobjdepth; -+ __u32 isp_bgobjvals; -+ __u32 isp_aa; -+ __u32 isp_ctl; -+ __u32 tpu; -+ __u32 event_pixel_pds_info; -+ __u32 pixel_phantom; -+ __u32 view_idx; -+ __u32 event_pixel_pds_data; -+ __u64 isp_scissor_base; -+ __u64 isp_dbias_base; -+ __u64 isp_oclqry_base; -+ __u64 isp_zlsctl; -+ __u64 isp_zload_store_base; -+ __u64 isp_stencil_load_store_base; -+ __u64 isp_zls_pixels; -+#define PVR_PBE_WORDS_REQUIRED_FOR_RENDERS 2U -+ __u64 pbe_word[8][PVR_PBE_WORDS_REQUIRED_FOR_RENDERS]; -+ __u64 tpu_border_colour_table; -+ __u64 pds_bgnd[3]; -+ __u64 pds_pr_bgnd[3]; -+}; -+ -+/** -+ * DOC: Flags for SUBMIT_JOB ioctl fragment command. -+ * -+ * Operations -+ * ~~~~~~~~~~ -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_SINGLE_CORE -+ * -+ * Use single core in a multi core setup. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_DEPTHBUFFER -+ * -+ * Indicates whether a depth buffer is present. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_STENCILBUFFER -+ * -+ * Indicates whether a stencil buffer is present. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_PREVENT_CDM_OVERLAP -+ * -+ * Disallow compute overlapped with this render. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_FRAG_CMD_FLAGS_MASK -+ * -+ * Logical OR of all the fragment cmd flags. -+ */ -+#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_SINGLE_CORE _BITULL(3) -+#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_DEPTHBUFFER _BITULL(7) -+#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_STENCILBUFFER _BITULL(8) -+#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_PREVENT_CDM_OVERLAP _BITULL(26) -+#define DRM_PVR_SUBMIT_JOB_FRAG_CMD_FLAGS_MASK \ -+ (DRM_PVR_SUBMIT_JOB_FRAG_CMD_SINGLE_CORE | \ -+ DRM_PVR_SUBMIT_JOB_FRAG_CMD_DEPTHBUFFER | \ -+ DRM_PVR_SUBMIT_JOB_FRAG_CMD_STENCILBUFFER | \ -+ DRM_PVR_SUBMIT_JOB_FRAG_CMD_PREVENT_CDM_OVERLAP) -+ -+/** -+ * struct drm_pvr_cmd_frag_format_1 - structure representing a fragment command, for format -+ * %DRM_PVR_CMD_FRAG_FORMAT_1 -+ */ -+struct drm_pvr_cmd_frag_format_1 { -+ /** @frame_num: Associated frame number. */ -+ __u32 frame_num; -+ -+ /** @flags: command control flags. */ -+ __u32 flags; -+ -+ /** @zls_stride: Stride IN BYTES for Z-Buffer in case of RTAs. */ -+ __u32 zls_stride; -+ -+ /** @sls_stride: Stride IN BYTES for S-Buffer in case of RTAs. */ -+ __u32 sls_stride; -+ -+ /** -+ * @regs: Configuration registers which need to be loaded by the -+ * firmware before the ISP can be started. -+ */ -+ struct drm_pvr_frag_regs_format_1 regs; -+}; -+ -+/** -+ * struct drm_pvr_cmd_frag - structure representing a fragment command -+ */ -+struct drm_pvr_cmd_frag { -+ /** -+ * @format: [IN] Format of @data. -+ * -+ * This must be one of the values defined by -+ * &enum drm_pvr_cmd_frag_format. -+ * -+ * For firmware version 1.14, this is %DRM_PVR_CMD_FRAG_FORMAT_1. -+ */ -+ __u32 format; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @data: [IN] Fragment job data. */ -+ union { -+ /** -+ * @cmd_frag_format_1: Command data when @format == -+ * %DRM_PVR_CMD_FRAG_FORMAT_1. -+ */ -+ struct drm_pvr_cmd_frag_format_1 cmd_frag_format_1; -+ } data; -+}; -+ -+/** -+ * enum drm_pvr_cmd_compute_format - Arguments for -+ * &drm_pvr_cmd_compute.format -+ */ -+enum drm_pvr_cmd_compute_format { -+ DRM_PVR_CMD_COMPUTE_FORMAT_1 = 0, -+}; -+ -+/** -+ * struct drm_pvr_compute_regs_format_1 - Configuration registers which need to be loaded by the -+ * firmware before the CDM can be started -+ * -+ * Valid for format %DRM_PVR_CMD_COMPUTE_FORMAT_1. -+ */ -+struct drm_pvr_compute_regs_format_1 { -+ __u64 tpu_border_colour_table; -+ __u64 cdm_item; -+ __u64 compute_cluster; -+ __u64 cdm_ctrl_stream_base; -+ __u32 tpu; -+ __u32 cdm_resume_pds1; -+}; -+ -+/** -+ * DOC: Flags for SUBMIT_JOB ioctl compute command. -+ * -+ * Operations -+ * ~~~~~~~~~~ -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_PREVENT_ALL_OVERLAP -+ * -+ * Disallow other jobs overlapped with this compute. -+ * -+ * .. c:macro:: DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_SINGLE_CORE -+ * -+ * Forces to use single core in a multi core device. -+ */ -+#define DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_PREVENT_ALL_OVERLAP _BITULL(1) -+#define DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_SINGLE_CORE _BITULL(5) -+#define DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_FLAGS_MASK \ -+ (DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_PREVENT_ALL_OVERLAP | \ -+ DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_SINGLE_CORE) -+ -+/** -+ * struct drm_pvr_cmd_compute_format_1 - structure representing a compute command, for format -+ * %DRM_PVR_CMD_COMPUTE_FORMAT_1 -+ */ -+struct drm_pvr_cmd_compute_format_1 { -+ /** @frame_num: Associated frame number. */ -+ __u32 frame_num; -+ -+ /** @flags: command control flags. */ -+ __u32 flags; -+ -+ /** -+ * @regs: Configuration registers which need to be loaded by the -+ * firmware before the CDM can be started. -+ */ -+ struct drm_pvr_compute_regs_format_1 regs; -+}; -+ -+/** -+ * struct drm_pvr_cmd_compute - structure representing a compute command -+ */ -+struct drm_pvr_cmd_compute { -+ /** -+ * @format: [IN] Format of @data. -+ * -+ * This must be one of the values defined by -+ * &enum drm_pvr_cmd_compute_format. -+ * -+ * For firmware version 1.14, this is %DRM_PVR_CMD_COMPUTE_FORMAT_1. -+ */ -+ __u32 format; -+ -+ /** @_padding_4: Reserved. This field must be zeroed. */ -+ __u32 _padding_4; -+ -+ /** @data: [IN] Compute job data. */ -+ union { -+ /** -+ * @cmd_compute_format_1: Command data when @format == -+ * %DRM_PVR_CMD_COMPUTE_FORMAT_1. -+ */ -+ struct drm_pvr_cmd_compute_format_1 cmd_compute_format_1; -+ } data; -+}; -+ -+/** -+ * DOC: Flags for &struct drm_pvr_bo_ref.flags -+ * -+ * DRM_PVR_BO_REF_READ - This buffer object will be read by the device. -+ * -+ * DRM_PVR_BO_REF_WRITE - This buffer object will be written to by the device. -+ */ -+#define DRM_PVR_BO_REF_READ _BITUL(0) -+#define DRM_PVR_BO_REF_WRITE _BITUL(1) -+ -+/** -+ * struct drm_pvr_bo_ref - structure representing a DRM buffer object -+ */ -+struct drm_pvr_bo_ref { -+ /** @handle: DRM buffer object handle. */ -+ __u32 handle; -+ -+ /** @flags: Flags for this buffer object. Must be a combination of %DRM_PVR_BO_REF_*. */ -+ __u32 flags; -+}; -+ -+/* -+ * struct drm_pvr_job_render_args - Arguments for %DRM_PVR_JOB_TYPE_RENDER -+ */ -+struct drm_pvr_job_render_args { -+ /** -+ * @cmd_geom: [IN] Pointer to &struct drm_pvr_cmd_geom, representing geometry command. -+ * May be zero. -+ */ -+ __u64 cmd_geom; -+ -+ /** -+ * @cmd_frag: [IN] Pointer to &struct drm_pvr_cmd_frag, representing fragment command. -+ * May be zero. -+ */ -+ __u64 cmd_frag; -+ -+ /** -+ * @cmd_frag_pr: [IN] Pointer to &struct drm_pvr_cmd_frag, representing fragment PR command. -+ * May be zero. -+ */ -+ __u64 cmd_frag_pr; -+ -+ /** -+ * @in_syncobj_handles_geom: [IN] Pointer to array of drm_syncobj handles for -+ * input fences for geometry job. -+ * -+ * This array must be &num_in_syncobj_handles_geom entries large. -+ */ -+ __u64 in_syncobj_handles_geom; -+ -+ /** -+ * @in_syncobj_handles_frag: [IN] Pointer to array of drm_syncobj handles for -+ * input fences for fragment job. -+ * -+ * This array must be &num_in_syncobj_handles_frag entries large. -+ */ -+ __u64 in_syncobj_handles_frag; -+ -+ /** -+ * @in_syncobj_handles_frag_pr: [IN] Pointer to array of drm_syncobj handles for -+ * input fences for fragment PR job. -+ * -+ * This array must be &num_in_syncobj_handles_frag_pr entries large. -+ */ -+ __u64 in_syncobj_handles_frag_pr; -+ -+ /** -+ * @bo_handles: [IN] Pointer to array of struct drm_pvr_bo_ref. -+ * -+ * This array must be &num_bo_handles entries large. -+ */ -+ __u64 bo_handles; -+ -+ /** -+ * @num_in_syncobj_handles_geom: [IN] Number of input syncobj handles for geometry job. -+ */ -+ __u32 num_in_syncobj_handles_geom; -+ -+ /** -+ * @num_in_syncobj_handles_frag: [IN] Number of input syncobj handles for fragment job. -+ */ -+ __u32 num_in_syncobj_handles_frag; -+ -+ /** -+ * @num_in_syncobj_handles_frag_pr: [IN] Number of input syncobj handles for fragment PR -+ * job. -+ */ -+ __u32 num_in_syncobj_handles_frag_pr; -+ -+ /** -+ * @num_bo_handles: [IN] Number of DRM Buffer Objects. -+ * -+ * This detemines the size of the array &bo_handles points to. -+ */ -+ __u32 num_bo_handles; -+ -+ /** -+ * @out_syncobj_geom: [OUT] drm_syncobj handle for geometry output fence -+ */ -+ __u32 out_syncobj_geom; -+ -+ /** -+ * @out_syncobj_frag: [OUT] drm_syncobj handle for fragment output fence -+ */ -+ __u32 out_syncobj_frag; -+ -+ /** -+ * @hwrt_data_set_handle: [IN] Handle for HWRT data set. -+ * -+ * This must be a valid handle returned by %DRM_IOCTL_PVR_CREATE_OBJECT. -+ */ -+ __u32 hwrt_data_set_handle; -+ -+ /** -+ * @hwrt_data_index: [IN] Index of HWRT data within data set. -+ */ -+ __u32 hwrt_data_index; -+ -+ /** -+ * @msaa_scratch_buffer_handle: [IN] Handle for MSAA scratch buffer. -+ */ -+ __u32 msaa_scratch_buffer_handle; -+ -+ /** -+ * @zs_buffer_handle: [IN] Handle for Z/stencil buffer. -+ */ -+ __u32 zs_buffer_handle; -+}; -+ -+/* -+ * struct drm_pvr_job_compute_args - Arguments for %DRM_PVR_JOB_TYPE_COMPUTE -+ */ -+struct drm_pvr_job_compute_args { -+ /** -+ * @cmd: [IN] Pointer to &struct drm_pvr_cmd_compute, representing compute command. -+ */ -+ __u64 cmd; -+ -+ /** -+ * @in_syncobj_handles: [IN] Pointer to array of drm_syncobj handles for input fences. -+ * -+ * This array must be &num_in_syncobj_handles entries large. -+ */ -+ __u64 in_syncobj_handles; -+ -+ /** -+ * @bo_handles: [IN] Pointer to array of struct drm_pvr_bo_ref. -+ * -+ * This array must be &num_bo_handles entries large. -+ */ -+ __u64 bo_handles; -+ -+ /** -+ * @num_in_syncobj_handles: [IN] Number of input syncobj handles. -+ */ -+ __u32 num_in_syncobj_handles; -+ -+ /** -+ * @num_bo_handles: [IN] Number of DRM Buffer Objects. -+ * -+ * This detemines the size of the array &bo_handles points to. -+ */ -+ __u32 num_bo_handles; -+ -+ /** -+ * @out_syncobj: [OUT] drm_syncobj handle for output fence -+ */ -+ __u32 out_syncobj; -+ -+ /** @_padding_24: Reserved. This field must be zeroed. */ -+ __u32 _padding_24; -+}; -+ -+/** -+ * enum drm_pvr_job_type - Arguments for &drm_pvr_ioctl_submit_job_args.job_type -+ */ -+enum drm_pvr_job_type { -+ DRM_PVR_JOB_TYPE_RENDER = 0, -+ DRM_PVR_JOB_TYPE_COMPUTE, -+}; -+ -+/** -+ * struct drm_pvr_ioctl_submit_job_args - Arguments for %DRM_IOCTL_PVR_SUBMIT_JOB -+ */ -+struct drm_pvr_ioctl_submit_job_args { -+ -+ /** -+ * @job_type: [IN] Type of job being submitted -+ * -+ * This must be one of the values defined by &enum drm_pvr_job_type. -+ */ -+ __u32 job_type; -+ -+ /** -+ * @context: [IN] Context handle. -+ * -+ * This must be a valid handle returned by %DRM_IOCTL_PVR_CREATE_CONTEXT. The type of -+ * context must be compatible with the type of job being submitted. -+ */ -+ __u32 context_handle; -+ -+ /** -+ * @ext_job_ref: [IN] Job reference. -+ */ -+ __u32 ext_job_ref; -+ -+ /** @_padding_c: Reserved. This field must be zeroed. */ -+ __u32 _padding_c; -+ -+ /** @data: [IN] User pointer to job type specific arguments. */ -+ __u64 data; -+}; -+ -+#if defined(__cplusplus) -+} -+#endif -+ -+#endif /* __PVR_DRM_H__ */ --- -2.30.2 - diff --git a/patches/drivers/powervr/0004-Documentation-gpu-imagination-Add-initial-PowerVR-dr.patch b/patches/drivers/powervr/0004-Documentation-gpu-imagination-Add-initial-PowerVR-dr.patch deleted file mode 100644 index 19004febe57acbf12af5eb54e481df99441d8375..0000000000000000000000000000000000000000 --- a/patches/drivers/powervr/0004-Documentation-gpu-imagination-Add-initial-PowerVR-dr.patch +++ /dev/null @@ -1,387 +0,0 @@ -From afa72bcb756a0cb595aa7bd9a657b381c877de49 Mon Sep 17 00:00:00 2001 -From: Matt Coster <matt.coster@imgtec.com> -Date: Wed, 1 Sep 2021 15:37:46 +0100 -Subject: [PATCH 4/4] Documentation: gpu/imagination: Add initial PowerVR - driver documentation - -Signed-off-by: Matt Coster <matt.coster@imgtec.com> ---- - Documentation/gpu/drivers.rst | 2 + - Documentation/gpu/imagination/index.rst | 12 ++ - Documentation/gpu/imagination/uapi.rst | 131 ++++++++++++ - .../gpu/imagination/virtual_memory.rst | 190 ++++++++++++++++++ - 4 files changed, 335 insertions(+) - create mode 100644 Documentation/gpu/imagination/index.rst - create mode 100644 Documentation/gpu/imagination/uapi.rst - create mode 100644 Documentation/gpu/imagination/virtual_memory.rst - -diff --git a/Documentation/gpu/drivers.rst b/Documentation/gpu/drivers.rst -index 3a52f48215a3..5487deb218a3 100644 ---- a/Documentation/gpu/drivers.rst -+++ b/Documentation/gpu/drivers.rst -@@ -3,9 +3,11 @@ GPU Driver Documentation - ======================== - - .. toctree:: -+ :maxdepth: 3 - - amdgpu/index - i915 -+ imagination/index - mcde - meson - pl111 -diff --git a/Documentation/gpu/imagination/index.rst b/Documentation/gpu/imagination/index.rst -new file mode 100644 -index 000000000000..7f25c8560822 ---- /dev/null -+++ b/Documentation/gpu/imagination/index.rst -@@ -0,0 +1,12 @@ -+======================================= -+drm/imagination PowerVR Graphics Driver -+======================================= -+ -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_drv.c -+ :doc: PowerVR Graphics Driver -+ -+.. toctree:: -+ :maxdepth: 3 -+ -+ uapi -+ virtual_memory -diff --git a/Documentation/gpu/imagination/uapi.rst b/Documentation/gpu/imagination/uapi.rst -new file mode 100644 -index 000000000000..5530e8103b64 ---- /dev/null -+++ b/Documentation/gpu/imagination/uapi.rst -@@ -0,0 +1,131 @@ -+==== -+UAPI -+==== -+The sources associated with this section can be found in ``pvr_drm.h``. -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: PowerVR UAPI -+ -+ -+IOCTLS -+====== -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTLS -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: PVR_IOCTL -+ -+CREATE_BO -+--------- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL CREATE_BO -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_create_bo_args -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: Flags for CREATE_BO -+ -+GET_BO_MMAP_OFFSET -+------------------ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL GET_BO_MMAP_OFFSET -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_get_bo_mmap_offset_args -+ -+GET_PARAM -+--------- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL GET_PARAM -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_get_param_args -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_param -+ -+CREATE_CONTEXT -+-------------- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL CREATE_CONTEXT -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_create_context_args -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ctx_priority -+ drm_pvr_ctx_type -+ drm_pvr_static_render_context_state -+ drm_pvr_static_render_context_state_format -+ drm_pvr_reset_framework -+ drm_pvr_reset_framework_format -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: Flags for CREATE_CONTEXT -+ -+DESTROY_CONTEXT -+--------------- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL DESTROY_CONTEXT -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_destroy_context_args -+ -+CREATE_OBJECT -+------------- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL CREATE_OBJECT -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_create_object_args -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_object_type -+ drm_pvr_ioctl_create_free_list_args -+ create_hwrt_geom_data_args -+ create_hwrt_rt_data_args -+ create_hwrt_free_list_args -+ drm_pvr_ioctl_create_hwrt_dataset_args -+ -+DESTROY_OBJECT -+-------------- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL DESTROY_OBJECT -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_destroy_object_args -+ -+GET_HEAP_INFO -+------------- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL GET_HEAP_INFO -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_get_heap_info_args -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_heap_id -+ -+VM_OP -+----- -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: IOCTL VM_OP -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_vm_op_args -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :identifiers: drm_pvr_ioctl_vm_op_map_args drm_pvr_ioctl_vm_op_unmap_args -+ -+.. kernel-doc:: include/uapi/drm/pvr_drm.h -+ :doc: Flags for VM_OP -+ -+Internal notes -+============== -+.. kernel-doc:: include/gpu/drm/imagination/pvr_device.h -+ :doc: IOCTL validation helpers -+ -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_device.h -+ :identifiers: PVR_STATIC_ASSERT_64BIT_ALIGNED PVR_IOCTL_UNION_PADDING_CHECK -+ pvr_ioctl_union_padding_check -diff --git a/Documentation/gpu/imagination/virtual_memory.rst b/Documentation/gpu/imagination/virtual_memory.rst -new file mode 100644 -index 000000000000..17c434055d03 ---- /dev/null -+++ b/Documentation/gpu/imagination/virtual_memory.rst -@@ -0,0 +1,190 @@ -+=========================== -+GPU Virtual Memory Handling -+=========================== -+The sources associated with this section can be found in ``pvr_vm.c`` and -+``pvr_vm.h``. -+ -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: PowerVR Virtual Memory Handling -+ -+ -+Public API -+========== -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.h -+ :doc: Public API -+ -+Types -+----- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.h -+ :identifiers: pvr_vm_page_options -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_vm_create_context pvr_vm_destroy_context -+ pvr_vm_map pvr_vm_map_partial pvr_vm_unmap -+ -+Helper functions -+---------------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_device_addr_is_valid -+ -+Constants -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.h -+ :doc: Public API (constants) -+ -+ -+VM backing pages -+================ -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: VM backing pages -+ -+Types -+----- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_vm_backing_page -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_vm_backing_page_init pvr_vm_backing_page_fini -+ pvr_vm_backing_page_sync -+ -+Constants -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: VM backing pages (constants) -+ -+ -+Raw page tables -+=============== -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: Raw page tables -+ -+Types -+----- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_l2_entry_raw pvr_page_table_l1_entry_raw -+ pvr_page_table_l0_entry_raw -+ pvr_page_table_l2_raw pvr_page_table_l1_raw -+ pvr_page_table_l0_raw -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_l2_entry_raw_is_valid -+ pvr_page_table_l2_entry_raw_set -+ pvr_page_table_l2_entry_raw_clear -+ pvr_page_table_l1_entry_raw_is_valid -+ pvr_page_table_l1_entry_raw_set -+ pvr_page_table_l1_entry_raw_clear -+ pvr_page_table_l0_entry_raw_is_valid -+ pvr_page_table_l0_entry_raw_set -+ pvr_page_table_l0_entry_raw_clear -+ -+ -+Mirror page tables -+================== -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: Mirror page tables -+ -+Types -+----- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_l2 pvr_page_table_l1 pvr_page_table_l0 -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_l2_init pvr_page_table_l2_fini -+ pvr_page_table_l2_sync pvr_page_table_l2_get_raw -+ pvr_page_table_l2_get_entry_raw -+ pvr_page_table_l2_insert pvr_page_table_l2_remove -+ pvr_page_table_l1_init pvr_page_table_l1_fini -+ pvr_page_table_l1_sync pvr_page_table_l1_get_raw -+ pvr_page_table_l1_get_entry_raw -+ pvr_page_table_l1_insert pvr_page_table_l1_remove -+ pvr_page_table_l0_init pvr_page_table_l0_fini -+ pvr_page_table_l0_sync pvr_page_table_l0_get_raw -+ pvr_page_table_l0_get_entry_raw -+ pvr_page_table_l0_insert pvr_page_table_l0_remove -+ -+ -+Page table index utilities -+========================== -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: Page table index utilities -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_l2_idx pvr_page_table_l1_idx -+ pvr_page_table_l0_idx -+ -+Constants -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: Page table index utilities (constants) -+ -+ -+High-level page table operations -+================================ -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: High-level page table operations -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_l1_create pvr_page_table_l1_get_or_create -+ pvr_page_table_l0_create pvr_page_table_l0_get_or_create -+ pvr_page_create pvr_page_destroy -+ -+Internal functions -+------------------ -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_l1_create_unchecked __pvr_page_table_l1_destroy -+ pvr_page_table_l0_create_unchecked __pvr_page_table_l0_destroy -+ -+ -+Page table pointer -+================== -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: Page table pointer -+ -+Types -+----- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_ptr -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_ptr_init pvr_page_table_ptr_fini -+ pvr_page_table_ptr_next_page pvr_page_table_ptr_set -+ pvr_page_table_ptr_require_sync pvr_page_table_ptr_copy -+ pvr_page_table_ptr_sync pvr_page_table_ptr_sync_partial -+ -+Internal functions -+------------------ -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_page_table_ptr_sync_manual pvr_page_table_ptr_load_tables -+ -+ -+Interval tree base implementation -+================================= -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :doc: Interval tree base implementation -+ -+Types -+----- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_vm_interval_tree_node -+ -+Functions -+--------- -+.. kernel-doc:: drivers/gpu/drm/imagination/pvr_vm.c -+ :identifiers: pvr_vm_interval_tree_compute_last -+ pvr_vm_interval_tree_node_start pvr_vm_interval_tree_node_size -+ pvr_vm_interval_tree_node_last -+ pvr_vm_interval_tree_insert --- -2.30.2 - diff --git a/patches/drivers/powervr/0005-MAINTAINERS-Add-entry-for-PowerVR-DRM-driver.patch b/patches/drivers/powervr/0005-MAINTAINERS-Add-entry-for-PowerVR-DRM-driver.patch deleted file mode 100644 index f0e27ad59dbedd4aa2b9f66f64b5401da53d3f89..0000000000000000000000000000000000000000 --- a/patches/drivers/powervr/0005-MAINTAINERS-Add-entry-for-PowerVR-DRM-driver.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 59d4fe2d97f8e0845385465c8c64a780ed958181 Mon Sep 17 00:00:00 2001 -From: Frank Binns <frank.binns@imgtec.com> -Date: Sun, 19 Dec 2021 19:13:42 +0000 -Subject: [PATCH 5/5] MAINTAINERS: Add entry for PowerVR DRM driver - -Signed-off-by: Frank Binns <frank.binns@imgtec.com> ---- - MAINTAINERS | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/MAINTAINERS b/MAINTAINERS -index 05fd080b82f3..c754e9575f6a 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -9380,6 +9380,15 @@ IMGTEC IR DECODER DRIVER - S: Orphan - F: drivers/media/rc/img-ir/ - -+IMGTEC POWERVR DRM DRIVER -+M: Frank Binns <frank.binns@imgtec.com> -+M: Sarah Walker <sarah.walker@imgtec.com> -+R: Matt Coster <matt.coster@imgtec.com> -+S: Supported -+F: Documentation/gpu/imagination/ -+F: drivers/gpu/drm/imagination/ -+F: include/uapi/drm/pvr_drm.h -+ - IMON SOUNDGRAPH USB IR RECEIVER - M: Sean Young <sean@mess.org> - L: linux-media@vger.kernel.org --- -2.30.2 - diff --git a/patches/drivers/serdev/0001-serdev-Add-serdev_device_id.patch b/patches/drivers/serdev/0001-serdev-Add-serdev_device_id.patch deleted file mode 100644 index 5c7433e9903877b217d35413ac9ae97a4bc8f5ae..0000000000000000000000000000000000000000 --- a/patches/drivers/serdev/0001-serdev-Add-serdev_device_id.patch +++ /dev/null @@ -1,159 +0,0 @@ -From e52e4ccf1de73e51ac5fc27989f376c9725f9582 Mon Sep 17 00:00:00 2001 -From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> -Date: Sun, 18 Oct 2020 05:26:39 +0530 -Subject: [RFC PATCH 1/5] serdev: Add serdev_device_id - -Currently,a serdev device driver can only be used with devices that are -nodes of a device tree, or are part of the ACPI table.id_table will be -used for devices that are not part of the device tree nor the ACPI table -(example: device on greybus gbphy created uart). - -corresponding modalias field is introduced to name the driver to be -used with the device, required device(s) that are neither described -by device tree nor ACPI table. - -serdev_device_uevent is also extended for modalias devices. - -Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> ---- - drivers/tty/serdev/core.c | 41 ++++++++++++++++++++++++++++----- - include/linux/mod_devicetable.h | 10 ++++++++ - include/linux/serdev.h | 3 +++ - 3 files changed, 48 insertions(+), 6 deletions(-) - -diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c -index c5f0d936b003..01b248fdc264 100644 ---- a/drivers/tty/serdev/core.c -+++ b/drivers/tty/serdev/core.c -@@ -27,12 +27,17 @@ static ssize_t modalias_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - int len; -+ struct serdev_device *serdev = to_serdev_device(dev); - - len = acpi_device_modalias(dev, buf, PAGE_SIZE - 1); - if (len != -ENODEV) - return len; - -- return of_device_modalias(dev, buf, PAGE_SIZE); -+ len = of_device_modalias(dev, buf, PAGE_SIZE); -+ if (len != -ENODEV) -+ return len; -+ -+ return sprintf(buf, "%s%s\n", SERDEV_MODULE_PREFIX, serdev->modalias); - } - static DEVICE_ATTR_RO(modalias); - -@@ -45,14 +50,18 @@ ATTRIBUTE_GROUPS(serdev_device); - static int serdev_device_uevent(struct device *dev, struct kobj_uevent_env *env) - { - int rc; -- -- /* TODO: platform modalias */ -+ struct serdev_device *serdev = to_serdev_device(dev); - - rc = acpi_device_uevent_modalias(dev, env); - if (rc != -ENODEV) - return rc; - -- return of_device_uevent_modalias(dev, env); -+ rc = of_device_uevent_modalias(dev, env); -+ if (rc != -ENODEV) -+ return rc; -+ -+ return add_uevent_var(env, "MODALIAS=%s%s", SERDEV_MODULE_PREFIX, -+ serdev->modalias); - } - - static void serdev_device_release(struct device *dev) -@@ -83,16 +92,36 @@ static const struct device_type serdev_ctrl_type = { - .release = serdev_ctrl_release, - }; - -+static int serdev_match_id(const struct serdev_device_id *id, -+ const struct serdev_device *sdev) -+{ -+ while (id->name[0]) { -+ if (!strcmp(sdev->modalias, id->name)) -+ return 1; -+ id++; -+ } -+ -+ return 0; -+} -+ - static int serdev_device_match(struct device *dev, struct device_driver *drv) - { -+ const struct serdev_device *sdev = to_serdev_device(dev); -+ const struct serdev_device_driver *sdrv = to_serdev_device_driver(drv); -+ - if (!is_serdev_device(dev)) - return 0; - -- /* TODO: platform matching */ - if (acpi_driver_match_device(dev, drv)) - return 1; - -- return of_driver_match_device(dev, drv); -+ if (of_driver_match_device(dev, drv)) -+ return 1; -+ -+ if (sdrv->id_table) -+ return serdev_match_id(sdrv->id_table, sdev); -+ -+ return strcmp(sdev->modalias, drv->name) == 0; - } - - /** -diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h -index 5b08a473cdba..656353952da2 100644 ---- a/include/linux/mod_devicetable.h -+++ b/include/linux/mod_devicetable.h -@@ -486,6 +486,16 @@ struct i3c_device_id { - const void *data; - }; - -+/* serdev */ -+ -+#define SERDEV_NAME_SIZE 32 -+#define SERDEV_MODULE_PREFIX "serdev:" -+ -+struct serdev_device_id { -+ char name[SERDEV_NAME_SIZE]; -+ kernel_ulong_t driver_data; -+}; -+ - /* spi */ - - #define SPI_NAME_SIZE 32 -diff --git a/include/linux/serdev.h b/include/linux/serdev.h -index 9f14f9c12ec4..0d9c90a250b0 100644 ---- a/include/linux/serdev.h -+++ b/include/linux/serdev.h -@@ -7,6 +7,7 @@ - - #include <linux/types.h> - #include <linux/device.h> -+#include <linux/mod_devicetable.h> - #include <linux/termios.h> - #include <linux/delay.h> - -@@ -45,6 +46,7 @@ struct serdev_device { - const struct serdev_device_ops *ops; - struct completion write_comp; - struct mutex write_lock; -+ char modalias[SERDEV_NAME_SIZE]; - }; - - static inline struct serdev_device *to_serdev_device(struct device *d) -@@ -63,6 +65,7 @@ struct serdev_device_driver { - struct device_driver driver; - int (*probe)(struct serdev_device *); - void (*remove)(struct serdev_device *); -+ const struct serdev_device_id *id_table; - }; - - static inline struct serdev_device_driver *to_serdev_device_driver(struct device_driver *d) --- -2.25.1 - diff --git a/patches/drivers/serdev/0002-file2alias-Support-for-serdev-devices.patch b/patches/drivers/serdev/0002-file2alias-Support-for-serdev-devices.patch deleted file mode 100644 index ce00ea7b0c75e45fa046a3316c096bf43ce2f3fe..0000000000000000000000000000000000000000 --- a/patches/drivers/serdev/0002-file2alias-Support-for-serdev-devices.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 68d7f278257a1f0dc7533ee17c3f9d5da2455bb7 Mon Sep 17 00:00:00 2001 -From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> -Date: Sun, 18 Oct 2020 05:46:10 +0530 -Subject: [RFC PATCH 2/5] file2alias: Support for serdev devices - -This patch allows file2alias to generate the proper module headers to -support serdev modalias drivers. - -Eg: - -root@qt5022:~# modinfo serdev:ttydev | grep alias -alias: serdev:ttydev_serdev -alias: serdev:ttydev - -root@qt5022:~# - cat /lib/modules/4.16.0-qtec-standard/modules.alias | grep serdev -alias serdev:ttydev_serdev serdev_ttydev -alias serdev:ttydev serdev_ttydev - -Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> ---- - scripts/mod/devicetable-offsets.c | 3 +++ - scripts/mod/file2alias.c | 10 ++++++++++ - 2 files changed, 13 insertions(+) - -diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c -index 27007c18e754..732cd03e911d 100644 ---- a/scripts/mod/devicetable-offsets.c -+++ b/scripts/mod/devicetable-offsets.c -@@ -152,6 +152,9 @@ int main(void) - DEVID_FIELD(i3c_device_id, part_id); - DEVID_FIELD(i3c_device_id, extra_info); - -+ DEVID(serdev_device_id); -+ DEVID_FIELD(serdev_device_id, name); -+ - DEVID(spi_device_id); - DEVID_FIELD(spi_device_id, name); - -diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c -index 2417dd1dee33..540fee036d9d 100644 ---- a/scripts/mod/file2alias.c -+++ b/scripts/mod/file2alias.c -@@ -947,6 +947,15 @@ static int do_spi_entry(const char *filename, void *symval, - return 1; - } - -+static int do_serdev_entry(const char *filename, void *symval, -+ char *alias) -+{ -+ DEF_FIELD_ADDR(symval, serdev_device_id, name); -+ sprintf(alias, SERDEV_MODULE_PREFIX "%s", *name); -+ -+ return 1; -+} -+ - static const struct dmifield { - const char *prefix; - int field; -@@ -1420,6 +1429,7 @@ static const struct devtable devtable[] = { - {"rpmsg", SIZE_rpmsg_device_id, do_rpmsg_entry}, - {"i2c", SIZE_i2c_device_id, do_i2c_entry}, - {"i3c", SIZE_i3c_device_id, do_i3c_entry}, -+ {"serdev", SIZE_serdev_device_id, do_serdev_entry}, - {"spi", SIZE_spi_device_id, do_spi_entry}, - {"dmi", SIZE_dmi_system_id, do_dmi_entry}, - {"platform", SIZE_platform_device_id, do_platform_entry}, --- -2.25.1 - diff --git a/patches/drivers/serdev/0003-serdev-add-of_-helper-to-get-serdev-controller.patch b/patches/drivers/serdev/0003-serdev-add-of_-helper-to-get-serdev-controller.patch deleted file mode 100644 index 20f0dc86d3d6dddca3320e77a06129642f83d20c..0000000000000000000000000000000000000000 --- a/patches/drivers/serdev/0003-serdev-add-of_-helper-to-get-serdev-controller.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 5a117e6146ac68b67a563a931c11664b52b0a158 Mon Sep 17 00:00:00 2001 -From: Vaishnav M A <vaishnav@beagleboard.org> -Date: Sun, 18 Oct 2020 06:28:30 +0530 -Subject: [RFC PATCH 3/5] serdev: add of_ helper to get serdev controller - -add of_find_serdev_controller_by_node to obtain a -serdev_controller from the device_node, which -can help if the serdev_device is not described -over device tree and instantiation of the device -happens from a different driver, for the same purpose -an option to not delete an empty serdev controller -is added. - -Signed-off-by: Vaishnav M A <vaishnav@beagleboard.org> ---- - drivers/tty/serdev/core.c | 17 +++++++++++++++++ - include/linux/serdev.h | 2 ++ - 2 files changed, 19 insertions(+) - -diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c -index 01b248fdc264..85977b36ed7f 100644 ---- a/drivers/tty/serdev/core.c -+++ b/drivers/tty/serdev/core.c -@@ -582,6 +582,17 @@ static int of_serdev_register_devices(struct serdev_controller *ctrl) - return 0; - } - -+struct serdev_controller *of_find_serdev_controller_by_node(struct device_node *node) -+{ -+ struct device *dev = bus_find_device_by_of_node(&serdev_bus_type, node); -+ -+ if (!dev) -+ return NULL; -+ -+ return (dev->type == &serdev_ctrl_type) ? to_serdev_controller(dev) : NULL; -+} -+EXPORT_SYMBOL_GPL(of_find_serdev_controller_by_node); -+ - #ifdef CONFIG_ACPI - - #define SERDEV_ACPI_MAX_SCAN_DEPTH 32 -@@ -779,6 +790,12 @@ int serdev_controller_add(struct serdev_controller *ctrl) - - pm_runtime_enable(&ctrl->dev); - -+ /* provide option to not delete a serdev controller without devices -+ * if property is present -+ */ -+ if (device_property_present(&ctrl->dev, "force-empty-serdev-controller")) -+ return 0; -+ - ret_of = of_serdev_register_devices(ctrl); - ret_acpi = acpi_serdev_register_devices(ctrl); - if (ret_of && ret_acpi) { -diff --git a/include/linux/serdev.h b/include/linux/serdev.h -index 0d9c90a250b0..2e1eb4d17e1b 100644 ---- a/include/linux/serdev.h -+++ b/include/linux/serdev.h -@@ -115,6 +115,8 @@ static inline struct serdev_controller *to_serdev_controller(struct device *d) - return container_of(d, struct serdev_controller, dev); - } - -+struct serdev_controller *of_find_serdev_controller_by_node(struct device_node *node); -+ - static inline void *serdev_device_get_drvdata(const struct serdev_device *serdev) - { - return dev_get_drvdata(&serdev->dev); --- -2.25.1 - diff --git a/patches/drivers/serdev/0004-gnss-ubx-add-MODULE_DEVICE_TABLE-serdev.patch b/patches/drivers/serdev/0004-gnss-ubx-add-MODULE_DEVICE_TABLE-serdev.patch deleted file mode 100644 index 5a0badb4f5dfc3b390842c4b36b26ba23e784559..0000000000000000000000000000000000000000 --- a/patches/drivers/serdev/0004-gnss-ubx-add-MODULE_DEVICE_TABLE-serdev.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 625e5885def0997235d3153b60adb2e9044fc5c6 Mon Sep 17 00:00:00 2001 -From: Vaishnav M A <vaishnav@beagleboard.org> -Date: Sun, 18 Oct 2020 06:58:01 +0530 -Subject: [RFC PATCH 4/5] gnss: ubx add MODULE_DEVICE_TABLE(serdev) - -export serdev id table to the module header. - -Signed-off-by: Vaishnav M A <vaishnav@beagleboard.org> ---- - drivers/gnss/ubx.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/gnss/ubx.c b/drivers/gnss/ubx.c -index 7b05bc40532e..e50056cc4223 100644 ---- a/drivers/gnss/ubx.c -+++ b/drivers/gnss/ubx.c -@@ -138,6 +138,14 @@ static const struct of_device_id ubx_of_match[] = { - MODULE_DEVICE_TABLE(of, ubx_of_match); - #endif - -+static const struct serdev_device_id ubx_serdev_id[] = { -+ { "neo-6m", }, -+ { "neo-8", }, -+ { "neo-m8", }, -+ {} -+}; -+MODULE_DEVICE_TABLE(serdev, ubx_serdev_id); -+ - static struct serdev_device_driver ubx_driver = { - .driver = { - .name = "gnss-ubx", -@@ -146,6 +154,7 @@ static struct serdev_device_driver ubx_driver = { - }, - .probe = ubx_probe, - .remove = ubx_remove, -+ .id_table = ubx_serdev_id, - }; - module_serdev_device_driver(ubx_driver); - --- -2.25.1 - diff --git a/patches/drivers/serdev/0005-gnss-change-of_property_read-to-device_property_read.patch b/patches/drivers/serdev/0005-gnss-change-of_property_read-to-device_property_read.patch deleted file mode 100644 index 385e764736a571879d76e82a02a95efdc9a9ad4e..0000000000000000000000000000000000000000 --- a/patches/drivers/serdev/0005-gnss-change-of_property_read-to-device_property_read.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 960e964ca8b6bc8fa60fd9c6a6fd0163e82dad40 Mon Sep 17 00:00:00 2001 -From: Vaishnav M A <vaishnav@beagleboard.org> -Date: Sun, 18 Oct 2020 07:03:27 +0530 -Subject: [RFC PATCH 5/5] gnss: change of_property_read to device_property_read - -change of_property_read_u32 for the current-speed property -to use the device_property_read_u32 offered by the -Unified Device Properties Interface, this helps -passing the properties over a suitably populated struct -property_entry. - -Signed-off-by: Vaishnav M A <vaishnav@beagleboard.org> ---- - drivers/gnss/serial.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/drivers/gnss/serial.c b/drivers/gnss/serial.c -index def64b36d994..473faeea6aae 100644 ---- a/drivers/gnss/serial.c -+++ b/drivers/gnss/serial.c -@@ -110,10 +110,9 @@ static int gnss_serial_set_power(struct gnss_serial *gserial, - static int gnss_serial_parse_dt(struct serdev_device *serdev) - { - struct gnss_serial *gserial = serdev_device_get_drvdata(serdev); -- struct device_node *node = serdev->dev.of_node; - u32 speed = 4800; - -- of_property_read_u32(node, "current-speed", &speed); -+ device_property_read_u32(&serdev->dev, "current-speed", &speed); - - gserial->speed = speed; - --- -2.25.1 - diff --git a/patches/drivers/ti/serial/0001-quiet-8250_omap.c-use-pr_info-over-pr_err.patch b/patches/drivers/ti/serial/0001-quiet-8250_omap.c-use-pr_info-over-pr_err.patch deleted file mode 100644 index 37f9b6bc8794899084bee5a2a44f8f336dbba505..0000000000000000000000000000000000000000 --- a/patches/drivers/ti/serial/0001-quiet-8250_omap.c-use-pr_info-over-pr_err.patch +++ /dev/null @@ -1,31 +0,0 @@ -From c7ce33cb5f4f0dab18ebb10584eec77e8f84fce5 Mon Sep 17 00:00:00 2001 -From: Robert Nelson <robertcnelson@gmail.com> -Date: Thu, 16 Jul 2015 17:24:57 -0500 -Subject: [PATCH] quiet: 8250_omap.c use pr_info over pr_err - -Signed-off-by: Robert Nelson <robertcnelson@gmail.com> ---- - drivers/tty/serial/8250/8250_omap.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c -index 0a8316632d75..8ecebd14c655 100644 ---- a/drivers/tty/serial/8250/8250_omap.c -+++ b/drivers/tty/serial/8250/8250_omap.c -@@ -1503,10 +1503,10 @@ static int __init omap8250_console_fixup(void) - } - - add_preferred_console("ttyS", idx, options); -- pr_err("WARNING: Your 'console=ttyO%d' has been replaced by 'ttyS%d'\n", -+ pr_info("WARNING: Your 'console=ttyO%d' has been replaced by 'ttyS%d'\n", - idx, idx); -- pr_err("This ensures that you still see kernel messages. Please\n"); -- pr_err("update your kernel commandline.\n"); -+ pr_info("This ensures that you still see kernel messages. Please\n"); -+ pr_info("update your kernel commandline.\n"); - return 0; - } - console_initcall(omap8250_console_fixup); --- -2.20.1 - diff --git a/patches/drivers/ti/serial/0002-Revert-Revert-serial-8250-Fix-clearing-FIFOs-in-RS48.patch b/patches/drivers/ti/serial/0002-Revert-Revert-serial-8250-Fix-clearing-FIFOs-in-RS48.patch deleted file mode 100644 index 40eaa0f0f2fcb86eb631d0ba8b01cf53057caa1c..0000000000000000000000000000000000000000 --- a/patches/drivers/ti/serial/0002-Revert-Revert-serial-8250-Fix-clearing-FIFOs-in-RS48.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 9ac130a78dfbdf33927401cd00e99538f05bc0ff Mon Sep 17 00:00:00 2001 -From: Robert Nelson <robertcnelson@gmail.com> -Date: Thu, 20 May 2021 16:51:43 -0500 -Subject: [PATCH 2/2] Revert "Revert "serial: 8250: Fix clearing FIFOs in RS485 - mode again"" - -This reverts commit 3c9dc275dba1124c1e16e7037226038451286813. - -Signed-off-by: Robert Nelson <robertcnelson@gmail.com> ---- - drivers/tty/serial/8250/8250_port.c | 29 ++++++++++++++++++++++++----- - 1 file changed, 24 insertions(+), 5 deletions(-) - -diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c -index b0af13074cd3..16c548481283 100644 ---- a/drivers/tty/serial/8250/8250_port.c -+++ b/drivers/tty/serial/8250/8250_port.c -@@ -550,11 +550,30 @@ static unsigned int serial_icr_read(struct uart_8250_port *up, int offset) - */ - static void serial8250_clear_fifos(struct uart_8250_port *p) - { -+ unsigned char fcr; -+ unsigned char clr_mask = UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT; -+ - if (p->capabilities & UART_CAP_FIFO) { -- serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO); -- serial_out(p, UART_FCR, UART_FCR_ENABLE_FIFO | -- UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT); -- serial_out(p, UART_FCR, 0); -+ /* -+ * Make sure to avoid changing FCR[7:3] and ENABLE_FIFO bits. -+ * In case ENABLE_FIFO is not set, there is nothing to flush -+ * so just return. Furthermore, on certain implementations of -+ * the 8250 core, the FCR[7:3] bits may only be changed under -+ * specific conditions and changing them if those conditions -+ * are not met can have nasty side effects. One such core is -+ * the 8250-omap present in TI AM335x. -+ */ -+ fcr = serial_in(p, UART_FCR); -+ -+ /* FIFO is not enabled, there's nothing to clear. */ -+ if (!(fcr & UART_FCR_ENABLE_FIFO)) -+ return; -+ -+ fcr |= clr_mask; -+ serial_out(p, UART_FCR, fcr); -+ -+ fcr &= ~clr_mask; -+ serial_out(p, UART_FCR, fcr); - } - } - -@@ -1456,7 +1475,7 @@ void serial8250_em485_stop_tx(struct uart_8250_port *p) - * Enable previously disabled RX interrupts. - */ - if (!(p->port.rs485.flags & SER_RS485_RX_DURING_TX)) { -- serial8250_clear_and_reinit_fifos(p); -+ serial8250_clear_fifos(p); - - p->ier |= UART_IER_RLSI | UART_IER_RDI; - serial_port_out(&p->port, UART_IER, p->ier); --- -2.30.2 - diff --git a/patches/drivers/tps65217/0001-HACK-tps65217_pwr_but.patch b/patches/drivers/tps65217/0001-HACK-tps65217_pwr_but.patch deleted file mode 100644 index f5d3abcacae46f55cab87a62f4214187d4c2f16e..0000000000000000000000000000000000000000 --- a/patches/drivers/tps65217/0001-HACK-tps65217_pwr_but.patch +++ /dev/null @@ -1,26 +0,0 @@ -From fd9c8bf4ac08100d58d5e51a383db18d66bf1714 Mon Sep 17 00:00:00 2001 -From: Robert Nelson <robertcnelson@gmail.com> -Date: Fri, 28 Oct 2016 14:14:27 -0500 -Subject: [PATCH] HACK: tps65217_pwr_but - -Signed-off-by: Robert Nelson <robertcnelson@gmail.com> ---- - drivers/input/misc/tps65218-pwrbutton.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/input/misc/tps65218-pwrbutton.c b/drivers/input/misc/tps65218-pwrbutton.c -index a4455bb12ae0..b6d4321d421f 100644 ---- a/drivers/input/misc/tps65218-pwrbutton.c -+++ b/drivers/input/misc/tps65218-pwrbutton.c -@@ -36,7 +36,7 @@ struct tps6521x_data { - static const struct tps6521x_data tps65217_data = { - .reg_status = TPS65217_REG_STATUS, - .pb_mask = TPS65217_STATUS_PB, -- .name = "tps65217_pwrbutton", -+ .name = "tps65217_pwr_but", - }; - - static const struct tps6521x_data tps65218_data = { --- -2.20.1 - diff --git a/patches/dts/omap/0001-ARM-dts-am335x-boneblue-add-gpio-line-names.patch b/patches/dts/omap/0001-ARM-dts-am335x-boneblue-add-gpio-line-names.patch deleted file mode 100644 index a791bbc38453b0727ef8f11dca757c8aa97ec6c4..0000000000000000000000000000000000000000 --- a/patches/dts/omap/0001-ARM-dts-am335x-boneblue-add-gpio-line-names.patch +++ /dev/null @@ -1,176 +0,0 @@ -From 885971db68665badce8d9a0b0454376918391960 Mon Sep 17 00:00:00 2001 -From: David Lechner <david@lechnology.com> -Date: Fri, 9 Jul 2021 16:47:06 -0500 -Subject: [PATCH 1/4] ARM: dts: am335x-boneblue: add gpio-line-names - -This adds gpio-line-names to the BeagleBone Blue DTS. The line names -are based on the BeagleBone Blue rev A2 schematic. - -Signed-off-by: David Lechner <david@lechnology.com> -Signed-off-by: Tony Lindgren <tony@atomide.com> ---- - arch/arm/boot/dts/am335x-boneblue.dts | 143 +++++++++++++++++++++++++- - 1 file changed, 142 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/boot/dts/am335x-boneblue.dts b/arch/arm/boot/dts/am335x-boneblue.dts -index 0afcc2ee0b63..c6bb325ead33 100644 ---- a/arch/arm/boot/dts/am335x-boneblue.dts -+++ b/arch/arm/boot/dts/am335x-boneblue.dts -@@ -435,12 +435,153 @@ &dcan1 { - status = "okay"; - }; - -+&gpio0 { -+ gpio-line-names = -+ "UART3_CTS", /* M17 */ -+ "UART3_RTS", /* M18 */ -+ "UART2_RX", /* A17 */ -+ "UART2_TX", /* B17 */ -+ "I2C1_SDA", /* B16 */ -+ "I2C1_SCL", /* A16 */ -+ "MMC0_CD", /* C15 */ -+ "SPI1_SS2", /* C18 */ -+ "EQEP_1A", /* V2 */ -+ "EQEP_1B", /* V3 */ -+ "MDIR_2B", /* V4 */ -+ "BATT_LED_2", /* T5 */ -+ "I2C2_SDA", /* D18 */ -+ "I2C2_SCL", /* D17 */ -+ "UART1_RX", /* D16 */ -+ "UART1_TX", /* D15 */ -+ "MMC2_DAT1", /* J18 */ -+ "MMC2_DAT2", /* K15 */ -+ "NC", /* F16 */ -+ "WIFI_LED", /* A15 */ -+ "MOT_STBY", /* D14 */ -+ "WLAN_IRQ", /* K16 */ -+ "PWM_2A", /* U10 */ -+ "PWM_2B", /* T10 */ -+ "", -+ "", -+ "BATT_LED_4", /* T11 */ -+ "BATT_LED_1", /* U12 */ -+ "BT_EN", /* K17 */ -+ "SPI1_SS1", /* H18 */ -+ "UART4_RX", /* T17 */ -+ "MDIR_1B"; /* U17 */ -+}; -+ -+&gpio1 { -+ gpio-line-names = -+ "MMC1_DAT0", /* U7 */ -+ "MMC1_DAT1", /* V7 */ -+ "MMC1_DAT2", /* R8 */ -+ "MMC1_DAT3", /* T8 */ -+ "MMC1_DAT4", /* U8 */ -+ "MMC1_DAT5", /* V8 */ -+ "MMC1_DAT6", /* R9 */ -+ "MMC1_DAT7", /* T9 */ -+ "DCAN1_TX", /* E18 */ -+ "DCAN1_RX", /* E17 */ -+ "UART0_RX", /* E15 */ -+ "UART0_TX", /* E16 */ -+ "EQEP_2A", /* T12 */ -+ "EQEP_2B", /* R12 */ -+ "PRU_E_A", /* V13 */ -+ "PRU_E_B", /* U13 */ -+ "MDIR_2A", /* R13 */ -+ "GPIO1_17", /* V14 */ -+ "PWM_1A", /* U14 */ -+ "PWM_1B", /* T14 */ -+ "EMMC_RST", /* R14 */ -+ "USR_LED_0", /* V15 */ -+ "USR_LED_1", /* U15 */ -+ "USR_LED_2", /* T15 */ -+ "USR_LED_3", /* V16 */ -+ "GPIO1_25", /* U16 */ -+ "MCASP0_AXR0", /* T16 */ -+ "MCASP0_AXR1", /* V17 */ -+ "MCASP0_ACLKR", /* U18 */ -+ "BATT_LED_3", /* V6 */ -+ "MMC1_CLK", /* U9 */ -+ "MMC1_CMD"; /* V9 */ -+}; -+ -+&gpio2 { -+ gpio-line-names = -+ "MDIR_1A", /* T13 */ -+ "MCASP0_FSR", /* V12 */ -+ "LED_RED", /* R7 */ -+ "LED_GREEN", /* T7 */ -+ "MODE_BTN", /* U6 */ -+ "PAUSE_BTN", /* T6 */ -+ "MDIR_4A", /* R1 */ -+ "MDIR_4B", /* R2 */ -+ "MDIR_3B", /* R3 */ -+ "MDIR_3A", /* R4 */ -+ "SVO7", /* T1 */ -+ "SVO8", /* T2 */ -+ "SVO5", /* T3 */ -+ "SVO6", /* T4 */ -+ "UART5_TX", /* U1 */ -+ "UART5_RX", /* U2 */ -+ "SERVO_EN", /* U3 */ -+ "NC", /* U4 */ -+ "UART3_RX", /* L17 */ -+ "UART3_TX", /* L16 */ -+ "MMC2_CLK", /* L15 */ -+ "DCAN1_SILENT", /* M16 */ -+ "SVO1", /* U5 */ -+ "SVO3", /* R5 */ -+ "SVO2", /* V5 */ -+ "SVO4", /* R6 */ -+ "MMC0_DAT3", /* F17 */ -+ "MMC0_DAT2", /* F18 */ -+ "MMC0_DAT1", /* G15 */ -+ "MMC0_DAT0", /* G16 */ -+ "MMC0_CLK", /* G17 */ -+ "MMC0_CMD"; /* G18 */ -+}; -+ - &gpio3 { -+ gpio-line-names = -+ "MMC2_DAT3", /* H16 */ -+ "GPIO3_1", /* H17 */ -+ "GPIO3_2", /* J15 */ -+ "MMC2_CMD", /* J16 */ -+ "MMC2_DAT0", /* J17 */ -+ "I2C0_SDA", /* C17 */ -+ "I2C0_SCL", /* C16 */ -+ "EMU1", /* C14 */ -+ "EMU0", /* B14 */ -+ "WL_EN", /* K18 */ -+ "WL_BT_OE", /* L18 */ -+ "", -+ "", -+ "NC", /* F15 */ -+ "SPI1_SCK", /* A13 */ -+ "SPI1_MISO", /* B13 */ -+ "SPI1_MOSI", /* D12 */ -+ "GPIO3_17", /* C12 */ -+ "EQEP_0A", /* B12 */ -+ "EQEP_0B", /* C13 */ -+ "GPIO3_20", /* D13 */ -+ "IMU_INT", /* A14 */ -+ "", -+ "", -+ "", -+ "", -+ "", -+ "", -+ "", -+ "", -+ "", -+ ""; -+ - ls-buf-en-hog { - gpio-hog; - gpios = <10 GPIO_ACTIVE_HIGH>; - output-high; -- line-name = "LS_BUF_EN"; - }; - }; - --- -2.30.2 - diff --git a/patches/dts/omap/0002-ARM-dts-am335x-boneblack-Extract-HDMI-config.patch b/patches/dts/omap/0002-ARM-dts-am335x-boneblack-Extract-HDMI-config.patch deleted file mode 100644 index 3228feb4b217f314ad35c23096cd06d190454a5e..0000000000000000000000000000000000000000 --- a/patches/dts/omap/0002-ARM-dts-am335x-boneblack-Extract-HDMI-config.patch +++ /dev/null @@ -1,369 +0,0 @@ -From 8b113de254951b51dc2026af863ab6b9fef56c34 Mon Sep 17 00:00:00 2001 -From: Paul Barker <paul.barker@sancloud.com> -Date: Tue, 20 Jul 2021 09:39:25 +0100 -Subject: [PATCH 2/4] ARM: dts: am335x-boneblack: Extract HDMI config - -Move the HDMI hardware configuration for the BeagleBone Black out of the -boneblack common dtsi file and into its own separate dtsi file. This -allows the devicetree for BeagleBone Black derivatives which lack the -hdmi encoding hardware to include the common dtsi file without needing -to duplicate configuration or override the status of all hdmi-related -nodes. - -Signed-off-by: Paul Barker <paul.barker@sancloud.com> -Signed-off-by: Tony Lindgren <tony@atomide.com> ---- - .../arm/boot/dts/am335x-boneblack-common.dtsi | 135 ----------------- - arch/arm/boot/dts/am335x-boneblack-hdmi.dtsi | 141 ++++++++++++++++++ - .../boot/dts/am335x-boneblack-wireless.dts | 1 + - arch/arm/boot/dts/am335x-boneblack.dts | 1 + - arch/arm/boot/dts/am335x-sancloud-bbe.dts | 1 + - 5 files changed, 144 insertions(+), 135 deletions(-) - create mode 100644 arch/arm/boot/dts/am335x-boneblack-hdmi.dtsi - -diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi b/arch/arm/boot/dts/am335x-boneblack-common.dtsi -index 64c3e9269f40..10494c4431b9 100644 ---- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi -+++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi -@@ -3,9 +3,6 @@ - * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/ - */ - --#include <dt-bindings/display/tda998x.h> --#include <dt-bindings/interrupt-controller/irq.h> -- - &ldo3_reg { - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; -@@ -25,145 +22,13 @@ &mmc2 { - non-removable; - }; - --&am33xx_pinmux { -- nxp_hdmi_bonelt_pins: nxp_hdmi_bonelt_pins { -- pinctrl-single,pins = < -- AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA0, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA1, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA2, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA3, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA4, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA5, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA6, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA7, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA8, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA9, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA10, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA11, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA12, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA13, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA14, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_DATA15, PIN_OUTPUT, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_HSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_PCLK, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -- >; -- }; -- -- nxp_hdmi_bonelt_off_pins: nxp_hdmi_bonelt_off_pins { -- pinctrl-single,pins = < -- AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3) -- >; -- }; -- -- mcasp0_pins: mcasp0_pins { -- pinctrl-single,pins = < -- AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKX, PIN_INPUT_PULLUP, MUX_MODE0) /* mcasp0_ahcklx.mcasp0_ahclkx */ -- AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2*/ -- AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLUP, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* gpmc_a11.GPIO1_27 */ -- >; -- }; --}; -- --&lcdc { -- status = "okay"; -- -- /* If you want to get 24 bit RGB and 16 BGR mode instead of -- * current 16 bit RGB and 24 BGR modes, set the propety -- * below to "crossed" and uncomment the video-ports -property -- * in tda19988 node. -- */ -- blue-and-red-wiring = "straight"; -- -- port { -- lcdc_0: endpoint@0 { -- remote-endpoint = <&hdmi_0>; -- }; -- }; --}; -- --&i2c0 { -- tda19988: tda19988@70 { -- compatible = "nxp,tda998x"; -- reg = <0x70>; -- nxp,calib-gpios = <&gpio1 25 0>; -- interrupts-extended = <&gpio1 25 IRQ_TYPE_LEVEL_LOW>; -- -- pinctrl-names = "default", "off"; -- pinctrl-0 = <&nxp_hdmi_bonelt_pins>; -- pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>; -- -- /* Convert 24bit BGR to RGB, e.g. cross red and blue wiring */ -- /* video-ports = <0x234501>; */ -- -- #sound-dai-cells = <0>; -- audio-ports = < TDA998x_I2S 0x03>; -- -- ports { -- port@0 { -- hdmi_0: endpoint@0 { -- remote-endpoint = <&lcdc_0>; -- }; -- }; -- }; -- }; --}; -- - &rtc { - system-power-controller; - }; - --&mcasp0 { -- #sound-dai-cells = <0>; -- pinctrl-names = "default"; -- pinctrl-0 = <&mcasp0_pins>; -- status = "okay"; -- op-mode = <0>; /* MCASP_IIS_MODE */ -- tdm-slots = <2>; -- serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */ -- 0 0 1 0 -- >; -- tx-num-evt = <32>; -- rx-num-evt = <32>; --}; -- - / { - memory@80000000 { - device_type = "memory"; - reg = <0x80000000 0x20000000>; /* 512 MB */ - }; -- -- clk_mcasp0_fixed: clk_mcasp0_fixed { -- #clock-cells = <0>; -- compatible = "fixed-clock"; -- clock-frequency = <24576000>; -- }; -- -- clk_mcasp0: clk_mcasp0 { -- #clock-cells = <0>; -- compatible = "gpio-gate-clock"; -- clocks = <&clk_mcasp0_fixed>; -- enable-gpios = <&gpio1 27 0>; /* BeagleBone Black Clk enable on GPIO1_27 */ -- }; -- -- sound { -- compatible = "simple-audio-card"; -- simple-audio-card,name = "TI BeagleBone Black"; -- simple-audio-card,format = "i2s"; -- simple-audio-card,bitclock-master = <&dailink0_master>; -- simple-audio-card,frame-master = <&dailink0_master>; -- -- dailink0_master: simple-audio-card,cpu { -- sound-dai = <&mcasp0>; -- clocks = <&clk_mcasp0>; -- }; -- -- simple-audio-card,codec { -- sound-dai = <&tda19988>; -- }; -- }; - }; -diff --git a/arch/arm/boot/dts/am335x-boneblack-hdmi.dtsi b/arch/arm/boot/dts/am335x-boneblack-hdmi.dtsi -new file mode 100644 -index 000000000000..7cfddada9348 ---- /dev/null -+++ b/arch/arm/boot/dts/am335x-boneblack-hdmi.dtsi -@@ -0,0 +1,141 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/ -+ */ -+ -+#include <dt-bindings/display/tda998x.h> -+#include <dt-bindings/interrupt-controller/irq.h> -+ -+&am33xx_pinmux { -+ nxp_hdmi_bonelt_pins: nxp_hdmi_bonelt_pins { -+ pinctrl-single,pins = < -+ AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA0, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA1, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA2, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA3, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA4, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA5, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA6, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA7, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA8, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA9, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA10, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA11, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA12, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA13, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA14, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_DATA15, PIN_OUTPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_VSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_HSYNC, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_PCLK, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_LCD_AC_BIAS_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -+ >; -+ }; -+ -+ nxp_hdmi_bonelt_off_pins: nxp_hdmi_bonelt_off_pins { -+ pinctrl-single,pins = < -+ AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR0, PIN_OUTPUT_PULLDOWN, MUX_MODE3) -+ >; -+ }; -+ -+ mcasp0_pins: mcasp0_pins { -+ pinctrl-single,pins = < -+ AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKX, PIN_INPUT_PULLUP, MUX_MODE0) /* mcasp0_ahcklx.mcasp0_ahclkx */ -+ AM33XX_PADCONF(AM335X_PIN_MCASP0_AHCLKR, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mcasp0_ahclkr.mcasp0_axr2*/ -+ AM33XX_PADCONF(AM335X_PIN_MCASP0_FSX, PIN_OUTPUT_PULLUP, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_MCASP0_ACLKX, PIN_OUTPUT_PULLDOWN, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_GPMC_A11, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* gpmc_a11.GPIO1_27 */ -+ >; -+ }; -+}; -+ -+&lcdc { -+ status = "okay"; -+ -+ /* If you want to get 24 bit RGB and 16 BGR mode instead of -+ * current 16 bit RGB and 24 BGR modes, set the propety -+ * below to "crossed" and uncomment the video-ports -property -+ * in tda19988 node. -+ */ -+ blue-and-red-wiring = "straight"; -+ -+ port { -+ lcdc_0: endpoint@0 { -+ remote-endpoint = <&hdmi_0>; -+ }; -+ }; -+}; -+ -+&i2c0 { -+ tda19988: tda19988@70 { -+ compatible = "nxp,tda998x"; -+ reg = <0x70>; -+ nxp,calib-gpios = <&gpio1 25 0>; -+ interrupts-extended = <&gpio1 25 IRQ_TYPE_LEVEL_LOW>; -+ -+ pinctrl-names = "default", "off"; -+ pinctrl-0 = <&nxp_hdmi_bonelt_pins>; -+ pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>; -+ -+ /* Convert 24bit BGR to RGB, e.g. cross red and blue wiring */ -+ /* video-ports = <0x234501>; */ -+ -+ #sound-dai-cells = <0>; -+ audio-ports = < TDA998x_I2S 0x03>; -+ -+ ports { -+ port@0 { -+ hdmi_0: endpoint@0 { -+ remote-endpoint = <&lcdc_0>; -+ }; -+ }; -+ }; -+ }; -+}; -+ -+&mcasp0 { -+ #sound-dai-cells = <0>; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mcasp0_pins>; -+ status = "okay"; -+ op-mode = <0>; /* MCASP_IIS_MODE */ -+ tdm-slots = <2>; -+ serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */ -+ 0 0 1 0 -+ >; -+ tx-num-evt = <32>; -+ rx-num-evt = <32>; -+}; -+ -+/ { -+ clk_mcasp0_fixed: clk_mcasp0_fixed { -+ #clock-cells = <0>; -+ compatible = "fixed-clock"; -+ clock-frequency = <24576000>; -+ }; -+ -+ clk_mcasp0: clk_mcasp0 { -+ #clock-cells = <0>; -+ compatible = "gpio-gate-clock"; -+ clocks = <&clk_mcasp0_fixed>; -+ enable-gpios = <&gpio1 27 0>; /* BeagleBone Black Clk enable on GPIO1_27 */ -+ }; -+ -+ sound { -+ compatible = "simple-audio-card"; -+ simple-audio-card,name = "TI BeagleBone Black"; -+ simple-audio-card,format = "i2s"; -+ simple-audio-card,bitclock-master = <&dailink0_master>; -+ simple-audio-card,frame-master = <&dailink0_master>; -+ -+ dailink0_master: simple-audio-card,cpu { -+ sound-dai = <&mcasp0>; -+ clocks = <&clk_mcasp0>; -+ }; -+ -+ simple-audio-card,codec { -+ sound-dai = <&tda19988>; -+ }; -+ }; -+}; -diff --git a/arch/arm/boot/dts/am335x-boneblack-wireless.dts b/arch/arm/boot/dts/am335x-boneblack-wireless.dts -index 80116646a3fe..8b2b24c80670 100644 ---- a/arch/arm/boot/dts/am335x-boneblack-wireless.dts -+++ b/arch/arm/boot/dts/am335x-boneblack-wireless.dts -@@ -7,6 +7,7 @@ - #include "am33xx.dtsi" - #include "am335x-bone-common.dtsi" - #include "am335x-boneblack-common.dtsi" -+#include "am335x-boneblack-hdmi.dtsi" - #include <dt-bindings/interrupt-controller/irq.h> - - / { -diff --git a/arch/arm/boot/dts/am335x-boneblack.dts b/arch/arm/boot/dts/am335x-boneblack.dts -index e2ee8b8c07bc..9312197316f0 100644 ---- a/arch/arm/boot/dts/am335x-boneblack.dts -+++ b/arch/arm/boot/dts/am335x-boneblack.dts -@@ -7,6 +7,7 @@ - #include "am33xx.dtsi" - #include "am335x-bone-common.dtsi" - #include "am335x-boneblack-common.dtsi" -+#include "am335x-boneblack-hdmi.dtsi" - - / { - model = "TI AM335x BeagleBone Black"; -diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe.dts b/arch/arm/boot/dts/am335x-sancloud-bbe.dts -index 275ba339adf4..c82295654bdd 100644 ---- a/arch/arm/boot/dts/am335x-sancloud-bbe.dts -+++ b/arch/arm/boot/dts/am335x-sancloud-bbe.dts -@@ -7,6 +7,7 @@ - #include "am33xx.dtsi" - #include "am335x-bone-common.dtsi" - #include "am335x-boneblack-common.dtsi" -+#include "am335x-boneblack-hdmi.dtsi" - #include <dt-bindings/interrupt-controller/irq.h> - - / { --- -2.30.2 - diff --git a/patches/dts/omap/0003-ARM-dts-am335x-sancloud-bbe-Extract-common-code.patch b/patches/dts/omap/0003-ARM-dts-am335x-sancloud-bbe-Extract-common-code.patch deleted file mode 100644 index 8d053c0f5297044a3aca515a0cc06db2d345c8d3..0000000000000000000000000000000000000000 --- a/patches/dts/omap/0003-ARM-dts-am335x-sancloud-bbe-Extract-common-code.patch +++ /dev/null @@ -1,242 +0,0 @@ -From a70b987a4be9781c67d792f827a851112be1d0f6 Mon Sep 17 00:00:00 2001 -From: Paul Barker <paul.barker@sancloud.com> -Date: Tue, 20 Jul 2021 09:39:26 +0100 -Subject: [PATCH 3/4] ARM: dts: am335x-sancloud-bbe: Extract common code - -The Sancloud BBE, BBE Lite and BBE Extended+WiFi share a common hardware -base so we can avoid duplication via a dtsi file. - -Signed-off-by: Paul Barker <paul.barker@sancloud.com> -Signed-off-by: Tony Lindgren <tony@atomide.com> ---- - .../boot/dts/am335x-sancloud-bbe-common.dtsi | 96 +++++++++++++++++++ - arch/arm/boot/dts/am335x-sancloud-bbe.dts | 91 +----------------- - 2 files changed, 97 insertions(+), 90 deletions(-) - create mode 100644 arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi - -diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi b/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -new file mode 100644 -index 000000000000..bd9c21813192 ---- /dev/null -+++ b/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -@@ -0,0 +1,96 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2012 Texas Instruments Incorporated - https://www.ti.com/ -+ */ -+ -+&am33xx_pinmux { -+ cpsw_default: cpsw_default { -+ pinctrl-single,pins = < -+ /* Slave 1 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txen.rgmii1_tctl */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxdv.rgmii1_rctl */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd3.rgmii1_td3 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd2.rgmii1_td2 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd1.rgmii1_td1 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd0.rgmii1_td0 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txclk.rgmii1_tclk */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxclk.rgmii1_rclk */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd3.rgmii1_rd3 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd2.rgmii1_rd2 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd1.rgmii1_rd1 */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd0.rgmii1_rd0 */ -+ >; -+ }; -+ -+ cpsw_sleep: cpsw_sleep { -+ pinctrl-single,pins = < -+ /* Slave 1 reset value */ -+ AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ >; -+ }; -+ -+ davinci_mdio_default: davinci_mdio_default { -+ pinctrl-single,pins = < -+ /* MDIO */ -+ AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLUP | SLEWCTRL_FAST, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_MDC, PIN_OUTPUT_PULLUP, MUX_MODE0) -+ >; -+ }; -+ -+ davinci_mdio_sleep: davinci_mdio_sleep { -+ pinctrl-single,pins = < -+ /* MDIO reset value */ -+ AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ AM33XX_PADCONF(AM335X_PIN_MDC, PIN_INPUT_PULLDOWN, MUX_MODE7) -+ >; -+ }; -+ -+ usb_hub_ctrl: usb_hub_ctrl { -+ pinctrl-single,pins = < -+ AM33XX_PADCONF(AM335X_PIN_RMII1_REF_CLK, PIN_OUTPUT_PULLUP, MUX_MODE7) /* rmii1_refclk.gpio0_29 */ -+ >; -+ }; -+}; -+ -+&mac { -+ pinctrl-names = "default", "sleep"; -+ pinctrl-0 = <&cpsw_default>; -+ pinctrl-1 = <&cpsw_sleep>; -+ status = "okay"; -+}; -+ -+&davinci_mdio { -+ pinctrl-names = "default", "sleep"; -+ pinctrl-0 = <&davinci_mdio_default>; -+ pinctrl-1 = <&davinci_mdio_sleep>; -+ status = "okay"; -+ -+ ethphy0: ethernet-phy@0 { -+ reg = <0>; -+ }; -+}; -+ -+&cpsw_emac0 { -+ phy-handle = <ðphy0>; -+ phy-mode = "rgmii-id"; -+}; -+ -+&i2c0 { -+ usb2512b: usb-hub@2c { -+ compatible = "microchip,usb2512b"; -+ reg = <0x2c>; -+ reset-gpios = <&gpio0 29 GPIO_ACTIVE_LOW>; -+ /* wifi on port 4 */ -+ }; -+}; -diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe.dts b/arch/arm/boot/dts/am335x-sancloud-bbe.dts -index c82295654bdd..2a0ac9f5dda7 100644 ---- a/arch/arm/boot/dts/am335x-sancloud-bbe.dts -+++ b/arch/arm/boot/dts/am335x-sancloud-bbe.dts -@@ -8,6 +8,7 @@ - #include "am335x-bone-common.dtsi" - #include "am335x-boneblack-common.dtsi" - #include "am335x-boneblack-hdmi.dtsi" -+#include "am335x-sancloud-bbe-common.dtsi" - #include <dt-bindings/interrupt-controller/irq.h> - - / { -@@ -16,66 +17,6 @@ / { - }; - - &am33xx_pinmux { -- pinctrl-names = "default"; -- -- cpsw_default: cpsw_default { -- pinctrl-single,pins = < -- /* Slave 1 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txen.rgmii1_tctl */ -- AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxdv.rgmii1_rctl */ -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd3.rgmii1_td3 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd2.rgmii1_td2 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd1.rgmii1_td1 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txd0.rgmii1_td0 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_OUTPUT_PULLDOWN, MUX_MODE2) /* mii1_txclk.rgmii1_tclk */ -- AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxclk.rgmii1_rclk */ -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd3.rgmii1_rd3 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd2.rgmii1_rd2 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd1.rgmii1_rd1 */ -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLDOWN, MUX_MODE2) /* mii1_rxd0.rgmii1_rd0 */ -- >; -- }; -- -- cpsw_sleep: cpsw_sleep { -- pinctrl-single,pins = < -- /* Slave 1 reset value */ -- AM33XX_PADCONF(AM335X_PIN_MII1_TX_EN, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_RX_DV, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD3, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD2, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD1, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_TXD0, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_TX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_RX_CLK, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD3, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD2, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD1, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MII1_RXD0, PIN_INPUT_PULLDOWN, MUX_MODE7) -- >; -- }; -- -- davinci_mdio_default: davinci_mdio_default { -- pinctrl-single,pins = < -- /* MDIO */ -- AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLUP | SLEWCTRL_FAST, MUX_MODE0) -- AM33XX_PADCONF(AM335X_PIN_MDC, PIN_OUTPUT_PULLUP, MUX_MODE0) -- >; -- }; -- -- davinci_mdio_sleep: davinci_mdio_sleep { -- pinctrl-single,pins = < -- /* MDIO reset value */ -- AM33XX_PADCONF(AM335X_PIN_MDIO, PIN_INPUT_PULLDOWN, MUX_MODE7) -- AM33XX_PADCONF(AM335X_PIN_MDC, PIN_INPUT_PULLDOWN, MUX_MODE7) -- >; -- }; -- -- usb_hub_ctrl: usb_hub_ctrl { -- pinctrl-single,pins = < -- AM33XX_PADCONF(AM335X_PIN_RMII1_REF_CLK, PIN_OUTPUT_PULLUP, MUX_MODE7) /* rmii1_refclk.gpio0_29 */ -- >; -- }; -- - mpu6050_pins: pinmux_mpu6050_pins { - pinctrl-single,pins = < - AM33XX_PADCONF(AM335X_PIN_UART0_CTSN, PIN_INPUT, MUX_MODE7) /* uart0_ctsn.gpio1_8 */ -@@ -89,29 +30,6 @@ AM33XX_PADCONF(AM335X_PIN_GPMC_A10, PIN_INPUT, MUX_MODE7) /* gpmc_a10.gpio1_ - }; - }; - --&mac { -- pinctrl-names = "default", "sleep"; -- pinctrl-0 = <&cpsw_default>; -- pinctrl-1 = <&cpsw_sleep>; -- status = "okay"; --}; -- --&davinci_mdio { -- pinctrl-names = "default", "sleep"; -- pinctrl-0 = <&davinci_mdio_default>; -- pinctrl-1 = <&davinci_mdio_sleep>; -- status = "okay"; -- -- ethphy0: ethernet-phy@0 { -- reg = <0>; -- }; --}; -- --&cpsw_emac0 { -- phy-handle = <ðphy0>; -- phy-mode = "rgmii-id"; --}; -- - &i2c0 { - lps331ap: barometer@5c { - compatible = "st,lps331ap-press"; -@@ -128,11 +46,4 @@ mpu6050: accelerometer@68 { - interrupts = <2 IRQ_TYPE_EDGE_RISING>; - orientation = <0xff 0 0 0 1 0 0 0 0xff>; - }; -- -- usb2512b: usb-hub@2c { -- compatible = "microchip,usb2512b"; -- reg = <0x2c>; -- reset-gpios = <&gpio0 29 GPIO_ACTIVE_LOW>; -- /* wifi on port 4 */ -- }; - }; --- -2.30.2 - diff --git a/patches/dts/omap/0004-ARM-dts-am335x-sancloud-bbe-lite-New-devicetree.patch b/patches/dts/omap/0004-ARM-dts-am335x-sancloud-bbe-lite-New-devicetree.patch deleted file mode 100644 index aff311cbb760343d90c93ab390c21dfff41d87fa..0000000000000000000000000000000000000000 --- a/patches/dts/omap/0004-ARM-dts-am335x-sancloud-bbe-lite-New-devicetree.patch +++ /dev/null @@ -1,87 +0,0 @@ -From ac262b7f9a3e58acbc9c40d55826fc09cd089fbf Mon Sep 17 00:00:00 2001 -From: Paul Barker <paul.barker@sancloud.com> -Date: Tue, 20 Jul 2021 09:39:27 +0100 -Subject: [PATCH 4/4] ARM: dts: am335x-sancloud-bbe-lite: New devicetree - -This adds support for the Sancloud BBE Lite which shares a common -hardware base with the non-Lite version of the BBE. - -Signed-off-by: Paul Barker <paul.barker@sancloud.com> -Signed-off-by: Tony Lindgren <tony@atomide.com> ---- - arch/arm/boot/dts/Makefile | 1 + - .../arm/boot/dts/am335x-sancloud-bbe-lite.dts | 50 +++++++++++++++++++ - 2 files changed, 51 insertions(+) - create mode 100644 arch/arm/boot/dts/am335x-sancloud-bbe-lite.dts - -diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile -index 863347b6b65e..8da525e7f0ab 100644 ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -843,6 +843,7 @@ dtb-$(CONFIG_SOC_AM33XX) += \ - am335x-pocketbeagle.dtb \ - am335x-regor-rdk.dtb \ - am335x-sancloud-bbe.dtb \ -+ am335x-sancloud-bbe-lite.dtb \ - am335x-shc.dtb \ - am335x-sbc-t335.dtb \ - am335x-sl50.dtb \ -diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe-lite.dts b/arch/arm/boot/dts/am335x-sancloud-bbe-lite.dts -new file mode 100644 -index 000000000000..d6ef19311a91 ---- /dev/null -+++ b/arch/arm/boot/dts/am335x-sancloud-bbe-lite.dts -@@ -0,0 +1,50 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ -+ * Copyright (C) 2021 SanCloud Ltd -+ */ -+/dts-v1/; -+ -+#include "am33xx.dtsi" -+#include "am335x-bone-common.dtsi" -+#include "am335x-boneblack-common.dtsi" -+#include "am335x-sancloud-bbe-common.dtsi" -+ -+/ { -+ model = "SanCloud BeagleBone Enhanced Lite"; -+ compatible = "sancloud,am335x-boneenhanced", -+ "ti,am335x-bone-black", -+ "ti,am335x-bone", -+ "ti,am33xx"; -+}; -+ -+&am33xx_pinmux { -+ bb_spi0_pins: pinmux_bb_spi0_pins { -+ pinctrl-single,pins = < -+ AM33XX_PADCONF(AM335X_PIN_SPI0_SCLK, PIN_INPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_SPI0_D0, PIN_INPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_SPI0_D1, PIN_INPUT, MUX_MODE0) -+ AM33XX_PADCONF(AM335X_PIN_SPI0_CS0, PIN_INPUT, MUX_MODE0) -+ >; -+ }; -+}; -+ -+&spi0 { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ status = "okay"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <&bb_spi0_pins>; -+ -+ channel@0 { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ compatible = "micron,spi-authenta"; -+ -+ reg = <0>; -+ spi-max-frequency = <16000000>; -+ spi-cpha; -+ }; -+}; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0001-ARM-dts-am33xx-l4-Add-PRUSS-node.patch b/patches/dts/omap_pruss/0001-ARM-dts-am33xx-l4-Add-PRUSS-node.patch deleted file mode 100644 index 6283c6b93c8405f8d1c64d608a456f674a049937..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0001-ARM-dts-am33xx-l4-Add-PRUSS-node.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 389093c2f12e8e2fb822d726a2927f0f8a04a7e8 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:11 -0500 -Subject: [PATCH 01/11] ARM: dts: am33xx-l4: Add PRUSS node - -Add the DT nodes for the PRU-ICSS on AM33xx family of SoCs. The AM33xx -SoCs contain a single PRU-ICSS instance and is represented by a pruss -node and other child nodes. PRU-ICSS is supported only on AM3356+ SoCs -though in the AM33xx family, so the nodes are added under the -corresponding disabled interconnect target module node in the common -am33xx-l4 dtsi file. The target module node should be enabled in only -those derivative board files that use a SoC containing PRU-ICSS. - -The PRUSS subsystem node contains the entire address space. The various -sub-modules of the PRU-ICSS are represented as individual child nodes -(so platform devices themselves) of the PRUSS subsystem node. These -include the two PRU cores and the interrupt controller. All the Data -RAMs are represented within a child node of its own named 'memories' -without any compatible. The Real Time Media Independent Interface -controller (MII_RT), and the CFG sub-module are represented as syscon -nodes. The PRUSS CFG module has a clock mux for IEP clock, this clk -node is added under the CFG child node 'clocks'. The default source -for this mux clock is the PRU_ICSS_IEP_GCLK clock. - -The DT nodes use all standard properties. The regs property in the PRU -nodes define the addresses for the Instruction RAM, the Debug and Control -sub-modules for that PRU core. The firmware for each PRU core is defined -through a 'firmware-name' property. - -The default names for the firmware images for each PRU core are defined -as follows (these can be adjusted either in derivative board dts files -or through sysfs at runtime if required): - PRU-ICSS PRU0 Core: am335x-pru1_0-fw - PRU-ICSS PRU1 Core: am335x-pru1_1-fw - -Note: -1. There are few more sub-modules like the Industrial Ethernet Peripheral - (IEP), MDIO, UART, eCAP that do not have bindings and so will be added - in the future. -2. The PRUSS INTC on AM335x SoCs also connect the host interrupts 0 to - TSC_ADC; 6 and 7 as possible DMA events, so use the 'ti,irqs-reserved' - property in derivative board dts files _if_ any of them should not be - handled by the host OS. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am33xx-l4.dtsi | 71 ++++++++++++++++++++++++++++++++ - 1 file changed, 71 insertions(+) - -diff --git a/arch/arm/boot/dts/am33xx-l4.dtsi b/arch/arm/boot/dts/am33xx-l4.dtsi -index 859e760df4c8..148176361b4e 100644 ---- a/arch/arm/boot/dts/am33xx-l4.dtsi -+++ b/arch/arm/boot/dts/am33xx-l4.dtsi -@@ -853,6 +853,77 @@ pruss_tm: target-module@300000 { /* 0x4a300000, ap 9 04.0 */ - #size-cells = <1>; - ranges = <0x0 0x300000 0x80000>; - status = "disabled"; -+ -+ pruss: pruss@0 { -+ compatible = "ti,am3356-pruss"; -+ reg = <0x0 0x80000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges; -+ -+ pruss_mem: memories@0 { -+ reg = <0x0 0x2000>, -+ <0x2000 0x2000>, -+ <0x10000 0x3000>; -+ reg-names = "dram0", "dram1", -+ "shrdram2"; -+ }; -+ -+ pruss_cfg: cfg@26000 { -+ compatible = "ti,pruss-cfg", "syscon"; -+ reg = <0x26000 0x2000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges = <0x0 0x26000 0x2000>; -+ -+ clocks { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ pruss_iepclk_mux: iepclk-mux@30 { -+ reg = <0x30>; -+ #clock-cells = <0>; -+ clocks = <&l3_gclk>, /* icss_iep_gclk */ -+ <&pruss_ocp_gclk>; /* icss_ocp_gclk */ -+ }; -+ }; -+ }; -+ -+ pruss_mii_rt: mii-rt@32000 { -+ compatible = "ti,pruss-mii", "syscon"; -+ reg = <0x32000 0x58>; -+ }; -+ -+ pruss_intc: interrupt-controller@20000 { -+ compatible = "ti,pruss-intc"; -+ reg = <0x20000 0x2000>; -+ interrupts = <20 21 22 23 24 25 26 27>; -+ interrupt-names = "host_intr0", "host_intr1", -+ "host_intr2", "host_intr3", -+ "host_intr4", "host_intr5", -+ "host_intr6", "host_intr7"; -+ interrupt-controller; -+ #interrupt-cells = <3>; -+ }; -+ -+ pru0: pru@34000 { -+ compatible = "ti,am3356-pru"; -+ reg = <0x34000 0x2000>, -+ <0x22000 0x400>, -+ <0x22400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am335x-pru0-fw"; -+ }; -+ -+ pru1: pru@38000 { -+ compatible = "ti,am3356-pru"; -+ reg = <0x38000 0x2000>, -+ <0x24000 0x400>, -+ <0x24400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am335x-pru1-fw"; -+ }; -+ }; - }; - }; - }; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0002-ARM-dts-am33xx-l4-Add-PRUSS-MDIO-controller-node.patch b/patches/dts/omap_pruss/0002-ARM-dts-am33xx-l4-Add-PRUSS-MDIO-controller-node.patch deleted file mode 100644 index 19fb572a87a39b14c3703cf1fd124e4fab965e25..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0002-ARM-dts-am33xx-l4-Add-PRUSS-MDIO-controller-node.patch +++ /dev/null @@ -1,47 +0,0 @@ -From e58a8c83926d9840c5db57967920f53b85bf1700 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:12 -0500 -Subject: [PATCH 02/11] ARM: dts: am33xx-l4: Add PRUSS MDIO controller node - -The PRUSS on AM335x SoCs has a MDIO sub-module that can be used -to control external PHYs associated with the Industrial Ethernet -peripherals within the PRUSS. The MDIO module used within the -PRU-ICSS is an instance of the MDIO Controller used in TI Davinci -SoCs. The same bus frequency of 1 MHz is chosen as the regular -MDIO node. - -The node is added to the common am33xx-l4.dtsi file and is disabled. -This needs to be enabled in the respective board files using the -relevant AM335x SoCs supporting PRUSS and where the ethernet is -pinned out and connected properly. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am33xx-l4.dtsi | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/arch/arm/boot/dts/am33xx-l4.dtsi b/arch/arm/boot/dts/am33xx-l4.dtsi -index 148176361b4e..c9629cb5ccd1 100644 ---- a/arch/arm/boot/dts/am33xx-l4.dtsi -+++ b/arch/arm/boot/dts/am33xx-l4.dtsi -@@ -923,6 +923,17 @@ pru1: pru@38000 { - reg-names = "iram", "control", "debug"; - firmware-name = "am335x-pru1-fw"; - }; -+ -+ pruss_mdio: mdio@32400 { -+ compatible = "ti,davinci_mdio"; -+ reg = <0x32400 0x90>; -+ clocks = <&dpll_core_m4_ck>; -+ clock-names = "fck"; -+ bus_freq = <1000000>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ status = "disabled"; -+ }; - }; - }; - }; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0003-ARM-dts-am335x-bone-common-Enable-PRU-ICSS-node.patch b/patches/dts/omap_pruss/0003-ARM-dts-am335x-bone-common-Enable-PRU-ICSS-node.patch deleted file mode 100644 index 269a446e22a0729daf65a344ac4ef261ea7bf4be..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0003-ARM-dts-am335x-bone-common-Enable-PRU-ICSS-node.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 697ee639f401b3b7f05ff38605016fcbbf3ecd66 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:13 -0500 -Subject: [PATCH 03/11] ARM: dts: am335x-bone-common: Enable PRU-ICSS node - -The PRU-ICSS target module node was left in disabled state in the base -am33xx-l4.dtsi file. Enable this node on all the AM335x beaglebone -boards as they mostly use a AM3358 or a AM3359 SoC which do contain -the PRU-ICSS IP. The PRUSS node and most of its child nodes are already -enabled in the base dts file, and so become effective automatically -with the enabling of this PRU-ICSS target-module node. - -The corresponding PRU nodes can be disabled later on if there are -no use-cases defined to use a particular PRU core or the whole -PRU-ICSS subsystem itself if both its PRU cores are unused. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am335x-bone-common.dtsi | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi -index 2d51d4bba6d4..34a0045b5f65 100644 ---- a/arch/arm/boot/dts/am335x-bone-common.dtsi -+++ b/arch/arm/boot/dts/am335x-bone-common.dtsi -@@ -397,3 +397,7 @@ &rtc { - clocks = <&clk_32768_ck>, <&clk_24mhz_clkctrl AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL 0>; - clock-names = "ext-clk", "int-clk"; - }; -+ -+&pruss_tm { -+ status = "okay"; -+}; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0004-ARM-dts-am335x-evm-Enable-PRU-ICSS-module.patch b/patches/dts/omap_pruss/0004-ARM-dts-am335x-evm-Enable-PRU-ICSS-module.patch deleted file mode 100644 index 5e2bdbe6f3cb72bbdc9dfe0f36cc0ebc8164fe03..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0004-ARM-dts-am335x-evm-Enable-PRU-ICSS-module.patch +++ /dev/null @@ -1,36 +0,0 @@ -From cb65e449de7cf179fe37acc55d28e808de2d1db0 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:14 -0500 -Subject: [PATCH 04/11] ARM: dts: am335x-evm: Enable PRU-ICSS module - -The PRU-ICSS target module node was left in disabled state in the -base am33xx-l4.dtsi file. PRU-ICSS is supported on the AM335x EVM, -so enable this node on the AM335x EVM. The PRUSS node and most of -its child nodes are already enabled in the base dts file, and so -become effective automatically with the enabling of this PRU-ICSS -target module node. - -The corresponding PRU nodes can be disabled later on if there are -no use-cases defined to use a particular PRU core or the whole -PRU-ICSS subsystem itself if both its PRU cores are unused. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am335x-evm.dts | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts -index 9cf39c93defb..659e99eabe66 100644 ---- a/arch/arm/boot/dts/am335x-evm.dts -+++ b/arch/arm/boot/dts/am335x-evm.dts -@@ -778,3 +778,7 @@ &rtc { - clocks = <&clk_32768_ck>, <&clk_24mhz_clkctrl AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL 0>; - clock-names = "ext-clk", "int-clk"; - }; -+ -+&pruss_tm { -+ status = "okay"; -+}; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0005-ARM-dts-am335x-evmsk-Enable-PRU-ICSS-module.patch b/patches/dts/omap_pruss/0005-ARM-dts-am335x-evmsk-Enable-PRU-ICSS-module.patch deleted file mode 100644 index c52a9734c1cf2465ebf97daf85cc9d2fedae82a7..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0005-ARM-dts-am335x-evmsk-Enable-PRU-ICSS-module.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 41363f63d0e21e55202f947e8a70a5eede212394 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:15 -0500 -Subject: [PATCH 05/11] ARM: dts: am335x-evmsk: Enable PRU-ICSS module - -The PRU-ICSS target module node was left in disabled state in the -base am33xx-l4.dtsi file. PRU-ICSS is supported on the AM335x SK -EVM board, so enable this node to support PRUSS on this board. The -PRUSS node and most of its child nodes are already enabled in the -base dts file, and so become effective automatically with the -enabling of this PRU-ICSS target module node. - -The corresponding PRU nodes can be disabled later on if there are -no use-cases defined to use a particular PRU core or the whole -PRU-ICSS subsystem itself if both its PRU cores are unused. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am335x-evmsk.dts | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts -index 001657be0381..a2db65538e51 100644 ---- a/arch/arm/boot/dts/am335x-evmsk.dts -+++ b/arch/arm/boot/dts/am335x-evmsk.dts -@@ -715,3 +715,7 @@ &rtc { - clocks = <&clk_32768_ck>, <&clk_24mhz_clkctrl AM3_CLK_24MHZ_CLKDIV32K_CLKCTRL 0>; - clock-names = "ext-clk", "int-clk"; - }; -+ -+&pruss_tm { -+ status = "okay"; -+}; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0006-ARM-dts-am335x-icev2-Enable-PRU-ICSS-module.patch b/patches/dts/omap_pruss/0006-ARM-dts-am335x-icev2-Enable-PRU-ICSS-module.patch deleted file mode 100644 index 7bb49f38f4cf1154b14f9460694fa761c706e0d9..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0006-ARM-dts-am335x-icev2-Enable-PRU-ICSS-module.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 6867f9ddaab94e73edf004ff849e4bf18c85c537 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:16 -0500 -Subject: [PATCH 06/11] ARM: dts: am335x-icev2: Enable PRU-ICSS module - -The PRU-ICSS target module node was left in disabled state in the -base am33xx-l4.dtsi file. PRU-ICSS is supported on the AM335x ICEv2 -board, so enable this node to support PRUSS on this board. The PRUSS -node and most of its child nodes are already enabled in the base dts -file, and so become effective automatically with the enabling of -this PRU-ICSS target module node. - -The corresponding PRU nodes can be disabled later on if there are -no use-cases defined to use a particular PRU core or the whole -PRU-ICSS subsystem itself if both its PRU cores are unused. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am335x-icev2.dts | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/arch/arm/boot/dts/am335x-icev2.dts b/arch/arm/boot/dts/am335x-icev2.dts -index 5e598ac96dcc..e5ce89c8f54d 100644 ---- a/arch/arm/boot/dts/am335x-icev2.dts -+++ b/arch/arm/boot/dts/am335x-icev2.dts -@@ -508,3 +508,7 @@ ethphy1: ethernet-phy@3 { - reg = <3>; - }; - }; -+ -+&pruss_tm { -+ status = "okay"; -+}; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0007-ARM-dts-am4372-Add-the-PRU-ICSS1-DT-node.patch b/patches/dts/omap_pruss/0007-ARM-dts-am4372-Add-the-PRU-ICSS1-DT-node.patch deleted file mode 100644 index 8b26e2d597aa9691f6afdb3cf94aee0cca010882..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0007-ARM-dts-am4372-Add-the-PRU-ICSS1-DT-node.patch +++ /dev/null @@ -1,147 +0,0 @@ -From 66caab85fcbdc2d924714e6a9d72ad46397a1442 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:17 -0500 -Subject: [PATCH 07/11] ARM: dts: am4372: Add the PRU-ICSS1 DT node - -Add the DT node for the PRU-ICSS1 instance on the AM437x family of SoCs. -Each PRU-ICSS instance is represented by a pruss node and other child -nodes. The nodes are added under the interconnect target module node in -the common am4372 dtsi file. The PRU-ICSS instances are supported only -on AM4376+ SoCs though in the AM437x family, so the interconnect target -module node should be disabled in any derivative board dts file that -uses AM4372 SoCs. - -The PRU-ICSS1 on AM437x is very similar to the PRUSS in AM33xx, except -for variations in the RAM sizes, bus addresses and the number of -interrupts coming into the MPU INTC (host interrupt 5 is routed to -the other PRUSS instead of MPU). - -The PRUSS subsystem node contains the entire address space. The various -sub-modules of the PRU-ICSS are represented as individual child nodes -(so platform devices themselves) of the PRUSS subsystem node. These -include the two PRU cores and the interrupt controller. All the Data -RAMs are represented within a child node of its own named 'memories' -without any compatible. The Real Time Media Independent Interface -controller (MII_RT), and the CFG sub-module are represented as syscon -nodes. The PRUSS CFG module has a clock mux for IEP clock, this clk -node is added under the CFG child node 'clocks'. The default source -for this mux clock is the PRU_ICSS_IEP_GCLK clock. - -The DT nodes use all standard properties. The regs property in the PRU -nodes define the addresses for the Instruction RAM, the Debug and Control -sub-modules for that PRU core. The firmware for each PRU core is defined -through a 'firmware-name' property. - -The default names for the firmware images for each PRU core are defined -as follows (these can be adjusted either in derivative board dts files -or through sysfs at runtime if required): - PRU-ICSS1 PRU0 Core: am437x-pru1_0-fw - PRU-ICSS1 PRU1 Core: am437x-pru1_1-fw - -Note: -1. There are few more sub-modules like the Industrial Ethernet Peripheral - (IEP), MDIO, UART, eCAP that do not have bindings and so will be added - in the future. -2. The PRUSS INTC on AM437x SoCs also connect the host interrupt 0 to ADC0 - and ADC1; 6 and 7 as possible DMA events, so use the 'ti,irqs-reserved' - property in derivative board dts files _if_ any of them should not be - handled by the host OS. Host interrupt 5 is already marked reserved as - it is connected to the other PRUSS instance. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am4372.dtsi | 78 +++++++++++++++++++++++++++++++++++ - 1 file changed, 78 insertions(+) - -diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi -index 57a85a6c34a2..ddfe58b1ae79 100644 ---- a/arch/arm/boot/dts/am4372.dtsi -+++ b/arch/arm/boot/dts/am4372.dtsi -@@ -434,6 +434,84 @@ pruss_tm: target-module@54400000 { - #address-cells = <1>; - #size-cells = <1>; - ranges = <0x0 0x54400000 0x80000>; -+ -+ pruss1: pruss@0 { -+ compatible = "ti,am4376-pruss1"; -+ reg = <0x0 0x40000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges; -+ -+ pruss1_mem: memories@0 { -+ reg = <0x0 0x2000>, -+ <0x2000 0x2000>, -+ <0x10000 0x8000>; -+ reg-names = "dram0", "dram1", -+ "shrdram2"; -+ }; -+ -+ pruss1_cfg: cfg@26000 { -+ compatible = "ti,pruss-cfg", "syscon"; -+ reg = <0x26000 0x2000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges = <0x0 0x26000 0x2000>; -+ -+ clocks { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ pruss1_iepclk_mux: iepclk-mux@30 { -+ reg = <0x30>; -+ #clock-cells = <0>; -+ clocks = <&sysclk_div>, /* icss_iep_gclk */ -+ <&pruss_ocp_gclk>; /* icss_ocp_gclk */ -+ }; -+ }; -+ }; -+ -+ pruss1_mii_rt: mii-rt@32000 { -+ compatible = "ti,pruss-mii", "syscon"; -+ reg = <0x32000 0x58>; -+ }; -+ -+ pruss1_intc: interrupt-controller@20000 { -+ compatible = "ti,pruss-intc"; -+ reg = <0x20000 0x2000>; -+ interrupt-controller; -+ #interrupt-cells = <3>; -+ interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>; -+ interrupt-names = "host_intr0", "host_intr1", -+ "host_intr2", "host_intr3", -+ "host_intr4", -+ "host_intr6", "host_intr7"; -+ ti,irqs-reserved = /bits/ 8 <0x20>; /* BIT(5) */ -+ }; -+ -+ pru1_0: pru@34000 { -+ compatible = "ti,am4376-pru"; -+ reg = <0x34000 0x3000>, -+ <0x22000 0x400>, -+ <0x22400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am437x-pru1_0-fw"; -+ }; -+ -+ pru1_1: pru@38000 { -+ compatible = "ti,am4376-pru"; -+ reg = <0x38000 0x3000>, -+ <0x24000 0x400>, -+ <0x24400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am437x-pru1_1-fw"; -+ }; -+ }; - }; - - target-module@50000000 { --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0008-ARM-dts-am4372-Add-the-PRU-ICSS0-DT-node.patch b/patches/dts/omap_pruss/0008-ARM-dts-am4372-Add-the-PRU-ICSS0-DT-node.patch deleted file mode 100644 index 89cc51622cc9a5bad635b13e7a5d95ebf77e95f3..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0008-ARM-dts-am4372-Add-the-PRU-ICSS0-DT-node.patch +++ /dev/null @@ -1,139 +0,0 @@ -From b622dbbd42f69e26c4df2485bebbf69fafcdefcd Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:18 -0500 -Subject: [PATCH 08/11] ARM: dts: am4372: Add the PRU-ICSS0 DT node - -The AM4376+ SoCs have a second smaller PRU-ICSS subsystem (PRUSS0) in -addition to the primary PRUSS1 instance. The PRUSS0 has less DRAM -per PRU, and no Shared DRAM among other minor differences. The IEP -and MII_RT modules even though present within the IP are not pinned -out. - -This PRUSS0 instance has a weird SoC integration. It shares the same -L3 OCP interconnect interface with PRUSS1, and also shares its reset -line and clocks. Any external accesses from PRUSS0 requires the PRUSS1's -PRUSS_SYSCFG register to be programmed properly. That said, it is its -own IP instance (a cut-down version), and so it has been added as an -independent node (sibling node to PRUSS1 node) and a child node of the -corresponding PRUSS target module interconnect node. This allows the -PRUSS0 instance to be enabled/disabled independently of the PRUSS1 -instance. - -The nodes are added under the corresponding interconnect target module -node in the common am4372 dtsi file. The PRU-ICSS instances are not -supported on AM4372 SoC though in the AM437x family, so the interconnect -target module node should be disabled in any derivative board dts file that -uses AM4372 SoCs. The individual PRUSS node can be disabled in the -corresponding board dts file if desired. - -The default names for the firmware images for each PRU core are defined -as follows (these can be adjusted either in derivative board dts files or -through sysfs at runtime if required): - PRU-ICSS0 PRU0 Core: am437x-pru0_0-fw - PRU-ICSS0 PRU1 Core: am437x-pru0_1-fw - -Note: -1. There are few more sub-modules like the Industrial Ethernet Peripheral - (IEP), eCAP, UART, that do not have bindings and so will be added in the - future. Only UART is pinned out, so others should be added in disabled - state if added. -2. The PRUSS0 INTC on AM437x SoCs routes the host interrupt 5 to the other - PRUSS1, so it is already marked reserved through the 'ti,irqs-reserved' - property. - -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am4372.dtsi | 77 +++++++++++++++++++++++++++++++++++ - 1 file changed, 77 insertions(+) - -diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi -index ddfe58b1ae79..2200a09c2065 100644 ---- a/arch/arm/boot/dts/am4372.dtsi -+++ b/arch/arm/boot/dts/am4372.dtsi -@@ -512,6 +512,83 @@ pru1_1: pru@38000 { - firmware-name = "am437x-pru1_1-fw"; - }; - }; -+ -+ pruss0: pruss@40000 { -+ compatible = "ti,am4376-pruss0"; -+ reg = <0x40000 0x40000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges; -+ -+ pruss0_mem: memories@40000 { -+ reg = <0x40000 0x1000>, -+ <0x42000 0x1000>; -+ reg-names = "dram0", "dram1"; -+ }; -+ -+ pruss0_cfg: cfg@66000 { -+ compatible = "ti,pruss-cfg", "syscon"; -+ reg = <0x66000 0x2000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges = <0x0 0x66000 0x2000>; -+ -+ clocks { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ pruss0_iepclk_mux: iepclk-mux@30 { -+ reg = <0x30>; -+ #clock-cells = <0>; -+ clocks = <&sysclk_div>, /* icss_iep_gclk */ -+ <&pruss_ocp_gclk>; /* icss_ocp_gclk */ -+ }; -+ }; -+ }; -+ -+ pruss0_mii_rt: mii-rt@72000 { -+ compatible = "ti,pruss-mii", "syscon"; -+ reg = <0x72000 0x58>; -+ status = "disabled"; -+ }; -+ -+ pruss0_intc: interrupt-controller@60000 { -+ compatible = "ti,pruss-intc"; -+ reg = <0x60000 0x2000>; -+ interrupt-controller; -+ #interrupt-cells = <3>; -+ interrupts = <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>; -+ interrupt-names = "host_intr0", "host_intr1", -+ "host_intr2", "host_intr3", -+ "host_intr4", -+ "host_intr6", "host_intr7"; -+ ti,irqs-reserved = /bits/ 8 <0x20>; /* BIT(5) */ -+ }; -+ -+ pru0_0: pru@74000 { -+ compatible = "ti,am4376-pru"; -+ reg = <0x74000 0x1000>, -+ <0x62000 0x400>, -+ <0x62400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am437x-pru0_0-fw"; -+ }; -+ -+ pru0_1: pru@78000 { -+ compatible = "ti,am4376-pru"; -+ reg = <0x78000 0x1000>, -+ <0x64000 0x400>, -+ <0x64400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am437x-pru0_1-fw"; -+ }; -+ }; - }; - - target-module@50000000 { --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0009-ARM-dts-am4372-Add-PRUSS-MDIO-controller-node.patch b/patches/dts/omap_pruss/0009-ARM-dts-am4372-Add-PRUSS-MDIO-controller-node.patch deleted file mode 100644 index 2d941d3dc5b1efba0165a616525bb526a9ae9b73..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0009-ARM-dts-am4372-Add-PRUSS-MDIO-controller-node.patch +++ /dev/null @@ -1,116 +0,0 @@ -From b859f04a513fb55bc96aed8d8d4d19a709647740 Mon Sep 17 00:00:00 2001 -From: "Andrew F. Davis" <afd@ti.com> -Date: Thu, 29 Jul 2021 17:46:19 -0500 -Subject: [PATCH 09/11] ARM: dts: am4372: Add PRUSS MDIO controller node - -The PRU-ICSS1 instance on AM437x SoCs has a MDIO sub-module that -can be used to control external PHYs associated with the Industrial -Ethernet peripherals within the PRUSS. The MDIO module used within -this PRU-ICSS is an instance of the MDIO Controller used in TI -Davinci SoCs. The same bus frequency of 1 MHz is chosen as the -regular MDIO node. Note that there is no MDIO node added to the -smaller PRU-ICSS0 instance as the MDIO pins are not pinned out. - -The node is added and enabled in the common am4372.dtsi file by -default, and disabled in all the existing AM437x board dts files. -This node needs pinctrl lines, and so should be enabled only on -boards where they are actually wired and pinned out for PRUSS -Ethernet. Any new board dts file should disable these if they -are not sure. - -Signed-off-by: Andrew F. Davis <afd@ti.com> -[s-anna@ti.com: fix reg address, add commit description] -Signed-off-by: Suman Anna <s-anna@ti.com> ---- - arch/arm/boot/dts/am4372.dtsi | 10 ++++++++++ - arch/arm/boot/dts/am437x-cm-t43.dts | 4 ++++ - arch/arm/boot/dts/am437x-gp-evm.dts | 4 ++++ - arch/arm/boot/dts/am437x-idk-evm.dts | 4 ++++ - arch/arm/boot/dts/am437x-sk-evm.dts | 4 ++++ - arch/arm/boot/dts/am43x-epos-evm.dts | 4 ++++ - 6 files changed, 30 insertions(+) - -diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi -index 2200a09c2065..61a1d88f9df6 100644 ---- a/arch/arm/boot/dts/am4372.dtsi -+++ b/arch/arm/boot/dts/am4372.dtsi -@@ -511,6 +511,16 @@ pru1_1: pru@38000 { - reg-names = "iram", "control", "debug"; - firmware-name = "am437x-pru1_1-fw"; - }; -+ -+ pruss1_mdio: mdio@32400 { -+ compatible = "ti,davinci_mdio"; -+ reg = <0x32400 0x90>; -+ clocks = <&dpll_core_m4_ck>; -+ clock-names = "fck"; -+ bus_freq = <1000000>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ }; - }; - - pruss0: pruss@40000 { -diff --git a/arch/arm/boot/dts/am437x-cm-t43.dts b/arch/arm/boot/dts/am437x-cm-t43.dts -index a83f46ed0c9a..5ce8e684e7d3 100644 ---- a/arch/arm/boot/dts/am437x-cm-t43.dts -+++ b/arch/arm/boot/dts/am437x-cm-t43.dts -@@ -416,3 +416,7 @@ &cpu { - <600000 1100000>, - <300000 950000>; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts b/arch/arm/boot/dts/am437x-gp-evm.dts -index e2677682b540..c2e4896076e7 100644 ---- a/arch/arm/boot/dts/am437x-gp-evm.dts -+++ b/arch/arm/boot/dts/am437x-gp-evm.dts -@@ -1118,3 +1118,7 @@ &rtc { - &cpu { - cpu0-supply = <&dcdc2>; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am437x-idk-evm.dts b/arch/arm/boot/dts/am437x-idk-evm.dts -index 2dc525512266..53f64e3ce735 100644 ---- a/arch/arm/boot/dts/am437x-idk-evm.dts -+++ b/arch/arm/boot/dts/am437x-idk-evm.dts -@@ -537,3 +537,7 @@ opp100-600000000 { - opp-suspend; - }; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am437x-sk-evm.dts b/arch/arm/boot/dts/am437x-sk-evm.dts -index 496ed34f7755..20a34d2d85df 100644 ---- a/arch/arm/boot/dts/am437x-sk-evm.dts -+++ b/arch/arm/boot/dts/am437x-sk-evm.dts -@@ -892,3 +892,7 @@ vpfe0_ep: endpoint { - }; - }; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts -index aae0af10a5b1..d16aa2221c91 100644 ---- a/arch/arm/boot/dts/am43x-epos-evm.dts -+++ b/arch/arm/boot/dts/am43x-epos-evm.dts -@@ -1018,3 +1018,7 @@ &mux_synctimer32k_ck { - &cpu { - cpu0-supply = <&dcdc2>; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0010-ARM-dts-am57xx-Add-PRU-ICSS-nodes.patch b/patches/dts/omap_pruss/0010-ARM-dts-am57xx-Add-PRU-ICSS-nodes.patch deleted file mode 100644 index b6e3fe412efadd42b24f11ce8c659d56876b2ce0..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0010-ARM-dts-am57xx-Add-PRU-ICSS-nodes.patch +++ /dev/null @@ -1,241 +0,0 @@ -From 5c6e11a998d259741154eada156be440d9b98037 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:20 -0500 -Subject: [PATCH 10/11] ARM: dts: am57xx: Add PRU-ICSS nodes - -Add the DT nodes for the PRU-ICSS1 and PRU-ICSS2 processor subsystems -that are present on AM57xx family of SoCs. Each PRU-ICSS instance is -represented by a pruss node and other child nodes. The two PRU-ICSSs -are identical to each other. They are not supported on DRA7xx SoCs in -general, so the nodes are added under the respective interconnect target -module nodes in a common am57-pruss.dtsi file. The file is already -included only in the AM57xx related board files. - -The PRU-ICSSs on AM57xx are very similar to the PRUSS in AM33xx and AM437x -except for variations in the RAM sizes and the number of interrupts coming -into the MPU INTC. The interrupt events into the PRU-ICSS also requires -programming of the corresponding crossbars properly. - -The PRUSS subsystem node contains the entire address space. The various -sub-modules of the PRU-ICSS are represented as individual child nodes -(so platform devices themselves) of the PRUSS subsystem node. These -include the two PRU cores and the interrupt controller. All the Data -RAMs are represented within a child node of its own named 'memories' -without any compatible. The Real Time Media Independent Interface -controller (MII_RT), and the CFG sub-module are represented as syscon -nodes. The PRUSS CFG module has a clock mux for IEP clock, this clk -node is added under the CFG child node 'clocks'. The default source -for this mux clock is the ICSS_IEP_CLK clock. - -The DT nodes use all standard properties. The regs property in the PRU -nodes define the addresses for the Instruction RAM, the Debug and Control -sub-modules for that PRU core. The firmware for each PRU core is defined -through a 'firmware-name' property. - -The default names for the firmware images for each PRU core are defined -as follows (these can be adjusted either in derivative board dts files or -through sysfs at runtime if required): - PRU-ICSS1 PRU0 Core: am57xx-pru1_0-fw - PRU-ICSS1 PRU1 Core: am57xx-pru1_1-fw - PRU-ICSS2 PRU0 Core: am57xx-pru2_0-fw - PRU-ICSS2 PRU1 Core: am57xx-pru2_1-fw - -Note: -1. There are few more sub-modules like the Industrial Ethernet Peripheral - (IEPs), MDIO, UART, eCAP that do not have bindings and so will be added - in the future. -2. The PRUSS INTC on AM57xx SoCs also connect the host interrupts 6 and 7 - as possible DMA events, so use the 'ti,irqs-reserved' property in - derivative board dts files _if_ any of them should not be handled by - the host OS. - -Signed-off-by: Suman Anna <s-anna@ti.com> -Signed-off-by: Roger Quadros <rogerq@ti.com> ---- - arch/arm/boot/dts/am57-pruss.dtsi | 158 +++++++++++++++++++++++++++++- - 1 file changed, 157 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/boot/dts/am57-pruss.dtsi b/arch/arm/boot/dts/am57-pruss.dtsi -index 032c1acfcda3..494d56830b34 100644 ---- a/arch/arm/boot/dts/am57-pruss.dtsi -+++ b/arch/arm/boot/dts/am57-pruss.dtsi -@@ -1,6 +1,6 @@ - // SPDX-License-Identifier: GPL-2.0-only - /* -- * Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com/ -+ * Copyright (C) 2020-2021 Texas Instruments Incorporated - https://www.ti.com/ - * - * Common PRUSS data for TI AM57xx platforms - */ -@@ -25,6 +25,84 @@ pruss1_tm: target-module@4b226000 { - #address-cells = <1>; - #size-cells = <1>; - ranges = <0x00000000 0x4b200000 0x80000>; -+ -+ pruss1: pruss@0 { -+ compatible = "ti,am5728-pruss"; -+ reg = <0x0 0x80000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges; -+ -+ pruss1_mem: memories@0 { -+ reg = <0x0 0x2000>, -+ <0x2000 0x2000>, -+ <0x10000 0x8000>; -+ reg-names = "dram0", "dram1", -+ "shrdram2"; -+ }; -+ -+ pruss1_cfg: cfg@26000 { -+ compatible = "ti,pruss-cfg", "syscon"; -+ reg = <0x26000 0x2000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges = <0x0 0x26000 0x2000>; -+ -+ clocks { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ pruss1_iepclk_mux: iepclk-mux@30 { -+ reg = <0x30>; -+ #clock-cells = <0>; -+ clocks = <&dpll_gmac_m3x2_ck>, /* icss_iep_clk */ -+ <&dpll_gmac_h13x2_ck>; /* icss_clk */ -+ }; -+ }; -+ }; -+ -+ pruss1_mii_rt: mii-rt@32000 { -+ compatible = "ti,pruss-mii", "syscon"; -+ reg = <0x32000 0x58>; -+ }; -+ -+ pruss1_intc: interrupt-controller@20000 { -+ compatible = "ti,pruss-intc"; -+ reg = <0x20000 0x2000>; -+ interrupt-controller; -+ #interrupt-cells = <3>; -+ interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 187 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 188 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 189 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 190 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 191 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 193 IRQ_TYPE_LEVEL_HIGH>; -+ interrupt-names = "host_intr0", "host_intr1", -+ "host_intr2", "host_intr3", -+ "host_intr4", "host_intr5", -+ "host_intr6", "host_intr7"; -+ }; -+ -+ pru1_0: pru@34000 { -+ compatible = "ti,am5728-pru"; -+ reg = <0x34000 0x3000>, -+ <0x22000 0x400>, -+ <0x22400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am57xx-pru1_0-fw"; -+ }; -+ -+ pru1_1: pru@38000 { -+ compatible = "ti,am5728-pru"; -+ reg = <0x38000 0x3000>, -+ <0x24000 0x400>, -+ <0x24400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am57xx-pru1_1-fw"; -+ }; -+ }; - }; - - pruss2_tm: target-module@4b2a6000 { -@@ -46,5 +124,83 @@ pruss2_tm: target-module@4b2a6000 { - #address-cells = <1>; - #size-cells = <1>; - ranges = <0x00000000 0x4b280000 0x80000>; -+ -+ pruss2: pruss@0 { -+ compatible = "ti,am5728-pruss"; -+ reg = <0x0 0x80000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges; -+ -+ pruss2_mem: memories@0 { -+ reg = <0x0 0x2000>, -+ <0x2000 0x2000>, -+ <0x10000 0x8000>; -+ reg-names = "dram0", "dram1", -+ "shrdram2"; -+ }; -+ -+ pruss2_cfg: cfg@26000 { -+ compatible = "ti,pruss-cfg", "syscon"; -+ reg = <0x26000 0x2000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges = <0x0 0x26000 0x2000>; -+ -+ clocks { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ pruss2_iepclk_mux: iepclk-mux@30 { -+ reg = <0x30>; -+ #clock-cells = <0>; -+ clocks = <&dpll_gmac_m3x2_ck>, /* icss_iep_clk */ -+ <&dpll_gmac_h13x2_ck>; /* icss_clk */ -+ }; -+ }; -+ }; -+ -+ pruss2_mii_rt: mii-rt@32000 { -+ compatible = "ti,pruss-mii", "syscon"; -+ reg = <0x32000 0x58>; -+ }; -+ -+ pruss2_intc: interrupt-controller@20000 { -+ compatible = "ti,pruss-intc"; -+ reg = <0x20000 0x2000>; -+ interrupt-controller; -+ #interrupt-cells = <3>; -+ interrupts = <GIC_SPI 196 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 197 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 198 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 199 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 201 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 202 IRQ_TYPE_LEVEL_HIGH>, -+ <GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH>; -+ interrupt-names = "host_intr0", "host_intr1", -+ "host_intr2", "host_intr3", -+ "host_intr4", "host_intr5", -+ "host_intr6", "host_intr7"; -+ }; -+ -+ pru2_0: pru@34000 { -+ compatible = "ti,am5728-pru"; -+ reg = <0x34000 0x3000>, -+ <0x22000 0x400>, -+ <0x22400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am57xx-pru2_0-fw"; -+ }; -+ -+ pru2_1: pru@38000 { -+ compatible = "ti,am5728-pru"; -+ reg = <0x38000 0x3000>, -+ <0x24000 0x400>, -+ <0x24400 0x100>; -+ reg-names = "iram", "control", "debug"; -+ firmware-name = "am57xx-pru2_1-fw"; -+ }; -+ }; - }; - }; --- -2.30.2 - diff --git a/patches/dts/omap_pruss/0011-ARM-dts-am57xx-Add-PRUSS-MDIO-controller-nodes.patch b/patches/dts/omap_pruss/0011-ARM-dts-am57xx-Add-PRUSS-MDIO-controller-nodes.patch deleted file mode 100644 index 98e5ace458a45a6a40a82aa88deb3e23d381f695..0000000000000000000000000000000000000000 --- a/patches/dts/omap_pruss/0011-ARM-dts-am57xx-Add-PRUSS-MDIO-controller-nodes.patch +++ /dev/null @@ -1,151 +0,0 @@ -From 175d80f8aab45e46470b2a9ce483f828c4453a79 Mon Sep 17 00:00:00 2001 -From: Suman Anna <s-anna@ti.com> -Date: Thu, 29 Jul 2021 17:46:21 -0500 -Subject: [PATCH 11/11] ARM: dts: am57xx: Add PRUSS MDIO controller nodes - -The PRUSSs on AM57xx SoCs contain an MDIO controller that can -be used to control external PHYs associated with the Industrial -Ethernet peripherals within each PRUSS. The MDIO module used -within the PRU-ICSS is an instance of the MDIO Controller used -in TI Davinci SoCs. The same bus frequency of 1 MHz is chosen as -the regular MDIO node. - -The nodes are added in the common am57-pruss.dtsi file and enabled -by default, but are disabled in all the existing AM57xx board dts -files. These nodes need pinctrl lines, and so should be enabled -only on boards where they are actually wired and pinned out for -PRUSS Ethernet. Any new board dts file should disable these if -they are not sure. - -Signed-off-by: Suman Anna <s-anna@ti.com> -Signed-off-by: Andrew F. Davis <afd@ti.com> ---- - arch/arm/boot/dts/am57-pruss.dtsi | 20 +++++++++++++++++++ - arch/arm/boot/dts/am571x-idk.dts | 8 ++++++++ - arch/arm/boot/dts/am572x-idk.dts | 8 ++++++++ - arch/arm/boot/dts/am574x-idk.dts | 8 ++++++++ - .../boot/dts/am57xx-beagle-x15-common.dtsi | 8 ++++++++ - arch/arm/boot/dts/am57xx-cl-som-am57x.dts | 8 ++++++++ - 6 files changed, 60 insertions(+) - -diff --git a/arch/arm/boot/dts/am57-pruss.dtsi b/arch/arm/boot/dts/am57-pruss.dtsi -index 494d56830b34..46c5383f0eee 100644 ---- a/arch/arm/boot/dts/am57-pruss.dtsi -+++ b/arch/arm/boot/dts/am57-pruss.dtsi -@@ -102,6 +102,16 @@ pru1_1: pru@38000 { - reg-names = "iram", "control", "debug"; - firmware-name = "am57xx-pru1_1-fw"; - }; -+ -+ pruss1_mdio: mdio@32400 { -+ compatible = "ti,davinci_mdio"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ clocks = <&dpll_gmac_h13x2_ck>; -+ clock-names = "fck"; -+ bus_freq = <1000000>; -+ reg = <0x32400 0x90>; -+ }; - }; - }; - -@@ -201,6 +211,16 @@ pru2_1: pru@38000 { - reg-names = "iram", "control", "debug"; - firmware-name = "am57xx-pru2_1-fw"; - }; -+ -+ pruss2_mdio: mdio@32400 { -+ compatible = "ti,davinci_mdio"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ clocks = <&dpll_gmac_h13x2_ck>; -+ clock-names = "fck"; -+ bus_freq = <1000000>; -+ reg = <0x32400 0x90>; -+ }; - }; - }; - }; -diff --git a/arch/arm/boot/dts/am571x-idk.dts b/arch/arm/boot/dts/am571x-idk.dts -index e81078c2d00d..48425020281a 100644 ---- a/arch/arm/boot/dts/am571x-idk.dts -+++ b/arch/arm/boot/dts/am571x-idk.dts -@@ -208,3 +208,11 @@ &mmc2 { - pinctrl-1 = <&mmc2_pins_hs>; - pinctrl-2 = <&mmc2_pins_ddr_rev20 &mmc2_iodelay_ddr_conf>; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -+ -+&pruss2_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am572x-idk.dts b/arch/arm/boot/dts/am572x-idk.dts -index 6504265f3f7e..94a738cb0a4d 100644 ---- a/arch/arm/boot/dts/am572x-idk.dts -+++ b/arch/arm/boot/dts/am572x-idk.dts -@@ -27,3 +27,11 @@ &mmc2 { - pinctrl-1 = <&mmc2_pins_hs>; - pinctrl-2 = <&mmc2_pins_ddr_rev20>; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -+ -+&pruss2_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am574x-idk.dts b/arch/arm/boot/dts/am574x-idk.dts -index 1b8f3a28af05..c4bf9cb2c9dc 100644 ---- a/arch/arm/boot/dts/am574x-idk.dts -+++ b/arch/arm/boot/dts/am574x-idk.dts -@@ -43,3 +43,11 @@ &m_can0 { - &emif1 { - status = "okay"; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -+ -+&pruss2_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi -index 6b82ecf803c5..994e69ab38d7 100644 ---- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi -+++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi -@@ -637,3 +637,11 @@ &dsp2 { - status = "okay"; - memory-region = <&dsp2_memory_region>; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -+ -+&pruss2_mdio { -+ status = "disabled"; -+}; -diff --git a/arch/arm/boot/dts/am57xx-cl-som-am57x.dts b/arch/arm/boot/dts/am57xx-cl-som-am57x.dts -index aed81568a297..2e94f32d9dfc 100644 ---- a/arch/arm/boot/dts/am57xx-cl-som-am57x.dts -+++ b/arch/arm/boot/dts/am57xx-cl-som-am57x.dts -@@ -618,3 +618,11 @@ &gpio2_target { - status = "okay"; - ti,no-reset-on-init; - }; -+ -+&pruss1_mdio { -+ status = "disabled"; -+}; -+ -+&pruss2_mdio { -+ status = "disabled"; -+}; --- -2.30.2 - diff --git a/patches/dts/omap_sancloud/0001-ARM-dts-am335x-sancloud-bbe-Fix-missing-pinctrl-refs.patch b/patches/dts/omap_sancloud/0001-ARM-dts-am335x-sancloud-bbe-Fix-missing-pinctrl-refs.patch deleted file mode 100644 index 392b2730499b4c48eb6a6b3c8ad10504465ea573..0000000000000000000000000000000000000000 --- a/patches/dts/omap_sancloud/0001-ARM-dts-am335x-sancloud-bbe-Fix-missing-pinctrl-refs.patch +++ /dev/null @@ -1,52 +0,0 @@ -From fda013ac3fdb43645cb92baea492440eae3a163d Mon Sep 17 00:00:00 2001 -From: Paul Barker <paul.barker@sancloud.com> -Date: Fri, 6 Aug 2021 09:59:06 +0100 -Subject: [PATCH 1/2] ARM: dts: am335x-sancloud-bbe: Fix missing pinctrl refs - -pinctrl settings for the USB hub, barometer & accelerometer need to be -referenced from the relevant nodes to work. - -Signed-off-by: Paul Barker <paul.barker@sancloud.com> ---- - arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi | 2 ++ - arch/arm/boot/dts/am335x-sancloud-bbe.dts | 4 ++++ - 2 files changed, 6 insertions(+) - -diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi b/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -index bd9c21813192..1d6fdd9de759 100644 ---- a/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -+++ b/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -@@ -88,6 +88,8 @@ &cpsw_emac0 { - - &i2c0 { - usb2512b: usb-hub@2c { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&usb_hub_ctrl>; - compatible = "microchip,usb2512b"; - reg = <0x2c>; - reset-gpios = <&gpio0 29 GPIO_ACTIVE_LOW>; -diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe.dts b/arch/arm/boot/dts/am335x-sancloud-bbe.dts -index 2a0ac9f5dda7..efbe93135dbe 100644 ---- a/arch/arm/boot/dts/am335x-sancloud-bbe.dts -+++ b/arch/arm/boot/dts/am335x-sancloud-bbe.dts -@@ -32,6 +32,8 @@ AM33XX_PADCONF(AM335X_PIN_GPMC_A10, PIN_INPUT, MUX_MODE7) /* gpmc_a10.gpio1_ - - &i2c0 { - lps331ap: barometer@5c { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&lps3331ap_pins>; - compatible = "st,lps331ap-press"; - st,drdy-int-pin = <1>; - reg = <0x5c>; -@@ -40,6 +42,8 @@ lps331ap: barometer@5c { - }; - - mpu6050: accelerometer@68 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mpu6050_pins>; - compatible = "invensense,mpu6050"; - reg = <0x68>; - interrupt-parent = <&gpio0>; --- -2.30.2 - diff --git a/patches/dts/omap_sancloud/0002-ARM-dts-am335x-sancloud-bbe-Drop-usb-wifi-comment.patch b/patches/dts/omap_sancloud/0002-ARM-dts-am335x-sancloud-bbe-Drop-usb-wifi-comment.patch deleted file mode 100644 index ab1376e39407f5cc8855043e3795cce5c94f0a63..0000000000000000000000000000000000000000 --- a/patches/dts/omap_sancloud/0002-ARM-dts-am335x-sancloud-bbe-Drop-usb-wifi-comment.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 1aa678f383102e4295cfe09611eb210840d45f6f Mon Sep 17 00:00:00 2001 -From: Paul Barker <paul.barker@sancloud.com> -Date: Fri, 6 Aug 2021 09:59:07 +0100 -Subject: [PATCH 2/2] ARM: dts: am335x-sancloud-bbe: Drop usb wifi comment - -The wifi chip on USB port 4 may not be present on all BBE variants. - -Signed-off-by: Paul Barker <paul.barker@sancloud.com> ---- - arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi b/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -index 1d6fdd9de759..8fc869afbd25 100644 ---- a/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -+++ b/arch/arm/boot/dts/am335x-sancloud-bbe-common.dtsi -@@ -93,6 +93,5 @@ usb2512b: usb-hub@2c { - compatible = "microchip,usb2512b"; - reg = <0x2c>; - reset-gpios = <&gpio0 29 GPIO_ACTIVE_LOW>; -- /* wifi on port 4 */ - }; - }; --- -2.30.2 - diff --git a/patches/fixes/gcc/0001-ARM-Fix-instruction-set-selection-for-GCC-11.patch b/patches/fixes/gcc/0001-ARM-Fix-instruction-set-selection-for-GCC-11.patch deleted file mode 100644 index 7844246f6ac9e19aca9a86d7dae35fb256716100..0000000000000000000000000000000000000000 --- a/patches/fixes/gcc/0001-ARM-Fix-instruction-set-selection-for-GCC-11.patch +++ /dev/null @@ -1,62 +0,0 @@ -From de01d1487f4727770deb2e8cbed8fcf211682c5b Mon Sep 17 00:00:00 2001 -From: Juerg Haefliger <juerg.haefliger@canonical.com> -Date: Tue, 10 Aug 2021 08:13:50 +0200 -Subject: [PATCH] ARM: Fix instruction set selection for GCC 11 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -GCC 11 on ARM now complains like the following when trying to determine if -an arch is supported. Presumably because it enforces the default option -'--with-float=hard' which GCC 10 didn't do? - - $ arm-linux-gnueabihf-gcc-11 -march=armv7-a -c -x c /dev/null - cc1: error: ‘-mfloat-abi=hard’: selected architecture lacks an FPU - -Due to that, the kernel build system selects the wrong compiler options -which throws errros like this during the build: - - /tmp/ccrHfZPj.s: Assembler messages: - /tmp/ccrHfZPj.s:116: Error: selected processor does not support `dmb ish' in ARM mode - /tmp/ccrHfZPj.s:150: Error: selected processor does not support `isb ' in ARM mode - /tmp/ccrHfZPj.s:160: Error: selected processor does not support `mrrc p15,1,r4,r5,c14' in ARM mode - /tmp/ccrHfZPj.s:245: Error: selected processor does not support `dmb ish' in ARM mode - /tmp/ccrHfZPj.s:503: Error: selected processor does not support `dmb ish' in ARM mode - /tmp/ccrHfZPj.s:527: Error: selected processor does not support `dmb ish' in ARM mode - /tmp/ccrHfZPj.s:698: Error: selected processor does not support `dmb ish' in ARM mode - /tmp/ccrHfZPj.s:731: Error: selected processor does not support `isb ' in ARM mode - -Fix that by adding '-msoft-float' to KBUILD_CFLAGS before the definition of -the 'arch-$(CONFIG_CPU_<foo>)' instruction selection macros. - -Signed-off-by: Juerg Haefliger <juergh@canonical.com> ---- - arch/arm/Makefile | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/arch/arm/Makefile b/arch/arm/Makefile -index 847c31e7c368..bd0148ee8338 100644 ---- a/arch/arm/Makefile -+++ b/arch/arm/Makefile -@@ -56,6 +56,9 @@ endif - # - KBUILD_CFLAGS += $(call cc-option,-fno-ipa-sra) - -+# Need -msoft-float for gcc 11 for the below instruction set selection -+KBUILD_CFLAGS += -msoft-float -+ - # This selects which instruction set is used. - # Note that GCC does not numerically define an architecture version - # macro, but instead defines a whole series of macros which makes -@@ -125,7 +128,7 @@ AFLAGS_ISA :=$(CFLAGS_ISA) - endif - - # Need -Uarm for gcc < 3.x --KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm -+KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -Uarm - KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) $(arch-y) $(tune-y) -include asm/unified.h -msoft-float - - CHECKFLAGS += -D__arm__ --- -2.30.2 - diff --git a/patches/greybus/0001-change-MAX_NUM_UDC-from-2-to-4.patch b/patches/greybus/0001-change-MAX_NUM_UDC-from-2-to-4.patch deleted file mode 100644 index 9db9efb9ce6ff2985883b51595486862ab4adad1..0000000000000000000000000000000000000000 --- a/patches/greybus/0001-change-MAX_NUM_UDC-from-2-to-4.patch +++ /dev/null @@ -1,26 +0,0 @@ -From eff9413c00851c3941899f3dd509023a13c566ac Mon Sep 17 00:00:00 2001 -From: Vaishnav M A <mavaishnav007@gmail.com> -Date: Mon, 26 Aug 2019 02:06:27 +0530 -Subject: [PATCH] change MAX_NUM_UDC from 2 to 4 - -The project clickboard support through greybus(https://github.com/vaishnav98/gbsim/wiki/Beagleboard-GSoC-'19:--Clickboard-Support-Under-Greybus) uses dummy_hcd emulated UDC for running the greybus simulator and requires an instance of emulated UDC for each mikrobus port, since the Beaglebone Black Mikrobus Cape has 4 Mikrobus Slots for serving all of the ports through greybus simulator at a time requires 4 emulated dummy_hcd UDC. ---- - drivers/usb/gadget/udc/dummy_hcd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c -index c0780e414534..4bebbdbdb626 100644 ---- a/drivers/usb/gadget/udc/dummy_hcd.c -+++ b/drivers/usb/gadget/udc/dummy_hcd.c -@@ -2719,7 +2719,7 @@ static struct platform_driver dummy_hcd_driver = { - }; - - /*-------------------------------------------------------------------------*/ --#define MAX_NUM_UDC 2 -+#define MAX_NUM_UDC 4 - static struct platform_device *the_udc_pdev[MAX_NUM_UDC]; - static struct platform_device *the_hcd_pdev[MAX_NUM_UDC]; - --- -2.23.0.rc1 - diff --git a/patches/ref_omap2plus_defconfig b/patches/ref_omap2plus_defconfig index cb41136fd96eb9e632ccf356d5ea0a4a4f037b0f..ec3b2fef3763a397918b01b8e8be99cc52c399fd 100644 --- a/patches/ref_omap2plus_defconfig +++ b/patches/ref_omap2plus_defconfig @@ -1,15 +1,15 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 6.1.0-rc5 Kernel Configuration +# Linux/arm 6.1.0-rc7 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="arm-linux-gnueabi-gcc (GCC) 11.3.0" +CONFIG_CC_VERSION_TEXT="arm-linux-gnueabi-gcc (GCC) 12.2.0" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=110300 +CONFIG_GCC_VERSION=120200 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y -CONFIG_AS_VERSION=23800 +CONFIG_AS_VERSION=23900 CONFIG_LD_IS_BFD=y -CONFIG_LD_VERSION=23800 +CONFIG_LD_VERSION=23900 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -149,6 +149,7 @@ CONFIG_GENERIC_SCHED_CLOCK=y CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" CONFIG_GCC12_NO_ARRAY_BOUNDS=y +CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y # CONFIG_CGROUP_FAVOR_DYNMODS is not set @@ -509,6 +510,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_UACCESS_WITH_MEMCPY is not set # CONFIG_PARAVIRT is not set # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +CONFIG_CC_HAVE_STACKPROTECTOR_TLS=y # end of Kernel Features # @@ -921,6 +923,7 @@ CONFIG_NET_UDP_TUNNEL=m # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_INET_TUNNEL=y CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y @@ -6929,10 +6932,12 @@ CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,integrity,bpf" # # Memory initialization # -CONFIG_INIT_STACK_NONE=y -# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set -# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y +# CONFIG_INIT_STACK_NONE is not set +# CONFIG_INIT_STACK_ALL_PATTERN is not set +CONFIG_INIT_STACK_ALL_ZERO=y # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y diff --git a/patches/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch b/patches/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch index c79759bb3d4284c0050a794819317c80aa8a0070..e2897c7b92dcfdda703f7f73af3b34f6d27c1b14 100644 --- a/patches/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch +++ b/patches/rt/0001-merge-CONFIG_PREEMPT_RT-Patch-Set.patch @@ -1,9 +1,9 @@ -From 6461f990edd4d9e184126f13bba2df1711b9a7e3 Mon Sep 17 00:00:00 2001 +From 8932d53043c0b50327c9344af0f2850042d1620a Mon Sep 17 00:00:00 2001 From: Robert Nelson <robertcnelson@gmail.com> -Date: Mon, 14 Nov 2022 13:57:25 -0600 +Date: Fri, 23 Dec 2022 16:05:59 -0600 Subject: [PATCH] merge: CONFIG_PREEMPT_RT Patch Set -patch-6.1-rc5-rt3.patch.xz +patch-6.1-rc7-rt5.patch.xz Signed-off-by: Robert Nelson <robertcnelson@gmail.com> --- @@ -1221,7 +1221,7 @@ index 98d6386b7f39..48ae6d810f8f 100644 static void ena_queue_stats(struct ena_adapter *adapter, u64 **data) diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c -index d350eeec8bad..df83f04b0980 100644 +index 5a454b58498f..a95529a69cbb 100644 --- a/drivers/net/ethernet/amazon/ena/ena_netdev.c +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c @@ -3268,10 +3268,10 @@ static void ena_get_stats64(struct net_device *netdev, @@ -1698,10 +1698,10 @@ index d3e3ac242bfc..5a229a01f49d 100644 .stat_name = cpu_to_be32(TX_WAKE_CNT), .value = cpu_to_be64(priv->tx[idx].wake_queue), diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c -index 4cb2421e71a7..813d5b3d7b58 100644 +index 028577943ec5..0ec5730b1788 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c -@@ -2486,7 +2486,7 @@ static void hns3_fetch_stats(struct rtnl_link_stats64 *stats, +@@ -2488,7 +2488,7 @@ static void hns3_fetch_stats(struct rtnl_link_stats64 *stats, unsigned int start; do { @@ -1710,7 +1710,7 @@ index 4cb2421e71a7..813d5b3d7b58 100644 if (is_tx) { stats->tx_bytes += ring->stats.tx_bytes; stats->tx_packets += ring->stats.tx_pkts; -@@ -2520,7 +2520,7 @@ static void hns3_fetch_stats(struct rtnl_link_stats64 *stats, +@@ -2522,7 +2522,7 @@ static void hns3_fetch_stats(struct rtnl_link_stats64 *stats, stats->multicast += ring->stats.rx_multicast; stats->rx_length_errors += ring->stats.err_pkt_len; } @@ -1925,7 +1925,7 @@ index a056e1545615..d79ead5e8d0c 100644 /* Once we successfully copy the stats in, update the data pointer */ *data += size; diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c -index 0f6718719453..73e02a8ffa9a 100644 +index ca2898467dcb..4b41e0c78b7e 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -6370,10 +6370,10 @@ ice_fetch_u64_stats_per_ring(struct u64_stats_sync *syncp, @@ -2254,7 +2254,7 @@ index ff3e361e06e7..81dc57a69fd0 100644 es->skb_alloc_error += skb_alloc_error; es->refill_error += refill_error; diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -index eb0fb8128096..116e53172072 100644 +index b399bdb1ca36..6d4c778b10fb 100644 --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c @@ -2008,7 +2008,7 @@ mvpp2_get_xdp_stats(struct mvpp2_port *port, struct mvpp2_pcpu_stats *xdp_stats) @@ -2319,7 +2319,7 @@ index ab33ba1c3023..ff97b140886a 100644 stats->tx_packets = _packets; stats->tx_bytes = _bytes; diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -index 7cd381530aa4..789268b15106 100644 +index 1d36619c5ec9..81349cf15ce0 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -865,7 +865,7 @@ static void mtk_get_stats64(struct net_device *dev, @@ -2340,7 +2340,7 @@ index 7cd381530aa4..789268b15106 100644 storage->tx_errors = dev->stats.tx_errors; storage->rx_dropped = dev->stats.rx_dropped; -@@ -3684,13 +3684,13 @@ static void mtk_get_ethtool_stats(struct net_device *dev, +@@ -3688,13 +3688,13 @@ static void mtk_get_ethtool_stats(struct net_device *dev, do { data_dst = data; @@ -2470,7 +2470,7 @@ index 27f4786ace4f..a5ca5c4a7896 100644 stats->tx_bytes += data[1]; stats->tx_errors += data[2]; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c -index 22a5d2419084..f6b09eed73dc 100644 +index 991059d6cb32..e82ddb0677aa 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c @@ -686,7 +686,7 @@ static u64 *nfp_vnic_get_sw_stats(struct net_device *netdev, u64 *data) @@ -2874,10 +2874,10 @@ index 1c64d5347b8e..78253ad57b2e 100644 *data += IFB_Q_STATS_LEN; } diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c -index 54c94a69c2bb..b6bfa9fdca62 100644 +index 796a38f9d7b2..b15dd9a3ad54 100644 --- a/drivers/net/ipvlan/ipvlan_main.c +++ b/drivers/net/ipvlan/ipvlan_main.c -@@ -299,13 +299,13 @@ static void ipvlan_get_stats64(struct net_device *dev, +@@ -301,13 +301,13 @@ static void ipvlan_get_stats64(struct net_device *dev, for_each_possible_cpu(idx) { pcptr = per_cpu_ptr(ipvlan->pcpu_stats, idx); do { @@ -2911,7 +2911,7 @@ index 14e8d04cb434..c4ad98d39ea6 100644 *packets += tpackets; } diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c -index 85376d2f24ca..a7b46219bab7 100644 +index f41f67b583db..d73b9d535b7a 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -2793,9 +2793,9 @@ static void get_rx_sc_stats(struct net_device *dev, @@ -2951,7 +2951,7 @@ index 85376d2f24ca..a7b46219bab7 100644 sum->OutPktsUntagged += tmp.OutPktsUntagged; sum->InPktsUntagged += tmp.InPktsUntagged; diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c -index 578897aaada0..28f9f917ff54 100644 +index b8cc55b2d721..99a971929c8e 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -948,13 +948,13 @@ static void macvlan_dev_get_stats64(struct net_device *dev, @@ -2971,7 +2971,7 @@ index 578897aaada0..28f9f917ff54 100644 stats->rx_packets += rx_packets; stats->rx_bytes += rx_bytes; diff --git a/drivers/net/mhi_net.c b/drivers/net/mhi_net.c -index 0b1b6f650104..ff302144029d 100644 +index 0b9d37979133..3d322ac4f6a5 100644 --- a/drivers/net/mhi_net.c +++ b/drivers/net/mhi_net.c @@ -104,19 +104,19 @@ static void mhi_ndo_get_stats64(struct net_device *ndev, @@ -3102,7 +3102,7 @@ index 09682ea3354e..740506c44427 100644 result->xdp_tx_err += xdp_tx_err; result->xdp_packets += packets; diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c -index 7106932c6f88..56dbd645d7c8 100644 +index 86e52454b5b5..19eee0655b99 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -2069,18 +2069,18 @@ static void virtnet_stats(struct net_device *dev, @@ -3599,19 +3599,19 @@ index fb1d5ec0940e..3e7203909d6a 100644 static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode) diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c -index 41b8c6b27136..835b63793dd3 100644 +index 3f33014022f0..594378d3c065 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c -@@ -325,7 +325,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up) - +@@ -328,7 +328,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up) /* drop TCR + TLR access, we setup XON/XOFF later */ - serial8250_out_MCR(up, up->mcr); + serial8250_out_MCR(up, mcr); + - serial_out(up, UART_IER, up->ier); + serial8250_set_IER(up, up->ier); serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); serial_dl_write(up, priv->quot); -@@ -515,7 +515,7 @@ static void omap_8250_pm(struct uart_port *port, unsigned int state, +@@ -518,7 +518,7 @@ static void omap_8250_pm(struct uart_port *port, unsigned int state, serial_out(up, UART_EFR, efr | UART_EFR_ECB); serial_out(up, UART_LCR, 0); @@ -3620,7 +3620,7 @@ index 41b8c6b27136..835b63793dd3 100644 serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B); serial_out(up, UART_EFR, efr); serial_out(up, UART_LCR, 0); -@@ -636,7 +636,7 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id) +@@ -639,7 +639,7 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id) if ((lsr & UART_LSR_OE) && up->overrun_backoff_time_ms > 0) { unsigned long delay; @@ -3629,7 +3629,7 @@ index 41b8c6b27136..835b63793dd3 100644 if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) { port->ops->stop_rx(port); } else { -@@ -696,7 +696,7 @@ static int omap_8250_startup(struct uart_port *port) +@@ -698,7 +698,7 @@ static int omap_8250_startup(struct uart_port *port) goto err; up->ier = UART_IER_RLSI | UART_IER_RDI; @@ -3638,7 +3638,7 @@ index 41b8c6b27136..835b63793dd3 100644 #ifdef CONFIG_PM up->capabilities |= UART_CAP_RPM; -@@ -737,7 +737,7 @@ static void omap_8250_shutdown(struct uart_port *port) +@@ -739,7 +739,7 @@ static void omap_8250_shutdown(struct uart_port *port) serial_out(up, UART_OMAP_EFR2, 0x0); up->ier = 0; @@ -3647,7 +3647,7 @@ index 41b8c6b27136..835b63793dd3 100644 if (up->dma) serial8250_release_dma(up); -@@ -785,7 +785,7 @@ static void omap_8250_unthrottle(struct uart_port *port) +@@ -787,7 +787,7 @@ static void omap_8250_unthrottle(struct uart_port *port) up->dma->rx_dma(up); up->ier |= UART_IER_RLSI | UART_IER_RDI; port->read_status_mask |= UART_LSR_DR; @@ -3656,7 +3656,7 @@ index 41b8c6b27136..835b63793dd3 100644 spin_unlock_irqrestore(&port->lock, flags); pm_runtime_mark_last_busy(port->dev); -@@ -876,7 +876,7 @@ static void __dma_rx_complete(void *param) +@@ -878,7 +878,7 @@ static void __dma_rx_complete(void *param) __dma_rx_do_complete(p); if (!priv->throttled) { p->ier |= UART_IER_RLSI | UART_IER_RDI; @@ -3665,7 +3665,7 @@ index 41b8c6b27136..835b63793dd3 100644 if (!(priv->habit & UART_HAS_EFR2)) omap_8250_rx_dma(p); } -@@ -933,7 +933,7 @@ static int omap_8250_rx_dma(struct uart_8250_port *p) +@@ -935,7 +935,7 @@ static int omap_8250_rx_dma(struct uart_8250_port *p) * callback to run. */ p->ier &= ~(UART_IER_RLSI | UART_IER_RDI); @@ -3674,7 +3674,7 @@ index 41b8c6b27136..835b63793dd3 100644 } goto out; } -@@ -1146,12 +1146,12 @@ static void am654_8250_handle_rx_dma(struct uart_8250_port *up, u8 iir, +@@ -1148,12 +1148,12 @@ static void am654_8250_handle_rx_dma(struct uart_8250_port *up, u8 iir, * periodic timeouts, re-enable interrupts. */ up->ier &= ~(UART_IER_RLSI | UART_IER_RDI); @@ -3690,7 +3690,7 @@ index 41b8c6b27136..835b63793dd3 100644 } diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c -index fe8662cd9402..2fc63f17deb1 100644 +index 388172289627..8dab3b7ab3c9 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -743,7 +743,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep) @@ -3876,7 +3876,7 @@ index fe8662cd9402..2fc63f17deb1 100644 serial8250_rpm_put(up); } -@@ -2152,8 +2199,7 @@ static void serial8250_put_poll_char(struct uart_port *port, +@@ -2155,8 +2202,7 @@ static void serial8250_put_poll_char(struct uart_port *port, /* * First save the IER then disable the interrupts */ @@ -3886,7 +3886,7 @@ index fe8662cd9402..2fc63f17deb1 100644 wait_for_xmitr(up, UART_LSR_BOTH_EMPTY); /* -@@ -2166,7 +2212,7 @@ static void serial8250_put_poll_char(struct uart_port *port, +@@ -2169,7 +2215,7 @@ static void serial8250_put_poll_char(struct uart_port *port, * and restore the IER */ wait_for_xmitr(up, UART_LSR_BOTH_EMPTY); @@ -3895,7 +3895,7 @@ index fe8662cd9402..2fc63f17deb1 100644 serial8250_rpm_put(up); } -@@ -2175,8 +2221,10 @@ static void serial8250_put_poll_char(struct uart_port *port, +@@ -2178,8 +2224,10 @@ static void serial8250_put_poll_char(struct uart_port *port, int serial8250_do_startup(struct uart_port *port) { struct uart_8250_port *up = up_to_u8250p(port); @@ -3906,7 +3906,7 @@ index fe8662cd9402..2fc63f17deb1 100644 int retval; u16 lsr; -@@ -2197,7 +2245,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2200,7 +2248,7 @@ int serial8250_do_startup(struct uart_port *port) up->acr = 0; serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); serial_port_out(port, UART_EFR, UART_EFR_ECB); @@ -3915,7 +3915,7 @@ index fe8662cd9402..2fc63f17deb1 100644 serial_port_out(port, UART_LCR, 0); serial_icr_write(up, UART_CSR, 0); /* Reset the UART */ serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); -@@ -2207,7 +2255,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2210,7 +2258,7 @@ int serial8250_do_startup(struct uart_port *port) if (port->type == PORT_DA830) { /* Reset the port */ @@ -3924,7 +3924,7 @@ index fe8662cd9402..2fc63f17deb1 100644 serial_port_out(port, UART_DA830_PWREMU_MGMT, 0); mdelay(10); -@@ -2306,6 +2354,8 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2309,6 +2357,8 @@ int serial8250_do_startup(struct uart_port *port) if (retval) goto out; @@ -3933,7 +3933,7 @@ index fe8662cd9402..2fc63f17deb1 100644 if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) { unsigned char iir1; -@@ -2322,6 +2372,9 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2325,6 +2375,9 @@ int serial8250_do_startup(struct uart_port *port) */ spin_lock_irqsave(&port->lock, flags); @@ -3943,7 +3943,7 @@ index fe8662cd9402..2fc63f17deb1 100644 wait_for_xmitr(up, UART_LSR_THRE); serial_port_out_sync(port, UART_IER, UART_IER_THRI); udelay(1); /* allow THRE to set */ -@@ -2332,6 +2385,9 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2335,6 +2388,9 @@ int serial8250_do_startup(struct uart_port *port) iir = serial_port_in(port, UART_IIR); serial_port_out(port, UART_IER, 0); @@ -3953,7 +3953,7 @@ index fe8662cd9402..2fc63f17deb1 100644 spin_unlock_irqrestore(&port->lock, flags); if (port->irqflags & IRQF_SHARED) -@@ -2386,10 +2442,14 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2389,10 +2445,14 @@ int serial8250_do_startup(struct uart_port *port) * Do a quick test to see if we receive an interrupt when we enable * the TX irq. */ @@ -3968,7 +3968,7 @@ index fe8662cd9402..2fc63f17deb1 100644 if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT) { if (!(up->bugs & UART_BUG_TXEN)) { -@@ -2421,7 +2481,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2424,7 +2484,7 @@ int serial8250_do_startup(struct uart_port *port) if (up->dma) { const char *msg = NULL; @@ -3977,7 +3977,7 @@ index fe8662cd9402..2fc63f17deb1 100644 msg = "forbid DMA for kernel console"; else if (serial8250_request_dma(up)) msg = "failed to request DMA"; -@@ -2472,7 +2532,7 @@ void serial8250_do_shutdown(struct uart_port *port) +@@ -2475,7 +2535,7 @@ void serial8250_do_shutdown(struct uart_port *port) */ spin_lock_irqsave(&port->lock, flags); up->ier = 0; @@ -3986,7 +3986,7 @@ index fe8662cd9402..2fc63f17deb1 100644 spin_unlock_irqrestore(&port->lock, flags); synchronize_irq(port->irq); -@@ -2838,7 +2898,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2841,7 +2901,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, if (up->capabilities & UART_CAP_RTOIE) up->ier |= UART_IER_RTOIE; @@ -3995,7 +3995,7 @@ index fe8662cd9402..2fc63f17deb1 100644 if (up->capabilities & UART_CAP_EFR) { unsigned char efr = 0; -@@ -3303,7 +3363,7 @@ EXPORT_SYMBOL_GPL(serial8250_set_defaults); +@@ -3306,7 +3366,7 @@ EXPORT_SYMBOL_GPL(serial8250_set_defaults); #ifdef CONFIG_SERIAL_8250_CONSOLE @@ -4004,7 +4004,7 @@ index fe8662cd9402..2fc63f17deb1 100644 { struct uart_8250_port *up = up_to_u8250p(port); -@@ -3311,6 +3371,18 @@ static void serial8250_console_putchar(struct uart_port *port, unsigned char ch) +@@ -3314,6 +3374,18 @@ static void serial8250_console_putchar(struct uart_port *port, unsigned char ch) serial_port_out(port, UART_TX, ch); } @@ -4023,7 +4023,7 @@ index fe8662cd9402..2fc63f17deb1 100644 /* * Restore serial console when h/w power-off detected */ -@@ -3337,6 +3409,32 @@ static void serial8250_console_restore(struct uart_8250_port *up) +@@ -3340,6 +3412,32 @@ static void serial8250_console_restore(struct uart_8250_port *up) serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS); } @@ -4056,7 +4056,7 @@ index fe8662cd9402..2fc63f17deb1 100644 /* * Print a string to the serial port using the device FIFO * -@@ -3382,20 +3480,15 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, +@@ -3385,20 +3483,15 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, struct uart_port *port = &up->port; unsigned long flags; unsigned int ier, use_fifo; @@ -4079,7 +4079,7 @@ index fe8662cd9402..2fc63f17deb1 100644 /* check scratch reg to see if port powered off during system sleep */ if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) { -@@ -3429,10 +3522,12 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, +@@ -3432,10 +3525,12 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, */ !(up->port.flags & UPF_CONS_FLOW); @@ -4092,7 +4092,7 @@ index fe8662cd9402..2fc63f17deb1 100644 /* * Finally, wait for transmitter to become empty -@@ -3445,8 +3540,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, +@@ -3448,8 +3543,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, if (em485->tx_stopped) up->rs485_stop_tx(up); } @@ -4102,7 +4102,7 @@ index fe8662cd9402..2fc63f17deb1 100644 /* * The receive handling will happen properly because the -@@ -3458,8 +3552,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, +@@ -3461,8 +3555,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, if (up->msr_saved_flags) serial8250_modem_status(up); @@ -4112,7 +4112,7 @@ index fe8662cd9402..2fc63f17deb1 100644 } static unsigned int probe_baud(struct uart_port *port) -@@ -3479,6 +3572,7 @@ static unsigned int probe_baud(struct uart_port *port) +@@ -3482,6 +3575,7 @@ static unsigned int probe_baud(struct uart_port *port) int serial8250_console_setup(struct uart_port *port, char *options, bool probe) { @@ -4120,7 +4120,7 @@ index fe8662cd9402..2fc63f17deb1 100644 int baud = 9600; int bits = 8; int parity = 'n'; -@@ -3488,6 +3582,8 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe) +@@ -3491,6 +3585,8 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe) if (!port->iobase && !port->membase) return -ENODEV; @@ -4705,7 +4705,7 @@ index 46040d66334a..ffe48e69b3f3 100644 - #endif /* _LINUX_U64_STATS_SYNC_H */ diff --git a/init/Kconfig b/init/Kconfig -index abf65098f1b6..d7287004b853 100644 +index 94125d3b6893..b0357269f4a5 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1581,6 +1581,10 @@ config PRINTK @@ -6327,7 +6327,7 @@ index 3bba88c7ffc6..57cedc330660 100644 EXPORT_SYMBOL_GPL(hw_protection_shutdown); diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index cb2aa2b54c7a..f202b258230a 100644 +index daff72f00385..44d1c2133964 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1040,6 +1040,46 @@ void resched_curr(struct rq *rq) @@ -6510,7 +6510,7 @@ index cb2aa2b54c7a..f202b258230a 100644 ktime_t to = NSEC_PER_SEC / HZ; set_current_state(TASK_UNINTERRUPTIBLE); -@@ -4597,6 +4710,9 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) +@@ -4615,6 +4728,9 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) p->on_cpu = 0; #endif init_task_preempt_count(p); @@ -6520,7 +6520,7 @@ index cb2aa2b54c7a..f202b258230a 100644 #ifdef CONFIG_SMP plist_node_init(&p->pushable_tasks, MAX_PRIO); RB_CLEAR_NODE(&p->pushable_dl_tasks); -@@ -6466,6 +6582,7 @@ static void __sched notrace __schedule(unsigned int sched_mode) +@@ -6484,6 +6600,7 @@ static void __sched notrace __schedule(unsigned int sched_mode) next = pick_next_task(rq, prev, &rf); clear_tsk_need_resched(prev); @@ -6528,7 +6528,7 @@ index cb2aa2b54c7a..f202b258230a 100644 clear_preempt_need_resched(); #ifdef CONFIG_SCHED_DEBUG rq->last_seen_need_resched_ns = 0; -@@ -6680,6 +6797,30 @@ static void __sched notrace preempt_schedule_common(void) +@@ -6698,6 +6815,30 @@ static void __sched notrace preempt_schedule_common(void) } while (need_resched()); } @@ -6559,7 +6559,7 @@ index cb2aa2b54c7a..f202b258230a 100644 #ifdef CONFIG_PREEMPTION /* * This is the entry point to schedule() from in-kernel preemption -@@ -6693,6 +6834,8 @@ asmlinkage __visible void __sched notrace preempt_schedule(void) +@@ -6711,6 +6852,8 @@ asmlinkage __visible void __sched notrace preempt_schedule(void) */ if (likely(!preemptible())) return; @@ -6568,7 +6568,7 @@ index cb2aa2b54c7a..f202b258230a 100644 preempt_schedule_common(); } NOKPROBE_SYMBOL(preempt_schedule); -@@ -6740,6 +6883,9 @@ asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) +@@ -6758,6 +6901,9 @@ asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) if (likely(!preemptible())) return; @@ -6578,7 +6578,7 @@ index cb2aa2b54c7a..f202b258230a 100644 do { /* * Because the function tracer can trace preempt_count_sub() -@@ -8997,7 +9143,9 @@ void __init init_idle(struct task_struct *idle, int cpu) +@@ -9015,7 +9161,9 @@ void __init init_idle(struct task_struct *idle, int cpu) /* Set the preempt count _outside_ the spinlocks! */ init_idle_preempt_count(idle, cpu); @@ -6887,7 +6887,7 @@ index 717fcb9fb14a..e6219da89933 100644 /* diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index 47a44b055a1d..ff803b85010c 100644 +index a7fe0e115272..a0a603784045 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -2640,11 +2640,19 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) @@ -7120,10 +7120,10 @@ index db4f2641d1cd..7e2a9fb5786c 100644 mcast_stats_add_dir(tdst.igmp_v1queries, temp.igmp_v1queries); mcast_stats_add_dir(tdst.igmp_v2queries, temp.igmp_v2queries); diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c -index 6e53dc991409..f2fc284abab3 100644 +index 9ffd40b8270c..bc75fa1e4666 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c -@@ -1378,12 +1378,12 @@ void br_vlan_get_stats(const struct net_bridge_vlan *v, +@@ -1389,12 +1389,12 @@ void br_vlan_get_stats(const struct net_bridge_vlan *v, cpu_stats = per_cpu_ptr(v->stats, i); do { @@ -7354,10 +7354,10 @@ index a9fde48cffd4..83e419afa89e 100644 data[1] += tx_bytes; data[2] += rx_packets; diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c -index 4728087c42a5..378bcd777514 100644 +index 0da679411330..643a7597bc5b 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c -@@ -1708,9 +1708,9 @@ u64 snmp_get_cpu_field64(void __percpu *mib, int cpu, int offt, +@@ -1699,9 +1699,9 @@ u64 snmp_get_cpu_field64(void __percpu *mib, int cpu, int offt, bhptr = per_cpu_ptr(mib, cpu); syncp = (struct u64_stats_sync *)(bhptr + syncp_offset); do { @@ -7454,7 +7454,7 @@ index 988222fff9f0..4d62059a6021 100644 seq_printf(seq, "%3X %8LX %8LX %8LX %16LX %16LX\n", i, (u64)conns, (u64)inpkts, diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c -index e7152d599d73..23e8ea7614ad 100644 +index 7a09421f19e1..6def1e17e69d 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -1534,10 +1534,10 @@ static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats) diff --git a/version.sh b/version.sh index d9d2012ef7d2b9650cac9f8946aeeb31cfcde30e..76c02ec512aa9926efddf70e5967b2c9dbe7020a 100644 --- a/version.sh +++ b/version.sh @@ -17,8 +17,8 @@ DEBARCH=armhf #toolchain="gcc_8_arm" #toolchain="gcc_9_arm" #toolchain="gcc_10_arm" -toolchain="gcc_11_arm" -#toolchain="gcc_12_arm" +#toolchain="gcc_11_arm" +toolchain="gcc_12_arm" #arm64 #KERNEL_ARCH=arm64 #DEBARCH=arm64 @@ -41,10 +41,10 @@ toolchain="gcc_11_arm" #Kernel KERNEL_REL=6.1 -KERNEL_TAG=${KERNEL_REL}-rc5 -kernel_rt="-rc5-rt3" +KERNEL_TAG=${KERNEL_REL}-rc7 +kernel_rt="-rc7-rt5" #Kernel Build -BUILD=${build_prefix}3 +BUILD=${build_prefix}3.1 #v6.X-rcX + upto SHA #prev_KERNEL_SHA=""